Instructions to be redone only if from the same BB
authorAditya Nandakumar <aditya_nandakumar@apple.com>
Thu, 7 Jan 2016 23:22:55 +0000 (23:22 +0000)
committerAditya Nandakumar <aditya_nandakumar@apple.com>
Thu, 7 Jan 2016 23:22:55 +0000 (23:22 +0000)
While adding instructions(possible roots) to be redone, make sure they
are from the same basic block.

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

lib/Transforms/Scalar/Reassociate.cpp
test/Transforms/Reassociate/add_across_block_crash.ll [new file with mode: 0644]

index 401a740..bcadd4e 100644 (file)
@@ -2155,7 +2155,8 @@ void Reassociate::OptimizeInst(Instruction *I) {
     // During the initial run we will get to the root of the tree.
     // But if we get here while we are redoing instructions, there is no
     // guarantee that the root will be visited. So Redo later
-    if (BO->user_back() != BO)
+    if (BO->user_back() != BO &&
+        BO->getParent() == BO->user_back()->getParent())
       RedoInsts.insert(BO->user_back());
     return;
   }
diff --git a/test/Transforms/Reassociate/add_across_block_crash.ll b/test/Transforms/Reassociate/add_across_block_crash.ll
new file mode 100644 (file)
index 0000000..07be752
--- /dev/null
@@ -0,0 +1,20 @@
+; RUN: opt < %s -reassociate -S | FileCheck %s
+; CHECK-LABEL: main
+; This test is to make sure while processing a block, uses of instructions
+; from a different basic block don't get added to be re-optimized
+define  void @main() {
+entry:
+  %0 = fadd fast float undef, undef
+  br i1 undef, label %bb1, label %bb2
+
+bb1:
+  %1 = fmul fast float undef, -2.000000e+00
+  %2 = fmul fast float %1, 2.000000e+00
+  %3 = fadd fast float %2, 2.000000e+00
+  %4 = fadd fast float %3, %0
+  %mul351 = fmul fast float %4, 5.000000e-01
+  ret void
+
+bb2:
+  ret void
+}