1828b63c3SDaniil Kovalev; RUN: llc < %s -mtriple=nvptx-unknown-unknown | FileCheck %s 2828b63c3SDaniil Kovalev; 3828b63c3SDaniil Kovalev; Check that parameters of a __global__ (kernel) function do not get increased 4828b63c3SDaniil Kovalev; alignment, and no additional vectorization is performed on loads/stores with 5828b63c3SDaniil Kovalev; that parameters. 6828b63c3SDaniil Kovalev; 7828b63c3SDaniil Kovalev; Test IR is a minimized version of IR generated with the following command 8828b63c3SDaniil Kovalev; from the source code below: 9828b63c3SDaniil Kovalev; $ clang++ -O3 --cuda-gpu-arch=sm_35 -S -emit-llvm src.cu 10828b63c3SDaniil Kovalev; 11828b63c3SDaniil Kovalev; ---------------------------------------------------------------------------- 12828b63c3SDaniil Kovalev; #include <stdint.h> 13828b63c3SDaniil Kovalev; 14828b63c3SDaniil Kovalev; struct St4x1 { uint32_t field[1]; }; 15828b63c3SDaniil Kovalev; struct St4x2 { uint32_t field[2]; }; 16828b63c3SDaniil Kovalev; struct St4x3 { uint32_t field[3]; }; 17828b63c3SDaniil Kovalev; struct St4x4 { uint32_t field[4]; }; 18828b63c3SDaniil Kovalev; struct St4x5 { uint32_t field[5]; }; 19828b63c3SDaniil Kovalev; struct St4x6 { uint32_t field[6]; }; 20828b63c3SDaniil Kovalev; struct St4x7 { uint32_t field[7]; }; 21828b63c3SDaniil Kovalev; struct St4x8 { uint32_t field[8]; }; 22828b63c3SDaniil Kovalev; struct St8x1 { uint64_t field[1]; }; 23828b63c3SDaniil Kovalev; struct St8x2 { uint64_t field[2]; }; 24828b63c3SDaniil Kovalev; struct St8x3 { uint64_t field[3]; }; 25828b63c3SDaniil Kovalev; struct St8x4 { uint64_t field[4]; }; 26828b63c3SDaniil Kovalev; 27828b63c3SDaniil Kovalev; #define DECLARE_FUNCTION(StName) \ 28828b63c3SDaniil Kovalev; static __global__ __attribute__((noinline)) \ 29828b63c3SDaniil Kovalev; void foo_##StName(struct StName in, struct StName* ret) { \ 30828b63c3SDaniil Kovalev; const unsigned size = sizeof(ret->field) / sizeof(*ret->field); \ 31828b63c3SDaniil Kovalev; for (unsigned i = 0; i != size; ++i) \ 32828b63c3SDaniil Kovalev; ret->field[i] = in.field[i]; \ 33828b63c3SDaniil Kovalev; } \ 34828b63c3SDaniil Kovalev; 35828b63c3SDaniil Kovalev; DECLARE_FUNCTION(St4x1) 36828b63c3SDaniil Kovalev; DECLARE_FUNCTION(St4x2) 37828b63c3SDaniil Kovalev; DECLARE_FUNCTION(St4x3) 38828b63c3SDaniil Kovalev; DECLARE_FUNCTION(St4x4) 39828b63c3SDaniil Kovalev; DECLARE_FUNCTION(St4x5) 40828b63c3SDaniil Kovalev; DECLARE_FUNCTION(St4x6) 41828b63c3SDaniil Kovalev; DECLARE_FUNCTION(St4x7) 42828b63c3SDaniil Kovalev; DECLARE_FUNCTION(St4x8) 43828b63c3SDaniil Kovalev; DECLARE_FUNCTION(St8x1) 44828b63c3SDaniil Kovalev; DECLARE_FUNCTION(St8x2) 45828b63c3SDaniil Kovalev; DECLARE_FUNCTION(St8x3) 46828b63c3SDaniil Kovalev; DECLARE_FUNCTION(St8x4) 47828b63c3SDaniil Kovalev; ---------------------------------------------------------------------------- 48828b63c3SDaniil Kovalev 49828b63c3SDaniil Kovalev%struct.St4x1 = type { [1 x i32] } 50828b63c3SDaniil Kovalev%struct.St4x2 = type { [2 x i32] } 51828b63c3SDaniil Kovalev%struct.St4x3 = type { [3 x i32] } 52828b63c3SDaniil Kovalev%struct.St4x4 = type { [4 x i32] } 53828b63c3SDaniil Kovalev%struct.St4x5 = type { [5 x i32] } 54828b63c3SDaniil Kovalev%struct.St4x6 = type { [6 x i32] } 55828b63c3SDaniil Kovalev%struct.St4x7 = type { [7 x i32] } 56828b63c3SDaniil Kovalev%struct.St4x8 = type { [8 x i32] } 57828b63c3SDaniil Kovalev%struct.St8x1 = type { [1 x i64] } 58828b63c3SDaniil Kovalev%struct.St8x2 = type { [2 x i64] } 59828b63c3SDaniil Kovalev%struct.St8x3 = type { [3 x i64] } 60828b63c3SDaniil Kovalev%struct.St8x4 = type { [4 x i64] } 61828b63c3SDaniil Kovalev 62*eb3d6469SDaniil Kovalevdefine dso_local void @foo_St4x1(ptr nocapture noundef readonly byval(%struct.St4x1) align 4 %in, ptr nocapture noundef writeonly %ret) { 63828b63c3SDaniil Kovalev ; CHECK-LABEL: .visible .func foo_St4x1( 64828b63c3SDaniil Kovalev ; CHECK: .param .align 4 .b8 foo_St4x1_param_0[4], 65828b63c3SDaniil Kovalev ; CHECK: .param .b32 foo_St4x1_param_1 66828b63c3SDaniil Kovalev ; CHECK: ) 67828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R1:%r[0-9]+]], [foo_St4x1_param_1]; 68828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R2:%r[0-9]+]], [foo_St4x1_param_0]; 69828b63c3SDaniil Kovalev ; CHECK: st.u32 [[[R1]]], [[R2]]; 70828b63c3SDaniil Kovalev ; CHECK: ret; 71*eb3d6469SDaniil Kovalev %1 = load i32, ptr %in, align 4 72*eb3d6469SDaniil Kovalev store i32 %1, ptr %ret, align 4 73828b63c3SDaniil Kovalev ret void 74828b63c3SDaniil Kovalev} 75828b63c3SDaniil Kovalev 76*eb3d6469SDaniil Kovalevdefine dso_local void @foo_St4x2(ptr nocapture noundef readonly byval(%struct.St4x2) align 4 %in, ptr nocapture noundef writeonly %ret) { 77828b63c3SDaniil Kovalev ; CHECK-LABEL: .visible .func foo_St4x2( 78828b63c3SDaniil Kovalev ; CHECK: .param .align 4 .b8 foo_St4x2_param_0[8], 79828b63c3SDaniil Kovalev ; CHECK: .param .b32 foo_St4x2_param_1 80828b63c3SDaniil Kovalev ; CHECK: ) 81828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R1:%r[0-9]+]], [foo_St4x2_param_1]; 82828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R2:%r[0-9]+]], [foo_St4x2_param_0]; 83828b63c3SDaniil Kovalev ; CHECK: st.u32 [[[R1]]], [[R2]]; 84828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R3:%r[0-9]+]], [foo_St4x2_param_0+4]; 85828b63c3SDaniil Kovalev ; CHECK: st.u32 [[[R1]]+4], [[R3]]; 86828b63c3SDaniil Kovalev ; CHECK: ret; 87*eb3d6469SDaniil Kovalev %1 = load i32, ptr %in, align 4 88*eb3d6469SDaniil Kovalev store i32 %1, ptr %ret, align 4 89*eb3d6469SDaniil Kovalev %arrayidx.1 = getelementptr inbounds [2 x i32], ptr %in, i64 0, i64 1 90*eb3d6469SDaniil Kovalev %2 = load i32, ptr %arrayidx.1, align 4 91*eb3d6469SDaniil Kovalev %arrayidx3.1 = getelementptr inbounds [2 x i32], ptr %ret, i64 0, i64 1 92*eb3d6469SDaniil Kovalev store i32 %2, ptr %arrayidx3.1, align 4 93828b63c3SDaniil Kovalev ret void 94828b63c3SDaniil Kovalev} 95828b63c3SDaniil Kovalev 96*eb3d6469SDaniil Kovalevdefine dso_local void @foo_St4x3(ptr nocapture noundef readonly byval(%struct.St4x3) align 4 %in, ptr nocapture noundef writeonly %ret) { 97828b63c3SDaniil Kovalev ; CHECK-LABEL: .visible .func foo_St4x3( 98828b63c3SDaniil Kovalev ; CHECK: .param .align 4 .b8 foo_St4x3_param_0[12], 99828b63c3SDaniil Kovalev ; CHECK: .param .b32 foo_St4x3_param_1 100828b63c3SDaniil Kovalev ; CHECK: ) 101828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R1:%r[0-9]+]], [foo_St4x3_param_1]; 102828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R2:%r[0-9]+]], [foo_St4x3_param_0]; 103828b63c3SDaniil Kovalev ; CHECK: st.u32 [[[R1]]], [[R2]]; 104828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R3:%r[0-9]+]], [foo_St4x3_param_0+4]; 105828b63c3SDaniil Kovalev ; CHECK: st.u32 [[[R1]]+4], [[R3]]; 106828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R4:%r[0-9]+]], [foo_St4x3_param_0+8]; 107828b63c3SDaniil Kovalev ; CHECK: st.u32 [[[R1]]+8], [[R4]]; 108828b63c3SDaniil Kovalev ; CHECK: ret; 109*eb3d6469SDaniil Kovalev %1 = load i32, ptr %in, align 4 110*eb3d6469SDaniil Kovalev store i32 %1, ptr %ret, align 4 111*eb3d6469SDaniil Kovalev %arrayidx.1 = getelementptr inbounds [3 x i32], ptr %in, i64 0, i64 1 112*eb3d6469SDaniil Kovalev %2 = load i32, ptr %arrayidx.1, align 4 113*eb3d6469SDaniil Kovalev %arrayidx3.1 = getelementptr inbounds [3 x i32], ptr %ret, i64 0, i64 1 114*eb3d6469SDaniil Kovalev store i32 %2, ptr %arrayidx3.1, align 4 115*eb3d6469SDaniil Kovalev %arrayidx.2 = getelementptr inbounds [3 x i32], ptr %in, i64 0, i64 2 116*eb3d6469SDaniil Kovalev %3 = load i32, ptr %arrayidx.2, align 4 117*eb3d6469SDaniil Kovalev %arrayidx3.2 = getelementptr inbounds [3 x i32], ptr %ret, i64 0, i64 2 118*eb3d6469SDaniil Kovalev store i32 %3, ptr %arrayidx3.2, align 4 119828b63c3SDaniil Kovalev ret void 120828b63c3SDaniil Kovalev} 121828b63c3SDaniil Kovalev 122*eb3d6469SDaniil Kovalevdefine dso_local void @foo_St4x4(ptr nocapture noundef readonly byval(%struct.St4x4) align 4 %in, ptr nocapture noundef writeonly %ret) { 123828b63c3SDaniil Kovalev ; CHECK-LABEL: .visible .func foo_St4x4( 124828b63c3SDaniil Kovalev ; CHECK: .param .align 4 .b8 foo_St4x4_param_0[16], 125828b63c3SDaniil Kovalev ; CHECK: .param .b32 foo_St4x4_param_1 126828b63c3SDaniil Kovalev ; CHECK: ) 127828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R1:%r[0-9]+]], [foo_St4x4_param_1]; 128828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R2:%r[0-9]+]], [foo_St4x4_param_0]; 129828b63c3SDaniil Kovalev ; CHECK: st.u32 [[[R1]]], [[R2]]; 130828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R3:%r[0-9]+]], [foo_St4x4_param_0+4]; 131828b63c3SDaniil Kovalev ; CHECK: st.u32 [[[R1]]+4], [[R3]]; 132828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R4:%r[0-9]+]], [foo_St4x4_param_0+8]; 133828b63c3SDaniil Kovalev ; CHECK: st.u32 [[[R1]]+8], [[R4]]; 134828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R5:%r[0-9]+]], [foo_St4x4_param_0+12]; 135828b63c3SDaniil Kovalev ; CHECK: st.u32 [[[R1]]+12], [[R5]]; 136828b63c3SDaniil Kovalev ; CHECK: ret; 137*eb3d6469SDaniil Kovalev %1 = load i32, ptr %in, align 4 138*eb3d6469SDaniil Kovalev store i32 %1, ptr %ret, align 4 139*eb3d6469SDaniil Kovalev %arrayidx.1 = getelementptr inbounds [4 x i32], ptr %in, i64 0, i64 1 140*eb3d6469SDaniil Kovalev %2 = load i32, ptr %arrayidx.1, align 4 141*eb3d6469SDaniil Kovalev %arrayidx3.1 = getelementptr inbounds [4 x i32], ptr %ret, i64 0, i64 1 142*eb3d6469SDaniil Kovalev store i32 %2, ptr %arrayidx3.1, align 4 143*eb3d6469SDaniil Kovalev %arrayidx.2 = getelementptr inbounds [4 x i32], ptr %in, i64 0, i64 2 144*eb3d6469SDaniil Kovalev %3 = load i32, ptr %arrayidx.2, align 4 145*eb3d6469SDaniil Kovalev %arrayidx3.2 = getelementptr inbounds [4 x i32], ptr %ret, i64 0, i64 2 146*eb3d6469SDaniil Kovalev store i32 %3, ptr %arrayidx3.2, align 4 147*eb3d6469SDaniil Kovalev %arrayidx.3 = getelementptr inbounds [4 x i32], ptr %in, i64 0, i64 3 148*eb3d6469SDaniil Kovalev %4 = load i32, ptr %arrayidx.3, align 4 149*eb3d6469SDaniil Kovalev %arrayidx3.3 = getelementptr inbounds [4 x i32], ptr %ret, i64 0, i64 3 150*eb3d6469SDaniil Kovalev store i32 %4, ptr %arrayidx3.3, align 4 151828b63c3SDaniil Kovalev ret void 152828b63c3SDaniil Kovalev} 153828b63c3SDaniil Kovalev 154*eb3d6469SDaniil Kovalevdefine dso_local void @foo_St4x5(ptr nocapture noundef readonly byval(%struct.St4x5) align 4 %in, ptr nocapture noundef writeonly %ret) { 155828b63c3SDaniil Kovalev ; CHECK-LABEL: .visible .func foo_St4x5( 156828b63c3SDaniil Kovalev ; CHECK: .param .align 4 .b8 foo_St4x5_param_0[20], 157828b63c3SDaniil Kovalev ; CHECK: .param .b32 foo_St4x5_param_1 158828b63c3SDaniil Kovalev ; CHECK: ) 159828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R1:%r[0-9]+]], [foo_St4x5_param_1]; 160828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R2:%r[0-9]+]], [foo_St4x5_param_0]; 161828b63c3SDaniil Kovalev ; CHECK: st.u32 [[[R1]]], [[R2]]; 162828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R3:%r[0-9]+]], [foo_St4x5_param_0+4]; 163828b63c3SDaniil Kovalev ; CHECK: st.u32 [[[R1]]+4], [[R3]]; 164828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R4:%r[0-9]+]], [foo_St4x5_param_0+8]; 165828b63c3SDaniil Kovalev ; CHECK: st.u32 [[[R1]]+8], [[R4]]; 166828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R5:%r[0-9]+]], [foo_St4x5_param_0+12]; 167828b63c3SDaniil Kovalev ; CHECK: st.u32 [[[R1]]+12], [[R5]]; 168828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R6:%r[0-9]+]], [foo_St4x5_param_0+16]; 169828b63c3SDaniil Kovalev ; CHECK: st.u32 [[[R1]]+16], [[R6]]; 170828b63c3SDaniil Kovalev ; CHECK: ret; 171*eb3d6469SDaniil Kovalev %1 = load i32, ptr %in, align 4 172*eb3d6469SDaniil Kovalev store i32 %1, ptr %ret, align 4 173*eb3d6469SDaniil Kovalev %arrayidx.1 = getelementptr inbounds [5 x i32], ptr %in, i64 0, i64 1 174*eb3d6469SDaniil Kovalev %2 = load i32, ptr %arrayidx.1, align 4 175*eb3d6469SDaniil Kovalev %arrayidx3.1 = getelementptr inbounds [5 x i32], ptr %ret, i64 0, i64 1 176*eb3d6469SDaniil Kovalev store i32 %2, ptr %arrayidx3.1, align 4 177*eb3d6469SDaniil Kovalev %arrayidx.2 = getelementptr inbounds [5 x i32], ptr %in, i64 0, i64 2 178*eb3d6469SDaniil Kovalev %3 = load i32, ptr %arrayidx.2, align 4 179*eb3d6469SDaniil Kovalev %arrayidx3.2 = getelementptr inbounds [5 x i32], ptr %ret, i64 0, i64 2 180*eb3d6469SDaniil Kovalev store i32 %3, ptr %arrayidx3.2, align 4 181*eb3d6469SDaniil Kovalev %arrayidx.3 = getelementptr inbounds [5 x i32], ptr %in, i64 0, i64 3 182*eb3d6469SDaniil Kovalev %4 = load i32, ptr %arrayidx.3, align 4 183*eb3d6469SDaniil Kovalev %arrayidx3.3 = getelementptr inbounds [5 x i32], ptr %ret, i64 0, i64 3 184*eb3d6469SDaniil Kovalev store i32 %4, ptr %arrayidx3.3, align 4 185*eb3d6469SDaniil Kovalev %arrayidx.4 = getelementptr inbounds [5 x i32], ptr %in, i64 0, i64 4 186*eb3d6469SDaniil Kovalev %5 = load i32, ptr %arrayidx.4, align 4 187*eb3d6469SDaniil Kovalev %arrayidx3.4 = getelementptr inbounds [5 x i32], ptr %ret, i64 0, i64 4 188*eb3d6469SDaniil Kovalev store i32 %5, ptr %arrayidx3.4, align 4 189828b63c3SDaniil Kovalev ret void 190828b63c3SDaniil Kovalev} 191828b63c3SDaniil Kovalev 192*eb3d6469SDaniil Kovalevdefine dso_local void @foo_St4x6(ptr nocapture noundef readonly byval(%struct.St4x6) align 4 %in, ptr nocapture noundef writeonly %ret) { 193828b63c3SDaniil Kovalev ; CHECK-LABEL: .visible .func foo_St4x6( 194828b63c3SDaniil Kovalev ; CHECK: .param .align 4 .b8 foo_St4x6_param_0[24], 195828b63c3SDaniil Kovalev ; CHECK: .param .b32 foo_St4x6_param_1 196828b63c3SDaniil Kovalev ; CHECK: ) 197828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R1:%r[0-9]+]], [foo_St4x6_param_1]; 198828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R2:%r[0-9]+]], [foo_St4x6_param_0]; 199828b63c3SDaniil Kovalev ; CHECK: st.u32 [[[R1]]], [[R2]]; 200828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R3:%r[0-9]+]], [foo_St4x6_param_0+4]; 201828b63c3SDaniil Kovalev ; CHECK: st.u32 [[[R1]]+4], [[R3]]; 202828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R4:%r[0-9]+]], [foo_St4x6_param_0+8]; 203828b63c3SDaniil Kovalev ; CHECK: st.u32 [[[R1]]+8], [[R4]]; 204828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R5:%r[0-9]+]], [foo_St4x6_param_0+12]; 205828b63c3SDaniil Kovalev ; CHECK: st.u32 [[[R1]]+12], [[R5]]; 206828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R6:%r[0-9]+]], [foo_St4x6_param_0+16]; 207828b63c3SDaniil Kovalev ; CHECK: st.u32 [[[R1]]+16], [[R6]]; 208828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R7:%r[0-9]+]], [foo_St4x6_param_0+20]; 209828b63c3SDaniil Kovalev ; CHECK: st.u32 [[[R1]]+20], [[R7]]; 210828b63c3SDaniil Kovalev ; CHECK: ret; 211*eb3d6469SDaniil Kovalev %1 = load i32, ptr %in, align 4 212*eb3d6469SDaniil Kovalev store i32 %1, ptr %ret, align 4 213*eb3d6469SDaniil Kovalev %arrayidx.1 = getelementptr inbounds [6 x i32], ptr %in, i64 0, i64 1 214*eb3d6469SDaniil Kovalev %2 = load i32, ptr %arrayidx.1, align 4 215*eb3d6469SDaniil Kovalev %arrayidx3.1 = getelementptr inbounds [6 x i32], ptr %ret, i64 0, i64 1 216*eb3d6469SDaniil Kovalev store i32 %2, ptr %arrayidx3.1, align 4 217*eb3d6469SDaniil Kovalev %arrayidx.2 = getelementptr inbounds [6 x i32], ptr %in, i64 0, i64 2 218*eb3d6469SDaniil Kovalev %3 = load i32, ptr %arrayidx.2, align 4 219*eb3d6469SDaniil Kovalev %arrayidx3.2 = getelementptr inbounds [6 x i32], ptr %ret, i64 0, i64 2 220*eb3d6469SDaniil Kovalev store i32 %3, ptr %arrayidx3.2, align 4 221*eb3d6469SDaniil Kovalev %arrayidx.3 = getelementptr inbounds [6 x i32], ptr %in, i64 0, i64 3 222*eb3d6469SDaniil Kovalev %4 = load i32, ptr %arrayidx.3, align 4 223*eb3d6469SDaniil Kovalev %arrayidx3.3 = getelementptr inbounds [6 x i32], ptr %ret, i64 0, i64 3 224*eb3d6469SDaniil Kovalev store i32 %4, ptr %arrayidx3.3, align 4 225*eb3d6469SDaniil Kovalev %arrayidx.4 = getelementptr inbounds [6 x i32], ptr %in, i64 0, i64 4 226*eb3d6469SDaniil Kovalev %5 = load i32, ptr %arrayidx.4, align 4 227*eb3d6469SDaniil Kovalev %arrayidx3.4 = getelementptr inbounds [6 x i32], ptr %ret, i64 0, i64 4 228*eb3d6469SDaniil Kovalev store i32 %5, ptr %arrayidx3.4, align 4 229*eb3d6469SDaniil Kovalev %arrayidx.5 = getelementptr inbounds [6 x i32], ptr %in, i64 0, i64 5 230*eb3d6469SDaniil Kovalev %6 = load i32, ptr %arrayidx.5, align 4 231*eb3d6469SDaniil Kovalev %arrayidx3.5 = getelementptr inbounds [6 x i32], ptr %ret, i64 0, i64 5 232*eb3d6469SDaniil Kovalev store i32 %6, ptr %arrayidx3.5, align 4 233828b63c3SDaniil Kovalev ret void 234828b63c3SDaniil Kovalev} 235828b63c3SDaniil Kovalev 236*eb3d6469SDaniil Kovalevdefine dso_local void @foo_St4x7(ptr nocapture noundef readonly byval(%struct.St4x7) align 4 %in, ptr nocapture noundef writeonly %ret) { 237828b63c3SDaniil Kovalev ; CHECK-LABEL: .visible .func foo_St4x7( 238828b63c3SDaniil Kovalev ; CHECK: .param .align 4 .b8 foo_St4x7_param_0[28], 239828b63c3SDaniil Kovalev ; CHECK: .param .b32 foo_St4x7_param_1 240828b63c3SDaniil Kovalev ; CHECK: ) 241828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R1:%r[0-9]+]], [foo_St4x7_param_1]; 242828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R2:%r[0-9]+]], [foo_St4x7_param_0]; 243828b63c3SDaniil Kovalev ; CHECK: st.u32 [[[R1]]], [[R2]]; 244828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R3:%r[0-9]+]], [foo_St4x7_param_0+4]; 245828b63c3SDaniil Kovalev ; CHECK: st.u32 [[[R1]]+4], [[R3]]; 246828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R4:%r[0-9]+]], [foo_St4x7_param_0+8]; 247828b63c3SDaniil Kovalev ; CHECK: st.u32 [[[R1]]+8], [[R4]]; 248828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R5:%r[0-9]+]], [foo_St4x7_param_0+12]; 249828b63c3SDaniil Kovalev ; CHECK: st.u32 [[[R1]]+12], [[R5]]; 250828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R6:%r[0-9]+]], [foo_St4x7_param_0+16]; 251828b63c3SDaniil Kovalev ; CHECK: st.u32 [[[R1]]+16], [[R6]]; 252828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R7:%r[0-9]+]], [foo_St4x7_param_0+20]; 253828b63c3SDaniil Kovalev ; CHECK: st.u32 [[[R1]]+20], [[R7]]; 254828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R8:%r[0-9]+]], [foo_St4x7_param_0+24]; 255828b63c3SDaniil Kovalev ; CHECK: st.u32 [[[R1]]+24], [[R8]]; 256828b63c3SDaniil Kovalev ; CHECK: ret; 257*eb3d6469SDaniil Kovalev %1 = load i32, ptr %in, align 4 258*eb3d6469SDaniil Kovalev store i32 %1, ptr %ret, align 4 259*eb3d6469SDaniil Kovalev %arrayidx.1 = getelementptr inbounds [7 x i32], ptr %in, i64 0, i64 1 260*eb3d6469SDaniil Kovalev %2 = load i32, ptr %arrayidx.1, align 4 261*eb3d6469SDaniil Kovalev %arrayidx3.1 = getelementptr inbounds [7 x i32], ptr %ret, i64 0, i64 1 262*eb3d6469SDaniil Kovalev store i32 %2, ptr %arrayidx3.1, align 4 263*eb3d6469SDaniil Kovalev %arrayidx.2 = getelementptr inbounds [7 x i32], ptr %in, i64 0, i64 2 264*eb3d6469SDaniil Kovalev %3 = load i32, ptr %arrayidx.2, align 4 265*eb3d6469SDaniil Kovalev %arrayidx3.2 = getelementptr inbounds [7 x i32], ptr %ret, i64 0, i64 2 266*eb3d6469SDaniil Kovalev store i32 %3, ptr %arrayidx3.2, align 4 267*eb3d6469SDaniil Kovalev %arrayidx.3 = getelementptr inbounds [7 x i32], ptr %in, i64 0, i64 3 268*eb3d6469SDaniil Kovalev %4 = load i32, ptr %arrayidx.3, align 4 269*eb3d6469SDaniil Kovalev %arrayidx3.3 = getelementptr inbounds [7 x i32], ptr %ret, i64 0, i64 3 270*eb3d6469SDaniil Kovalev store i32 %4, ptr %arrayidx3.3, align 4 271*eb3d6469SDaniil Kovalev %arrayidx.4 = getelementptr inbounds [7 x i32], ptr %in, i64 0, i64 4 272*eb3d6469SDaniil Kovalev %5 = load i32, ptr %arrayidx.4, align 4 273*eb3d6469SDaniil Kovalev %arrayidx3.4 = getelementptr inbounds [7 x i32], ptr %ret, i64 0, i64 4 274*eb3d6469SDaniil Kovalev store i32 %5, ptr %arrayidx3.4, align 4 275*eb3d6469SDaniil Kovalev %arrayidx.5 = getelementptr inbounds [7 x i32], ptr %in, i64 0, i64 5 276*eb3d6469SDaniil Kovalev %6 = load i32, ptr %arrayidx.5, align 4 277*eb3d6469SDaniil Kovalev %arrayidx3.5 = getelementptr inbounds [7 x i32], ptr %ret, i64 0, i64 5 278*eb3d6469SDaniil Kovalev store i32 %6, ptr %arrayidx3.5, align 4 279*eb3d6469SDaniil Kovalev %arrayidx.6 = getelementptr inbounds [7 x i32], ptr %in, i64 0, i64 6 280*eb3d6469SDaniil Kovalev %7 = load i32, ptr %arrayidx.6, align 4 281*eb3d6469SDaniil Kovalev %arrayidx3.6 = getelementptr inbounds [7 x i32], ptr %ret, i64 0, i64 6 282*eb3d6469SDaniil Kovalev store i32 %7, ptr %arrayidx3.6, align 4 283828b63c3SDaniil Kovalev ret void 284828b63c3SDaniil Kovalev} 285828b63c3SDaniil Kovalev 286*eb3d6469SDaniil Kovalevdefine dso_local void @foo_St4x8(ptr nocapture noundef readonly byval(%struct.St4x8) align 4 %in, ptr nocapture noundef writeonly %ret) { 287828b63c3SDaniil Kovalev ; CHECK-LABEL: .visible .func foo_St4x8( 288828b63c3SDaniil Kovalev ; CHECK: .param .align 4 .b8 foo_St4x8_param_0[32], 289828b63c3SDaniil Kovalev ; CHECK: .param .b32 foo_St4x8_param_1 290828b63c3SDaniil Kovalev ; CHECK: ) 291828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R1:%r[0-9]+]], [foo_St4x8_param_1]; 292828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R2:%r[0-9]+]], [foo_St4x8_param_0]; 293828b63c3SDaniil Kovalev ; CHECK: st.u32 [[[R1]]], [[R2]]; 294828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R3:%r[0-9]+]], [foo_St4x8_param_0+4]; 295828b63c3SDaniil Kovalev ; CHECK: st.u32 [[[R1]]+4], [[R3]]; 296828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R4:%r[0-9]+]], [foo_St4x8_param_0+8]; 297828b63c3SDaniil Kovalev ; CHECK: st.u32 [[[R1]]+8], [[R4]]; 298828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R5:%r[0-9]+]], [foo_St4x8_param_0+12]; 299828b63c3SDaniil Kovalev ; CHECK: st.u32 [[[R1]]+12], [[R5]]; 300828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R6:%r[0-9]+]], [foo_St4x8_param_0+16]; 301828b63c3SDaniil Kovalev ; CHECK: st.u32 [[[R1]]+16], [[R6]]; 302828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R7:%r[0-9]+]], [foo_St4x8_param_0+20]; 303828b63c3SDaniil Kovalev ; CHECK: st.u32 [[[R1]]+20], [[R7]]; 304828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R8:%r[0-9]+]], [foo_St4x8_param_0+24]; 305828b63c3SDaniil Kovalev ; CHECK: st.u32 [[[R1]]+24], [[R8]]; 306828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R9:%r[0-9]+]], [foo_St4x8_param_0+28]; 307828b63c3SDaniil Kovalev ; CHECK: st.u32 [[[R1]]+28], [[R9]]; 308828b63c3SDaniil Kovalev ; CHECK: ret; 309*eb3d6469SDaniil Kovalev %1 = load i32, ptr %in, align 4 310*eb3d6469SDaniil Kovalev store i32 %1, ptr %ret, align 4 311*eb3d6469SDaniil Kovalev %arrayidx.1 = getelementptr inbounds [8 x i32], ptr %in, i64 0, i64 1 312*eb3d6469SDaniil Kovalev %2 = load i32, ptr %arrayidx.1, align 4 313*eb3d6469SDaniil Kovalev %arrayidx3.1 = getelementptr inbounds [8 x i32], ptr %ret, i64 0, i64 1 314*eb3d6469SDaniil Kovalev store i32 %2, ptr %arrayidx3.1, align 4 315*eb3d6469SDaniil Kovalev %arrayidx.2 = getelementptr inbounds [8 x i32], ptr %in, i64 0, i64 2 316*eb3d6469SDaniil Kovalev %3 = load i32, ptr %arrayidx.2, align 4 317*eb3d6469SDaniil Kovalev %arrayidx3.2 = getelementptr inbounds [8 x i32], ptr %ret, i64 0, i64 2 318*eb3d6469SDaniil Kovalev store i32 %3, ptr %arrayidx3.2, align 4 319*eb3d6469SDaniil Kovalev %arrayidx.3 = getelementptr inbounds [8 x i32], ptr %in, i64 0, i64 3 320*eb3d6469SDaniil Kovalev %4 = load i32, ptr %arrayidx.3, align 4 321*eb3d6469SDaniil Kovalev %arrayidx3.3 = getelementptr inbounds [8 x i32], ptr %ret, i64 0, i64 3 322*eb3d6469SDaniil Kovalev store i32 %4, ptr %arrayidx3.3, align 4 323*eb3d6469SDaniil Kovalev %arrayidx.4 = getelementptr inbounds [8 x i32], ptr %in, i64 0, i64 4 324*eb3d6469SDaniil Kovalev %5 = load i32, ptr %arrayidx.4, align 4 325*eb3d6469SDaniil Kovalev %arrayidx3.4 = getelementptr inbounds [8 x i32], ptr %ret, i64 0, i64 4 326*eb3d6469SDaniil Kovalev store i32 %5, ptr %arrayidx3.4, align 4 327*eb3d6469SDaniil Kovalev %arrayidx.5 = getelementptr inbounds [8 x i32], ptr %in, i64 0, i64 5 328*eb3d6469SDaniil Kovalev %6 = load i32, ptr %arrayidx.5, align 4 329*eb3d6469SDaniil Kovalev %arrayidx3.5 = getelementptr inbounds [8 x i32], ptr %ret, i64 0, i64 5 330*eb3d6469SDaniil Kovalev store i32 %6, ptr %arrayidx3.5, align 4 331*eb3d6469SDaniil Kovalev %arrayidx.6 = getelementptr inbounds [8 x i32], ptr %in, i64 0, i64 6 332*eb3d6469SDaniil Kovalev %7 = load i32, ptr %arrayidx.6, align 4 333*eb3d6469SDaniil Kovalev %arrayidx3.6 = getelementptr inbounds [8 x i32], ptr %ret, i64 0, i64 6 334*eb3d6469SDaniil Kovalev store i32 %7, ptr %arrayidx3.6, align 4 335*eb3d6469SDaniil Kovalev %arrayidx.7 = getelementptr inbounds [8 x i32], ptr %in, i64 0, i64 7 336*eb3d6469SDaniil Kovalev %8 = load i32, ptr %arrayidx.7, align 4 337*eb3d6469SDaniil Kovalev %arrayidx3.7 = getelementptr inbounds [8 x i32], ptr %ret, i64 0, i64 7 338*eb3d6469SDaniil Kovalev store i32 %8, ptr %arrayidx3.7, align 4 339828b63c3SDaniil Kovalev ret void 340828b63c3SDaniil Kovalev} 341828b63c3SDaniil Kovalev 342*eb3d6469SDaniil Kovalevdefine dso_local void @foo_St8x1(ptr nocapture noundef readonly byval(%struct.St8x1) align 8 %in, ptr nocapture noundef writeonly %ret) { 343828b63c3SDaniil Kovalev ; CHECK-LABEL: .visible .func foo_St8x1( 344828b63c3SDaniil Kovalev ; CHECK: .param .align 8 .b8 foo_St8x1_param_0[8], 345828b63c3SDaniil Kovalev ; CHECK: .param .b32 foo_St8x1_param_1 346828b63c3SDaniil Kovalev ; CHECK: ) 347828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R1:%r[0-9]+]], [foo_St8x1_param_1]; 348828b63c3SDaniil Kovalev ; CHECK: ld.param.u64 [[RD1:%rd[0-9]+]], [foo_St8x1_param_0]; 349828b63c3SDaniil Kovalev ; CHECK: st.u64 [[[R1]]], [[RD1]]; 350828b63c3SDaniil Kovalev ; CHECK: ret; 351*eb3d6469SDaniil Kovalev %1 = load i64, ptr %in, align 8 352*eb3d6469SDaniil Kovalev store i64 %1, ptr %ret, align 8 353828b63c3SDaniil Kovalev ret void 354828b63c3SDaniil Kovalev} 355828b63c3SDaniil Kovalev 356*eb3d6469SDaniil Kovalevdefine dso_local void @foo_St8x2(ptr nocapture noundef readonly byval(%struct.St8x2) align 8 %in, ptr nocapture noundef writeonly %ret) { 357828b63c3SDaniil Kovalev ; CHECK-LABEL: .visible .func foo_St8x2( 358828b63c3SDaniil Kovalev ; CHECK: .param .align 8 .b8 foo_St8x2_param_0[16], 359828b63c3SDaniil Kovalev ; CHECK: .param .b32 foo_St8x2_param_1 360828b63c3SDaniil Kovalev ; CHECK: ) 361828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R1:%r[0-9]+]], [foo_St8x2_param_1]; 362828b63c3SDaniil Kovalev ; CHECK: ld.param.u64 [[RD1:%rd[0-9]+]], [foo_St8x2_param_0]; 363828b63c3SDaniil Kovalev ; CHECK: st.u64 [[[R1]]], [[RD1]]; 364828b63c3SDaniil Kovalev ; CHECK: ld.param.u64 [[RD2:%rd[0-9]+]], [foo_St8x2_param_0+8]; 365828b63c3SDaniil Kovalev ; CHECK: st.u64 [[[R1]]+8], [[RD2]]; 366828b63c3SDaniil Kovalev ; CHECK: ret; 367*eb3d6469SDaniil Kovalev %1 = load i64, ptr %in, align 8 368*eb3d6469SDaniil Kovalev store i64 %1, ptr %ret, align 8 369*eb3d6469SDaniil Kovalev %arrayidx.1 = getelementptr inbounds [2 x i64], ptr %in, i64 0, i64 1 370*eb3d6469SDaniil Kovalev %2 = load i64, ptr %arrayidx.1, align 8 371*eb3d6469SDaniil Kovalev %arrayidx3.1 = getelementptr inbounds [2 x i64], ptr %ret, i64 0, i64 1 372*eb3d6469SDaniil Kovalev store i64 %2, ptr %arrayidx3.1, align 8 373828b63c3SDaniil Kovalev ret void 374828b63c3SDaniil Kovalev} 375828b63c3SDaniil Kovalev 376*eb3d6469SDaniil Kovalevdefine dso_local void @foo_St8x3(ptr nocapture noundef readonly byval(%struct.St8x3) align 8 %in, ptr nocapture noundef writeonly %ret) { 377828b63c3SDaniil Kovalev ; CHECK-LABEL: .visible .func foo_St8x3( 378828b63c3SDaniil Kovalev ; CHECK: .param .align 8 .b8 foo_St8x3_param_0[24], 379828b63c3SDaniil Kovalev ; CHECK: .param .b32 foo_St8x3_param_1 380828b63c3SDaniil Kovalev ; CHECK: ) 381828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R1:%r[0-9]+]], [foo_St8x3_param_1]; 382828b63c3SDaniil Kovalev ; CHECK: ld.param.u64 [[RD1:%rd[0-9]+]], [foo_St8x3_param_0]; 383828b63c3SDaniil Kovalev ; CHECK: st.u64 [[[R1]]], [[RD1]]; 384828b63c3SDaniil Kovalev ; CHECK: ld.param.u64 [[RD2:%rd[0-9]+]], [foo_St8x3_param_0+8]; 385828b63c3SDaniil Kovalev ; CHECK: st.u64 [[[R1]]+8], [[RD2]]; 386828b63c3SDaniil Kovalev ; CHECK: ld.param.u64 [[RD3:%rd[0-9]+]], [foo_St8x3_param_0+16]; 387828b63c3SDaniil Kovalev ; CHECK: st.u64 [[[R1]]+16], [[RD3]]; 388828b63c3SDaniil Kovalev ; CHECK: ret; 389*eb3d6469SDaniil Kovalev %1 = load i64, ptr %in, align 8 390*eb3d6469SDaniil Kovalev store i64 %1, ptr %ret, align 8 391*eb3d6469SDaniil Kovalev %arrayidx.1 = getelementptr inbounds [3 x i64], ptr %in, i64 0, i64 1 392*eb3d6469SDaniil Kovalev %2 = load i64, ptr %arrayidx.1, align 8 393*eb3d6469SDaniil Kovalev %arrayidx3.1 = getelementptr inbounds [3 x i64], ptr %ret, i64 0, i64 1 394*eb3d6469SDaniil Kovalev store i64 %2, ptr %arrayidx3.1, align 8 395*eb3d6469SDaniil Kovalev %arrayidx.2 = getelementptr inbounds [3 x i64], ptr %in, i64 0, i64 2 396*eb3d6469SDaniil Kovalev %3 = load i64, ptr %arrayidx.2, align 8 397*eb3d6469SDaniil Kovalev %arrayidx3.2 = getelementptr inbounds [3 x i64], ptr %ret, i64 0, i64 2 398*eb3d6469SDaniil Kovalev store i64 %3, ptr %arrayidx3.2, align 8 399828b63c3SDaniil Kovalev ret void 400828b63c3SDaniil Kovalev} 401828b63c3SDaniil Kovalev 402*eb3d6469SDaniil Kovalevdefine dso_local void @foo_St8x4(ptr nocapture noundef readonly byval(%struct.St8x4) align 8 %in, ptr nocapture noundef writeonly %ret) { 403828b63c3SDaniil Kovalev ; CHECK-LABEL: .visible .func foo_St8x4( 404828b63c3SDaniil Kovalev ; CHECK: .param .align 8 .b8 foo_St8x4_param_0[32], 405828b63c3SDaniil Kovalev ; CHECK: .param .b32 foo_St8x4_param_1 406828b63c3SDaniil Kovalev ; CHECK: ) 407828b63c3SDaniil Kovalev ; CHECK: ld.param.u32 [[R1:%r[0-9]+]], [foo_St8x4_param_1]; 408828b63c3SDaniil Kovalev ; CHECK: ld.param.u64 [[RD1:%rd[0-9]+]], [foo_St8x4_param_0]; 409828b63c3SDaniil Kovalev ; CHECK: st.u64 [[[R1]]], [[RD1]]; 410828b63c3SDaniil Kovalev ; CHECK: ld.param.u64 [[RD2:%rd[0-9]+]], [foo_St8x4_param_0+8]; 411828b63c3SDaniil Kovalev ; CHECK: st.u64 [[[R1]]+8], [[RD2]]; 412828b63c3SDaniil Kovalev ; CHECK: ld.param.u64 [[RD3:%rd[0-9]+]], [foo_St8x4_param_0+16]; 413828b63c3SDaniil Kovalev ; CHECK: st.u64 [[[R1]]+16], [[RD3]]; 414828b63c3SDaniil Kovalev ; CHECK: ld.param.u64 [[RD4:%rd[0-9]+]], [foo_St8x4_param_0+24]; 415828b63c3SDaniil Kovalev ; CHECK: st.u64 [[[R1]]+24], [[RD4]]; 416828b63c3SDaniil Kovalev ; CHECK: ret; 417*eb3d6469SDaniil Kovalev %1 = load i64, ptr %in, align 8 418*eb3d6469SDaniil Kovalev store i64 %1, ptr %ret, align 8 419*eb3d6469SDaniil Kovalev %arrayidx.1 = getelementptr inbounds [4 x i64], ptr %in, i64 0, i64 1 420*eb3d6469SDaniil Kovalev %2 = load i64, ptr %arrayidx.1, align 8 421*eb3d6469SDaniil Kovalev %arrayidx3.1 = getelementptr inbounds [4 x i64], ptr %ret, i64 0, i64 1 422*eb3d6469SDaniil Kovalev store i64 %2, ptr %arrayidx3.1, align 8 423*eb3d6469SDaniil Kovalev %arrayidx.2 = getelementptr inbounds [4 x i64], ptr %in, i64 0, i64 2 424*eb3d6469SDaniil Kovalev %3 = load i64, ptr %arrayidx.2, align 8 425*eb3d6469SDaniil Kovalev %arrayidx3.2 = getelementptr inbounds [4 x i64], ptr %ret, i64 0, i64 2 426*eb3d6469SDaniil Kovalev store i64 %3, ptr %arrayidx3.2, align 8 427*eb3d6469SDaniil Kovalev %arrayidx.3 = getelementptr inbounds [4 x i64], ptr %in, i64 0, i64 3 428*eb3d6469SDaniil Kovalev %4 = load i64, ptr %arrayidx.3, align 8 429*eb3d6469SDaniil Kovalev %arrayidx3.3 = getelementptr inbounds [4 x i64], ptr %ret, i64 0, i64 3 430*eb3d6469SDaniil Kovalev store i64 %4, ptr %arrayidx3.3, align 8 431828b63c3SDaniil Kovalev ret void 432828b63c3SDaniil Kovalev} 433