]> granicus.if.org Git - llvm/commitdiff
[Cloner] Re-map simplfied cloned instructions.
authorDavide Italiano <davide@freebsd.org>
Sat, 1 Jul 2017 03:29:33 +0000 (03:29 +0000)
committerDavide Italiano <davide@freebsd.org>
Sat, 1 Jul 2017 03:29:33 +0000 (03:29 +0000)
This commit pretty much rolls back the logic added in r306495
as in the testcase provided we simplify an `icmp` looking through
a PHI that hasn't been mapped yet.

I think instsimplify shouldn't do threading over select/phis or
just looking through phis in general, but this is what we have
now. Also, add a test to prevent this from happening in case somebody
wants to modify this code again.

Briefly discussed with Kyle Butt (thanks Kyle!).

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

lib/Transforms/Utils/CloneFunction.cpp
test/Transforms/Inline/pr33637.ll [new file with mode: 0644]

index b61017f37ca984791ab6ed4ef1607580199d7c38..314c990293cc5701a6824e6b5ebf5a64c9d17dda 100644 (file)
@@ -325,11 +325,10 @@ void PruningFunctionCloner::CloneBlock(const BasicBlock *BB,
       // the basic block.
       if (Value *V =
               SimplifyInstruction(NewInst, BB->getModule()->getDataLayout())) {
-        assert((!isa<Instruction>(V) ||
-                cast<Instruction>(V)->getParent() == nullptr ||
-                cast<Instruction>(V)->getFunction() != OldFunc ||
-                OldFunc == NewFunc) &&
-               "Simplified Instruction should not be in the old function.");
+        // On the off-chance that this simplifies to an instruction in the old
+        // function, map it back into the new function.
+        if (Value *MappedV = VMap.lookup(V))
+          V = MappedV;
 
         if (!NewInst->mayHaveSideEffects()) {
           VMap[&*II] = V;
diff --git a/test/Transforms/Inline/pr33637.ll b/test/Transforms/Inline/pr33637.ll
new file mode 100644 (file)
index 0000000..315feca
--- /dev/null
@@ -0,0 +1,25 @@
+; RUN: opt -inline < %s
+
+define void @patatino() {
+for.cond:
+  br label %for.body
+
+for.body:
+  %tobool = icmp eq i32 5, 0
+  %sel = select i1 %tobool, i32 0, i32 2
+  br i1 undef, label %cleanup1.thread, label %cleanup1
+
+cleanup1.thread:
+  ret void
+
+cleanup1:
+  %cleanup.dest2 = phi i32 [ %sel, %for.body ]
+  %switch = icmp ult i32 %cleanup.dest2, 1
+  ret void
+}
+
+define void @main() {
+entry:
+  call void @patatino()
+  ret void
+}