182 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple thumbv6m-none-eabi -o - %s | FileCheck %s --check-prefix=CHECK-V6M3; RUN: llc -mtriple thumbv7m-none-eabi -o - %s | FileCheck %s --check-prefix=CHECK-V7M4; RUN: llc -mtriple thumbv8.1m.main-none-eabi -mattr=+mve,+lob -o - %s | FileCheck %s --check-prefix=CHECK-V81M5; RUN: llc -mtriple armv7a-none-eabi -o - %s | FileCheck %s --check-prefix=CHECK-V7A6 7define i32 @test_lshr(ptr nocapture %x, ptr nocapture readonly %y, i32 %n) {8; CHECK-V6M-LABEL: test_lshr:9; CHECK-V6M: @ %bb.0: @ %entry10; CHECK-V6M-NEXT: lsrs r2, r2, #211; CHECK-V6M-NEXT: beq .LBB0_212; CHECK-V6M-NEXT: .LBB0_1: @ %while.body13; CHECK-V6M-NEXT: @ =>This Inner Loop Header: Depth=114; CHECK-V6M-NEXT: ldm r1!, {r3}15; CHECK-V6M-NEXT: lsls r3, r3, #116; CHECK-V6M-NEXT: stm r0!, {r3}17; CHECK-V6M-NEXT: subs r2, r2, #118; CHECK-V6M-NEXT: bne .LBB0_119; CHECK-V6M-NEXT: .LBB0_2: @ %while.end20; CHECK-V6M-NEXT: movs r0, #021; CHECK-V6M-NEXT: bx lr22;23; CHECK-V7M-LABEL: test_lshr:24; CHECK-V7M: @ %bb.0: @ %entry25; CHECK-V7M-NEXT: lsrs r2, r2, #226; CHECK-V7M-NEXT: beq .LBB0_327; CHECK-V7M-NEXT: @ %bb.1: @ %while.body.preheader28; CHECK-V7M-NEXT: subs r1, #429; CHECK-V7M-NEXT: subs r0, #430; CHECK-V7M-NEXT: .LBB0_2: @ %while.body31; CHECK-V7M-NEXT: @ =>This Inner Loop Header: Depth=132; CHECK-V7M-NEXT: ldr r3, [r1, #4]!33; CHECK-V7M-NEXT: subs r2, #134; CHECK-V7M-NEXT: lsl.w r3, r3, #135; CHECK-V7M-NEXT: str r3, [r0, #4]!36; CHECK-V7M-NEXT: bne .LBB0_237; CHECK-V7M-NEXT: .LBB0_3: @ %while.end38; CHECK-V7M-NEXT: movs r0, #039; CHECK-V7M-NEXT: bx lr40;41; CHECK-V81M-LABEL: test_lshr:42; CHECK-V81M: @ %bb.0: @ %entry43; CHECK-V81M-NEXT: .save {r7, lr}44; CHECK-V81M-NEXT: push {r7, lr}45; CHECK-V81M-NEXT: lsrs r2, r2, #246; CHECK-V81M-NEXT: wls lr, r2, .LBB0_247; CHECK-V81M-NEXT: .LBB0_1: @ %while.body48; CHECK-V81M-NEXT: @ =>This Inner Loop Header: Depth=149; CHECK-V81M-NEXT: ldr r2, [r1], #450; CHECK-V81M-NEXT: lsls r2, r2, #151; CHECK-V81M-NEXT: str r2, [r0], #452; CHECK-V81M-NEXT: le lr, .LBB0_153; CHECK-V81M-NEXT: .LBB0_2: @ %while.end54; CHECK-V81M-NEXT: movs r0, #055; CHECK-V81M-NEXT: pop {r7, pc}56;57; CHECK-V7A-LABEL: test_lshr:58; CHECK-V7A: @ %bb.0: @ %entry59; CHECK-V7A-NEXT: lsrs r2, r2, #260; CHECK-V7A-NEXT: beq .LBB0_261; CHECK-V7A-NEXT: .LBB0_1: @ %while.body62; CHECK-V7A-NEXT: @ =>This Inner Loop Header: Depth=163; CHECK-V7A-NEXT: ldr r3, [r1], #464; CHECK-V7A-NEXT: subs r2, r2, #165; CHECK-V7A-NEXT: lsl r3, r3, #166; CHECK-V7A-NEXT: str r3, [r0], #467; CHECK-V7A-NEXT: bne .LBB0_168; CHECK-V7A-NEXT: .LBB0_2: @ %while.end69; CHECK-V7A-NEXT: mov r0, #070; CHECK-V7A-NEXT: bx lr71entry:72 %shr = lshr i32 %n, 273 %tobool.not4 = icmp eq i32 %shr, 074 br i1 %tobool.not4, label %while.end, label %while.body75 76while.body: ; preds = %entry, %while.body77 %c.07 = phi i32 [ %dec, %while.body ], [ %shr, %entry ]78 %x.addr.06 = phi ptr [ %incdec.ptr1, %while.body ], [ %x, %entry ]79 %y.addr.05 = phi ptr [ %incdec.ptr, %while.body ], [ %y, %entry ]80 %incdec.ptr = getelementptr inbounds i32, ptr %y.addr.05, i32 181 %0 = load i32, ptr %y.addr.05, align 482 %mul = shl nsw i32 %0, 183 %incdec.ptr1 = getelementptr inbounds i32, ptr %x.addr.06, i32 184 store i32 %mul, ptr %x.addr.06, align 485 %dec = add nsw i32 %c.07, -186 %tobool.not = icmp eq i32 %dec, 087 br i1 %tobool.not, label %while.end, label %while.body88 89while.end: ; preds = %while.body, %entry90 ret i32 091}92 93define i32 @test_lshr2(ptr nocapture %x, ptr nocapture readonly %y, i32 %n) {94; CHECK-V6M-LABEL: test_lshr2:95; CHECK-V6M: @ %bb.0: @ %entry96; CHECK-V6M-NEXT: lsrs r2, r2, #297; CHECK-V6M-NEXT: beq .LBB1_298; CHECK-V6M-NEXT: .LBB1_1: @ %while.body99; CHECK-V6M-NEXT: @ =>This Inner Loop Header: Depth=1100; CHECK-V6M-NEXT: ldm r1!, {r3}101; CHECK-V6M-NEXT: lsls r3, r3, #1102; CHECK-V6M-NEXT: stm r0!, {r3}103; CHECK-V6M-NEXT: subs r2, r2, #1104; CHECK-V6M-NEXT: bne .LBB1_1105; CHECK-V6M-NEXT: .LBB1_2: @ %while.end106; CHECK-V6M-NEXT: movs r0, #0107; CHECK-V6M-NEXT: bx lr108;109; CHECK-V7M-LABEL: test_lshr2:110; CHECK-V7M: @ %bb.0: @ %entry111; CHECK-V7M-NEXT: lsrs r2, r2, #2112; CHECK-V7M-NEXT: beq .LBB1_3113; CHECK-V7M-NEXT: @ %bb.1: @ %while.body.preheader114; CHECK-V7M-NEXT: subs r1, #4115; CHECK-V7M-NEXT: subs r0, #4116; CHECK-V7M-NEXT: .LBB1_2: @ %while.body117; CHECK-V7M-NEXT: @ =>This Inner Loop Header: Depth=1118; CHECK-V7M-NEXT: ldr r3, [r1, #4]!119; CHECK-V7M-NEXT: subs r2, #1120; CHECK-V7M-NEXT: lsl.w r3, r3, #1121; CHECK-V7M-NEXT: str r3, [r0, #4]!122; CHECK-V7M-NEXT: bne .LBB1_2123; CHECK-V7M-NEXT: .LBB1_3: @ %while.end124; CHECK-V7M-NEXT: movs r0, #0125; CHECK-V7M-NEXT: bx lr126;127; CHECK-V81M-LABEL: test_lshr2:128; CHECK-V81M: @ %bb.0: @ %entry129; CHECK-V81M-NEXT: .save {r7, lr}130; CHECK-V81M-NEXT: push {r7, lr}131; CHECK-V81M-NEXT: lsrs r2, r2, #2132; CHECK-V81M-NEXT: wls lr, r2, .LBB1_2133; CHECK-V81M-NEXT: .LBB1_1: @ %while.body134; CHECK-V81M-NEXT: @ =>This Inner Loop Header: Depth=1135; CHECK-V81M-NEXT: ldr r2, [r1], #4136; CHECK-V81M-NEXT: lsls r2, r2, #1137; CHECK-V81M-NEXT: str r2, [r0], #4138; CHECK-V81M-NEXT: le lr, .LBB1_1139; CHECK-V81M-NEXT: .LBB1_2: @ %while.end140; CHECK-V81M-NEXT: movs r0, #0141; CHECK-V81M-NEXT: pop {r7, pc}142;143; CHECK-V7A-LABEL: test_lshr2:144; CHECK-V7A: @ %bb.0: @ %entry145; CHECK-V7A-NEXT: lsrs r2, r2, #2146; CHECK-V7A-NEXT: beq .LBB1_2147; CHECK-V7A-NEXT: .LBB1_1: @ %while.body148; CHECK-V7A-NEXT: @ =>This Inner Loop Header: Depth=1149; CHECK-V7A-NEXT: ldr r3, [r1], #4150; CHECK-V7A-NEXT: subs r2, r2, #1151; CHECK-V7A-NEXT: lsl r3, r3, #1152; CHECK-V7A-NEXT: str r3, [r0], #4153; CHECK-V7A-NEXT: bne .LBB1_1154; CHECK-V7A-NEXT: .LBB1_2: @ %while.end155; CHECK-V7A-NEXT: mov r0, #0156; CHECK-V7A-NEXT: bx lr157entry:158 %tobool.not4 = icmp ult i32 %n, 4159 br i1 %tobool.not4, label %while.end, label %while.body.preheader160 161while.body.preheader: ; preds = %entry162 %shr = lshr i32 %n, 2163 br label %while.body164 165while.body: ; preds = %while.body.preheader, %while.body166 %c.07 = phi i32 [ %dec, %while.body ], [ %shr, %while.body.preheader ]167 %x.addr.06 = phi ptr [ %incdec.ptr1, %while.body ], [ %x, %while.body.preheader ]168 %y.addr.05 = phi ptr [ %incdec.ptr, %while.body ], [ %y, %while.body.preheader ]169 %incdec.ptr = getelementptr inbounds i32, ptr %y.addr.05, i32 1170 %0 = load i32, ptr %y.addr.05, align 4171 %mul = shl nsw i32 %0, 1172 %incdec.ptr1 = getelementptr inbounds i32, ptr %x.addr.06, i32 1173 store i32 %mul, ptr %x.addr.06, align 4174 %dec = add nsw i32 %c.07, -1175 %tobool.not = icmp eq i32 %dec, 0176 br i1 %tobool.not, label %while.end, label %while.body177 178while.end: ; preds = %while.body, %entry179 ret i32 0180}181 182