[llvm] [CodeGenPrepare] Failure to hoist bitcast to legal type causes register splitting (PR #207568)
via llvm-commits
llvm-commits at lists.llvm.org
Sun Jul 5 02:23:14 PDT 2026
https://github.com/houngkoungting created https://github.com/llvm/llvm-project/pull/207568
FIX #179950
Hi @RKSimon
Thanks for the guidance! Following your suggestion, I've extracted the core logic from CodeGenPrepare.cpp into a new optimizeBitCast function. It works perfectly to prevent the register splitting issue.
I have also included tests covering both legal and illegal types.
(Note: I closed the previous PR because its commit history became cluttered. This is a brand new, clean pull request for a proper review path.)
Could you please take a look when you have free time? Thanks!
I wanted to push this first to see if it passes the CI. A small part of the logic is currently a bit hardcoded, and I'm not sure if it's entirely appropriate, so I'd love to get your feedback on that. Thanks!
BR
HKT
>From a24e12cb7db7b9a870076928ec8592de7c022815 Mon Sep 17 00:00:00 2001
From: william <we3223 at gmail.com>
Date: Sun, 5 Jul 2026 17:07:30 +0800
Subject: [PATCH] [CodeGenPrepare] Hoist bitcasts of illegal types to prevent
register splitting
---
llvm/lib/CodeGen/CodeGenPrepare.cpp | 64 ++
llvm/test/CodeGen/ARM/aes-erratum-fix.ll | 942 ++++++++----------
.../CodeGenPrepare/X86/hoist-bitcast-i686.ll | 27 +
.../X86/hoist-bitcast-integer-to-vector.ll | 63 ++
4 files changed, 568 insertions(+), 528 deletions(-)
create mode 100644 llvm/test/Transforms/CodeGenPrepare/X86/hoist-bitcast-i686.ll
create mode 100644 llvm/test/Transforms/CodeGenPrepare/X86/hoist-bitcast-integer-to-vector.ll
diff --git a/llvm/lib/CodeGen/CodeGenPrepare.cpp b/llvm/lib/CodeGen/CodeGenPrepare.cpp
index aa14d2586a534..16d6a5da54e66 100644
--- a/llvm/lib/CodeGen/CodeGenPrepare.cpp
+++ b/llvm/lib/CodeGen/CodeGenPrepare.cpp
@@ -1488,6 +1488,61 @@ static bool SinkCast(CastInst *CI) {
return MadeChange;
}
+/// Hoists bitcasts to the source block to reduce register pressure
+static bool optimizeBitCast(BitCastInst *BCI, const TargetLowering &TLI,
+ const DataLayout &DL) {
+ auto *SrcInst = dyn_cast<Instruction>(BCI->getOperand(0));
+ if (!SrcInst || SrcInst->getParent() == BCI->getParent() ||
+ SrcInst->isTerminator())
+ return false;
+
+ EVT SrcVT = TLI.getValueType(DL, SrcInst->getType());
+ EVT DestVT = TLI.getValueType(DL, BCI->getType());
+
+ // Bail out on scalable vectors and illegal destination types
+ if (SrcVT.isScalableVector() || DestVT.isScalableVector() ||
+ !TLI.isTypeLegal(DestVT))
+ return false;
+
+ // Only hoist if it reduces physical register count
+ if (TLI.getNumRegisters(BCI->getContext(), SrcVT) <=
+ TLI.getNumRegisters(BCI->getContext(), DestVT))
+ return false;
+
+ // Prevent large cross-domain scalar hoists
+ Type *DestTy = BCI->getType();
+ Type *SrcTy = SrcInst->getType();
+ bool IsCrossDomain = DestTy->isFPOrFPVectorTy() != SrcTy->isFPOrFPVectorTy();
+ bool IsLargeScalar = !DestTy->isVectorTy() &&
+ DL.getTypeSizeInBits(DestTy).getFixedValue() > 64;
+ if (IsCrossDomain && IsLargeScalar)
+ return false;
+
+ // SelectionDAG Guard to prevent breaking atomic loop layout
+ auto IsAtomic = [](const Value *V) {
+ const auto *I = dyn_cast<Instruction>(V);
+ return I && I->isAtomic();
+ };
+
+ // Check upstream atomic -> [extractvalue] -> bitcast
+ const Value *Origin = SrcInst;
+ if (auto *EV = dyn_cast<ExtractValueInst>(Origin))
+ Origin = EV->getAggregateOperand();
+
+ // Check downstream bitcast -> [phi] -> atomic
+ if (IsAtomic(Origin) || any_of(BCI->users(), [IsAtomic](const User *U) {
+ return IsAtomic(U) || (isa<PHINode>(U) && any_of(U->users(), IsAtomic));
+ }))
+ return false;
+
+ // Hoist the bitcast
+ BasicBlock *SrcBB = SrcInst->getParent();
+ auto InsertPt = isa<PHINode>(SrcInst) ? SrcBB->getFirstInsertionPt()
+ : std::next(SrcInst->getIterator());
+ BCI->moveBefore(*SrcBB, InsertPt);
+ return true;
+}
+
/// If the specified cast instruction is a noop copy (e.g. it's casting from
/// one pointer type to another, i32->i8 on PPC), sink it into user blocks to
/// reduce the number of virtual registers that must be created and coalesced.
@@ -8938,6 +8993,15 @@ bool CodeGenPrepare::optimizeInst(Instruction *I, ModifyDT &ModifiedDT) {
// evaluation in a block other than then one that uses it (e.g. to hoist
// the address of globals out of a loop). If this is the case, we don't
// want to forward-subst the cast.
+
+ if (auto *BCI = dyn_cast<BitCastInst>(CI)) {
+ // Hoist bitcasts of illegal types to reduce cross-block register pressure
+ // and prevent register splitting.
+ if (optimizeBitCast(BCI, *TLI, *DL)) {
+ return true;
+ }
+ }
+
if (isa<Constant>(CI->getOperand(0)))
return AnyChange;
diff --git a/llvm/test/CodeGen/ARM/aes-erratum-fix.ll b/llvm/test/CodeGen/ARM/aes-erratum-fix.ll
index 82f5bfd02a56e..9cec607eae096 100644
--- a/llvm/test/CodeGen/ARM/aes-erratum-fix.ll
+++ b/llvm/test/CodeGen/ARM/aes-erratum-fix.ll
@@ -1353,38 +1353,22 @@ define arm_aapcs_vfpcc void @aese_setf16_via_val(half %0, <16 x i8> %1, ptr %2)
define arm_aapcs_vfpcc void @aese_setf16_cond_via_ptr(i1 zeroext %0, ptr %1, <16 x i8> %2, ptr %3) nounwind {
; CHECK-FIX-NOSCHED-LABEL: aese_setf16_cond_via_ptr:
; CHECK-FIX-NOSCHED: @ %bb.0:
-; CHECK-FIX-NOSCHED-NEXT: .save {r4, r5, r6, r7, r8, r9, r10, r11, lr}
-; CHECK-FIX-NOSCHED-NEXT: push {r4, r5, r6, r7, r8, r9, r10, r11, lr}
-; CHECK-FIX-NOSCHED-NEXT: .pad #12
-; CHECK-FIX-NOSCHED-NEXT: sub sp, sp, #12
+; CHECK-FIX-NOSCHED-NEXT: .save {r4, r5, r6, r7, r8, lr}
+; CHECK-FIX-NOSCHED-NEXT: push {r4, r5, r6, r7, r8, lr}
; CHECK-FIX-NOSCHED-NEXT: cmp r0, #0
-; CHECK-FIX-NOSCHED-NEXT: beq .LBB36_3
+; CHECK-FIX-NOSCHED-NEXT: beq .LBB36_2
; CHECK-FIX-NOSCHED-NEXT: @ %bb.1:
; CHECK-FIX-NOSCHED-NEXT: vld1.64 {d16, d17}, [r2]
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r3, d17[3]
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r12, d17[3]
; CHECK-FIX-NOSCHED-NEXT: ldrh r7, [r1]
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r9, d17[0]
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r10, d16[3]
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r11, d16[2]
-; CHECK-FIX-NOSCHED-NEXT: str r3, [sp, #8] @ 4-byte Spill
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r3, d17[2]
-; CHECK-FIX-NOSCHED-NEXT: str r3, [sp, #4] @ 4-byte Spill
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r3, d17[1]
-; CHECK-FIX-NOSCHED-NEXT: str r3, [sp] @ 4-byte Spill
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 lr, d17[2]
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r8, d17[1]
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r4, d17[0]
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r5, d16[3]
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r6, d16[2]
; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r3, d16[1]
-; CHECK-FIX-NOSCHED-NEXT: cmp r0, #0
-; CHECK-FIX-NOSCHED-NEXT: bne .LBB36_4
+; CHECK-FIX-NOSCHED-NEXT: b .LBB36_3
; CHECK-FIX-NOSCHED-NEXT: .LBB36_2:
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r0, d1[3]
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r4, d1[2]
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r5, d1[1]
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r6, d1[0]
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r12, d0[3]
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 lr, d0[2]
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r8, d0[1]
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r1, d0[0]
-; CHECK-FIX-NOSCHED-NEXT: b .LBB36_5
-; CHECK-FIX-NOSCHED-NEXT: .LBB36_3:
; CHECK-FIX-NOSCHED-NEXT: add r3, r2, #8
; CHECK-FIX-NOSCHED-NEXT: vld1.32 {d16[0]}, [r2:32]
; CHECK-FIX-NOSCHED-NEXT: vld1.32 {d17[0]}, [r3:32]
@@ -1392,144 +1376,125 @@ define arm_aapcs_vfpcc void @aese_setf16_cond_via_ptr(i1 zeroext %0, ptr %1, <16
; CHECK-FIX-NOSCHED-NEXT: vld1.32 {d16[1]}, [r3:32]
; CHECK-FIX-NOSCHED-NEXT: add r3, r2, #12
; CHECK-FIX-NOSCHED-NEXT: vld1.32 {d17[1]}, [r3:32]
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r3, d17[3]
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r9, d17[0]
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r10, d16[3]
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r11, d16[2]
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r7, d16[0]
-; CHECK-FIX-NOSCHED-NEXT: str r3, [sp, #8] @ 4-byte Spill
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r3, d17[2]
-; CHECK-FIX-NOSCHED-NEXT: str r3, [sp, #4] @ 4-byte Spill
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r3, d17[1]
-; CHECK-FIX-NOSCHED-NEXT: str r3, [sp] @ 4-byte Spill
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r12, d17[3]
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 lr, d17[2]
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r8, d17[1]
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r4, d17[0]
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r5, d16[3]
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r6, d16[2]
; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r3, d16[1]
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r7, d16[0]
+; CHECK-FIX-NOSCHED-NEXT: .LBB36_3:
+; CHECK-FIX-NOSCHED-NEXT: pkhbt r3, r7, r3, lsl #16
; CHECK-FIX-NOSCHED-NEXT: cmp r0, #0
-; CHECK-FIX-NOSCHED-NEXT: beq .LBB36_2
-; CHECK-FIX-NOSCHED-NEXT: .LBB36_4:
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r0, d1[3]
+; CHECK-FIX-NOSCHED-NEXT: vmov.32 d16[0], r3
+; CHECK-FIX-NOSCHED-NEXT: pkhbt r3, r4, r8, lsl #16
+; CHECK-FIX-NOSCHED-NEXT: vmov.32 d17[0], r3
+; CHECK-FIX-NOSCHED-NEXT: pkhbt r3, r6, r5, lsl #16
+; CHECK-FIX-NOSCHED-NEXT: vmov.32 d16[1], r3
+; CHECK-FIX-NOSCHED-NEXT: pkhbt r3, lr, r12, lsl #16
+; CHECK-FIX-NOSCHED-NEXT: vmov.32 d17[1], r3
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r12, d1[3]
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r3, d1[2]
+; CHECK-FIX-NOSCHED-NEXT: beq .LBB36_5
+; CHECK-FIX-NOSCHED-NEXT: @ %bb.4:
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r0, d1[1]
; CHECK-FIX-NOSCHED-NEXT: ldrh r1, [r1]
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r4, d1[2]
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r5, d1[1]
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r6, d1[0]
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r12, d0[3]
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 lr, d0[2]
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r8, d0[1]
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r4, d1[0]
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r5, d0[3]
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r6, d0[2]
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r7, d0[1]
+; CHECK-FIX-NOSCHED-NEXT: b .LBB36_6
; CHECK-FIX-NOSCHED-NEXT: .LBB36_5:
-; CHECK-FIX-NOSCHED-NEXT: pkhbt r1, r1, r8, lsl #16
-; CHECK-FIX-NOSCHED-NEXT: pkhbt r3, r7, r3, lsl #16
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r0, d1[1]
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r4, d1[0]
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r5, d0[3]
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r6, d0[2]
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r7, d0[1]
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r1, d0[0]
+; CHECK-FIX-NOSCHED-NEXT: .LBB36_6:
+; CHECK-FIX-NOSCHED-NEXT: pkhbt r1, r1, r7, lsl #16
; CHECK-FIX-NOSCHED-NEXT: pkhbt r0, r4, r0, lsl #16
; CHECK-FIX-NOSCHED-NEXT: vmov.32 d18[0], r1
-; CHECK-FIX-NOSCHED-NEXT: pkhbt r1, lr, r12, lsl #16
-; CHECK-FIX-NOSCHED-NEXT: vmov.32 d16[0], r3
-; CHECK-FIX-NOSCHED-NEXT: vmov.32 d18[1], r1
-; CHECK-FIX-NOSCHED-NEXT: pkhbt r1, r11, r10, lsl #16
-; CHECK-FIX-NOSCHED-NEXT: vmov.32 d16[1], r1
-; CHECK-FIX-NOSCHED-NEXT: pkhbt r1, r6, r5, lsl #16
-; CHECK-FIX-NOSCHED-NEXT: vmov.32 d19[0], r1
-; CHECK-FIX-NOSCHED-NEXT: ldr r1, [sp] @ 4-byte Reload
-; CHECK-FIX-NOSCHED-NEXT: pkhbt r1, r9, r1, lsl #16
+; CHECK-FIX-NOSCHED-NEXT: vmov.32 d19[0], r0
+; CHECK-FIX-NOSCHED-NEXT: pkhbt r0, r6, r5, lsl #16
+; CHECK-FIX-NOSCHED-NEXT: vmov.32 d18[1], r0
+; CHECK-FIX-NOSCHED-NEXT: pkhbt r0, r3, r12, lsl #16
; CHECK-FIX-NOSCHED-NEXT: vmov.32 d19[1], r0
-; CHECK-FIX-NOSCHED-NEXT: ldr r0, [sp, #8] @ 4-byte Reload
-; CHECK-FIX-NOSCHED-NEXT: vmov.32 d17[0], r1
-; CHECK-FIX-NOSCHED-NEXT: ldr r1, [sp, #4] @ 4-byte Reload
-; CHECK-FIX-NOSCHED-NEXT: pkhbt r0, r1, r0, lsl #16
-; CHECK-FIX-NOSCHED-NEXT: vmov.32 d17[1], r0
; CHECK-FIX-NOSCHED-NEXT: aese.8 q8, q9
; CHECK-FIX-NOSCHED-NEXT: aesmc.8 q8, q8
; CHECK-FIX-NOSCHED-NEXT: vst1.64 {d16, d17}, [r2]
-; CHECK-FIX-NOSCHED-NEXT: add sp, sp, #12
-; CHECK-FIX-NOSCHED-NEXT: pop {r4, r5, r6, r7, r8, r9, r10, r11, pc}
+; CHECK-FIX-NOSCHED-NEXT: pop {r4, r5, r6, r7, r8, pc}
;
; CHECK-CORTEX-FIX-LABEL: aese_setf16_cond_via_ptr:
; CHECK-CORTEX-FIX: @ %bb.0:
-; CHECK-CORTEX-FIX-NEXT: .save {r4, r5, r6, r7, r8, r9, r10, r11, lr}
-; CHECK-CORTEX-FIX-NEXT: push {r4, r5, r6, r7, r8, r9, r10, r11, lr}
-; CHECK-CORTEX-FIX-NEXT: .pad #24
-; CHECK-CORTEX-FIX-NEXT: sub sp, sp, #24
+; CHECK-CORTEX-FIX-NEXT: .save {r4, r5, r6, r7, r8, lr}
+; CHECK-CORTEX-FIX-NEXT: push {r4, r5, r6, r7, r8, lr}
; CHECK-CORTEX-FIX-NEXT: cmp r0, #0
-; CHECK-CORTEX-FIX-NEXT: beq .LBB36_3
+; CHECK-CORTEX-FIX-NEXT: beq .LBB36_2
; CHECK-CORTEX-FIX-NEXT: @ %bb.1:
; CHECK-CORTEX-FIX-NEXT: vld1.64 {d16, d17}, [r2]
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r3, d16[1]
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r6, d17[0]
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r7, d17[2]
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r4, d17[3]
-; CHECK-CORTEX-FIX-NEXT: str r3, [sp, #20] @ 4-byte Spill
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r3, d16[2]
-; CHECK-CORTEX-FIX-NEXT: str r3, [sp, #8] @ 4-byte Spill
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r3, d16[3]
-; CHECK-CORTEX-FIX-NEXT: str r3, [sp, #4] @ 4-byte Spill
+; CHECK-CORTEX-FIX-NEXT: ldrh r4, [r1]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r8, d16[1]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r12, d16[2]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 lr, d16[3]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r7, d17[0]
; CHECK-CORTEX-FIX-NEXT: vmov.u16 r3, d17[1]
-; CHECK-CORTEX-FIX-NEXT: str r3, [sp, #12] @ 4-byte Spill
-; CHECK-CORTEX-FIX-NEXT: ldrh r3, [r1]
-; CHECK-CORTEX-FIX-NEXT: str r3, [sp, #16] @ 4-byte Spill
-; CHECK-CORTEX-FIX-NEXT: mov r3, r6
-; CHECK-CORTEX-FIX-NEXT: cmp r0, #0
-; CHECK-CORTEX-FIX-NEXT: bne .LBB36_4
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r5, d17[2]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r6, d17[3]
+; CHECK-CORTEX-FIX-NEXT: b .LBB36_3
; CHECK-CORTEX-FIX-NEXT: .LBB36_2:
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r0, d0[0]
-; CHECK-CORTEX-FIX-NEXT: b .LBB36_5
-; CHECK-CORTEX-FIX-NEXT: .LBB36_3:
-; CHECK-CORTEX-FIX-NEXT: vld1.32 {d16[0]}, [r2:32]
; CHECK-CORTEX-FIX-NEXT: add r3, r2, #8
+; CHECK-CORTEX-FIX-NEXT: vld1.32 {d16[0]}, [r2:32]
; CHECK-CORTEX-FIX-NEXT: add r7, r2, #4
; CHECK-CORTEX-FIX-NEXT: vld1.32 {d17[0]}, [r3:32]
; CHECK-CORTEX-FIX-NEXT: add r3, r2, #12
; CHECK-CORTEX-FIX-NEXT: vld1.32 {d16[1]}, [r7:32]
; CHECK-CORTEX-FIX-NEXT: vld1.32 {d17[1]}, [r3:32]
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r3, d16[0]
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r7, d17[1]
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r4, d17[3]
-; CHECK-CORTEX-FIX-NEXT: str r3, [sp, #16] @ 4-byte Spill
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r3, d16[1]
-; CHECK-CORTEX-FIX-NEXT: str r7, [sp, #12] @ 4-byte Spill
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r7, d17[2]
-; CHECK-CORTEX-FIX-NEXT: str r3, [sp, #20] @ 4-byte Spill
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r3, d16[2]
-; CHECK-CORTEX-FIX-NEXT: str r3, [sp, #8] @ 4-byte Spill
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r3, d16[3]
-; CHECK-CORTEX-FIX-NEXT: str r3, [sp, #4] @ 4-byte Spill
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r3, d17[0]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r4, d16[0]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r8, d16[1]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r12, d16[2]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 lr, d16[3]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r7, d17[0]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r3, d17[1]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r5, d17[2]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r6, d17[3]
+; CHECK-CORTEX-FIX-NEXT: .LBB36_3:
+; CHECK-CORTEX-FIX-NEXT: pkhbt r3, r7, r3, lsl #16
+; CHECK-CORTEX-FIX-NEXT: pkhbt r4, r4, r8, lsl #16
+; CHECK-CORTEX-FIX-NEXT: pkhbt r7, r12, lr, lsl #16
; CHECK-CORTEX-FIX-NEXT: cmp r0, #0
-; CHECK-CORTEX-FIX-NEXT: beq .LBB36_2
-; CHECK-CORTEX-FIX-NEXT: .LBB36_4:
-; CHECK-CORTEX-FIX-NEXT: ldrh r0, [r1]
+; CHECK-CORTEX-FIX-NEXT: vmov.32 d16[0], r4
+; CHECK-CORTEX-FIX-NEXT: vmov.32 d17[0], r3
+; CHECK-CORTEX-FIX-NEXT: pkhbt r3, r5, r6, lsl #16
+; CHECK-CORTEX-FIX-NEXT: vmov.32 d16[1], r7
+; CHECK-CORTEX-FIX-NEXT: vmov.32 d17[1], r3
+; CHECK-CORTEX-FIX-NEXT: beq .LBB36_5
+; CHECK-CORTEX-FIX-NEXT: @ %bb.4:
+; CHECK-CORTEX-FIX-NEXT: ldrh r3, [r1]
+; CHECK-CORTEX-FIX-NEXT: b .LBB36_6
; CHECK-CORTEX-FIX-NEXT: .LBB36_5:
-; CHECK-CORTEX-FIX-NEXT: str r0, [sp] @ 4-byte Spill
-; CHECK-CORTEX-FIX-NEXT: ldr r0, [sp, #8] @ 4-byte Reload
-; CHECK-CORTEX-FIX-NEXT: ldr r1, [sp, #4] @ 4-byte Reload
-; CHECK-CORTEX-FIX-NEXT: pkhbt r9, r7, r4, lsl #16
-; CHECK-CORTEX-FIX-NEXT: ldr r4, [sp, #20] @ 4-byte Reload
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r10, d0[1]
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r6, d0[2]
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r12, d0[3]
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r11, d1[0]
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r5, d1[1]
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 lr, d1[2]
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r8, d1[3]
-; CHECK-CORTEX-FIX-NEXT: pkhbt r7, r0, r1, lsl #16
-; CHECK-CORTEX-FIX-NEXT: ldr r1, [sp, #12] @ 4-byte Reload
-; CHECK-CORTEX-FIX-NEXT: pkhbt r0, lr, r8, lsl #16
-; CHECK-CORTEX-FIX-NEXT: pkhbt r6, r6, r12, lsl #16
-; CHECK-CORTEX-FIX-NEXT: pkhbt r5, r11, r5, lsl #16
-; CHECK-CORTEX-FIX-NEXT: pkhbt r1, r3, r1, lsl #16
-; CHECK-CORTEX-FIX-NEXT: ldr r3, [sp, #16] @ 4-byte Reload
-; CHECK-CORTEX-FIX-NEXT: pkhbt r4, r3, r4, lsl #16
-; CHECK-CORTEX-FIX-NEXT: ldr r3, [sp] @ 4-byte Reload
-; CHECK-CORTEX-FIX-NEXT: vmov.32 d18[0], r4
-; CHECK-CORTEX-FIX-NEXT: vmov.32 d19[0], r1
-; CHECK-CORTEX-FIX-NEXT: vmov.32 d18[1], r7
-; CHECK-CORTEX-FIX-NEXT: vmov.32 d19[1], r9
-; CHECK-CORTEX-FIX-NEXT: pkhbt r3, r3, r10, lsl #16
-; CHECK-CORTEX-FIX-NEXT: vmov.32 d16[0], r3
-; CHECK-CORTEX-FIX-NEXT: vmov.32 d17[0], r5
-; CHECK-CORTEX-FIX-NEXT: vmov.32 d16[1], r6
-; CHECK-CORTEX-FIX-NEXT: vmov.32 d17[1], r0
-; CHECK-CORTEX-FIX-NEXT: aese.8 q9, q8
-; CHECK-CORTEX-FIX-NEXT: aesmc.8 q8, q9
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r3, d0[0]
+; CHECK-CORTEX-FIX-NEXT: .LBB36_6:
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r0, d0[1]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r12, d0[2]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r1, d0[3]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r7, d1[0]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r4, d1[1]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r5, d1[2]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r6, d1[3]
+; CHECK-CORTEX-FIX-NEXT: pkhbt r0, r3, r0, lsl #16
+; CHECK-CORTEX-FIX-NEXT: pkhbt r7, r7, r4, lsl #16
+; CHECK-CORTEX-FIX-NEXT: pkhbt r1, r12, r1, lsl #16
+; CHECK-CORTEX-FIX-NEXT: vmov.32 d18[0], r0
+; CHECK-CORTEX-FIX-NEXT: pkhbt r0, r5, r6, lsl #16
+; CHECK-CORTEX-FIX-NEXT: vmov.32 d19[0], r7
+; CHECK-CORTEX-FIX-NEXT: vmov.32 d18[1], r1
+; CHECK-CORTEX-FIX-NEXT: vmov.32 d19[1], r0
+; CHECK-CORTEX-FIX-NEXT: aese.8 q8, q9
+; CHECK-CORTEX-FIX-NEXT: aesmc.8 q8, q8
; CHECK-CORTEX-FIX-NEXT: vst1.64 {d16, d17}, [r2]
-; CHECK-CORTEX-FIX-NEXT: add sp, sp, #24
-; CHECK-CORTEX-FIX-NEXT: pop {r4, r5, r6, r7, r8, r9, r10, r11, pc}
+; CHECK-CORTEX-FIX-NEXT: pop {r4, r5, r6, r7, r8, pc}
br i1 %0, label %5, label %12
5:
@@ -1575,25 +1540,20 @@ define arm_aapcs_vfpcc void @aese_setf16_cond_via_ptr(i1 zeroext %0, ptr %1, <16
define arm_aapcs_vfpcc void @aese_setf16_cond_via_val(i1 zeroext %0, half %1, <16 x i8> %2, ptr %3) nounwind {
; CHECK-FIX-NOSCHED-LABEL: aese_setf16_cond_via_val:
; CHECK-FIX-NOSCHED: @ %bb.0:
-; CHECK-FIX-NOSCHED-NEXT: .save {r4, r5, r6, r7, r8, r9, r10, r11, lr}
-; CHECK-FIX-NOSCHED-NEXT: push {r4, r5, r6, r7, r8, r9, r10, r11, lr}
-; CHECK-FIX-NOSCHED-NEXT: .pad #12
-; CHECK-FIX-NOSCHED-NEXT: sub sp, sp, #12
+; CHECK-FIX-NOSCHED-NEXT: .save {r4, r5, r6, r7, r11, lr}
+; CHECK-FIX-NOSCHED-NEXT: push {r4, r5, r6, r7, r11, lr}
; CHECK-FIX-NOSCHED-NEXT: cmp r0, #0
; CHECK-FIX-NOSCHED-NEXT: beq .LBB37_2
; CHECK-FIX-NOSCHED-NEXT: @ %bb.1:
; CHECK-FIX-NOSCHED-NEXT: vld1.64 {d16, d17}, [r1]
; CHECK-FIX-NOSCHED-NEXT: vmov.f32 s2, s0
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r2, d17[1]
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r7, d17[3]
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r12, d17[3]
; CHECK-FIX-NOSCHED-NEXT: vmov.u16 lr, d17[2]
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r11, d16[2]
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r8, d16[1]
-; CHECK-FIX-NOSCHED-NEXT: str r2, [sp, #8] @ 4-byte Spill
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r2, d17[0]
-; CHECK-FIX-NOSCHED-NEXT: str r2, [sp, #4] @ 4-byte Spill
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r2, d16[3]
-; CHECK-FIX-NOSCHED-NEXT: str r2, [sp] @ 4-byte Spill
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r2, d17[1]
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r3, d17[0]
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r4, d16[3]
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r5, d16[2]
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r6, d16[1]
; CHECK-FIX-NOSCHED-NEXT: b .LBB37_3
; CHECK-FIX-NOSCHED-NEXT: .LBB37_2:
; CHECK-FIX-NOSCHED-NEXT: add r2, r1, #8
@@ -1603,99 +1563,76 @@ define arm_aapcs_vfpcc void @aese_setf16_cond_via_val(i1 zeroext %0, half %1, <1
; CHECK-FIX-NOSCHED-NEXT: vld1.32 {d16[1]}, [r2:32]
; CHECK-FIX-NOSCHED-NEXT: add r2, r1, #12
; CHECK-FIX-NOSCHED-NEXT: vld1.32 {d17[1]}, [r2:32]
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r2, d17[1]
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r7, d17[3]
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r7, d16[0]
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r12, d17[3]
; CHECK-FIX-NOSCHED-NEXT: vmov.u16 lr, d17[2]
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r11, d16[2]
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r8, d16[1]
-; CHECK-FIX-NOSCHED-NEXT: str r2, [sp, #8] @ 4-byte Spill
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r2, d17[0]
-; CHECK-FIX-NOSCHED-NEXT: str r2, [sp, #4] @ 4-byte Spill
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r2, d16[3]
-; CHECK-FIX-NOSCHED-NEXT: str r2, [sp] @ 4-byte Spill
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r2, d16[0]
-; CHECK-FIX-NOSCHED-NEXT: vmov s2, r2
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r2, d17[1]
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r3, d17[0]
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r4, d16[3]
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r5, d16[2]
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r6, d16[1]
+; CHECK-FIX-NOSCHED-NEXT: vmov s2, r7
; CHECK-FIX-NOSCHED-NEXT: .LBB37_3:
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r9, d3[3]
+; CHECK-FIX-NOSCHED-NEXT: vmov r7, s2
+; CHECK-FIX-NOSCHED-NEXT: pkhbt r2, r3, r2, lsl #16
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r3, d3[1]
; CHECK-FIX-NOSCHED-NEXT: cmp r0, #0
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r10, d3[2]
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r2, d3[1]
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r3, d3[0]
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r4, d2[3]
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r5, d2[2]
+; CHECK-FIX-NOSCHED-NEXT: pkhbt r6, r7, r6, lsl #16
+; CHECK-FIX-NOSCHED-NEXT: vmov.32 d16[0], r6
+; CHECK-FIX-NOSCHED-NEXT: vmov.32 d17[0], r2
+; CHECK-FIX-NOSCHED-NEXT: pkhbt r2, r5, r4, lsl #16
+; CHECK-FIX-NOSCHED-NEXT: vmov.32 d16[1], r2
+; CHECK-FIX-NOSCHED-NEXT: pkhbt r2, lr, r12, lsl #16
+; CHECK-FIX-NOSCHED-NEXT: vmov.32 d17[1], r2
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r12, d3[3]
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r2, d3[2]
; CHECK-FIX-NOSCHED-NEXT: beq .LBB37_5
; CHECK-FIX-NOSCHED-NEXT: @ %bb.4:
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r12, d2[1]
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r0, d3[0]
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r4, d2[3]
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r5, d2[2]
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r6, d2[1]
; CHECK-FIX-NOSCHED-NEXT: b .LBB37_6
; CHECK-FIX-NOSCHED-NEXT: .LBB37_5:
-; CHECK-FIX-NOSCHED-NEXT: mov r0, lr
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 lr, d2[0]
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r12, d2[1]
-; CHECK-FIX-NOSCHED-NEXT: vmov s0, lr
-; CHECK-FIX-NOSCHED-NEXT: mov lr, r0
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r7, d2[0]
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r0, d3[0]
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r4, d2[3]
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r5, d2[2]
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r6, d2[1]
+; CHECK-FIX-NOSCHED-NEXT: vmov s0, r7
; CHECK-FIX-NOSCHED-NEXT: .LBB37_6:
-; CHECK-FIX-NOSCHED-NEXT: vmov r0, s0
-; CHECK-FIX-NOSCHED-NEXT: vmov r6, s2
-; CHECK-FIX-NOSCHED-NEXT: pkhbt r0, r0, r12, lsl #16
-; CHECK-FIX-NOSCHED-NEXT: pkhbt r6, r6, r8, lsl #16
-; CHECK-FIX-NOSCHED-NEXT: vmov.32 d18[0], r0
+; CHECK-FIX-NOSCHED-NEXT: vmov r7, s0
+; CHECK-FIX-NOSCHED-NEXT: pkhbt r0, r0, r3, lsl #16
+; CHECK-FIX-NOSCHED-NEXT: pkhbt r7, r7, r6, lsl #16
+; CHECK-FIX-NOSCHED-NEXT: vmov.32 d18[0], r7
+; CHECK-FIX-NOSCHED-NEXT: vmov.32 d19[0], r0
; CHECK-FIX-NOSCHED-NEXT: pkhbt r0, r5, r4, lsl #16
-; CHECK-FIX-NOSCHED-NEXT: vmov.32 d16[0], r6
; CHECK-FIX-NOSCHED-NEXT: vmov.32 d18[1], r0
-; CHECK-FIX-NOSCHED-NEXT: ldr r0, [sp] @ 4-byte Reload
-; CHECK-FIX-NOSCHED-NEXT: pkhbt r0, r11, r0, lsl #16
-; CHECK-FIX-NOSCHED-NEXT: vmov.32 d16[1], r0
-; CHECK-FIX-NOSCHED-NEXT: pkhbt r0, r3, r2, lsl #16
-; CHECK-FIX-NOSCHED-NEXT: ldr r2, [sp, #4] @ 4-byte Reload
-; CHECK-FIX-NOSCHED-NEXT: vmov.32 d19[0], r0
-; CHECK-FIX-NOSCHED-NEXT: ldr r0, [sp, #8] @ 4-byte Reload
-; CHECK-FIX-NOSCHED-NEXT: pkhbt r0, r2, r0, lsl #16
-; CHECK-FIX-NOSCHED-NEXT: vmov.32 d17[0], r0
-; CHECK-FIX-NOSCHED-NEXT: pkhbt r0, r10, r9, lsl #16
+; CHECK-FIX-NOSCHED-NEXT: pkhbt r0, r2, r12, lsl #16
; CHECK-FIX-NOSCHED-NEXT: vmov.32 d19[1], r0
-; CHECK-FIX-NOSCHED-NEXT: pkhbt r0, lr, r7, lsl #16
-; CHECK-FIX-NOSCHED-NEXT: vmov.32 d17[1], r0
; CHECK-FIX-NOSCHED-NEXT: aese.8 q8, q9
; CHECK-FIX-NOSCHED-NEXT: aesmc.8 q8, q8
; CHECK-FIX-NOSCHED-NEXT: vst1.64 {d16, d17}, [r1]
-; CHECK-FIX-NOSCHED-NEXT: add sp, sp, #12
-; CHECK-FIX-NOSCHED-NEXT: pop {r4, r5, r6, r7, r8, r9, r10, r11, pc}
+; CHECK-FIX-NOSCHED-NEXT: pop {r4, r5, r6, r7, r11, pc}
;
; CHECK-CORTEX-FIX-LABEL: aese_setf16_cond_via_val:
; CHECK-CORTEX-FIX: @ %bb.0:
-; CHECK-CORTEX-FIX-NEXT: .save {r4, r5, r6, r7, r8, r9, r10, r11, lr}
-; CHECK-CORTEX-FIX-NEXT: push {r4, r5, r6, r7, r8, r9, r10, r11, lr}
-; CHECK-CORTEX-FIX-NEXT: .pad #12
-; CHECK-CORTEX-FIX-NEXT: sub sp, sp, #12
+; CHECK-CORTEX-FIX-NEXT: .save {r4, r5, r6, r7, r11, lr}
+; CHECK-CORTEX-FIX-NEXT: push {r4, r5, r6, r7, r11, lr}
; CHECK-CORTEX-FIX-NEXT: cmp r0, #0
-; CHECK-CORTEX-FIX-NEXT: beq .LBB37_3
+; CHECK-CORTEX-FIX-NEXT: beq .LBB37_2
; CHECK-CORTEX-FIX-NEXT: @ %bb.1:
; CHECK-CORTEX-FIX-NEXT: vld1.64 {d16, d17}, [r1]
; CHECK-CORTEX-FIX-NEXT: vmov.f32 s2, s0
; CHECK-CORTEX-FIX-NEXT: vmov.u16 r2, d16[1]
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r7, d16[2]
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r10, d16[3]
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r11, d17[2]
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r6, d17[3]
-; CHECK-CORTEX-FIX-NEXT: str r2, [sp, #8] @ 4-byte Spill
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r2, d17[0]
-; CHECK-CORTEX-FIX-NEXT: str r2, [sp, #4] @ 4-byte Spill
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r2, d17[1]
-; CHECK-CORTEX-FIX-NEXT: str r2, [sp] @ 4-byte Spill
-; CHECK-CORTEX-FIX-NEXT: cmp r0, #0
-; CHECK-CORTEX-FIX-NEXT: bne .LBB37_4
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r12, d16[2]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 lr, d16[3]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r5, d17[0]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r6, d17[1]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r3, d17[2]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r4, d17[3]
+; CHECK-CORTEX-FIX-NEXT: b .LBB37_3
; CHECK-CORTEX-FIX-NEXT: .LBB37_2:
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 lr, d2[0]
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r8, d2[1]
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r3, d2[2]
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r4, d2[3]
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r9, d3[0]
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r2, d3[1]
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r5, d3[2]
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r12, d3[3]
-; CHECK-CORTEX-FIX-NEXT: vmov s0, lr
-; CHECK-CORTEX-FIX-NEXT: b .LBB37_5
-; CHECK-CORTEX-FIX-NEXT: .LBB37_3:
; CHECK-CORTEX-FIX-NEXT: vld1.32 {d16[0]}, [r1:32]
; CHECK-CORTEX-FIX-NEXT: add r2, r1, #8
; CHECK-CORTEX-FIX-NEXT: add r3, r1, #4
@@ -1703,54 +1640,60 @@ define arm_aapcs_vfpcc void @aese_setf16_cond_via_val(i1 zeroext %0, half %1, <1
; CHECK-CORTEX-FIX-NEXT: add r2, r1, #12
; CHECK-CORTEX-FIX-NEXT: vld1.32 {d16[1]}, [r3:32]
; CHECK-CORTEX-FIX-NEXT: vld1.32 {d17[1]}, [r2:32]
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r3, d16[1]
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r2, d16[0]
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r7, d16[2]
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r10, d16[3]
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r11, d17[2]
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r6, d17[3]
-; CHECK-CORTEX-FIX-NEXT: str r3, [sp, #8] @ 4-byte Spill
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r3, d17[0]
-; CHECK-CORTEX-FIX-NEXT: vmov s2, r2
-; CHECK-CORTEX-FIX-NEXT: str r3, [sp, #4] @ 4-byte Spill
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r3, d17[1]
-; CHECK-CORTEX-FIX-NEXT: str r3, [sp] @ 4-byte Spill
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r7, d16[0]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r2, d16[1]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r12, d16[2]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 lr, d16[3]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r5, d17[0]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r6, d17[1]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r3, d17[2]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r4, d17[3]
+; CHECK-CORTEX-FIX-NEXT: vmov s2, r7
+; CHECK-CORTEX-FIX-NEXT: .LBB37_3:
+; CHECK-CORTEX-FIX-NEXT: pkhbt r5, r5, r6, lsl #16
+; CHECK-CORTEX-FIX-NEXT: vmov r6, s2
; CHECK-CORTEX-FIX-NEXT: cmp r0, #0
-; CHECK-CORTEX-FIX-NEXT: beq .LBB37_2
-; CHECK-CORTEX-FIX-NEXT: .LBB37_4:
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r8, d2[1]
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r3, d2[2]
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r4, d2[3]
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r9, d3[0]
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r2, d3[1]
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r5, d3[2]
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r12, d3[3]
+; CHECK-CORTEX-FIX-NEXT: pkhbt r2, r6, r2, lsl #16
+; CHECK-CORTEX-FIX-NEXT: vmov.32 d16[0], r2
+; CHECK-CORTEX-FIX-NEXT: pkhbt r2, r3, r4, lsl #16
+; CHECK-CORTEX-FIX-NEXT: pkhbt r3, r12, lr, lsl #16
+; CHECK-CORTEX-FIX-NEXT: vmov.32 d17[0], r5
+; CHECK-CORTEX-FIX-NEXT: vmov.32 d16[1], r3
+; CHECK-CORTEX-FIX-NEXT: vmov.32 d17[1], r2
+; CHECK-CORTEX-FIX-NEXT: beq .LBB37_5
+; CHECK-CORTEX-FIX-NEXT: @ %bb.4:
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r3, d2[1]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r12, d2[2]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r2, d2[3]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r5, d3[0]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r6, d3[1]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r0, d3[2]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r4, d3[3]
+; CHECK-CORTEX-FIX-NEXT: b .LBB37_6
; CHECK-CORTEX-FIX-NEXT: .LBB37_5:
-; CHECK-CORTEX-FIX-NEXT: pkhbt lr, r11, r6, lsl #16
-; CHECK-CORTEX-FIX-NEXT: pkhbt r0, r7, r10, lsl #16
-; CHECK-CORTEX-FIX-NEXT: ldm sp, {r6, r7} @ 8-byte Folded Reload
-; CHECK-CORTEX-FIX-NEXT: pkhbt r3, r3, r4, lsl #16
-; CHECK-CORTEX-FIX-NEXT: pkhbt r5, r5, r12, lsl #16
-; CHECK-CORTEX-FIX-NEXT: pkhbt r2, r9, r2, lsl #16
-; CHECK-CORTEX-FIX-NEXT: pkhbt r4, r7, r6, lsl #16
-; CHECK-CORTEX-FIX-NEXT: vmov r7, s2
-; CHECK-CORTEX-FIX-NEXT: ldr r6, [sp, #8] @ 4-byte Reload
-; CHECK-CORTEX-FIX-NEXT: pkhbt r7, r7, r6, lsl #16
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r7, d2[0]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r3, d2[1]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r12, d2[2]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r2, d2[3]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r5, d3[0]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r6, d3[1]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r0, d3[2]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r4, d3[3]
+; CHECK-CORTEX-FIX-NEXT: vmov s0, r7
+; CHECK-CORTEX-FIX-NEXT: .LBB37_6:
+; CHECK-CORTEX-FIX-NEXT: pkhbt r7, r5, r6, lsl #16
; CHECK-CORTEX-FIX-NEXT: vmov r6, s0
-; CHECK-CORTEX-FIX-NEXT: vmov.32 d18[0], r7
-; CHECK-CORTEX-FIX-NEXT: vmov.32 d19[0], r4
-; CHECK-CORTEX-FIX-NEXT: vmov.32 d18[1], r0
-; CHECK-CORTEX-FIX-NEXT: vmov.32 d19[1], lr
-; CHECK-CORTEX-FIX-NEXT: pkhbt r6, r6, r8, lsl #16
-; CHECK-CORTEX-FIX-NEXT: vmov.32 d16[0], r6
-; CHECK-CORTEX-FIX-NEXT: vmov.32 d17[0], r2
-; CHECK-CORTEX-FIX-NEXT: vmov.32 d16[1], r3
-; CHECK-CORTEX-FIX-NEXT: vmov.32 d17[1], r5
-; CHECK-CORTEX-FIX-NEXT: aese.8 q9, q8
-; CHECK-CORTEX-FIX-NEXT: aesmc.8 q8, q9
+; CHECK-CORTEX-FIX-NEXT: pkhbt r0, r0, r4, lsl #16
+; CHECK-CORTEX-FIX-NEXT: pkhbt r2, r12, r2, lsl #16
+; CHECK-CORTEX-FIX-NEXT: pkhbt r3, r6, r3, lsl #16
+; CHECK-CORTEX-FIX-NEXT: vmov.32 d18[0], r3
+; CHECK-CORTEX-FIX-NEXT: vmov.32 d19[0], r7
+; CHECK-CORTEX-FIX-NEXT: vmov.32 d18[1], r2
+; CHECK-CORTEX-FIX-NEXT: vmov.32 d19[1], r0
+; CHECK-CORTEX-FIX-NEXT: aese.8 q8, q9
+; CHECK-CORTEX-FIX-NEXT: aesmc.8 q8, q8
; CHECK-CORTEX-FIX-NEXT: vst1.64 {d16, d17}, [r1]
-; CHECK-CORTEX-FIX-NEXT: add sp, sp, #12
-; CHECK-CORTEX-FIX-NEXT: pop {r4, r5, r6, r7, r8, r9, r10, r11, pc}
+; CHECK-CORTEX-FIX-NEXT: pop {r4, r5, r6, r7, r11, pc}
br i1 %0, label %5, label %11
5:
@@ -3507,38 +3450,22 @@ define arm_aapcs_vfpcc void @aesd_setf16_via_val(half %0, <16 x i8> %1, ptr %2)
define arm_aapcs_vfpcc void @aesd_setf16_cond_via_ptr(i1 zeroext %0, ptr %1, <16 x i8> %2, ptr %3) nounwind {
; CHECK-FIX-NOSCHED-LABEL: aesd_setf16_cond_via_ptr:
; CHECK-FIX-NOSCHED: @ %bb.0:
-; CHECK-FIX-NOSCHED-NEXT: .save {r4, r5, r6, r7, r8, r9, r10, r11, lr}
-; CHECK-FIX-NOSCHED-NEXT: push {r4, r5, r6, r7, r8, r9, r10, r11, lr}
-; CHECK-FIX-NOSCHED-NEXT: .pad #12
-; CHECK-FIX-NOSCHED-NEXT: sub sp, sp, #12
+; CHECK-FIX-NOSCHED-NEXT: .save {r4, r5, r6, r7, r8, lr}
+; CHECK-FIX-NOSCHED-NEXT: push {r4, r5, r6, r7, r8, lr}
; CHECK-FIX-NOSCHED-NEXT: cmp r0, #0
-; CHECK-FIX-NOSCHED-NEXT: beq .LBB82_3
+; CHECK-FIX-NOSCHED-NEXT: beq .LBB82_2
; CHECK-FIX-NOSCHED-NEXT: @ %bb.1:
; CHECK-FIX-NOSCHED-NEXT: vld1.64 {d16, d17}, [r2]
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r3, d17[3]
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r12, d17[3]
; CHECK-FIX-NOSCHED-NEXT: ldrh r7, [r1]
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r9, d17[0]
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r10, d16[3]
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r11, d16[2]
-; CHECK-FIX-NOSCHED-NEXT: str r3, [sp, #8] @ 4-byte Spill
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r3, d17[2]
-; CHECK-FIX-NOSCHED-NEXT: str r3, [sp, #4] @ 4-byte Spill
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r3, d17[1]
-; CHECK-FIX-NOSCHED-NEXT: str r3, [sp] @ 4-byte Spill
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 lr, d17[2]
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r8, d17[1]
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r4, d17[0]
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r5, d16[3]
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r6, d16[2]
; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r3, d16[1]
-; CHECK-FIX-NOSCHED-NEXT: cmp r0, #0
-; CHECK-FIX-NOSCHED-NEXT: bne .LBB82_4
+; CHECK-FIX-NOSCHED-NEXT: b .LBB82_3
; CHECK-FIX-NOSCHED-NEXT: .LBB82_2:
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r0, d1[3]
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r4, d1[2]
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r5, d1[1]
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r6, d1[0]
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r12, d0[3]
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 lr, d0[2]
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r8, d0[1]
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r1, d0[0]
-; CHECK-FIX-NOSCHED-NEXT: b .LBB82_5
-; CHECK-FIX-NOSCHED-NEXT: .LBB82_3:
; CHECK-FIX-NOSCHED-NEXT: add r3, r2, #8
; CHECK-FIX-NOSCHED-NEXT: vld1.32 {d16[0]}, [r2:32]
; CHECK-FIX-NOSCHED-NEXT: vld1.32 {d17[0]}, [r3:32]
@@ -3546,144 +3473,125 @@ define arm_aapcs_vfpcc void @aesd_setf16_cond_via_ptr(i1 zeroext %0, ptr %1, <16
; CHECK-FIX-NOSCHED-NEXT: vld1.32 {d16[1]}, [r3:32]
; CHECK-FIX-NOSCHED-NEXT: add r3, r2, #12
; CHECK-FIX-NOSCHED-NEXT: vld1.32 {d17[1]}, [r3:32]
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r3, d17[3]
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r9, d17[0]
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r10, d16[3]
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r11, d16[2]
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r7, d16[0]
-; CHECK-FIX-NOSCHED-NEXT: str r3, [sp, #8] @ 4-byte Spill
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r3, d17[2]
-; CHECK-FIX-NOSCHED-NEXT: str r3, [sp, #4] @ 4-byte Spill
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r3, d17[1]
-; CHECK-FIX-NOSCHED-NEXT: str r3, [sp] @ 4-byte Spill
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r12, d17[3]
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 lr, d17[2]
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r8, d17[1]
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r4, d17[0]
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r5, d16[3]
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r6, d16[2]
; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r3, d16[1]
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r7, d16[0]
+; CHECK-FIX-NOSCHED-NEXT: .LBB82_3:
+; CHECK-FIX-NOSCHED-NEXT: pkhbt r3, r7, r3, lsl #16
; CHECK-FIX-NOSCHED-NEXT: cmp r0, #0
-; CHECK-FIX-NOSCHED-NEXT: beq .LBB82_2
-; CHECK-FIX-NOSCHED-NEXT: .LBB82_4:
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r0, d1[3]
+; CHECK-FIX-NOSCHED-NEXT: vmov.32 d16[0], r3
+; CHECK-FIX-NOSCHED-NEXT: pkhbt r3, r4, r8, lsl #16
+; CHECK-FIX-NOSCHED-NEXT: vmov.32 d17[0], r3
+; CHECK-FIX-NOSCHED-NEXT: pkhbt r3, r6, r5, lsl #16
+; CHECK-FIX-NOSCHED-NEXT: vmov.32 d16[1], r3
+; CHECK-FIX-NOSCHED-NEXT: pkhbt r3, lr, r12, lsl #16
+; CHECK-FIX-NOSCHED-NEXT: vmov.32 d17[1], r3
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r12, d1[3]
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r3, d1[2]
+; CHECK-FIX-NOSCHED-NEXT: beq .LBB82_5
+; CHECK-FIX-NOSCHED-NEXT: @ %bb.4:
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r0, d1[1]
; CHECK-FIX-NOSCHED-NEXT: ldrh r1, [r1]
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r4, d1[2]
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r5, d1[1]
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r6, d1[0]
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r12, d0[3]
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 lr, d0[2]
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r8, d0[1]
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r4, d1[0]
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r5, d0[3]
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r6, d0[2]
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r7, d0[1]
+; CHECK-FIX-NOSCHED-NEXT: b .LBB82_6
; CHECK-FIX-NOSCHED-NEXT: .LBB82_5:
-; CHECK-FIX-NOSCHED-NEXT: pkhbt r1, r1, r8, lsl #16
-; CHECK-FIX-NOSCHED-NEXT: pkhbt r3, r7, r3, lsl #16
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r0, d1[1]
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r4, d1[0]
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r5, d0[3]
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r6, d0[2]
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r7, d0[1]
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r1, d0[0]
+; CHECK-FIX-NOSCHED-NEXT: .LBB82_6:
+; CHECK-FIX-NOSCHED-NEXT: pkhbt r1, r1, r7, lsl #16
; CHECK-FIX-NOSCHED-NEXT: pkhbt r0, r4, r0, lsl #16
; CHECK-FIX-NOSCHED-NEXT: vmov.32 d18[0], r1
-; CHECK-FIX-NOSCHED-NEXT: pkhbt r1, lr, r12, lsl #16
-; CHECK-FIX-NOSCHED-NEXT: vmov.32 d16[0], r3
-; CHECK-FIX-NOSCHED-NEXT: vmov.32 d18[1], r1
-; CHECK-FIX-NOSCHED-NEXT: pkhbt r1, r11, r10, lsl #16
-; CHECK-FIX-NOSCHED-NEXT: vmov.32 d16[1], r1
-; CHECK-FIX-NOSCHED-NEXT: pkhbt r1, r6, r5, lsl #16
-; CHECK-FIX-NOSCHED-NEXT: vmov.32 d19[0], r1
-; CHECK-FIX-NOSCHED-NEXT: ldr r1, [sp] @ 4-byte Reload
-; CHECK-FIX-NOSCHED-NEXT: pkhbt r1, r9, r1, lsl #16
+; CHECK-FIX-NOSCHED-NEXT: vmov.32 d19[0], r0
+; CHECK-FIX-NOSCHED-NEXT: pkhbt r0, r6, r5, lsl #16
+; CHECK-FIX-NOSCHED-NEXT: vmov.32 d18[1], r0
+; CHECK-FIX-NOSCHED-NEXT: pkhbt r0, r3, r12, lsl #16
; CHECK-FIX-NOSCHED-NEXT: vmov.32 d19[1], r0
-; CHECK-FIX-NOSCHED-NEXT: ldr r0, [sp, #8] @ 4-byte Reload
-; CHECK-FIX-NOSCHED-NEXT: vmov.32 d17[0], r1
-; CHECK-FIX-NOSCHED-NEXT: ldr r1, [sp, #4] @ 4-byte Reload
-; CHECK-FIX-NOSCHED-NEXT: pkhbt r0, r1, r0, lsl #16
-; CHECK-FIX-NOSCHED-NEXT: vmov.32 d17[1], r0
; CHECK-FIX-NOSCHED-NEXT: aesd.8 q8, q9
; CHECK-FIX-NOSCHED-NEXT: aesimc.8 q8, q8
; CHECK-FIX-NOSCHED-NEXT: vst1.64 {d16, d17}, [r2]
-; CHECK-FIX-NOSCHED-NEXT: add sp, sp, #12
-; CHECK-FIX-NOSCHED-NEXT: pop {r4, r5, r6, r7, r8, r9, r10, r11, pc}
+; CHECK-FIX-NOSCHED-NEXT: pop {r4, r5, r6, r7, r8, pc}
;
; CHECK-CORTEX-FIX-LABEL: aesd_setf16_cond_via_ptr:
; CHECK-CORTEX-FIX: @ %bb.0:
-; CHECK-CORTEX-FIX-NEXT: .save {r4, r5, r6, r7, r8, r9, r10, r11, lr}
-; CHECK-CORTEX-FIX-NEXT: push {r4, r5, r6, r7, r8, r9, r10, r11, lr}
-; CHECK-CORTEX-FIX-NEXT: .pad #24
-; CHECK-CORTEX-FIX-NEXT: sub sp, sp, #24
+; CHECK-CORTEX-FIX-NEXT: .save {r4, r5, r6, r7, r8, lr}
+; CHECK-CORTEX-FIX-NEXT: push {r4, r5, r6, r7, r8, lr}
; CHECK-CORTEX-FIX-NEXT: cmp r0, #0
-; CHECK-CORTEX-FIX-NEXT: beq .LBB82_3
+; CHECK-CORTEX-FIX-NEXT: beq .LBB82_2
; CHECK-CORTEX-FIX-NEXT: @ %bb.1:
; CHECK-CORTEX-FIX-NEXT: vld1.64 {d16, d17}, [r2]
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r3, d16[1]
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r6, d17[0]
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r7, d17[2]
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r4, d17[3]
-; CHECK-CORTEX-FIX-NEXT: str r3, [sp, #20] @ 4-byte Spill
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r3, d16[2]
-; CHECK-CORTEX-FIX-NEXT: str r3, [sp, #8] @ 4-byte Spill
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r3, d16[3]
-; CHECK-CORTEX-FIX-NEXT: str r3, [sp, #4] @ 4-byte Spill
+; CHECK-CORTEX-FIX-NEXT: ldrh r4, [r1]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r8, d16[1]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r12, d16[2]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 lr, d16[3]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r7, d17[0]
; CHECK-CORTEX-FIX-NEXT: vmov.u16 r3, d17[1]
-; CHECK-CORTEX-FIX-NEXT: str r3, [sp, #12] @ 4-byte Spill
-; CHECK-CORTEX-FIX-NEXT: ldrh r3, [r1]
-; CHECK-CORTEX-FIX-NEXT: str r3, [sp, #16] @ 4-byte Spill
-; CHECK-CORTEX-FIX-NEXT: mov r3, r6
-; CHECK-CORTEX-FIX-NEXT: cmp r0, #0
-; CHECK-CORTEX-FIX-NEXT: bne .LBB82_4
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r5, d17[2]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r6, d17[3]
+; CHECK-CORTEX-FIX-NEXT: b .LBB82_3
; CHECK-CORTEX-FIX-NEXT: .LBB82_2:
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r0, d0[0]
-; CHECK-CORTEX-FIX-NEXT: b .LBB82_5
-; CHECK-CORTEX-FIX-NEXT: .LBB82_3:
-; CHECK-CORTEX-FIX-NEXT: vld1.32 {d16[0]}, [r2:32]
; CHECK-CORTEX-FIX-NEXT: add r3, r2, #8
+; CHECK-CORTEX-FIX-NEXT: vld1.32 {d16[0]}, [r2:32]
; CHECK-CORTEX-FIX-NEXT: add r7, r2, #4
; CHECK-CORTEX-FIX-NEXT: vld1.32 {d17[0]}, [r3:32]
; CHECK-CORTEX-FIX-NEXT: add r3, r2, #12
; CHECK-CORTEX-FIX-NEXT: vld1.32 {d16[1]}, [r7:32]
; CHECK-CORTEX-FIX-NEXT: vld1.32 {d17[1]}, [r3:32]
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r3, d16[0]
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r7, d17[1]
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r4, d17[3]
-; CHECK-CORTEX-FIX-NEXT: str r3, [sp, #16] @ 4-byte Spill
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r3, d16[1]
-; CHECK-CORTEX-FIX-NEXT: str r7, [sp, #12] @ 4-byte Spill
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r7, d17[2]
-; CHECK-CORTEX-FIX-NEXT: str r3, [sp, #20] @ 4-byte Spill
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r3, d16[2]
-; CHECK-CORTEX-FIX-NEXT: str r3, [sp, #8] @ 4-byte Spill
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r3, d16[3]
-; CHECK-CORTEX-FIX-NEXT: str r3, [sp, #4] @ 4-byte Spill
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r3, d17[0]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r4, d16[0]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r8, d16[1]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r12, d16[2]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 lr, d16[3]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r7, d17[0]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r3, d17[1]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r5, d17[2]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r6, d17[3]
+; CHECK-CORTEX-FIX-NEXT: .LBB82_3:
+; CHECK-CORTEX-FIX-NEXT: pkhbt r3, r7, r3, lsl #16
+; CHECK-CORTEX-FIX-NEXT: pkhbt r4, r4, r8, lsl #16
+; CHECK-CORTEX-FIX-NEXT: pkhbt r7, r12, lr, lsl #16
; CHECK-CORTEX-FIX-NEXT: cmp r0, #0
-; CHECK-CORTEX-FIX-NEXT: beq .LBB82_2
-; CHECK-CORTEX-FIX-NEXT: .LBB82_4:
-; CHECK-CORTEX-FIX-NEXT: ldrh r0, [r1]
+; CHECK-CORTEX-FIX-NEXT: vmov.32 d16[0], r4
+; CHECK-CORTEX-FIX-NEXT: vmov.32 d17[0], r3
+; CHECK-CORTEX-FIX-NEXT: pkhbt r3, r5, r6, lsl #16
+; CHECK-CORTEX-FIX-NEXT: vmov.32 d16[1], r7
+; CHECK-CORTEX-FIX-NEXT: vmov.32 d17[1], r3
+; CHECK-CORTEX-FIX-NEXT: beq .LBB82_5
+; CHECK-CORTEX-FIX-NEXT: @ %bb.4:
+; CHECK-CORTEX-FIX-NEXT: ldrh r3, [r1]
+; CHECK-CORTEX-FIX-NEXT: b .LBB82_6
; CHECK-CORTEX-FIX-NEXT: .LBB82_5:
-; CHECK-CORTEX-FIX-NEXT: str r0, [sp] @ 4-byte Spill
-; CHECK-CORTEX-FIX-NEXT: ldr r0, [sp, #8] @ 4-byte Reload
-; CHECK-CORTEX-FIX-NEXT: ldr r1, [sp, #4] @ 4-byte Reload
-; CHECK-CORTEX-FIX-NEXT: pkhbt r9, r7, r4, lsl #16
-; CHECK-CORTEX-FIX-NEXT: ldr r4, [sp, #20] @ 4-byte Reload
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r10, d0[1]
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r6, d0[2]
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r12, d0[3]
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r11, d1[0]
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r5, d1[1]
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 lr, d1[2]
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r8, d1[3]
-; CHECK-CORTEX-FIX-NEXT: pkhbt r7, r0, r1, lsl #16
-; CHECK-CORTEX-FIX-NEXT: ldr r1, [sp, #12] @ 4-byte Reload
-; CHECK-CORTEX-FIX-NEXT: pkhbt r0, lr, r8, lsl #16
-; CHECK-CORTEX-FIX-NEXT: pkhbt r6, r6, r12, lsl #16
-; CHECK-CORTEX-FIX-NEXT: pkhbt r5, r11, r5, lsl #16
-; CHECK-CORTEX-FIX-NEXT: pkhbt r1, r3, r1, lsl #16
-; CHECK-CORTEX-FIX-NEXT: ldr r3, [sp, #16] @ 4-byte Reload
-; CHECK-CORTEX-FIX-NEXT: pkhbt r4, r3, r4, lsl #16
-; CHECK-CORTEX-FIX-NEXT: ldr r3, [sp] @ 4-byte Reload
-; CHECK-CORTEX-FIX-NEXT: vmov.32 d18[0], r4
-; CHECK-CORTEX-FIX-NEXT: vmov.32 d19[0], r1
-; CHECK-CORTEX-FIX-NEXT: vmov.32 d18[1], r7
-; CHECK-CORTEX-FIX-NEXT: vmov.32 d19[1], r9
-; CHECK-CORTEX-FIX-NEXT: pkhbt r3, r3, r10, lsl #16
-; CHECK-CORTEX-FIX-NEXT: vmov.32 d16[0], r3
-; CHECK-CORTEX-FIX-NEXT: vmov.32 d17[0], r5
-; CHECK-CORTEX-FIX-NEXT: vmov.32 d16[1], r6
-; CHECK-CORTEX-FIX-NEXT: vmov.32 d17[1], r0
-; CHECK-CORTEX-FIX-NEXT: aesd.8 q9, q8
-; CHECK-CORTEX-FIX-NEXT: aesimc.8 q8, q9
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r3, d0[0]
+; CHECK-CORTEX-FIX-NEXT: .LBB82_6:
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r0, d0[1]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r12, d0[2]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r1, d0[3]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r7, d1[0]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r4, d1[1]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r5, d1[2]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r6, d1[3]
+; CHECK-CORTEX-FIX-NEXT: pkhbt r0, r3, r0, lsl #16
+; CHECK-CORTEX-FIX-NEXT: pkhbt r7, r7, r4, lsl #16
+; CHECK-CORTEX-FIX-NEXT: pkhbt r1, r12, r1, lsl #16
+; CHECK-CORTEX-FIX-NEXT: vmov.32 d18[0], r0
+; CHECK-CORTEX-FIX-NEXT: pkhbt r0, r5, r6, lsl #16
+; CHECK-CORTEX-FIX-NEXT: vmov.32 d19[0], r7
+; CHECK-CORTEX-FIX-NEXT: vmov.32 d18[1], r1
+; CHECK-CORTEX-FIX-NEXT: vmov.32 d19[1], r0
+; CHECK-CORTEX-FIX-NEXT: aesd.8 q8, q9
+; CHECK-CORTEX-FIX-NEXT: aesimc.8 q8, q8
; CHECK-CORTEX-FIX-NEXT: vst1.64 {d16, d17}, [r2]
-; CHECK-CORTEX-FIX-NEXT: add sp, sp, #24
-; CHECK-CORTEX-FIX-NEXT: pop {r4, r5, r6, r7, r8, r9, r10, r11, pc}
+; CHECK-CORTEX-FIX-NEXT: pop {r4, r5, r6, r7, r8, pc}
br i1 %0, label %5, label %12
5:
@@ -3729,25 +3637,20 @@ define arm_aapcs_vfpcc void @aesd_setf16_cond_via_ptr(i1 zeroext %0, ptr %1, <16
define arm_aapcs_vfpcc void @aesd_setf16_cond_via_val(i1 zeroext %0, half %1, <16 x i8> %2, ptr %3) nounwind {
; CHECK-FIX-NOSCHED-LABEL: aesd_setf16_cond_via_val:
; CHECK-FIX-NOSCHED: @ %bb.0:
-; CHECK-FIX-NOSCHED-NEXT: .save {r4, r5, r6, r7, r8, r9, r10, r11, lr}
-; CHECK-FIX-NOSCHED-NEXT: push {r4, r5, r6, r7, r8, r9, r10, r11, lr}
-; CHECK-FIX-NOSCHED-NEXT: .pad #12
-; CHECK-FIX-NOSCHED-NEXT: sub sp, sp, #12
+; CHECK-FIX-NOSCHED-NEXT: .save {r4, r5, r6, r7, r11, lr}
+; CHECK-FIX-NOSCHED-NEXT: push {r4, r5, r6, r7, r11, lr}
; CHECK-FIX-NOSCHED-NEXT: cmp r0, #0
; CHECK-FIX-NOSCHED-NEXT: beq .LBB83_2
; CHECK-FIX-NOSCHED-NEXT: @ %bb.1:
; CHECK-FIX-NOSCHED-NEXT: vld1.64 {d16, d17}, [r1]
; CHECK-FIX-NOSCHED-NEXT: vmov.f32 s2, s0
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r2, d17[1]
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r7, d17[3]
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r12, d17[3]
; CHECK-FIX-NOSCHED-NEXT: vmov.u16 lr, d17[2]
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r11, d16[2]
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r8, d16[1]
-; CHECK-FIX-NOSCHED-NEXT: str r2, [sp, #8] @ 4-byte Spill
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r2, d17[0]
-; CHECK-FIX-NOSCHED-NEXT: str r2, [sp, #4] @ 4-byte Spill
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r2, d16[3]
-; CHECK-FIX-NOSCHED-NEXT: str r2, [sp] @ 4-byte Spill
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r2, d17[1]
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r3, d17[0]
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r4, d16[3]
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r5, d16[2]
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r6, d16[1]
; CHECK-FIX-NOSCHED-NEXT: b .LBB83_3
; CHECK-FIX-NOSCHED-NEXT: .LBB83_2:
; CHECK-FIX-NOSCHED-NEXT: add r2, r1, #8
@@ -3757,99 +3660,76 @@ define arm_aapcs_vfpcc void @aesd_setf16_cond_via_val(i1 zeroext %0, half %1, <1
; CHECK-FIX-NOSCHED-NEXT: vld1.32 {d16[1]}, [r2:32]
; CHECK-FIX-NOSCHED-NEXT: add r2, r1, #12
; CHECK-FIX-NOSCHED-NEXT: vld1.32 {d17[1]}, [r2:32]
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r2, d17[1]
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r7, d17[3]
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r7, d16[0]
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r12, d17[3]
; CHECK-FIX-NOSCHED-NEXT: vmov.u16 lr, d17[2]
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r11, d16[2]
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r8, d16[1]
-; CHECK-FIX-NOSCHED-NEXT: str r2, [sp, #8] @ 4-byte Spill
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r2, d17[0]
-; CHECK-FIX-NOSCHED-NEXT: str r2, [sp, #4] @ 4-byte Spill
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r2, d16[3]
-; CHECK-FIX-NOSCHED-NEXT: str r2, [sp] @ 4-byte Spill
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r2, d16[0]
-; CHECK-FIX-NOSCHED-NEXT: vmov s2, r2
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r2, d17[1]
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r3, d17[0]
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r4, d16[3]
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r5, d16[2]
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r6, d16[1]
+; CHECK-FIX-NOSCHED-NEXT: vmov s2, r7
; CHECK-FIX-NOSCHED-NEXT: .LBB83_3:
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r9, d3[3]
+; CHECK-FIX-NOSCHED-NEXT: vmov r7, s2
+; CHECK-FIX-NOSCHED-NEXT: pkhbt r2, r3, r2, lsl #16
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r3, d3[1]
; CHECK-FIX-NOSCHED-NEXT: cmp r0, #0
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r10, d3[2]
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r2, d3[1]
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r3, d3[0]
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r4, d2[3]
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r5, d2[2]
+; CHECK-FIX-NOSCHED-NEXT: pkhbt r6, r7, r6, lsl #16
+; CHECK-FIX-NOSCHED-NEXT: vmov.32 d16[0], r6
+; CHECK-FIX-NOSCHED-NEXT: vmov.32 d17[0], r2
+; CHECK-FIX-NOSCHED-NEXT: pkhbt r2, r5, r4, lsl #16
+; CHECK-FIX-NOSCHED-NEXT: vmov.32 d16[1], r2
+; CHECK-FIX-NOSCHED-NEXT: pkhbt r2, lr, r12, lsl #16
+; CHECK-FIX-NOSCHED-NEXT: vmov.32 d17[1], r2
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r12, d3[3]
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r2, d3[2]
; CHECK-FIX-NOSCHED-NEXT: beq .LBB83_5
; CHECK-FIX-NOSCHED-NEXT: @ %bb.4:
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r12, d2[1]
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r0, d3[0]
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r4, d2[3]
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r5, d2[2]
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r6, d2[1]
; CHECK-FIX-NOSCHED-NEXT: b .LBB83_6
; CHECK-FIX-NOSCHED-NEXT: .LBB83_5:
-; CHECK-FIX-NOSCHED-NEXT: mov r0, lr
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 lr, d2[0]
-; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r12, d2[1]
-; CHECK-FIX-NOSCHED-NEXT: vmov s0, lr
-; CHECK-FIX-NOSCHED-NEXT: mov lr, r0
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r7, d2[0]
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r0, d3[0]
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r4, d2[3]
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r5, d2[2]
+; CHECK-FIX-NOSCHED-NEXT: vmov.u16 r6, d2[1]
+; CHECK-FIX-NOSCHED-NEXT: vmov s0, r7
; CHECK-FIX-NOSCHED-NEXT: .LBB83_6:
-; CHECK-FIX-NOSCHED-NEXT: vmov r0, s0
-; CHECK-FIX-NOSCHED-NEXT: vmov r6, s2
-; CHECK-FIX-NOSCHED-NEXT: pkhbt r0, r0, r12, lsl #16
-; CHECK-FIX-NOSCHED-NEXT: pkhbt r6, r6, r8, lsl #16
-; CHECK-FIX-NOSCHED-NEXT: vmov.32 d18[0], r0
+; CHECK-FIX-NOSCHED-NEXT: vmov r7, s0
+; CHECK-FIX-NOSCHED-NEXT: pkhbt r0, r0, r3, lsl #16
+; CHECK-FIX-NOSCHED-NEXT: pkhbt r7, r7, r6, lsl #16
+; CHECK-FIX-NOSCHED-NEXT: vmov.32 d18[0], r7
+; CHECK-FIX-NOSCHED-NEXT: vmov.32 d19[0], r0
; CHECK-FIX-NOSCHED-NEXT: pkhbt r0, r5, r4, lsl #16
-; CHECK-FIX-NOSCHED-NEXT: vmov.32 d16[0], r6
; CHECK-FIX-NOSCHED-NEXT: vmov.32 d18[1], r0
-; CHECK-FIX-NOSCHED-NEXT: ldr r0, [sp] @ 4-byte Reload
-; CHECK-FIX-NOSCHED-NEXT: pkhbt r0, r11, r0, lsl #16
-; CHECK-FIX-NOSCHED-NEXT: vmov.32 d16[1], r0
-; CHECK-FIX-NOSCHED-NEXT: pkhbt r0, r3, r2, lsl #16
-; CHECK-FIX-NOSCHED-NEXT: ldr r2, [sp, #4] @ 4-byte Reload
-; CHECK-FIX-NOSCHED-NEXT: vmov.32 d19[0], r0
-; CHECK-FIX-NOSCHED-NEXT: ldr r0, [sp, #8] @ 4-byte Reload
-; CHECK-FIX-NOSCHED-NEXT: pkhbt r0, r2, r0, lsl #16
-; CHECK-FIX-NOSCHED-NEXT: vmov.32 d17[0], r0
-; CHECK-FIX-NOSCHED-NEXT: pkhbt r0, r10, r9, lsl #16
+; CHECK-FIX-NOSCHED-NEXT: pkhbt r0, r2, r12, lsl #16
; CHECK-FIX-NOSCHED-NEXT: vmov.32 d19[1], r0
-; CHECK-FIX-NOSCHED-NEXT: pkhbt r0, lr, r7, lsl #16
-; CHECK-FIX-NOSCHED-NEXT: vmov.32 d17[1], r0
; CHECK-FIX-NOSCHED-NEXT: aesd.8 q8, q9
; CHECK-FIX-NOSCHED-NEXT: aesimc.8 q8, q8
; CHECK-FIX-NOSCHED-NEXT: vst1.64 {d16, d17}, [r1]
-; CHECK-FIX-NOSCHED-NEXT: add sp, sp, #12
-; CHECK-FIX-NOSCHED-NEXT: pop {r4, r5, r6, r7, r8, r9, r10, r11, pc}
+; CHECK-FIX-NOSCHED-NEXT: pop {r4, r5, r6, r7, r11, pc}
;
; CHECK-CORTEX-FIX-LABEL: aesd_setf16_cond_via_val:
; CHECK-CORTEX-FIX: @ %bb.0:
-; CHECK-CORTEX-FIX-NEXT: .save {r4, r5, r6, r7, r8, r9, r10, r11, lr}
-; CHECK-CORTEX-FIX-NEXT: push {r4, r5, r6, r7, r8, r9, r10, r11, lr}
-; CHECK-CORTEX-FIX-NEXT: .pad #12
-; CHECK-CORTEX-FIX-NEXT: sub sp, sp, #12
+; CHECK-CORTEX-FIX-NEXT: .save {r4, r5, r6, r7, r11, lr}
+; CHECK-CORTEX-FIX-NEXT: push {r4, r5, r6, r7, r11, lr}
; CHECK-CORTEX-FIX-NEXT: cmp r0, #0
-; CHECK-CORTEX-FIX-NEXT: beq .LBB83_3
+; CHECK-CORTEX-FIX-NEXT: beq .LBB83_2
; CHECK-CORTEX-FIX-NEXT: @ %bb.1:
; CHECK-CORTEX-FIX-NEXT: vld1.64 {d16, d17}, [r1]
; CHECK-CORTEX-FIX-NEXT: vmov.f32 s2, s0
; CHECK-CORTEX-FIX-NEXT: vmov.u16 r2, d16[1]
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r7, d16[2]
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r10, d16[3]
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r11, d17[2]
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r6, d17[3]
-; CHECK-CORTEX-FIX-NEXT: str r2, [sp, #8] @ 4-byte Spill
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r2, d17[0]
-; CHECK-CORTEX-FIX-NEXT: str r2, [sp, #4] @ 4-byte Spill
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r2, d17[1]
-; CHECK-CORTEX-FIX-NEXT: str r2, [sp] @ 4-byte Spill
-; CHECK-CORTEX-FIX-NEXT: cmp r0, #0
-; CHECK-CORTEX-FIX-NEXT: bne .LBB83_4
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r12, d16[2]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 lr, d16[3]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r5, d17[0]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r6, d17[1]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r3, d17[2]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r4, d17[3]
+; CHECK-CORTEX-FIX-NEXT: b .LBB83_3
; CHECK-CORTEX-FIX-NEXT: .LBB83_2:
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 lr, d2[0]
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r8, d2[1]
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r3, d2[2]
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r4, d2[3]
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r9, d3[0]
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r2, d3[1]
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r5, d3[2]
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r12, d3[3]
-; CHECK-CORTEX-FIX-NEXT: vmov s0, lr
-; CHECK-CORTEX-FIX-NEXT: b .LBB83_5
-; CHECK-CORTEX-FIX-NEXT: .LBB83_3:
; CHECK-CORTEX-FIX-NEXT: vld1.32 {d16[0]}, [r1:32]
; CHECK-CORTEX-FIX-NEXT: add r2, r1, #8
; CHECK-CORTEX-FIX-NEXT: add r3, r1, #4
@@ -3857,54 +3737,60 @@ define arm_aapcs_vfpcc void @aesd_setf16_cond_via_val(i1 zeroext %0, half %1, <1
; CHECK-CORTEX-FIX-NEXT: add r2, r1, #12
; CHECK-CORTEX-FIX-NEXT: vld1.32 {d16[1]}, [r3:32]
; CHECK-CORTEX-FIX-NEXT: vld1.32 {d17[1]}, [r2:32]
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r3, d16[1]
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r2, d16[0]
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r7, d16[2]
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r10, d16[3]
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r11, d17[2]
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r6, d17[3]
-; CHECK-CORTEX-FIX-NEXT: str r3, [sp, #8] @ 4-byte Spill
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r3, d17[0]
-; CHECK-CORTEX-FIX-NEXT: vmov s2, r2
-; CHECK-CORTEX-FIX-NEXT: str r3, [sp, #4] @ 4-byte Spill
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r3, d17[1]
-; CHECK-CORTEX-FIX-NEXT: str r3, [sp] @ 4-byte Spill
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r7, d16[0]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r2, d16[1]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r12, d16[2]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 lr, d16[3]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r5, d17[0]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r6, d17[1]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r3, d17[2]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r4, d17[3]
+; CHECK-CORTEX-FIX-NEXT: vmov s2, r7
+; CHECK-CORTEX-FIX-NEXT: .LBB83_3:
+; CHECK-CORTEX-FIX-NEXT: pkhbt r5, r5, r6, lsl #16
+; CHECK-CORTEX-FIX-NEXT: vmov r6, s2
; CHECK-CORTEX-FIX-NEXT: cmp r0, #0
-; CHECK-CORTEX-FIX-NEXT: beq .LBB83_2
-; CHECK-CORTEX-FIX-NEXT: .LBB83_4:
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r8, d2[1]
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r3, d2[2]
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r4, d2[3]
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r9, d3[0]
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r2, d3[1]
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r5, d3[2]
-; CHECK-CORTEX-FIX-NEXT: vmov.u16 r12, d3[3]
+; CHECK-CORTEX-FIX-NEXT: pkhbt r2, r6, r2, lsl #16
+; CHECK-CORTEX-FIX-NEXT: vmov.32 d16[0], r2
+; CHECK-CORTEX-FIX-NEXT: pkhbt r2, r3, r4, lsl #16
+; CHECK-CORTEX-FIX-NEXT: pkhbt r3, r12, lr, lsl #16
+; CHECK-CORTEX-FIX-NEXT: vmov.32 d17[0], r5
+; CHECK-CORTEX-FIX-NEXT: vmov.32 d16[1], r3
+; CHECK-CORTEX-FIX-NEXT: vmov.32 d17[1], r2
+; CHECK-CORTEX-FIX-NEXT: beq .LBB83_5
+; CHECK-CORTEX-FIX-NEXT: @ %bb.4:
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r3, d2[1]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r12, d2[2]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r2, d2[3]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r5, d3[0]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r6, d3[1]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r0, d3[2]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r4, d3[3]
+; CHECK-CORTEX-FIX-NEXT: b .LBB83_6
; CHECK-CORTEX-FIX-NEXT: .LBB83_5:
-; CHECK-CORTEX-FIX-NEXT: pkhbt lr, r11, r6, lsl #16
-; CHECK-CORTEX-FIX-NEXT: pkhbt r0, r7, r10, lsl #16
-; CHECK-CORTEX-FIX-NEXT: ldm sp, {r6, r7} @ 8-byte Folded Reload
-; CHECK-CORTEX-FIX-NEXT: pkhbt r3, r3, r4, lsl #16
-; CHECK-CORTEX-FIX-NEXT: pkhbt r5, r5, r12, lsl #16
-; CHECK-CORTEX-FIX-NEXT: pkhbt r2, r9, r2, lsl #16
-; CHECK-CORTEX-FIX-NEXT: pkhbt r4, r7, r6, lsl #16
-; CHECK-CORTEX-FIX-NEXT: vmov r7, s2
-; CHECK-CORTEX-FIX-NEXT: ldr r6, [sp, #8] @ 4-byte Reload
-; CHECK-CORTEX-FIX-NEXT: pkhbt r7, r7, r6, lsl #16
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r7, d2[0]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r3, d2[1]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r12, d2[2]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r2, d2[3]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r5, d3[0]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r6, d3[1]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r0, d3[2]
+; CHECK-CORTEX-FIX-NEXT: vmov.u16 r4, d3[3]
+; CHECK-CORTEX-FIX-NEXT: vmov s0, r7
+; CHECK-CORTEX-FIX-NEXT: .LBB83_6:
+; CHECK-CORTEX-FIX-NEXT: pkhbt r7, r5, r6, lsl #16
; CHECK-CORTEX-FIX-NEXT: vmov r6, s0
-; CHECK-CORTEX-FIX-NEXT: vmov.32 d18[0], r7
-; CHECK-CORTEX-FIX-NEXT: vmov.32 d19[0], r4
-; CHECK-CORTEX-FIX-NEXT: vmov.32 d18[1], r0
-; CHECK-CORTEX-FIX-NEXT: vmov.32 d19[1], lr
-; CHECK-CORTEX-FIX-NEXT: pkhbt r6, r6, r8, lsl #16
-; CHECK-CORTEX-FIX-NEXT: vmov.32 d16[0], r6
-; CHECK-CORTEX-FIX-NEXT: vmov.32 d17[0], r2
-; CHECK-CORTEX-FIX-NEXT: vmov.32 d16[1], r3
-; CHECK-CORTEX-FIX-NEXT: vmov.32 d17[1], r5
-; CHECK-CORTEX-FIX-NEXT: aesd.8 q9, q8
-; CHECK-CORTEX-FIX-NEXT: aesimc.8 q8, q9
+; CHECK-CORTEX-FIX-NEXT: pkhbt r0, r0, r4, lsl #16
+; CHECK-CORTEX-FIX-NEXT: pkhbt r2, r12, r2, lsl #16
+; CHECK-CORTEX-FIX-NEXT: pkhbt r3, r6, r3, lsl #16
+; CHECK-CORTEX-FIX-NEXT: vmov.32 d18[0], r3
+; CHECK-CORTEX-FIX-NEXT: vmov.32 d19[0], r7
+; CHECK-CORTEX-FIX-NEXT: vmov.32 d18[1], r2
+; CHECK-CORTEX-FIX-NEXT: vmov.32 d19[1], r0
+; CHECK-CORTEX-FIX-NEXT: aesd.8 q8, q9
+; CHECK-CORTEX-FIX-NEXT: aesimc.8 q8, q8
; CHECK-CORTEX-FIX-NEXT: vst1.64 {d16, d17}, [r1]
-; CHECK-CORTEX-FIX-NEXT: add sp, sp, #12
-; CHECK-CORTEX-FIX-NEXT: pop {r4, r5, r6, r7, r8, r9, r10, r11, pc}
+; CHECK-CORTEX-FIX-NEXT: pop {r4, r5, r6, r7, r11, pc}
br i1 %0, label %5, label %11
5:
diff --git a/llvm/test/Transforms/CodeGenPrepare/X86/hoist-bitcast-i686.ll b/llvm/test/Transforms/CodeGenPrepare/X86/hoist-bitcast-i686.ll
new file mode 100644
index 0000000000000..daf3e571174e4
--- /dev/null
+++ b/llvm/test/Transforms/CodeGenPrepare/X86/hoist-bitcast-i686.ll
@@ -0,0 +1,27 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt -S -passes='require<profile-summary>,codegenprepare' -mtriple=i686-unknown-linux-gnu -mattr=+sse2 < %s | FileCheck %s
+
+define double @test_hoist_bitcast_i64_to_double(i1 %cond, i64 %a) {
+; CHECK-LABEL: @test_hoist_bitcast_i64_to_double(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: [[ADD:%.*]] = add i64 [[A:%.*]], 1
+; CHECK-NEXT: [[BC_HOISTED:%.*]] = bitcast i64 [[ADD]] to double
+; CHECK-NEXT: br i1 [[COND:%.*]], label [[IF_THEN:%.*]], label [[EXIT:%.*]]
+; CHECK: if.then:
+; CHECK-NEXT: br label [[EXIT]]
+; CHECK: exit:
+; CHECK-NEXT: [[RES:%.*]] = phi double [ [[BC_HOISTED]], [[IF_THEN]] ], [ 0.000000e+00, [[ENTRY:%.*]] ]
+; CHECK-NEXT: ret double [[RES]]
+;
+entry:
+ %add = add i64 %a, 1
+ br i1 %cond, label %if.then, label %exit
+
+if.then:
+ %bc = bitcast i64 %add to double
+ br label %exit
+
+exit:
+ %res = phi double [ %bc, %if.then ], [ 0.0, %entry ]
+ ret double %res
+}
diff --git a/llvm/test/Transforms/CodeGenPrepare/X86/hoist-bitcast-integer-to-vector.ll b/llvm/test/Transforms/CodeGenPrepare/X86/hoist-bitcast-integer-to-vector.ll
new file mode 100644
index 0000000000000..f475b3c551b51
--- /dev/null
+++ b/llvm/test/Transforms/CodeGenPrepare/X86/hoist-bitcast-integer-to-vector.ll
@@ -0,0 +1,63 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt -codegenprepare -mtriple=x86_64-unknown-linux-gnu -mattr=+avx2 -S < %s | FileCheck %s
+
+define i8 @hoist_bitcast_i256_to_v32i8(ptr %a0) {
+; CHECK-LABEL: @hoist_bitcast_i256_to_v32i8(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: [[SRC256:%.*]] = load i256, ptr [[A0:%.*]], align 1
+; CHECK-NEXT: [[SRC256_BITCAST:%.*]] = bitcast i256 [[SRC256]] to <32 x i8>
+; CHECK-NEXT: [[ISZERO:%.*]] = icmp eq i256 [[SRC256]], 0
+; CHECK-NEXT: br i1 [[ISZERO]], label [[EXIT:%.*]], label [[REDUCTION:%.*]]
+; CHECK: reduction:
+; CHECK-NEXT: [[RED:%.*]] = call i8 @llvm.vector.reduce.umax.v32i8(<32 x i8> [[SRC256_BITCAST]])
+; CHECK-NEXT: br label [[EXIT]]
+; CHECK: exit:
+; CHECK-NEXT: [[RESULT:%.*]] = phi i8 [ 0, [[ENTRY:%.*]] ], [ [[RED]], [[REDUCTION]] ]
+; CHECK-NEXT: ret i8 [[RESULT]]
+;
+entry:
+ %src256 = load i256, ptr %a0, align 1
+ %iszero = icmp eq i256 %src256, 0
+ br i1 %iszero, label %exit, label %reduction
+
+reduction:
+ %src256.bitcast = bitcast i256 %src256 to <32 x i8>
+ %red = call i8 @llvm.vector.reduce.umax.v32i8(<32 x i8> %src256.bitcast)
+ br label %exit
+
+exit:
+ %result = phi i8 [ 0, %entry ], [ %red, %reduction ]
+ ret i8 %result
+}
+
+define i8 @test_legal_i64(ptr %a0) {
+; CHECK-LABEL: @test_legal_i64(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: [[SRC64:%.*]] = load i64, ptr [[A0:%.*]], align 8
+; CHECK-NEXT: [[ISZERO:%.*]] = icmp eq i64 [[SRC64]], 0
+; CHECK-NEXT: br i1 [[ISZERO]], label [[EXIT:%.*]], label [[REDUCTION:%.*]]
+; CHECK: reduction:
+; CHECK-NEXT: [[SRC64_BITCAST:%.*]] = bitcast i64 [[SRC64]] to <8 x i8>
+; CHECK-NEXT: [[RED:%.*]] = call i8 @llvm.vector.reduce.umax.v8i8(<8 x i8> [[SRC64_BITCAST]])
+; CHECK-NEXT: br label [[EXIT]]
+; CHECK: exit:
+; CHECK-NEXT: [[RESULT:%.*]] = phi i8 [ 0, [[ENTRY:%.*]] ], [ [[RED]], [[REDUCTION]] ]
+; CHECK-NEXT: ret i8 [[RESULT]]
+;
+entry:
+ %src64 = load i64, ptr %a0, align 8
+ %iszero = icmp eq i64 %src64, 0
+ br i1 %iszero, label %exit, label %reduction
+
+reduction:
+ %src64.bitcast = bitcast i64 %src64 to <8 x i8>
+ %red = call i8 @llvm.vector.reduce.umax.v8i8(<8 x i8> %src64.bitcast)
+ br label %exit
+
+exit:
+ %result = phi i8 [ 0, %entry ], [ %red, %reduction ]
+ ret i8 %result
+}
+
+declare i8 @llvm.vector.reduce.umax.v8i8(<8 x i8>)
+declare i8 @llvm.vector.reduce.umax.v32i8(<32 x i8>)
More information about the llvm-commits
mailing list