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