1; RUN: opt < %s -simplifycfg -S | FileCheck %s 2 3target datalayout = "e-n32" 4 5; CHECK-LABEL: @test1 6; CHECK: %[[SUB:.*]] = sub i32 %a, 97 7; CHECK: %[[LSHR:.*]] = lshr i32 %[[SUB]], 2 8; CHECK: %[[SHL:.*]] = shl i32 %[[SUB]], 30 9; CHECK: %[[OR:.*]] = or i32 %[[LSHR]], %[[SHL]] 10; CHECK: switch i32 %[[OR]], label %def [ 11; CHECK: i32 0, label %one 12; CHECK: i32 1, label %two 13; CHECK: i32 2, label %three 14; CHECK: ] 15define i32 @test1(i32 %a) { 16 switch i32 %a, label %def [ 17 i32 97, label %one 18 i32 101, label %two 19 i32 105, label %three 20 i32 109, label %three 21 ] 22 23def: 24 ret i32 8867 25 26one: 27 ret i32 11984 28two: 29 ret i32 1143 30three: 31 ret i32 99783 32} 33 34; Optimization shouldn't trigger; bitwidth > 64 35; CHECK-LABEL: @test2 36; CHECK: switch i128 %a, label %def 37define i128 @test2(i128 %a) { 38 switch i128 %a, label %def [ 39 i128 97, label %one 40 i128 101, label %two 41 i128 105, label %three 42 i128 109, label %three 43 ] 44 45def: 46 ret i128 8867 47 48one: 49 ret i128 11984 50two: 51 ret i128 1143 52three: 53 ret i128 99783 54} 55 56 57; Optimization shouldn't trigger; no holes present 58; CHECK-LABEL: @test3 59; CHECK: switch i32 %a, label %def 60define i32 @test3(i32 %a) { 61 switch i32 %a, label %def [ 62 i32 97, label %one 63 i32 98, label %two 64 i32 99, label %three 65 ] 66 67def: 68 ret i32 8867 69 70one: 71 ret i32 11984 72two: 73 ret i32 1143 74three: 75 ret i32 99783 76} 77 78; Optimization shouldn't trigger; not an arithmetic progression 79; CHECK-LABEL: @test4 80; CHECK: switch i32 %a, label %def 81define i32 @test4(i32 %a) { 82 switch i32 %a, label %def [ 83 i32 97, label %one 84 i32 102, label %two 85 i32 105, label %three 86 i32 109, label %three 87 ] 88 89def: 90 ret i32 8867 91 92one: 93 ret i32 11984 94two: 95 ret i32 1143 96three: 97 ret i32 99783 98} 99 100; Optimization shouldn't trigger; not a power of two 101; CHECK-LABEL: @test5 102; CHECK: switch i32 %a, label %def 103define i32 @test5(i32 %a) { 104 switch i32 %a, label %def [ 105 i32 97, label %one 106 i32 102, label %two 107 i32 107, label %three 108 i32 112, label %three 109 ] 110 111def: 112 ret i32 8867 113 114one: 115 ret i32 11984 116two: 117 ret i32 1143 118three: 119 ret i32 99783 120} 121 122; CHECK-LABEL: @test6 123; CHECK: %[[SUB:.*]] = sub i32 %a, -109 124; CHECK: %[[LSHR:.*]] = lshr i32 %[[SUB]], 2 125; CHECK: %[[SHL:.*]] = shl i32 %[[SUB]], 30 126; CHECK: %[[OR:.*]] = or i32 %[[LSHR]], %[[SHL]] 127; CHECK: switch i32 %[[OR]], label %def [ 128define i32 @test6(i32 %a) optsize { 129 switch i32 %a, label %def [ 130 i32 -97, label %one 131 i32 -101, label %two 132 i32 -105, label %three 133 i32 -109, label %three 134 ] 135 136def: 137 ret i32 8867 138 139one: 140 ret i32 11984 141two: 142 ret i32 1143 143three: 144 ret i32 99783 145} 146 147; CHECK-LABEL: @test7 148; CHECK: %[[SUB:.*]] = sub i8 %a, -36 149; CHECK: %[[LSHR:.*]] = lshr i8 %[[SUB]], 2 150; CHECK: %[[SHL:.*]] = shl i8 %[[SUB]], 6 151; CHECK: %[[OR:.*]] = or i8 %[[LSHR]], %[[SHL]] 152; CHECK: switch.tableidx = {{.*}} %[[OR]] 153define i8 @test7(i8 %a) optsize { 154 switch i8 %a, label %def [ 155 i8 220, label %one 156 i8 224, label %two 157 i8 228, label %three 158 i8 232, label %three 159 ] 160 161def: 162 ret i8 8867 163 164one: 165 ret i8 11984 166two: 167 ret i8 1143 168three: 169 ret i8 99783 170} 171 172; CHECK-LABEL: @test8 173; CHECK: %[[SUB:.*]] = sub i32 %a, 97 174; CHECK: %[[LSHR:.*]] = lshr i32 %1, 2 175; CHECK: %[[SHL:.*]] = shl i32 %1, 30 176; CHECK: %[[OR:.*]] = or i32 %[[LSHR]], %[[SHL]] 177; CHECK: switch i32 %[[OR]], label %def [ 178define i32 @test8(i32 %a) optsize { 179 switch i32 %a, label %def [ 180 i32 97, label %one 181 i32 101, label %two 182 i32 105, label %three 183 i32 113, label %three 184 ] 185 186def: 187 ret i32 8867 188 189one: 190 ret i32 11984 191two: 192 ret i32 1143 193three: 194 ret i32 99783 195} 196 197; CHECK-LABEL: @test9 198; CHECK: switch 199; CHECK: i32 6 200; CHECK: i32 7 201; CHECK: i32 0 202; CHECK: i32 2 203define i32 @test9(i32 %a) { 204 switch i32 %a, label %def [ 205 i32 18, label %one 206 i32 20, label %two 207 i32 6, label %three 208 i32 10, label %three 209 ] 210 211def: 212 ret i32 8867 213 214one: 215 ret i32 11984 216two: 217 ret i32 1143 218three: 219 ret i32 99783 220} 221 222