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