mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 03:33:20 +01:00
fdfed29d10
When the BasicBlock containing the return instrution has a PHI with 2 incoming values, FoldReturnIntoUncondBranch will remove the no longer used incoming value and remove the no longer needed phi as well. This leaves us with a BB that no longer has a PHI, but the subsequent call to FoldReturnIntoUncondBranch from FoldReturnAndProcessPred will not remove the return instruction (which still uses the result of the call instruction). This prevents EliminateRecursiveTailCall to remove the value, as it is still being used in a basicblock which has no predecessors. The basicblock can not be erased on the spot, because its iterator is still being used in runTRE. This issue was exposed when removing the threshold on size for lifetime marker insertion for named temporaries in clang. The testcase is a much reduced version of peelOffOuterExpr(const Expr*, const ExplodedNode *) from clang/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp. llvm-svn: 222354
27 lines
769 B
LLVM
27 lines
769 B
LLVM
; RUN: opt -tailcallelim -S < %s 2>&1 | FileCheck %s
|
|
|
|
; CHECK: add nsw i32
|
|
; CHECK-NEXT: br label
|
|
; CHECK: add nsw i32
|
|
; CHECK-NEXT: br label
|
|
; CHECK-NOT: Uses remain when a value is destroyed
|
|
define i32 @test(i32 %n) {
|
|
entry:
|
|
%cmp = icmp slt i32 %n, 2
|
|
br i1 %cmp, label %if.then, label %if.else
|
|
|
|
if.then: ; preds = %entry
|
|
%v1 = add nsw i32 %n, -2
|
|
%call1 = tail call i32 @test(i32 %v1)
|
|
br label %return
|
|
|
|
if.else: ; preds = %entry
|
|
%v2 = add nsw i32 %n, 4
|
|
%call2 = tail call i32 @test(i32 %v2)
|
|
br label %return
|
|
|
|
return: ; preds = %if.end, %if.else
|
|
%retval = phi i32 [ %call1, %if.then ], [ %call2, %if.else ]
|
|
ret i32 %retval
|
|
}
|