[llvm] r339481 - [LICM] Hoist assumes out of loops

Philip Reames via llvm-commits llvm-commits at lists.llvm.org
Fri Aug 10 15:21:57 PDT 2018


Author: reames
Date: Fri Aug 10 15:21:56 2018
New Revision: 339481

URL: http://llvm.org/viewvc/llvm-project?rev=339481&view=rev
Log:
[LICM] Hoist assumes out of loops

If we have an assume which is known to execute and whose operand is invariant, we can lift that into the pre-header. So long as we don't change which paths the assume executes on, this is a legal transformation. It's likely to be a useful canonicalization as other transforms only look for dominating assumes.

Differential Revision: https://reviews.llvm.org/D50364


Modified:
    llvm/trunk/lib/Transforms/Scalar/LICM.cpp
    llvm/trunk/test/Transforms/LICM/assume.ll

Modified: llvm/trunk/lib/Transforms/Scalar/LICM.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LICM.cpp?rev=339481&r1=339480&r2=339481&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/LICM.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/LICM.cpp Fri Aug 10 15:21:56 2018
@@ -658,6 +658,15 @@ bool llvm::canSinkOrHoistInst(Instructio
     if (CI->mayThrow())
       return false;
 
+    if (Function *F = CI->getCalledFunction())
+        switch (F->getIntrinsicID()) {
+        default: break;
+        // TODO: support invariant.start, and experimental.guard here
+        case Intrinsic::assume:
+          // Assumes don't actually alias anything or throw
+          return true;
+        };
+    
     // Handle simple cases by querying alias analysis.
     FunctionModRefBehavior Behavior = AA->getModRefBehavior(CI);
     if (Behavior == FMRB_DoesNotAccessMemory)

Modified: llvm/trunk/test/Transforms/LICM/assume.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/LICM/assume.ll?rev=339481&r1=339480&r2=339481&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/LICM/assume.ll (original)
+++ llvm/trunk/test/Transforms/LICM/assume.ll Fri Aug 10 15:21:56 2018
@@ -36,9 +36,9 @@ for.end104:
 define void @f_1(i1 %cond, i32* %ptr) {
 ; CHECK-LABEL: @f_1(
 ; CHECK-LABEL: entry:
+; CHECK: call void @llvm.assume(i1 %cond)
 ; CHECK: %val = load i32, i32* %ptr
 ; CHECK-LABEL: loop:
-; CHECK: call void @llvm.assume(i1 %cond)
 
 entry:
   br label %loop




More information about the llvm-commits mailing list