brintos

brintos / llvm-project-archived public Read only

0
0
Text · 92.7 KiB · f62a1ca Raw
2561 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=aggressive-instcombine -mtriple x86_64-none-eabi -mattr=avx2 -data-layout="e-n64" -S | FileCheck %s --check-prefixes=ALL,LE3; RUN: opt < %s -passes=aggressive-instcombine -mtriple x86_64-none-eabi -mattr=avx2 -data-layout="E-n64" -S | FileCheck %s --check-prefixes=ALL,BE4 5define i16 @loadCombine_2consecutive(ptr %p) {6;7; LE-LABEL: @loadCombine_2consecutive(8; LE-NEXT:    [[L1:%.*]] = load i16, ptr [[P:%.*]], align 19; LE-NEXT:    ret i16 [[L1]]10;11; BE-LABEL: @loadCombine_2consecutive(12; BE-NEXT:    [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 113; BE-NEXT:    [[L1:%.*]] = load i8, ptr [[P]], align 114; BE-NEXT:    [[L2:%.*]] = load i8, ptr [[P1]], align 115; BE-NEXT:    [[E1:%.*]] = zext i8 [[L1]] to i1616; BE-NEXT:    [[E2:%.*]] = zext i8 [[L2]] to i1617; BE-NEXT:    [[S2:%.*]] = shl i16 [[E2]], 818; BE-NEXT:    [[O1:%.*]] = or i16 [[E1]], [[S2]]19; BE-NEXT:    ret i16 [[O1]]20;21  %p1 = getelementptr i8, ptr %p, i32 122  %l1 = load i8, ptr %p23  %l2 = load i8, ptr %p124  %e1 = zext i8 %l1 to i1625  %e2 = zext i8 %l2 to i1626  %s2 = shl i16 %e2, 827  %o1 = or i16 %e1, %s228  ret i16 %o129}30 31define i16 @loadCombine_2consecutive_BE(ptr %p) {32; LE-LABEL: @loadCombine_2consecutive_BE(33; LE-NEXT:    [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 134; LE-NEXT:    [[L1:%.*]] = load i8, ptr [[P]], align 135; LE-NEXT:    [[L2:%.*]] = load i8, ptr [[P1]], align 136; LE-NEXT:    [[E1:%.*]] = zext i8 [[L1]] to i1637; LE-NEXT:    [[E2:%.*]] = zext i8 [[L2]] to i1638; LE-NEXT:    [[S1:%.*]] = shl i16 [[E1]], 839; LE-NEXT:    [[O1:%.*]] = or i16 [[S1]], [[E2]]40; LE-NEXT:    ret i16 [[O1]]41;42; BE-LABEL: @loadCombine_2consecutive_BE(43; BE-NEXT:    [[L1:%.*]] = load i16, ptr [[P:%.*]], align 144; BE-NEXT:    ret i16 [[L1]]45;46  %p1 = getelementptr i8, ptr %p, i32 147  %l1 = load i8, ptr %p48  %l2 = load i8, ptr %p149  %e1 = zext i8 %l1 to i1650  %e2 = zext i8 %l2 to i1651  %s1 = shl i16 %e1, 852  %o1 = or i16 %s1, %e253  ret i16 %o154}55 56define i32 @loadCombine_4consecutive(ptr %p) {57; LE-LABEL: @loadCombine_4consecutive(58; LE-NEXT:    [[L1:%.*]] = load i32, ptr [[P:%.*]], align 159; LE-NEXT:    ret i32 [[L1]]60;61; BE-LABEL: @loadCombine_4consecutive(62; BE-NEXT:    [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 163; BE-NEXT:    [[P2:%.*]] = getelementptr i8, ptr [[P]], i32 264; BE-NEXT:    [[P3:%.*]] = getelementptr i8, ptr [[P]], i32 365; BE-NEXT:    [[L1:%.*]] = load i8, ptr [[P]], align 166; BE-NEXT:    [[L2:%.*]] = load i8, ptr [[P1]], align 167; BE-NEXT:    [[L3:%.*]] = load i8, ptr [[P2]], align 168; BE-NEXT:    [[L4:%.*]] = load i8, ptr [[P3]], align 169; BE-NEXT:    [[E1:%.*]] = zext i8 [[L1]] to i3270; BE-NEXT:    [[E2:%.*]] = zext i8 [[L2]] to i3271; BE-NEXT:    [[E3:%.*]] = zext i8 [[L3]] to i3272; BE-NEXT:    [[E4:%.*]] = zext i8 [[L4]] to i3273; BE-NEXT:    [[S2:%.*]] = shl i32 [[E2]], 874; BE-NEXT:    [[S3:%.*]] = shl i32 [[E3]], 1675; BE-NEXT:    [[S4:%.*]] = shl i32 [[E4]], 2476; BE-NEXT:    [[O1:%.*]] = or i32 [[E1]], [[S2]]77; BE-NEXT:    [[O2:%.*]] = or i32 [[O1]], [[S3]]78; BE-NEXT:    [[O3:%.*]] = or i32 [[O2]], [[S4]]79; BE-NEXT:    ret i32 [[O3]]80;81  %p1 = getelementptr i8, ptr %p, i32 182  %p2 = getelementptr i8, ptr %p, i32 283  %p3 = getelementptr i8, ptr %p, i32 384  %l1 = load i8, ptr %p85  %l2 = load i8, ptr %p186  %l3 = load i8, ptr %p287  %l4 = load i8, ptr %p388 89  %e1 = zext i8 %l1 to i3290  %e2 = zext i8 %l2 to i3291  %e3 = zext i8 %l3 to i3292  %e4 = zext i8 %l4 to i3293 94  %s2 = shl i32 %e2, 895  %s3 = shl i32 %e3, 1696  %s4 = shl i32 %e4, 2497 98  %o1 = or i32 %e1, %s299  %o2 = or i32 %o1, %s3100  %o3 = or i32 %o2, %s4101  ret i32 %o3102}103 104define i32 @loadCombine_4consecutive_commuted(ptr %p) {105; LE-LABEL: @loadCombine_4consecutive_commuted(106; LE-NEXT:    [[O3:%.*]] = load i32, ptr [[P:%.*]], align 1107; LE-NEXT:    ret i32 [[O3]]108;109; BE-LABEL: @loadCombine_4consecutive_commuted(110; BE-NEXT:    [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 1111; BE-NEXT:    [[P2:%.*]] = getelementptr i8, ptr [[P]], i32 2112; BE-NEXT:    [[P3:%.*]] = getelementptr i8, ptr [[P]], i32 3113; BE-NEXT:    [[L1:%.*]] = load i8, ptr [[P]], align 1114; BE-NEXT:    [[L2:%.*]] = load i8, ptr [[P1]], align 1115; BE-NEXT:    [[L3:%.*]] = load i8, ptr [[P2]], align 1116; BE-NEXT:    [[L4:%.*]] = load i8, ptr [[P3]], align 1117; BE-NEXT:    [[E1:%.*]] = zext i8 [[L1]] to i32118; BE-NEXT:    [[E2:%.*]] = zext i8 [[L2]] to i32119; BE-NEXT:    [[E3:%.*]] = zext i8 [[L3]] to i32120; BE-NEXT:    [[E4:%.*]] = zext i8 [[L4]] to i32121; BE-NEXT:    [[S2:%.*]] = shl i32 [[E2]], 8122; BE-NEXT:    [[S3:%.*]] = shl i32 [[E3]], 16123; BE-NEXT:    [[S4:%.*]] = shl i32 [[E4]], 24124; BE-NEXT:    [[O1:%.*]] = or i32 [[S2]], [[S3]]125; BE-NEXT:    [[O2:%.*]] = or i32 [[S4]], [[O1]]126; BE-NEXT:    [[O3:%.*]] = or i32 [[E1]], [[O2]]127; BE-NEXT:    ret i32 [[O3]]128;129  %p1 = getelementptr i8, ptr %p, i32 1130  %p2 = getelementptr i8, ptr %p, i32 2131  %p3 = getelementptr i8, ptr %p, i32 3132  %l1 = load i8, ptr %p133  %l2 = load i8, ptr %p1134  %l3 = load i8, ptr %p2135  %l4 = load i8, ptr %p3136 137  %e1 = zext i8 %l1 to i32138  %e2 = zext i8 %l2 to i32139  %e3 = zext i8 %l3 to i32140  %e4 = zext i8 %l4 to i32141 142  %s2 = shl i32 %e2, 8143  %s3 = shl i32 %e3, 16144  %s4 = shl i32 %e4, 24145 146  %o1 = or i32 %s2, %s3147  %o2 = or i32 %s4, %o1148  %o3 = or i32 %e1, %o2149  ret i32 %o3150}151 152define i32 @loadCombine_4consecutive_multiuse(ptr %p) {153; LE-LABEL: @loadCombine_4consecutive_multiuse(154; LE-NEXT:    [[P3:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 3155; LE-NEXT:    [[O3:%.*]] = load i32, ptr [[P]], align 1156; LE-NEXT:    [[L4:%.*]] = load i8, ptr [[P3]], align 1157; LE-NEXT:    call void @use(i8 [[L4]])158; LE-NEXT:    ret i32 [[O3]]159;160; BE-LABEL: @loadCombine_4consecutive_multiuse(161; BE-NEXT:    [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 1162; BE-NEXT:    [[P2:%.*]] = getelementptr i8, ptr [[P]], i32 2163; BE-NEXT:    [[P3:%.*]] = getelementptr i8, ptr [[P]], i32 3164; BE-NEXT:    [[L1:%.*]] = load i8, ptr [[P]], align 1165; BE-NEXT:    [[L2:%.*]] = load i8, ptr [[P1]], align 1166; BE-NEXT:    [[L3:%.*]] = load i8, ptr [[P2]], align 1167; BE-NEXT:    [[L4:%.*]] = load i8, ptr [[P3]], align 1168; BE-NEXT:    call void @use(i8 [[L4]])169; BE-NEXT:    [[E1:%.*]] = zext i8 [[L1]] to i32170; BE-NEXT:    [[E2:%.*]] = zext i8 [[L2]] to i32171; BE-NEXT:    [[E3:%.*]] = zext i8 [[L3]] to i32172; BE-NEXT:    [[E4:%.*]] = zext i8 [[L4]] to i32173; BE-NEXT:    [[S2:%.*]] = shl i32 [[E2]], 8174; BE-NEXT:    [[S3:%.*]] = shl i32 [[E3]], 16175; BE-NEXT:    [[S4:%.*]] = shl i32 [[E4]], 24176; BE-NEXT:    [[O1:%.*]] = or i32 [[E1]], [[S2]]177; BE-NEXT:    [[O2:%.*]] = or i32 [[O1]], [[S3]]178; BE-NEXT:    [[O3:%.*]] = or i32 [[O2]], [[S4]]179; BE-NEXT:    ret i32 [[O3]]180;181  %p1 = getelementptr i8, ptr %p, i32 1182  %p2 = getelementptr i8, ptr %p, i32 2183  %p3 = getelementptr i8, ptr %p, i32 3184  %l1 = load i8, ptr %p185  %l2 = load i8, ptr %p1186  %l3 = load i8, ptr %p2187  %l4 = load i8, ptr %p3188  call void @use(i8 %l4)189 190  %e1 = zext i8 %l1 to i32191  %e2 = zext i8 %l2 to i32192  %e3 = zext i8 %l3 to i32193  %e4 = zext i8 %l4 to i32194 195  %s2 = shl i32 %e2, 8196  %s3 = shl i32 %e3, 16197  %s4 = shl i32 %e4, 24198 199  %o1 = or i32 %e1, %s2200  %o2 = or i32 %o1, %s3201  %o3 = or i32 %o2, %s4202  ret i32 %o3203}204 205define i32 @loadCombine_4consecutive_BE(ptr %p) {206; LE-LABEL: @loadCombine_4consecutive_BE(207; LE-NEXT:    [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 1208; LE-NEXT:    [[P2:%.*]] = getelementptr i8, ptr [[P]], i32 2209; LE-NEXT:    [[P3:%.*]] = getelementptr i8, ptr [[P]], i32 3210; LE-NEXT:    [[L1:%.*]] = load i8, ptr [[P]], align 1211; LE-NEXT:    [[L2:%.*]] = load i8, ptr [[P1]], align 1212; LE-NEXT:    [[L3:%.*]] = load i8, ptr [[P2]], align 1213; LE-NEXT:    [[L4:%.*]] = load i8, ptr [[P3]], align 1214; LE-NEXT:    [[E1:%.*]] = zext i8 [[L1]] to i32215; LE-NEXT:    [[E2:%.*]] = zext i8 [[L2]] to i32216; LE-NEXT:    [[E3:%.*]] = zext i8 [[L3]] to i32217; LE-NEXT:    [[E4:%.*]] = zext i8 [[L4]] to i32218; LE-NEXT:    [[S1:%.*]] = shl i32 [[E1]], 24219; LE-NEXT:    [[S2:%.*]] = shl i32 [[E2]], 16220; LE-NEXT:    [[S3:%.*]] = shl i32 [[E3]], 8221; LE-NEXT:    [[O1:%.*]] = or i32 [[S1]], [[S2]]222; LE-NEXT:    [[O2:%.*]] = or i32 [[O1]], [[S3]]223; LE-NEXT:    [[O3:%.*]] = or i32 [[O2]], [[E4]]224; LE-NEXT:    ret i32 [[O3]]225;226; BE-LABEL: @loadCombine_4consecutive_BE(227; BE-NEXT:    [[L1:%.*]] = load i32, ptr [[P:%.*]], align 1228; BE-NEXT:    ret i32 [[L1]]229;230  %p1 = getelementptr i8, ptr %p, i32 1231  %p2 = getelementptr i8, ptr %p, i32 2232  %p3 = getelementptr i8, ptr %p, i32 3233  %l1 = load i8, ptr %p234  %l2 = load i8, ptr %p1235  %l3 = load i8, ptr %p2236  %l4 = load i8, ptr %p3237 238  %e1 = zext i8 %l1 to i32239  %e2 = zext i8 %l2 to i32240  %e3 = zext i8 %l3 to i32241  %e4 = zext i8 %l4 to i32242 243  %s1 = shl i32 %e1, 24244  %s2 = shl i32 %e2, 16245  %s3 = shl i32 %e3, 8246 247  %o1 = or i32 %s1, %s2248  %o2 = or i32 %o1, %s3249  %o3 = or i32 %o2, %e4250  ret i32 %o3251}252 253define i32 @loadCombine_4consecutive_alias(ptr %p) {254; LE-LABEL: @loadCombine_4consecutive_alias(255; LE-NEXT:    [[L1:%.*]] = load i32, ptr [[P:%.*]], align 1256; LE-NEXT:    store i8 10, ptr [[P]], align 1257; LE-NEXT:    ret i32 [[L1]]258;259; BE-LABEL: @loadCombine_4consecutive_alias(260; BE-NEXT:    [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 1261; BE-NEXT:    [[P2:%.*]] = getelementptr i8, ptr [[P]], i32 2262; BE-NEXT:    [[P3:%.*]] = getelementptr i8, ptr [[P]], i32 3263; BE-NEXT:    [[L1:%.*]] = load i8, ptr [[P]], align 1264; BE-NEXT:    store i8 10, ptr [[P]], align 1265; BE-NEXT:    [[L2:%.*]] = load i8, ptr [[P1]], align 1266; BE-NEXT:    [[L3:%.*]] = load i8, ptr [[P2]], align 1267; BE-NEXT:    [[L4:%.*]] = load i8, ptr [[P3]], align 1268; BE-NEXT:    [[E1:%.*]] = zext i8 [[L1]] to i32269; BE-NEXT:    [[E2:%.*]] = zext i8 [[L2]] to i32270; BE-NEXT:    [[E3:%.*]] = zext i8 [[L3]] to i32271; BE-NEXT:    [[E4:%.*]] = zext i8 [[L4]] to i32272; BE-NEXT:    [[S2:%.*]] = shl i32 [[E2]], 8273; BE-NEXT:    [[S3:%.*]] = shl i32 [[E3]], 16274; BE-NEXT:    [[S4:%.*]] = shl i32 [[E4]], 24275; BE-NEXT:    [[O1:%.*]] = or i32 [[E1]], [[S2]]276; BE-NEXT:    [[O2:%.*]] = or i32 [[O1]], [[S3]]277; BE-NEXT:    [[O3:%.*]] = or i32 [[O2]], [[S4]]278; BE-NEXT:    ret i32 [[O3]]279;280  %p1 = getelementptr i8, ptr %p, i32 1281  %p2 = getelementptr i8, ptr %p, i32 2282  %p3 = getelementptr i8, ptr %p, i32 3283  %l1 = load i8, ptr %p284  store i8 10, ptr %p285  %l2 = load i8, ptr %p1286  %l3 = load i8, ptr %p2287  %l4 = load i8, ptr %p3288 289  %e1 = zext i8 %l1 to i32290  %e2 = zext i8 %l2 to i32291  %e3 = zext i8 %l3 to i32292  %e4 = zext i8 %l4 to i32293 294  %s2 = shl i32 %e2, 8295  %s3 = shl i32 %e3, 16296  %s4 = shl i32 %e4, 24297 298  %o1 = or i32 %e1, %s2299  %o2 = or i32 %o1, %s3300  %o3 = or i32 %o2, %s4301  ret i32 %o3302}303 304define i32 @loadCombine_4consecutive_alias_BE(ptr %p) {305; LE-LABEL: @loadCombine_4consecutive_alias_BE(306; LE-NEXT:    [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 1307; LE-NEXT:    [[P2:%.*]] = getelementptr i8, ptr [[P]], i32 2308; LE-NEXT:    [[P3:%.*]] = getelementptr i8, ptr [[P]], i32 3309; LE-NEXT:    [[L1:%.*]] = load i8, ptr [[P]], align 1310; LE-NEXT:    store i8 10, ptr [[P]], align 1311; LE-NEXT:    [[L2:%.*]] = load i8, ptr [[P1]], align 1312; LE-NEXT:    [[L3:%.*]] = load i8, ptr [[P2]], align 1313; LE-NEXT:    [[L4:%.*]] = load i8, ptr [[P3]], align 1314; LE-NEXT:    [[E1:%.*]] = zext i8 [[L1]] to i32315; LE-NEXT:    [[E2:%.*]] = zext i8 [[L2]] to i32316; LE-NEXT:    [[E3:%.*]] = zext i8 [[L3]] to i32317; LE-NEXT:    [[E4:%.*]] = zext i8 [[L4]] to i32318; LE-NEXT:    [[S1:%.*]] = shl i32 [[E1]], 24319; LE-NEXT:    [[S2:%.*]] = shl i32 [[E2]], 16320; LE-NEXT:    [[S3:%.*]] = shl i32 [[E3]], 8321; LE-NEXT:    [[O1:%.*]] = or i32 [[S1]], [[S2]]322; LE-NEXT:    [[O2:%.*]] = or i32 [[O1]], [[S3]]323; LE-NEXT:    [[O3:%.*]] = or i32 [[O2]], [[E4]]324; LE-NEXT:    ret i32 [[O3]]325;326; BE-LABEL: @loadCombine_4consecutive_alias_BE(327; BE-NEXT:    [[L1:%.*]] = load i32, ptr [[P:%.*]], align 1328; BE-NEXT:    store i8 10, ptr [[P]], align 1329; BE-NEXT:    ret i32 [[L1]]330;331  %p1 = getelementptr i8, ptr %p, i32 1332  %p2 = getelementptr i8, ptr %p, i32 2333  %p3 = getelementptr i8, ptr %p, i32 3334  %l1 = load i8, ptr %p335  store i8 10, ptr %p336  %l2 = load i8, ptr %p1337  %l3 = load i8, ptr %p2338  %l4 = load i8, ptr %p3339 340  %e1 = zext i8 %l1 to i32341  %e2 = zext i8 %l2 to i32342  %e3 = zext i8 %l3 to i32343  %e4 = zext i8 %l4 to i32344 345  %s1 = shl i32 %e1, 24346  %s2 = shl i32 %e2, 16347  %s3 = shl i32 %e3, 8348 349  %o1 = or i32 %s1, %s2350  %o2 = or i32 %o1, %s3351  %o3 = or i32 %o2, %e4352  ret i32 %o3353}354 355define i32 @loadCombine_4consecutive_alias2(ptr %p, ptr %pstr) {356; LE-LABEL: @loadCombine_4consecutive_alias2(357; LE-NEXT:    [[P2:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 2358; LE-NEXT:    [[P3:%.*]] = getelementptr i8, ptr [[P]], i32 3359; LE-NEXT:    [[L1:%.*]] = load i16, ptr [[P]], align 1360; LE-NEXT:    [[TMP1:%.*]] = zext i16 [[L1]] to i32361; LE-NEXT:    [[L3:%.*]] = load i8, ptr [[P2]], align 1362; LE-NEXT:    store i8 10, ptr [[PSTR:%.*]], align 1363; LE-NEXT:    [[L4:%.*]] = load i8, ptr [[P3]], align 1364; LE-NEXT:    [[E3:%.*]] = zext i8 [[L3]] to i32365; LE-NEXT:    [[E4:%.*]] = zext i8 [[L4]] to i32366; LE-NEXT:    [[S3:%.*]] = shl i32 [[E3]], 16367; LE-NEXT:    [[S4:%.*]] = shl i32 [[E4]], 24368; LE-NEXT:    [[O2:%.*]] = or i32 [[TMP1]], [[S3]]369; LE-NEXT:    [[O3:%.*]] = or i32 [[O2]], [[S4]]370; LE-NEXT:    ret i32 [[O3]]371;372; BE-LABEL: @loadCombine_4consecutive_alias2(373; BE-NEXT:    [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 1374; BE-NEXT:    [[P2:%.*]] = getelementptr i8, ptr [[P]], i32 2375; BE-NEXT:    [[P3:%.*]] = getelementptr i8, ptr [[P]], i32 3376; BE-NEXT:    [[L1:%.*]] = load i8, ptr [[P]], align 1377; BE-NEXT:    [[L2:%.*]] = load i8, ptr [[P1]], align 1378; BE-NEXT:    [[L3:%.*]] = load i8, ptr [[P2]], align 1379; BE-NEXT:    store i8 10, ptr [[PSTR:%.*]], align 1380; BE-NEXT:    [[L4:%.*]] = load i8, ptr [[P3]], align 1381; BE-NEXT:    [[E1:%.*]] = zext i8 [[L1]] to i32382; BE-NEXT:    [[E2:%.*]] = zext i8 [[L2]] to i32383; BE-NEXT:    [[E3:%.*]] = zext i8 [[L3]] to i32384; BE-NEXT:    [[E4:%.*]] = zext i8 [[L4]] to i32385; BE-NEXT:    [[S2:%.*]] = shl i32 [[E2]], 8386; BE-NEXT:    [[S3:%.*]] = shl i32 [[E3]], 16387; BE-NEXT:    [[S4:%.*]] = shl i32 [[E4]], 24388; BE-NEXT:    [[O1:%.*]] = or i32 [[E1]], [[S2]]389; BE-NEXT:    [[O2:%.*]] = or i32 [[O1]], [[S3]]390; BE-NEXT:    [[O3:%.*]] = or i32 [[O2]], [[S4]]391; BE-NEXT:    ret i32 [[O3]]392;393  %p1 = getelementptr i8, ptr %p, i32 1394  %p2 = getelementptr i8, ptr %p, i32 2395  %p3 = getelementptr i8, ptr %p, i32 3396  %l1 = load i8, ptr %p397  %l2 = load i8, ptr %p1398  %l3 = load i8, ptr %p2399  store i8 10, ptr %pstr400  %l4 = load i8, ptr %p3401 402  %e1 = zext i8 %l1 to i32403  %e2 = zext i8 %l2 to i32404  %e3 = zext i8 %l3 to i32405  %e4 = zext i8 %l4 to i32406 407  %s2 = shl i32 %e2, 8408  %s3 = shl i32 %e3, 16409  %s4 = shl i32 %e4, 24410 411  %o1 = or i32 %e1, %s2412  %o2 = or i32 %o1, %s3413  %o3 = or i32 %o2, %s4414  ret i32 %o3415}416 417define i32 @loadCombine_4consecutive_alias2_BE(ptr %p, ptr %pstr) {418; LE-LABEL: @loadCombine_4consecutive_alias2_BE(419; LE-NEXT:    [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 1420; LE-NEXT:    [[P2:%.*]] = getelementptr i8, ptr [[P]], i32 2421; LE-NEXT:    [[P3:%.*]] = getelementptr i8, ptr [[P]], i32 3422; LE-NEXT:    [[L1:%.*]] = load i8, ptr [[P]], align 1423; LE-NEXT:    [[L2:%.*]] = load i8, ptr [[P1]], align 1424; LE-NEXT:    [[L3:%.*]] = load i8, ptr [[P2]], align 1425; LE-NEXT:    store i8 10, ptr [[PSTR:%.*]], align 1426; LE-NEXT:    [[L4:%.*]] = load i8, ptr [[P3]], align 1427; LE-NEXT:    [[E1:%.*]] = zext i8 [[L1]] to i32428; LE-NEXT:    [[E2:%.*]] = zext i8 [[L2]] to i32429; LE-NEXT:    [[E3:%.*]] = zext i8 [[L3]] to i32430; LE-NEXT:    [[E4:%.*]] = zext i8 [[L4]] to i32431; LE-NEXT:    [[S1:%.*]] = shl i32 [[E1]], 24432; LE-NEXT:    [[S2:%.*]] = shl i32 [[E2]], 16433; LE-NEXT:    [[S3:%.*]] = shl i32 [[E3]], 8434; LE-NEXT:    [[O1:%.*]] = or i32 [[S1]], [[S2]]435; LE-NEXT:    [[O2:%.*]] = or i32 [[O1]], [[S3]]436; LE-NEXT:    [[O3:%.*]] = or i32 [[O2]], [[E4]]437; LE-NEXT:    ret i32 [[O3]]438;439; BE-LABEL: @loadCombine_4consecutive_alias2_BE(440; BE-NEXT:    [[P2:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 2441; BE-NEXT:    [[P3:%.*]] = getelementptr i8, ptr [[P]], i32 3442; BE-NEXT:    [[L1:%.*]] = load i16, ptr [[P]], align 1443; BE-NEXT:    [[TMP1:%.*]] = zext i16 [[L1]] to i32444; BE-NEXT:    [[TMP2:%.*]] = shl i32 [[TMP1]], 16445; BE-NEXT:    [[L3:%.*]] = load i8, ptr [[P2]], align 1446; BE-NEXT:    store i8 10, ptr [[PSTR:%.*]], align 1447; BE-NEXT:    [[L4:%.*]] = load i8, ptr [[P3]], align 1448; BE-NEXT:    [[E3:%.*]] = zext i8 [[L3]] to i32449; BE-NEXT:    [[E4:%.*]] = zext i8 [[L4]] to i32450; BE-NEXT:    [[S3:%.*]] = shl i32 [[E3]], 8451; BE-NEXT:    [[O2:%.*]] = or i32 [[TMP2]], [[S3]]452; BE-NEXT:    [[O3:%.*]] = or i32 [[O2]], [[E4]]453; BE-NEXT:    ret i32 [[O3]]454;455  %p1 = getelementptr i8, ptr %p, i32 1456  %p2 = getelementptr i8, ptr %p, i32 2457  %p3 = getelementptr i8, ptr %p, i32 3458  %l1 = load i8, ptr %p459  %l2 = load i8, ptr %p1460  %l3 = load i8, ptr %p2461  store i8 10, ptr %pstr462  %l4 = load i8, ptr %p3463 464  %e1 = zext i8 %l1 to i32465  %e2 = zext i8 %l2 to i32466  %e3 = zext i8 %l3 to i32467  %e4 = zext i8 %l4 to i32468 469  %s1 = shl i32 %e1, 24470  %s2 = shl i32 %e2, 16471  %s3 = shl i32 %e3, 8472 473  %o1 = or i32 %s1, %s2474  %o2 = or i32 %o1, %s3475  %o3 = or i32 %o2, %e4476  ret i32 %o3477}478 479define i32 @loadCombine_4consecutive_alias3(ptr %p) {480; LE-LABEL: @loadCombine_4consecutive_alias3(481; LE-NEXT:    [[P2:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 2482; LE-NEXT:    [[P3:%.*]] = getelementptr i8, ptr [[P]], i32 3483; LE-NEXT:    [[L1:%.*]] = load i16, ptr [[P]], align 1484; LE-NEXT:    [[TMP1:%.*]] = zext i16 [[L1]] to i32485; LE-NEXT:    [[L3:%.*]] = load i8, ptr [[P2]], align 1486; LE-NEXT:    store i8 10, ptr [[P3]], align 1487; LE-NEXT:    store i8 5, ptr [[P]], align 1488; LE-NEXT:    [[L4:%.*]] = load i8, ptr [[P3]], align 1489; LE-NEXT:    [[E3:%.*]] = zext i8 [[L3]] to i32490; LE-NEXT:    [[E4:%.*]] = zext i8 [[L4]] to i32491; LE-NEXT:    [[S3:%.*]] = shl i32 [[E3]], 16492; LE-NEXT:    [[S4:%.*]] = shl i32 [[E4]], 24493; LE-NEXT:    [[O2:%.*]] = or i32 [[TMP1]], [[S3]]494; LE-NEXT:    [[O3:%.*]] = or i32 [[O2]], [[S4]]495; LE-NEXT:    ret i32 [[O3]]496;497; BE-LABEL: @loadCombine_4consecutive_alias3(498; BE-NEXT:    [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 1499; BE-NEXT:    [[P2:%.*]] = getelementptr i8, ptr [[P]], i32 2500; BE-NEXT:    [[P3:%.*]] = getelementptr i8, ptr [[P]], i32 3501; BE-NEXT:    [[L1:%.*]] = load i8, ptr [[P]], align 1502; BE-NEXT:    [[L2:%.*]] = load i8, ptr [[P1]], align 1503; BE-NEXT:    [[L3:%.*]] = load i8, ptr [[P2]], align 1504; BE-NEXT:    store i8 10, ptr [[P3]], align 1505; BE-NEXT:    store i8 5, ptr [[P]], align 1506; BE-NEXT:    [[L4:%.*]] = load i8, ptr [[P3]], align 1507; BE-NEXT:    [[E1:%.*]] = zext i8 [[L1]] to i32508; BE-NEXT:    [[E2:%.*]] = zext i8 [[L2]] to i32509; BE-NEXT:    [[E3:%.*]] = zext i8 [[L3]] to i32510; BE-NEXT:    [[E4:%.*]] = zext i8 [[L4]] to i32511; BE-NEXT:    [[S2:%.*]] = shl i32 [[E2]], 8512; BE-NEXT:    [[S3:%.*]] = shl i32 [[E3]], 16513; BE-NEXT:    [[S4:%.*]] = shl i32 [[E4]], 24514; BE-NEXT:    [[O1:%.*]] = or i32 [[E1]], [[S2]]515; BE-NEXT:    [[O2:%.*]] = or i32 [[O1]], [[S3]]516; BE-NEXT:    [[O3:%.*]] = or i32 [[O2]], [[S4]]517; BE-NEXT:    ret i32 [[O3]]518;519  %p1 = getelementptr i8, ptr %p, i32 1520  %p2 = getelementptr i8, ptr %p, i32 2521  %p3 = getelementptr i8, ptr %p, i32 3522  %l1 = load i8, ptr %p523  %l2 = load i8, ptr %p1524  %l3 = load i8, ptr %p2525  store i8 10, ptr %p3526  store i8 5, ptr %p527  %l4 = load i8, ptr %p3528 529  %e1 = zext i8 %l1 to i32530  %e2 = zext i8 %l2 to i32531  %e3 = zext i8 %l3 to i32532  %e4 = zext i8 %l4 to i32533 534  %s2 = shl i32 %e2, 8535  %s3 = shl i32 %e3, 16536  %s4 = shl i32 %e4, 24537 538  %o1 = or i32 %e1, %s2539  %o2 = or i32 %o1, %s3540  %o3 = or i32 %o2, %s4541  ret i32 %o3542}543 544define i32 @loadCombine_4consecutive_alias3_BE(ptr %p) {545; LE-LABEL: @loadCombine_4consecutive_alias3_BE(546; LE-NEXT:    [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 1547; LE-NEXT:    [[P2:%.*]] = getelementptr i8, ptr [[P]], i32 2548; LE-NEXT:    [[P3:%.*]] = getelementptr i8, ptr [[P]], i32 3549; LE-NEXT:    [[L1:%.*]] = load i8, ptr [[P]], align 1550; LE-NEXT:    [[L2:%.*]] = load i8, ptr [[P1]], align 1551; LE-NEXT:    [[L3:%.*]] = load i8, ptr [[P2]], align 1552; LE-NEXT:    store i8 10, ptr [[P3]], align 1553; LE-NEXT:    store i8 5, ptr [[P]], align 1554; LE-NEXT:    [[L4:%.*]] = load i8, ptr [[P3]], align 1555; LE-NEXT:    [[E1:%.*]] = zext i8 [[L1]] to i32556; LE-NEXT:    [[E2:%.*]] = zext i8 [[L2]] to i32557; LE-NEXT:    [[E3:%.*]] = zext i8 [[L3]] to i32558; LE-NEXT:    [[E4:%.*]] = zext i8 [[L4]] to i32559; LE-NEXT:    [[S1:%.*]] = shl i32 [[E1]], 24560; LE-NEXT:    [[S2:%.*]] = shl i32 [[E2]], 16561; LE-NEXT:    [[S3:%.*]] = shl i32 [[E3]], 8562; LE-NEXT:    [[O1:%.*]] = or i32 [[S1]], [[S2]]563; LE-NEXT:    [[O2:%.*]] = or i32 [[O1]], [[S3]]564; LE-NEXT:    [[O3:%.*]] = or i32 [[O2]], [[E4]]565; LE-NEXT:    ret i32 [[O3]]566;567; BE-LABEL: @loadCombine_4consecutive_alias3_BE(568; BE-NEXT:    [[P2:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 2569; BE-NEXT:    [[P3:%.*]] = getelementptr i8, ptr [[P]], i32 3570; BE-NEXT:    [[L1:%.*]] = load i16, ptr [[P]], align 1571; BE-NEXT:    [[TMP1:%.*]] = zext i16 [[L1]] to i32572; BE-NEXT:    [[TMP2:%.*]] = shl i32 [[TMP1]], 16573; BE-NEXT:    [[L3:%.*]] = load i8, ptr [[P2]], align 1574; BE-NEXT:    store i8 10, ptr [[P3]], align 1575; BE-NEXT:    store i8 5, ptr [[P]], align 1576; BE-NEXT:    [[L4:%.*]] = load i8, ptr [[P3]], align 1577; BE-NEXT:    [[E3:%.*]] = zext i8 [[L3]] to i32578; BE-NEXT:    [[E4:%.*]] = zext i8 [[L4]] to i32579; BE-NEXT:    [[S3:%.*]] = shl i32 [[E3]], 8580; BE-NEXT:    [[O2:%.*]] = or i32 [[TMP2]], [[S3]]581; BE-NEXT:    [[O3:%.*]] = or i32 [[O2]], [[E4]]582; BE-NEXT:    ret i32 [[O3]]583;584  %p1 = getelementptr i8, ptr %p, i32 1585  %p2 = getelementptr i8, ptr %p, i32 2586  %p3 = getelementptr i8, ptr %p, i32 3587  %l1 = load i8, ptr %p588  %l2 = load i8, ptr %p1589  %l3 = load i8, ptr %p2590  store i8 10, ptr %p3591  store i8 5, ptr %p592  %l4 = load i8, ptr %p3593 594  %e1 = zext i8 %l1 to i32595  %e2 = zext i8 %l2 to i32596  %e3 = zext i8 %l3 to i32597  %e4 = zext i8 %l4 to i32598 599  %s1 = shl i32 %e1, 24600  %s2 = shl i32 %e2, 16601  %s3 = shl i32 %e3, 8602 603  %o1 = or i32 %s1, %s2604  %o2 = or i32 %o1, %s3605  %o3 = or i32 %o2, %e4606  ret i32 %o3607}608 609define i32 @loadCombine_4consecutive_with_alias4(ptr %p, ptr %ps) {610; ALL-LABEL: @loadCombine_4consecutive_with_alias4(611; ALL-NEXT:    [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 1612; ALL-NEXT:    [[P2:%.*]] = getelementptr i8, ptr [[P]], i32 2613; ALL-NEXT:    [[P3:%.*]] = getelementptr i8, ptr [[P]], i32 3614; ALL-NEXT:    [[PS1:%.*]] = getelementptr i8, ptr [[PS:%.*]], i32 1615; ALL-NEXT:    [[PS2:%.*]] = getelementptr i8, ptr [[PS]], i32 2616; ALL-NEXT:    [[PS3:%.*]] = getelementptr i8, ptr [[PS]], i32 3617; ALL-NEXT:    [[L1:%.*]] = load i8, ptr [[P]], align 1618; ALL-NEXT:    store i8 10, ptr [[PS]], align 1619; ALL-NEXT:    [[L2:%.*]] = load i8, ptr [[P1]], align 1620; ALL-NEXT:    store i8 10, ptr [[PS1]], align 1621; ALL-NEXT:    [[L3:%.*]] = load i8, ptr [[P2]], align 1622; ALL-NEXT:    store i8 10, ptr [[PS2]], align 1623; ALL-NEXT:    [[L4:%.*]] = load i8, ptr [[P3]], align 1624; ALL-NEXT:    store i8 10, ptr [[PS3]], align 1625; ALL-NEXT:    [[E1:%.*]] = zext i8 [[L1]] to i32626; ALL-NEXT:    [[E2:%.*]] = zext i8 [[L2]] to i32627; ALL-NEXT:    [[E3:%.*]] = zext i8 [[L3]] to i32628; ALL-NEXT:    [[E4:%.*]] = zext i8 [[L4]] to i32629; ALL-NEXT:    [[S2:%.*]] = shl i32 [[E2]], 8630; ALL-NEXT:    [[S3:%.*]] = shl i32 [[E3]], 16631; ALL-NEXT:    [[S4:%.*]] = shl i32 [[E4]], 24632; ALL-NEXT:    [[O1:%.*]] = or i32 [[E1]], [[S2]]633; ALL-NEXT:    [[O2:%.*]] = or i32 [[O1]], [[S3]]634; ALL-NEXT:    [[O3:%.*]] = or i32 [[O2]], [[S4]]635; ALL-NEXT:    ret i32 [[O3]]636;637  %p1 = getelementptr i8, ptr %p, i32 1638  %p2 = getelementptr i8, ptr %p, i32 2639  %p3 = getelementptr i8, ptr %p, i32 3640  %ps1 = getelementptr i8, ptr %ps, i32 1641  %ps2 = getelementptr i8, ptr %ps, i32 2642  %ps3 = getelementptr i8, ptr %ps, i32 3643  %l1 = load i8, ptr %p644  store i8 10, ptr %ps645  %l2 = load i8, ptr %p1646  store i8 10, ptr %ps1647  %l3 = load i8, ptr %p2648  store i8 10, ptr %ps2649  %l4 = load i8, ptr %p3650  store i8 10, ptr %ps3651 652  %e1 = zext i8 %l1 to i32653  %e2 = zext i8 %l2 to i32654  %e3 = zext i8 %l3 to i32655  %e4 = zext i8 %l4 to i32656 657  %s2 = shl i32 %e2, 8658  %s3 = shl i32 %e3, 16659  %s4 = shl i32 %e4, 24660 661  %o1 = or i32 %e1, %s2662  %o2 = or i32 %o1, %s3663  %o3 = or i32 %o2, %s4664  ret i32 %o3665}666 667declare void @use(i8)668declare void @use2(i32)669 670define i32 @loadCombine_4consecutive_hasOneUse1(ptr %p) {671; ALL-LABEL: @loadCombine_4consecutive_hasOneUse1(672; ALL-NEXT:    [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 1673; ALL-NEXT:    [[P2:%.*]] = getelementptr i8, ptr [[P]], i32 2674; ALL-NEXT:    [[P3:%.*]] = getelementptr i8, ptr [[P]], i32 3675; ALL-NEXT:    [[L1:%.*]] = load i8, ptr [[P]], align 1676; ALL-NEXT:    call void @use(i8 [[L1]])677; ALL-NEXT:    [[L2:%.*]] = load i8, ptr [[P1]], align 1678; ALL-NEXT:    call void @use(i8 [[L2]])679; ALL-NEXT:    [[L3:%.*]] = load i8, ptr [[P2]], align 1680; ALL-NEXT:    call void @use(i8 [[L3]])681; ALL-NEXT:    [[L4:%.*]] = load i8, ptr [[P3]], align 1682; ALL-NEXT:    call void @use(i8 [[L4]])683; ALL-NEXT:    [[E1:%.*]] = zext i8 [[L1]] to i32684; ALL-NEXT:    [[E2:%.*]] = zext i8 [[L2]] to i32685; ALL-NEXT:    [[E3:%.*]] = zext i8 [[L3]] to i32686; ALL-NEXT:    [[E4:%.*]] = zext i8 [[L4]] to i32687; ALL-NEXT:    [[S2:%.*]] = shl i32 [[E2]], 8688; ALL-NEXT:    [[S3:%.*]] = shl i32 [[E3]], 16689; ALL-NEXT:    [[S4:%.*]] = shl i32 [[E4]], 24690; ALL-NEXT:    [[O1:%.*]] = or i32 [[E1]], [[S2]]691; ALL-NEXT:    [[O2:%.*]] = or i32 [[O1]], [[S3]]692; ALL-NEXT:    [[O3:%.*]] = or i32 [[O2]], [[S4]]693; ALL-NEXT:    ret i32 [[O3]]694;695  %p1 = getelementptr i8, ptr %p, i32 1696  %p2 = getelementptr i8, ptr %p, i32 2697  %p3 = getelementptr i8, ptr %p, i32 3698  %l1 = load i8, ptr %p699  call void @use(i8 %l1)700  %l2 = load i8, ptr %p1701  call void @use(i8 %l2)702  %l3 = load i8, ptr %p2703  call void @use(i8 %l3)704  %l4 = load i8, ptr %p3705  call void @use(i8 %l4)706 707  %e1 = zext i8 %l1 to i32708  %e2 = zext i8 %l2 to i32709  %e3 = zext i8 %l3 to i32710  %e4 = zext i8 %l4 to i32711 712  %s2 = shl i32 %e2, 8713  %s3 = shl i32 %e3, 16714  %s4 = shl i32 %e4, 24715 716  %o1 = or i32 %e1, %s2717  %o2 = or i32 %o1, %s3718  %o3 = or i32 %o2, %s4719  ret i32 %o3720}721 722define i32 @loadCombine_4consecutive_hasOneUse2(ptr %p) {723; ALL-LABEL: @loadCombine_4consecutive_hasOneUse2(724; ALL-NEXT:    [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 1725; ALL-NEXT:    [[P2:%.*]] = getelementptr i8, ptr [[P]], i32 2726; ALL-NEXT:    [[P3:%.*]] = getelementptr i8, ptr [[P]], i32 3727; ALL-NEXT:    [[L1:%.*]] = load i8, ptr [[P]], align 1728; ALL-NEXT:    [[L2:%.*]] = load i8, ptr [[P1]], align 1729; ALL-NEXT:    [[L3:%.*]] = load i8, ptr [[P2]], align 1730; ALL-NEXT:    [[L4:%.*]] = load i8, ptr [[P3]], align 1731; ALL-NEXT:    [[E1:%.*]] = zext i8 [[L1]] to i32732; ALL-NEXT:    call void @use(i32 [[E1]])733; ALL-NEXT:    [[E2:%.*]] = zext i8 [[L2]] to i32734; ALL-NEXT:    call void @use(i32 [[E2]])735; ALL-NEXT:    [[E3:%.*]] = zext i8 [[L3]] to i32736; ALL-NEXT:    call void @use(i32 [[E3]])737; ALL-NEXT:    [[E4:%.*]] = zext i8 [[L4]] to i32738; ALL-NEXT:    call void @use(i32 [[E4]])739; ALL-NEXT:    [[S2:%.*]] = shl i32 [[E2]], 8740; ALL-NEXT:    [[S3:%.*]] = shl i32 [[E3]], 16741; ALL-NEXT:    [[S4:%.*]] = shl i32 [[E4]], 24742; ALL-NEXT:    [[O1:%.*]] = or i32 [[E1]], [[S2]]743; ALL-NEXT:    [[O2:%.*]] = or i32 [[O1]], [[S3]]744; ALL-NEXT:    [[O3:%.*]] = or i32 [[O2]], [[S4]]745; ALL-NEXT:    ret i32 [[O3]]746;747  %p1 = getelementptr i8, ptr %p, i32 1748  %p2 = getelementptr i8, ptr %p, i32 2749  %p3 = getelementptr i8, ptr %p, i32 3750  %l1 = load i8, ptr %p751  %l2 = load i8, ptr %p1752  %l3 = load i8, ptr %p2753  %l4 = load i8, ptr %p3754 755  %e1 = zext i8 %l1 to i32756  call void @use(i32 %e1)757  %e2 = zext i8 %l2 to i32758  call void @use(i32 %e2)759  %e3 = zext i8 %l3 to i32760  call void @use(i32 %e3)761  %e4 = zext i8 %l4 to i32762  call void @use(i32 %e4)763 764  %s2 = shl i32 %e2, 8765  %s3 = shl i32 %e3, 16766  %s4 = shl i32 %e4, 24767 768  %o1 = or i32 %e1, %s2769  %o2 = or i32 %o1, %s3770  %o3 = or i32 %o2, %s4771  ret i32 %o3772}773 774define i32 @loadCombine_4consecutive_hasOneUse3(ptr %p) {775; ALL-LABEL: @loadCombine_4consecutive_hasOneUse3(776; ALL-NEXT:    [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 1777; ALL-NEXT:    [[P2:%.*]] = getelementptr i8, ptr [[P]], i32 2778; ALL-NEXT:    [[P3:%.*]] = getelementptr i8, ptr [[P]], i32 3779; ALL-NEXT:    [[L1:%.*]] = load i8, ptr [[P]], align 1780; ALL-NEXT:    [[L2:%.*]] = load i8, ptr [[P1]], align 1781; ALL-NEXT:    [[L3:%.*]] = load i8, ptr [[P2]], align 1782; ALL-NEXT:    [[L4:%.*]] = load i8, ptr [[P3]], align 1783; ALL-NEXT:    [[E1:%.*]] = zext i8 [[L1]] to i32784; ALL-NEXT:    [[E2:%.*]] = zext i8 [[L2]] to i32785; ALL-NEXT:    [[E3:%.*]] = zext i8 [[L3]] to i32786; ALL-NEXT:    [[E4:%.*]] = zext i8 [[L4]] to i32787; ALL-NEXT:    [[S2:%.*]] = shl i32 [[E2]], 8788; ALL-NEXT:    call void @use(i32 [[S2]])789; ALL-NEXT:    [[S3:%.*]] = shl i32 [[E3]], 16790; ALL-NEXT:    call void @use(i32 [[S3]])791; ALL-NEXT:    [[S4:%.*]] = shl i32 [[E4]], 24792; ALL-NEXT:    call void @use(i32 [[S4]])793; ALL-NEXT:    [[O1:%.*]] = or i32 [[E1]], [[S2]]794; ALL-NEXT:    [[O2:%.*]] = or i32 [[O1]], [[S3]]795; ALL-NEXT:    [[O3:%.*]] = or i32 [[O2]], [[S4]]796; ALL-NEXT:    ret i32 [[O3]]797;798  %p1 = getelementptr i8, ptr %p, i32 1799  %p2 = getelementptr i8, ptr %p, i32 2800  %p3 = getelementptr i8, ptr %p, i32 3801  %l1 = load i8, ptr %p802  %l2 = load i8, ptr %p1803  %l3 = load i8, ptr %p2804  %l4 = load i8, ptr %p3805 806  %e1 = zext i8 %l1 to i32807  %e2 = zext i8 %l2 to i32808  %e3 = zext i8 %l3 to i32809  %e4 = zext i8 %l4 to i32810 811  %s2 = shl i32 %e2, 8812  call void @use(i32 %s2)813  %s3 = shl i32 %e3, 16814  call void @use(i32 %s3)815  %s4 = shl i32 %e4, 24816  call void @use(i32 %s4)817 818  %o1 = or i32 %e1, %s2819  %o2 = or i32 %o1, %s3820  %o3 = or i32 %o2, %s4821  ret i32 %o3822}823 824define i32 @loadCombine_4consecutive_hasOneUse4(ptr %p) {825; ALL-LABEL: @loadCombine_4consecutive_hasOneUse4(826; ALL-NEXT:    [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 1827; ALL-NEXT:    [[P2:%.*]] = getelementptr i8, ptr [[P]], i32 2828; ALL-NEXT:    [[P3:%.*]] = getelementptr i8, ptr [[P]], i32 3829; ALL-NEXT:    [[L1:%.*]] = load i8, ptr [[P]], align 1830; ALL-NEXT:    [[L2:%.*]] = load i8, ptr [[P1]], align 1831; ALL-NEXT:    [[L3:%.*]] = load i8, ptr [[P2]], align 1832; ALL-NEXT:    [[L4:%.*]] = load i8, ptr [[P3]], align 1833; ALL-NEXT:    [[E1:%.*]] = zext i8 [[L1]] to i32834; ALL-NEXT:    [[E2:%.*]] = zext i8 [[L2]] to i32835; ALL-NEXT:    [[E3:%.*]] = zext i8 [[L3]] to i32836; ALL-NEXT:    [[E4:%.*]] = zext i8 [[L4]] to i32837; ALL-NEXT:    [[S2:%.*]] = shl i32 [[E2]], 8838; ALL-NEXT:    [[S3:%.*]] = shl i32 [[E3]], 16839; ALL-NEXT:    [[S4:%.*]] = shl i32 [[E4]], 24840; ALL-NEXT:    [[O1:%.*]] = or i32 [[E1]], [[S2]]841; ALL-NEXT:    call void @use(i32 [[O1]])842; ALL-NEXT:    [[O2:%.*]] = or i32 [[O1]], [[S3]]843; ALL-NEXT:    call void @use(i32 [[O2]])844; ALL-NEXT:    [[O3:%.*]] = or i32 [[O2]], [[S4]]845; ALL-NEXT:    ret i32 [[O3]]846;847  %p1 = getelementptr i8, ptr %p, i32 1848  %p2 = getelementptr i8, ptr %p, i32 2849  %p3 = getelementptr i8, ptr %p, i32 3850  %l1 = load i8, ptr %p851  %l2 = load i8, ptr %p1852  %l3 = load i8, ptr %p2853  %l4 = load i8, ptr %p3854 855  %e1 = zext i8 %l1 to i32856  %e2 = zext i8 %l2 to i32857  %e3 = zext i8 %l3 to i32858  %e4 = zext i8 %l4 to i32859 860  %s2 = shl i32 %e2, 8861  %s3 = shl i32 %e3, 16862  %s4 = shl i32 %e4, 24863 864  %o1 = or i32 %e1, %s2865  call void @use(i32 %o1)866  %o2 = or i32 %o1, %s3867  call void @use(i32 %o2)868  %o3 = or i32 %o2, %s4869  ret i32 %o3870}871 872define i32 @loadCombine_parLoad1(ptr %p) {873; LE-LABEL: @loadCombine_parLoad1(874; LE-NEXT:    [[P2:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 2875; LE-NEXT:    [[L1:%.*]] = load i16, ptr [[P]], align 1876; LE-NEXT:    [[TMP1:%.*]] = zext i16 [[L1]] to i32877; LE-NEXT:    [[L3:%.*]] = load i8, ptr [[P2]], align 1878; LE-NEXT:    [[E3:%.*]] = zext i8 [[L3]] to i32879; LE-NEXT:    [[S3:%.*]] = shl i32 [[E3]], 16880; LE-NEXT:    [[O2:%.*]] = or i32 [[TMP1]], [[S3]]881; LE-NEXT:    ret i32 [[O2]]882;883; BE-LABEL: @loadCombine_parLoad1(884; BE-NEXT:    [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 1885; BE-NEXT:    [[P2:%.*]] = getelementptr i8, ptr [[P]], i32 2886; BE-NEXT:    [[L1:%.*]] = load i8, ptr [[P]], align 1887; BE-NEXT:    [[L2:%.*]] = load i8, ptr [[P1]], align 1888; BE-NEXT:    [[L3:%.*]] = load i8, ptr [[P2]], align 1889; BE-NEXT:    [[E1:%.*]] = zext i8 [[L1]] to i32890; BE-NEXT:    [[E2:%.*]] = zext i8 [[L2]] to i32891; BE-NEXT:    [[E3:%.*]] = zext i8 [[L3]] to i32892; BE-NEXT:    [[S2:%.*]] = shl i32 [[E2]], 8893; BE-NEXT:    [[S3:%.*]] = shl i32 [[E3]], 16894; BE-NEXT:    [[O1:%.*]] = or i32 [[E1]], [[S2]]895; BE-NEXT:    [[O2:%.*]] = or i32 [[O1]], [[S3]]896; BE-NEXT:    ret i32 [[O2]]897;898  %p1 = getelementptr i8, ptr %p, i32 1899  %p2 = getelementptr i8, ptr %p, i32 2900  %l1 = load i8, ptr %p901  %l2 = load i8, ptr %p1902  %l3 = load i8, ptr %p2903 904  %e1 = zext i8 %l1 to i32905  %e2 = zext i8 %l2 to i32906  %e3 = zext i8 %l3 to i32907 908  %s2 = shl i32 %e2, 8909  %s3 = shl i32 %e3, 16910 911  %o1 = or i32 %e1, %s2912  %o2 = or i32 %o1, %s3913  ret i32 %o2914}915 916define i128 @loadCombine_i128(ptr %p) {917; LE-LABEL: @loadCombine_i128(918; LE-NEXT:    [[P2:%.*]] = getelementptr i32, ptr [[P:%.*]], i32 2919; LE-NEXT:    [[P3:%.*]] = getelementptr i32, ptr [[P]], i32 3920; LE-NEXT:    [[L1:%.*]] = load i64, ptr [[P]], align 4921; LE-NEXT:    [[TMP1:%.*]] = zext i64 [[L1]] to i128922; LE-NEXT:    [[L3:%.*]] = load i32, ptr [[P2]], align 4923; LE-NEXT:    [[L4:%.*]] = load i32, ptr [[P3]], align 4924; LE-NEXT:    [[E3:%.*]] = zext i32 [[L3]] to i128925; LE-NEXT:    [[E4:%.*]] = zext i32 [[L4]] to i128926; LE-NEXT:    [[S3:%.*]] = shl i128 [[E3]], 64927; LE-NEXT:    [[S4:%.*]] = shl i128 [[E4]], 96928; LE-NEXT:    [[O2:%.*]] = or i128 [[TMP1]], [[S3]]929; LE-NEXT:    [[O3:%.*]] = or i128 [[O2]], [[S4]]930; LE-NEXT:    ret i128 [[O3]]931;932; BE-LABEL: @loadCombine_i128(933; BE-NEXT:    [[P1:%.*]] = getelementptr i32, ptr [[P:%.*]], i32 1934; BE-NEXT:    [[P2:%.*]] = getelementptr i32, ptr [[P]], i32 2935; BE-NEXT:    [[P3:%.*]] = getelementptr i32, ptr [[P]], i32 3936; BE-NEXT:    [[L1:%.*]] = load i32, ptr [[P]], align 4937; BE-NEXT:    [[L2:%.*]] = load i32, ptr [[P1]], align 4938; BE-NEXT:    [[L3:%.*]] = load i32, ptr [[P2]], align 4939; BE-NEXT:    [[L4:%.*]] = load i32, ptr [[P3]], align 4940; BE-NEXT:    [[E1:%.*]] = zext i32 [[L1]] to i128941; BE-NEXT:    [[E2:%.*]] = zext i32 [[L2]] to i128942; BE-NEXT:    [[E3:%.*]] = zext i32 [[L3]] to i128943; BE-NEXT:    [[E4:%.*]] = zext i32 [[L4]] to i128944; BE-NEXT:    [[S2:%.*]] = shl i128 [[E2]], 32945; BE-NEXT:    [[S3:%.*]] = shl i128 [[E3]], 64946; BE-NEXT:    [[S4:%.*]] = shl i128 [[E4]], 96947; BE-NEXT:    [[O1:%.*]] = or i128 [[E1]], [[S2]]948; BE-NEXT:    [[O2:%.*]] = or i128 [[O1]], [[S3]]949; BE-NEXT:    [[O3:%.*]] = or i128 [[O2]], [[S4]]950; BE-NEXT:    ret i128 [[O3]]951;952  %p1 = getelementptr i32, ptr %p, i32 1953  %p2 = getelementptr i32, ptr %p, i32 2954  %p3 = getelementptr i32, ptr %p, i32 3955  %l1 = load i32, ptr %p956  %l2 = load i32, ptr %p1957  %l3 = load i32, ptr %p2958  %l4 = load i32, ptr %p3959 960  %e1 = zext i32 %l1 to i128961  %e2 = zext i32 %l2 to i128962  %e3 = zext i32 %l3 to i128963  %e4 = zext i32 %l4 to i128964 965  %s2 = shl i128 %e2, 32966  %s3 = shl i128 %e3, 64967  %s4 = shl i128 %e4, 96968 969  %o1 = or i128 %e1, %s2970  %o2 = or i128 %o1, %s3971  %o3 = or i128 %o2, %s4972  ret i128 %o3973}974 975define i128 @loadCombine_i128_BE(ptr %p) {976; LE-LABEL: @loadCombine_i128_BE(977; LE-NEXT:    [[P1:%.*]] = getelementptr i32, ptr [[P:%.*]], i32 1978; LE-NEXT:    [[P2:%.*]] = getelementptr i32, ptr [[P]], i32 2979; LE-NEXT:    [[P3:%.*]] = getelementptr i32, ptr [[P]], i32 3980; LE-NEXT:    [[L1:%.*]] = load i32, ptr [[P]], align 4981; LE-NEXT:    [[L2:%.*]] = load i32, ptr [[P1]], align 4982; LE-NEXT:    [[L3:%.*]] = load i32, ptr [[P2]], align 4983; LE-NEXT:    [[L4:%.*]] = load i32, ptr [[P3]], align 4984; LE-NEXT:    [[E1:%.*]] = zext i32 [[L1]] to i128985; LE-NEXT:    [[E2:%.*]] = zext i32 [[L2]] to i128986; LE-NEXT:    [[E3:%.*]] = zext i32 [[L3]] to i128987; LE-NEXT:    [[E4:%.*]] = zext i32 [[L4]] to i128988; LE-NEXT:    [[S1:%.*]] = shl i128 [[E1]], 96989; LE-NEXT:    [[S2:%.*]] = shl i128 [[E2]], 64990; LE-NEXT:    [[S3:%.*]] = shl i128 [[E3]], 32991; LE-NEXT:    [[O1:%.*]] = or i128 [[S1]], [[S2]]992; LE-NEXT:    [[O2:%.*]] = or i128 [[O1]], [[S3]]993; LE-NEXT:    [[O3:%.*]] = or i128 [[O2]], [[E4]]994; LE-NEXT:    ret i128 [[O3]]995;996; BE-LABEL: @loadCombine_i128_BE(997; BE-NEXT:    [[P2:%.*]] = getelementptr i32, ptr [[P:%.*]], i32 2998; BE-NEXT:    [[P3:%.*]] = getelementptr i32, ptr [[P]], i32 3999; BE-NEXT:    [[L1:%.*]] = load i64, ptr [[P]], align 41000; BE-NEXT:    [[TMP1:%.*]] = zext i64 [[L1]] to i1281001; BE-NEXT:    [[TMP2:%.*]] = shl i128 [[TMP1]], 641002; BE-NEXT:    [[L3:%.*]] = load i32, ptr [[P2]], align 41003; BE-NEXT:    [[L4:%.*]] = load i32, ptr [[P3]], align 41004; BE-NEXT:    [[E3:%.*]] = zext i32 [[L3]] to i1281005; BE-NEXT:    [[E4:%.*]] = zext i32 [[L4]] to i1281006; BE-NEXT:    [[S3:%.*]] = shl i128 [[E3]], 321007; BE-NEXT:    [[O2:%.*]] = or i128 [[TMP2]], [[S3]]1008; BE-NEXT:    [[O3:%.*]] = or i128 [[O2]], [[E4]]1009; BE-NEXT:    ret i128 [[O3]]1010;1011  %p1 = getelementptr i32, ptr %p, i32 11012  %p2 = getelementptr i32, ptr %p, i32 21013  %p3 = getelementptr i32, ptr %p, i32 31014  %l1 = load i32, ptr %p1015  %l2 = load i32, ptr %p11016  %l3 = load i32, ptr %p21017  %l4 = load i32, ptr %p31018 1019  %e1 = zext i32 %l1 to i1281020  %e2 = zext i32 %l2 to i1281021  %e3 = zext i32 %l3 to i1281022  %e4 = zext i32 %l4 to i1281023 1024  %s1 = shl i128 %e1, 961025  %s2 = shl i128 %e2, 641026  %s3 = shl i128 %e3, 321027 1028  %o1 = or i128 %s1, %s21029  %o2 = or i128 %o1, %s31030  %o3 = or i128 %o2, %e41031  ret i128 %o31032}1033 1034define i64 @loadCombine_i64(ptr %p) {1035; LE-LABEL: @loadCombine_i64(1036; LE-NEXT:    [[L1:%.*]] = load i64, ptr [[P:%.*]], align 21037; LE-NEXT:    ret i64 [[L1]]1038;1039; BE-LABEL: @loadCombine_i64(1040; BE-NEXT:    [[P1:%.*]] = getelementptr i16, ptr [[P:%.*]], i32 11041; BE-NEXT:    [[P2:%.*]] = getelementptr i16, ptr [[P]], i32 21042; BE-NEXT:    [[P3:%.*]] = getelementptr i16, ptr [[P]], i32 31043; BE-NEXT:    [[L1:%.*]] = load i16, ptr [[P]], align 21044; BE-NEXT:    [[L2:%.*]] = load i16, ptr [[P1]], align 21045; BE-NEXT:    [[L3:%.*]] = load i16, ptr [[P2]], align 21046; BE-NEXT:    [[L4:%.*]] = load i16, ptr [[P3]], align 21047; BE-NEXT:    [[E1:%.*]] = zext i16 [[L1]] to i641048; BE-NEXT:    [[E2:%.*]] = zext i16 [[L2]] to i641049; BE-NEXT:    [[E3:%.*]] = zext i16 [[L3]] to i641050; BE-NEXT:    [[E4:%.*]] = zext i16 [[L4]] to i641051; BE-NEXT:    [[S2:%.*]] = shl i64 [[E2]], 161052; BE-NEXT:    [[S3:%.*]] = shl i64 [[E3]], 321053; BE-NEXT:    [[S4:%.*]] = shl i64 [[E4]], 481054; BE-NEXT:    [[O1:%.*]] = or i64 [[E1]], [[S2]]1055; BE-NEXT:    [[O2:%.*]] = or i64 [[O1]], [[S3]]1056; BE-NEXT:    [[O3:%.*]] = or i64 [[O2]], [[S4]]1057; BE-NEXT:    ret i64 [[O3]]1058;1059  %p1 = getelementptr i16, ptr %p, i32 11060  %p2 = getelementptr i16, ptr %p, i32 21061  %p3 = getelementptr i16, ptr %p, i32 31062  %l1 = load i16, ptr %p1063  %l2 = load i16, ptr %p11064  %l3 = load i16, ptr %p21065  %l4 = load i16, ptr %p31066 1067  %e1 = zext i16 %l1 to i641068  %e2 = zext i16 %l2 to i641069  %e3 = zext i16 %l3 to i641070  %e4 = zext i16 %l4 to i641071 1072  %s2 = shl i64 %e2, 161073  %s3 = shl i64 %e3, 321074  %s4 = shl i64 %e4, 481075 1076  %o1 = or i64 %e1, %s21077  %o2 = or i64 %o1, %s31078  %o3 = or i64 %o2, %s41079  ret i64 %o31080}1081 1082define i64 @loadCombine_i64_BE(ptr %p) {1083; LE-LABEL: @loadCombine_i64_BE(1084; LE-NEXT:    [[P1:%.*]] = getelementptr i16, ptr [[P:%.*]], i32 11085; LE-NEXT:    [[P2:%.*]] = getelementptr i16, ptr [[P]], i32 21086; LE-NEXT:    [[P3:%.*]] = getelementptr i16, ptr [[P]], i32 31087; LE-NEXT:    [[L1:%.*]] = load i16, ptr [[P]], align 21088; LE-NEXT:    [[L2:%.*]] = load i16, ptr [[P1]], align 21089; LE-NEXT:    [[L3:%.*]] = load i16, ptr [[P2]], align 21090; LE-NEXT:    [[L4:%.*]] = load i16, ptr [[P3]], align 21091; LE-NEXT:    [[E1:%.*]] = zext i16 [[L1]] to i641092; LE-NEXT:    [[E2:%.*]] = zext i16 [[L2]] to i641093; LE-NEXT:    [[E3:%.*]] = zext i16 [[L3]] to i641094; LE-NEXT:    [[E4:%.*]] = zext i16 [[L4]] to i641095; LE-NEXT:    [[S1:%.*]] = shl i64 [[E1]], 481096; LE-NEXT:    [[S2:%.*]] = shl i64 [[E2]], 321097; LE-NEXT:    [[S3:%.*]] = shl i64 [[E3]], 161098; LE-NEXT:    [[O1:%.*]] = or i64 [[S1]], [[S2]]1099; LE-NEXT:    [[O2:%.*]] = or i64 [[O1]], [[S3]]1100; LE-NEXT:    [[O3:%.*]] = or i64 [[O2]], [[E4]]1101; LE-NEXT:    ret i64 [[O3]]1102;1103; BE-LABEL: @loadCombine_i64_BE(1104; BE-NEXT:    [[L1:%.*]] = load i64, ptr [[P:%.*]], align 21105; BE-NEXT:    ret i64 [[L1]]1106;1107  %p1 = getelementptr i16, ptr %p, i32 11108  %p2 = getelementptr i16, ptr %p, i32 21109  %p3 = getelementptr i16, ptr %p, i32 31110  %l1 = load i16, ptr %p1111  %l2 = load i16, ptr %p11112  %l3 = load i16, ptr %p21113  %l4 = load i16, ptr %p31114 1115  %e1 = zext i16 %l1 to i641116  %e2 = zext i16 %l2 to i641117  %e3 = zext i16 %l3 to i641118  %e4 = zext i16 %l4 to i641119 1120  %s1 = shl i64 %e1, 481121  %s2 = shl i64 %e2, 321122  %s3 = shl i64 %e3, 161123 1124  %o1 = or i64 %s1, %s21125  %o2 = or i64 %o1, %s31126  %o3 = or i64 %o2, %e41127  ret i64 %o31128}1129 1130define i16 @loadCombine_2consecutive_atomic(ptr %p) {1131; ALL-LABEL: @loadCombine_2consecutive_atomic(1132; ALL-NEXT:    [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 11133; ALL-NEXT:    [[L1:%.*]] = load atomic i8, ptr [[P]] monotonic, align 11134; ALL-NEXT:    [[L2:%.*]] = load atomic i8, ptr [[P1]] monotonic, align 11135; ALL-NEXT:    [[E1:%.*]] = zext i8 [[L1]] to i161136; ALL-NEXT:    [[E2:%.*]] = zext i8 [[L2]] to i161137; ALL-NEXT:    [[S2:%.*]] = shl i16 [[E2]], 81138; ALL-NEXT:    [[O1:%.*]] = or i16 [[E1]], [[S2]]1139; ALL-NEXT:    ret i16 [[O1]]1140;1141  %p1 = getelementptr i8, ptr %p, i32 11142  %l1 = load atomic i8, ptr %p monotonic, align 11143  %l2 = load atomic i8, ptr %p1 monotonic, align 11144  %e1 = zext i8 %l1 to i161145  %e2 = zext i8 %l2 to i161146  %s2 = shl i16 %e2, 81147  %o1 = or i16 %e1, %s21148  ret i16 %o11149}1150 1151define i16 @loadCombine_2consecutive_volatile(ptr %p) {1152; ALL-LABEL: @loadCombine_2consecutive_volatile(1153; ALL-NEXT:    [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 11154; ALL-NEXT:    [[L1:%.*]] = load volatile i8, ptr [[P]], align 11155; ALL-NEXT:    [[L2:%.*]] = load volatile i8, ptr [[P1]], align 11156; ALL-NEXT:    [[E1:%.*]] = zext i8 [[L1]] to i161157; ALL-NEXT:    [[E2:%.*]] = zext i8 [[L2]] to i161158; ALL-NEXT:    [[S2:%.*]] = shl i16 [[E2]], 81159; ALL-NEXT:    [[O1:%.*]] = or i16 [[E1]], [[S2]]1160; ALL-NEXT:    ret i16 [[O1]]1161;1162  %p1 = getelementptr i8, ptr %p, i32 11163  %l1 = load volatile i8, ptr %p, align 11164  %l2 = load volatile i8, ptr %p1, align 11165  %e1 = zext i8 %l1 to i161166  %e2 = zext i8 %l2 to i161167  %s2 = shl i16 %e2, 81168  %o1 = or i16 %e1, %s21169  ret i16 %o11170}1171 1172define i16 @loadCombine_2consecutive_separateBB(ptr %p) {1173; ALL-LABEL: @loadCombine_2consecutive_separateBB(1174; ALL-NEXT:    [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 11175; ALL-NEXT:    [[L1:%.*]] = load i8, ptr [[P]], align 11176; ALL-NEXT:    br label [[BB2:%.*]]1177; ALL:       bb2:1178; ALL-NEXT:    [[L2:%.*]] = load i8, ptr [[P1]], align 11179; ALL-NEXT:    [[E1:%.*]] = zext i8 [[L1]] to i161180; ALL-NEXT:    [[E2:%.*]] = zext i8 [[L2]] to i161181; ALL-NEXT:    [[S2:%.*]] = shl i16 [[E2]], 81182; ALL-NEXT:    [[O1:%.*]] = or i16 [[E1]], [[S2]]1183; ALL-NEXT:    ret i16 [[O1]]1184;1185  %p1 = getelementptr i8, ptr %p, i32 11186  %l1 = load i8, ptr %p, align 11187  br label %bb21188 1189bb2:1190  %l2 = load i8, ptr %p1, align 11191  %e1 = zext i8 %l1 to i161192  %e2 = zext i8 %l2 to i161193  %s2 = shl i16 %e2, 81194  %o1 = or i16 %e1, %s21195  ret i16 %o11196}1197 1198define i16 @loadCombine_2consecutive_separateptr(ptr %p, ptr %p2) {1199; ALL-LABEL: @loadCombine_2consecutive_separateptr(1200; ALL-NEXT:    [[P1:%.*]] = getelementptr i8, ptr [[P2:%.*]], i32 11201; ALL-NEXT:    [[L1:%.*]] = load i8, ptr [[P:%.*]], align 11202; ALL-NEXT:    [[L2:%.*]] = load i8, ptr [[P1]], align 11203; ALL-NEXT:    [[E1:%.*]] = zext i8 [[L1]] to i161204; ALL-NEXT:    [[E2:%.*]] = zext i8 [[L2]] to i161205; ALL-NEXT:    [[S2:%.*]] = shl i16 [[E2]], 81206; ALL-NEXT:    [[O1:%.*]] = or i16 [[E1]], [[S2]]1207; ALL-NEXT:    ret i16 [[O1]]1208;1209  %p1 = getelementptr i8, ptr %p2, i32 11210  %l1 = load i8, ptr %p, align 11211  %l2 = load i8, ptr %p1, align 11212  %e1 = zext i8 %l1 to i161213  %e2 = zext i8 %l2 to i161214  %s2 = shl i16 %e2, 81215  %o1 = or i16 %e1, %s21216  ret i16 %o11217}1218 1219define i64 @load64_farLoads(ptr %ptr) {1220; LE-LABEL: @load64_farLoads(1221; LE-NEXT:  entry:1222; LE-NEXT:    [[TMP0:%.*]] = load i64, ptr [[PTR:%.*]], align 11223; LE-NEXT:    ret i64 [[TMP0]]1224;1225; BE-LABEL: @load64_farLoads(1226; BE-NEXT:  entry:1227; BE-NEXT:    [[TMP0:%.*]] = load i8, ptr [[PTR:%.*]], align 11228; BE-NEXT:    [[CONV:%.*]] = zext i8 [[TMP0]] to i641229; BE-NEXT:    [[ARRAYIDX1:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i64 11230; BE-NEXT:    [[TMP1:%.*]] = load i8, ptr [[ARRAYIDX1]], align 11231; BE-NEXT:    [[CONV2:%.*]] = zext i8 [[TMP1]] to i641232; BE-NEXT:    [[SHL:%.*]] = shl i64 [[CONV2]], 81233; BE-NEXT:    [[OR:%.*]] = or i64 [[CONV]], [[SHL]]1234; BE-NEXT:    [[ARRAYIDX3:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i64 21235; BE-NEXT:    [[TMP2:%.*]] = load i8, ptr [[ARRAYIDX3]], align 11236; BE-NEXT:    [[CONV4:%.*]] = zext i8 [[TMP2]] to i641237; BE-NEXT:    [[SHL5:%.*]] = shl i64 [[CONV4]], 161238; BE-NEXT:    [[OR6:%.*]] = or i64 [[OR]], [[SHL5]]1239; BE-NEXT:    [[ARRAYIDX7:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i64 31240; BE-NEXT:    [[TMP3:%.*]] = load i8, ptr [[ARRAYIDX7]], align 11241; BE-NEXT:    [[CONV8:%.*]] = zext i8 [[TMP3]] to i641242; BE-NEXT:    [[SHL9:%.*]] = shl i64 [[CONV8]], 241243; BE-NEXT:    [[OR10:%.*]] = or i64 [[OR6]], [[SHL9]]1244; BE-NEXT:    [[ARRAYIDX11:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i64 41245; BE-NEXT:    [[TMP4:%.*]] = load i8, ptr [[ARRAYIDX11]], align 11246; BE-NEXT:    [[CONV12:%.*]] = zext i8 [[TMP4]] to i641247; BE-NEXT:    [[SHL13:%.*]] = shl i64 [[CONV12]], 321248; BE-NEXT:    [[OR14:%.*]] = or i64 [[OR10]], [[SHL13]]1249; BE-NEXT:    [[ARRAYIDX15:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i64 51250; BE-NEXT:    [[TMP5:%.*]] = load i8, ptr [[ARRAYIDX15]], align 11251; BE-NEXT:    [[CONV16:%.*]] = zext i8 [[TMP5]] to i641252; BE-NEXT:    [[SHL17:%.*]] = shl i64 [[CONV16]], 401253; BE-NEXT:    [[OR18:%.*]] = or i64 [[OR14]], [[SHL17]]1254; BE-NEXT:    [[ARRAYIDX19:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i64 61255; BE-NEXT:    [[TMP6:%.*]] = load i8, ptr [[ARRAYIDX19]], align 11256; BE-NEXT:    [[CONV20:%.*]] = zext i8 [[TMP6]] to i641257; BE-NEXT:    [[SHL21:%.*]] = shl i64 [[CONV20]], 481258; BE-NEXT:    [[OR22:%.*]] = or i64 [[OR18]], [[SHL21]]1259; BE-NEXT:    [[ARRAYIDX23:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i64 71260; BE-NEXT:    [[TMP7:%.*]] = load i8, ptr [[ARRAYIDX23]], align 11261; BE-NEXT:    [[CONV24:%.*]] = zext i8 [[TMP7]] to i641262; BE-NEXT:    [[SHL25:%.*]] = shl i64 [[CONV24]], 561263; BE-NEXT:    [[OR26:%.*]] = or i64 [[OR22]], [[SHL25]]1264; BE-NEXT:    ret i64 [[OR26]]1265;1266entry:1267  %0 = load i8, ptr %ptr, align 11268  %conv = zext i8 %0 to i641269  %arrayidx1 = getelementptr inbounds i8, ptr %ptr, i64 11270  %1 = load i8, ptr %arrayidx1, align 11271  %conv2 = zext i8 %1 to i641272  %shl = shl i64 %conv2, 81273  %or = or i64 %conv, %shl1274  %arrayidx3 = getelementptr inbounds i8, ptr %ptr, i64 21275  %2 = load i8, ptr %arrayidx3, align 11276  %conv4 = zext i8 %2 to i641277  %shl5 = shl i64 %conv4, 161278  %or6 = or i64 %or, %shl51279  %arrayidx7 = getelementptr inbounds i8, ptr %ptr, i64 31280  %3 = load i8, ptr %arrayidx7, align 11281  %conv8 = zext i8 %3 to i641282  %shl9 = shl i64 %conv8, 241283  %or10 = or i64 %or6, %shl91284  %arrayidx11 = getelementptr inbounds i8, ptr %ptr, i64 41285  %4 = load i8, ptr %arrayidx11, align 11286  %conv12 = zext i8 %4 to i641287  %shl13 = shl i64 %conv12, 321288  %or14 = or i64 %or10, %shl131289  %arrayidx15 = getelementptr inbounds i8, ptr %ptr, i64 51290  %5 = load i8, ptr %arrayidx15, align 11291  %conv16 = zext i8 %5 to i641292  %shl17 = shl i64 %conv16, 401293  %or18 = or i64 %or14, %shl171294  %arrayidx19 = getelementptr inbounds i8, ptr %ptr, i64 61295  %6 = load i8, ptr %arrayidx19, align 11296  %conv20 = zext i8 %6 to i641297  %shl21 = shl i64 %conv20, 481298  %or22 = or i64 %or18, %shl211299  %arrayidx23 = getelementptr inbounds i8, ptr %ptr, i64 71300  %7 = load i8, ptr %arrayidx23, align 11301  %conv24 = zext i8 %7 to i641302  %shl25 = shl i64 %conv24, 561303  %or26 = or i64 %or22, %shl251304  ret i64 %or261305}1306 1307define i32 @loadCombine_4consecutive_metadata(ptr %p, ptr %pstr) {1308; LE-LABEL: @loadCombine_4consecutive_metadata(1309; LE-NEXT:    [[L1:%.*]] = load i32, ptr [[P:%.*]], align 1, !alias.scope [[META0:![0-9]+]]1310; LE-NEXT:    store i32 25, ptr [[PSTR:%.*]], align 4, !noalias [[META0]]1311; LE-NEXT:    ret i32 [[L1]]1312;1313; BE-LABEL: @loadCombine_4consecutive_metadata(1314; BE-NEXT:    [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 11315; BE-NEXT:    [[P2:%.*]] = getelementptr i8, ptr [[P]], i32 21316; BE-NEXT:    [[P3:%.*]] = getelementptr i8, ptr [[P]], i32 31317; BE-NEXT:    [[L1:%.*]] = load i8, ptr [[P]], align 1, !alias.scope [[META0:![0-9]+]]1318; BE-NEXT:    [[L2:%.*]] = load i8, ptr [[P1]], align 1, !alias.scope [[META0]]1319; BE-NEXT:    [[L3:%.*]] = load i8, ptr [[P2]], align 1, !alias.scope [[META0]]1320; BE-NEXT:    [[L4:%.*]] = load i8, ptr [[P3]], align 1, !alias.scope [[META0]]1321; BE-NEXT:    store i32 25, ptr [[PSTR:%.*]], align 4, !noalias [[META0]]1322; BE-NEXT:    [[E1:%.*]] = zext i8 [[L1]] to i321323; BE-NEXT:    [[E2:%.*]] = zext i8 [[L2]] to i321324; BE-NEXT:    [[E3:%.*]] = zext i8 [[L3]] to i321325; BE-NEXT:    [[E4:%.*]] = zext i8 [[L4]] to i321326; BE-NEXT:    [[S2:%.*]] = shl i32 [[E2]], 81327; BE-NEXT:    [[S3:%.*]] = shl i32 [[E3]], 161328; BE-NEXT:    [[S4:%.*]] = shl i32 [[E4]], 241329; BE-NEXT:    [[O1:%.*]] = or i32 [[E1]], [[S2]]1330; BE-NEXT:    [[O2:%.*]] = or i32 [[O1]], [[S3]]1331; BE-NEXT:    [[O3:%.*]] = or i32 [[O2]], [[S4]]1332; BE-NEXT:    ret i32 [[O3]]1333;1334  %p1 = getelementptr i8, ptr %p, i32 11335  %p2 = getelementptr i8, ptr %p, i32 21336  %p3 = getelementptr i8, ptr %p, i32 31337  %l1 = load i8, ptr %p, !alias.scope !21338  %l2 = load i8, ptr %p1, !alias.scope !21339  %l3 = load i8, ptr %p2, !alias.scope !21340  %l4 = load i8, ptr %p3, !alias.scope !21341  store i32 25, ptr %pstr, !noalias !21342 1343  %e1 = zext i8 %l1 to i321344  %e2 = zext i8 %l2 to i321345  %e3 = zext i8 %l3 to i321346  %e4 = zext i8 %l4 to i321347 1348  %s2 = shl i32 %e2, 81349  %s3 = shl i32 %e3, 161350  %s4 = shl i32 %e4, 241351 1352  %o1 = or i32 %e1, %s21353  %o2 = or i32 %o1, %s31354  %o3 = or i32 %o2, %s41355  ret i32 %o31356}1357 1358!0 = distinct !{!0}1359!1 = distinct !{!1, !0}1360!2 = !{!1}1361 1362; CHECK: !0 = !{!1}1363; CHECK: !1 = distinct !{!1, !2}1364; CHECK: !2 = distinct !{!2}1365 1366define i16 @loadCombine_4consecutive_4bit(ptr %p) {1367; ALL-LABEL: @loadCombine_4consecutive_4bit(1368; ALL-NEXT:    [[P1:%.*]] = getelementptr i4, ptr [[P:%.*]], i32 11369; ALL-NEXT:    [[P2:%.*]] = getelementptr i4, ptr [[P]], i32 21370; ALL-NEXT:    [[P3:%.*]] = getelementptr i4, ptr [[P]], i32 31371; ALL-NEXT:    [[L1:%.*]] = load i4, ptr [[P]], align 11372; ALL-NEXT:    [[L2:%.*]] = load i4, ptr [[P1]], align 11373; ALL-NEXT:    [[L3:%.*]] = load i4, ptr [[P2]], align 11374; ALL-NEXT:    [[L4:%.*]] = load i4, ptr [[P3]], align 11375; ALL-NEXT:    [[E1:%.*]] = zext i4 [[L1]] to i161376; ALL-NEXT:    [[E2:%.*]] = zext i4 [[L2]] to i161377; ALL-NEXT:    [[E3:%.*]] = zext i4 [[L3]] to i161378; ALL-NEXT:    [[E4:%.*]] = zext i4 [[L4]] to i161379; ALL-NEXT:    [[S2:%.*]] = shl i16 [[E2]], 41380; ALL-NEXT:    [[S3:%.*]] = shl i16 [[E3]], 81381; ALL-NEXT:    [[S4:%.*]] = shl i16 [[E4]], 121382; ALL-NEXT:    [[O1:%.*]] = or i16 [[E1]], [[S2]]1383; ALL-NEXT:    [[O2:%.*]] = or i16 [[O1]], [[S3]]1384; ALL-NEXT:    [[O3:%.*]] = or i16 [[O2]], [[S4]]1385; ALL-NEXT:    ret i16 [[O3]]1386;1387  %p1 = getelementptr i4, ptr %p, i32 11388  %p2 = getelementptr i4, ptr %p, i32 21389  %p3 = getelementptr i4, ptr %p, i32 31390  %l1 = load i4, ptr %p1391  %l2 = load i4, ptr %p11392  %l3 = load i4, ptr %p21393  %l4 = load i4, ptr %p31394  %e1 = zext i4 %l1 to i161395  %e2 = zext i4 %l2 to i161396  %e3 = zext i4 %l3 to i161397  %e4 = zext i4 %l4 to i161398  %s2 = shl i16 %e2, 41399  %s3 = shl i16 %e3, 81400  %s4 = shl i16 %e4, 121401  %o1 = or i16 %e1, %s21402  %o2 = or i16 %o1, %s31403  %o3 = or i16 %o2, %s41404  ret i16 %o31405}1406 1407define i32 @loadCombine_4consecutive_rev(ptr %p) {1408; LE-LABEL: @loadCombine_4consecutive_rev(1409; LE-NEXT:    [[L1:%.*]] = load i32, ptr [[P:%.*]], align 11410; LE-NEXT:    ret i32 [[L1]]1411;1412; BE-LABEL: @loadCombine_4consecutive_rev(1413; BE-NEXT:    [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 11414; BE-NEXT:    [[P2:%.*]] = getelementptr i8, ptr [[P]], i32 21415; BE-NEXT:    [[P3:%.*]] = getelementptr i8, ptr [[P]], i32 31416; BE-NEXT:    [[L1:%.*]] = load i8, ptr [[P]], align 11417; BE-NEXT:    [[L2:%.*]] = load i8, ptr [[P1]], align 11418; BE-NEXT:    [[L3:%.*]] = load i8, ptr [[P2]], align 11419; BE-NEXT:    [[L4:%.*]] = load i8, ptr [[P3]], align 11420; BE-NEXT:    [[E1:%.*]] = zext i8 [[L1]] to i321421; BE-NEXT:    [[E2:%.*]] = zext i8 [[L2]] to i321422; BE-NEXT:    [[E3:%.*]] = zext i8 [[L3]] to i321423; BE-NEXT:    [[E4:%.*]] = zext i8 [[L4]] to i321424; BE-NEXT:    [[S2:%.*]] = shl i32 [[E2]], 81425; BE-NEXT:    [[S3:%.*]] = shl i32 [[E3]], 161426; BE-NEXT:    [[S4:%.*]] = shl i32 [[E4]], 241427; BE-NEXT:    [[O1:%.*]] = or i32 [[S4]], [[S3]]1428; BE-NEXT:    [[O2:%.*]] = or i32 [[O1]], [[S2]]1429; BE-NEXT:    [[O3:%.*]] = or i32 [[O2]], [[E1]]1430; BE-NEXT:    ret i32 [[O3]]1431;1432  %p1 = getelementptr i8, ptr %p, i32 11433  %p2 = getelementptr i8, ptr %p, i32 21434  %p3 = getelementptr i8, ptr %p, i32 31435  %l1 = load i8, ptr %p1436  %l2 = load i8, ptr %p11437  %l3 = load i8, ptr %p21438  %l4 = load i8, ptr %p31439 1440  %e1 = zext i8 %l1 to i321441  %e2 = zext i8 %l2 to i321442  %e3 = zext i8 %l3 to i321443  %e4 = zext i8 %l4 to i321444 1445  %s2 = shl i32 %e2, 81446  %s3 = shl i32 %e3, 161447  %s4 = shl i32 %e4, 241448 1449  %o1 = or i32 %s4, %s31450  %o2 = or i32 %o1, %s21451  %o3 = or i32 %o2, %e11452  ret i32 %o31453}1454 1455define i64 @loadCombine_8consecutive_rev(ptr %p) {1456; LE-LABEL: @loadCombine_8consecutive_rev(1457; LE-NEXT:    [[L1:%.*]] = load i64, ptr [[P:%.*]], align 11458; LE-NEXT:    ret i64 [[L1]]1459;1460; BE-LABEL: @loadCombine_8consecutive_rev(1461; BE-NEXT:    [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 11462; BE-NEXT:    [[P2:%.*]] = getelementptr i8, ptr [[P]], i32 21463; BE-NEXT:    [[P3:%.*]] = getelementptr i8, ptr [[P]], i32 31464; BE-NEXT:    [[P4:%.*]] = getelementptr i8, ptr [[P]], i32 41465; BE-NEXT:    [[P5:%.*]] = getelementptr i8, ptr [[P]], i32 51466; BE-NEXT:    [[P6:%.*]] = getelementptr i8, ptr [[P]], i32 61467; BE-NEXT:    [[P7:%.*]] = getelementptr i8, ptr [[P]], i32 71468; BE-NEXT:    [[L1:%.*]] = load i8, ptr [[P]], align 11469; BE-NEXT:    [[L2:%.*]] = load i8, ptr [[P1]], align 11470; BE-NEXT:    [[L3:%.*]] = load i8, ptr [[P2]], align 11471; BE-NEXT:    [[L4:%.*]] = load i8, ptr [[P3]], align 11472; BE-NEXT:    [[L5:%.*]] = load i8, ptr [[P4]], align 11473; BE-NEXT:    [[L6:%.*]] = load i8, ptr [[P5]], align 11474; BE-NEXT:    [[L7:%.*]] = load i8, ptr [[P6]], align 11475; BE-NEXT:    [[L8:%.*]] = load i8, ptr [[P7]], align 11476; BE-NEXT:    [[E1:%.*]] = zext i8 [[L1]] to i641477; BE-NEXT:    [[E2:%.*]] = zext i8 [[L2]] to i641478; BE-NEXT:    [[E3:%.*]] = zext i8 [[L3]] to i641479; BE-NEXT:    [[E4:%.*]] = zext i8 [[L4]] to i641480; BE-NEXT:    [[E5:%.*]] = zext i8 [[L5]] to i641481; BE-NEXT:    [[E6:%.*]] = zext i8 [[L6]] to i641482; BE-NEXT:    [[E7:%.*]] = zext i8 [[L7]] to i641483; BE-NEXT:    [[E8:%.*]] = zext i8 [[L8]] to i641484; BE-NEXT:    [[S2:%.*]] = shl i64 [[E2]], 81485; BE-NEXT:    [[S3:%.*]] = shl i64 [[E3]], 161486; BE-NEXT:    [[S4:%.*]] = shl i64 [[E4]], 241487; BE-NEXT:    [[S5:%.*]] = shl i64 [[E5]], 321488; BE-NEXT:    [[S6:%.*]] = shl i64 [[E6]], 401489; BE-NEXT:    [[S7:%.*]] = shl i64 [[E7]], 481490; BE-NEXT:    [[S8:%.*]] = shl i64 [[E8]], 561491; BE-NEXT:    [[O7:%.*]] = or i64 [[S8]], [[S7]]1492; BE-NEXT:    [[O6:%.*]] = or i64 [[O7]], [[S6]]1493; BE-NEXT:    [[O5:%.*]] = or i64 [[O6]], [[S5]]1494; BE-NEXT:    [[O4:%.*]] = or i64 [[O5]], [[S4]]1495; BE-NEXT:    [[O3:%.*]] = or i64 [[O4]], [[S3]]1496; BE-NEXT:    [[O2:%.*]] = or i64 [[O3]], [[S2]]1497; BE-NEXT:    [[O1:%.*]] = or i64 [[O2]], [[E1]]1498; BE-NEXT:    ret i64 [[O1]]1499;1500  %p1 = getelementptr i8, ptr %p, i32 11501  %p2 = getelementptr i8, ptr %p, i32 21502  %p3 = getelementptr i8, ptr %p, i32 31503  %p4 = getelementptr i8, ptr %p, i32 41504  %p5 = getelementptr i8, ptr %p, i32 51505  %p6 = getelementptr i8, ptr %p, i32 61506  %p7 = getelementptr i8, ptr %p, i32 71507  %l1 = load i8, ptr %p1508  %l2 = load i8, ptr %p11509  %l3 = load i8, ptr %p21510  %l4 = load i8, ptr %p31511  %l5 = load i8, ptr %p41512  %l6 = load i8, ptr %p51513  %l7 = load i8, ptr %p61514  %l8 = load i8, ptr %p71515 1516  %e1 = zext i8 %l1 to i641517  %e2 = zext i8 %l2 to i641518  %e3 = zext i8 %l3 to i641519  %e4 = zext i8 %l4 to i641520  %e5 = zext i8 %l5 to i641521  %e6 = zext i8 %l6 to i641522  %e7 = zext i8 %l7 to i641523  %e8 = zext i8 %l8 to i641524 1525  %s2 = shl i64 %e2, 81526  %s3 = shl i64 %e3, 161527  %s4 = shl i64 %e4, 241528  %s5 = shl i64 %e5, 321529  %s6 = shl i64 %e6, 401530  %s7 = shl i64 %e7, 481531  %s8 = shl i64 %e8, 561532 1533  %o7 = or i64 %s8, %s71534  %o6 = or i64 %o7, %s61535  %o5 = or i64 %o6, %s51536  %o4 = or i64 %o5, %s41537  %o3 = or i64 %o4, %s31538  %o2 = or i64 %o3, %s21539  %o1 = or i64 %o2, %e11540  ret i64 %o11541}1542 1543define i64 @loadCombine_8consecutive_rev_BE(ptr %p) {1544; LE-LABEL: @loadCombine_8consecutive_rev_BE(1545; LE-NEXT:    [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 11546; LE-NEXT:    [[P2:%.*]] = getelementptr i8, ptr [[P]], i32 21547; LE-NEXT:    [[P3:%.*]] = getelementptr i8, ptr [[P]], i32 31548; LE-NEXT:    [[P4:%.*]] = getelementptr i8, ptr [[P]], i32 41549; LE-NEXT:    [[P5:%.*]] = getelementptr i8, ptr [[P]], i32 51550; LE-NEXT:    [[P6:%.*]] = getelementptr i8, ptr [[P]], i32 61551; LE-NEXT:    [[P7:%.*]] = getelementptr i8, ptr [[P]], i32 71552; LE-NEXT:    [[L1:%.*]] = load i8, ptr [[P]], align 11553; LE-NEXT:    [[L2:%.*]] = load i8, ptr [[P1]], align 11554; LE-NEXT:    [[L3:%.*]] = load i8, ptr [[P2]], align 11555; LE-NEXT:    [[L4:%.*]] = load i8, ptr [[P3]], align 11556; LE-NEXT:    [[L5:%.*]] = load i8, ptr [[P4]], align 11557; LE-NEXT:    [[L6:%.*]] = load i8, ptr [[P5]], align 11558; LE-NEXT:    [[L7:%.*]] = load i8, ptr [[P6]], align 11559; LE-NEXT:    [[L8:%.*]] = load i8, ptr [[P7]], align 11560; LE-NEXT:    [[E1:%.*]] = zext i8 [[L1]] to i641561; LE-NEXT:    [[E2:%.*]] = zext i8 [[L2]] to i641562; LE-NEXT:    [[E3:%.*]] = zext i8 [[L3]] to i641563; LE-NEXT:    [[E4:%.*]] = zext i8 [[L4]] to i641564; LE-NEXT:    [[E5:%.*]] = zext i8 [[L5]] to i641565; LE-NEXT:    [[E6:%.*]] = zext i8 [[L6]] to i641566; LE-NEXT:    [[E7:%.*]] = zext i8 [[L7]] to i641567; LE-NEXT:    [[E8:%.*]] = zext i8 [[L8]] to i641568; LE-NEXT:    [[S1:%.*]] = shl i64 [[E1]], 561569; LE-NEXT:    [[S2:%.*]] = shl i64 [[E2]], 481570; LE-NEXT:    [[S3:%.*]] = shl i64 [[E3]], 401571; LE-NEXT:    [[S4:%.*]] = shl i64 [[E4]], 321572; LE-NEXT:    [[S5:%.*]] = shl i64 [[E5]], 241573; LE-NEXT:    [[S6:%.*]] = shl i64 [[E6]], 161574; LE-NEXT:    [[S7:%.*]] = shl i64 [[E7]], 81575; LE-NEXT:    [[O7:%.*]] = or i64 [[E8]], [[S7]]1576; LE-NEXT:    [[O6:%.*]] = or i64 [[O7]], [[S6]]1577; LE-NEXT:    [[O5:%.*]] = or i64 [[O6]], [[S5]]1578; LE-NEXT:    [[O4:%.*]] = or i64 [[O5]], [[S4]]1579; LE-NEXT:    [[O3:%.*]] = or i64 [[O4]], [[S3]]1580; LE-NEXT:    [[O2:%.*]] = or i64 [[O3]], [[S2]]1581; LE-NEXT:    [[O1:%.*]] = or i64 [[O2]], [[S1]]1582; LE-NEXT:    ret i64 [[O1]]1583;1584; BE-LABEL: @loadCombine_8consecutive_rev_BE(1585; BE-NEXT:    [[L1:%.*]] = load i64, ptr [[P:%.*]], align 11586; BE-NEXT:    ret i64 [[L1]]1587;1588  %p1 = getelementptr i8, ptr %p, i32 11589  %p2 = getelementptr i8, ptr %p, i32 21590  %p3 = getelementptr i8, ptr %p, i32 31591  %p4 = getelementptr i8, ptr %p, i32 41592  %p5 = getelementptr i8, ptr %p, i32 51593  %p6 = getelementptr i8, ptr %p, i32 61594  %p7 = getelementptr i8, ptr %p, i32 71595  %l1 = load i8, ptr %p1596  %l2 = load i8, ptr %p11597  %l3 = load i8, ptr %p21598  %l4 = load i8, ptr %p31599  %l5 = load i8, ptr %p41600  %l6 = load i8, ptr %p51601  %l7 = load i8, ptr %p61602  %l8 = load i8, ptr %p71603 1604  %e1 = zext i8 %l1 to i641605  %e2 = zext i8 %l2 to i641606  %e3 = zext i8 %l3 to i641607  %e4 = zext i8 %l4 to i641608  %e5 = zext i8 %l5 to i641609  %e6 = zext i8 %l6 to i641610  %e7 = zext i8 %l7 to i641611  %e8 = zext i8 %l8 to i641612 1613  %s1 = shl i64 %e1, 561614  %s2 = shl i64 %e2, 481615  %s3 = shl i64 %e3, 401616  %s4 = shl i64 %e4, 321617  %s5 = shl i64 %e5, 241618  %s6 = shl i64 %e6, 161619  %s7 = shl i64 %e7, 81620 1621  %o7 = or i64 %e8, %s71622  %o6 = or i64 %o7, %s61623  %o5 = or i64 %o6, %s51624  %o4 = or i64 %o5, %s41625  %o3 = or i64 %o4, %s31626  %o2 = or i64 %o3, %s21627  %o1 = or i64 %o2, %s11628  ret i64 %o11629}1630 1631define i64 @eggs(ptr noundef readonly %arg) {1632; LE-LABEL: @eggs(1633; LE-NEXT:    [[TMP3:%.*]] = load i64, ptr [[ARG:%.*]], align 11634; LE-NEXT:    ret i64 [[TMP3]]1635;1636; BE-LABEL: @eggs(1637; BE-NEXT:    [[TMP3:%.*]] = load i8, ptr [[ARG:%.*]], align 11638; BE-NEXT:    [[TMP4:%.*]] = getelementptr inbounds i8, ptr [[ARG]], i64 11639; BE-NEXT:    [[TMP5:%.*]] = load i8, ptr [[TMP4]], align 11640; BE-NEXT:    [[TMP6:%.*]] = getelementptr inbounds i8, ptr [[ARG]], i64 21641; BE-NEXT:    [[TMP7:%.*]] = load i8, ptr [[TMP6]], align 11642; BE-NEXT:    [[TMP8:%.*]] = getelementptr inbounds i8, ptr [[ARG]], i64 31643; BE-NEXT:    [[TMP9:%.*]] = load i8, ptr [[TMP8]], align 11644; BE-NEXT:    [[TMP10:%.*]] = getelementptr inbounds i8, ptr [[ARG]], i64 41645; BE-NEXT:    [[TMP11:%.*]] = load i8, ptr [[TMP10]], align 11646; BE-NEXT:    [[TMP12:%.*]] = getelementptr inbounds i8, ptr [[ARG]], i64 51647; BE-NEXT:    [[TMP13:%.*]] = load i8, ptr [[TMP12]], align 11648; BE-NEXT:    [[TMP14:%.*]] = getelementptr inbounds i8, ptr [[ARG]], i64 61649; BE-NEXT:    [[TMP15:%.*]] = load i8, ptr [[TMP14]], align 11650; BE-NEXT:    [[TMP16:%.*]] = getelementptr inbounds i8, ptr [[ARG]], i64 71651; BE-NEXT:    [[TMP17:%.*]] = load i8, ptr [[TMP16]], align 11652; BE-NEXT:    [[TMP18:%.*]] = zext i8 [[TMP17]] to i641653; BE-NEXT:    [[TMP19:%.*]] = shl nuw i64 [[TMP18]], 561654; BE-NEXT:    [[TMP20:%.*]] = zext i8 [[TMP15]] to i641655; BE-NEXT:    [[TMP21:%.*]] = shl nuw nsw i64 [[TMP20]], 481656; BE-NEXT:    [[TMP22:%.*]] = or i64 [[TMP19]], [[TMP21]]1657; BE-NEXT:    [[TMP23:%.*]] = zext i8 [[TMP13]] to i641658; BE-NEXT:    [[TMP24:%.*]] = shl nuw nsw i64 [[TMP23]], 401659; BE-NEXT:    [[TMP25:%.*]] = or i64 [[TMP22]], [[TMP24]]1660; BE-NEXT:    [[TMP26:%.*]] = zext i8 [[TMP11]] to i641661; BE-NEXT:    [[TMP27:%.*]] = shl nuw nsw i64 [[TMP26]], 321662; BE-NEXT:    [[TMP28:%.*]] = or i64 [[TMP25]], [[TMP27]]1663; BE-NEXT:    [[TMP29:%.*]] = zext i8 [[TMP9]] to i641664; BE-NEXT:    [[TMP30:%.*]] = shl nuw nsw i64 [[TMP29]], 241665; BE-NEXT:    [[TMP31:%.*]] = or i64 [[TMP28]], [[TMP30]]1666; BE-NEXT:    [[TMP32:%.*]] = zext i8 [[TMP7]] to i641667; BE-NEXT:    [[TMP33:%.*]] = shl nuw nsw i64 [[TMP32]], 161668; BE-NEXT:    [[TMP34:%.*]] = zext i8 [[TMP5]] to i641669; BE-NEXT:    [[TMP35:%.*]] = shl nuw nsw i64 [[TMP34]], 81670; BE-NEXT:    [[TMP36:%.*]] = or i64 [[TMP31]], [[TMP33]]1671; BE-NEXT:    [[TMP37:%.*]] = zext i8 [[TMP3]] to i641672; BE-NEXT:    [[TMP38:%.*]] = or i64 [[TMP36]], [[TMP35]]1673; BE-NEXT:    [[TMP39:%.*]] = or i64 [[TMP38]], [[TMP37]]1674; BE-NEXT:    ret i64 [[TMP39]]1675;1676  %tmp3 = load i8, ptr %arg, align 11677  %tmp4 = getelementptr inbounds i8, ptr %arg, i64 11678  %tmp5 = load i8, ptr %tmp4, align 11679  %tmp6 = getelementptr inbounds i8, ptr %arg, i64 21680  %tmp7 = load i8, ptr %tmp6, align 11681  %tmp8 = getelementptr inbounds i8, ptr %arg, i64 31682  %tmp9 = load i8, ptr %tmp8, align 11683  %tmp10 = getelementptr inbounds i8, ptr %arg, i64 41684  %tmp11 = load i8, ptr %tmp10, align 11685  %tmp12 = getelementptr inbounds i8, ptr %arg, i64 51686  %tmp13 = load i8, ptr %tmp12, align 11687  %tmp14 = getelementptr inbounds i8, ptr %arg, i64 61688  %tmp15 = load i8, ptr %tmp14, align 11689  %tmp16 = getelementptr inbounds i8, ptr %arg, i64 71690  %tmp17 = load i8, ptr %tmp16, align 11691  %tmp18 = zext i8 %tmp17 to i641692  %tmp19 = shl nuw i64 %tmp18, 561693  %tmp20 = zext i8 %tmp15 to i641694  %tmp21 = shl nuw nsw i64 %tmp20, 481695  %tmp22 = or i64 %tmp19, %tmp211696  %tmp23 = zext i8 %tmp13 to i641697  %tmp24 = shl nuw nsw i64 %tmp23, 401698  %tmp25 = or i64 %tmp22, %tmp241699  %tmp26 = zext i8 %tmp11 to i641700  %tmp27 = shl nuw nsw i64 %tmp26, 321701  %tmp28 = or i64 %tmp25, %tmp271702  %tmp29 = zext i8 %tmp9 to i641703  %tmp30 = shl nuw nsw i64 %tmp29, 241704  %tmp31 = or i64 %tmp28, %tmp301705  %tmp32 = zext i8 %tmp7 to i641706  %tmp33 = shl nuw nsw i64 %tmp32, 161707  %tmp34 = zext i8 %tmp5 to i641708  %tmp35 = shl nuw nsw i64 %tmp34, 81709  %tmp36 = or i64 %tmp31, %tmp331710  %tmp37 = zext i8 %tmp3 to i641711  %tmp38 = or i64 %tmp36, %tmp351712  %tmp39 = or i64 %tmp38, %tmp371713  ret i64 %tmp391714}1715 1716define i32 @loadCombine_4consecutive_mixsize1(ptr %p) {1717; LE-LABEL: @loadCombine_4consecutive_mixsize1(1718; LE-NEXT:    [[L1:%.*]] = load i32, ptr [[P:%.*]], align 21719; LE-NEXT:    ret i32 [[L1]]1720;1721; BE-LABEL: @loadCombine_4consecutive_mixsize1(1722; BE-NEXT:    [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 21723; BE-NEXT:    [[P2:%.*]] = getelementptr i8, ptr [[P]], i32 31724; BE-NEXT:    [[L1:%.*]] = load i16, ptr [[P]], align 21725; BE-NEXT:    [[L2:%.*]] = load i8, ptr [[P1]], align 11726; BE-NEXT:    [[L3:%.*]] = load i8, ptr [[P2]], align 11727; BE-NEXT:    [[E1:%.*]] = zext i16 [[L1]] to i321728; BE-NEXT:    [[E2:%.*]] = zext i8 [[L2]] to i321729; BE-NEXT:    [[E3:%.*]] = zext i8 [[L3]] to i321730; BE-NEXT:    [[S2:%.*]] = shl i32 [[E2]], 161731; BE-NEXT:    [[S3:%.*]] = shl i32 [[E3]], 241732; BE-NEXT:    [[O1:%.*]] = or i32 [[E1]], [[S2]]1733; BE-NEXT:    [[O2:%.*]] = or i32 [[O1]], [[S3]]1734; BE-NEXT:    ret i32 [[O2]]1735;1736  %p1 = getelementptr i8, ptr %p, i32 21737  %p2 = getelementptr i8, ptr %p, i32 31738  %l1 = load i16, ptr %p1739  %l2 = load i8, ptr %p11740  %l3 = load i8, ptr %p21741 1742  %e1 = zext i16 %l1 to i321743  %e2 = zext i8 %l2 to i321744  %e3 = zext i8 %l3 to i321745 1746  %s2 = shl i32 %e2, 161747  %s3 = shl i32 %e3, 241748 1749  %o1 = or i32 %e1, %s21750  %o2 = or i32 %o1, %s31751  ret i32 %o21752}1753 1754define i32 @loadCombine_4consecutive_mixsize1_BE(ptr %p) {1755; LE-LABEL: @loadCombine_4consecutive_mixsize1_BE(1756; LE-NEXT:    [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 21757; LE-NEXT:    [[P2:%.*]] = getelementptr i8, ptr [[P]], i32 31758; LE-NEXT:    [[L1:%.*]] = load i16, ptr [[P]], align 21759; LE-NEXT:    [[L2:%.*]] = load i8, ptr [[P1]], align 11760; LE-NEXT:    [[L3:%.*]] = load i8, ptr [[P2]], align 11761; LE-NEXT:    [[E1:%.*]] = zext i16 [[L1]] to i321762; LE-NEXT:    [[E2:%.*]] = zext i8 [[L2]] to i321763; LE-NEXT:    [[E3:%.*]] = zext i8 [[L3]] to i321764; LE-NEXT:    [[S1:%.*]] = shl i32 [[E1]], 161765; LE-NEXT:    [[S2:%.*]] = shl i32 [[E2]], 81766; LE-NEXT:    [[O1:%.*]] = or i32 [[S1]], [[S2]]1767; LE-NEXT:    [[O2:%.*]] = or i32 [[O1]], [[E3]]1768; LE-NEXT:    ret i32 [[O2]]1769;1770; BE-LABEL: @loadCombine_4consecutive_mixsize1_BE(1771; BE-NEXT:    [[L1:%.*]] = load i32, ptr [[P:%.*]], align 21772; BE-NEXT:    ret i32 [[L1]]1773;1774  %p1 = getelementptr i8, ptr %p, i32 21775  %p2 = getelementptr i8, ptr %p, i32 31776  %l1 = load i16, ptr %p1777  %l2 = load i8, ptr %p11778  %l3 = load i8, ptr %p21779 1780  %e1 = zext i16 %l1 to i321781  %e2 = zext i8 %l2 to i321782  %e3 = zext i8 %l3 to i321783 1784  %s1 = shl i32 %e1, 161785  %s2 = shl i32 %e2, 81786 1787  %o1 = or i32 %s1, %s21788  %o2 = or i32 %o1, %e31789  ret i32 %o21790}1791 1792define i32 @loadCombine_4consecutive_rev_mixsize1(ptr %p) {1793; LE-LABEL: @loadCombine_4consecutive_rev_mixsize1(1794; LE-NEXT:    [[O2:%.*]] = load i32, ptr [[P:%.*]], align 21795; LE-NEXT:    ret i32 [[O2]]1796;1797; BE-LABEL: @loadCombine_4consecutive_rev_mixsize1(1798; BE-NEXT:    [[P2:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 21799; BE-NEXT:    [[P3:%.*]] = getelementptr i8, ptr [[P]], i32 31800; BE-NEXT:    [[L1:%.*]] = load i16, ptr [[P]], align 21801; BE-NEXT:    [[L2:%.*]] = load i8, ptr [[P2]], align 11802; BE-NEXT:    [[L3:%.*]] = load i8, ptr [[P3]], align 11803; BE-NEXT:    [[E1:%.*]] = zext i16 [[L1]] to i321804; BE-NEXT:    [[E2:%.*]] = zext i8 [[L2]] to i321805; BE-NEXT:    [[E3:%.*]] = zext i8 [[L3]] to i321806; BE-NEXT:    [[S2:%.*]] = shl i32 [[E2]], 161807; BE-NEXT:    [[S3:%.*]] = shl i32 [[E3]], 241808; BE-NEXT:    [[O1:%.*]] = or i32 [[S3]], [[S2]]1809; BE-NEXT:    [[O2:%.*]] = or i32 [[O1]], [[E1]]1810; BE-NEXT:    ret i32 [[O2]]1811;1812  %p2 = getelementptr i8, ptr %p, i32 21813  %p3 = getelementptr i8, ptr %p, i32 31814  %l1 = load i16, ptr %p1815  %l2 = load i8, ptr %p21816  %l3 = load i8, ptr %p31817 1818  %e1 = zext i16 %l1 to i321819  %e2 = zext i8 %l2 to i321820  %e3 = zext i8 %l3 to i321821 1822  %s2 = shl i32 %e2, 161823  %s3 = shl i32 %e3, 241824 1825  %o1 = or i32 %s3, %s21826  %o2 = or i32 %o1, %e11827  ret i32 %o21828}1829 1830define i32 @loadCombine_4consecutive_rev_mixsize1_BE(ptr %p) {1831; LE-LABEL: @loadCombine_4consecutive_rev_mixsize1_BE(1832; LE-NEXT:    [[P2:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 21833; LE-NEXT:    [[P3:%.*]] = getelementptr i8, ptr [[P]], i32 31834; LE-NEXT:    [[L1:%.*]] = load i16, ptr [[P]], align 21835; LE-NEXT:    [[L2:%.*]] = load i8, ptr [[P2]], align 11836; LE-NEXT:    [[L3:%.*]] = load i8, ptr [[P3]], align 11837; LE-NEXT:    [[E1:%.*]] = zext i16 [[L1]] to i321838; LE-NEXT:    [[E2:%.*]] = zext i8 [[L2]] to i321839; LE-NEXT:    [[E3:%.*]] = zext i8 [[L3]] to i321840; LE-NEXT:    [[S1:%.*]] = shl i32 [[E1]], 161841; LE-NEXT:    [[S2:%.*]] = shl i32 [[E2]], 81842; LE-NEXT:    [[O1:%.*]] = or i32 [[E3]], [[S2]]1843; LE-NEXT:    [[O2:%.*]] = or i32 [[O1]], [[S1]]1844; LE-NEXT:    ret i32 [[O2]]1845;1846; BE-LABEL: @loadCombine_4consecutive_rev_mixsize1_BE(1847; BE-NEXT:    [[O2:%.*]] = load i32, ptr [[P:%.*]], align 21848; BE-NEXT:    ret i32 [[O2]]1849;1850  %p2 = getelementptr i8, ptr %p, i32 21851  %p3 = getelementptr i8, ptr %p, i32 31852  %l1 = load i16, ptr %p1853  %l2 = load i8, ptr %p21854  %l3 = load i8, ptr %p31855 1856  %e1 = zext i16 %l1 to i321857  %e2 = zext i8 %l2 to i321858  %e3 = zext i8 %l3 to i321859 1860  %s1 = shl i32 %e1, 161861  %s2 = shl i32 %e2, 81862 1863  %o1 = or i32 %e3, %s21864  %o2 = or i32 %o1, %s11865  ret i32 %o21866}1867 1868define i32 @loadCombine_4consecutive_mixsize2(ptr %p) {1869; LE-LABEL: @loadCombine_4consecutive_mixsize2(1870; LE-NEXT:    [[O2:%.*]] = load i32, ptr [[P:%.*]], align 11871; LE-NEXT:    ret i32 [[O2]]1872;1873; BE-LABEL: @loadCombine_4consecutive_mixsize2(1874; BE-NEXT:    [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 11875; BE-NEXT:    [[P2:%.*]] = getelementptr i8, ptr [[P]], i32 21876; BE-NEXT:    [[L1:%.*]] = load i8, ptr [[P]], align 11877; BE-NEXT:    [[L2:%.*]] = load i8, ptr [[P1]], align 11878; BE-NEXT:    [[L3:%.*]] = load i16, ptr [[P2]], align 21879; BE-NEXT:    [[E1:%.*]] = zext i8 [[L1]] to i321880; BE-NEXT:    [[E2:%.*]] = zext i8 [[L2]] to i321881; BE-NEXT:    [[E3:%.*]] = zext i16 [[L3]] to i321882; BE-NEXT:    [[S2:%.*]] = shl i32 [[E2]], 81883; BE-NEXT:    [[S3:%.*]] = shl i32 [[E3]], 161884; BE-NEXT:    [[O1:%.*]] = or i32 [[E1]], [[S2]]1885; BE-NEXT:    [[O2:%.*]] = or i32 [[O1]], [[S3]]1886; BE-NEXT:    ret i32 [[O2]]1887;1888  %p1 = getelementptr i8, ptr %p, i32 11889  %p2 = getelementptr i8, ptr %p, i32 21890  %l1 = load i8, ptr %p1891  %l2 = load i8, ptr %p11892  %l3 = load i16, ptr %p21893 1894  %e1 = zext i8 %l1 to i321895  %e2 = zext i8 %l2 to i321896  %e3 = zext i16 %l3 to i321897 1898  %s2 = shl i32 %e2, 81899  %s3 = shl i32 %e3, 161900 1901  %o1 = or i32 %e1, %s21902  %o2 = or i32 %o1, %s31903  ret i32 %o21904}1905 1906define i32 @loadCombine_4consecutive_lower_index_comes_before(ptr %p) {1907; LE-LABEL: @loadCombine_4consecutive_lower_index_comes_before(1908; LE-NEXT:    [[L1:%.*]] = load i32, ptr [[P:%.*]], align 11909; LE-NEXT:    ret i32 [[L1]]1910;1911; BE-LABEL: @loadCombine_4consecutive_lower_index_comes_before(1912; BE-NEXT:    [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 11913; BE-NEXT:    [[P2:%.*]] = getelementptr i8, ptr [[P]], i32 21914; BE-NEXT:    [[P3:%.*]] = getelementptr i8, ptr [[P]], i32 31915; BE-NEXT:    [[L4:%.*]] = load i8, ptr [[P3]], align 11916; BE-NEXT:    [[L3:%.*]] = load i8, ptr [[P2]], align 11917; BE-NEXT:    [[L2:%.*]] = load i8, ptr [[P1]], align 11918; BE-NEXT:    [[L1:%.*]] = load i8, ptr [[P]], align 11919; BE-NEXT:    [[E1:%.*]] = zext i8 [[L1]] to i321920; BE-NEXT:    [[E2:%.*]] = zext i8 [[L2]] to i321921; BE-NEXT:    [[E3:%.*]] = zext i8 [[L3]] to i321922; BE-NEXT:    [[E4:%.*]] = zext i8 [[L4]] to i321923; BE-NEXT:    [[S2:%.*]] = shl i32 [[E2]], 81924; BE-NEXT:    [[S3:%.*]] = shl i32 [[E3]], 161925; BE-NEXT:    [[S4:%.*]] = shl i32 [[E4]], 241926; BE-NEXT:    [[O1:%.*]] = or i32 [[E1]], [[S2]]1927; BE-NEXT:    [[O2:%.*]] = or i32 [[O1]], [[S3]]1928; BE-NEXT:    [[O3:%.*]] = or i32 [[O2]], [[S4]]1929; BE-NEXT:    ret i32 [[O3]]1930;1931  %p1 = getelementptr i8, ptr %p, i32 11932  %p2 = getelementptr i8, ptr %p, i32 21933  %p3 = getelementptr i8, ptr %p, i32 31934  %l4 = load i8, ptr %p31935  %l3 = load i8, ptr %p21936  %l2 = load i8, ptr %p11937  %l1 = load i8, ptr %p1938 1939  %e1 = zext i8 %l1 to i321940  %e2 = zext i8 %l2 to i321941  %e3 = zext i8 %l3 to i321942  %e4 = zext i8 %l4 to i321943 1944  %s2 = shl i32 %e2, 81945  %s3 = shl i32 %e3, 161946  %s4 = shl i32 %e4, 241947 1948  %o1 = or i32 %e1, %s21949  %o2 = or i32 %o1, %s31950  %o3 = or i32 %o2, %s41951  ret i32 %o31952}1953 1954define i16 @loadCombine_2consecutive_badinsert(ptr %p) {1955; LE-LABEL: @loadCombine_2consecutive_badinsert(1956; LE-NEXT:    [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 11957; LE-NEXT:    [[L1:%.*]] = load i16, ptr [[P]], align 11958; LE-NEXT:    store i8 0, ptr [[P1]], align 11959; LE-NEXT:    ret i16 [[L1]]1960;1961; BE-LABEL: @loadCombine_2consecutive_badinsert(1962; BE-NEXT:    [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 11963; BE-NEXT:    [[L2:%.*]] = load i8, ptr [[P1]], align 11964; BE-NEXT:    store i8 0, ptr [[P1]], align 11965; BE-NEXT:    [[L1:%.*]] = load i8, ptr [[P]], align 11966; BE-NEXT:    [[E1:%.*]] = zext i8 [[L1]] to i161967; BE-NEXT:    [[E2:%.*]] = zext i8 [[L2]] to i161968; BE-NEXT:    [[S2:%.*]] = shl i16 [[E2]], 81969; BE-NEXT:    [[O1:%.*]] = or i16 [[E1]], [[S2]]1970; BE-NEXT:    ret i16 [[O1]]1971;1972  %p1 = getelementptr i8, ptr %p, i32 11973  %l2 = load i8, ptr %p11974  store i8 0, ptr %p1, align 11975  %l1 = load i8, ptr %p1976  %e1 = zext i8 %l1 to i161977  %e2 = zext i8 %l2 to i161978  %s2 = shl i16 %e2, 81979  %o1 = or i16 %e1, %s21980  ret i16 %o11981}1982 1983define i32 @loadCombine_4consecutive_badinsert(ptr %p) {1984; LE-LABEL: @loadCombine_4consecutive_badinsert(1985; LE-NEXT:    [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 11986; LE-NEXT:    [[L1:%.*]] = load i32, ptr [[P]], align 11987; LE-NEXT:    store i8 0, ptr [[P1]], align 11988; LE-NEXT:    ret i32 [[L1]]1989;1990; BE-LABEL: @loadCombine_4consecutive_badinsert(1991; BE-NEXT:    [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 11992; BE-NEXT:    [[P2:%.*]] = getelementptr i8, ptr [[P]], i32 21993; BE-NEXT:    [[P3:%.*]] = getelementptr i8, ptr [[P]], i32 31994; BE-NEXT:    [[L2:%.*]] = load i8, ptr [[P1]], align 11995; BE-NEXT:    [[L3:%.*]] = load i8, ptr [[P2]], align 11996; BE-NEXT:    store i8 0, ptr [[P1]], align 11997; BE-NEXT:    [[L4:%.*]] = load i8, ptr [[P3]], align 11998; BE-NEXT:    [[L1:%.*]] = load i8, ptr [[P]], align 11999; BE-NEXT:    [[E1:%.*]] = zext i8 [[L1]] to i322000; BE-NEXT:    [[E2:%.*]] = zext i8 [[L2]] to i322001; BE-NEXT:    [[E3:%.*]] = zext i8 [[L3]] to i322002; BE-NEXT:    [[E4:%.*]] = zext i8 [[L4]] to i322003; BE-NEXT:    [[S2:%.*]] = shl i32 [[E2]], 82004; BE-NEXT:    [[S3:%.*]] = shl i32 [[E3]], 162005; BE-NEXT:    [[S4:%.*]] = shl i32 [[E4]], 242006; BE-NEXT:    [[O1:%.*]] = or i32 [[E1]], [[S2]]2007; BE-NEXT:    [[O2:%.*]] = or i32 [[O1]], [[S3]]2008; BE-NEXT:    [[O3:%.*]] = or i32 [[O2]], [[S4]]2009; BE-NEXT:    ret i32 [[O3]]2010;2011  %p1 = getelementptr i8, ptr %p, i32 12012  %p2 = getelementptr i8, ptr %p, i32 22013  %p3 = getelementptr i8, ptr %p, i32 32014  %l2 = load i8, ptr %p12015  %l3 = load i8, ptr %p22016  store i8 0, ptr %p1, align 12017  %l4 = load i8, ptr %p32018  %l1 = load i8, ptr %p2019 2020  %e1 = zext i8 %l1 to i322021  %e2 = zext i8 %l2 to i322022  %e3 = zext i8 %l3 to i322023  %e4 = zext i8 %l4 to i322024 2025  %s2 = shl i32 %e2, 82026  %s3 = shl i32 %e3, 162027  %s4 = shl i32 %e4, 242028 2029  %o1 = or i32 %e1, %s22030  %o2 = or i32 %o1, %s32031  %o3 = or i32 %o2, %s42032  ret i32 %o32033}2034 2035define i32 @loadCombine_4consecutive_badinsert2(ptr %p) {2036; LE-LABEL: @loadCombine_4consecutive_badinsert2(2037; LE-NEXT:    [[P2:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 22038; LE-NEXT:    [[P3:%.*]] = getelementptr i8, ptr [[P]], i32 32039; LE-NEXT:    [[L1:%.*]] = load i16, ptr [[P]], align 12040; LE-NEXT:    [[TMP1:%.*]] = zext i16 [[L1]] to i322041; LE-NEXT:    store i8 0, ptr [[P3]], align 12042; LE-NEXT:    [[L3:%.*]] = load i8, ptr [[P2]], align 12043; LE-NEXT:    [[L4:%.*]] = load i8, ptr [[P3]], align 12044; LE-NEXT:    [[E3:%.*]] = zext i8 [[L3]] to i322045; LE-NEXT:    [[E4:%.*]] = zext i8 [[L4]] to i322046; LE-NEXT:    [[S3:%.*]] = shl i32 [[E3]], 162047; LE-NEXT:    [[S4:%.*]] = shl i32 [[E4]], 242048; LE-NEXT:    [[O2:%.*]] = or i32 [[TMP1]], [[S3]]2049; LE-NEXT:    [[O3:%.*]] = or i32 [[O2]], [[S4]]2050; LE-NEXT:    ret i32 [[O3]]2051;2052; BE-LABEL: @loadCombine_4consecutive_badinsert2(2053; BE-NEXT:    [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 12054; BE-NEXT:    [[P2:%.*]] = getelementptr i8, ptr [[P]], i32 22055; BE-NEXT:    [[P3:%.*]] = getelementptr i8, ptr [[P]], i32 32056; BE-NEXT:    [[L2:%.*]] = load i8, ptr [[P1]], align 12057; BE-NEXT:    store i8 0, ptr [[P3]], align 12058; BE-NEXT:    [[L3:%.*]] = load i8, ptr [[P2]], align 12059; BE-NEXT:    [[L4:%.*]] = load i8, ptr [[P3]], align 12060; BE-NEXT:    [[L1:%.*]] = load i8, ptr [[P]], align 12061; BE-NEXT:    [[E1:%.*]] = zext i8 [[L1]] to i322062; BE-NEXT:    [[E2:%.*]] = zext i8 [[L2]] to i322063; BE-NEXT:    [[E3:%.*]] = zext i8 [[L3]] to i322064; BE-NEXT:    [[E4:%.*]] = zext i8 [[L4]] to i322065; BE-NEXT:    [[S2:%.*]] = shl i32 [[E2]], 82066; BE-NEXT:    [[S3:%.*]] = shl i32 [[E3]], 162067; BE-NEXT:    [[S4:%.*]] = shl i32 [[E4]], 242068; BE-NEXT:    [[O1:%.*]] = or i32 [[E1]], [[S2]]2069; BE-NEXT:    [[O2:%.*]] = or i32 [[O1]], [[S3]]2070; BE-NEXT:    [[O3:%.*]] = or i32 [[O2]], [[S4]]2071; BE-NEXT:    ret i32 [[O3]]2072;2073  %p1 = getelementptr i8, ptr %p, i32 12074  %p2 = getelementptr i8, ptr %p, i32 22075  %p3 = getelementptr i8, ptr %p, i32 32076  %l2 = load i8, ptr %p12077  store i8 0, ptr %p3, align 12078  %l3 = load i8, ptr %p22079  %l4 = load i8, ptr %p32080  %l1 = load i8, ptr %p2081 2082  %e1 = zext i8 %l1 to i322083  %e2 = zext i8 %l2 to i322084  %e3 = zext i8 %l3 to i322085  %e4 = zext i8 %l4 to i322086 2087  %s2 = shl i32 %e2, 82088  %s3 = shl i32 %e3, 162089  %s4 = shl i32 %e4, 242090 2091  %o1 = or i32 %e1, %s22092  %o2 = or i32 %o1, %s32093  %o3 = or i32 %o2, %s42094  ret i32 %o32095}2096 2097define i32 @loadCombine_4consecutive_badinsert3(ptr %p) {2098; LE-LABEL: @loadCombine_4consecutive_badinsert3(2099; LE-NEXT:    [[TMP1:%.*]] = getelementptr i8, ptr [[P:%.*]], i64 12100; LE-NEXT:    [[L1:%.*]] = load i32, ptr [[TMP1]], align 12101; LE-NEXT:    ret i32 [[L1]]2102;2103; BE-LABEL: @loadCombine_4consecutive_badinsert3(2104; BE-NEXT:    [[P4:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 42105; BE-NEXT:    [[L4:%.*]] = load i8, ptr [[P4]], align 12106; BE-NEXT:    [[E4:%.*]] = zext i8 [[L4]] to i322107; BE-NEXT:    [[S4:%.*]] = shl i32 [[E4]], 242108; BE-NEXT:    [[P3:%.*]] = getelementptr i8, ptr [[P]], i32 32109; BE-NEXT:    [[L3:%.*]] = load i8, ptr [[P3]], align 12110; BE-NEXT:    [[E3:%.*]] = zext i8 [[L3]] to i322111; BE-NEXT:    [[S3:%.*]] = shl i32 [[E3]], 162112; BE-NEXT:    [[P2:%.*]] = getelementptr i8, ptr [[P]], i32 22113; BE-NEXT:    [[L2:%.*]] = load i8, ptr [[P2]], align 12114; BE-NEXT:    [[E2:%.*]] = zext i8 [[L2]] to i322115; BE-NEXT:    [[S2:%.*]] = shl i32 [[E2]], 82116; BE-NEXT:    [[P1:%.*]] = getelementptr i8, ptr [[P]], i32 12117; BE-NEXT:    [[L1:%.*]] = load i8, ptr [[P1]], align 12118; BE-NEXT:    [[E1:%.*]] = zext i8 [[L1]] to i322119; BE-NEXT:    [[O1:%.*]] = or i32 [[E1]], [[S2]]2120; BE-NEXT:    [[O2:%.*]] = or i32 [[O1]], [[S3]]2121; BE-NEXT:    [[O3:%.*]] = or i32 [[O2]], [[S4]]2122; BE-NEXT:    ret i32 [[O3]]2123;2124  %p4 = getelementptr i8, ptr %p, i32 42125  %l4 = load i8, ptr %p42126  %e4 = zext i8 %l4 to i322127  %s4 = shl i32 %e4, 242128 2129  %p3 = getelementptr i8, ptr %p, i32 32130  %l3 = load i8, ptr %p32131  %e3 = zext i8 %l3 to i322132  %s3 = shl i32 %e3, 162133 2134  %p2 = getelementptr i8, ptr %p, i32 22135  %l2 = load i8, ptr %p22136  %e2 = zext i8 %l2 to i322137  %s2 = shl i32 %e2, 82138 2139  %p1 = getelementptr i8, ptr %p, i32 12140  %l1 = load i8, ptr %p12141  %e1 = zext i8 %l1 to i322142 2143  %o1 = or i32 %e1, %s22144  %o2 = or i32 %o1, %s32145  %o3 = or i32 %o2, %s42146  ret i32 %o32147}2148 2149define i32 @loadCombine_4consecutive_badinsert4(ptr %p) {2150; LE-LABEL: @loadCombine_4consecutive_badinsert4(2151; LE-NEXT:  entry:2152; LE-NEXT:    [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i64 12153; LE-NEXT:    [[C1:%.*]] = load i8, ptr [[P1]], align 12154; LE-NEXT:    [[CMP:%.*]] = icmp eq i8 [[C1]], 02155; LE-NEXT:    br i1 [[CMP]], label [[END:%.*]], label [[BB2:%.*]]2156; LE:       bb2:2157; LE-NEXT:    [[L1:%.*]] = load i32, ptr [[P1]], align 12158; LE-NEXT:    br label [[END]]2159; LE:       end:2160; LE-NEXT:    [[COND:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[L1]], [[BB2]] ]2161; LE-NEXT:    ret i32 [[COND]]2162;2163; BE-LABEL: @loadCombine_4consecutive_badinsert4(2164; BE-NEXT:  entry:2165; BE-NEXT:    [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i64 12166; BE-NEXT:    [[C1:%.*]] = load i8, ptr [[P1]], align 12167; BE-NEXT:    [[CMP:%.*]] = icmp eq i8 [[C1]], 02168; BE-NEXT:    br i1 [[CMP]], label [[END:%.*]], label [[BB2:%.*]]2169; BE:       bb2:2170; BE-NEXT:    [[L1:%.*]] = load i8, ptr [[P1]], align 12171; BE-NEXT:    [[C2:%.*]] = zext i8 [[L1]] to i322172; BE-NEXT:    [[P4:%.*]] = getelementptr i8, ptr [[P]], i64 42173; BE-NEXT:    [[L4:%.*]] = load i8, ptr [[P4]], align 12174; BE-NEXT:    [[E4:%.*]] = zext i8 [[L4]] to i322175; BE-NEXT:    [[S4:%.*]] = shl nuw i32 [[E4]], 242176; BE-NEXT:    [[P3:%.*]] = getelementptr i8, ptr [[P]], i64 32177; BE-NEXT:    [[L3:%.*]] = load i8, ptr [[P3]], align 12178; BE-NEXT:    [[E3:%.*]] = zext i8 [[L3]] to i322179; BE-NEXT:    [[S3:%.*]] = shl nuw nsw i32 [[E3]], 162180; BE-NEXT:    [[P2:%.*]] = getelementptr i8, ptr [[P]], i64 22181; BE-NEXT:    [[L2:%.*]] = load i8, ptr [[P2]], align 12182; BE-NEXT:    [[E2:%.*]] = zext i8 [[L2]] to i322183; BE-NEXT:    [[S2:%.*]] = shl nuw nsw i32 [[E2]], 82184; BE-NEXT:    [[O1:%.*]] = or i32 [[S2]], [[C2]]2185; BE-NEXT:    [[O2:%.*]] = or i32 [[O1]], [[S3]]2186; BE-NEXT:    [[O3:%.*]] = or i32 [[O2]], [[S4]]2187; BE-NEXT:    br label [[END]]2188; BE:       end:2189; BE-NEXT:    [[COND:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[O3]], [[BB2]] ]2190; BE-NEXT:    ret i32 [[COND]]2191;2192entry:2193  %p1 = getelementptr i8, ptr %p, i64 12194  %c1 = load i8, ptr %p1, align 12195  %cmp = icmp eq i8 %c1, 02196  br i1 %cmp, label %end, label %bb22197 2198bb2:2199  %l1 = load i8, ptr %p1, align 12200  %c2 = zext i8 %l1 to i322201  %p4 = getelementptr i8, ptr %p, i64 42202  %l4 = load i8, ptr %p4, align 12203  %e4 = zext i8 %l4 to i322204  %s4 = shl nuw i32 %e4, 242205  %p3 = getelementptr i8, ptr %p, i64 32206  %l3 = load i8, ptr %p3, align 12207  %e3 = zext i8 %l3 to i322208  %s3 = shl nuw nsw i32 %e3, 162209  %p2 = getelementptr i8, ptr %p, i64 22210  %l2 = load i8, ptr %p2, align 12211  %e2 = zext i8 %l2 to i322212  %s2 = shl nuw nsw i32 %e2, 82213  %o1 = or i32 %s2, %c22214  %o2 = or i32 %o1, %s32215  %o3 = or i32 %o2, %s42216  br label %end2217 2218end:2219  %cond = phi i32 [ 0, %entry ], [ %o3, %bb2 ]2220  ret i32 %cond2221}2222 2223define i32 @loadCombine_4consecutive_badinsert5(ptr %p) {2224; LE-LABEL: @loadCombine_4consecutive_badinsert5(2225; LE-NEXT:    [[P2:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 22226; LE-NEXT:    [[P3:%.*]] = getelementptr i8, ptr [[P]], i32 32227; LE-NEXT:    [[L4:%.*]] = load i8, ptr [[P3]], align 12228; LE-NEXT:    store i8 0, ptr [[P2]], align 12229; LE-NEXT:    [[L1:%.*]] = load i16, ptr [[P]], align 12230; LE-NEXT:    [[TMP1:%.*]] = zext i16 [[L1]] to i322231; LE-NEXT:    [[L3:%.*]] = load i8, ptr [[P2]], align 12232; LE-NEXT:    [[E3:%.*]] = zext i8 [[L3]] to i322233; LE-NEXT:    [[E4:%.*]] = zext i8 [[L4]] to i322234; LE-NEXT:    [[S3:%.*]] = shl i32 [[E3]], 162235; LE-NEXT:    [[S4:%.*]] = shl i32 [[E4]], 242236; LE-NEXT:    [[O2:%.*]] = or i32 [[TMP1]], [[S3]]2237; LE-NEXT:    [[O3:%.*]] = or i32 [[O2]], [[S4]]2238; LE-NEXT:    ret i32 [[O3]]2239;2240; BE-LABEL: @loadCombine_4consecutive_badinsert5(2241; BE-NEXT:    [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 12242; BE-NEXT:    [[P2:%.*]] = getelementptr i8, ptr [[P]], i32 22243; BE-NEXT:    [[P3:%.*]] = getelementptr i8, ptr [[P]], i32 32244; BE-NEXT:    [[L4:%.*]] = load i8, ptr [[P3]], align 12245; BE-NEXT:    store i8 0, ptr [[P2]], align 12246; BE-NEXT:    [[L1:%.*]] = load i8, ptr [[P]], align 12247; BE-NEXT:    [[L2:%.*]] = load i8, ptr [[P1]], align 12248; BE-NEXT:    [[L3:%.*]] = load i8, ptr [[P2]], align 12249; BE-NEXT:    [[E1:%.*]] = zext i8 [[L1]] to i322250; BE-NEXT:    [[E2:%.*]] = zext i8 [[L2]] to i322251; BE-NEXT:    [[E3:%.*]] = zext i8 [[L3]] to i322252; BE-NEXT:    [[E4:%.*]] = zext i8 [[L4]] to i322253; BE-NEXT:    [[S2:%.*]] = shl i32 [[E2]], 82254; BE-NEXT:    [[S3:%.*]] = shl i32 [[E3]], 162255; BE-NEXT:    [[S4:%.*]] = shl i32 [[E4]], 242256; BE-NEXT:    [[O1:%.*]] = or i32 [[E1]], [[S2]]2257; BE-NEXT:    [[O2:%.*]] = or i32 [[O1]], [[S3]]2258; BE-NEXT:    [[O3:%.*]] = or i32 [[O2]], [[S4]]2259; BE-NEXT:    ret i32 [[O3]]2260;2261  %p1 = getelementptr i8, ptr %p, i32 12262  %p2 = getelementptr i8, ptr %p, i32 22263  %p3 = getelementptr i8, ptr %p, i32 32264  %l4 = load i8, ptr %p32265  store i8 0, ptr %p2, align 12266  %l1 = load i8, ptr %p2267  %l2 = load i8, ptr %p12268  %l3 = load i8, ptr %p22269 2270  %e1 = zext i8 %l1 to i322271  %e2 = zext i8 %l2 to i322272  %e3 = zext i8 %l3 to i322273  %e4 = zext i8 %l4 to i322274 2275  %s2 = shl i32 %e2, 82276  %s3 = shl i32 %e3, 162277  %s4 = shl i32 %e4, 242278 2279  %o1 = or i32 %e1, %s22280  %o2 = or i32 %o1, %s32281  %o3 = or i32 %o2, %s42282  ret i32 %o32283}2284 2285define i32 @loadCombine_4consecutive_badinsert6(ptr %p) {2286; LE-LABEL: @loadCombine_4consecutive_badinsert6(2287; LE-NEXT:    [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 12288; LE-NEXT:    [[P2:%.*]] = getelementptr i8, ptr [[P]], i32 22289; LE-NEXT:    [[P3:%.*]] = getelementptr i8, ptr [[P]], i32 32290; LE-NEXT:    [[L1:%.*]] = load i8, ptr [[P]], align 12291; LE-NEXT:    [[L2:%.*]] = load i8, ptr [[P1]], align 12292; LE-NEXT:    store i8 0, ptr [[P3]], align 12293; LE-NEXT:    [[L3:%.*]] = load i16, ptr [[P2]], align 12294; LE-NEXT:    [[TMP1:%.*]] = zext i16 [[L3]] to i322295; LE-NEXT:    [[TMP2:%.*]] = shl i32 [[TMP1]], 162296; LE-NEXT:    [[E1:%.*]] = zext i8 [[L1]] to i322297; LE-NEXT:    [[E2:%.*]] = zext i8 [[L2]] to i322298; LE-NEXT:    [[S2:%.*]] = shl i32 [[E2]], 82299; LE-NEXT:    [[O2:%.*]] = or i32 [[TMP2]], [[S2]]2300; LE-NEXT:    [[O3:%.*]] = or i32 [[O2]], [[E1]]2301; LE-NEXT:    ret i32 [[O3]]2302;2303; BE-LABEL: @loadCombine_4consecutive_badinsert6(2304; BE-NEXT:    [[P1:%.*]] = getelementptr i8, ptr [[P:%.*]], i32 12305; BE-NEXT:    [[P2:%.*]] = getelementptr i8, ptr [[P]], i32 22306; BE-NEXT:    [[P3:%.*]] = getelementptr i8, ptr [[P]], i32 32307; BE-NEXT:    [[L1:%.*]] = load i8, ptr [[P]], align 12308; BE-NEXT:    [[L2:%.*]] = load i8, ptr [[P1]], align 12309; BE-NEXT:    store i8 0, ptr [[P3]], align 12310; BE-NEXT:    [[L3:%.*]] = load i8, ptr [[P2]], align 12311; BE-NEXT:    [[L4:%.*]] = load i8, ptr [[P3]], align 12312; BE-NEXT:    [[E1:%.*]] = zext i8 [[L1]] to i322313; BE-NEXT:    [[E2:%.*]] = zext i8 [[L2]] to i322314; BE-NEXT:    [[E3:%.*]] = zext i8 [[L3]] to i322315; BE-NEXT:    [[E4:%.*]] = zext i8 [[L4]] to i322316; BE-NEXT:    [[S2:%.*]] = shl i32 [[E2]], 82317; BE-NEXT:    [[S3:%.*]] = shl i32 [[E3]], 162318; BE-NEXT:    [[S4:%.*]] = shl i32 [[E4]], 242319; BE-NEXT:    [[O1:%.*]] = or i32 [[S3]], [[S4]]2320; BE-NEXT:    [[O2:%.*]] = or i32 [[O1]], [[S2]]2321; BE-NEXT:    [[O3:%.*]] = or i32 [[O2]], [[E1]]2322; BE-NEXT:    ret i32 [[O3]]2323;2324  %p1 = getelementptr i8, ptr %p, i32 12325  %p2 = getelementptr i8, ptr %p, i32 22326  %p3 = getelementptr i8, ptr %p, i32 32327  %l1 = load i8, ptr %p2328  %l2 = load i8, ptr %p12329  store i8 0, ptr %p3, align 12330  %l3 = load i8, ptr %p22331  %l4 = load i8, ptr %p32332 2333  %e1 = zext i8 %l1 to i322334  %e2 = zext i8 %l2 to i322335  %e3 = zext i8 %l3 to i322336  %e4 = zext i8 %l4 to i322337 2338  %s2 = shl i32 %e2, 82339  %s3 = shl i32 %e3, 162340  %s4 = shl i32 %e4, 242341 2342  %o1 = or i32 %s3, %s42343  %o2 = or i32 %o1, %s22344  %o3 = or i32 %o2, %e12345  ret i32 %o32346}2347 2348define i64 @loadCombine_nonConstShift1(ptr %arg, i8 %b) {2349; ALL-LABEL: @loadCombine_nonConstShift1(2350; ALL-NEXT:    [[G1:%.*]] = getelementptr i8, ptr [[ARG:%.*]], i64 12351; ALL-NEXT:    [[LD0:%.*]] = load i8, ptr [[ARG]], align 12352; ALL-NEXT:    [[LD1:%.*]] = load i8, ptr [[G1]], align 12353; ALL-NEXT:    [[Z0:%.*]] = zext i8 [[LD0]] to i642354; ALL-NEXT:    [[Z1:%.*]] = zext i8 [[LD1]] to i642355; ALL-NEXT:    [[Z6:%.*]] = zext i8 [[B:%.*]] to i642356; ALL-NEXT:    [[S0:%.*]] = shl i64 [[Z0]], [[Z6]]2357; ALL-NEXT:    [[S1:%.*]] = shl i64 [[Z1]], 82358; ALL-NEXT:    [[O7:%.*]] = or i64 [[S0]], [[S1]]2359; ALL-NEXT:    ret i64 [[O7]]2360;2361  %g1 = getelementptr i8, ptr %arg, i64 12362  %ld0 = load i8, ptr %arg, align 12363  %ld1 = load i8, ptr %g1, align 12364  %z0 = zext i8 %ld0 to i642365  %z1 = zext i8 %ld1 to i642366  %z6 = zext i8 %b to i642367  %s0 = shl i64 %z0, %z62368  %s1 = shl i64 %z1, 82369  %o7 = or i64 %s0, %s12370  ret i64 %o72371}2372 2373define i64 @loadCombine_nonConstShift2(ptr %arg, i8 %b) {2374; ALL-LABEL: @loadCombine_nonConstShift2(2375; ALL-NEXT:    [[G1:%.*]] = getelementptr i8, ptr [[ARG:%.*]], i64 12376; ALL-NEXT:    [[LD0:%.*]] = load i8, ptr [[ARG]], align 12377; ALL-NEXT:    [[LD1:%.*]] = load i8, ptr [[G1]], align 12378; ALL-NEXT:    [[Z0:%.*]] = zext i8 [[LD0]] to i642379; ALL-NEXT:    [[Z1:%.*]] = zext i8 [[LD1]] to i642380; ALL-NEXT:    [[Z6:%.*]] = zext i8 [[B:%.*]] to i642381; ALL-NEXT:    [[S0:%.*]] = shl i64 [[Z0]], [[Z6]]2382; ALL-NEXT:    [[S1:%.*]] = shl i64 [[Z1]], 82383; ALL-NEXT:    [[O7:%.*]] = or i64 [[S1]], [[S0]]2384; ALL-NEXT:    ret i64 [[O7]]2385;2386  %g1 = getelementptr i8, ptr %arg, i64 12387  %ld0 = load i8, ptr %arg, align 12388  %ld1 = load i8, ptr %g1, align 12389  %z0 = zext i8 %ld0 to i642390  %z1 = zext i8 %ld1 to i642391  %z6 = zext i8 %b to i642392  %s0 = shl i64 %z0, %z62393  %s1 = shl i64 %z1, 82394  %o7 = or i64 %s1, %s02395  ret i64 %o72396}2397 2398define void @nested_gep(ptr %p, ptr %dest) {2399; LE-LABEL: @nested_gep(2400; LE-NEXT:    [[TMP1:%.*]] = getelementptr i8, ptr [[P:%.*]], i64 682401; LE-NEXT:    [[LD2:%.*]] = load i64, ptr [[TMP1]], align 42402; LE-NEXT:    [[TRUNC:%.*]] = trunc i64 [[LD2]] to i322403; LE-NEXT:    store i32 [[TRUNC]], ptr [[DEST:%.*]], align 42404; LE-NEXT:    ret void2405;2406; BE-LABEL: @nested_gep(2407; BE-NEXT:    [[GEP1:%.*]] = getelementptr inbounds i8, ptr [[P:%.*]], i64 722408; BE-NEXT:    [[LD1:%.*]] = load i32, ptr [[GEP1]], align 42409; BE-NEXT:    [[LD1_ZEXT:%.*]] = zext i32 [[LD1]] to i642410; BE-NEXT:    [[LD1_SHL:%.*]] = shl nuw i64 [[LD1_ZEXT]], 322411; BE-NEXT:    [[GEP2:%.*]] = getelementptr inbounds i8, ptr [[P]], i64 642412; BE-NEXT:    [[FINAL_PTR:%.*]] = getelementptr inbounds i8, ptr [[GEP2]], i64 42413; BE-NEXT:    [[LD2:%.*]] = load i32, ptr [[FINAL_PTR]], align 42414; BE-NEXT:    [[LD2_ZEXT:%.*]] = zext i32 [[LD2]] to i642415; BE-NEXT:    [[OR:%.*]] = or i64 [[LD1_SHL]], [[LD2_ZEXT]]2416; BE-NEXT:    [[ADD:%.*]] = add i64 [[OR]], 02417; BE-NEXT:    [[TRUNC:%.*]] = trunc i64 [[ADD]] to i322418; BE-NEXT:    store i32 [[TRUNC]], ptr [[DEST:%.*]], align 42419; BE-NEXT:    ret void2420;2421  %gep1 = getelementptr inbounds i8, ptr %p, i64 722422  %ld1 = load i32, ptr %gep1, align 42423  %ld1_zext = zext i32 %ld1 to i642424  %ld1_shl = shl nuw i64 %ld1_zext, 322425  %gep2 = getelementptr inbounds i8, ptr %p, i64 642426  ; Don't move final_ptr before gep22427  %final_ptr = getelementptr inbounds i8, ptr %gep2, i64 42428  %ld2 = load i32, ptr %final_ptr, align 42429  %ld2_zext = zext i32 %ld2 to i642430  %or = or i64 %ld1_shl, %ld2_zext2431  %add = add i64 %or, 02432  %trunc = trunc i64 %add to i322433  store i32 %trunc, ptr %dest, align 42434  ret void2435}2436 2437 2438define void @bitcast_gep(ptr %p, ptr %dest) {2439; LE-LABEL: @bitcast_gep(2440; LE-NEXT:    [[TMP1:%.*]] = getelementptr i8, ptr [[P:%.*]], i64 682441; LE-NEXT:    [[LD2:%.*]] = load i64, ptr [[TMP1]], align 42442; LE-NEXT:    [[TRUNC:%.*]] = trunc i64 [[LD2]] to i322443; LE-NEXT:    store i32 [[TRUNC]], ptr [[DEST:%.*]], align 42444; LE-NEXT:    ret void2445;2446; BE-LABEL: @bitcast_gep(2447; BE-NEXT:    [[GEP1:%.*]] = getelementptr inbounds i8, ptr [[P:%.*]], i64 722448; BE-NEXT:    [[LD1:%.*]] = load i32, ptr [[GEP1]], align 42449; BE-NEXT:    [[LD1_ZEXT:%.*]] = zext i32 [[LD1]] to i642450; BE-NEXT:    [[LD1_SHL:%.*]] = shl nuw i64 [[LD1_ZEXT]], 322451; BE-NEXT:    [[GEP2:%.*]] = getelementptr inbounds i8, ptr [[P]], i64 682452; BE-NEXT:    [[FINAL_PTR:%.*]] = bitcast ptr [[GEP2]] to ptr2453; BE-NEXT:    [[LD2:%.*]] = load i32, ptr [[FINAL_PTR]], align 42454; BE-NEXT:    [[LD2_ZEXT:%.*]] = zext i32 [[LD2]] to i642455; BE-NEXT:    [[OR:%.*]] = or i64 [[LD1_SHL]], [[LD2_ZEXT]]2456; BE-NEXT:    [[ADD:%.*]] = add i64 [[OR]], 02457; BE-NEXT:    [[TRUNC:%.*]] = trunc i64 [[ADD]] to i322458; BE-NEXT:    store i32 [[TRUNC]], ptr [[DEST:%.*]], align 42459; BE-NEXT:    ret void2460;2461  %gep1 = getelementptr inbounds i8, ptr %p, i64 722462  %ld1 = load i32, ptr %gep1, align 42463  %ld1_zext = zext i32 %ld1 to i642464  %ld1_shl = shl nuw i64 %ld1_zext, 322465  %gep2 = getelementptr inbounds i8, ptr %p, i64 682466  ; Don't move final_ptr before gep22467  %final_ptr = bitcast ptr %gep2 to ptr2468  %ld2 = load i32, ptr %final_ptr, align 42469  %ld2_zext = zext i32 %ld2 to i642470  %or = or i64 %ld1_shl, %ld2_zext2471  %add = add i64 %or, 02472  %trunc = trunc i64 %add to i322473  store i32 %trunc, ptr %dest, align 42474  ret void2475}2476 2477define i32 @loadcombine_consecutive_idx_64(ptr %data) {2478; LE-LABEL: @loadcombine_consecutive_idx_64(2479; LE-NEXT:  entry:2480; LE-NEXT:    [[TMP0:%.*]] = getelementptr i8, ptr [[DATA:%.*]], i64 21496755762481; LE-NEXT:    [[VAL_2:%.*]] = load i16, ptr [[TMP0]], align 12482; LE-NEXT:    [[TMP1:%.*]] = zext i16 [[VAL_2]] to i322483; LE-NEXT:    ret i32 [[TMP1]]2484;2485; BE-LABEL: @loadcombine_consecutive_idx_64(2486; BE-NEXT:  entry:2487; BE-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds nuw i8, ptr [[DATA:%.*]], i64 21496755772488; BE-NEXT:    [[VAL:%.*]] = load i8, ptr [[ARRAYIDX]], align 12489; BE-NEXT:    [[CONV:%.*]] = zext i8 [[VAL]] to i322490; BE-NEXT:    [[ARRAYIDX_2:%.*]] = getelementptr inbounds nuw i8, ptr [[DATA]], i64 21496755762491; BE-NEXT:    [[VAL_2:%.*]] = load i8, ptr [[ARRAYIDX_2]], align 12492; BE-NEXT:    [[CONV_2:%.*]] = zext i8 [[VAL_2]] to i322493; BE-NEXT:    [[SHL:%.*]] = shl nuw nsw i32 [[CONV]], 82494; BE-NEXT:    [[OR:%.*]] = or disjoint i32 [[SHL]], [[CONV_2]]2495; BE-NEXT:    ret i32 [[OR]]2496;2497entry:2498  %arrayidx = getelementptr inbounds nuw i8, ptr %data, i64 21496755772499  %val = load i8, ptr %arrayidx, align 12500  %conv = zext i8 %val to i322501  %arrayidx.2 = getelementptr inbounds nuw i8, ptr %data, i64 21496755762502  %val.2 = load i8, ptr %arrayidx.2, align 12503  %conv.2 = zext i8 %val.2 to i322504  %shl = shl nuw nsw i32 %conv, 82505  %or = or disjoint i32 %shl, %conv.22506  ret i32 %or2507}2508 2509@g = global i64 10608569221202510 2511; Make sure we use the correct memory location for alias analysis.2512define i64 @loadcombine_consecutive_mayalias(ptr %p) {2513; LE-LABEL: @loadcombine_consecutive_mayalias(2514; LE-NEXT:  entry:2515; LE-NEXT:    [[LOAD3:%.*]] = load i32, ptr [[P:%.*]], align 42516; LE-NEXT:    [[GEP1:%.*]] = getelementptr i8, ptr [[P]], i64 42517; LE-NEXT:    store i8 0, ptr getelementptr inbounds nuw (i8, ptr @g, i64 4), align 42518; LE-NEXT:    [[LOAD2:%.*]] = load i32, ptr [[GEP1]], align 42519; LE-NEXT:    [[TMP0:%.*]] = zext i32 [[LOAD2]] to i642520; LE-NEXT:    [[TMP1:%.*]] = shl i64 [[TMP0]], 322521; LE-NEXT:    [[ZEXT3:%.*]] = zext i32 [[LOAD3]] to i642522; LE-NEXT:    [[LOAD1:%.*]] = or i64 [[TMP1]], [[ZEXT3]]2523; LE-NEXT:    [[RES:%.*]] = lshr i64 [[LOAD1]], 322524; LE-NEXT:    ret i64 [[RES]]2525;2526; BE-LABEL: @loadcombine_consecutive_mayalias(2527; BE-NEXT:  entry:2528; BE-NEXT:    [[LOAD1:%.*]] = load i32, ptr [[P:%.*]], align 42529; BE-NEXT:    [[GEP1:%.*]] = getelementptr i8, ptr [[P]], i64 42530; BE-NEXT:    [[GEP2:%.*]] = getelementptr i8, ptr [[P]], i64 52531; BE-NEXT:    store i8 0, ptr getelementptr inbounds nuw (i8, ptr @g, i64 4), align 42532; BE-NEXT:    [[LOAD2:%.*]] = load i8, ptr [[GEP1]], align 42533; BE-NEXT:    [[LOAD3:%.*]] = load i24, ptr [[GEP2]], align 12534; BE-NEXT:    [[ZEXT1:%.*]] = zext i24 [[LOAD3]] to i642535; BE-NEXT:    [[SHL1:%.*]] = shl i64 [[ZEXT1]], 402536; BE-NEXT:    [[ZEXT2:%.*]] = zext i8 [[LOAD2]] to i642537; BE-NEXT:    [[SHL2:%.*]] = shl i64 [[ZEXT2]], 322538; BE-NEXT:    [[OR1:%.*]] = or i64 [[SHL1]], [[SHL2]]2539; BE-NEXT:    [[ZEXT3:%.*]] = zext i32 [[LOAD1]] to i642540; BE-NEXT:    [[OR2:%.*]] = or i64 [[OR1]], [[ZEXT3]]2541; BE-NEXT:    [[RES:%.*]] = lshr i64 [[OR2]], 322542; BE-NEXT:    ret i64 [[RES]]2543;2544entry:2545  %load1 = load i32, ptr %p, align 42546  %gep1 = getelementptr i8, ptr %p, i64 42547  %gep2 = getelementptr i8, ptr %p, i64 52548  store i8 0, ptr getelementptr inbounds nuw (i8, ptr @g, i64 4), align 42549  %load2 = load i8, ptr %gep1, align 42550  %load3 = load i24, ptr %gep2, align 12551  %zext1 = zext i24 %load3 to i642552  %shl1 = shl i64 %zext1, 402553  %zext2 = zext i8 %load2 to i642554  %shl2 = shl i64 %zext2, 322555  %or1 = or i64 %shl1, %shl22556  %zext3 = zext i32 %load1 to i642557  %or2 = or i64 %or1, %zext32558  %res = lshr i64 %or2, 322559  ret i64 %res2560}2561