443 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=arm -mattr=+v6t2 | FileCheck %s3 4%struct.F = type { [3 x i8], i8 }5 6@X = common global %struct.F zeroinitializer, align 4 ; <ptr> [#uses=1]7 8define void @f1([1 x i32] %f.coerce0) nounwind {9; CHECK-LABEL: f1:10; CHECK: @ %bb.0: @ %entry11; CHECK-NEXT: movw r0, :lower16:X12; CHECK-NEXT: mov r2, #1013; CHECK-NEXT: movt r0, :upper16:X14; CHECK-NEXT: ldr r1, [r0]15; CHECK-NEXT: bfi r1, r2, #22, #416; CHECK-NEXT: str r1, [r0]17; CHECK-NEXT: bx lr18entry:19 %0 = load i32, ptr @X, align 4 ; <i32> [#uses=1]20 %1 = and i32 %0, -62914561 ; <i32> [#uses=1]21 %2 = or i32 %1, 41943040 ; <i32> [#uses=1]22 store i32 %2, ptr @X, align 423 ret void24}25 26define i32 @f2(i32 %A, i32 %B) nounwind {27; CHECK-LABEL: f2:28; CHECK: @ %bb.0: @ %entry29; CHECK-NEXT: lsr r1, r1, #730; CHECK-NEXT: bfi r0, r1, #7, #1631; CHECK-NEXT: bx lr32entry:33 %and = and i32 %A, -8388481 ; <i32> [#uses=1]34 %and2 = and i32 %B, 8388480 ; <i32> [#uses=1]35 %or = or i32 %and2, %and ; <i32> [#uses=1]36 ret i32 %or37}38 39define i32 @f3(i32 %A, i32 %B) nounwind {40; CHECK-LABEL: f3:41; CHECK: @ %bb.0: @ %entry42; CHECK-NEXT: lsr r0, r0, #743; CHECK-NEXT: bfi r1, r0, #7, #1644; CHECK-NEXT: mov r0, r145; CHECK-NEXT: bx lr46entry:47 %and = and i32 %A, 8388480 ; <i32> [#uses=1]48 %and2 = and i32 %B, -8388481 ; <i32> [#uses=1]49 %or = or i32 %and2, %and ; <i32> [#uses=1]50 ret i32 %or51}52 53; rdar://875205654define i32 @f4(i32 %a) nounwind {55; CHECK-LABEL: f4:56; CHECK: @ %bb.0:57; CHECK-NEXT: movw r1, #313758; CHECK-NEXT: bfi r1, r0, #15, #559; CHECK-NEXT: mov r0, r160; CHECK-NEXT: bx lr61 %1 = shl i32 %a, 1562 %ins7 = and i32 %1, 101580863 %ins12 = or i32 %ins7, 313764 ret i32 %ins1265}66 67; rdar://845866368define i32 @f5(i32 %a, i32 %b) nounwind {69; CHECK-LABEL: f5:70; CHECK: @ %bb.0: @ %entry71; CHECK-NEXT: bfi r0, r1, #20, #472; CHECK-NEXT: bx lr73entry:74 %0 = and i32 %a, -1572864175 %1 = shl i32 %b, 2076 %2 = and i32 %1, 1572864077 %3 = or i32 %2, %078 ret i32 %379}80 81; rdar://960903082define i32 @f6(i32 %a, i32 %b) nounwind readnone {83; CHECK-LABEL: f6:84; CHECK: @ %bb.0: @ %entry85; CHECK-NEXT: bfi r0, r1, #8, #986; CHECK-NEXT: bx lr87entry:88 %and = and i32 %a, -13081789 %and2 = shl i32 %b, 890 %shl = and i32 %and2, 13081691 %or = or i32 %shl, %and92 ret i32 %or93}94 95define i32 @f7(i32 %x, i32 %y) {96; CHECK-LABEL: f7:97; CHECK: @ %bb.0:98; CHECK-NEXT: lsr r2, r0, #299; CHECK-NEXT: bic r0, r1, #255100; CHECK-NEXT: bfi r0, r2, #4, #1101; CHECK-NEXT: bx lr102 %y2 = and i32 %y, 4294967040 ; 0xFFFFFF00103 %and = and i32 %x, 4104 %or = or i32 %y2, 16105 %cmp = icmp ne i32 %and, 0106 %sel = select i1 %cmp, i32 %or, i32 %y2107 ret i32 %sel108}109 110define i32 @f8(i32 %x, i32 %y) {111; CHECK-LABEL: f8:112; CHECK: @ %bb.0:113; CHECK-NEXT: lsr r2, r0, #2114; CHECK-NEXT: bic r0, r1, #255115; CHECK-NEXT: bfi r0, r2, #4, #1116; CHECK-NEXT: bfi r0, r2, #5, #1117; CHECK-NEXT: bx lr118 %y2 = and i32 %y, 4294967040 ; 0xFFFFFF00119 %and = and i32 %x, 4120 %or = or i32 %y2, 48121 %cmp = icmp ne i32 %and, 0122 %sel = select i1 %cmp, i32 %or, i32 %y2123 ret i32 %sel124}125 126define i32 @f9(i32 %x, i32 %y) {127; CHECK-LABEL: f9:128; CHECK: @ %bb.0:129; CHECK-NEXT: bic r1, r1, #255130; CHECK-NEXT: tst r0, #4131; CHECK-NEXT: orreq r1, r1, #48132; CHECK-NEXT: mov r0, r1133; CHECK-NEXT: bx lr134 %y2 = and i32 %y, 4294967040 ; 0xFFFFFF00135 %and = and i32 %x, 4136 %or = or i32 %y2, 48137 %cmp = icmp ne i32 %and, 0138 %sel = select i1 %cmp, i32 %y2, i32 %or139 ret i32 %sel140}141 142define i32 @f10(i32 %x, i32 %y) {143; CHECK-LABEL: f10:144; CHECK: @ %bb.0:145; CHECK-NEXT: lsr r2, r0, #1146; CHECK-NEXT: bic r0, r1, #255147; CHECK-NEXT: bfi r0, r2, #4, #2148; CHECK-NEXT: bx lr149 %y2 = and i32 %y, 4294967040 ; 0xFFFFFF00150 %and = and i32 %x, 4151 %or = or i32 %y2, 32152 %cmp = icmp ne i32 %and, 0153 %sel = select i1 %cmp, i32 %or, i32 %y2154 155 %aand = and i32 %x, 2156 %aor = or i32 %sel, 16157 %acmp = icmp ne i32 %aand, 0158 %asel = select i1 %acmp, i32 %aor, i32 %sel159 160 ret i32 %asel161}162 163define i32 @f11(i32 %x, i32 %y) {164; CHECK-LABEL: f11:165; CHECK: @ %bb.0:166; CHECK-NEXT: lsr r2, r0, #1167; CHECK-NEXT: bic r0, r1, #255168; CHECK-NEXT: bfi r0, r2, #4, #3169; CHECK-NEXT: bx lr170 %y2 = and i32 %y, 4294967040 ; 0xFFFFFF00171 %and = and i32 %x, 4172 %or = or i32 %y2, 32173 %cmp = icmp ne i32 %and, 0174 %sel = select i1 %cmp, i32 %or, i32 %y2175 176 %aand = and i32 %x, 2177 %aor = or i32 %sel, 16178 %acmp = icmp ne i32 %aand, 0179 %asel = select i1 %acmp, i32 %aor, i32 %sel180 181 %band = and i32 %x, 8182 %bor = or i32 %asel, 64183 %bcmp = icmp ne i32 %band, 0184 %bsel = select i1 %bcmp, i32 %bor, i32 %asel185 186 ret i32 %bsel187}188 189define i32 @f12(i32 %x, i32 %y) {190; CHECK-LABEL: f12:191; CHECK: @ %bb.0:192; CHECK-NEXT: lsr r2, r0, #2193; CHECK-NEXT: bic r0, r1, #255194; CHECK-NEXT: bfi r0, r2, #4, #1195; CHECK-NEXT: bx lr196 %y2 = and i32 %y, 4294967040 ; 0xFFFFFF00197 %and = and i32 %x, 4198 %or = or i32 %y2, 16199 %cmp = icmp eq i32 %and, 0200 %sel = select i1 %cmp, i32 %y2, i32 %or201 ret i32 %sel202}203 204define i32 @f13(i32 %x, i32 %y) {205; CHECK-LABEL: f13:206; CHECK: @ %bb.0:207; CHECK-NEXT: and r0, r0, #4208; CHECK-NEXT: bic r1, r1, #255209; CHECK-NEXT: cmp r0, #42210; CHECK-NEXT: orrne r1, r1, #16211; CHECK-NEXT: mov r0, r1212; CHECK-NEXT: bx lr213 %y2 = and i32 %y, 4294967040 ; 0xFFFFFF00214 %and = and i32 %x, 4215 %or = or i32 %y2, 16216 %cmp = icmp eq i32 %and, 42 ; Not comparing against zero!217 %sel = select i1 %cmp, i32 %y2, i32 %or218 ret i32 %sel219}220 221define i32 @bfi1(i32 %a, i32 %b) {222; CHECK-LABEL: bfi1:223; CHECK: @ %bb.0:224; CHECK-NEXT: and r2, r0, #1225; CHECK-NEXT: bic r1, r1, #19226; CHECK-NEXT: orr r1, r1, r2227; CHECK-NEXT: and r2, r0, #16228; CHECK-NEXT: orr r1, r1, r2229; CHECK-NEXT: and r0, r0, #2230; CHECK-NEXT: orr r0, r1, r0231; CHECK-NEXT: bx lr232 %x1 = and i32 %a, 1233 %y1 = and i32 %b, 4294967294234 %z1 = or i32 %y1, %x1235 %x2 = and i32 %a, 16236 %y2 = and i32 %z1, 4294967279237 %z2 = or i32 %y2, %x2238 %x3 = and i32 %a, 2239 %y3 = and i32 %z2, 4294967293240 %z3 = or i32 %y3, %x3241 ret i32 %z3242}243 244define void @bfi1_use(i32 %a, i32 %b) {245; CHECK-LABEL: bfi1_use:246; CHECK: @ %bb.0:247; CHECK-NEXT: push {r11, lr}248; CHECK-NEXT: mov r2, r1249; CHECK-NEXT: lsr r3, r0, #4250; CHECK-NEXT: bfi r2, r0, #0, #1251; CHECK-NEXT: lsr r0, r0, #1252; CHECK-NEXT: mov r1, r2253; CHECK-NEXT: bfi r1, r3, #4, #1254; CHECK-NEXT: mov r3, r1255; CHECK-NEXT: bfi r3, r0, #1, #1256; CHECK-NEXT: mov r0, r2257; CHECK-NEXT: mov r2, r3258; CHECK-NEXT: bl use259; CHECK-NEXT: pop {r11, pc}260 %x1 = and i32 %a, 1261 %y1 = and i32 %b, 4294967294262 %z1 = or i32 %y1, %x1263 %x2 = and i32 %a, 16264 %y2 = and i32 %z1, 4294967279265 %z2 = or i32 %y2, %x2266 %x3 = and i32 %a, 2267 %y3 = and i32 %z2, 4294967293268 %z3 = or i32 %y3, %x3269 call void @use(i32 %z1, i32 %z2, i32 %z3, i32 %z3)270 ret void271}272 273define i32 @bfi2(i32 %a, i32 %b) {274; CHECK-LABEL: bfi2:275; CHECK: @ %bb.0:276; CHECK-NEXT: movw r2, #65148277; CHECK-NEXT: movt r2, #65535278; CHECK-NEXT: and r1, r1, r2279; CHECK-NEXT: and r2, r0, #1280; CHECK-NEXT: orr r1, r1, r2281; CHECK-NEXT: and r2, r0, #2282; CHECK-NEXT: orr r1, r1, r2283; CHECK-NEXT: and r2, r0, #128284; CHECK-NEXT: orr r1, r1, r2285; CHECK-NEXT: and r0, r0, #256286; CHECK-NEXT: orr r0, r1, r0287; CHECK-NEXT: bx lr288 %x1 = and i32 %a, 1289 %y1 = and i32 %b, 4294967294290 %z1 = or i32 %y1, %x1291 %x2 = and i32 %a, 2292 %y2 = and i32 %z1, 4294967293293 %z2 = or i32 %y2, %x2294 %x3 = and i32 %a, 128295 %y3 = and i32 %z2, 4294967167296 %z3 = or i32 %y3, %x3297 %x4 = and i32 %a, 256298 %y4 = and i32 %z3, 4294967039299 %z4 = or i32 %y4, %x4300 ret i32 %z4301}302 303define void @bfi2_uses(i32 %a, i32 %b) {304; CHECK-LABEL: bfi2_uses:305; CHECK: @ %bb.0:306; CHECK-NEXT: push {r11, lr}307; CHECK-NEXT: mov r12, r1308; CHECK-NEXT: bfi r1, r0, #0, #2309; CHECK-NEXT: bfi r12, r0, #0, #1310; CHECK-NEXT: lsr r0, r0, #7311; CHECK-NEXT: mov r2, r1312; CHECK-NEXT: mov r3, r1313; CHECK-NEXT: bfi r2, r0, #7, #1314; CHECK-NEXT: bfi r3, r0, #7, #2315; CHECK-NEXT: mov r0, r12316; CHECK-NEXT: bl use317; CHECK-NEXT: pop {r11, pc}318 %x1 = and i32 %a, 1319 %y1 = and i32 %b, 4294967294320 %z1 = or i32 %y1, %x1321 %x2 = and i32 %a, 2322 %y2 = and i32 %z1, 4294967293323 %z2 = or i32 %y2, %x2324 %x3 = and i32 %a, 128325 %y3 = and i32 %z2, 4294967167326 %z3 = or i32 %y3, %x3327 %x4 = and i32 %a, 256328 %y4 = and i32 %z3, 4294967039329 %z4 = or i32 %y4, %x4330 call void @use(i32 %z1, i32 %z2, i32 %z3, i32 %z4)331 ret void332}333 334define i32 @bfi3(i32 %a, i32 %b) {335; CHECK-LABEL: bfi3:336; CHECK: @ %bb.0:337; CHECK-NEXT: movw r2, #65148338; CHECK-NEXT: movt r2, #65535339; CHECK-NEXT: and r1, r1, r2340; CHECK-NEXT: and r2, r0, #1341; CHECK-NEXT: orr r1, r1, r2342; CHECK-NEXT: and r2, r0, #128343; CHECK-NEXT: orr r1, r1, r2344; CHECK-NEXT: and r2, r0, #2345; CHECK-NEXT: orr r1, r1, r2346; CHECK-NEXT: and r0, r0, #256347; CHECK-NEXT: orr r0, r1, r0348; CHECK-NEXT: bx lr349 %x1 = and i32 %a, 1350 %y1 = and i32 %b, 4294967294351 %z1 = or i32 %y1, %x1352 %x2 = and i32 %a, 128353 %y2 = and i32 %z1, 4294967167354 %z2 = or i32 %y2, %x2355 %x3 = and i32 %a, 2356 %y3 = and i32 %z2, 4294967293357 %z3 = or i32 %y3, %x3358 %x4 = and i32 %a, 256359 %y4 = and i32 %z3, 4294967039360 %z4 = or i32 %y4, %x4361 ret i32 %z4362}363 364define void @bfi3_uses(i32 %a, i32 %b) {365; CHECK-LABEL: bfi3_uses:366; CHECK: @ %bb.0:367; CHECK-NEXT: push {r11, lr}368; CHECK-NEXT: mov r12, r1369; CHECK-NEXT: lsr r2, r0, #7370; CHECK-NEXT: bfi r12, r0, #0, #1371; CHECK-NEXT: lsr r3, r0, #1372; CHECK-NEXT: lsr r0, r0, #8373; CHECK-NEXT: mov r1, r12374; CHECK-NEXT: bfi r1, r2, #7, #1375; CHECK-NEXT: mov r2, r1376; CHECK-NEXT: bfi r2, r3, #1, #1377; CHECK-NEXT: mov r3, r2378; CHECK-NEXT: bfi r3, r0, #8, #1379; CHECK-NEXT: mov r0, r12380; CHECK-NEXT: bl use381; CHECK-NEXT: pop {r11, pc}382 %x1 = and i32 %a, 1383 %y1 = and i32 %b, 4294967294384 %z1 = or i32 %y1, %x1385 %x2 = and i32 %a, 128386 %y2 = and i32 %z1, 4294967167387 %z2 = or i32 %y2, %x2388 %x3 = and i32 %a, 2389 %y3 = and i32 %z2, 4294967293390 %z3 = or i32 %y3, %x3391 %x4 = and i32 %a, 256392 %y4 = and i32 %z3, 4294967039393 %z4 = or i32 %y4, %x4394 call void @use(i32 %z1, i32 %z2, i32 %z3, i32 %z4)395 ret void396}397 398define i32 @bfi4(i32 %A, i2 zeroext %BB, ptr %d) {399; CHECK-LABEL: bfi4:400; CHECK: @ %bb.0: @ %entry401; CHECK-NEXT: push {r11, lr}402; CHECK-NEXT: lsr r12, r0, #1403; CHECK-NEXT: and r3, r0, #8404; CHECK-NEXT: bfi r1, r12, #2, #2405; CHECK-NEXT: mov lr, #96406; CHECK-NEXT: tst r0, #32407; CHECK-NEXT: bfi r1, r12, #9, #2408; CHECK-NEXT: movweq lr, #32409; CHECK-NEXT: orr r1, r1, r3, lsl #8410; CHECK-NEXT: and r3, r0, #64411; CHECK-NEXT: and r0, r0, #128412; CHECK-NEXT: orr r1, r1, lr413; CHECK-NEXT: orr r1, r1, r3, lsl #1414; CHECK-NEXT: str r1, [r2]415; CHECK-NEXT: pop {r11, pc}416entry:417 %B = zext i2 %BB to i32418 %and = and i32 %A, 2419 %tobool12.not = icmp eq i32 %and, 0420 %or17 = or i32 %B, 516421 %spec.select112 = select i1 %tobool12.not, i32 %B, i32 %or17422 %and20 = and i32 %A, 4423 %tobool21.not = icmp eq i32 %and20, 0424 %or26 = or i32 %spec.select112, 1032425 %spec.select114 = select i1 %tobool21.not, i32 %spec.select112, i32 %or26426 store i32 %spec.select114, ptr %d, align 4427 %and29 = shl i32 %A, 8428 %l2 = and i32 %and29, 2048429 %l3 = or i32 %l2, %spec.select114430 %and38 = and i32 %A, 32431 %tobool39.not = icmp eq i32 %and38, 0432 %spec.select.v = select i1 %tobool39.not, i32 32, i32 96433 %spec.select = or i32 %l3, %spec.select.v434 %and45 = shl i32 %A, 1435 %l4 = and i32 %and45, 128436 %l5 = or i32 %l4, %spec.select437 store i32 %l5, ptr %d, align 4438 %and52 = and i32 %A, 128439 ret i32 %and52440}441 442declare void @use(i32, i32, i32, i32)443