1*828b63c3SDaniil Kovalev; RUN: llc < %s -mtriple=nvptx-unknown-unknown | FileCheck %s 2*828b63c3SDaniil Kovalev; 3*828b63c3SDaniil Kovalev; Check that parameters of a __global__ (kernel) function do not get increased 4*828b63c3SDaniil Kovalev; alignment, and no additional vectorization is performed on loads/stores with 5*828b63c3SDaniil Kovalev; that parameters. 6*828b63c3SDaniil Kovalev; 7*828b63c3SDaniil Kovalev; Test IR is a minimized version of IR generated with the following command 8*828b63c3SDaniil Kovalev; from the source code below: 9*828b63c3SDaniil Kovalev; $ clang++ -O3 --cuda-gpu-arch=sm_35 -S -emit-llvm src.cu 10*828b63c3SDaniil Kovalev; 11*828b63c3SDaniil Kovalev; ---------------------------------------------------------------------------- 12*828b63c3SDaniil Kovalev; #include <stdint.h> 13*828b63c3SDaniil Kovalev; 14*828b63c3SDaniil Kovalev; struct St4x1 { uint32_t field[1]; }; 15*828b63c3SDaniil Kovalev; struct St4x2 { uint32_t field[2]; }; 16*828b63c3SDaniil Kovalev; struct St4x3 { uint32_t field[3]; }; 17*828b63c3SDaniil Kovalev; struct St4x4 { uint32_t field[4]; }; 18*828b63c3SDaniil Kovalev; struct St4x5 { uint32_t field[5]; }; 19*828b63c3SDaniil Kovalev; struct St4x6 { uint32_t field[6]; }; 20*828b63c3SDaniil Kovalev; struct St4x7 { uint32_t field[7]; }; 21*828b63c3SDaniil Kovalev; struct St4x8 { uint32_t field[8]; }; 22*828b63c3SDaniil Kovalev; struct St8x1 { uint64_t field[1]; }; 23*828b63c3SDaniil Kovalev; struct St8x2 { uint64_t field[2]; }; 24*828b63c3SDaniil Kovalev; struct St8x3 { uint64_t field[3]; }; 25*828b63c3SDaniil Kovalev; struct St8x4 { uint64_t field[4]; }; 26*828b63c3SDaniil Kovalev; 27*828b63c3SDaniil Kovalev; #define DECLARE_FUNCTION(StName) \ 28*828b63c3SDaniil Kovalev; static __global__ __attribute__((noinline)) \ 29*828b63c3SDaniil Kovalev; void foo_##StName(struct StName in, struct StName* ret) { \ 30*828b63c3SDaniil Kovalev; const unsigned size = sizeof(ret->field) / sizeof(*ret->field); \ 31*828b63c3SDaniil Kovalev; for (unsigned i = 0; i != size; ++i) \ 32*828b63c3SDaniil Kovalev; ret->field[i] = in.field[i]; \ 33*828b63c3SDaniil Kovalev; } \ 34*828b63c3SDaniil Kovalev; 35*828b63c3SDaniil Kovalev; DECLARE_FUNCTION(St4x1) 36*828b63c3SDaniil Kovalev; DECLARE_FUNCTION(St4x2) 37*828b63c3SDaniil Kovalev; DECLARE_FUNCTION(St4x3) 38*828b63c3SDaniil Kovalev; DECLARE_FUNCTION(St4x4) 39*828b63c3SDaniil Kovalev; DECLARE_FUNCTION(St4x5) 40*828b63c3SDaniil Kovalev; DECLARE_FUNCTION(St4x6) 41*828b63c3SDaniil Kovalev; DECLARE_FUNCTION(St4x7) 42*828b63c3SDaniil Kovalev; DECLARE_FUNCTION(St4x8) 43*828b63c3SDaniil Kovalev; DECLARE_FUNCTION(St8x1) 44*828b63c3SDaniil Kovalev; DECLARE_FUNCTION(St8x2) 45*828b63c3SDaniil Kovalev; DECLARE_FUNCTION(St8x3) 46*828b63c3SDaniil Kovalev; DECLARE_FUNCTION(St8x4) 47*828b63c3SDaniil Kovalev; ---------------------------------------------------------------------------- 48*828b63c3SDaniil Kovalev 49*828b63c3SDaniil Kovalev%struct.St4x1 = type { [1 x i32] } 50*828b63c3SDaniil Kovalev%struct.St4x2 = type { [2 x i32] } 51*828b63c3SDaniil Kovalev%struct.St4x3 = type { [3 x i32] } 52*828b63c3SDaniil Kovalev%struct.St4x4 = type { [4 x i32] } 53*828b63c3SDaniil Kovalev%struct.St4x5 = type { [5 x i32] } 54*828b63c3SDaniil Kovalev%struct.St4x6 = type { [6 x i32] } 55*828b63c3SDaniil Kovalev%struct.St4x7 = type { [7 x i32] } 56*828b63c3SDaniil Kovalev%struct.St4x8 = type { [8 x i32] } 57*828b63c3SDaniil Kovalev%struct.St8x1 = type { [1 x i64] } 58*828b63c3SDaniil Kovalev%struct.St8x2 = type { [2 x i64] } 59*828b63c3SDaniil Kovalev%struct.St8x3 = type { [3 x i64] } 60*828b63c3SDaniil Kovalev%struct.St8x4 = type { [4 x i64] } 61*828b63c3SDaniil Kovalev 62*828b63c3SDaniil Kovalevdefine dso_local void @foo_St4x1(%struct.St4x1* nocapture noundef readonly byval(%struct.St4x1) align 4 %in, %struct.St4x1* nocapture noundef writeonly %ret) { 63*828b63c3SDaniil Kovalev ; CHECK-LABEL: .visible .func foo_St4x1( 64*828b63c3SDaniil Kovalev ; CHECK: .param .align 4 .b8 foo_St4x1_param_0[4], 65*828b63c3SDaniil Kovalev ; CHECK: .param .b32 foo_St4x1_param_1 66*828b63c3SDaniil Kovalev ; CHECK: ) 67*828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R1:%r[0-9]+]], [foo_St4x1_param_1]; 68*828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R2:%r[0-9]+]], [foo_St4x1_param_0]; 69*828b63c3SDaniil Kovalev ; CHECK: st.u32 [[[R1]]], [[R2]]; 70*828b63c3SDaniil Kovalev ; CHECK: ret; 71*828b63c3SDaniil Kovalev %arrayidx = getelementptr inbounds %struct.St4x1, %struct.St4x1* %in, i64 0, i32 0, i64 0 72*828b63c3SDaniil Kovalev %1 = load i32, i32* %arrayidx, align 4 73*828b63c3SDaniil Kovalev %arrayidx3 = getelementptr inbounds %struct.St4x1, %struct.St4x1* %ret, i64 0, i32 0, i64 0 74*828b63c3SDaniil Kovalev store i32 %1, i32* %arrayidx3, align 4 75*828b63c3SDaniil Kovalev ret void 76*828b63c3SDaniil Kovalev} 77*828b63c3SDaniil Kovalev 78*828b63c3SDaniil Kovalevdefine dso_local void @foo_St4x2(%struct.St4x2* nocapture noundef readonly byval(%struct.St4x2) align 4 %in, %struct.St4x2* nocapture noundef writeonly %ret) { 79*828b63c3SDaniil Kovalev ; CHECK-LABEL: .visible .func foo_St4x2( 80*828b63c3SDaniil Kovalev ; CHECK: .param .align 4 .b8 foo_St4x2_param_0[8], 81*828b63c3SDaniil Kovalev ; CHECK: .param .b32 foo_St4x2_param_1 82*828b63c3SDaniil Kovalev ; CHECK: ) 83*828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R1:%r[0-9]+]], [foo_St4x2_param_1]; 84*828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R2:%r[0-9]+]], [foo_St4x2_param_0]; 85*828b63c3SDaniil Kovalev ; CHECK: st.u32 [[[R1]]], [[R2]]; 86*828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R3:%r[0-9]+]], [foo_St4x2_param_0+4]; 87*828b63c3SDaniil Kovalev ; CHECK: st.u32 [[[R1]]+4], [[R3]]; 88*828b63c3SDaniil Kovalev ; CHECK: ret; 89*828b63c3SDaniil Kovalev %arrayidx = getelementptr inbounds %struct.St4x2, %struct.St4x2* %in, i64 0, i32 0, i64 0 90*828b63c3SDaniil Kovalev %1 = load i32, i32* %arrayidx, align 4 91*828b63c3SDaniil Kovalev %arrayidx3 = getelementptr inbounds %struct.St4x2, %struct.St4x2* %ret, i64 0, i32 0, i64 0 92*828b63c3SDaniil Kovalev store i32 %1, i32* %arrayidx3, align 4 93*828b63c3SDaniil Kovalev %arrayidx.1 = getelementptr inbounds %struct.St4x2, %struct.St4x2* %in, i64 0, i32 0, i64 1 94*828b63c3SDaniil Kovalev %2 = load i32, i32* %arrayidx.1, align 4 95*828b63c3SDaniil Kovalev %arrayidx3.1 = getelementptr inbounds %struct.St4x2, %struct.St4x2* %ret, i64 0, i32 0, i64 1 96*828b63c3SDaniil Kovalev store i32 %2, i32* %arrayidx3.1, align 4 97*828b63c3SDaniil Kovalev ret void 98*828b63c3SDaniil Kovalev} 99*828b63c3SDaniil Kovalev 100*828b63c3SDaniil Kovalevdefine dso_local void @foo_St4x3(%struct.St4x3* nocapture noundef readonly byval(%struct.St4x3) align 4 %in, %struct.St4x3* nocapture noundef writeonly %ret) { 101*828b63c3SDaniil Kovalev ; CHECK-LABEL: .visible .func foo_St4x3( 102*828b63c3SDaniil Kovalev ; CHECK: .param .align 4 .b8 foo_St4x3_param_0[12], 103*828b63c3SDaniil Kovalev ; CHECK: .param .b32 foo_St4x3_param_1 104*828b63c3SDaniil Kovalev ; CHECK: ) 105*828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R1:%r[0-9]+]], [foo_St4x3_param_1]; 106*828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R2:%r[0-9]+]], [foo_St4x3_param_0]; 107*828b63c3SDaniil Kovalev ; CHECK: st.u32 [[[R1]]], [[R2]]; 108*828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R3:%r[0-9]+]], [foo_St4x3_param_0+4]; 109*828b63c3SDaniil Kovalev ; CHECK: st.u32 [[[R1]]+4], [[R3]]; 110*828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R4:%r[0-9]+]], [foo_St4x3_param_0+8]; 111*828b63c3SDaniil Kovalev ; CHECK: st.u32 [[[R1]]+8], [[R4]]; 112*828b63c3SDaniil Kovalev ; CHECK: ret; 113*828b63c3SDaniil Kovalev %arrayidx = getelementptr inbounds %struct.St4x3, %struct.St4x3* %in, i64 0, i32 0, i64 0 114*828b63c3SDaniil Kovalev %1 = load i32, i32* %arrayidx, align 4 115*828b63c3SDaniil Kovalev %arrayidx3 = getelementptr inbounds %struct.St4x3, %struct.St4x3* %ret, i64 0, i32 0, i64 0 116*828b63c3SDaniil Kovalev store i32 %1, i32* %arrayidx3, align 4 117*828b63c3SDaniil Kovalev %arrayidx.1 = getelementptr inbounds %struct.St4x3, %struct.St4x3* %in, i64 0, i32 0, i64 1 118*828b63c3SDaniil Kovalev %2 = load i32, i32* %arrayidx.1, align 4 119*828b63c3SDaniil Kovalev %arrayidx3.1 = getelementptr inbounds %struct.St4x3, %struct.St4x3* %ret, i64 0, i32 0, i64 1 120*828b63c3SDaniil Kovalev store i32 %2, i32* %arrayidx3.1, align 4 121*828b63c3SDaniil Kovalev %arrayidx.2 = getelementptr inbounds %struct.St4x3, %struct.St4x3* %in, i64 0, i32 0, i64 2 122*828b63c3SDaniil Kovalev %3 = load i32, i32* %arrayidx.2, align 4 123*828b63c3SDaniil Kovalev %arrayidx3.2 = getelementptr inbounds %struct.St4x3, %struct.St4x3* %ret, i64 0, i32 0, i64 2 124*828b63c3SDaniil Kovalev store i32 %3, i32* %arrayidx3.2, align 4 125*828b63c3SDaniil Kovalev ret void 126*828b63c3SDaniil Kovalev} 127*828b63c3SDaniil Kovalev 128*828b63c3SDaniil Kovalevdefine dso_local void @foo_St4x4(%struct.St4x4* nocapture noundef readonly byval(%struct.St4x4) align 4 %in, %struct.St4x4* nocapture noundef writeonly %ret) { 129*828b63c3SDaniil Kovalev ; CHECK-LABEL: .visible .func foo_St4x4( 130*828b63c3SDaniil Kovalev ; CHECK: .param .align 4 .b8 foo_St4x4_param_0[16], 131*828b63c3SDaniil Kovalev ; CHECK: .param .b32 foo_St4x4_param_1 132*828b63c3SDaniil Kovalev ; CHECK: ) 133*828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R1:%r[0-9]+]], [foo_St4x4_param_1]; 134*828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R2:%r[0-9]+]], [foo_St4x4_param_0]; 135*828b63c3SDaniil Kovalev ; CHECK: st.u32 [[[R1]]], [[R2]]; 136*828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R3:%r[0-9]+]], [foo_St4x4_param_0+4]; 137*828b63c3SDaniil Kovalev ; CHECK: st.u32 [[[R1]]+4], [[R3]]; 138*828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R4:%r[0-9]+]], [foo_St4x4_param_0+8]; 139*828b63c3SDaniil Kovalev ; CHECK: st.u32 [[[R1]]+8], [[R4]]; 140*828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R5:%r[0-9]+]], [foo_St4x4_param_0+12]; 141*828b63c3SDaniil Kovalev ; CHECK: st.u32 [[[R1]]+12], [[R5]]; 142*828b63c3SDaniil Kovalev ; CHECK: ret; 143*828b63c3SDaniil Kovalev %arrayidx = getelementptr inbounds %struct.St4x4, %struct.St4x4* %in, i64 0, i32 0, i64 0 144*828b63c3SDaniil Kovalev %1 = load i32, i32* %arrayidx, align 4 145*828b63c3SDaniil Kovalev %arrayidx3 = getelementptr inbounds %struct.St4x4, %struct.St4x4* %ret, i64 0, i32 0, i64 0 146*828b63c3SDaniil Kovalev store i32 %1, i32* %arrayidx3, align 4 147*828b63c3SDaniil Kovalev %arrayidx.1 = getelementptr inbounds %struct.St4x4, %struct.St4x4* %in, i64 0, i32 0, i64 1 148*828b63c3SDaniil Kovalev %2 = load i32, i32* %arrayidx.1, align 4 149*828b63c3SDaniil Kovalev %arrayidx3.1 = getelementptr inbounds %struct.St4x4, %struct.St4x4* %ret, i64 0, i32 0, i64 1 150*828b63c3SDaniil Kovalev store i32 %2, i32* %arrayidx3.1, align 4 151*828b63c3SDaniil Kovalev %arrayidx.2 = getelementptr inbounds %struct.St4x4, %struct.St4x4* %in, i64 0, i32 0, i64 2 152*828b63c3SDaniil Kovalev %3 = load i32, i32* %arrayidx.2, align 4 153*828b63c3SDaniil Kovalev %arrayidx3.2 = getelementptr inbounds %struct.St4x4, %struct.St4x4* %ret, i64 0, i32 0, i64 2 154*828b63c3SDaniil Kovalev store i32 %3, i32* %arrayidx3.2, align 4 155*828b63c3SDaniil Kovalev %arrayidx.3 = getelementptr inbounds %struct.St4x4, %struct.St4x4* %in, i64 0, i32 0, i64 3 156*828b63c3SDaniil Kovalev %4 = load i32, i32* %arrayidx.3, align 4 157*828b63c3SDaniil Kovalev %arrayidx3.3 = getelementptr inbounds %struct.St4x4, %struct.St4x4* %ret, i64 0, i32 0, i64 3 158*828b63c3SDaniil Kovalev store i32 %4, i32* %arrayidx3.3, align 4 159*828b63c3SDaniil Kovalev ret void 160*828b63c3SDaniil Kovalev} 161*828b63c3SDaniil Kovalev 162*828b63c3SDaniil Kovalevdefine dso_local void @foo_St4x5(%struct.St4x5* nocapture noundef readonly byval(%struct.St4x5) align 4 %in, %struct.St4x5* nocapture noundef writeonly %ret) { 163*828b63c3SDaniil Kovalev ; CHECK-LABEL: .visible .func foo_St4x5( 164*828b63c3SDaniil Kovalev ; CHECK: .param .align 4 .b8 foo_St4x5_param_0[20], 165*828b63c3SDaniil Kovalev ; CHECK: .param .b32 foo_St4x5_param_1 166*828b63c3SDaniil Kovalev ; CHECK: ) 167*828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R1:%r[0-9]+]], [foo_St4x5_param_1]; 168*828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R2:%r[0-9]+]], [foo_St4x5_param_0]; 169*828b63c3SDaniil Kovalev ; CHECK: st.u32 [[[R1]]], [[R2]]; 170*828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R3:%r[0-9]+]], [foo_St4x5_param_0+4]; 171*828b63c3SDaniil Kovalev ; CHECK: st.u32 [[[R1]]+4], [[R3]]; 172*828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R4:%r[0-9]+]], [foo_St4x5_param_0+8]; 173*828b63c3SDaniil Kovalev ; CHECK: st.u32 [[[R1]]+8], [[R4]]; 174*828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R5:%r[0-9]+]], [foo_St4x5_param_0+12]; 175*828b63c3SDaniil Kovalev ; CHECK: st.u32 [[[R1]]+12], [[R5]]; 176*828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R6:%r[0-9]+]], [foo_St4x5_param_0+16]; 177*828b63c3SDaniil Kovalev ; CHECK: st.u32 [[[R1]]+16], [[R6]]; 178*828b63c3SDaniil Kovalev ; CHECK: ret; 179*828b63c3SDaniil Kovalev %arrayidx = getelementptr inbounds %struct.St4x5, %struct.St4x5* %in, i64 0, i32 0, i64 0 180*828b63c3SDaniil Kovalev %1 = load i32, i32* %arrayidx, align 4 181*828b63c3SDaniil Kovalev %arrayidx3 = getelementptr inbounds %struct.St4x5, %struct.St4x5* %ret, i64 0, i32 0, i64 0 182*828b63c3SDaniil Kovalev store i32 %1, i32* %arrayidx3, align 4 183*828b63c3SDaniil Kovalev %arrayidx.1 = getelementptr inbounds %struct.St4x5, %struct.St4x5* %in, i64 0, i32 0, i64 1 184*828b63c3SDaniil Kovalev %2 = load i32, i32* %arrayidx.1, align 4 185*828b63c3SDaniil Kovalev %arrayidx3.1 = getelementptr inbounds %struct.St4x5, %struct.St4x5* %ret, i64 0, i32 0, i64 1 186*828b63c3SDaniil Kovalev store i32 %2, i32* %arrayidx3.1, align 4 187*828b63c3SDaniil Kovalev %arrayidx.2 = getelementptr inbounds %struct.St4x5, %struct.St4x5* %in, i64 0, i32 0, i64 2 188*828b63c3SDaniil Kovalev %3 = load i32, i32* %arrayidx.2, align 4 189*828b63c3SDaniil Kovalev %arrayidx3.2 = getelementptr inbounds %struct.St4x5, %struct.St4x5* %ret, i64 0, i32 0, i64 2 190*828b63c3SDaniil Kovalev store i32 %3, i32* %arrayidx3.2, align 4 191*828b63c3SDaniil Kovalev %arrayidx.3 = getelementptr inbounds %struct.St4x5, %struct.St4x5* %in, i64 0, i32 0, i64 3 192*828b63c3SDaniil Kovalev %4 = load i32, i32* %arrayidx.3, align 4 193*828b63c3SDaniil Kovalev %arrayidx3.3 = getelementptr inbounds %struct.St4x5, %struct.St4x5* %ret, i64 0, i32 0, i64 3 194*828b63c3SDaniil Kovalev store i32 %4, i32* %arrayidx3.3, align 4 195*828b63c3SDaniil Kovalev %arrayidx.4 = getelementptr inbounds %struct.St4x5, %struct.St4x5* %in, i64 0, i32 0, i64 4 196*828b63c3SDaniil Kovalev %5 = load i32, i32* %arrayidx.4, align 4 197*828b63c3SDaniil Kovalev %arrayidx3.4 = getelementptr inbounds %struct.St4x5, %struct.St4x5* %ret, i64 0, i32 0, i64 4 198*828b63c3SDaniil Kovalev store i32 %5, i32* %arrayidx3.4, align 4 199*828b63c3SDaniil Kovalev ret void 200*828b63c3SDaniil Kovalev} 201*828b63c3SDaniil Kovalev 202*828b63c3SDaniil Kovalevdefine dso_local void @foo_St4x6(%struct.St4x6* nocapture noundef readonly byval(%struct.St4x6) align 4 %in, %struct.St4x6* nocapture noundef writeonly %ret) { 203*828b63c3SDaniil Kovalev ; CHECK-LABEL: .visible .func foo_St4x6( 204*828b63c3SDaniil Kovalev ; CHECK: .param .align 4 .b8 foo_St4x6_param_0[24], 205*828b63c3SDaniil Kovalev ; CHECK: .param .b32 foo_St4x6_param_1 206*828b63c3SDaniil Kovalev ; CHECK: ) 207*828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R1:%r[0-9]+]], [foo_St4x6_param_1]; 208*828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R2:%r[0-9]+]], [foo_St4x6_param_0]; 209*828b63c3SDaniil Kovalev ; CHECK: st.u32 [[[R1]]], [[R2]]; 210*828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R3:%r[0-9]+]], [foo_St4x6_param_0+4]; 211*828b63c3SDaniil Kovalev ; CHECK: st.u32 [[[R1]]+4], [[R3]]; 212*828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R4:%r[0-9]+]], [foo_St4x6_param_0+8]; 213*828b63c3SDaniil Kovalev ; CHECK: st.u32 [[[R1]]+8], [[R4]]; 214*828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R5:%r[0-9]+]], [foo_St4x6_param_0+12]; 215*828b63c3SDaniil Kovalev ; CHECK: st.u32 [[[R1]]+12], [[R5]]; 216*828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R6:%r[0-9]+]], [foo_St4x6_param_0+16]; 217*828b63c3SDaniil Kovalev ; CHECK: st.u32 [[[R1]]+16], [[R6]]; 218*828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R7:%r[0-9]+]], [foo_St4x6_param_0+20]; 219*828b63c3SDaniil Kovalev ; CHECK: st.u32 [[[R1]]+20], [[R7]]; 220*828b63c3SDaniil Kovalev ; CHECK: ret; 221*828b63c3SDaniil Kovalev %arrayidx = getelementptr inbounds %struct.St4x6, %struct.St4x6* %in, i64 0, i32 0, i64 0 222*828b63c3SDaniil Kovalev %1 = load i32, i32* %arrayidx, align 4 223*828b63c3SDaniil Kovalev %arrayidx3 = getelementptr inbounds %struct.St4x6, %struct.St4x6* %ret, i64 0, i32 0, i64 0 224*828b63c3SDaniil Kovalev store i32 %1, i32* %arrayidx3, align 4 225*828b63c3SDaniil Kovalev %arrayidx.1 = getelementptr inbounds %struct.St4x6, %struct.St4x6* %in, i64 0, i32 0, i64 1 226*828b63c3SDaniil Kovalev %2 = load i32, i32* %arrayidx.1, align 4 227*828b63c3SDaniil Kovalev %arrayidx3.1 = getelementptr inbounds %struct.St4x6, %struct.St4x6* %ret, i64 0, i32 0, i64 1 228*828b63c3SDaniil Kovalev store i32 %2, i32* %arrayidx3.1, align 4 229*828b63c3SDaniil Kovalev %arrayidx.2 = getelementptr inbounds %struct.St4x6, %struct.St4x6* %in, i64 0, i32 0, i64 2 230*828b63c3SDaniil Kovalev %3 = load i32, i32* %arrayidx.2, align 4 231*828b63c3SDaniil Kovalev %arrayidx3.2 = getelementptr inbounds %struct.St4x6, %struct.St4x6* %ret, i64 0, i32 0, i64 2 232*828b63c3SDaniil Kovalev store i32 %3, i32* %arrayidx3.2, align 4 233*828b63c3SDaniil Kovalev %arrayidx.3 = getelementptr inbounds %struct.St4x6, %struct.St4x6* %in, i64 0, i32 0, i64 3 234*828b63c3SDaniil Kovalev %4 = load i32, i32* %arrayidx.3, align 4 235*828b63c3SDaniil Kovalev %arrayidx3.3 = getelementptr inbounds %struct.St4x6, %struct.St4x6* %ret, i64 0, i32 0, i64 3 236*828b63c3SDaniil Kovalev store i32 %4, i32* %arrayidx3.3, align 4 237*828b63c3SDaniil Kovalev %arrayidx.4 = getelementptr inbounds %struct.St4x6, %struct.St4x6* %in, i64 0, i32 0, i64 4 238*828b63c3SDaniil Kovalev %5 = load i32, i32* %arrayidx.4, align 4 239*828b63c3SDaniil Kovalev %arrayidx3.4 = getelementptr inbounds %struct.St4x6, %struct.St4x6* %ret, i64 0, i32 0, i64 4 240*828b63c3SDaniil Kovalev store i32 %5, i32* %arrayidx3.4, align 4 241*828b63c3SDaniil Kovalev %arrayidx.5 = getelementptr inbounds %struct.St4x6, %struct.St4x6* %in, i64 0, i32 0, i64 5 242*828b63c3SDaniil Kovalev %6 = load i32, i32* %arrayidx.5, align 4 243*828b63c3SDaniil Kovalev %arrayidx3.5 = getelementptr inbounds %struct.St4x6, %struct.St4x6* %ret, i64 0, i32 0, i64 5 244*828b63c3SDaniil Kovalev store i32 %6, i32* %arrayidx3.5, align 4 245*828b63c3SDaniil Kovalev ret void 246*828b63c3SDaniil Kovalev} 247*828b63c3SDaniil Kovalev 248*828b63c3SDaniil Kovalevdefine dso_local void @foo_St4x7(%struct.St4x7* nocapture noundef readonly byval(%struct.St4x7) align 4 %in, %struct.St4x7* nocapture noundef writeonly %ret) { 249*828b63c3SDaniil Kovalev ; CHECK-LABEL: .visible .func foo_St4x7( 250*828b63c3SDaniil Kovalev ; CHECK: .param .align 4 .b8 foo_St4x7_param_0[28], 251*828b63c3SDaniil Kovalev ; CHECK: .param .b32 foo_St4x7_param_1 252*828b63c3SDaniil Kovalev ; CHECK: ) 253*828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R1:%r[0-9]+]], [foo_St4x7_param_1]; 254*828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R2:%r[0-9]+]], [foo_St4x7_param_0]; 255*828b63c3SDaniil Kovalev ; CHECK: st.u32 [[[R1]]], [[R2]]; 256*828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R3:%r[0-9]+]], [foo_St4x7_param_0+4]; 257*828b63c3SDaniil Kovalev ; CHECK: st.u32 [[[R1]]+4], [[R3]]; 258*828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R4:%r[0-9]+]], [foo_St4x7_param_0+8]; 259*828b63c3SDaniil Kovalev ; CHECK: st.u32 [[[R1]]+8], [[R4]]; 260*828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R5:%r[0-9]+]], [foo_St4x7_param_0+12]; 261*828b63c3SDaniil Kovalev ; CHECK: st.u32 [[[R1]]+12], [[R5]]; 262*828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R6:%r[0-9]+]], [foo_St4x7_param_0+16]; 263*828b63c3SDaniil Kovalev ; CHECK: st.u32 [[[R1]]+16], [[R6]]; 264*828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R7:%r[0-9]+]], [foo_St4x7_param_0+20]; 265*828b63c3SDaniil Kovalev ; CHECK: st.u32 [[[R1]]+20], [[R7]]; 266*828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R8:%r[0-9]+]], [foo_St4x7_param_0+24]; 267*828b63c3SDaniil Kovalev ; CHECK: st.u32 [[[R1]]+24], [[R8]]; 268*828b63c3SDaniil Kovalev ; CHECK: ret; 269*828b63c3SDaniil Kovalev %arrayidx = getelementptr inbounds %struct.St4x7, %struct.St4x7* %in, i64 0, i32 0, i64 0 270*828b63c3SDaniil Kovalev %1 = load i32, i32* %arrayidx, align 4 271*828b63c3SDaniil Kovalev %arrayidx3 = getelementptr inbounds %struct.St4x7, %struct.St4x7* %ret, i64 0, i32 0, i64 0 272*828b63c3SDaniil Kovalev store i32 %1, i32* %arrayidx3, align 4 273*828b63c3SDaniil Kovalev %arrayidx.1 = getelementptr inbounds %struct.St4x7, %struct.St4x7* %in, i64 0, i32 0, i64 1 274*828b63c3SDaniil Kovalev %2 = load i32, i32* %arrayidx.1, align 4 275*828b63c3SDaniil Kovalev %arrayidx3.1 = getelementptr inbounds %struct.St4x7, %struct.St4x7* %ret, i64 0, i32 0, i64 1 276*828b63c3SDaniil Kovalev store i32 %2, i32* %arrayidx3.1, align 4 277*828b63c3SDaniil Kovalev %arrayidx.2 = getelementptr inbounds %struct.St4x7, %struct.St4x7* %in, i64 0, i32 0, i64 2 278*828b63c3SDaniil Kovalev %3 = load i32, i32* %arrayidx.2, align 4 279*828b63c3SDaniil Kovalev %arrayidx3.2 = getelementptr inbounds %struct.St4x7, %struct.St4x7* %ret, i64 0, i32 0, i64 2 280*828b63c3SDaniil Kovalev store i32 %3, i32* %arrayidx3.2, align 4 281*828b63c3SDaniil Kovalev %arrayidx.3 = getelementptr inbounds %struct.St4x7, %struct.St4x7* %in, i64 0, i32 0, i64 3 282*828b63c3SDaniil Kovalev %4 = load i32, i32* %arrayidx.3, align 4 283*828b63c3SDaniil Kovalev %arrayidx3.3 = getelementptr inbounds %struct.St4x7, %struct.St4x7* %ret, i64 0, i32 0, i64 3 284*828b63c3SDaniil Kovalev store i32 %4, i32* %arrayidx3.3, align 4 285*828b63c3SDaniil Kovalev %arrayidx.4 = getelementptr inbounds %struct.St4x7, %struct.St4x7* %in, i64 0, i32 0, i64 4 286*828b63c3SDaniil Kovalev %5 = load i32, i32* %arrayidx.4, align 4 287*828b63c3SDaniil Kovalev %arrayidx3.4 = getelementptr inbounds %struct.St4x7, %struct.St4x7* %ret, i64 0, i32 0, i64 4 288*828b63c3SDaniil Kovalev store i32 %5, i32* %arrayidx3.4, align 4 289*828b63c3SDaniil Kovalev %arrayidx.5 = getelementptr inbounds %struct.St4x7, %struct.St4x7* %in, i64 0, i32 0, i64 5 290*828b63c3SDaniil Kovalev %6 = load i32, i32* %arrayidx.5, align 4 291*828b63c3SDaniil Kovalev %arrayidx3.5 = getelementptr inbounds %struct.St4x7, %struct.St4x7* %ret, i64 0, i32 0, i64 5 292*828b63c3SDaniil Kovalev store i32 %6, i32* %arrayidx3.5, align 4 293*828b63c3SDaniil Kovalev %arrayidx.6 = getelementptr inbounds %struct.St4x7, %struct.St4x7* %in, i64 0, i32 0, i64 6 294*828b63c3SDaniil Kovalev %7 = load i32, i32* %arrayidx.6, align 4 295*828b63c3SDaniil Kovalev %arrayidx3.6 = getelementptr inbounds %struct.St4x7, %struct.St4x7* %ret, i64 0, i32 0, i64 6 296*828b63c3SDaniil Kovalev store i32 %7, i32* %arrayidx3.6, align 4 297*828b63c3SDaniil Kovalev ret void 298*828b63c3SDaniil Kovalev} 299*828b63c3SDaniil Kovalev 300*828b63c3SDaniil Kovalevdefine dso_local void @foo_St4x8(%struct.St4x8* nocapture noundef readonly byval(%struct.St4x8) align 4 %in, %struct.St4x8* nocapture noundef writeonly %ret) { 301*828b63c3SDaniil Kovalev ; CHECK-LABEL: .visible .func foo_St4x8( 302*828b63c3SDaniil Kovalev ; CHECK: .param .align 4 .b8 foo_St4x8_param_0[32], 303*828b63c3SDaniil Kovalev ; CHECK: .param .b32 foo_St4x8_param_1 304*828b63c3SDaniil Kovalev ; CHECK: ) 305*828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R1:%r[0-9]+]], [foo_St4x8_param_1]; 306*828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R2:%r[0-9]+]], [foo_St4x8_param_0]; 307*828b63c3SDaniil Kovalev ; CHECK: st.u32 [[[R1]]], [[R2]]; 308*828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R3:%r[0-9]+]], [foo_St4x8_param_0+4]; 309*828b63c3SDaniil Kovalev ; CHECK: st.u32 [[[R1]]+4], [[R3]]; 310*828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R4:%r[0-9]+]], [foo_St4x8_param_0+8]; 311*828b63c3SDaniil Kovalev ; CHECK: st.u32 [[[R1]]+8], [[R4]]; 312*828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R5:%r[0-9]+]], [foo_St4x8_param_0+12]; 313*828b63c3SDaniil Kovalev ; CHECK: st.u32 [[[R1]]+12], [[R5]]; 314*828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R6:%r[0-9]+]], [foo_St4x8_param_0+16]; 315*828b63c3SDaniil Kovalev ; CHECK: st.u32 [[[R1]]+16], [[R6]]; 316*828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R7:%r[0-9]+]], [foo_St4x8_param_0+20]; 317*828b63c3SDaniil Kovalev ; CHECK: st.u32 [[[R1]]+20], [[R7]]; 318*828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R8:%r[0-9]+]], [foo_St4x8_param_0+24]; 319*828b63c3SDaniil Kovalev ; CHECK: st.u32 [[[R1]]+24], [[R8]]; 320*828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R9:%r[0-9]+]], [foo_St4x8_param_0+28]; 321*828b63c3SDaniil Kovalev ; CHECK: st.u32 [[[R1]]+28], [[R9]]; 322*828b63c3SDaniil Kovalev ; CHECK: ret; 323*828b63c3SDaniil Kovalev %arrayidx = getelementptr inbounds %struct.St4x8, %struct.St4x8* %in, i64 0, i32 0, i64 0 324*828b63c3SDaniil Kovalev %1 = load i32, i32* %arrayidx, align 4 325*828b63c3SDaniil Kovalev %arrayidx3 = getelementptr inbounds %struct.St4x8, %struct.St4x8* %ret, i64 0, i32 0, i64 0 326*828b63c3SDaniil Kovalev store i32 %1, i32* %arrayidx3, align 4 327*828b63c3SDaniil Kovalev %arrayidx.1 = getelementptr inbounds %struct.St4x8, %struct.St4x8* %in, i64 0, i32 0, i64 1 328*828b63c3SDaniil Kovalev %2 = load i32, i32* %arrayidx.1, align 4 329*828b63c3SDaniil Kovalev %arrayidx3.1 = getelementptr inbounds %struct.St4x8, %struct.St4x8* %ret, i64 0, i32 0, i64 1 330*828b63c3SDaniil Kovalev store i32 %2, i32* %arrayidx3.1, align 4 331*828b63c3SDaniil Kovalev %arrayidx.2 = getelementptr inbounds %struct.St4x8, %struct.St4x8* %in, i64 0, i32 0, i64 2 332*828b63c3SDaniil Kovalev %3 = load i32, i32* %arrayidx.2, align 4 333*828b63c3SDaniil Kovalev %arrayidx3.2 = getelementptr inbounds %struct.St4x8, %struct.St4x8* %ret, i64 0, i32 0, i64 2 334*828b63c3SDaniil Kovalev store i32 %3, i32* %arrayidx3.2, align 4 335*828b63c3SDaniil Kovalev %arrayidx.3 = getelementptr inbounds %struct.St4x8, %struct.St4x8* %in, i64 0, i32 0, i64 3 336*828b63c3SDaniil Kovalev %4 = load i32, i32* %arrayidx.3, align 4 337*828b63c3SDaniil Kovalev %arrayidx3.3 = getelementptr inbounds %struct.St4x8, %struct.St4x8* %ret, i64 0, i32 0, i64 3 338*828b63c3SDaniil Kovalev store i32 %4, i32* %arrayidx3.3, align 4 339*828b63c3SDaniil Kovalev %arrayidx.4 = getelementptr inbounds %struct.St4x8, %struct.St4x8* %in, i64 0, i32 0, i64 4 340*828b63c3SDaniil Kovalev %5 = load i32, i32* %arrayidx.4, align 4 341*828b63c3SDaniil Kovalev %arrayidx3.4 = getelementptr inbounds %struct.St4x8, %struct.St4x8* %ret, i64 0, i32 0, i64 4 342*828b63c3SDaniil Kovalev store i32 %5, i32* %arrayidx3.4, align 4 343*828b63c3SDaniil Kovalev %arrayidx.5 = getelementptr inbounds %struct.St4x8, %struct.St4x8* %in, i64 0, i32 0, i64 5 344*828b63c3SDaniil Kovalev %6 = load i32, i32* %arrayidx.5, align 4 345*828b63c3SDaniil Kovalev %arrayidx3.5 = getelementptr inbounds %struct.St4x8, %struct.St4x8* %ret, i64 0, i32 0, i64 5 346*828b63c3SDaniil Kovalev store i32 %6, i32* %arrayidx3.5, align 4 347*828b63c3SDaniil Kovalev %arrayidx.6 = getelementptr inbounds %struct.St4x8, %struct.St4x8* %in, i64 0, i32 0, i64 6 348*828b63c3SDaniil Kovalev %7 = load i32, i32* %arrayidx.6, align 4 349*828b63c3SDaniil Kovalev %arrayidx3.6 = getelementptr inbounds %struct.St4x8, %struct.St4x8* %ret, i64 0, i32 0, i64 6 350*828b63c3SDaniil Kovalev store i32 %7, i32* %arrayidx3.6, align 4 351*828b63c3SDaniil Kovalev %arrayidx.7 = getelementptr inbounds %struct.St4x8, %struct.St4x8* %in, i64 0, i32 0, i64 7 352*828b63c3SDaniil Kovalev %8 = load i32, i32* %arrayidx.7, align 4 353*828b63c3SDaniil Kovalev %arrayidx3.7 = getelementptr inbounds %struct.St4x8, %struct.St4x8* %ret, i64 0, i32 0, i64 7 354*828b63c3SDaniil Kovalev store i32 %8, i32* %arrayidx3.7, align 4 355*828b63c3SDaniil Kovalev ret void 356*828b63c3SDaniil Kovalev} 357*828b63c3SDaniil Kovalev 358*828b63c3SDaniil Kovalevdefine dso_local void @foo_St8x1(%struct.St8x1* nocapture noundef readonly byval(%struct.St8x1) align 8 %in, %struct.St8x1* nocapture noundef writeonly %ret) { 359*828b63c3SDaniil Kovalev ; CHECK-LABEL: .visible .func foo_St8x1( 360*828b63c3SDaniil Kovalev ; CHECK: .param .align 8 .b8 foo_St8x1_param_0[8], 361*828b63c3SDaniil Kovalev ; CHECK: .param .b32 foo_St8x1_param_1 362*828b63c3SDaniil Kovalev ; CHECK: ) 363*828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R1:%r[0-9]+]], [foo_St8x1_param_1]; 364*828b63c3SDaniil Kovalev ; CHECK: ld.param.u64 [[RD1:%rd[0-9]+]], [foo_St8x1_param_0]; 365*828b63c3SDaniil Kovalev ; CHECK: st.u64 [[[R1]]], [[RD1]]; 366*828b63c3SDaniil Kovalev ; CHECK: ret; 367*828b63c3SDaniil Kovalev %arrayidx = getelementptr inbounds %struct.St8x1, %struct.St8x1* %in, i64 0, i32 0, i64 0 368*828b63c3SDaniil Kovalev %1 = load i64, i64* %arrayidx, align 8 369*828b63c3SDaniil Kovalev %arrayidx3 = getelementptr inbounds %struct.St8x1, %struct.St8x1* %ret, i64 0, i32 0, i64 0 370*828b63c3SDaniil Kovalev store i64 %1, i64* %arrayidx3, align 8 371*828b63c3SDaniil Kovalev ret void 372*828b63c3SDaniil Kovalev} 373*828b63c3SDaniil Kovalev 374*828b63c3SDaniil Kovalevdefine dso_local void @foo_St8x2(%struct.St8x2* nocapture noundef readonly byval(%struct.St8x2) align 8 %in, %struct.St8x2* nocapture noundef writeonly %ret) { 375*828b63c3SDaniil Kovalev ; CHECK-LABEL: .visible .func foo_St8x2( 376*828b63c3SDaniil Kovalev ; CHECK: .param .align 8 .b8 foo_St8x2_param_0[16], 377*828b63c3SDaniil Kovalev ; CHECK: .param .b32 foo_St8x2_param_1 378*828b63c3SDaniil Kovalev ; CHECK: ) 379*828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R1:%r[0-9]+]], [foo_St8x2_param_1]; 380*828b63c3SDaniil Kovalev ; CHECK: ld.param.u64 [[RD1:%rd[0-9]+]], [foo_St8x2_param_0]; 381*828b63c3SDaniil Kovalev ; CHECK: st.u64 [[[R1]]], [[RD1]]; 382*828b63c3SDaniil Kovalev ; CHECK: ld.param.u64 [[RD2:%rd[0-9]+]], [foo_St8x2_param_0+8]; 383*828b63c3SDaniil Kovalev ; CHECK: st.u64 [[[R1]]+8], [[RD2]]; 384*828b63c3SDaniil Kovalev ; CHECK: ret; 385*828b63c3SDaniil Kovalev %arrayidx = getelementptr inbounds %struct.St8x2, %struct.St8x2* %in, i64 0, i32 0, i64 0 386*828b63c3SDaniil Kovalev %1 = load i64, i64* %arrayidx, align 8 387*828b63c3SDaniil Kovalev %arrayidx3 = getelementptr inbounds %struct.St8x2, %struct.St8x2* %ret, i64 0, i32 0, i64 0 388*828b63c3SDaniil Kovalev store i64 %1, i64* %arrayidx3, align 8 389*828b63c3SDaniil Kovalev %arrayidx.1 = getelementptr inbounds %struct.St8x2, %struct.St8x2* %in, i64 0, i32 0, i64 1 390*828b63c3SDaniil Kovalev %2 = load i64, i64* %arrayidx.1, align 8 391*828b63c3SDaniil Kovalev %arrayidx3.1 = getelementptr inbounds %struct.St8x2, %struct.St8x2* %ret, i64 0, i32 0, i64 1 392*828b63c3SDaniil Kovalev store i64 %2, i64* %arrayidx3.1, align 8 393*828b63c3SDaniil Kovalev ret void 394*828b63c3SDaniil Kovalev} 395*828b63c3SDaniil Kovalev 396*828b63c3SDaniil Kovalevdefine dso_local void @foo_St8x3(%struct.St8x3* nocapture noundef readonly byval(%struct.St8x3) align 8 %in, %struct.St8x3* nocapture noundef writeonly %ret) { 397*828b63c3SDaniil Kovalev ; CHECK-LABEL: .visible .func foo_St8x3( 398*828b63c3SDaniil Kovalev ; CHECK: .param .align 8 .b8 foo_St8x3_param_0[24], 399*828b63c3SDaniil Kovalev ; CHECK: .param .b32 foo_St8x3_param_1 400*828b63c3SDaniil Kovalev ; CHECK: ) 401*828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R1:%r[0-9]+]], [foo_St8x3_param_1]; 402*828b63c3SDaniil Kovalev ; CHECK: ld.param.u64 [[RD1:%rd[0-9]+]], [foo_St8x3_param_0]; 403*828b63c3SDaniil Kovalev ; CHECK: st.u64 [[[R1]]], [[RD1]]; 404*828b63c3SDaniil Kovalev ; CHECK: ld.param.u64 [[RD2:%rd[0-9]+]], [foo_St8x3_param_0+8]; 405*828b63c3SDaniil Kovalev ; CHECK: st.u64 [[[R1]]+8], [[RD2]]; 406*828b63c3SDaniil Kovalev ; CHECK: ld.param.u64 [[RD3:%rd[0-9]+]], [foo_St8x3_param_0+16]; 407*828b63c3SDaniil Kovalev ; CHECK: st.u64 [[[R1]]+16], [[RD3]]; 408*828b63c3SDaniil Kovalev ; CHECK: ret; 409*828b63c3SDaniil Kovalev %arrayidx = getelementptr inbounds %struct.St8x3, %struct.St8x3* %in, i64 0, i32 0, i64 0 410*828b63c3SDaniil Kovalev %1 = load i64, i64* %arrayidx, align 8 411*828b63c3SDaniil Kovalev %arrayidx3 = getelementptr inbounds %struct.St8x3, %struct.St8x3* %ret, i64 0, i32 0, i64 0 412*828b63c3SDaniil Kovalev store i64 %1, i64* %arrayidx3, align 8 413*828b63c3SDaniil Kovalev %arrayidx.1 = getelementptr inbounds %struct.St8x3, %struct.St8x3* %in, i64 0, i32 0, i64 1 414*828b63c3SDaniil Kovalev %2 = load i64, i64* %arrayidx.1, align 8 415*828b63c3SDaniil Kovalev %arrayidx3.1 = getelementptr inbounds %struct.St8x3, %struct.St8x3* %ret, i64 0, i32 0, i64 1 416*828b63c3SDaniil Kovalev store i64 %2, i64* %arrayidx3.1, align 8 417*828b63c3SDaniil Kovalev %arrayidx.2 = getelementptr inbounds %struct.St8x3, %struct.St8x3* %in, i64 0, i32 0, i64 2 418*828b63c3SDaniil Kovalev %3 = load i64, i64* %arrayidx.2, align 8 419*828b63c3SDaniil Kovalev %arrayidx3.2 = getelementptr inbounds %struct.St8x3, %struct.St8x3* %ret, i64 0, i32 0, i64 2 420*828b63c3SDaniil Kovalev store i64 %3, i64* %arrayidx3.2, align 8 421*828b63c3SDaniil Kovalev ret void 422*828b63c3SDaniil Kovalev} 423*828b63c3SDaniil Kovalev 424*828b63c3SDaniil Kovalevdefine dso_local void @foo_St8x4(%struct.St8x4* nocapture noundef readonly byval(%struct.St8x4) align 8 %in, %struct.St8x4* nocapture noundef writeonly %ret) { 425*828b63c3SDaniil Kovalev ; CHECK-LABEL: .visible .func foo_St8x4( 426*828b63c3SDaniil Kovalev ; CHECK: .param .align 8 .b8 foo_St8x4_param_0[32], 427*828b63c3SDaniil Kovalev ; CHECK: .param .b32 foo_St8x4_param_1 428*828b63c3SDaniil Kovalev ; CHECK: ) 429*828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R1:%r[0-9]+]], [foo_St8x4_param_1]; 430*828b63c3SDaniil Kovalev ; CHECK: ld.param.u64 [[RD1:%rd[0-9]+]], [foo_St8x4_param_0]; 431*828b63c3SDaniil Kovalev ; CHECK: st.u64 [[[R1]]], [[RD1]]; 432*828b63c3SDaniil Kovalev ; CHECK: ld.param.u64 [[RD2:%rd[0-9]+]], [foo_St8x4_param_0+8]; 433*828b63c3SDaniil Kovalev ; CHECK: st.u64 [[[R1]]+8], [[RD2]]; 434*828b63c3SDaniil Kovalev ; CHECK: ld.param.u64 [[RD3:%rd[0-9]+]], [foo_St8x4_param_0+16]; 435*828b63c3SDaniil Kovalev ; CHECK: st.u64 [[[R1]]+16], [[RD3]]; 436*828b63c3SDaniil Kovalev ; CHECK: ld.param.u64 [[RD4:%rd[0-9]+]], [foo_St8x4_param_0+24]; 437*828b63c3SDaniil Kovalev ; CHECK: st.u64 [[[R1]]+24], [[RD4]]; 438*828b63c3SDaniil Kovalev ; CHECK: ret; 439*828b63c3SDaniil Kovalev %arrayidx = getelementptr inbounds %struct.St8x4, %struct.St8x4* %in, i64 0, i32 0, i64 0 440*828b63c3SDaniil Kovalev %1 = load i64, i64* %arrayidx, align 8 441*828b63c3SDaniil Kovalev %arrayidx3 = getelementptr inbounds %struct.St8x4, %struct.St8x4* %ret, i64 0, i32 0, i64 0 442*828b63c3SDaniil Kovalev store i64 %1, i64* %arrayidx3, align 8 443*828b63c3SDaniil Kovalev %arrayidx.1 = getelementptr inbounds %struct.St8x4, %struct.St8x4* %in, i64 0, i32 0, i64 1 444*828b63c3SDaniil Kovalev %2 = load i64, i64* %arrayidx.1, align 8 445*828b63c3SDaniil Kovalev %arrayidx3.1 = getelementptr inbounds %struct.St8x4, %struct.St8x4* %ret, i64 0, i32 0, i64 1 446*828b63c3SDaniil Kovalev store i64 %2, i64* %arrayidx3.1, align 8 447*828b63c3SDaniil Kovalev %arrayidx.2 = getelementptr inbounds %struct.St8x4, %struct.St8x4* %in, i64 0, i32 0, i64 2 448*828b63c3SDaniil Kovalev %3 = load i64, i64* %arrayidx.2, align 8 449*828b63c3SDaniil Kovalev %arrayidx3.2 = getelementptr inbounds %struct.St8x4, %struct.St8x4* %ret, i64 0, i32 0, i64 2 450*828b63c3SDaniil Kovalev store i64 %3, i64* %arrayidx3.2, align 8 451*828b63c3SDaniil Kovalev %arrayidx.3 = getelementptr inbounds %struct.St8x4, %struct.St8x4* %in, i64 0, i32 0, i64 3 452*828b63c3SDaniil Kovalev %4 = load i64, i64* %arrayidx.3, align 8 453*828b63c3SDaniil Kovalev %arrayidx3.3 = getelementptr inbounds %struct.St8x4, %struct.St8x4* %ret, i64 0, i32 0, i64 3 454*828b63c3SDaniil Kovalev store i64 %4, i64* %arrayidx3.3, align 8 455*828b63c3SDaniil Kovalev ret void 456*828b63c3SDaniil Kovalev} 457