1*9880d681SAndroid Build Coastguard Worker; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx,-slow-unaligned-mem-32 | FileCheck %s --check-prefix=ALL --check-prefix=FAST32 3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx,+slow-unaligned-mem-32 | FileCheck %s --check-prefix=ALL --check-prefix=SLOW32 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @merge_2_floats(float* nocapture %p) nounwind readonly { 6*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: merge_2_floats: 7*9880d681SAndroid Build Coastguard Worker; ALL: # BB#0: 8*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero 9*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: retq 10*9880d681SAndroid Build Coastguard Worker %tmp1 = load float, float* %p 11*9880d681SAndroid Build Coastguard Worker %vecins = insertelement <4 x float> undef, float %tmp1, i32 0 12*9880d681SAndroid Build Coastguard Worker %add.ptr = getelementptr float, float* %p, i32 1 13*9880d681SAndroid Build Coastguard Worker %tmp5 = load float, float* %add.ptr 14*9880d681SAndroid Build Coastguard Worker %vecins7 = insertelement <4 x float> %vecins, float %tmp5, i32 1 15*9880d681SAndroid Build Coastguard Worker ret <4 x float> %vecins7 16*9880d681SAndroid Build Coastguard Worker} 17*9880d681SAndroid Build Coastguard Worker 18*9880d681SAndroid Build Coastguard Worker; Test-case generated due to a crash when trying to treat loading the first 19*9880d681SAndroid Build Coastguard Worker; two i64s of a <4 x i64> as a load of two i32s. 20*9880d681SAndroid Build Coastguard Workerdefine <4 x i64> @merge_2_floats_into_4() { 21*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: merge_2_floats_into_4: 22*9880d681SAndroid Build Coastguard Worker; ALL: # BB#0: 23*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: movq (%rax), %rax 24*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: vmovups (%rax), %xmm0 25*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: retq 26*9880d681SAndroid Build Coastguard Worker %1 = load i64*, i64** undef, align 8 27*9880d681SAndroid Build Coastguard Worker %2 = getelementptr inbounds i64, i64* %1, i64 0 28*9880d681SAndroid Build Coastguard Worker %3 = load i64, i64* %2 29*9880d681SAndroid Build Coastguard Worker %4 = insertelement <4 x i64> undef, i64 %3, i32 0 30*9880d681SAndroid Build Coastguard Worker %5 = load i64*, i64** undef, align 8 31*9880d681SAndroid Build Coastguard Worker %6 = getelementptr inbounds i64, i64* %5, i64 1 32*9880d681SAndroid Build Coastguard Worker %7 = load i64, i64* %6 33*9880d681SAndroid Build Coastguard Worker %8 = insertelement <4 x i64> %4, i64 %7, i32 1 34*9880d681SAndroid Build Coastguard Worker %9 = shufflevector <4 x i64> %8, <4 x i64> undef, <4 x i32> <i32 0, i32 1, i32 4, i32 5> 35*9880d681SAndroid Build Coastguard Worker ret <4 x i64> %9 36*9880d681SAndroid Build Coastguard Worker} 37*9880d681SAndroid Build Coastguard Worker 38*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @merge_4_floats(float* %ptr) { 39*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: merge_4_floats: 40*9880d681SAndroid Build Coastguard Worker; ALL: # BB#0: 41*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: vmovups (%rdi), %xmm0 42*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: retq 43*9880d681SAndroid Build Coastguard Worker %a = load float, float* %ptr, align 8 44*9880d681SAndroid Build Coastguard Worker %vec = insertelement <4 x float> undef, float %a, i32 0 45*9880d681SAndroid Build Coastguard Worker %idx1 = getelementptr inbounds float, float* %ptr, i64 1 46*9880d681SAndroid Build Coastguard Worker %b = load float, float* %idx1, align 8 47*9880d681SAndroid Build Coastguard Worker %vec2 = insertelement <4 x float> %vec, float %b, i32 1 48*9880d681SAndroid Build Coastguard Worker %idx3 = getelementptr inbounds float, float* %ptr, i64 2 49*9880d681SAndroid Build Coastguard Worker %c = load float, float* %idx3, align 8 50*9880d681SAndroid Build Coastguard Worker %vec4 = insertelement <4 x float> %vec2, float %c, i32 2 51*9880d681SAndroid Build Coastguard Worker %idx5 = getelementptr inbounds float, float* %ptr, i64 3 52*9880d681SAndroid Build Coastguard Worker %d = load float, float* %idx5, align 8 53*9880d681SAndroid Build Coastguard Worker %vec6 = insertelement <4 x float> %vec4, float %d, i32 3 54*9880d681SAndroid Build Coastguard Worker ret <4 x float> %vec6 55*9880d681SAndroid Build Coastguard Worker} 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Worker; PR21710 ( http://llvm.org/bugs/show_bug.cgi?id=21710 ) 58*9880d681SAndroid Build Coastguard Worker; Make sure that 32-byte vectors are handled efficiently. 59*9880d681SAndroid Build Coastguard Worker; If the target has slow 32-byte accesses, we should still generate 60*9880d681SAndroid Build Coastguard Worker; 16-byte loads. 61*9880d681SAndroid Build Coastguard Worker 62*9880d681SAndroid Build Coastguard Workerdefine <8 x float> @merge_8_floats(float* %ptr) { 63*9880d681SAndroid Build Coastguard Worker; FAST32-LABEL: merge_8_floats: 64*9880d681SAndroid Build Coastguard Worker; FAST32: # BB#0: 65*9880d681SAndroid Build Coastguard Worker; FAST32-NEXT: vmovups (%rdi), %ymm0 66*9880d681SAndroid Build Coastguard Worker; FAST32-NEXT: retq 67*9880d681SAndroid Build Coastguard Worker; 68*9880d681SAndroid Build Coastguard Worker; SLOW32-LABEL: merge_8_floats: 69*9880d681SAndroid Build Coastguard Worker; SLOW32: # BB#0: 70*9880d681SAndroid Build Coastguard Worker; SLOW32-NEXT: vmovups (%rdi), %xmm0 71*9880d681SAndroid Build Coastguard Worker; SLOW32-NEXT: vinsertf128 $1, 16(%rdi), %ymm0, %ymm0 72*9880d681SAndroid Build Coastguard Worker; SLOW32-NEXT: retq 73*9880d681SAndroid Build Coastguard Worker %a = load float, float* %ptr, align 4 74*9880d681SAndroid Build Coastguard Worker %vec = insertelement <8 x float> undef, float %a, i32 0 75*9880d681SAndroid Build Coastguard Worker %idx1 = getelementptr inbounds float, float* %ptr, i64 1 76*9880d681SAndroid Build Coastguard Worker %b = load float, float* %idx1, align 4 77*9880d681SAndroid Build Coastguard Worker %vec2 = insertelement <8 x float> %vec, float %b, i32 1 78*9880d681SAndroid Build Coastguard Worker %idx3 = getelementptr inbounds float, float* %ptr, i64 2 79*9880d681SAndroid Build Coastguard Worker %c = load float, float* %idx3, align 4 80*9880d681SAndroid Build Coastguard Worker %vec4 = insertelement <8 x float> %vec2, float %c, i32 2 81*9880d681SAndroid Build Coastguard Worker %idx5 = getelementptr inbounds float, float* %ptr, i64 3 82*9880d681SAndroid Build Coastguard Worker %d = load float, float* %idx5, align 4 83*9880d681SAndroid Build Coastguard Worker %vec6 = insertelement <8 x float> %vec4, float %d, i32 3 84*9880d681SAndroid Build Coastguard Worker %idx7 = getelementptr inbounds float, float* %ptr, i64 4 85*9880d681SAndroid Build Coastguard Worker %e = load float, float* %idx7, align 4 86*9880d681SAndroid Build Coastguard Worker %vec8 = insertelement <8 x float> %vec6, float %e, i32 4 87*9880d681SAndroid Build Coastguard Worker %idx9 = getelementptr inbounds float, float* %ptr, i64 5 88*9880d681SAndroid Build Coastguard Worker %f = load float, float* %idx9, align 4 89*9880d681SAndroid Build Coastguard Worker %vec10 = insertelement <8 x float> %vec8, float %f, i32 5 90*9880d681SAndroid Build Coastguard Worker %idx11 = getelementptr inbounds float, float* %ptr, i64 6 91*9880d681SAndroid Build Coastguard Worker %g = load float, float* %idx11, align 4 92*9880d681SAndroid Build Coastguard Worker %vec12 = insertelement <8 x float> %vec10, float %g, i32 6 93*9880d681SAndroid Build Coastguard Worker %idx13 = getelementptr inbounds float, float* %ptr, i64 7 94*9880d681SAndroid Build Coastguard Worker %h = load float, float* %idx13, align 4 95*9880d681SAndroid Build Coastguard Worker %vec14 = insertelement <8 x float> %vec12, float %h, i32 7 96*9880d681SAndroid Build Coastguard Worker ret <8 x float> %vec14 97*9880d681SAndroid Build Coastguard Worker} 98*9880d681SAndroid Build Coastguard Worker 99*9880d681SAndroid Build Coastguard Workerdefine <4 x double> @merge_4_doubles(double* %ptr) { 100*9880d681SAndroid Build Coastguard Worker; FAST32-LABEL: merge_4_doubles: 101*9880d681SAndroid Build Coastguard Worker; FAST32: # BB#0: 102*9880d681SAndroid Build Coastguard Worker; FAST32-NEXT: vmovups (%rdi), %ymm0 103*9880d681SAndroid Build Coastguard Worker; FAST32-NEXT: retq 104*9880d681SAndroid Build Coastguard Worker; 105*9880d681SAndroid Build Coastguard Worker; SLOW32-LABEL: merge_4_doubles: 106*9880d681SAndroid Build Coastguard Worker; SLOW32: # BB#0: 107*9880d681SAndroid Build Coastguard Worker; SLOW32-NEXT: vmovups (%rdi), %xmm0 108*9880d681SAndroid Build Coastguard Worker; SLOW32-NEXT: vinsertf128 $1, 16(%rdi), %ymm0, %ymm0 109*9880d681SAndroid Build Coastguard Worker; SLOW32-NEXT: retq 110*9880d681SAndroid Build Coastguard Worker %a = load double, double* %ptr, align 8 111*9880d681SAndroid Build Coastguard Worker %vec = insertelement <4 x double> undef, double %a, i32 0 112*9880d681SAndroid Build Coastguard Worker %idx1 = getelementptr inbounds double, double* %ptr, i64 1 113*9880d681SAndroid Build Coastguard Worker %b = load double, double* %idx1, align 8 114*9880d681SAndroid Build Coastguard Worker %vec2 = insertelement <4 x double> %vec, double %b, i32 1 115*9880d681SAndroid Build Coastguard Worker %idx3 = getelementptr inbounds double, double* %ptr, i64 2 116*9880d681SAndroid Build Coastguard Worker %c = load double, double* %idx3, align 8 117*9880d681SAndroid Build Coastguard Worker %vec4 = insertelement <4 x double> %vec2, double %c, i32 2 118*9880d681SAndroid Build Coastguard Worker %idx5 = getelementptr inbounds double, double* %ptr, i64 3 119*9880d681SAndroid Build Coastguard Worker %d = load double, double* %idx5, align 8 120*9880d681SAndroid Build Coastguard Worker %vec6 = insertelement <4 x double> %vec4, double %d, i32 3 121*9880d681SAndroid Build Coastguard Worker ret <4 x double> %vec6 122*9880d681SAndroid Build Coastguard Worker} 123*9880d681SAndroid Build Coastguard Worker 124*9880d681SAndroid Build Coastguard Worker; PR21771 ( http://llvm.org/bugs/show_bug.cgi?id=21771 ) 125*9880d681SAndroid Build Coastguard Worker; Recognize and combine consecutive loads even when the 126*9880d681SAndroid Build Coastguard Worker; first of the combined loads is offset from the base address. 127*9880d681SAndroid Build Coastguard Workerdefine <4 x double> @merge_4_doubles_offset(double* %ptr) { 128*9880d681SAndroid Build Coastguard Worker; FAST32-LABEL: merge_4_doubles_offset: 129*9880d681SAndroid Build Coastguard Worker; FAST32: # BB#0: 130*9880d681SAndroid Build Coastguard Worker; FAST32-NEXT: vmovups 32(%rdi), %ymm0 131*9880d681SAndroid Build Coastguard Worker; FAST32-NEXT: retq 132*9880d681SAndroid Build Coastguard Worker; 133*9880d681SAndroid Build Coastguard Worker; SLOW32-LABEL: merge_4_doubles_offset: 134*9880d681SAndroid Build Coastguard Worker; SLOW32: # BB#0: 135*9880d681SAndroid Build Coastguard Worker; SLOW32-NEXT: vmovups 32(%rdi), %xmm0 136*9880d681SAndroid Build Coastguard Worker; SLOW32-NEXT: vinsertf128 $1, 48(%rdi), %ymm0, %ymm0 137*9880d681SAndroid Build Coastguard Worker; SLOW32-NEXT: retq 138*9880d681SAndroid Build Coastguard Worker %arrayidx4 = getelementptr inbounds double, double* %ptr, i64 4 139*9880d681SAndroid Build Coastguard Worker %arrayidx5 = getelementptr inbounds double, double* %ptr, i64 5 140*9880d681SAndroid Build Coastguard Worker %arrayidx6 = getelementptr inbounds double, double* %ptr, i64 6 141*9880d681SAndroid Build Coastguard Worker %arrayidx7 = getelementptr inbounds double, double* %ptr, i64 7 142*9880d681SAndroid Build Coastguard Worker %e = load double, double* %arrayidx4, align 8 143*9880d681SAndroid Build Coastguard Worker %f = load double, double* %arrayidx5, align 8 144*9880d681SAndroid Build Coastguard Worker %g = load double, double* %arrayidx6, align 8 145*9880d681SAndroid Build Coastguard Worker %h = load double, double* %arrayidx7, align 8 146*9880d681SAndroid Build Coastguard Worker %vecinit4 = insertelement <4 x double> undef, double %e, i32 0 147*9880d681SAndroid Build Coastguard Worker %vecinit5 = insertelement <4 x double> %vecinit4, double %f, i32 1 148*9880d681SAndroid Build Coastguard Worker %vecinit6 = insertelement <4 x double> %vecinit5, double %g, i32 2 149*9880d681SAndroid Build Coastguard Worker %vecinit7 = insertelement <4 x double> %vecinit6, double %h, i32 3 150*9880d681SAndroid Build Coastguard Worker ret <4 x double> %vecinit7 151*9880d681SAndroid Build Coastguard Worker} 152*9880d681SAndroid Build Coastguard Worker 153