mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 03:02:36 +01:00
2a2896669d
Being lazy with printing the banner seems hard to reason with, we should print it unconditionally first (it could also lead to duplicate banners if we have multiple functions in -filter-print-funcs). The printIR() functions were doing too many things. I separated out the call from PrintPassInstrumentation since we were essentially doing two completely separate things in printIR() from different callers. There were multiple ways to generate the name of some IR. That's all been moved to getIRName(). The printing of the IR name was also inconsistent, now it's always "IR Dump on $foo" where "$foo" is the name. For a function, it's the function name. For a loop, it's what's printed by Loop::print(), which is more detailed. For an SCC, it's the list of functions in parentheses. For a module it's "[module]", to differentiate between a possible SCC with a function called "module". To preserve D74814, we have to check if we're going to print anything at all first. This is unfortunate, but I would consider this a special case that shouldn't be handled in the core logic. Reviewed By: jamieschmeiser Differential Revision: https://reviews.llvm.org/D100231
158 lines
6.7 KiB
LLVM
158 lines
6.7 KiB
LLVM
; This file verifies the behavior of the OptBisect class, which is used to
|
|
; diagnose optimization related failures. The tests check various
|
|
; invocations that result in different sets of optimization passes that
|
|
; are run in different ways.
|
|
;
|
|
; Because the exact set of optimizations that will be run is expected to
|
|
; change over time, the checks for disabling passes are written in a
|
|
; conservative way that avoids assumptions about which specific passes
|
|
; will be disabled.
|
|
|
|
; RUN: opt -disable-output -disable-verify \
|
|
; RUN: -passes=inferattrs -opt-bisect-limit=-1 %s 2>&1 \
|
|
; RUN: | FileCheck %s --check-prefix=CHECK-MODULE-PASS
|
|
; CHECK-MODULE-PASS: BISECT: running pass (1) InferFunctionAttrsPass on [module]
|
|
|
|
; RUN: opt -disable-output -disable-verify \
|
|
; RUN: -passes=inferattrs -opt-bisect-limit=0 %s 2>&1 \
|
|
; RUN: | FileCheck %s --check-prefix=CHECK-LIMIT-MODULE-PASS
|
|
; CHECK-LIMIT-MODULE-PASS: BISECT: NOT running pass (1) InferFunctionAttrsPass on [module]
|
|
|
|
; RUN: opt -disable-output -debug-pass-manager \
|
|
; RUN: -passes=inferattrs -opt-bisect-limit=-1 %s 2>&1 \
|
|
; RUN: | FileCheck %s --check-prefix=CHECK-REQUIRED-PASS
|
|
; CHECK-REQUIRED-PASS-NOT: BISECT: {{.*}} VerifierPass
|
|
; CHECK-REQUIRED-PASS: Running pass: VerifierPass
|
|
; CHECK-REQUIRED-PASS: BISECT: running pass (1) InferFunctionAttrsPass on [module]
|
|
; CHECK-REQUIRED-PASS-NOT: BISECT: {{.*}} VerifierPass
|
|
; CHECK-REQUIRED-PASS: Running pass: VerifierPass
|
|
|
|
; RUN: opt -disable-output -debug-pass-manager \
|
|
; RUN: -passes=inferattrs -opt-bisect-limit=0 %s 2>&1 \
|
|
; RUN: | FileCheck %s --check-prefix=CHECK-LIMIT-REQUIRED-PASS
|
|
; CHECK-LIMIT-REQUIRED-PASS-NOT: BISECT: {{.*}} VerifierPass
|
|
; CHECK-LIMIT-REQUIRED-PASS: Running pass: VerifierPass
|
|
; CHECK-LIMIT-REQUIRED-PASS: BISECT: NOT running pass (1) InferFunctionAttrsPass on [module]
|
|
; CHECK-LIMIT-REQUIRED-PASS-NOT: BISECT: {{.*}} VerifierPass
|
|
; CHECK-LIMIT-REQUIRED-PASS: Running pass: VerifierPass
|
|
|
|
; RUN: opt -disable-output -disable-verify \
|
|
; RUN: -passes=early-cse -opt-bisect-limit=-1 %s 2>&1 \
|
|
; RUN: | FileCheck %s --check-prefix=CHECK-FUNCTION-PASS
|
|
; CHECK-FUNCTION-PASS: BISECT: running pass (1) EarlyCSEPass on f1
|
|
; CHECK-FUNCTION-PASS: BISECT: running pass (2) EarlyCSEPass on f2
|
|
; CHECK-FUNCTION-PASS: BISECT: running pass (3) EarlyCSEPass on f3
|
|
; CHECK-FUNCTION-PASS: BISECT: running pass (4) EarlyCSEPass on f4
|
|
|
|
; RUN: opt -disable-output -disable-verify \
|
|
; RUN: -passes=early-cse -opt-bisect-limit=2 %s 2>&1 \
|
|
; RUN: | FileCheck %s --check-prefix=CHECK-LIMIT-FUNCTION-PASS
|
|
; CHECK-LIMIT-FUNCTION-PASS: BISECT: running pass (1) EarlyCSEPass on f1
|
|
; CHECK-LIMIT-FUNCTION-PASS: BISECT: running pass (2) EarlyCSEPass on f2
|
|
; CHECK-LIMIT-FUNCTION-PASS: BISECT: NOT running pass (3) EarlyCSEPass on f3
|
|
; CHECK-LIMIT-FUNCTION-PASS: BISECT: NOT running pass (4) EarlyCSEPass on f4
|
|
|
|
; RUN: opt -disable-output -disable-verify \
|
|
; RUN: -passes=function-attrs -opt-bisect-limit=-1 %s 2>&1 \
|
|
; RUN: | FileCheck %s --check-prefix=CHECK-CGSCC-PASS
|
|
; CHECK-CGSCC-PASS: BISECT: running pass (1) PostOrderFunctionAttrsPass on (f1)
|
|
; CHECK-CGSCC-PASS: BISECT: running pass (2) PostOrderFunctionAttrsPass on (f2)
|
|
; CHECK-CGSCC-PASS: BISECT: running pass (3) PostOrderFunctionAttrsPass on (f3)
|
|
; CHECK-CGSCC-PASS: BISECT: running pass (4) PostOrderFunctionAttrsPass on (f4)
|
|
|
|
; RUN: opt -disable-output -disable-verify \
|
|
; RUN: -passes=function-attrs -opt-bisect-limit=3 %s 2>&1 \
|
|
; RUN: | FileCheck %s --check-prefix=CHECK-LIMIT-CGSCC-PASS
|
|
; CHECK-LIMIT-CGSCC-PASS: BISECT: running pass (1) PostOrderFunctionAttrsPass on (f1)
|
|
; CHECK-LIMIT-CGSCC-PASS: BISECT: running pass (2) PostOrderFunctionAttrsPass on (f2)
|
|
; CHECK-LIMIT-CGSCC-PASS: BISECT: running pass (3) PostOrderFunctionAttrsPass on (f3)
|
|
; CHECK-LIMIT-CGSCC-PASS: BISECT: NOT running pass (4) PostOrderFunctionAttrsPass on (f4)
|
|
|
|
; RUN: opt -disable-output -disable-verify -opt-bisect-limit=-1 \
|
|
; RUN: -passes='inferattrs,cgscc(function-attrs,function(early-cse))' %s 2>&1 \
|
|
; RUN: | FileCheck %s --check-prefix=CHECK-MULTI-PASS
|
|
; CHECK-MULTI-PASS: BISECT: running pass (1) InferFunctionAttrsPass on [module]
|
|
; CHECK-MULTI-PASS: BISECT: running pass (2) PostOrderFunctionAttrsPass on (f1)
|
|
; CHECK-MULTI-PASS: BISECT: running pass (3) EarlyCSEPass on f1
|
|
; CHECK-MULTI-PASS: BISECT: running pass (4) PostOrderFunctionAttrsPass on (f2)
|
|
; CHECK-MULTI-PASS: BISECT: running pass (5) EarlyCSEPass on f2
|
|
; CHECK-MULTI-PASS: BISECT: running pass (6) PostOrderFunctionAttrsPass on (f3)
|
|
; CHECK-MULTI-PASS: BISECT: running pass (7) EarlyCSEPass on f3
|
|
; CHECK-MULTI-PASS: BISECT: running pass (8) PostOrderFunctionAttrsPass on (f4)
|
|
; CHECK-MULTI-PASS: BISECT: running pass (9) EarlyCSEPass on f4
|
|
|
|
; RUN: opt -disable-output -disable-verify -opt-bisect-limit=7 \
|
|
; RUN: -passes='inferattrs,cgscc(function-attrs,function(early-cse))' %s 2>&1 \
|
|
; RUN: | FileCheck %s --check-prefix=CHECK-LIMIT-MULTI-PASS
|
|
; CHECK-LIMIT-MULTI-PASS: BISECT: running pass (1) InferFunctionAttrsPass on [module]
|
|
; CHECK-LIMIT-MULTI-PASS: BISECT: running pass (2) PostOrderFunctionAttrsPass on (f1)
|
|
; CHECK-LIMIT-MULTI-PASS: BISECT: running pass (3) EarlyCSEPass on f1
|
|
; CHECK-LIMIT-MULTI-PASS: BISECT: running pass (4) PostOrderFunctionAttrsPass on (f2)
|
|
; CHECK-LIMIT-MULTI-PASS: BISECT: running pass (5) EarlyCSEPass on f2
|
|
; CHECK-LIMIT-MULTI-PASS: BISECT: running pass (6) PostOrderFunctionAttrsPass on (f3)
|
|
; CHECK-LIMIT-MULTI-PASS: BISECT: running pass (7) EarlyCSEPass on f3
|
|
; CHECK-LIMIT-MULTI-PASS: BISECT: NOT running pass (8) PostOrderFunctionAttrsPass on (f4)
|
|
; CHECK-LIMIT-MULTI-PASS: BISECT: NOT running pass (9) EarlyCSEPass on f4
|
|
|
|
|
|
declare i32 @g()
|
|
|
|
define void @f1() {
|
|
entry:
|
|
br label %loop.0
|
|
loop.0:
|
|
br i1 undef, label %loop.0.0, label %loop.1
|
|
loop.0.0:
|
|
br i1 undef, label %loop.0.0, label %loop.0.1
|
|
loop.0.1:
|
|
br i1 undef, label %loop.0.1, label %loop.0
|
|
loop.1:
|
|
br i1 undef, label %loop.1, label %loop.1.bb1
|
|
loop.1.bb1:
|
|
br i1 undef, label %loop.1, label %loop.1.bb2
|
|
loop.1.bb2:
|
|
br i1 undef, label %end, label %loop.1.0
|
|
loop.1.0:
|
|
br i1 undef, label %loop.1.0, label %loop.1
|
|
end:
|
|
ret void
|
|
}
|
|
|
|
define i32 @f2() {
|
|
entry:
|
|
ret i32 0
|
|
}
|
|
|
|
define i32 @f3() {
|
|
entry:
|
|
%temp = call i32 @g()
|
|
%icmp = icmp ugt i32 %temp, 2
|
|
br i1 %icmp, label %bb.true, label %bb.false
|
|
bb.true:
|
|
%temp2 = call i32 @f2()
|
|
ret i32 %temp2
|
|
bb.false:
|
|
ret i32 0
|
|
}
|
|
|
|
; This function is here to verify that opt-bisect can skip all passes for
|
|
; functions that contain lifetime intrinsics.
|
|
define void @f4() {
|
|
entry:
|
|
%i = alloca i32, align 4
|
|
%tmp = bitcast i32* %i to i8*
|
|
call void @llvm.lifetime.start(i64 4, i8* %tmp)
|
|
br label %for.cond
|
|
|
|
for.cond:
|
|
br i1 undef, label %for.body, label %for.end
|
|
|
|
for.body:
|
|
br label %for.cond
|
|
|
|
for.end:
|
|
ret void
|
|
}
|
|
|
|
declare void @llvm.lifetime.start(i64, i8* nocapture)
|