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