1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=thumbv6-eabi %s -o - | FileCheck %s 3 4define void @test1(i32 %x, ptr %f) { 5; CHECK-LABEL: test1: 6; CHECK: @ %bb.0: @ %entry 7; CHECK-NEXT: .save {r7, lr} 8; CHECK-NEXT: push {r7, lr} 9; CHECK-NEXT: lsls r0, r0, #2 10; CHECK-NEXT: cmp r0, #68 11; CHECK-NEXT: beq .LBB0_2 12; CHECK-NEXT: @ %bb.1: @ %if.then 13; CHECK-NEXT: blx r1 14; CHECK-NEXT: .LBB0_2: @ %if.end 15; CHECK-NEXT: pop {r7, pc} 16entry: 17 %a = and i32 %x, 1073741823 18 %cmp = icmp eq i32 %a, 17 19 br i1 %cmp, label %if.end, label %if.then 20 21if.then: 22 tail call void %f() 23 br label %if.end 24 25if.end: 26 ret void 27} 28 29define void @test2(i32 %x, ptr %f) { 30; CHECK-LABEL: test2: 31; CHECK: @ %bb.0: @ %entry 32; CHECK-NEXT: .save {r7, lr} 33; CHECK-NEXT: push {r7, lr} 34; CHECK-NEXT: lsls r0, r0, #8 35; CHECK-NEXT: bhi .LBB1_2 36; CHECK-NEXT: @ %bb.1: @ %if.then 37; CHECK-NEXT: blx r1 38; CHECK-NEXT: .LBB1_2: @ %if.end 39; CHECK-NEXT: pop {r7, pc} 40entry: 41 %a = shl i32 %x, 7 42 %cmp = icmp ugt i32 %a, 2147483648 43 br i1 %cmp, label %if.end, label %if.then 44 45if.then: 46 tail call void %f() 47 br label %if.end 48 49if.end: 50 ret void 51} 52 53define void @test3(i32 %x, ptr %f) { 54; CHECK-LABEL: test3: 55; CHECK: @ %bb.0: @ %entry 56; CHECK-NEXT: .save {r7, lr} 57; CHECK-NEXT: push {r7, lr} 58; CHECK-NEXT: lsls r0, r0, #3 59; CHECK-NEXT: bhi .LBB2_2 60; CHECK-NEXT: @ %bb.1: @ %if.then 61; CHECK-NEXT: blx r1 62; CHECK-NEXT: .LBB2_2: @ %if.end 63; CHECK-NEXT: pop {r7, pc} 64entry: 65 %a = and i32 %x, 1073741823 66 %cmp = icmp ugt i32 %a, 536870912 67 br i1 %cmp, label %if.end, label %if.then 68 69if.then: 70 tail call void %f() 71 br label %if.end 72 73if.end: 74 ret void 75} 76 77define void @test4(i32 %x, ptr %f) { 78; CHECK-LABEL: test4: 79; CHECK: @ %bb.0: @ %entry 80; CHECK-NEXT: .save {r7, lr} 81; CHECK-NEXT: push {r7, lr} 82; CHECK-NEXT: uxtb r0, r0 83; CHECK-NEXT: cmp r0, #17 84; CHECK-NEXT: beq .LBB3_2 85; CHECK-NEXT: @ %bb.1: @ %if.then 86; CHECK-NEXT: blx r1 87; CHECK-NEXT: .LBB3_2: @ %if.end 88; CHECK-NEXT: pop {r7, pc} 89entry: 90 %a = and i32 %x, 255 91 %cmp = icmp eq i32 %a, 17 92 br i1 %cmp, label %if.end, label %if.then 93 94if.then: 95 tail call void %f() 96 br label %if.end 97 98if.end: 99 ret void 100} 101 102define void @test5(i32 %x, ptr %f) { 103; CHECK-LABEL: test5: 104; CHECK: @ %bb.0: @ %entry 105; CHECK-NEXT: .save {r7, lr} 106; CHECK-NEXT: push {r7, lr} 107; CHECK-NEXT: uxth r0, r0 108; CHECK-NEXT: cmp r0, #17 109; CHECK-NEXT: beq .LBB4_2 110; CHECK-NEXT: @ %bb.1: @ %if.then 111; CHECK-NEXT: blx r1 112; CHECK-NEXT: .LBB4_2: @ %if.end 113; CHECK-NEXT: pop {r7, pc} 114entry: 115 %a = and i32 %x, 65535 116 %cmp = icmp eq i32 %a, 17 117 br i1 %cmp, label %if.end, label %if.then 118 119if.then: 120 tail call void %f() 121 br label %if.end 122 123if.end: 124 ret void 125} 126 127define void @test6(i32 %x, ptr %f) { 128; CHECK-LABEL: test6: 129; CHECK: @ %bb.0: @ %entry 130; CHECK-NEXT: .save {r7, lr} 131; CHECK-NEXT: push {r7, lr} 132; CHECK-NEXT: movs r2, #32 133; CHECK-NEXT: ands r2, r0 134; CHECK-NEXT: cmp r2, #17 135; CHECK-NEXT: beq .LBB5_2 136; CHECK-NEXT: @ %bb.1: @ %if.then 137; CHECK-NEXT: blx r1 138; CHECK-NEXT: .LBB5_2: @ %if.end 139; CHECK-NEXT: pop {r7, pc} 140entry: 141 %a = and i32 %x, 32 142 %cmp = icmp eq i32 %a, 17 143 br i1 %cmp, label %if.end, label %if.then 144 145if.then: 146 tail call void %f() 147 br label %if.end 148 149if.end: 150 ret void 151} 152 153define void @test7(i32 %x, ptr %f) { 154; CHECK-LABEL: test7: 155; CHECK: @ %bb.0: @ %entry 156; CHECK-NEXT: .save {r7, lr} 157; CHECK-NEXT: push {r7, lr} 158; CHECK-NEXT: ldr r2, .LCPI6_0 159; CHECK-NEXT: ands r2, r0 160; CHECK-NEXT: cmp r2, #17 161; CHECK-NEXT: beq .LBB6_2 162; CHECK-NEXT: @ %bb.1: @ %if.then 163; CHECK-NEXT: blx r1 164; CHECK-NEXT: .LBB6_2: @ %if.end 165; CHECK-NEXT: pop {r7, pc} 166; CHECK-NEXT: .p2align 2 167; CHECK-NEXT: @ %bb.3: 168; CHECK-NEXT: .LCPI6_0: 169; CHECK-NEXT: .long 1023 @ 0x3ff 170entry: 171 %a = and i32 %x, 1023 172 %cmp = icmp eq i32 %a, 17 173 br i1 %cmp, label %if.end, label %if.then 174 175if.then: 176 tail call void %f() 177 br label %if.end 178 179if.end: 180 ret void 181} 182 183define void @test8(i32 %x, ptr %f) { 184; CHECK-LABEL: test8: 185; CHECK: @ %bb.0: @ %entry 186; CHECK-NEXT: .save {r7, lr} 187; CHECK-NEXT: push {r7, lr} 188; CHECK-NEXT: movs r2, #129 189; CHECK-NEXT: lsls r2, r2, #23 190; CHECK-NEXT: lsls r0, r0, #22 191; CHECK-NEXT: cmp r0, r2 192; CHECK-NEXT: beq .LBB7_2 193; CHECK-NEXT: @ %bb.1: @ %if.then 194; CHECK-NEXT: blx r1 195; CHECK-NEXT: .LBB7_2: @ %if.end 196; CHECK-NEXT: pop {r7, pc} 197entry: 198 %a = and i32 %x, 1023 199 %cmp = icmp eq i32 %a, 258 200 br i1 %cmp, label %if.end, label %if.then 201 202if.then: 203 tail call void %f() 204 br label %if.end 205 206if.end: 207 ret void 208} 209