brintos

brintos / llvm-project-archived public Read only

0
0
Text · 55.3 KiB · 605eccf Raw
872 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 52; RUN: opt -S -mtriple=amdgcn-amd-amdhsa -mcpu=hawaii -passes=slp-vectorizer %s | FileCheck -check-prefix=GFX7 %s3; RUN: opt -S -mtriple=amdgcn-amd-amdhsa -mcpu=fiji -passes=slp-vectorizer %s | FileCheck -check-prefix=GFX8 %s4; RUN: opt -S -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -passes=slp-vectorizer %s | FileCheck -check-prefix=GFX9 %s5 6define protected amdgpu_kernel void @arith_2(<16 x i8> %invec, ptr %out, i32 %flag) {7; GFX7-LABEL: define protected amdgpu_kernel void @arith_2(8; GFX7-SAME: <16 x i8> [[INVEC:%.*]], ptr [[OUT:%.*]], i32 [[FLAG:%.*]]) #[[ATTR0:[0-9]+]] {9; GFX7-NEXT:  [[ENTRY:.*:]]10; GFX7-NEXT:    [[EL0:%.*]] = extractelement <16 x i8> [[INVEC]], i64 011; GFX7-NEXT:    [[EL1:%.*]] = extractelement <16 x i8> [[INVEC]], i64 112; GFX7-NEXT:    [[MUL0:%.*]] = mul i8 [[EL0]], 113; GFX7-NEXT:    [[MUL1:%.*]] = mul i8 [[EL1]], 114; GFX7-NEXT:    [[ADD0:%.*]] = add i8 [[MUL0]], 115; GFX7-NEXT:    [[ADD1:%.*]] = add i8 [[MUL1]], 116; GFX7-NEXT:    [[VECINS0:%.*]] = insertelement <16 x i8> poison, i8 [[ADD0]], i64 017; GFX7-NEXT:    [[TMP3:%.*]] = insertelement <16 x i8> [[VECINS0]], i8 [[ADD1]], i64 118; GFX7-NEXT:    store <16 x i8> [[TMP3]], ptr [[OUT]], align 1619; GFX7-NEXT:    ret void20;21; GFX8-LABEL: define protected amdgpu_kernel void @arith_2(22; GFX8-SAME: <16 x i8> [[INVEC:%.*]], ptr [[OUT:%.*]], i32 [[FLAG:%.*]]) #[[ATTR0:[0-9]+]] {23; GFX8-NEXT:  [[ENTRY:.*:]]24; GFX8-NEXT:    [[TMP0:%.*]] = shufflevector <16 x i8> [[INVEC]], <16 x i8> poison, <2 x i32> <i32 0, i32 1>25; GFX8-NEXT:    [[TMP1:%.*]] = mul <2 x i8> [[TMP0]], splat (i8 1)26; GFX8-NEXT:    [[TMP2:%.*]] = add <2 x i8> [[TMP1]], splat (i8 1)27; GFX8-NEXT:    [[TMP3:%.*]] = shufflevector <2 x i8> [[TMP2]], <2 x i8> poison, <16 x i32> <i32 0, i32 1, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>28; GFX8-NEXT:    store <16 x i8> [[TMP3]], ptr [[OUT]], align 1629; GFX8-NEXT:    ret void30;31; GFX9-LABEL: define protected amdgpu_kernel void @arith_2(32; GFX9-SAME: <16 x i8> [[INVEC:%.*]], ptr [[OUT:%.*]], i32 [[FLAG:%.*]]) #[[ATTR0:[0-9]+]] {33; GFX9-NEXT:  [[ENTRY:.*:]]34; GFX9-NEXT:    [[TMP0:%.*]] = shufflevector <16 x i8> [[INVEC]], <16 x i8> poison, <2 x i32> <i32 0, i32 1>35; GFX9-NEXT:    [[TMP1:%.*]] = mul <2 x i8> [[TMP0]], splat (i8 1)36; GFX9-NEXT:    [[TMP2:%.*]] = add <2 x i8> [[TMP1]], splat (i8 1)37; GFX9-NEXT:    [[TMP3:%.*]] = shufflevector <2 x i8> [[TMP2]], <2 x i8> poison, <16 x i32> <i32 0, i32 1, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>38; GFX9-NEXT:    store <16 x i8> [[TMP3]], ptr [[OUT]], align 1639; GFX9-NEXT:    ret void40;41entry:42  %el0 = extractelement <16 x i8> %invec, i64  043  %el1 = extractelement <16 x i8> %invec, i64  144  %mul0 = mul i8 %el0, 145  %mul1 = mul i8 %el1, 146  %add0 = add i8 %mul0, 147  %add1 = add i8 %mul1, 148  %vecins0 = insertelement <16 x i8> poison, i8 %add0, i64 049  %vecins1 = insertelement <16 x i8> %vecins0, i8 %add1, i64 150  store <16 x i8> %vecins1, ptr %out51  ret void52}53 54define protected amdgpu_kernel void @arith_3(<16 x i8> %invec, ptr %out, i32 %flag) {55; GFX7-LABEL: define protected amdgpu_kernel void @arith_3(56; GFX7-SAME: <16 x i8> [[INVEC:%.*]], ptr [[OUT:%.*]], i32 [[FLAG:%.*]]) #[[ATTR0]] {57; GFX7-NEXT:  [[ENTRY:.*:]]58; GFX7-NEXT:    [[EL0:%.*]] = extractelement <16 x i8> [[INVEC]], i64 059; GFX7-NEXT:    [[EL1:%.*]] = extractelement <16 x i8> [[INVEC]], i64 160; GFX7-NEXT:    [[EL2:%.*]] = extractelement <16 x i8> [[INVEC]], i64 261; GFX7-NEXT:    [[MUL2:%.*]] = mul i8 [[EL0]], 162; GFX7-NEXT:    [[MUL1:%.*]] = mul i8 [[EL1]], 163; GFX7-NEXT:    [[MUL3:%.*]] = mul i8 [[EL2]], 164; GFX7-NEXT:    [[ADD2:%.*]] = add i8 [[MUL2]], 165; GFX7-NEXT:    [[ADD1:%.*]] = add i8 [[MUL1]], 166; GFX7-NEXT:    [[ADD3:%.*]] = add i8 [[MUL3]], 167; GFX7-NEXT:    [[VECINS0:%.*]] = insertelement <16 x i8> poison, i8 [[ADD2]], i64 068; GFX7-NEXT:    [[VECINS1:%.*]] = insertelement <16 x i8> [[VECINS0]], i8 [[ADD1]], i64 169; GFX7-NEXT:    [[VECINS2:%.*]] = insertelement <16 x i8> [[VECINS1]], i8 [[ADD3]], i64 270; GFX7-NEXT:    store <16 x i8> [[VECINS2]], ptr [[OUT]], align 1671; GFX7-NEXT:    ret void72;73; GFX8-LABEL: define protected amdgpu_kernel void @arith_3(74; GFX8-SAME: <16 x i8> [[INVEC:%.*]], ptr [[OUT:%.*]], i32 [[FLAG:%.*]]) #[[ATTR0]] {75; GFX8-NEXT:  [[ENTRY:.*:]]76; GFX8-NEXT:    [[EL0:%.*]] = extractelement <16 x i8> [[INVEC]], i64 077; GFX8-NEXT:    [[MUL3:%.*]] = mul i8 [[EL0]], 178; GFX8-NEXT:    [[ADD3:%.*]] = add i8 [[MUL3]], 179; GFX8-NEXT:    [[TMP0:%.*]] = shufflevector <16 x i8> [[INVEC]], <16 x i8> poison, <2 x i32> <i32 1, i32 2>80; GFX8-NEXT:    [[TMP1:%.*]] = mul <2 x i8> [[TMP0]], splat (i8 1)81; GFX8-NEXT:    [[TMP2:%.*]] = add <2 x i8> [[TMP1]], splat (i8 1)82; GFX8-NEXT:    [[VECINS0:%.*]] = insertelement <16 x i8> poison, i8 [[ADD3]], i64 083; GFX8-NEXT:    [[TMP3:%.*]] = shufflevector <2 x i8> [[TMP2]], <2 x i8> poison, <16 x i32> <i32 0, i32 1, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>84; GFX8-NEXT:    [[VECINS2:%.*]] = shufflevector <16 x i8> [[VECINS0]], <16 x i8> [[TMP3]], <16 x i32> <i32 0, i32 16, i32 17, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>85; GFX8-NEXT:    store <16 x i8> [[VECINS2]], ptr [[OUT]], align 1686; GFX8-NEXT:    ret void87;88; GFX9-LABEL: define protected amdgpu_kernel void @arith_3(89; GFX9-SAME: <16 x i8> [[INVEC:%.*]], ptr [[OUT:%.*]], i32 [[FLAG:%.*]]) #[[ATTR0]] {90; GFX9-NEXT:  [[ENTRY:.*:]]91; GFX9-NEXT:    [[EL0:%.*]] = extractelement <16 x i8> [[INVEC]], i64 092; GFX9-NEXT:    [[MUL3:%.*]] = mul i8 [[EL0]], 193; GFX9-NEXT:    [[ADD3:%.*]] = add i8 [[MUL3]], 194; GFX9-NEXT:    [[TMP0:%.*]] = shufflevector <16 x i8> [[INVEC]], <16 x i8> poison, <2 x i32> <i32 1, i32 2>95; GFX9-NEXT:    [[TMP1:%.*]] = mul <2 x i8> [[TMP0]], splat (i8 1)96; GFX9-NEXT:    [[TMP2:%.*]] = add <2 x i8> [[TMP1]], splat (i8 1)97; GFX9-NEXT:    [[VECINS0:%.*]] = insertelement <16 x i8> poison, i8 [[ADD3]], i64 098; GFX9-NEXT:    [[TMP3:%.*]] = shufflevector <2 x i8> [[TMP2]], <2 x i8> poison, <16 x i32> <i32 0, i32 1, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>99; GFX9-NEXT:    [[VECINS2:%.*]] = shufflevector <16 x i8> [[VECINS0]], <16 x i8> [[TMP3]], <16 x i32> <i32 0, i32 16, i32 17, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>100; GFX9-NEXT:    store <16 x i8> [[VECINS2]], ptr [[OUT]], align 16101; GFX9-NEXT:    ret void102;103entry:104  %el0 = extractelement <16 x i8> %invec, i64  0105  %el1 = extractelement <16 x i8> %invec, i64  1106  %el2 = extractelement <16 x i8> %invec, i64  2107  %mul0 = mul i8 %el0, 1108  %mul1 = mul i8 %el1, 1109  %mul2 = mul i8 %el2, 1110  %add0 = add i8 %mul0, 1111  %add1 = add i8 %mul1, 1112  %add2 = add i8 %mul2, 1113  %vecins0 = insertelement <16 x i8> poison, i8 %add0, i64 0114  %vecins1 = insertelement <16 x i8> %vecins0, i8 %add1, i64 1115  %vecins2 = insertelement <16 x i8> %vecins1, i8 %add2, i64 2116  store <16 x i8> %vecins2, ptr %out117  ret void118}119 120define protected amdgpu_kernel void @arith_4(<16 x i8> %invec, ptr %out, i32 %flag) {121; GFX7-LABEL: define protected amdgpu_kernel void @arith_4(122; GFX7-SAME: <16 x i8> [[INVEC:%.*]], ptr [[OUT:%.*]], i32 [[FLAG:%.*]]) #[[ATTR0]] {123; GFX7-NEXT:  [[ENTRY:.*:]]124; GFX7-NEXT:    [[EL0:%.*]] = extractelement <16 x i8> [[INVEC]], i64 0125; GFX7-NEXT:    [[EL1:%.*]] = extractelement <16 x i8> [[INVEC]], i64 1126; GFX7-NEXT:    [[EL2:%.*]] = extractelement <16 x i8> [[INVEC]], i64 2127; GFX7-NEXT:    [[EL3:%.*]] = extractelement <16 x i8> [[INVEC]], i64 3128; GFX7-NEXT:    [[MUL0:%.*]] = mul i8 [[EL0]], 1129; GFX7-NEXT:    [[MUL1:%.*]] = mul i8 [[EL1]], 1130; GFX7-NEXT:    [[MUL2:%.*]] = mul i8 [[EL2]], 1131; GFX7-NEXT:    [[MUL3:%.*]] = mul i8 [[EL3]], 1132; GFX7-NEXT:    [[ADD0:%.*]] = add i8 [[MUL0]], 1133; GFX7-NEXT:    [[ADD1:%.*]] = add i8 [[MUL1]], 1134; GFX7-NEXT:    [[ADD2:%.*]] = add i8 [[MUL2]], 1135; GFX7-NEXT:    [[ADD3:%.*]] = add i8 [[MUL3]], 1136; GFX7-NEXT:    [[VECINS0:%.*]] = insertelement <16 x i8> poison, i8 [[ADD0]], i64 0137; GFX7-NEXT:    [[VECINS1:%.*]] = insertelement <16 x i8> [[VECINS0]], i8 [[ADD1]], i64 1138; GFX7-NEXT:    [[VECINS2:%.*]] = insertelement <16 x i8> [[VECINS1]], i8 [[ADD2]], i64 2139; GFX7-NEXT:    [[TMP3:%.*]] = insertelement <16 x i8> [[VECINS2]], i8 [[ADD3]], i64 3140; GFX7-NEXT:    store <16 x i8> [[TMP3]], ptr [[OUT]], align 16141; GFX7-NEXT:    ret void142;143; GFX8-LABEL: define protected amdgpu_kernel void @arith_4(144; GFX8-SAME: <16 x i8> [[INVEC:%.*]], ptr [[OUT:%.*]], i32 [[FLAG:%.*]]) #[[ATTR0]] {145; GFX8-NEXT:  [[ENTRY:.*:]]146; GFX8-NEXT:    [[TMP0:%.*]] = shufflevector <16 x i8> [[INVEC]], <16 x i8> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>147; GFX8-NEXT:    [[TMP1:%.*]] = mul <4 x i8> [[TMP0]], splat (i8 1)148; GFX8-NEXT:    [[TMP2:%.*]] = add <4 x i8> [[TMP1]], splat (i8 1)149; GFX8-NEXT:    [[TMP3:%.*]] = shufflevector <4 x i8> [[TMP2]], <4 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>150; GFX8-NEXT:    store <16 x i8> [[TMP3]], ptr [[OUT]], align 16151; GFX8-NEXT:    ret void152;153; GFX9-LABEL: define protected amdgpu_kernel void @arith_4(154; GFX9-SAME: <16 x i8> [[INVEC:%.*]], ptr [[OUT:%.*]], i32 [[FLAG:%.*]]) #[[ATTR0]] {155; GFX9-NEXT:  [[ENTRY:.*:]]156; GFX9-NEXT:    [[TMP0:%.*]] = shufflevector <16 x i8> [[INVEC]], <16 x i8> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>157; GFX9-NEXT:    [[TMP1:%.*]] = mul <4 x i8> [[TMP0]], splat (i8 1)158; GFX9-NEXT:    [[TMP2:%.*]] = add <4 x i8> [[TMP1]], splat (i8 1)159; GFX9-NEXT:    [[TMP3:%.*]] = shufflevector <4 x i8> [[TMP2]], <4 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>160; GFX9-NEXT:    store <16 x i8> [[TMP3]], ptr [[OUT]], align 16161; GFX9-NEXT:    ret void162;163entry:164  %el0 = extractelement <16 x i8> %invec, i64  0165  %el1 = extractelement <16 x i8> %invec, i64  1166  %el2 = extractelement <16 x i8> %invec, i64  2167  %el3 = extractelement <16 x i8> %invec, i64  3168  %mul0 = mul i8 %el0, 1169  %mul1 = mul i8 %el1, 1170  %mul2 = mul i8 %el2, 1171  %mul3 = mul i8 %el3, 1172  %add0 = add i8 %mul0, 1173  %add1 = add i8 %mul1, 1174  %add2 = add i8 %mul2, 1175  %add3 = add i8 %mul3, 1176  %vecins0 = insertelement <16 x i8> poison, i8 %add0, i64 0177  %vecins1 = insertelement <16 x i8> %vecins0, i8 %add1, i64 1178  %vecins2 = insertelement <16 x i8> %vecins1, i8 %add2, i64 2179  %vecins3 = insertelement <16 x i8> %vecins2, i8 %add3, i64 3180  store <16 x i8> %vecins3, ptr %out181  ret void182}183 184define protected amdgpu_kernel void @arith_16(<16 x i8> %invec, ptr %out, i32 %flag) {185; GFX7-LABEL: define protected amdgpu_kernel void @arith_16(186; GFX7-SAME: <16 x i8> [[INVEC:%.*]], ptr [[OUT:%.*]], i32 [[FLAG:%.*]]) #[[ATTR0]] {187; GFX7-NEXT:  [[ENTRY:.*:]]188; GFX7-NEXT:    [[EL0:%.*]] = extractelement <16 x i8> [[INVEC]], i64 0189; GFX7-NEXT:    [[EL1:%.*]] = extractelement <16 x i8> [[INVEC]], i64 1190; GFX7-NEXT:    [[EL2:%.*]] = extractelement <16 x i8> [[INVEC]], i64 2191; GFX7-NEXT:    [[EL3:%.*]] = extractelement <16 x i8> [[INVEC]], i64 3192; GFX7-NEXT:    [[EL4:%.*]] = extractelement <16 x i8> [[INVEC]], i64 4193; GFX7-NEXT:    [[EL5:%.*]] = extractelement <16 x i8> [[INVEC]], i64 5194; GFX7-NEXT:    [[EL6:%.*]] = extractelement <16 x i8> [[INVEC]], i64 6195; GFX7-NEXT:    [[EL7:%.*]] = extractelement <16 x i8> [[INVEC]], i64 7196; GFX7-NEXT:    [[EL8:%.*]] = extractelement <16 x i8> [[INVEC]], i64 8197; GFX7-NEXT:    [[EL9:%.*]] = extractelement <16 x i8> [[INVEC]], i64 9198; GFX7-NEXT:    [[EL10:%.*]] = extractelement <16 x i8> [[INVEC]], i64 10199; GFX7-NEXT:    [[EL11:%.*]] = extractelement <16 x i8> [[INVEC]], i64 11200; GFX7-NEXT:    [[EL12:%.*]] = extractelement <16 x i8> [[INVEC]], i64 12201; GFX7-NEXT:    [[EL13:%.*]] = extractelement <16 x i8> [[INVEC]], i64 13202; GFX7-NEXT:    [[EL14:%.*]] = extractelement <16 x i8> [[INVEC]], i64 14203; GFX7-NEXT:    [[EL15:%.*]] = extractelement <16 x i8> [[INVEC]], i64 15204; GFX7-NEXT:    [[MUL0:%.*]] = mul i8 [[EL0]], 1205; GFX7-NEXT:    [[MUL1:%.*]] = mul i8 [[EL1]], 1206; GFX7-NEXT:    [[MUL2:%.*]] = mul i8 [[EL2]], 1207; GFX7-NEXT:    [[MUL3:%.*]] = mul i8 [[EL3]], 1208; GFX7-NEXT:    [[MUL4:%.*]] = mul i8 [[EL4]], 1209; GFX7-NEXT:    [[MUL5:%.*]] = mul i8 [[EL5]], 1210; GFX7-NEXT:    [[MUL6:%.*]] = mul i8 [[EL6]], 1211; GFX7-NEXT:    [[MUL7:%.*]] = mul i8 [[EL7]], 1212; GFX7-NEXT:    [[MUL8:%.*]] = mul i8 [[EL8]], 1213; GFX7-NEXT:    [[MUL9:%.*]] = mul i8 [[EL9]], 1214; GFX7-NEXT:    [[MUL10:%.*]] = mul i8 [[EL10]], 1215; GFX7-NEXT:    [[MUL11:%.*]] = mul i8 [[EL11]], 1216; GFX7-NEXT:    [[MUL12:%.*]] = mul i8 [[EL12]], 1217; GFX7-NEXT:    [[MUL13:%.*]] = mul i8 [[EL13]], 1218; GFX7-NEXT:    [[MUL14:%.*]] = mul i8 [[EL14]], 1219; GFX7-NEXT:    [[MUL15:%.*]] = mul i8 [[EL15]], 1220; GFX7-NEXT:    [[ADD0:%.*]] = add i8 [[MUL0]], 1221; GFX7-NEXT:    [[ADD1:%.*]] = add i8 [[MUL1]], 1222; GFX7-NEXT:    [[ADD2:%.*]] = add i8 [[MUL2]], 1223; GFX7-NEXT:    [[ADD3:%.*]] = add i8 [[MUL3]], 1224; GFX7-NEXT:    [[ADD4:%.*]] = add i8 [[MUL4]], 1225; GFX7-NEXT:    [[ADD5:%.*]] = add i8 [[MUL5]], 1226; GFX7-NEXT:    [[ADD6:%.*]] = add i8 [[MUL6]], 1227; GFX7-NEXT:    [[ADD7:%.*]] = add i8 [[MUL7]], 1228; GFX7-NEXT:    [[ADD8:%.*]] = add i8 [[MUL8]], 1229; GFX7-NEXT:    [[ADD9:%.*]] = add i8 [[MUL9]], 1230; GFX7-NEXT:    [[ADD10:%.*]] = add i8 [[MUL10]], 1231; GFX7-NEXT:    [[ADD11:%.*]] = add i8 [[MUL11]], 1232; GFX7-NEXT:    [[ADD12:%.*]] = add i8 [[MUL12]], 1233; GFX7-NEXT:    [[ADD13:%.*]] = add i8 [[MUL13]], 1234; GFX7-NEXT:    [[ADD14:%.*]] = add i8 [[MUL14]], 1235; GFX7-NEXT:    [[ADD15:%.*]] = add i8 [[MUL15]], 1236; GFX7-NEXT:    [[VECINS0:%.*]] = insertelement <16 x i8> poison, i8 [[ADD0]], i64 0237; GFX7-NEXT:    [[VECINS1:%.*]] = insertelement <16 x i8> [[VECINS0]], i8 [[ADD1]], i64 1238; GFX7-NEXT:    [[VECINS2:%.*]] = insertelement <16 x i8> [[VECINS1]], i8 [[ADD2]], i64 2239; GFX7-NEXT:    [[VECINS3:%.*]] = insertelement <16 x i8> [[VECINS2]], i8 [[ADD3]], i64 3240; GFX7-NEXT:    [[VECINS4:%.*]] = insertelement <16 x i8> [[VECINS3]], i8 [[ADD4]], i64 4241; GFX7-NEXT:    [[VECINS5:%.*]] = insertelement <16 x i8> [[VECINS4]], i8 [[ADD5]], i64 5242; GFX7-NEXT:    [[VECINS6:%.*]] = insertelement <16 x i8> [[VECINS5]], i8 [[ADD6]], i64 6243; GFX7-NEXT:    [[VECINS7:%.*]] = insertelement <16 x i8> [[VECINS6]], i8 [[ADD7]], i64 7244; GFX7-NEXT:    [[VECINS8:%.*]] = insertelement <16 x i8> [[VECINS7]], i8 [[ADD8]], i64 8245; GFX7-NEXT:    [[VECINS9:%.*]] = insertelement <16 x i8> [[VECINS8]], i8 [[ADD9]], i64 9246; GFX7-NEXT:    [[VECINS10:%.*]] = insertelement <16 x i8> [[VECINS9]], i8 [[ADD10]], i64 10247; GFX7-NEXT:    [[VECINS11:%.*]] = insertelement <16 x i8> [[VECINS10]], i8 [[ADD11]], i64 11248; GFX7-NEXT:    [[VECINS12:%.*]] = insertelement <16 x i8> [[VECINS11]], i8 [[ADD12]], i64 12249; GFX7-NEXT:    [[VECINS13:%.*]] = insertelement <16 x i8> [[VECINS12]], i8 [[ADD13]], i64 13250; GFX7-NEXT:    [[VECINS14:%.*]] = insertelement <16 x i8> [[VECINS13]], i8 [[ADD14]], i64 14251; GFX7-NEXT:    [[VECINS153:%.*]] = insertelement <16 x i8> [[VECINS14]], i8 [[ADD15]], i64 15252; GFX7-NEXT:    store <16 x i8> [[VECINS153]], ptr [[OUT]], align 16253; GFX7-NEXT:    ret void254;255; GFX8-LABEL: define protected amdgpu_kernel void @arith_16(256; GFX8-SAME: <16 x i8> [[INVEC:%.*]], ptr [[OUT:%.*]], i32 [[FLAG:%.*]]) #[[ATTR0]] {257; GFX8-NEXT:  [[ENTRY:.*:]]258; GFX8-NEXT:    [[TMP0:%.*]] = shufflevector <16 x i8> [[INVEC]], <16 x i8> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>259; GFX8-NEXT:    [[TMP1:%.*]] = mul <4 x i8> [[TMP0]], splat (i8 1)260; GFX8-NEXT:    [[TMP2:%.*]] = add <4 x i8> [[TMP1]], splat (i8 1)261; GFX8-NEXT:    [[TMP3:%.*]] = shufflevector <16 x i8> [[INVEC]], <16 x i8> poison, <4 x i32> <i32 4, i32 5, i32 6, i32 7>262; GFX8-NEXT:    [[TMP4:%.*]] = mul <4 x i8> [[TMP3]], splat (i8 1)263; GFX8-NEXT:    [[TMP5:%.*]] = add <4 x i8> [[TMP4]], splat (i8 1)264; GFX8-NEXT:    [[TMP6:%.*]] = shufflevector <16 x i8> [[INVEC]], <16 x i8> poison, <4 x i32> <i32 8, i32 9, i32 10, i32 11>265; GFX8-NEXT:    [[TMP7:%.*]] = mul <4 x i8> [[TMP6]], splat (i8 1)266; GFX8-NEXT:    [[TMP8:%.*]] = add <4 x i8> [[TMP7]], splat (i8 1)267; GFX8-NEXT:    [[TMP9:%.*]] = shufflevector <16 x i8> [[INVEC]], <16 x i8> poison, <4 x i32> <i32 12, i32 13, i32 14, i32 15>268; GFX8-NEXT:    [[TMP10:%.*]] = mul <4 x i8> [[TMP9]], splat (i8 1)269; GFX8-NEXT:    [[TMP11:%.*]] = add <4 x i8> [[TMP10]], splat (i8 1)270; GFX8-NEXT:    [[TMP12:%.*]] = shufflevector <4 x i8> [[TMP2]], <4 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>271; GFX8-NEXT:    [[TMP13:%.*]] = shufflevector <4 x i8> [[TMP5]], <4 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>272; GFX8-NEXT:    [[VECINS71:%.*]] = shufflevector <16 x i8> [[TMP12]], <16 x i8> [[TMP13]], <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 16, i32 17, i32 18, i32 19, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>273; GFX8-NEXT:    [[TMP14:%.*]] = shufflevector <4 x i8> [[TMP8]], <4 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>274; GFX8-NEXT:    [[VECINS112:%.*]] = shufflevector <16 x i8> [[VECINS71]], <16 x i8> [[TMP14]], <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 16, i32 17, i32 18, i32 19, i32 12, i32 13, i32 14, i32 15>275; GFX8-NEXT:    [[TMP15:%.*]] = shufflevector <4 x i8> [[TMP11]], <4 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>276; GFX8-NEXT:    [[VECINS153:%.*]] = shufflevector <16 x i8> [[VECINS112]], <16 x i8> [[TMP15]], <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 16, i32 17, i32 18, i32 19>277; GFX8-NEXT:    store <16 x i8> [[VECINS153]], ptr [[OUT]], align 16278; GFX8-NEXT:    ret void279;280; GFX9-LABEL: define protected amdgpu_kernel void @arith_16(281; GFX9-SAME: <16 x i8> [[INVEC:%.*]], ptr [[OUT:%.*]], i32 [[FLAG:%.*]]) #[[ATTR0]] {282; GFX9-NEXT:  [[ENTRY:.*:]]283; GFX9-NEXT:    [[TMP0:%.*]] = shufflevector <16 x i8> [[INVEC]], <16 x i8> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>284; GFX9-NEXT:    [[TMP1:%.*]] = mul <4 x i8> [[TMP0]], splat (i8 1)285; GFX9-NEXT:    [[TMP2:%.*]] = add <4 x i8> [[TMP1]], splat (i8 1)286; GFX9-NEXT:    [[TMP3:%.*]] = shufflevector <16 x i8> [[INVEC]], <16 x i8> poison, <4 x i32> <i32 4, i32 5, i32 6, i32 7>287; GFX9-NEXT:    [[TMP4:%.*]] = mul <4 x i8> [[TMP3]], splat (i8 1)288; GFX9-NEXT:    [[TMP5:%.*]] = add <4 x i8> [[TMP4]], splat (i8 1)289; GFX9-NEXT:    [[TMP6:%.*]] = shufflevector <16 x i8> [[INVEC]], <16 x i8> poison, <4 x i32> <i32 8, i32 9, i32 10, i32 11>290; GFX9-NEXT:    [[TMP7:%.*]] = mul <4 x i8> [[TMP6]], splat (i8 1)291; GFX9-NEXT:    [[TMP8:%.*]] = add <4 x i8> [[TMP7]], splat (i8 1)292; GFX9-NEXT:    [[TMP9:%.*]] = shufflevector <16 x i8> [[INVEC]], <16 x i8> poison, <4 x i32> <i32 12, i32 13, i32 14, i32 15>293; GFX9-NEXT:    [[TMP10:%.*]] = mul <4 x i8> [[TMP9]], splat (i8 1)294; GFX9-NEXT:    [[TMP11:%.*]] = add <4 x i8> [[TMP10]], splat (i8 1)295; GFX9-NEXT:    [[TMP12:%.*]] = shufflevector <4 x i8> [[TMP2]], <4 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>296; GFX9-NEXT:    [[TMP13:%.*]] = shufflevector <4 x i8> [[TMP5]], <4 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>297; GFX9-NEXT:    [[VECINS71:%.*]] = shufflevector <16 x i8> [[TMP12]], <16 x i8> [[TMP13]], <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 16, i32 17, i32 18, i32 19, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>298; GFX9-NEXT:    [[TMP14:%.*]] = shufflevector <4 x i8> [[TMP8]], <4 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>299; GFX9-NEXT:    [[VECINS112:%.*]] = shufflevector <16 x i8> [[VECINS71]], <16 x i8> [[TMP14]], <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 16, i32 17, i32 18, i32 19, i32 12, i32 13, i32 14, i32 15>300; GFX9-NEXT:    [[TMP15:%.*]] = shufflevector <4 x i8> [[TMP11]], <4 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>301; GFX9-NEXT:    [[VECINS153:%.*]] = shufflevector <16 x i8> [[VECINS112]], <16 x i8> [[TMP15]], <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 16, i32 17, i32 18, i32 19>302; GFX9-NEXT:    store <16 x i8> [[VECINS153]], ptr [[OUT]], align 16303; GFX9-NEXT:    ret void304;305entry:306  %el0 = extractelement <16 x i8> %invec, i64  0307  %el1 = extractelement <16 x i8> %invec, i64  1308  %el2 = extractelement <16 x i8> %invec, i64  2309  %el3 = extractelement <16 x i8> %invec, i64  3310  %el4 = extractelement <16 x i8> %invec, i64  4311  %el5 = extractelement <16 x i8> %invec, i64  5312  %el6 = extractelement <16 x i8> %invec, i64  6313  %el7 = extractelement <16 x i8> %invec, i64  7314  %el8 = extractelement <16 x i8> %invec, i64  8315  %el9 = extractelement <16 x i8> %invec, i64  9316  %el10 = extractelement <16 x i8> %invec, i64 10317  %el11 = extractelement <16 x i8> %invec, i64 11318  %el12 = extractelement <16 x i8> %invec, i64 12319  %el13 = extractelement <16 x i8> %invec, i64 13320  %el14 = extractelement <16 x i8> %invec, i64 14321  %el15 = extractelement <16 x i8> %invec, i64 15322  %mul0 = mul i8 %el0, 1323  %mul1 = mul i8 %el1, 1324  %mul2 = mul i8 %el2, 1325  %mul3 = mul i8 %el3, 1326  %mul4 = mul i8 %el4, 1327  %mul5 = mul i8 %el5, 1328  %mul6 = mul i8 %el6, 1329  %mul7 = mul i8 %el7, 1330  %mul8 = mul i8 %el8, 1331  %mul9 = mul i8 %el9, 1332  %mul10 = mul i8 %el10, 1333  %mul11 = mul i8 %el11, 1334  %mul12 = mul i8 %el12, 1335  %mul13 = mul i8 %el13, 1336  %mul14 = mul i8 %el14, 1337  %mul15 = mul i8 %el15, 1338  %add0 = add i8 %mul0, 1339  %add1 = add i8 %mul1, 1340  %add2 = add i8 %mul2, 1341  %add3 = add i8 %mul3, 1342  %add4 = add i8 %mul4, 1343  %add5 = add i8 %mul5, 1344  %add6 = add i8 %mul6, 1345  %add7 = add i8 %mul7, 1346  %add8 = add i8 %mul8, 1347  %add9 = add i8 %mul9, 1348  %add10 = add i8 %mul10, 1349  %add11 = add i8 %mul11, 1350  %add12 = add i8 %mul12, 1351  %add13 = add i8 %mul13, 1352  %add14 = add i8 %mul14, 1353  %add15 = add i8 %mul15, 1354  %vecins0 = insertelement <16 x i8> poison, i8 %add0, i64 0355  %vecins1 = insertelement <16 x i8> %vecins0, i8 %add1, i64 1356  %vecins2 = insertelement <16 x i8> %vecins1, i8 %add2, i64 2357  %vecins3 = insertelement <16 x i8> %vecins2, i8 %add3, i64 3358  %vecins4 = insertelement <16 x i8> %vecins3, i8 %add4, i64 4359  %vecins5 = insertelement <16 x i8> %vecins4, i8 %add5, i64 5360  %vecins6 = insertelement <16 x i8> %vecins5, i8 %add6, i64 6361  %vecins7 = insertelement <16 x i8> %vecins6, i8 %add7, i64 7362  %vecins8 = insertelement <16 x i8> %vecins7, i8 %add8, i64 8363  %vecins9 = insertelement <16 x i8> %vecins8, i8 %add9, i64 9364  %vecins10 = insertelement <16 x i8> %vecins9, i8 %add10, i64 10365  %vecins11 = insertelement <16 x i8> %vecins10, i8 %add11, i64 11366  %vecins12 = insertelement <16 x i8> %vecins11, i8 %add12, i64 12367  %vecins13 = insertelement <16 x i8> %vecins12, i8 %add13, i64 13368  %vecins14 = insertelement <16 x i8> %vecins13, i8 %add14, i64 14369  %vecins15 = insertelement <16 x i8> %vecins14, i8 %add15, i64 15370  store <16 x i8> %vecins15, ptr %out371  ret void372}373 374define protected amdgpu_kernel void @phi_2(ptr addrspace(3) %inptr0, ptr addrspace(3) %inptr1, ptr %out, ptr %out1, i32 %flag) {375; GFX7-LABEL: define protected amdgpu_kernel void @phi_2(376; GFX7-SAME: ptr addrspace(3) [[INPTR0:%.*]], ptr addrspace(3) [[INPTR1:%.*]], ptr [[OUT:%.*]], ptr [[OUT1:%.*]], i32 [[FLAG:%.*]]) #[[ATTR0]] {377; GFX7-NEXT:  [[ENTRY:.*]]:378; GFX7-NEXT:    [[GEP0:%.*]] = getelementptr i8, ptr addrspace(3) [[INPTR0]], i32 0379; GFX7-NEXT:    [[ELE0:%.*]] = load i8, ptr addrspace(3) [[GEP0]], align 8380; GFX7-NEXT:    [[GEP1:%.*]] = getelementptr i8, ptr addrspace(3) [[INPTR0]], i32 1381; GFX7-NEXT:    [[ELE1:%.*]] = load i8, ptr addrspace(3) [[GEP1]], align 1382; GFX7-NEXT:    br label %[[DO_BODY:.*]]383; GFX7:       [[DO_BODY]]:384; GFX7-NEXT:    [[PHI2:%.*]] = phi i8 [ [[ELE1]], %[[ENTRY]] ], [ [[OTHERELE1:%.*]], %[[DO_BODY]] ]385; GFX7-NEXT:    [[PHI3:%.*]] = phi i8 [ [[ELE0]], %[[ENTRY]] ], [ [[OTHERELE0:%.*]], %[[DO_BODY]] ]386; GFX7-NEXT:    [[OTHERELE0]] = load i8, ptr addrspace(3) [[GEP0]], align 8387; GFX7-NEXT:    [[OTHERELE1]] = load i8, ptr addrspace(3) [[GEP1]], align 1388; GFX7-NEXT:    [[VEC00:%.*]] = insertelement <16 x i8> poison, i8 [[OTHERELE0]], i64 8389; GFX7-NEXT:    [[TMP3:%.*]] = insertelement <16 x i8> [[VEC00]], i8 [[OTHERELE1]], i64 9390; GFX7-NEXT:    [[VEC10:%.*]] = insertelement <16 x i8> poison, i8 [[PHI3]], i64 8391; GFX7-NEXT:    [[VEC111:%.*]] = insertelement <16 x i8> [[VEC10]], i8 [[PHI2]], i64 9392; GFX7-NEXT:    store <16 x i8> [[VEC111]], ptr addrspace(3) [[INPTR1]], align 2393; GFX7-NEXT:    [[CMP:%.*]] = icmp eq i32 [[FLAG]], 0394; GFX7-NEXT:    br i1 [[CMP]], label %[[EXIT:.*]], label %[[DO_BODY]]395; GFX7:       [[EXIT]]:396; GFX7-NEXT:    store <16 x i8> [[VEC111]], ptr [[OUT]], align 16397; GFX7-NEXT:    store <16 x i8> [[TMP3]], ptr [[OUT1]], align 16398; GFX7-NEXT:    ret void399;400; GFX8-LABEL: define protected amdgpu_kernel void @phi_2(401; GFX8-SAME: ptr addrspace(3) [[INPTR0:%.*]], ptr addrspace(3) [[INPTR1:%.*]], ptr [[OUT:%.*]], ptr [[OUT1:%.*]], i32 [[FLAG:%.*]]) #[[ATTR0]] {402; GFX8-NEXT:  [[ENTRY:.*]]:403; GFX8-NEXT:    [[GEP0:%.*]] = getelementptr i8, ptr addrspace(3) [[INPTR0]], i32 0404; GFX8-NEXT:    [[TMP0:%.*]] = load <2 x i8>, ptr addrspace(3) [[GEP0]], align 8405; GFX8-NEXT:    br label %[[DO_BODY:.*]]406; GFX8:       [[DO_BODY]]:407; GFX8-NEXT:    [[TMP1:%.*]] = phi <2 x i8> [ [[TMP0]], %[[ENTRY]] ], [ [[TMP2:%.*]], %[[DO_BODY]] ]408; GFX8-NEXT:    [[TMP2]] = load <2 x i8>, ptr addrspace(3) [[GEP0]], align 8409; GFX8-NEXT:    [[TMP3:%.*]] = shufflevector <2 x i8> [[TMP2]], <2 x i8> poison, <16 x i32> <i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 0, i32 1, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>410; GFX8-NEXT:    [[VEC111:%.*]] = shufflevector <2 x i8> [[TMP1]], <2 x i8> poison, <16 x i32> <i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 0, i32 1, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>411; GFX8-NEXT:    store <16 x i8> [[VEC111]], ptr addrspace(3) [[INPTR1]], align 2412; GFX8-NEXT:    [[CMP:%.*]] = icmp eq i32 [[FLAG]], 0413; GFX8-NEXT:    br i1 [[CMP]], label %[[EXIT:.*]], label %[[DO_BODY]]414; GFX8:       [[EXIT]]:415; GFX8-NEXT:    store <16 x i8> [[VEC111]], ptr [[OUT]], align 16416; GFX8-NEXT:    store <16 x i8> [[TMP3]], ptr [[OUT1]], align 16417; GFX8-NEXT:    ret void418;419; GFX9-LABEL: define protected amdgpu_kernel void @phi_2(420; GFX9-SAME: ptr addrspace(3) [[INPTR0:%.*]], ptr addrspace(3) [[INPTR1:%.*]], ptr [[OUT:%.*]], ptr [[OUT1:%.*]], i32 [[FLAG:%.*]]) #[[ATTR0]] {421; GFX9-NEXT:  [[ENTRY:.*]]:422; GFX9-NEXT:    [[GEP0:%.*]] = getelementptr i8, ptr addrspace(3) [[INPTR0]], i32 0423; GFX9-NEXT:    [[TMP0:%.*]] = load <2 x i8>, ptr addrspace(3) [[GEP0]], align 8424; GFX9-NEXT:    br label %[[DO_BODY:.*]]425; GFX9:       [[DO_BODY]]:426; GFX9-NEXT:    [[TMP1:%.*]] = phi <2 x i8> [ [[TMP0]], %[[ENTRY]] ], [ [[TMP2:%.*]], %[[DO_BODY]] ]427; GFX9-NEXT:    [[TMP2]] = load <2 x i8>, ptr addrspace(3) [[GEP0]], align 8428; GFX9-NEXT:    [[TMP3:%.*]] = shufflevector <2 x i8> [[TMP2]], <2 x i8> poison, <16 x i32> <i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 0, i32 1, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>429; GFX9-NEXT:    [[VEC111:%.*]] = shufflevector <2 x i8> [[TMP1]], <2 x i8> poison, <16 x i32> <i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 0, i32 1, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>430; GFX9-NEXT:    store <16 x i8> [[VEC111]], ptr addrspace(3) [[INPTR1]], align 2431; GFX9-NEXT:    [[CMP:%.*]] = icmp eq i32 [[FLAG]], 0432; GFX9-NEXT:    br i1 [[CMP]], label %[[EXIT:.*]], label %[[DO_BODY]]433; GFX9:       [[EXIT]]:434; GFX9-NEXT:    store <16 x i8> [[VEC111]], ptr [[OUT]], align 16435; GFX9-NEXT:    store <16 x i8> [[TMP3]], ptr [[OUT1]], align 16436; GFX9-NEXT:    ret void437;438entry:439  %gep0 = getelementptr i8, ptr addrspace(3) %inptr0, i32 0440  %ele0 = load i8, ptr addrspace(3) %gep0, align 8441  %gep1 = getelementptr i8, ptr addrspace(3) %inptr0, i32 1442  %ele1 = load i8, ptr addrspace(3) %gep1, align 1443  br label %do.body444 445do.body:446  %phi2 = phi i8 [ %ele1, %entry ], [ %otherele1, %do.body ]447  %phi3 = phi i8 [ %ele0, %entry ], [ %otherele0, %do.body ]448  %otherele0 = load i8, ptr addrspace(3) %gep0, align 8449  %otherele1 = load i8, ptr addrspace(3) %gep1, align 1450  %vec00 = insertelement <16 x i8> poison, i8 %otherele0, i64 8451  %vec01 = insertelement <16 x i8> %vec00, i8 %otherele1, i64 9452  %vec10 = insertelement <16 x i8> poison, i8 %phi3, i64 8453  %vec11 = insertelement <16 x i8> %vec10, i8 %phi2, i64 9454  store <16 x i8> %vec11, ptr addrspace(3) %inptr1, align 2455  %cmp = icmp eq i32 %flag, 0456  br i1 %cmp, label %exit, label %do.body457 458exit:459  store <16 x i8> %vec11, ptr %out460  store <16 x i8> %vec01, ptr %out1461  ret void462}463 464define protected amdgpu_kernel void @phi_3(ptr addrspace(3) %inptr0, ptr addrspace(3) %inptr1, ptr %out, ptr %out1, i32 %flag) {465; GFX7-LABEL: define protected amdgpu_kernel void @phi_3(466; GFX7-SAME: ptr addrspace(3) [[INPTR0:%.*]], ptr addrspace(3) [[INPTR1:%.*]], ptr [[OUT:%.*]], ptr [[OUT1:%.*]], i32 [[FLAG:%.*]]) #[[ATTR0]] {467; GFX7-NEXT:  [[ENTRY:.*]]:468; GFX7-NEXT:    [[GEP0:%.*]] = getelementptr i8, ptr addrspace(3) [[INPTR0]], i32 0469; GFX7-NEXT:    [[ELE0:%.*]] = load i8, ptr addrspace(3) [[GEP0]], align 8470; GFX7-NEXT:    [[GEP1:%.*]] = getelementptr i8, ptr addrspace(3) [[INPTR0]], i32 1471; GFX7-NEXT:    [[ELE1:%.*]] = load i8, ptr addrspace(3) [[GEP1]], align 1472; GFX7-NEXT:    [[GEP2:%.*]] = getelementptr i8, ptr addrspace(3) [[INPTR0]], i32 2473; GFX7-NEXT:    [[ELE2:%.*]] = load i8, ptr addrspace(3) [[GEP2]], align 2474; GFX7-NEXT:    br label %[[DO_BODY:.*]]475; GFX7:       [[DO_BODY]]:476; GFX7-NEXT:    [[PHI1:%.*]] = phi i8 [ [[ELE2]], %[[ENTRY]] ], [ [[OTHERELE2:%.*]], %[[DO_BODY]] ]477; GFX7-NEXT:    [[PHI2:%.*]] = phi i8 [ [[ELE1]], %[[ENTRY]] ], [ [[OTHERELE1:%.*]], %[[DO_BODY]] ]478; GFX7-NEXT:    [[PHI3:%.*]] = phi i8 [ [[ELE0]], %[[ENTRY]] ], [ [[OTHERELE0:%.*]], %[[DO_BODY]] ]479; GFX7-NEXT:    [[OTHERELE0]] = load i8, ptr addrspace(3) [[GEP0]], align 8480; GFX7-NEXT:    [[OTHERELE1]] = load i8, ptr addrspace(3) [[GEP1]], align 1481; GFX7-NEXT:    [[OTHERELE2]] = load i8, ptr addrspace(3) [[GEP2]], align 2482; GFX7-NEXT:    [[VEC00:%.*]] = insertelement <16 x i8> poison, i8 [[OTHERELE0]], i64 8483; GFX7-NEXT:    [[TMP3:%.*]] = insertelement <16 x i8> [[VEC00]], i8 [[OTHERELE1]], i64 9484; GFX7-NEXT:    [[VEC02:%.*]] = insertelement <16 x i8> [[TMP3]], i8 [[OTHERELE2]], i64 10485; GFX7-NEXT:    [[VEC10:%.*]] = insertelement <16 x i8> poison, i8 [[PHI3]], i64 8486; GFX7-NEXT:    [[VEC111:%.*]] = insertelement <16 x i8> [[VEC10]], i8 [[PHI2]], i64 9487; GFX7-NEXT:    [[VEC12:%.*]] = insertelement <16 x i8> [[VEC111]], i8 [[PHI1]], i64 10488; GFX7-NEXT:    store <16 x i8> [[VEC12]], ptr addrspace(3) [[INPTR1]], align 2489; GFX7-NEXT:    [[CMP:%.*]] = icmp eq i32 [[FLAG]], 0490; GFX7-NEXT:    br i1 [[CMP]], label %[[EXIT:.*]], label %[[DO_BODY]]491; GFX7:       [[EXIT]]:492; GFX7-NEXT:    store <16 x i8> [[VEC12]], ptr [[OUT]], align 16493; GFX7-NEXT:    store <16 x i8> [[VEC02]], ptr [[OUT1]], align 16494; GFX7-NEXT:    ret void495;496; GFX8-LABEL: define protected amdgpu_kernel void @phi_3(497; GFX8-SAME: ptr addrspace(3) [[INPTR0:%.*]], ptr addrspace(3) [[INPTR1:%.*]], ptr [[OUT:%.*]], ptr [[OUT1:%.*]], i32 [[FLAG:%.*]]) #[[ATTR0]] {498; GFX8-NEXT:  [[ENTRY:.*]]:499; GFX8-NEXT:    [[GEP0:%.*]] = getelementptr i8, ptr addrspace(3) [[INPTR0]], i32 0500; GFX8-NEXT:    [[TMP0:%.*]] = load <2 x i8>, ptr addrspace(3) [[GEP0]], align 8501; GFX8-NEXT:    [[GEP2:%.*]] = getelementptr i8, ptr addrspace(3) [[INPTR0]], i32 2502; GFX8-NEXT:    [[ELE2:%.*]] = load i8, ptr addrspace(3) [[GEP2]], align 2503; GFX8-NEXT:    br label %[[DO_BODY:.*]]504; GFX8:       [[DO_BODY]]:505; GFX8-NEXT:    [[PHI1:%.*]] = phi i8 [ [[ELE2]], %[[ENTRY]] ], [ [[OTHERELE2:%.*]], %[[DO_BODY]] ]506; GFX8-NEXT:    [[TMP1:%.*]] = phi <2 x i8> [ [[TMP0]], %[[ENTRY]] ], [ [[TMP2:%.*]], %[[DO_BODY]] ]507; GFX8-NEXT:    [[TMP2]] = load <2 x i8>, ptr addrspace(3) [[GEP0]], align 8508; GFX8-NEXT:    [[OTHERELE2]] = load i8, ptr addrspace(3) [[GEP2]], align 2509; GFX8-NEXT:    [[TMP3:%.*]] = shufflevector <2 x i8> [[TMP2]], <2 x i8> poison, <16 x i32> <i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 0, i32 1, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>510; GFX8-NEXT:    [[VEC02:%.*]] = insertelement <16 x i8> [[TMP3]], i8 [[OTHERELE2]], i64 10511; GFX8-NEXT:    [[VEC111:%.*]] = shufflevector <2 x i8> [[TMP1]], <2 x i8> poison, <16 x i32> <i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 0, i32 1, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>512; GFX8-NEXT:    [[VEC12:%.*]] = insertelement <16 x i8> [[VEC111]], i8 [[PHI1]], i64 10513; GFX8-NEXT:    store <16 x i8> [[VEC12]], ptr addrspace(3) [[INPTR1]], align 2514; GFX8-NEXT:    [[CMP:%.*]] = icmp eq i32 [[FLAG]], 0515; GFX8-NEXT:    br i1 [[CMP]], label %[[EXIT:.*]], label %[[DO_BODY]]516; GFX8:       [[EXIT]]:517; GFX8-NEXT:    store <16 x i8> [[VEC12]], ptr [[OUT]], align 16518; GFX8-NEXT:    store <16 x i8> [[VEC02]], ptr [[OUT1]], align 16519; GFX8-NEXT:    ret void520;521; GFX9-LABEL: define protected amdgpu_kernel void @phi_3(522; GFX9-SAME: ptr addrspace(3) [[INPTR0:%.*]], ptr addrspace(3) [[INPTR1:%.*]], ptr [[OUT:%.*]], ptr [[OUT1:%.*]], i32 [[FLAG:%.*]]) #[[ATTR0]] {523; GFX9-NEXT:  [[ENTRY:.*]]:524; GFX9-NEXT:    [[GEP0:%.*]] = getelementptr i8, ptr addrspace(3) [[INPTR0]], i32 0525; GFX9-NEXT:    [[TMP0:%.*]] = load <2 x i8>, ptr addrspace(3) [[GEP0]], align 8526; GFX9-NEXT:    [[GEP2:%.*]] = getelementptr i8, ptr addrspace(3) [[INPTR0]], i32 2527; GFX9-NEXT:    [[ELE2:%.*]] = load i8, ptr addrspace(3) [[GEP2]], align 2528; GFX9-NEXT:    br label %[[DO_BODY:.*]]529; GFX9:       [[DO_BODY]]:530; GFX9-NEXT:    [[PHI1:%.*]] = phi i8 [ [[ELE2]], %[[ENTRY]] ], [ [[OTHERELE2:%.*]], %[[DO_BODY]] ]531; GFX9-NEXT:    [[TMP1:%.*]] = phi <2 x i8> [ [[TMP0]], %[[ENTRY]] ], [ [[TMP2:%.*]], %[[DO_BODY]] ]532; GFX9-NEXT:    [[TMP2]] = load <2 x i8>, ptr addrspace(3) [[GEP0]], align 8533; GFX9-NEXT:    [[OTHERELE2]] = load i8, ptr addrspace(3) [[GEP2]], align 2534; GFX9-NEXT:    [[TMP3:%.*]] = shufflevector <2 x i8> [[TMP2]], <2 x i8> poison, <16 x i32> <i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 0, i32 1, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>535; GFX9-NEXT:    [[VEC02:%.*]] = insertelement <16 x i8> [[TMP3]], i8 [[OTHERELE2]], i64 10536; GFX9-NEXT:    [[VEC111:%.*]] = shufflevector <2 x i8> [[TMP1]], <2 x i8> poison, <16 x i32> <i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 0, i32 1, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>537; GFX9-NEXT:    [[VEC12:%.*]] = insertelement <16 x i8> [[VEC111]], i8 [[PHI1]], i64 10538; GFX9-NEXT:    store <16 x i8> [[VEC12]], ptr addrspace(3) [[INPTR1]], align 2539; GFX9-NEXT:    [[CMP:%.*]] = icmp eq i32 [[FLAG]], 0540; GFX9-NEXT:    br i1 [[CMP]], label %[[EXIT:.*]], label %[[DO_BODY]]541; GFX9:       [[EXIT]]:542; GFX9-NEXT:    store <16 x i8> [[VEC12]], ptr [[OUT]], align 16543; GFX9-NEXT:    store <16 x i8> [[VEC02]], ptr [[OUT1]], align 16544; GFX9-NEXT:    ret void545;546entry:547  %gep0 = getelementptr i8, ptr addrspace(3) %inptr0, i32 0548  %ele0 = load i8, ptr addrspace(3) %gep0, align 8549  %gep1 = getelementptr i8, ptr addrspace(3) %inptr0, i32 1550  %ele1 = load i8, ptr addrspace(3) %gep1, align 1551  %gep2 = getelementptr i8, ptr addrspace(3) %inptr0, i32 2552  %ele2 = load i8, ptr addrspace(3) %gep2, align 2553  br label %do.body554 555do.body:556  %phi1 = phi i8 [ %ele2, %entry ], [ %otherele2, %do.body ]557  %phi2 = phi i8 [ %ele1, %entry ], [ %otherele1, %do.body ]558  %phi3 = phi i8 [ %ele0, %entry ], [ %otherele0, %do.body ]559  %otherele0 = load i8, ptr addrspace(3) %gep0, align 8560  %otherele1 = load i8, ptr addrspace(3) %gep1, align 1561  %otherele2 = load i8, ptr addrspace(3) %gep2, align 2562  %vec00 = insertelement <16 x i8> poison, i8 %otherele0, i64 8563  %vec01 = insertelement <16 x i8> %vec00, i8 %otherele1, i64 9564  %vec02 = insertelement <16 x i8> %vec01, i8 %otherele2, i64 10565  %vec10 = insertelement <16 x i8> poison, i8 %phi3, i64 8566  %vec11 = insertelement <16 x i8> %vec10, i8 %phi2, i64 9567  %vec12 = insertelement <16 x i8> %vec11, i8 %phi1, i64 10568  store <16 x i8> %vec12, ptr addrspace(3) %inptr1, align 2569  %cmp = icmp eq i32 %flag, 0570  br i1 %cmp, label %exit, label %do.body571 572exit:573  store <16 x i8> %vec12, ptr %out574  store <16 x i8> %vec02, ptr %out1575  ret void576}577 578define protected amdgpu_kernel void @phi_4(ptr addrspace(3) %inptr0, ptr addrspace(3) %inptr1, ptr %out, ptr %out1, i32 %flag) {579; GFX7-LABEL: define protected amdgpu_kernel void @phi_4(580; GFX7-SAME: ptr addrspace(3) [[INPTR0:%.*]], ptr addrspace(3) [[INPTR1:%.*]], ptr [[OUT:%.*]], ptr [[OUT1:%.*]], i32 [[FLAG:%.*]]) #[[ATTR0]] {581; GFX7-NEXT:  [[ENTRY:.*]]:582; GFX7-NEXT:    [[GEP0:%.*]] = getelementptr i8, ptr addrspace(3) [[INPTR0]], i32 0583; GFX7-NEXT:    [[ELE0:%.*]] = load i8, ptr addrspace(3) [[GEP0]], align 8584; GFX7-NEXT:    [[GEP1:%.*]] = getelementptr i8, ptr addrspace(3) [[INPTR0]], i32 1585; GFX7-NEXT:    [[ELE1:%.*]] = load i8, ptr addrspace(3) [[GEP1]], align 1586; GFX7-NEXT:    [[GEP2:%.*]] = getelementptr i8, ptr addrspace(3) [[INPTR0]], i32 2587; GFX7-NEXT:    [[ELE2:%.*]] = load i8, ptr addrspace(3) [[GEP2]], align 2588; GFX7-NEXT:    [[GEP3:%.*]] = getelementptr i8, ptr addrspace(3) [[INPTR0]], i32 3589; GFX7-NEXT:    [[ELE3:%.*]] = load i8, ptr addrspace(3) [[GEP3]], align 1590; GFX7-NEXT:    br label %[[DO_BODY:.*]]591; GFX7:       [[DO_BODY]]:592; GFX7-NEXT:    [[PHI0:%.*]] = phi i8 [ [[ELE3]], %[[ENTRY]] ], [ [[OTHERELE3:%.*]], %[[DO_BODY]] ]593; GFX7-NEXT:    [[PHI1:%.*]] = phi i8 [ [[ELE2]], %[[ENTRY]] ], [ [[OTHERELE2:%.*]], %[[DO_BODY]] ]594; GFX7-NEXT:    [[PHI2:%.*]] = phi i8 [ [[ELE1]], %[[ENTRY]] ], [ [[OTHERELE1:%.*]], %[[DO_BODY]] ]595; GFX7-NEXT:    [[PHI3:%.*]] = phi i8 [ [[ELE0]], %[[ENTRY]] ], [ [[OTHERELE0:%.*]], %[[DO_BODY]] ]596; GFX7-NEXT:    [[OTHERELE0]] = load i8, ptr addrspace(3) [[GEP0]], align 8597; GFX7-NEXT:    [[OTHERELE1]] = load i8, ptr addrspace(3) [[GEP1]], align 1598; GFX7-NEXT:    [[OTHERELE2]] = load i8, ptr addrspace(3) [[GEP2]], align 2599; GFX7-NEXT:    [[OTHERELE3]] = load i8, ptr addrspace(3) [[GEP3]], align 1600; GFX7-NEXT:    [[VEC00:%.*]] = insertelement <16 x i8> poison, i8 [[OTHERELE0]], i64 8601; GFX7-NEXT:    [[VEC01:%.*]] = insertelement <16 x i8> [[VEC00]], i8 [[OTHERELE1]], i64 9602; GFX7-NEXT:    [[VEC02:%.*]] = insertelement <16 x i8> [[VEC01]], i8 [[OTHERELE2]], i64 10603; GFX7-NEXT:    [[TMP3:%.*]] = insertelement <16 x i8> [[VEC02]], i8 [[OTHERELE3]], i64 11604; GFX7-NEXT:    [[VEC10:%.*]] = insertelement <16 x i8> poison, i8 [[PHI3]], i64 8605; GFX7-NEXT:    [[VEC11:%.*]] = insertelement <16 x i8> [[VEC10]], i8 [[PHI2]], i64 9606; GFX7-NEXT:    [[VEC12:%.*]] = insertelement <16 x i8> [[VEC11]], i8 [[PHI1]], i64 10607; GFX7-NEXT:    [[VEC131:%.*]] = insertelement <16 x i8> [[VEC12]], i8 [[PHI0]], i64 11608; GFX7-NEXT:    store <16 x i8> [[VEC131]], ptr addrspace(3) [[INPTR1]], align 2609; GFX7-NEXT:    [[CMP:%.*]] = icmp eq i32 [[FLAG]], 0610; GFX7-NEXT:    br i1 [[CMP]], label %[[EXIT:.*]], label %[[DO_BODY]]611; GFX7:       [[EXIT]]:612; GFX7-NEXT:    store <16 x i8> [[VEC131]], ptr [[OUT]], align 16613; GFX7-NEXT:    store <16 x i8> [[TMP3]], ptr [[OUT1]], align 16614; GFX7-NEXT:    ret void615;616; GFX8-LABEL: define protected amdgpu_kernel void @phi_4(617; GFX8-SAME: ptr addrspace(3) [[INPTR0:%.*]], ptr addrspace(3) [[INPTR1:%.*]], ptr [[OUT:%.*]], ptr [[OUT1:%.*]], i32 [[FLAG:%.*]]) #[[ATTR0]] {618; GFX8-NEXT:  [[ENTRY:.*]]:619; GFX8-NEXT:    [[GEP0:%.*]] = getelementptr i8, ptr addrspace(3) [[INPTR0]], i32 0620; GFX8-NEXT:    [[TMP0:%.*]] = load <4 x i8>, ptr addrspace(3) [[GEP0]], align 8621; GFX8-NEXT:    br label %[[DO_BODY:.*]]622; GFX8:       [[DO_BODY]]:623; GFX8-NEXT:    [[TMP1:%.*]] = phi <4 x i8> [ [[TMP0]], %[[ENTRY]] ], [ [[TMP2:%.*]], %[[DO_BODY]] ]624; GFX8-NEXT:    [[TMP2]] = load <4 x i8>, ptr addrspace(3) [[GEP0]], align 8625; GFX8-NEXT:    [[TMP3:%.*]] = shufflevector <4 x i8> [[TMP2]], <4 x i8> poison, <16 x i32> <i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison>626; GFX8-NEXT:    [[VEC131:%.*]] = shufflevector <4 x i8> [[TMP1]], <4 x i8> poison, <16 x i32> <i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison>627; GFX8-NEXT:    store <16 x i8> [[VEC131]], ptr addrspace(3) [[INPTR1]], align 2628; GFX8-NEXT:    [[CMP:%.*]] = icmp eq i32 [[FLAG]], 0629; GFX8-NEXT:    br i1 [[CMP]], label %[[EXIT:.*]], label %[[DO_BODY]]630; GFX8:       [[EXIT]]:631; GFX8-NEXT:    store <16 x i8> [[VEC131]], ptr [[OUT]], align 16632; GFX8-NEXT:    store <16 x i8> [[TMP3]], ptr [[OUT1]], align 16633; GFX8-NEXT:    ret void634;635; GFX9-LABEL: define protected amdgpu_kernel void @phi_4(636; GFX9-SAME: ptr addrspace(3) [[INPTR0:%.*]], ptr addrspace(3) [[INPTR1:%.*]], ptr [[OUT:%.*]], ptr [[OUT1:%.*]], i32 [[FLAG:%.*]]) #[[ATTR0]] {637; GFX9-NEXT:  [[ENTRY:.*]]:638; GFX9-NEXT:    [[GEP0:%.*]] = getelementptr i8, ptr addrspace(3) [[INPTR0]], i32 0639; GFX9-NEXT:    [[TMP0:%.*]] = load <4 x i8>, ptr addrspace(3) [[GEP0]], align 8640; GFX9-NEXT:    br label %[[DO_BODY:.*]]641; GFX9:       [[DO_BODY]]:642; GFX9-NEXT:    [[TMP1:%.*]] = phi <4 x i8> [ [[TMP0]], %[[ENTRY]] ], [ [[TMP2:%.*]], %[[DO_BODY]] ]643; GFX9-NEXT:    [[TMP2]] = load <4 x i8>, ptr addrspace(3) [[GEP0]], align 8644; GFX9-NEXT:    [[TMP3:%.*]] = shufflevector <4 x i8> [[TMP2]], <4 x i8> poison, <16 x i32> <i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison>645; GFX9-NEXT:    [[VEC131:%.*]] = shufflevector <4 x i8> [[TMP1]], <4 x i8> poison, <16 x i32> <i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison>646; GFX9-NEXT:    store <16 x i8> [[VEC131]], ptr addrspace(3) [[INPTR1]], align 2647; GFX9-NEXT:    [[CMP:%.*]] = icmp eq i32 [[FLAG]], 0648; GFX9-NEXT:    br i1 [[CMP]], label %[[EXIT:.*]], label %[[DO_BODY]]649; GFX9:       [[EXIT]]:650; GFX9-NEXT:    store <16 x i8> [[VEC131]], ptr [[OUT]], align 16651; GFX9-NEXT:    store <16 x i8> [[TMP3]], ptr [[OUT1]], align 16652; GFX9-NEXT:    ret void653;654entry:655  %gep0 = getelementptr i8, ptr addrspace(3) %inptr0, i32 0656  %ele0 = load i8, ptr addrspace(3) %gep0, align 8657  %gep1 = getelementptr i8, ptr addrspace(3) %inptr0, i32 1658  %ele1 = load i8, ptr addrspace(3) %gep1, align 1659  %gep2 = getelementptr i8, ptr addrspace(3) %inptr0, i32 2660  %ele2 = load i8, ptr addrspace(3) %gep2, align 2661  %gep3 = getelementptr i8, ptr addrspace(3) %inptr0, i32 3662  %ele3 = load i8, ptr addrspace(3) %gep3, align 1663  br label %do.body664 665do.body:666  %phi0 = phi i8 [ %ele3, %entry ], [ %otherele3, %do.body ]667  %phi1 = phi i8 [ %ele2, %entry ], [ %otherele2, %do.body ]668  %phi2 = phi i8 [ %ele1, %entry ], [ %otherele1, %do.body ]669  %phi3 = phi i8 [ %ele0, %entry ], [ %otherele0, %do.body ]670  %otherele0 = load i8, ptr addrspace(3) %gep0, align 8671  %otherele1 = load i8, ptr addrspace(3) %gep1, align 1672  %otherele2 = load i8, ptr addrspace(3) %gep2, align 2673  %otherele3 = load i8, ptr addrspace(3) %gep3, align 1674  %vec00 = insertelement <16 x i8> poison, i8 %otherele0, i64 8675  %vec01 = insertelement <16 x i8> %vec00, i8 %otherele1, i64 9676  %vec02 = insertelement <16 x i8> %vec01, i8 %otherele2, i64 10677  %vec03 = insertelement <16 x i8> %vec02, i8 %otherele3, i64 11678  %vec10 = insertelement <16 x i8> poison, i8 %phi3, i64 8679  %vec11 = insertelement <16 x i8> %vec10, i8 %phi2, i64 9680  %vec12 = insertelement <16 x i8> %vec11, i8 %phi1, i64 10681  %vec13 = insertelement <16 x i8> %vec12, i8 %phi0, i64 11682  store <16 x i8> %vec13, ptr addrspace(3) %inptr1, align 2683  %cmp = icmp eq i32 %flag, 0684  br i1 %cmp, label %exit, label %do.body685 686exit:687  store <16 x i8> %vec13, ptr %out688  store <16 x i8> %vec03, ptr %out1689  ret void690}691 692define protected amdgpu_kernel void @phi_4_with_stores(ptr addrspace(3) %inptr0, ptr addrspace(3) %inptr1, ptr %out, ptr %out1, i32 %flag) {693; GFX7-LABEL: define protected amdgpu_kernel void @phi_4_with_stores(694; GFX7-SAME: ptr addrspace(3) [[INPTR0:%.*]], ptr addrspace(3) [[INPTR1:%.*]], ptr [[OUT:%.*]], ptr [[OUT1:%.*]], i32 [[FLAG:%.*]]) #[[ATTR0]] {695; GFX7-NEXT:  [[ENTRY:.*]]:696; GFX7-NEXT:    [[GEP0:%.*]] = getelementptr i8, ptr addrspace(3) [[INPTR0]], i32 0697; GFX7-NEXT:    [[TMP0:%.*]] = load <4 x i8>, ptr addrspace(3) [[GEP0]], align 8698; GFX7-NEXT:    br label %[[DO_BODY:.*]]699; GFX7:       [[DO_BODY]]:700; GFX7-NEXT:    [[TMP1:%.*]] = phi <4 x i8> [ [[TMP0]], %[[ENTRY]] ], [ [[TMP2:%.*]], %[[DO_BODY]] ]701; GFX7-NEXT:    [[TMP2]] = load <4 x i8>, ptr addrspace(3) [[GEP0]], align 8702; GFX7-NEXT:    store <4 x i8> [[TMP1]], ptr addrspace(3) [[GEP0]], align 2703; GFX7-NEXT:    [[TMP3:%.*]] = shufflevector <4 x i8> [[TMP1]], <4 x i8> poison, <16 x i32> <i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison>704; GFX7-NEXT:    store <16 x i8> [[TMP3]], ptr addrspace(3) [[INPTR1]], align 2705; GFX7-NEXT:    [[CMP:%.*]] = icmp eq i32 [[FLAG]], 0706; GFX7-NEXT:    br i1 [[CMP]], label %[[EXIT:.*]], label %[[DO_BODY]]707; GFX7:       [[EXIT]]:708; GFX7-NEXT:    store <16 x i8> [[TMP3]], ptr [[OUT]], align 16709; GFX7-NEXT:    store <16 x i8> [[TMP3]], ptr [[OUT1]], align 16710; GFX7-NEXT:    ret void711;712; GFX8-LABEL: define protected amdgpu_kernel void @phi_4_with_stores(713; GFX8-SAME: ptr addrspace(3) [[INPTR0:%.*]], ptr addrspace(3) [[INPTR1:%.*]], ptr [[OUT:%.*]], ptr [[OUT1:%.*]], i32 [[FLAG:%.*]]) #[[ATTR0]] {714; GFX8-NEXT:  [[ENTRY:.*]]:715; GFX8-NEXT:    [[GEP0:%.*]] = getelementptr i8, ptr addrspace(3) [[INPTR0]], i32 0716; GFX8-NEXT:    [[TMP0:%.*]] = load <4 x i8>, ptr addrspace(3) [[GEP0]], align 8717; GFX8-NEXT:    br label %[[DO_BODY:.*]]718; GFX8:       [[DO_BODY]]:719; GFX8-NEXT:    [[TMP1:%.*]] = phi <4 x i8> [ [[TMP0]], %[[ENTRY]] ], [ [[TMP2:%.*]], %[[DO_BODY]] ]720; GFX8-NEXT:    [[TMP2]] = load <4 x i8>, ptr addrspace(3) [[GEP0]], align 8721; GFX8-NEXT:    store <4 x i8> [[TMP1]], ptr addrspace(3) [[GEP0]], align 2722; GFX8-NEXT:    [[TMP3:%.*]] = shufflevector <4 x i8> [[TMP1]], <4 x i8> poison, <16 x i32> <i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison>723; GFX8-NEXT:    store <16 x i8> [[TMP3]], ptr addrspace(3) [[INPTR1]], align 2724; GFX8-NEXT:    [[CMP:%.*]] = icmp eq i32 [[FLAG]], 0725; GFX8-NEXT:    br i1 [[CMP]], label %[[EXIT:.*]], label %[[DO_BODY]]726; GFX8:       [[EXIT]]:727; GFX8-NEXT:    store <16 x i8> [[TMP3]], ptr [[OUT]], align 16728; GFX8-NEXT:    store <16 x i8> [[TMP3]], ptr [[OUT1]], align 16729; GFX8-NEXT:    ret void730;731; GFX9-LABEL: define protected amdgpu_kernel void @phi_4_with_stores(732; GFX9-SAME: ptr addrspace(3) [[INPTR0:%.*]], ptr addrspace(3) [[INPTR1:%.*]], ptr [[OUT:%.*]], ptr [[OUT1:%.*]], i32 [[FLAG:%.*]]) #[[ATTR0]] {733; GFX9-NEXT:  [[ENTRY:.*]]:734; GFX9-NEXT:    [[GEP0:%.*]] = getelementptr i8, ptr addrspace(3) [[INPTR0]], i32 0735; GFX9-NEXT:    [[TMP0:%.*]] = load <4 x i8>, ptr addrspace(3) [[GEP0]], align 8736; GFX9-NEXT:    br label %[[DO_BODY:.*]]737; GFX9:       [[DO_BODY]]:738; GFX9-NEXT:    [[TMP1:%.*]] = phi <4 x i8> [ [[TMP0]], %[[ENTRY]] ], [ [[TMP2:%.*]], %[[DO_BODY]] ]739; GFX9-NEXT:    [[TMP2]] = load <4 x i8>, ptr addrspace(3) [[GEP0]], align 8740; GFX9-NEXT:    store <4 x i8> [[TMP1]], ptr addrspace(3) [[GEP0]], align 2741; GFX9-NEXT:    [[TMP3:%.*]] = shufflevector <4 x i8> [[TMP1]], <4 x i8> poison, <16 x i32> <i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison>742; GFX9-NEXT:    store <16 x i8> [[TMP3]], ptr addrspace(3) [[INPTR1]], align 2743; GFX9-NEXT:    [[CMP:%.*]] = icmp eq i32 [[FLAG]], 0744; GFX9-NEXT:    br i1 [[CMP]], label %[[EXIT:.*]], label %[[DO_BODY]]745; GFX9:       [[EXIT]]:746; GFX9-NEXT:    store <16 x i8> [[TMP3]], ptr [[OUT]], align 16747; GFX9-NEXT:    store <16 x i8> [[TMP3]], ptr [[OUT1]], align 16748; GFX9-NEXT:    ret void749;750entry:751  %gep0 = getelementptr i8, ptr addrspace(3) %inptr0, i32 0752  %ele0 = load i8, ptr addrspace(3) %gep0, align 8753  %gep1 = getelementptr i8, ptr addrspace(3) %inptr0, i32 1754  %ele1 = load i8, ptr addrspace(3) %gep1, align 1755  %gep2 = getelementptr i8, ptr addrspace(3) %inptr0, i32 2756  %ele2 = load i8, ptr addrspace(3) %gep2, align 2757  %gep3 = getelementptr i8, ptr addrspace(3) %inptr0, i32 3758  %ele3 = load i8, ptr addrspace(3) %gep3, align 1759  br label %do.body760 761do.body:762  %phi0 = phi i8 [ %ele3, %entry ], [ %otherele3, %do.body ]763  %phi1 = phi i8 [ %ele2, %entry ], [ %otherele2, %do.body ]764  %phi2 = phi i8 [ %ele1, %entry ], [ %otherele1, %do.body ]765  %phi3 = phi i8 [ %ele0, %entry ], [ %otherele0, %do.body ]766  %otherele0 = load i8, ptr addrspace(3) %gep0, align 8767  %otherele1 = load i8, ptr addrspace(3) %gep1, align 1768  %otherele2 = load i8, ptr addrspace(3) %gep2, align 2769  %otherele3 = load i8, ptr addrspace(3) %gep3, align 1770  store i8 %phi3, ptr addrspace(3) %gep0, align 2771  store i8 %phi2, ptr addrspace(3) %gep1, align 2772  store i8 %phi1, ptr addrspace(3) %gep2, align 2773  store i8 %phi0, ptr addrspace(3) %gep3, align 2774  %vec10 = insertelement <16 x i8> poison, i8 %phi3, i64 8775  %vec11 = insertelement <16 x i8> %vec10, i8 %phi2, i64 9776  %vec12 = insertelement <16 x i8> %vec11, i8 %phi1, i64 10777  %vec13 = insertelement <16 x i8> %vec12, i8 %phi0, i64 11778  store <16 x i8> %vec13, ptr addrspace(3) %inptr1, align 2779  %cmp = icmp eq i32 %flag, 0780  br i1 %cmp, label %exit, label %do.body781 782exit:783  store <16 x i8> %vec13, ptr %out784  store <16 x i8> %vec13, ptr %out1785  ret void786}787 788define protected amdgpu_kernel void @phi_4_with_stores_outside_loop(<4 x i8> %inptr0, ptr addrspace(3) %inptr1, ptr %out, ptr addrspace(3) %out1, i32 %flag) {789; GFX7-LABEL: define protected amdgpu_kernel void @phi_4_with_stores_outside_loop(790; GFX7-SAME: <4 x i8> [[INPTR0:%.*]], ptr addrspace(3) [[INPTR1:%.*]], ptr [[OUT:%.*]], ptr addrspace(3) [[OUT1:%.*]], i32 [[FLAG:%.*]]) #[[ATTR0]] {791; GFX7-NEXT:  [[ENTRY:.*]]:792; GFX7-NEXT:    br label %[[DO_BODY:.*]]793; GFX7:       [[DO_BODY]]:794; GFX7-NEXT:    [[TMP0:%.*]] = phi <4 x i8> [ [[INPTR0]], %[[ENTRY]] ], [ [[INPTR0]], %[[DO_BODY]] ]795; GFX7-NEXT:    [[GEP4:%.*]] = getelementptr i8, ptr addrspace(3) [[INPTR1]], i32 8796; GFX7-NEXT:    store <4 x i8> [[TMP0]], ptr addrspace(3) [[GEP4]], align 2797; GFX7-NEXT:    [[CMP:%.*]] = icmp eq i32 [[FLAG]], 0798; GFX7-NEXT:    br i1 [[CMP]], label %[[EXIT:.*]], label %[[DO_BODY]]799; GFX7:       [[EXIT]]:800; GFX7-NEXT:    [[GEP0:%.*]] = getelementptr i8, ptr addrspace(3) [[OUT1]], i32 0801; GFX7-NEXT:    store <4 x i8> [[INPTR0]], ptr addrspace(3) [[GEP0]], align 1802; GFX7-NEXT:    ret void803;804; GFX8-LABEL: define protected amdgpu_kernel void @phi_4_with_stores_outside_loop(805; GFX8-SAME: <4 x i8> [[INPTR0:%.*]], ptr addrspace(3) [[INPTR1:%.*]], ptr [[OUT:%.*]], ptr addrspace(3) [[OUT1:%.*]], i32 [[FLAG:%.*]]) #[[ATTR0]] {806; GFX8-NEXT:  [[ENTRY:.*]]:807; GFX8-NEXT:    br label %[[DO_BODY:.*]]808; GFX8:       [[DO_BODY]]:809; GFX8-NEXT:    [[TMP0:%.*]] = phi <4 x i8> [ [[INPTR0]], %[[ENTRY]] ], [ [[INPTR0]], %[[DO_BODY]] ]810; GFX8-NEXT:    [[GEP4:%.*]] = getelementptr i8, ptr addrspace(3) [[INPTR1]], i32 8811; GFX8-NEXT:    store <4 x i8> [[TMP0]], ptr addrspace(3) [[GEP4]], align 2812; GFX8-NEXT:    [[CMP:%.*]] = icmp eq i32 [[FLAG]], 0813; GFX8-NEXT:    br i1 [[CMP]], label %[[EXIT:.*]], label %[[DO_BODY]]814; GFX8:       [[EXIT]]:815; GFX8-NEXT:    [[GEP0:%.*]] = getelementptr i8, ptr addrspace(3) [[OUT1]], i32 0816; GFX8-NEXT:    store <4 x i8> [[INPTR0]], ptr addrspace(3) [[GEP0]], align 1817; GFX8-NEXT:    ret void818;819; GFX9-LABEL: define protected amdgpu_kernel void @phi_4_with_stores_outside_loop(820; GFX9-SAME: <4 x i8> [[INPTR0:%.*]], ptr addrspace(3) [[INPTR1:%.*]], ptr [[OUT:%.*]], ptr addrspace(3) [[OUT1:%.*]], i32 [[FLAG:%.*]]) #[[ATTR0]] {821; GFX9-NEXT:  [[ENTRY:.*]]:822; GFX9-NEXT:    br label %[[DO_BODY:.*]]823; GFX9:       [[DO_BODY]]:824; GFX9-NEXT:    [[TMP0:%.*]] = phi <4 x i8> [ [[INPTR0]], %[[ENTRY]] ], [ [[INPTR0]], %[[DO_BODY]] ]825; GFX9-NEXT:    [[GEP4:%.*]] = getelementptr i8, ptr addrspace(3) [[INPTR1]], i32 8826; GFX9-NEXT:    store <4 x i8> [[TMP0]], ptr addrspace(3) [[GEP4]], align 2827; GFX9-NEXT:    [[CMP:%.*]] = icmp eq i32 [[FLAG]], 0828; GFX9-NEXT:    br i1 [[CMP]], label %[[EXIT:.*]], label %[[DO_BODY]]829; GFX9:       [[EXIT]]:830; GFX9-NEXT:    [[GEP0:%.*]] = getelementptr i8, ptr addrspace(3) [[OUT1]], i32 0831; GFX9-NEXT:    store <4 x i8> [[INPTR0]], ptr addrspace(3) [[GEP0]], align 1832; GFX9-NEXT:    ret void833;834entry:835  %ele0 = extractelement <4 x i8> %inptr0, i32 0836  %ele1 = extractelement <4 x i8> %inptr0, i32 1837  %ele2 = extractelement <4 x i8> %inptr0, i32 2838  %ele3 = extractelement <4 x i8> %inptr0, i32 3839  br label %do.body840 841do.body:842  %phi0 = phi i8 [ %ele3, %entry ], [ %otherele3, %do.body ]843  %phi1 = phi i8 [ %ele2, %entry ], [ %otherele2, %do.body ]844  %phi2 = phi i8 [ %ele1, %entry ], [ %otherele1, %do.body ]845  %phi3 = phi i8 [ %ele0, %entry ], [ %otherele0, %do.body ]846  %otherele0 = extractelement <4 x i8> %inptr0, i32 0847  %otherele1 = extractelement <4 x i8> %inptr0, i32 1848  %otherele2 = extractelement <4 x i8> %inptr0, i32 2849  %otherele3 = extractelement <4 x i8> %inptr0, i32 3850  %gep4 = getelementptr i8, ptr addrspace(3) %inptr1, i32 8851  store i8 %phi3, ptr addrspace(3) %gep4, align 2852  %gep5 = getelementptr i8, ptr addrspace(3) %inptr1, i32 9853  store i8 %phi2, ptr addrspace(3) %gep5, align 2854  %gep6 = getelementptr i8, ptr addrspace(3) %inptr1, i32 10855  store i8 %phi1, ptr addrspace(3) %gep6, align 2856  %gep7 = getelementptr i8, ptr addrspace(3) %inptr1, i32 11857  store i8 %phi0, ptr addrspace(3) %gep7, align 2858  %cmp = icmp eq i32 %flag, 0859  br i1 %cmp, label %exit, label %do.body860 861exit:862  %gep0 = getelementptr i8, ptr addrspace(3) %out1, i32 0863  %gep1 = getelementptr i8, ptr addrspace(3) %out1, i32 1864  %gep2 = getelementptr i8, ptr addrspace(3) %out1, i32 2865  %gep3 = getelementptr i8, ptr addrspace(3) %out1, i32 3866  store i8 %otherele0, ptr addrspace(3) %gep0867  store i8 %otherele1, ptr addrspace(3) %gep1868  store i8 %otherele2, ptr addrspace(3) %gep2869  store i8 %otherele3, ptr addrspace(3) %gep3870  ret void871}872