; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 ; RUN: opt %s -passes=instcombine -data-layout="E" -S | FileCheck %s --check-prefixes=CHECK,CHECK-BE ; RUN: opt %s -passes=instcombine -data-layout="e" -S | FileCheck %s --check-prefixes=CHECK,CHECK-LE define i32 @bitcast.v2i.le(<4 x i8> %v) { ; CHECK-BE-LABEL: define i32 @bitcast.v2i.le( ; CHECK-BE-SAME: <4 x i8> [[V:%.*]]) { ; CHECK-BE-NEXT: [[V_0:%.*]] = extractelement <4 x i8> [[V]], i64 0 ; CHECK-BE-NEXT: [[Z_0:%.*]] = zext i8 [[V_0]] to i32 ; CHECK-BE-NEXT: [[V_1:%.*]] = extractelement <4 x i8> [[V]], i64 1 ; CHECK-BE-NEXT: [[Z_1:%.*]] = zext i8 [[V_1]] to i32 ; CHECK-BE-NEXT: [[S_1:%.*]] = shl nuw nsw i32 [[Z_1]], 8 ; CHECK-BE-NEXT: [[X_1:%.*]] = or disjoint i32 [[S_1]], [[Z_0]] ; CHECK-BE-NEXT: [[V_2:%.*]] = extractelement <4 x i8> [[V]], i64 2 ; CHECK-BE-NEXT: [[Z_2:%.*]] = zext i8 [[V_2]] to i32 ; CHECK-BE-NEXT: [[S_2:%.*]] = shl nuw nsw i32 [[Z_2]], 16 ; CHECK-BE-NEXT: [[X_2:%.*]] = or disjoint i32 [[X_1]], [[S_2]] ; CHECK-BE-NEXT: [[V_3:%.*]] = extractelement <4 x i8> [[V]], i64 3 ; CHECK-BE-NEXT: [[Z_3:%.*]] = zext i8 [[V_3]] to i32 ; CHECK-BE-NEXT: [[S_3:%.*]] = shl nuw i32 [[Z_3]], 24 ; CHECK-BE-NEXT: [[X_3:%.*]] = or disjoint i32 [[X_2]], [[S_3]] ; CHECK-BE-NEXT: ret i32 [[X_3]] ; ; CHECK-LE-LABEL: define i32 @bitcast.v2i.le( ; CHECK-LE-SAME: <4 x i8> [[V:%.*]]) { ; CHECK-LE-NEXT: [[X_3:%.*]] = bitcast <4 x i8> [[V]] to i32 ; CHECK-LE-NEXT: ret i32 [[X_3]] ; %v.0 = extractelement <4 x i8> %v, i64 0 %z.0 = zext i8 %v.0 to i32 %v.1 = extractelement <4 x i8> %v, i64 1 %z.1 = zext i8 %v.1 to i32 %s.1 = shl i32 %z.1, 8 %x.1 = or i32 %z.0, %s.1 %v.2 = extractelement <4 x i8> %v, i64 2 %z.2 = zext i8 %v.2 to i32 %s.2 = shl i32 %z.2, 16 %x.2 = or i32 %x.1, %s.2 %v.3 = extractelement <4 x i8> %v, i64 3 %z.3 = zext i8 %v.3 to i32 %s.3 = shl i32 %z.3, 24 %x.3 = or i32 %x.2, %s.3 ret i32 %x.3 } define i32 @bitcast.v2i.be(<4 x i8> %v) { ; CHECK-BE-LABEL: define i32 @bitcast.v2i.be( ; CHECK-BE-SAME: <4 x i8> [[V:%.*]]) { ; CHECK-BE-NEXT: [[X_3:%.*]] = bitcast <4 x i8> [[V]] to i32 ; CHECK-BE-NEXT: ret i32 [[X_3]] ; ; CHECK-LE-LABEL: define i32 @bitcast.v2i.be( ; CHECK-LE-SAME: <4 x i8> [[V:%.*]]) { ; CHECK-LE-NEXT: [[V_0:%.*]] = extractelement <4 x i8> [[V]], i64 3 ; CHECK-LE-NEXT: [[Z_0:%.*]] = zext i8 [[V_0]] to i32 ; CHECK-LE-NEXT: [[V_1:%.*]] = extractelement <4 x i8> [[V]], i64 2 ; CHECK-LE-NEXT: [[Z_1:%.*]] = zext i8 [[V_1]] to i32 ; CHECK-LE-NEXT: [[S_1:%.*]] = shl nuw nsw i32 [[Z_1]], 8 ; CHECK-LE-NEXT: [[X_1:%.*]] = or disjoint i32 [[S_1]], [[Z_0]] ; CHECK-LE-NEXT: [[V_2:%.*]] = extractelement <4 x i8> [[V]], i64 1 ; CHECK-LE-NEXT: [[Z_2:%.*]] = zext i8 [[V_2]] to i32 ; CHECK-LE-NEXT: [[S_2:%.*]] = shl nuw nsw i32 [[Z_2]], 16 ; CHECK-LE-NEXT: [[X_2:%.*]] = or disjoint i32 [[X_1]], [[S_2]] ; CHECK-LE-NEXT: [[V_3:%.*]] = extractelement <4 x i8> [[V]], i64 0 ; CHECK-LE-NEXT: [[Z_3:%.*]] = zext i8 [[V_3]] to i32 ; CHECK-LE-NEXT: [[S_3:%.*]] = shl nuw i32 [[Z_3]], 24 ; CHECK-LE-NEXT: [[X_3:%.*]] = or disjoint i32 [[X_2]], [[S_3]] ; CHECK-LE-NEXT: ret i32 [[X_3]] ; %v.0 = extractelement <4 x i8> %v, i64 3 %z.0 = zext i8 %v.0 to i32 %v.1 = extractelement <4 x i8> %v, i64 2 %z.1 = zext i8 %v.1 to i32 %s.1 = shl i32 %z.1, 8 %x.1 = or i32 %z.0, %s.1 %v.2 = extractelement <4 x i8> %v, i64 1 %z.2 = zext i8 %v.2 to i32 %s.2 = shl i32 %z.2, 16 %x.2 = or i32 %x.1, %s.2 %v.3 = extractelement <4 x i8> %v, i64 0 %z.3 = zext i8 %v.3 to i32 %s.3 = shl i32 %z.3, 24 %x.3 = or i32 %x.2, %s.3 ret i32 %x.3 } define i64 @bitcast.v2i.le.i16(<4 x i16> %v) { ; CHECK-BE-LABEL: define i64 @bitcast.v2i.le.i16( ; CHECK-BE-SAME: <4 x i16> [[V:%.*]]) { ; CHECK-BE-NEXT: [[V_0:%.*]] = extractelement <4 x i16> [[V]], i64 0 ; CHECK-BE-NEXT: [[Z_0:%.*]] = zext i16 [[V_0]] to i64 ; CHECK-BE-NEXT: [[V_1:%.*]] = extractelement <4 x i16> [[V]], i64 1 ; CHECK-BE-NEXT: [[Z_1:%.*]] = zext i16 [[V_1]] to i64 ; CHECK-BE-NEXT: [[S_1:%.*]] = shl nuw nsw i64 [[Z_1]], 16 ; CHECK-BE-NEXT: [[X_1:%.*]] = or disjoint i64 [[S_1]], [[Z_0]] ; CHECK-BE-NEXT: [[V_2:%.*]] = extractelement <4 x i16> [[V]], i64 2 ; CHECK-BE-NEXT: [[Z_2:%.*]] = zext i16 [[V_2]] to i64 ; CHECK-BE-NEXT: [[S_2:%.*]] = shl nuw nsw i64 [[Z_2]], 32 ; CHECK-BE-NEXT: [[X_2:%.*]] = or disjoint i64 [[X_1]], [[S_2]] ; CHECK-BE-NEXT: [[V_3:%.*]] = extractelement <4 x i16> [[V]], i64 3 ; CHECK-BE-NEXT: [[Z_3:%.*]] = zext i16 [[V_3]] to i64 ; CHECK-BE-NEXT: [[S_3:%.*]] = shl nuw i64 [[Z_3]], 48 ; CHECK-BE-NEXT: [[X_3:%.*]] = or disjoint i64 [[X_2]], [[S_3]] ; CHECK-BE-NEXT: ret i64 [[X_3]] ; ; CHECK-LE-LABEL: define i64 @bitcast.v2i.le.i16( ; CHECK-LE-SAME: <4 x i16> [[V:%.*]]) { ; CHECK-LE-NEXT: [[X_3:%.*]] = bitcast <4 x i16> [[V]] to i64 ; CHECK-LE-NEXT: ret i64 [[X_3]] ; %v.0 = extractelement <4 x i16> %v, i64 0 %z.0 = zext i16 %v.0 to i64 %v.1 = extractelement <4 x i16> %v, i64 1 %z.1 = zext i16 %v.1 to i64 %s.1 = shl i64 %z.1, 16 %x.1 = or i64 %z.0, %s.1 %v.2 = extractelement <4 x i16> %v, i64 2 %z.2 = zext i16 %v.2 to i64 %s.2 = shl i64 %z.2, 32 %x.2 = or i64 %x.1, %s.2 %v.3 = extractelement <4 x i16> %v, i64 3 %z.3 = zext i16 %v.3 to i64 %s.3 = shl i64 %z.3, 48 %x.3 = or i64 %x.2, %s.3 ret i64 %x.3 } define i64 @bitcast.v2i.be.i16(<4 x i16> %v) { ; CHECK-BE-LABEL: define i64 @bitcast.v2i.be.i16( ; CHECK-BE-SAME: <4 x i16> [[V:%.*]]) { ; CHECK-BE-NEXT: [[X_3:%.*]] = bitcast <4 x i16> [[V]] to i64 ; CHECK-BE-NEXT: ret i64 [[X_3]] ; ; CHECK-LE-LABEL: define i64 @bitcast.v2i.be.i16( ; CHECK-LE-SAME: <4 x i16> [[V:%.*]]) { ; CHECK-LE-NEXT: [[V_0:%.*]] = extractelement <4 x i16> [[V]], i64 3 ; CHECK-LE-NEXT: [[Z_0:%.*]] = zext i16 [[V_0]] to i64 ; CHECK-LE-NEXT: [[V_1:%.*]] = extractelement <4 x i16> [[V]], i64 2 ; CHECK-LE-NEXT: [[Z_1:%.*]] = zext i16 [[V_1]] to i64 ; CHECK-LE-NEXT: [[S_1:%.*]] = shl nuw nsw i64 [[Z_1]], 16 ; CHECK-LE-NEXT: [[X_1:%.*]] = or disjoint i64 [[S_1]], [[Z_0]] ; CHECK-LE-NEXT: [[V_2:%.*]] = extractelement <4 x i16> [[V]], i64 1 ; CHECK-LE-NEXT: [[Z_2:%.*]] = zext i16 [[V_2]] to i64 ; CHECK-LE-NEXT: [[S_2:%.*]] = shl nuw nsw i64 [[Z_2]], 32 ; CHECK-LE-NEXT: [[X_2:%.*]] = or disjoint i64 [[X_1]], [[S_2]] ; CHECK-LE-NEXT: [[V_3:%.*]] = extractelement <4 x i16> [[V]], i64 0 ; CHECK-LE-NEXT: [[Z_3:%.*]] = zext i16 [[V_3]] to i64 ; CHECK-LE-NEXT: [[S_3:%.*]] = shl nuw i64 [[Z_3]], 48 ; CHECK-LE-NEXT: [[X_3:%.*]] = or disjoint i64 [[X_2]], [[S_3]] ; CHECK-LE-NEXT: ret i64 [[X_3]] ; %v.0 = extractelement <4 x i16> %v, i64 3 %z.0 = zext i16 %v.0 to i64 %v.1 = extractelement <4 x i16> %v, i64 2 %z.1 = zext i16 %v.1 to i64 %s.1 = shl i64 %z.1, 16 %x.1 = or i64 %z.0, %s.1 %v.2 = extractelement <4 x i16> %v, i64 1 %z.2 = zext i16 %v.2 to i64 %s.2 = shl i64 %z.2, 32 %x.2 = or i64 %x.1, %s.2 %v.3 = extractelement <4 x i16> %v, i64 0 %z.3 = zext i16 %v.3 to i64 %s.3 = shl i64 %z.3, 48 %x.3 = or i64 %x.2, %s.3 ret i64 %x.3 } define i32 @bitcast.v2i.le.tree(<4 x i8> %v) { ; CHECK-BE-LABEL: define i32 @bitcast.v2i.le.tree( ; CHECK-BE-SAME: <4 x i8> [[V:%.*]]) { ; CHECK-BE-NEXT: [[V_0:%.*]] = extractelement <4 x i8> [[V]], i64 0 ; CHECK-BE-NEXT: [[Z_0:%.*]] = zext i8 [[V_0]] to i32 ; CHECK-BE-NEXT: [[V_1:%.*]] = extractelement <4 x i8> [[V]], i64 1 ; CHECK-BE-NEXT: [[Z_1:%.*]] = zext i8 [[V_1]] to i32 ; CHECK-BE-NEXT: [[S_1:%.*]] = shl nuw nsw i32 [[Z_1]], 8 ; CHECK-BE-NEXT: [[X_1:%.*]] = or disjoint i32 [[S_1]], [[Z_0]] ; CHECK-BE-NEXT: [[V_2:%.*]] = extractelement <4 x i8> [[V]], i64 2 ; CHECK-BE-NEXT: [[Z_2:%.*]] = zext i8 [[V_2]] to i32 ; CHECK-BE-NEXT: [[S_2:%.*]] = shl nuw nsw i32 [[Z_2]], 16 ; CHECK-BE-NEXT: [[V_3:%.*]] = extractelement <4 x i8> [[V]], i64 3 ; CHECK-BE-NEXT: [[Z_3:%.*]] = zext i8 [[V_3]] to i32 ; CHECK-BE-NEXT: [[S_3:%.*]] = shl nuw i32 [[Z_3]], 24 ; CHECK-BE-NEXT: [[X_3:%.*]] = or disjoint i32 [[S_2]], [[S_3]] ; CHECK-BE-NEXT: [[X:%.*]] = or disjoint i32 [[X_1]], [[X_3]] ; CHECK-BE-NEXT: ret i32 [[X]] ; ; CHECK-LE-LABEL: define i32 @bitcast.v2i.le.tree( ; CHECK-LE-SAME: <4 x i8> [[V:%.*]]) { ; CHECK-LE-NEXT: [[X:%.*]] = bitcast <4 x i8> [[V]] to i32 ; CHECK-LE-NEXT: ret i32 [[X]] ; %v.0 = extractelement <4 x i8> %v, i64 0 %z.0 = zext i8 %v.0 to i32 %v.1 = extractelement <4 x i8> %v, i64 1 %z.1 = zext i8 %v.1 to i32 %s.1 = shl i32 %z.1, 8 %x.1 = or i32 %z.0, %s.1 %v.2 = extractelement <4 x i8> %v, i64 2 %z.2 = zext i8 %v.2 to i32 %s.2 = shl i32 %z.2, 16 %v.3 = extractelement <4 x i8> %v, i64 3 %z.3 = zext i8 %v.3 to i32 %s.3 = shl i32 %z.3, 24 %x.3 = or i32 %s.2, %s.3 %x = or i32 %x.1, %x.3 ret i32 %x } define i32 @bitcast.v2i.be.tree(<4 x i8> %v) { ; CHECK-BE-LABEL: define i32 @bitcast.v2i.be.tree( ; CHECK-BE-SAME: <4 x i8> [[V:%.*]]) { ; CHECK-BE-NEXT: [[X:%.*]] = bitcast <4 x i8> [[V]] to i32 ; CHECK-BE-NEXT: ret i32 [[X]] ; ; CHECK-LE-LABEL: define i32 @bitcast.v2i.be.tree( ; CHECK-LE-SAME: <4 x i8> [[V:%.*]]) { ; CHECK-LE-NEXT: [[V_0:%.*]] = extractelement <4 x i8> [[V]], i64 3 ; CHECK-LE-NEXT: [[Z_0:%.*]] = zext i8 [[V_0]] to i32 ; CHECK-LE-NEXT: [[V_1:%.*]] = extractelement <4 x i8> [[V]], i64 2 ; CHECK-LE-NEXT: [[Z_1:%.*]] = zext i8 [[V_1]] to i32 ; CHECK-LE-NEXT: [[S_1:%.*]] = shl nuw nsw i32 [[Z_1]], 8 ; CHECK-LE-NEXT: [[X_1:%.*]] = or disjoint i32 [[S_1]], [[Z_0]] ; CHECK-LE-NEXT: [[V_2:%.*]] = extractelement <4 x i8> [[V]], i64 1 ; CHECK-LE-NEXT: [[Z_2:%.*]] = zext i8 [[V_2]] to i32 ; CHECK-LE-NEXT: [[S_2:%.*]] = shl nuw nsw i32 [[Z_2]], 16 ; CHECK-LE-NEXT: [[V_3:%.*]] = extractelement <4 x i8> [[V]], i64 0 ; CHECK-LE-NEXT: [[Z_3:%.*]] = zext i8 [[V_3]] to i32 ; CHECK-LE-NEXT: [[S_3:%.*]] = shl nuw i32 [[Z_3]], 24 ; CHECK-LE-NEXT: [[X_3:%.*]] = or disjoint i32 [[S_2]], [[S_3]] ; CHECK-LE-NEXT: [[X:%.*]] = or disjoint i32 [[X_1]], [[X_3]] ; CHECK-LE-NEXT: ret i32 [[X]] ; %v.0 = extractelement <4 x i8> %v, i64 3 %z.0 = zext i8 %v.0 to i32 %v.1 = extractelement <4 x i8> %v, i64 2 %z.1 = zext i8 %v.1 to i32 %s.1 = shl i32 %z.1, 8 %x.1 = or i32 %z.0, %s.1 %v.2 = extractelement <4 x i8> %v, i64 1 %z.2 = zext i8 %v.2 to i32 %s.2 = shl i32 %z.2, 16 %v.3 = extractelement <4 x i8> %v, i64 0 %z.3 = zext i8 %v.3 to i32 %s.3 = shl i32 %z.3, 24 %x.3 = or i32 %s.2, %s.3 %x = or i32 %x.1, %x.3 ret i32 %x } define i64 @bitcast.v2i.le.tree.i16(<4 x i16> %v) { ; CHECK-BE-LABEL: define i64 @bitcast.v2i.le.tree.i16( ; CHECK-BE-SAME: <4 x i16> [[V:%.*]]) { ; CHECK-BE-NEXT: [[V_0:%.*]] = extractelement <4 x i16> [[V]], i64 0 ; CHECK-BE-NEXT: [[Z_0:%.*]] = zext i16 [[V_0]] to i64 ; CHECK-BE-NEXT: [[V_1:%.*]] = extractelement <4 x i16> [[V]], i64 1 ; CHECK-BE-NEXT: [[Z_1:%.*]] = zext i16 [[V_1]] to i64 ; CHECK-BE-NEXT: [[S_1:%.*]] = shl nuw nsw i64 [[Z_1]], 16 ; CHECK-BE-NEXT: [[X_1:%.*]] = or disjoint i64 [[S_1]], [[Z_0]] ; CHECK-BE-NEXT: [[V_2:%.*]] = extractelement <4 x i16> [[V]], i64 2 ; CHECK-BE-NEXT: [[Z_2:%.*]] = zext i16 [[V_2]] to i64 ; CHECK-BE-NEXT: [[S_2:%.*]] = shl nuw nsw i64 [[Z_2]], 32 ; CHECK-BE-NEXT: [[V_3:%.*]] = extractelement <4 x i16> [[V]], i64 3 ; CHECK-BE-NEXT: [[Z_3:%.*]] = zext i16 [[V_3]] to i64 ; CHECK-BE-NEXT: [[S_3:%.*]] = shl nuw i64 [[Z_3]], 48 ; CHECK-BE-NEXT: [[X_3:%.*]] = or disjoint i64 [[S_2]], [[S_3]] ; CHECK-BE-NEXT: [[X:%.*]] = or disjoint i64 [[X_1]], [[X_3]] ; CHECK-BE-NEXT: ret i64 [[X]] ; ; CHECK-LE-LABEL: define i64 @bitcast.v2i.le.tree.i16( ; CHECK-LE-SAME: <4 x i16> [[V:%.*]]) { ; CHECK-LE-NEXT: [[X:%.*]] = bitcast <4 x i16> [[V]] to i64 ; CHECK-LE-NEXT: ret i64 [[X]] ; %v.0 = extractelement <4 x i16> %v, i64 0 %z.0 = zext i16 %v.0 to i64 %v.1 = extractelement <4 x i16> %v, i64 1 %z.1 = zext i16 %v.1 to i64 %s.1 = shl i64 %z.1, 16 %x.1 = or i64 %z.0, %s.1 %v.2 = extractelement <4 x i16> %v, i64 2 %z.2 = zext i16 %v.2 to i64 %s.2 = shl i64 %z.2, 32 %v.3 = extractelement <4 x i16> %v, i64 3 %z.3 = zext i16 %v.3 to i64 %s.3 = shl i64 %z.3, 48 %x.3 = or i64 %s.2, %s.3 %x = or i64 %x.1, %x.3 ret i64 %x } define i64 @bitcast.v2i.be.tree.i16(<4 x i16> %v) { ; CHECK-BE-LABEL: define i64 @bitcast.v2i.be.tree.i16( ; CHECK-BE-SAME: <4 x i16> [[V:%.*]]) { ; CHECK-BE-NEXT: [[X:%.*]] = bitcast <4 x i16> [[V]] to i64 ; CHECK-BE-NEXT: ret i64 [[X]] ; ; CHECK-LE-LABEL: define i64 @bitcast.v2i.be.tree.i16( ; CHECK-LE-SAME: <4 x i16> [[V:%.*]]) { ; CHECK-LE-NEXT: [[V_0:%.*]] = extractelement <4 x i16> [[V]], i64 3 ; CHECK-LE-NEXT: [[Z_0:%.*]] = zext i16 [[V_0]] to i64 ; CHECK-LE-NEXT: [[V_1:%.*]] = extractelement <4 x i16> [[V]], i64 2 ; CHECK-LE-NEXT: [[Z_1:%.*]] = zext i16 [[V_1]] to i64 ; CHECK-LE-NEXT: [[S_1:%.*]] = shl nuw nsw i64 [[Z_1]], 16 ; CHECK-LE-NEXT: [[X_1:%.*]] = or disjoint i64 [[S_1]], [[Z_0]] ; CHECK-LE-NEXT: [[V_2:%.*]] = extractelement <4 x i16> [[V]], i64 1 ; CHECK-LE-NEXT: [[Z_2:%.*]] = zext i16 [[V_2]] to i64 ; CHECK-LE-NEXT: [[S_2:%.*]] = shl nuw nsw i64 [[Z_2]], 32 ; CHECK-LE-NEXT: [[V_3:%.*]] = extractelement <4 x i16> [[V]], i64 0 ; CHECK-LE-NEXT: [[Z_3:%.*]] = zext i16 [[V_3]] to i64 ; CHECK-LE-NEXT: [[S_3:%.*]] = shl nuw i64 [[Z_3]], 48 ; CHECK-LE-NEXT: [[X_3:%.*]] = or disjoint i64 [[S_2]], [[S_3]] ; CHECK-LE-NEXT: [[X:%.*]] = or disjoint i64 [[X_1]], [[X_3]] ; CHECK-LE-NEXT: ret i64 [[X]] ; %v.0 = extractelement <4 x i16> %v, i64 3 %z.0 = zext i16 %v.0 to i64 %v.1 = extractelement <4 x i16> %v, i64 2 %z.1 = zext i16 %v.1 to i64 %s.1 = shl i64 %z.1, 16 %x.1 = or i64 %z.0, %s.1 %v.2 = extractelement <4 x i16> %v, i64 1 %z.2 = zext i16 %v.2 to i64 %s.2 = shl i64 %z.2, 32 %v.3 = extractelement <4 x i16> %v, i64 0 %z.3 = zext i16 %v.3 to i64 %s.3 = shl i64 %z.3, 48 %x.3 = or i64 %s.2, %s.3 %x = or i64 %x.1, %x.3 ret i64 %x } define i32 @extract.le.i32(<8 x i8> %v) { ; CHECK-BE-LABEL: define i32 @extract.le.i32( ; CHECK-BE-SAME: <8 x i8> [[V:%.*]]) { ; CHECK-BE-NEXT: [[V_0:%.*]] = extractelement <8 x i8> [[V]], i64 3 ; CHECK-BE-NEXT: [[Z_0:%.*]] = zext i8 [[V_0]] to i32 ; CHECK-BE-NEXT: [[V_1:%.*]] = extractelement <8 x i8> [[V]], i64 4 ; CHECK-BE-NEXT: [[Z_1:%.*]] = zext i8 [[V_1]] to i32 ; CHECK-BE-NEXT: [[S_1:%.*]] = shl nuw nsw i32 [[Z_1]], 8 ; CHECK-BE-NEXT: [[X_1:%.*]] = or disjoint i32 [[S_1]], [[Z_0]] ; CHECK-BE-NEXT: [[V_2:%.*]] = extractelement <8 x i8> [[V]], i64 5 ; CHECK-BE-NEXT: [[Z_2:%.*]] = zext i8 [[V_2]] to i32 ; CHECK-BE-NEXT: [[S_2:%.*]] = shl nuw nsw i32 [[Z_2]], 16 ; CHECK-BE-NEXT: [[X_2:%.*]] = or disjoint i32 [[X_1]], [[S_2]] ; CHECK-BE-NEXT: [[V_3:%.*]] = extractelement <8 x i8> [[V]], i64 6 ; CHECK-BE-NEXT: [[Z_3:%.*]] = zext i8 [[V_3]] to i32 ; CHECK-BE-NEXT: [[S_3:%.*]] = shl nuw i32 [[Z_3]], 24 ; CHECK-BE-NEXT: [[X_3:%.*]] = or disjoint i32 [[X_2]], [[S_3]] ; CHECK-BE-NEXT: ret i32 [[X_3]] ; ; CHECK-LE-LABEL: define i32 @extract.le.i32( ; CHECK-LE-SAME: <8 x i8> [[V:%.*]]) { ; CHECK-LE-NEXT: [[X_3_V_EXTRACT:%.*]] = shufflevector <8 x i8> [[V]], <8 x i8> poison, <8 x i32> ; CHECK-LE-NEXT: [[X_3_V_BC:%.*]] = bitcast <8 x i8> [[X_3_V_EXTRACT]] to <2 x i32> ; CHECK-LE-NEXT: [[X_3_V_EXTRACT1:%.*]] = extractelement <2 x i32> [[X_3_V_BC]], i64 0 ; CHECK-LE-NEXT: ret i32 [[X_3_V_EXTRACT1]] ; %v.0 = extractelement <8 x i8> %v, i64 3 %z.0 = zext i8 %v.0 to i32 %v.1 = extractelement <8 x i8> %v, i64 4 %z.1 = zext i8 %v.1 to i32 %s.1 = shl i32 %z.1, 8 %x.1 = or i32 %z.0, %s.1 %v.2 = extractelement <8 x i8> %v, i64 5 %z.2 = zext i8 %v.2 to i32 %s.2 = shl i32 %z.2, 16 %x.2 = or i32 %x.1, %s.2 %v.3 = extractelement <8 x i8> %v, i64 6 %z.3 = zext i8 %v.3 to i32 %s.3 = shl i32 %z.3, 24 %x.3 = or i32 %x.2, %s.3 ret i32 %x.3 } define i32 @extract.be.i32(<8 x i8> %v) { ; CHECK-BE-LABEL: define i32 @extract.be.i32( ; CHECK-BE-SAME: <8 x i8> [[V:%.*]]) { ; CHECK-BE-NEXT: [[X_3_V_EXTRACT:%.*]] = shufflevector <8 x i8> [[V]], <8 x i8> poison, <8 x i32> ; CHECK-BE-NEXT: [[X_3_V_BC:%.*]] = bitcast <8 x i8> [[X_3_V_EXTRACT]] to <2 x i32> ; CHECK-BE-NEXT: [[X_3_V_EXTRACT1:%.*]] = extractelement <2 x i32> [[X_3_V_BC]], i64 0 ; CHECK-BE-NEXT: ret i32 [[X_3_V_EXTRACT1]] ; ; CHECK-LE-LABEL: define i32 @extract.be.i32( ; CHECK-LE-SAME: <8 x i8> [[V:%.*]]) { ; CHECK-LE-NEXT: [[V_0:%.*]] = extractelement <8 x i8> [[V]], i64 6 ; CHECK-LE-NEXT: [[Z_0:%.*]] = zext i8 [[V_0]] to i32 ; CHECK-LE-NEXT: [[V_1:%.*]] = extractelement <8 x i8> [[V]], i64 5 ; CHECK-LE-NEXT: [[Z_1:%.*]] = zext i8 [[V_1]] to i32 ; CHECK-LE-NEXT: [[S_1:%.*]] = shl nuw nsw i32 [[Z_1]], 8 ; CHECK-LE-NEXT: [[X_1:%.*]] = or disjoint i32 [[S_1]], [[Z_0]] ; CHECK-LE-NEXT: [[V_2:%.*]] = extractelement <8 x i8> [[V]], i64 4 ; CHECK-LE-NEXT: [[Z_2:%.*]] = zext i8 [[V_2]] to i32 ; CHECK-LE-NEXT: [[S_2:%.*]] = shl nuw nsw i32 [[Z_2]], 16 ; CHECK-LE-NEXT: [[X_2:%.*]] = or disjoint i32 [[X_1]], [[S_2]] ; CHECK-LE-NEXT: [[V_3:%.*]] = extractelement <8 x i8> [[V]], i64 3 ; CHECK-LE-NEXT: [[Z_3:%.*]] = zext i8 [[V_3]] to i32 ; CHECK-LE-NEXT: [[S_3:%.*]] = shl nuw i32 [[Z_3]], 24 ; CHECK-LE-NEXT: [[X_3:%.*]] = or disjoint i32 [[X_2]], [[S_3]] ; CHECK-LE-NEXT: ret i32 [[X_3]] ; %v.0 = extractelement <8 x i8> %v, i64 6 %z.0 = zext i8 %v.0 to i32 %v.1 = extractelement <8 x i8> %v, i64 5 %z.1 = zext i8 %v.1 to i32 %s.1 = shl i32 %z.1, 8 %x.1 = or i32 %z.0, %s.1 %v.2 = extractelement <8 x i8> %v, i64 4 %z.2 = zext i8 %v.2 to i32 %s.2 = shl i32 %z.2, 16 %x.2 = or i32 %x.1, %s.2 %v.3 = extractelement <8 x i8> %v, i64 3 %z.3 = zext i8 %v.3 to i32 %s.3 = shl i32 %z.3, 24 %x.3 = or i32 %x.2, %s.3 ret i32 %x.3 } define i64 @extract.le.i64(<8 x i16> %v) { ; CHECK-BE-LABEL: define i64 @extract.le.i64( ; CHECK-BE-SAME: <8 x i16> [[V:%.*]]) { ; CHECK-BE-NEXT: [[V_0:%.*]] = extractelement <8 x i16> [[V]], i64 3 ; CHECK-BE-NEXT: [[Z_0:%.*]] = zext i16 [[V_0]] to i64 ; CHECK-BE-NEXT: [[V_1:%.*]] = extractelement <8 x i16> [[V]], i64 4 ; CHECK-BE-NEXT: [[Z_1:%.*]] = zext i16 [[V_1]] to i64 ; CHECK-BE-NEXT: [[S_1:%.*]] = shl nuw nsw i64 [[Z_1]], 16 ; CHECK-BE-NEXT: [[X_1:%.*]] = or disjoint i64 [[S_1]], [[Z_0]] ; CHECK-BE-NEXT: [[V_2:%.*]] = extractelement <8 x i16> [[V]], i64 5 ; CHECK-BE-NEXT: [[Z_2:%.*]] = zext i16 [[V_2]] to i64 ; CHECK-BE-NEXT: [[S_2:%.*]] = shl nuw nsw i64 [[Z_2]], 32 ; CHECK-BE-NEXT: [[X_2:%.*]] = or disjoint i64 [[X_1]], [[S_2]] ; CHECK-BE-NEXT: [[V_3:%.*]] = extractelement <8 x i16> [[V]], i64 6 ; CHECK-BE-NEXT: [[Z_3:%.*]] = zext i16 [[V_3]] to i64 ; CHECK-BE-NEXT: [[S_3:%.*]] = shl nuw i64 [[Z_3]], 48 ; CHECK-BE-NEXT: [[X_3:%.*]] = or disjoint i64 [[X_2]], [[S_3]] ; CHECK-BE-NEXT: ret i64 [[X_3]] ; ; CHECK-LE-LABEL: define i64 @extract.le.i64( ; CHECK-LE-SAME: <8 x i16> [[V:%.*]]) { ; CHECK-LE-NEXT: [[X_3_V_EXTRACT:%.*]] = shufflevector <8 x i16> [[V]], <8 x i16> poison, <8 x i32> ; CHECK-LE-NEXT: [[X_3_V_BC:%.*]] = bitcast <8 x i16> [[X_3_V_EXTRACT]] to <2 x i64> ; CHECK-LE-NEXT: [[X_3_V_EXTRACT1:%.*]] = extractelement <2 x i64> [[X_3_V_BC]], i64 0 ; CHECK-LE-NEXT: ret i64 [[X_3_V_EXTRACT1]] ; %v.0 = extractelement <8 x i16> %v, i64 3 %z.0 = zext i16 %v.0 to i64 %v.1 = extractelement <8 x i16> %v, i64 4 %z.1 = zext i16 %v.1 to i64 %s.1 = shl i64 %z.1, 16 %x.1 = or i64 %z.0, %s.1 %v.2 = extractelement <8 x i16> %v, i64 5 %z.2 = zext i16 %v.2 to i64 %s.2 = shl i64 %z.2, 32 %x.2 = or i64 %x.1, %s.2 %v.3 = extractelement <8 x i16> %v, i64 6 %z.3 = zext i16 %v.3 to i64 %s.3 = shl i64 %z.3, 48 %x.3 = or i64 %x.2, %s.3 ret i64 %x.3 } define i64 @extract.be.i64(<8 x i16> %v) { ; CHECK-BE-LABEL: define i64 @extract.be.i64( ; CHECK-BE-SAME: <8 x i16> [[V:%.*]]) { ; CHECK-BE-NEXT: [[X_3_V_EXTRACT:%.*]] = shufflevector <8 x i16> [[V]], <8 x i16> poison, <8 x i32> ; CHECK-BE-NEXT: [[X_3_V_BC:%.*]] = bitcast <8 x i16> [[X_3_V_EXTRACT]] to <2 x i64> ; CHECK-BE-NEXT: [[X_3_V_EXTRACT1:%.*]] = extractelement <2 x i64> [[X_3_V_BC]], i64 0 ; CHECK-BE-NEXT: ret i64 [[X_3_V_EXTRACT1]] ; ; CHECK-LE-LABEL: define i64 @extract.be.i64( ; CHECK-LE-SAME: <8 x i16> [[V:%.*]]) { ; CHECK-LE-NEXT: [[V_0:%.*]] = extractelement <8 x i16> [[V]], i64 6 ; CHECK-LE-NEXT: [[Z_0:%.*]] = zext i16 [[V_0]] to i64 ; CHECK-LE-NEXT: [[V_1:%.*]] = extractelement <8 x i16> [[V]], i64 5 ; CHECK-LE-NEXT: [[Z_1:%.*]] = zext i16 [[V_1]] to i64 ; CHECK-LE-NEXT: [[S_1:%.*]] = shl nuw nsw i64 [[Z_1]], 16 ; CHECK-LE-NEXT: [[X_1:%.*]] = or disjoint i64 [[S_1]], [[Z_0]] ; CHECK-LE-NEXT: [[V_2:%.*]] = extractelement <8 x i16> [[V]], i64 4 ; CHECK-LE-NEXT: [[Z_2:%.*]] = zext i16 [[V_2]] to i64 ; CHECK-LE-NEXT: [[S_2:%.*]] = shl nuw nsw i64 [[Z_2]], 32 ; CHECK-LE-NEXT: [[X_2:%.*]] = or disjoint i64 [[X_1]], [[S_2]] ; CHECK-LE-NEXT: [[V_3:%.*]] = extractelement <8 x i16> [[V]], i64 3 ; CHECK-LE-NEXT: [[Z_3:%.*]] = zext i16 [[V_3]] to i64 ; CHECK-LE-NEXT: [[S_3:%.*]] = shl nuw i64 [[Z_3]], 48 ; CHECK-LE-NEXT: [[X_3:%.*]] = or disjoint i64 [[X_2]], [[S_3]] ; CHECK-LE-NEXT: ret i64 [[X_3]] ; %v.0 = extractelement <8 x i16> %v, i64 6 %z.0 = zext i16 %v.0 to i64 %v.1 = extractelement <8 x i16> %v, i64 5 %z.1 = zext i16 %v.1 to i64 %s.1 = shl i64 %z.1, 16 %x.1 = or i64 %z.0, %s.1 %v.2 = extractelement <8 x i16> %v, i64 4 %z.2 = zext i16 %v.2 to i64 %s.2 = shl i64 %z.2, 32 %x.2 = or i64 %x.1, %s.2 %v.3 = extractelement <8 x i16> %v, i64 3 %z.3 = zext i16 %v.3 to i64 %s.3 = shl i64 %z.3, 48 %x.3 = or i64 %x.2, %s.3 ret i64 %x.3 } define i32 @partial.le(<4 x i8> %v) { ; CHECK-BE-LABEL: define i32 @partial.le( ; CHECK-BE-SAME: <4 x i8> [[V:%.*]]) { ; CHECK-BE-NEXT: [[V_0:%.*]] = extractelement <4 x i8> [[V]], i64 0 ; CHECK-BE-NEXT: [[Z_0:%.*]] = zext i8 [[V_0]] to i32 ; CHECK-BE-NEXT: [[V_1:%.*]] = extractelement <4 x i8> [[V]], i64 1 ; CHECK-BE-NEXT: [[Z_1:%.*]] = zext i8 [[V_1]] to i32 ; CHECK-BE-NEXT: [[S_1:%.*]] = shl nuw nsw i32 [[Z_1]], 8 ; CHECK-BE-NEXT: [[X_1:%.*]] = or disjoint i32 [[S_1]], [[Z_0]] ; CHECK-BE-NEXT: [[V_3:%.*]] = extractelement <4 x i8> [[V]], i64 3 ; CHECK-BE-NEXT: [[Z_3:%.*]] = zext i8 [[V_3]] to i32 ; CHECK-BE-NEXT: [[S_3:%.*]] = shl nuw i32 [[Z_3]], 24 ; CHECK-BE-NEXT: [[X_3:%.*]] = or disjoint i32 [[X_1]], [[S_3]] ; CHECK-BE-NEXT: ret i32 [[X_3]] ; ; CHECK-LE-LABEL: define i32 @partial.le( ; CHECK-LE-SAME: <4 x i8> [[V:%.*]]) { ; CHECK-LE-NEXT: [[X_3_V1:%.*]] = insertelement <4 x i8> [[V]], i8 0, i64 2 ; CHECK-LE-NEXT: [[X_3:%.*]] = bitcast <4 x i8> [[X_3_V1]] to i32 ; CHECK-LE-NEXT: ret i32 [[X_3]] ; %v.0 = extractelement <4 x i8> %v, i64 0 %z.0 = zext i8 %v.0 to i32 %v.1 = extractelement <4 x i8> %v, i64 1 %z.1 = zext i8 %v.1 to i32 %s.1 = shl i32 %z.1, 8 %x.1 = or i32 %z.0, %s.1 %v.3 = extractelement <4 x i8> %v, i64 3 %z.3 = zext i8 %v.3 to i32 %s.3 = shl i32 %z.3, 24 %x.3 = or i32 %x.1, %s.3 ret i32 %x.3 } define i32 @partial.be(<4 x i8> %v) { ; CHECK-BE-LABEL: define i32 @partial.be( ; CHECK-BE-SAME: <4 x i8> [[V:%.*]]) { ; CHECK-BE-NEXT: [[X_3_V1:%.*]] = insertelement <4 x i8> [[V]], i8 0, i64 2 ; CHECK-BE-NEXT: [[X_3:%.*]] = bitcast <4 x i8> [[X_3_V1]] to i32 ; CHECK-BE-NEXT: ret i32 [[X_3]] ; ; CHECK-LE-LABEL: define i32 @partial.be( ; CHECK-LE-SAME: <4 x i8> [[V:%.*]]) { ; CHECK-LE-NEXT: [[V_0:%.*]] = extractelement <4 x i8> [[V]], i64 3 ; CHECK-LE-NEXT: [[Z_0:%.*]] = zext i8 [[V_0]] to i32 ; CHECK-LE-NEXT: [[V_1:%.*]] = extractelement <4 x i8> [[V]], i64 1 ; CHECK-LE-NEXT: [[Z_1:%.*]] = zext i8 [[V_1]] to i32 ; CHECK-LE-NEXT: [[S_1:%.*]] = shl nuw nsw i32 [[Z_1]], 16 ; CHECK-LE-NEXT: [[X_1:%.*]] = or disjoint i32 [[S_1]], [[Z_0]] ; CHECK-LE-NEXT: [[V_3:%.*]] = extractelement <4 x i8> [[V]], i64 0 ; CHECK-LE-NEXT: [[Z_3:%.*]] = zext i8 [[V_3]] to i32 ; CHECK-LE-NEXT: [[S_3:%.*]] = shl nuw i32 [[Z_3]], 24 ; CHECK-LE-NEXT: [[X_3:%.*]] = or disjoint i32 [[X_1]], [[S_3]] ; CHECK-LE-NEXT: ret i32 [[X_3]] ; %v.0 = extractelement <4 x i8> %v, i64 3 %z.0 = zext i8 %v.0 to i32 %v.1 = extractelement <4 x i8> %v, i64 1 %z.1 = zext i8 %v.1 to i32 %s.1 = shl i32 %z.1, 16 %x.1 = or i32 %z.0, %s.1 %v.3 = extractelement <4 x i8> %v, i64 0 %z.3 = zext i8 %v.3 to i32 %s.3 = shl i32 %z.3, 24 %x.3 = or i32 %x.1, %s.3 ret i32 %x.3 } define i64 @partial.le.i16(<4 x i16> %v) { ; CHECK-BE-LABEL: define i64 @partial.le.i16( ; CHECK-BE-SAME: <4 x i16> [[V:%.*]]) { ; CHECK-BE-NEXT: [[V_0:%.*]] = extractelement <4 x i16> [[V]], i64 0 ; CHECK-BE-NEXT: [[Z_0:%.*]] = zext i16 [[V_0]] to i64 ; CHECK-BE-NEXT: [[V_1:%.*]] = extractelement <4 x i16> [[V]], i64 1 ; CHECK-BE-NEXT: [[Z_1:%.*]] = zext i16 [[V_1]] to i64 ; CHECK-BE-NEXT: [[S_1:%.*]] = shl nuw nsw i64 [[Z_1]], 16 ; CHECK-BE-NEXT: [[X_1:%.*]] = or disjoint i64 [[S_1]], [[Z_0]] ; CHECK-BE-NEXT: [[V_3:%.*]] = extractelement <4 x i16> [[V]], i64 3 ; CHECK-BE-NEXT: [[Z_3:%.*]] = zext i16 [[V_3]] to i64 ; CHECK-BE-NEXT: [[S_3:%.*]] = shl nuw i64 [[Z_3]], 48 ; CHECK-BE-NEXT: [[X_3:%.*]] = or disjoint i64 [[X_1]], [[S_3]] ; CHECK-BE-NEXT: ret i64 [[X_3]] ; ; CHECK-LE-LABEL: define i64 @partial.le.i16( ; CHECK-LE-SAME: <4 x i16> [[V:%.*]]) { ; CHECK-LE-NEXT: [[X_3_V1:%.*]] = insertelement <4 x i16> [[V]], i16 0, i64 2 ; CHECK-LE-NEXT: [[X_3:%.*]] = bitcast <4 x i16> [[X_3_V1]] to i64 ; CHECK-LE-NEXT: ret i64 [[X_3]] ; %v.0 = extractelement <4 x i16> %v, i64 0 %z.0 = zext i16 %v.0 to i64 %v.1 = extractelement <4 x i16> %v, i64 1 %z.1 = zext i16 %v.1 to i64 %s.1 = shl i64 %z.1, 16 %x.1 = or i64 %z.0, %s.1 %v.3 = extractelement <4 x i16> %v, i64 3 %z.3 = zext i16 %v.3 to i64 %s.3 = shl i64 %z.3, 48 %x.3 = or i64 %x.1, %s.3 ret i64 %x.3 } define i64 @partial.be.i16(<4 x i16> %v) { ; CHECK-BE-LABEL: define i64 @partial.be.i16( ; CHECK-BE-SAME: <4 x i16> [[V:%.*]]) { ; CHECK-BE-NEXT: [[X_3_V1:%.*]] = insertelement <4 x i16> [[V]], i16 0, i64 2 ; CHECK-BE-NEXT: [[X_3:%.*]] = bitcast <4 x i16> [[X_3_V1]] to i64 ; CHECK-BE-NEXT: ret i64 [[X_3]] ; ; CHECK-LE-LABEL: define i64 @partial.be.i16( ; CHECK-LE-SAME: <4 x i16> [[V:%.*]]) { ; CHECK-LE-NEXT: [[V_0:%.*]] = extractelement <4 x i16> [[V]], i64 3 ; CHECK-LE-NEXT: [[Z_0:%.*]] = zext i16 [[V_0]] to i64 ; CHECK-LE-NEXT: [[V_1:%.*]] = extractelement <4 x i16> [[V]], i64 1 ; CHECK-LE-NEXT: [[Z_1:%.*]] = zext i16 [[V_1]] to i64 ; CHECK-LE-NEXT: [[S_1:%.*]] = shl nuw nsw i64 [[Z_1]], 32 ; CHECK-LE-NEXT: [[X_1:%.*]] = or disjoint i64 [[S_1]], [[Z_0]] ; CHECK-LE-NEXT: [[V_3:%.*]] = extractelement <4 x i16> [[V]], i64 0 ; CHECK-LE-NEXT: [[Z_3:%.*]] = zext i16 [[V_3]] to i64 ; CHECK-LE-NEXT: [[S_3:%.*]] = shl nuw i64 [[Z_3]], 48 ; CHECK-LE-NEXT: [[X_3:%.*]] = or disjoint i64 [[X_1]], [[S_3]] ; CHECK-LE-NEXT: ret i64 [[X_3]] ; %v.0 = extractelement <4 x i16> %v, i64 3 %z.0 = zext i16 %v.0 to i64 %v.1 = extractelement <4 x i16> %v, i64 1 %z.1 = zext i16 %v.1 to i64 %s.1 = shl i64 %z.1, 32 %x.1 = or i64 %z.0, %s.1 %v.3 = extractelement <4 x i16> %v, i64 0 %z.3 = zext i16 %v.3 to i64 %s.3 = shl i64 %z.3, 48 %x.3 = or i64 %x.1, %s.3 ret i64 %x.3 } define i32 @partial.extract.le.i32(<8 x i8> %v) { ; CHECK-BE-LABEL: define i32 @partial.extract.le.i32( ; CHECK-BE-SAME: <8 x i8> [[V:%.*]]) { ; CHECK-BE-NEXT: [[V_0:%.*]] = extractelement <8 x i8> [[V]], i64 3 ; CHECK-BE-NEXT: [[Z_0:%.*]] = zext i8 [[V_0]] to i32 ; CHECK-BE-NEXT: [[V_1:%.*]] = extractelement <8 x i8> [[V]], i64 4 ; CHECK-BE-NEXT: [[Z_1:%.*]] = zext i8 [[V_1]] to i32 ; CHECK-BE-NEXT: [[S_1:%.*]] = shl nuw nsw i32 [[Z_1]], 8 ; CHECK-BE-NEXT: [[X_1:%.*]] = or disjoint i32 [[S_1]], [[Z_0]] ; CHECK-BE-NEXT: [[V_3:%.*]] = extractelement <8 x i8> [[V]], i64 6 ; CHECK-BE-NEXT: [[Z_3:%.*]] = zext i8 [[V_3]] to i32 ; CHECK-BE-NEXT: [[S_3:%.*]] = shl nuw i32 [[Z_3]], 24 ; CHECK-BE-NEXT: [[X_3:%.*]] = or disjoint i32 [[X_1]], [[S_3]] ; CHECK-BE-NEXT: ret i32 [[X_3]] ; ; CHECK-LE-LABEL: define i32 @partial.extract.le.i32( ; CHECK-LE-SAME: <8 x i8> [[V:%.*]]) { ; CHECK-LE-NEXT: [[X_3_V:%.*]] = shufflevector <8 x i8> [[V]], <8 x i8> , <4 x i32> ; CHECK-LE-NEXT: [[X_3:%.*]] = bitcast <4 x i8> [[X_3_V]] to i32 ; CHECK-LE-NEXT: ret i32 [[X_3]] ; %v.0 = extractelement <8 x i8> %v, i64 3 %z.0 = zext i8 %v.0 to i32 %v.1 = extractelement <8 x i8> %v, i64 4 %z.1 = zext i8 %v.1 to i32 %s.1 = shl i32 %z.1, 8 %x.1 = or i32 %z.0, %s.1 %v.3 = extractelement <8 x i8> %v, i64 6 %z.3 = zext i8 %v.3 to i32 %s.3 = shl i32 %z.3, 24 %x.3 = or i32 %x.1, %s.3 ret i32 %x.3 } define i32 @partial.extract.be.i32(<8 x i8> %v) { ; CHECK-BE-LABEL: define i32 @partial.extract.be.i32( ; CHECK-BE-SAME: <8 x i8> [[V:%.*]]) { ; CHECK-BE-NEXT: [[X_3_V:%.*]] = shufflevector <8 x i8> [[V]], <8 x i8> , <4 x i32> ; CHECK-BE-NEXT: [[X_3:%.*]] = bitcast <4 x i8> [[X_3_V]] to i32 ; CHECK-BE-NEXT: ret i32 [[X_3]] ; ; CHECK-LE-LABEL: define i32 @partial.extract.be.i32( ; CHECK-LE-SAME: <8 x i8> [[V:%.*]]) { ; CHECK-LE-NEXT: [[V_0:%.*]] = extractelement <8 x i8> [[V]], i64 6 ; CHECK-LE-NEXT: [[Z_0:%.*]] = zext i8 [[V_0]] to i32 ; CHECK-LE-NEXT: [[V_2:%.*]] = extractelement <8 x i8> [[V]], i64 4 ; CHECK-LE-NEXT: [[Z_2:%.*]] = zext i8 [[V_2]] to i32 ; CHECK-LE-NEXT: [[S_2:%.*]] = shl nuw nsw i32 [[Z_2]], 16 ; CHECK-LE-NEXT: [[X_2:%.*]] = or disjoint i32 [[S_2]], [[Z_0]] ; CHECK-LE-NEXT: [[V_3:%.*]] = extractelement <8 x i8> [[V]], i64 3 ; CHECK-LE-NEXT: [[Z_3:%.*]] = zext i8 [[V_3]] to i32 ; CHECK-LE-NEXT: [[S_3:%.*]] = shl nuw i32 [[Z_3]], 24 ; CHECK-LE-NEXT: [[X_3:%.*]] = or disjoint i32 [[X_2]], [[S_3]] ; CHECK-LE-NEXT: ret i32 [[X_3]] ; %v.0 = extractelement <8 x i8> %v, i64 6 %z.0 = zext i8 %v.0 to i32 %v.2 = extractelement <8 x i8> %v, i64 4 %z.2 = zext i8 %v.2 to i32 %s.2 = shl i32 %z.2, 16 %x.2 = or i32 %z.0, %s.2 %v.3 = extractelement <8 x i8> %v, i64 3 %z.3 = zext i8 %v.3 to i32 %s.3 = shl i32 %z.3, 24 %x.3 = or i32 %x.2, %s.3 ret i32 %x.3 } define i64 @partial.extract.le.i64(<8 x i16> %v) { ; CHECK-BE-LABEL: define i64 @partial.extract.le.i64( ; CHECK-BE-SAME: <8 x i16> [[V:%.*]]) { ; CHECK-BE-NEXT: [[V_0:%.*]] = extractelement <8 x i16> [[V]], i64 3 ; CHECK-BE-NEXT: [[Z_0:%.*]] = zext i16 [[V_0]] to i64 ; CHECK-BE-NEXT: [[V_1:%.*]] = extractelement <8 x i16> [[V]], i64 4 ; CHECK-BE-NEXT: [[Z_1:%.*]] = zext i16 [[V_1]] to i64 ; CHECK-BE-NEXT: [[S_1:%.*]] = shl nuw nsw i64 [[Z_1]], 16 ; CHECK-BE-NEXT: [[X_1:%.*]] = or disjoint i64 [[S_1]], [[Z_0]] ; CHECK-BE-NEXT: [[V_2:%.*]] = extractelement <8 x i16> [[V]], i64 5 ; CHECK-BE-NEXT: [[Z_2:%.*]] = zext i16 [[V_2]] to i64 ; CHECK-BE-NEXT: [[S_2:%.*]] = shl nuw nsw i64 [[Z_2]], 32 ; CHECK-BE-NEXT: [[X_2:%.*]] = or disjoint i64 [[X_1]], [[S_2]] ; CHECK-BE-NEXT: [[V_3:%.*]] = extractelement <8 x i16> [[V]], i64 6 ; CHECK-BE-NEXT: [[Z_3:%.*]] = zext i16 [[V_3]] to i64 ; CHECK-BE-NEXT: [[S_3:%.*]] = shl nuw i64 [[Z_3]], 48 ; CHECK-BE-NEXT: [[X_3:%.*]] = or disjoint i64 [[X_2]], [[S_3]] ; CHECK-BE-NEXT: ret i64 [[X_3]] ; ; CHECK-LE-LABEL: define i64 @partial.extract.le.i64( ; CHECK-LE-SAME: <8 x i16> [[V:%.*]]) { ; CHECK-LE-NEXT: [[X_3_V_EXTRACT:%.*]] = shufflevector <8 x i16> [[V]], <8 x i16> poison, <8 x i32> ; CHECK-LE-NEXT: [[X_3_V_BC:%.*]] = bitcast <8 x i16> [[X_3_V_EXTRACT]] to <2 x i64> ; CHECK-LE-NEXT: [[X_3_V_EXTRACT1:%.*]] = extractelement <2 x i64> [[X_3_V_BC]], i64 0 ; CHECK-LE-NEXT: ret i64 [[X_3_V_EXTRACT1]] ; %v.0 = extractelement <8 x i16> %v, i64 3 %z.0 = zext i16 %v.0 to i64 %v.1 = extractelement <8 x i16> %v, i64 4 %z.1 = zext i16 %v.1 to i64 %s.1 = shl i64 %z.1, 16 %x.1 = or i64 %z.0, %s.1 %v.2 = extractelement <8 x i16> %v, i64 5 %z.2 = zext i16 %v.2 to i64 %s.2 = shl i64 %z.2, 32 %x.2 = or i64 %x.1, %s.2 %v.3 = extractelement <8 x i16> %v, i64 6 %z.3 = zext i16 %v.3 to i64 %s.3 = shl i64 %z.3, 48 %x.3 = or i64 %x.2, %s.3 ret i64 %x.3 } define i64 @partial.extract.be.i64(<8 x i16> %v) { ; CHECK-BE-LABEL: define i64 @partial.extract.be.i64( ; CHECK-BE-SAME: <8 x i16> [[V:%.*]]) { ; CHECK-BE-NEXT: [[X_3_V:%.*]] = shufflevector <8 x i16> [[V]], <8 x i16> , <4 x i32> ; CHECK-BE-NEXT: [[X_3:%.*]] = bitcast <4 x i16> [[X_3_V]] to i64 ; CHECK-BE-NEXT: ret i64 [[X_3]] ; ; CHECK-LE-LABEL: define i64 @partial.extract.be.i64( ; CHECK-LE-SAME: <8 x i16> [[V:%.*]]) { ; CHECK-LE-NEXT: [[V_0:%.*]] = extractelement <8 x i16> [[V]], i64 6 ; CHECK-LE-NEXT: [[Z_0:%.*]] = zext i16 [[V_0]] to i64 ; CHECK-LE-NEXT: [[V_2:%.*]] = extractelement <8 x i16> [[V]], i64 4 ; CHECK-LE-NEXT: [[Z_2:%.*]] = zext i16 [[V_2]] to i64 ; CHECK-LE-NEXT: [[S_2:%.*]] = shl nuw nsw i64 [[Z_2]], 32 ; CHECK-LE-NEXT: [[X_2:%.*]] = or disjoint i64 [[S_2]], [[Z_0]] ; CHECK-LE-NEXT: [[V_3:%.*]] = extractelement <8 x i16> [[V]], i64 3 ; CHECK-LE-NEXT: [[Z_3:%.*]] = zext i16 [[V_3]] to i64 ; CHECK-LE-NEXT: [[S_3:%.*]] = shl nuw i64 [[Z_3]], 48 ; CHECK-LE-NEXT: [[X_3:%.*]] = or disjoint i64 [[X_2]], [[S_3]] ; CHECK-LE-NEXT: ret i64 [[X_3]] ; %v.0 = extractelement <8 x i16> %v, i64 6 %z.0 = zext i16 %v.0 to i64 %v.2 = extractelement <8 x i16> %v, i64 4 %z.2 = zext i16 %v.2 to i64 %s.2 = shl i64 %z.2, 32 %x.2 = or i64 %z.0, %s.2 %v.3 = extractelement <8 x i16> %v, i64 3 %z.3 = zext i16 %v.3 to i64 %s.3 = shl i64 %z.3, 48 %x.3 = or i64 %x.2, %s.3 ret i64 %x.3 } define <2 x i16> @shufflecast.v2v(<4 x i8> %v) { ; CHECK-LABEL: define <2 x i16> @shufflecast.v2v( ; CHECK-SAME: <4 x i8> [[V:%.*]]) { ; CHECK-NEXT: [[W_3:%.*]] = bitcast <4 x i8> [[V]] to <2 x i16> ; CHECK-NEXT: ret <2 x i16> [[W_3]] ; %v.0 = shufflevector <4 x i8> %v, <4 x i8> zeroinitializer, <4 x i32> %c.0 = bitcast <4 x i8> %v.0 to <2 x i16> %v.1 = shufflevector <4 x i8> %v, <4 x i8> zeroinitializer, <4 x i32> %c.1 = bitcast <4 x i8> %v.1 to <2 x i16> %w.1 = or <2 x i16> %c.0, %c.1 %v.2 = shufflevector <4 x i8> %v, <4 x i8> zeroinitializer, <4 x i32> %c.2 = bitcast <4 x i8> %v.2 to <2 x i16> %w.2 = or <2 x i16> %w.1, %c.2 %v.3 = shufflevector <4 x i8> %v, <4 x i8> zeroinitializer, <4 x i32> %c.3 = bitcast <4 x i8> %v.3 to <2 x i16> %w.3 = or <2 x i16> %w.2, %c.3 ret <2 x i16> %w.3 } define <2 x i32> @shufflecast.v2v.i16(<4 x i16> %v) { ; CHECK-LABEL: define <2 x i32> @shufflecast.v2v.i16( ; CHECK-SAME: <4 x i16> [[V:%.*]]) { ; CHECK-NEXT: [[W_3:%.*]] = bitcast <4 x i16> [[V]] to <2 x i32> ; CHECK-NEXT: ret <2 x i32> [[W_3]] ; %v.0 = shufflevector <4 x i16> %v, <4 x i16> zeroinitializer, <4 x i32> %c.0 = bitcast <4 x i16> %v.0 to <2 x i32> %v.1 = shufflevector <4 x i16> %v, <4 x i16> zeroinitializer, <4 x i32> %c.1 = bitcast <4 x i16> %v.1 to <2 x i32> %w.1 = or <2 x i32> %c.0, %c.1 %v.2 = shufflevector <4 x i16> %v, <4 x i16> zeroinitializer, <4 x i32> %c.2 = bitcast <4 x i16> %v.2 to <2 x i32> %w.2 = or <2 x i32> %w.1, %c.2 %v.3 = shufflevector <4 x i16> %v, <4 x i16> zeroinitializer, <4 x i32> %c.3 = bitcast <4 x i16> %v.3 to <2 x i32> %w.3 = or <2 x i32> %w.2, %c.3 ret <2 x i32> %w.3 } define i32 @bitcast.v2i.half(<2 x half> %v) { ; CHECK-LABEL: define i32 @bitcast.v2i.half( ; CHECK-SAME: <2 x half> [[V:%.*]]) { ; CHECK-NEXT: [[X:%.*]] = bitcast <2 x half> [[V]] to i32 ; CHECK-NEXT: ret i32 [[X]] ; %v.0 = insertelement <2 x half> %v, half 0.0, i64 1 %x.0 = bitcast <2 x half> %v.0 to i32 %v.1 = insertelement <2 x half> %v, half 0.0, i64 0 %x.1 = bitcast <2 x half> %v.1 to i32 %x = or i32 %x.0, %x.1 ret i32 %x }