brintos

brintos / llvm-project-archived public Read only

0
0
Text · 89.7 KiB · cbe3c13 Raw
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