1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-02 00:42:52 +01:00
llvm-mirror/test/Transforms/SimplifyCFG/dce-cond-after-folding-terminator.ll
Frits van Bommel df58ece78a Add a parameter to ConstantFoldTerminator() that callers can use to ask it to also clean up the condition of any conditional terminator it folds to be unconditional, if that turns the condition into dead code. This just means it calls RecursivelyDeleteTriviallyDeadInstructions() in strategic spots. It defaults to the old behavior.
I also changed -simplifycfg, -jump-threading and -codegenprepare to use this to produce slightly better code without any extra cleanup passes (AFAICT this was the only place in -simplifycfg where now-dead conditions of replaced terminators weren't being cleaned up). The only other user of this function is -sccp, but I didn't read that thoroughly enough to figure out whether it might be holding pointers to instructions that could be deleted by this.

llvm-svn: 131855
2011-05-22 16:24:18 +00:00

53 lines
1.3 KiB
LLVM

; RUN: opt -S <%s -simplifycfg | FileCheck %s
define void @test_br(i32 %x) {
entry:
; CHECK: @test_br
; CHECK-NEXT: entry:
; CHECK-NEXT: ret void
%cmp = icmp eq i32 %x, 10
br i1 %cmp, label %if.then, label %if.then
if.then: ; preds = %entry
br label %if.end
if.end: ; preds = %if.else, %if.then
ret void
}
define void @test_switch(i32 %x) nounwind {
entry:
; CHECK: @test_switch
; CHECK-NEXT: entry:
; CHECK-NEXT: ret void
%rem = srem i32 %x, 3
switch i32 %rem, label %sw.bb [
i32 1, label %sw.bb
i32 10, label %sw.bb
]
sw.bb: ; preds = %sw.default, %entry, %entry
br label %sw.epilog
sw.epilog: ; preds = %sw.bb
ret void
}
define void @test_indirectbr(i32 %x) {
entry:
; CHECK: @test_indirectbr
; CHECK-NEXT: entry:
; Ideally this should now check:
; CHK-NEXT: ret void
; But that doesn't happen yet. Instead:
; CHECK-NEXT: br label %L1
%label = bitcast i8* blockaddress(@test_indirectbr, %L1) to i8*
indirectbr i8* %label, [label %L1, label %L2]
L1: ; preds = %entry
ret void
L2: ; preds = %entry
ret void
}