499 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 22; RUN: opt -S -mtriple=amdgcn-unknown-amdhsa -passes=amdgpu-promote-alloca -amdgpu-promote-alloca-to-vector-limit=512 -amdgpu-promote-alloca-to-vector-max-regs=32 < %s | FileCheck %s3 4define void @test_trivial_subvector(<2 x i64> %val.0, <2 x i64> %val.1) {5; CHECK-LABEL: define void @test_trivial_subvector6; CHECK-SAME: (<2 x i64> [[VAL_0:%.*]], <2 x i64> [[VAL_1:%.*]]) {7; CHECK-NEXT: entry:8; CHECK-NEXT: [[STACK:%.*]] = freeze <4 x i64> poison9; CHECK-NEXT: [[TMP0:%.*]] = extractelement <2 x i64> [[VAL_0]], i64 010; CHECK-NEXT: [[TMP1:%.*]] = insertelement <4 x i64> [[STACK]], i64 [[TMP0]], i32 011; CHECK-NEXT: [[TMP2:%.*]] = extractelement <2 x i64> [[VAL_0]], i64 112; CHECK-NEXT: [[TMP3:%.*]] = insertelement <4 x i64> [[TMP1]], i64 [[TMP2]], i32 113; CHECK-NEXT: [[TMP4:%.*]] = extractelement <2 x i64> [[VAL_1]], i64 014; CHECK-NEXT: [[TMP5:%.*]] = insertelement <4 x i64> [[TMP3]], i64 [[TMP4]], i32 115; CHECK-NEXT: [[TMP6:%.*]] = extractelement <2 x i64> [[VAL_1]], i64 116; CHECK-NEXT: [[TMP7:%.*]] = insertelement <4 x i64> [[TMP5]], i64 [[TMP6]], i32 217; CHECK-NEXT: [[TMP8:%.*]] = extractelement <2 x i64> [[VAL_1]], i64 018; CHECK-NEXT: [[TMP9:%.*]] = insertelement <4 x i64> [[TMP7]], i64 [[TMP8]], i32 219; CHECK-NEXT: [[TMP10:%.*]] = extractelement <2 x i64> [[VAL_1]], i64 120; CHECK-NEXT: [[TMP11:%.*]] = insertelement <4 x i64> [[TMP9]], i64 [[TMP10]], i32 321; CHECK-NEXT: [[TMP12:%.*]] = insertelement <2 x i64> poison, i64 [[TMP0]], i64 022; CHECK-NEXT: [[TMP13:%.*]] = insertelement <2 x i64> [[TMP12]], i64 [[TMP4]], i64 123; CHECK-NEXT: [[DUMMYUSER:%.*]] = freeze <2 x i64> [[TMP13]]24; CHECK-NEXT: [[TMP14:%.*]] = insertelement <2 x i64> poison, i64 [[TMP4]], i64 025; CHECK-NEXT: [[TMP15:%.*]] = insertelement <2 x i64> [[TMP14]], i64 [[TMP8]], i64 126; CHECK-NEXT: [[DUMMYUSER_1:%.*]] = freeze <2 x i64> [[TMP15]]27; CHECK-NEXT: [[TMP16:%.*]] = insertelement <2 x i64> poison, i64 [[TMP8]], i64 028; CHECK-NEXT: [[TMP17:%.*]] = insertelement <2 x i64> [[TMP16]], i64 [[TMP10]], i64 129; CHECK-NEXT: [[DUMMYUSER_2:%.*]] = freeze <2 x i64> [[TMP17]]30; CHECK-NEXT: ret void31;32entry:33 %stack = alloca [4 x i64], align 4, addrspace(5)34 %stack.1 = getelementptr inbounds [4 x i64], ptr addrspace(5) %stack, i32 0, i32 135 %stack.2 = getelementptr inbounds [4 x i64], ptr addrspace(5) %stack, i32 0, i32 236 37 store <2 x i64> %val.0, ptr addrspace(5) %stack38 store <2 x i64> %val.1, ptr addrspace(5) %stack.139 store <2 x i64> %val.1, ptr addrspace(5) %stack.240 41 %reload = load <2 x i64>, ptr addrspace(5) %stack42 %dummyuser = freeze <2 x i64> %reload43 44 %reload.1 = load <2 x i64>, ptr addrspace(5) %stack.145 %dummyuser.1 = freeze <2 x i64> %reload.146 47 %reload.2 = load <2 x i64>, ptr addrspace(5) %stack.248 %dummyuser.2 = freeze <2 x i64> %reload.249 ret void50}51 52define void @test_different_type_subvector(<4 x i32> %val.0, <8 x i16> %val.1, <16 x i8> %val.2, <128 x i1> %val.3) {53; CHECK-LABEL: define void @test_different_type_subvector54; CHECK-SAME: (<4 x i32> [[VAL_0:%.*]], <8 x i16> [[VAL_1:%.*]], <16 x i8> [[VAL_2:%.*]], <128 x i1> [[VAL_3:%.*]]) {55; CHECK-NEXT: entry:56; CHECK-NEXT: [[STACK:%.*]] = freeze <4 x i64> poison57; CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x i32> [[VAL_0]] to <2 x i64>58; CHECK-NEXT: [[TMP1:%.*]] = extractelement <2 x i64> [[TMP0]], i64 059; CHECK-NEXT: [[TMP2:%.*]] = insertelement <4 x i64> [[STACK]], i64 [[TMP1]], i32 060; CHECK-NEXT: [[TMP3:%.*]] = extractelement <2 x i64> [[TMP0]], i64 161; CHECK-NEXT: [[TMP4:%.*]] = insertelement <4 x i64> [[TMP2]], i64 [[TMP3]], i32 162; CHECK-NEXT: [[TMP5:%.*]] = insertelement <2 x i64> poison, i64 [[TMP1]], i64 063; CHECK-NEXT: [[TMP6:%.*]] = insertelement <2 x i64> [[TMP5]], i64 [[TMP3]], i64 164; CHECK-NEXT: [[TMP7:%.*]] = bitcast <2 x i64> [[TMP6]] to <16 x i8>65; CHECK-NEXT: [[DUMMYUSER:%.*]] = freeze <16 x i8> [[TMP7]]66; CHECK-NEXT: [[TMP8:%.*]] = bitcast <8 x i16> [[VAL_1]] to <2 x i64>67; CHECK-NEXT: [[TMP9:%.*]] = extractelement <2 x i64> [[TMP8]], i64 068; CHECK-NEXT: [[TMP10:%.*]] = insertelement <4 x i64> [[TMP4]], i64 [[TMP9]], i32 169; CHECK-NEXT: [[TMP11:%.*]] = extractelement <2 x i64> [[TMP8]], i64 170; CHECK-NEXT: [[TMP12:%.*]] = insertelement <4 x i64> [[TMP10]], i64 [[TMP11]], i32 271; CHECK-NEXT: [[TMP13:%.*]] = insertelement <2 x i64> poison, i64 [[TMP9]], i64 072; CHECK-NEXT: [[TMP14:%.*]] = insertelement <2 x i64> [[TMP13]], i64 [[TMP11]], i64 173; CHECK-NEXT: [[TMP15:%.*]] = bitcast <2 x i64> [[TMP14]] to <8 x i16>74; CHECK-NEXT: [[DUMMYUSE_1:%.*]] = freeze <8 x i16> [[TMP15]]75; CHECK-NEXT: [[TMP16:%.*]] = bitcast <16 x i8> [[VAL_2]] to <2 x i64>76; CHECK-NEXT: [[TMP17:%.*]] = extractelement <2 x i64> [[TMP16]], i64 077; CHECK-NEXT: [[TMP18:%.*]] = insertelement <4 x i64> [[TMP12]], i64 [[TMP17]], i32 278; CHECK-NEXT: [[TMP19:%.*]] = extractelement <2 x i64> [[TMP16]], i64 179; CHECK-NEXT: [[TMP20:%.*]] = insertelement <4 x i64> [[TMP18]], i64 [[TMP19]], i32 380; CHECK-NEXT: [[TMP21:%.*]] = insertelement <2 x i64> poison, i64 [[TMP17]], i64 081; CHECK-NEXT: [[TMP22:%.*]] = insertelement <2 x i64> [[TMP21]], i64 [[TMP19]], i64 182; CHECK-NEXT: [[TMP23:%.*]] = bitcast <2 x i64> [[TMP22]] to <4 x i32>83; CHECK-NEXT: [[DUMMYUSE_2:%.*]] = freeze <4 x i32> [[TMP23]]84; CHECK-NEXT: [[TMP24:%.*]] = bitcast <128 x i1> [[VAL_3]] to <2 x i64>85; CHECK-NEXT: [[TMP25:%.*]] = extractelement <2 x i64> [[TMP24]], i64 086; CHECK-NEXT: [[TMP26:%.*]] = insertelement <4 x i64> [[TMP20]], i64 [[TMP25]], i32 287; CHECK-NEXT: [[TMP27:%.*]] = extractelement <2 x i64> [[TMP24]], i64 188; CHECK-NEXT: [[TMP28:%.*]] = insertelement <4 x i64> [[TMP26]], i64 [[TMP27]], i32 389; CHECK-NEXT: [[TMP29:%.*]] = insertelement <2 x i64> poison, i64 [[TMP9]], i64 090; CHECK-NEXT: [[TMP30:%.*]] = insertelement <2 x i64> [[TMP29]], i64 [[TMP25]], i64 191; CHECK-NEXT: [[TMP31:%.*]] = bitcast <2 x i64> [[TMP30]] to <128 x i1>92; CHECK-NEXT: [[DUMMYUSE_I1:%.*]] = freeze <128 x i1> [[TMP31]]93; CHECK-NEXT: ret void94;95entry:96 %stack = alloca [4 x i64], align 4, addrspace(5)97 %stack.1 = getelementptr inbounds [4 x i64], ptr addrspace(5) %stack, i32 0, i32 198 %stack.2 = getelementptr inbounds [4 x i64], ptr addrspace(5) %stack, i32 0, i32 299 100 store <4 x i32> %val.0, ptr addrspace(5) %stack101 %reload = load <16 x i8>, ptr addrspace(5) %stack102 %dummyuser = freeze <16 x i8> %reload103 104 store <8 x i16> %val.1, ptr addrspace(5) %stack.1105 %reload.1 = load <8 x i16>, ptr addrspace(5) %stack.1106 %dummyuse.1 = freeze <8 x i16> %reload.1107 108 store <16 x i8> %val.2, ptr addrspace(5) %stack.2109 %reload.2 = load <4 x i32>, ptr addrspace(5) %stack.2110 %dummyuse.2 = freeze <4 x i32> %reload.2111 112 store <128 x i1> %val.3, ptr addrspace(5) %stack.2113 %reload.i1 = load <128 x i1>, ptr addrspace(5) %stack.1114 %dummyuse.i1 = freeze <128 x i1> %reload.i1115 116 ret void117}118 119; Not vectorized, >16 elts is not supported.120define void @test_different_type_subvector_i1alloca(<4 x i32> %val.0, <8 x i16> %val.1, <16 x i8> %val.2, <128 x i1> %val.3) {121; CHECK-LABEL: define void @test_different_type_subvector_i1alloca122; CHECK-SAME: (<4 x i32> [[VAL_0:%.*]], <8 x i16> [[VAL_1:%.*]], <16 x i8> [[VAL_2:%.*]], <128 x i1> [[VAL_3:%.*]]) {123; CHECK-NEXT: entry:124; CHECK-NEXT: [[STACK:%.*]] = alloca [256 x i1], align 4, addrspace(5)125; CHECK-NEXT: [[STACK_1:%.*]] = getelementptr inbounds [256 x i1], ptr addrspace(5) [[STACK]], i32 0, i32 63126; CHECK-NEXT: [[STACK_2:%.*]] = getelementptr inbounds [256 x i1], ptr addrspace(5) [[STACK]], i32 0, i32 127127; CHECK-NEXT: store <4 x i32> [[VAL_0]], ptr addrspace(5) [[STACK]], align 16128; CHECK-NEXT: [[RELOAD:%.*]] = load <16 x i8>, ptr addrspace(5) [[STACK]], align 16129; CHECK-NEXT: [[DUMMYUSER:%.*]] = freeze <16 x i8> [[RELOAD]]130; CHECK-NEXT: store <8 x i16> [[VAL_1]], ptr addrspace(5) [[STACK_1]], align 16131; CHECK-NEXT: [[RELOAD_1:%.*]] = load <8 x i16>, ptr addrspace(5) [[STACK_1]], align 16132; CHECK-NEXT: [[DUMMYUSE_1:%.*]] = freeze <8 x i16> [[RELOAD_1]]133; CHECK-NEXT: store <16 x i8> [[VAL_2]], ptr addrspace(5) [[STACK_2]], align 16134; CHECK-NEXT: [[RELOAD_2:%.*]] = load <4 x i32>, ptr addrspace(5) [[STACK_2]], align 16135; CHECK-NEXT: [[DUMMYUSE_2:%.*]] = freeze <4 x i32> [[RELOAD_2]]136; CHECK-NEXT: store <128 x i1> [[VAL_3]], ptr addrspace(5) [[STACK_2]], align 16137; CHECK-NEXT: [[RELOAD_I1:%.*]] = load <128 x i1>, ptr addrspace(5) [[STACK_1]], align 16138; CHECK-NEXT: [[DUMMYUSE_I1:%.*]] = freeze <128 x i1> [[RELOAD_I1]]139; CHECK-NEXT: ret void140;141entry:142 %stack = alloca [256 x i1], align 4, addrspace(5)143 %stack.1 = getelementptr inbounds [256 x i1], ptr addrspace(5) %stack, i32 0, i32 63144 %stack.2 = getelementptr inbounds [256 x i1], ptr addrspace(5) %stack, i32 0, i32 127145 146 store <4 x i32> %val.0, ptr addrspace(5) %stack147 %reload = load <16 x i8>, ptr addrspace(5) %stack148 %dummyuser = freeze <16 x i8> %reload149 150 store <8 x i16> %val.1, ptr addrspace(5) %stack.1151 %reload.1 = load <8 x i16>, ptr addrspace(5) %stack.1152 %dummyuse.1 = freeze <8 x i16> %reload.1153 154 store <16 x i8> %val.2, ptr addrspace(5) %stack.2155 %reload.2 = load <4 x i32>, ptr addrspace(5) %stack.2156 %dummyuse.2 = freeze <4 x i32> %reload.2157 158 store <128 x i1> %val.3, ptr addrspace(5) %stack.2159 %reload.i1 = load <128 x i1>, ptr addrspace(5) %stack.1160 %dummyuse.i1 = freeze <128 x i1> %reload.i1161 162 ret void163}164 165define void @test_different_type_subvector_fp(<2 x double> %val.0, <4 x float> %val.1, <8 x half> %val.2) {166; CHECK-LABEL: define void @test_different_type_subvector_fp167; CHECK-SAME: (<2 x double> [[VAL_0:%.*]], <4 x float> [[VAL_1:%.*]], <8 x half> [[VAL_2:%.*]]) {168; CHECK-NEXT: entry:169; CHECK-NEXT: [[STACK:%.*]] = freeze <4 x double> poison170; CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x half> [[VAL_2]] to <2 x double>171; CHECK-NEXT: [[TMP1:%.*]] = extractelement <2 x double> [[TMP0]], i64 0172; CHECK-NEXT: [[TMP2:%.*]] = insertelement <4 x double> [[STACK]], double [[TMP1]], i32 0173; CHECK-NEXT: [[TMP3:%.*]] = extractelement <2 x double> [[TMP0]], i64 1174; CHECK-NEXT: [[TMP4:%.*]] = insertelement <4 x double> [[TMP2]], double [[TMP3]], i32 1175; CHECK-NEXT: [[TMP5:%.*]] = insertelement <2 x double> poison, double [[TMP1]], i64 0176; CHECK-NEXT: [[TMP6:%.*]] = insertelement <2 x double> [[TMP5]], double [[TMP3]], i64 1177; CHECK-NEXT: [[DUMMYUSER:%.*]] = freeze <2 x double> [[TMP6]]178; CHECK-NEXT: [[TMP7:%.*]] = bitcast <4 x float> [[VAL_1]] to <2 x double>179; CHECK-NEXT: [[TMP8:%.*]] = extractelement <2 x double> [[TMP7]], i64 0180; CHECK-NEXT: [[TMP9:%.*]] = insertelement <4 x double> [[TMP4]], double [[TMP8]], i32 0181; CHECK-NEXT: [[TMP10:%.*]] = extractelement <2 x double> [[TMP7]], i64 1182; CHECK-NEXT: [[TMP11:%.*]] = insertelement <4 x double> [[TMP9]], double [[TMP10]], i32 1183; CHECK-NEXT: [[TMP12:%.*]] = insertelement <2 x double> poison, double [[TMP8]], i64 0184; CHECK-NEXT: [[TMP13:%.*]] = insertelement <2 x double> [[TMP12]], double [[TMP10]], i64 1185; CHECK-NEXT: [[TMP14:%.*]] = bitcast <2 x double> [[TMP13]] to <4 x float>186; CHECK-NEXT: [[DUMMYUSE_1:%.*]] = freeze <4 x float> [[TMP14]]187; CHECK-NEXT: [[TMP15:%.*]] = extractelement <2 x double> [[VAL_0]], i64 0188; CHECK-NEXT: [[TMP16:%.*]] = insertelement <4 x double> [[TMP11]], double [[TMP15]], i32 0189; CHECK-NEXT: [[TMP17:%.*]] = extractelement <2 x double> [[VAL_0]], i64 1190; CHECK-NEXT: [[TMP18:%.*]] = insertelement <4 x double> [[TMP16]], double [[TMP17]], i32 1191; CHECK-NEXT: [[TMP19:%.*]] = insertelement <2 x double> poison, double [[TMP15]], i64 0192; CHECK-NEXT: [[TMP20:%.*]] = insertelement <2 x double> [[TMP19]], double [[TMP17]], i64 1193; CHECK-NEXT: [[TMP21:%.*]] = bitcast <2 x double> [[TMP20]] to <8 x half>194; CHECK-NEXT: [[DUMMYUSE_2:%.*]] = freeze <8 x half> [[TMP21]]195; CHECK-NEXT: [[TMP22:%.*]] = insertelement <4 x double> [[TMP18]], double 2.075080e-322, i32 0196; CHECK-NEXT: [[TMP23:%.*]] = insertelement <4 x double> [[TMP22]], double 3.162020e-322, i32 1197; CHECK-NEXT: [[DUMMYUSE_3:%.*]] = freeze <4 x i32> <i32 42, i32 0, i32 64, i32 0>198; CHECK-NEXT: ret void199;200entry:201 %stack = alloca [4 x double], align 4, addrspace(5)202 203 store <8 x half> %val.2, ptr addrspace(5) %stack204 %reload = load <2 x double>, ptr addrspace(5) %stack205 %dummyuser = freeze <2 x double> %reload206 207 store <4 x float> %val.1, ptr addrspace(5) %stack208 %reload.1 = load <4 x float>, ptr addrspace(5) %stack209 %dummyuse.1 = freeze <4 x float> %reload.1210 211 store <2 x double> %val.0, ptr addrspace(5) %stack212 %reload.2 = load <8 x half>, ptr addrspace(5) %stack213 %dummyuse.2 = freeze <8 x half> %reload.2214 215 store <2 x i64> <i64 42, i64 64>, ptr addrspace(5) %stack216 %reload.3 = load <4 x i32>, ptr addrspace(5) %stack217 %dummyuse.3 = freeze <4 x i32> %reload.3218 219 ret void220}221 222define void @test_different_type_subvector_ptrs(<2 x ptr addrspace(1)> %val.0, <4 x ptr addrspace(3)> %val.1) {223; CHECK-LABEL: define void @test_different_type_subvector_ptrs224; CHECK-SAME: (<2 x ptr addrspace(1)> [[VAL_0:%.*]], <4 x ptr addrspace(3)> [[VAL_1:%.*]]) {225; CHECK-NEXT: entry:226; CHECK-NEXT: [[STACK:%.*]] = freeze <4 x i64> poison227; CHECK-NEXT: [[TMP0:%.*]] = ptrtoint <2 x ptr addrspace(1)> [[VAL_0]] to <2 x i64>228; CHECK-NEXT: [[TMP1:%.*]] = extractelement <2 x i64> [[TMP0]], i64 0229; CHECK-NEXT: [[TMP2:%.*]] = insertelement <4 x i64> [[STACK]], i64 [[TMP1]], i32 0230; CHECK-NEXT: [[TMP3:%.*]] = extractelement <2 x i64> [[TMP0]], i64 1231; CHECK-NEXT: [[TMP4:%.*]] = insertelement <4 x i64> [[TMP2]], i64 [[TMP3]], i32 1232; CHECK-NEXT: [[TMP5:%.*]] = insertelement <2 x i64> poison, i64 [[TMP1]], i64 0233; CHECK-NEXT: [[TMP6:%.*]] = insertelement <2 x i64> [[TMP5]], i64 [[TMP3]], i64 1234; CHECK-NEXT: [[TMP7:%.*]] = inttoptr <2 x i64> [[TMP6]] to <2 x ptr addrspace(1)>235; CHECK-NEXT: [[DUMMYUSER:%.*]] = freeze <2 x ptr addrspace(1)> [[TMP7]]236; CHECK-NEXT: [[TMP8:%.*]] = ptrtoint <4 x ptr addrspace(3)> [[VAL_1]] to <4 x i32>237; CHECK-NEXT: [[TMP9:%.*]] = bitcast <4 x i32> [[TMP8]] to <2 x i64>238; CHECK-NEXT: [[TMP10:%.*]] = extractelement <2 x i64> [[TMP9]], i64 0239; CHECK-NEXT: [[TMP11:%.*]] = insertelement <4 x i64> [[TMP4]], i64 [[TMP10]], i32 0240; CHECK-NEXT: [[TMP12:%.*]] = extractelement <2 x i64> [[TMP9]], i64 1241; CHECK-NEXT: [[TMP13:%.*]] = insertelement <4 x i64> [[TMP11]], i64 [[TMP12]], i32 1242; CHECK-NEXT: [[TMP14:%.*]] = insertelement <2 x i64> poison, i64 [[TMP10]], i64 0243; CHECK-NEXT: [[TMP15:%.*]] = insertelement <2 x i64> [[TMP14]], i64 [[TMP12]], i64 1244; CHECK-NEXT: [[TMP16:%.*]] = bitcast <2 x i64> [[TMP15]] to <4 x i32>245; CHECK-NEXT: [[TMP17:%.*]] = inttoptr <4 x i32> [[TMP16]] to <4 x ptr addrspace(3)>246; CHECK-NEXT: [[DUMMYUSER_1:%.*]] = freeze <4 x ptr addrspace(3)> [[TMP17]]247; CHECK-NEXT: ret void248;249entry:250 %stack = alloca [4 x i64], align 4, addrspace(5)251 252 store <2 x ptr addrspace(1)> %val.0, ptr addrspace(5) %stack253 %reload = load <2 x ptr addrspace(1)>, ptr addrspace(5) %stack254 %dummyuser = freeze <2 x ptr addrspace(1)> %reload255 256 store <4 x ptr addrspace(3)> %val.1, ptr addrspace(5) %stack257 %reload.1 = load <4 x ptr addrspace(3)>, ptr addrspace(5) %stack258 %dummyuser.1 = freeze <4 x ptr addrspace(3)> %reload.1259 260 ret void261}262 263define void @test_different_type_subvector_ptralloca(<2 x i64> %val.0, <8 x i16> %val.1, <2 x ptr addrspace(3)> %val.2) {264; CHECK-LABEL: define void @test_different_type_subvector_ptralloca265; CHECK-SAME: (<2 x i64> [[VAL_0:%.*]], <8 x i16> [[VAL_1:%.*]], <2 x ptr addrspace(3)> [[VAL_2:%.*]]) {266; CHECK-NEXT: entry:267; CHECK-NEXT: [[STACK:%.*]] = freeze <8 x ptr addrspace(5)> poison268; CHECK-NEXT: [[TMP0:%.*]] = bitcast <2 x i64> [[VAL_0]] to <4 x i32>269; CHECK-NEXT: [[TMP1:%.*]] = inttoptr <4 x i32> [[TMP0]] to <4 x ptr addrspace(5)>270; CHECK-NEXT: [[TMP2:%.*]] = extractelement <4 x ptr addrspace(5)> [[TMP1]], i64 0271; CHECK-NEXT: [[TMP3:%.*]] = insertelement <8 x ptr addrspace(5)> [[STACK]], ptr addrspace(5) [[TMP2]], i32 0272; CHECK-NEXT: [[TMP4:%.*]] = extractelement <4 x ptr addrspace(5)> [[TMP1]], i64 1273; CHECK-NEXT: [[TMP5:%.*]] = insertelement <8 x ptr addrspace(5)> [[TMP3]], ptr addrspace(5) [[TMP4]], i32 1274; CHECK-NEXT: [[TMP6:%.*]] = extractelement <4 x ptr addrspace(5)> [[TMP1]], i64 2275; CHECK-NEXT: [[TMP7:%.*]] = insertelement <8 x ptr addrspace(5)> [[TMP5]], ptr addrspace(5) [[TMP6]], i32 2276; CHECK-NEXT: [[TMP8:%.*]] = extractelement <4 x ptr addrspace(5)> [[TMP1]], i64 3277; CHECK-NEXT: [[TMP9:%.*]] = insertelement <8 x ptr addrspace(5)> [[TMP7]], ptr addrspace(5) [[TMP8]], i32 3278; CHECK-NEXT: [[TMP10:%.*]] = insertelement <4 x ptr addrspace(5)> poison, ptr addrspace(5) [[TMP2]], i64 0279; CHECK-NEXT: [[TMP11:%.*]] = insertelement <4 x ptr addrspace(5)> [[TMP10]], ptr addrspace(5) [[TMP4]], i64 1280; CHECK-NEXT: [[TMP12:%.*]] = insertelement <4 x ptr addrspace(5)> [[TMP11]], ptr addrspace(5) [[TMP6]], i64 2281; CHECK-NEXT: [[TMP13:%.*]] = insertelement <4 x ptr addrspace(5)> [[TMP12]], ptr addrspace(5) [[TMP8]], i64 3282; CHECK-NEXT: [[TMP14:%.*]] = ptrtoint <4 x ptr addrspace(5)> [[TMP13]] to <4 x i32>283; CHECK-NEXT: [[TMP15:%.*]] = bitcast <4 x i32> [[TMP14]] to <2 x i64>284; CHECK-NEXT: [[DUMMYUSER_1:%.*]] = freeze <2 x i64> [[TMP15]]285; CHECK-NEXT: [[TMP16:%.*]] = bitcast <8 x i16> [[VAL_1]] to <4 x i32>286; CHECK-NEXT: [[TMP17:%.*]] = inttoptr <4 x i32> [[TMP16]] to <4 x ptr addrspace(5)>287; CHECK-NEXT: [[TMP18:%.*]] = extractelement <4 x ptr addrspace(5)> [[TMP17]], i64 0288; CHECK-NEXT: [[TMP19:%.*]] = insertelement <8 x ptr addrspace(5)> [[TMP9]], ptr addrspace(5) [[TMP18]], i32 0289; CHECK-NEXT: [[TMP20:%.*]] = extractelement <4 x ptr addrspace(5)> [[TMP17]], i64 1290; CHECK-NEXT: [[TMP21:%.*]] = insertelement <8 x ptr addrspace(5)> [[TMP19]], ptr addrspace(5) [[TMP20]], i32 1291; CHECK-NEXT: [[TMP22:%.*]] = extractelement <4 x ptr addrspace(5)> [[TMP17]], i64 2292; CHECK-NEXT: [[TMP23:%.*]] = insertelement <8 x ptr addrspace(5)> [[TMP21]], ptr addrspace(5) [[TMP22]], i32 2293; CHECK-NEXT: [[TMP24:%.*]] = extractelement <4 x ptr addrspace(5)> [[TMP17]], i64 3294; CHECK-NEXT: [[TMP25:%.*]] = insertelement <8 x ptr addrspace(5)> [[TMP23]], ptr addrspace(5) [[TMP24]], i32 3295; CHECK-NEXT: [[TMP26:%.*]] = insertelement <4 x ptr addrspace(5)> poison, ptr addrspace(5) [[TMP18]], i64 0296; CHECK-NEXT: [[TMP27:%.*]] = insertelement <4 x ptr addrspace(5)> [[TMP26]], ptr addrspace(5) [[TMP20]], i64 1297; CHECK-NEXT: [[TMP28:%.*]] = insertelement <4 x ptr addrspace(5)> [[TMP27]], ptr addrspace(5) [[TMP22]], i64 2298; CHECK-NEXT: [[TMP29:%.*]] = insertelement <4 x ptr addrspace(5)> [[TMP28]], ptr addrspace(5) [[TMP24]], i64 3299; CHECK-NEXT: [[TMP30:%.*]] = ptrtoint <4 x ptr addrspace(5)> [[TMP29]] to <4 x i32>300; CHECK-NEXT: [[TMP31:%.*]] = bitcast <4 x i32> [[TMP30]] to <8 x i16>301; CHECK-NEXT: [[DUMMYUSER_2:%.*]] = freeze <8 x i16> [[TMP31]]302; CHECK-NEXT: [[TMP32:%.*]] = ptrtoint <2 x ptr addrspace(3)> [[VAL_2]] to <2 x i32>303; CHECK-NEXT: [[TMP33:%.*]] = inttoptr <2 x i32> [[TMP32]] to <2 x ptr addrspace(5)>304; CHECK-NEXT: [[TMP34:%.*]] = extractelement <2 x ptr addrspace(5)> [[TMP33]], i64 0305; CHECK-NEXT: [[TMP35:%.*]] = insertelement <8 x ptr addrspace(5)> [[TMP25]], ptr addrspace(5) [[TMP34]], i32 0306; CHECK-NEXT: [[TMP36:%.*]] = extractelement <2 x ptr addrspace(5)> [[TMP33]], i64 1307; CHECK-NEXT: [[TMP37:%.*]] = insertelement <8 x ptr addrspace(5)> [[TMP35]], ptr addrspace(5) [[TMP36]], i32 1308; CHECK-NEXT: [[TMP38:%.*]] = insertelement <2 x ptr addrspace(5)> poison, ptr addrspace(5) [[TMP34]], i64 0309; CHECK-NEXT: [[TMP39:%.*]] = insertelement <2 x ptr addrspace(5)> [[TMP38]], ptr addrspace(5) [[TMP36]], i64 1310; CHECK-NEXT: [[TMP40:%.*]] = ptrtoint <2 x ptr addrspace(5)> [[TMP39]] to <2 x i32>311; CHECK-NEXT: [[TMP41:%.*]] = inttoptr <2 x i32> [[TMP40]] to <2 x ptr addrspace(3)>312; CHECK-NEXT: [[DUMMYUSER_3:%.*]] = freeze <2 x ptr addrspace(3)> [[TMP41]]313; CHECK-NEXT: ret void314;315entry:316 %stack = alloca [8 x ptr addrspace(5)], align 4, addrspace(5)317 318 store <2 x i64> %val.0, ptr addrspace(5) %stack319 %reload = load <2 x i64>, ptr addrspace(5) %stack320 %dummyuser.1 = freeze <2 x i64> %reload321 322 store <8 x i16> %val.1, ptr addrspace(5) %stack323 %reload.1 = load <8 x i16>, ptr addrspace(5) %stack324 %dummyuser.2 = freeze <8 x i16> %reload.1325 326 store <2 x ptr addrspace(3)> %val.2, ptr addrspace(5) %stack327 %reload.2 = load <2 x ptr addrspace(3)>, ptr addrspace(5) %stack328 %dummyuser.3= freeze <2 x ptr addrspace(3)> %reload.2329 330 ret void331}332 333define void @test_out_of_bounds_subvec(<2 x i64> %val) {334; CHECK-LABEL: define void @test_out_of_bounds_subvec335; CHECK-SAME: (<2 x i64> [[VAL:%.*]]) {336; CHECK-NEXT: entry:337; CHECK-NEXT: [[STACK:%.*]] = freeze <4 x i64> poison338; CHECK-NEXT: [[TMP0:%.*]] = extractelement <2 x i64> [[VAL]], i64 0339; CHECK-NEXT: [[TMP1:%.*]] = insertelement <4 x i64> [[STACK]], i64 [[TMP0]], i32 3340; CHECK-NEXT: [[TMP2:%.*]] = extractelement <2 x i64> [[VAL]], i64 1341; CHECK-NEXT: ret void342;343entry:344 %stack = alloca [4 x i64], align 4, addrspace(5)345 %stack.3 = getelementptr inbounds [4 x i64], ptr addrspace(5) %stack, i32 0, i32 3346 store <2 x i64> %val, ptr addrspace(5) %stack.3347 ret void348}349 350define void @test_different_type_subvector_not_divisible(<3 x i32> %val) {351; CHECK-LABEL: define void @test_different_type_subvector_not_divisible352; CHECK-SAME: (<3 x i32> [[VAL:%.*]]) {353; CHECK-NEXT: entry:354; CHECK-NEXT: [[STACK:%.*]] = alloca [4 x i64], align 4, addrspace(5)355; CHECK-NEXT: store <3 x i32> [[VAL]], ptr addrspace(5) [[STACK]], align 16356; CHECK-NEXT: ret void357;358entry:359 %stack = alloca [4 x i64], align 4, addrspace(5)360 store <3 x i32> %val, ptr addrspace(5) %stack361 ret void362}363 364define void @test_accessty_too_small(<2 x i16> %val) {365; CHECK-LABEL: define void @test_accessty_too_small366; CHECK-SAME: (<2 x i16> [[VAL:%.*]]) {367; CHECK-NEXT: entry:368; CHECK-NEXT: [[STACK:%.*]] = alloca [4 x i64], align 4, addrspace(5)369; CHECK-NEXT: store <2 x i16> [[VAL]], ptr addrspace(5) [[STACK]], align 4370; CHECK-NEXT: ret void371;372entry:373 %stack = alloca [4 x i64], align 4, addrspace(5)374 store <2 x i16> %val, ptr addrspace(5) %stack375 ret void376}377 378define void @store_2xi32_into_double(double %foo) {379; CHECK-LABEL: define void @store_2xi32_into_double380; CHECK-SAME: (double [[FOO:%.*]]) {381; CHECK-NEXT: [[ALLOCA:%.*]] = freeze <9 x double> poison382; CHECK-NEXT: [[TMP1:%.*]] = insertelement <9 x double> [[ALLOCA]], double 0x5F0000005E, i32 0383; CHECK-NEXT: [[DUMMYUSER0:%.*]] = freeze double 0x5F0000005E384; CHECK-NEXT: [[TMP2:%.*]] = insertelement <9 x double> [[TMP1]], double 0x6700000066, i32 4385; CHECK-NEXT: [[TMP3:%.*]] = insertelement <9 x double> [[TMP2]], double 0x6900000068, i32 5386; CHECK-NEXT: [[DUMMYUSER1:%.*]] = freeze double 0x6700000066387; CHECK-NEXT: [[DUMMYUSER2:%.*]] = freeze double 0x6900000068388; CHECK-NEXT: [[TMP4:%.*]] = insertelement <9 x double> [[TMP3]], double 0x6F0000006E, i32 8389; CHECK-NEXT: [[DUMMYUSER3:%.*]] = freeze double 0x6F0000006E390; CHECK-NEXT: ret void391;392 %alloca = alloca [9 x double], align 8, addrspace(5)393 394 store <2 x i32> <i32 94, i32 95>, ptr addrspace(5) %alloca, align 8395 %load0 = load double, ptr addrspace(5) %alloca, align 8396 %dummyuser0 = freeze double %load0397 398 %idx4 = getelementptr inbounds [9 x double], ptr addrspace(5) %alloca, i32 0, i32 4399 %idx5 = getelementptr inbounds [9 x double], ptr addrspace(5) %alloca, i32 0, i32 5400 store <4 x i32> <i32 102, i32 103, i32 104, i32 105>, ptr addrspace(5) %idx4, align 8401 %load1 = load double, ptr addrspace(5) %idx4, align 8402 %dummyuser1 = freeze double %load1403 %load2 = load double, ptr addrspace(5) %idx5, align 8404 %dummyuser2 = freeze double %load2405 406 %idx8 = getelementptr inbounds [9 x double], ptr addrspace(5) %alloca, i32 0, i32 8407 store <2 x i32> <i32 110, i32 111>, ptr addrspace(5) %idx8, align 8408 %load3 = load double, ptr addrspace(5) %idx8, align 8409 %dummyuser3 = freeze double %load3410 411 ret void412}413 414; Check we handle loading/storing a subvector using non-constant indexes.415define <4 x i16> @nonconst_indexes(i1 %cond, i32 %otheridx, <4 x i16> %store) #0 {416; CHECK-LABEL: define <4 x i16> @nonconst_indexes417; CHECK-SAME: (i1 [[COND:%.*]], i32 [[OTHERIDX:%.*]], <4 x i16> [[STORE:%.*]]) {418; CHECK-NEXT: entry:419; CHECK-NEXT: [[DATA:%.*]] = freeze <16 x i16> poison420; CHECK-NEXT: br i1 [[COND]], label [[THEN:%.*]], label [[ELSE:%.*]]421; CHECK: then:422; CHECK-NEXT: br label [[FINALLY:%.*]]423; CHECK: else:424; CHECK-NEXT: br label [[FINALLY]]425; CHECK: finally:426; CHECK-NEXT: [[INDEX_1:%.*]] = phi i32 [ 0, [[THEN]] ], [ [[OTHERIDX]], [[ELSE]] ]427; CHECK-NEXT: [[INDEX_2:%.*]] = phi i32 [ 2, [[THEN]] ], [ [[OTHERIDX]], [[ELSE]] ]428; CHECK-NEXT: [[TMP0:%.*]] = extractelement <4 x i16> [[STORE]], i64 0429; CHECK-NEXT: [[TMP1:%.*]] = insertelement <16 x i16> [[DATA]], i16 [[TMP0]], i32 [[INDEX_1]]430; CHECK-NEXT: [[TMP2:%.*]] = add i32 [[INDEX_1]], 1431; CHECK-NEXT: [[TMP3:%.*]] = extractelement <4 x i16> [[STORE]], i64 1432; CHECK-NEXT: [[TMP4:%.*]] = insertelement <16 x i16> [[TMP1]], i16 [[TMP3]], i32 [[TMP2]]433; CHECK-NEXT: [[TMP5:%.*]] = add i32 [[INDEX_1]], 2434; CHECK-NEXT: [[TMP6:%.*]] = extractelement <4 x i16> [[STORE]], i64 2435; CHECK-NEXT: [[TMP7:%.*]] = insertelement <16 x i16> [[TMP4]], i16 [[TMP6]], i32 [[TMP5]]436; CHECK-NEXT: [[TMP8:%.*]] = add i32 [[INDEX_1]], 3437; CHECK-NEXT: [[TMP9:%.*]] = extractelement <4 x i16> [[STORE]], i64 3438; CHECK-NEXT: [[TMP10:%.*]] = insertelement <16 x i16> [[TMP7]], i16 [[TMP9]], i32 [[TMP8]]439; CHECK-NEXT: [[TMP11:%.*]] = extractelement <16 x i16> [[TMP10]], i32 [[INDEX_2]]440; CHECK-NEXT: [[TMP12:%.*]] = insertelement <4 x i16> poison, i16 [[TMP11]], i64 0441; CHECK-NEXT: [[TMP13:%.*]] = add i32 [[INDEX_2]], 1442; CHECK-NEXT: [[TMP14:%.*]] = extractelement <16 x i16> [[TMP10]], i32 [[TMP13]]443; CHECK-NEXT: [[TMP15:%.*]] = insertelement <4 x i16> [[TMP12]], i16 [[TMP14]], i64 1444; CHECK-NEXT: [[TMP16:%.*]] = add i32 [[INDEX_2]], 2445; CHECK-NEXT: [[TMP17:%.*]] = extractelement <16 x i16> [[TMP10]], i32 [[TMP16]]446; CHECK-NEXT: [[TMP18:%.*]] = insertelement <4 x i16> [[TMP15]], i16 [[TMP17]], i64 2447; CHECK-NEXT: [[TMP19:%.*]] = add i32 [[INDEX_2]], 3448; CHECK-NEXT: [[TMP20:%.*]] = extractelement <16 x i16> [[TMP10]], i32 [[TMP19]]449; CHECK-NEXT: [[TMP21:%.*]] = insertelement <4 x i16> [[TMP18]], i16 [[TMP20]], i64 3450; CHECK-NEXT: ret <4 x i16> [[TMP21]]451;452entry:453 %data = alloca [16 x i16], addrspace(5)454 br i1 %cond, label %then, label %else455 456then:457 br label %finally458 459else:460 br label %finally461 462finally:463 %index.1 = phi i32 [ 0, %then ], [ %otheridx, %else ]464 %index.2 = phi i32 [ 2, %then ], [ %otheridx, %else ]465 %ptr.1 = getelementptr inbounds [16 x i16], ptr addrspace(5) %data, i32 0, i32 %index.1466 %ptr.2 = getelementptr inbounds [16 x i16], ptr addrspace(5) %data, i32 0, i32 %index.2467 store <4 x i16> %store, ptr addrspace(5) %ptr.1, align 2468 %load = load <4 x i16>, ptr addrspace(5) %ptr.2, align 2469 ret <4 x i16> %load470}471 472 473; Check the case when the alloca is smaller than the vector size.474define void @test_smaller_alloca_store(<4 x i32> %store1, <4 x i32> %store2) {475; CHECK-LABEL: define void @test_smaller_alloca_store476; CHECK-SAME: (<4 x i32> [[STORE1:%.*]], <4 x i32> [[STORE2:%.*]]) {477; CHECK-NEXT: entry:478; CHECK-NEXT: [[RES:%.*]] = freeze <3 x i32> poison479; CHECK-NEXT: [[TMP0:%.*]] = extractelement <4 x i32> [[STORE1]], i64 0480; CHECK-NEXT: [[TMP1:%.*]] = insertelement <3 x i32> [[RES]], i32 [[TMP0]], i32 0481; CHECK-NEXT: [[TMP2:%.*]] = extractelement <4 x i32> [[STORE1]], i64 1482; CHECK-NEXT: [[TMP3:%.*]] = insertelement <3 x i32> [[TMP1]], i32 [[TMP2]], i32 1483; CHECK-NEXT: [[TMP4:%.*]] = extractelement <4 x i32> [[STORE1]], i64 2484; CHECK-NEXT: [[TMP5:%.*]] = insertelement <3 x i32> [[TMP3]], i32 [[TMP4]], i32 2485; CHECK-NEXT: [[TMP6:%.*]] = extractelement <4 x i32> [[STORE2]], i64 0486; CHECK-NEXT: [[TMP7:%.*]] = insertelement <3 x i32> [[TMP5]], i32 [[TMP6]], i32 0487; CHECK-NEXT: [[TMP8:%.*]] = extractelement <4 x i32> [[STORE2]], i64 1488; CHECK-NEXT: [[TMP9:%.*]] = insertelement <3 x i32> [[TMP7]], i32 [[TMP8]], i32 1489; CHECK-NEXT: [[TMP10:%.*]] = extractelement <4 x i32> [[STORE2]], i64 2490; CHECK-NEXT: [[TMP11:%.*]] = insertelement <3 x i32> [[TMP9]], i32 [[TMP10]], i32 2491; CHECK-NEXT: ret void492;493entry:494 %res = alloca <3 x i32>, align 16, addrspace(5)495 store <4 x i32> %store1, ptr addrspace(5) %res, align 16496 store <4 x i32> %store2, ptr addrspace(5) %res, align 16497 ret void498}499