brintos

brintos / llvm-project-archived public Read only

0
0
Text · 36.2 KiB · 9391fb5 Raw
927 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 52; RUN: opt %s -passes=instcombine -data-layout="E" -S | FileCheck %s --check-prefixes=CHECK,CHECK-BE3; RUN: opt %s -passes=instcombine -data-layout="e" -S | FileCheck %s --check-prefixes=CHECK,CHECK-LE4 5define i32 @bitcast.v2i.le(<4 x i8> %v) {6; CHECK-BE-LABEL: define i32 @bitcast.v2i.le(7; CHECK-BE-SAME: <4 x i8> [[V:%.*]]) {8; CHECK-BE-NEXT:    [[V_0:%.*]] = extractelement <4 x i8> [[V]], i64 09; CHECK-BE-NEXT:    [[Z_0:%.*]] = zext i8 [[V_0]] to i3210; CHECK-BE-NEXT:    [[V_1:%.*]] = extractelement <4 x i8> [[V]], i64 111; CHECK-BE-NEXT:    [[Z_1:%.*]] = zext i8 [[V_1]] to i3212; CHECK-BE-NEXT:    [[S_1:%.*]] = shl nuw nsw i32 [[Z_1]], 813; CHECK-BE-NEXT:    [[X_1:%.*]] = or disjoint i32 [[S_1]], [[Z_0]]14; CHECK-BE-NEXT:    [[V_2:%.*]] = extractelement <4 x i8> [[V]], i64 215; CHECK-BE-NEXT:    [[Z_2:%.*]] = zext i8 [[V_2]] to i3216; CHECK-BE-NEXT:    [[S_2:%.*]] = shl nuw nsw i32 [[Z_2]], 1617; CHECK-BE-NEXT:    [[X_2:%.*]] = or disjoint i32 [[X_1]], [[S_2]]18; CHECK-BE-NEXT:    [[V_3:%.*]] = extractelement <4 x i8> [[V]], i64 319; CHECK-BE-NEXT:    [[Z_3:%.*]] = zext i8 [[V_3]] to i3220; CHECK-BE-NEXT:    [[S_3:%.*]] = shl nuw i32 [[Z_3]], 2421; CHECK-BE-NEXT:    [[X_3:%.*]] = or disjoint i32 [[X_2]], [[S_3]]22; CHECK-BE-NEXT:    ret i32 [[X_3]]23;24; CHECK-LE-LABEL: define i32 @bitcast.v2i.le(25; CHECK-LE-SAME: <4 x i8> [[V:%.*]]) {26; CHECK-LE-NEXT:    [[X_3:%.*]] = bitcast <4 x i8> [[V]] to i3227; CHECK-LE-NEXT:    ret i32 [[X_3]]28;29  %v.0 = extractelement <4 x i8> %v, i64 030  %z.0 = zext i8 %v.0 to i3231 32  %v.1 = extractelement <4 x i8> %v, i64 133  %z.1 = zext i8 %v.1 to i3234  %s.1 = shl i32 %z.1, 835  %x.1 = or i32 %z.0, %s.136 37  %v.2 = extractelement <4 x i8> %v, i64 238  %z.2 = zext i8 %v.2 to i3239  %s.2 = shl i32 %z.2, 1640  %x.2 = or i32 %x.1, %s.241 42  %v.3 = extractelement <4 x i8> %v, i64 343  %z.3 = zext i8 %v.3 to i3244  %s.3 = shl i32 %z.3, 2445  %x.3 = or i32 %x.2, %s.346 47  ret i32 %x.348}49 50define i32 @bitcast.v2i.be(<4 x i8> %v) {51; CHECK-BE-LABEL: define i32 @bitcast.v2i.be(52; CHECK-BE-SAME: <4 x i8> [[V:%.*]]) {53; CHECK-BE-NEXT:    [[X_3:%.*]] = bitcast <4 x i8> [[V]] to i3254; CHECK-BE-NEXT:    ret i32 [[X_3]]55;56; CHECK-LE-LABEL: define i32 @bitcast.v2i.be(57; CHECK-LE-SAME: <4 x i8> [[V:%.*]]) {58; CHECK-LE-NEXT:    [[V_0:%.*]] = extractelement <4 x i8> [[V]], i64 359; CHECK-LE-NEXT:    [[Z_0:%.*]] = zext i8 [[V_0]] to i3260; CHECK-LE-NEXT:    [[V_1:%.*]] = extractelement <4 x i8> [[V]], i64 261; CHECK-LE-NEXT:    [[Z_1:%.*]] = zext i8 [[V_1]] to i3262; CHECK-LE-NEXT:    [[S_1:%.*]] = shl nuw nsw i32 [[Z_1]], 863; CHECK-LE-NEXT:    [[X_1:%.*]] = or disjoint i32 [[S_1]], [[Z_0]]64; CHECK-LE-NEXT:    [[V_2:%.*]] = extractelement <4 x i8> [[V]], i64 165; CHECK-LE-NEXT:    [[Z_2:%.*]] = zext i8 [[V_2]] to i3266; CHECK-LE-NEXT:    [[S_2:%.*]] = shl nuw nsw i32 [[Z_2]], 1667; CHECK-LE-NEXT:    [[X_2:%.*]] = or disjoint i32 [[X_1]], [[S_2]]68; CHECK-LE-NEXT:    [[V_3:%.*]] = extractelement <4 x i8> [[V]], i64 069; CHECK-LE-NEXT:    [[Z_3:%.*]] = zext i8 [[V_3]] to i3270; CHECK-LE-NEXT:    [[S_3:%.*]] = shl nuw i32 [[Z_3]], 2471; CHECK-LE-NEXT:    [[X_3:%.*]] = or disjoint i32 [[X_2]], [[S_3]]72; CHECK-LE-NEXT:    ret i32 [[X_3]]73;74  %v.0 = extractelement <4 x i8> %v, i64 375  %z.0 = zext i8 %v.0 to i3276 77  %v.1 = extractelement <4 x i8> %v, i64 278  %z.1 = zext i8 %v.1 to i3279  %s.1 = shl i32 %z.1, 880  %x.1 = or i32 %z.0, %s.181 82  %v.2 = extractelement <4 x i8> %v, i64 183  %z.2 = zext i8 %v.2 to i3284  %s.2 = shl i32 %z.2, 1685  %x.2 = or i32 %x.1, %s.286 87  %v.3 = extractelement <4 x i8> %v, i64 088  %z.3 = zext i8 %v.3 to i3289  %s.3 = shl i32 %z.3, 2490  %x.3 = or i32 %x.2, %s.391 92  ret i32 %x.393}94 95define i64 @bitcast.v2i.le.i16(<4 x i16> %v) {96; CHECK-BE-LABEL: define i64 @bitcast.v2i.le.i16(97; CHECK-BE-SAME: <4 x i16> [[V:%.*]]) {98; CHECK-BE-NEXT:    [[V_0:%.*]] = extractelement <4 x i16> [[V]], i64 099; CHECK-BE-NEXT:    [[Z_0:%.*]] = zext i16 [[V_0]] to i64100; CHECK-BE-NEXT:    [[V_1:%.*]] = extractelement <4 x i16> [[V]], i64 1101; CHECK-BE-NEXT:    [[Z_1:%.*]] = zext i16 [[V_1]] to i64102; CHECK-BE-NEXT:    [[S_1:%.*]] = shl nuw nsw i64 [[Z_1]], 16103; CHECK-BE-NEXT:    [[X_1:%.*]] = or disjoint i64 [[S_1]], [[Z_0]]104; CHECK-BE-NEXT:    [[V_2:%.*]] = extractelement <4 x i16> [[V]], i64 2105; CHECK-BE-NEXT:    [[Z_2:%.*]] = zext i16 [[V_2]] to i64106; CHECK-BE-NEXT:    [[S_2:%.*]] = shl nuw nsw i64 [[Z_2]], 32107; CHECK-BE-NEXT:    [[X_2:%.*]] = or disjoint i64 [[X_1]], [[S_2]]108; CHECK-BE-NEXT:    [[V_3:%.*]] = extractelement <4 x i16> [[V]], i64 3109; CHECK-BE-NEXT:    [[Z_3:%.*]] = zext i16 [[V_3]] to i64110; CHECK-BE-NEXT:    [[S_3:%.*]] = shl nuw i64 [[Z_3]], 48111; CHECK-BE-NEXT:    [[X_3:%.*]] = or disjoint i64 [[X_2]], [[S_3]]112; CHECK-BE-NEXT:    ret i64 [[X_3]]113;114; CHECK-LE-LABEL: define i64 @bitcast.v2i.le.i16(115; CHECK-LE-SAME: <4 x i16> [[V:%.*]]) {116; CHECK-LE-NEXT:    [[X_3:%.*]] = bitcast <4 x i16> [[V]] to i64117; CHECK-LE-NEXT:    ret i64 [[X_3]]118;119  %v.0 = extractelement <4 x i16> %v, i64 0120  %z.0 = zext i16 %v.0 to i64121 122  %v.1 = extractelement <4 x i16> %v, i64 1123  %z.1 = zext i16 %v.1 to i64124  %s.1 = shl i64 %z.1, 16125  %x.1 = or i64 %z.0, %s.1126 127  %v.2 = extractelement <4 x i16> %v, i64 2128  %z.2 = zext i16 %v.2 to i64129  %s.2 = shl i64 %z.2, 32130  %x.2 = or i64 %x.1, %s.2131 132  %v.3 = extractelement <4 x i16> %v, i64 3133  %z.3 = zext i16 %v.3 to i64134  %s.3 = shl i64 %z.3, 48135  %x.3 = or i64 %x.2, %s.3136 137  ret i64 %x.3138}139 140define i64 @bitcast.v2i.be.i16(<4 x i16> %v) {141; CHECK-BE-LABEL: define i64 @bitcast.v2i.be.i16(142; CHECK-BE-SAME: <4 x i16> [[V:%.*]]) {143; CHECK-BE-NEXT:    [[X_3:%.*]] = bitcast <4 x i16> [[V]] to i64144; CHECK-BE-NEXT:    ret i64 [[X_3]]145;146; CHECK-LE-LABEL: define i64 @bitcast.v2i.be.i16(147; CHECK-LE-SAME: <4 x i16> [[V:%.*]]) {148; CHECK-LE-NEXT:    [[V_0:%.*]] = extractelement <4 x i16> [[V]], i64 3149; CHECK-LE-NEXT:    [[Z_0:%.*]] = zext i16 [[V_0]] to i64150; CHECK-LE-NEXT:    [[V_1:%.*]] = extractelement <4 x i16> [[V]], i64 2151; CHECK-LE-NEXT:    [[Z_1:%.*]] = zext i16 [[V_1]] to i64152; CHECK-LE-NEXT:    [[S_1:%.*]] = shl nuw nsw i64 [[Z_1]], 16153; CHECK-LE-NEXT:    [[X_1:%.*]] = or disjoint i64 [[S_1]], [[Z_0]]154; CHECK-LE-NEXT:    [[V_2:%.*]] = extractelement <4 x i16> [[V]], i64 1155; CHECK-LE-NEXT:    [[Z_2:%.*]] = zext i16 [[V_2]] to i64156; CHECK-LE-NEXT:    [[S_2:%.*]] = shl nuw nsw i64 [[Z_2]], 32157; CHECK-LE-NEXT:    [[X_2:%.*]] = or disjoint i64 [[X_1]], [[S_2]]158; CHECK-LE-NEXT:    [[V_3:%.*]] = extractelement <4 x i16> [[V]], i64 0159; CHECK-LE-NEXT:    [[Z_3:%.*]] = zext i16 [[V_3]] to i64160; CHECK-LE-NEXT:    [[S_3:%.*]] = shl nuw i64 [[Z_3]], 48161; CHECK-LE-NEXT:    [[X_3:%.*]] = or disjoint i64 [[X_2]], [[S_3]]162; CHECK-LE-NEXT:    ret i64 [[X_3]]163;164  %v.0 = extractelement <4 x i16> %v, i64 3165  %z.0 = zext i16 %v.0 to i64166 167  %v.1 = extractelement <4 x i16> %v, i64 2168  %z.1 = zext i16 %v.1 to i64169  %s.1 = shl i64 %z.1, 16170  %x.1 = or i64 %z.0, %s.1171 172  %v.2 = extractelement <4 x i16> %v, i64 1173  %z.2 = zext i16 %v.2 to i64174  %s.2 = shl i64 %z.2, 32175  %x.2 = or i64 %x.1, %s.2176 177  %v.3 = extractelement <4 x i16> %v, i64 0178  %z.3 = zext i16 %v.3 to i64179  %s.3 = shl i64 %z.3, 48180  %x.3 = or i64 %x.2, %s.3181 182  ret i64 %x.3183}184 185define i32 @bitcast.v2i.le.tree(<4 x i8> %v) {186; CHECK-BE-LABEL: define i32 @bitcast.v2i.le.tree(187; CHECK-BE-SAME: <4 x i8> [[V:%.*]]) {188; CHECK-BE-NEXT:    [[V_0:%.*]] = extractelement <4 x i8> [[V]], i64 0189; CHECK-BE-NEXT:    [[Z_0:%.*]] = zext i8 [[V_0]] to i32190; CHECK-BE-NEXT:    [[V_1:%.*]] = extractelement <4 x i8> [[V]], i64 1191; CHECK-BE-NEXT:    [[Z_1:%.*]] = zext i8 [[V_1]] to i32192; CHECK-BE-NEXT:    [[S_1:%.*]] = shl nuw nsw i32 [[Z_1]], 8193; CHECK-BE-NEXT:    [[X_1:%.*]] = or disjoint i32 [[S_1]], [[Z_0]]194; CHECK-BE-NEXT:    [[V_2:%.*]] = extractelement <4 x i8> [[V]], i64 2195; CHECK-BE-NEXT:    [[Z_2:%.*]] = zext i8 [[V_2]] to i32196; CHECK-BE-NEXT:    [[S_2:%.*]] = shl nuw nsw i32 [[Z_2]], 16197; CHECK-BE-NEXT:    [[V_3:%.*]] = extractelement <4 x i8> [[V]], i64 3198; CHECK-BE-NEXT:    [[Z_3:%.*]] = zext i8 [[V_3]] to i32199; CHECK-BE-NEXT:    [[S_3:%.*]] = shl nuw i32 [[Z_3]], 24200; CHECK-BE-NEXT:    [[X_3:%.*]] = or disjoint i32 [[S_2]], [[S_3]]201; CHECK-BE-NEXT:    [[X:%.*]] = or disjoint i32 [[X_1]], [[X_3]]202; CHECK-BE-NEXT:    ret i32 [[X]]203;204; CHECK-LE-LABEL: define i32 @bitcast.v2i.le.tree(205; CHECK-LE-SAME: <4 x i8> [[V:%.*]]) {206; CHECK-LE-NEXT:    [[X:%.*]] = bitcast <4 x i8> [[V]] to i32207; CHECK-LE-NEXT:    ret i32 [[X]]208;209  %v.0 = extractelement <4 x i8> %v, i64 0210  %z.0 = zext i8 %v.0 to i32211 212  %v.1 = extractelement <4 x i8> %v, i64 1213  %z.1 = zext i8 %v.1 to i32214  %s.1 = shl i32 %z.1, 8215  %x.1 = or i32 %z.0, %s.1216 217  %v.2 = extractelement <4 x i8> %v, i64 2218  %z.2 = zext i8 %v.2 to i32219  %s.2 = shl i32 %z.2, 16220 221  %v.3 = extractelement <4 x i8> %v, i64 3222  %z.3 = zext i8 %v.3 to i32223  %s.3 = shl i32 %z.3, 24224  %x.3 = or i32 %s.2, %s.3225 226  %x = or i32 %x.1, %x.3227 228  ret i32 %x229}230 231define i32 @bitcast.v2i.be.tree(<4 x i8> %v) {232; CHECK-BE-LABEL: define i32 @bitcast.v2i.be.tree(233; CHECK-BE-SAME: <4 x i8> [[V:%.*]]) {234; CHECK-BE-NEXT:    [[X:%.*]] = bitcast <4 x i8> [[V]] to i32235; CHECK-BE-NEXT:    ret i32 [[X]]236;237; CHECK-LE-LABEL: define i32 @bitcast.v2i.be.tree(238; CHECK-LE-SAME: <4 x i8> [[V:%.*]]) {239; CHECK-LE-NEXT:    [[V_0:%.*]] = extractelement <4 x i8> [[V]], i64 3240; CHECK-LE-NEXT:    [[Z_0:%.*]] = zext i8 [[V_0]] to i32241; CHECK-LE-NEXT:    [[V_1:%.*]] = extractelement <4 x i8> [[V]], i64 2242; CHECK-LE-NEXT:    [[Z_1:%.*]] = zext i8 [[V_1]] to i32243; CHECK-LE-NEXT:    [[S_1:%.*]] = shl nuw nsw i32 [[Z_1]], 8244; CHECK-LE-NEXT:    [[X_1:%.*]] = or disjoint i32 [[S_1]], [[Z_0]]245; CHECK-LE-NEXT:    [[V_2:%.*]] = extractelement <4 x i8> [[V]], i64 1246; CHECK-LE-NEXT:    [[Z_2:%.*]] = zext i8 [[V_2]] to i32247; CHECK-LE-NEXT:    [[S_2:%.*]] = shl nuw nsw i32 [[Z_2]], 16248; CHECK-LE-NEXT:    [[V_3:%.*]] = extractelement <4 x i8> [[V]], i64 0249; CHECK-LE-NEXT:    [[Z_3:%.*]] = zext i8 [[V_3]] to i32250; CHECK-LE-NEXT:    [[S_3:%.*]] = shl nuw i32 [[Z_3]], 24251; CHECK-LE-NEXT:    [[X_3:%.*]] = or disjoint i32 [[S_2]], [[S_3]]252; CHECK-LE-NEXT:    [[X:%.*]] = or disjoint i32 [[X_1]], [[X_3]]253; CHECK-LE-NEXT:    ret i32 [[X]]254;255  %v.0 = extractelement <4 x i8> %v, i64 3256  %z.0 = zext i8 %v.0 to i32257 258  %v.1 = extractelement <4 x i8> %v, i64 2259  %z.1 = zext i8 %v.1 to i32260  %s.1 = shl i32 %z.1, 8261  %x.1 = or i32 %z.0, %s.1262 263  %v.2 = extractelement <4 x i8> %v, i64 1264  %z.2 = zext i8 %v.2 to i32265  %s.2 = shl i32 %z.2, 16266 267  %v.3 = extractelement <4 x i8> %v, i64 0268  %z.3 = zext i8 %v.3 to i32269  %s.3 = shl i32 %z.3, 24270  %x.3 = or i32 %s.2, %s.3271 272  %x = or i32 %x.1, %x.3273 274  ret i32 %x275}276 277define i64 @bitcast.v2i.le.tree.i16(<4 x i16> %v) {278; CHECK-BE-LABEL: define i64 @bitcast.v2i.le.tree.i16(279; CHECK-BE-SAME: <4 x i16> [[V:%.*]]) {280; CHECK-BE-NEXT:    [[V_0:%.*]] = extractelement <4 x i16> [[V]], i64 0281; CHECK-BE-NEXT:    [[Z_0:%.*]] = zext i16 [[V_0]] to i64282; CHECK-BE-NEXT:    [[V_1:%.*]] = extractelement <4 x i16> [[V]], i64 1283; CHECK-BE-NEXT:    [[Z_1:%.*]] = zext i16 [[V_1]] to i64284; CHECK-BE-NEXT:    [[S_1:%.*]] = shl nuw nsw i64 [[Z_1]], 16285; CHECK-BE-NEXT:    [[X_1:%.*]] = or disjoint i64 [[S_1]], [[Z_0]]286; CHECK-BE-NEXT:    [[V_2:%.*]] = extractelement <4 x i16> [[V]], i64 2287; CHECK-BE-NEXT:    [[Z_2:%.*]] = zext i16 [[V_2]] to i64288; CHECK-BE-NEXT:    [[S_2:%.*]] = shl nuw nsw i64 [[Z_2]], 32289; CHECK-BE-NEXT:    [[V_3:%.*]] = extractelement <4 x i16> [[V]], i64 3290; CHECK-BE-NEXT:    [[Z_3:%.*]] = zext i16 [[V_3]] to i64291; CHECK-BE-NEXT:    [[S_3:%.*]] = shl nuw i64 [[Z_3]], 48292; CHECK-BE-NEXT:    [[X_3:%.*]] = or disjoint i64 [[S_2]], [[S_3]]293; CHECK-BE-NEXT:    [[X:%.*]] = or disjoint i64 [[X_1]], [[X_3]]294; CHECK-BE-NEXT:    ret i64 [[X]]295;296; CHECK-LE-LABEL: define i64 @bitcast.v2i.le.tree.i16(297; CHECK-LE-SAME: <4 x i16> [[V:%.*]]) {298; CHECK-LE-NEXT:    [[X:%.*]] = bitcast <4 x i16> [[V]] to i64299; CHECK-LE-NEXT:    ret i64 [[X]]300;301  %v.0 = extractelement <4 x i16> %v, i64 0302  %z.0 = zext i16 %v.0 to i64303 304  %v.1 = extractelement <4 x i16> %v, i64 1305  %z.1 = zext i16 %v.1 to i64306  %s.1 = shl i64 %z.1, 16307  %x.1 = or i64 %z.0, %s.1308 309  %v.2 = extractelement <4 x i16> %v, i64 2310  %z.2 = zext i16 %v.2 to i64311  %s.2 = shl i64 %z.2, 32312 313  %v.3 = extractelement <4 x i16> %v, i64 3314  %z.3 = zext i16 %v.3 to i64315  %s.3 = shl i64 %z.3, 48316  %x.3 = or i64 %s.2, %s.3317 318  %x = or i64 %x.1, %x.3319 320  ret i64 %x321}322 323define i64 @bitcast.v2i.be.tree.i16(<4 x i16> %v) {324; CHECK-BE-LABEL: define i64 @bitcast.v2i.be.tree.i16(325; CHECK-BE-SAME: <4 x i16> [[V:%.*]]) {326; CHECK-BE-NEXT:    [[X:%.*]] = bitcast <4 x i16> [[V]] to i64327; CHECK-BE-NEXT:    ret i64 [[X]]328;329; CHECK-LE-LABEL: define i64 @bitcast.v2i.be.tree.i16(330; CHECK-LE-SAME: <4 x i16> [[V:%.*]]) {331; CHECK-LE-NEXT:    [[V_0:%.*]] = extractelement <4 x i16> [[V]], i64 3332; CHECK-LE-NEXT:    [[Z_0:%.*]] = zext i16 [[V_0]] to i64333; CHECK-LE-NEXT:    [[V_1:%.*]] = extractelement <4 x i16> [[V]], i64 2334; CHECK-LE-NEXT:    [[Z_1:%.*]] = zext i16 [[V_1]] to i64335; CHECK-LE-NEXT:    [[S_1:%.*]] = shl nuw nsw i64 [[Z_1]], 16336; CHECK-LE-NEXT:    [[X_1:%.*]] = or disjoint i64 [[S_1]], [[Z_0]]337; CHECK-LE-NEXT:    [[V_2:%.*]] = extractelement <4 x i16> [[V]], i64 1338; CHECK-LE-NEXT:    [[Z_2:%.*]] = zext i16 [[V_2]] to i64339; CHECK-LE-NEXT:    [[S_2:%.*]] = shl nuw nsw i64 [[Z_2]], 32340; CHECK-LE-NEXT:    [[V_3:%.*]] = extractelement <4 x i16> [[V]], i64 0341; CHECK-LE-NEXT:    [[Z_3:%.*]] = zext i16 [[V_3]] to i64342; CHECK-LE-NEXT:    [[S_3:%.*]] = shl nuw i64 [[Z_3]], 48343; CHECK-LE-NEXT:    [[X_3:%.*]] = or disjoint i64 [[S_2]], [[S_3]]344; CHECK-LE-NEXT:    [[X:%.*]] = or disjoint i64 [[X_1]], [[X_3]]345; CHECK-LE-NEXT:    ret i64 [[X]]346;347  %v.0 = extractelement <4 x i16> %v, i64 3348  %z.0 = zext i16 %v.0 to i64349 350  %v.1 = extractelement <4 x i16> %v, i64 2351  %z.1 = zext i16 %v.1 to i64352  %s.1 = shl i64 %z.1, 16353  %x.1 = or i64 %z.0, %s.1354 355  %v.2 = extractelement <4 x i16> %v, i64 1356  %z.2 = zext i16 %v.2 to i64357  %s.2 = shl i64 %z.2, 32358 359  %v.3 = extractelement <4 x i16> %v, i64 0360  %z.3 = zext i16 %v.3 to i64361  %s.3 = shl i64 %z.3, 48362  %x.3 = or i64 %s.2, %s.3363 364  %x = or i64 %x.1, %x.3365 366  ret i64 %x367}368 369define i32 @extract.le.i32(<8 x i8> %v) {370; CHECK-BE-LABEL: define i32 @extract.le.i32(371; CHECK-BE-SAME: <8 x i8> [[V:%.*]]) {372; CHECK-BE-NEXT:    [[V_0:%.*]] = extractelement <8 x i8> [[V]], i64 3373; CHECK-BE-NEXT:    [[Z_0:%.*]] = zext i8 [[V_0]] to i32374; CHECK-BE-NEXT:    [[V_1:%.*]] = extractelement <8 x i8> [[V]], i64 4375; CHECK-BE-NEXT:    [[Z_1:%.*]] = zext i8 [[V_1]] to i32376; CHECK-BE-NEXT:    [[S_1:%.*]] = shl nuw nsw i32 [[Z_1]], 8377; CHECK-BE-NEXT:    [[X_1:%.*]] = or disjoint i32 [[S_1]], [[Z_0]]378; CHECK-BE-NEXT:    [[V_2:%.*]] = extractelement <8 x i8> [[V]], i64 5379; CHECK-BE-NEXT:    [[Z_2:%.*]] = zext i8 [[V_2]] to i32380; CHECK-BE-NEXT:    [[S_2:%.*]] = shl nuw nsw i32 [[Z_2]], 16381; CHECK-BE-NEXT:    [[X_2:%.*]] = or disjoint i32 [[X_1]], [[S_2]]382; CHECK-BE-NEXT:    [[V_3:%.*]] = extractelement <8 x i8> [[V]], i64 6383; CHECK-BE-NEXT:    [[Z_3:%.*]] = zext i8 [[V_3]] to i32384; CHECK-BE-NEXT:    [[S_3:%.*]] = shl nuw i32 [[Z_3]], 24385; CHECK-BE-NEXT:    [[X_3:%.*]] = or disjoint i32 [[X_2]], [[S_3]]386; CHECK-BE-NEXT:    ret i32 [[X_3]]387;388; CHECK-LE-LABEL: define i32 @extract.le.i32(389; CHECK-LE-SAME: <8 x i8> [[V:%.*]]) {390; CHECK-LE-NEXT:    [[X_3_V_EXTRACT:%.*]] = shufflevector <8 x i8> [[V]], <8 x i8> poison, <8 x i32> <i32 3, i32 4, i32 5, i32 6, i32 poison, i32 poison, i32 poison, i32 poison>391; CHECK-LE-NEXT:    [[X_3_V_BC:%.*]] = bitcast <8 x i8> [[X_3_V_EXTRACT]] to <2 x i32>392; CHECK-LE-NEXT:    [[X_3_V_EXTRACT1:%.*]] = extractelement <2 x i32> [[X_3_V_BC]], i64 0393; CHECK-LE-NEXT:    ret i32 [[X_3_V_EXTRACT1]]394;395  %v.0 = extractelement <8 x i8> %v, i64 3396  %z.0 = zext i8 %v.0 to i32397 398  %v.1 = extractelement <8 x i8> %v, i64 4399  %z.1 = zext i8 %v.1 to i32400  %s.1 = shl i32 %z.1, 8401  %x.1 = or i32 %z.0, %s.1402 403  %v.2 = extractelement <8 x i8> %v, i64 5404  %z.2 = zext i8 %v.2 to i32405  %s.2 = shl i32 %z.2, 16406  %x.2 = or i32 %x.1, %s.2407 408  %v.3 = extractelement <8 x i8> %v, i64 6409  %z.3 = zext i8 %v.3 to i32410  %s.3 = shl i32 %z.3, 24411  %x.3 = or i32 %x.2, %s.3412 413  ret i32 %x.3414}415 416define i32 @extract.be.i32(<8 x i8> %v) {417; CHECK-BE-LABEL: define i32 @extract.be.i32(418; CHECK-BE-SAME: <8 x i8> [[V:%.*]]) {419; CHECK-BE-NEXT:    [[X_3_V_EXTRACT:%.*]] = shufflevector <8 x i8> [[V]], <8 x i8> poison, <8 x i32> <i32 3, i32 4, i32 5, i32 6, i32 poison, i32 poison, i32 poison, i32 poison>420; CHECK-BE-NEXT:    [[X_3_V_BC:%.*]] = bitcast <8 x i8> [[X_3_V_EXTRACT]] to <2 x i32>421; CHECK-BE-NEXT:    [[X_3_V_EXTRACT1:%.*]] = extractelement <2 x i32> [[X_3_V_BC]], i64 0422; CHECK-BE-NEXT:    ret i32 [[X_3_V_EXTRACT1]]423;424; CHECK-LE-LABEL: define i32 @extract.be.i32(425; CHECK-LE-SAME: <8 x i8> [[V:%.*]]) {426; CHECK-LE-NEXT:    [[V_0:%.*]] = extractelement <8 x i8> [[V]], i64 6427; CHECK-LE-NEXT:    [[Z_0:%.*]] = zext i8 [[V_0]] to i32428; CHECK-LE-NEXT:    [[V_1:%.*]] = extractelement <8 x i8> [[V]], i64 5429; CHECK-LE-NEXT:    [[Z_1:%.*]] = zext i8 [[V_1]] to i32430; CHECK-LE-NEXT:    [[S_1:%.*]] = shl nuw nsw i32 [[Z_1]], 8431; CHECK-LE-NEXT:    [[X_1:%.*]] = or disjoint i32 [[S_1]], [[Z_0]]432; CHECK-LE-NEXT:    [[V_2:%.*]] = extractelement <8 x i8> [[V]], i64 4433; CHECK-LE-NEXT:    [[Z_2:%.*]] = zext i8 [[V_2]] to i32434; CHECK-LE-NEXT:    [[S_2:%.*]] = shl nuw nsw i32 [[Z_2]], 16435; CHECK-LE-NEXT:    [[X_2:%.*]] = or disjoint i32 [[X_1]], [[S_2]]436; CHECK-LE-NEXT:    [[V_3:%.*]] = extractelement <8 x i8> [[V]], i64 3437; CHECK-LE-NEXT:    [[Z_3:%.*]] = zext i8 [[V_3]] to i32438; CHECK-LE-NEXT:    [[S_3:%.*]] = shl nuw i32 [[Z_3]], 24439; CHECK-LE-NEXT:    [[X_3:%.*]] = or disjoint i32 [[X_2]], [[S_3]]440; CHECK-LE-NEXT:    ret i32 [[X_3]]441;442  %v.0 = extractelement <8 x i8> %v, i64 6443  %z.0 = zext i8 %v.0 to i32444 445  %v.1 = extractelement <8 x i8> %v, i64 5446  %z.1 = zext i8 %v.1 to i32447  %s.1 = shl i32 %z.1, 8448  %x.1 = or i32 %z.0, %s.1449 450  %v.2 = extractelement <8 x i8> %v, i64 4451  %z.2 = zext i8 %v.2 to i32452  %s.2 = shl i32 %z.2, 16453  %x.2 = or i32 %x.1, %s.2454 455  %v.3 = extractelement <8 x i8> %v, i64 3456  %z.3 = zext i8 %v.3 to i32457  %s.3 = shl i32 %z.3, 24458  %x.3 = or i32 %x.2, %s.3459 460  ret i32 %x.3461}462 463define i64 @extract.le.i64(<8 x i16> %v) {464; CHECK-BE-LABEL: define i64 @extract.le.i64(465; CHECK-BE-SAME: <8 x i16> [[V:%.*]]) {466; CHECK-BE-NEXT:    [[V_0:%.*]] = extractelement <8 x i16> [[V]], i64 3467; CHECK-BE-NEXT:    [[Z_0:%.*]] = zext i16 [[V_0]] to i64468; CHECK-BE-NEXT:    [[V_1:%.*]] = extractelement <8 x i16> [[V]], i64 4469; CHECK-BE-NEXT:    [[Z_1:%.*]] = zext i16 [[V_1]] to i64470; CHECK-BE-NEXT:    [[S_1:%.*]] = shl nuw nsw i64 [[Z_1]], 16471; CHECK-BE-NEXT:    [[X_1:%.*]] = or disjoint i64 [[S_1]], [[Z_0]]472; CHECK-BE-NEXT:    [[V_2:%.*]] = extractelement <8 x i16> [[V]], i64 5473; CHECK-BE-NEXT:    [[Z_2:%.*]] = zext i16 [[V_2]] to i64474; CHECK-BE-NEXT:    [[S_2:%.*]] = shl nuw nsw i64 [[Z_2]], 32475; CHECK-BE-NEXT:    [[X_2:%.*]] = or disjoint i64 [[X_1]], [[S_2]]476; CHECK-BE-NEXT:    [[V_3:%.*]] = extractelement <8 x i16> [[V]], i64 6477; CHECK-BE-NEXT:    [[Z_3:%.*]] = zext i16 [[V_3]] to i64478; CHECK-BE-NEXT:    [[S_3:%.*]] = shl nuw i64 [[Z_3]], 48479; CHECK-BE-NEXT:    [[X_3:%.*]] = or disjoint i64 [[X_2]], [[S_3]]480; CHECK-BE-NEXT:    ret i64 [[X_3]]481;482; CHECK-LE-LABEL: define i64 @extract.le.i64(483; CHECK-LE-SAME: <8 x i16> [[V:%.*]]) {484; CHECK-LE-NEXT:    [[X_3_V_EXTRACT:%.*]] = shufflevector <8 x i16> [[V]], <8 x i16> poison, <8 x i32> <i32 3, i32 4, i32 5, i32 6, i32 poison, i32 poison, i32 poison, i32 poison>485; CHECK-LE-NEXT:    [[X_3_V_BC:%.*]] = bitcast <8 x i16> [[X_3_V_EXTRACT]] to <2 x i64>486; CHECK-LE-NEXT:    [[X_3_V_EXTRACT1:%.*]] = extractelement <2 x i64> [[X_3_V_BC]], i64 0487; CHECK-LE-NEXT:    ret i64 [[X_3_V_EXTRACT1]]488;489  %v.0 = extractelement <8 x i16> %v, i64 3490  %z.0 = zext i16 %v.0 to i64491 492  %v.1 = extractelement <8 x i16> %v, i64 4493  %z.1 = zext i16 %v.1 to i64494  %s.1 = shl i64 %z.1, 16495  %x.1 = or i64 %z.0, %s.1496 497  %v.2 = extractelement <8 x i16> %v, i64 5498  %z.2 = zext i16 %v.2 to i64499  %s.2 = shl i64 %z.2, 32500  %x.2 = or i64 %x.1, %s.2501 502  %v.3 = extractelement <8 x i16> %v, i64 6503  %z.3 = zext i16 %v.3 to i64504  %s.3 = shl i64 %z.3, 48505  %x.3 = or i64 %x.2, %s.3506 507  ret i64 %x.3508}509 510define i64 @extract.be.i64(<8 x i16> %v) {511; CHECK-BE-LABEL: define i64 @extract.be.i64(512; CHECK-BE-SAME: <8 x i16> [[V:%.*]]) {513; CHECK-BE-NEXT:    [[X_3_V_EXTRACT:%.*]] = shufflevector <8 x i16> [[V]], <8 x i16> poison, <8 x i32> <i32 3, i32 4, i32 5, i32 6, i32 poison, i32 poison, i32 poison, i32 poison>514; CHECK-BE-NEXT:    [[X_3_V_BC:%.*]] = bitcast <8 x i16> [[X_3_V_EXTRACT]] to <2 x i64>515; CHECK-BE-NEXT:    [[X_3_V_EXTRACT1:%.*]] = extractelement <2 x i64> [[X_3_V_BC]], i64 0516; CHECK-BE-NEXT:    ret i64 [[X_3_V_EXTRACT1]]517;518; CHECK-LE-LABEL: define i64 @extract.be.i64(519; CHECK-LE-SAME: <8 x i16> [[V:%.*]]) {520; CHECK-LE-NEXT:    [[V_0:%.*]] = extractelement <8 x i16> [[V]], i64 6521; CHECK-LE-NEXT:    [[Z_0:%.*]] = zext i16 [[V_0]] to i64522; CHECK-LE-NEXT:    [[V_1:%.*]] = extractelement <8 x i16> [[V]], i64 5523; CHECK-LE-NEXT:    [[Z_1:%.*]] = zext i16 [[V_1]] to i64524; CHECK-LE-NEXT:    [[S_1:%.*]] = shl nuw nsw i64 [[Z_1]], 16525; CHECK-LE-NEXT:    [[X_1:%.*]] = or disjoint i64 [[S_1]], [[Z_0]]526; CHECK-LE-NEXT:    [[V_2:%.*]] = extractelement <8 x i16> [[V]], i64 4527; CHECK-LE-NEXT:    [[Z_2:%.*]] = zext i16 [[V_2]] to i64528; CHECK-LE-NEXT:    [[S_2:%.*]] = shl nuw nsw i64 [[Z_2]], 32529; CHECK-LE-NEXT:    [[X_2:%.*]] = or disjoint i64 [[X_1]], [[S_2]]530; CHECK-LE-NEXT:    [[V_3:%.*]] = extractelement <8 x i16> [[V]], i64 3531; CHECK-LE-NEXT:    [[Z_3:%.*]] = zext i16 [[V_3]] to i64532; CHECK-LE-NEXT:    [[S_3:%.*]] = shl nuw i64 [[Z_3]], 48533; CHECK-LE-NEXT:    [[X_3:%.*]] = or disjoint i64 [[X_2]], [[S_3]]534; CHECK-LE-NEXT:    ret i64 [[X_3]]535;536  %v.0 = extractelement <8 x i16> %v, i64 6537  %z.0 = zext i16 %v.0 to i64538 539  %v.1 = extractelement <8 x i16> %v, i64 5540  %z.1 = zext i16 %v.1 to i64541  %s.1 = shl i64 %z.1, 16542  %x.1 = or i64 %z.0, %s.1543 544  %v.2 = extractelement <8 x i16> %v, i64 4545  %z.2 = zext i16 %v.2 to i64546  %s.2 = shl i64 %z.2, 32547  %x.2 = or i64 %x.1, %s.2548 549  %v.3 = extractelement <8 x i16> %v, i64 3550  %z.3 = zext i16 %v.3 to i64551  %s.3 = shl i64 %z.3, 48552  %x.3 = or i64 %x.2, %s.3553 554  ret i64 %x.3555}556 557define i32 @partial.le(<4 x i8> %v) {558; CHECK-BE-LABEL: define i32 @partial.le(559; CHECK-BE-SAME: <4 x i8> [[V:%.*]]) {560; CHECK-BE-NEXT:    [[V_0:%.*]] = extractelement <4 x i8> [[V]], i64 0561; CHECK-BE-NEXT:    [[Z_0:%.*]] = zext i8 [[V_0]] to i32562; CHECK-BE-NEXT:    [[V_1:%.*]] = extractelement <4 x i8> [[V]], i64 1563; CHECK-BE-NEXT:    [[Z_1:%.*]] = zext i8 [[V_1]] to i32564; CHECK-BE-NEXT:    [[S_1:%.*]] = shl nuw nsw i32 [[Z_1]], 8565; CHECK-BE-NEXT:    [[X_1:%.*]] = or disjoint i32 [[S_1]], [[Z_0]]566; CHECK-BE-NEXT:    [[V_3:%.*]] = extractelement <4 x i8> [[V]], i64 3567; CHECK-BE-NEXT:    [[Z_3:%.*]] = zext i8 [[V_3]] to i32568; CHECK-BE-NEXT:    [[S_3:%.*]] = shl nuw i32 [[Z_3]], 24569; CHECK-BE-NEXT:    [[X_3:%.*]] = or disjoint i32 [[X_1]], [[S_3]]570; CHECK-BE-NEXT:    ret i32 [[X_3]]571;572; CHECK-LE-LABEL: define i32 @partial.le(573; CHECK-LE-SAME: <4 x i8> [[V:%.*]]) {574; CHECK-LE-NEXT:    [[X_3_V1:%.*]] = insertelement <4 x i8> [[V]], i8 0, i64 2575; CHECK-LE-NEXT:    [[X_3:%.*]] = bitcast <4 x i8> [[X_3_V1]] to i32576; CHECK-LE-NEXT:    ret i32 [[X_3]]577;578  %v.0 = extractelement <4 x i8> %v, i64 0579  %z.0 = zext i8 %v.0 to i32580 581  %v.1 = extractelement <4 x i8> %v, i64 1582  %z.1 = zext i8 %v.1 to i32583  %s.1 = shl i32 %z.1, 8584  %x.1 = or i32 %z.0, %s.1585 586  %v.3 = extractelement <4 x i8> %v, i64 3587  %z.3 = zext i8 %v.3 to i32588  %s.3 = shl i32 %z.3, 24589  %x.3 = or i32 %x.1, %s.3590 591  ret i32 %x.3592}593 594define i32 @partial.be(<4 x i8> %v) {595; CHECK-BE-LABEL: define i32 @partial.be(596; CHECK-BE-SAME: <4 x i8> [[V:%.*]]) {597; CHECK-BE-NEXT:    [[X_3_V1:%.*]] = insertelement <4 x i8> [[V]], i8 0, i64 2598; CHECK-BE-NEXT:    [[X_3:%.*]] = bitcast <4 x i8> [[X_3_V1]] to i32599; CHECK-BE-NEXT:    ret i32 [[X_3]]600;601; CHECK-LE-LABEL: define i32 @partial.be(602; CHECK-LE-SAME: <4 x i8> [[V:%.*]]) {603; CHECK-LE-NEXT:    [[V_0:%.*]] = extractelement <4 x i8> [[V]], i64 3604; CHECK-LE-NEXT:    [[Z_0:%.*]] = zext i8 [[V_0]] to i32605; CHECK-LE-NEXT:    [[V_1:%.*]] = extractelement <4 x i8> [[V]], i64 1606; CHECK-LE-NEXT:    [[Z_1:%.*]] = zext i8 [[V_1]] to i32607; CHECK-LE-NEXT:    [[S_1:%.*]] = shl nuw nsw i32 [[Z_1]], 16608; CHECK-LE-NEXT:    [[X_1:%.*]] = or disjoint i32 [[S_1]], [[Z_0]]609; CHECK-LE-NEXT:    [[V_3:%.*]] = extractelement <4 x i8> [[V]], i64 0610; CHECK-LE-NEXT:    [[Z_3:%.*]] = zext i8 [[V_3]] to i32611; CHECK-LE-NEXT:    [[S_3:%.*]] = shl nuw i32 [[Z_3]], 24612; CHECK-LE-NEXT:    [[X_3:%.*]] = or disjoint i32 [[X_1]], [[S_3]]613; CHECK-LE-NEXT:    ret i32 [[X_3]]614;615  %v.0 = extractelement <4 x i8> %v, i64 3616  %z.0 = zext i8 %v.0 to i32617 618  %v.1 = extractelement <4 x i8> %v, i64 1619  %z.1 = zext i8 %v.1 to i32620  %s.1 = shl i32 %z.1, 16621  %x.1 = or i32 %z.0, %s.1622 623  %v.3 = extractelement <4 x i8> %v, i64 0624  %z.3 = zext i8 %v.3 to i32625  %s.3 = shl i32 %z.3, 24626  %x.3 = or i32 %x.1, %s.3627 628  ret i32 %x.3629}630 631 632define i64 @partial.le.i16(<4 x i16> %v) {633; CHECK-BE-LABEL: define i64 @partial.le.i16(634; CHECK-BE-SAME: <4 x i16> [[V:%.*]]) {635; CHECK-BE-NEXT:    [[V_0:%.*]] = extractelement <4 x i16> [[V]], i64 0636; CHECK-BE-NEXT:    [[Z_0:%.*]] = zext i16 [[V_0]] to i64637; CHECK-BE-NEXT:    [[V_1:%.*]] = extractelement <4 x i16> [[V]], i64 1638; CHECK-BE-NEXT:    [[Z_1:%.*]] = zext i16 [[V_1]] to i64639; CHECK-BE-NEXT:    [[S_1:%.*]] = shl nuw nsw i64 [[Z_1]], 16640; CHECK-BE-NEXT:    [[X_1:%.*]] = or disjoint i64 [[S_1]], [[Z_0]]641; CHECK-BE-NEXT:    [[V_3:%.*]] = extractelement <4 x i16> [[V]], i64 3642; CHECK-BE-NEXT:    [[Z_3:%.*]] = zext i16 [[V_3]] to i64643; CHECK-BE-NEXT:    [[S_3:%.*]] = shl nuw i64 [[Z_3]], 48644; CHECK-BE-NEXT:    [[X_3:%.*]] = or disjoint i64 [[X_1]], [[S_3]]645; CHECK-BE-NEXT:    ret i64 [[X_3]]646;647; CHECK-LE-LABEL: define i64 @partial.le.i16(648; CHECK-LE-SAME: <4 x i16> [[V:%.*]]) {649; CHECK-LE-NEXT:    [[X_3_V1:%.*]] = insertelement <4 x i16> [[V]], i16 0, i64 2650; CHECK-LE-NEXT:    [[X_3:%.*]] = bitcast <4 x i16> [[X_3_V1]] to i64651; CHECK-LE-NEXT:    ret i64 [[X_3]]652;653  %v.0 = extractelement <4 x i16> %v, i64 0654  %z.0 = zext i16 %v.0 to i64655 656  %v.1 = extractelement <4 x i16> %v, i64 1657  %z.1 = zext i16 %v.1 to i64658  %s.1 = shl i64 %z.1, 16659  %x.1 = or i64 %z.0, %s.1660 661  %v.3 = extractelement <4 x i16> %v, i64 3662  %z.3 = zext i16 %v.3 to i64663  %s.3 = shl i64 %z.3, 48664  %x.3 = or i64 %x.1, %s.3665 666  ret i64 %x.3667}668 669define i64 @partial.be.i16(<4 x i16> %v) {670; CHECK-BE-LABEL: define i64 @partial.be.i16(671; CHECK-BE-SAME: <4 x i16> [[V:%.*]]) {672; CHECK-BE-NEXT:    [[X_3_V1:%.*]] = insertelement <4 x i16> [[V]], i16 0, i64 2673; CHECK-BE-NEXT:    [[X_3:%.*]] = bitcast <4 x i16> [[X_3_V1]] to i64674; CHECK-BE-NEXT:    ret i64 [[X_3]]675;676; CHECK-LE-LABEL: define i64 @partial.be.i16(677; CHECK-LE-SAME: <4 x i16> [[V:%.*]]) {678; CHECK-LE-NEXT:    [[V_0:%.*]] = extractelement <4 x i16> [[V]], i64 3679; CHECK-LE-NEXT:    [[Z_0:%.*]] = zext i16 [[V_0]] to i64680; CHECK-LE-NEXT:    [[V_1:%.*]] = extractelement <4 x i16> [[V]], i64 1681; CHECK-LE-NEXT:    [[Z_1:%.*]] = zext i16 [[V_1]] to i64682; CHECK-LE-NEXT:    [[S_1:%.*]] = shl nuw nsw i64 [[Z_1]], 32683; CHECK-LE-NEXT:    [[X_1:%.*]] = or disjoint i64 [[S_1]], [[Z_0]]684; CHECK-LE-NEXT:    [[V_3:%.*]] = extractelement <4 x i16> [[V]], i64 0685; CHECK-LE-NEXT:    [[Z_3:%.*]] = zext i16 [[V_3]] to i64686; CHECK-LE-NEXT:    [[S_3:%.*]] = shl nuw i64 [[Z_3]], 48687; CHECK-LE-NEXT:    [[X_3:%.*]] = or disjoint i64 [[X_1]], [[S_3]]688; CHECK-LE-NEXT:    ret i64 [[X_3]]689;690  %v.0 = extractelement <4 x i16> %v, i64 3691  %z.0 = zext i16 %v.0 to i64692 693  %v.1 = extractelement <4 x i16> %v, i64 1694  %z.1 = zext i16 %v.1 to i64695  %s.1 = shl i64 %z.1, 32696  %x.1 = or i64 %z.0, %s.1697 698  %v.3 = extractelement <4 x i16> %v, i64 0699  %z.3 = zext i16 %v.3 to i64700  %s.3 = shl i64 %z.3, 48701  %x.3 = or i64 %x.1, %s.3702 703  ret i64 %x.3704}705 706define i32 @partial.extract.le.i32(<8 x i8> %v) {707; CHECK-BE-LABEL: define i32 @partial.extract.le.i32(708; CHECK-BE-SAME: <8 x i8> [[V:%.*]]) {709; CHECK-BE-NEXT:    [[V_0:%.*]] = extractelement <8 x i8> [[V]], i64 3710; CHECK-BE-NEXT:    [[Z_0:%.*]] = zext i8 [[V_0]] to i32711; CHECK-BE-NEXT:    [[V_1:%.*]] = extractelement <8 x i8> [[V]], i64 4712; CHECK-BE-NEXT:    [[Z_1:%.*]] = zext i8 [[V_1]] to i32713; CHECK-BE-NEXT:    [[S_1:%.*]] = shl nuw nsw i32 [[Z_1]], 8714; CHECK-BE-NEXT:    [[X_1:%.*]] = or disjoint i32 [[S_1]], [[Z_0]]715; CHECK-BE-NEXT:    [[V_3:%.*]] = extractelement <8 x i8> [[V]], i64 6716; CHECK-BE-NEXT:    [[Z_3:%.*]] = zext i8 [[V_3]] to i32717; CHECK-BE-NEXT:    [[S_3:%.*]] = shl nuw i32 [[Z_3]], 24718; CHECK-BE-NEXT:    [[X_3:%.*]] = or disjoint i32 [[X_1]], [[S_3]]719; CHECK-BE-NEXT:    ret i32 [[X_3]]720;721; CHECK-LE-LABEL: define i32 @partial.extract.le.i32(722; CHECK-LE-SAME: <8 x i8> [[V:%.*]]) {723; CHECK-LE-NEXT:    [[X_3_V:%.*]] = shufflevector <8 x i8> [[V]], <8 x i8> <i8 0, i8 poison, i8 poison, i8 poison, i8 poison, i8 poison, i8 poison, i8 poison>, <4 x i32> <i32 3, i32 4, i32 8, i32 6>724; CHECK-LE-NEXT:    [[X_3:%.*]] = bitcast <4 x i8> [[X_3_V]] to i32725; CHECK-LE-NEXT:    ret i32 [[X_3]]726;727  %v.0 = extractelement <8 x i8> %v, i64 3728  %z.0 = zext i8 %v.0 to i32729 730  %v.1 = extractelement <8 x i8> %v, i64 4731  %z.1 = zext i8 %v.1 to i32732  %s.1 = shl i32 %z.1, 8733  %x.1 = or i32 %z.0, %s.1734 735  %v.3 = extractelement <8 x i8> %v, i64 6736  %z.3 = zext i8 %v.3 to i32737  %s.3 = shl i32 %z.3, 24738  %x.3 = or i32 %x.1, %s.3739 740  ret i32 %x.3741}742 743define i32 @partial.extract.be.i32(<8 x i8> %v) {744; CHECK-BE-LABEL: define i32 @partial.extract.be.i32(745; CHECK-BE-SAME: <8 x i8> [[V:%.*]]) {746; CHECK-BE-NEXT:    [[X_3_V:%.*]] = shufflevector <8 x i8> [[V]], <8 x i8> <i8 0, i8 poison, i8 poison, i8 poison, i8 poison, i8 poison, i8 poison, i8 poison>, <4 x i32> <i32 3, i32 4, i32 8, i32 6>747; CHECK-BE-NEXT:    [[X_3:%.*]] = bitcast <4 x i8> [[X_3_V]] to i32748; CHECK-BE-NEXT:    ret i32 [[X_3]]749;750; CHECK-LE-LABEL: define i32 @partial.extract.be.i32(751; CHECK-LE-SAME: <8 x i8> [[V:%.*]]) {752; CHECK-LE-NEXT:    [[V_0:%.*]] = extractelement <8 x i8> [[V]], i64 6753; CHECK-LE-NEXT:    [[Z_0:%.*]] = zext i8 [[V_0]] to i32754; CHECK-LE-NEXT:    [[V_2:%.*]] = extractelement <8 x i8> [[V]], i64 4755; CHECK-LE-NEXT:    [[Z_2:%.*]] = zext i8 [[V_2]] to i32756; CHECK-LE-NEXT:    [[S_2:%.*]] = shl nuw nsw i32 [[Z_2]], 16757; CHECK-LE-NEXT:    [[X_2:%.*]] = or disjoint i32 [[S_2]], [[Z_0]]758; CHECK-LE-NEXT:    [[V_3:%.*]] = extractelement <8 x i8> [[V]], i64 3759; CHECK-LE-NEXT:    [[Z_3:%.*]] = zext i8 [[V_3]] to i32760; CHECK-LE-NEXT:    [[S_3:%.*]] = shl nuw i32 [[Z_3]], 24761; CHECK-LE-NEXT:    [[X_3:%.*]] = or disjoint i32 [[X_2]], [[S_3]]762; CHECK-LE-NEXT:    ret i32 [[X_3]]763;764  %v.0 = extractelement <8 x i8> %v, i64 6765  %z.0 = zext i8 %v.0 to i32766 767  %v.2 = extractelement <8 x i8> %v, i64 4768  %z.2 = zext i8 %v.2 to i32769  %s.2 = shl i32 %z.2, 16770  %x.2 = or i32 %z.0, %s.2771 772  %v.3 = extractelement <8 x i8> %v, i64 3773  %z.3 = zext i8 %v.3 to i32774  %s.3 = shl i32 %z.3, 24775  %x.3 = or i32 %x.2, %s.3776 777  ret i32 %x.3778}779 780define i64 @partial.extract.le.i64(<8 x i16> %v) {781; CHECK-BE-LABEL: define i64 @partial.extract.le.i64(782; CHECK-BE-SAME: <8 x i16> [[V:%.*]]) {783; CHECK-BE-NEXT:    [[V_0:%.*]] = extractelement <8 x i16> [[V]], i64 3784; CHECK-BE-NEXT:    [[Z_0:%.*]] = zext i16 [[V_0]] to i64785; CHECK-BE-NEXT:    [[V_1:%.*]] = extractelement <8 x i16> [[V]], i64 4786; CHECK-BE-NEXT:    [[Z_1:%.*]] = zext i16 [[V_1]] to i64787; CHECK-BE-NEXT:    [[S_1:%.*]] = shl nuw nsw i64 [[Z_1]], 16788; CHECK-BE-NEXT:    [[X_1:%.*]] = or disjoint i64 [[S_1]], [[Z_0]]789; CHECK-BE-NEXT:    [[V_2:%.*]] = extractelement <8 x i16> [[V]], i64 5790; CHECK-BE-NEXT:    [[Z_2:%.*]] = zext i16 [[V_2]] to i64791; CHECK-BE-NEXT:    [[S_2:%.*]] = shl nuw nsw i64 [[Z_2]], 32792; CHECK-BE-NEXT:    [[X_2:%.*]] = or disjoint i64 [[X_1]], [[S_2]]793; CHECK-BE-NEXT:    [[V_3:%.*]] = extractelement <8 x i16> [[V]], i64 6794; CHECK-BE-NEXT:    [[Z_3:%.*]] = zext i16 [[V_3]] to i64795; CHECK-BE-NEXT:    [[S_3:%.*]] = shl nuw i64 [[Z_3]], 48796; CHECK-BE-NEXT:    [[X_3:%.*]] = or disjoint i64 [[X_2]], [[S_3]]797; CHECK-BE-NEXT:    ret i64 [[X_3]]798;799; CHECK-LE-LABEL: define i64 @partial.extract.le.i64(800; CHECK-LE-SAME: <8 x i16> [[V:%.*]]) {801; CHECK-LE-NEXT:    [[X_3_V_EXTRACT:%.*]] = shufflevector <8 x i16> [[V]], <8 x i16> poison, <8 x i32> <i32 3, i32 4, i32 5, i32 6, i32 poison, i32 poison, i32 poison, i32 poison>802; CHECK-LE-NEXT:    [[X_3_V_BC:%.*]] = bitcast <8 x i16> [[X_3_V_EXTRACT]] to <2 x i64>803; CHECK-LE-NEXT:    [[X_3_V_EXTRACT1:%.*]] = extractelement <2 x i64> [[X_3_V_BC]], i64 0804; CHECK-LE-NEXT:    ret i64 [[X_3_V_EXTRACT1]]805;806  %v.0 = extractelement <8 x i16> %v, i64 3807  %z.0 = zext i16 %v.0 to i64808 809  %v.1 = extractelement <8 x i16> %v, i64 4810  %z.1 = zext i16 %v.1 to i64811  %s.1 = shl i64 %z.1, 16812  %x.1 = or i64 %z.0, %s.1813 814  %v.2 = extractelement <8 x i16> %v, i64 5815  %z.2 = zext i16 %v.2 to i64816  %s.2 = shl i64 %z.2, 32817  %x.2 = or i64 %x.1, %s.2818 819  %v.3 = extractelement <8 x i16> %v, i64 6820  %z.3 = zext i16 %v.3 to i64821  %s.3 = shl i64 %z.3, 48822  %x.3 = or i64 %x.2, %s.3823 824  ret i64 %x.3825}826 827define i64 @partial.extract.be.i64(<8 x i16> %v) {828; CHECK-BE-LABEL: define i64 @partial.extract.be.i64(829; CHECK-BE-SAME: <8 x i16> [[V:%.*]]) {830; CHECK-BE-NEXT:    [[X_3_V:%.*]] = shufflevector <8 x i16> [[V]], <8 x i16> <i16 0, i16 poison, i16 poison, i16 poison, i16 poison, i16 poison, i16 poison, i16 poison>, <4 x i32> <i32 3, i32 4, i32 8, i32 6>831; CHECK-BE-NEXT:    [[X_3:%.*]] = bitcast <4 x i16> [[X_3_V]] to i64832; CHECK-BE-NEXT:    ret i64 [[X_3]]833;834; CHECK-LE-LABEL: define i64 @partial.extract.be.i64(835; CHECK-LE-SAME: <8 x i16> [[V:%.*]]) {836; CHECK-LE-NEXT:    [[V_0:%.*]] = extractelement <8 x i16> [[V]], i64 6837; CHECK-LE-NEXT:    [[Z_0:%.*]] = zext i16 [[V_0]] to i64838; CHECK-LE-NEXT:    [[V_2:%.*]] = extractelement <8 x i16> [[V]], i64 4839; CHECK-LE-NEXT:    [[Z_2:%.*]] = zext i16 [[V_2]] to i64840; CHECK-LE-NEXT:    [[S_2:%.*]] = shl nuw nsw i64 [[Z_2]], 32841; CHECK-LE-NEXT:    [[X_2:%.*]] = or disjoint i64 [[S_2]], [[Z_0]]842; CHECK-LE-NEXT:    [[V_3:%.*]] = extractelement <8 x i16> [[V]], i64 3843; CHECK-LE-NEXT:    [[Z_3:%.*]] = zext i16 [[V_3]] to i64844; CHECK-LE-NEXT:    [[S_3:%.*]] = shl nuw i64 [[Z_3]], 48845; CHECK-LE-NEXT:    [[X_3:%.*]] = or disjoint i64 [[X_2]], [[S_3]]846; CHECK-LE-NEXT:    ret i64 [[X_3]]847;848  %v.0 = extractelement <8 x i16> %v, i64 6849  %z.0 = zext i16 %v.0 to i64850 851  %v.2 = extractelement <8 x i16> %v, i64 4852  %z.2 = zext i16 %v.2 to i64853  %s.2 = shl i64 %z.2, 32854  %x.2 = or i64 %z.0, %s.2855 856  %v.3 = extractelement <8 x i16> %v, i64 3857  %z.3 = zext i16 %v.3 to i64858  %s.3 = shl i64 %z.3, 48859  %x.3 = or i64 %x.2, %s.3860 861  ret i64 %x.3862}863 864define <2 x i16> @shufflecast.v2v(<4 x i8> %v) {865; CHECK-LABEL: define <2 x i16> @shufflecast.v2v(866; CHECK-SAME: <4 x i8> [[V:%.*]]) {867; CHECK-NEXT:    [[W_3:%.*]] = bitcast <4 x i8> [[V]] to <2 x i16>868; CHECK-NEXT:    ret <2 x i16> [[W_3]]869;870  %v.0 = shufflevector <4 x i8> %v, <4 x i8> zeroinitializer, <4 x i32> <i32 0, i32 4, i32 4, i32 4>871  %c.0 = bitcast <4 x i8> %v.0 to <2 x i16>872 873  %v.1 = shufflevector <4 x i8> %v, <4 x i8> zeroinitializer, <4 x i32> <i32 4, i32 1, i32 4, i32 4>874  %c.1 = bitcast <4 x i8> %v.1 to <2 x i16>875  %w.1 = or <2 x i16> %c.0, %c.1876 877  %v.2 = shufflevector <4 x i8> %v, <4 x i8> zeroinitializer, <4 x i32> <i32 4, i32 4, i32 2, i32 4>878  %c.2 = bitcast <4 x i8> %v.2 to <2 x i16>879  %w.2 = or <2 x i16> %w.1, %c.2880 881  %v.3 = shufflevector <4 x i8> %v, <4 x i8> zeroinitializer, <4 x i32> <i32 4, i32 4, i32 4, i32 3>882  %c.3 = bitcast <4 x i8> %v.3 to <2 x i16>883  %w.3 = or <2 x i16> %w.2, %c.3884 885  ret <2 x i16> %w.3886}887 888define <2 x i32> @shufflecast.v2v.i16(<4 x i16> %v) {889; CHECK-LABEL: define <2 x i32> @shufflecast.v2v.i16(890; CHECK-SAME: <4 x i16> [[V:%.*]]) {891; CHECK-NEXT:    [[W_3:%.*]] = bitcast <4 x i16> [[V]] to <2 x i32>892; CHECK-NEXT:    ret <2 x i32> [[W_3]]893;894  %v.0 = shufflevector <4 x i16> %v, <4 x i16> zeroinitializer, <4 x i32> <i32 0, i32 4, i32 4, i32 4>895  %c.0 = bitcast <4 x i16> %v.0 to <2 x i32>896 897  %v.1 = shufflevector <4 x i16> %v, <4 x i16> zeroinitializer, <4 x i32> <i32 4, i32 1, i32 4, i32 4>898  %c.1 = bitcast <4 x i16> %v.1 to <2 x i32>899  %w.1 = or <2 x i32> %c.0, %c.1900 901  %v.2 = shufflevector <4 x i16> %v, <4 x i16> zeroinitializer, <4 x i32> <i32 4, i32 4, i32 2, i32 4>902  %c.2 = bitcast <4 x i16> %v.2 to <2 x i32>903  %w.2 = or <2 x i32> %w.1, %c.2904 905  %v.3 = shufflevector <4 x i16> %v, <4 x i16> zeroinitializer, <4 x i32> <i32 4, i32 4, i32 4, i32 3>906  %c.3 = bitcast <4 x i16> %v.3 to <2 x i32>907  %w.3 = or <2 x i32> %w.2, %c.3908 909  ret <2 x i32> %w.3910}911 912define i32 @bitcast.v2i.half(<2 x half> %v) {913; CHECK-LABEL: define i32 @bitcast.v2i.half(914; CHECK-SAME: <2 x half> [[V:%.*]]) {915; CHECK-NEXT:    [[X:%.*]] = bitcast <2 x half> [[V]] to i32916; CHECK-NEXT:    ret i32 [[X]]917;918  %v.0 = insertelement <2 x half> %v, half 0.0, i64 1919  %x.0 = bitcast <2 x half> %v.0 to i32920 921  %v.1 = insertelement <2 x half> %v, half 0.0, i64 0922  %x.1 = bitcast <2 x half> %v.1 to i32923 924  %x = or i32 %x.0, %x.1925  ret i32 %x926}927