[PATCH] D17663: [JumpThreading] See through Cast Instructions

Haicheng Wu via llvm-commits llvm-commits at lists.llvm.org
Wed Mar 2 15:09:39 PST 2016


haicheng updated this revision to Diff 49678.
haicheng added a comment.

Only see through Cast when the source is PHI or Cmp, two types of instructions that are most important to JumpThreading.  This version makes less changes and takes much less compilation time.  The measured compilation time shows the difference is within the noise range.


Repository:
  rL LLVM

http://reviews.llvm.org/D17663

Files:
  lib/Transforms/Scalar/JumpThreading.cpp
  test/Transforms/JumpThreading/basic.ll

Index: test/Transforms/JumpThreading/basic.ll
===================================================================
--- test/Transforms/JumpThreading/basic.ll
+++ test/Transforms/JumpThreading/basic.ll
@@ -511,9 +511,40 @@
 ; CHECK-NEXT: phi i32
 }
 
+define i32 @test17(i1 %cond) {
+Entry:
+; CHECK-LABEL: @test17(
+	br i1 %cond, label %Merge, label %F1
+
+; CHECK: Entry:
+; CHECK-NEXT:  br i1 %cond, label %F2, label %Merge
+
+F1:
+	%v1 = call i32 @f1()
+	br label %Merge
+
+Merge:
+	%B = phi i32 [0, %Entry], [%v1, %F1]
+	%N = trunc i32 %B to i1
+	br i1 %N, label %T2, label %F2
+
+; CHECK: Merge:
+; CHECK-NOT: phi
+; CHECK-NEXT:   %v1 = call i32 @f1()
+
+T2:
+	%Q = call i32 @f2() 
+	ret i32 %Q
+
+F2:
+	ret i32 %B
+; CHECK: F2:
+; CHECK-NEXT: phi i32
+}
+
 ;;; Just check that ComputeValueKnownInPredecessors() does not return true with
 ;;; no values and triggers the assert in ProcessThreadableEdges().
-define i32 @test17() {
+define i32 @test18() {
 entry:
 	%A = add i32 0, 1
 	%B = icmp eq i32 %A, 0
Index: lib/Transforms/Scalar/JumpThreading.cpp
===================================================================
--- lib/Transforms/Scalar/JumpThreading.cpp
+++ lib/Transforms/Scalar/JumpThreading.cpp
@@ -475,6 +475,24 @@
     return !Result.empty();
   }
 
+  // Handle Cast instructions.  Only see through Cast when the source operand is
+  // PHI or Cmp to save the compilation time.
+  if (CastInst *CI = dyn_cast<CastInst>(I)) {
+    Value *Source = CI->getOperand(0);
+    if (!isa<PHINode>(Source) && !isa<CmpInst>(Source))
+      return false;
+    ComputeValueKnownInPredecessors(Source, BB, Result, Preference, Changed,
+                                    CxtI);
+    if (Result.empty())
+      return false;
+
+    // Convert the known values.
+    for (auto &R : Result)
+      R.first = ConstantExpr::getCast(CI->getOpcode(), R.first, CI->getType());
+
+    return true;
+  }
+
   PredValueInfoTy LHSVals, RHSVals;
 
   // Handle some boolean conditions.


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D17663.49678.patch
Type: text/x-patch
Size: 1982 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160302/5e1f9380/attachment.bin>


More information about the llvm-commits mailing list