brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.0 KiB · b104b26 Raw
185 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s3 4declare void @may_unwind()5 6define i1 @test_switch_in_block_with_assume(i8 %x) {7; CHECK-LABEL: @test_switch_in_block_with_assume(8; CHECK-NEXT:  entry:9; CHECK-NEXT:    call void @may_unwind()10; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[X:%.*]], 1011; CHECK-NEXT:    call void @llvm.assume(i1 [[C_1]])12; CHECK-NEXT:    switch i8 0, label [[EXIT_1:%.*]] [13; CHECK-NEXT:    i8 1, label [[EXIT_2:%.*]]14; CHECK-NEXT:    ]15; CHECK:       exit.1:16; CHECK-NEXT:    [[C_2:%.*]] = icmp ult i8 [[X]], 917; CHECK-NEXT:    [[RES_1:%.*]] = xor i1 true, [[C_2]]18; CHECK-NEXT:    ret i1 [[RES_1]]19; CHECK:       exit.2:20; CHECK-NEXT:    [[C_3:%.*]] = icmp ult i8 [[X]], 921; CHECK-NEXT:    [[RES_2:%.*]] = xor i1 true, [[C_3]]22; CHECK-NEXT:    ret i1 [[RES_2]]23;24entry:25  call void @may_unwind()26  %c.1 = icmp ult i8 %x, 1027  call void @llvm.assume(i1 %c.1)28  switch i8 0, label %exit.1 [29  i8 1, label %exit.230  ]31 32exit.1:33  %t.1 = icmp ult i8 %x, 1034  %c.2 = icmp ult i8 %x, 935  %res.1 = xor i1 %t.1, %c.236  ret i1 %res.137 38exit.2:39  %t.2 = icmp ult i8 %x, 1040  %c.3 = icmp ult i8 %x, 941  %res.2 = xor i1 %t.2, %c.342  ret i1 %res.243}44 45declare void @llvm.assume(i1)46 47define i1 @simplify_based_on_switch(i8 %x) {48; CHECK-LABEL: @simplify_based_on_switch(49; CHECK-NEXT:  entry:50; CHECK-NEXT:    switch i8 [[X:%.*]], label [[EXIT_1:%.*]] [51; CHECK-NEXT:    i8 6, label [[EXIT_2:%.*]]52; CHECK-NEXT:    i8 10, label [[EXIT_3:%.*]]53; CHECK-NEXT:    ]54; CHECK:       exit.1:55; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[X]], 756; CHECK-NEXT:    [[C_2:%.*]] = icmp ult i8 [[X]], 657; CHECK-NEXT:    [[RES_1:%.*]] = xor i1 [[C_1]], [[C_2]]58; CHECK-NEXT:    ret i1 [[RES_1]]59; CHECK:       exit.2:60; CHECK-NEXT:    [[RES_2:%.*]] = xor i1 true, false61; CHECK-NEXT:    ret i1 [[RES_2]]62; CHECK:       exit.3:63; CHECK-NEXT:    [[RES_3:%.*]] = xor i1 true, false64; CHECK-NEXT:    ret i1 [[RES_3]]65;66entry:67  switch i8 %x, label %exit.1 [68  i8 6, label %exit.269  i8 10, label %exit.370  ]71 72exit.1:73  %c.1 = icmp ult i8 %x, 774  %c.2 = icmp ult i8 %x, 675  %res.1 = xor i1 %c.1, %c.276  ret i1 %res.177 78exit.2:79  %t.1 = icmp ult i8 %x, 780  %f.1 = icmp ult i8 %x, 681  %res.2 = xor i1 %t.1, %f.182  ret i1 %res.283 84exit.3:85  %t.2 = icmp ult i8 %x, 1186  %f.2 = icmp ult i8 %x, 1087  %res.3 = xor i1 %t.2, %f.288  ret i1 %res.389}90 91define i1 @simplify_based_on_switch_successor_branches(i8 %x) {92; CHECK-LABEL: @simplify_based_on_switch_successor_branches(93; CHECK-NEXT:  entry:94; CHECK-NEXT:    switch i8 [[X:%.*]], label [[EXIT_1:%.*]] [95; CHECK-NEXT:    i8 6, label [[EXIT_2:%.*]]96; CHECK-NEXT:    i8 10, label [[EXIT_3:%.*]]97; CHECK-NEXT:    ]98; CHECK:       exit.1:99; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[X]], 7100; CHECK-NEXT:    [[C_2:%.*]] = icmp ult i8 [[X]], 6101; CHECK-NEXT:    [[RES_1:%.*]] = xor i1 [[C_1]], [[C_2]]102; CHECK-NEXT:    ret i1 [[RES_1]]103; CHECK:       exit.2:104; CHECK-NEXT:    [[RES_2:%.*]] = xor i1 true, false105; CHECK-NEXT:    call void @use(i1 [[RES_2]])106; CHECK-NEXT:    br label [[EXIT_3]]107; CHECK:       exit.3:108; CHECK-NEXT:    [[C_3:%.*]] = icmp ult i8 [[X]], 11109; CHECK-NEXT:    [[C_4:%.*]] = icmp ult i8 [[X]], 10110; CHECK-NEXT:    [[RES_3:%.*]] = xor i1 [[C_3]], [[C_4]]111; CHECK-NEXT:    ret i1 [[RES_3]]112;113entry:114  switch i8 %x, label %exit.1 [115  i8 6, label %exit.2116  i8 10, label %exit.3117  ]118 119exit.1:120  %c.1 = icmp ult i8 %x, 7121  %c.2 = icmp ult i8 %x, 6122  %res.1 = xor i1 %c.1, %c.2123  ret i1 %res.1124 125exit.2:126  %t.1 = icmp ult i8 %x, 7127  %f.1 = icmp ult i8 %x, 6128  %res.2 = xor i1 %t.1, %f.1129  call void @use(i1 %res.2)130  br label %exit.3131 132exit.3:133  %c.3 = icmp ult i8 %x, 11134  %c.4 = icmp ult i8 %x, 10135  %res.3 = xor i1 %c.3, %c.4136  ret i1 %res.3137}138 139define i1 @switch_same_destination_for_different_cases(i8 %x) {140; CHECK-LABEL: @switch_same_destination_for_different_cases(141; CHECK-NEXT:  entry:142; CHECK-NEXT:    switch i8 [[X:%.*]], label [[EXIT_1:%.*]] [143; CHECK-NEXT:    i8 6, label [[EXIT_2:%.*]]144; CHECK-NEXT:    i8 10, label [[EXIT_2]]145; CHECK-NEXT:    ]146; CHECK:       exit.1:147; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[X]], 7148; CHECK-NEXT:    [[C_2:%.*]] = icmp ult i8 [[X]], 6149; CHECK-NEXT:    [[RES_1:%.*]] = xor i1 [[C_1]], [[C_2]]150; CHECK-NEXT:    ret i1 [[RES_1]]151; CHECK:       exit.2:152; CHECK-NEXT:    [[C_3:%.*]] = icmp ult i8 [[X]], 7153; CHECK-NEXT:    call void @use(i1 [[C_3]])154; CHECK-NEXT:    [[C_4:%.*]] = icmp ult i8 [[X]], 6155; CHECK-NEXT:    call void @use(i1 [[C_4]])156; CHECK-NEXT:    [[C_5:%.*]] = icmp ult i8 [[X]], 11157; CHECK-NEXT:    call void @use(i1 [[C_5]])158; CHECK-NEXT:    [[C_6:%.*]] = icmp ult i8 [[X]], 10159; CHECK-NEXT:    ret i1 [[C_6]]160;161entry:162  switch i8 %x, label %exit.1 [163  i8 6, label %exit.2164  i8 10, label %exit.2165  ]166 167exit.1:168  %c.1 = icmp ult i8 %x, 7169  %c.2 = icmp ult i8 %x, 6170  %res.1 = xor i1 %c.1, %c.2171  ret i1 %res.1172 173exit.2:174  %c.3 = icmp ult i8 %x, 7175  call void @use(i1 %c.3)176  %c.4 = icmp ult i8 %x, 6177  call void @use(i1 %c.4)178  %c.5 = icmp ult i8 %x, 11179  call void @use(i1 %c.5)180  %c.6 = icmp ult i8 %x, 10181  ret i1 %c.6182}183 184declare void @use(i1)185