1; RUN: opt -mtriple=amdgcn-amd-amdhsa -mattr=+max-private-element-size-4,-unaligned-scratch-access -load-store-vectorizer -S -o - %s | FileCheck -check-prefixes=ELT4,ELT4-ALIGNED,ALIGNED,ALL %s 2; RUN: opt -mtriple=amdgcn-amd-amdhsa -mattr=+max-private-element-size-8,-unaligned-scratch-access -load-store-vectorizer -S -o - %s | FileCheck -check-prefixes=ELT8,ELT8-ALIGNED,ALIGNED,ALL %s 3; RUN: opt -mtriple=amdgcn-amd-amdhsa -mattr=+max-private-element-size-16,-unaligned-scratch-access -load-store-vectorizer -S -o - %s | FileCheck -check-prefixes=ELT16,ELT16-ALIGNED,ALIGNED,ALL %s 4; RUN: opt -mtriple=amdgcn-amd-amdhsa -mattr=+max-private-element-size-4,+unaligned-scratch-access -load-store-vectorizer -S -o - %s | FileCheck -check-prefixes=ELT4,ELT4-UNALIGNED,UNALIGNED,ALL %s 5; RUN: opt -mtriple=amdgcn-amd-amdhsa -mattr=+max-private-element-size-8,+unaligned-scratch-access -load-store-vectorizer -S -o - %s | FileCheck -check-prefixes=ELT8,ELT8-UNALIGNED,UNALIGNED,ALL %s 6; RUN: opt -mtriple=amdgcn-amd-amdhsa -mattr=+max-private-element-size-16,+unaligned-scratch-access -load-store-vectorizer -S -o - %s | FileCheck -check-prefixes=ELT16,ELT16-UNALIGNED,UNALIGNED,ALL %s 7 8target datalayout = "e-p:32:32-p1:64:64-p2:64:64-p3:32:32-p4:64:64-p5:32:32-p24:64:64-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64" 9 10; ALL-LABEL: @merge_private_store_4_vector_elts_loads_v4i32 11; ALIGNED: store i32 12; ALIGNED: store i32 13; ALIGNED: store i32 14; ALIGNED: store i32 15 16; ELT8-UNALIGNED: store <2 x i32> 17; ELT8-UNALIGNED: store <2 x i32> 18 19; ELT16-UNALIGNED: store <4 x i32> 20define void @merge_private_store_4_vector_elts_loads_v4i32(i32* %out) #0 { 21 %out.gep.1 = getelementptr i32, i32* %out, i32 1 22 %out.gep.2 = getelementptr i32, i32* %out, i32 2 23 %out.gep.3 = getelementptr i32, i32* %out, i32 3 24 25 store i32 9, i32* %out 26 store i32 1, i32* %out.gep.1 27 store i32 23, i32* %out.gep.2 28 store i32 19, i32* %out.gep.3 29 ret void 30} 31 32; ALL-LABEL: @merge_private_store_4_vector_elts_loads_v4i32_align1( 33; ALIGNED: store i32 9, i32* %out, align 1 34; ALIGNED: store i32 1, i32* %out.gep.1, align 1 35; ALIGNED: store i32 23, i32* %out.gep.2, align 1 36; ALIGNED: store i32 19, i32* %out.gep.3, align 1 37 38; ELT16-UNALIGNED: store <4 x i32> <i32 9, i32 1, i32 23, i32 19>, <4 x i32>* %1, align 1 39 40; ELT8-UNALIGNED: store <2 x i32> <i32 9, i32 1>, <2 x i32>* %1, align 1 41; ELT8-UNALIGNED: store <2 x i32> <i32 23, i32 19>, <2 x i32>* %2, align 1 42 43; ELT4-UNALIGNED: store i32 44; ELT4-UNALIGNED: store i32 45; ELT4-UNALIGNED: store i32 46; ELT4-UNALIGNED: store i32 47define void @merge_private_store_4_vector_elts_loads_v4i32_align1(i32* %out) #0 { 48 %out.gep.1 = getelementptr i32, i32* %out, i32 1 49 %out.gep.2 = getelementptr i32, i32* %out, i32 2 50 %out.gep.3 = getelementptr i32, i32* %out, i32 3 51 52 store i32 9, i32* %out, align 1 53 store i32 1, i32* %out.gep.1, align 1 54 store i32 23, i32* %out.gep.2, align 1 55 store i32 19, i32* %out.gep.3, align 1 56 ret void 57} 58 59; ALL-LABEL: @merge_private_store_4_vector_elts_loads_v4i32_align2( 60; ALIGNED: store i32 9, i32* %out, align 2 61; ALIGNED: store i32 1, i32* %out.gep.1, align 2 62; ALIGNED: store i32 23, i32* %out.gep.2, align 2 63; ALIGNED: store i32 19, i32* %out.gep.3, align 2 64 65; ELT16-UNALIGNED: store <4 x i32> <i32 9, i32 1, i32 23, i32 19>, <4 x i32>* %1, align 2 66 67; ELT8-UNALIGNED: store <2 x i32> 68; ELT8-UNALIGNED: store <2 x i32> 69 70; ELT4-UNALIGNED: store i32 71; ELT4-UNALIGNED: store i32 72; ELT4-UNALIGNED: store i32 73; ELT4-UNALIGNED: store i32 74define void @merge_private_store_4_vector_elts_loads_v4i32_align2(i32* %out) #0 { 75 %out.gep.1 = getelementptr i32, i32* %out, i32 1 76 %out.gep.2 = getelementptr i32, i32* %out, i32 2 77 %out.gep.3 = getelementptr i32, i32* %out, i32 3 78 79 store i32 9, i32* %out, align 2 80 store i32 1, i32* %out.gep.1, align 2 81 store i32 23, i32* %out.gep.2, align 2 82 store i32 19, i32* %out.gep.3, align 2 83 ret void 84} 85 86; ALL-LABEL: @merge_private_store_4_vector_elts_loads_v4i8( 87; ALL: store <4 x i8> 88define void @merge_private_store_4_vector_elts_loads_v4i8(i8* %out) #0 { 89 %out.gep.1 = getelementptr i8, i8* %out, i32 1 90 %out.gep.2 = getelementptr i8, i8* %out, i32 2 91 %out.gep.3 = getelementptr i8, i8* %out, i32 3 92 93 store i8 9, i8* %out, align 4 94 store i8 1, i8* %out.gep.1 95 store i8 23, i8* %out.gep.2 96 store i8 19, i8* %out.gep.3 97 ret void 98} 99 100; ALL-LABEL: @merge_private_store_4_vector_elts_loads_v4i8_align1( 101; ALIGNED: store i8 102; ALIGNED: store i8 103; ALIGNED: store i8 104; ALIGNED: store i8 105 106; UNALIGNED: store <4 x i8> <i8 9, i8 1, i8 23, i8 19>, <4 x i8>* %1, align 1 107define void @merge_private_store_4_vector_elts_loads_v4i8_align1(i8* %out) #0 { 108 %out.gep.1 = getelementptr i8, i8* %out, i32 1 109 %out.gep.2 = getelementptr i8, i8* %out, i32 2 110 %out.gep.3 = getelementptr i8, i8* %out, i32 3 111 112 store i8 9, i8* %out, align 1 113 store i8 1, i8* %out.gep.1, align 1 114 store i8 23, i8* %out.gep.2, align 1 115 store i8 19, i8* %out.gep.3, align 1 116 ret void 117} 118 119; ALL-LABEL: @merge_private_store_4_vector_elts_loads_v2i16( 120; ALL: store <2 x i16> 121define void @merge_private_store_4_vector_elts_loads_v2i16(i16* %out) #0 { 122 %out.gep.1 = getelementptr i16, i16* %out, i32 1 123 124 store i16 9, i16* %out, align 4 125 store i16 12, i16* %out.gep.1 126 ret void 127} 128 129; ALL-LABEL: @merge_private_store_4_vector_elts_loads_v2i16_align2( 130; ALIGNED: store i16 131; ALIGNED: store i16 132 133; UNALIGNED: store <2 x i16> <i16 9, i16 12>, <2 x i16>* %1, align 2 134define void @merge_private_store_4_vector_elts_loads_v2i16_align2(i16* %out) #0 { 135 %out.gep.1 = getelementptr i16, i16* %out, i32 1 136 137 store i16 9, i16* %out, align 2 138 store i16 12, i16* %out.gep.1, align 2 139 ret void 140} 141 142; ALL-LABEL: @merge_private_store_4_vector_elts_loads_v2i16_align1( 143; ALIGNED: store i16 144; ALIGNED: store i16 145 146; UNALIGNED: store <2 x i16> <i16 9, i16 12>, <2 x i16>* %1, align 1 147define void @merge_private_store_4_vector_elts_loads_v2i16_align1(i16* %out) #0 { 148 %out.gep.1 = getelementptr i16, i16* %out, i32 1 149 150 store i16 9, i16* %out, align 1 151 store i16 12, i16* %out.gep.1, align 1 152 ret void 153} 154 155; ALL-LABEL: @merge_private_store_4_vector_elts_loads_v2i16_align8( 156; ALL: store <2 x i16> <i16 9, i16 12>, <2 x i16>* %1, align 8 157define void @merge_private_store_4_vector_elts_loads_v2i16_align8(i16* %out) #0 { 158 %out.gep.1 = getelementptr i16, i16* %out, i32 1 159 160 store i16 9, i16* %out, align 8 161 store i16 12, i16* %out.gep.1, align 2 162 ret void 163} 164 165; ALL-LABEL: @merge_private_store_3_vector_elts_loads_v4i32 166; ELT4: store i32 167; ELT4: store i32 168; ELT4: store i32 169 170; ELT8-ALIGNED: store i32 171; ELT8-ALIGNED: store i32 172; ELT8-ALIGNED: store i32 173 174; ELT8-UNALIGNED: store <2 x i32> 175; ELT8-UNALIGNED: store i32 176 177; ELT16-ALIGNED: store i32 178; ELT16-ALIGNED: store i32 179; ELT16-ALIGNED: store i32 180 181; ELT16-UNALIGNED: store <3 x i32> 182define void @merge_private_store_3_vector_elts_loads_v4i32(i32* %out) #0 { 183 %out.gep.1 = getelementptr i32, i32* %out, i32 1 184 %out.gep.2 = getelementptr i32, i32* %out, i32 2 185 186 store i32 9, i32* %out 187 store i32 1, i32* %out.gep.1 188 store i32 23, i32* %out.gep.2 189 ret void 190} 191 192; ALL-LABEL: @merge_private_store_3_vector_elts_loads_v4i32_align1( 193; ALIGNED: store i32 194; ALIGNED: store i32 195; ALIGNED: store i32 196 197; ELT4-UNALIGNED: store i32 198; ELT4-UNALIGNED: store i32 199; ELT4-UNALIGNED: store i32 200 201; ELT8-UNALIGNED: store <2 x i32> 202; ELT8-UNALIGNED: store i32 203 204; ELT16-UNALIGNED: store <3 x i32> 205define void @merge_private_store_3_vector_elts_loads_v4i32_align1(i32* %out) #0 { 206 %out.gep.1 = getelementptr i32, i32* %out, i32 1 207 %out.gep.2 = getelementptr i32, i32* %out, i32 2 208 209 store i32 9, i32* %out, align 1 210 store i32 1, i32* %out.gep.1, align 1 211 store i32 23, i32* %out.gep.2, align 1 212 ret void 213} 214 215; ALL-LABEL: @merge_private_store_3_vector_elts_loads_v4i8_align1( 216; ALIGNED: store i8 217; ALIGNED: store i8 218; ALIGNED: store i8 219 220; UNALIGNED: store <3 x i8> 221define void @merge_private_store_3_vector_elts_loads_v4i8_align1(i8* %out) #0 { 222 %out.gep.1 = getelementptr i8, i8* %out, i8 1 223 %out.gep.2 = getelementptr i8, i8* %out, i8 2 224 225 store i8 9, i8* %out, align 1 226 store i8 1, i8* %out.gep.1, align 1 227 store i8 23, i8* %out.gep.2, align 1 228 ret void 229} 230 231attributes #0 = { nounwind } 232