An instruction in a loop is not guaranteed to be executed just because the loop
authorNick Lewycky <nicholas@mxc.ca>
Tue, 1 May 2012 04:03:01 +0000 (04:03 +0000)
committerNick Lewycky <nicholas@mxc.ca>
Tue, 1 May 2012 04:03:01 +0000 (04:03 +0000)
has no exit blocks. Fixes PR12706!

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@155884 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/LICM.cpp
test/Transforms/LICM/speculate.ll

index 8795cd853fae7d9c052d45ec470dc0f3525baf2a..582948ea14bbd8a1eb674ac06570dd4b991d53b7 100644 (file)
@@ -618,6 +618,11 @@ bool LICM::isGuaranteedToExecute(Instruction &Inst) {
     if (!DT->dominates(Inst.getParent(), ExitBlocks[i]))
       return false;
 
+  // As a degenerate case, if the loop is statically infinite then we haven't
+  // proven anything since there are no exit blocks.
+  if (ExitBlocks.empty())
+    return false;
+
   return true;
 }
 
index 507b193e6b1c38e91b029b8ec5496ba18c9ad070..4c4d036b7dbfb54dcb6d51c7bb83749e6afd7c5d 100644 (file)
@@ -165,3 +165,25 @@ for.inc:                                          ; preds = %if.then, %for.body
 for.end:                                          ; preds = %for.inc, %entry
   ret void
 }
+
+; SDiv is unsafe to speculate inside an infinite loop.
+
+define void @unsafe_sdiv_c(i64 %a, i64 %b, i64* %p) {
+entry:
+; CHECK: entry:
+; CHECK-NOT: sdiv
+; CHECK: br label %for.body
+  br label %for.body
+
+for.body:
+  %c = icmp eq i64 %b, 0
+  br i1 %c, label %backedge, label %if.then
+
+if.then:
+  %d = sdiv i64 %a, %b
+  store i64 %d, i64* %p
+  br label %backedge
+
+backedge:
+  br label %for.body
+}