xref: /llvm-project/llvm/test/Transforms/SimplifyCFG/annotations.ll (revision 8979ae42769e529b0f6fce3268492ffb49bd54b9)
1d1d12935SRoman Lebedev; RUN: opt -passes=simplifycfg -simplifycfg-require-and-preserve-domtree=1 -S %s | FileCheck --match-full-lines %s
270bd7542SFlorian Hahn
370bd7542SFlorian Hahn; The branch in %cont has !annotation metadata. Make sure generated AND
470bd7542SFlorian Hahn; has !annotation metadata.
5*8979ae42SNikita Popovdefine i32 @test_preserve_and(ptr %a, ptr %b, ptr %c, ptr %d) {
670bd7542SFlorian Hahn; CHECK-LABEL: define {{.*}} @test_preserve_and({{.*}}
770bd7542SFlorian Hahn; CHECK-NEXT:  entry:
8*8979ae42SNikita Popov; CHECK-NEXT:    [[C_1:%.*]] = icmp ult ptr [[A:%.*]], [[B:%.*]], !annotation !0
9*8979ae42SNikita Popov; CHECK-NEXT:    [[C_2:%.*]] = icmp uge ptr [[C:%.*]], [[D:%.*]], !annotation !0
105c2e50b5SJuneyoung Lee; CHECK-NEXT:    [[OR_COND:%.*]] = select i1 [[C_1]], i1 [[C_2]], i1 false, !annotation !0
1170bd7542SFlorian Hahn; CHECK-NEXT:    br i1 [[OR_COND]], label [[CONT1:%.*]], label [[TRAP:%.*]], !annotation !0
1270bd7542SFlorian Hahn; CHECK:       trap: ; preds = %entry
1370bd7542SFlorian Hahn; CHECK-NEXT:    call void @fn1()
1470bd7542SFlorian Hahn; CHECK-NEXT:    unreachable
1570bd7542SFlorian Hahn; CHECK:       cont1: ; preds = %entry
1670bd7542SFlorian Hahn; CHECK-NEXT:    call void @fn2()
1770bd7542SFlorian Hahn; CHECK-NEXT:    ret i32 0
1870bd7542SFlorian Hahn;
1970bd7542SFlorian Hahnentry:
20*8979ae42SNikita Popov  %c.1 = icmp ult ptr %a, %b, !annotation !0
2170bd7542SFlorian Hahn  br i1 %c.1, label %cont, label %trap, !annotation !0
2270bd7542SFlorian Hahn
2370bd7542SFlorian Hahncont:                                             ; preds = %entry
24*8979ae42SNikita Popov  %c.2 = icmp uge ptr %c, %d, !annotation !0
2570bd7542SFlorian Hahn  br i1 %c.2, label %cont1, label %trap, !annotation !0
2670bd7542SFlorian Hahn
2770bd7542SFlorian Hahntrap:                                             ; preds = %cont, %entry
2870bd7542SFlorian Hahn  call void @fn1()
2970bd7542SFlorian Hahn  unreachable
3070bd7542SFlorian Hahn
3170bd7542SFlorian Hahncont1:                                            ; preds = %cont
3270bd7542SFlorian Hahn  call void @fn2()
3370bd7542SFlorian Hahn  ret i32 0
3470bd7542SFlorian Hahn}
3570bd7542SFlorian Hahn
3670bd7542SFlorian Hahn; The branch in %cont has !annotation metadata. Make sure generated OR
3770bd7542SFlorian Hahn; has !annotation metadata.
38*8979ae42SNikita Popovdefine i32 @test_preserve_or(ptr %a, ptr %b, ptr %c, ptr %d) {
3970bd7542SFlorian Hahn; CHECK-LABEL: define {{.*}} @test_preserve_or({{.*}}
4070bd7542SFlorian Hahn; CHECK-NEXT:  entry:
41*8979ae42SNikita Popov; CHECK-NEXT:    [[C_1:%.*]] = icmp uge ptr [[A:%.*]], [[B:%.*]], !annotation !0
42*8979ae42SNikita Popov; CHECK-NEXT:    [[C_2:%.*]] = icmp uge ptr [[C:%.*]], [[D:%.*]], !annotation !0
435c2e50b5SJuneyoung Lee; CHECK-NEXT:    [[OR_COND:%.*]] = select i1 [[C_1]], i1 true, i1 [[C_2]], !annotation !0
4470bd7542SFlorian Hahn; CHECK-NEXT:    br i1 [[OR_COND]], label [[TRAP:%.*]], label [[CONT1:%.*]], !annotation !0
4570bd7542SFlorian Hahn; CHECK:       trap: ; preds = %entry
4670bd7542SFlorian Hahn; CHECK-NEXT:    call void @fn1()
4770bd7542SFlorian Hahn; CHECK-NEXT:    unreachable
4870bd7542SFlorian Hahn; CHECK:       cont1:  ; preds = %entry
4970bd7542SFlorian Hahn; CHECK-NEXT:    call void @fn2()
5070bd7542SFlorian Hahn; CHECK-NEXT:    ret i32 0
5170bd7542SFlorian Hahn;
5270bd7542SFlorian Hahnentry:
53*8979ae42SNikita Popov  %c.1 = icmp ult ptr %a, %b, !annotation !0
5470bd7542SFlorian Hahn  br i1 %c.1, label %cont, label %trap, !annotation !0
5570bd7542SFlorian Hahn
5670bd7542SFlorian Hahncont:                                             ; preds = %entry
57*8979ae42SNikita Popov  %c.2 = icmp uge ptr %c, %d, !annotation !0
5870bd7542SFlorian Hahn  br i1 %c.2, label %trap, label %cont1, !annotation !0
5970bd7542SFlorian Hahn
6070bd7542SFlorian Hahntrap:                                             ; preds = %cont, %entry
6170bd7542SFlorian Hahn  call void @fn1()
6270bd7542SFlorian Hahn  unreachable
6370bd7542SFlorian Hahn
6470bd7542SFlorian Hahncont1:                                            ; preds = %cont
6570bd7542SFlorian Hahn  call void @fn2()
6670bd7542SFlorian Hahn  ret i32 0
6770bd7542SFlorian Hahn}
6870bd7542SFlorian Hahn
6970bd7542SFlorian Hahn; The branch in %cont has !annotation metadata. Make sure generated negation
7070bd7542SFlorian Hahn; and OR have !annotation metadata.
71*8979ae42SNikita Popovdefine i32 @test_preserve_or_not(ptr %a, ptr %b, ptr %c, ptr %d) {
7270bd7542SFlorian Hahn; CHECK-LABEL: define {{.*}} @test_preserve_or_not({{.*}}
7370bd7542SFlorian Hahn; CHECK-NEXT:  entry:
74*8979ae42SNikita Popov; CHECK-NEXT:    [[C_1:%.*]] = icmp ult ptr [[A:%.*]], [[B:%.*]], !annotation !0
7570bd7542SFlorian Hahn; CHECK-NEXT:    [[C_2:%.*]] = xor i1 [[C_1]], true
7675c04bfcSFlorian Hahn; CHECK-NEXT:    [[C_2_NOT:%.*]] = xor i1 [[C_2]], true, !annotation !0
77*8979ae42SNikita Popov; CHECK-NEXT:    [[C_3:%.*]] = icmp uge ptr [[C:%.*]], [[D:%.*]], !annotation !0
785c2e50b5SJuneyoung Lee; CHECK-NEXT:    [[OR_COND:%.*]] = select i1 [[C_2_NOT]], i1 true, i1 [[C_3]], !annotation !0
7970bd7542SFlorian Hahn; CHECK-NEXT:    br i1 [[OR_COND]], label [[TRAP:%.*]], label [[CONT1:%.*]], !annotation !0
8070bd7542SFlorian Hahn; CHECK:       trap: ; preds = %entry
8170bd7542SFlorian Hahn; CHECK-NEXT:    call void @fn1()
8270bd7542SFlorian Hahn; CHECK-NEXT:    unreachable
8370bd7542SFlorian Hahn; CHECK:       cont1:  ; preds = %entry
8470bd7542SFlorian Hahn; CHECK-NEXT:    call void @fn2()
8570bd7542SFlorian Hahn; CHECK-NEXT:    ret i32 0
8670bd7542SFlorian Hahn;
8770bd7542SFlorian Hahnentry:
88*8979ae42SNikita Popov  %c.1 = icmp ult ptr %a, %b, !annotation !0
8970bd7542SFlorian Hahn  %c.2 = xor i1 %c.1, true
9070bd7542SFlorian Hahn  br i1 %c.2, label %cont, label %trap, !annotation !0
9170bd7542SFlorian Hahn
9270bd7542SFlorian Hahncont:                                             ; preds = %entry
93*8979ae42SNikita Popov  %c.3 = icmp uge ptr %c, %d, !annotation !0
9470bd7542SFlorian Hahn  br i1 %c.3, label %trap, label %cont1, !annotation !0
9570bd7542SFlorian Hahn
9670bd7542SFlorian Hahntrap:                                             ; preds = %cont, %entry
9770bd7542SFlorian Hahn  call void @fn1()
9870bd7542SFlorian Hahn  unreachable
9970bd7542SFlorian Hahn
10070bd7542SFlorian Hahncont1:                                            ; preds = %cont
10170bd7542SFlorian Hahn  call void @fn2()
10270bd7542SFlorian Hahn  ret i32 0
10370bd7542SFlorian Hahn}
10470bd7542SFlorian Hahn
10570bd7542SFlorian Hahn
10670bd7542SFlorian Hahn; The branch in %cont has no !annotation metadata. Make sure generated negation
10770bd7542SFlorian Hahn; and OR do not have !annotation metadata.
108*8979ae42SNikita Popovdefine i32 @test_or_not_no_annotation(ptr %a, ptr %b, ptr %c, ptr %d) {
10970bd7542SFlorian Hahn; CHECK-LABEL: define {{.*}} @test_or_not_no_annotation({{.*}}
11070bd7542SFlorian Hahn; CHECK-NEXT:  entry:
111*8979ae42SNikita Popov; CHECK-NEXT:    [[C_1:%.*]] = icmp ult ptr [[A:%.*]], [[B:%.*]], !annotation !0
11270bd7542SFlorian Hahn; CHECK-NEXT:    [[C_2:%.*]] = xor i1 [[C_1]], true
11370bd7542SFlorian Hahn; CHECK-NEXT:    [[C_2_NOT:%.*]] = xor i1 [[C_2]], true
114*8979ae42SNikita Popov; CHECK-NEXT:    [[C_3:%.*]] = icmp uge ptr [[C:%.*]], [[D:%.*]], !annotation !0
1155c2e50b5SJuneyoung Lee; CHECK-NEXT:    [[OR_COND:%.*]] = select i1 [[C_2_NOT]], i1 true, i1 [[C_3]]
11670bd7542SFlorian Hahn; CHECK-NEXT:    br i1 [[OR_COND]], label [[TRAP:%.*]], label [[CONT1:%.*]], !annotation !0
11770bd7542SFlorian Hahn; CHECK:       trap: ; preds = %entry
11870bd7542SFlorian Hahn; CHECK-NEXT:    call void @fn1()
11970bd7542SFlorian Hahn; CHECK-NEXT:    unreachable
12070bd7542SFlorian Hahn; CHECK:       cont1:  ; preds = %entry
12170bd7542SFlorian Hahn; CHECK-NEXT:    call void @fn2()
12270bd7542SFlorian Hahn; CHECK-NEXT:    ret i32 0
12370bd7542SFlorian Hahn;
12470bd7542SFlorian Hahnentry:
125*8979ae42SNikita Popov  %c.1 = icmp ult ptr %a, %b, !annotation !0
12670bd7542SFlorian Hahn  %c.2 = xor i1 %c.1, true
12770bd7542SFlorian Hahn  br i1 %c.2, label %cont, label %trap, !annotation !0
12870bd7542SFlorian Hahn
12970bd7542SFlorian Hahncont:                                             ; preds = %entry
130*8979ae42SNikita Popov  %c.3 = icmp uge ptr %c, %d, !annotation !0
13170bd7542SFlorian Hahn  br i1 %c.3, label %trap, label %cont1
13270bd7542SFlorian Hahn
13370bd7542SFlorian Hahntrap:                                             ; preds = %cont, %entry
13470bd7542SFlorian Hahn  call void @fn1()
13570bd7542SFlorian Hahn  unreachable
13670bd7542SFlorian Hahn
13770bd7542SFlorian Hahncont1:                                            ; preds = %cont
13870bd7542SFlorian Hahn  call void @fn2()
13970bd7542SFlorian Hahn  ret i32 0
14070bd7542SFlorian Hahn}
14170bd7542SFlorian Hahn
14270bd7542SFlorian Hahndeclare void @fn1()
14370bd7542SFlorian Hahndeclare void @fn2()
14470bd7542SFlorian Hahn
14570bd7542SFlorian Hahn!0 = !{!"foo"}
146