Once the default for SimplifyCFG flips, we can no longer pass nullptr instead of DomTree to SimplifyCFG, so we need to propagate it here. We don't strictly need to actually preserve DomTree in DwarfEHPrepare, but we might as well do it, since it's trivial.
73 lines
1.9 KiB
LLVM
73 lines
1.9 KiB
LLVM
; RUN: llc -march=hexagon -O2 -simplifycfg-require-and-preserve-domtree=1 < %s | FileCheck %s
|
|
|
|
; The purpose of this test is to make sure that the packetizer is ignoring
|
|
; CFI instructions while forming packet for allocframe. Refer to 7d7d99622
|
|
; which replaced PROLOG_LABEL with CFI_INSTRUCTION.
|
|
|
|
@g0 = external constant i8*
|
|
|
|
; We used to emit:
|
|
; {
|
|
; allocframe(#0)
|
|
; }
|
|
; {
|
|
; r0 = #4
|
|
; But we can put more instructions in the first packet.
|
|
|
|
; CHECK: {
|
|
; CHECK-NEXT: call f1
|
|
; CHECK-NEXT: r0 = #4
|
|
; CHECK-NEXT: allocframe(#0)
|
|
; CHECK-NEXT: }
|
|
|
|
define i32 @f0() personality i8* bitcast (i32 (...)* @f3 to i8*) {
|
|
b0:
|
|
%v0 = tail call i8* @f1(i32 4) #1
|
|
%v1 = bitcast i8* %v0 to i32*
|
|
store i32 20, i32* %v1, align 4, !tbaa !0
|
|
invoke void @f2(i8* %v0, i8* bitcast (i8** @g0 to i8*), i8* null) #2
|
|
to label %b4 unwind label %b1
|
|
|
|
b1: ; preds = %b0
|
|
%v2 = landingpad { i8*, i32 }
|
|
catch i8* bitcast (i8** @g0 to i8*)
|
|
%v3 = extractvalue { i8*, i32 } %v2, 1
|
|
%v4 = tail call i32 @llvm.eh.typeid.for(i8* bitcast (i8** @g0 to i8*)) #1
|
|
%v5 = icmp eq i32 %v3, %v4
|
|
br i1 %v5, label %b2, label %b3
|
|
|
|
b2: ; preds = %b1
|
|
%v6 = extractvalue { i8*, i32 } %v2, 0
|
|
%v7 = tail call i8* @f4(i8* %v6) #1
|
|
tail call void @f5() #1
|
|
ret i32 1
|
|
|
|
b3: ; preds = %b1
|
|
resume { i8*, i32 } %v2
|
|
|
|
b4: ; preds = %b0
|
|
unreachable
|
|
}
|
|
|
|
declare i8* @f1(i32)
|
|
|
|
declare void @f2(i8*, i8*, i8*)
|
|
|
|
declare i32 @f3(...)
|
|
|
|
; Function Attrs: nounwind readnone
|
|
declare i32 @llvm.eh.typeid.for(i8*) #0
|
|
|
|
declare i8* @f4(i8*)
|
|
|
|
declare void @f5()
|
|
|
|
attributes #0 = { nounwind readnone }
|
|
attributes #1 = { nounwind }
|
|
attributes #2 = { noreturn }
|
|
|
|
!0 = !{!1, !1, i64 0}
|
|
!1 = !{!"int", !2}
|
|
!2 = !{!"omnipotent char", !3}
|
|
!3 = !{!"Simple C/C++ TBAA"}
|