[llvm] eb3d646 - [NVPTX] Use opaque pointers in param space vectorization tests

Daniil Kovalev via llvm-commits llvm-commits at lists.llvm.org
Sun Apr 17 09:09:47 PDT 2022


Author: Daniil Kovalev
Date: 2022-04-17T19:08:31+03:00
New Revision: eb3d64695f27af6d58154df32da008f1b7c35f73

URL: https://github.com/llvm/llvm-project/commit/eb3d64695f27af6d58154df32da008f1b7c35f73
DIFF: https://github.com/llvm/llvm-project/commit/eb3d64695f27af6d58154df32da008f1b7c35f73.diff

LOG: [NVPTX] Use opaque pointers in param space vectorization tests

Opaque pointers are enabled by default since D123300, so test IR should be
regenerated correspondingly.

Differential Revision: https://reviews.llvm.org/D123842

Added: 
    

Modified: 
    llvm/test/CodeGen/NVPTX/param-vectorize-device.ll
    llvm/test/CodeGen/NVPTX/param-vectorize-kernel.ll

Removed: 
    


################################################################################
diff  --git a/llvm/test/CodeGen/NVPTX/param-vectorize-device.ll b/llvm/test/CodeGen/NVPTX/param-vectorize-device.ll
index 681faf0bfa534..ecec6f0ba0a44 100644
--- a/llvm/test/CodeGen/NVPTX/param-vectorize-device.ll
+++ b/llvm/test/CodeGen/NVPTX/param-vectorize-device.ll
@@ -77,7 +77,7 @@
 ; - function argument (including retval) vectorization is done with internal linkage;
 ; - caller and callee specify correct alignment for callee's params.
 
-define dso_local void @caller_St4x1(%struct.St4x1* nocapture noundef readonly byval(%struct.St4x1) align 4 %in, %struct.St4x1* nocapture noundef writeonly %ret) {
+define dso_local void @caller_St4x1(ptr nocapture noundef readonly byval(%struct.St4x1) align 4 %in, ptr nocapture noundef writeonly %ret) {
   ; CHECK-LABEL: .visible .func caller_St4x1(
   ; CHECK:               .param .align 4 .b8 caller_St4x1_param_0[4],
   ; CHECK:               .param .b32 caller_St4x1_param_1
@@ -91,12 +91,10 @@ define dso_local void @caller_St4x1(%struct.St4x1* nocapture noundef readonly by
   ; CHECK-NEXT:  param0
   ; CHECK-NEXT:  );
   ; CHECK:       ld.param.b32 {{%r[0-9]+}}, [retval0+0];
-  %1 = getelementptr inbounds %struct.St4x1, %struct.St4x1* %in, i64 0, i32 0, i64 0
-  %2 = load i32, i32* %1, align 4
-  %call = tail call fastcc [1 x i32] @callee_St4x1(i32 %2)
+  %1 = load i32, ptr %in, align 4
+  %call = tail call fastcc [1 x i32] @callee_St4x1(i32 %1) #2
   %.fca.0.extract = extractvalue [1 x i32] %call, 0
-  %ref.tmp.sroa.0.0..sroa_idx = getelementptr inbounds %struct.St4x1, %struct.St4x1* %ret, i64 0, i32 0, i64 0
-  store i32 %.fca.0.extract, i32* %ref.tmp.sroa.0.0..sroa_idx, align 4
+  store i32 %.fca.0.extract, ptr %ret, align 4
   ret void
 }
 
@@ -111,7 +109,7 @@ define internal fastcc [1 x i32] @callee_St4x1(i32 %in.0.val) {
   ret [1 x i32] %oldret
 }
 
-define dso_local void @caller_St4x2(%struct.St4x2* nocapture noundef readonly byval(%struct.St4x2) align 4 %in, %struct.St4x2* nocapture noundef writeonly %ret) {
+define dso_local void @caller_St4x2(ptr nocapture noundef readonly byval(%struct.St4x2) align 4 %in, ptr nocapture noundef writeonly %ret) {
   ; CHECK-LABEL: .visible .func caller_St4x2(
   ; CHECK:               .param .align 4 .b8 caller_St4x2_param_0[8],
   ; CHECK:               .param .b32 caller_St4x2_param_1
@@ -125,38 +123,34 @@ define dso_local void @caller_St4x2(%struct.St4x2* nocapture noundef readonly by
   ; CHECK-NEXT:  param0
   ; CHECK-NEXT:  );
   ; CHECK:       ld.param.v2.b32 {{{%r[0-9]+}}, {{%r[0-9]+}}}, [retval0+0];
-  %agg.tmp = alloca i64, align 8
-  %tmpcast = bitcast i64* %agg.tmp to %struct.St4x2*
-  %1 = bitcast %struct.St4x2* %in to i64*
-  %2 = load i64, i64* %1, align 4
-  store i64 %2, i64* %agg.tmp, align 8
-  %call = tail call fastcc [2 x i32] @callee_St4x2(%struct.St4x2* noundef nonnull byval(%struct.St4x2) align 4 %tmpcast)
+  %agg.tmp = alloca %struct.St4x2, align 8
+  %1 = load i64, ptr %in, align 4
+  store i64 %1, ptr %agg.tmp, align 8
+  %call = tail call fastcc [2 x i32] @callee_St4x2(ptr noundef nonnull byval(%struct.St4x2) align 4 %agg.tmp) #2
   %.fca.0.extract = extractvalue [2 x i32] %call, 0
   %.fca.1.extract = extractvalue [2 x i32] %call, 1
-  %ref.tmp.sroa.0.0..sroa_idx = getelementptr inbounds %struct.St4x2, %struct.St4x2* %ret, i64 0, i32 0, i64 0
-  store i32 %.fca.0.extract, i32* %ref.tmp.sroa.0.0..sroa_idx, align 4
-  %ref.tmp.sroa.4.0..sroa_idx3 = getelementptr inbounds %struct.St4x2, %struct.St4x2* %ret, i64 0, i32 0, i64 1
-  store i32 %.fca.1.extract, i32* %ref.tmp.sroa.4.0..sroa_idx3, align 4
+  store i32 %.fca.0.extract, ptr %ret, align 4
+  %ref.tmp.sroa.4.0..sroa_idx = getelementptr inbounds i8, ptr %ret, i64 4
+  store i32 %.fca.1.extract, ptr %ref.tmp.sroa.4.0..sroa_idx, align 4
   ret void
 }
 
-define internal fastcc [2 x i32] @callee_St4x2(%struct.St4x2* nocapture noundef readonly byval(%struct.St4x2) align 4 %in) {
+define internal fastcc [2 x i32] @callee_St4x2(ptr nocapture noundef readonly byval(%struct.St4x2) align 4 %in) {
   ; CHECK:       .func  (.param .align 16 .b8 func_retval0[8])
   ; CHECK-LABEL: callee_St4x2(
   ; CHECK-NEXT:  .param .align 16 .b8 callee_St4x2_param_0[8]
   ; CHECK:       ld.param.v2.u32 {[[R1:%r[0-9]+]], [[R2:%r[0-9]+]]}, [callee_St4x2_param_0];
   ; CHECK:       st.param.v2.b32 [func_retval0+0], {[[R1]], [[R2]]};
   ; CHECK-NEXT:  ret;
-  %arrayidx = getelementptr inbounds %struct.St4x2, %struct.St4x2* %in, i64 0, i32 0, i64 0
-  %1 = load i32, i32* %arrayidx, align 4
-  %arrayidx.1 = getelementptr inbounds %struct.St4x2, %struct.St4x2* %in, i64 0, i32 0, i64 1
-  %2 = load i32, i32* %arrayidx.1, align 4
+  %1 = load i32, ptr %in, align 4
+  %arrayidx.1 = getelementptr inbounds [2 x i32], ptr %in, i64 0, i64 1
+  %2 = load i32, ptr %arrayidx.1, align 4
   %3 = insertvalue [2 x i32] poison, i32 %1, 0
   %oldret = insertvalue [2 x i32] %3, i32 %2, 1
   ret [2 x i32] %oldret
 }
 
-define dso_local void @caller_St4x3(%struct.St4x3* nocapture noundef readonly byval(%struct.St4x3) align 4 %in, %struct.St4x3* nocapture noundef writeonly %ret) {
+define dso_local void @caller_St4x3(ptr nocapture noundef readonly byval(%struct.St4x3) align 4 %in, ptr nocapture noundef writeonly %ret) {
   ; CHECK-LABEL: .visible .func caller_St4x3(
   ; CHECK:               .param .align 4 .b8 caller_St4x3_param_0[12],
   ; CHECK:               .param .b32 caller_St4x3_param_1
@@ -172,21 +166,19 @@ define dso_local void @caller_St4x3(%struct.St4x3* nocapture noundef readonly by
   ; CHECK-NEXT:  );
   ; CHECK:       ld.param.v2.b32 {{{%r[0-9]+}}, {{%r[0-9]+}}}, [retval0+0];
   ; CHECK:       ld.param.b32    {{%r[0-9]+}},  [retval0+8];
-  %call = tail call fastcc [3 x i32] @callee_St4x3(%struct.St4x3* noundef nonnull byval(%struct.St4x3) align 4 %in)
+  %call = tail call fastcc [3 x i32] @callee_St4x3(ptr noundef nonnull byval(%struct.St4x3) align 4 %in) #2
   %.fca.0.extract = extractvalue [3 x i32] %call, 0
   %.fca.1.extract = extractvalue [3 x i32] %call, 1
   %.fca.2.extract = extractvalue [3 x i32] %call, 2
-  %ref.tmp.sroa.0.0..sroa_idx = getelementptr inbounds %struct.St4x3, %struct.St4x3* %ret, i64 0, i32 0, i64 0
-  store i32 %.fca.0.extract, i32* %ref.tmp.sroa.0.0..sroa_idx, align 4
-  %ref.tmp.sroa.4.0..sroa_idx2 = getelementptr inbounds %struct.St4x3, %struct.St4x3* %ret, i64 0, i32 0, i64 1
-  store i32 %.fca.1.extract, i32* %ref.tmp.sroa.4.0..sroa_idx2, align 4
-  %ref.tmp.sroa.5.0..sroa_idx4 = getelementptr inbounds %struct.St4x3, %struct.St4x3* %ret, i64 0, i32 0, i64 2
-  store i32 %.fca.2.extract, i32* %ref.tmp.sroa.5.0..sroa_idx4, align 4
+  store i32 %.fca.0.extract, ptr %ret, align 4
+  %ref.tmp.sroa.4.0..sroa_idx = getelementptr inbounds i8, ptr %ret, i64 4
+  store i32 %.fca.1.extract, ptr %ref.tmp.sroa.4.0..sroa_idx, align 4
+  %ref.tmp.sroa.5.0..sroa_idx = getelementptr inbounds i8, ptr %ret, i64 8
+  store i32 %.fca.2.extract, ptr %ref.tmp.sroa.5.0..sroa_idx, align 4
   ret void
 }
 
-
-define internal fastcc [3 x i32] @callee_St4x3(%struct.St4x3* nocapture noundef readonly byval(%struct.St4x3) align 4 %in) {
+define internal fastcc [3 x i32] @callee_St4x3(ptr nocapture noundef readonly byval(%struct.St4x3) align 4 %in) {
   ; CHECK:       .func  (.param .align 16 .b8 func_retval0[12])
   ; CHECK-LABEL: callee_St4x3(
   ; CHECK-NEXT:  .param .align 16 .b8 callee_St4x3_param_0[12]
@@ -195,20 +187,18 @@ define internal fastcc [3 x i32] @callee_St4x3(%struct.St4x3* nocapture noundef
   ; CHECK:       st.param.v2.b32 [func_retval0+0], {[[R1]], [[R2]]};
   ; CHECK:       st.param.b32    [func_retval0+8], [[R3]];
   ; CHECK-NEXT:  ret;
-  %arrayidx = getelementptr inbounds %struct.St4x3, %struct.St4x3* %in, i64 0, i32 0, i64 0
-  %1 = load i32, i32* %arrayidx, align 4
-  %arrayidx.1 = getelementptr inbounds %struct.St4x3, %struct.St4x3* %in, i64 0, i32 0, i64 1
-  %2 = load i32, i32* %arrayidx.1, align 4
-  %arrayidx.2 = getelementptr inbounds %struct.St4x3, %struct.St4x3* %in, i64 0, i32 0, i64 2
-  %3 = load i32, i32* %arrayidx.2, align 4
+  %1 = load i32, ptr %in, align 4
+  %arrayidx.1 = getelementptr inbounds [3 x i32], ptr %in, i64 0, i64 1
+  %2 = load i32, ptr %arrayidx.1, align 4
+  %arrayidx.2 = getelementptr inbounds [3 x i32], ptr %in, i64 0, i64 2
+  %3 = load i32, ptr %arrayidx.2, align 4
   %4 = insertvalue [3 x i32] poison, i32 %1, 0
   %5 = insertvalue [3 x i32] %4, i32 %2, 1
   %oldret = insertvalue [3 x i32] %5, i32 %3, 2
   ret [3 x i32] %oldret
 }
 
-
-define dso_local void @caller_St4x4(%struct.St4x4* nocapture noundef readonly byval(%struct.St4x4) align 4 %in, %struct.St4x4* nocapture noundef writeonly %ret) {
+define dso_local void @caller_St4x4(ptr nocapture noundef readonly byval(%struct.St4x4) align 4 %in, ptr nocapture noundef writeonly %ret) {
   ; CHECK-LABEL: .visible .func caller_St4x4(
   ; CHECK:               .param .align 4 .b8 caller_St4x4_param_0[16],
   ; CHECK:               .param .b32 caller_St4x4_param_1
@@ -222,38 +212,35 @@ define dso_local void @caller_St4x4(%struct.St4x4* nocapture noundef readonly by
   ; CHECK-NEXT:  param0
   ; CHECK-NEXT:  );
   ; CHECK:       ld.param.v4.b32 {{{%r[0-9]+}}, {{%r[0-9]+}}, {{%r[0-9]+}}, {{%r[0-9]+}}}, [retval0+0];
-  %call = tail call fastcc [4 x i32] @callee_St4x4(%struct.St4x4* noundef nonnull byval(%struct.St4x4) align 4 %in)
+  %call = tail call fastcc [4 x i32] @callee_St4x4(ptr noundef nonnull byval(%struct.St4x4) align 4 %in) #2
   %.fca.0.extract = extractvalue [4 x i32] %call, 0
   %.fca.1.extract = extractvalue [4 x i32] %call, 1
   %.fca.2.extract = extractvalue [4 x i32] %call, 2
   %.fca.3.extract = extractvalue [4 x i32] %call, 3
-  %ref.tmp.sroa.0.0..sroa_idx = getelementptr inbounds %struct.St4x4, %struct.St4x4* %ret, i64 0, i32 0, i64 0
-  store i32 %.fca.0.extract, i32* %ref.tmp.sroa.0.0..sroa_idx, align 4
-  %ref.tmp.sroa.4.0..sroa_idx3 = getelementptr inbounds %struct.St4x4, %struct.St4x4* %ret, i64 0, i32 0, i64 1
-  store i32 %.fca.1.extract, i32* %ref.tmp.sroa.4.0..sroa_idx3, align 4
-  %ref.tmp.sroa.5.0..sroa_idx5 = getelementptr inbounds %struct.St4x4, %struct.St4x4* %ret, i64 0, i32 0, i64 2
-  store i32 %.fca.2.extract, i32* %ref.tmp.sroa.5.0..sroa_idx5, align 4
-  %ref.tmp.sroa.6.0..sroa_idx7 = getelementptr inbounds %struct.St4x4, %struct.St4x4* %ret, i64 0, i32 0, i64 3
-  store i32 %.fca.3.extract, i32* %ref.tmp.sroa.6.0..sroa_idx7, align 4
+  store i32 %.fca.0.extract, ptr %ret, align 4
+  %ref.tmp.sroa.4.0..sroa_idx = getelementptr inbounds i8, ptr %ret, i64 4
+  store i32 %.fca.1.extract, ptr %ref.tmp.sroa.4.0..sroa_idx, align 4
+  %ref.tmp.sroa.5.0..sroa_idx = getelementptr inbounds i8, ptr %ret, i64 8
+  store i32 %.fca.2.extract, ptr %ref.tmp.sroa.5.0..sroa_idx, align 4
+  %ref.tmp.sroa.6.0..sroa_idx = getelementptr inbounds i8, ptr %ret, i64 12
+  store i32 %.fca.3.extract, ptr %ref.tmp.sroa.6.0..sroa_idx, align 4
   ret void
 }
 
-
-define internal fastcc [4 x i32] @callee_St4x4(%struct.St4x4* nocapture noundef readonly byval(%struct.St4x4) align 4 %in) {
+define internal fastcc [4 x i32] @callee_St4x4(ptr nocapture noundef readonly byval(%struct.St4x4) align 4 %in) {
   ; CHECK:       .func  (.param .align 16 .b8 func_retval0[16])
   ; CHECK-LABEL: callee_St4x4(
   ; CHECK-NEXT:  .param .align 16 .b8 callee_St4x4_param_0[16]
   ; CHECK:       ld.param.v4.u32 {[[R1:%r[0-9]+]], [[R2:%r[0-9]+]], [[R3:%r[0-9]+]], [[R4:%r[0-9]+]]}, [callee_St4x4_param_0];
   ; CHECK:       st.param.v4.b32 [func_retval0+0], {[[R1]], [[R2]], [[R3]], [[R4]]};
   ; CHECK-NEXT:  ret;
-  %arrayidx = getelementptr inbounds %struct.St4x4, %struct.St4x4* %in, i64 0, i32 0, i64 0
-  %1 = load i32, i32* %arrayidx, align 4
-  %arrayidx.1 = getelementptr inbounds %struct.St4x4, %struct.St4x4* %in, i64 0, i32 0, i64 1
-  %2 = load i32, i32* %arrayidx.1, align 4
-  %arrayidx.2 = getelementptr inbounds %struct.St4x4, %struct.St4x4* %in, i64 0, i32 0, i64 2
-  %3 = load i32, i32* %arrayidx.2, align 4
-  %arrayidx.3 = getelementptr inbounds %struct.St4x4, %struct.St4x4* %in, i64 0, i32 0, i64 3
-  %4 = load i32, i32* %arrayidx.3, align 4
+  %1 = load i32, ptr %in, align 4
+  %arrayidx.1 = getelementptr inbounds [4 x i32], ptr %in, i64 0, i64 1
+  %2 = load i32, ptr %arrayidx.1, align 4
+  %arrayidx.2 = getelementptr inbounds [4 x i32], ptr %in, i64 0, i64 2
+  %3 = load i32, ptr %arrayidx.2, align 4
+  %arrayidx.3 = getelementptr inbounds [4 x i32], ptr %in, i64 0, i64 3
+  %4 = load i32, ptr %arrayidx.3, align 4
   %5 = insertvalue [4 x i32] poison, i32 %1, 0
   %6 = insertvalue [4 x i32] %5, i32 %2, 1
   %7 = insertvalue [4 x i32] %6, i32 %3, 2
@@ -261,8 +248,7 @@ define internal fastcc [4 x i32] @callee_St4x4(%struct.St4x4* nocapture noundef
   ret [4 x i32] %oldret
 }
 
-
-define dso_local void @caller_St4x5(%struct.St4x5* nocapture noundef readonly byval(%struct.St4x5) align 4 %in, %struct.St4x5* nocapture noundef writeonly %ret) {
+define dso_local void @caller_St4x5(ptr nocapture noundef readonly byval(%struct.St4x5) align 4 %in, ptr nocapture noundef writeonly %ret) {
   ; CHECK-LABEL: .visible .func caller_St4x5(
   ; CHECK:               .param .align 4 .b8 caller_St4x5_param_0[20],
   ; CHECK:               .param .b32 caller_St4x5_param_1
@@ -278,27 +264,25 @@ define dso_local void @caller_St4x5(%struct.St4x5* nocapture noundef readonly by
   ; CHECK-NEXT:  );
   ; CHECK:       ld.param.v4.b32 {{{%r[0-9]+}}, {{%r[0-9]+}}, {{%r[0-9]+}}, {{%r[0-9]+}}}, [retval0+0];
   ; CHECK:       ld.param.b32    {{%r[0-9]+}},  [retval0+16];
-  %call = tail call fastcc [5 x i32] @callee_St4x5(%struct.St4x5* noundef nonnull byval(%struct.St4x5) align 4 %in)
+  %call = tail call fastcc [5 x i32] @callee_St4x5(ptr noundef nonnull byval(%struct.St4x5) align 4 %in) #2
   %.fca.0.extract = extractvalue [5 x i32] %call, 0
   %.fca.1.extract = extractvalue [5 x i32] %call, 1
   %.fca.2.extract = extractvalue [5 x i32] %call, 2
   %.fca.3.extract = extractvalue [5 x i32] %call, 3
   %.fca.4.extract = extractvalue [5 x i32] %call, 4
-  %ref.tmp.sroa.0.0..sroa_idx = getelementptr inbounds %struct.St4x5, %struct.St4x5* %ret, i64 0, i32 0, i64 0
-  store i32 %.fca.0.extract, i32* %ref.tmp.sroa.0.0..sroa_idx, align 4
-  %ref.tmp.sroa.4.0..sroa_idx3 = getelementptr inbounds %struct.St4x5, %struct.St4x5* %ret, i64 0, i32 0, i64 1
-  store i32 %.fca.1.extract, i32* %ref.tmp.sroa.4.0..sroa_idx3, align 4
-  %ref.tmp.sroa.5.0..sroa_idx5 = getelementptr inbounds %struct.St4x5, %struct.St4x5* %ret, i64 0, i32 0, i64 2
-  store i32 %.fca.2.extract, i32* %ref.tmp.sroa.5.0..sroa_idx5, align 4
-  %ref.tmp.sroa.6.0..sroa_idx7 = getelementptr inbounds %struct.St4x5, %struct.St4x5* %ret, i64 0, i32 0, i64 3
-  store i32 %.fca.3.extract, i32* %ref.tmp.sroa.6.0..sroa_idx7, align 4
-  %ref.tmp.sroa.7.0..sroa_idx9 = getelementptr inbounds %struct.St4x5, %struct.St4x5* %ret, i64 0, i32 0, i64 4
-  store i32 %.fca.4.extract, i32* %ref.tmp.sroa.7.0..sroa_idx9, align 4
+  store i32 %.fca.0.extract, ptr %ret, align 4
+  %ref.tmp.sroa.4.0..sroa_idx = getelementptr inbounds i8, ptr %ret, i64 4
+  store i32 %.fca.1.extract, ptr %ref.tmp.sroa.4.0..sroa_idx, align 4
+  %ref.tmp.sroa.5.0..sroa_idx = getelementptr inbounds i8, ptr %ret, i64 8
+  store i32 %.fca.2.extract, ptr %ref.tmp.sroa.5.0..sroa_idx, align 4
+  %ref.tmp.sroa.6.0..sroa_idx = getelementptr inbounds i8, ptr %ret, i64 12
+  store i32 %.fca.3.extract, ptr %ref.tmp.sroa.6.0..sroa_idx, align 4
+  %ref.tmp.sroa.7.0..sroa_idx = getelementptr inbounds i8, ptr %ret, i64 16
+  store i32 %.fca.4.extract, ptr %ref.tmp.sroa.7.0..sroa_idx, align 4
   ret void
 }
 
-
-define internal fastcc [5 x i32] @callee_St4x5(%struct.St4x5* nocapture noundef readonly byval(%struct.St4x5) align 4 %in) {
+define internal fastcc [5 x i32] @callee_St4x5(ptr nocapture noundef readonly byval(%struct.St4x5) align 4 %in) {
   ; CHECK:       .func  (.param .align 16 .b8 func_retval0[20])
   ; CHECK-LABEL: callee_St4x5(
   ; CHECK-NEXT:  .param .align 16 .b8 callee_St4x5_param_0[20]
@@ -307,16 +291,15 @@ define internal fastcc [5 x i32] @callee_St4x5(%struct.St4x5* nocapture noundef
   ; CHECK:       st.param.v4.b32 [func_retval0+0],  {[[R1]], [[R2]], [[R3]], [[R4]]};
   ; CHECK:       st.param.b32    [func_retval0+16], [[R5]];
   ; CHECK-NEXT:  ret;
-  %arrayidx = getelementptr inbounds %struct.St4x5, %struct.St4x5* %in, i64 0, i32 0, i64 0
-  %1 = load i32, i32* %arrayidx, align 4
-  %arrayidx.1 = getelementptr inbounds %struct.St4x5, %struct.St4x5* %in, i64 0, i32 0, i64 1
-  %2 = load i32, i32* %arrayidx.1, align 4
-  %arrayidx.2 = getelementptr inbounds %struct.St4x5, %struct.St4x5* %in, i64 0, i32 0, i64 2
-  %3 = load i32, i32* %arrayidx.2, align 4
-  %arrayidx.3 = getelementptr inbounds %struct.St4x5, %struct.St4x5* %in, i64 0, i32 0, i64 3
-  %4 = load i32, i32* %arrayidx.3, align 4
-  %arrayidx.4 = getelementptr inbounds %struct.St4x5, %struct.St4x5* %in, i64 0, i32 0, i64 4
-  %5 = load i32, i32* %arrayidx.4, align 4
+  %1 = load i32, ptr %in, align 4
+  %arrayidx.1 = getelementptr inbounds [5 x i32], ptr %in, i64 0, i64 1
+  %2 = load i32, ptr %arrayidx.1, align 4
+  %arrayidx.2 = getelementptr inbounds [5 x i32], ptr %in, i64 0, i64 2
+  %3 = load i32, ptr %arrayidx.2, align 4
+  %arrayidx.3 = getelementptr inbounds [5 x i32], ptr %in, i64 0, i64 3
+  %4 = load i32, ptr %arrayidx.3, align 4
+  %arrayidx.4 = getelementptr inbounds [5 x i32], ptr %in, i64 0, i64 4
+  %5 = load i32, ptr %arrayidx.4, align 4
   %6 = insertvalue [5 x i32] poison, i32 %1, 0
   %7 = insertvalue [5 x i32] %6, i32 %2, 1
   %8 = insertvalue [5 x i32] %7, i32 %3, 2
@@ -325,8 +308,7 @@ define internal fastcc [5 x i32] @callee_St4x5(%struct.St4x5* nocapture noundef
   ret [5 x i32] %oldret
 }
 
-
-define dso_local void @caller_St4x6(%struct.St4x6* nocapture noundef readonly byval(%struct.St4x6) align 4 %in, %struct.St4x6* nocapture noundef writeonly %ret) {
+define dso_local void @caller_St4x6(ptr nocapture noundef readonly byval(%struct.St4x6) align 4 %in, ptr nocapture noundef writeonly %ret) {
   ; CHECK-LABEL: .visible .func caller_St4x6(
   ; CHECK:               .param .align 4 .b8 caller_St4x6_param_0[24],
   ; CHECK:               .param .b32 caller_St4x6_param_1
@@ -342,30 +324,28 @@ define dso_local void @caller_St4x6(%struct.St4x6* nocapture noundef readonly by
   ; CHECK-NEXT:  );
   ; CHECK:       ld.param.v4.b32 {{{%r[0-9]+}}, {{%r[0-9]+}}, {{%r[0-9]+}}, {{%r[0-9]+}}}, [retval0+0];
   ; CHECK:       ld.param.v2.b32 {{{%r[0-9]+}}, {{%r[0-9]+}}}, [retval0+16];
-  %call = tail call fastcc [6 x i32] @callee_St4x6(%struct.St4x6* noundef nonnull byval(%struct.St4x6) align 4 %in)
+  %call = tail call fastcc [6 x i32] @callee_St4x6(ptr noundef nonnull byval(%struct.St4x6) align 4 %in) #2
   %.fca.0.extract = extractvalue [6 x i32] %call, 0
   %.fca.1.extract = extractvalue [6 x i32] %call, 1
   %.fca.2.extract = extractvalue [6 x i32] %call, 2
   %.fca.3.extract = extractvalue [6 x i32] %call, 3
   %.fca.4.extract = extractvalue [6 x i32] %call, 4
   %.fca.5.extract = extractvalue [6 x i32] %call, 5
-  %ref.tmp.sroa.0.0..sroa_idx = getelementptr inbounds %struct.St4x6, %struct.St4x6* %ret, i64 0, i32 0, i64 0
-  store i32 %.fca.0.extract, i32* %ref.tmp.sroa.0.0..sroa_idx, align 4
-  %ref.tmp.sroa.4.0..sroa_idx2 = getelementptr inbounds %struct.St4x6, %struct.St4x6* %ret, i64 0, i32 0, i64 1
-  store i32 %.fca.1.extract, i32* %ref.tmp.sroa.4.0..sroa_idx2, align 4
-  %ref.tmp.sroa.5.0..sroa_idx4 = getelementptr inbounds %struct.St4x6, %struct.St4x6* %ret, i64 0, i32 0, i64 2
-  store i32 %.fca.2.extract, i32* %ref.tmp.sroa.5.0..sroa_idx4, align 4
-  %ref.tmp.sroa.6.0..sroa_idx6 = getelementptr inbounds %struct.St4x6, %struct.St4x6* %ret, i64 0, i32 0, i64 3
-  store i32 %.fca.3.extract, i32* %ref.tmp.sroa.6.0..sroa_idx6, align 4
-  %ref.tmp.sroa.7.0..sroa_idx8 = getelementptr inbounds %struct.St4x6, %struct.St4x6* %ret, i64 0, i32 0, i64 4
-  store i32 %.fca.4.extract, i32* %ref.tmp.sroa.7.0..sroa_idx8, align 4
-  %ref.tmp.sroa.8.0..sroa_idx10 = getelementptr inbounds %struct.St4x6, %struct.St4x6* %ret, i64 0, i32 0, i64 5
-  store i32 %.fca.5.extract, i32* %ref.tmp.sroa.8.0..sroa_idx10, align 4
+  store i32 %.fca.0.extract, ptr %ret, align 4
+  %ref.tmp.sroa.4.0..sroa_idx = getelementptr inbounds i8, ptr %ret, i64 4
+  store i32 %.fca.1.extract, ptr %ref.tmp.sroa.4.0..sroa_idx, align 4
+  %ref.tmp.sroa.5.0..sroa_idx = getelementptr inbounds i8, ptr %ret, i64 8
+  store i32 %.fca.2.extract, ptr %ref.tmp.sroa.5.0..sroa_idx, align 4
+  %ref.tmp.sroa.6.0..sroa_idx = getelementptr inbounds i8, ptr %ret, i64 12
+  store i32 %.fca.3.extract, ptr %ref.tmp.sroa.6.0..sroa_idx, align 4
+  %ref.tmp.sroa.7.0..sroa_idx = getelementptr inbounds i8, ptr %ret, i64 16
+  store i32 %.fca.4.extract, ptr %ref.tmp.sroa.7.0..sroa_idx, align 4
+  %ref.tmp.sroa.8.0..sroa_idx = getelementptr inbounds i8, ptr %ret, i64 20
+  store i32 %.fca.5.extract, ptr %ref.tmp.sroa.8.0..sroa_idx, align 4
   ret void
 }
 
-
-define internal fastcc [6 x i32] @callee_St4x6(%struct.St4x6* nocapture noundef readonly byval(%struct.St4x6) align 4 %in) {
+define internal fastcc [6 x i32] @callee_St4x6(ptr nocapture noundef readonly byval(%struct.St4x6) align 4 %in) {
   ; CHECK:       .func  (.param .align 16 .b8 func_retval0[24])
   ; CHECK-LABEL: callee_St4x6(
   ; CHECK-NEXT:  .param .align 16 .b8 callee_St4x6_param_0[24]
@@ -374,18 +354,17 @@ define internal fastcc [6 x i32] @callee_St4x6(%struct.St4x6* nocapture noundef
   ; CHECK:       st.param.v4.b32 [func_retval0+0],  {[[R1]], [[R2]], [[R3]], [[R4]]};
   ; CHECK:       st.param.v2.b32 [func_retval0+16], {[[R5]], [[R6]]};
   ; CHECK-NEXT:  ret;
-  %arrayidx = getelementptr inbounds %struct.St4x6, %struct.St4x6* %in, i64 0, i32 0, i64 0
-  %1 = load i32, i32* %arrayidx, align 4
-  %arrayidx.1 = getelementptr inbounds %struct.St4x6, %struct.St4x6* %in, i64 0, i32 0, i64 1
-  %2 = load i32, i32* %arrayidx.1, align 4
-  %arrayidx.2 = getelementptr inbounds %struct.St4x6, %struct.St4x6* %in, i64 0, i32 0, i64 2
-  %3 = load i32, i32* %arrayidx.2, align 4
-  %arrayidx.3 = getelementptr inbounds %struct.St4x6, %struct.St4x6* %in, i64 0, i32 0, i64 3
-  %4 = load i32, i32* %arrayidx.3, align 4
-  %arrayidx.4 = getelementptr inbounds %struct.St4x6, %struct.St4x6* %in, i64 0, i32 0, i64 4
-  %5 = load i32, i32* %arrayidx.4, align 4
-  %arrayidx.5 = getelementptr inbounds %struct.St4x6, %struct.St4x6* %in, i64 0, i32 0, i64 5
-  %6 = load i32, i32* %arrayidx.5, align 4
+  %1 = load i32, ptr %in, align 4
+  %arrayidx.1 = getelementptr inbounds [6 x i32], ptr %in, i64 0, i64 1
+  %2 = load i32, ptr %arrayidx.1, align 4
+  %arrayidx.2 = getelementptr inbounds [6 x i32], ptr %in, i64 0, i64 2
+  %3 = load i32, ptr %arrayidx.2, align 4
+  %arrayidx.3 = getelementptr inbounds [6 x i32], ptr %in, i64 0, i64 3
+  %4 = load i32, ptr %arrayidx.3, align 4
+  %arrayidx.4 = getelementptr inbounds [6 x i32], ptr %in, i64 0, i64 4
+  %5 = load i32, ptr %arrayidx.4, align 4
+  %arrayidx.5 = getelementptr inbounds [6 x i32], ptr %in, i64 0, i64 5
+  %6 = load i32, ptr %arrayidx.5, align 4
   %7 = insertvalue [6 x i32] poison, i32 %1, 0
   %8 = insertvalue [6 x i32] %7, i32 %2, 1
   %9 = insertvalue [6 x i32] %8, i32 %3, 2
@@ -395,8 +374,7 @@ define internal fastcc [6 x i32] @callee_St4x6(%struct.St4x6* nocapture noundef
   ret [6 x i32] %oldret
 }
 
-
-define dso_local void @caller_St4x7(%struct.St4x7* nocapture noundef readonly byval(%struct.St4x7) align 4 %in, %struct.St4x7* nocapture noundef writeonly %ret) {
+define dso_local void @caller_St4x7(ptr nocapture noundef readonly byval(%struct.St4x7) align 4 %in, ptr nocapture noundef writeonly %ret) {
   ; CHECK-LABEL: .visible .func caller_St4x7(
   ; CHECK:               .param .align 4 .b8 caller_St4x7_param_0[28],
   ; CHECK:               .param .b32 caller_St4x7_param_1
@@ -414,7 +392,7 @@ define dso_local void @caller_St4x7(%struct.St4x7* nocapture noundef readonly by
   ; CHECK:       ld.param.v4.b32 {{{%r[0-9]+}}, {{%r[0-9]+}}, {{%r[0-9]+}}, {{%r[0-9]+}}}, [retval0+0];
   ; CHECK:       ld.param.v2.b32 {{{%r[0-9]+}}, {{%r[0-9]+}}}, [retval0+16];
   ; CHECK:       ld.param.b32    {{%r[0-9]+}}, [retval0+24];
-  %call = tail call fastcc [7 x i32] @callee_St4x7(%struct.St4x7* noundef nonnull byval(%struct.St4x7) align 4 %in)
+  %call = tail call fastcc [7 x i32] @callee_St4x7(ptr noundef nonnull byval(%struct.St4x7) align 4 %in) #2
   %.fca.0.extract = extractvalue [7 x i32] %call, 0
   %.fca.1.extract = extractvalue [7 x i32] %call, 1
   %.fca.2.extract = extractvalue [7 x i32] %call, 2
@@ -422,25 +400,23 @@ define dso_local void @caller_St4x7(%struct.St4x7* nocapture noundef readonly by
   %.fca.4.extract = extractvalue [7 x i32] %call, 4
   %.fca.5.extract = extractvalue [7 x i32] %call, 5
   %.fca.6.extract = extractvalue [7 x i32] %call, 6
-  %ref.tmp.sroa.0.0..sroa_idx = getelementptr inbounds %struct.St4x7, %struct.St4x7* %ret, i64 0, i32 0, i64 0
-  store i32 %.fca.0.extract, i32* %ref.tmp.sroa.0.0..sroa_idx, align 4
-  %ref.tmp.sroa.4.0..sroa_idx2 = getelementptr inbounds %struct.St4x7, %struct.St4x7* %ret, i64 0, i32 0, i64 1
-  store i32 %.fca.1.extract, i32* %ref.tmp.sroa.4.0..sroa_idx2, align 4
-  %ref.tmp.sroa.5.0..sroa_idx4 = getelementptr inbounds %struct.St4x7, %struct.St4x7* %ret, i64 0, i32 0, i64 2
-  store i32 %.fca.2.extract, i32* %ref.tmp.sroa.5.0..sroa_idx4, align 4
-  %ref.tmp.sroa.6.0..sroa_idx6 = getelementptr inbounds %struct.St4x7, %struct.St4x7* %ret, i64 0, i32 0, i64 3
-  store i32 %.fca.3.extract, i32* %ref.tmp.sroa.6.0..sroa_idx6, align 4
-  %ref.tmp.sroa.7.0..sroa_idx8 = getelementptr inbounds %struct.St4x7, %struct.St4x7* %ret, i64 0, i32 0, i64 4
-  store i32 %.fca.4.extract, i32* %ref.tmp.sroa.7.0..sroa_idx8, align 4
-  %ref.tmp.sroa.8.0..sroa_idx10 = getelementptr inbounds %struct.St4x7, %struct.St4x7* %ret, i64 0, i32 0, i64 5
-  store i32 %.fca.5.extract, i32* %ref.tmp.sroa.8.0..sroa_idx10, align 4
-  %ref.tmp.sroa.9.0..sroa_idx12 = getelementptr inbounds %struct.St4x7, %struct.St4x7* %ret, i64 0, i32 0, i64 6
-  store i32 %.fca.6.extract, i32* %ref.tmp.sroa.9.0..sroa_idx12, align 4
+  store i32 %.fca.0.extract, ptr %ret, align 4
+  %ref.tmp.sroa.4.0..sroa_idx = getelementptr inbounds i8, ptr %ret, i64 4
+  store i32 %.fca.1.extract, ptr %ref.tmp.sroa.4.0..sroa_idx, align 4
+  %ref.tmp.sroa.5.0..sroa_idx = getelementptr inbounds i8, ptr %ret, i64 8
+  store i32 %.fca.2.extract, ptr %ref.tmp.sroa.5.0..sroa_idx, align 4
+  %ref.tmp.sroa.6.0..sroa_idx = getelementptr inbounds i8, ptr %ret, i64 12
+  store i32 %.fca.3.extract, ptr %ref.tmp.sroa.6.0..sroa_idx, align 4
+  %ref.tmp.sroa.7.0..sroa_idx = getelementptr inbounds i8, ptr %ret, i64 16
+  store i32 %.fca.4.extract, ptr %ref.tmp.sroa.7.0..sroa_idx, align 4
+  %ref.tmp.sroa.8.0..sroa_idx = getelementptr inbounds i8, ptr %ret, i64 20
+  store i32 %.fca.5.extract, ptr %ref.tmp.sroa.8.0..sroa_idx, align 4
+  %ref.tmp.sroa.9.0..sroa_idx = getelementptr inbounds i8, ptr %ret, i64 24
+  store i32 %.fca.6.extract, ptr %ref.tmp.sroa.9.0..sroa_idx, align 4
   ret void
 }
 
-
-define internal fastcc [7 x i32] @callee_St4x7(%struct.St4x7* nocapture noundef readonly byval(%struct.St4x7) align 4 %in) {
+define internal fastcc [7 x i32] @callee_St4x7(ptr nocapture noundef readonly byval(%struct.St4x7) align 4 %in) {
   ; CHECK:       .func  (.param .align 16 .b8 func_retval0[28])
   ; CHECK-LABEL: callee_St4x7(
   ; CHECK-NEXT:  .param .align 16 .b8 callee_St4x7_param_0[28]
@@ -451,20 +427,19 @@ define internal fastcc [7 x i32] @callee_St4x7(%struct.St4x7* nocapture noundef
   ; CHECK:       st.param.v2.b32 [func_retval0+16], {[[R5]], [[R6]]};
   ; CHECK:       st.param.b32    [func_retval0+24], [[R7]];
   ; CHECK-NEXT:  ret;
-  %arrayidx = getelementptr inbounds %struct.St4x7, %struct.St4x7* %in, i64 0, i32 0, i64 0
-  %1 = load i32, i32* %arrayidx, align 4
-  %arrayidx.1 = getelementptr inbounds %struct.St4x7, %struct.St4x7* %in, i64 0, i32 0, i64 1
-  %2 = load i32, i32* %arrayidx.1, align 4
-  %arrayidx.2 = getelementptr inbounds %struct.St4x7, %struct.St4x7* %in, i64 0, i32 0, i64 2
-  %3 = load i32, i32* %arrayidx.2, align 4
-  %arrayidx.3 = getelementptr inbounds %struct.St4x7, %struct.St4x7* %in, i64 0, i32 0, i64 3
-  %4 = load i32, i32* %arrayidx.3, align 4
-  %arrayidx.4 = getelementptr inbounds %struct.St4x7, %struct.St4x7* %in, i64 0, i32 0, i64 4
-  %5 = load i32, i32* %arrayidx.4, align 4
-  %arrayidx.5 = getelementptr inbounds %struct.St4x7, %struct.St4x7* %in, i64 0, i32 0, i64 5
-  %6 = load i32, i32* %arrayidx.5, align 4
-  %arrayidx.6 = getelementptr inbounds %struct.St4x7, %struct.St4x7* %in, i64 0, i32 0, i64 6
-  %7 = load i32, i32* %arrayidx.6, align 4
+  %1 = load i32, ptr %in, align 4
+  %arrayidx.1 = getelementptr inbounds [7 x i32], ptr %in, i64 0, i64 1
+  %2 = load i32, ptr %arrayidx.1, align 4
+  %arrayidx.2 = getelementptr inbounds [7 x i32], ptr %in, i64 0, i64 2
+  %3 = load i32, ptr %arrayidx.2, align 4
+  %arrayidx.3 = getelementptr inbounds [7 x i32], ptr %in, i64 0, i64 3
+  %4 = load i32, ptr %arrayidx.3, align 4
+  %arrayidx.4 = getelementptr inbounds [7 x i32], ptr %in, i64 0, i64 4
+  %5 = load i32, ptr %arrayidx.4, align 4
+  %arrayidx.5 = getelementptr inbounds [7 x i32], ptr %in, i64 0, i64 5
+  %6 = load i32, ptr %arrayidx.5, align 4
+  %arrayidx.6 = getelementptr inbounds [7 x i32], ptr %in, i64 0, i64 6
+  %7 = load i32, ptr %arrayidx.6, align 4
   %8 = insertvalue [7 x i32] poison, i32 %1, 0
   %9 = insertvalue [7 x i32] %8, i32 %2, 1
   %10 = insertvalue [7 x i32] %9, i32 %3, 2
@@ -475,8 +450,7 @@ define internal fastcc [7 x i32] @callee_St4x7(%struct.St4x7* nocapture noundef
   ret [7 x i32] %oldret
 }
 
-
-define dso_local void @caller_St4x8(%struct.St4x8* nocapture noundef readonly byval(%struct.St4x8) align 4 %in, %struct.St4x8* nocapture noundef writeonly %ret) {
+define dso_local void @caller_St4x8(ptr nocapture noundef readonly byval(%struct.St4x8) align 4 %in, ptr nocapture noundef writeonly %ret) {
   ; CHECK-LABEL: .visible .func caller_St4x8(
   ; CHECK:               .param .align 4 .b8 caller_St4x8_param_0[32],
   ; CHECK:               .param .b32 caller_St4x8_param_1
@@ -492,7 +466,7 @@ define dso_local void @caller_St4x8(%struct.St4x8* nocapture noundef readonly by
   ; CHECK-NEXT:  );
   ; CHECK:       ld.param.v4.b32 {{{%r[0-9]+}}, {{%r[0-9]+}}, {{%r[0-9]+}}, {{%r[0-9]+}}}, [retval0+0];
   ; CHECK:       ld.param.v4.b32 {{{%r[0-9]+}}, {{%r[0-9]+}}, {{%r[0-9]+}}, {{%r[0-9]+}}}, [retval0+16];
-  %call = tail call fastcc [8 x i32] @callee_St4x8(%struct.St4x8* noundef nonnull byval(%struct.St4x8) align 4 %in)
+  %call = tail call fastcc [8 x i32] @callee_St4x8(ptr noundef nonnull byval(%struct.St4x8) align 4 %in) #2
   %.fca.0.extract = extractvalue [8 x i32] %call, 0
   %.fca.1.extract = extractvalue [8 x i32] %call, 1
   %.fca.2.extract = extractvalue [8 x i32] %call, 2
@@ -501,27 +475,25 @@ define dso_local void @caller_St4x8(%struct.St4x8* nocapture noundef readonly by
   %.fca.5.extract = extractvalue [8 x i32] %call, 5
   %.fca.6.extract = extractvalue [8 x i32] %call, 6
   %.fca.7.extract = extractvalue [8 x i32] %call, 7
-  %ref.tmp.sroa.0.0..sroa_idx = getelementptr inbounds %struct.St4x8, %struct.St4x8* %ret, i64 0, i32 0, i64 0
-  store i32 %.fca.0.extract, i32* %ref.tmp.sroa.0.0..sroa_idx, align 4
-  %ref.tmp.sroa.4.0..sroa_idx2 = getelementptr inbounds %struct.St4x8, %struct.St4x8* %ret, i64 0, i32 0, i64 1
-  store i32 %.fca.1.extract, i32* %ref.tmp.sroa.4.0..sroa_idx2, align 4
-  %ref.tmp.sroa.5.0..sroa_idx4 = getelementptr inbounds %struct.St4x8, %struct.St4x8* %ret, i64 0, i32 0, i64 2
-  store i32 %.fca.2.extract, i32* %ref.tmp.sroa.5.0..sroa_idx4, align 4
-  %ref.tmp.sroa.6.0..sroa_idx6 = getelementptr inbounds %struct.St4x8, %struct.St4x8* %ret, i64 0, i32 0, i64 3
-  store i32 %.fca.3.extract, i32* %ref.tmp.sroa.6.0..sroa_idx6, align 4
-  %ref.tmp.sroa.7.0..sroa_idx8 = getelementptr inbounds %struct.St4x8, %struct.St4x8* %ret, i64 0, i32 0, i64 4
-  store i32 %.fca.4.extract, i32* %ref.tmp.sroa.7.0..sroa_idx8, align 4
-  %ref.tmp.sroa.8.0..sroa_idx10 = getelementptr inbounds %struct.St4x8, %struct.St4x8* %ret, i64 0, i32 0, i64 5
-  store i32 %.fca.5.extract, i32* %ref.tmp.sroa.8.0..sroa_idx10, align 4
-  %ref.tmp.sroa.9.0..sroa_idx12 = getelementptr inbounds %struct.St4x8, %struct.St4x8* %ret, i64 0, i32 0, i64 6
-  store i32 %.fca.6.extract, i32* %ref.tmp.sroa.9.0..sroa_idx12, align 4
-  %ref.tmp.sroa.10.0..sroa_idx14 = getelementptr inbounds %struct.St4x8, %struct.St4x8* %ret, i64 0, i32 0, i64 7
-  store i32 %.fca.7.extract, i32* %ref.tmp.sroa.10.0..sroa_idx14, align 4
+  store i32 %.fca.0.extract, ptr %ret, align 4
+  %ref.tmp.sroa.4.0..sroa_idx = getelementptr inbounds i8, ptr %ret, i64 4
+  store i32 %.fca.1.extract, ptr %ref.tmp.sroa.4.0..sroa_idx, align 4
+  %ref.tmp.sroa.5.0..sroa_idx = getelementptr inbounds i8, ptr %ret, i64 8
+  store i32 %.fca.2.extract, ptr %ref.tmp.sroa.5.0..sroa_idx, align 4
+  %ref.tmp.sroa.6.0..sroa_idx = getelementptr inbounds i8, ptr %ret, i64 12
+  store i32 %.fca.3.extract, ptr %ref.tmp.sroa.6.0..sroa_idx, align 4
+  %ref.tmp.sroa.7.0..sroa_idx = getelementptr inbounds i8, ptr %ret, i64 16
+  store i32 %.fca.4.extract, ptr %ref.tmp.sroa.7.0..sroa_idx, align 4
+  %ref.tmp.sroa.8.0..sroa_idx = getelementptr inbounds i8, ptr %ret, i64 20
+  store i32 %.fca.5.extract, ptr %ref.tmp.sroa.8.0..sroa_idx, align 4
+  %ref.tmp.sroa.9.0..sroa_idx = getelementptr inbounds i8, ptr %ret, i64 24
+  store i32 %.fca.6.extract, ptr %ref.tmp.sroa.9.0..sroa_idx, align 4
+  %ref.tmp.sroa.10.0..sroa_idx = getelementptr inbounds i8, ptr %ret, i64 28
+  store i32 %.fca.7.extract, ptr %ref.tmp.sroa.10.0..sroa_idx, align 4
   ret void
 }
 
-
-define internal fastcc [8 x i32] @callee_St4x8(%struct.St4x8* nocapture noundef readonly byval(%struct.St4x8) align 4 %in) {
+define internal fastcc [8 x i32] @callee_St4x8(ptr nocapture noundef readonly byval(%struct.St4x8) align 4 %in) {
   ; CHECK:       .func  (.param .align 16 .b8 func_retval0[32])
   ; CHECK-LABEL: callee_St4x8(
   ; CHECK-NEXT:  .param .align 16 .b8 callee_St4x8_param_0[32]
@@ -530,22 +502,21 @@ define internal fastcc [8 x i32] @callee_St4x8(%struct.St4x8* nocapture noundef
   ; CHECK:       st.param.v4.b32 [func_retval0+0],  {[[R1]], [[R2]], [[R3]], [[R4]]};
   ; CHECK:       st.param.v4.b32 [func_retval0+16], {[[R5]], [[R6]], [[R7]], [[R8]]};
   ; CHECK-NEXT:  ret;
-  %arrayidx = getelementptr inbounds %struct.St4x8, %struct.St4x8* %in, i64 0, i32 0, i64 0
-  %1 = load i32, i32* %arrayidx, align 4
-  %arrayidx.1 = getelementptr inbounds %struct.St4x8, %struct.St4x8* %in, i64 0, i32 0, i64 1
-  %2 = load i32, i32* %arrayidx.1, align 4
-  %arrayidx.2 = getelementptr inbounds %struct.St4x8, %struct.St4x8* %in, i64 0, i32 0, i64 2
-  %3 = load i32, i32* %arrayidx.2, align 4
-  %arrayidx.3 = getelementptr inbounds %struct.St4x8, %struct.St4x8* %in, i64 0, i32 0, i64 3
-  %4 = load i32, i32* %arrayidx.3, align 4
-  %arrayidx.4 = getelementptr inbounds %struct.St4x8, %struct.St4x8* %in, i64 0, i32 0, i64 4
-  %5 = load i32, i32* %arrayidx.4, align 4
-  %arrayidx.5 = getelementptr inbounds %struct.St4x8, %struct.St4x8* %in, i64 0, i32 0, i64 5
-  %6 = load i32, i32* %arrayidx.5, align 4
-  %arrayidx.6 = getelementptr inbounds %struct.St4x8, %struct.St4x8* %in, i64 0, i32 0, i64 6
-  %7 = load i32, i32* %arrayidx.6, align 4
-  %arrayidx.7 = getelementptr inbounds %struct.St4x8, %struct.St4x8* %in, i64 0, i32 0, i64 7
-  %8 = load i32, i32* %arrayidx.7, align 4
+  %1 = load i32, ptr %in, align 4
+  %arrayidx.1 = getelementptr inbounds [8 x i32], ptr %in, i64 0, i64 1
+  %2 = load i32, ptr %arrayidx.1, align 4
+  %arrayidx.2 = getelementptr inbounds [8 x i32], ptr %in, i64 0, i64 2
+  %3 = load i32, ptr %arrayidx.2, align 4
+  %arrayidx.3 = getelementptr inbounds [8 x i32], ptr %in, i64 0, i64 3
+  %4 = load i32, ptr %arrayidx.3, align 4
+  %arrayidx.4 = getelementptr inbounds [8 x i32], ptr %in, i64 0, i64 4
+  %5 = load i32, ptr %arrayidx.4, align 4
+  %arrayidx.5 = getelementptr inbounds [8 x i32], ptr %in, i64 0, i64 5
+  %6 = load i32, ptr %arrayidx.5, align 4
+  %arrayidx.6 = getelementptr inbounds [8 x i32], ptr %in, i64 0, i64 6
+  %7 = load i32, ptr %arrayidx.6, align 4
+  %arrayidx.7 = getelementptr inbounds [8 x i32], ptr %in, i64 0, i64 7
+  %8 = load i32, ptr %arrayidx.7, align 4
   %9 = insertvalue [8 x i32] poison, i32 %1, 0
   %10 = insertvalue [8 x i32] %9, i32 %2, 1
   %11 = insertvalue [8 x i32] %10, i32 %3, 2
@@ -557,8 +528,7 @@ define internal fastcc [8 x i32] @callee_St4x8(%struct.St4x8* nocapture noundef
   ret [8 x i32] %oldret
 }
 
-
-define dso_local void @caller_St8x1(%struct.St8x1* nocapture noundef readonly byval(%struct.St8x1) align 8 %in, %struct.St8x1* nocapture noundef writeonly %ret) {
+define dso_local void @caller_St8x1(ptr nocapture noundef readonly byval(%struct.St8x1) align 8 %in, ptr nocapture noundef writeonly %ret) {
   ; CHECK-LABEL: .visible .func caller_St8x1(
   ; CHECK:               .param .align 8 .b8 caller_St8x1_param_0[8],
   ; CHECK:               .param .b32 caller_St8x1_param_1
@@ -572,16 +542,13 @@ define dso_local void @caller_St8x1(%struct.St8x1* nocapture noundef readonly by
   ; CHECK-NEXT:  param0
   ; CHECK-NEXT:  );
   ; CHECK:       ld.param.b64 {{%rd[0-9]+}}, [retval0+0];
-  %1 = getelementptr inbounds %struct.St8x1, %struct.St8x1* %in, i64 0, i32 0, i64 0
-  %2 = load i64, i64* %1, align 8
-  %call = tail call fastcc [1 x i64] @callee_St8x1(i64 %2)
+  %1 = load i64, ptr %in, align 8
+  %call = tail call fastcc [1 x i64] @callee_St8x1(i64 %1) #2
   %.fca.0.extract = extractvalue [1 x i64] %call, 0
-  %ref.tmp.sroa.0.0..sroa_idx = getelementptr inbounds %struct.St8x1, %struct.St8x1* %ret, i64 0, i32 0, i64 0
-  store i64 %.fca.0.extract, i64* %ref.tmp.sroa.0.0..sroa_idx, align 8
+  store i64 %.fca.0.extract, ptr %ret, align 8
   ret void
 }
 
-
 define internal fastcc [1 x i64] @callee_St8x1(i64 %in.0.val) {
   ; CHECK:       .func  (.param .align 16 .b8 func_retval0[8])
   ; CHECK-LABEL: callee_St8x1(
@@ -593,8 +560,7 @@ define internal fastcc [1 x i64] @callee_St8x1(i64 %in.0.val) {
   ret [1 x i64] %oldret
 }
 
-
-define dso_local void @caller_St8x2(%struct.St8x2* nocapture noundef readonly byval(%struct.St8x2) align 8 %in, %struct.St8x2* nocapture noundef writeonly %ret) {
+define dso_local void @caller_St8x2(ptr nocapture noundef readonly byval(%struct.St8x2) align 8 %in, ptr nocapture noundef writeonly %ret) {
   ; CHECK-LABEL: .visible .func caller_St8x2(
   ; CHECK:               .param .align 8 .b8 caller_St8x2_param_0[16],
   ; CHECK:               .param .b32 caller_St8x2_param_1
@@ -608,35 +574,31 @@ define dso_local void @caller_St8x2(%struct.St8x2* nocapture noundef readonly by
   ; CHECK-NEXT:  param0
   ; CHECK-NEXT:  );
   ; CHECK:       ld.param.v2.b64 {{{%rd[0-9]+}}, {{%rd[0-9]+}}}, [retval0+0];
-  %call = tail call fastcc [2 x i64] @callee_St8x2(%struct.St8x2* noundef nonnull byval(%struct.St8x2) align 8 %in)
+  %call = tail call fastcc [2 x i64] @callee_St8x2(ptr noundef nonnull byval(%struct.St8x2) align 8 %in) #2
   %.fca.0.extract = extractvalue [2 x i64] %call, 0
   %.fca.1.extract = extractvalue [2 x i64] %call, 1
-  %ref.tmp.sroa.0.0..sroa_idx = getelementptr inbounds %struct.St8x2, %struct.St8x2* %ret, i64 0, i32 0, i64 0
-  store i64 %.fca.0.extract, i64* %ref.tmp.sroa.0.0..sroa_idx, align 8
-  %ref.tmp.sroa.4.0..sroa_idx3 = getelementptr inbounds %struct.St8x2, %struct.St8x2* %ret, i64 0, i32 0, i64 1
-  store i64 %.fca.1.extract, i64* %ref.tmp.sroa.4.0..sroa_idx3, align 8
+  store i64 %.fca.0.extract, ptr %ret, align 8
+  %ref.tmp.sroa.4.0..sroa_idx = getelementptr inbounds i8, ptr %ret, i64 8
+  store i64 %.fca.1.extract, ptr %ref.tmp.sroa.4.0..sroa_idx, align 8
   ret void
 }
 
-
-define internal fastcc [2 x i64] @callee_St8x2(%struct.St8x2* nocapture noundef readonly byval(%struct.St8x2) align 8 %in) {
+define internal fastcc [2 x i64] @callee_St8x2(ptr nocapture noundef readonly byval(%struct.St8x2) align 8 %in) {
   ; CHECK:       .func  (.param .align 16 .b8 func_retval0[16])
   ; CHECK-LABEL: callee_St8x2(
   ; CHECK-NEXT:  .param .align 16 .b8 callee_St8x2_param_0[16]
   ; CHECK:       ld.param.v2.u64 {[[RD1:%rd[0-9]+]], [[RD2:%rd[0-9]+]]}, [callee_St8x2_param_0];
   ; CHECK:       st.param.v2.b64 [func_retval0+0], {[[RD1]], [[RD2]]};
   ; CHECK-NEXT:  ret;
-  %arrayidx = getelementptr inbounds %struct.St8x2, %struct.St8x2* %in, i64 0, i32 0, i64 0
-  %1 = load i64, i64* %arrayidx, align 8
-  %arrayidx.1 = getelementptr inbounds %struct.St8x2, %struct.St8x2* %in, i64 0, i32 0, i64 1
-  %2 = load i64, i64* %arrayidx.1, align 8
+  %1 = load i64, ptr %in, align 8
+  %arrayidx.1 = getelementptr inbounds [2 x i64], ptr %in, i64 0, i64 1
+  %2 = load i64, ptr %arrayidx.1, align 8
   %3 = insertvalue [2 x i64] poison, i64 %1, 0
   %oldret = insertvalue [2 x i64] %3, i64 %2, 1
   ret [2 x i64] %oldret
 }
 
-
-define dso_local void @caller_St8x3(%struct.St8x3* nocapture noundef readonly byval(%struct.St8x3) align 8 %in, %struct.St8x3* nocapture noundef writeonly %ret) {
+define dso_local void @caller_St8x3(ptr nocapture noundef readonly byval(%struct.St8x3) align 8 %in, ptr nocapture noundef writeonly %ret) {
   ; CHECK-LABEL: .visible .func caller_St8x3(
   ; CHECK:               .param .align 8 .b8 caller_St8x3_param_0[24],
   ; CHECK:               .param .b32 caller_St8x3_param_1
@@ -652,21 +614,19 @@ define dso_local void @caller_St8x3(%struct.St8x3* nocapture noundef readonly by
   ; CHECK-NEXT:  );
   ; CHECK:       ld.param.v2.b64 {{{%rd[0-9]+}}, {{%rd[0-9]+}}}, [retval0+0];
   ; CHECK:       ld.param.b64    {{%rd[0-9]+}}, [retval0+16];
-  %call = tail call fastcc [3 x i64] @callee_St8x3(%struct.St8x3* noundef nonnull byval(%struct.St8x3) align 8 %in)
+  %call = tail call fastcc [3 x i64] @callee_St8x3(ptr noundef nonnull byval(%struct.St8x3) align 8 %in) #2
   %.fca.0.extract = extractvalue [3 x i64] %call, 0
   %.fca.1.extract = extractvalue [3 x i64] %call, 1
   %.fca.2.extract = extractvalue [3 x i64] %call, 2
-  %ref.tmp.sroa.0.0..sroa_idx = getelementptr inbounds %struct.St8x3, %struct.St8x3* %ret, i64 0, i32 0, i64 0
-  store i64 %.fca.0.extract, i64* %ref.tmp.sroa.0.0..sroa_idx, align 8
-  %ref.tmp.sroa.4.0..sroa_idx2 = getelementptr inbounds %struct.St8x3, %struct.St8x3* %ret, i64 0, i32 0, i64 1
-  store i64 %.fca.1.extract, i64* %ref.tmp.sroa.4.0..sroa_idx2, align 8
-  %ref.tmp.sroa.5.0..sroa_idx4 = getelementptr inbounds %struct.St8x3, %struct.St8x3* %ret, i64 0, i32 0, i64 2
-  store i64 %.fca.2.extract, i64* %ref.tmp.sroa.5.0..sroa_idx4, align 8
+  store i64 %.fca.0.extract, ptr %ret, align 8
+  %ref.tmp.sroa.4.0..sroa_idx = getelementptr inbounds i8, ptr %ret, i64 8
+  store i64 %.fca.1.extract, ptr %ref.tmp.sroa.4.0..sroa_idx, align 8
+  %ref.tmp.sroa.5.0..sroa_idx = getelementptr inbounds i8, ptr %ret, i64 16
+  store i64 %.fca.2.extract, ptr %ref.tmp.sroa.5.0..sroa_idx, align 8
   ret void
 }
 
-
-define internal fastcc [3 x i64] @callee_St8x3(%struct.St8x3* nocapture noundef readonly byval(%struct.St8x3) align 8 %in) {
+define internal fastcc [3 x i64] @callee_St8x3(ptr nocapture noundef readonly byval(%struct.St8x3) align 8 %in) {
   ; CHECK:       .func  (.param .align 16 .b8 func_retval0[24])
   ; CHECK-LABEL: callee_St8x3(
   ; CHECK-NEXT:  .param .align 16 .b8 callee_St8x3_param_0[24]
@@ -675,20 +635,18 @@ define internal fastcc [3 x i64] @callee_St8x3(%struct.St8x3* nocapture noundef
   ; CHECK:       st.param.v2.b64 [func_retval0+0],   {[[RD1]], [[RD2]]};
   ; CHECK:       st.param.b64    [func_retval0+16],  [[RD3]];
   ; CHECK-NEXT:  ret;
-  %arrayidx = getelementptr inbounds %struct.St8x3, %struct.St8x3* %in, i64 0, i32 0, i64 0
-  %1 = load i64, i64* %arrayidx, align 8
-  %arrayidx.1 = getelementptr inbounds %struct.St8x3, %struct.St8x3* %in, i64 0, i32 0, i64 1
-  %2 = load i64, i64* %arrayidx.1, align 8
-  %arrayidx.2 = getelementptr inbounds %struct.St8x3, %struct.St8x3* %in, i64 0, i32 0, i64 2
-  %3 = load i64, i64* %arrayidx.2, align 8
+  %1 = load i64, ptr %in, align 8
+  %arrayidx.1 = getelementptr inbounds [3 x i64], ptr %in, i64 0, i64 1
+  %2 = load i64, ptr %arrayidx.1, align 8
+  %arrayidx.2 = getelementptr inbounds [3 x i64], ptr %in, i64 0, i64 2
+  %3 = load i64, ptr %arrayidx.2, align 8
   %4 = insertvalue [3 x i64] poison, i64 %1, 0
   %5 = insertvalue [3 x i64] %4, i64 %2, 1
   %oldret = insertvalue [3 x i64] %5, i64 %3, 2
   ret [3 x i64] %oldret
 }
 
-
-define dso_local void @caller_St8x4(%struct.St8x4* nocapture noundef readonly byval(%struct.St8x4) align 8 %in, %struct.St8x4* nocapture noundef writeonly %ret) {
+define dso_local void @caller_St8x4(ptr nocapture noundef readonly byval(%struct.St8x4) align 8 %in, ptr nocapture noundef writeonly %ret) {
   ; CHECK-LABEL: .visible .func caller_St8x4(
   ; CHECK:               .param .align 8 .b8 caller_St8x4_param_0[32],
   ; CHECK:               .param .b32 caller_St8x4_param_1
@@ -704,24 +662,22 @@ define dso_local void @caller_St8x4(%struct.St8x4* nocapture noundef readonly by
   ; CHECK-NEXT:  );
   ; CHECK:       ld.param.v2.b64 {{{%rd[0-9]+}}, {{%rd[0-9]+}}}, [retval0+0];
   ; CHECK:       ld.param.v2.b64 {{{%rd[0-9]+}}, {{%rd[0-9]+}}}, [retval0+16];
-  %call = tail call fastcc [4 x i64] @callee_St8x4(%struct.St8x4* noundef nonnull byval(%struct.St8x4) align 8 %in)
+  %call = tail call fastcc [4 x i64] @callee_St8x4(ptr noundef nonnull byval(%struct.St8x4) align 8 %in) #2
   %.fca.0.extract = extractvalue [4 x i64] %call, 0
   %.fca.1.extract = extractvalue [4 x i64] %call, 1
   %.fca.2.extract = extractvalue [4 x i64] %call, 2
   %.fca.3.extract = extractvalue [4 x i64] %call, 3
-  %ref.tmp.sroa.0.0..sroa_idx = getelementptr inbounds %struct.St8x4, %struct.St8x4* %ret, i64 0, i32 0, i64 0
-  store i64 %.fca.0.extract, i64* %ref.tmp.sroa.0.0..sroa_idx, align 8
-  %ref.tmp.sroa.4.0..sroa_idx3 = getelementptr inbounds %struct.St8x4, %struct.St8x4* %ret, i64 0, i32 0, i64 1
-  store i64 %.fca.1.extract, i64* %ref.tmp.sroa.4.0..sroa_idx3, align 8
-  %ref.tmp.sroa.5.0..sroa_idx5 = getelementptr inbounds %struct.St8x4, %struct.St8x4* %ret, i64 0, i32 0, i64 2
-  store i64 %.fca.2.extract, i64* %ref.tmp.sroa.5.0..sroa_idx5, align 8
-  %ref.tmp.sroa.6.0..sroa_idx7 = getelementptr inbounds %struct.St8x4, %struct.St8x4* %ret, i64 0, i32 0, i64 3
-  store i64 %.fca.3.extract, i64* %ref.tmp.sroa.6.0..sroa_idx7, align 8
+  store i64 %.fca.0.extract, ptr %ret, align 8
+  %ref.tmp.sroa.4.0..sroa_idx = getelementptr inbounds i8, ptr %ret, i64 8
+  store i64 %.fca.1.extract, ptr %ref.tmp.sroa.4.0..sroa_idx, align 8
+  %ref.tmp.sroa.5.0..sroa_idx = getelementptr inbounds i8, ptr %ret, i64 16
+  store i64 %.fca.2.extract, ptr %ref.tmp.sroa.5.0..sroa_idx, align 8
+  %ref.tmp.sroa.6.0..sroa_idx = getelementptr inbounds i8, ptr %ret, i64 24
+  store i64 %.fca.3.extract, ptr %ref.tmp.sroa.6.0..sroa_idx, align 8
   ret void
 }
 
-
-define internal fastcc [4 x i64] @callee_St8x4(%struct.St8x4* nocapture noundef readonly byval(%struct.St8x4) align 8 %in) {
+define internal fastcc [4 x i64] @callee_St8x4(ptr nocapture noundef readonly byval(%struct.St8x4) align 8 %in) {
   ; CHECK:       .func  (.param .align 16 .b8 func_retval0[32])
   ; CHECK-LABEL: callee_St8x4(
   ; CHECK-NEXT:  .param .align 16 .b8 callee_St8x4_param_0[32]
@@ -730,14 +686,13 @@ define internal fastcc [4 x i64] @callee_St8x4(%struct.St8x4* nocapture noundef
   ; CHECK:       st.param.v2.b64 [func_retval0+0],  {[[RD1]], [[RD2]]};
   ; CHECK:       st.param.v2.b64 [func_retval0+16], {[[RD3]], [[RD4]]};
   ; CHECK-NEXT:  ret;
-  %arrayidx = getelementptr inbounds %struct.St8x4, %struct.St8x4* %in, i64 0, i32 0, i64 0
-  %1 = load i64, i64* %arrayidx, align 8
-  %arrayidx.1 = getelementptr inbounds %struct.St8x4, %struct.St8x4* %in, i64 0, i32 0, i64 1
-  %2 = load i64, i64* %arrayidx.1, align 8
-  %arrayidx.2 = getelementptr inbounds %struct.St8x4, %struct.St8x4* %in, i64 0, i32 0, i64 2
-  %3 = load i64, i64* %arrayidx.2, align 8
-  %arrayidx.3 = getelementptr inbounds %struct.St8x4, %struct.St8x4* %in, i64 0, i32 0, i64 3
-  %4 = load i64, i64* %arrayidx.3, align 8
+  %1 = load i64, ptr %in, align 8
+  %arrayidx.1 = getelementptr inbounds [4 x i64], ptr %in, i64 0, i64 1
+  %2 = load i64, ptr %arrayidx.1, align 8
+  %arrayidx.2 = getelementptr inbounds [4 x i64], ptr %in, i64 0, i64 2
+  %3 = load i64, ptr %arrayidx.2, align 8
+  %arrayidx.3 = getelementptr inbounds [4 x i64], ptr %in, i64 0, i64 3
+  %4 = load i64, ptr %arrayidx.3, align 8
   %5 = insertvalue [4 x i64] poison, i64 %1, 0
   %6 = insertvalue [4 x i64] %5, i64 %2, 1
   %7 = insertvalue [4 x i64] %6, i64 %3, 2
@@ -747,21 +702,20 @@ define internal fastcc [4 x i64] @callee_St8x4(%struct.St8x4* nocapture noundef
 
 ; Section 2 - checking that function argument (including retval) vectorization is done with private linkage.
 
-define private fastcc [4 x i32] @callee_St4x4_private(%struct.St4x4* nocapture noundef readonly byval(%struct.St4x4) align 4 %in) {
+define private fastcc [4 x i32] @callee_St4x4_private(ptr nocapture noundef readonly byval(%struct.St4x4) align 4 %in) {
   ; CHECK:       .func  (.param .align 16 .b8 func_retval0[16])
   ; CHECK-LABEL: callee_St4x4_private(
   ; CHECK-NEXT:  .param .align 16 .b8 callee_St4x4_private_param_0[16]
   ; CHECK:       ld.param.v4.u32 {[[R1:%r[0-9]+]], [[R2:%r[0-9]+]], [[R3:%r[0-9]+]], [[R4:%r[0-9]+]]}, [callee_St4x4_private_param_0];
   ; CHECK:       st.param.v4.b32 [func_retval0+0], {[[R1]], [[R2]], [[R3]], [[R4]]};
   ; CHECK-NEXT:  ret;
-  %arrayidx = getelementptr inbounds %struct.St4x4, %struct.St4x4* %in, i64 0, i32 0, i64 0
-  %1 = load i32, i32* %arrayidx, align 4
-  %arrayidx.1 = getelementptr inbounds %struct.St4x4, %struct.St4x4* %in, i64 0, i32 0, i64 1
-  %2 = load i32, i32* %arrayidx.1, align 4
-  %arrayidx.2 = getelementptr inbounds %struct.St4x4, %struct.St4x4* %in, i64 0, i32 0, i64 2
-  %3 = load i32, i32* %arrayidx.2, align 4
-  %arrayidx.3 = getelementptr inbounds %struct.St4x4, %struct.St4x4* %in, i64 0, i32 0, i64 3
-  %4 = load i32, i32* %arrayidx.3, align 4
+  %1 = load i32, ptr %in, align 4
+  %arrayidx.1 = getelementptr inbounds [4 x i32], ptr %in, i64 0, i64 1
+  %2 = load i32, ptr %arrayidx.1, align 4
+  %arrayidx.2 = getelementptr inbounds [4 x i32], ptr %in, i64 0, i64 2
+  %3 = load i32, ptr %arrayidx.2, align 4
+  %arrayidx.3 = getelementptr inbounds [4 x i32], ptr %in, i64 0, i64 3
+  %4 = load i32, ptr %arrayidx.3, align 4
   %5 = insertvalue [4 x i32] poison, i32 %1, 0
   %6 = insertvalue [4 x i32] %5, i32 %2, 1
   %7 = insertvalue [4 x i32] %6, i32 %3, 2
@@ -772,7 +726,7 @@ define private fastcc [4 x i32] @callee_St4x4_private(%struct.St4x4* nocapture n
 ; Section 3 - checking that function argument (including retval) vectorization
 ; is NOT done with linkage types other than internal and private.
 
-define external fastcc [4 x i32] @callee_St4x4_external(%struct.St4x4* nocapture noundef readonly byval(%struct.St4x4) align 4 %in) {
+define external fastcc [4 x i32] @callee_St4x4_external(ptr nocapture noundef readonly byval(%struct.St4x4) align 4 %in) {
   ; CHECK:       .func  (.param .align 4 .b8 func_retval0[16])
   ; CHECK-LABEL: callee_St4x4_external(
   ; CHECK-NEXT:  .param .align 4 .b8 callee_St4x4_external_param_0[16]
@@ -785,17 +739,17 @@ define external fastcc [4 x i32] @callee_St4x4_external(%struct.St4x4* nocapture
   ; CHECK:       st.param.b32 [func_retval0+8],  [[R3]];
   ; CHECK:       st.param.b32 [func_retval0+12], [[R4]];
   ; CHECK-NEXT:  ret;
-  %arrayidx = getelementptr inbounds %struct.St4x4, %struct.St4x4* %in, i64 0, i32 0, i64 0
-  %1 = load i32, i32* %arrayidx, align 4
-  %arrayidx.1 = getelementptr inbounds %struct.St4x4, %struct.St4x4* %in, i64 0, i32 0, i64 1
-  %2 = load i32, i32* %arrayidx.1, align 4
-  %arrayidx.2 = getelementptr inbounds %struct.St4x4, %struct.St4x4* %in, i64 0, i32 0, i64 2
-  %3 = load i32, i32* %arrayidx.2, align 4
-  %arrayidx.3 = getelementptr inbounds %struct.St4x4, %struct.St4x4* %in, i64 0, i32 0, i64 3
-  %4 = load i32, i32* %arrayidx.3, align 4
+  %1 = load i32, ptr %in, align 4
+  %arrayidx.1 = getelementptr inbounds [4 x i32], ptr %in, i64 0, i64 1
+  %2 = load i32, ptr %arrayidx.1, align 4
+  %arrayidx.2 = getelementptr inbounds [4 x i32], ptr %in, i64 0, i64 2
+  %3 = load i32, ptr %arrayidx.2, align 4
+  %arrayidx.3 = getelementptr inbounds [4 x i32], ptr %in, i64 0, i64 3
+  %4 = load i32, ptr %arrayidx.3, align 4
   %5 = insertvalue [4 x i32] poison, i32 %1, 0
   %6 = insertvalue [4 x i32] %5, i32 %2, 1
   %7 = insertvalue [4 x i32] %6, i32 %3, 2
   %oldret = insertvalue [4 x i32] %7, i32 %4, 3
   ret [4 x i32] %oldret
 }
+

diff  --git a/llvm/test/CodeGen/NVPTX/param-vectorize-kernel.ll b/llvm/test/CodeGen/NVPTX/param-vectorize-kernel.ll
index 4a1ed8f4dcda7..1d1e032b1160c 100644
--- a/llvm/test/CodeGen/NVPTX/param-vectorize-kernel.ll
+++ b/llvm/test/CodeGen/NVPTX/param-vectorize-kernel.ll
@@ -59,7 +59,7 @@
 %struct.St8x3 = type { [3 x i64] }
 %struct.St8x4 = type { [4 x i64] }
 
-define dso_local void @foo_St4x1(%struct.St4x1* nocapture noundef readonly byval(%struct.St4x1) align 4 %in, %struct.St4x1* nocapture noundef writeonly %ret) {
+define dso_local void @foo_St4x1(ptr nocapture noundef readonly byval(%struct.St4x1) align 4 %in, ptr nocapture noundef writeonly %ret) {
   ; CHECK-LABEL: .visible .func foo_St4x1(
   ; CHECK:               .param .align 4 .b8 foo_St4x1_param_0[4],
   ; CHECK:               .param .b32 foo_St4x1_param_1
@@ -68,14 +68,12 @@ define dso_local void @foo_St4x1(%struct.St4x1* nocapture noundef readonly byval
   ; CHECK:       ld.param.u32 [[R2:%r[0-9]+]], [foo_St4x1_param_0];
   ; CHECK:       st.u32  [[[R1]]], [[R2]];
   ; CHECK:       ret;
-  %arrayidx = getelementptr inbounds %struct.St4x1, %struct.St4x1* %in, i64 0, i32 0, i64 0
-  %1 = load i32, i32* %arrayidx, align 4
-  %arrayidx3 = getelementptr inbounds %struct.St4x1, %struct.St4x1* %ret, i64 0, i32 0, i64 0
-  store i32 %1, i32* %arrayidx3, align 4
+  %1 = load i32, ptr %in, align 4
+  store i32 %1, ptr %ret, align 4
   ret void
 }
 
-define dso_local void @foo_St4x2(%struct.St4x2* nocapture noundef readonly byval(%struct.St4x2) align 4 %in, %struct.St4x2* nocapture noundef writeonly %ret) {
+define dso_local void @foo_St4x2(ptr nocapture noundef readonly byval(%struct.St4x2) align 4 %in, ptr nocapture noundef writeonly %ret) {
   ; CHECK-LABEL: .visible .func foo_St4x2(
   ; CHECK:               .param .align 4 .b8 foo_St4x2_param_0[8],
   ; CHECK:               .param .b32 foo_St4x2_param_1
@@ -86,18 +84,16 @@ define dso_local void @foo_St4x2(%struct.St4x2* nocapture noundef readonly byval
   ; CHECK:       ld.param.u32 [[R3:%r[0-9]+]], [foo_St4x2_param_0+4];
   ; CHECK:       st.u32  [[[R1]]+4], [[R3]];
   ; CHECK:       ret;
-  %arrayidx = getelementptr inbounds %struct.St4x2, %struct.St4x2* %in, i64 0, i32 0, i64 0
-  %1 = load i32, i32* %arrayidx, align 4
-  %arrayidx3 = getelementptr inbounds %struct.St4x2, %struct.St4x2* %ret, i64 0, i32 0, i64 0
-  store i32 %1, i32* %arrayidx3, align 4
-  %arrayidx.1 = getelementptr inbounds %struct.St4x2, %struct.St4x2* %in, i64 0, i32 0, i64 1
-  %2 = load i32, i32* %arrayidx.1, align 4
-  %arrayidx3.1 = getelementptr inbounds %struct.St4x2, %struct.St4x2* %ret, i64 0, i32 0, i64 1
-  store i32 %2, i32* %arrayidx3.1, align 4
+  %1 = load i32, ptr %in, align 4
+  store i32 %1, ptr %ret, align 4
+  %arrayidx.1 = getelementptr inbounds [2 x i32], ptr %in, i64 0, i64 1
+  %2 = load i32, ptr %arrayidx.1, align 4
+  %arrayidx3.1 = getelementptr inbounds [2 x i32], ptr %ret, i64 0, i64 1
+  store i32 %2, ptr %arrayidx3.1, align 4
   ret void
 }
 
-define dso_local void @foo_St4x3(%struct.St4x3* nocapture noundef readonly byval(%struct.St4x3) align 4 %in, %struct.St4x3* nocapture noundef writeonly %ret) {
+define dso_local void @foo_St4x3(ptr nocapture noundef readonly byval(%struct.St4x3) align 4 %in, ptr nocapture noundef writeonly %ret) {
   ; CHECK-LABEL: .visible .func foo_St4x3(
   ; CHECK:               .param .align 4 .b8 foo_St4x3_param_0[12],
   ; CHECK:               .param .b32 foo_St4x3_param_1
@@ -110,22 +106,20 @@ define dso_local void @foo_St4x3(%struct.St4x3* nocapture noundef readonly byval
   ; CHECK:       ld.param.u32 [[R4:%r[0-9]+]], [foo_St4x3_param_0+8];
   ; CHECK:       st.u32  [[[R1]]+8], [[R4]];
   ; CHECK:       ret;
-  %arrayidx = getelementptr inbounds %struct.St4x3, %struct.St4x3* %in, i64 0, i32 0, i64 0
-  %1 = load i32, i32* %arrayidx, align 4
-  %arrayidx3 = getelementptr inbounds %struct.St4x3, %struct.St4x3* %ret, i64 0, i32 0, i64 0
-  store i32 %1, i32* %arrayidx3, align 4
-  %arrayidx.1 = getelementptr inbounds %struct.St4x3, %struct.St4x3* %in, i64 0, i32 0, i64 1
-  %2 = load i32, i32* %arrayidx.1, align 4
-  %arrayidx3.1 = getelementptr inbounds %struct.St4x3, %struct.St4x3* %ret, i64 0, i32 0, i64 1
-  store i32 %2, i32* %arrayidx3.1, align 4
-  %arrayidx.2 = getelementptr inbounds %struct.St4x3, %struct.St4x3* %in, i64 0, i32 0, i64 2
-  %3 = load i32, i32* %arrayidx.2, align 4
-  %arrayidx3.2 = getelementptr inbounds %struct.St4x3, %struct.St4x3* %ret, i64 0, i32 0, i64 2
-  store i32 %3, i32* %arrayidx3.2, align 4
+  %1 = load i32, ptr %in, align 4
+  store i32 %1, ptr %ret, align 4
+  %arrayidx.1 = getelementptr inbounds [3 x i32], ptr %in, i64 0, i64 1
+  %2 = load i32, ptr %arrayidx.1, align 4
+  %arrayidx3.1 = getelementptr inbounds [3 x i32], ptr %ret, i64 0, i64 1
+  store i32 %2, ptr %arrayidx3.1, align 4
+  %arrayidx.2 = getelementptr inbounds [3 x i32], ptr %in, i64 0, i64 2
+  %3 = load i32, ptr %arrayidx.2, align 4
+  %arrayidx3.2 = getelementptr inbounds [3 x i32], ptr %ret, i64 0, i64 2
+  store i32 %3, ptr %arrayidx3.2, align 4
   ret void
 }
 
-define dso_local void @foo_St4x4(%struct.St4x4* nocapture noundef readonly byval(%struct.St4x4) align 4 %in, %struct.St4x4* nocapture noundef writeonly %ret) {
+define dso_local void @foo_St4x4(ptr nocapture noundef readonly byval(%struct.St4x4) align 4 %in, ptr nocapture noundef writeonly %ret) {
   ; CHECK-LABEL: .visible .func foo_St4x4(
   ; CHECK:               .param .align 4 .b8 foo_St4x4_param_0[16],
   ; CHECK:               .param .b32 foo_St4x4_param_1
@@ -140,26 +134,24 @@ define dso_local void @foo_St4x4(%struct.St4x4* nocapture noundef readonly byval
   ; CHECK:       ld.param.u32 [[R5:%r[0-9]+]], [foo_St4x4_param_0+12];
   ; CHECK:       st.u32  [[[R1]]+12], [[R5]];
   ; CHECK:       ret;
-  %arrayidx = getelementptr inbounds %struct.St4x4, %struct.St4x4* %in, i64 0, i32 0, i64 0
-  %1 = load i32, i32* %arrayidx, align 4
-  %arrayidx3 = getelementptr inbounds %struct.St4x4, %struct.St4x4* %ret, i64 0, i32 0, i64 0
-  store i32 %1, i32* %arrayidx3, align 4
-  %arrayidx.1 = getelementptr inbounds %struct.St4x4, %struct.St4x4* %in, i64 0, i32 0, i64 1
-  %2 = load i32, i32* %arrayidx.1, align 4
-  %arrayidx3.1 = getelementptr inbounds %struct.St4x4, %struct.St4x4* %ret, i64 0, i32 0, i64 1
-  store i32 %2, i32* %arrayidx3.1, align 4
-  %arrayidx.2 = getelementptr inbounds %struct.St4x4, %struct.St4x4* %in, i64 0, i32 0, i64 2
-  %3 = load i32, i32* %arrayidx.2, align 4
-  %arrayidx3.2 = getelementptr inbounds %struct.St4x4, %struct.St4x4* %ret, i64 0, i32 0, i64 2
-  store i32 %3, i32* %arrayidx3.2, align 4
-  %arrayidx.3 = getelementptr inbounds %struct.St4x4, %struct.St4x4* %in, i64 0, i32 0, i64 3
-  %4 = load i32, i32* %arrayidx.3, align 4
-  %arrayidx3.3 = getelementptr inbounds %struct.St4x4, %struct.St4x4* %ret, i64 0, i32 0, i64 3
-  store i32 %4, i32* %arrayidx3.3, align 4
+  %1 = load i32, ptr %in, align 4
+  store i32 %1, ptr %ret, align 4
+  %arrayidx.1 = getelementptr inbounds [4 x i32], ptr %in, i64 0, i64 1
+  %2 = load i32, ptr %arrayidx.1, align 4
+  %arrayidx3.1 = getelementptr inbounds [4 x i32], ptr %ret, i64 0, i64 1
+  store i32 %2, ptr %arrayidx3.1, align 4
+  %arrayidx.2 = getelementptr inbounds [4 x i32], ptr %in, i64 0, i64 2
+  %3 = load i32, ptr %arrayidx.2, align 4
+  %arrayidx3.2 = getelementptr inbounds [4 x i32], ptr %ret, i64 0, i64 2
+  store i32 %3, ptr %arrayidx3.2, align 4
+  %arrayidx.3 = getelementptr inbounds [4 x i32], ptr %in, i64 0, i64 3
+  %4 = load i32, ptr %arrayidx.3, align 4
+  %arrayidx3.3 = getelementptr inbounds [4 x i32], ptr %ret, i64 0, i64 3
+  store i32 %4, ptr %arrayidx3.3, align 4
   ret void
 }
 
-define dso_local void @foo_St4x5(%struct.St4x5* nocapture noundef readonly byval(%struct.St4x5) align 4 %in, %struct.St4x5* nocapture noundef writeonly %ret) {
+define dso_local void @foo_St4x5(ptr nocapture noundef readonly byval(%struct.St4x5) align 4 %in, ptr nocapture noundef writeonly %ret) {
   ; CHECK-LABEL: .visible .func foo_St4x5(
   ; CHECK:               .param .align 4 .b8 foo_St4x5_param_0[20],
   ; CHECK:               .param .b32 foo_St4x5_param_1
@@ -176,30 +168,28 @@ define dso_local void @foo_St4x5(%struct.St4x5* nocapture noundef readonly byval
   ; CHECK:       ld.param.u32 [[R6:%r[0-9]+]], [foo_St4x5_param_0+16];
   ; CHECK:       st.u32  [[[R1]]+16], [[R6]];
   ; CHECK:       ret;
-  %arrayidx = getelementptr inbounds %struct.St4x5, %struct.St4x5* %in, i64 0, i32 0, i64 0
-  %1 = load i32, i32* %arrayidx, align 4
-  %arrayidx3 = getelementptr inbounds %struct.St4x5, %struct.St4x5* %ret, i64 0, i32 0, i64 0
-  store i32 %1, i32* %arrayidx3, align 4
-  %arrayidx.1 = getelementptr inbounds %struct.St4x5, %struct.St4x5* %in, i64 0, i32 0, i64 1
-  %2 = load i32, i32* %arrayidx.1, align 4
-  %arrayidx3.1 = getelementptr inbounds %struct.St4x5, %struct.St4x5* %ret, i64 0, i32 0, i64 1
-  store i32 %2, i32* %arrayidx3.1, align 4
-  %arrayidx.2 = getelementptr inbounds %struct.St4x5, %struct.St4x5* %in, i64 0, i32 0, i64 2
-  %3 = load i32, i32* %arrayidx.2, align 4
-  %arrayidx3.2 = getelementptr inbounds %struct.St4x5, %struct.St4x5* %ret, i64 0, i32 0, i64 2
-  store i32 %3, i32* %arrayidx3.2, align 4
-  %arrayidx.3 = getelementptr inbounds %struct.St4x5, %struct.St4x5* %in, i64 0, i32 0, i64 3
-  %4 = load i32, i32* %arrayidx.3, align 4
-  %arrayidx3.3 = getelementptr inbounds %struct.St4x5, %struct.St4x5* %ret, i64 0, i32 0, i64 3
-  store i32 %4, i32* %arrayidx3.3, align 4
-  %arrayidx.4 = getelementptr inbounds %struct.St4x5, %struct.St4x5* %in, i64 0, i32 0, i64 4
-  %5 = load i32, i32* %arrayidx.4, align 4
-  %arrayidx3.4 = getelementptr inbounds %struct.St4x5, %struct.St4x5* %ret, i64 0, i32 0, i64 4
-  store i32 %5, i32* %arrayidx3.4, align 4
+  %1 = load i32, ptr %in, align 4
+  store i32 %1, ptr %ret, align 4
+  %arrayidx.1 = getelementptr inbounds [5 x i32], ptr %in, i64 0, i64 1
+  %2 = load i32, ptr %arrayidx.1, align 4
+  %arrayidx3.1 = getelementptr inbounds [5 x i32], ptr %ret, i64 0, i64 1
+  store i32 %2, ptr %arrayidx3.1, align 4
+  %arrayidx.2 = getelementptr inbounds [5 x i32], ptr %in, i64 0, i64 2
+  %3 = load i32, ptr %arrayidx.2, align 4
+  %arrayidx3.2 = getelementptr inbounds [5 x i32], ptr %ret, i64 0, i64 2
+  store i32 %3, ptr %arrayidx3.2, align 4
+  %arrayidx.3 = getelementptr inbounds [5 x i32], ptr %in, i64 0, i64 3
+  %4 = load i32, ptr %arrayidx.3, align 4
+  %arrayidx3.3 = getelementptr inbounds [5 x i32], ptr %ret, i64 0, i64 3
+  store i32 %4, ptr %arrayidx3.3, align 4
+  %arrayidx.4 = getelementptr inbounds [5 x i32], ptr %in, i64 0, i64 4
+  %5 = load i32, ptr %arrayidx.4, align 4
+  %arrayidx3.4 = getelementptr inbounds [5 x i32], ptr %ret, i64 0, i64 4
+  store i32 %5, ptr %arrayidx3.4, align 4
   ret void
 }
 
-define dso_local void @foo_St4x6(%struct.St4x6* nocapture noundef readonly byval(%struct.St4x6) align 4 %in, %struct.St4x6* nocapture noundef writeonly %ret) {
+define dso_local void @foo_St4x6(ptr nocapture noundef readonly byval(%struct.St4x6) align 4 %in, ptr nocapture noundef writeonly %ret) {
   ; CHECK-LABEL: .visible .func foo_St4x6(
   ; CHECK:               .param .align 4 .b8 foo_St4x6_param_0[24],
   ; CHECK:               .param .b32 foo_St4x6_param_1
@@ -218,34 +208,32 @@ define dso_local void @foo_St4x6(%struct.St4x6* nocapture noundef readonly byval
   ; CHECK:       ld.param.u32 [[R7:%r[0-9]+]], [foo_St4x6_param_0+20];
   ; CHECK:       st.u32  [[[R1]]+20], [[R7]];
   ; CHECK:       ret;
-  %arrayidx = getelementptr inbounds %struct.St4x6, %struct.St4x6* %in, i64 0, i32 0, i64 0
-  %1 = load i32, i32* %arrayidx, align 4
-  %arrayidx3 = getelementptr inbounds %struct.St4x6, %struct.St4x6* %ret, i64 0, i32 0, i64 0
-  store i32 %1, i32* %arrayidx3, align 4
-  %arrayidx.1 = getelementptr inbounds %struct.St4x6, %struct.St4x6* %in, i64 0, i32 0, i64 1
-  %2 = load i32, i32* %arrayidx.1, align 4
-  %arrayidx3.1 = getelementptr inbounds %struct.St4x6, %struct.St4x6* %ret, i64 0, i32 0, i64 1
-  store i32 %2, i32* %arrayidx3.1, align 4
-  %arrayidx.2 = getelementptr inbounds %struct.St4x6, %struct.St4x6* %in, i64 0, i32 0, i64 2
-  %3 = load i32, i32* %arrayidx.2, align 4
-  %arrayidx3.2 = getelementptr inbounds %struct.St4x6, %struct.St4x6* %ret, i64 0, i32 0, i64 2
-  store i32 %3, i32* %arrayidx3.2, align 4
-  %arrayidx.3 = getelementptr inbounds %struct.St4x6, %struct.St4x6* %in, i64 0, i32 0, i64 3
-  %4 = load i32, i32* %arrayidx.3, align 4
-  %arrayidx3.3 = getelementptr inbounds %struct.St4x6, %struct.St4x6* %ret, i64 0, i32 0, i64 3
-  store i32 %4, i32* %arrayidx3.3, align 4
-  %arrayidx.4 = getelementptr inbounds %struct.St4x6, %struct.St4x6* %in, i64 0, i32 0, i64 4
-  %5 = load i32, i32* %arrayidx.4, align 4
-  %arrayidx3.4 = getelementptr inbounds %struct.St4x6, %struct.St4x6* %ret, i64 0, i32 0, i64 4
-  store i32 %5, i32* %arrayidx3.4, align 4
-  %arrayidx.5 = getelementptr inbounds %struct.St4x6, %struct.St4x6* %in, i64 0, i32 0, i64 5
-  %6 = load i32, i32* %arrayidx.5, align 4
-  %arrayidx3.5 = getelementptr inbounds %struct.St4x6, %struct.St4x6* %ret, i64 0, i32 0, i64 5
-  store i32 %6, i32* %arrayidx3.5, align 4
+  %1 = load i32, ptr %in, align 4
+  store i32 %1, ptr %ret, align 4
+  %arrayidx.1 = getelementptr inbounds [6 x i32], ptr %in, i64 0, i64 1
+  %2 = load i32, ptr %arrayidx.1, align 4
+  %arrayidx3.1 = getelementptr inbounds [6 x i32], ptr %ret, i64 0, i64 1
+  store i32 %2, ptr %arrayidx3.1, align 4
+  %arrayidx.2 = getelementptr inbounds [6 x i32], ptr %in, i64 0, i64 2
+  %3 = load i32, ptr %arrayidx.2, align 4
+  %arrayidx3.2 = getelementptr inbounds [6 x i32], ptr %ret, i64 0, i64 2
+  store i32 %3, ptr %arrayidx3.2, align 4
+  %arrayidx.3 = getelementptr inbounds [6 x i32], ptr %in, i64 0, i64 3
+  %4 = load i32, ptr %arrayidx.3, align 4
+  %arrayidx3.3 = getelementptr inbounds [6 x i32], ptr %ret, i64 0, i64 3
+  store i32 %4, ptr %arrayidx3.3, align 4
+  %arrayidx.4 = getelementptr inbounds [6 x i32], ptr %in, i64 0, i64 4
+  %5 = load i32, ptr %arrayidx.4, align 4
+  %arrayidx3.4 = getelementptr inbounds [6 x i32], ptr %ret, i64 0, i64 4
+  store i32 %5, ptr %arrayidx3.4, align 4
+  %arrayidx.5 = getelementptr inbounds [6 x i32], ptr %in, i64 0, i64 5
+  %6 = load i32, ptr %arrayidx.5, align 4
+  %arrayidx3.5 = getelementptr inbounds [6 x i32], ptr %ret, i64 0, i64 5
+  store i32 %6, ptr %arrayidx3.5, align 4
   ret void
 }
 
-define dso_local void @foo_St4x7(%struct.St4x7* nocapture noundef readonly byval(%struct.St4x7) align 4 %in, %struct.St4x7* nocapture noundef writeonly %ret) {
+define dso_local void @foo_St4x7(ptr nocapture noundef readonly byval(%struct.St4x7) align 4 %in, ptr nocapture noundef writeonly %ret) {
   ; CHECK-LABEL: .visible .func foo_St4x7(
   ; CHECK:               .param .align 4 .b8 foo_St4x7_param_0[28],
   ; CHECK:               .param .b32 foo_St4x7_param_1
@@ -266,38 +254,36 @@ define dso_local void @foo_St4x7(%struct.St4x7* nocapture noundef readonly byval
   ; CHECK:       ld.param.u32 [[R8:%r[0-9]+]], [foo_St4x7_param_0+24];
   ; CHECK:       st.u32  [[[R1]]+24], [[R8]];
   ; CHECK:       ret;
-  %arrayidx = getelementptr inbounds %struct.St4x7, %struct.St4x7* %in, i64 0, i32 0, i64 0
-  %1 = load i32, i32* %arrayidx, align 4
-  %arrayidx3 = getelementptr inbounds %struct.St4x7, %struct.St4x7* %ret, i64 0, i32 0, i64 0
-  store i32 %1, i32* %arrayidx3, align 4
-  %arrayidx.1 = getelementptr inbounds %struct.St4x7, %struct.St4x7* %in, i64 0, i32 0, i64 1
-  %2 = load i32, i32* %arrayidx.1, align 4
-  %arrayidx3.1 = getelementptr inbounds %struct.St4x7, %struct.St4x7* %ret, i64 0, i32 0, i64 1
-  store i32 %2, i32* %arrayidx3.1, align 4
-  %arrayidx.2 = getelementptr inbounds %struct.St4x7, %struct.St4x7* %in, i64 0, i32 0, i64 2
-  %3 = load i32, i32* %arrayidx.2, align 4
-  %arrayidx3.2 = getelementptr inbounds %struct.St4x7, %struct.St4x7* %ret, i64 0, i32 0, i64 2
-  store i32 %3, i32* %arrayidx3.2, align 4
-  %arrayidx.3 = getelementptr inbounds %struct.St4x7, %struct.St4x7* %in, i64 0, i32 0, i64 3
-  %4 = load i32, i32* %arrayidx.3, align 4
-  %arrayidx3.3 = getelementptr inbounds %struct.St4x7, %struct.St4x7* %ret, i64 0, i32 0, i64 3
-  store i32 %4, i32* %arrayidx3.3, align 4
-  %arrayidx.4 = getelementptr inbounds %struct.St4x7, %struct.St4x7* %in, i64 0, i32 0, i64 4
-  %5 = load i32, i32* %arrayidx.4, align 4
-  %arrayidx3.4 = getelementptr inbounds %struct.St4x7, %struct.St4x7* %ret, i64 0, i32 0, i64 4
-  store i32 %5, i32* %arrayidx3.4, align 4
-  %arrayidx.5 = getelementptr inbounds %struct.St4x7, %struct.St4x7* %in, i64 0, i32 0, i64 5
-  %6 = load i32, i32* %arrayidx.5, align 4
-  %arrayidx3.5 = getelementptr inbounds %struct.St4x7, %struct.St4x7* %ret, i64 0, i32 0, i64 5
-  store i32 %6, i32* %arrayidx3.5, align 4
-  %arrayidx.6 = getelementptr inbounds %struct.St4x7, %struct.St4x7* %in, i64 0, i32 0, i64 6
-  %7 = load i32, i32* %arrayidx.6, align 4
-  %arrayidx3.6 = getelementptr inbounds %struct.St4x7, %struct.St4x7* %ret, i64 0, i32 0, i64 6
-  store i32 %7, i32* %arrayidx3.6, align 4
+  %1 = load i32, ptr %in, align 4
+  store i32 %1, ptr %ret, align 4
+  %arrayidx.1 = getelementptr inbounds [7 x i32], ptr %in, i64 0, i64 1
+  %2 = load i32, ptr %arrayidx.1, align 4
+  %arrayidx3.1 = getelementptr inbounds [7 x i32], ptr %ret, i64 0, i64 1
+  store i32 %2, ptr %arrayidx3.1, align 4
+  %arrayidx.2 = getelementptr inbounds [7 x i32], ptr %in, i64 0, i64 2
+  %3 = load i32, ptr %arrayidx.2, align 4
+  %arrayidx3.2 = getelementptr inbounds [7 x i32], ptr %ret, i64 0, i64 2
+  store i32 %3, ptr %arrayidx3.2, align 4
+  %arrayidx.3 = getelementptr inbounds [7 x i32], ptr %in, i64 0, i64 3
+  %4 = load i32, ptr %arrayidx.3, align 4
+  %arrayidx3.3 = getelementptr inbounds [7 x i32], ptr %ret, i64 0, i64 3
+  store i32 %4, ptr %arrayidx3.3, align 4
+  %arrayidx.4 = getelementptr inbounds [7 x i32], ptr %in, i64 0, i64 4
+  %5 = load i32, ptr %arrayidx.4, align 4
+  %arrayidx3.4 = getelementptr inbounds [7 x i32], ptr %ret, i64 0, i64 4
+  store i32 %5, ptr %arrayidx3.4, align 4
+  %arrayidx.5 = getelementptr inbounds [7 x i32], ptr %in, i64 0, i64 5
+  %6 = load i32, ptr %arrayidx.5, align 4
+  %arrayidx3.5 = getelementptr inbounds [7 x i32], ptr %ret, i64 0, i64 5
+  store i32 %6, ptr %arrayidx3.5, align 4
+  %arrayidx.6 = getelementptr inbounds [7 x i32], ptr %in, i64 0, i64 6
+  %7 = load i32, ptr %arrayidx.6, align 4
+  %arrayidx3.6 = getelementptr inbounds [7 x i32], ptr %ret, i64 0, i64 6
+  store i32 %7, ptr %arrayidx3.6, align 4
   ret void
 }
 
-define dso_local void @foo_St4x8(%struct.St4x8* nocapture noundef readonly byval(%struct.St4x8) align 4 %in, %struct.St4x8* nocapture noundef writeonly %ret) {
+define dso_local void @foo_St4x8(ptr nocapture noundef readonly byval(%struct.St4x8) align 4 %in, ptr nocapture noundef writeonly %ret) {
   ; CHECK-LABEL: .visible .func foo_St4x8(
   ; CHECK:               .param .align 4 .b8 foo_St4x8_param_0[32],
   ; CHECK:               .param .b32 foo_St4x8_param_1
@@ -320,42 +306,40 @@ define dso_local void @foo_St4x8(%struct.St4x8* nocapture noundef readonly byval
   ; CHECK:       ld.param.u32 [[R9:%r[0-9]+]], [foo_St4x8_param_0+28];
   ; CHECK:       st.u32  [[[R1]]+28], [[R9]];
   ; CHECK:       ret;
-  %arrayidx = getelementptr inbounds %struct.St4x8, %struct.St4x8* %in, i64 0, i32 0, i64 0
-  %1 = load i32, i32* %arrayidx, align 4
-  %arrayidx3 = getelementptr inbounds %struct.St4x8, %struct.St4x8* %ret, i64 0, i32 0, i64 0
-  store i32 %1, i32* %arrayidx3, align 4
-  %arrayidx.1 = getelementptr inbounds %struct.St4x8, %struct.St4x8* %in, i64 0, i32 0, i64 1
-  %2 = load i32, i32* %arrayidx.1, align 4
-  %arrayidx3.1 = getelementptr inbounds %struct.St4x8, %struct.St4x8* %ret, i64 0, i32 0, i64 1
-  store i32 %2, i32* %arrayidx3.1, align 4
-  %arrayidx.2 = getelementptr inbounds %struct.St4x8, %struct.St4x8* %in, i64 0, i32 0, i64 2
-  %3 = load i32, i32* %arrayidx.2, align 4
-  %arrayidx3.2 = getelementptr inbounds %struct.St4x8, %struct.St4x8* %ret, i64 0, i32 0, i64 2
-  store i32 %3, i32* %arrayidx3.2, align 4
-  %arrayidx.3 = getelementptr inbounds %struct.St4x8, %struct.St4x8* %in, i64 0, i32 0, i64 3
-  %4 = load i32, i32* %arrayidx.3, align 4
-  %arrayidx3.3 = getelementptr inbounds %struct.St4x8, %struct.St4x8* %ret, i64 0, i32 0, i64 3
-  store i32 %4, i32* %arrayidx3.3, align 4
-  %arrayidx.4 = getelementptr inbounds %struct.St4x8, %struct.St4x8* %in, i64 0, i32 0, i64 4
-  %5 = load i32, i32* %arrayidx.4, align 4
-  %arrayidx3.4 = getelementptr inbounds %struct.St4x8, %struct.St4x8* %ret, i64 0, i32 0, i64 4
-  store i32 %5, i32* %arrayidx3.4, align 4
-  %arrayidx.5 = getelementptr inbounds %struct.St4x8, %struct.St4x8* %in, i64 0, i32 0, i64 5
-  %6 = load i32, i32* %arrayidx.5, align 4
-  %arrayidx3.5 = getelementptr inbounds %struct.St4x8, %struct.St4x8* %ret, i64 0, i32 0, i64 5
-  store i32 %6, i32* %arrayidx3.5, align 4
-  %arrayidx.6 = getelementptr inbounds %struct.St4x8, %struct.St4x8* %in, i64 0, i32 0, i64 6
-  %7 = load i32, i32* %arrayidx.6, align 4
-  %arrayidx3.6 = getelementptr inbounds %struct.St4x8, %struct.St4x8* %ret, i64 0, i32 0, i64 6
-  store i32 %7, i32* %arrayidx3.6, align 4
-  %arrayidx.7 = getelementptr inbounds %struct.St4x8, %struct.St4x8* %in, i64 0, i32 0, i64 7
-  %8 = load i32, i32* %arrayidx.7, align 4
-  %arrayidx3.7 = getelementptr inbounds %struct.St4x8, %struct.St4x8* %ret, i64 0, i32 0, i64 7
-  store i32 %8, i32* %arrayidx3.7, align 4
+  %1 = load i32, ptr %in, align 4
+  store i32 %1, ptr %ret, align 4
+  %arrayidx.1 = getelementptr inbounds [8 x i32], ptr %in, i64 0, i64 1
+  %2 = load i32, ptr %arrayidx.1, align 4
+  %arrayidx3.1 = getelementptr inbounds [8 x i32], ptr %ret, i64 0, i64 1
+  store i32 %2, ptr %arrayidx3.1, align 4
+  %arrayidx.2 = getelementptr inbounds [8 x i32], ptr %in, i64 0, i64 2
+  %3 = load i32, ptr %arrayidx.2, align 4
+  %arrayidx3.2 = getelementptr inbounds [8 x i32], ptr %ret, i64 0, i64 2
+  store i32 %3, ptr %arrayidx3.2, align 4
+  %arrayidx.3 = getelementptr inbounds [8 x i32], ptr %in, i64 0, i64 3
+  %4 = load i32, ptr %arrayidx.3, align 4
+  %arrayidx3.3 = getelementptr inbounds [8 x i32], ptr %ret, i64 0, i64 3
+  store i32 %4, ptr %arrayidx3.3, align 4
+  %arrayidx.4 = getelementptr inbounds [8 x i32], ptr %in, i64 0, i64 4
+  %5 = load i32, ptr %arrayidx.4, align 4
+  %arrayidx3.4 = getelementptr inbounds [8 x i32], ptr %ret, i64 0, i64 4
+  store i32 %5, ptr %arrayidx3.4, align 4
+  %arrayidx.5 = getelementptr inbounds [8 x i32], ptr %in, i64 0, i64 5
+  %6 = load i32, ptr %arrayidx.5, align 4
+  %arrayidx3.5 = getelementptr inbounds [8 x i32], ptr %ret, i64 0, i64 5
+  store i32 %6, ptr %arrayidx3.5, align 4
+  %arrayidx.6 = getelementptr inbounds [8 x i32], ptr %in, i64 0, i64 6
+  %7 = load i32, ptr %arrayidx.6, align 4
+  %arrayidx3.6 = getelementptr inbounds [8 x i32], ptr %ret, i64 0, i64 6
+  store i32 %7, ptr %arrayidx3.6, align 4
+  %arrayidx.7 = getelementptr inbounds [8 x i32], ptr %in, i64 0, i64 7
+  %8 = load i32, ptr %arrayidx.7, align 4
+  %arrayidx3.7 = getelementptr inbounds [8 x i32], ptr %ret, i64 0, i64 7
+  store i32 %8, ptr %arrayidx3.7, align 4
   ret void
 }
 
-define dso_local void @foo_St8x1(%struct.St8x1* nocapture noundef readonly byval(%struct.St8x1) align 8 %in, %struct.St8x1* nocapture noundef writeonly %ret) {
+define dso_local void @foo_St8x1(ptr nocapture noundef readonly byval(%struct.St8x1) align 8 %in, ptr nocapture noundef writeonly %ret) {
   ; CHECK-LABEL: .visible .func foo_St8x1(
   ; CHECK:               .param .align 8 .b8 foo_St8x1_param_0[8],
   ; CHECK:               .param .b32 foo_St8x1_param_1
@@ -364,14 +348,12 @@ define dso_local void @foo_St8x1(%struct.St8x1* nocapture noundef readonly byval
   ; CHECK:       ld.param.u64 [[RD1:%rd[0-9]+]], [foo_St8x1_param_0];
   ; CHECK:       st.u64 [[[R1]]], [[RD1]];
   ; CHECK:       ret;
-  %arrayidx = getelementptr inbounds %struct.St8x1, %struct.St8x1* %in, i64 0, i32 0, i64 0
-  %1 = load i64, i64* %arrayidx, align 8
-  %arrayidx3 = getelementptr inbounds %struct.St8x1, %struct.St8x1* %ret, i64 0, i32 0, i64 0
-  store i64 %1, i64* %arrayidx3, align 8
+  %1 = load i64, ptr %in, align 8
+  store i64 %1, ptr %ret, align 8
   ret void
 }
 
-define dso_local void @foo_St8x2(%struct.St8x2* nocapture noundef readonly byval(%struct.St8x2) align 8 %in, %struct.St8x2* nocapture noundef writeonly %ret) {
+define dso_local void @foo_St8x2(ptr nocapture noundef readonly byval(%struct.St8x2) align 8 %in, ptr nocapture noundef writeonly %ret) {
   ; CHECK-LABEL: .visible .func foo_St8x2(
   ; CHECK:               .param .align 8 .b8 foo_St8x2_param_0[16],
   ; CHECK:               .param .b32 foo_St8x2_param_1
@@ -382,18 +364,16 @@ define dso_local void @foo_St8x2(%struct.St8x2* nocapture noundef readonly byval
   ; CHECK:       ld.param.u64 [[RD2:%rd[0-9]+]], [foo_St8x2_param_0+8];
   ; CHECK:       st.u64 [[[R1]]+8], [[RD2]];
   ; CHECK:       ret;
-  %arrayidx = getelementptr inbounds %struct.St8x2, %struct.St8x2* %in, i64 0, i32 0, i64 0
-  %1 = load i64, i64* %arrayidx, align 8
-  %arrayidx3 = getelementptr inbounds %struct.St8x2, %struct.St8x2* %ret, i64 0, i32 0, i64 0
-  store i64 %1, i64* %arrayidx3, align 8
-  %arrayidx.1 = getelementptr inbounds %struct.St8x2, %struct.St8x2* %in, i64 0, i32 0, i64 1
-  %2 = load i64, i64* %arrayidx.1, align 8
-  %arrayidx3.1 = getelementptr inbounds %struct.St8x2, %struct.St8x2* %ret, i64 0, i32 0, i64 1
-  store i64 %2, i64* %arrayidx3.1, align 8
+  %1 = load i64, ptr %in, align 8
+  store i64 %1, ptr %ret, align 8
+  %arrayidx.1 = getelementptr inbounds [2 x i64], ptr %in, i64 0, i64 1
+  %2 = load i64, ptr %arrayidx.1, align 8
+  %arrayidx3.1 = getelementptr inbounds [2 x i64], ptr %ret, i64 0, i64 1
+  store i64 %2, ptr %arrayidx3.1, align 8
   ret void
 }
 
-define dso_local void @foo_St8x3(%struct.St8x3* nocapture noundef readonly byval(%struct.St8x3) align 8 %in, %struct.St8x3* nocapture noundef writeonly %ret) {
+define dso_local void @foo_St8x3(ptr nocapture noundef readonly byval(%struct.St8x3) align 8 %in, ptr nocapture noundef writeonly %ret) {
   ; CHECK-LABEL: .visible .func foo_St8x3(
   ; CHECK:               .param .align 8 .b8 foo_St8x3_param_0[24],
   ; CHECK:               .param .b32 foo_St8x3_param_1
@@ -406,22 +386,20 @@ define dso_local void @foo_St8x3(%struct.St8x3* nocapture noundef readonly byval
   ; CHECK:       ld.param.u64 [[RD3:%rd[0-9]+]], [foo_St8x3_param_0+16];
   ; CHECK:       st.u64 [[[R1]]+16], [[RD3]];
   ; CHECK:       ret;
-  %arrayidx = getelementptr inbounds %struct.St8x3, %struct.St8x3* %in, i64 0, i32 0, i64 0
-  %1 = load i64, i64* %arrayidx, align 8
-  %arrayidx3 = getelementptr inbounds %struct.St8x3, %struct.St8x3* %ret, i64 0, i32 0, i64 0
-  store i64 %1, i64* %arrayidx3, align 8
-  %arrayidx.1 = getelementptr inbounds %struct.St8x3, %struct.St8x3* %in, i64 0, i32 0, i64 1
-  %2 = load i64, i64* %arrayidx.1, align 8
-  %arrayidx3.1 = getelementptr inbounds %struct.St8x3, %struct.St8x3* %ret, i64 0, i32 0, i64 1
-  store i64 %2, i64* %arrayidx3.1, align 8
-  %arrayidx.2 = getelementptr inbounds %struct.St8x3, %struct.St8x3* %in, i64 0, i32 0, i64 2
-  %3 = load i64, i64* %arrayidx.2, align 8
-  %arrayidx3.2 = getelementptr inbounds %struct.St8x3, %struct.St8x3* %ret, i64 0, i32 0, i64 2
-  store i64 %3, i64* %arrayidx3.2, align 8
+  %1 = load i64, ptr %in, align 8
+  store i64 %1, ptr %ret, align 8
+  %arrayidx.1 = getelementptr inbounds [3 x i64], ptr %in, i64 0, i64 1
+  %2 = load i64, ptr %arrayidx.1, align 8
+  %arrayidx3.1 = getelementptr inbounds [3 x i64], ptr %ret, i64 0, i64 1
+  store i64 %2, ptr %arrayidx3.1, align 8
+  %arrayidx.2 = getelementptr inbounds [3 x i64], ptr %in, i64 0, i64 2
+  %3 = load i64, ptr %arrayidx.2, align 8
+  %arrayidx3.2 = getelementptr inbounds [3 x i64], ptr %ret, i64 0, i64 2
+  store i64 %3, ptr %arrayidx3.2, align 8
   ret void
 }
 
-define dso_local void @foo_St8x4(%struct.St8x4* nocapture noundef readonly byval(%struct.St8x4) align 8 %in, %struct.St8x4* nocapture noundef writeonly %ret) {
+define dso_local void @foo_St8x4(ptr nocapture noundef readonly byval(%struct.St8x4) align 8 %in, ptr nocapture noundef writeonly %ret) {
   ; CHECK-LABEL: .visible .func foo_St8x4(
   ; CHECK:               .param .align 8 .b8 foo_St8x4_param_0[32],
   ; CHECK:               .param .b32 foo_St8x4_param_1
@@ -436,21 +414,19 @@ define dso_local void @foo_St8x4(%struct.St8x4* nocapture noundef readonly byval
   ; CHECK:       ld.param.u64 [[RD4:%rd[0-9]+]], [foo_St8x4_param_0+24];
   ; CHECK:       st.u64 [[[R1]]+24], [[RD4]];
   ; CHECK:       ret;
-  %arrayidx = getelementptr inbounds %struct.St8x4, %struct.St8x4* %in, i64 0, i32 0, i64 0
-  %1 = load i64, i64* %arrayidx, align 8
-  %arrayidx3 = getelementptr inbounds %struct.St8x4, %struct.St8x4* %ret, i64 0, i32 0, i64 0
-  store i64 %1, i64* %arrayidx3, align 8
-  %arrayidx.1 = getelementptr inbounds %struct.St8x4, %struct.St8x4* %in, i64 0, i32 0, i64 1
-  %2 = load i64, i64* %arrayidx.1, align 8
-  %arrayidx3.1 = getelementptr inbounds %struct.St8x4, %struct.St8x4* %ret, i64 0, i32 0, i64 1
-  store i64 %2, i64* %arrayidx3.1, align 8
-  %arrayidx.2 = getelementptr inbounds %struct.St8x4, %struct.St8x4* %in, i64 0, i32 0, i64 2
-  %3 = load i64, i64* %arrayidx.2, align 8
-  %arrayidx3.2 = getelementptr inbounds %struct.St8x4, %struct.St8x4* %ret, i64 0, i32 0, i64 2
-  store i64 %3, i64* %arrayidx3.2, align 8
-  %arrayidx.3 = getelementptr inbounds %struct.St8x4, %struct.St8x4* %in, i64 0, i32 0, i64 3
-  %4 = load i64, i64* %arrayidx.3, align 8
-  %arrayidx3.3 = getelementptr inbounds %struct.St8x4, %struct.St8x4* %ret, i64 0, i32 0, i64 3
-  store i64 %4, i64* %arrayidx3.3, align 8
+  %1 = load i64, ptr %in, align 8
+  store i64 %1, ptr %ret, align 8
+  %arrayidx.1 = getelementptr inbounds [4 x i64], ptr %in, i64 0, i64 1
+  %2 = load i64, ptr %arrayidx.1, align 8
+  %arrayidx3.1 = getelementptr inbounds [4 x i64], ptr %ret, i64 0, i64 1
+  store i64 %2, ptr %arrayidx3.1, align 8
+  %arrayidx.2 = getelementptr inbounds [4 x i64], ptr %in, i64 0, i64 2
+  %3 = load i64, ptr %arrayidx.2, align 8
+  %arrayidx3.2 = getelementptr inbounds [4 x i64], ptr %ret, i64 0, i64 2
+  store i64 %3, ptr %arrayidx3.2, align 8
+  %arrayidx.3 = getelementptr inbounds [4 x i64], ptr %in, i64 0, i64 3
+  %4 = load i64, ptr %arrayidx.3, align 8
+  %arrayidx3.3 = getelementptr inbounds [4 x i64], ptr %ret, i64 0, i64 3
+  store i64 %4, ptr %arrayidx3.3, align 8
   ret void
 }


        


More information about the llvm-commits mailing list