822 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 52 3; RUN: opt -mtriple=riscv64 -mattr=+m,+v,+unaligned-vector-mem -passes=slp-vectorizer -S < %s | FileCheck %s4 5define void @const_stride_1_no_reordering(ptr %pl, ptr %ps) {6; CHECK-LABEL: define void @const_stride_1_no_reordering(7; CHECK-SAME: ptr [[PL:%.*]], ptr [[PS:%.*]]) #[[ATTR0:[0-9]+]] {8; CHECK-NEXT: [[GEP_L0:%.*]] = getelementptr inbounds i8, ptr [[PL]], i64 09; CHECK-NEXT: [[GEP_S0:%.*]] = getelementptr inbounds i8, ptr [[PS]], i64 010; CHECK-NEXT: [[TMP1:%.*]] = load <16 x i8>, ptr [[GEP_L0]], align 111; CHECK-NEXT: store <16 x i8> [[TMP1]], ptr [[GEP_S0]], align 112; CHECK-NEXT: ret void13;14 %gep_l0 = getelementptr inbounds i8, ptr %pl, i64 015 %gep_l1 = getelementptr inbounds i8, ptr %pl, i64 116 %gep_l2 = getelementptr inbounds i8, ptr %pl, i64 217 %gep_l3 = getelementptr inbounds i8, ptr %pl, i64 318 %gep_l4 = getelementptr inbounds i8, ptr %pl, i64 419 %gep_l5 = getelementptr inbounds i8, ptr %pl, i64 520 %gep_l6 = getelementptr inbounds i8, ptr %pl, i64 621 %gep_l7 = getelementptr inbounds i8, ptr %pl, i64 722 %gep_l8 = getelementptr inbounds i8, ptr %pl, i64 823 %gep_l9 = getelementptr inbounds i8, ptr %pl, i64 924 %gep_l10 = getelementptr inbounds i8, ptr %pl, i64 1025 %gep_l11 = getelementptr inbounds i8, ptr %pl, i64 1126 %gep_l12 = getelementptr inbounds i8, ptr %pl, i64 1227 %gep_l13 = getelementptr inbounds i8, ptr %pl, i64 1328 %gep_l14 = getelementptr inbounds i8, ptr %pl, i64 1429 %gep_l15 = getelementptr inbounds i8, ptr %pl, i64 1530 31 %load0 = load i8, ptr %gep_l0 , align 132 %load1 = load i8, ptr %gep_l1 , align 133 %load2 = load i8, ptr %gep_l2 , align 134 %load3 = load i8, ptr %gep_l3 , align 135 %load4 = load i8, ptr %gep_l4 , align 136 %load5 = load i8, ptr %gep_l5 , align 137 %load6 = load i8, ptr %gep_l6 , align 138 %load7 = load i8, ptr %gep_l7 , align 139 %load8 = load i8, ptr %gep_l8 , align 140 %load9 = load i8, ptr %gep_l9 , align 141 %load10 = load i8, ptr %gep_l10, align 142 %load11 = load i8, ptr %gep_l11, align 143 %load12 = load i8, ptr %gep_l12, align 144 %load13 = load i8, ptr %gep_l13, align 145 %load14 = load i8, ptr %gep_l14, align 146 %load15 = load i8, ptr %gep_l15, align 147 48 %gep_s0 = getelementptr inbounds i8, ptr %ps, i64 049 %gep_s1 = getelementptr inbounds i8, ptr %ps, i64 150 %gep_s2 = getelementptr inbounds i8, ptr %ps, i64 251 %gep_s3 = getelementptr inbounds i8, ptr %ps, i64 352 %gep_s4 = getelementptr inbounds i8, ptr %ps, i64 453 %gep_s5 = getelementptr inbounds i8, ptr %ps, i64 554 %gep_s6 = getelementptr inbounds i8, ptr %ps, i64 655 %gep_s7 = getelementptr inbounds i8, ptr %ps, i64 756 %gep_s8 = getelementptr inbounds i8, ptr %ps, i64 857 %gep_s9 = getelementptr inbounds i8, ptr %ps, i64 958 %gep_s10 = getelementptr inbounds i8, ptr %ps, i64 1059 %gep_s11 = getelementptr inbounds i8, ptr %ps, i64 1160 %gep_s12 = getelementptr inbounds i8, ptr %ps, i64 1261 %gep_s13 = getelementptr inbounds i8, ptr %ps, i64 1362 %gep_s14 = getelementptr inbounds i8, ptr %ps, i64 1463 %gep_s15 = getelementptr inbounds i8, ptr %ps, i64 1564 65 store i8 %load0, ptr %gep_s0, align 166 store i8 %load1, ptr %gep_s1, align 167 store i8 %load2, ptr %gep_s2, align 168 store i8 %load3, ptr %gep_s3, align 169 store i8 %load4, ptr %gep_s4, align 170 store i8 %load5, ptr %gep_s5, align 171 store i8 %load6, ptr %gep_s6, align 172 store i8 %load7, ptr %gep_s7, align 173 store i8 %load8, ptr %gep_s8, align 174 store i8 %load9, ptr %gep_s9, align 175 store i8 %load10, ptr %gep_s10, align 176 store i8 %load11, ptr %gep_s11, align 177 store i8 %load12, ptr %gep_s12, align 178 store i8 %load13, ptr %gep_s13, align 179 store i8 %load14, ptr %gep_s14, align 180 store i8 %load15, ptr %gep_s15, align 181 82 ret void83}84 85define void @const_stride_1_with_reordering(ptr %pl, ptr %ps) {86; CHECK-LABEL: define void @const_stride_1_with_reordering(87; CHECK-SAME: ptr [[PL:%.*]], ptr [[PS:%.*]]) #[[ATTR0]] {88; CHECK-NEXT: [[GEP_L0:%.*]] = getelementptr inbounds i8, ptr [[PL]], i64 089; CHECK-NEXT: [[GEP_S0:%.*]] = getelementptr inbounds i8, ptr [[PS]], i64 090; CHECK-NEXT: [[TMP1:%.*]] = load <16 x i8>, ptr [[GEP_L0]], align 191; CHECK-NEXT: [[TMP2:%.*]] = shufflevector <16 x i8> [[TMP1]], <16 x i8> poison, <16 x i32> <i32 1, i32 0, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>92; CHECK-NEXT: store <16 x i8> [[TMP2]], ptr [[GEP_S0]], align 193; CHECK-NEXT: ret void94;95 %gep_l0 = getelementptr inbounds i8, ptr %pl, i64 096 %gep_l1 = getelementptr inbounds i8, ptr %pl, i64 197 %gep_l2 = getelementptr inbounds i8, ptr %pl, i64 298 %gep_l3 = getelementptr inbounds i8, ptr %pl, i64 399 %gep_l4 = getelementptr inbounds i8, ptr %pl, i64 4100 %gep_l5 = getelementptr inbounds i8, ptr %pl, i64 5101 %gep_l6 = getelementptr inbounds i8, ptr %pl, i64 6102 %gep_l7 = getelementptr inbounds i8, ptr %pl, i64 7103 %gep_l8 = getelementptr inbounds i8, ptr %pl, i64 8104 %gep_l9 = getelementptr inbounds i8, ptr %pl, i64 9105 %gep_l10 = getelementptr inbounds i8, ptr %pl, i64 10106 %gep_l11 = getelementptr inbounds i8, ptr %pl, i64 11107 %gep_l12 = getelementptr inbounds i8, ptr %pl, i64 12108 %gep_l13 = getelementptr inbounds i8, ptr %pl, i64 13109 %gep_l14 = getelementptr inbounds i8, ptr %pl, i64 14110 %gep_l15 = getelementptr inbounds i8, ptr %pl, i64 15111 112 %load0 = load i8, ptr %gep_l0 , align 1113 %load1 = load i8, ptr %gep_l1 , align 1114 %load2 = load i8, ptr %gep_l2 , align 1115 %load3 = load i8, ptr %gep_l3 , align 1116 %load4 = load i8, ptr %gep_l4 , align 1117 %load5 = load i8, ptr %gep_l5 , align 1118 %load6 = load i8, ptr %gep_l6 , align 1119 %load7 = load i8, ptr %gep_l7 , align 1120 %load8 = load i8, ptr %gep_l8 , align 1121 %load9 = load i8, ptr %gep_l9 , align 1122 %load10 = load i8, ptr %gep_l10, align 1123 %load11 = load i8, ptr %gep_l11, align 1124 %load12 = load i8, ptr %gep_l12, align 1125 %load13 = load i8, ptr %gep_l13, align 1126 %load14 = load i8, ptr %gep_l14, align 1127 %load15 = load i8, ptr %gep_l15, align 1128 129 %gep_s0 = getelementptr inbounds i8, ptr %ps, i64 0130 %gep_s1 = getelementptr inbounds i8, ptr %ps, i64 1131 %gep_s2 = getelementptr inbounds i8, ptr %ps, i64 2132 %gep_s3 = getelementptr inbounds i8, ptr %ps, i64 3133 %gep_s4 = getelementptr inbounds i8, ptr %ps, i64 4134 %gep_s5 = getelementptr inbounds i8, ptr %ps, i64 5135 %gep_s6 = getelementptr inbounds i8, ptr %ps, i64 6136 %gep_s7 = getelementptr inbounds i8, ptr %ps, i64 7137 %gep_s8 = getelementptr inbounds i8, ptr %ps, i64 8138 %gep_s9 = getelementptr inbounds i8, ptr %ps, i64 9139 %gep_s10 = getelementptr inbounds i8, ptr %ps, i64 10140 %gep_s11 = getelementptr inbounds i8, ptr %ps, i64 11141 %gep_s12 = getelementptr inbounds i8, ptr %ps, i64 12142 %gep_s13 = getelementptr inbounds i8, ptr %ps, i64 13143 %gep_s14 = getelementptr inbounds i8, ptr %ps, i64 14144 %gep_s15 = getelementptr inbounds i8, ptr %ps, i64 15145 146 ; NOTE: value from %load1 in stored in %gep_s0147 store i8 %load1, ptr %gep_s0, align 1148 store i8 %load0, ptr %gep_s1, align 1149 store i8 %load2, ptr %gep_s2, align 1150 store i8 %load3, ptr %gep_s3, align 1151 store i8 %load4, ptr %gep_s4, align 1152 store i8 %load5, ptr %gep_s5, align 1153 store i8 %load6, ptr %gep_s6, align 1154 store i8 %load7, ptr %gep_s7, align 1155 store i8 %load8, ptr %gep_s8, align 1156 store i8 %load9, ptr %gep_s9, align 1157 store i8 %load10, ptr %gep_s10, align 1158 store i8 %load11, ptr %gep_s11, align 1159 store i8 %load12, ptr %gep_s12, align 1160 store i8 %load13, ptr %gep_s13, align 1161 store i8 %load14, ptr %gep_s14, align 1162 store i8 %load15, ptr %gep_s15, align 1163 164 ret void165}166 167 168define void @const_stride_2_no_reordering(ptr %pl, ptr %ps) {169; CHECK-LABEL: define void @const_stride_2_no_reordering(170; CHECK-SAME: ptr [[PL:%.*]], ptr [[PS:%.*]]) #[[ATTR0]] {171; CHECK-NEXT: [[GEP_L0:%.*]] = getelementptr inbounds i8, ptr [[PL]], i64 0172; CHECK-NEXT: [[GEP_S0:%.*]] = getelementptr inbounds i8, ptr [[PS]], i64 0173; CHECK-NEXT: [[TMP2:%.*]] = call <31 x i8> @llvm.masked.load.v31i8.p0(ptr align 1 [[GEP_L0]], <31 x i1> <i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true>, <31 x i8> poison)174; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <31 x i8> [[TMP2]], <31 x i8> poison, <16 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14, i32 16, i32 18, i32 20, i32 22, i32 24, i32 26, i32 28, i32 30>175; CHECK-NEXT: store <16 x i8> [[TMP1]], ptr [[GEP_S0]], align 1176; CHECK-NEXT: ret void177;178 %gep_l0 = getelementptr inbounds i8, ptr %pl, i64 0179 %gep_l1 = getelementptr inbounds i8, ptr %pl, i64 2180 %gep_l2 = getelementptr inbounds i8, ptr %pl, i64 4181 %gep_l3 = getelementptr inbounds i8, ptr %pl, i64 6182 %gep_l4 = getelementptr inbounds i8, ptr %pl, i64 8183 %gep_l5 = getelementptr inbounds i8, ptr %pl, i64 10184 %gep_l6 = getelementptr inbounds i8, ptr %pl, i64 12185 %gep_l7 = getelementptr inbounds i8, ptr %pl, i64 14186 %gep_l8 = getelementptr inbounds i8, ptr %pl, i64 16187 %gep_l9 = getelementptr inbounds i8, ptr %pl, i64 18188 %gep_l10 = getelementptr inbounds i8, ptr %pl, i64 20189 %gep_l11 = getelementptr inbounds i8, ptr %pl, i64 22190 %gep_l12 = getelementptr inbounds i8, ptr %pl, i64 24191 %gep_l13 = getelementptr inbounds i8, ptr %pl, i64 26192 %gep_l14 = getelementptr inbounds i8, ptr %pl, i64 28193 %gep_l15 = getelementptr inbounds i8, ptr %pl, i64 30194 195 %load0 = load i8, ptr %gep_l0 , align 1196 %load1 = load i8, ptr %gep_l1 , align 1197 %load2 = load i8, ptr %gep_l2 , align 1198 %load3 = load i8, ptr %gep_l3 , align 1199 %load4 = load i8, ptr %gep_l4 , align 1200 %load5 = load i8, ptr %gep_l5 , align 1201 %load6 = load i8, ptr %gep_l6 , align 1202 %load7 = load i8, ptr %gep_l7 , align 1203 %load8 = load i8, ptr %gep_l8 , align 1204 %load9 = load i8, ptr %gep_l9 , align 1205 %load10 = load i8, ptr %gep_l10, align 1206 %load11 = load i8, ptr %gep_l11, align 1207 %load12 = load i8, ptr %gep_l12, align 1208 %load13 = load i8, ptr %gep_l13, align 1209 %load14 = load i8, ptr %gep_l14, align 1210 %load15 = load i8, ptr %gep_l15, align 1211 212 %gep_s0 = getelementptr inbounds i8, ptr %ps, i64 0213 %gep_s1 = getelementptr inbounds i8, ptr %ps, i64 1214 %gep_s2 = getelementptr inbounds i8, ptr %ps, i64 2215 %gep_s3 = getelementptr inbounds i8, ptr %ps, i64 3216 %gep_s4 = getelementptr inbounds i8, ptr %ps, i64 4217 %gep_s5 = getelementptr inbounds i8, ptr %ps, i64 5218 %gep_s6 = getelementptr inbounds i8, ptr %ps, i64 6219 %gep_s7 = getelementptr inbounds i8, ptr %ps, i64 7220 %gep_s8 = getelementptr inbounds i8, ptr %ps, i64 8221 %gep_s9 = getelementptr inbounds i8, ptr %ps, i64 9222 %gep_s10 = getelementptr inbounds i8, ptr %ps, i64 10223 %gep_s11 = getelementptr inbounds i8, ptr %ps, i64 11224 %gep_s12 = getelementptr inbounds i8, ptr %ps, i64 12225 %gep_s13 = getelementptr inbounds i8, ptr %ps, i64 13226 %gep_s14 = getelementptr inbounds i8, ptr %ps, i64 14227 %gep_s15 = getelementptr inbounds i8, ptr %ps, i64 15228 229 store i8 %load0, ptr %gep_s0, align 1230 store i8 %load1, ptr %gep_s1, align 1231 store i8 %load2, ptr %gep_s2, align 1232 store i8 %load3, ptr %gep_s3, align 1233 store i8 %load4, ptr %gep_s4, align 1234 store i8 %load5, ptr %gep_s5, align 1235 store i8 %load6, ptr %gep_s6, align 1236 store i8 %load7, ptr %gep_s7, align 1237 store i8 %load8, ptr %gep_s8, align 1238 store i8 %load9, ptr %gep_s9, align 1239 store i8 %load10, ptr %gep_s10, align 1240 store i8 %load11, ptr %gep_s11, align 1241 store i8 %load12, ptr %gep_s12, align 1242 store i8 %load13, ptr %gep_s13, align 1243 store i8 %load14, ptr %gep_s14, align 1244 store i8 %load15, ptr %gep_s15, align 1245 246 ret void247}248 249define void @const_stride_2_with_reordering(ptr %pl, ptr %ps) {250; CHECK-LABEL: define void @const_stride_2_with_reordering(251; CHECK-SAME: ptr [[PL:%.*]], ptr [[PS:%.*]]) #[[ATTR0]] {252; CHECK-NEXT: [[GEP_L0:%.*]] = getelementptr inbounds i8, ptr [[PL]], i64 0253; CHECK-NEXT: [[GEP_S0:%.*]] = getelementptr inbounds i8, ptr [[PS]], i64 0254; CHECK-NEXT: [[TMP1:%.*]] = call <31 x i8> @llvm.masked.load.v31i8.p0(ptr align 1 [[GEP_L0]], <31 x i1> <i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true>, <31 x i8> poison)255; CHECK-NEXT: [[TMP3:%.*]] = shufflevector <31 x i8> [[TMP1]], <31 x i8> poison, <16 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14, i32 16, i32 18, i32 20, i32 22, i32 24, i32 26, i32 28, i32 30>256; CHECK-NEXT: [[TMP2:%.*]] = shufflevector <31 x i8> [[TMP1]], <31 x i8> poison, <16 x i32> <i32 2, i32 0, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14, i32 16, i32 18, i32 20, i32 22, i32 24, i32 26, i32 28, i32 30>257; CHECK-NEXT: store <16 x i8> [[TMP2]], ptr [[GEP_S0]], align 1258; CHECK-NEXT: ret void259;260 %gep_l0 = getelementptr inbounds i8, ptr %pl, i64 0261 %gep_l1 = getelementptr inbounds i8, ptr %pl, i64 2262 %gep_l2 = getelementptr inbounds i8, ptr %pl, i64 4263 %gep_l3 = getelementptr inbounds i8, ptr %pl, i64 6264 %gep_l4 = getelementptr inbounds i8, ptr %pl, i64 8265 %gep_l5 = getelementptr inbounds i8, ptr %pl, i64 10266 %gep_l6 = getelementptr inbounds i8, ptr %pl, i64 12267 %gep_l7 = getelementptr inbounds i8, ptr %pl, i64 14268 %gep_l8 = getelementptr inbounds i8, ptr %pl, i64 16269 %gep_l9 = getelementptr inbounds i8, ptr %pl, i64 18270 %gep_l10 = getelementptr inbounds i8, ptr %pl, i64 20271 %gep_l11 = getelementptr inbounds i8, ptr %pl, i64 22272 %gep_l12 = getelementptr inbounds i8, ptr %pl, i64 24273 %gep_l13 = getelementptr inbounds i8, ptr %pl, i64 26274 %gep_l14 = getelementptr inbounds i8, ptr %pl, i64 28275 %gep_l15 = getelementptr inbounds i8, ptr %pl, i64 30276 277 %load0 = load i8, ptr %gep_l0 , align 1278 %load1 = load i8, ptr %gep_l1 , align 1279 %load2 = load i8, ptr %gep_l2 , align 1280 %load3 = load i8, ptr %gep_l3 , align 1281 %load4 = load i8, ptr %gep_l4 , align 1282 %load5 = load i8, ptr %gep_l5 , align 1283 %load6 = load i8, ptr %gep_l6 , align 1284 %load7 = load i8, ptr %gep_l7 , align 1285 %load8 = load i8, ptr %gep_l8 , align 1286 %load9 = load i8, ptr %gep_l9 , align 1287 %load10 = load i8, ptr %gep_l10, align 1288 %load11 = load i8, ptr %gep_l11, align 1289 %load12 = load i8, ptr %gep_l12, align 1290 %load13 = load i8, ptr %gep_l13, align 1291 %load14 = load i8, ptr %gep_l14, align 1292 %load15 = load i8, ptr %gep_l15, align 1293 294 %gep_s0 = getelementptr inbounds i8, ptr %ps, i64 0295 %gep_s1 = getelementptr inbounds i8, ptr %ps, i64 1296 %gep_s2 = getelementptr inbounds i8, ptr %ps, i64 2297 %gep_s3 = getelementptr inbounds i8, ptr %ps, i64 3298 %gep_s4 = getelementptr inbounds i8, ptr %ps, i64 4299 %gep_s5 = getelementptr inbounds i8, ptr %ps, i64 5300 %gep_s6 = getelementptr inbounds i8, ptr %ps, i64 6301 %gep_s7 = getelementptr inbounds i8, ptr %ps, i64 7302 %gep_s8 = getelementptr inbounds i8, ptr %ps, i64 8303 %gep_s9 = getelementptr inbounds i8, ptr %ps, i64 9304 %gep_s10 = getelementptr inbounds i8, ptr %ps, i64 10305 %gep_s11 = getelementptr inbounds i8, ptr %ps, i64 11306 %gep_s12 = getelementptr inbounds i8, ptr %ps, i64 12307 %gep_s13 = getelementptr inbounds i8, ptr %ps, i64 13308 %gep_s14 = getelementptr inbounds i8, ptr %ps, i64 14309 %gep_s15 = getelementptr inbounds i8, ptr %ps, i64 15310 311 store i8 %load1, ptr %gep_s0, align 1312 store i8 %load0, ptr %gep_s1, align 1313 store i8 %load2, ptr %gep_s2, align 1314 store i8 %load3, ptr %gep_s3, align 1315 store i8 %load4, ptr %gep_s4, align 1316 store i8 %load5, ptr %gep_s5, align 1317 store i8 %load6, ptr %gep_s6, align 1318 store i8 %load7, ptr %gep_s7, align 1319 store i8 %load8, ptr %gep_s8, align 1320 store i8 %load9, ptr %gep_s9, align 1321 store i8 %load10, ptr %gep_s10, align 1322 store i8 %load11, ptr %gep_s11, align 1323 store i8 %load12, ptr %gep_s12, align 1324 store i8 %load13, ptr %gep_s13, align 1325 store i8 %load14, ptr %gep_s14, align 1326 store i8 %load15, ptr %gep_s15, align 1327 328 ret void329}330 331define void @rt_stride_1_no_reordering(ptr %pl, i64 %stride, ptr %ps) {332; CHECK-LABEL: define void @rt_stride_1_no_reordering(333; CHECK-SAME: ptr [[PL:%.*]], i64 [[STRIDE:%.*]], ptr [[PS:%.*]]) #[[ATTR0]] {334; CHECK-NEXT: [[STRIDE0:%.*]] = mul nsw i64 [[STRIDE]], 0335; CHECK-NEXT: [[GEP_L0:%.*]] = getelementptr inbounds i8, ptr [[PL]], i64 [[STRIDE0]]336; CHECK-NEXT: [[GEP_S0:%.*]] = getelementptr inbounds i8, ptr [[PS]], i64 0337; CHECK-NEXT: [[TMP1:%.*]] = mul i64 [[STRIDE]], 1338; CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.experimental.vp.strided.load.v16i8.p0.i64(ptr align 1 [[GEP_L0]], i64 [[TMP1]], <16 x i1> splat (i1 true), i32 16)339; CHECK-NEXT: store <16 x i8> [[TMP2]], ptr [[GEP_S0]], align 1340; CHECK-NEXT: ret void341;342 %stride0 = mul nsw i64 %stride, 0343 %stride1 = mul nsw i64 %stride, 1344 %stride2 = mul nsw i64 %stride, 2345 %stride3 = mul nsw i64 %stride, 3346 %stride4 = mul nsw i64 %stride, 4347 %stride5 = mul nsw i64 %stride, 5348 %stride6 = mul nsw i64 %stride, 6349 %stride7 = mul nsw i64 %stride, 7350 %stride8 = mul nsw i64 %stride, 8351 %stride9 = mul nsw i64 %stride, 9352 %stride10 = mul nsw i64 %stride, 10353 %stride11 = mul nsw i64 %stride, 11354 %stride12 = mul nsw i64 %stride, 12355 %stride13 = mul nsw i64 %stride, 13356 %stride14 = mul nsw i64 %stride, 14357 %stride15 = mul nsw i64 %stride, 15358 359 %gep_l0 = getelementptr inbounds i8, ptr %pl, i64 %stride0360 %gep_l1 = getelementptr inbounds i8, ptr %pl, i64 %stride1361 %gep_l2 = getelementptr inbounds i8, ptr %pl, i64 %stride2362 %gep_l3 = getelementptr inbounds i8, ptr %pl, i64 %stride3363 %gep_l4 = getelementptr inbounds i8, ptr %pl, i64 %stride4364 %gep_l5 = getelementptr inbounds i8, ptr %pl, i64 %stride5365 %gep_l6 = getelementptr inbounds i8, ptr %pl, i64 %stride6366 %gep_l7 = getelementptr inbounds i8, ptr %pl, i64 %stride7367 %gep_l8 = getelementptr inbounds i8, ptr %pl, i64 %stride8368 %gep_l9 = getelementptr inbounds i8, ptr %pl, i64 %stride9369 %gep_l10 = getelementptr inbounds i8, ptr %pl, i64 %stride10370 %gep_l11 = getelementptr inbounds i8, ptr %pl, i64 %stride11371 %gep_l12 = getelementptr inbounds i8, ptr %pl, i64 %stride12372 %gep_l13 = getelementptr inbounds i8, ptr %pl, i64 %stride13373 %gep_l14 = getelementptr inbounds i8, ptr %pl, i64 %stride14374 %gep_l15 = getelementptr inbounds i8, ptr %pl, i64 %stride15375 376 %load0 = load i8, ptr %gep_l0 , align 1377 %load1 = load i8, ptr %gep_l1 , align 1378 %load2 = load i8, ptr %gep_l2 , align 1379 %load3 = load i8, ptr %gep_l3 , align 1380 %load4 = load i8, ptr %gep_l4 , align 1381 %load5 = load i8, ptr %gep_l5 , align 1382 %load6 = load i8, ptr %gep_l6 , align 1383 %load7 = load i8, ptr %gep_l7 , align 1384 %load8 = load i8, ptr %gep_l8 , align 1385 %load9 = load i8, ptr %gep_l9 , align 1386 %load10 = load i8, ptr %gep_l10, align 1387 %load11 = load i8, ptr %gep_l11, align 1388 %load12 = load i8, ptr %gep_l12, align 1389 %load13 = load i8, ptr %gep_l13, align 1390 %load14 = load i8, ptr %gep_l14, align 1391 %load15 = load i8, ptr %gep_l15, align 1392 393 %gep_s0 = getelementptr inbounds i8, ptr %ps, i64 0394 %gep_s1 = getelementptr inbounds i8, ptr %ps, i64 1395 %gep_s2 = getelementptr inbounds i8, ptr %ps, i64 2396 %gep_s3 = getelementptr inbounds i8, ptr %ps, i64 3397 %gep_s4 = getelementptr inbounds i8, ptr %ps, i64 4398 %gep_s5 = getelementptr inbounds i8, ptr %ps, i64 5399 %gep_s6 = getelementptr inbounds i8, ptr %ps, i64 6400 %gep_s7 = getelementptr inbounds i8, ptr %ps, i64 7401 %gep_s8 = getelementptr inbounds i8, ptr %ps, i64 8402 %gep_s9 = getelementptr inbounds i8, ptr %ps, i64 9403 %gep_s10 = getelementptr inbounds i8, ptr %ps, i64 10404 %gep_s11 = getelementptr inbounds i8, ptr %ps, i64 11405 %gep_s12 = getelementptr inbounds i8, ptr %ps, i64 12406 %gep_s13 = getelementptr inbounds i8, ptr %ps, i64 13407 %gep_s14 = getelementptr inbounds i8, ptr %ps, i64 14408 %gep_s15 = getelementptr inbounds i8, ptr %ps, i64 15409 410 store i8 %load0, ptr %gep_s0, align 1411 store i8 %load1, ptr %gep_s1, align 1412 store i8 %load2, ptr %gep_s2, align 1413 store i8 %load3, ptr %gep_s3, align 1414 store i8 %load4, ptr %gep_s4, align 1415 store i8 %load5, ptr %gep_s5, align 1416 store i8 %load6, ptr %gep_s6, align 1417 store i8 %load7, ptr %gep_s7, align 1418 store i8 %load8, ptr %gep_s8, align 1419 store i8 %load9, ptr %gep_s9, align 1420 store i8 %load10, ptr %gep_s10, align 1421 store i8 %load11, ptr %gep_s11, align 1422 store i8 %load12, ptr %gep_s12, align 1423 store i8 %load13, ptr %gep_s13, align 1424 store i8 %load14, ptr %gep_s14, align 1425 store i8 %load15, ptr %gep_s15, align 1426 427 ret void428}429 430define void @rt_stride_1_with_reordering(ptr %pl, i64 %stride, ptr %ps) {431; CHECK-LABEL: define void @rt_stride_1_with_reordering(432; CHECK-SAME: ptr [[PL:%.*]], i64 [[STRIDE:%.*]], ptr [[PS:%.*]]) #[[ATTR0]] {433; CHECK-NEXT: [[STRIDE0:%.*]] = mul nsw i64 [[STRIDE]], 0434; CHECK-NEXT: [[GEP_L0:%.*]] = getelementptr inbounds i8, ptr [[PL]], i64 [[STRIDE0]]435; CHECK-NEXT: [[GEP_S0:%.*]] = getelementptr inbounds i8, ptr [[PS]], i64 0436; CHECK-NEXT: [[TMP1:%.*]] = mul i64 [[STRIDE]], 1437; CHECK-NEXT: [[TMP2:%.*]] = call <16 x i8> @llvm.experimental.vp.strided.load.v16i8.p0.i64(ptr align 1 [[GEP_L0]], i64 [[TMP1]], <16 x i1> splat (i1 true), i32 16)438; CHECK-NEXT: [[TMP3:%.*]] = shufflevector <16 x i8> [[TMP2]], <16 x i8> poison, <16 x i32> <i32 1, i32 0, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>439; CHECK-NEXT: store <16 x i8> [[TMP3]], ptr [[GEP_S0]], align 1440; CHECK-NEXT: ret void441;442 %stride0 = mul nsw i64 %stride, 0443 %stride1 = mul nsw i64 %stride, 1444 %stride2 = mul nsw i64 %stride, 2445 %stride3 = mul nsw i64 %stride, 3446 %stride4 = mul nsw i64 %stride, 4447 %stride5 = mul nsw i64 %stride, 5448 %stride6 = mul nsw i64 %stride, 6449 %stride7 = mul nsw i64 %stride, 7450 %stride8 = mul nsw i64 %stride, 8451 %stride9 = mul nsw i64 %stride, 9452 %stride10 = mul nsw i64 %stride, 10453 %stride11 = mul nsw i64 %stride, 11454 %stride12 = mul nsw i64 %stride, 12455 %stride13 = mul nsw i64 %stride, 13456 %stride14 = mul nsw i64 %stride, 14457 %stride15 = mul nsw i64 %stride, 15458 459 %gep_l0 = getelementptr inbounds i8, ptr %pl, i64 %stride0460 %gep_l1 = getelementptr inbounds i8, ptr %pl, i64 %stride1461 %gep_l2 = getelementptr inbounds i8, ptr %pl, i64 %stride2462 %gep_l3 = getelementptr inbounds i8, ptr %pl, i64 %stride3463 %gep_l4 = getelementptr inbounds i8, ptr %pl, i64 %stride4464 %gep_l5 = getelementptr inbounds i8, ptr %pl, i64 %stride5465 %gep_l6 = getelementptr inbounds i8, ptr %pl, i64 %stride6466 %gep_l7 = getelementptr inbounds i8, ptr %pl, i64 %stride7467 %gep_l8 = getelementptr inbounds i8, ptr %pl, i64 %stride8468 %gep_l9 = getelementptr inbounds i8, ptr %pl, i64 %stride9469 %gep_l10 = getelementptr inbounds i8, ptr %pl, i64 %stride10470 %gep_l11 = getelementptr inbounds i8, ptr %pl, i64 %stride11471 %gep_l12 = getelementptr inbounds i8, ptr %pl, i64 %stride12472 %gep_l13 = getelementptr inbounds i8, ptr %pl, i64 %stride13473 %gep_l14 = getelementptr inbounds i8, ptr %pl, i64 %stride14474 %gep_l15 = getelementptr inbounds i8, ptr %pl, i64 %stride15475 476 %load0 = load i8, ptr %gep_l0 , align 1477 %load1 = load i8, ptr %gep_l1 , align 1478 %load2 = load i8, ptr %gep_l2 , align 1479 %load3 = load i8, ptr %gep_l3 , align 1480 %load4 = load i8, ptr %gep_l4 , align 1481 %load5 = load i8, ptr %gep_l5 , align 1482 %load6 = load i8, ptr %gep_l6 , align 1483 %load7 = load i8, ptr %gep_l7 , align 1484 %load8 = load i8, ptr %gep_l8 , align 1485 %load9 = load i8, ptr %gep_l9 , align 1486 %load10 = load i8, ptr %gep_l10, align 1487 %load11 = load i8, ptr %gep_l11, align 1488 %load12 = load i8, ptr %gep_l12, align 1489 %load13 = load i8, ptr %gep_l13, align 1490 %load14 = load i8, ptr %gep_l14, align 1491 %load15 = load i8, ptr %gep_l15, align 1492 493 %gep_s0 = getelementptr inbounds i8, ptr %ps, i64 0494 %gep_s1 = getelementptr inbounds i8, ptr %ps, i64 1495 %gep_s2 = getelementptr inbounds i8, ptr %ps, i64 2496 %gep_s3 = getelementptr inbounds i8, ptr %ps, i64 3497 %gep_s4 = getelementptr inbounds i8, ptr %ps, i64 4498 %gep_s5 = getelementptr inbounds i8, ptr %ps, i64 5499 %gep_s6 = getelementptr inbounds i8, ptr %ps, i64 6500 %gep_s7 = getelementptr inbounds i8, ptr %ps, i64 7501 %gep_s8 = getelementptr inbounds i8, ptr %ps, i64 8502 %gep_s9 = getelementptr inbounds i8, ptr %ps, i64 9503 %gep_s10 = getelementptr inbounds i8, ptr %ps, i64 10504 %gep_s11 = getelementptr inbounds i8, ptr %ps, i64 11505 %gep_s12 = getelementptr inbounds i8, ptr %ps, i64 12506 %gep_s13 = getelementptr inbounds i8, ptr %ps, i64 13507 %gep_s14 = getelementptr inbounds i8, ptr %ps, i64 14508 %gep_s15 = getelementptr inbounds i8, ptr %ps, i64 15509 510 store i8 %load1, ptr %gep_s0, align 1511 store i8 %load0, ptr %gep_s1, align 1512 store i8 %load2, ptr %gep_s2, align 1513 store i8 %load3, ptr %gep_s3, align 1514 store i8 %load4, ptr %gep_s4, align 1515 store i8 %load5, ptr %gep_s5, align 1516 store i8 %load6, ptr %gep_s6, align 1517 store i8 %load7, ptr %gep_s7, align 1518 store i8 %load8, ptr %gep_s8, align 1519 store i8 %load9, ptr %gep_s9, align 1520 store i8 %load10, ptr %gep_s10, align 1521 store i8 %load11, ptr %gep_s11, align 1522 store i8 %load12, ptr %gep_s12, align 1523 store i8 %load13, ptr %gep_s13, align 1524 store i8 %load14, ptr %gep_s14, align 1525 store i8 %load15, ptr %gep_s15, align 1526 527 ret void528}529 530define void @constant_stride_masked_no_reordering(ptr %pl, i64 %stride, ptr %ps) {531; CHECK-LABEL: define void @constant_stride_masked_no_reordering(532; CHECK-SAME: ptr [[PL:%.*]], i64 [[STRIDE:%.*]], ptr [[PS:%.*]]) #[[ATTR0]] {533; CHECK-NEXT: [[GEP_L0:%.*]] = getelementptr inbounds i8, ptr [[PL]], i64 0534; CHECK-NEXT: [[GEP_S0:%.*]] = getelementptr inbounds i8, ptr [[PS]], i64 0535; CHECK-NEXT: [[TMP1:%.*]] = call <28 x i8> @llvm.masked.load.v28i8.p0(ptr align 1 [[GEP_L0]], <28 x i1> <i1 true, i1 true, i1 true, i1 true, i1 false, i1 false, i1 false, i1 false, i1 true, i1 true, i1 true, i1 true, i1 false, i1 false, i1 false, i1 false, i1 true, i1 true, i1 true, i1 true, i1 false, i1 false, i1 false, i1 false, i1 true, i1 true, i1 true, i1 true>, <28 x i8> poison)536; CHECK-NEXT: [[TMP2:%.*]] = shufflevector <28 x i8> [[TMP1]], <28 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 8, i32 9, i32 10, i32 11, i32 16, i32 17, i32 18, i32 19, i32 24, i32 25, i32 26, i32 27>537; CHECK-NEXT: store <16 x i8> [[TMP2]], ptr [[GEP_S0]], align 1538; CHECK-NEXT: ret void539;540 %gep_l0 = getelementptr inbounds i8, ptr %pl, i64 0541 %gep_l1 = getelementptr inbounds i8, ptr %pl, i64 1542 %gep_l2 = getelementptr inbounds i8, ptr %pl, i64 2543 %gep_l3 = getelementptr inbounds i8, ptr %pl, i64 3544 %gep_l4 = getelementptr inbounds i8, ptr %pl, i64 8545 %gep_l5 = getelementptr inbounds i8, ptr %pl, i64 9546 %gep_l6 = getelementptr inbounds i8, ptr %pl, i64 10547 %gep_l7 = getelementptr inbounds i8, ptr %pl, i64 11548 %gep_l8 = getelementptr inbounds i8, ptr %pl, i64 16549 %gep_l9 = getelementptr inbounds i8, ptr %pl, i64 17550 %gep_l10 = getelementptr inbounds i8, ptr %pl, i64 18551 %gep_l11 = getelementptr inbounds i8, ptr %pl, i64 19552 %gep_l12 = getelementptr inbounds i8, ptr %pl, i64 24553 %gep_l13 = getelementptr inbounds i8, ptr %pl, i64 25554 %gep_l14 = getelementptr inbounds i8, ptr %pl, i64 26555 %gep_l15 = getelementptr inbounds i8, ptr %pl, i64 27556 557 %load0 = load i8, ptr %gep_l0 , align 1558 %load1 = load i8, ptr %gep_l1 , align 1559 %load2 = load i8, ptr %gep_l2 , align 1560 %load3 = load i8, ptr %gep_l3 , align 1561 %load4 = load i8, ptr %gep_l4 , align 1562 %load5 = load i8, ptr %gep_l5 , align 1563 %load6 = load i8, ptr %gep_l6 , align 1564 %load7 = load i8, ptr %gep_l7 , align 1565 %load8 = load i8, ptr %gep_l8 , align 1566 %load9 = load i8, ptr %gep_l9 , align 1567 %load10 = load i8, ptr %gep_l10, align 1568 %load11 = load i8, ptr %gep_l11, align 1569 %load12 = load i8, ptr %gep_l12, align 1570 %load13 = load i8, ptr %gep_l13, align 1571 %load14 = load i8, ptr %gep_l14, align 1572 %load15 = load i8, ptr %gep_l15, align 1573 574 %gep_s0 = getelementptr inbounds i8, ptr %ps, i64 0575 %gep_s1 = getelementptr inbounds i8, ptr %ps, i64 1576 %gep_s2 = getelementptr inbounds i8, ptr %ps, i64 2577 %gep_s3 = getelementptr inbounds i8, ptr %ps, i64 3578 %gep_s4 = getelementptr inbounds i8, ptr %ps, i64 4579 %gep_s5 = getelementptr inbounds i8, ptr %ps, i64 5580 %gep_s6 = getelementptr inbounds i8, ptr %ps, i64 6581 %gep_s7 = getelementptr inbounds i8, ptr %ps, i64 7582 %gep_s8 = getelementptr inbounds i8, ptr %ps, i64 8583 %gep_s9 = getelementptr inbounds i8, ptr %ps, i64 9584 %gep_s10 = getelementptr inbounds i8, ptr %ps, i64 10585 %gep_s11 = getelementptr inbounds i8, ptr %ps, i64 11586 %gep_s12 = getelementptr inbounds i8, ptr %ps, i64 12587 %gep_s13 = getelementptr inbounds i8, ptr %ps, i64 13588 %gep_s14 = getelementptr inbounds i8, ptr %ps, i64 14589 %gep_s15 = getelementptr inbounds i8, ptr %ps, i64 15590 591 store i8 %load0, ptr %gep_s0, align 1592 store i8 %load1, ptr %gep_s1, align 1593 store i8 %load2, ptr %gep_s2, align 1594 store i8 %load3, ptr %gep_s3, align 1595 store i8 %load4, ptr %gep_s4, align 1596 store i8 %load5, ptr %gep_s5, align 1597 store i8 %load6, ptr %gep_s6, align 1598 store i8 %load7, ptr %gep_s7, align 1599 store i8 %load8, ptr %gep_s8, align 1600 store i8 %load9, ptr %gep_s9, align 1601 store i8 %load10, ptr %gep_s10, align 1602 store i8 %load11, ptr %gep_s11, align 1603 store i8 %load12, ptr %gep_s12, align 1604 store i8 %load13, ptr %gep_s13, align 1605 store i8 %load14, ptr %gep_s14, align 1606 store i8 %load15, ptr %gep_s15, align 1607 608 ret void609}610 611; TODO: We want to generate this code:612; define void @constant_stride_widen_no_reordering(ptr %pl, i64 %stride, ptr %ps) #0 {613; %gep_l0 = getelementptr inbounds i8, ptr %pl, i64 0614; %gep_s0 = getelementptr inbounds i8, ptr %ps, i64 0615; %1 = call <4 x i32> @llvm.experimental.vp.strided.load.v4i32.p0.i64(ptr align 1 %gep_l0, i64 100, <4 x i1> splat (i1 true), i32 4)616; %2 = bitcast <4 x i32> %1 to <16 x i8>617; store <16 x i8> %2, ptr %gep_s0, align 1618; ret void619; }620define void @constant_stride_widen_no_reordering(ptr %pl, i64 %stride, ptr %ps) {621; CHECK-LABEL: define void @constant_stride_widen_no_reordering(622; CHECK-SAME: ptr [[PL:%.*]], i64 [[STRIDE:%.*]], ptr [[PS:%.*]]) #[[ATTR0]] {623; CHECK-NEXT: [[GEP_L0:%.*]] = getelementptr inbounds i8, ptr [[PL]], i64 0624; CHECK-NEXT: [[GEP_S0:%.*]] = getelementptr inbounds i8, ptr [[PS]], i64 0625; CHECK-NEXT: [[TMP1:%.*]] = call <4 x i32> @llvm.experimental.vp.strided.load.v4i32.p0.i64(ptr align 1 [[GEP_L0]], i64 100, <4 x i1> splat (i1 true), i32 4)626; CHECK-NEXT: [[TMP8:%.*]] = bitcast <4 x i32> [[TMP1]] to <16 x i8>627; CHECK-NEXT: store <16 x i8> [[TMP8]], ptr [[GEP_S0]], align 1628; CHECK-NEXT: ret void629;630 %gep_l0 = getelementptr inbounds i8, ptr %pl, i64 0631 %gep_l1 = getelementptr inbounds i8, ptr %pl, i64 1632 %gep_l2 = getelementptr inbounds i8, ptr %pl, i64 2633 %gep_l3 = getelementptr inbounds i8, ptr %pl, i64 3634 %gep_l4 = getelementptr inbounds i8, ptr %pl, i64 100635 %gep_l5 = getelementptr inbounds i8, ptr %pl, i64 101636 %gep_l6 = getelementptr inbounds i8, ptr %pl, i64 102637 %gep_l7 = getelementptr inbounds i8, ptr %pl, i64 103638 %gep_l8 = getelementptr inbounds i8, ptr %pl, i64 200639 %gep_l9 = getelementptr inbounds i8, ptr %pl, i64 201640 %gep_l10 = getelementptr inbounds i8, ptr %pl, i64 202641 %gep_l11 = getelementptr inbounds i8, ptr %pl, i64 203642 %gep_l12 = getelementptr inbounds i8, ptr %pl, i64 300643 %gep_l13 = getelementptr inbounds i8, ptr %pl, i64 301644 %gep_l14 = getelementptr inbounds i8, ptr %pl, i64 302645 %gep_l15 = getelementptr inbounds i8, ptr %pl, i64 303646 647 %load0 = load i8, ptr %gep_l0 , align 1648 %load1 = load i8, ptr %gep_l1 , align 1649 %load2 = load i8, ptr %gep_l2 , align 1650 %load3 = load i8, ptr %gep_l3 , align 1651 %load4 = load i8, ptr %gep_l4 , align 1652 %load5 = load i8, ptr %gep_l5 , align 1653 %load6 = load i8, ptr %gep_l6 , align 1654 %load7 = load i8, ptr %gep_l7 , align 1655 %load8 = load i8, ptr %gep_l8 , align 1656 %load9 = load i8, ptr %gep_l9 , align 1657 %load10 = load i8, ptr %gep_l10, align 1658 %load11 = load i8, ptr %gep_l11, align 1659 %load12 = load i8, ptr %gep_l12, align 1660 %load13 = load i8, ptr %gep_l13, align 1661 %load14 = load i8, ptr %gep_l14, align 1662 %load15 = load i8, ptr %gep_l15, align 1663 664 %gep_s0 = getelementptr inbounds i8, ptr %ps, i64 0665 %gep_s1 = getelementptr inbounds i8, ptr %ps, i64 1666 %gep_s2 = getelementptr inbounds i8, ptr %ps, i64 2667 %gep_s3 = getelementptr inbounds i8, ptr %ps, i64 3668 %gep_s4 = getelementptr inbounds i8, ptr %ps, i64 4669 %gep_s5 = getelementptr inbounds i8, ptr %ps, i64 5670 %gep_s6 = getelementptr inbounds i8, ptr %ps, i64 6671 %gep_s7 = getelementptr inbounds i8, ptr %ps, i64 7672 %gep_s8 = getelementptr inbounds i8, ptr %ps, i64 8673 %gep_s9 = getelementptr inbounds i8, ptr %ps, i64 9674 %gep_s10 = getelementptr inbounds i8, ptr %ps, i64 10675 %gep_s11 = getelementptr inbounds i8, ptr %ps, i64 11676 %gep_s12 = getelementptr inbounds i8, ptr %ps, i64 12677 %gep_s13 = getelementptr inbounds i8, ptr %ps, i64 13678 %gep_s14 = getelementptr inbounds i8, ptr %ps, i64 14679 %gep_s15 = getelementptr inbounds i8, ptr %ps, i64 15680 681 store i8 %load0, ptr %gep_s0, align 1682 store i8 %load1, ptr %gep_s1, align 1683 store i8 %load2, ptr %gep_s2, align 1684 store i8 %load3, ptr %gep_s3, align 1685 store i8 %load4, ptr %gep_s4, align 1686 store i8 %load5, ptr %gep_s5, align 1687 store i8 %load6, ptr %gep_s6, align 1688 store i8 %load7, ptr %gep_s7, align 1689 store i8 %load8, ptr %gep_s8, align 1690 store i8 %load9, ptr %gep_s9, align 1691 store i8 %load10, ptr %gep_s10, align 1692 store i8 %load11, ptr %gep_s11, align 1693 store i8 %load12, ptr %gep_s12, align 1694 store i8 %load13, ptr %gep_s13, align 1695 store i8 %load14, ptr %gep_s14, align 1696 store i8 %load15, ptr %gep_s15, align 1697 698 ret void699}700; TODO: We want to generate this code:701; define void @rt_stride_widen_no_reordering(ptr %pl, i64 %stride, ptr %ps) {702; %gep_l0 = getelementptr inbounds i8, ptr %pl, i64 %offset0703; %gep_s0 = getelementptr inbounds i8, ptr %ps, i64 0704; %strided_load = call <4 x i32> @llvm.experimental.vp.strided.load.v4i32.p0.i64(ptr align 1 %gep_l0, i64 %stride, <4 x i1> splat (i1 true), i32 4)705; %bitcast_ = bitcast <4 x i32> %strided_load to <16 x i8>706; store <16 x i8> %bitcast_, ptr %gep_s0, align 1707; ret void708; }709define void @rt_stride_widen_no_reordering(ptr %pl, i64 %stride, ptr %ps) {710; CHECK-LABEL: define void @rt_stride_widen_no_reordering(711; CHECK-SAME: ptr [[PL:%.*]], i64 [[STRIDE:%.*]], ptr [[PS:%.*]]) #[[ATTR0]] {712; CHECK-NEXT: [[OFFSET0:%.*]] = mul nsw i64 [[STRIDE]], 0713; CHECK-NEXT: [[OFFSET4:%.*]] = mul nsw i64 [[STRIDE]], 1714; CHECK-NEXT: [[OFFSET8:%.*]] = mul nsw i64 [[STRIDE]], 2715; CHECK-NEXT: [[OFFSET12:%.*]] = mul nsw i64 [[STRIDE]], 3716; CHECK-NEXT: [[GEP_L0:%.*]] = getelementptr inbounds i8, ptr [[PL]], i64 [[OFFSET0]]717; CHECK-NEXT: [[GEP_L4:%.*]] = getelementptr inbounds i8, ptr [[PL]], i64 [[OFFSET4]]718; CHECK-NEXT: [[GEP_L8:%.*]] = getelementptr inbounds i8, ptr [[PL]], i64 [[OFFSET8]]719; CHECK-NEXT: [[GEP_L12:%.*]] = getelementptr inbounds i8, ptr [[PL]], i64 [[OFFSET12]]720; CHECK-NEXT: [[GEP_S0:%.*]] = getelementptr inbounds i8, ptr [[PS]], i64 0721; CHECK-NEXT: [[TMP1:%.*]] = load <4 x i8>, ptr [[GEP_L0]], align 1722; CHECK-NEXT: [[TMP2:%.*]] = load <4 x i8>, ptr [[GEP_L4]], align 1723; CHECK-NEXT: [[TMP3:%.*]] = load <4 x i8>, ptr [[GEP_L8]], align 1724; CHECK-NEXT: [[TMP4:%.*]] = load <4 x i8>, ptr [[GEP_L12]], align 1725; CHECK-NEXT: [[TMP5:%.*]] = shufflevector <4 x i8> [[TMP1]], <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>726; CHECK-NEXT: [[TMP6:%.*]] = 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>727; CHECK-NEXT: [[TMP7:%.*]] = shufflevector <4 x i8> [[TMP1]], <4 x i8> [[TMP2]], <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>728; CHECK-NEXT: [[TMP11:%.*]] = shufflevector <4 x i8> [[TMP3]], <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>729; CHECK-NEXT: [[TMP9:%.*]] = shufflevector <16 x i8> [[TMP7]], <16 x i8> [[TMP11]], <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 poison, i32 poison, i32 poison, i32 poison>730; CHECK-NEXT: [[TMP10:%.*]] = shufflevector <4 x i8> [[TMP4]], <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>731; CHECK-NEXT: [[TMP8:%.*]] = shufflevector <16 x i8> [[TMP9]], <16 x i8> [[TMP10]], <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>732; CHECK-NEXT: store <16 x i8> [[TMP8]], ptr [[GEP_S0]], align 1733; CHECK-NEXT: ret void734;735 %offset0 = mul nsw i64 %stride, 0736 %offset1 = add nsw i64 %offset0, 1737 %offset2 = add nsw i64 %offset0, 2738 %offset3 = add nsw i64 %offset0, 3739 %offset4 = mul nsw i64 %stride, 1740 %offset5 = add nsw i64 %offset4, 1741 %offset6 = add nsw i64 %offset4, 2742 %offset7 = add nsw i64 %offset4, 3743 %offset8 = mul nsw i64 %stride, 2744 %offset9 = add nsw i64 %offset8, 1745 %offset10 = add nsw i64 %offset8, 2746 %offset11 = add nsw i64 %offset8, 3747 %offset12 = mul nsw i64 %stride, 3748 %offset13 = add nsw i64 %offset12, 1749 %offset14 = add nsw i64 %offset12, 2750 %offset15 = add nsw i64 %offset12, 3751 752 %gep_l0 = getelementptr inbounds i8, ptr %pl, i64 %offset0753 %gep_l1 = getelementptr inbounds i8, ptr %pl, i64 %offset1754 %gep_l2 = getelementptr inbounds i8, ptr %pl, i64 %offset2755 %gep_l3 = getelementptr inbounds i8, ptr %pl, i64 %offset3756 %gep_l4 = getelementptr inbounds i8, ptr %pl, i64 %offset4757 %gep_l5 = getelementptr inbounds i8, ptr %pl, i64 %offset5758 %gep_l6 = getelementptr inbounds i8, ptr %pl, i64 %offset6759 %gep_l7 = getelementptr inbounds i8, ptr %pl, i64 %offset7760 %gep_l8 = getelementptr inbounds i8, ptr %pl, i64 %offset8761 %gep_l9 = getelementptr inbounds i8, ptr %pl, i64 %offset9762 %gep_l10 = getelementptr inbounds i8, ptr %pl, i64 %offset10763 %gep_l11 = getelementptr inbounds i8, ptr %pl, i64 %offset11764 %gep_l12 = getelementptr inbounds i8, ptr %pl, i64 %offset12765 %gep_l13 = getelementptr inbounds i8, ptr %pl, i64 %offset13766 %gep_l14 = getelementptr inbounds i8, ptr %pl, i64 %offset14767 %gep_l15 = getelementptr inbounds i8, ptr %pl, i64 %offset15768 769 %load0 = load i8, ptr %gep_l0 , align 1770 %load1 = load i8, ptr %gep_l1 , align 1771 %load2 = load i8, ptr %gep_l2 , align 1772 %load3 = load i8, ptr %gep_l3 , align 1773 %load4 = load i8, ptr %gep_l4 , align 1774 %load5 = load i8, ptr %gep_l5 , align 1775 %load6 = load i8, ptr %gep_l6 , align 1776 %load7 = load i8, ptr %gep_l7 , align 1777 %load8 = load i8, ptr %gep_l8 , align 1778 %load9 = load i8, ptr %gep_l9 , align 1779 %load10 = load i8, ptr %gep_l10, align 1780 %load11 = load i8, ptr %gep_l11, align 1781 %load12 = load i8, ptr %gep_l12, align 1782 %load13 = load i8, ptr %gep_l13, align 1783 %load14 = load i8, ptr %gep_l14, align 1784 %load15 = load i8, ptr %gep_l15, align 1785 786 %gep_s0 = getelementptr inbounds i8, ptr %ps, i64 0787 %gep_s1 = getelementptr inbounds i8, ptr %ps, i64 1788 %gep_s2 = getelementptr inbounds i8, ptr %ps, i64 2789 %gep_s3 = getelementptr inbounds i8, ptr %ps, i64 3790 %gep_s4 = getelementptr inbounds i8, ptr %ps, i64 4791 %gep_s5 = getelementptr inbounds i8, ptr %ps, i64 5792 %gep_s6 = getelementptr inbounds i8, ptr %ps, i64 6793 %gep_s7 = getelementptr inbounds i8, ptr %ps, i64 7794 %gep_s8 = getelementptr inbounds i8, ptr %ps, i64 8795 %gep_s9 = getelementptr inbounds i8, ptr %ps, i64 9796 %gep_s10 = getelementptr inbounds i8, ptr %ps, i64 10797 %gep_s11 = getelementptr inbounds i8, ptr %ps, i64 11798 %gep_s12 = getelementptr inbounds i8, ptr %ps, i64 12799 %gep_s13 = getelementptr inbounds i8, ptr %ps, i64 13800 %gep_s14 = getelementptr inbounds i8, ptr %ps, i64 14801 %gep_s15 = getelementptr inbounds i8, ptr %ps, i64 15802 803 store i8 %load0, ptr %gep_s0, align 1804 store i8 %load1, ptr %gep_s1, align 1805 store i8 %load2, ptr %gep_s2, align 1806 store i8 %load3, ptr %gep_s3, align 1807 store i8 %load4, ptr %gep_s4, align 1808 store i8 %load5, ptr %gep_s5, align 1809 store i8 %load6, ptr %gep_s6, align 1810 store i8 %load7, ptr %gep_s7, align 1811 store i8 %load8, ptr %gep_s8, align 1812 store i8 %load9, ptr %gep_s9, align 1813 store i8 %load10, ptr %gep_s10, align 1814 store i8 %load11, ptr %gep_s11, align 1815 store i8 %load12, ptr %gep_s12, align 1816 store i8 %load13, ptr %gep_s13, align 1817 store i8 %load14, ptr %gep_s14, align 1818 store i8 %load15, ptr %gep_s15, align 1819 820 ret void821}822