; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc < %s -mtriple=thumbv8m.base-arm-none-eabi < %s | FileCheck %s
define void @arm_q15_to_q31(ptr nocapture noundef readonly %pSrc, ptr nocapture noundef writeonly %pDst, i32 noundef %blockSize) {
; CHECK-LABEL: arm_q15_to_q31:
; CHECK: @ %bb.0: @ %entry
; CHECK-NEXT: .save {r4, r5, r6, r7, lr}
; CHECK-NEXT: push {r4, r5, r6, r7, lr}
; CHECK-NEXT: .pad #8
; CHECK-NEXT: sub sp, #8
; CHECK-NEXT: mov r7, r2
; CHECK-NEXT: lsrs r3, r2, #2
; CHECK-NEXT: beq .LBB0_6
; CHECK-NEXT: @ %bb.1: @ %while.body.preheader
; CHECK-NEXT: movs r5, #3
; CHECK-NEXT: ands r5, r3
; CHECK-NEXT: subs r2, r3, #1
; CHECK-NEXT: cbz r5, .LBB0_4
; CHECK-NEXT: @ %bb.2: @ %while.body.prol
; CHECK-NEXT: str r2, [sp] @ 4-byte Spill
; CHECK-NEXT: str r7, [sp, #4] @ 4-byte Spill
; CHECK-NEXT: ldrh r2, [r0]
; CHECK-NEXT: ldrh r7, [r0, #2]
; CHECK-NEXT: ldrh r4, [r0, #4]
; CHECK-NEXT: ldrh r6, [r0, #6]
; CHECK-NEXT: lsls r6, r6, #16
; CHECK-NEXT: lsls r4, r4, #16
; CHECK-NEXT: lsls r7, r7, #16
; CHECK-NEXT: lsls r2, r2, #16
; CHECK-NEXT: stm r1!, {r2, r7}
; CHECK-NEXT: str r4, [r1]
; CHECK-NEXT: str r6, [r1, #4]
; CHECK-NEXT: subs r1, #8
; CHECK-NEXT: cmp r5, #1
; CHECK-NEXT: bne .LBB0_11
; CHECK-NEXT: @ %bb.3:
; CHECK-NEXT: adds r1, #16
; CHECK-NEXT: adds r0, #8
; CHECK-NEXT: ldr r2, [sp] @ 4-byte Reload
; CHECK-NEXT: mov r3, r2
; CHECK-NEXT: ldr r7, [sp, #4] @ 4-byte Reload
; CHECK-NEXT: .LBB0_4: @ %while.body.prol.loopexit
; CHECK-NEXT: cmp r2, #3
; CHECK-NEXT: blo .LBB0_6
; CHECK-NEXT: .LBB0_5: @ %while.body
; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1
; CHECK-NEXT: ldrh r2, [r0]
; CHECK-NEXT: ldrh r4, [r0, #2]
; CHECK-NEXT: ldrh r5, [r0, #4]
; CHECK-NEXT: ldrh r6, [r0, #6]
; CHECK-NEXT: lsls r6, r6, #16
; CHECK-NEXT: str r6, [r1, #12]
; CHECK-NEXT: lsls r5, r5, #16
; CHECK-NEXT: str r5, [r1, #8]
; CHECK-NEXT: lsls r4, r4, #16
; CHECK-NEXT: str r4, [r1, #4]
; CHECK-NEXT: lsls r2, r2, #16
; CHECK-NEXT: str r2, [r1]
; CHECK-NEXT: ldrh r2, [r0, #8]
; CHECK-NEXT: ldrh r4, [r0, #10]
; CHECK-NEXT: ldrh r5, [r0, #12]
; CHECK-NEXT: ldrh r6, [r0, #14]
; CHECK-NEXT: lsls r6, r6, #16
; CHECK-NEXT: str r6, [r1, #28]
; CHECK-NEXT: lsls r5, r5, #16
; CHECK-NEXT: str r5, [r1, #24]
; CHECK-NEXT: lsls r4, r4, #16
; CHECK-NEXT: str r4, [r1, #20]
; CHECK-NEXT: lsls r2, r2, #16
; CHECK-NEXT: str r2, [r1, #16]
; CHECK-NEXT: ldrh r2, [r0, #16]
; CHECK-NEXT: ldrh r4, [r0, #18]
; CHECK-NEXT: ldrh r5, [r0, #20]
; CHECK-NEXT: ldrh r6, [r0, #22]
; CHECK-NEXT: lsls r6, r6, #16
; CHECK-NEXT: str r6, [r1, #44]
; CHECK-NEXT: lsls r5, r5, #16
; CHECK-NEXT: str r5, [r1, #40]
; CHECK-NEXT: lsls r4, r4, #16
; CHECK-NEXT: str r4, [r1, #36]
; CHECK-NEXT: lsls r2, r2, #16
; CHECK-NEXT: str r2, [r1, #32]
; CHECK-NEXT: ldrh r2, [r0, #24]
; CHECK-NEXT: ldrh r4, [r0, #26]
; CHECK-NEXT: ldrh r5, [r0, #28]
; CHECK-NEXT: ldrh r6, [r0, #30]
; CHECK-NEXT: lsls r6, r6, #16
; CHECK-NEXT: str r6, [r1, #60]
; CHECK-NEXT: lsls r5, r5, #16
; CHECK-NEXT: str r5, [r1, #56]
; CHECK-NEXT: lsls r4, r4, #16
; CHECK-NEXT: str r4, [r1, #52]
; CHECK-NEXT: lsls r2, r2, #16
; CHECK-NEXT: str r2, [r1, #48]
; CHECK-NEXT: adds r1, #64
; CHECK-NEXT: adds r0, #32
; CHECK-NEXT: subs r3, r3, #4
; CHECK-NEXT: bne .LBB0_5
; CHECK-NEXT: .LBB0_6: @ %while.end
; CHECK-NEXT: movs r2, #3
; CHECK-NEXT: ands r7, r2
; CHECK-NEXT: beq .LBB0_10
; CHECK-NEXT: @ %bb.7: @ %while.body12
; CHECK-NEXT: ldrh r2, [r0]
; CHECK-NEXT: lsls r2, r2, #16
; CHECK-NEXT: str r2, [r1]
; CHECK-NEXT: cmp r7, #1
; CHECK-NEXT: beq .LBB0_10
; CHECK-NEXT: @ %bb.8: @ %while.body12.1
; CHECK-NEXT: ldrh r2, [r0, #2]
; CHECK-NEXT: lsls r2, r2, #16
; CHECK-NEXT: str r2, [r1, #4]
; CHECK-NEXT: cmp r7, #2
; CHECK-NEXT: beq .LBB0_10
; CHECK-NEXT: @ %bb.9: @ %while.body12.2
; CHECK-NEXT: ldrh r0, [r0, #4]
; CHECK-NEXT: lsls r0, r0, #16
; CHECK-NEXT: str r0, [r1, #8]
; CHECK-NEXT: .LBB0_10: @ %while.end17
; CHECK-NEXT: add sp, #8
; CHECK-NEXT: pop {r4, r5, r6, r7, pc}
; CHECK-NEXT: .LBB0_11: @ %while.body.prol.1
; CHECK-NEXT: ldrh r2, [r0, #8]
; CHECK-NEXT: ldrh r4, [r0, #10]
; CHECK-NEXT: ldrh r6, [r0, #12]
; CHECK-NEXT: ldrh r7, [r0, #14]
; CHECK-NEXT: lsls r7, r7, #16
; CHECK-NEXT: lsls r6, r6, #16
; CHECK-NEXT: lsls r4, r4, #16
; CHECK-NEXT: lsls r2, r2, #16
; CHECK-NEXT: str r2, [r1, #16]
; CHECK-NEXT: str r4, [r1, #20]
; CHECK-NEXT: str r6, [r1, #24]
; CHECK-NEXT: str r7, [r1, #28]
; CHECK-NEXT: cmp r5, #2
; CHECK-NEXT: bne .LBB0_13
; CHECK-NEXT: @ %bb.12:
; CHECK-NEXT: subs r3, r3, #2
; CHECK-NEXT: adds r1, #32
; CHECK-NEXT: adds r0, #16
; CHECK-NEXT: b .LBB0_14
; CHECK-NEXT: .LBB0_13: @ %while.body.prol.2
; CHECK-NEXT: ldrh r2, [r0, #16]
; CHECK-NEXT: ldrh r4, [r0, #18]
; CHECK-NEXT: ldrh r5, [r0, #20]
; CHECK-NEXT: ldrh r6, [r0, #22]
; CHECK-NEXT: lsls r6, r6, #16
; CHECK-NEXT: lsls r5, r5, #16
; CHECK-NEXT: lsls r4, r4, #16
; CHECK-NEXT: lsls r2, r2, #16
; CHECK-NEXT: mov r7, r1
; CHECK-NEXT: adds r7, #32
; CHECK-NEXT: stm r7!, {r2, r4, r5, r6}
; CHECK-NEXT: subs r3, r3, #3
; CHECK-NEXT: adds r1, #48
; CHECK-NEXT: adds r0, #24
; CHECK-NEXT: .LBB0_14: @ %while.body.prol.loopexit
; CHECK-NEXT: ldr r7, [sp, #4] @ 4-byte Reload
; CHECK-NEXT: ldr r2, [sp] @ 4-byte Reload
; CHECK-NEXT: cmp r2, #3
; CHECK-NEXT: bhs .LBB0_5
; CHECK-NEXT: b .LBB0_6
entry:
%cmp.not19 = icmp ult i32 %blockSize, 4
br i1 %cmp.not19, label %while.end, label %while.body.preheader
while.body.preheader: ; preds = %entry
%shr = lshr i32 %blockSize, 2
%0 = add nsw i32 %shr, -1
%xtraiter = and i32 %shr, 3
%lcmp.mod.not = icmp eq i32 %xtraiter, 0
br i1 %lcmp.mod.not, label %while.body.prol.loopexit, label %while.body.prol
while.body.prol: ; preds = %while.body.preheader
%pIn.0.val.prol = load i16, ptr %pSrc, align 2
%1 = getelementptr i8, ptr %pSrc, i32 2
%pIn.0.val13.prol = load i16, ptr %1, align 2
%conv.i.prol = sext i16 %pIn.0.val13.prol to i32
%shl.i.prol = shl nsw i32 %conv.i.prol, 16
%conv22.i.prol = zext i16 %pIn.0.val.prol to i32
%add.ptr2.prol = getelementptr inbounds i16, ptr %pSrc, i32 4
%add.ptr3.prol = getelementptr inbounds i16, ptr %pSrc, i32 2
%add.ptr3.val.prol = load i16, ptr %add.ptr3.prol, align 2
%2 = getelementptr i16, ptr %pSrc, i32 3
%add.ptr3.val14.prol = load i16, ptr %2, align 2
%conv.i15.prol = sext i16 %add.ptr3.val14.prol to i32
%shl.i16.prol = shl nsw i32 %conv.i15.prol, 16
%conv22.i17.prol = zext i16 %add.ptr3.val.prol to i32
%shl.prol = shl nuw i32 %conv22.i.prol, 16
%shl5.prol = shl nuw i32 %conv22.i17.prol, 16
%incdec.ptr.prol = getelementptr inbounds i32, ptr %pDst, i32 1
store i32 %shl.prol, ptr %pDst, align 4
%incdec.ptr7.prol = getelementptr inbounds i32, ptr %pDst, i32 2
store i32 %shl.i.prol, ptr %incdec.ptr.prol, align 4
%incdec.ptr8.prol = getelementptr inbounds i32, ptr %pDst, i32 3
store i32 %shl5.prol, ptr %incdec.ptr7.prol, align 4
%incdec.ptr9.prol = getelementptr inbounds i32, ptr %pDst, i32 4
store i32 %shl.i16.prol, ptr %incdec.ptr8.prol, align 4
%dec.prol = add nsw i32 %shr, -1
%prol.iter.cmp.not = icmp eq i32 %xtraiter, 1
br i1 %prol.iter.cmp.not, label %while.body.prol.loopexit, label %while.body.prol.1
while.body.prol.1: ; preds = %while.body.prol
%pIn.0.val.prol.1 = load i16, ptr %add.ptr2.prol, align 2
%3 = getelementptr i16, ptr %pSrc, i32 5
%pIn.0.val13.prol.1 = load i16, ptr %3, align 2
%conv.i.prol.1 = sext i16 %pIn.0.val13.prol.1 to i32
%shl.i.prol.1 = shl nsw i32 %conv.i.prol.1, 16
%conv22.i.prol.1 = zext i16 %pIn.0.val.prol.1 to i32
%add.ptr2.prol.1 = getelementptr inbounds i16, ptr %pSrc, i32 8
%add.ptr3.prol.1 = getelementptr inbounds i16, ptr %pSrc, i32 6
%add.ptr3.val.prol.1 = load i16, ptr %add.ptr3.prol.1, align 2
%4 = getelementptr i16, ptr %pSrc, i32 7
%add.ptr3.val14.prol.1 = load i16, ptr %4, align 2
%conv.i15.prol.1 = sext i16 %add.ptr3.val14.prol.1 to i32
%shl.i16.prol.1 = shl nsw i32 %conv.i15.prol.1, 16
%conv22.i17.prol.1 = zext i16 %add.ptr3.val.prol.1 to i32
%shl.prol.1 = shl nuw i32 %conv22.i.prol.1, 16
%shl5.prol.1 = shl nuw i32 %conv22.i17.prol.1, 16
%incdec.ptr.prol.1 = getelementptr inbounds i32, ptr %pDst, i32 5
store i32 %shl.prol.1, ptr %incdec.ptr9.prol, align 4
%incdec.ptr7.prol.1 = getelementptr inbounds i32, ptr %pDst, i32 6
store i32 %shl.i.prol.1, ptr %incdec.ptr.prol.1, align 4
%incdec.ptr8.prol.1 = getelementptr inbounds i32, ptr %pDst, i32 7
store i32 %shl5.prol.1, ptr %incdec.ptr7.prol.1, align 4
%incdec.ptr9.prol.1 = getelementptr inbounds i32, ptr %pDst, i32 8
store i32 %shl.i16.prol.1, ptr %incdec.ptr8.prol.1, align 4
%dec.prol.1 = add nsw i32 %shr, -2
%prol.iter.cmp.1.not = icmp eq i32 %xtraiter, 2
br i1 %prol.iter.cmp.1.not, label %while.body.prol.loopexit, label %while.body.prol.2
while.body.prol.2: ; preds = %while.body.prol.1
%pIn.0.val.prol.2 = load i16, ptr %add.ptr2.prol.1, align 2
%5 = getelementptr i16, ptr %pSrc, i32 9
%pIn.0.val13.prol.2 = load i16, ptr %5, align 2
%conv.i.prol.2 = sext i16 %pIn.0.val13.prol.2 to i32
%shl.i.prol.2 = shl nsw i32 %conv.i.prol.2, 16
%conv22.i.prol.2 = zext i16 %pIn.0.val.prol.2 to i32
%add.ptr2.prol.2 = getelementptr inbounds i16, ptr %pSrc, i32 12
%add.ptr3.prol.2 = getelementptr inbounds i16, ptr %pSrc, i32 10
%add.ptr3.val.prol.2 = load i16, ptr %add.ptr3.prol.2, align 2
%6 = getelementptr i16, ptr %pSrc, i32 11
%add.ptr3.val14.prol.2 = load i16, ptr %6, align 2
%conv.i15.prol.2 = sext i16 %add.ptr3.val14.prol.2 to i32
%shl.i16.prol.2 = shl nsw i32 %conv.i15.prol.2, 16
%conv22.i17.prol.2 = zext i16 %add.ptr3.val.prol.2 to i32
%shl.prol.2 = shl nuw i32 %conv22.i.prol.2, 16
%shl5.prol.2 = shl nuw i32 %conv22.i17.prol.2, 16
%incdec.ptr.prol.2 = getelementptr inbounds i32, ptr %pDst, i32 9
store i32 %shl.prol.2, ptr %incdec.ptr9.prol.1, align 4
%incdec.ptr7.prol.2 = getelementptr inbounds i32, ptr %pDst, i32 10
store i32 %shl.i.prol.2, ptr %incdec.ptr.prol.2, align 4
%incdec.ptr8.prol.2 = getelementptr inbounds i32, ptr %pDst, i32 11
store i32 %shl5.prol.2, ptr %incdec.ptr7.prol.2, align 4
%incdec.ptr9.prol.2 = getelementptr inbounds i32, ptr %pDst, i32 12
store i32 %shl.i16.prol.2, ptr %incdec.ptr8.prol.2, align 4
%dec.prol.2 = add nsw i32 %shr, -3
br label %while.body.prol.loopexit
while.body.prol.loopexit: ; preds = %while.body.prol, %while.body.prol.1, %while.body.prol.2, %while.body.preheader
%add.ptr2.lcssa.unr = phi ptr [ undef, %while.body.preheader ], [ %add.ptr2.prol, %while.body.prol ], [ %add.ptr2.prol.1, %while.body.prol.1 ], [ %add.ptr2.prol.2, %while.body.prol.2 ]
%incdec.ptr9.lcssa.unr = phi ptr [ undef, %while.body.preheader ], [ %incdec.ptr9.prol, %while.body.prol ], [ %incdec.ptr9.prol.1, %while.body.prol.1 ], [ %incdec.ptr9.prol.2, %while.body.prol.2 ]
%pDst.addr.022.unr = phi ptr [ %pDst, %while.body.preheader ], [ %incdec.ptr9.prol, %while.body.prol ], [ %incdec.ptr9.prol.1, %while.body.prol.1 ], [ %incdec.ptr9.prol.2, %while.body.prol.2 ]
%blkCnt.021.unr = phi i32 [ %shr, %while.body.preheader ], [ %dec.prol, %while.body.prol ], [ %dec.prol.1, %while.body.prol.1 ], [ %dec.prol.2, %while.body.prol.2 ]
%pIn.020.unr = phi ptr [ %pSrc, %while.body.preheader ], [ %add.ptr2.prol, %while.body.prol ], [ %add.ptr2.prol.1, %while.body.prol.1 ], [ %add.ptr2.prol.2, %while.body.prol.2 ]
%7 = icmp ult i32 %0, 3
br i1 %7, label %while.end, label %while.body
while.body: ; preds = %while.body.prol.loopexit, %while.body
%pDst.addr.022 = phi ptr [ %incdec.ptr9.3, %while.body ], [ %pDst.addr.022.unr, %while.body.prol.loopexit ]
%blkCnt.021 = phi i32 [ %dec.3, %while.body ], [ %blkCnt.021.unr, %while.body.prol.loopexit ]
%pIn.020 = phi ptr [ %add.ptr2.3, %while.body ], [ %pIn.020.unr, %while.body.prol.loopexit ]
%pIn.0.val = load i16, ptr %pIn.020, align 2
%8 = getelementptr i8, ptr %pIn.020, i32 2
%pIn.0.val13 = load i16, ptr %8, align 2
%conv.i = sext i16 %pIn.0.val13 to i32
%shl.i = shl nsw i32 %conv.i, 16
%conv22.i = zext i16 %pIn.0.val to i32
%add.ptr2 = getelementptr inbounds i16, ptr %pIn.020, i32 4
%add.ptr3 = getelementptr inbounds i16, ptr %pIn.020, i32 2
%add.ptr3.val = load i16, ptr %add.ptr3, align 2
%9 = getelementptr i16, ptr %pIn.020, i32 3
%add.ptr3.val14 = load i16, ptr %9, align 2
%conv.i15 = sext i16 %add.ptr3.val14 to i32
%shl.i16 = shl nsw i32 %conv.i15, 16
%conv22.i17 = zext i16 %add.ptr3.val to i32
%shl = shl nuw i32 %conv22.i, 16
%shl5 = shl nuw i32 %conv22.i17, 16
%incdec.ptr = getelementptr inbounds i32, ptr %pDst.addr.022, i32 1
store i32 %shl, ptr %pDst.addr.022, align 4
%incdec.ptr7 = getelementptr inbounds i32, ptr %pDst.addr.022, i32 2
store i32 %shl.i, ptr %incdec.ptr, align 4
%incdec.ptr8 = getelementptr inbounds i32, ptr %pDst.addr.022, i32 3
store i32 %shl5, ptr %incdec.ptr7, align 4
%incdec.ptr9 = getelementptr inbounds i32, ptr %pDst.addr.022, i32 4
store i32 %shl.i16, ptr %incdec.ptr8, align 4
%pIn.0.val.1 = load i16, ptr %add.ptr2, align 2
%10 = getelementptr i16, ptr %pIn.020, i32 5
%pIn.0.val13.1 = load i16, ptr %10, align 2
%conv.i.1 = sext i16 %pIn.0.val13.1 to i32
%shl.i.1 = shl nsw i32 %conv.i.1, 16
%conv22.i.1 = zext i16 %pIn.0.val.1 to i32
%add.ptr2.1 = getelementptr inbounds i16, ptr %pIn.020, i32 8
%add.ptr3.1 = getelementptr inbounds i16, ptr %pIn.020, i32 6
%add.ptr3.val.1 = load i16, ptr %add.ptr3.1, align 2
%11 = getelementptr i16, ptr %pIn.020, i32 7
%add.ptr3.val14.1 = load i16, ptr %11, align 2
%conv.i15.1 = sext i16 %add.ptr3.val14.1 to i32
%shl.i16.1 = shl nsw i32 %conv.i15.1, 16
%conv22.i17.1 = zext i16 %add.ptr3.val.1 to i32
%shl.1 = shl nuw i32 %conv22.i.1, 16
%shl5.1 = shl nuw i32 %conv22.i17.1, 16
%incdec.ptr.1 = getelementptr inbounds i32, ptr %pDst.addr.022, i32 5
store i32 %shl.1, ptr %incdec.ptr9, align 4
%incdec.ptr7.1 = getelementptr inbounds i32, ptr %pDst.addr.022, i32 6
store i32 %shl.i.1, ptr %incdec.ptr.1, align 4
%incdec.ptr8.1 = getelementptr inbounds i32, ptr %pDst.addr.022, i32 7
store i32 %shl5.1, ptr %incdec.ptr7.1, align 4
%incdec.ptr9.1 = getelementptr inbounds i32, ptr %pDst.addr.022, i32 8
store i32 %shl.i16.1, ptr %incdec.ptr8.1, align 4
%pIn.0.val.2 = load i16, ptr %add.ptr2.1, align 2
%12 = getelementptr i16, ptr %pIn.020, i32 9
%pIn.0.val13.2 = load i16, ptr %12, align 2
%conv.i.2 = sext i16 %pIn.0.val13.2 to i32
%shl.i.2 = shl nsw i32 %conv.i.2, 16
%conv22.i.2 = zext i16 %pIn.0.val.2 to i32
%add.ptr2.2 = getelementptr inbounds i16, ptr %pIn.020, i32 12
%add.ptr3.2 = getelementptr inbounds i16, ptr %pIn.020, i32 10
%add.ptr3.val.2 = load i16, ptr %add.ptr3.2, align 2
%13 = getelementptr i16, ptr %pIn.020, i32 11
%add.ptr3.val14.2 = load i16, ptr %13, align 2
%conv.i15.2 = sext i16 %add.ptr3.val14.2 to i32
%shl.i16.2 = shl nsw i32 %conv.i15.2, 16
%conv22.i17.2 = zext i16 %add.ptr3.val.2 to i32
%shl.2 = shl nuw i32 %conv22.i.2, 16
%shl5.2 = shl nuw i32 %conv22.i17.2, 16
%incdec.ptr.2 = getelementptr inbounds i32, ptr %pDst.addr.022, i32 9
store i32 %shl.2, ptr %incdec.ptr9.1, align 4
%incdec.ptr7.2 = getelementptr inbounds i32, ptr %pDst.addr.022, i32 10
store i32 %shl.i.2, ptr %incdec.ptr.2, align 4
%incdec.ptr8.2 = getelementptr inbounds i32, ptr %pDst.addr.022, i32 11
store i32 %shl5.2, ptr %incdec.ptr7.2, align 4
%incdec.ptr9.2 = getelementptr inbounds i32, ptr %pDst.addr.022, i32 12
store i32 %shl.i16.2, ptr %incdec.ptr8.2, align 4
%pIn.0.val.3 = load i16, ptr %add.ptr2.2, align 2
%14 = getelementptr i16, ptr %pIn.020, i32 13
%pIn.0.val13.3 = load i16, ptr %14, align 2
%conv.i.3 = sext i16 %pIn.0.val13.3 to i32
%shl.i.3 = shl nsw i32 %conv.i.3, 16
%conv22.i.3 = zext i16 %pIn.0.val.3 to i32
%add.ptr2.3 = getelementptr inbounds i16, ptr %pIn.020, i32 16
%add.ptr3.3 = getelementptr inbounds i16, ptr %pIn.020, i32 14
%add.ptr3.val.3 = load i16, ptr %add.ptr3.3, align 2
%15 = getelementptr i16, ptr %pIn.020, i32 15
%add.ptr3.val14.3 = load i16, ptr %15, align 2
%conv.i15.3 = sext i16 %add.ptr3.val14.3 to i32
%shl.i16.3 = shl nsw i32 %conv.i15.3, 16
%conv22.i17.3 = zext i16 %add.ptr3.val.3 to i32
%shl.3 = shl nuw i32 %conv22.i.3, 16
%shl5.3 = shl nuw i32 %conv22.i17.3, 16
%incdec.ptr.3 = getelementptr inbounds i32, ptr %pDst.addr.022, i32 13
store i32 %shl.3, ptr %incdec.ptr9.2, align 4
%incdec.ptr7.3 = getelementptr inbounds i32, ptr %pDst.addr.022, i32 14
store i32 %shl.i.3, ptr %incdec.ptr.3, align 4
%incdec.ptr8.3 = getelementptr inbounds i32, ptr %pDst.addr.022, i32 15
store i32 %shl5.3, ptr %incdec.ptr7.3, align 4
%incdec.ptr9.3 = getelementptr inbounds i32, ptr %pDst.addr.022, i32 16
store i32 %shl.i16.3, ptr %incdec.ptr8.3, align 4
%dec.3 = add nsw i32 %blkCnt.021, -4
%cmp.not.3 = icmp eq i32 %dec.3, 0
br i1 %cmp.not.3, label %while.end, label %while.body
while.end: ; preds = %while.body.prol.loopexit, %while.body, %entry
%pIn.0.lcssa = phi ptr [ %pSrc, %entry ], [ %add.ptr2.lcssa.unr, %while.body.prol.loopexit ], [ %add.ptr2.3, %while.body ]
%pDst.addr.0.lcssa = phi ptr [ %pDst, %entry ], [ %incdec.ptr9.lcssa.unr, %while.body.prol.loopexit ], [ %incdec.ptr9.3, %while.body ]
%rem = and i32 %blockSize, 3
%cmp11.not24 = icmp eq i32 %rem, 0
br i1 %cmp11.not24, label %while.end17, label %while.body12
while.body12: ; preds = %while.end
%16 = load i16, ptr %pIn.0.lcssa, align 2
%conv = sext i16 %16 to i32
%shl14 = shl nsw i32 %conv, 16
store i32 %shl14, ptr %pDst.addr.0.lcssa, align 4
%cmp11.not = icmp eq i32 %rem, 1
br i1 %cmp11.not, label %while.end17, label %while.body12.1
while.body12.1: ; preds = %while.body12
%incdec.ptr15 = getelementptr inbounds i32, ptr %pDst.addr.0.lcssa, i32 1
%incdec.ptr13 = getelementptr inbounds i16, ptr %pIn.0.lcssa, i32 1
%17 = load i16, ptr %incdec.ptr13, align 2
%conv.1 = sext i16 %17 to i32
%shl14.1 = shl nsw i32 %conv.1, 16
store i32 %shl14.1, ptr %incdec.ptr15, align 4
%cmp11.not.1 = icmp eq i32 %rem, 2
br i1 %cmp11.not.1, label %while.end17, label %while.body12.2
while.body12.2: ; preds = %while.body12.1
%incdec.ptr15.1 = getelementptr inbounds i32, ptr %pDst.addr.0.lcssa, i32 2
%incdec.ptr13.1 = getelementptr inbounds i16, ptr %pIn.0.lcssa, i32 2
%18 = load i16, ptr %incdec.ptr13.1, align 2
%conv.2 = sext i16 %18 to i32
%shl14.2 = shl nsw i32 %conv.2, 16
store i32 %shl14.2, ptr %incdec.ptr15.1, align 4
br label %while.end17
while.end17: ; preds = %while.body12, %while.body12.1, %while.body12.2, %while.end
ret void
}
define void @arm_q15_to_q31_altorder(ptr nocapture noundef readonly %pSrc, ptr nocapture noundef writeonly %pDst, i32 noundef %blockSize) {
; CHECK-LABEL: arm_q15_to_q31_altorder:
; CHECK: @ %bb.0: @ %entry
; CHECK-NEXT: .save {r4, r5, r6, r7, lr}
; CHECK-NEXT: push {r4, r5, r6, r7, lr}
; CHECK-NEXT: .pad #8
; CHECK-NEXT: sub sp, #8
; CHECK-NEXT: mov r7, r2
; CHECK-NEXT: lsrs r3, r2, #2
; CHECK-NEXT: beq .LBB1_6
; CHECK-NEXT: @ %bb.1: @ %while.body.preheader
; CHECK-NEXT: movs r5, #3
; CHECK-NEXT: ands r5, r3
; CHECK-NEXT: subs r2, r3, #1
; CHECK-NEXT: cbz r5, .LBB1_4
; CHECK-NEXT: @ %bb.2: @ %while.body.prol
; CHECK-NEXT: str r2, [sp] @ 4-byte Spill
; CHECK-NEXT: str r7, [sp, #4] @ 4-byte Spill
; CHECK-NEXT: ldrh r2, [r0]
; CHECK-NEXT: ldrh r7, [r0, #2]
; CHECK-NEXT: ldrh r4, [r0, #4]
; CHECK-NEXT: ldrh r6, [r0, #6]
; CHECK-NEXT: lsls r6, r6, #16
; CHECK-NEXT: lsls r4, r4, #16
; CHECK-NEXT: lsls r7, r7, #16
; CHECK-NEXT: lsls r2, r2, #16
; CHECK-NEXT: stm r1!, {r2, r7}
; CHECK-NEXT: str r4, [r1]
; CHECK-NEXT: str r6, [r1, #4]
; CHECK-NEXT: subs r1, #8
; CHECK-NEXT: cmp r5, #1
; CHECK-NEXT: bne .LBB1_11
; CHECK-NEXT: @ %bb.3:
; CHECK-NEXT: adds r1, #16
; CHECK-NEXT: adds r0, #8
; CHECK-NEXT: ldr r2, [sp] @ 4-byte Reload
; CHECK-NEXT: mov r3, r2
; CHECK-NEXT: ldr r7, [sp, #4] @ 4-byte Reload
; CHECK-NEXT: .LBB1_4: @ %while.body.prol.loopexit
; CHECK-NEXT: cmp r2, #3
; CHECK-NEXT: blo .LBB1_6
; CHECK-NEXT: .LBB1_5: @ %while.body
; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1
; CHECK-NEXT: ldrh r2, [r0]
; CHECK-NEXT: ldrh r4, [r0, #2]
; CHECK-NEXT: ldrh r5, [r0, #4]
; CHECK-NEXT: ldrh r6, [r0, #6]
; CHECK-NEXT: lsls r6, r6, #16
; CHECK-NEXT: str r6, [r1, #12]
; CHECK-NEXT: lsls r5, r5, #16
; CHECK-NEXT: str r5, [r1, #8]
; CHECK-NEXT: lsls r4, r4, #16
; CHECK-NEXT: str r4, [r1, #4]
; CHECK-NEXT: lsls r2, r2, #16
; CHECK-NEXT: str r2, [r1]
; CHECK-NEXT: ldrh r2, [r0, #8]
; CHECK-NEXT: ldrh r4, [r0, #10]
; CHECK-NEXT: ldrh r5, [r0, #12]
; CHECK-NEXT: ldrh r6, [r0, #14]
; CHECK-NEXT: lsls r6, r6, #16
; CHECK-NEXT: str r6, [r1, #28]
; CHECK-NEXT: lsls r5, r5, #16
; CHECK-NEXT: str r5, [r1, #24]
; CHECK-NEXT: lsls r4, r4, #16
; CHECK-NEXT: str r4, [r1, #20]
; CHECK-NEXT: lsls r2, r2, #16
; CHECK-NEXT: str r2, [r1, #16]
; CHECK-NEXT: ldrh r2, [r0, #16]
; CHECK-NEXT: ldrh r4, [r0, #18]
; CHECK-NEXT: ldrh r5, [r0, #20]
; CHECK-NEXT: ldrh r6, [r0, #22]
; CHECK-NEXT: lsls r6, r6, #16
; CHECK-NEXT: str r6, [r1, #44]
; CHECK-NEXT: lsls r5, r5, #16
; CHECK-NEXT: str r5, [r1, #40]
; CHECK-NEXT: lsls r4, r4, #16
; CHECK-NEXT: str r4, [r1, #36]
; CHECK-NEXT: lsls r2, r2, #16
; CHECK-NEXT: str r2, [r1, #32]
; CHECK-NEXT: ldrh r2, [r0, #24]
; CHECK-NEXT: ldrh r4, [r0, #26]
; CHECK-NEXT: ldrh r5, [r0, #28]
; CHECK-NEXT: ldrh r6, [r0, #30]
; CHECK-NEXT: lsls r6, r6, #16
; CHECK-NEXT: str r6, [r1, #60]
; CHECK-NEXT: lsls r5, r5, #16
; CHECK-NEXT: str r5, [r1, #56]
; CHECK-NEXT: lsls r4, r4, #16
; CHECK-NEXT: str r4, [r1, #52]
; CHECK-NEXT: lsls r2, r2, #16
; CHECK-NEXT: str r2, [r1, #48]
; CHECK-NEXT: adds r1, #64
; CHECK-NEXT: subs r3, r3, #4
; CHECK-NEXT: adds r0, #32
; CHECK-NEXT: cmp r3, #0
; CHECK-NEXT: bne .LBB1_5
; CHECK-NEXT: .LBB1_6: @ %while.end
; CHECK-NEXT: movs r2, #3
; CHECK-NEXT: ands r7, r2
; CHECK-NEXT: beq .LBB1_10
; CHECK-NEXT: @ %bb.7: @ %while.body12
; CHECK-NEXT: ldrh r2, [r0]
; CHECK-NEXT: lsls r2, r2, #16
; CHECK-NEXT: str r2, [r1]
; CHECK-NEXT: cmp r7, #1
; CHECK-NEXT: beq .LBB1_10
; CHECK-NEXT: @ %bb.8: @ %while.body12.1
; CHECK-NEXT: ldrh r2, [r0, #2]
; CHECK-NEXT: lsls r2, r2, #16
; CHECK-NEXT: str r2, [r1, #4]
; CHECK-NEXT: cmp r7, #2
; CHECK-NEXT: beq .LBB1_10
; CHECK-NEXT: @ %bb.9: @ %while.body12.2
; CHECK-NEXT: ldrh r0, [r0, #4]
; CHECK-NEXT: lsls r0, r0, #16
; CHECK-NEXT: str r0, [r1, #8]
; CHECK-NEXT: .LBB1_10: @ %while.end17
; CHECK-NEXT: add sp, #8
; CHECK-NEXT: pop {r4, r5, r6, r7, pc}
; CHECK-NEXT: .LBB1_11: @ %while.body.prol.1
; CHECK-NEXT: ldrh r2, [r0, #8]
; CHECK-NEXT: ldrh r4, [r0, #10]
; CHECK-NEXT: ldrh r6, [r0, #12]
; CHECK-NEXT: ldrh r7, [r0, #14]
; CHECK-NEXT: lsls r7, r7, #16
; CHECK-NEXT: lsls r6, r6, #16
; CHECK-NEXT: lsls r4, r4, #16
; CHECK-NEXT: lsls r2, r2, #16
; CHECK-NEXT: str r2, [r1, #16]
; CHECK-NEXT: str r4, [r1, #20]
; CHECK-NEXT: str r6, [r1, #24]
; CHECK-NEXT: str r7, [r1, #28]
; CHECK-NEXT: cmp r5, #2
; CHECK-NEXT: bne .LBB1_13
; CHECK-NEXT: @ %bb.12:
; CHECK-NEXT: subs r3, r3, #2
; CHECK-NEXT: adds r1, #32
; CHECK-NEXT: adds r0, #16
; CHECK-NEXT: b .LBB1_14
; CHECK-NEXT: .LBB1_13: @ %while.body.prol.2
; CHECK-NEXT: ldrh r2, [r0, #16]
; CHECK-NEXT: ldrh r4, [r0, #18]
; CHECK-NEXT: ldrh r5, [r0, #20]
; CHECK-NEXT: ldrh r6, [r0, #22]
; CHECK-NEXT: lsls r6, r6, #16
; CHECK-NEXT: lsls r5, r5, #16
; CHECK-NEXT: lsls r4, r4, #16
; CHECK-NEXT: lsls r2, r2, #16
; CHECK-NEXT: mov r7, r1
; CHECK-NEXT: adds r7, #32
; CHECK-NEXT: stm r7!, {r2, r4, r5, r6}
; CHECK-NEXT: subs r3, r3, #3
; CHECK-NEXT: adds r1, #48
; CHECK-NEXT: adds r0, #24
; CHECK-NEXT: .LBB1_14: @ %while.body.prol.loopexit
; CHECK-NEXT: ldr r7, [sp, #4] @ 4-byte Reload
; CHECK-NEXT: ldr r2, [sp] @ 4-byte Reload
; CHECK-NEXT: cmp r2, #3
; CHECK-NEXT: bhs .LBB1_5
; CHECK-NEXT: b .LBB1_6
entry:
%cmp.not18 = icmp ult i32 %blockSize, 4
br i1 %cmp.not18, label %while.end, label %while.body.preheader
while.body.preheader: ; preds = %entry
%shr = lshr i32 %blockSize, 2
%0 = add nsw i32 %shr, -1
%xtraiter = and i32 %shr, 3
%lcmp.mod.not = icmp eq i32 %xtraiter, 0
br i1 %lcmp.mod.not, label %while.body.prol.loopexit, label %while.body.prol
while.body.prol: ; preds = %while.body.preheader
%arrayidx.i.prol = getelementptr inbounds i16, ptr %pSrc, i32 1
%1 = load i16, ptr %arrayidx.i.prol, align 2
%conv.i.prol = sext i16 %1 to i32
%shl.i.prol = shl nsw i32 %conv.i.prol, 16
%2 = load i16, ptr %pSrc, align 2
%conv22.i.prol = zext i16 %2 to i32
%add.ptr2.prol = getelementptr inbounds i16, ptr %pSrc, i32 4
%add.ptr3.prol = getelementptr inbounds i16, ptr %pSrc, i32 2
%arrayidx.i13.prol = getelementptr inbounds i16, ptr %pSrc, i32 3
%3 = load i16, ptr %arrayidx.i13.prol, align 2
%conv.i14.prol = sext i16 %3 to i32
%shl.i15.prol = shl nsw i32 %conv.i14.prol, 16
%4 = load i16, ptr %add.ptr3.prol, align 2
%conv22.i16.prol = zext i16 %4 to i32
%shl.prol = shl nuw i32 %conv22.i.prol, 16
%shl5.prol = shl nuw i32 %conv22.i16.prol, 16
%incdec.ptr.prol = getelementptr inbounds i32, ptr %pDst, i32 1
store i32 %shl.prol, ptr %pDst, align 4
%incdec.ptr7.prol = getelementptr inbounds i32, ptr %pDst, i32 2
store i32 %shl.i.prol, ptr %incdec.ptr.prol, align 4
%incdec.ptr8.prol = getelementptr inbounds i32, ptr %pDst, i32 3
store i32 %shl5.prol, ptr %incdec.ptr7.prol, align 4
%incdec.ptr9.prol = getelementptr inbounds i32, ptr %pDst, i32 4
store i32 %shl.i15.prol, ptr %incdec.ptr8.prol, align 4
%dec.prol = add nsw i32 %shr, -1
%prol.iter.cmp.not = icmp eq i32 %xtraiter, 1
br i1 %prol.iter.cmp.not, label %while.body.prol.loopexit, label %while.body.prol.1
while.body.prol.1: ; preds = %while.body.prol
%arrayidx.i.prol.1 = getelementptr inbounds i16, ptr %pSrc, i32 5
%5 = load i16, ptr %arrayidx.i.prol.1, align 2
%conv.i.prol.1 = sext i16 %5 to i32
%shl.i.prol.1 = shl nsw i32 %conv.i.prol.1, 16
%6 = load i16, ptr %add.ptr2.prol, align 2
%conv22.i.prol.1 = zext i16 %6 to i32
%add.ptr2.prol.1 = getelementptr inbounds i16, ptr %pSrc, i32 8
%add.ptr3.prol.1 = getelementptr inbounds i16, ptr %pSrc, i32 6
%arrayidx.i13.prol.1 = getelementptr inbounds i16, ptr %pSrc, i32 7
%7 = load i16, ptr %arrayidx.i13.prol.1, align 2
%conv.i14.prol.1 = sext i16 %7 to i32
%shl.i15.prol.1 = shl nsw i32 %conv.i14.prol.1, 16
%8 = load i16, ptr %add.ptr3.prol.1, align 2
%conv22.i16.prol.1 = zext i16 %8 to i32
%shl.prol.1 = shl nuw i32 %conv22.i.prol.1, 16
%shl5.prol.1 = shl nuw i32 %conv22.i16.prol.1, 16
%incdec.ptr.prol.1 = getelementptr inbounds i32, ptr %pDst, i32 5
store i32 %shl.prol.1, ptr %incdec.ptr9.prol, align 4
%incdec.ptr7.prol.1 = getelementptr inbounds i32, ptr %pDst, i32 6
store i32 %shl.i.prol.1, ptr %incdec.ptr.prol.1, align 4
%incdec.ptr8.prol.1 = getelementptr inbounds i32, ptr %pDst, i32 7
store i32 %shl5.prol.1, ptr %incdec.ptr7.prol.1, align 4
%incdec.ptr9.prol.1 = getelementptr inbounds i32, ptr %pDst, i32 8
store i32 %shl.i15.prol.1, ptr %incdec.ptr8.prol.1, align 4
%dec.prol.1 = add nsw i32 %shr, -2
%prol.iter.cmp.1.not = icmp eq i32 %xtraiter, 2
br i1 %prol.iter.cmp.1.not, label %while.body.prol.loopexit, label %while.body.prol.2
while.body.prol.2: ; preds = %while.body.prol.1
%arrayidx.i.prol.2 = getelementptr inbounds i16, ptr %pSrc, i32 9
%9 = load i16, ptr %arrayidx.i.prol.2, align 2
%conv.i.prol.2 = sext i16 %9 to i32
%shl.i.prol.2 = shl nsw i32 %conv.i.prol.2, 16
%10 = load i16, ptr %add.ptr2.prol.1, align 2
%conv22.i.prol.2 = zext i16 %10 to i32
%add.ptr2.prol.2 = getelementptr inbounds i16, ptr %pSrc, i32 12
%add.ptr3.prol.2 = getelementptr inbounds i16, ptr %pSrc, i32 10
%arrayidx.i13.prol.2 = getelementptr inbounds i16, ptr %pSrc, i32 11
%11 = load i16, ptr %arrayidx.i13.prol.2, align 2
%conv.i14.prol.2 = sext i16 %11 to i32
%shl.i15.prol.2 = shl nsw i32 %conv.i14.prol.2, 16
%12 = load i16, ptr %add.ptr3.prol.2, align 2
%conv22.i16.prol.2 = zext i16 %12 to i32
%shl.prol.2 = shl nuw i32 %conv22.i.prol.2, 16
%shl5.prol.2 = shl nuw i32 %conv22.i16.prol.2, 16
%incdec.ptr.prol.2 = getelementptr inbounds i32, ptr %pDst, i32 9
store i32 %shl.prol.2, ptr %incdec.ptr9.prol.1, align 4
%incdec.ptr7.prol.2 = getelementptr inbounds i32, ptr %pDst, i32 10
store i32 %shl.i.prol.2, ptr %incdec.ptr.prol.2, align 4
%incdec.ptr8.prol.2 = getelementptr inbounds i32, ptr %pDst, i32 11
store i32 %shl5.prol.2, ptr %incdec.ptr7.prol.2, align 4
%incdec.ptr9.prol.2 = getelementptr inbounds i32, ptr %pDst, i32 12
store i32 %shl.i15.prol.2, ptr %incdec.ptr8.prol.2, align 4
%dec.prol.2 = add nsw i32 %shr, -3
br label %while.body.prol.loopexit
while.body.prol.loopexit: ; preds = %while.body.prol, %while.body.prol.1, %while.body.prol.2, %while.body.preheader
%add.ptr2.lcssa.unr = phi ptr [ undef, %while.body.preheader ], [ %add.ptr2.prol, %while.body.prol ], [ %add.ptr2.prol.1, %while.body.prol.1 ], [ %add.ptr2.prol.2, %while.body.prol.2 ]
%incdec.ptr9.lcssa.unr = phi ptr [ undef, %while.body.preheader ], [ %incdec.ptr9.prol, %while.body.prol ], [ %incdec.ptr9.prol.1, %while.body.prol.1 ], [ %incdec.ptr9.prol.2, %while.body.prol.2 ]
%pDst.addr.021.unr = phi ptr [ %pDst, %while.body.preheader ], [ %incdec.ptr9.prol, %while.body.prol ], [ %incdec.ptr9.prol.1, %while.body.prol.1 ], [ %incdec.ptr9.prol.2, %while.body.prol.2 ]
%blkCnt.020.unr = phi i32 [ %shr, %while.body.preheader ], [ %dec.prol, %while.body.prol ], [ %dec.prol.1, %while.body.prol.1 ], [ %dec.prol.2, %while.body.prol.2 ]
%pIn.019.unr = phi ptr [ %pSrc, %while.body.preheader ], [ %add.ptr2.prol, %while.body.prol ], [ %add.ptr2.prol.1, %while.body.prol.1 ], [ %add.ptr2.prol.2, %while.body.prol.2 ]
%13 = icmp ult i32 %0, 3
br i1 %13, label %while.end, label %while.body
while.body: ; preds = %while.body.prol.loopexit, %while.body
%pDst.addr.021 = phi ptr [ %incdec.ptr9.3, %while.body ], [ %pDst.addr.021.unr, %while.body.prol.loopexit ]
%blkCnt.020 = phi i32 [ %dec.3, %while.body ], [ %blkCnt.020.unr, %while.body.prol.loopexit ]
%pIn.019 = phi ptr [ %add.ptr2.3, %while.body ], [ %pIn.019.unr, %while.body.prol.loopexit ]
%arrayidx.i = getelementptr inbounds i16, ptr %pIn.019, i32 1
%14 = load i16, ptr %arrayidx.i, align 2
%conv.i = sext i16 %14 to i32
%shl.i = shl nsw i32 %conv.i, 16
%15 = load i16, ptr %pIn.019, align 2
%conv22.i = zext i16 %15 to i32
%add.ptr2 = getelementptr inbounds i16, ptr %pIn.019, i32 4
%add.ptr3 = getelementptr inbounds i16, ptr %pIn.019, i32 2
%arrayidx.i13 = getelementptr inbounds i16, ptr %pIn.019, i32 3
%16 = load i16, ptr %arrayidx.i13, align 2
%conv.i14 = sext i16 %16 to i32
%shl.i15 = shl nsw i32 %conv.i14, 16
%17 = load i16, ptr %add.ptr3, align 2
%conv22.i16 = zext i16 %17 to i32
%shl = shl nuw i32 %conv22.i, 16
%shl5 = shl nuw i32 %conv22.i16, 16
%incdec.ptr = getelementptr inbounds i32, ptr %pDst.addr.021, i32 1
store i32 %shl, ptr %pDst.addr.021, align 4
%incdec.ptr7 = getelementptr inbounds i32, ptr %pDst.addr.021, i32 2
store i32 %shl.i, ptr %incdec.ptr, align 4
%incdec.ptr8 = getelementptr inbounds i32, ptr %pDst.addr.021, i32 3
store i32 %shl5, ptr %incdec.ptr7, align 4
%incdec.ptr9 = getelementptr inbounds i32, ptr %pDst.addr.021, i32 4
store i32 %shl.i15, ptr %incdec.ptr8, align 4
%arrayidx.i.1 = getelementptr inbounds i16, ptr %pIn.019, i32 5
%18 = load i16, ptr %arrayidx.i.1, align 2
%conv.i.1 = sext i16 %18 to i32
%shl.i.1 = shl nsw i32 %conv.i.1, 16
%19 = load i16, ptr %add.ptr2, align 2
%conv22.i.1 = zext i16 %19 to i32
%add.ptr2.1 = getelementptr inbounds i16, ptr %pIn.019, i32 8
%add.ptr3.1 = getelementptr inbounds i16, ptr %pIn.019, i32 6
%arrayidx.i13.1 = getelementptr inbounds i16, ptr %pIn.019, i32 7
%20 = load i16, ptr %arrayidx.i13.1, align 2
%conv.i14.1 = sext i16 %20 to i32
%shl.i15.1 = shl nsw i32 %conv.i14.1, 16
%21 = load i16, ptr %add.ptr3.1, align 2
%conv22.i16.1 = zext i16 %21 to i32
%shl.1 = shl nuw i32 %conv22.i.1, 16
%shl5.1 = shl nuw i32 %conv22.i16.1, 16
%incdec.ptr.1 = getelementptr inbounds i32, ptr %pDst.addr.021, i32 5
store i32 %shl.1, ptr %incdec.ptr9, align 4
%incdec.ptr7.1 = getelementptr inbounds i32, ptr %pDst.addr.021, i32 6
store i32 %shl.i.1, ptr %incdec.ptr.1, align 4
%incdec.ptr8.1 = getelementptr inbounds i32, ptr %pDst.addr.021, i32 7
store i32 %shl5.1, ptr %incdec.ptr7.1, align 4
%incdec.ptr9.1 = getelementptr inbounds i32, ptr %pDst.addr.021, i32 8
store i32 %shl.i15.1, ptr %incdec.ptr8.1, align 4
%arrayidx.i.2 = getelementptr inbounds i16, ptr %pIn.019, i32 9
%22 = load i16, ptr %arrayidx.i.2, align 2
%conv.i.2 = sext i16 %22 to i32
%shl.i.2 = shl nsw i32 %conv.i.2, 16
%23 = load i16, ptr %add.ptr2.1, align 2
%conv22.i.2 = zext i16 %23 to i32
%add.ptr2.2 = getelementptr inbounds i16, ptr %pIn.019, i32 12
%add.ptr3.2 = getelementptr inbounds i16, ptr %pIn.019, i32 10
%arrayidx.i13.2 = getelementptr inbounds i16, ptr %pIn.019, i32 11
%24 = load i16, ptr %arrayidx.i13.2, align 2
%conv.i14.2 = sext i16 %24 to i32
%shl.i15.2 = shl nsw i32 %conv.i14.2, 16
%25 = load i16, ptr %add.ptr3.2, align 2
%conv22.i16.2 = zext i16 %25 to i32
%shl.2 = shl nuw i32 %conv22.i.2, 16
%shl5.2 = shl nuw i32 %conv22.i16.2, 16
%incdec.ptr.2 = getelementptr inbounds i32, ptr %pDst.addr.021, i32 9
store i32 %shl.2, ptr %incdec.ptr9.1, align 4
%incdec.ptr7.2 = getelementptr inbounds i32, ptr %pDst.addr.021, i32 10
store i32 %shl.i.2, ptr %incdec.ptr.2, align 4
%incdec.ptr8.2 = getelementptr inbounds i32, ptr %pDst.addr.021, i32 11
store i32 %shl5.2, ptr %incdec.ptr7.2, align 4
%incdec.ptr9.2 = getelementptr inbounds i32, ptr %pDst.addr.021, i32 12
store i32 %shl.i15.2, ptr %incdec.ptr8.2, align 4
%arrayidx.i.3 = getelementptr inbounds i16, ptr %pIn.019, i32 13
%26 = load i16, ptr %arrayidx.i.3, align 2
%conv.i.3 = sext i16 %26 to i32
%shl.i.3 = shl nsw i32 %conv.i.3, 16
%27 = load i16, ptr %add.ptr2.2, align 2
%conv22.i.3 = zext i16 %27 to i32
%add.ptr2.3 = getelementptr inbounds i16, ptr %pIn.019, i32 16
%add.ptr3.3 = getelementptr inbounds i16, ptr %pIn.019, i32 14
%arrayidx.i13.3 = getelementptr inbounds i16, ptr %pIn.019, i32 15
%28 = load i16, ptr %arrayidx.i13.3, align 2
%conv.i14.3 = sext i16 %28 to i32
%shl.i15.3 = shl nsw i32 %conv.i14.3, 16
%29 = load i16, ptr %add.ptr3.3, align 2
%conv22.i16.3 = zext i16 %29 to i32
%shl.3 = shl nuw i32 %conv22.i.3, 16
%shl5.3 = shl nuw i32 %conv22.i16.3, 16
%incdec.ptr.3 = getelementptr inbounds i32, ptr %pDst.addr.021, i32 13
store i32 %shl.3, ptr %incdec.ptr9.2, align 4
%incdec.ptr7.3 = getelementptr inbounds i32, ptr %pDst.addr.021, i32 14
store i32 %shl.i.3, ptr %incdec.ptr.3, align 4
%incdec.ptr8.3 = getelementptr inbounds i32, ptr %pDst.addr.021, i32 15
store i32 %shl5.3, ptr %incdec.ptr7.3, align 4
%incdec.ptr9.3 = getelementptr inbounds i32, ptr %pDst.addr.021, i32 16
store i32 %shl.i15.3, ptr %incdec.ptr8.3, align 4
%dec.3 = add nsw i32 %blkCnt.020, -4
%cmp.not.3 = icmp eq i32 %dec.3, 0
br i1 %cmp.not.3, label %while.end, label %while.body
while.end: ; preds = %while.body.prol.loopexit, %while.body, %entry
%pIn.0.lcssa = phi ptr [ %pSrc, %entry ], [ %add.ptr2.lcssa.unr, %while.body.prol.loopexit ], [ %add.ptr2.3, %while.body ]
%pDst.addr.0.lcssa = phi ptr [ %pDst, %entry ], [ %incdec.ptr9.lcssa.unr, %while.body.prol.loopexit ], [ %incdec.ptr9.3, %while.body ]
%rem = and i32 %blockSize, 3
%cmp11.not23 = icmp eq i32 %rem, 0
br i1 %cmp11.not23, label %while.end17, label %while.body12
while.body12: ; preds = %while.end
%30 = load i16, ptr %pIn.0.lcssa, align 2
%conv = sext i16 %30 to i32
%shl14 = shl nsw i32 %conv, 16
store i32 %shl14, ptr %pDst.addr.0.lcssa, align 4
%cmp11.not = icmp eq i32 %rem, 1
br i1 %cmp11.not, label %while.end17, label %while.body12.1
while.body12.1: ; preds = %while.body12
%incdec.ptr15 = getelementptr inbounds i32, ptr %pDst.addr.0.lcssa, i32 1
%incdec.ptr13 = getelementptr inbounds i16, ptr %pIn.0.lcssa, i32 1
%31 = load i16, ptr %incdec.ptr13, align 2
%conv.1 = sext i16 %31 to i32
%shl14.1 = shl nsw i32 %conv.1, 16
store i32 %shl14.1, ptr %incdec.ptr15, align 4
%cmp11.not.1 = icmp eq i32 %rem, 2
br i1 %cmp11.not.1, label %while.end17, label %while.body12.2
while.body12.2: ; preds = %while.body12.1
%incdec.ptr15.1 = getelementptr inbounds i32, ptr %pDst.addr.0.lcssa, i32 2
%incdec.ptr13.1 = getelementptr inbounds i16, ptr %pIn.0.lcssa, i32 2
%32 = load i16, ptr %incdec.ptr13.1, align 2
%conv.2 = sext i16 %32 to i32
%shl14.2 = shl nsw i32 %conv.2, 16
store i32 %shl14.2, ptr %incdec.ptr15.1, align 4
br label %while.end17
while.end17: ; preds = %while.body12, %while.body12.1, %while.body12.2, %while.end
ret void
}