2535 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=aggressive-instcombine -S -mtriple aarch64 -data-layout="e-n64" | FileCheck %s --check-prefixes=ALL,LE3; RUN: opt < %s -passes=aggressive-instcombine -S -mtriple aarch64 -data-layout="E-n64" | FileCheck %s --check-prefixes=ALL,BE4 5define i16 @loadCombine_2consecutive(ptr %p) {6;7; ALL-LABEL: @loadCombine_2consecutive(8; ALL-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 19; ALL-NEXT: [[L1:%.*]] = load i8, ptr [[P]], align 110; ALL-NEXT: [[L2:%.*]] = load i8, ptr [[P1]], align 111; ALL-NEXT: [[E1:%.*]] = zext i8 [[L1]] to i1612; ALL-NEXT: [[E2:%.*]] = zext i8 [[L2]] to i1613; ALL-NEXT: [[S2:%.*]] = shl i16 [[E2]], 814; ALL-NEXT: [[O1:%.*]] = or i16 [[E1]], [[S2]]15; ALL-NEXT: ret i16 [[O1]]16;17 %p1 = getelementptr i8, ptr %p, i32 118 %l1 = load i8, ptr %p19 %l2 = load i8, ptr %p120 %e1 = zext i8 %l1 to i1621 %e2 = zext i8 %l2 to i1622 %s2 = shl i16 %e2, 823 %o1 = or i16 %e1, %s224 ret i16 %o125}26 27define i16 @loadCombine_2consecutive_BE(ptr %p) {28; ALL-LABEL: @loadCombine_2consecutive_BE(29; ALL-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 130; ALL-NEXT: [[L1:%.*]] = load i8, ptr [[P]], align 131; ALL-NEXT: [[L2:%.*]] = load i8, ptr [[P1]], align 132; ALL-NEXT: [[E1:%.*]] = zext i8 [[L1]] to i1633; ALL-NEXT: [[E2:%.*]] = zext i8 [[L2]] to i1634; ALL-NEXT: [[S1:%.*]] = shl i16 [[E1]], 835; ALL-NEXT: [[O1:%.*]] = or i16 [[S1]], [[E2]]36; ALL-NEXT: ret i16 [[O1]]37;38 %p1 = getelementptr i8, ptr %p, i32 139 %l1 = load i8, ptr %p40 %l2 = load i8, ptr %p141 %e1 = zext i8 %l1 to i1642 %e2 = zext i8 %l2 to i1643 %s1 = shl i16 %e1, 844 %o1 = or i16 %s1, %e245 ret i16 %o146}47 48define i32 @loadCombine_4consecutive(ptr %p) {49; LE-LABEL: @loadCombine_4consecutive(50; LE-NEXT: [[L1:%.*]] = load i32, ptr [[P:%.*]], align 151; LE-NEXT: ret i32 [[L1]]52;53; BE-LABEL: @loadCombine_4consecutive(54; BE-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 155; BE-NEXT: [[P2:%.*]] = getelementptr i8, ptr [[P]], i32 256; BE-NEXT: [[P3:%.*]] = getelementptr i8, ptr [[P]], i32 357; BE-NEXT: [[L1:%.*]] = load i8, ptr [[P]], align 158; BE-NEXT: [[L2:%.*]] = load i8, ptr [[P1]], align 159; BE-NEXT: [[L3:%.*]] = load i8, ptr [[P2]], align 160; BE-NEXT: [[L4:%.*]] = load i8, ptr [[P3]], align 161; BE-NEXT: [[E1:%.*]] = zext i8 [[L1]] to i3262; BE-NEXT: [[E2:%.*]] = zext i8 [[L2]] to i3263; BE-NEXT: [[E3:%.*]] = zext i8 [[L3]] to i3264; BE-NEXT: [[E4:%.*]] = zext i8 [[L4]] to i3265; BE-NEXT: [[S2:%.*]] = shl i32 [[E2]], 866; BE-NEXT: [[S3:%.*]] = shl i32 [[E3]], 1667; BE-NEXT: [[S4:%.*]] = shl i32 [[E4]], 2468; BE-NEXT: [[O1:%.*]] = or i32 [[E1]], [[S2]]69; BE-NEXT: [[O2:%.*]] = or i32 [[O1]], [[S3]]70; BE-NEXT: [[O3:%.*]] = or i32 [[O2]], [[S4]]71; BE-NEXT: ret i32 [[O3]]72;73 %p1 = getelementptr i8, ptr %p, i32 174 %p2 = getelementptr i8, ptr %p, i32 275 %p3 = getelementptr i8, ptr %p, i32 376 %l1 = load i8, ptr %p77 %l2 = load i8, ptr %p178 %l3 = load i8, ptr %p279 %l4 = load i8, ptr %p380 81 %e1 = zext i8 %l1 to i3282 %e2 = zext i8 %l2 to i3283 %e3 = zext i8 %l3 to i3284 %e4 = zext i8 %l4 to i3285 86 %s2 = shl i32 %e2, 887 %s3 = shl i32 %e3, 1688 %s4 = shl i32 %e4, 2489 90 %o1 = or i32 %e1, %s291 %o2 = or i32 %o1, %s392 %o3 = or i32 %o2, %s493 ret i32 %o394}95 96define i32 @loadCombine_4consecutive_BE(ptr %p) {97; LE-LABEL: @loadCombine_4consecutive_BE(98; LE-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 199; LE-NEXT: [[P2:%.*]] = getelementptr i8, ptr [[P]], i32 2100; LE-NEXT: [[P3:%.*]] = getelementptr i8, ptr [[P]], i32 3101; LE-NEXT: [[L1:%.*]] = load i8, ptr [[P]], align 1102; LE-NEXT: [[L2:%.*]] = load i8, ptr [[P1]], align 1103; LE-NEXT: [[L3:%.*]] = load i8, ptr [[P2]], align 1104; LE-NEXT: [[L4:%.*]] = load i8, ptr [[P3]], align 1105; LE-NEXT: [[E1:%.*]] = zext i8 [[L1]] to i32106; LE-NEXT: [[E2:%.*]] = zext i8 [[L2]] to i32107; LE-NEXT: [[E3:%.*]] = zext i8 [[L3]] to i32108; LE-NEXT: [[E4:%.*]] = zext i8 [[L4]] to i32109; LE-NEXT: [[S1:%.*]] = shl i32 [[E1]], 24110; LE-NEXT: [[S2:%.*]] = shl i32 [[E2]], 16111; LE-NEXT: [[S3:%.*]] = shl i32 [[E3]], 8112; LE-NEXT: [[O1:%.*]] = or i32 [[S1]], [[S2]]113; LE-NEXT: [[O2:%.*]] = or i32 [[O1]], [[S3]]114; LE-NEXT: [[O3:%.*]] = or i32 [[O2]], [[E4]]115; LE-NEXT: ret i32 [[O3]]116;117; BE-LABEL: @loadCombine_4consecutive_BE(118; BE-NEXT: [[L1:%.*]] = load i32, ptr [[P:%.*]], align 1119; BE-NEXT: ret i32 [[L1]]120;121 %p1 = getelementptr i8, ptr %p, i32 1122 %p2 = getelementptr i8, ptr %p, i32 2123 %p3 = getelementptr i8, ptr %p, i32 3124 %l1 = load i8, ptr %p125 %l2 = load i8, ptr %p1126 %l3 = load i8, ptr %p2127 %l4 = load i8, ptr %p3128 129 %e1 = zext i8 %l1 to i32130 %e2 = zext i8 %l2 to i32131 %e3 = zext i8 %l3 to i32132 %e4 = zext i8 %l4 to i32133 134 %s1 = shl i32 %e1, 24135 %s2 = shl i32 %e2, 16136 %s3 = shl i32 %e3, 8137 138 %o1 = or i32 %s1, %s2139 %o2 = or i32 %o1, %s3140 %o3 = or i32 %o2, %e4141 ret i32 %o3142}143 144define i32 @loadCombine_4consecutive_alias(ptr %p) {145; LE-LABEL: @loadCombine_4consecutive_alias(146; LE-NEXT: [[L1:%.*]] = load i32, ptr [[P:%.*]], align 1147; LE-NEXT: store i8 10, ptr [[P]], align 1148; LE-NEXT: ret i32 [[L1]]149;150; BE-LABEL: @loadCombine_4consecutive_alias(151; BE-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 1152; BE-NEXT: [[P2:%.*]] = getelementptr i8, ptr [[P]], i32 2153; BE-NEXT: [[P3:%.*]] = getelementptr i8, ptr [[P]], i32 3154; BE-NEXT: [[L1:%.*]] = load i8, ptr [[P]], align 1155; BE-NEXT: store i8 10, ptr [[P]], align 1156; BE-NEXT: [[L2:%.*]] = load i8, ptr [[P1]], align 1157; BE-NEXT: [[L3:%.*]] = load i8, ptr [[P2]], align 1158; BE-NEXT: [[L4:%.*]] = load i8, ptr [[P3]], align 1159; BE-NEXT: [[E1:%.*]] = zext i8 [[L1]] to i32160; BE-NEXT: [[E2:%.*]] = zext i8 [[L2]] to i32161; BE-NEXT: [[E3:%.*]] = zext i8 [[L3]] to i32162; BE-NEXT: [[E4:%.*]] = zext i8 [[L4]] to i32163; BE-NEXT: [[S2:%.*]] = shl i32 [[E2]], 8164; BE-NEXT: [[S3:%.*]] = shl i32 [[E3]], 16165; BE-NEXT: [[S4:%.*]] = shl i32 [[E4]], 24166; BE-NEXT: [[O1:%.*]] = or i32 [[E1]], [[S2]]167; BE-NEXT: [[O2:%.*]] = or i32 [[O1]], [[S3]]168; BE-NEXT: [[O3:%.*]] = or i32 [[O2]], [[S4]]169; BE-NEXT: ret i32 [[O3]]170;171 %p1 = getelementptr i8, ptr %p, i32 1172 %p2 = getelementptr i8, ptr %p, i32 2173 %p3 = getelementptr i8, ptr %p, i32 3174 %l1 = load i8, ptr %p175 store i8 10, ptr %p176 %l2 = load i8, ptr %p1177 %l3 = load i8, ptr %p2178 %l4 = load i8, ptr %p3179 180 %e1 = zext i8 %l1 to i32181 %e2 = zext i8 %l2 to i32182 %e3 = zext i8 %l3 to i32183 %e4 = zext i8 %l4 to i32184 185 %s2 = shl i32 %e2, 8186 %s3 = shl i32 %e3, 16187 %s4 = shl i32 %e4, 24188 189 %o1 = or i32 %e1, %s2190 %o2 = or i32 %o1, %s3191 %o3 = or i32 %o2, %s4192 ret i32 %o3193}194 195define i32 @loadCombine_4consecutive_alias_BE(ptr %p) {196; LE-LABEL: @loadCombine_4consecutive_alias_BE(197; LE-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 1198; LE-NEXT: [[P2:%.*]] = getelementptr i8, ptr [[P]], i32 2199; LE-NEXT: [[P3:%.*]] = getelementptr i8, ptr [[P]], i32 3200; LE-NEXT: [[L1:%.*]] = load i8, ptr [[P]], align 1201; LE-NEXT: store i8 10, ptr [[P]], align 1202; LE-NEXT: [[L2:%.*]] = load i8, ptr [[P1]], align 1203; LE-NEXT: [[L3:%.*]] = load i8, ptr [[P2]], align 1204; LE-NEXT: [[L4:%.*]] = load i8, ptr [[P3]], align 1205; LE-NEXT: [[E1:%.*]] = zext i8 [[L1]] to i32206; LE-NEXT: [[E2:%.*]] = zext i8 [[L2]] to i32207; LE-NEXT: [[E3:%.*]] = zext i8 [[L3]] to i32208; LE-NEXT: [[E4:%.*]] = zext i8 [[L4]] to i32209; LE-NEXT: [[S1:%.*]] = shl i32 [[E1]], 24210; LE-NEXT: [[S2:%.*]] = shl i32 [[E2]], 16211; LE-NEXT: [[S3:%.*]] = shl i32 [[E3]], 8212; LE-NEXT: [[O1:%.*]] = or i32 [[S1]], [[S2]]213; LE-NEXT: [[O2:%.*]] = or i32 [[O1]], [[S3]]214; LE-NEXT: [[O3:%.*]] = or i32 [[O2]], [[E4]]215; LE-NEXT: ret i32 [[O3]]216;217; BE-LABEL: @loadCombine_4consecutive_alias_BE(218; BE-NEXT: [[L1:%.*]] = load i32, ptr [[P:%.*]], align 1219; BE-NEXT: store i8 10, ptr [[P]], align 1220; BE-NEXT: ret i32 [[L1]]221;222 %p1 = getelementptr i8, ptr %p, i32 1223 %p2 = getelementptr i8, ptr %p, i32 2224 %p3 = getelementptr i8, ptr %p, i32 3225 %l1 = load i8, ptr %p226 store i8 10, ptr %p227 %l2 = load i8, ptr %p1228 %l3 = load i8, ptr %p2229 %l4 = load i8, ptr %p3230 231 %e1 = zext i8 %l1 to i32232 %e2 = zext i8 %l2 to i32233 %e3 = zext i8 %l3 to i32234 %e4 = zext i8 %l4 to i32235 236 %s1 = shl i32 %e1, 24237 %s2 = shl i32 %e2, 16238 %s3 = shl i32 %e3, 8239 240 %o1 = or i32 %s1, %s2241 %o2 = or i32 %o1, %s3242 %o3 = or i32 %o2, %e4243 ret i32 %o3244}245 246define i32 @loadCombine_4consecutive_alias2(ptr %p, ptr %pstr) {247; ALL-LABEL: @loadCombine_4consecutive_alias2(248; ALL-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 1249; ALL-NEXT: [[P2:%.*]] = getelementptr i8, ptr [[P]], i32 2250; ALL-NEXT: [[P3:%.*]] = getelementptr i8, ptr [[P]], i32 3251; ALL-NEXT: [[L1:%.*]] = load i8, ptr [[P]], align 1252; ALL-NEXT: [[L2:%.*]] = load i8, ptr [[P1]], align 1253; ALL-NEXT: [[L3:%.*]] = load i8, ptr [[P2]], align 1254; ALL-NEXT: store i8 10, ptr [[PSTR:%.*]], align 1255; ALL-NEXT: [[L4:%.*]] = load i8, ptr [[P3]], align 1256; ALL-NEXT: [[E1:%.*]] = zext i8 [[L1]] to i32257; ALL-NEXT: [[E2:%.*]] = zext i8 [[L2]] to i32258; ALL-NEXT: [[E3:%.*]] = zext i8 [[L3]] to i32259; ALL-NEXT: [[E4:%.*]] = zext i8 [[L4]] to i32260; ALL-NEXT: [[S2:%.*]] = shl i32 [[E2]], 8261; ALL-NEXT: [[S3:%.*]] = shl i32 [[E3]], 16262; ALL-NEXT: [[S4:%.*]] = shl i32 [[E4]], 24263; ALL-NEXT: [[O1:%.*]] = or i32 [[E1]], [[S2]]264; ALL-NEXT: [[O2:%.*]] = or i32 [[O1]], [[S3]]265; ALL-NEXT: [[O3:%.*]] = or i32 [[O2]], [[S4]]266; ALL-NEXT: ret i32 [[O3]]267;268 %p1 = getelementptr i8, ptr %p, i32 1269 %p2 = getelementptr i8, ptr %p, i32 2270 %p3 = getelementptr i8, ptr %p, i32 3271 %l1 = load i8, ptr %p272 %l2 = load i8, ptr %p1273 %l3 = load i8, ptr %p2274 store i8 10, ptr %pstr275 %l4 = load i8, ptr %p3276 277 %e1 = zext i8 %l1 to i32278 %e2 = zext i8 %l2 to i32279 %e3 = zext i8 %l3 to i32280 %e4 = zext i8 %l4 to i32281 282 %s2 = shl i32 %e2, 8283 %s3 = shl i32 %e3, 16284 %s4 = shl i32 %e4, 24285 286 %o1 = or i32 %e1, %s2287 %o2 = or i32 %o1, %s3288 %o3 = or i32 %o2, %s4289 ret i32 %o3290}291 292define i32 @loadCombine_4consecutive_alias2_BE(ptr %p, ptr %pstr) {293; ALL-LABEL: @loadCombine_4consecutive_alias2_BE(294; ALL-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 1295; ALL-NEXT: [[P2:%.*]] = getelementptr i8, ptr [[P]], i32 2296; ALL-NEXT: [[P3:%.*]] = getelementptr i8, ptr [[P]], i32 3297; ALL-NEXT: [[L1:%.*]] = load i8, ptr [[P]], align 1298; ALL-NEXT: [[L2:%.*]] = load i8, ptr [[P1]], align 1299; ALL-NEXT: [[L3:%.*]] = load i8, ptr [[P2]], align 1300; ALL-NEXT: store i8 10, ptr [[PSTR:%.*]], align 1301; ALL-NEXT: [[L4:%.*]] = load i8, ptr [[P3]], align 1302; ALL-NEXT: [[E1:%.*]] = zext i8 [[L1]] to i32303; ALL-NEXT: [[E2:%.*]] = zext i8 [[L2]] to i32304; ALL-NEXT: [[E3:%.*]] = zext i8 [[L3]] to i32305; ALL-NEXT: [[E4:%.*]] = zext i8 [[L4]] to i32306; ALL-NEXT: [[S1:%.*]] = shl i32 [[E1]], 24307; ALL-NEXT: [[S2:%.*]] = shl i32 [[E2]], 16308; ALL-NEXT: [[S3:%.*]] = shl i32 [[E3]], 8309; ALL-NEXT: [[O1:%.*]] = or i32 [[S1]], [[S2]]310; ALL-NEXT: [[O2:%.*]] = or i32 [[O1]], [[S3]]311; ALL-NEXT: [[O3:%.*]] = or i32 [[O2]], [[E4]]312; ALL-NEXT: ret i32 [[O3]]313;314 %p1 = getelementptr i8, ptr %p, i32 1315 %p2 = getelementptr i8, ptr %p, i32 2316 %p3 = getelementptr i8, ptr %p, i32 3317 %l1 = load i8, ptr %p318 %l2 = load i8, ptr %p1319 %l3 = load i8, ptr %p2320 store i8 10, ptr %pstr321 %l4 = load i8, ptr %p3322 323 %e1 = zext i8 %l1 to i32324 %e2 = zext i8 %l2 to i32325 %e3 = zext i8 %l3 to i32326 %e4 = zext i8 %l4 to i32327 328 %s1 = shl i32 %e1, 24329 %s2 = shl i32 %e2, 16330 %s3 = shl i32 %e3, 8331 332 %o1 = or i32 %s1, %s2333 %o2 = or i32 %o1, %s3334 %o3 = or i32 %o2, %e4335 ret i32 %o3336}337 338define i32 @loadCombine_4consecutive_alias3(ptr %p) {339; ALL-LABEL: @loadCombine_4consecutive_alias3(340; ALL-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 1341; ALL-NEXT: [[P2:%.*]] = getelementptr i8, ptr [[P]], i32 2342; ALL-NEXT: [[P3:%.*]] = getelementptr i8, ptr [[P]], i32 3343; ALL-NEXT: [[L1:%.*]] = load i8, ptr [[P]], align 1344; ALL-NEXT: [[L2:%.*]] = load i8, ptr [[P1]], align 1345; ALL-NEXT: [[L3:%.*]] = load i8, ptr [[P2]], align 1346; ALL-NEXT: store i8 10, ptr [[P3]], align 1347; ALL-NEXT: store i8 5, ptr [[P]], align 1348; ALL-NEXT: [[L4:%.*]] = load i8, ptr [[P3]], align 1349; ALL-NEXT: [[E1:%.*]] = zext i8 [[L1]] to i32350; ALL-NEXT: [[E2:%.*]] = zext i8 [[L2]] to i32351; ALL-NEXT: [[E3:%.*]] = zext i8 [[L3]] to i32352; ALL-NEXT: [[E4:%.*]] = zext i8 [[L4]] to i32353; ALL-NEXT: [[S2:%.*]] = shl i32 [[E2]], 8354; ALL-NEXT: [[S3:%.*]] = shl i32 [[E3]], 16355; ALL-NEXT: [[S4:%.*]] = shl i32 [[E4]], 24356; ALL-NEXT: [[O1:%.*]] = or i32 [[E1]], [[S2]]357; ALL-NEXT: [[O2:%.*]] = or i32 [[O1]], [[S3]]358; ALL-NEXT: [[O3:%.*]] = or i32 [[O2]], [[S4]]359; ALL-NEXT: ret i32 [[O3]]360;361 %p1 = getelementptr i8, ptr %p, i32 1362 %p2 = getelementptr i8, ptr %p, i32 2363 %p3 = getelementptr i8, ptr %p, i32 3364 %l1 = load i8, ptr %p365 %l2 = load i8, ptr %p1366 %l3 = load i8, ptr %p2367 store i8 10, ptr %p3368 store i8 5, ptr %p369 %l4 = load i8, ptr %p3370 371 %e1 = zext i8 %l1 to i32372 %e2 = zext i8 %l2 to i32373 %e3 = zext i8 %l3 to i32374 %e4 = zext i8 %l4 to i32375 376 %s2 = shl i32 %e2, 8377 %s3 = shl i32 %e3, 16378 %s4 = shl i32 %e4, 24379 380 %o1 = or i32 %e1, %s2381 %o2 = or i32 %o1, %s3382 %o3 = or i32 %o2, %s4383 ret i32 %o3384}385 386define i32 @loadCombine_4consecutive_alias3_BE(ptr %p) {387; ALL-LABEL: @loadCombine_4consecutive_alias3_BE(388; ALL-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 1389; ALL-NEXT: [[P2:%.*]] = getelementptr i8, ptr [[P]], i32 2390; ALL-NEXT: [[P3:%.*]] = getelementptr i8, ptr [[P]], i32 3391; ALL-NEXT: [[L1:%.*]] = load i8, ptr [[P]], align 1392; ALL-NEXT: [[L2:%.*]] = load i8, ptr [[P1]], align 1393; ALL-NEXT: [[L3:%.*]] = load i8, ptr [[P2]], align 1394; ALL-NEXT: store i8 10, ptr [[P3]], align 1395; ALL-NEXT: store i8 5, ptr [[P]], align 1396; ALL-NEXT: [[L4:%.*]] = load i8, ptr [[P3]], align 1397; ALL-NEXT: [[E1:%.*]] = zext i8 [[L1]] to i32398; ALL-NEXT: [[E2:%.*]] = zext i8 [[L2]] to i32399; ALL-NEXT: [[E3:%.*]] = zext i8 [[L3]] to i32400; ALL-NEXT: [[E4:%.*]] = zext i8 [[L4]] to i32401; ALL-NEXT: [[S1:%.*]] = shl i32 [[E1]], 24402; ALL-NEXT: [[S2:%.*]] = shl i32 [[E2]], 16403; ALL-NEXT: [[S3:%.*]] = shl i32 [[E3]], 8404; ALL-NEXT: [[O1:%.*]] = or i32 [[S1]], [[S2]]405; ALL-NEXT: [[O2:%.*]] = or i32 [[O1]], [[S3]]406; ALL-NEXT: [[O3:%.*]] = or i32 [[O2]], [[E4]]407; ALL-NEXT: ret i32 [[O3]]408;409 %p1 = getelementptr i8, ptr %p, i32 1410 %p2 = getelementptr i8, ptr %p, i32 2411 %p3 = getelementptr i8, ptr %p, i32 3412 %l1 = load i8, ptr %p413 %l2 = load i8, ptr %p1414 %l3 = load i8, ptr %p2415 store i8 10, ptr %p3416 store i8 5, ptr %p417 %l4 = load i8, ptr %p3418 419 %e1 = zext i8 %l1 to i32420 %e2 = zext i8 %l2 to i32421 %e3 = zext i8 %l3 to i32422 %e4 = zext i8 %l4 to i32423 424 %s1 = shl i32 %e1, 24425 %s2 = shl i32 %e2, 16426 %s3 = shl i32 %e3, 8427 428 %o1 = or i32 %s1, %s2429 %o2 = or i32 %o1, %s3430 %o3 = or i32 %o2, %e4431 ret i32 %o3432}433 434define i32 @loadCombine_4consecutive_with_alias4(ptr %p, ptr %ps) {435; ALL-LABEL: @loadCombine_4consecutive_with_alias4(436; ALL-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 1437; ALL-NEXT: [[P2:%.*]] = getelementptr i8, ptr [[P]], i32 2438; ALL-NEXT: [[P3:%.*]] = getelementptr i8, ptr [[P]], i32 3439; ALL-NEXT: [[PS1:%.*]] = getelementptr i8, ptr [[PS:%.*]], i32 1440; ALL-NEXT: [[PS2:%.*]] = getelementptr i8, ptr [[PS]], i32 2441; ALL-NEXT: [[PS3:%.*]] = getelementptr i8, ptr [[PS]], i32 3442; ALL-NEXT: [[L1:%.*]] = load i8, ptr [[P]], align 1443; ALL-NEXT: store i8 10, ptr [[PS]], align 1444; ALL-NEXT: [[L2:%.*]] = load i8, ptr [[P1]], align 1445; ALL-NEXT: store i8 10, ptr [[PS1]], align 1446; ALL-NEXT: [[L3:%.*]] = load i8, ptr [[P2]], align 1447; ALL-NEXT: store i8 10, ptr [[PS2]], align 1448; ALL-NEXT: [[L4:%.*]] = load i8, ptr [[P3]], align 1449; ALL-NEXT: store i8 10, ptr [[PS3]], align 1450; ALL-NEXT: [[E1:%.*]] = zext i8 [[L1]] to i32451; ALL-NEXT: [[E2:%.*]] = zext i8 [[L2]] to i32452; ALL-NEXT: [[E3:%.*]] = zext i8 [[L3]] to i32453; ALL-NEXT: [[E4:%.*]] = zext i8 [[L4]] to i32454; ALL-NEXT: [[S2:%.*]] = shl i32 [[E2]], 8455; ALL-NEXT: [[S3:%.*]] = shl i32 [[E3]], 16456; ALL-NEXT: [[S4:%.*]] = shl i32 [[E4]], 24457; ALL-NEXT: [[O1:%.*]] = or i32 [[E1]], [[S2]]458; ALL-NEXT: [[O2:%.*]] = or i32 [[O1]], [[S3]]459; ALL-NEXT: [[O3:%.*]] = or i32 [[O2]], [[S4]]460; ALL-NEXT: ret i32 [[O3]]461;462 %p1 = getelementptr i8, ptr %p, i32 1463 %p2 = getelementptr i8, ptr %p, i32 2464 %p3 = getelementptr i8, ptr %p, i32 3465 %ps1 = getelementptr i8, ptr %ps, i32 1466 %ps2 = getelementptr i8, ptr %ps, i32 2467 %ps3 = getelementptr i8, ptr %ps, i32 3468 %l1 = load i8, ptr %p469 store i8 10, ptr %ps470 %l2 = load i8, ptr %p1471 store i8 10, ptr %ps1472 %l3 = load i8, ptr %p2473 store i8 10, ptr %ps2474 %l4 = load i8, ptr %p3475 store i8 10, ptr %ps3476 477 %e1 = zext i8 %l1 to i32478 %e2 = zext i8 %l2 to i32479 %e3 = zext i8 %l3 to i32480 %e4 = zext i8 %l4 to i32481 482 %s2 = shl i32 %e2, 8483 %s3 = shl i32 %e3, 16484 %s4 = shl i32 %e4, 24485 486 %o1 = or i32 %e1, %s2487 %o2 = or i32 %o1, %s3488 %o3 = or i32 %o2, %s4489 ret i32 %o3490}491 492declare void @use(i8)493declare void @use2(i32)494 495define i32 @loadCombine_4consecutive_hasOneUse1(ptr %p) {496; ALL-LABEL: @loadCombine_4consecutive_hasOneUse1(497; ALL-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 1498; ALL-NEXT: [[P2:%.*]] = getelementptr i8, ptr [[P]], i32 2499; ALL-NEXT: [[P3:%.*]] = getelementptr i8, ptr [[P]], i32 3500; ALL-NEXT: [[L1:%.*]] = load i8, ptr [[P]], align 1501; ALL-NEXT: call void @use(i8 [[L1]])502; ALL-NEXT: [[L2:%.*]] = load i8, ptr [[P1]], align 1503; ALL-NEXT: call void @use(i8 [[L2]])504; ALL-NEXT: [[L3:%.*]] = load i8, ptr [[P2]], align 1505; ALL-NEXT: call void @use(i8 [[L3]])506; ALL-NEXT: [[L4:%.*]] = load i8, ptr [[P3]], align 1507; ALL-NEXT: call void @use(i8 [[L4]])508; ALL-NEXT: [[E1:%.*]] = zext i8 [[L1]] to i32509; ALL-NEXT: [[E2:%.*]] = zext i8 [[L2]] to i32510; ALL-NEXT: [[E3:%.*]] = zext i8 [[L3]] to i32511; ALL-NEXT: [[E4:%.*]] = zext i8 [[L4]] to i32512; ALL-NEXT: [[S2:%.*]] = shl i32 [[E2]], 8513; ALL-NEXT: [[S3:%.*]] = shl i32 [[E3]], 16514; ALL-NEXT: [[S4:%.*]] = shl i32 [[E4]], 24515; ALL-NEXT: [[O1:%.*]] = or i32 [[E1]], [[S2]]516; ALL-NEXT: [[O2:%.*]] = or i32 [[O1]], [[S3]]517; ALL-NEXT: [[O3:%.*]] = or i32 [[O2]], [[S4]]518; ALL-NEXT: ret i32 [[O3]]519;520 %p1 = getelementptr i8, ptr %p, i32 1521 %p2 = getelementptr i8, ptr %p, i32 2522 %p3 = getelementptr i8, ptr %p, i32 3523 %l1 = load i8, ptr %p524 call void @use(i8 %l1)525 %l2 = load i8, ptr %p1526 call void @use(i8 %l2)527 %l3 = load i8, ptr %p2528 call void @use(i8 %l3)529 %l4 = load i8, ptr %p3530 call void @use(i8 %l4)531 532 %e1 = zext i8 %l1 to i32533 %e2 = zext i8 %l2 to i32534 %e3 = zext i8 %l3 to i32535 %e4 = zext i8 %l4 to i32536 537 %s2 = shl i32 %e2, 8538 %s3 = shl i32 %e3, 16539 %s4 = shl i32 %e4, 24540 541 %o1 = or i32 %e1, %s2542 %o2 = or i32 %o1, %s3543 %o3 = or i32 %o2, %s4544 ret i32 %o3545}546 547define i32 @loadCombine_4consecutive_hasOneUse2(ptr %p) {548; ALL-LABEL: @loadCombine_4consecutive_hasOneUse2(549; ALL-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 1550; ALL-NEXT: [[P2:%.*]] = getelementptr i8, ptr [[P]], i32 2551; ALL-NEXT: [[P3:%.*]] = getelementptr i8, ptr [[P]], i32 3552; ALL-NEXT: [[L1:%.*]] = load i8, ptr [[P]], align 1553; ALL-NEXT: [[L2:%.*]] = load i8, ptr [[P1]], align 1554; ALL-NEXT: [[L3:%.*]] = load i8, ptr [[P2]], align 1555; ALL-NEXT: [[L4:%.*]] = load i8, ptr [[P3]], align 1556; ALL-NEXT: [[E1:%.*]] = zext i8 [[L1]] to i32557; ALL-NEXT: call void @use(i32 [[E1]])558; ALL-NEXT: [[E2:%.*]] = zext i8 [[L2]] to i32559; ALL-NEXT: call void @use(i32 [[E2]])560; ALL-NEXT: [[E3:%.*]] = zext i8 [[L3]] to i32561; ALL-NEXT: call void @use(i32 [[E3]])562; ALL-NEXT: [[E4:%.*]] = zext i8 [[L4]] to i32563; ALL-NEXT: call void @use(i32 [[E4]])564; ALL-NEXT: [[S2:%.*]] = shl i32 [[E2]], 8565; ALL-NEXT: [[S3:%.*]] = shl i32 [[E3]], 16566; ALL-NEXT: [[S4:%.*]] = shl i32 [[E4]], 24567; ALL-NEXT: [[O1:%.*]] = or i32 [[E1]], [[S2]]568; ALL-NEXT: [[O2:%.*]] = or i32 [[O1]], [[S3]]569; ALL-NEXT: [[O3:%.*]] = or i32 [[O2]], [[S4]]570; ALL-NEXT: ret i32 [[O3]]571;572 %p1 = getelementptr i8, ptr %p, i32 1573 %p2 = getelementptr i8, ptr %p, i32 2574 %p3 = getelementptr i8, ptr %p, i32 3575 %l1 = load i8, ptr %p576 %l2 = load i8, ptr %p1577 %l3 = load i8, ptr %p2578 %l4 = load i8, ptr %p3579 580 %e1 = zext i8 %l1 to i32581 call void @use(i32 %e1)582 %e2 = zext i8 %l2 to i32583 call void @use(i32 %e2)584 %e3 = zext i8 %l3 to i32585 call void @use(i32 %e3)586 %e4 = zext i8 %l4 to i32587 call void @use(i32 %e4)588 589 %s2 = shl i32 %e2, 8590 %s3 = shl i32 %e3, 16591 %s4 = shl i32 %e4, 24592 593 %o1 = or i32 %e1, %s2594 %o2 = or i32 %o1, %s3595 %o3 = or i32 %o2, %s4596 ret i32 %o3597}598 599define i32 @loadCombine_4consecutive_hasOneUse3(ptr %p) {600; ALL-LABEL: @loadCombine_4consecutive_hasOneUse3(601; ALL-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 1602; ALL-NEXT: [[P2:%.*]] = getelementptr i8, ptr [[P]], i32 2603; ALL-NEXT: [[P3:%.*]] = getelementptr i8, ptr [[P]], i32 3604; ALL-NEXT: [[L1:%.*]] = load i8, ptr [[P]], align 1605; ALL-NEXT: [[L2:%.*]] = load i8, ptr [[P1]], align 1606; ALL-NEXT: [[L3:%.*]] = load i8, ptr [[P2]], align 1607; ALL-NEXT: [[L4:%.*]] = load i8, ptr [[P3]], align 1608; ALL-NEXT: [[E1:%.*]] = zext i8 [[L1]] to i32609; ALL-NEXT: [[E2:%.*]] = zext i8 [[L2]] to i32610; ALL-NEXT: [[E3:%.*]] = zext i8 [[L3]] to i32611; ALL-NEXT: [[E4:%.*]] = zext i8 [[L4]] to i32612; ALL-NEXT: [[S2:%.*]] = shl i32 [[E2]], 8613; ALL-NEXT: call void @use(i32 [[S2]])614; ALL-NEXT: [[S3:%.*]] = shl i32 [[E3]], 16615; ALL-NEXT: call void @use(i32 [[S3]])616; ALL-NEXT: [[S4:%.*]] = shl i32 [[E4]], 24617; ALL-NEXT: call void @use(i32 [[S4]])618; ALL-NEXT: [[O1:%.*]] = or i32 [[E1]], [[S2]]619; ALL-NEXT: [[O2:%.*]] = or i32 [[O1]], [[S3]]620; ALL-NEXT: [[O3:%.*]] = or i32 [[O2]], [[S4]]621; ALL-NEXT: ret i32 [[O3]]622;623 %p1 = getelementptr i8, ptr %p, i32 1624 %p2 = getelementptr i8, ptr %p, i32 2625 %p3 = getelementptr i8, ptr %p, i32 3626 %l1 = load i8, ptr %p627 %l2 = load i8, ptr %p1628 %l3 = load i8, ptr %p2629 %l4 = load i8, ptr %p3630 631 %e1 = zext i8 %l1 to i32632 %e2 = zext i8 %l2 to i32633 %e3 = zext i8 %l3 to i32634 %e4 = zext i8 %l4 to i32635 636 %s2 = shl i32 %e2, 8637 call void @use(i32 %s2)638 %s3 = shl i32 %e3, 16639 call void @use(i32 %s3)640 %s4 = shl i32 %e4, 24641 call void @use(i32 %s4)642 643 %o1 = or i32 %e1, %s2644 %o2 = or i32 %o1, %s3645 %o3 = or i32 %o2, %s4646 ret i32 %o3647}648 649define i32 @loadCombine_4consecutive_hasOneUse4(ptr %p) {650; ALL-LABEL: @loadCombine_4consecutive_hasOneUse4(651; ALL-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 1652; ALL-NEXT: [[P2:%.*]] = getelementptr i8, ptr [[P]], i32 2653; ALL-NEXT: [[P3:%.*]] = getelementptr i8, ptr [[P]], i32 3654; ALL-NEXT: [[L1:%.*]] = load i8, ptr [[P]], align 1655; ALL-NEXT: [[L2:%.*]] = load i8, ptr [[P1]], align 1656; ALL-NEXT: [[L3:%.*]] = load i8, ptr [[P2]], align 1657; ALL-NEXT: [[L4:%.*]] = load i8, ptr [[P3]], align 1658; ALL-NEXT: [[E1:%.*]] = zext i8 [[L1]] to i32659; ALL-NEXT: [[E2:%.*]] = zext i8 [[L2]] to i32660; ALL-NEXT: [[E3:%.*]] = zext i8 [[L3]] to i32661; ALL-NEXT: [[E4:%.*]] = zext i8 [[L4]] to i32662; ALL-NEXT: [[S2:%.*]] = shl i32 [[E2]], 8663; ALL-NEXT: [[S3:%.*]] = shl i32 [[E3]], 16664; ALL-NEXT: [[S4:%.*]] = shl i32 [[E4]], 24665; ALL-NEXT: [[O1:%.*]] = or i32 [[E1]], [[S2]]666; ALL-NEXT: call void @use(i32 [[O1]])667; ALL-NEXT: [[O2:%.*]] = or i32 [[O1]], [[S3]]668; ALL-NEXT: call void @use(i32 [[O2]])669; ALL-NEXT: [[O3:%.*]] = or i32 [[O2]], [[S4]]670; ALL-NEXT: ret i32 [[O3]]671;672 %p1 = getelementptr i8, ptr %p, i32 1673 %p2 = getelementptr i8, ptr %p, i32 2674 %p3 = getelementptr i8, ptr %p, i32 3675 %l1 = load i8, ptr %p676 %l2 = load i8, ptr %p1677 %l3 = load i8, ptr %p2678 %l4 = load i8, ptr %p3679 680 %e1 = zext i8 %l1 to i32681 %e2 = zext i8 %l2 to i32682 %e3 = zext i8 %l3 to i32683 %e4 = zext i8 %l4 to i32684 685 %s2 = shl i32 %e2, 8686 %s3 = shl i32 %e3, 16687 %s4 = shl i32 %e4, 24688 689 %o1 = or i32 %e1, %s2690 call void @use(i32 %o1)691 %o2 = or i32 %o1, %s3692 call void @use(i32 %o2)693 %o3 = or i32 %o2, %s4694 ret i32 %o3695}696 697define i32 @loadCombine_parLoad1(ptr %p) {698; ALL-LABEL: @loadCombine_parLoad1(699; ALL-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 1700; ALL-NEXT: [[P2:%.*]] = getelementptr i8, ptr [[P]], i32 2701; ALL-NEXT: [[L1:%.*]] = load i8, ptr [[P]], align 1702; ALL-NEXT: [[L2:%.*]] = load i8, ptr [[P1]], align 1703; ALL-NEXT: [[L3:%.*]] = load i8, ptr [[P2]], align 1704; ALL-NEXT: [[E1:%.*]] = zext i8 [[L1]] to i32705; ALL-NEXT: [[E2:%.*]] = zext i8 [[L2]] to i32706; ALL-NEXT: [[E3:%.*]] = zext i8 [[L3]] to i32707; ALL-NEXT: [[S2:%.*]] = shl i32 [[E2]], 8708; ALL-NEXT: [[S3:%.*]] = shl i32 [[E3]], 16709; ALL-NEXT: [[O1:%.*]] = or i32 [[E1]], [[S2]]710; ALL-NEXT: [[O2:%.*]] = or i32 [[O1]], [[S3]]711; ALL-NEXT: ret i32 [[O2]]712;713 %p1 = getelementptr i8, ptr %p, i32 1714 %p2 = getelementptr i8, ptr %p, i32 2715 %l1 = load i8, ptr %p716 %l2 = load i8, ptr %p1717 %l3 = load i8, ptr %p2718 719 %e1 = zext i8 %l1 to i32720 %e2 = zext i8 %l2 to i32721 %e3 = zext i8 %l3 to i32722 723 %s2 = shl i32 %e2, 8724 %s3 = shl i32 %e3, 16725 726 %o1 = or i32 %e1, %s2727 %o2 = or i32 %o1, %s3728 ret i32 %o2729}730 731define i128 @loadCombine_i128(ptr %p) {732; LE-LABEL: @loadCombine_i128(733; LE-NEXT: [[P2:%.*]] = getelementptr i32, ptr [[P:%.*]], i32 2734; LE-NEXT: [[P3:%.*]] = getelementptr i32, ptr [[P]], i32 3735; LE-NEXT: [[L1:%.*]] = load i64, ptr [[P]], align 4736; LE-NEXT: [[TMP1:%.*]] = zext i64 [[L1]] to i128737; LE-NEXT: [[L3:%.*]] = load i32, ptr [[P2]], align 4738; LE-NEXT: [[L4:%.*]] = load i32, ptr [[P3]], align 4739; LE-NEXT: [[E3:%.*]] = zext i32 [[L3]] to i128740; LE-NEXT: [[E4:%.*]] = zext i32 [[L4]] to i128741; LE-NEXT: [[S3:%.*]] = shl i128 [[E3]], 64742; LE-NEXT: [[S4:%.*]] = shl i128 [[E4]], 96743; LE-NEXT: [[O2:%.*]] = or i128 [[TMP1]], [[S3]]744; LE-NEXT: [[O3:%.*]] = or i128 [[O2]], [[S4]]745; LE-NEXT: ret i128 [[O3]]746;747; BE-LABEL: @loadCombine_i128(748; BE-NEXT: [[P1:%.*]] = getelementptr i32, ptr [[P:%.*]], i32 1749; BE-NEXT: [[P2:%.*]] = getelementptr i32, ptr [[P]], i32 2750; BE-NEXT: [[P3:%.*]] = getelementptr i32, ptr [[P]], i32 3751; BE-NEXT: [[L1:%.*]] = load i32, ptr [[P]], align 4752; BE-NEXT: [[L2:%.*]] = load i32, ptr [[P1]], align 4753; BE-NEXT: [[L3:%.*]] = load i32, ptr [[P2]], align 4754; BE-NEXT: [[L4:%.*]] = load i32, ptr [[P3]], align 4755; BE-NEXT: [[E1:%.*]] = zext i32 [[L1]] to i128756; BE-NEXT: [[E2:%.*]] = zext i32 [[L2]] to i128757; BE-NEXT: [[E3:%.*]] = zext i32 [[L3]] to i128758; BE-NEXT: [[E4:%.*]] = zext i32 [[L4]] to i128759; BE-NEXT: [[S2:%.*]] = shl i128 [[E2]], 32760; BE-NEXT: [[S3:%.*]] = shl i128 [[E3]], 64761; BE-NEXT: [[S4:%.*]] = shl i128 [[E4]], 96762; BE-NEXT: [[O1:%.*]] = or i128 [[E1]], [[S2]]763; BE-NEXT: [[O2:%.*]] = or i128 [[O1]], [[S3]]764; BE-NEXT: [[O3:%.*]] = or i128 [[O2]], [[S4]]765; BE-NEXT: ret i128 [[O3]]766;767 %p1 = getelementptr i32, ptr %p, i32 1768 %p2 = getelementptr i32, ptr %p, i32 2769 %p3 = getelementptr i32, ptr %p, i32 3770 %l1 = load i32, ptr %p771 %l2 = load i32, ptr %p1772 %l3 = load i32, ptr %p2773 %l4 = load i32, ptr %p3774 775 %e1 = zext i32 %l1 to i128776 %e2 = zext i32 %l2 to i128777 %e3 = zext i32 %l3 to i128778 %e4 = zext i32 %l4 to i128779 780 %s2 = shl i128 %e2, 32781 %s3 = shl i128 %e3, 64782 %s4 = shl i128 %e4, 96783 784 %o1 = or i128 %e1, %s2785 %o2 = or i128 %o1, %s3786 %o3 = or i128 %o2, %s4787 ret i128 %o3788}789 790define i128 @loadCombine_i128_BE(ptr %p) {791; LE-LABEL: @loadCombine_i128_BE(792; LE-NEXT: [[P1:%.*]] = getelementptr i32, ptr [[P:%.*]], i32 1793; LE-NEXT: [[P2:%.*]] = getelementptr i32, ptr [[P]], i32 2794; LE-NEXT: [[P3:%.*]] = getelementptr i32, ptr [[P]], i32 3795; LE-NEXT: [[L1:%.*]] = load i32, ptr [[P]], align 4796; LE-NEXT: [[L2:%.*]] = load i32, ptr [[P1]], align 4797; LE-NEXT: [[L3:%.*]] = load i32, ptr [[P2]], align 4798; LE-NEXT: [[L4:%.*]] = load i32, ptr [[P3]], align 4799; LE-NEXT: [[E1:%.*]] = zext i32 [[L1]] to i128800; LE-NEXT: [[E2:%.*]] = zext i32 [[L2]] to i128801; LE-NEXT: [[E3:%.*]] = zext i32 [[L3]] to i128802; LE-NEXT: [[E4:%.*]] = zext i32 [[L4]] to i128803; LE-NEXT: [[S1:%.*]] = shl i128 [[E1]], 96804; LE-NEXT: [[S2:%.*]] = shl i128 [[E2]], 64805; LE-NEXT: [[S3:%.*]] = shl i128 [[E3]], 32806; LE-NEXT: [[O1:%.*]] = or i128 [[S1]], [[S2]]807; LE-NEXT: [[O2:%.*]] = or i128 [[O1]], [[S3]]808; LE-NEXT: [[O3:%.*]] = or i128 [[O2]], [[E4]]809; LE-NEXT: ret i128 [[O3]]810;811; BE-LABEL: @loadCombine_i128_BE(812; BE-NEXT: [[P2:%.*]] = getelementptr i32, ptr [[P:%.*]], i32 2813; BE-NEXT: [[P3:%.*]] = getelementptr i32, ptr [[P]], i32 3814; BE-NEXT: [[L1:%.*]] = load i64, ptr [[P]], align 4815; BE-NEXT: [[TMP1:%.*]] = zext i64 [[L1]] to i128816; BE-NEXT: [[TMP2:%.*]] = shl i128 [[TMP1]], 64817; BE-NEXT: [[L3:%.*]] = load i32, ptr [[P2]], align 4818; BE-NEXT: [[L4:%.*]] = load i32, ptr [[P3]], align 4819; BE-NEXT: [[E3:%.*]] = zext i32 [[L3]] to i128820; BE-NEXT: [[E4:%.*]] = zext i32 [[L4]] to i128821; BE-NEXT: [[S3:%.*]] = shl i128 [[E3]], 32822; BE-NEXT: [[O2:%.*]] = or i128 [[TMP2]], [[S3]]823; BE-NEXT: [[O3:%.*]] = or i128 [[O2]], [[E4]]824; BE-NEXT: ret i128 [[O3]]825;826 %p1 = getelementptr i32, ptr %p, i32 1827 %p2 = getelementptr i32, ptr %p, i32 2828 %p3 = getelementptr i32, ptr %p, i32 3829 %l1 = load i32, ptr %p830 %l2 = load i32, ptr %p1831 %l3 = load i32, ptr %p2832 %l4 = load i32, ptr %p3833 834 %e1 = zext i32 %l1 to i128835 %e2 = zext i32 %l2 to i128836 %e3 = zext i32 %l3 to i128837 %e4 = zext i32 %l4 to i128838 839 %s1 = shl i128 %e1, 96840 %s2 = shl i128 %e2, 64841 %s3 = shl i128 %e3, 32842 843 %o1 = or i128 %s1, %s2844 %o2 = or i128 %o1, %s3845 %o3 = or i128 %o2, %e4846 ret i128 %o3847}848 849define i64 @loadCombine_i64(ptr %p) {850; LE-LABEL: @loadCombine_i64(851; LE-NEXT: [[L1:%.*]] = load i64, ptr [[P:%.*]], align 2852; LE-NEXT: ret i64 [[L1]]853;854; BE-LABEL: @loadCombine_i64(855; BE-NEXT: [[P1:%.*]] = getelementptr i16, ptr [[P:%.*]], i32 1856; BE-NEXT: [[P2:%.*]] = getelementptr i16, ptr [[P]], i32 2857; BE-NEXT: [[P3:%.*]] = getelementptr i16, ptr [[P]], i32 3858; BE-NEXT: [[L1:%.*]] = load i16, ptr [[P]], align 2859; BE-NEXT: [[L2:%.*]] = load i16, ptr [[P1]], align 2860; BE-NEXT: [[L3:%.*]] = load i16, ptr [[P2]], align 2861; BE-NEXT: [[L4:%.*]] = load i16, ptr [[P3]], align 2862; BE-NEXT: [[E1:%.*]] = zext i16 [[L1]] to i64863; BE-NEXT: [[E2:%.*]] = zext i16 [[L2]] to i64864; BE-NEXT: [[E3:%.*]] = zext i16 [[L3]] to i64865; BE-NEXT: [[E4:%.*]] = zext i16 [[L4]] to i64866; BE-NEXT: [[S2:%.*]] = shl i64 [[E2]], 16867; BE-NEXT: [[S3:%.*]] = shl i64 [[E3]], 32868; BE-NEXT: [[S4:%.*]] = shl i64 [[E4]], 48869; BE-NEXT: [[O1:%.*]] = or i64 [[E1]], [[S2]]870; BE-NEXT: [[O2:%.*]] = or i64 [[O1]], [[S3]]871; BE-NEXT: [[O3:%.*]] = or i64 [[O2]], [[S4]]872; BE-NEXT: ret i64 [[O3]]873;874 %p1 = getelementptr i16, ptr %p, i32 1875 %p2 = getelementptr i16, ptr %p, i32 2876 %p3 = getelementptr i16, ptr %p, i32 3877 %l1 = load i16, ptr %p878 %l2 = load i16, ptr %p1879 %l3 = load i16, ptr %p2880 %l4 = load i16, ptr %p3881 882 %e1 = zext i16 %l1 to i64883 %e2 = zext i16 %l2 to i64884 %e3 = zext i16 %l3 to i64885 %e4 = zext i16 %l4 to i64886 887 %s2 = shl i64 %e2, 16888 %s3 = shl i64 %e3, 32889 %s4 = shl i64 %e4, 48890 891 %o1 = or i64 %e1, %s2892 %o2 = or i64 %o1, %s3893 %o3 = or i64 %o2, %s4894 ret i64 %o3895}896 897define i64 @loadCombine_i64_BE(ptr %p) {898; LE-LABEL: @loadCombine_i64_BE(899; LE-NEXT: [[P1:%.*]] = getelementptr i16, ptr [[P:%.*]], i32 1900; LE-NEXT: [[P2:%.*]] = getelementptr i16, ptr [[P]], i32 2901; LE-NEXT: [[P3:%.*]] = getelementptr i16, ptr [[P]], i32 3902; LE-NEXT: [[L1:%.*]] = load i16, ptr [[P]], align 2903; LE-NEXT: [[L2:%.*]] = load i16, ptr [[P1]], align 2904; LE-NEXT: [[L3:%.*]] = load i16, ptr [[P2]], align 2905; LE-NEXT: [[L4:%.*]] = load i16, ptr [[P3]], align 2906; LE-NEXT: [[E1:%.*]] = zext i16 [[L1]] to i64907; LE-NEXT: [[E2:%.*]] = zext i16 [[L2]] to i64908; LE-NEXT: [[E3:%.*]] = zext i16 [[L3]] to i64909; LE-NEXT: [[E4:%.*]] = zext i16 [[L4]] to i64910; LE-NEXT: [[S1:%.*]] = shl i64 [[E1]], 48911; LE-NEXT: [[S2:%.*]] = shl i64 [[E2]], 32912; LE-NEXT: [[S3:%.*]] = shl i64 [[E3]], 16913; LE-NEXT: [[O1:%.*]] = or i64 [[S1]], [[S2]]914; LE-NEXT: [[O2:%.*]] = or i64 [[O1]], [[S3]]915; LE-NEXT: [[O3:%.*]] = or i64 [[O2]], [[E4]]916; LE-NEXT: ret i64 [[O3]]917;918; BE-LABEL: @loadCombine_i64_BE(919; BE-NEXT: [[L1:%.*]] = load i64, ptr [[P:%.*]], align 2920; BE-NEXT: ret i64 [[L1]]921;922 %p1 = getelementptr i16, ptr %p, i32 1923 %p2 = getelementptr i16, ptr %p, i32 2924 %p3 = getelementptr i16, ptr %p, i32 3925 %l1 = load i16, ptr %p926 %l2 = load i16, ptr %p1927 %l3 = load i16, ptr %p2928 %l4 = load i16, ptr %p3929 930 %e1 = zext i16 %l1 to i64931 %e2 = zext i16 %l2 to i64932 %e3 = zext i16 %l3 to i64933 %e4 = zext i16 %l4 to i64934 935 %s1 = shl i64 %e1, 48936 %s2 = shl i64 %e2, 32937 %s3 = shl i64 %e3, 16938 939 %o1 = or i64 %s1, %s2940 %o2 = or i64 %o1, %s3941 %o3 = or i64 %o2, %e4942 ret i64 %o3943}944 945define i16 @loadCombine_2consecutive_atomic(ptr %p) {946; ALL-LABEL: @loadCombine_2consecutive_atomic(947; ALL-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 1948; ALL-NEXT: [[L1:%.*]] = load atomic i8, ptr [[P]] monotonic, align 1949; ALL-NEXT: [[L2:%.*]] = load atomic i8, ptr [[P1]] monotonic, align 1950; ALL-NEXT: [[E1:%.*]] = zext i8 [[L1]] to i16951; ALL-NEXT: [[E2:%.*]] = zext i8 [[L2]] to i16952; ALL-NEXT: [[S2:%.*]] = shl i16 [[E2]], 8953; ALL-NEXT: [[O1:%.*]] = or i16 [[E1]], [[S2]]954; ALL-NEXT: ret i16 [[O1]]955;956 %p1 = getelementptr i8, ptr %p, i32 1957 %l1 = load atomic i8, ptr %p monotonic, align 1958 %l2 = load atomic i8, ptr %p1 monotonic, align 1959 %e1 = zext i8 %l1 to i16960 %e2 = zext i8 %l2 to i16961 %s2 = shl i16 %e2, 8962 %o1 = or i16 %e1, %s2963 ret i16 %o1964}965 966define i16 @loadCombine_2consecutive_volatile(ptr %p) {967; ALL-LABEL: @loadCombine_2consecutive_volatile(968; ALL-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 1969; ALL-NEXT: [[L1:%.*]] = load volatile i8, ptr [[P]], align 1970; ALL-NEXT: [[L2:%.*]] = load volatile i8, ptr [[P1]], align 1971; ALL-NEXT: [[E1:%.*]] = zext i8 [[L1]] to i16972; ALL-NEXT: [[E2:%.*]] = zext i8 [[L2]] to i16973; ALL-NEXT: [[S2:%.*]] = shl i16 [[E2]], 8974; ALL-NEXT: [[O1:%.*]] = or i16 [[E1]], [[S2]]975; ALL-NEXT: ret i16 [[O1]]976;977 %p1 = getelementptr i8, ptr %p, i32 1978 %l1 = load volatile i8, ptr %p, align 1979 %l2 = load volatile i8, ptr %p1, align 1980 %e1 = zext i8 %l1 to i16981 %e2 = zext i8 %l2 to i16982 %s2 = shl i16 %e2, 8983 %o1 = or i16 %e1, %s2984 ret i16 %o1985}986 987define i16 @loadCombine_2consecutive_separateBB(ptr %p) {988; ALL-LABEL: @loadCombine_2consecutive_separateBB(989; ALL-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 1990; ALL-NEXT: [[L1:%.*]] = load i8, ptr [[P]], align 1991; ALL-NEXT: br label [[BB2:%.*]]992; ALL: bb2:993; ALL-NEXT: [[L2:%.*]] = load i8, ptr [[P1]], align 1994; ALL-NEXT: [[E1:%.*]] = zext i8 [[L1]] to i16995; ALL-NEXT: [[E2:%.*]] = zext i8 [[L2]] to i16996; ALL-NEXT: [[S2:%.*]] = shl i16 [[E2]], 8997; ALL-NEXT: [[O1:%.*]] = or i16 [[E1]], [[S2]]998; ALL-NEXT: ret i16 [[O1]]999;1000 %p1 = getelementptr i8, ptr %p, i32 11001 %l1 = load i8, ptr %p, align 11002 br label %bb21003 1004bb2:1005 %l2 = load i8, ptr %p1, align 11006 %e1 = zext i8 %l1 to i161007 %e2 = zext i8 %l2 to i161008 %s2 = shl i16 %e2, 81009 %o1 = or i16 %e1, %s21010 ret i16 %o11011}1012 1013define i16 @loadCombine_2consecutive_separateptr(ptr %p, ptr %p2) {1014; ALL-LABEL: @loadCombine_2consecutive_separateptr(1015; ALL-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[P2:%.*]], i32 11016; ALL-NEXT: [[L1:%.*]] = load i8, ptr [[P:%.*]], align 11017; ALL-NEXT: [[L2:%.*]] = load i8, ptr [[P1]], align 11018; ALL-NEXT: [[E1:%.*]] = zext i8 [[L1]] to i161019; ALL-NEXT: [[E2:%.*]] = zext i8 [[L2]] to i161020; ALL-NEXT: [[S2:%.*]] = shl i16 [[E2]], 81021; ALL-NEXT: [[O1:%.*]] = or i16 [[E1]], [[S2]]1022; ALL-NEXT: ret i16 [[O1]]1023;1024 %p1 = getelementptr i8, ptr %p2, i32 11025 %l1 = load i8, ptr %p, align 11026 %l2 = load i8, ptr %p1, align 11027 %e1 = zext i8 %l1 to i161028 %e2 = zext i8 %l2 to i161029 %s2 = shl i16 %e2, 81030 %o1 = or i16 %e1, %s21031 ret i16 %o11032}1033 1034define i64 @load64_farLoads(ptr %ptr) {1035; LE-LABEL: @load64_farLoads(1036; LE-NEXT: entry:1037; LE-NEXT: [[TMP0:%.*]] = load i64, ptr [[PTR:%.*]], align 11038; LE-NEXT: ret i64 [[TMP0]]1039;1040; BE-LABEL: @load64_farLoads(1041; BE-NEXT: entry:1042; BE-NEXT: [[TMP0:%.*]] = load i8, ptr [[PTR:%.*]], align 11043; BE-NEXT: [[CONV:%.*]] = zext i8 [[TMP0]] to i641044; BE-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i64 11045; BE-NEXT: [[TMP1:%.*]] = load i8, ptr [[ARRAYIDX1]], align 11046; BE-NEXT: [[CONV2:%.*]] = zext i8 [[TMP1]] to i641047; BE-NEXT: [[SHL:%.*]] = shl i64 [[CONV2]], 81048; BE-NEXT: [[OR:%.*]] = or i64 [[CONV]], [[SHL]]1049; BE-NEXT: [[ARRAYIDX3:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i64 21050; BE-NEXT: [[TMP2:%.*]] = load i8, ptr [[ARRAYIDX3]], align 11051; BE-NEXT: [[CONV4:%.*]] = zext i8 [[TMP2]] to i641052; BE-NEXT: [[SHL5:%.*]] = shl i64 [[CONV4]], 161053; BE-NEXT: [[OR6:%.*]] = or i64 [[OR]], [[SHL5]]1054; BE-NEXT: [[ARRAYIDX7:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i64 31055; BE-NEXT: [[TMP3:%.*]] = load i8, ptr [[ARRAYIDX7]], align 11056; BE-NEXT: [[CONV8:%.*]] = zext i8 [[TMP3]] to i641057; BE-NEXT: [[SHL9:%.*]] = shl i64 [[CONV8]], 241058; BE-NEXT: [[OR10:%.*]] = or i64 [[OR6]], [[SHL9]]1059; BE-NEXT: [[ARRAYIDX11:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i64 41060; BE-NEXT: [[TMP4:%.*]] = load i8, ptr [[ARRAYIDX11]], align 11061; BE-NEXT: [[CONV12:%.*]] = zext i8 [[TMP4]] to i641062; BE-NEXT: [[SHL13:%.*]] = shl i64 [[CONV12]], 321063; BE-NEXT: [[OR14:%.*]] = or i64 [[OR10]], [[SHL13]]1064; BE-NEXT: [[ARRAYIDX15:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i64 51065; BE-NEXT: [[TMP5:%.*]] = load i8, ptr [[ARRAYIDX15]], align 11066; BE-NEXT: [[CONV16:%.*]] = zext i8 [[TMP5]] to i641067; BE-NEXT: [[SHL17:%.*]] = shl i64 [[CONV16]], 401068; BE-NEXT: [[OR18:%.*]] = or i64 [[OR14]], [[SHL17]]1069; BE-NEXT: [[ARRAYIDX19:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i64 61070; BE-NEXT: [[TMP6:%.*]] = load i8, ptr [[ARRAYIDX19]], align 11071; BE-NEXT: [[CONV20:%.*]] = zext i8 [[TMP6]] to i641072; BE-NEXT: [[SHL21:%.*]] = shl i64 [[CONV20]], 481073; BE-NEXT: [[OR22:%.*]] = or i64 [[OR18]], [[SHL21]]1074; BE-NEXT: [[ARRAYIDX23:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i64 71075; BE-NEXT: [[TMP7:%.*]] = load i8, ptr [[ARRAYIDX23]], align 11076; BE-NEXT: [[CONV24:%.*]] = zext i8 [[TMP7]] to i641077; BE-NEXT: [[SHL25:%.*]] = shl i64 [[CONV24]], 561078; BE-NEXT: [[OR26:%.*]] = or i64 [[OR22]], [[SHL25]]1079; BE-NEXT: ret i64 [[OR26]]1080;1081entry:1082 %0 = load i8, ptr %ptr, align 11083 %conv = zext i8 %0 to i641084 %arrayidx1 = getelementptr inbounds i8, ptr %ptr, i64 11085 %1 = load i8, ptr %arrayidx1, align 11086 %conv2 = zext i8 %1 to i641087 %shl = shl i64 %conv2, 81088 %or = or i64 %conv, %shl1089 %arrayidx3 = getelementptr inbounds i8, ptr %ptr, i64 21090 %2 = load i8, ptr %arrayidx3, align 11091 %conv4 = zext i8 %2 to i641092 %shl5 = shl i64 %conv4, 161093 %or6 = or i64 %or, %shl51094 %arrayidx7 = getelementptr inbounds i8, ptr %ptr, i64 31095 %3 = load i8, ptr %arrayidx7, align 11096 %conv8 = zext i8 %3 to i641097 %shl9 = shl i64 %conv8, 241098 %or10 = or i64 %or6, %shl91099 %arrayidx11 = getelementptr inbounds i8, ptr %ptr, i64 41100 %4 = load i8, ptr %arrayidx11, align 11101 %conv12 = zext i8 %4 to i641102 %shl13 = shl i64 %conv12, 321103 %or14 = or i64 %or10, %shl131104 %arrayidx15 = getelementptr inbounds i8, ptr %ptr, i64 51105 %5 = load i8, ptr %arrayidx15, align 11106 %conv16 = zext i8 %5 to i641107 %shl17 = shl i64 %conv16, 401108 %or18 = or i64 %or14, %shl171109 %arrayidx19 = getelementptr inbounds i8, ptr %ptr, i64 61110 %6 = load i8, ptr %arrayidx19, align 11111 %conv20 = zext i8 %6 to i641112 %shl21 = shl i64 %conv20, 481113 %or22 = or i64 %or18, %shl211114 %arrayidx23 = getelementptr inbounds i8, ptr %ptr, i64 71115 %7 = load i8, ptr %arrayidx23, align 11116 %conv24 = zext i8 %7 to i641117 %shl25 = shl i64 %conv24, 561118 %or26 = or i64 %or22, %shl251119 ret i64 %or261120}1121 1122define i32 @loadCombine_4consecutive_metadata(ptr %p, ptr %pstr) {1123; LE-LABEL: @loadCombine_4consecutive_metadata(1124; LE-NEXT: [[L1:%.*]] = load i32, ptr [[P:%.*]], align 1, !alias.scope [[META0:![0-9]+]]1125; LE-NEXT: store i32 25, ptr [[PSTR:%.*]], align 4, !noalias [[META0]]1126; LE-NEXT: ret i32 [[L1]]1127;1128; BE-LABEL: @loadCombine_4consecutive_metadata(1129; BE-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 11130; BE-NEXT: [[P2:%.*]] = getelementptr i8, ptr [[P]], i32 21131; BE-NEXT: [[P3:%.*]] = getelementptr i8, ptr [[P]], i32 31132; BE-NEXT: [[L1:%.*]] = load i8, ptr [[P]], align 1, !alias.scope [[META0:![0-9]+]]1133; BE-NEXT: [[L2:%.*]] = load i8, ptr [[P1]], align 1, !alias.scope [[META0]]1134; BE-NEXT: [[L3:%.*]] = load i8, ptr [[P2]], align 1, !alias.scope [[META0]]1135; BE-NEXT: [[L4:%.*]] = load i8, ptr [[P3]], align 1, !alias.scope [[META0]]1136; BE-NEXT: store i32 25, ptr [[PSTR:%.*]], align 4, !noalias [[META0]]1137; BE-NEXT: [[E1:%.*]] = zext i8 [[L1]] to i321138; BE-NEXT: [[E2:%.*]] = zext i8 [[L2]] to i321139; BE-NEXT: [[E3:%.*]] = zext i8 [[L3]] to i321140; BE-NEXT: [[E4:%.*]] = zext i8 [[L4]] to i321141; BE-NEXT: [[S2:%.*]] = shl i32 [[E2]], 81142; BE-NEXT: [[S3:%.*]] = shl i32 [[E3]], 161143; BE-NEXT: [[S4:%.*]] = shl i32 [[E4]], 241144; BE-NEXT: [[O1:%.*]] = or i32 [[E1]], [[S2]]1145; BE-NEXT: [[O2:%.*]] = or i32 [[O1]], [[S3]]1146; BE-NEXT: [[O3:%.*]] = or i32 [[O2]], [[S4]]1147; BE-NEXT: ret i32 [[O3]]1148;1149 %p1 = getelementptr i8, ptr %p, i32 11150 %p2 = getelementptr i8, ptr %p, i32 21151 %p3 = getelementptr i8, ptr %p, i32 31152 %l1 = load i8, ptr %p, !alias.scope !21153 %l2 = load i8, ptr %p1, !alias.scope !21154 %l3 = load i8, ptr %p2, !alias.scope !21155 %l4 = load i8, ptr %p3, !alias.scope !21156 store i32 25, ptr %pstr, !noalias !21157 1158 %e1 = zext i8 %l1 to i321159 %e2 = zext i8 %l2 to i321160 %e3 = zext i8 %l3 to i321161 %e4 = zext i8 %l4 to i321162 1163 %s2 = shl i32 %e2, 81164 %s3 = shl i32 %e3, 161165 %s4 = shl i32 %e4, 241166 1167 %o1 = or i32 %e1, %s21168 %o2 = or i32 %o1, %s31169 %o3 = or i32 %o2, %s41170 ret i32 %o31171}1172 1173!0 = distinct !{!0}1174!1 = distinct !{!1, !0}1175!2 = !{!1}1176 1177; CHECK: !0 = !{!1}1178; CHECK: !1 = distinct !{!1, !2}1179; CHECK: !2 = distinct !{!2}1180 1181define i16 @loadCombine_4consecutive_4bit(ptr %p) {1182; ALL-LABEL: @loadCombine_4consecutive_4bit(1183; ALL-NEXT: [[P1:%.*]] = getelementptr i4, ptr [[P:%.*]], i32 11184; ALL-NEXT: [[P2:%.*]] = getelementptr i4, ptr [[P]], i32 21185; ALL-NEXT: [[P3:%.*]] = getelementptr i4, ptr [[P]], i32 31186; ALL-NEXT: [[L1:%.*]] = load i4, ptr [[P]], align 11187; ALL-NEXT: [[L2:%.*]] = load i4, ptr [[P1]], align 11188; ALL-NEXT: [[L3:%.*]] = load i4, ptr [[P2]], align 11189; ALL-NEXT: [[L4:%.*]] = load i4, ptr [[P3]], align 11190; ALL-NEXT: [[E1:%.*]] = zext i4 [[L1]] to i161191; ALL-NEXT: [[E2:%.*]] = zext i4 [[L2]] to i161192; ALL-NEXT: [[E3:%.*]] = zext i4 [[L3]] to i161193; ALL-NEXT: [[E4:%.*]] = zext i4 [[L4]] to i161194; ALL-NEXT: [[S2:%.*]] = shl i16 [[E2]], 41195; ALL-NEXT: [[S3:%.*]] = shl i16 [[E3]], 81196; ALL-NEXT: [[S4:%.*]] = shl i16 [[E4]], 121197; ALL-NEXT: [[O1:%.*]] = or i16 [[E1]], [[S2]]1198; ALL-NEXT: [[O2:%.*]] = or i16 [[O1]], [[S3]]1199; ALL-NEXT: [[O3:%.*]] = or i16 [[O2]], [[S4]]1200; ALL-NEXT: ret i16 [[O3]]1201;1202 %p1 = getelementptr i4, ptr %p, i32 11203 %p2 = getelementptr i4, ptr %p, i32 21204 %p3 = getelementptr i4, ptr %p, i32 31205 %l1 = load i4, ptr %p1206 %l2 = load i4, ptr %p11207 %l3 = load i4, ptr %p21208 %l4 = load i4, ptr %p31209 %e1 = zext i4 %l1 to i161210 %e2 = zext i4 %l2 to i161211 %e3 = zext i4 %l3 to i161212 %e4 = zext i4 %l4 to i161213 %s2 = shl i16 %e2, 41214 %s3 = shl i16 %e3, 81215 %s4 = shl i16 %e4, 121216 %o1 = or i16 %e1, %s21217 %o2 = or i16 %o1, %s31218 %o3 = or i16 %o2, %s41219 ret i16 %o31220}1221 1222define i32 @loadCombine_4consecutive_rev(ptr %p) {1223; LE-LABEL: @loadCombine_4consecutive_rev(1224; LE-NEXT: [[L1:%.*]] = load i32, ptr [[P:%.*]], align 11225; LE-NEXT: ret i32 [[L1]]1226;1227; BE-LABEL: @loadCombine_4consecutive_rev(1228; BE-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 11229; BE-NEXT: [[P2:%.*]] = getelementptr i8, ptr [[P]], i32 21230; BE-NEXT: [[P3:%.*]] = getelementptr i8, ptr [[P]], i32 31231; BE-NEXT: [[L1:%.*]] = load i8, ptr [[P]], align 11232; BE-NEXT: [[L2:%.*]] = load i8, ptr [[P1]], align 11233; BE-NEXT: [[L3:%.*]] = load i8, ptr [[P2]], align 11234; BE-NEXT: [[L4:%.*]] = load i8, ptr [[P3]], align 11235; BE-NEXT: [[E1:%.*]] = zext i8 [[L1]] to i321236; BE-NEXT: [[E2:%.*]] = zext i8 [[L2]] to i321237; BE-NEXT: [[E3:%.*]] = zext i8 [[L3]] to i321238; BE-NEXT: [[E4:%.*]] = zext i8 [[L4]] to i321239; BE-NEXT: [[S2:%.*]] = shl i32 [[E2]], 81240; BE-NEXT: [[S3:%.*]] = shl i32 [[E3]], 161241; BE-NEXT: [[S4:%.*]] = shl i32 [[E4]], 241242; BE-NEXT: [[O1:%.*]] = or i32 [[S4]], [[S3]]1243; BE-NEXT: [[O2:%.*]] = or i32 [[O1]], [[S2]]1244; BE-NEXT: [[O3:%.*]] = or i32 [[O2]], [[E1]]1245; BE-NEXT: ret i32 [[O3]]1246;1247 %p1 = getelementptr i8, ptr %p, i32 11248 %p2 = getelementptr i8, ptr %p, i32 21249 %p3 = getelementptr i8, ptr %p, i32 31250 %l1 = load i8, ptr %p1251 %l2 = load i8, ptr %p11252 %l3 = load i8, ptr %p21253 %l4 = load i8, ptr %p31254 1255 %e1 = zext i8 %l1 to i321256 %e2 = zext i8 %l2 to i321257 %e3 = zext i8 %l3 to i321258 %e4 = zext i8 %l4 to i321259 1260 %s2 = shl i32 %e2, 81261 %s3 = shl i32 %e3, 161262 %s4 = shl i32 %e4, 241263 1264 %o1 = or i32 %s4, %s31265 %o2 = or i32 %o1, %s21266 %o3 = or i32 %o2, %e11267 ret i32 %o31268}1269 1270define i64 @loadCombine_8consecutive_rev(ptr %p) {1271; LE-LABEL: @loadCombine_8consecutive_rev(1272; LE-NEXT: [[L1:%.*]] = load i64, ptr [[P:%.*]], align 11273; LE-NEXT: ret i64 [[L1]]1274;1275; BE-LABEL: @loadCombine_8consecutive_rev(1276; BE-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 11277; BE-NEXT: [[P2:%.*]] = getelementptr i8, ptr [[P]], i32 21278; BE-NEXT: [[P3:%.*]] = getelementptr i8, ptr [[P]], i32 31279; BE-NEXT: [[P4:%.*]] = getelementptr i8, ptr [[P]], i32 41280; BE-NEXT: [[P5:%.*]] = getelementptr i8, ptr [[P]], i32 51281; BE-NEXT: [[P6:%.*]] = getelementptr i8, ptr [[P]], i32 61282; BE-NEXT: [[P7:%.*]] = getelementptr i8, ptr [[P]], i32 71283; BE-NEXT: [[L1:%.*]] = load i8, ptr [[P]], align 11284; BE-NEXT: [[L2:%.*]] = load i8, ptr [[P1]], align 11285; BE-NEXT: [[L3:%.*]] = load i8, ptr [[P2]], align 11286; BE-NEXT: [[L4:%.*]] = load i8, ptr [[P3]], align 11287; BE-NEXT: [[L5:%.*]] = load i8, ptr [[P4]], align 11288; BE-NEXT: [[L6:%.*]] = load i8, ptr [[P5]], align 11289; BE-NEXT: [[L7:%.*]] = load i8, ptr [[P6]], align 11290; BE-NEXT: [[L8:%.*]] = load i8, ptr [[P7]], align 11291; BE-NEXT: [[E1:%.*]] = zext i8 [[L1]] to i641292; BE-NEXT: [[E2:%.*]] = zext i8 [[L2]] to i641293; BE-NEXT: [[E3:%.*]] = zext i8 [[L3]] to i641294; BE-NEXT: [[E4:%.*]] = zext i8 [[L4]] to i641295; BE-NEXT: [[E5:%.*]] = zext i8 [[L5]] to i641296; BE-NEXT: [[E6:%.*]] = zext i8 [[L6]] to i641297; BE-NEXT: [[E7:%.*]] = zext i8 [[L7]] to i641298; BE-NEXT: [[E8:%.*]] = zext i8 [[L8]] to i641299; BE-NEXT: [[S2:%.*]] = shl i64 [[E2]], 81300; BE-NEXT: [[S3:%.*]] = shl i64 [[E3]], 161301; BE-NEXT: [[S4:%.*]] = shl i64 [[E4]], 241302; BE-NEXT: [[S5:%.*]] = shl i64 [[E5]], 321303; BE-NEXT: [[S6:%.*]] = shl i64 [[E6]], 401304; BE-NEXT: [[S7:%.*]] = shl i64 [[E7]], 481305; BE-NEXT: [[S8:%.*]] = shl i64 [[E8]], 561306; BE-NEXT: [[O7:%.*]] = or i64 [[S8]], [[S7]]1307; BE-NEXT: [[O6:%.*]] = or i64 [[O7]], [[S6]]1308; BE-NEXT: [[O5:%.*]] = or i64 [[O6]], [[S5]]1309; BE-NEXT: [[O4:%.*]] = or i64 [[O5]], [[S4]]1310; BE-NEXT: [[O3:%.*]] = or i64 [[O4]], [[S3]]1311; BE-NEXT: [[O2:%.*]] = or i64 [[O3]], [[S2]]1312; BE-NEXT: [[O1:%.*]] = or i64 [[O2]], [[E1]]1313; BE-NEXT: ret i64 [[O1]]1314;1315 %p1 = getelementptr i8, ptr %p, i32 11316 %p2 = getelementptr i8, ptr %p, i32 21317 %p3 = getelementptr i8, ptr %p, i32 31318 %p4 = getelementptr i8, ptr %p, i32 41319 %p5 = getelementptr i8, ptr %p, i32 51320 %p6 = getelementptr i8, ptr %p, i32 61321 %p7 = getelementptr i8, ptr %p, i32 71322 %l1 = load i8, ptr %p1323 %l2 = load i8, ptr %p11324 %l3 = load i8, ptr %p21325 %l4 = load i8, ptr %p31326 %l5 = load i8, ptr %p41327 %l6 = load i8, ptr %p51328 %l7 = load i8, ptr %p61329 %l8 = load i8, ptr %p71330 1331 %e1 = zext i8 %l1 to i641332 %e2 = zext i8 %l2 to i641333 %e3 = zext i8 %l3 to i641334 %e4 = zext i8 %l4 to i641335 %e5 = zext i8 %l5 to i641336 %e6 = zext i8 %l6 to i641337 %e7 = zext i8 %l7 to i641338 %e8 = zext i8 %l8 to i641339 1340 %s2 = shl i64 %e2, 81341 %s3 = shl i64 %e3, 161342 %s4 = shl i64 %e4, 241343 %s5 = shl i64 %e5, 321344 %s6 = shl i64 %e6, 401345 %s7 = shl i64 %e7, 481346 %s8 = shl i64 %e8, 561347 1348 %o7 = or i64 %s8, %s71349 %o6 = or i64 %o7, %s61350 %o5 = or i64 %o6, %s51351 %o4 = or i64 %o5, %s41352 %o3 = or i64 %o4, %s31353 %o2 = or i64 %o3, %s21354 %o1 = or i64 %o2, %e11355 ret i64 %o11356}1357 1358define i64 @loadCombine_8consecutive_rev_BE(ptr %p) {1359; LE-LABEL: @loadCombine_8consecutive_rev_BE(1360; LE-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 11361; LE-NEXT: [[P2:%.*]] = getelementptr i8, ptr [[P]], i32 21362; LE-NEXT: [[P3:%.*]] = getelementptr i8, ptr [[P]], i32 31363; LE-NEXT: [[P4:%.*]] = getelementptr i8, ptr [[P]], i32 41364; LE-NEXT: [[P5:%.*]] = getelementptr i8, ptr [[P]], i32 51365; LE-NEXT: [[P6:%.*]] = getelementptr i8, ptr [[P]], i32 61366; LE-NEXT: [[P7:%.*]] = getelementptr i8, ptr [[P]], i32 71367; LE-NEXT: [[L1:%.*]] = load i8, ptr [[P]], align 11368; LE-NEXT: [[L2:%.*]] = load i8, ptr [[P1]], align 11369; LE-NEXT: [[L3:%.*]] = load i8, ptr [[P2]], align 11370; LE-NEXT: [[L4:%.*]] = load i8, ptr [[P3]], align 11371; LE-NEXT: [[L5:%.*]] = load i8, ptr [[P4]], align 11372; LE-NEXT: [[L6:%.*]] = load i8, ptr [[P5]], align 11373; LE-NEXT: [[L7:%.*]] = load i8, ptr [[P6]], align 11374; LE-NEXT: [[L8:%.*]] = load i8, ptr [[P7]], align 11375; LE-NEXT: [[E1:%.*]] = zext i8 [[L1]] to i641376; LE-NEXT: [[E2:%.*]] = zext i8 [[L2]] to i641377; LE-NEXT: [[E3:%.*]] = zext i8 [[L3]] to i641378; LE-NEXT: [[E4:%.*]] = zext i8 [[L4]] to i641379; LE-NEXT: [[E5:%.*]] = zext i8 [[L5]] to i641380; LE-NEXT: [[E6:%.*]] = zext i8 [[L6]] to i641381; LE-NEXT: [[E7:%.*]] = zext i8 [[L7]] to i641382; LE-NEXT: [[E8:%.*]] = zext i8 [[L8]] to i641383; LE-NEXT: [[S1:%.*]] = shl i64 [[E1]], 561384; LE-NEXT: [[S2:%.*]] = shl i64 [[E2]], 481385; LE-NEXT: [[S3:%.*]] = shl i64 [[E3]], 401386; LE-NEXT: [[S4:%.*]] = shl i64 [[E4]], 321387; LE-NEXT: [[S5:%.*]] = shl i64 [[E5]], 241388; LE-NEXT: [[S6:%.*]] = shl i64 [[E6]], 161389; LE-NEXT: [[S7:%.*]] = shl i64 [[E7]], 81390; LE-NEXT: [[O7:%.*]] = or i64 [[E8]], [[S7]]1391; LE-NEXT: [[O6:%.*]] = or i64 [[O7]], [[S6]]1392; LE-NEXT: [[O5:%.*]] = or i64 [[O6]], [[S5]]1393; LE-NEXT: [[O4:%.*]] = or i64 [[O5]], [[S4]]1394; LE-NEXT: [[O3:%.*]] = or i64 [[O4]], [[S3]]1395; LE-NEXT: [[O2:%.*]] = or i64 [[O3]], [[S2]]1396; LE-NEXT: [[O1:%.*]] = or i64 [[O2]], [[S1]]1397; LE-NEXT: ret i64 [[O1]]1398;1399; BE-LABEL: @loadCombine_8consecutive_rev_BE(1400; BE-NEXT: [[L1:%.*]] = load i64, ptr [[P:%.*]], align 11401; BE-NEXT: ret i64 [[L1]]1402;1403 %p1 = getelementptr i8, ptr %p, i32 11404 %p2 = getelementptr i8, ptr %p, i32 21405 %p3 = getelementptr i8, ptr %p, i32 31406 %p4 = getelementptr i8, ptr %p, i32 41407 %p5 = getelementptr i8, ptr %p, i32 51408 %p6 = getelementptr i8, ptr %p, i32 61409 %p7 = getelementptr i8, ptr %p, i32 71410 %l1 = load i8, ptr %p1411 %l2 = load i8, ptr %p11412 %l3 = load i8, ptr %p21413 %l4 = load i8, ptr %p31414 %l5 = load i8, ptr %p41415 %l6 = load i8, ptr %p51416 %l7 = load i8, ptr %p61417 %l8 = load i8, ptr %p71418 1419 %e1 = zext i8 %l1 to i641420 %e2 = zext i8 %l2 to i641421 %e3 = zext i8 %l3 to i641422 %e4 = zext i8 %l4 to i641423 %e5 = zext i8 %l5 to i641424 %e6 = zext i8 %l6 to i641425 %e7 = zext i8 %l7 to i641426 %e8 = zext i8 %l8 to i641427 1428 %s1 = shl i64 %e1, 561429 %s2 = shl i64 %e2, 481430 %s3 = shl i64 %e3, 401431 %s4 = shl i64 %e4, 321432 %s5 = shl i64 %e5, 241433 %s6 = shl i64 %e6, 161434 %s7 = shl i64 %e7, 81435 1436 %o7 = or i64 %e8, %s71437 %o6 = or i64 %o7, %s61438 %o5 = or i64 %o6, %s51439 %o4 = or i64 %o5, %s41440 %o3 = or i64 %o4, %s31441 %o2 = or i64 %o3, %s21442 %o1 = or i64 %o2, %s11443 ret i64 %o11444}1445 1446define i64 @eggs(ptr noundef readonly %arg) {1447; LE-LABEL: @eggs(1448; LE-NEXT: [[TMP3:%.*]] = load i64, ptr [[ARG:%.*]], align 11449; LE-NEXT: ret i64 [[TMP3]]1450;1451; BE-LABEL: @eggs(1452; BE-NEXT: [[TMP3:%.*]] = load i8, ptr [[ARG:%.*]], align 11453; BE-NEXT: [[TMP4:%.*]] = getelementptr inbounds i8, ptr [[ARG]], i64 11454; BE-NEXT: [[TMP5:%.*]] = load i8, ptr [[TMP4]], align 11455; BE-NEXT: [[TMP6:%.*]] = getelementptr inbounds i8, ptr [[ARG]], i64 21456; BE-NEXT: [[TMP7:%.*]] = load i8, ptr [[TMP6]], align 11457; BE-NEXT: [[TMP8:%.*]] = getelementptr inbounds i8, ptr [[ARG]], i64 31458; BE-NEXT: [[TMP9:%.*]] = load i8, ptr [[TMP8]], align 11459; BE-NEXT: [[TMP10:%.*]] = getelementptr inbounds i8, ptr [[ARG]], i64 41460; BE-NEXT: [[TMP11:%.*]] = load i8, ptr [[TMP10]], align 11461; BE-NEXT: [[TMP12:%.*]] = getelementptr inbounds i8, ptr [[ARG]], i64 51462; BE-NEXT: [[TMP13:%.*]] = load i8, ptr [[TMP12]], align 11463; BE-NEXT: [[TMP14:%.*]] = getelementptr inbounds i8, ptr [[ARG]], i64 61464; BE-NEXT: [[TMP15:%.*]] = load i8, ptr [[TMP14]], align 11465; BE-NEXT: [[TMP16:%.*]] = getelementptr inbounds i8, ptr [[ARG]], i64 71466; BE-NEXT: [[TMP17:%.*]] = load i8, ptr [[TMP16]], align 11467; BE-NEXT: [[TMP18:%.*]] = zext i8 [[TMP17]] to i641468; BE-NEXT: [[TMP19:%.*]] = shl nuw i64 [[TMP18]], 561469; BE-NEXT: [[TMP20:%.*]] = zext i8 [[TMP15]] to i641470; BE-NEXT: [[TMP21:%.*]] = shl nuw nsw i64 [[TMP20]], 481471; BE-NEXT: [[TMP22:%.*]] = or i64 [[TMP19]], [[TMP21]]1472; BE-NEXT: [[TMP23:%.*]] = zext i8 [[TMP13]] to i641473; BE-NEXT: [[TMP24:%.*]] = shl nuw nsw i64 [[TMP23]], 401474; BE-NEXT: [[TMP25:%.*]] = or i64 [[TMP22]], [[TMP24]]1475; BE-NEXT: [[TMP26:%.*]] = zext i8 [[TMP11]] to i641476; BE-NEXT: [[TMP27:%.*]] = shl nuw nsw i64 [[TMP26]], 321477; BE-NEXT: [[TMP28:%.*]] = or i64 [[TMP25]], [[TMP27]]1478; BE-NEXT: [[TMP29:%.*]] = zext i8 [[TMP9]] to i641479; BE-NEXT: [[TMP30:%.*]] = shl nuw nsw i64 [[TMP29]], 241480; BE-NEXT: [[TMP31:%.*]] = or i64 [[TMP28]], [[TMP30]]1481; BE-NEXT: [[TMP32:%.*]] = zext i8 [[TMP7]] to i641482; BE-NEXT: [[TMP33:%.*]] = shl nuw nsw i64 [[TMP32]], 161483; BE-NEXT: [[TMP34:%.*]] = zext i8 [[TMP5]] to i641484; BE-NEXT: [[TMP35:%.*]] = shl nuw nsw i64 [[TMP34]], 81485; BE-NEXT: [[TMP36:%.*]] = or i64 [[TMP31]], [[TMP33]]1486; BE-NEXT: [[TMP37:%.*]] = zext i8 [[TMP3]] to i641487; BE-NEXT: [[TMP38:%.*]] = or i64 [[TMP36]], [[TMP35]]1488; BE-NEXT: [[TMP39:%.*]] = or i64 [[TMP38]], [[TMP37]]1489; BE-NEXT: ret i64 [[TMP39]]1490;1491 %tmp3 = load i8, ptr %arg, align 11492 %tmp4 = getelementptr inbounds i8, ptr %arg, i64 11493 %tmp5 = load i8, ptr %tmp4, align 11494 %tmp6 = getelementptr inbounds i8, ptr %arg, i64 21495 %tmp7 = load i8, ptr %tmp6, align 11496 %tmp8 = getelementptr inbounds i8, ptr %arg, i64 31497 %tmp9 = load i8, ptr %tmp8, align 11498 %tmp10 = getelementptr inbounds i8, ptr %arg, i64 41499 %tmp11 = load i8, ptr %tmp10, align 11500 %tmp12 = getelementptr inbounds i8, ptr %arg, i64 51501 %tmp13 = load i8, ptr %tmp12, align 11502 %tmp14 = getelementptr inbounds i8, ptr %arg, i64 61503 %tmp15 = load i8, ptr %tmp14, align 11504 %tmp16 = getelementptr inbounds i8, ptr %arg, i64 71505 %tmp17 = load i8, ptr %tmp16, align 11506 %tmp18 = zext i8 %tmp17 to i641507 %tmp19 = shl nuw i64 %tmp18, 561508 %tmp20 = zext i8 %tmp15 to i641509 %tmp21 = shl nuw nsw i64 %tmp20, 481510 %tmp22 = or i64 %tmp19, %tmp211511 %tmp23 = zext i8 %tmp13 to i641512 %tmp24 = shl nuw nsw i64 %tmp23, 401513 %tmp25 = or i64 %tmp22, %tmp241514 %tmp26 = zext i8 %tmp11 to i641515 %tmp27 = shl nuw nsw i64 %tmp26, 321516 %tmp28 = or i64 %tmp25, %tmp271517 %tmp29 = zext i8 %tmp9 to i641518 %tmp30 = shl nuw nsw i64 %tmp29, 241519 %tmp31 = or i64 %tmp28, %tmp301520 %tmp32 = zext i8 %tmp7 to i641521 %tmp33 = shl nuw nsw i64 %tmp32, 161522 %tmp34 = zext i8 %tmp5 to i641523 %tmp35 = shl nuw nsw i64 %tmp34, 81524 %tmp36 = or i64 %tmp31, %tmp331525 %tmp37 = zext i8 %tmp3 to i641526 %tmp38 = or i64 %tmp36, %tmp351527 %tmp39 = or i64 %tmp38, %tmp371528 ret i64 %tmp391529}1530 1531define i32 @loadCombine_4consecutive_mixsize1(ptr %p) {1532; LE-LABEL: @loadCombine_4consecutive_mixsize1(1533; LE-NEXT: [[L1:%.*]] = load i32, ptr [[P:%.*]], align 21534; LE-NEXT: ret i32 [[L1]]1535;1536; BE-LABEL: @loadCombine_4consecutive_mixsize1(1537; BE-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 21538; BE-NEXT: [[P2:%.*]] = getelementptr i8, ptr [[P]], i32 31539; BE-NEXT: [[L1:%.*]] = load i16, ptr [[P]], align 21540; BE-NEXT: [[L2:%.*]] = load i8, ptr [[P1]], align 11541; BE-NEXT: [[L3:%.*]] = load i8, ptr [[P2]], align 11542; BE-NEXT: [[E1:%.*]] = zext i16 [[L1]] to i321543; BE-NEXT: [[E2:%.*]] = zext i8 [[L2]] to i321544; BE-NEXT: [[E3:%.*]] = zext i8 [[L3]] to i321545; BE-NEXT: [[S2:%.*]] = shl i32 [[E2]], 161546; BE-NEXT: [[S3:%.*]] = shl i32 [[E3]], 241547; BE-NEXT: [[O1:%.*]] = or i32 [[E1]], [[S2]]1548; BE-NEXT: [[O2:%.*]] = or i32 [[O1]], [[S3]]1549; BE-NEXT: ret i32 [[O2]]1550;1551 %p1 = getelementptr i8, ptr %p, i32 21552 %p2 = getelementptr i8, ptr %p, i32 31553 %l1 = load i16, ptr %p1554 %l2 = load i8, ptr %p11555 %l3 = load i8, ptr %p21556 1557 %e1 = zext i16 %l1 to i321558 %e2 = zext i8 %l2 to i321559 %e3 = zext i8 %l3 to i321560 1561 %s2 = shl i32 %e2, 161562 %s3 = shl i32 %e3, 241563 1564 %o1 = or i32 %e1, %s21565 %o2 = or i32 %o1, %s31566 ret i32 %o21567}1568 1569define i32 @loadCombine_4consecutive_mixsize1_BE(ptr %p) {1570; LE-LABEL: @loadCombine_4consecutive_mixsize1_BE(1571; LE-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 21572; LE-NEXT: [[P2:%.*]] = getelementptr i8, ptr [[P]], i32 31573; LE-NEXT: [[L1:%.*]] = load i16, ptr [[P]], align 21574; LE-NEXT: [[L2:%.*]] = load i8, ptr [[P1]], align 11575; LE-NEXT: [[L3:%.*]] = load i8, ptr [[P2]], align 11576; LE-NEXT: [[E1:%.*]] = zext i16 [[L1]] to i321577; LE-NEXT: [[E2:%.*]] = zext i8 [[L2]] to i321578; LE-NEXT: [[E3:%.*]] = zext i8 [[L3]] to i321579; LE-NEXT: [[S1:%.*]] = shl i32 [[E1]], 161580; LE-NEXT: [[S2:%.*]] = shl i32 [[E2]], 81581; LE-NEXT: [[O1:%.*]] = or i32 [[S1]], [[S2]]1582; LE-NEXT: [[O2:%.*]] = or i32 [[O1]], [[E3]]1583; LE-NEXT: ret i32 [[O2]]1584;1585; BE-LABEL: @loadCombine_4consecutive_mixsize1_BE(1586; BE-NEXT: [[L1:%.*]] = load i32, ptr [[P:%.*]], align 21587; BE-NEXT: ret i32 [[L1]]1588;1589 %p1 = getelementptr i8, ptr %p, i32 21590 %p2 = getelementptr i8, ptr %p, i32 31591 %l1 = load i16, ptr %p1592 %l2 = load i8, ptr %p11593 %l3 = load i8, ptr %p21594 1595 %e1 = zext i16 %l1 to i321596 %e2 = zext i8 %l2 to i321597 %e3 = zext i8 %l3 to i321598 1599 %s1 = shl i32 %e1, 161600 %s2 = shl i32 %e2, 81601 1602 %o1 = or i32 %s1, %s21603 %o2 = or i32 %o1, %e31604 ret i32 %o21605}1606 1607define i32 @loadCombine_4consecutive_rev_mixsize1(ptr %p) {1608; LE-LABEL: @loadCombine_4consecutive_rev_mixsize1(1609; LE-NEXT: [[L1:%.*]] = load i32, ptr [[P:%.*]], align 21610; LE-NEXT: ret i32 [[L1]]1611;1612; BE-LABEL: @loadCombine_4consecutive_rev_mixsize1(1613; BE-NEXT: [[P2:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 21614; BE-NEXT: [[P3:%.*]] = getelementptr i8, ptr [[P]], i32 31615; BE-NEXT: [[L1:%.*]] = load i16, ptr [[P]], align 21616; BE-NEXT: [[L2:%.*]] = load i8, ptr [[P2]], align 11617; BE-NEXT: [[L3:%.*]] = load i8, ptr [[P3]], align 11618; BE-NEXT: [[E1:%.*]] = zext i16 [[L1]] to i321619; BE-NEXT: [[E2:%.*]] = zext i8 [[L2]] to i321620; BE-NEXT: [[E3:%.*]] = zext i8 [[L3]] to i321621; BE-NEXT: [[S2:%.*]] = shl i32 [[E2]], 161622; BE-NEXT: [[S3:%.*]] = shl i32 [[E3]], 241623; BE-NEXT: [[O1:%.*]] = or i32 [[S3]], [[S2]]1624; BE-NEXT: [[O2:%.*]] = or i32 [[O1]], [[E1]]1625; BE-NEXT: ret i32 [[O2]]1626;1627 %p2 = getelementptr i8, ptr %p, i32 21628 %p3 = getelementptr i8, ptr %p, i32 31629 %l1 = load i16, ptr %p1630 %l2 = load i8, ptr %p21631 %l3 = load i8, ptr %p31632 1633 %e1 = zext i16 %l1 to i321634 %e2 = zext i8 %l2 to i321635 %e3 = zext i8 %l3 to i321636 1637 %s2 = shl i32 %e2, 161638 %s3 = shl i32 %e3, 241639 1640 %o1 = or i32 %s3, %s21641 %o2 = or i32 %o1, %e11642 ret i32 %o21643}1644 1645define i32 @loadCombine_4consecutive_rev_mixsize1_BE(ptr %p) {1646; LE-LABEL: @loadCombine_4consecutive_rev_mixsize1_BE(1647; LE-NEXT: [[P2:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 21648; LE-NEXT: [[P3:%.*]] = getelementptr i8, ptr [[P]], i32 31649; LE-NEXT: [[L1:%.*]] = load i16, ptr [[P]], align 21650; LE-NEXT: [[L2:%.*]] = load i8, ptr [[P2]], align 11651; LE-NEXT: [[L3:%.*]] = load i8, ptr [[P3]], align 11652; LE-NEXT: [[E1:%.*]] = zext i16 [[L1]] to i321653; LE-NEXT: [[E2:%.*]] = zext i8 [[L2]] to i321654; LE-NEXT: [[E3:%.*]] = zext i8 [[L3]] to i321655; LE-NEXT: [[S1:%.*]] = shl i32 [[E1]], 161656; LE-NEXT: [[S2:%.*]] = shl i32 [[E2]], 81657; LE-NEXT: [[O1:%.*]] = or i32 [[E3]], [[S2]]1658; LE-NEXT: [[O2:%.*]] = or i32 [[O1]], [[S1]]1659; LE-NEXT: ret i32 [[O2]]1660;1661; BE-LABEL: @loadCombine_4consecutive_rev_mixsize1_BE(1662; BE-NEXT: [[L1:%.*]] = load i32, ptr [[P:%.*]], align 21663; BE-NEXT: ret i32 [[L1]]1664;1665 %p2 = getelementptr i8, ptr %p, i32 21666 %p3 = getelementptr i8, ptr %p, i32 31667 %l1 = load i16, ptr %p1668 %l2 = load i8, ptr %p21669 %l3 = load i8, ptr %p31670 1671 %e1 = zext i16 %l1 to i321672 %e2 = zext i8 %l2 to i321673 %e3 = zext i8 %l3 to i321674 1675 %s1 = shl i32 %e1, 161676 %s2 = shl i32 %e2, 81677 1678 %o1 = or i32 %e3, %s21679 %o2 = or i32 %o1, %s11680 ret i32 %o21681}1682 1683define i32 @loadCombine_4consecutive_mixsize2(ptr %p) {1684; LE-LABEL: @loadCombine_4consecutive_mixsize2(1685; LE-NEXT: [[L1:%.*]] = load i32, ptr [[P:%.*]], align 11686; LE-NEXT: ret i32 [[L1]]1687;1688; BE-LABEL: @loadCombine_4consecutive_mixsize2(1689; BE-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 11690; BE-NEXT: [[P2:%.*]] = getelementptr i8, ptr [[P]], i32 21691; BE-NEXT: [[L1:%.*]] = load i8, ptr [[P]], align 11692; BE-NEXT: [[L2:%.*]] = load i8, ptr [[P1]], align 11693; BE-NEXT: [[L3:%.*]] = load i16, ptr [[P2]], align 21694; BE-NEXT: [[E1:%.*]] = zext i8 [[L1]] to i321695; BE-NEXT: [[E2:%.*]] = zext i8 [[L2]] to i321696; BE-NEXT: [[E3:%.*]] = zext i16 [[L3]] to i321697; BE-NEXT: [[S2:%.*]] = shl i32 [[E2]], 81698; BE-NEXT: [[S3:%.*]] = shl i32 [[E3]], 161699; BE-NEXT: [[O1:%.*]] = or i32 [[E1]], [[S2]]1700; BE-NEXT: [[O2:%.*]] = or i32 [[O1]], [[S3]]1701; BE-NEXT: ret i32 [[O2]]1702;1703 %p1 = getelementptr i8, ptr %p, i32 11704 %p2 = getelementptr i8, ptr %p, i32 21705 %l1 = load i8, ptr %p1706 %l2 = load i8, ptr %p11707 %l3 = load i16, ptr %p21708 1709 %e1 = zext i8 %l1 to i321710 %e2 = zext i8 %l2 to i321711 %e3 = zext i16 %l3 to i321712 1713 %s2 = shl i32 %e2, 81714 %s3 = shl i32 %e3, 161715 1716 %o1 = or i32 %e1, %s21717 %o2 = or i32 %o1, %s31718 ret i32 %o21719}1720 1721define i32 @loadCombine_4consecutive_mixsize3(ptr %p) {1722; LE-LABEL: @loadCombine_4consecutive_mixsize3(1723; LE-NEXT: [[L1:%.*]] = load i32, ptr [[P:%.*]], align 11724; LE-NEXT: ret i32 [[L1]]1725;1726; BE-LABEL: @loadCombine_4consecutive_mixsize3(1727; BE-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 11728; BE-NEXT: [[P2:%.*]] = getelementptr i8, ptr [[P]], i32 31729; BE-NEXT: [[L1:%.*]] = load i8, ptr [[P]], align 11730; BE-NEXT: [[L2:%.*]] = load i16, ptr [[P1]], align 21731; BE-NEXT: [[L3:%.*]] = load i8, ptr [[P2]], align 11732; BE-NEXT: [[E1:%.*]] = zext i8 [[L1]] to i321733; BE-NEXT: [[E2:%.*]] = zext i16 [[L2]] to i321734; BE-NEXT: [[E3:%.*]] = zext i8 [[L3]] to i321735; BE-NEXT: [[S2:%.*]] = shl i32 [[E2]], 81736; BE-NEXT: [[S3:%.*]] = shl i32 [[E3]], 241737; BE-NEXT: [[O1:%.*]] = or i32 [[E1]], [[S2]]1738; BE-NEXT: [[O2:%.*]] = or i32 [[O1]], [[S3]]1739; BE-NEXT: ret i32 [[O2]]1740;1741 %p1 = getelementptr i8, ptr %p, i32 11742 %p2 = getelementptr i8, ptr %p, i32 31743 %l1 = load i8, ptr %p1744 %l2 = load i16, ptr %p11745 %l3 = load i8, ptr %p21746 1747 %e1 = zext i8 %l1 to i321748 %e2 = zext i16 %l2 to i321749 %e3 = zext i8 %l3 to i321750 1751 %s2 = shl i32 %e2, 81752 %s3 = shl i32 %e3, 241753 1754 %o1 = or i32 %e1, %s21755 %o2 = or i32 %o1, %s31756 ret i32 %o21757}1758 1759define i16 @loadCombine_mixsize_4bit(ptr %p) {1760; ALL-LABEL: @loadCombine_mixsize_4bit(1761; ALL-NEXT: [[P1:%.*]] = getelementptr i4, ptr [[P:%.*]], i32 21762; ALL-NEXT: [[P2:%.*]] = getelementptr i4, ptr [[P]], i32 31763; ALL-NEXT: [[L1:%.*]] = load i8, ptr [[P]], align 11764; ALL-NEXT: [[L2:%.*]] = load i4, ptr [[P1]], align 11765; ALL-NEXT: [[L3:%.*]] = load i4, ptr [[P2]], align 11766; ALL-NEXT: [[E1:%.*]] = zext i8 [[L1]] to i161767; ALL-NEXT: [[E2:%.*]] = zext i4 [[L2]] to i161768; ALL-NEXT: [[E3:%.*]] = zext i4 [[L3]] to i161769; ALL-NEXT: [[S2:%.*]] = shl i16 [[E2]], 81770; ALL-NEXT: [[S3:%.*]] = shl i16 [[E3]], 121771; ALL-NEXT: [[O1:%.*]] = or i16 [[E1]], [[S2]]1772; ALL-NEXT: [[O2:%.*]] = or i16 [[O1]], [[S3]]1773; ALL-NEXT: ret i16 [[O2]]1774;1775 %p1 = getelementptr i4, ptr %p, i32 21776 %p2 = getelementptr i4, ptr %p, i32 31777 %l1 = load i8, ptr %p1778 %l2 = load i4, ptr %p11779 %l3 = load i4, ptr %p21780 1781 %e1 = zext i8 %l1 to i161782 %e2 = zext i4 %l2 to i161783 %e3 = zext i4 %l3 to i161784 1785 %s2 = shl i16 %e2, 81786 %s3 = shl i16 %e3, 121787 1788 %o1 = or i16 %e1, %s21789 %o2 = or i16 %o1, %s31790 ret i16 %o21791}1792 1793define i32 @loadCombine_2consecutive_mixsize_not_equal_store_size(ptr %p) {1794; ALL-LABEL: @loadCombine_2consecutive_mixsize_not_equal_store_size(1795; ALL-NEXT: [[P1:%.*]] = getelementptr i4, ptr [[P:%.*]], i32 11796; ALL-NEXT: [[L1:%.*]] = load i4, ptr [[P]], align 11797; ALL-NEXT: [[L2:%.*]] = load i28, ptr [[P1]], align 41798; ALL-NEXT: [[E1:%.*]] = zext i4 [[L1]] to i321799; ALL-NEXT: [[E2:%.*]] = zext i28 [[L2]] to i321800; ALL-NEXT: [[S2:%.*]] = shl i32 [[E2]], 41801; ALL-NEXT: [[O1:%.*]] = or i32 [[E1]], [[S2]]1802; ALL-NEXT: ret i32 [[O1]]1803;1804 %p1 = getelementptr i4, ptr %p, i32 11805 %l1 = load i4, ptr %p1806 %l2 = load i28, ptr %p11807 %e1 = zext i4 %l1 to i321808 %e2 = zext i28 %l2 to i321809 %s2 = shl i32 %e2, 41810 %o1 = or i32 %e1, %s21811 ret i32 %o11812}1813 1814define i32 @loadCombine_2consecutive_mixsize_not_equal_store_size2(ptr %p) {1815; ALL-LABEL: @loadCombine_2consecutive_mixsize_not_equal_store_size2(1816; ALL-NEXT: [[P1:%.*]] = getelementptr i28, ptr [[P:%.*]], i32 11817; ALL-NEXT: [[L1:%.*]] = load i28, ptr [[P]], align 41818; ALL-NEXT: [[L2:%.*]] = load i4, ptr [[P1]], align 11819; ALL-NEXT: [[E1:%.*]] = zext i28 [[L1]] to i321820; ALL-NEXT: [[E2:%.*]] = zext i4 [[L2]] to i321821; ALL-NEXT: [[S2:%.*]] = shl i32 [[E2]], 281822; ALL-NEXT: [[O1:%.*]] = or i32 [[E1]], [[S2]]1823; ALL-NEXT: ret i32 [[O1]]1824;1825 %p1 = getelementptr i28, ptr %p, i32 11826 %l1 = load i28, ptr %p1827 %l2 = load i4, ptr %p11828 %e1 = zext i28 %l1 to i321829 %e2 = zext i4 %l2 to i321830 %s2 = shl i32 %e2, 281831 %o1 = or i32 %e1, %s21832 ret i32 %o11833}1834 1835define i32 @loadCombine_2consecutive_mixsize_not_equal_store_size3(ptr %p) {1836; ALL-LABEL: @loadCombine_2consecutive_mixsize_not_equal_store_size3(1837; ALL-NEXT: [[P1:%.*]] = getelementptr i23, ptr [[P:%.*]], i32 11838; ALL-NEXT: [[L1:%.*]] = load i23, ptr [[P]], align 41839; ALL-NEXT: [[L2:%.*]] = load i9, ptr [[P1]], align 21840; ALL-NEXT: [[E1:%.*]] = zext i23 [[L1]] to i321841; ALL-NEXT: [[E2:%.*]] = zext i9 [[L2]] to i321842; ALL-NEXT: [[S2:%.*]] = shl i32 [[E2]], 241843; ALL-NEXT: [[O1:%.*]] = or i32 [[E1]], [[S2]]1844; ALL-NEXT: ret i32 [[O1]]1845;1846 %p1 = getelementptr i23, ptr %p, i32 11847 %l1 = load i23, ptr %p1848 %l2 = load i9, ptr %p11849 %e1 = zext i23 %l1 to i321850 %e2 = zext i9 %l2 to i321851 %s2 = shl i32 %e2, 241852 %o1 = or i32 %e1, %s21853 ret i32 %o11854}1855 1856define i32 @loadCombine_2consecutive_mixsize_not_equal_store_size4(ptr %p) {1857; ALL-LABEL: @loadCombine_2consecutive_mixsize_not_equal_store_size4(1858; ALL-NEXT: [[P1:%.*]] = getelementptr i9, ptr [[P:%.*]], i32 11859; ALL-NEXT: [[L1:%.*]] = load i9, ptr [[P]], align 21860; ALL-NEXT: [[L2:%.*]] = load i23, ptr [[P1]], align 41861; ALL-NEXT: [[E1:%.*]] = zext i9 [[L1]] to i321862; ALL-NEXT: [[E2:%.*]] = zext i23 [[L2]] to i321863; ALL-NEXT: [[S2:%.*]] = shl i32 [[E2]], 241864; ALL-NEXT: [[O1:%.*]] = or i32 [[E1]], [[S2]]1865; ALL-NEXT: ret i32 [[O1]]1866;1867 %p1 = getelementptr i9, ptr %p, i32 11868 %l1 = load i9, ptr %p1869 %l2 = load i23, ptr %p11870 %e1 = zext i9 %l1 to i321871 %e2 = zext i23 %l2 to i321872 %s2 = shl i32 %e2, 241873 %o1 = or i32 %e1, %s21874 ret i32 %o11875}1876 1877define i32 @loadCombine_2consecutive_mixsize_not_power_of_two(ptr %p) {1878; LE-LABEL: @loadCombine_2consecutive_mixsize_not_power_of_two(1879; LE-NEXT: [[L1:%.*]] = load i32, ptr [[P:%.*]], align 11880; LE-NEXT: ret i32 [[L1]]1881;1882; BE-LABEL: @loadCombine_2consecutive_mixsize_not_power_of_two(1883; BE-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 11884; BE-NEXT: [[L1:%.*]] = load i8, ptr [[P]], align 11885; BE-NEXT: [[L2:%.*]] = load i24, ptr [[P1]], align 41886; BE-NEXT: [[E1:%.*]] = zext i8 [[L1]] to i321887; BE-NEXT: [[E2:%.*]] = zext i24 [[L2]] to i321888; BE-NEXT: [[S2:%.*]] = shl i32 [[E2]], 81889; BE-NEXT: [[O1:%.*]] = or i32 [[E1]], [[S2]]1890; BE-NEXT: ret i32 [[O1]]1891;1892 %p1 = getelementptr i8, ptr %p, i32 11893 %l1 = load i8, ptr %p1894 %l2 = load i24, ptr %p11895 %e1 = zext i8 %l1 to i321896 %e2 = zext i24 %l2 to i321897 %s2 = shl i32 %e2, 81898 %o1 = or i32 %e1, %s21899 ret i32 %o11900}1901 1902define i32 @loadCombine_2consecutive_mixsize_not_power_of_two2(ptr %p) {1903; LE-LABEL: @loadCombine_2consecutive_mixsize_not_power_of_two2(1904; LE-NEXT: [[L1:%.*]] = load i32, ptr [[P:%.*]], align 41905; LE-NEXT: ret i32 [[L1]]1906;1907; BE-LABEL: @loadCombine_2consecutive_mixsize_not_power_of_two2(1908; BE-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 31909; BE-NEXT: [[L1:%.*]] = load i24, ptr [[P]], align 41910; BE-NEXT: [[L2:%.*]] = load i8, ptr [[P1]], align 11911; BE-NEXT: [[E1:%.*]] = zext i24 [[L1]] to i321912; BE-NEXT: [[E2:%.*]] = zext i8 [[L2]] to i321913; BE-NEXT: [[S2:%.*]] = shl i32 [[E2]], 241914; BE-NEXT: [[O1:%.*]] = or i32 [[E1]], [[S2]]1915; BE-NEXT: ret i32 [[O1]]1916;1917 %p1 = getelementptr i8, ptr %p, i32 31918 %l1 = load i24, ptr %p1919 %l2 = load i8, ptr %p11920 %e1 = zext i24 %l1 to i321921 %e2 = zext i8 %l2 to i321922 %s2 = shl i32 %e2, 241923 %o1 = or i32 %e1, %s21924 ret i32 %o11925}1926 1927define i32 @loadCombine_2consecutive_sum_size_not_legal(ptr %p) {1928; ALL-LABEL: @loadCombine_2consecutive_sum_size_not_legal(1929; ALL-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 21930; ALL-NEXT: [[L1:%.*]] = load i16, ptr [[P]], align 21931; ALL-NEXT: [[L2:%.*]] = load i8, ptr [[P1]], align 11932; ALL-NEXT: [[E1:%.*]] = zext i16 [[L1]] to i321933; ALL-NEXT: [[E2:%.*]] = zext i8 [[L2]] to i321934; ALL-NEXT: [[S2:%.*]] = shl i32 [[E2]], 161935; ALL-NEXT: [[O1:%.*]] = or i32 [[E1]], [[S2]]1936; ALL-NEXT: ret i32 [[O1]]1937;1938 %p1 = getelementptr i8, ptr %p, i32 21939 %l1 = load i16, ptr %p1940 %l2 = load i8, ptr %p11941 %e1 = zext i16 %l1 to i321942 %e2 = zext i8 %l2 to i321943 %s2 = shl i32 %e2, 161944 %o1 = or i32 %e1, %s21945 ret i32 %o11946}1947 1948define i32 @loadCombine_2consecutive_sum_size_not_legal2(ptr %p) {1949; ALL-LABEL: @loadCombine_2consecutive_sum_size_not_legal2(1950; ALL-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 11951; ALL-NEXT: [[L1:%.*]] = load i8, ptr [[P]], align 11952; ALL-NEXT: [[L2:%.*]] = load i16, ptr [[P1]], align 21953; ALL-NEXT: [[E1:%.*]] = zext i8 [[L1]] to i321954; ALL-NEXT: [[E2:%.*]] = zext i16 [[L2]] to i321955; ALL-NEXT: [[S2:%.*]] = shl i32 [[E2]], 81956; ALL-NEXT: [[O1:%.*]] = or i32 [[E1]], [[S2]]1957; ALL-NEXT: ret i32 [[O1]]1958;1959 %p1 = getelementptr i8, ptr %p, i32 11960 %l1 = load i8, ptr %p1961 %l2 = load i16, ptr %p11962 %e1 = zext i8 %l1 to i321963 %e2 = zext i16 %l2 to i321964 %s2 = shl i32 %e2, 81965 %o1 = or i32 %e1, %s21966 ret i32 %o11967}1968 1969define i64 @loadCombine_8consecutive_mixsize(ptr %p) {1970; LE-LABEL: @loadCombine_8consecutive_mixsize(1971; LE-NEXT: [[L1:%.*]] = load i64, ptr [[P:%.*]], align 11972; LE-NEXT: ret i64 [[L1]]1973;1974; BE-LABEL: @loadCombine_8consecutive_mixsize(1975; BE-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i64 11976; BE-NEXT: [[P2:%.*]] = getelementptr i8, ptr [[P]], i64 21977; BE-NEXT: [[P3:%.*]] = getelementptr i8, ptr [[P]], i64 41978; BE-NEXT: [[L1:%.*]] = load i8, ptr [[P]], align 11979; BE-NEXT: [[L2:%.*]] = load i8, ptr [[P1]], align 11980; BE-NEXT: [[L3:%.*]] = load i16, ptr [[P2]], align 21981; BE-NEXT: [[L4:%.*]] = load i32, ptr [[P3]], align 41982; BE-NEXT: [[E1:%.*]] = zext i8 [[L1]] to i641983; BE-NEXT: [[E2:%.*]] = zext i8 [[L2]] to i641984; BE-NEXT: [[E3:%.*]] = zext i16 [[L3]] to i641985; BE-NEXT: [[E4:%.*]] = zext i32 [[L4]] to i641986; BE-NEXT: [[S2:%.*]] = shl i64 [[E2]], 81987; BE-NEXT: [[S3:%.*]] = shl i64 [[E3]], 161988; BE-NEXT: [[S4:%.*]] = shl i64 [[E4]], 321989; BE-NEXT: [[O1:%.*]] = or i64 [[E1]], [[S2]]1990; BE-NEXT: [[O2:%.*]] = or i64 [[O1]], [[S3]]1991; BE-NEXT: [[O3:%.*]] = or i64 [[O2]], [[S4]]1992; BE-NEXT: ret i64 [[O3]]1993;1994 %p1 = getelementptr i8, ptr %p, i64 11995 %p2 = getelementptr i8, ptr %p, i64 21996 %p3 = getelementptr i8, ptr %p, i64 41997 %l1 = load i8, ptr %p1998 %l2 = load i8, ptr %p11999 %l3 = load i16, ptr %p22000 %l4 = load i32, ptr %p32001 2002 %e1 = zext i8 %l1 to i642003 %e2 = zext i8 %l2 to i642004 %e3 = zext i16 %l3 to i642005 %e4 = zext i32 %l4 to i642006 2007 %s2 = shl i64 %e2, 82008 %s3 = shl i64 %e3, 162009 %s4 = shl i64 %e4, 322010 2011 %o1 = or i64 %e1, %s22012 %o2 = or i64 %o1, %s32013 %o3 = or i64 %o2, %s42014 ret i64 %o32015}2016 2017define i32 @loadCombine_4consecutive_lower_index_comes_before(ptr %p) {2018; LE-LABEL: @loadCombine_4consecutive_lower_index_comes_before(2019; LE-NEXT: [[L1:%.*]] = load i32, ptr [[P:%.*]], align 12020; LE-NEXT: ret i32 [[L1]]2021;2022; BE-LABEL: @loadCombine_4consecutive_lower_index_comes_before(2023; BE-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 12024; BE-NEXT: [[P2:%.*]] = getelementptr i8, ptr [[P]], i32 22025; BE-NEXT: [[P3:%.*]] = getelementptr i8, ptr [[P]], i32 32026; BE-NEXT: [[L4:%.*]] = load i8, ptr [[P3]], align 12027; BE-NEXT: [[L3:%.*]] = load i8, ptr [[P2]], align 12028; BE-NEXT: [[L2:%.*]] = load i8, ptr [[P1]], align 12029; BE-NEXT: [[L1:%.*]] = load i8, ptr [[P]], align 12030; BE-NEXT: [[E1:%.*]] = zext i8 [[L1]] to i322031; BE-NEXT: [[E2:%.*]] = zext i8 [[L2]] to i322032; BE-NEXT: [[E3:%.*]] = zext i8 [[L3]] to i322033; BE-NEXT: [[E4:%.*]] = zext i8 [[L4]] to i322034; BE-NEXT: [[S2:%.*]] = shl i32 [[E2]], 82035; BE-NEXT: [[S3:%.*]] = shl i32 [[E3]], 162036; BE-NEXT: [[S4:%.*]] = shl i32 [[E4]], 242037; BE-NEXT: [[O1:%.*]] = or i32 [[E1]], [[S2]]2038; BE-NEXT: [[O2:%.*]] = or i32 [[O1]], [[S3]]2039; BE-NEXT: [[O3:%.*]] = or i32 [[O2]], [[S4]]2040; BE-NEXT: ret i32 [[O3]]2041;2042 %p1 = getelementptr i8, ptr %p, i32 12043 %p2 = getelementptr i8, ptr %p, i32 22044 %p3 = getelementptr i8, ptr %p, i32 32045 %l4 = load i8, ptr %p32046 %l3 = load i8, ptr %p22047 %l2 = load i8, ptr %p12048 %l1 = load i8, ptr %p2049 2050 %e1 = zext i8 %l1 to i322051 %e2 = zext i8 %l2 to i322052 %e3 = zext i8 %l3 to i322053 %e4 = zext i8 %l4 to i322054 2055 %s2 = shl i32 %e2, 82056 %s3 = shl i32 %e3, 162057 %s4 = shl i32 %e4, 242058 2059 %o1 = or i32 %e1, %s22060 %o2 = or i32 %o1, %s32061 %o3 = or i32 %o2, %s42062 ret i32 %o32063}2064 2065define i16 @loadCombine_2consecutive_badinsert(ptr %p) {2066; ALL-LABEL: @loadCombine_2consecutive_badinsert(2067; ALL-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 12068; ALL-NEXT: [[L2:%.*]] = load i8, ptr [[P1]], align 12069; ALL-NEXT: store i8 0, ptr [[P1]], align 12070; ALL-NEXT: [[L1:%.*]] = load i8, ptr [[P]], align 12071; ALL-NEXT: [[E1:%.*]] = zext i8 [[L1]] to i162072; ALL-NEXT: [[E2:%.*]] = zext i8 [[L2]] to i162073; ALL-NEXT: [[S2:%.*]] = shl i16 [[E2]], 82074; ALL-NEXT: [[O1:%.*]] = or i16 [[E1]], [[S2]]2075; ALL-NEXT: ret i16 [[O1]]2076;2077 %p1 = getelementptr i8, ptr %p, i32 12078 %l2 = load i8, ptr %p12079 store i8 0, ptr %p1, align 12080 %l1 = load i8, ptr %p2081 %e1 = zext i8 %l1 to i162082 %e2 = zext i8 %l2 to i162083 %s2 = shl i16 %e2, 82084 %o1 = or i16 %e1, %s22085 ret i16 %o12086}2087 2088define i32 @loadCombine_4consecutive_badinsert(ptr %p) {2089; LE-LABEL: @loadCombine_4consecutive_badinsert(2090; LE-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 12091; LE-NEXT: [[L1:%.*]] = load i32, ptr [[P]], align 12092; LE-NEXT: store i8 0, ptr [[P1]], align 12093; LE-NEXT: ret i32 [[L1]]2094;2095; BE-LABEL: @loadCombine_4consecutive_badinsert(2096; BE-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 12097; BE-NEXT: [[P2:%.*]] = getelementptr i8, ptr [[P]], i32 22098; BE-NEXT: [[P3:%.*]] = getelementptr i8, ptr [[P]], i32 32099; BE-NEXT: [[L2:%.*]] = load i8, ptr [[P1]], align 12100; BE-NEXT: [[L3:%.*]] = load i8, ptr [[P2]], align 12101; BE-NEXT: store i8 0, ptr [[P1]], align 12102; BE-NEXT: [[L4:%.*]] = load i8, ptr [[P3]], align 12103; BE-NEXT: [[L1:%.*]] = load i8, ptr [[P]], align 12104; BE-NEXT: [[E1:%.*]] = zext i8 [[L1]] to i322105; BE-NEXT: [[E2:%.*]] = zext i8 [[L2]] to i322106; BE-NEXT: [[E3:%.*]] = zext i8 [[L3]] to i322107; BE-NEXT: [[E4:%.*]] = zext i8 [[L4]] to i322108; BE-NEXT: [[S2:%.*]] = shl i32 [[E2]], 82109; BE-NEXT: [[S3:%.*]] = shl i32 [[E3]], 162110; BE-NEXT: [[S4:%.*]] = shl i32 [[E4]], 242111; BE-NEXT: [[O1:%.*]] = or i32 [[E1]], [[S2]]2112; BE-NEXT: [[O2:%.*]] = or i32 [[O1]], [[S3]]2113; BE-NEXT: [[O3:%.*]] = or i32 [[O2]], [[S4]]2114; BE-NEXT: ret i32 [[O3]]2115;2116 %p1 = getelementptr i8, ptr %p, i32 12117 %p2 = getelementptr i8, ptr %p, i32 22118 %p3 = getelementptr i8, ptr %p, i32 32119 %l2 = load i8, ptr %p12120 %l3 = load i8, ptr %p22121 store i8 0, ptr %p1, align 12122 %l4 = load i8, ptr %p32123 %l1 = load i8, ptr %p2124 2125 %e1 = zext i8 %l1 to i322126 %e2 = zext i8 %l2 to i322127 %e3 = zext i8 %l3 to i322128 %e4 = zext i8 %l4 to i322129 2130 %s2 = shl i32 %e2, 82131 %s3 = shl i32 %e3, 162132 %s4 = shl i32 %e4, 242133 2134 %o1 = or i32 %e1, %s22135 %o2 = or i32 %o1, %s32136 %o3 = or i32 %o2, %s42137 ret i32 %o32138}2139 2140define i32 @loadCombine_4consecutive_badinsert2(ptr %p) {2141; ALL-LABEL: @loadCombine_4consecutive_badinsert2(2142; ALL-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 12143; ALL-NEXT: [[P2:%.*]] = getelementptr i8, ptr [[P]], i32 22144; ALL-NEXT: [[P3:%.*]] = getelementptr i8, ptr [[P]], i32 32145; ALL-NEXT: [[L2:%.*]] = load i8, ptr [[P1]], align 12146; ALL-NEXT: store i8 0, ptr [[P3]], align 12147; ALL-NEXT: [[L3:%.*]] = load i8, ptr [[P2]], align 12148; ALL-NEXT: [[L4:%.*]] = load i8, ptr [[P3]], align 12149; ALL-NEXT: [[L1:%.*]] = load i8, ptr [[P]], align 12150; ALL-NEXT: [[E1:%.*]] = zext i8 [[L1]] to i322151; ALL-NEXT: [[E2:%.*]] = zext i8 [[L2]] to i322152; ALL-NEXT: [[E3:%.*]] = zext i8 [[L3]] to i322153; ALL-NEXT: [[E4:%.*]] = zext i8 [[L4]] to i322154; ALL-NEXT: [[S2:%.*]] = shl i32 [[E2]], 82155; ALL-NEXT: [[S3:%.*]] = shl i32 [[E3]], 162156; ALL-NEXT: [[S4:%.*]] = shl i32 [[E4]], 242157; ALL-NEXT: [[O1:%.*]] = or i32 [[E1]], [[S2]]2158; ALL-NEXT: [[O2:%.*]] = or i32 [[O1]], [[S3]]2159; ALL-NEXT: [[O3:%.*]] = or i32 [[O2]], [[S4]]2160; ALL-NEXT: ret i32 [[O3]]2161;2162 %p1 = getelementptr i8, ptr %p, i32 12163 %p2 = getelementptr i8, ptr %p, i32 22164 %p3 = getelementptr i8, ptr %p, i32 32165 %l2 = load i8, ptr %p12166 store i8 0, ptr %p3, align 12167 %l3 = load i8, ptr %p22168 %l4 = load i8, ptr %p32169 %l1 = load i8, ptr %p2170 2171 %e1 = zext i8 %l1 to i322172 %e2 = zext i8 %l2 to i322173 %e3 = zext i8 %l3 to i322174 %e4 = zext i8 %l4 to i322175 2176 %s2 = shl i32 %e2, 82177 %s3 = shl i32 %e3, 162178 %s4 = shl i32 %e4, 242179 2180 %o1 = or i32 %e1, %s22181 %o2 = or i32 %o1, %s32182 %o3 = or i32 %o2, %s42183 ret i32 %o32184}2185 2186define i32 @loadCombine_4consecutive_badinsert3(ptr %p) {2187; LE-LABEL: @loadCombine_4consecutive_badinsert3(2188; LE-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr [[P:%.*]], i64 12189; LE-NEXT: [[L1:%.*]] = load i32, ptr [[TMP1]], align 12190; LE-NEXT: ret i32 [[L1]]2191;2192; BE-LABEL: @loadCombine_4consecutive_badinsert3(2193; BE-NEXT: [[P4:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 42194; BE-NEXT: [[L4:%.*]] = load i8, ptr [[P4]], align 12195; BE-NEXT: [[E4:%.*]] = zext i8 [[L4]] to i322196; BE-NEXT: [[S4:%.*]] = shl i32 [[E4]], 242197; BE-NEXT: [[P3:%.*]] = getelementptr i8, ptr [[P]], i32 32198; BE-NEXT: [[L3:%.*]] = load i8, ptr [[P3]], align 12199; BE-NEXT: [[E3:%.*]] = zext i8 [[L3]] to i322200; BE-NEXT: [[S3:%.*]] = shl i32 [[E3]], 162201; BE-NEXT: [[P2:%.*]] = getelementptr i8, ptr [[P]], i32 22202; BE-NEXT: [[L2:%.*]] = load i8, ptr [[P2]], align 12203; BE-NEXT: [[E2:%.*]] = zext i8 [[L2]] to i322204; BE-NEXT: [[S2:%.*]] = shl i32 [[E2]], 82205; BE-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[P]], i32 12206; BE-NEXT: [[L1:%.*]] = load i8, ptr [[P1]], align 12207; BE-NEXT: [[E1:%.*]] = zext i8 [[L1]] to i322208; BE-NEXT: [[O1:%.*]] = or i32 [[E1]], [[S2]]2209; BE-NEXT: [[O2:%.*]] = or i32 [[O1]], [[S3]]2210; BE-NEXT: [[O3:%.*]] = or i32 [[O2]], [[S4]]2211; BE-NEXT: ret i32 [[O3]]2212;2213 %p4 = getelementptr i8, ptr %p, i32 42214 %l4 = load i8, ptr %p42215 %e4 = zext i8 %l4 to i322216 %s4 = shl i32 %e4, 242217 2218 %p3 = getelementptr i8, ptr %p, i32 32219 %l3 = load i8, ptr %p32220 %e3 = zext i8 %l3 to i322221 %s3 = shl i32 %e3, 162222 2223 %p2 = getelementptr i8, ptr %p, i32 22224 %l2 = load i8, ptr %p22225 %e2 = zext i8 %l2 to i322226 %s2 = shl i32 %e2, 82227 2228 %p1 = getelementptr i8, ptr %p, i32 12229 %l1 = load i8, ptr %p12230 %e1 = zext i8 %l1 to i322231 2232 %o1 = or i32 %e1, %s22233 %o2 = or i32 %o1, %s32234 %o3 = or i32 %o2, %s42235 ret i32 %o32236}2237 2238 2239define i32 @loadCombine_4consecutive_badinsert4(ptr %p) {2240; LE-LABEL: @loadCombine_4consecutive_badinsert4(2241; LE-NEXT: entry:2242; LE-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i64 12243; LE-NEXT: [[C1:%.*]] = load i8, ptr [[P1]], align 12244; LE-NEXT: [[CMP:%.*]] = icmp eq i8 [[C1]], 02245; LE-NEXT: br i1 [[CMP]], label [[END:%.*]], label [[BB2:%.*]]2246; LE: bb2:2247; LE-NEXT: [[L1:%.*]] = load i32, ptr [[P1]], align 12248; LE-NEXT: br label [[END]]2249; LE: end:2250; LE-NEXT: [[COND:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[L1]], [[BB2]] ]2251; LE-NEXT: ret i32 [[COND]]2252;2253; BE-LABEL: @loadCombine_4consecutive_badinsert4(2254; BE-NEXT: entry:2255; BE-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i64 12256; BE-NEXT: [[C1:%.*]] = load i8, ptr [[P1]], align 12257; BE-NEXT: [[CMP:%.*]] = icmp eq i8 [[C1]], 02258; BE-NEXT: br i1 [[CMP]], label [[END:%.*]], label [[BB2:%.*]]2259; BE: bb2:2260; BE-NEXT: [[L1:%.*]] = load i8, ptr [[P1]], align 12261; BE-NEXT: [[C2:%.*]] = zext i8 [[L1]] to i322262; BE-NEXT: [[P4:%.*]] = getelementptr i8, ptr [[P]], i64 42263; BE-NEXT: [[L4:%.*]] = load i8, ptr [[P4]], align 12264; BE-NEXT: [[E4:%.*]] = zext i8 [[L4]] to i322265; BE-NEXT: [[S4:%.*]] = shl nuw i32 [[E4]], 242266; BE-NEXT: [[P3:%.*]] = getelementptr i8, ptr [[P]], i64 32267; BE-NEXT: [[L3:%.*]] = load i8, ptr [[P3]], align 12268; BE-NEXT: [[E3:%.*]] = zext i8 [[L3]] to i322269; BE-NEXT: [[S3:%.*]] = shl nuw nsw i32 [[E3]], 162270; BE-NEXT: [[P2:%.*]] = getelementptr i8, ptr [[P]], i64 22271; BE-NEXT: [[L2:%.*]] = load i8, ptr [[P2]], align 12272; BE-NEXT: [[E2:%.*]] = zext i8 [[L2]] to i322273; BE-NEXT: [[S2:%.*]] = shl nuw nsw i32 [[E2]], 82274; BE-NEXT: [[O1:%.*]] = or i32 [[S2]], [[C2]]2275; BE-NEXT: [[O2:%.*]] = or i32 [[O1]], [[S3]]2276; BE-NEXT: [[O3:%.*]] = or i32 [[O2]], [[S4]]2277; BE-NEXT: br label [[END]]2278; BE: end:2279; BE-NEXT: [[COND:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[O3]], [[BB2]] ]2280; BE-NEXT: ret i32 [[COND]]2281;2282entry:2283 %p1 = getelementptr i8, ptr %p, i64 12284 %c1 = load i8, ptr %p1, align 12285 %cmp = icmp eq i8 %c1, 02286 br i1 %cmp, label %end, label %bb22287 2288bb2:2289 %l1 = load i8, ptr %p1, align 12290 %c2 = zext i8 %l1 to i322291 %p4 = getelementptr i8, ptr %p, i64 42292 %l4 = load i8, ptr %p4, align 12293 %e4 = zext i8 %l4 to i322294 %s4 = shl nuw i32 %e4, 242295 %p3 = getelementptr i8, ptr %p, i64 32296 %l3 = load i8, ptr %p3, align 12297 %e3 = zext i8 %l3 to i322298 %s3 = shl nuw nsw i32 %e3, 162299 %p2 = getelementptr i8, ptr %p, i64 22300 %l2 = load i8, ptr %p2, align 12301 %e2 = zext i8 %l2 to i322302 %s2 = shl nuw nsw i32 %e2, 82303 %o1 = or i32 %s2, %c22304 %o2 = or i32 %o1, %s32305 %o3 = or i32 %o2, %s42306 br label %end2307 2308end:2309 %cond = phi i32 [ 0, %entry ], [ %o3, %bb2 ]2310 ret i32 %cond2311}2312 2313define i32 @loadCombine_4consecutive_badinsert5(ptr %p) {2314; ALL-LABEL: @loadCombine_4consecutive_badinsert5(2315; ALL-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 12316; ALL-NEXT: [[P2:%.*]] = getelementptr i8, ptr [[P]], i32 22317; ALL-NEXT: [[P3:%.*]] = getelementptr i8, ptr [[P]], i32 32318; ALL-NEXT: [[L4:%.*]] = load i8, ptr [[P3]], align 12319; ALL-NEXT: store i8 0, ptr [[P2]], align 12320; ALL-NEXT: [[L1:%.*]] = load i8, ptr [[P]], align 12321; ALL-NEXT: [[L2:%.*]] = load i8, ptr [[P1]], align 12322; ALL-NEXT: [[L3:%.*]] = load i8, ptr [[P2]], align 12323; ALL-NEXT: [[E1:%.*]] = zext i8 [[L1]] to i322324; ALL-NEXT: [[E2:%.*]] = zext i8 [[L2]] to i322325; ALL-NEXT: [[E3:%.*]] = zext i8 [[L3]] to i322326; ALL-NEXT: [[E4:%.*]] = zext i8 [[L4]] to i322327; ALL-NEXT: [[S2:%.*]] = shl i32 [[E2]], 82328; ALL-NEXT: [[S3:%.*]] = shl i32 [[E3]], 162329; ALL-NEXT: [[S4:%.*]] = shl i32 [[E4]], 242330; ALL-NEXT: [[O1:%.*]] = or i32 [[E1]], [[S2]]2331; ALL-NEXT: [[O2:%.*]] = or i32 [[O1]], [[S3]]2332; ALL-NEXT: [[O3:%.*]] = or i32 [[O2]], [[S4]]2333; ALL-NEXT: ret i32 [[O3]]2334;2335 %p1 = getelementptr i8, ptr %p, i32 12336 %p2 = getelementptr i8, ptr %p, i32 22337 %p3 = getelementptr i8, ptr %p, i32 32338 %l4 = load i8, ptr %p32339 store i8 0, ptr %p2, align 12340 %l1 = load i8, ptr %p2341 %l2 = load i8, ptr %p12342 %l3 = load i8, ptr %p22343 2344 %e1 = zext i8 %l1 to i322345 %e2 = zext i8 %l2 to i322346 %e3 = zext i8 %l3 to i322347 %e4 = zext i8 %l4 to i322348 2349 %s2 = shl i32 %e2, 82350 %s3 = shl i32 %e3, 162351 %s4 = shl i32 %e4, 242352 2353 %o1 = or i32 %e1, %s22354 %o2 = or i32 %o1, %s32355 %o3 = or i32 %o2, %s42356 ret i32 %o32357}2358 2359define i32 @loadCombine_4consecutive_badinsert6(ptr %p) {2360; ALL-LABEL: @loadCombine_4consecutive_badinsert6(2361; ALL-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 12362; ALL-NEXT: [[P2:%.*]] = getelementptr i8, ptr [[P]], i32 22363; ALL-NEXT: [[P3:%.*]] = getelementptr i8, ptr [[P]], i32 32364; ALL-NEXT: [[L1:%.*]] = load i8, ptr [[P]], align 12365; ALL-NEXT: [[L2:%.*]] = load i8, ptr [[P1]], align 12366; ALL-NEXT: store i8 0, ptr [[P3]], align 12367; ALL-NEXT: [[L3:%.*]] = load i8, ptr [[P2]], align 12368; ALL-NEXT: [[L4:%.*]] = load i8, ptr [[P3]], align 12369; ALL-NEXT: [[E1:%.*]] = zext i8 [[L1]] to i322370; ALL-NEXT: [[E2:%.*]] = zext i8 [[L2]] to i322371; ALL-NEXT: [[E3:%.*]] = zext i8 [[L3]] to i322372; ALL-NEXT: [[E4:%.*]] = zext i8 [[L4]] to i322373; ALL-NEXT: [[S2:%.*]] = shl i32 [[E2]], 82374; ALL-NEXT: [[S3:%.*]] = shl i32 [[E3]], 162375; ALL-NEXT: [[S4:%.*]] = shl i32 [[E4]], 242376; ALL-NEXT: [[O1:%.*]] = or i32 [[S3]], [[S4]]2377; ALL-NEXT: [[O2:%.*]] = or i32 [[O1]], [[S2]]2378; ALL-NEXT: [[O3:%.*]] = or i32 [[O2]], [[E1]]2379; ALL-NEXT: ret i32 [[O3]]2380;2381 %p1 = getelementptr i8, ptr %p, i32 12382 %p2 = getelementptr i8, ptr %p, i32 22383 %p3 = getelementptr i8, ptr %p, i32 32384 %l1 = load i8, ptr %p2385 %l2 = load i8, ptr %p12386 store i8 0, ptr %p3, align 12387 %l3 = load i8, ptr %p22388 %l4 = load i8, ptr %p32389 2390 %e1 = zext i8 %l1 to i322391 %e2 = zext i8 %l2 to i322392 %e3 = zext i8 %l3 to i322393 %e4 = zext i8 %l4 to i322394 2395 %s2 = shl i32 %e2, 82396 %s3 = shl i32 %e3, 162397 %s4 = shl i32 %e4, 242398 2399 %o1 = or i32 %s3, %s42400 %o2 = or i32 %o1, %s22401 %o3 = or i32 %o2, %e12402 ret i32 %o32403}2404 2405define void @nested_gep(ptr %p, ptr %dest) {2406; LE-LABEL: @nested_gep(2407; LE-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr [[P:%.*]], i64 682408; LE-NEXT: [[LD2:%.*]] = load i64, ptr [[TMP1]], align 42409; LE-NEXT: [[TRUNC:%.*]] = trunc i64 [[LD2]] to i322410; LE-NEXT: store i32 [[TRUNC]], ptr [[DEST:%.*]], align 42411; LE-NEXT: ret void2412;2413; BE-LABEL: @nested_gep(2414; BE-NEXT: [[GEP1:%.*]] = getelementptr inbounds i8, ptr [[P:%.*]], i64 722415; BE-NEXT: [[LD1:%.*]] = load i32, ptr [[GEP1]], align 42416; BE-NEXT: [[LD1_ZEXT:%.*]] = zext i32 [[LD1]] to i642417; BE-NEXT: [[LD1_SHL:%.*]] = shl nuw i64 [[LD1_ZEXT]], 322418; BE-NEXT: [[GEP2:%.*]] = getelementptr inbounds i8, ptr [[P]], i64 642419; BE-NEXT: [[FINAL_PTR:%.*]] = getelementptr inbounds i8, ptr [[GEP2]], i64 42420; BE-NEXT: [[LD2:%.*]] = load i32, ptr [[FINAL_PTR]], align 42421; BE-NEXT: [[LD2_ZEXT:%.*]] = zext i32 [[LD2]] to i642422; BE-NEXT: [[OR:%.*]] = or i64 [[LD1_SHL]], [[LD2_ZEXT]]2423; BE-NEXT: [[ADD:%.*]] = add i64 [[OR]], 02424; BE-NEXT: [[TRUNC:%.*]] = trunc i64 [[ADD]] to i322425; BE-NEXT: store i32 [[TRUNC]], ptr [[DEST:%.*]], align 42426; BE-NEXT: ret void2427;2428 %gep1 = getelementptr inbounds i8, ptr %p, i64 722429 %ld1 = load i32, ptr %gep1, align 42430 %ld1_zext = zext i32 %ld1 to i642431 %ld1_shl = shl nuw i64 %ld1_zext, 322432 %gep2 = getelementptr inbounds i8, ptr %p, i64 642433 ; Don't move final_ptr before gep22434 %final_ptr = getelementptr inbounds i8, ptr %gep2, i64 42435 %ld2 = load i32, ptr %final_ptr, align 42436 %ld2_zext = zext i32 %ld2 to i642437 %or = or i64 %ld1_shl, %ld2_zext2438 %add = add i64 %or, 02439 %trunc = trunc i64 %add to i322440 store i32 %trunc, ptr %dest, align 42441 ret void2442}2443 2444 2445define void @bitcast_gep(ptr %p, ptr %dest) {2446; LE-LABEL: @bitcast_gep(2447; LE-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr [[P:%.*]], i64 682448; LE-NEXT: [[LD2:%.*]] = load i64, ptr [[TMP1]], align 42449; LE-NEXT: [[TRUNC:%.*]] = trunc i64 [[LD2]] to i322450; LE-NEXT: store i32 [[TRUNC]], ptr [[DEST:%.*]], align 42451; LE-NEXT: ret void2452;2453; BE-LABEL: @bitcast_gep(2454; BE-NEXT: [[GEP1:%.*]] = getelementptr inbounds i8, ptr [[P:%.*]], i64 722455; BE-NEXT: [[LD1:%.*]] = load i32, ptr [[GEP1]], align 42456; BE-NEXT: [[LD1_ZEXT:%.*]] = zext i32 [[LD1]] to i642457; BE-NEXT: [[LD1_SHL:%.*]] = shl nuw i64 [[LD1_ZEXT]], 322458; BE-NEXT: [[GEP2:%.*]] = getelementptr inbounds i8, ptr [[P]], i64 682459; BE-NEXT: [[FINAL_PTR:%.*]] = bitcast ptr [[GEP2]] to ptr2460; BE-NEXT: [[LD2:%.*]] = load i32, ptr [[FINAL_PTR]], align 42461; BE-NEXT: [[LD2_ZEXT:%.*]] = zext i32 [[LD2]] to i642462; BE-NEXT: [[OR:%.*]] = or i64 [[LD1_SHL]], [[LD2_ZEXT]]2463; BE-NEXT: [[ADD:%.*]] = add i64 [[OR]], 02464; BE-NEXT: [[TRUNC:%.*]] = trunc i64 [[ADD]] to i322465; BE-NEXT: store i32 [[TRUNC]], ptr [[DEST:%.*]], align 42466; BE-NEXT: ret void2467;2468 %gep1 = getelementptr inbounds i8, ptr %p, i64 722469 %ld1 = load i32, ptr %gep1, align 42470 %ld1_zext = zext i32 %ld1 to i642471 %ld1_shl = shl nuw i64 %ld1_zext, 322472 %gep2 = getelementptr inbounds i8, ptr %p, i64 682473 ; Don't move final_ptr before gep22474 %final_ptr = bitcast ptr %gep2 to ptr2475 %ld2 = load i32, ptr %final_ptr, align 42476 %ld2_zext = zext i32 %ld2 to i642477 %or = or i64 %ld1_shl, %ld2_zext2478 %add = add i64 %or, 02479 %trunc = trunc i64 %add to i322480 store i32 %trunc, ptr %dest, align 42481 ret void2482}2483 2484define i1 @loadCombine_4consecutive_rev_icmp0(ptr %p) {2485; LE-LABEL: @loadCombine_4consecutive_rev_icmp0(2486; LE-NEXT: [[L1:%.*]] = load i32, ptr [[P:%.*]], align 12487; LE-NEXT: [[C:%.*]] = icmp eq i32 [[L1]], 02488; LE-NEXT: ret i1 [[C]]2489;2490; BE-LABEL: @loadCombine_4consecutive_rev_icmp0(2491; BE-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 12492; BE-NEXT: [[P2:%.*]] = getelementptr i8, ptr [[P]], i32 22493; BE-NEXT: [[P3:%.*]] = getelementptr i8, ptr [[P]], i32 32494; BE-NEXT: [[L1:%.*]] = load i8, ptr [[P]], align 12495; BE-NEXT: [[L2:%.*]] = load i8, ptr [[P1]], align 12496; BE-NEXT: [[L3:%.*]] = load i8, ptr [[P2]], align 12497; BE-NEXT: [[L4:%.*]] = load i8, ptr [[P3]], align 12498; BE-NEXT: [[E1:%.*]] = zext i8 [[L1]] to i322499; BE-NEXT: [[E2:%.*]] = zext i8 [[L2]] to i322500; BE-NEXT: [[E3:%.*]] = zext i8 [[L3]] to i322501; BE-NEXT: [[E4:%.*]] = zext i8 [[L4]] to i322502; BE-NEXT: [[S2:%.*]] = shl i32 [[E2]], 82503; BE-NEXT: [[S3:%.*]] = shl i32 [[E3]], 162504; BE-NEXT: [[S4:%.*]] = shl i32 [[E4]], 242505; BE-NEXT: [[O1:%.*]] = or i32 [[S4]], [[S3]]2506; BE-NEXT: [[O2:%.*]] = or i32 [[O1]], [[S2]]2507; BE-NEXT: [[O3:%.*]] = or i32 [[O2]], [[E1]]2508; BE-NEXT: [[C:%.*]] = icmp eq i32 [[O3]], 02509; BE-NEXT: ret i1 [[C]]2510;2511 %p1 = getelementptr i8, ptr %p, i32 12512 %p2 = getelementptr i8, ptr %p, i32 22513 %p3 = getelementptr i8, ptr %p, i32 32514 %l1 = load i8, ptr %p2515 %l2 = load i8, ptr %p12516 %l3 = load i8, ptr %p22517 %l4 = load i8, ptr %p32518 2519 %e1 = zext i8 %l1 to i322520 %e2 = zext i8 %l2 to i322521 %e3 = zext i8 %l3 to i322522 %e4 = zext i8 %l4 to i322523 2524 %s2 = shl i32 %e2, 82525 %s3 = shl i32 %e3, 162526 %s4 = shl i32 %e4, 242527 2528 %o1 = or i32 %s4, %s32529 %o2 = or i32 %o1, %s22530 %o3 = or i32 %o2, %e12531 2532 %c = icmp eq i32 %o3, 02533 ret i1 %c2534}2535