[PATCH] D107067: [FuncSpec] Ignore ConstantExpr when find possible constant

Chuanqi Xu via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Jul 29 18:54:57 PDT 2021


ChuanqiXu updated this revision to Diff 362949.
ChuanqiXu added a comment.

Fix tests.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D107067/new/

https://reviews.llvm.org/D107067

Files:
  llvm/lib/Transforms/IPO/FunctionSpecialization.cpp
  llvm/test/Transforms/FunctionSpecialization/function-specialization-constant-expression.ll


Index: llvm/test/Transforms/FunctionSpecialization/function-specialization-constant-expression.ll
===================================================================
--- /dev/null
+++ llvm/test/Transforms/FunctionSpecialization/function-specialization-constant-expression.ll
@@ -0,0 +1,47 @@
+; Test function specialization wouldn't crash due to constant expression.
+; RUN: opt -function-specialization -S < %s | FileCheck %s
+
+; CHECK: plus:
+; CHECK-NEXT:  %{{.*}} = call i64 @func2(i64* getelementptr inbounds (%struct, %struct* @Global, i32 0, i32 3))
+; CHECK: minus:
+; CHECK-NEXT: %{{.*}} = call i64 @func2(i64* getelementptr inbounds (%struct, %struct* @Global, i32 0, i32 4))
+
+%struct = type { i8, i16, i32, i64, i64}
+ at Global = internal constant %struct {i8 0, i16 1, i32 2, i64 3, i64 4}
+define internal i64 @zoo(i1 %flag) {
+entry:
+  br i1 %flag, label %plus, label %minus
+
+plus:
+  %arg = getelementptr %struct, %struct* @Global, i32 0, i32 3
+  %tmp0 = call i64 @func2(i64* %arg)
+  br label %merge
+
+minus:
+  %arg2 = getelementptr %struct, %struct* @Global, i32 0, i32 4
+  %tmp1 = call i64 @func2(i64* %arg2)
+  br label %merge
+
+merge:
+  %tmp2 = phi i64 [ %tmp0, %plus ], [ %tmp1, %minus]
+  ret i64 %tmp2
+}
+
+define internal i64 @func2(i64 *%x) {
+entry:
+  %val = ptrtoint i64* %x to i64
+  ret i64 %val
+}
+
+define internal i64 @func(i64 *%x, i64 (i64*)* %binop) {
+entry:
+  %tmp0 = call i64 %binop(i64* %x)
+  ret i64 %tmp0
+}
+
+define i64 @main() {
+    %1 = call i64 @zoo(i1 0)
+    %2 = call i64 @zoo(i1 1)
+    %3 = add i64 %1, %2
+    ret i64 %3
+}
\ No newline at end of file
Index: llvm/lib/Transforms/IPO/FunctionSpecialization.cpp
===================================================================
--- llvm/lib/Transforms/IPO/FunctionSpecialization.cpp
+++ llvm/lib/Transforms/IPO/FunctionSpecialization.cpp
@@ -489,6 +489,11 @@
         }
       }
 
+      /// FIXME: Remove this once we update the solver after we replace
+      /// the constant.
+      if (isa<ConstantExpr>(V))
+        continue;
+
       if (isa<Constant>(V) && (Solver.getLatticeValueFor(V).isConstant() ||
                                EnableSpecializationForLiteralConstant))
         Constants.push_back(cast<Constant>(V));


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D107067.362949.patch
Type: text/x-patch
Size: 2250 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210730/06bd87ae/attachment.bin>


More information about the llvm-commits mailing list