[ARM] Add more opaque pointer gather/scatter tests. NFC
Some of the newly added tests are incorrect, fixed in D127733.
This commit is contained in:
parent
bd61664167
commit
1da6940275
|
@ -964,7 +964,7 @@ static bool hasAllGatScatUsers(Instruction *I, const DataLayout &DL) {
|
|||
|
||||
bool MVEGatherScatterLowering::optimiseOffsets(Value *Offsets, BasicBlock *BB,
|
||||
LoopInfo *LI) {
|
||||
LLVM_DEBUG(dbgs() << "masked gathers/scatters: trying to optimize\n"
|
||||
LLVM_DEBUG(dbgs() << "masked gathers/scatters: trying to optimize: "
|
||||
<< *Offsets << "\n");
|
||||
// Optimise the addresses of gathers/scatters by moving invariant
|
||||
// calculations out of the loop
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
||||
; RUN: llc -mtriple=thumbv8.1m.main-none-none-eabi -mattr=+mve.fp -enable-arm-maskedldst %s -o - | FileCheck %s
|
||||
; RUN: llc -mtriple=thumbv8.1m.main-none-none-eabi -mattr=+mve.fp -enable-arm-maskedldst %s -o - -opaque-pointers | FileCheck %s
|
||||
|
||||
define arm_aapcs_vfpcc <4 x i32> @gather_inc_mini_4i32(i32* noalias nocapture readonly %data, i32* noalias nocapture %dst, <4 x i32> %offs) {
|
||||
; CHECK-LABEL: gather_inc_mini_4i32:
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
||||
; RUN: llc -mtriple=thumbv8.1m.main-none-none-eabi -mattr=+mve.fp %s -o - | FileCheck %s
|
||||
; RUN: llc -mtriple=thumbv8.1m.main-none-none-eabi -mattr=+mve.fp %s -o - -opaque-pointers | FileCheck %s
|
||||
|
||||
define arm_aapcs_vfpcc <8 x i16> @scaled_v8i16_i16(i16* %base, <8 x i16>* %offptr) {
|
||||
; CHECK-LABEL: scaled_v8i16_i16:
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
||||
; RUN: llc -mtriple=thumbv8.1m.main-none-none-eabi -mattr=+mve.fp %s -o - | FileCheck %s
|
||||
; RUN: llc -mtriple=thumbv8.1m.main-none-none-eabi -mattr=+mve.fp %s -o - -opaque-pointers | FileCheck %s
|
||||
|
||||
define arm_aapcs_vfpcc <8 x i16> @zext_unscaled_i8_i16(i8* %base, <8 x i16>* %offptr) {
|
||||
; CHECK-LABEL: zext_unscaled_i8_i16:
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
||||
; RUN: llc -mtriple=thumbv8.1m.main-none-none-eabi -mattr=+mve.fp %s -o - | FileCheck %s
|
||||
; RUN: llc -mtriple=thumbv8.1m.main-none-none-eabi -mattr=+mve.fp %s -o - -opaque-pointers | FileCheck %s
|
||||
|
||||
define arm_aapcs_vfpcc <16 x i8> @unscaled_v16i8_i8(i8* %base, <16 x i8>* %offptr) {
|
||||
; CHECK-LABEL: unscaled_v16i8_i8:
|
||||
|
@ -1042,6 +1042,126 @@ entry:
|
|||
ret <16 x i8> %gather
|
||||
}
|
||||
|
||||
define arm_aapcs_vfpcc <16 x i8> @unscaled_v16i8_i8_range(i8* %base, <16 x i8>* %offptr) {
|
||||
; CHECK-LABEL: unscaled_v16i8_i8_range:
|
||||
; CHECK: @ %bb.0: @ %entry
|
||||
; CHECK-NEXT: adr r1, .LCPI19_0
|
||||
; CHECK-NEXT: vldrw.u32 q1, [r1]
|
||||
; CHECK-NEXT: vldrb.u8 q0, [r0, q1]
|
||||
; CHECK-NEXT: bx lr
|
||||
; CHECK-NEXT: .p2align 4
|
||||
; CHECK-NEXT: @ %bb.1:
|
||||
; CHECK-NEXT: .LCPI19_0:
|
||||
; CHECK-NEXT: .byte 82 @ 0x52
|
||||
; CHECK-NEXT: .byte 85 @ 0x55
|
||||
; CHECK-NEXT: .byte 88 @ 0x58
|
||||
; CHECK-NEXT: .byte 91 @ 0x5b
|
||||
; CHECK-NEXT: .byte 94 @ 0x5e
|
||||
; CHECK-NEXT: .byte 97 @ 0x61
|
||||
; CHECK-NEXT: .byte 100 @ 0x64
|
||||
; CHECK-NEXT: .byte 103 @ 0x67
|
||||
; CHECK-NEXT: .byte 106 @ 0x6a
|
||||
; CHECK-NEXT: .byte 109 @ 0x6d
|
||||
; CHECK-NEXT: .byte 112 @ 0x70
|
||||
; CHECK-NEXT: .byte 115 @ 0x73
|
||||
; CHECK-NEXT: .byte 118 @ 0x76
|
||||
; CHECK-NEXT: .byte 121 @ 0x79
|
||||
; CHECK-NEXT: .byte 124 @ 0x7c
|
||||
; CHECK-NEXT: .byte 127 @ 0x7f
|
||||
entry:
|
||||
%ptrs = getelementptr inbounds i8, i8* %base, <16 x i8> <i8 0, i8 3, i8 6, i8 9, i8 12, i8 15, i8 18, i8 21, i8 24, i8 27, i8 30, i8 33, i8 36, i8 39, i8 42, i8 45>
|
||||
%ptrs2 = getelementptr inbounds i8, <16 x i8*> %ptrs, i32 82
|
||||
%gather = call <16 x i8> @llvm.masked.gather.v16i8.v16p0i8(<16 x i8*> %ptrs2, i32 1, <16 x i1> <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>, <16 x i8> undef)
|
||||
ret <16 x i8> %gather
|
||||
}
|
||||
|
||||
define arm_aapcs_vfpcc <16 x i8> @unscaled_v16i8_i8_rangebad(i8* %base, <16 x i8>* %offptr) {
|
||||
; CHECK-LABEL: unscaled_v16i8_i8_rangebad:
|
||||
; CHECK: @ %bb.0: @ %entry
|
||||
; CHECK-NEXT: .save {r4, r5, r6, r7, lr}
|
||||
; CHECK-NEXT: push {r4, r5, r6, r7, lr}
|
||||
; CHECK-NEXT: adr r1, .LCPI20_0
|
||||
; CHECK-NEXT: adr r4, .LCPI20_1
|
||||
; CHECK-NEXT: vldrw.u32 q0, [r1]
|
||||
; CHECK-NEXT: adr r7, .LCPI20_3
|
||||
; CHECK-NEXT: vadd.i32 q0, q0, r0
|
||||
; CHECK-NEXT: vmov r1, r2, d1
|
||||
; CHECK-NEXT: vmov r3, r5, d0
|
||||
; CHECK-NEXT: vldrw.u32 q0, [r4]
|
||||
; CHECK-NEXT: vadd.i32 q1, q0, r0
|
||||
; CHECK-NEXT: vmov r4, r6, d3
|
||||
; CHECK-NEXT: ldrb.w lr, [r1]
|
||||
; CHECK-NEXT: adr r1, .LCPI20_2
|
||||
; CHECK-NEXT: vldrw.u32 q0, [r1]
|
||||
; CHECK-NEXT: ldrb.w r12, [r2]
|
||||
; CHECK-NEXT: ldrb r1, [r5]
|
||||
; CHECK-NEXT: vadd.i32 q2, q0, r0
|
||||
; CHECK-NEXT: ldrb r3, [r3]
|
||||
; CHECK-NEXT: ldrb r2, [r6]
|
||||
; CHECK-NEXT: vmov r5, r6, d4
|
||||
; CHECK-NEXT: ldrb r4, [r4]
|
||||
; CHECK-NEXT: ldrb r5, [r5]
|
||||
; CHECK-NEXT: vmov.8 q0[0], r5
|
||||
; CHECK-NEXT: ldrb r5, [r6]
|
||||
; CHECK-NEXT: vmov.8 q0[1], r5
|
||||
; CHECK-NEXT: vmov r5, r6, d5
|
||||
; CHECK-NEXT: vldrw.u32 q2, [r7]
|
||||
; CHECK-NEXT: vadd.i32 q2, q2, r0
|
||||
; CHECK-NEXT: ldrb r0, [r5]
|
||||
; CHECK-NEXT: ldrb r6, [r6]
|
||||
; CHECK-NEXT: vmov.8 q0[2], r0
|
||||
; CHECK-NEXT: vmov r0, r5, d4
|
||||
; CHECK-NEXT: vmov.8 q0[3], r6
|
||||
; CHECK-NEXT: ldrb r0, [r0]
|
||||
; CHECK-NEXT: ldrb r5, [r5]
|
||||
; CHECK-NEXT: vmov.8 q0[4], r0
|
||||
; CHECK-NEXT: vmov.8 q0[5], r5
|
||||
; CHECK-NEXT: vmov r0, r5, d5
|
||||
; CHECK-NEXT: ldrb r0, [r0]
|
||||
; CHECK-NEXT: ldrb r5, [r5]
|
||||
; CHECK-NEXT: vmov.8 q0[6], r0
|
||||
; CHECK-NEXT: vmov.8 q0[7], r5
|
||||
; CHECK-NEXT: vmov r0, r5, d2
|
||||
; CHECK-NEXT: ldrb r0, [r0]
|
||||
; CHECK-NEXT: ldrb r5, [r5]
|
||||
; CHECK-NEXT: vmov.8 q0[8], r0
|
||||
; CHECK-NEXT: vmov.8 q0[9], r5
|
||||
; CHECK-NEXT: vmov.8 q0[10], r4
|
||||
; CHECK-NEXT: vmov.8 q0[11], r2
|
||||
; CHECK-NEXT: vmov.8 q0[12], r3
|
||||
; CHECK-NEXT: vmov.8 q0[13], r1
|
||||
; CHECK-NEXT: vmov.8 q0[14], lr
|
||||
; CHECK-NEXT: vmov.8 q0[15], r12
|
||||
; CHECK-NEXT: pop {r4, r5, r6, r7, pc}
|
||||
; CHECK-NEXT: .p2align 4
|
||||
; CHECK-NEXT: @ %bb.1:
|
||||
; CHECK-NEXT: .LCPI20_0:
|
||||
; CHECK-NEXT: .long 119 @ 0x77
|
||||
; CHECK-NEXT: .long 122 @ 0x7a
|
||||
; CHECK-NEXT: .long 125 @ 0x7d
|
||||
; CHECK-NEXT: .long 128 @ 0x80
|
||||
; CHECK-NEXT: .LCPI20_1:
|
||||
; CHECK-NEXT: .long 107 @ 0x6b
|
||||
; CHECK-NEXT: .long 110 @ 0x6e
|
||||
; CHECK-NEXT: .long 113 @ 0x71
|
||||
; CHECK-NEXT: .long 116 @ 0x74
|
||||
; CHECK-NEXT: .LCPI20_2:
|
||||
; CHECK-NEXT: .long 83 @ 0x53
|
||||
; CHECK-NEXT: .long 86 @ 0x56
|
||||
; CHECK-NEXT: .long 89 @ 0x59
|
||||
; CHECK-NEXT: .long 92 @ 0x5c
|
||||
; CHECK-NEXT: .LCPI20_3:
|
||||
; CHECK-NEXT: .long 95 @ 0x5f
|
||||
; CHECK-NEXT: .long 98 @ 0x62
|
||||
; CHECK-NEXT: .long 101 @ 0x65
|
||||
; CHECK-NEXT: .long 104 @ 0x68
|
||||
entry:
|
||||
%ptrs = getelementptr inbounds i8, i8* %base, <16 x i8> <i8 0, i8 3, i8 6, i8 9, i8 12, i8 15, i8 18, i8 21, i8 24, i8 27, i8 30, i8 33, i8 36, i8 39, i8 42, i8 45>
|
||||
%ptrs2 = getelementptr inbounds i8, <16 x i8*> %ptrs, i32 83
|
||||
%gather = call <16 x i8> @llvm.masked.gather.v16i8.v16p0i8(<16 x i8*> %ptrs2, i32 1, <16 x i1> <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>, <16 x i8> undef)
|
||||
ret <16 x i8> %gather
|
||||
}
|
||||
|
||||
declare <16 x i8> @llvm.masked.gather.v16i8.v16p0i8(<16 x i8*>, i32, <16 x i1>, <16 x i8>)
|
||||
declare <8 x i8> @llvm.masked.gather.v8i8.v8p0i8(<8 x i8*>, i32, <8 x i1>, <8 x i8>)
|
||||
declare <2 x i8> @llvm.masked.gather.v2i8.v2p0i8(<2 x i8*>, i32, <2 x i1>, <2 x i8>)
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
||||
; RUN: opt --arm-mve-gather-scatter-lowering -mtriple=thumbv8.1m.main-none-none-eabi -mattr=+mve.fp %s -S -o - | FileCheck %s
|
||||
; RUN: opt --arm-mve-gather-scatter-lowering -mtriple=thumbv8.1m.main-none-none-eabi -mattr=+mve.fp %s -S -o - -opaque-pointers | FileCheck %s
|
||||
|
||||
target datalayout = "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64"
|
||||
|
||||
|
@ -8,7 +8,7 @@ define arm_aapcs_vfpcc void @push_out_add_sub_block(i32* noalias nocapture reado
|
|||
; CHECK-NEXT: vector.ph:
|
||||
; CHECK-NEXT: [[PUSHEDOUTADD:%.*]] = add <4 x i32> <i32 0, i32 2, i32 4, i32 6>, <i32 6, i32 6, i32 6, i32 6>
|
||||
; CHECK-NEXT: [[SCALEDINDEX:%.*]] = shl <4 x i32> [[PUSHEDOUTADD]], <i32 2, i32 2, i32 2, i32 2>
|
||||
; CHECK-NEXT: [[TMP0:%.*]] = ptrtoint i32* [[DATA:%.*]] to i32
|
||||
; CHECK-NEXT: [[TMP0:%.*]] = ptrtoint ptr [[DATA:%.*]] to i32
|
||||
; CHECK-NEXT: [[DOTSPLATINSERT:%.*]] = insertelement <4 x i32> poison, i32 [[TMP0]], i32 0
|
||||
; CHECK-NEXT: [[DOTSPLAT:%.*]] = shufflevector <4 x i32> [[DOTSPLATINSERT]], <4 x i32> poison, <4 x i32> zeroinitializer
|
||||
; CHECK-NEXT: [[STARTINDEX:%.*]] = add <4 x i32> [[SCALEDINDEX]], [[DOTSPLAT]]
|
||||
|
@ -23,14 +23,13 @@ define arm_aapcs_vfpcc void @push_out_add_sub_block(i32* noalias nocapture reado
|
|||
; CHECK-NEXT: [[TMP2:%.*]] = call { <4 x i32>, <4 x i32> } @llvm.arm.mve.vldr.gather.base.wb.v4i32.v4i32(<4 x i32> [[VEC_IND]], i32 32)
|
||||
; CHECK-NEXT: [[TMP3:%.*]] = extractvalue { <4 x i32>, <4 x i32> } [[TMP2]], 0
|
||||
; CHECK-NEXT: [[TMP4]] = extractvalue { <4 x i32>, <4 x i32> } [[TMP2]], 1
|
||||
; CHECK-NEXT: [[TMP5:%.*]] = getelementptr inbounds i32, i32* [[DST:%.*]], i32 [[INDEX]]
|
||||
; CHECK-NEXT: [[TMP6:%.*]] = bitcast i32* [[TMP5]] to <4 x i32>*
|
||||
; CHECK-NEXT: store <4 x i32> [[TMP3]], <4 x i32>* [[TMP6]], align 4
|
||||
; CHECK-NEXT: [[TMP5:%.*]] = getelementptr inbounds i32, ptr [[DST:%.*]], i32 [[INDEX]]
|
||||
; CHECK-NEXT: store <4 x i32> [[TMP3]], ptr [[TMP5]], align 4
|
||||
; CHECK-NEXT: [[INDEX_NEXT]] = add i32 [[INDEX]], 4
|
||||
; CHECK-NEXT: br label [[VECTOR_BODY_END]]
|
||||
; CHECK: vector.body.end:
|
||||
; CHECK-NEXT: [[TMP7:%.*]] = icmp eq i32 [[INDEX_NEXT]], [[N_VEC:%.*]]
|
||||
; CHECK-NEXT: br i1 [[TMP7]], label [[END]], label [[VECTOR_BODY]]
|
||||
; CHECK-NEXT: [[TMP6:%.*]] = icmp eq i32 [[INDEX_NEXT]], [[N_VEC:%.*]]
|
||||
; CHECK-NEXT: br i1 [[TMP6]], label [[END]], label [[VECTOR_BODY]]
|
||||
; CHECK: end:
|
||||
; CHECK-NEXT: ret void
|
||||
;
|
||||
|
@ -70,7 +69,7 @@ define arm_aapcs_vfpcc void @push_out_mul_sub_block(i32* noalias nocapture reado
|
|||
; CHECK-NEXT: [[PRODUCT:%.*]] = mul <4 x i32> <i32 8, i32 8, i32 8, i32 8>, <i32 3, i32 3, i32 3, i32 3>
|
||||
; CHECK-NEXT: [[PUSHEDOUTADD:%.*]] = add <4 x i32> [[PUSHEDOUTMUL]], <i32 6, i32 6, i32 6, i32 6>
|
||||
; CHECK-NEXT: [[SCALEDINDEX:%.*]] = shl <4 x i32> [[PUSHEDOUTADD]], <i32 2, i32 2, i32 2, i32 2>
|
||||
; CHECK-NEXT: [[TMP0:%.*]] = ptrtoint i32* [[DATA:%.*]] to i32
|
||||
; CHECK-NEXT: [[TMP0:%.*]] = ptrtoint ptr [[DATA:%.*]] to i32
|
||||
; CHECK-NEXT: [[DOTSPLATINSERT:%.*]] = insertelement <4 x i32> poison, i32 [[TMP0]], i32 0
|
||||
; CHECK-NEXT: [[DOTSPLAT:%.*]] = shufflevector <4 x i32> [[DOTSPLATINSERT]], <4 x i32> poison, <4 x i32> zeroinitializer
|
||||
; CHECK-NEXT: [[STARTINDEX:%.*]] = add <4 x i32> [[SCALEDINDEX]], [[DOTSPLAT]]
|
||||
|
@ -85,14 +84,13 @@ define arm_aapcs_vfpcc void @push_out_mul_sub_block(i32* noalias nocapture reado
|
|||
; CHECK-NEXT: [[TMP2:%.*]] = call { <4 x i32>, <4 x i32> } @llvm.arm.mve.vldr.gather.base.wb.v4i32.v4i32(<4 x i32> [[VEC_IND]], i32 96)
|
||||
; CHECK-NEXT: [[TMP3:%.*]] = extractvalue { <4 x i32>, <4 x i32> } [[TMP2]], 0
|
||||
; CHECK-NEXT: [[TMP4]] = extractvalue { <4 x i32>, <4 x i32> } [[TMP2]], 1
|
||||
; CHECK-NEXT: [[TMP5:%.*]] = getelementptr inbounds i32, i32* [[DST:%.*]], i32 [[INDEX]]
|
||||
; CHECK-NEXT: [[TMP6:%.*]] = bitcast i32* [[TMP5]] to <4 x i32>*
|
||||
; CHECK-NEXT: store <4 x i32> [[TMP3]], <4 x i32>* [[TMP6]], align 4
|
||||
; CHECK-NEXT: [[TMP5:%.*]] = getelementptr inbounds i32, ptr [[DST:%.*]], i32 [[INDEX]]
|
||||
; CHECK-NEXT: store <4 x i32> [[TMP3]], ptr [[TMP5]], align 4
|
||||
; CHECK-NEXT: [[INDEX_NEXT]] = add i32 [[INDEX]], 4
|
||||
; CHECK-NEXT: br label [[VECTOR_BODY_END]]
|
||||
; CHECK: vector.body.end:
|
||||
; CHECK-NEXT: [[TMP7:%.*]] = icmp eq i32 [[INDEX_NEXT]], [[N_VEC:%.*]]
|
||||
; CHECK-NEXT: br i1 [[TMP7]], label [[END]], label [[VECTOR_BODY]]
|
||||
; CHECK-NEXT: [[TMP6:%.*]] = icmp eq i32 [[INDEX_NEXT]], [[N_VEC:%.*]]
|
||||
; CHECK-NEXT: br i1 [[TMP6]], label [[END]], label [[VECTOR_BODY]]
|
||||
; CHECK: end:
|
||||
; CHECK-NEXT: ret void
|
||||
;
|
||||
|
@ -140,24 +138,23 @@ define arm_aapcs_vfpcc void @push_out_mul_sub_loop(i32* noalias nocapture readon
|
|||
; CHECK: vector.2.body:
|
||||
; CHECK-NEXT: [[TMP0:%.*]] = mul <4 x i32> [[VEC_IND]], <i32 3, i32 3, i32 3, i32 3>
|
||||
; CHECK-NEXT: [[SCALEDINDEX:%.*]] = shl <4 x i32> [[TMP0]], <i32 2, i32 2, i32 2, i32 2>
|
||||
; CHECK-NEXT: [[TMP1:%.*]] = ptrtoint i32* [[DATA:%.*]] to i32
|
||||
; CHECK-NEXT: [[TMP1:%.*]] = ptrtoint ptr [[DATA:%.*]] to i32
|
||||
; CHECK-NEXT: [[DOTSPLATINSERT:%.*]] = insertelement <4 x i32> poison, i32 [[TMP1]], i32 0
|
||||
; CHECK-NEXT: [[DOTSPLAT:%.*]] = shufflevector <4 x i32> [[DOTSPLATINSERT]], <4 x i32> poison, <4 x i32> zeroinitializer
|
||||
; CHECK-NEXT: [[STARTINDEX:%.*]] = add <4 x i32> [[SCALEDINDEX]], [[DOTSPLAT]]
|
||||
; CHECK-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.vldr.gather.base.v4i32.v4i32(<4 x i32> [[STARTINDEX]], i32 24)
|
||||
; CHECK-NEXT: [[TMP3:%.*]] = getelementptr inbounds i32, i32* [[DST:%.*]], i32 [[INDEX]]
|
||||
; CHECK-NEXT: [[TMP4:%.*]] = bitcast i32* [[TMP3]] to <4 x i32>*
|
||||
; CHECK-NEXT: store <4 x i32> [[TMP2]], <4 x i32>* [[TMP4]], align 4
|
||||
; CHECK-NEXT: [[TMP3:%.*]] = getelementptr inbounds i32, ptr [[DST:%.*]], i32 [[INDEX]]
|
||||
; CHECK-NEXT: store <4 x i32> [[TMP2]], ptr [[TMP3]], align 4
|
||||
; CHECK-NEXT: br label [[VECTOR_2_BODY_END:%.*]]
|
||||
; CHECK: vector.2.body.end:
|
||||
; CHECK-NEXT: [[INDEX_2_NEXT:%.*]] = add i32 [[INDEX]], 4
|
||||
; CHECK-NEXT: [[TMP5:%.*]] = icmp eq i32 [[INDEX_2_NEXT]], 16
|
||||
; CHECK-NEXT: br i1 [[TMP5]], label [[VECTOR_BODY_END]], label [[VECTOR_2_BODY]]
|
||||
; CHECK-NEXT: [[TMP4:%.*]] = icmp eq i32 [[INDEX_2_NEXT]], 16
|
||||
; CHECK-NEXT: br i1 [[TMP4]], label [[VECTOR_BODY_END]], label [[VECTOR_2_BODY]]
|
||||
; CHECK: vector.body.end:
|
||||
; CHECK-NEXT: [[INDEX_NEXT]] = add i32 [[INDEX]], 4
|
||||
; CHECK-NEXT: [[VEC_IND_NEXT]] = add <4 x i32> [[VEC_IND]], <i32 8, i32 8, i32 8, i32 8>
|
||||
; CHECK-NEXT: [[TMP6:%.*]] = icmp eq i32 [[INDEX_NEXT]], [[N_VEC:%.*]]
|
||||
; CHECK-NEXT: br i1 [[TMP6]], label [[END:%.*]], label [[VECTOR_BODY]]
|
||||
; CHECK-NEXT: [[TMP5:%.*]] = icmp eq i32 [[INDEX_NEXT]], [[N_VEC:%.*]]
|
||||
; CHECK-NEXT: br i1 [[TMP5]], label [[END:%.*]], label [[VECTOR_BODY]]
|
||||
; CHECK: end:
|
||||
; CHECK-NEXT: ret void
|
||||
;
|
||||
|
@ -207,10 +204,9 @@ define arm_aapcs_vfpcc void @invariant_add(i32* noalias nocapture readonly %data
|
|||
; CHECK-NEXT: [[VEC_IND:%.*]] = phi <4 x i32> [ <i32 0, i32 2, i32 4, i32 6>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[VECTOR_BODY]] ]
|
||||
; CHECK-NEXT: [[L0:%.*]] = mul <4 x i32> [[VEC_IND]], <i32 3, i32 3, i32 3, i32 3>
|
||||
; CHECK-NEXT: [[L1:%.*]] = add <4 x i32> [[L0]], [[VEC_IND]]
|
||||
; CHECK-NEXT: [[TMP0:%.*]] = call <4 x i32> @llvm.arm.mve.vldr.gather.offset.v4i32.p0i32.v4i32(i32* [[DATA:%.*]], <4 x i32> [[L1]], i32 32, i32 2, i32 1)
|
||||
; CHECK-NEXT: [[L3:%.*]] = getelementptr inbounds i32, i32* [[DST:%.*]], i32 [[INDEX]]
|
||||
; CHECK-NEXT: [[L4:%.*]] = bitcast i32* [[L3]] to <4 x i32>*
|
||||
; CHECK-NEXT: store <4 x i32> [[TMP0]], <4 x i32>* [[L4]], align 4
|
||||
; CHECK-NEXT: [[TMP0:%.*]] = call <4 x i32> @llvm.arm.mve.vldr.gather.offset.v4i32.p0.v4i32(ptr [[DATA:%.*]], <4 x i32> [[L1]], i32 32, i32 2, i32 1)
|
||||
; CHECK-NEXT: [[L3:%.*]] = getelementptr inbounds i32, ptr [[DST:%.*]], i32 [[INDEX]]
|
||||
; CHECK-NEXT: store <4 x i32> [[TMP0]], ptr [[L3]], align 4
|
||||
; CHECK-NEXT: [[INDEX_NEXT]] = add i32 [[INDEX]], 4
|
||||
; CHECK-NEXT: [[VEC_IND_NEXT]] = add <4 x i32> [[VEC_IND]], <i32 8, i32 8, i32 8, i32 8>
|
||||
; CHECK-NEXT: [[L5:%.*]] = icmp eq i32 [[INDEX_NEXT]], [[N_VEC:%.*]]
|
||||
|
@ -244,7 +240,6 @@ end:
|
|||
define void @gatherload(i32 %n, i32 %m, i32* nocapture %a, i32* nocapture readonly %b, i32 %call.us.us) {
|
||||
; CHECK-LABEL: @gatherload(
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: [[A57:%.*]] = bitcast i32* [[A:%.*]] to i8*
|
||||
; CHECK-NEXT: [[CMP38:%.*]] = icmp sgt i32 [[N:%.*]], 0
|
||||
; CHECK-NEXT: br i1 [[CMP38]], label [[FOR_BODY_LR_PH:%.*]], label [[FOR_END16:%.*]]
|
||||
; CHECK: for.body.lr.ph:
|
||||
|
@ -252,11 +247,11 @@ define void @gatherload(i32 %n, i32 %m, i32* nocapture %a, i32* nocapture readon
|
|||
; CHECK-NEXT: br i1 [[CMP636]], label [[FOR_BODY_US_US_PREHEADER:%.*]], label [[FOR_BODY:%.*]]
|
||||
; CHECK: for.body.us.us.preheader:
|
||||
; CHECK-NEXT: [[TMP0:%.*]] = shl nuw i32 [[M]], 2
|
||||
; CHECK-NEXT: [[SCEVGEP:%.*]] = getelementptr i32, i32* [[A]], i32 [[M]]
|
||||
; CHECK-NEXT: [[SCEVGEP64:%.*]] = getelementptr i32, i32* [[B:%.*]], i32 [[M]]
|
||||
; CHECK-NEXT: [[SCEVGEP:%.*]] = getelementptr i32, ptr [[A:%.*]], i32 [[M]]
|
||||
; CHECK-NEXT: [[SCEVGEP64:%.*]] = getelementptr i32, ptr [[B:%.*]], i32 [[M]]
|
||||
; CHECK-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i32 [[M]], 4
|
||||
; CHECK-NEXT: [[BOUND0:%.*]] = icmp ugt i32* [[SCEVGEP64]], [[A]]
|
||||
; CHECK-NEXT: [[BOUND1:%.*]] = icmp ugt i32* [[SCEVGEP]], [[B]]
|
||||
; CHECK-NEXT: [[BOUND0:%.*]] = icmp ugt ptr [[SCEVGEP64]], [[A]]
|
||||
; CHECK-NEXT: [[BOUND1:%.*]] = icmp ugt ptr [[SCEVGEP]], [[B]]
|
||||
; CHECK-NEXT: [[FOUND_CONFLICT:%.*]] = and i1 [[BOUND0]], [[BOUND1]]
|
||||
; CHECK-NEXT: [[N_VEC:%.*]] = and i32 [[M]], -4
|
||||
; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i32 [[N_VEC]], [[M]]
|
||||
|
@ -264,22 +259,19 @@ define void @gatherload(i32 %n, i32 %m, i32* nocapture %a, i32* nocapture readon
|
|||
; CHECK: for.body.us.us:
|
||||
; CHECK-NEXT: [[I_039_US_US:%.*]] = phi i32 [ [[INC15_US_US:%.*]], [[FOR_COND5_FOR_END13_CRIT_EDGE_US_US:%.*]] ], [ 0, [[FOR_BODY_US_US_PREHEADER]] ]
|
||||
; CHECK-NEXT: [[VLA_US_US:%.*]] = alloca i32, i32 [[CALL_US_US:%.*]], align 4
|
||||
; CHECK-NEXT: [[VLA_US_US56:%.*]] = bitcast i32* [[VLA_US_US]] to i8*
|
||||
; CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i32(i8* nonnull align 4 [[VLA_US_US56]], i8* align 4 [[A57]], i32 [[TMP0]], i1 false)
|
||||
; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr nonnull align 4 [[VLA_US_US]], ptr align 4 [[A]], i32 [[TMP0]], i1 false)
|
||||
; CHECK-NEXT: [[BRMERGE:%.*]] = select i1 [[MIN_ITERS_CHECK]], i1 true, i1 [[FOUND_CONFLICT]]
|
||||
; CHECK-NEXT: br i1 [[BRMERGE]], label [[FOR_BODY7_US_US_PREHEADER:%.*]], label [[VECTOR_BODY:%.*]]
|
||||
; CHECK: vector.body:
|
||||
; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ], [ 0, [[FOR_BODY_US_US]] ]
|
||||
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i32, i32* [[B]], i32 [[INDEX]]
|
||||
; CHECK-NEXT: [[TMP2:%.*]] = bitcast i32* [[TMP1]] to <4 x i32>*
|
||||
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i32>, <4 x i32>* [[TMP2]], align 4
|
||||
; CHECK-NEXT: [[TMP3:%.*]] = call <4 x i32> @llvm.arm.mve.vldr.gather.offset.v4i32.p0i32.v4i32(i32* [[VLA_US_US]], <4 x i32> [[WIDE_LOAD]], i32 32, i32 2, i32 1)
|
||||
; CHECK-NEXT: [[TMP4:%.*]] = getelementptr inbounds i32, i32* [[A]], i32 [[INDEX]]
|
||||
; CHECK-NEXT: [[TMP5:%.*]] = bitcast i32* [[TMP4]] to <4 x i32>*
|
||||
; CHECK-NEXT: store <4 x i32> [[TMP3]], <4 x i32>* [[TMP5]], align 4
|
||||
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i32, ptr [[B]], i32 [[INDEX]]
|
||||
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i32>, ptr [[TMP1]], align 4
|
||||
; CHECK-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.arm.mve.vldr.gather.offset.v4i32.p0.v4i32(ptr [[VLA_US_US]], <4 x i32> [[WIDE_LOAD]], i32 32, i32 2, i32 1)
|
||||
; CHECK-NEXT: [[TMP3:%.*]] = getelementptr inbounds i32, ptr [[A]], i32 [[INDEX]]
|
||||
; CHECK-NEXT: store <4 x i32> [[TMP2]], ptr [[TMP3]], align 4
|
||||
; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 4
|
||||
; CHECK-NEXT: [[TMP6:%.*]] = icmp eq i32 [[INDEX_NEXT]], [[N_VEC]]
|
||||
; CHECK-NEXT: br i1 [[TMP6]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]]
|
||||
; CHECK-NEXT: [[TMP4:%.*]] = icmp eq i32 [[INDEX_NEXT]], [[N_VEC]]
|
||||
; CHECK-NEXT: br i1 [[TMP4]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]]
|
||||
; CHECK: middle.block:
|
||||
; CHECK-NEXT: br i1 [[CMP_N]], label [[FOR_COND5_FOR_END13_CRIT_EDGE_US_US]], label [[FOR_BODY7_US_US_PREHEADER]]
|
||||
; CHECK: for.body7.us.us.preheader:
|
||||
|
@ -287,12 +279,12 @@ define void @gatherload(i32 %n, i32 %m, i32* nocapture %a, i32* nocapture readon
|
|||
; CHECK-NEXT: br label [[FOR_BODY7_US_US:%.*]]
|
||||
; CHECK: for.body7.us.us:
|
||||
; CHECK-NEXT: [[J_137_US_US:%.*]] = phi i32 [ [[INC12_US_US:%.*]], [[FOR_BODY7_US_US]] ], [ [[J_137_US_US_PH]], [[FOR_BODY7_US_US_PREHEADER]] ]
|
||||
; CHECK-NEXT: [[ARRAYIDX8_US_US:%.*]] = getelementptr inbounds i32, i32* [[B]], i32 [[J_137_US_US]]
|
||||
; CHECK-NEXT: [[TMP7:%.*]] = load i32, i32* [[ARRAYIDX8_US_US]], align 4
|
||||
; CHECK-NEXT: [[ARRAYIDX9_US_US:%.*]] = getelementptr inbounds i32, i32* [[VLA_US_US]], i32 [[TMP7]]
|
||||
; CHECK-NEXT: [[TMP8:%.*]] = load i32, i32* [[ARRAYIDX9_US_US]], align 4
|
||||
; CHECK-NEXT: [[ARRAYIDX10_US_US:%.*]] = getelementptr inbounds i32, i32* [[A]], i32 [[J_137_US_US]]
|
||||
; CHECK-NEXT: store i32 [[TMP8]], i32* [[ARRAYIDX10_US_US]], align 4
|
||||
; CHECK-NEXT: [[ARRAYIDX8_US_US:%.*]] = getelementptr inbounds i32, ptr [[B]], i32 [[J_137_US_US]]
|
||||
; CHECK-NEXT: [[TMP5:%.*]] = load i32, ptr [[ARRAYIDX8_US_US]], align 4
|
||||
; CHECK-NEXT: [[ARRAYIDX9_US_US:%.*]] = getelementptr inbounds i32, ptr [[VLA_US_US]], i32 [[TMP5]]
|
||||
; CHECK-NEXT: [[TMP6:%.*]] = load i32, ptr [[ARRAYIDX9_US_US]], align 4
|
||||
; CHECK-NEXT: [[ARRAYIDX10_US_US:%.*]] = getelementptr inbounds i32, ptr [[A]], i32 [[J_137_US_US]]
|
||||
; CHECK-NEXT: store i32 [[TMP6]], ptr [[ARRAYIDX10_US_US]], align 4
|
||||
; CHECK-NEXT: [[INC12_US_US]] = add nuw nsw i32 [[J_137_US_US]], 1
|
||||
; CHECK-NEXT: [[EXITCOND58_NOT:%.*]] = icmp eq i32 [[INC12_US_US]], [[M]]
|
||||
; CHECK-NEXT: br i1 [[EXITCOND58_NOT]], label [[FOR_COND5_FOR_END13_CRIT_EDGE_US_US]], label [[FOR_BODY7_US_US]]
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
||||
; RUN: llc -mtriple=thumbv8.1m.main-none-none-eabi -mattr=+mve.fp -enable-arm-maskedldst %s -o - | FileCheck %s
|
||||
; RUN: llc -mtriple=thumbv8.1m.main-none-none-eabi -mattr=+mve.fp -enable-arm-maskedldst -opaque-pointers %s -o - | FileCheck %s
|
||||
; RUN: llc -mtriple=thumbv8.1m.main-none-none-eabi -mattr=+mve.fp -enable-arm-maskedldst %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-STD
|
||||
; RUN: llc -mtriple=thumbv8.1m.main-none-none-eabi -mattr=+mve.fp -enable-arm-maskedldst -opaque-pointers %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-OPAQ
|
||||
|
||||
; i32
|
||||
|
||||
|
@ -817,6 +817,99 @@ entry:
|
|||
ret <8 x i32> %gather.sext
|
||||
}
|
||||
|
||||
define arm_aapcs_vfpcc <4 x i32> @gepconstoff_i32(i32* %base) {
|
||||
; CHECK-LABEL: gepconstoff_i32:
|
||||
; CHECK: @ %bb.0:
|
||||
; CHECK-NEXT: adr r1, .LCPI30_0
|
||||
; CHECK-NEXT: vldrw.u32 q1, [r1]
|
||||
; CHECK-NEXT: vldrw.u32 q0, [r0, q1, uxtw #2]
|
||||
; CHECK-NEXT: bx lr
|
||||
; CHECK-NEXT: .p2align 4
|
||||
; CHECK-NEXT: @ %bb.1:
|
||||
; CHECK-NEXT: .LCPI30_0:
|
||||
; CHECK-NEXT: .long 0 @ 0x0
|
||||
; CHECK-NEXT: .long 4 @ 0x4
|
||||
; CHECK-NEXT: .long 8 @ 0x8
|
||||
; CHECK-NEXT: .long 12 @ 0xc
|
||||
%a = getelementptr i32, i32* %base, <4 x i32> <i32 0, i32 4, i32 8, i32 12>
|
||||
%g = call <4 x i32> @llvm.masked.gather.v4i32.v4p0i32(<4 x i32*> %a, i32 4, <4 x i1> <i1 true, i1 true, i1 true, i1 true>, <4 x i32> poison)
|
||||
ret <4 x i32> %g
|
||||
}
|
||||
|
||||
define arm_aapcs_vfpcc <4 x i32> @gepconstoff_i8(i8* %base) {
|
||||
; CHECK-STD-LABEL: gepconstoff_i8:
|
||||
; CHECK-STD: @ %bb.0:
|
||||
; CHECK-STD-NEXT: adr r1, .LCPI31_0
|
||||
; CHECK-STD-NEXT: vldrw.u32 q0, [r1]
|
||||
; CHECK-STD-NEXT: vadd.i32 q1, q0, r0
|
||||
; CHECK-STD-NEXT: vldrw.u32 q0, [q1]
|
||||
; CHECK-STD-NEXT: bx lr
|
||||
; CHECK-STD-NEXT: .p2align 4
|
||||
; CHECK-STD-NEXT: @ %bb.1:
|
||||
; CHECK-STD-NEXT: .LCPI31_0:
|
||||
; CHECK-STD-NEXT: .long 4294967292 @ 0xfffffffc
|
||||
; CHECK-STD-NEXT: .long 12 @ 0xc
|
||||
; CHECK-STD-NEXT: .long 28 @ 0x1c
|
||||
; CHECK-STD-NEXT: .long 44 @ 0x2c
|
||||
;
|
||||
; CHECK-OPAQ-LABEL: gepconstoff_i8:
|
||||
; CHECK-OPAQ: @ %bb.0:
|
||||
; CHECK-OPAQ-NEXT: adr r1, .LCPI31_0
|
||||
; CHECK-OPAQ-NEXT: vldrw.u32 q1, [r1]
|
||||
; CHECK-OPAQ-NEXT: vldrw.u32 q0, [r0, q1, uxtw #2]
|
||||
; CHECK-OPAQ-NEXT: bx lr
|
||||
; CHECK-OPAQ-NEXT: .p2align 4
|
||||
; CHECK-OPAQ-NEXT: @ %bb.1:
|
||||
; CHECK-OPAQ-NEXT: .LCPI31_0:
|
||||
; CHECK-OPAQ-NEXT: .long 4294967295 @ 0xffffffff
|
||||
; CHECK-OPAQ-NEXT: .long 15 @ 0xf
|
||||
; CHECK-OPAQ-NEXT: .long 31 @ 0x1f
|
||||
; CHECK-OPAQ-NEXT: .long 47 @ 0x2f
|
||||
%a = getelementptr i8, i8* %base, <4 x i32> <i32 0, i32 16, i32 32, i32 48>
|
||||
%b = bitcast <4 x i8*> %a to <4 x i32*>
|
||||
%c = getelementptr inbounds i32, <4 x i32*> %b, i32 -1
|
||||
%g = call <4 x i32> @llvm.masked.gather.v4i32.v4p0i32(<4 x i32*> %c, i32 4, <4 x i1> <i1 true, i1 true, i1 true, i1 true>, <4 x i32> poison)
|
||||
ret <4 x i32> %g
|
||||
}
|
||||
|
||||
define arm_aapcs_vfpcc <4 x i32> @gepconstoff3_i16(i16* %base) {
|
||||
; CHECK-STD-LABEL: gepconstoff3_i16:
|
||||
; CHECK-STD: @ %bb.0:
|
||||
; CHECK-STD-NEXT: adr r1, .LCPI32_0
|
||||
; CHECK-STD-NEXT: vldrw.u32 q0, [r1]
|
||||
; CHECK-STD-NEXT: vadd.i32 q1, q0, r0
|
||||
; CHECK-STD-NEXT: vldrw.u32 q0, [q1]
|
||||
; CHECK-STD-NEXT: bx lr
|
||||
; CHECK-STD-NEXT: .p2align 4
|
||||
; CHECK-STD-NEXT: @ %bb.1:
|
||||
; CHECK-STD-NEXT: .LCPI32_0:
|
||||
; CHECK-STD-NEXT: .long 12 @ 0xc
|
||||
; CHECK-STD-NEXT: .long 18 @ 0x12
|
||||
; CHECK-STD-NEXT: .long 58 @ 0x3a
|
||||
; CHECK-STD-NEXT: .long 280 @ 0x118
|
||||
;
|
||||
; CHECK-OPAQ-LABEL: gepconstoff3_i16:
|
||||
; CHECK-OPAQ: @ %bb.0:
|
||||
; CHECK-OPAQ-NEXT: adr r1, .LCPI32_0
|
||||
; CHECK-OPAQ-NEXT: vldrw.u32 q1, [r1]
|
||||
; CHECK-OPAQ-NEXT: vldrw.u32 q0, [r0, q1, uxtw #2]
|
||||
; CHECK-OPAQ-NEXT: bx lr
|
||||
; CHECK-OPAQ-NEXT: .p2align 4
|
||||
; CHECK-OPAQ-NEXT: @ %bb.1:
|
||||
; CHECK-OPAQ-NEXT: .LCPI32_0:
|
||||
; CHECK-OPAQ-NEXT: .long 15 @ 0xf
|
||||
; CHECK-OPAQ-NEXT: .long 5 @ 0x5
|
||||
; CHECK-OPAQ-NEXT: .long 29 @ 0x1d
|
||||
; CHECK-OPAQ-NEXT: .long 235 @ 0xeb
|
||||
%a = getelementptr i16, i16* %base, <4 x i32> <i32 0, i32 16, i32 32, i32 48>
|
||||
%b = bitcast <4 x i16*> %a to <4 x i8*>
|
||||
%c = getelementptr i8, <4 x i8*> %b, <4 x i32> <i32 16, i32 -10, i32 -2, i32 188>
|
||||
%d = bitcast <4 x i8*> %c to <4 x i32*>
|
||||
%e = getelementptr inbounds i32, <4 x i32*> %d, i32 -1
|
||||
%g = call <4 x i32> @llvm.masked.gather.v4i32.v4p0i32(<4 x i32*> %e, i32 4, <4 x i1> <i1 true, i1 true, i1 true, i1 true>, <4 x i32> poison)
|
||||
ret <4 x i32> %g
|
||||
}
|
||||
|
||||
declare <2 x i32> @llvm.masked.gather.v2i32.v2p0i32(<2 x i32*>, i32, <2 x i1>, <2 x i32>)
|
||||
declare <4 x i32> @llvm.masked.gather.v4i32.v4p0i32(<4 x i32*>, i32, <4 x i1>, <4 x i32>)
|
||||
declare <8 x i32> @llvm.masked.gather.v8i32.v8p0i32(<8 x i32*>, i32, <8 x i1>, <8 x i32>)
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
||||
; RUN: llc -mtriple=thumbv8.1m.main-none-none-eabi -mattr=+mve.fp %s -o - | FileCheck %s
|
||||
; RUN: llc -mtriple=thumbv8.1m.main-none-none-eabi -mattr=+mve.fp %s -o - -opaque-pointers | FileCheck %s
|
||||
|
||||
define void @ptr_iv_v4i32(i32* noalias nocapture readonly %A, i32* noalias nocapture %B, i32 %y) {
|
||||
; CHECK-LABEL: ptr_iv_v4i32:
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
||||
; RUN: llc -mtriple=thumbv8.1m.main-none-none-eabi -mattr=+mve.fp -enable-arm-maskedldst -enable-mem-access-versioning=false -tail-predication=force-enabled %s -o - | FileCheck %s
|
||||
; RUN: llc -mtriple=thumbv8.1m.main-none-none-eabi -mattr=+mve.fp -enable-arm-maskedldst -enable-mem-access-versioning=false -tail-predication=force-enabled -opaque-pointers %s -o - | FileCheck %s
|
||||
|
||||
define dso_local void @mve_gather_qi_wb(i32* noalias nocapture readonly %A, i32* noalias nocapture readonly %B, i32* noalias nocapture %C, i32 %n, i32 %m, i32 %l) {
|
||||
; CHECK-LABEL: mve_gather_qi_wb:
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
||||
; RUN: llc -mtriple=thumbv8.1m.main-none-none-eabi -mattr=+mve.fp -enable-arm-maskedldst -tail-predication=force-enabled %s -o - | FileCheck %s
|
||||
; RUN: llc -mtriple=thumbv8.1m.main-none-none-eabi -mattr=+mve.fp -enable-arm-maskedldst -tail-predication=force-enabled %s -o - -opaque-pointers | FileCheck %s
|
||||
|
||||
define arm_aapcs_vfpcc void @gather_inc_v4i32_simple(i32* noalias nocapture readonly %data, i32* noalias nocapture %dst, i32 %n) {
|
||||
; CHECK-LABEL: gather_inc_v4i32_simple:
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
||||
; RUN: llc -mtriple=thumbv8.1m.main-none-none-eabi -mattr=+mve.fp %s -o - | FileCheck %s
|
||||
; RUN: llc -mtriple=thumbv8.1m.main-none-none-eabi -mattr=+mve.fp %s -o - -opaque-pointers | FileCheck %s
|
||||
|
||||
; VLDRH.16 Qd, [base, offs, uxtw #1]
|
||||
define arm_aapcs_vfpcc void @scaled_v8i16_i16(i16* %base, <8 x i16>* %offptr, <8 x i16> %input) {
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
||||
; RUN: llc -mtriple=thumbv8.1m.main-none-none-eabi -mattr=+mve.fp %s -o - | FileCheck %s
|
||||
; RUN: llc -mtriple=thumbv8.1m.main-none-none-eabi -mattr=+mve.fp %s -o - -opaque-pointers | FileCheck %s
|
||||
|
||||
; VLDRB.u16 Qd, [base, offs]
|
||||
define arm_aapcs_vfpcc void @ext_unscaled_i8_i16(i8* %base, <8 x i16>* %offptr, <8 x i16> %input) {
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
||||
; RUN: llc -mtriple=thumbv8.1m.main-none-none-eabi -mattr=+mve.fp %s -o 2>/dev/null - | FileCheck %s
|
||||
; RUN: llc -mtriple=thumbv8.1m.main-none-none-eabi -mattr=+mve.fp %s -o - -opaque-pointers | FileCheck %s
|
||||
|
||||
; VLDRH.u32 Qd, [base, offs, #uxtw #1]
|
||||
define arm_aapcs_vfpcc void @ext_scaled_i16_i32(i16* %base, <4 x i32>* %offptr, <4 x i32> %input) {
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
||||
; RUN: llc -mtriple=thumbv8.1m.main-none-none-eabi -mattr=+mve.fp %s -o - | FileCheck %s
|
||||
; RUN: llc -mtriple=thumbv8.1m.main-none-none-eabi -mattr=+mve.fp %s -o - -opaque-pointers | FileCheck %s
|
||||
|
||||
; VLDRB.u32 Qd, [base, offs]
|
||||
define arm_aapcs_vfpcc void @ext_unscaled_i8_i32(i8* %base, <4 x i32>* %offptr, <4 x i32> %input) {
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
||||
; RUN: llc -mtriple=thumbv8.1m.main-none-none-eabi -mattr=+mve.fp %s -o - | FileCheck %s
|
||||
; RUN: llc -mtriple=thumbv8.1m.main-none-none-eabi -mattr=+mve.fp %s -o - -opaque-pointers | FileCheck %s
|
||||
|
||||
; VLDRB.8
|
||||
define arm_aapcs_vfpcc void @unscaled_v16i8_i8(i8* %base, <16 x i8>* %offptr, <16 x i8> %input) {
|
||||
|
|
Loading…
Reference in New Issue