Currently, we only remove dead blocks and non-feasible edges in IPSCCP, but not in SCCP. I'm not aware of any strong reason for that difference, so this patch updates SCCP to perform the CFG cleanup as well. Compile-time impact seems to be pretty minimal, in the 0.05% geomean range on CTMark. For the test case from https://reviews.llvm.org/D126962#3611579 the result after -sccp now looks like this: define void @test(i1 %c) { entry: br i1 %c, label %unreachable, label %next next: unreachable unreachable: call void @bar() unreachable } -jump-threading does nothing on this, but -simplifycfg will produce the optimal result. Differential Revision: https://reviews.llvm.org/D128796
22 lines
785 B
LLVM
22 lines
785 B
LLVM
; RUN: opt < %s -debug-pass-manager -passes='loop-vectorize,sccp,loop-vectorize' 2>&1 -S | FileCheck --check-prefix=NEW-PM %s
|
|
|
|
; Check that DT is preserved by SCCP by running it between 2
|
|
; loop-vectorize runs.
|
|
|
|
; NEW-PM-DAG: Running analysis: LoopAnalysis on test
|
|
; NEW-PM-DAG: Running analysis: DominatorTreeAnalysis on test
|
|
; NEW-PM: Running pass: SCCPPass on test
|
|
; NEW-PM: Running analysis: TargetLibraryAnalysis on test
|
|
; NEW-PM: Running analysis: LoopAnalysis on test
|
|
; NEW-PM-NOT: Running analysis: DominatorTreeAnalysis on test
|
|
; NEW-PM-NOT: Running analysis: AssumptionAnalysis on test
|
|
; NEW-PM-NOT: Running analysis: TargetLibraryAnalysis on test
|
|
; NEW-PM-NOT: Running analysis: TargetIRAnalysis on test
|
|
|
|
|
|
define i32 @test() {
|
|
entry:
|
|
%res = add i32 1, 10
|
|
ret i32 %res
|
|
}
|