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