diff options
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/lib/Transforms/Utils/CloneFunction.cpp | 5 | ||||
| -rw-r--r-- | llvm/test/Transforms/Inline/recursive.ll | 31 |
2 files changed, 34 insertions, 2 deletions
diff --git a/llvm/lib/Transforms/Utils/CloneFunction.cpp b/llvm/lib/Transforms/Utils/CloneFunction.cpp index 7e75e884778..9c4e13903ed 100644 --- a/llvm/lib/Transforms/Utils/CloneFunction.cpp +++ b/llvm/lib/Transforms/Utils/CloneFunction.cpp @@ -341,8 +341,9 @@ void PruningFunctionCloner::CloneBlock(const BasicBlock *BB, SimplifyInstruction(NewInst, BB->getModule()->getDataLayout())) { // 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 (NewFunc != OldFunc) + if (Value *MappedV = VMap.lookup(V)) + V = MappedV; if (!NewInst->mayHaveSideEffects()) { VMap[&*II] = V; diff --git a/llvm/test/Transforms/Inline/recursive.ll b/llvm/test/Transforms/Inline/recursive.ll index 233c81a1798..cbdf86b093a 100644 --- a/llvm/test/Transforms/Inline/recursive.ll +++ b/llvm/test/Transforms/Inline/recursive.ll @@ -40,3 +40,34 @@ declare void @bar(i8* %in) declare i32 @foo(i32 %param) +; Check that when inlining a non-recursive path into a function's own body that +; we get the re-mapping of instructions correct. +define i32 @test_recursive_inlining_remapping(i1 %init, i8* %addr) { +; CHECK-LABEL: define i32 @test_recursive_inlining_remapping( +bb: + %n = alloca i32 + br i1 %init, label %store, label %load +; CHECK-NOT: alloca +; +; CHECK: %[[N:.*]] = alloca i32 +; CHECK-NEXT: br i1 %init, + +store: + store i32 0, i32* %n + %cast = bitcast i32* %n to i8* + %v = call i32 @test_recursive_inlining_remapping(i1 false, i8* %cast) + ret i32 %v +; CHECK-NOT: call +; +; CHECK: store i32 0, i32* %[[N]] +; CHECK-NEXT: %[[CAST:.*]] = bitcast i32* %[[N]] to i8* +; CHECK-NEXT: %[[INLINED_LOAD:.*]] = load i32, i32* %[[N]] +; CHECK-NEXT: ret i32 %[[INLINED_LOAD]] +; +; CHECK-NOT: call + +load: + %castback = bitcast i8* %addr to i32* + %n.load = load i32, i32* %castback + ret i32 %n.load +} |

