forked from OSchip/llvm-project
Revert rG14364200821f7b2d97edf6e78160c514800d3ec6 "[ARM] Regenerate reg_sequence.ll test checks"
Breaks on some apple machines
This commit is contained in:
parent
bba0c0df02
commit
d8888e14a0
|
@ -1,5 +1,5 @@
|
|||
; RUN: llc < %s -mtriple=arm-apple-ios -mcpu=cortex-a8 -arm-atomic-cfg-tidy=0 | FileCheck %s --check-prefixes=CHECK,DEFAULT
|
||||
; RUN: llc < %s -mtriple=arm-apple-ios -mcpu=cortex-a8 -arm-atomic-cfg-tidy=0 -regalloc=basic | FileCheck %s --check-prefixes=CHECK,BASIC
|
||||
; RUN: llc < %s -mtriple=arm-apple-ios -mcpu=cortex-a8 -arm-atomic-cfg-tidy=0 | FileCheck %s
|
||||
; RUN: llc < %s -mtriple=arm-apple-ios -mcpu=cortex-a8 -arm-atomic-cfg-tidy=0 -regalloc=basic | FileCheck %s
|
||||
; Implementing vld / vst as REG_SEQUENCE eliminates the extra vmov's.
|
||||
|
||||
%struct.int16x8_t = type { <8 x i16> }
|
||||
|
@ -10,34 +10,15 @@
|
|||
%struct.__neon_int32x4x2_t = type { <4 x i32>, <4 x i32> }
|
||||
|
||||
define void @t1(i16* %i_ptr, i16* %o_ptr, %struct.int32x4_t* nocapture %vT0ptr, %struct.int32x4_t* nocapture %vT1ptr) nounwind {
|
||||
; DEFAULT-LABEL: t1:
|
||||
; DEFAULT: @ %bb.0: @ %entry
|
||||
; DEFAULT-NEXT: vld1.16 {d16, d17}, [r0]
|
||||
; DEFAULT-NEXT: vmovl.s16 q9, d17
|
||||
; DEFAULT-NEXT: vld1.64 {d20, d21}, [r3:128]
|
||||
; DEFAULT-NEXT: vmovl.s16 q8, d16
|
||||
; DEFAULT-NEXT: vld1.64 {d22, d23}, [r2:128]
|
||||
; DEFAULT-NEXT: vmul.i32 q9, q10, q9
|
||||
; DEFAULT-NEXT: vmul.i32 q8, q11, q8
|
||||
; DEFAULT-NEXT: vshrn.i32 d19, q9, #12
|
||||
; DEFAULT-NEXT: vshrn.i32 d18, q8, #12
|
||||
; DEFAULT-NEXT: vst1.16 {d18, d19}, [r1]
|
||||
; DEFAULT-NEXT: bx lr
|
||||
;
|
||||
; BASIC-LABEL: t1:
|
||||
; BASIC: @ %bb.0: @ %entry
|
||||
; BASIC-NEXT: vld1.16 {d16, d17}, [r0]
|
||||
; BASIC-NEXT: vmovl.s16 q12, d17
|
||||
; BASIC-NEXT: vld1.64 {d22, d23}, [r3:128]
|
||||
; BASIC-NEXT: vmovl.s16 q10, d16
|
||||
; BASIC-NEXT: vld1.64 {d18, d19}, [r2:128]
|
||||
; BASIC-NEXT: vmul.i32 q8, q11, q12
|
||||
; BASIC-NEXT: vmul.i32 q9, q9, q10
|
||||
; BASIC-NEXT: vshrn.i32 d17, q8, #12
|
||||
; BASIC-NEXT: vshrn.i32 d16, q9, #12
|
||||
; BASIC-NEXT: vst1.16 {d16, d17}, [r1]
|
||||
; BASIC-NEXT: bx lr
|
||||
entry:
|
||||
; CHECK-LABEL: t1:
|
||||
; CHECK: vld1.16
|
||||
; CHECK-NOT: vmov d
|
||||
; CHECK: vmovl.s16
|
||||
; CHECK: vshrn.i32
|
||||
; CHECK: vshrn.i32
|
||||
; CHECK-NOT: vmov d
|
||||
; CHECK-NEXT: vst1.16
|
||||
%0 = getelementptr inbounds %struct.int32x4_t, %struct.int32x4_t* %vT0ptr, i32 0, i32 0 ; <<4 x i32>*> [#uses=1]
|
||||
%1 = load <4 x i32>, <4 x i32>* %0, align 16 ; <<4 x i32>> [#uses=1]
|
||||
%2 = getelementptr inbounds %struct.int32x4_t, %struct.int32x4_t* %vT1ptr, i32 0, i32 0 ; <<4 x i32>*> [#uses=1]
|
||||
|
@ -64,30 +45,16 @@ entry:
|
|||
}
|
||||
|
||||
define void @t2(i16* %i_ptr, i16* %o_ptr, %struct.int16x8_t* nocapture %vT0ptr, %struct.int16x8_t* nocapture %vT1ptr) nounwind {
|
||||
; DEFAULT-LABEL: t2:
|
||||
; DEFAULT: @ %bb.0: @ %entry
|
||||
; DEFAULT-NEXT: vld1.16 {d16, d17}, [r0]!
|
||||
; DEFAULT-NEXT: vld1.64 {d18, d19}, [r2:128]
|
||||
; DEFAULT-NEXT: vmul.i16 q8, q9, q8
|
||||
; DEFAULT-NEXT: vld1.64 {d18, d19}, [r3:128]
|
||||
; DEFAULT-NEXT: vld1.16 {d20, d21}, [r0]
|
||||
; DEFAULT-NEXT: vmul.i16 q9, q9, q10
|
||||
; DEFAULT-NEXT: vst1.16 {d16, d17}, [r1]!
|
||||
; DEFAULT-NEXT: vst1.16 {d18, d19}, [r1]
|
||||
; DEFAULT-NEXT: bx lr
|
||||
;
|
||||
; BASIC-LABEL: t2:
|
||||
; BASIC: @ %bb.0: @ %entry
|
||||
; BASIC-NEXT: vld1.16 {d18, d19}, [r0]!
|
||||
; BASIC-NEXT: vld1.64 {d16, d17}, [r2:128]
|
||||
; BASIC-NEXT: vmul.i16 q10, q8, q9
|
||||
; BASIC-NEXT: vld1.64 {d18, d19}, [r3:128]
|
||||
; BASIC-NEXT: vld1.16 {d16, d17}, [r0]
|
||||
; BASIC-NEXT: vmul.i16 q8, q9, q8
|
||||
; BASIC-NEXT: vst1.16 {d20, d21}, [r1]!
|
||||
; BASIC-NEXT: vst1.16 {d16, d17}, [r1]
|
||||
; BASIC-NEXT: bx lr
|
||||
entry:
|
||||
; CHECK-LABEL: t2:
|
||||
; CHECK: vld1.16
|
||||
; CHECK-NOT: vmov
|
||||
; CHECK: vmul.i16
|
||||
; CHECK: vld1.16
|
||||
; CHECK: vmul.i16
|
||||
; CHECK-NOT: vmov
|
||||
; CHECK: vst1.16
|
||||
; CHECK: vst1.16
|
||||
%0 = getelementptr inbounds %struct.int16x8_t, %struct.int16x8_t* %vT0ptr, i32 0, i32 0 ; <<8 x i16>*> [#uses=1]
|
||||
%1 = load <8 x i16>, <8 x i16>* %0, align 16 ; <<8 x i16>> [#uses=1]
|
||||
%2 = getelementptr inbounds %struct.int16x8_t, %struct.int16x8_t* %vT1ptr, i32 0, i32 0 ; <<8 x i16>*> [#uses=1]
|
||||
|
@ -108,27 +75,12 @@ entry:
|
|||
}
|
||||
|
||||
define <8 x i8> @t3(i8* %A, i8* %B) nounwind {
|
||||
; DEFAULT-LABEL: t3:
|
||||
; DEFAULT: @ %bb.0:
|
||||
; DEFAULT-NEXT: vld3.8 {d16, d17, d18}, [r0]
|
||||
; DEFAULT-NEXT: vmul.i8 d22, d17, d16
|
||||
; DEFAULT-NEXT: vmov r0, r2, d17
|
||||
; DEFAULT-NEXT: vadd.i8 d21, d16, d18
|
||||
; DEFAULT-NEXT: vsub.i8 d20, d18, d17
|
||||
; DEFAULT-NEXT: vst3.8 {d20, d21, d22}, [r1]
|
||||
; DEFAULT-NEXT: mov r1, r2
|
||||
; DEFAULT-NEXT: bx lr
|
||||
;
|
||||
; BASIC-LABEL: t3:
|
||||
; BASIC: @ %bb.0:
|
||||
; BASIC-NEXT: vld3.8 {d20, d21, d22}, [r0]
|
||||
; BASIC-NEXT: mov r2, r1
|
||||
; BASIC-NEXT: vmul.i8 d18, d21, d20
|
||||
; BASIC-NEXT: vmov r0, r1, d21
|
||||
; BASIC-NEXT: vadd.i8 d17, d20, d22
|
||||
; BASIC-NEXT: vsub.i8 d16, d22, d21
|
||||
; BASIC-NEXT: vst3.8 {d16, d17, d18}, [r2]
|
||||
; BASIC-NEXT: bx lr
|
||||
; CHECK-LABEL: t3:
|
||||
; CHECK: vld3.8
|
||||
; CHECK: vmul.i8
|
||||
; CHECK: vmov r
|
||||
; CHECK-NOT: vmov d
|
||||
; CHECK: vst3.8
|
||||
%tmp1 = call %struct.__neon_int8x8x3_t @llvm.arm.neon.vld3.v8i8.p0i8(i8* %A, i32 1) ; <%struct.__neon_int8x8x3_t> [#uses=2]
|
||||
%tmp2 = extractvalue %struct.__neon_int8x8x3_t %tmp1, 0 ; <<8 x i8>> [#uses=1]
|
||||
%tmp3 = extractvalue %struct.__neon_int8x8x3_t %tmp1, 2 ; <<8 x i8>> [#uses=1]
|
||||
|
@ -141,40 +93,13 @@ define <8 x i8> @t3(i8* %A, i8* %B) nounwind {
|
|||
}
|
||||
|
||||
define void @t4(i32* %in, i32* %out) nounwind {
|
||||
; DEFAULT-LABEL: t4:
|
||||
; DEFAULT: @ %bb.0: @ %entry
|
||||
; DEFAULT-NEXT: vld2.32 {d20, d21, d22, d23}, [r0]!
|
||||
; DEFAULT-NEXT: vld2.32 {d16, d17, d18, d19}, [r0]
|
||||
; DEFAULT-NEXT: mov r0, #0
|
||||
; DEFAULT-NEXT: cmp r0, #0
|
||||
; DEFAULT-NEXT: bne LBB3_2
|
||||
; DEFAULT-NEXT: @ %bb.1: @ %return1
|
||||
; DEFAULT-NEXT: vadd.i32 q12, q10, q8
|
||||
; DEFAULT-NEXT: vadd.i32 q13, q11, q9
|
||||
; DEFAULT-NEXT: vst2.32 {d24, d25, d26, d27}, [r1]
|
||||
; DEFAULT-NEXT: bx lr
|
||||
; DEFAULT-NEXT: LBB3_2: @ %return2
|
||||
; DEFAULT-NEXT: vadd.i32 q8, q10, q9
|
||||
; DEFAULT-NEXT: vst2.32 {d16, d17, d18, d19}, [r1]
|
||||
; DEFAULT-NEXT: trap
|
||||
;
|
||||
; BASIC-LABEL: t4:
|
||||
; BASIC: @ %bb.0: @ %entry
|
||||
; BASIC-NEXT: vld2.32 {d20, d21, d22, d23}, [r0]!
|
||||
; BASIC-NEXT: vld2.32 {d24, d25, d26, d27}, [r0]
|
||||
; BASIC-NEXT: mov r0, #0
|
||||
; BASIC-NEXT: cmp r0, #0
|
||||
; BASIC-NEXT: bne LBB3_2
|
||||
; BASIC-NEXT: @ %bb.1: @ %return1
|
||||
; BASIC-NEXT: vadd.i32 q8, q10, q12
|
||||
; BASIC-NEXT: vadd.i32 q9, q11, q13
|
||||
; BASIC-NEXT: vst2.32 {d16, d17, d18, d19}, [r1]
|
||||
; BASIC-NEXT: bx lr
|
||||
; BASIC-NEXT: LBB3_2: @ %return2
|
||||
; BASIC-NEXT: vadd.i32 q12, q10, q13
|
||||
; BASIC-NEXT: vst2.32 {d24, d25, d26, d27}, [r1]
|
||||
; BASIC-NEXT: trap
|
||||
entry:
|
||||
; CHECK-LABEL: t4:
|
||||
; CHECK: vld2.32
|
||||
; CHECK-NOT: vmov
|
||||
; CHECK: vld2.32
|
||||
; CHECK-NOT: vmov
|
||||
; CHECK: bne
|
||||
%tmp1 = bitcast i32* %in to i8* ; <i8*> [#uses=1]
|
||||
%tmp2 = tail call %struct.__neon_int32x4x2_t @llvm.arm.neon.vld2.v4i32.p0i8(i8* %tmp1, i32 1) ; <%struct.__neon_int32x4x2_t> [#uses=2]
|
||||
%tmp3 = getelementptr inbounds i32, i32* %in, i32 8 ; <i32*> [#uses=1]
|
||||
|
@ -184,6 +109,11 @@ entry:
|
|||
br i1 undef, label %return1, label %return2
|
||||
|
||||
return1:
|
||||
; CHECK: %return1
|
||||
; CHECK-NOT: vmov
|
||||
; CHECK-NEXT: vadd.i32
|
||||
; CHECK-NEXT: vadd.i32
|
||||
; CHECK-NEXT: vst2.32
|
||||
%tmp52 = extractvalue %struct.__neon_int32x4x2_t %tmp2, 0 ; <<4 x i32>> [#uses=1]
|
||||
%tmp57 = extractvalue %struct.__neon_int32x4x2_t %tmp2, 1 ; <<4 x i32>> [#uses=1]
|
||||
%tmp = extractvalue %struct.__neon_int32x4x2_t %tmp5, 0 ; <<4 x i32>> [#uses=1]
|
||||
|
@ -194,6 +124,10 @@ return1:
|
|||
ret void
|
||||
|
||||
return2:
|
||||
; CHECK: %return2
|
||||
; CHECK: vadd.i32
|
||||
; CHECK-NOT: vmov
|
||||
; CHECK: vst2.32 {d{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}}, d{{[0-9]+}}}
|
||||
%tmp100 = extractvalue %struct.__neon_int32x4x2_t %tmp2, 0 ; <<4 x i32>> [#uses=1]
|
||||
%tmp101 = extractvalue %struct.__neon_int32x4x2_t %tmp5, 1 ; <<4 x i32>> [#uses=1]
|
||||
%tmp102 = add <4 x i32> %tmp100, %tmp101 ; <<4 x i32>> [#uses=1]
|
||||
|
@ -203,15 +137,14 @@ return2:
|
|||
}
|
||||
|
||||
define <8 x i16> @t5(i16* %A, <8 x i16>* %B) nounwind {
|
||||
; CHECK-LABEL: t5:
|
||||
; CHECK: @ %bb.0:
|
||||
; CHECK-NEXT: vld1.32 {d16, d17}, [r1]
|
||||
; CHECK-NEXT: vorr q9, q8, q8
|
||||
; CHECK-NEXT: vld2.16 {d16[1], d18[1]}, [r0]
|
||||
; CHECK-NEXT: vadd.i16 q8, q8, q9
|
||||
; CHECK-NEXT: vmov r0, r1, d16
|
||||
; CHECK-NEXT: vmov r2, r3, d17
|
||||
; CHECK-NEXT: bx lr
|
||||
; CHECK-LABEL: t5:
|
||||
; CHECK: vld1.32
|
||||
; How can FileCheck match Q and D registers? We need a lisp interpreter.
|
||||
; CHECK: vorr {{q[0-9]+}}, {{q[0-9]+}}, {{q[0-9]+}}
|
||||
; CHECK-NOT: vmov
|
||||
; CHECK: vld2.16 {d{{[0-9]+}}[1], d{{[0-9]+}}[1]}, [r0]
|
||||
; CHECK-NOT: vmov
|
||||
; CHECK: vadd.i16
|
||||
%tmp0 = bitcast i16* %A to i8* ; <i8*> [#uses=1]
|
||||
%tmp1 = load <8 x i16>, <8 x i16>* %B ; <<8 x i16>> [#uses=2]
|
||||
%tmp2 = call %struct.__neon_int16x8x2_t @llvm.arm.neon.vld2lane.v8i16.p0i8(i8* %tmp0, <8 x i16> %tmp1, <8 x i16> %tmp1, i32 1, i32 1) ; <%struct.__neon_int16x8x2_t> [#uses=2]
|
||||
|
@ -222,14 +155,10 @@ define <8 x i16> @t5(i16* %A, <8 x i16>* %B) nounwind {
|
|||
}
|
||||
|
||||
define <8 x i8> @t6(i8* %A, <8 x i8>* %B) nounwind {
|
||||
; CHECK-LABEL: t6:
|
||||
; CHECK: @ %bb.0:
|
||||
; CHECK-NEXT: vldr d16, [r1]
|
||||
; CHECK-NEXT: vorr d17, d16, d16
|
||||
; CHECK-NEXT: vld2.8 {d16[1], d17[1]}, [r0]
|
||||
; CHECK-NEXT: vadd.i8 d16, d16, d17
|
||||
; CHECK-NEXT: vmov r0, r1, d16
|
||||
; CHECK-NEXT: bx lr
|
||||
; CHECK-LABEL: t6:
|
||||
; CHECK: vldr
|
||||
; CHECK: vorr d[[D0:[0-9]+]], d[[D1:[0-9]+]]
|
||||
; CHECK-NEXT: vld2.8 {d[[D1]][1], d[[D0]][1]}
|
||||
%tmp1 = load <8 x i8>, <8 x i8>* %B ; <<8 x i8>> [#uses=2]
|
||||
%tmp2 = call %struct.__neon_int8x8x2_t @llvm.arm.neon.vld2lane.v8i8.p0i8(i8* %A, <8 x i8> %tmp1, <8 x i8> %tmp1, i32 1, i32 1) ; <%struct.__neon_int8x8x2_t> [#uses=2]
|
||||
%tmp3 = extractvalue %struct.__neon_int8x8x2_t %tmp2, 0 ; <<8 x i8>> [#uses=1]
|
||||
|
@ -239,26 +168,15 @@ define <8 x i8> @t6(i8* %A, <8 x i8>* %B) nounwind {
|
|||
}
|
||||
|
||||
define void @t7(i32* %iptr, i32* %optr) nounwind {
|
||||
; DEFAULT-LABEL: t7:
|
||||
; DEFAULT: @ %bb.0: @ %entry
|
||||
; DEFAULT-NEXT: vld2.32 {d16, d17, d18, d19}, [r0]
|
||||
; DEFAULT-NEXT: vst2.32 {d16, d17, d18, d19}, [r1]
|
||||
; DEFAULT-NEXT: vld1.32 {d16, d17}, [r0]
|
||||
; DEFAULT-NEXT: vorr q9, q8, q8
|
||||
; DEFAULT-NEXT: vuzp.32 q8, q9
|
||||
; DEFAULT-NEXT: vst1.32 {d16, d17}, [r1]
|
||||
; DEFAULT-NEXT: bx lr
|
||||
;
|
||||
; BASIC-LABEL: t7:
|
||||
; BASIC: @ %bb.0: @ %entry
|
||||
; BASIC-NEXT: vld2.32 {d16, d17, d18, d19}, [r0]
|
||||
; BASIC-NEXT: vst2.32 {d16, d17, d18, d19}, [r1]
|
||||
; BASIC-NEXT: vld1.32 {d18, d19}, [r0]
|
||||
; BASIC-NEXT: vorr q8, q9, q9
|
||||
; BASIC-NEXT: vuzp.32 q9, q8
|
||||
; BASIC-NEXT: vst1.32 {d18, d19}, [r1]
|
||||
; BASIC-NEXT: bx lr
|
||||
entry:
|
||||
; CHECK-LABEL: t7:
|
||||
; CHECK: vld2.32
|
||||
; CHECK: vst2.32
|
||||
; CHECK: vld1.32 {d{{[0-9]+}}, d{{[0-9]+}}},
|
||||
; CHECK: vorr q[[Q0:[0-9]+]], q[[Q1:[0-9]+]], q[[Q1:[0-9]+]]
|
||||
; CHECK-NOT: vmov
|
||||
; CHECK: vuzp.32 q[[Q1]], q[[Q0]]
|
||||
; CHECK: vst1.32
|
||||
%0 = bitcast i32* %iptr to i8* ; <i8*> [#uses=2]
|
||||
%1 = tail call %struct.__neon_int32x4x2_t @llvm.arm.neon.vld2.v4i32.p0i8(i8* %0, i32 1) ; <%struct.__neon_int32x4x2_t> [#uses=2]
|
||||
%tmp57 = extractvalue %struct.__neon_int32x4x2_t %1, 0 ; <<4 x i32>> [#uses=1]
|
||||
|
@ -274,16 +192,7 @@ entry:
|
|||
; PR7156
|
||||
define arm_aapcs_vfpcc i32 @t8() nounwind {
|
||||
; CHECK-LABEL: t8:
|
||||
; CHECK: @ %bb.0: @ %bb.nph55.bb.nph55.split_crit_edge
|
||||
; CHECK-NEXT: vrsqrte.f32 q8, q8
|
||||
; CHECK-NEXT: vmul.f32 q8, q8, q8
|
||||
; CHECK-NEXT: vmul.f32 q8, q8, q8
|
||||
; CHECK-NEXT: vst1.32 {d16[1]}, [r0:32]
|
||||
; CHECK-NEXT: mov r0, #0
|
||||
; CHECK-NEXT: cmp r0, #0
|
||||
; CHECK-NEXT: movne r0, #0
|
||||
; CHECK-NEXT: bxne lr
|
||||
; CHECK-NEXT: LBB7_1: @ %bb7
|
||||
; CHECK: vrsqrte.f32 q8, q8
|
||||
bb.nph55.bb.nph55.split_crit_edge:
|
||||
br label %bb3
|
||||
|
||||
|
@ -331,14 +240,11 @@ bb14: ; preds = %bb6
|
|||
|
||||
; PR7157
|
||||
define arm_aapcs_vfpcc float @t9(%0* nocapture, %3* nocapture) nounwind {
|
||||
; CHECK-LABEL: t9:
|
||||
; CHECK: @ %bb.0:
|
||||
; CHECK-NEXT: vmov.i32 d16, #0x0
|
||||
; CHECK-NEXT: vst1.64 {d16, d17}, [r0:128]
|
||||
; CHECK-NEXT: vorr d17, d16, d16
|
||||
; CHECK-NEXT: vst1.64 {d16, d17}, [r0:128]
|
||||
; CHECK-NEXT: LBB8_1: @ =>This Inner Loop Header: Depth=1
|
||||
; CHECK-NEXT: b LBB8_1
|
||||
; CHECK-LABEL: t9:
|
||||
; CHECK: vmov.i32 d16, #0x0
|
||||
; CHECK-NEXT: vst1.64 {d16, d17}, [r0:128]
|
||||
; CHECK-NEXT: vorr d17, d16, d16
|
||||
; CHECK-NEXT: vst1.64 {d16, d17}, [r0:128]
|
||||
%3 = bitcast double 0.000000e+00 to <2 x float> ; <<2 x float>> [#uses=2]
|
||||
%4 = shufflevector <2 x float> %3, <2 x float> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3> ; <<4 x float>> [#uses=1]
|
||||
store <4 x float> %4, <4 x float>* undef, align 16
|
||||
|
@ -364,49 +270,23 @@ define arm_aapcs_vfpcc float @t9(%0* nocapture, %3* nocapture) nounwind {
|
|||
|
||||
; PR7162
|
||||
define arm_aapcs_vfpcc i32 @t10(float %x) nounwind {
|
||||
; DEFAULT-LABEL: t10:
|
||||
; DEFAULT: @ %bb.0: @ %entry
|
||||
; DEFAULT-NEXT: vmov.i32 d2, #0x0
|
||||
; DEFAULT-NEXT: @ kill: def $s0 killed $s0 def $d0
|
||||
; DEFAULT-NEXT: vdup.32 q0, d0[0]
|
||||
; DEFAULT-NEXT: vmov.i32 q9, #0x3f000000
|
||||
; DEFAULT-NEXT: vmov.f32 s0, s4
|
||||
; DEFAULT-NEXT: vmul.f32 q8, q0, q0
|
||||
; DEFAULT-NEXT: vadd.f32 q8, q8, q8
|
||||
; DEFAULT-NEXT: vadd.f32 q0, q8, q8
|
||||
; DEFAULT-NEXT: vmul.f32 q8, q9, d1[0]
|
||||
; DEFAULT-NEXT: vmul.f32 q8, q8, q8
|
||||
; DEFAULT-NEXT: vadd.f32 q8, q8, q8
|
||||
; DEFAULT-NEXT: vmul.f32 q8, q8, q8
|
||||
; DEFAULT-NEXT: vst1.32 {d17[1]}, [r0:32]
|
||||
; DEFAULT-NEXT: mov r0, #0
|
||||
; DEFAULT-NEXT: cmp r0, #0
|
||||
; DEFAULT-NEXT: movne r0, #0
|
||||
; DEFAULT-NEXT: bxne lr
|
||||
; DEFAULT-NEXT: LBB9_1: @ %exit
|
||||
; DEFAULT-NEXT: trap
|
||||
;
|
||||
; BASIC-LABEL: t10:
|
||||
; BASIC: @ %bb.0: @ %entry
|
||||
; BASIC-NEXT: @ kill: def $s0 killed $s0 def $d0
|
||||
; BASIC-NEXT: vdup.32 q1, d0[0]
|
||||
; BASIC-NEXT: vmov.i32 q9, #0x3f000000
|
||||
; BASIC-NEXT: vmov.i32 d0, #0x0
|
||||
; BASIC-NEXT: vmov.f32 s4, s0
|
||||
; BASIC-NEXT: vmul.f32 q8, q1, q1
|
||||
; BASIC-NEXT: vadd.f32 q8, q8, q8
|
||||
; BASIC-NEXT: vadd.f32 q0, q8, q8
|
||||
; BASIC-NEXT: vmul.f32 q8, q9, d1[0]
|
||||
; BASIC-NEXT: vmul.f32 q8, q8, q8
|
||||
; BASIC-NEXT: vadd.f32 q8, q8, q8
|
||||
; BASIC-NEXT: vmul.f32 q8, q8, q8
|
||||
; BASIC-NEXT: vst1.32 {d17[1]}, [r0:32]
|
||||
; BASIC-NEXT: mov r0, #0
|
||||
; BASIC-NEXT: cmp r0, #0
|
||||
; BASIC-NEXT: movne r0, #0
|
||||
; BASIC-NEXT: bxne lr
|
||||
; BASIC-NEXT: LBB9_1: @ %exit
|
||||
; BASIC-NEXT: trap
|
||||
; CHECK-LABEL: t10:
|
||||
; CHECK: vdup.32 [[Q0:q[0-9]+]], d0[0]
|
||||
; CHECK: vmov.i32 [[Q9:q[0-9]+]], #0x3f000000
|
||||
; CHECK: vmul.f32 [[Q8:q[0-9]+]], [[Q0]], [[Q0]]
|
||||
; CHECK-NEXT: vadd.f32 [[Q8]], [[Q8]], [[Q8]]
|
||||
; CHECK-NEXT: vadd.f32 [[Q1:q[0-9]+]], [[Q8]], [[Q8]]
|
||||
; CHECK-NEXT: vmul.f32 [[Q8]], [[Q9]], d1[0]
|
||||
; CHECK-NEXT: vmul.f32 [[Q8]], [[Q8]], [[Q8]]
|
||||
; CHECK-NEXT: vadd.f32 [[Q8]], [[Q8]], [[Q8]]
|
||||
; CHECK-NEXT: vmul.f32 [[Q8]], [[Q8]], [[Q8]]
|
||||
; CHECK-NEXT: vst1.32 {d17[1]}, [r0:32]
|
||||
; CHECK-NEXT: mov r0, #0
|
||||
; CHECK-NEXT: cmp r0, #0
|
||||
; CHECK-NEXT: movne r0, #0
|
||||
; CHECK-NEXT: bxne lr
|
||||
; CHECK-NEXT: LBB9_1:
|
||||
; CHECK-NEXT: trap
|
||||
entry:
|
||||
%0 = shufflevector <4 x float> zeroinitializer, <4 x float> undef, <4 x i32> zeroinitializer ; <<4 x float>> [#uses=1]
|
||||
%1 = insertelement <4 x float> %0, float %x, i32 1 ; <<4 x float>> [#uses=1]
|
||||
|
@ -416,7 +296,7 @@ entry:
|
|||
%4 = extractelement <2 x double> %tmp54.i, i32 1 ; <double> [#uses=1]
|
||||
%5 = bitcast double %4 to <2 x float> ; <<2 x float>> [#uses=1]
|
||||
%6 = shufflevector <2 x float> %5, <2 x float> undef, <4 x i32> zeroinitializer ; <<4 x float>> [#uses=1]
|
||||
%7 = fmul <4 x float> %6, %6
|
||||
%7 = fmul <4 x float> %6, %6
|
||||
%8 = fadd <4 x float> %7, %7
|
||||
%9 = fadd <4 x float> %8, %8
|
||||
%10 = shufflevector <4 x float> undef, <4 x float> %9, <4 x i32> <i32 0, i32 1, i32 2, i32 7> ; <<4 x float>> [#uses=1]
|
||||
|
@ -440,15 +320,6 @@ bb14: ; preds = %bb6
|
|||
|
||||
; This test crashes the coalescer because live variables were not updated properly.
|
||||
define <8 x i8> @t11(i8* %A1, i8* %A2, i8* %A3, i8* %A4, i8* %A5, i8* %A6, i8* %A7, i8* %A8, i8* %B) nounwind {
|
||||
; CHECK-LABEL: t11:
|
||||
; CHECK: @ %bb.0:
|
||||
; CHECK-NEXT: vmov r0, r2, d16
|
||||
; CHECK-NEXT: ldr r3, [sp, #16]
|
||||
; CHECK-NEXT: vmov.i32 d18, #0x0
|
||||
; CHECK-NEXT: vst3.8 {d16, d17, d18}, [r1]
|
||||
; CHECK-NEXT: vst3.8 {d16, d17, d18}, [r3]
|
||||
; CHECK-NEXT: mov r1, r2
|
||||
; CHECK-NEXT: bx lr
|
||||
%tmp1d = call %struct.__neon_int8x8x3_t @llvm.arm.neon.vld3.v8i8.p0i8(i8* %A4, i32 1) ; <%struct.__neon_int8x8x3_t> [#uses=1]
|
||||
%tmp2d = extractvalue %struct.__neon_int8x8x3_t %tmp1d, 0 ; <<8 x i8>> [#uses=1]
|
||||
%tmp1f = call %struct.__neon_int8x8x3_t @llvm.arm.neon.vld3.v8i8.p0i8(i8* %A6, i32 1) ; <%struct.__neon_int8x8x3_t> [#uses=1]
|
||||
|
|
Loading…
Reference in New Issue