Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1414)

Unified Diff: test/Transforms/NaCl/vector-canonicalization-extracts.ll

Issue 1423873002: PNaCl: Add a vector type legalization pass. Base URL: https://chromium.googlesource.com/native_client/pnacl-llvm.git@master
Patch Set: Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: test/Transforms/NaCl/vector-canonicalization-extracts.ll
diff --git a/test/Transforms/NaCl/vector-canonicalization-extracts.ll b/test/Transforms/NaCl/vector-canonicalization-extracts.ll
new file mode 100644
index 0000000000000000000000000000000000000000..9f41f4bb22d1f77183818fdc1525a234c136c264
--- /dev/null
+++ b/test/Transforms/NaCl/vector-canonicalization-extracts.ll
@@ -0,0 +1,7447 @@
+; RUN: opt -S -pnacl-vector-canonicalization %s | FileCheck %s
+
+; Auto-generated tests for extractelement instructions.
+
+target datalayout = "e-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-p:32:32:32-v128:32:128"
+
+define i8 @extract_2xi8_at_0(<2 x i8>) {
+entry:
+ %1 = extractelement <2 x i8> %0, i32 0
+ ret i8 %1
+}
+; CHECK-LABEL: define i8 @extract_2xi8_at_0(<16 x i8>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <16 x i8> %0, i32 0
+; CHECK-NEXT: ret i8 %1
+; CHECK-NEXT: }
+
+define i8 @extract_2xi8_at_1(<2 x i8>) {
+entry:
+ %1 = extractelement <2 x i8> %0, i32 1
+ ret i8 %1
+}
+; CHECK-LABEL: define i8 @extract_2xi8_at_1(<16 x i8>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <16 x i8> %0, i32 1
+; CHECK-NEXT: ret i8 %1
+; CHECK-NEXT: }
+
+define i8 @extract_2xi8_undef_idx(<2 x i8>) {
+entry:
+ %1 = extractelement <2 x i8> %0, i32 2
+ ret i8 %1
+}
+; CHECK-LABEL: define i8 @extract_2xi8_undef_idx(<16 x i8>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <16 x i8> %0, i32 2
+; CHECK-NEXT: ret i8 %1
+; CHECK-NEXT: }
+
+define i16 @extract_2xi16_at_0(<2 x i16>) {
+entry:
+ %1 = extractelement <2 x i16> %0, i32 0
+ ret i16 %1
+}
+; CHECK-LABEL: define i16 @extract_2xi16_at_0(<8 x i16>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <8 x i16> %0, i32 0
+; CHECK-NEXT: ret i16 %1
+; CHECK-NEXT: }
+
+define i16 @extract_2xi16_at_1(<2 x i16>) {
+entry:
+ %1 = extractelement <2 x i16> %0, i32 1
+ ret i16 %1
+}
+; CHECK-LABEL: define i16 @extract_2xi16_at_1(<8 x i16>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <8 x i16> %0, i32 1
+; CHECK-NEXT: ret i16 %1
+; CHECK-NEXT: }
+
+define i16 @extract_2xi16_undef_idx(<2 x i16>) {
+entry:
+ %1 = extractelement <2 x i16> %0, i32 2
+ ret i16 %1
+}
+; CHECK-LABEL: define i16 @extract_2xi16_undef_idx(<8 x i16>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <8 x i16> %0, i32 2
+; CHECK-NEXT: ret i16 %1
+; CHECK-NEXT: }
+
+define i32 @extract_2xi32_at_0(<2 x i32>) {
+entry:
+ %1 = extractelement <2 x i32> %0, i32 0
+ ret i32 %1
+}
+; CHECK-LABEL: define i32 @extract_2xi32_at_0(<4 x i32>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <4 x i32> %0, i32 0
+; CHECK-NEXT: ret i32 %1
+; CHECK-NEXT: }
+
+define i32 @extract_2xi32_at_1(<2 x i32>) {
+entry:
+ %1 = extractelement <2 x i32> %0, i32 1
+ ret i32 %1
+}
+; CHECK-LABEL: define i32 @extract_2xi32_at_1(<4 x i32>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <4 x i32> %0, i32 1
+; CHECK-NEXT: ret i32 %1
+; CHECK-NEXT: }
+
+define i32 @extract_2xi32_undef_idx(<2 x i32>) {
+entry:
+ %1 = extractelement <2 x i32> %0, i32 2
+ ret i32 %1
+}
+; CHECK-LABEL: define i32 @extract_2xi32_undef_idx(<4 x i32>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <4 x i32> %0, i32 2
+; CHECK-NEXT: ret i32 %1
+; CHECK-NEXT: }
+
+define i64 @extract_2xi64_at_0(<2 x i64>) {
+entry:
+ %1 = extractelement <2 x i64> %0, i32 0
+ ret i64 %1
+}
+; CHECK-LABEL: define i64 @extract_2xi64_at_0(<2 x i64>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <2 x i64> %0, i32 0
+; CHECK-NEXT: ret i64 %1
+; CHECK-NEXT: }
+
+define i64 @extract_2xi64_at_1(<2 x i64>) {
+entry:
+ %1 = extractelement <2 x i64> %0, i32 1
+ ret i64 %1
+}
+; CHECK-LABEL: define i64 @extract_2xi64_at_1(<2 x i64>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <2 x i64> %0, i32 1
+; CHECK-NEXT: ret i64 %1
+; CHECK-NEXT: }
+
+define i64 @extract_2xi64_undef_idx(<2 x i64>) {
+entry:
+ %1 = extractelement <2 x i64> %0, i32 2
+ ret i64 %1
+}
+; CHECK-LABEL: define i64 @extract_2xi64_undef_idx(<2 x i64>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <2 x i64> %0, i32 2
+; CHECK-NEXT: ret i64 %1
+; CHECK-NEXT: }
+
+define i8* @extract_2xi8ptr_at_0(<2 x i8*>) {
+entry:
+ %1 = extractelement <2 x i8*> %0, i32 0
+ ret i8* %1
+}
+; CHECK-LABEL: define i8* @extract_2xi8ptr_at_0(<4 x i8*>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <4 x i8*> %0, i32 0
+; CHECK-NEXT: ret i8* %1
+; CHECK-NEXT: }
+
+define i8* @extract_2xi8ptr_at_1(<2 x i8*>) {
+entry:
+ %1 = extractelement <2 x i8*> %0, i32 1
+ ret i8* %1
+}
+; CHECK-LABEL: define i8* @extract_2xi8ptr_at_1(<4 x i8*>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <4 x i8*> %0, i32 1
+; CHECK-NEXT: ret i8* %1
+; CHECK-NEXT: }
+
+define i8* @extract_2xi8ptr_undef_idx(<2 x i8*>) {
+entry:
+ %1 = extractelement <2 x i8*> %0, i32 2
+ ret i8* %1
+}
+; CHECK-LABEL: define i8* @extract_2xi8ptr_undef_idx(<4 x i8*>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <4 x i8*> %0, i32 2
+; CHECK-NEXT: ret i8* %1
+; CHECK-NEXT: }
+
+define float @extract_2xfloat_at_0(<2 x float>) {
+entry:
+ %1 = extractelement <2 x float> %0, i32 0
+ ret float %1
+}
+; CHECK-LABEL: define float @extract_2xfloat_at_0(<4 x float>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <4 x float> %0, i32 0
+; CHECK-NEXT: ret float %1
+; CHECK-NEXT: }
+
+define float @extract_2xfloat_at_1(<2 x float>) {
+entry:
+ %1 = extractelement <2 x float> %0, i32 1
+ ret float %1
+}
+; CHECK-LABEL: define float @extract_2xfloat_at_1(<4 x float>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <4 x float> %0, i32 1
+; CHECK-NEXT: ret float %1
+; CHECK-NEXT: }
+
+define float @extract_2xfloat_undef_idx(<2 x float>) {
+entry:
+ %1 = extractelement <2 x float> %0, i32 2
+ ret float %1
+}
+; CHECK-LABEL: define float @extract_2xfloat_undef_idx(<4 x float>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <4 x float> %0, i32 2
+; CHECK-NEXT: ret float %1
+; CHECK-NEXT: }
+
+define double @extract_2xdouble_at_0(<2 x double>) {
+entry:
+ %1 = extractelement <2 x double> %0, i32 0
+ ret double %1
+}
+; CHECK-LABEL: define double @extract_2xdouble_at_0(<2 x double>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <2 x double> %0, i32 0
+; CHECK-NEXT: ret double %1
+; CHECK-NEXT: }
+
+define double @extract_2xdouble_at_1(<2 x double>) {
+entry:
+ %1 = extractelement <2 x double> %0, i32 1
+ ret double %1
+}
+; CHECK-LABEL: define double @extract_2xdouble_at_1(<2 x double>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <2 x double> %0, i32 1
+; CHECK-NEXT: ret double %1
+; CHECK-NEXT: }
+
+define double @extract_2xdouble_undef_idx(<2 x double>) {
+entry:
+ %1 = extractelement <2 x double> %0, i32 2
+ ret double %1
+}
+; CHECK-LABEL: define double @extract_2xdouble_undef_idx(<2 x double>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <2 x double> %0, i32 2
+; CHECK-NEXT: ret double %1
+; CHECK-NEXT: }
+
+define i8 @extract_4xi8_at_0(<4 x i8>) {
+entry:
+ %1 = extractelement <4 x i8> %0, i32 0
+ ret i8 %1
+}
+; CHECK-LABEL: define i8 @extract_4xi8_at_0(<16 x i8>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <16 x i8> %0, i32 0
+; CHECK-NEXT: ret i8 %1
+; CHECK-NEXT: }
+
+define i8 @extract_4xi8_at_1(<4 x i8>) {
+entry:
+ %1 = extractelement <4 x i8> %0, i32 1
+ ret i8 %1
+}
+; CHECK-LABEL: define i8 @extract_4xi8_at_1(<16 x i8>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <16 x i8> %0, i32 1
+; CHECK-NEXT: ret i8 %1
+; CHECK-NEXT: }
+
+define i8 @extract_4xi8_at_2(<4 x i8>) {
+entry:
+ %1 = extractelement <4 x i8> %0, i32 2
+ ret i8 %1
+}
+; CHECK-LABEL: define i8 @extract_4xi8_at_2(<16 x i8>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <16 x i8> %0, i32 2
+; CHECK-NEXT: ret i8 %1
+; CHECK-NEXT: }
+
+define i8 @extract_4xi8_at_3(<4 x i8>) {
+entry:
+ %1 = extractelement <4 x i8> %0, i32 3
+ ret i8 %1
+}
+; CHECK-LABEL: define i8 @extract_4xi8_at_3(<16 x i8>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <16 x i8> %0, i32 3
+; CHECK-NEXT: ret i8 %1
+; CHECK-NEXT: }
+
+define i8 @extract_4xi8_undef_idx(<4 x i8>) {
+entry:
+ %1 = extractelement <4 x i8> %0, i32 4
+ ret i8 %1
+}
+; CHECK-LABEL: define i8 @extract_4xi8_undef_idx(<16 x i8>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <16 x i8> %0, i32 4
+; CHECK-NEXT: ret i8 %1
+; CHECK-NEXT: }
+
+define i16 @extract_4xi16_at_0(<4 x i16>) {
+entry:
+ %1 = extractelement <4 x i16> %0, i32 0
+ ret i16 %1
+}
+; CHECK-LABEL: define i16 @extract_4xi16_at_0(<8 x i16>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <8 x i16> %0, i32 0
+; CHECK-NEXT: ret i16 %1
+; CHECK-NEXT: }
+
+define i16 @extract_4xi16_at_1(<4 x i16>) {
+entry:
+ %1 = extractelement <4 x i16> %0, i32 1
+ ret i16 %1
+}
+; CHECK-LABEL: define i16 @extract_4xi16_at_1(<8 x i16>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <8 x i16> %0, i32 1
+; CHECK-NEXT: ret i16 %1
+; CHECK-NEXT: }
+
+define i16 @extract_4xi16_at_2(<4 x i16>) {
+entry:
+ %1 = extractelement <4 x i16> %0, i32 2
+ ret i16 %1
+}
+; CHECK-LABEL: define i16 @extract_4xi16_at_2(<8 x i16>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <8 x i16> %0, i32 2
+; CHECK-NEXT: ret i16 %1
+; CHECK-NEXT: }
+
+define i16 @extract_4xi16_at_3(<4 x i16>) {
+entry:
+ %1 = extractelement <4 x i16> %0, i32 3
+ ret i16 %1
+}
+; CHECK-LABEL: define i16 @extract_4xi16_at_3(<8 x i16>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <8 x i16> %0, i32 3
+; CHECK-NEXT: ret i16 %1
+; CHECK-NEXT: }
+
+define i16 @extract_4xi16_undef_idx(<4 x i16>) {
+entry:
+ %1 = extractelement <4 x i16> %0, i32 4
+ ret i16 %1
+}
+; CHECK-LABEL: define i16 @extract_4xi16_undef_idx(<8 x i16>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <8 x i16> %0, i32 4
+; CHECK-NEXT: ret i16 %1
+; CHECK-NEXT: }
+
+define i32 @extract_4xi32_at_0(<4 x i32>) {
+entry:
+ %1 = extractelement <4 x i32> %0, i32 0
+ ret i32 %1
+}
+; CHECK-LABEL: define i32 @extract_4xi32_at_0(<4 x i32>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <4 x i32> %0, i32 0
+; CHECK-NEXT: ret i32 %1
+; CHECK-NEXT: }
+
+define i32 @extract_4xi32_at_1(<4 x i32>) {
+entry:
+ %1 = extractelement <4 x i32> %0, i32 1
+ ret i32 %1
+}
+; CHECK-LABEL: define i32 @extract_4xi32_at_1(<4 x i32>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <4 x i32> %0, i32 1
+; CHECK-NEXT: ret i32 %1
+; CHECK-NEXT: }
+
+define i32 @extract_4xi32_at_2(<4 x i32>) {
+entry:
+ %1 = extractelement <4 x i32> %0, i32 2
+ ret i32 %1
+}
+; CHECK-LABEL: define i32 @extract_4xi32_at_2(<4 x i32>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <4 x i32> %0, i32 2
+; CHECK-NEXT: ret i32 %1
+; CHECK-NEXT: }
+
+define i32 @extract_4xi32_at_3(<4 x i32>) {
+entry:
+ %1 = extractelement <4 x i32> %0, i32 3
+ ret i32 %1
+}
+; CHECK-LABEL: define i32 @extract_4xi32_at_3(<4 x i32>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <4 x i32> %0, i32 3
+; CHECK-NEXT: ret i32 %1
+; CHECK-NEXT: }
+
+define i32 @extract_4xi32_undef_idx(<4 x i32>) {
+entry:
+ %1 = extractelement <4 x i32> %0, i32 4
+ ret i32 %1
+}
+; CHECK-LABEL: define i32 @extract_4xi32_undef_idx(<4 x i32>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <4 x i32> %0, i32 4
+; CHECK-NEXT: ret i32 %1
+; CHECK-NEXT: }
+
+define i64 @extract_4xi64_at_0(<4 x i64>) {
+entry:
+ %1 = extractelement <4 x i64> %0, i32 0
+ ret i64 %1
+}
+; CHECK-LABEL: define i64 @extract_4xi64_at_0(<2 x i64>, <2 x i64>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <2 x i64> %0, i32 0
+; CHECK-NEXT: ret i64 %2
+; CHECK-NEXT: }
+
+define i64 @extract_4xi64_at_1(<4 x i64>) {
+entry:
+ %1 = extractelement <4 x i64> %0, i32 1
+ ret i64 %1
+}
+; CHECK-LABEL: define i64 @extract_4xi64_at_1(<2 x i64>, <2 x i64>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <2 x i64> %0, i32 1
+; CHECK-NEXT: ret i64 %2
+; CHECK-NEXT: }
+
+define i64 @extract_4xi64_at_2(<4 x i64>) {
+entry:
+ %1 = extractelement <4 x i64> %0, i32 2
+ ret i64 %1
+}
+; CHECK-LABEL: define i64 @extract_4xi64_at_2(<2 x i64>, <2 x i64>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <2 x i64> %1, i32 0
+; CHECK-NEXT: ret i64 %2
+; CHECK-NEXT: }
+
+define i64 @extract_4xi64_at_3(<4 x i64>) {
+entry:
+ %1 = extractelement <4 x i64> %0, i32 3
+ ret i64 %1
+}
+; CHECK-LABEL: define i64 @extract_4xi64_at_3(<2 x i64>, <2 x i64>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <2 x i64> %1, i32 1
+; CHECK-NEXT: ret i64 %2
+; CHECK-NEXT: }
+
+define i64 @extract_4xi64_undef_idx(<4 x i64>) {
+entry:
+ %1 = extractelement <4 x i64> %0, i32 4
+ ret i64 %1
+}
+; CHECK-LABEL: define i64 @extract_4xi64_undef_idx(<2 x i64>, <2 x i64>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <2 x i64> %1, i32 2
+; CHECK-NEXT: ret i64 %2
+; CHECK-NEXT: }
+
+define i8* @extract_4xi8ptr_at_0(<4 x i8*>) {
+entry:
+ %1 = extractelement <4 x i8*> %0, i32 0
+ ret i8* %1
+}
+; CHECK-LABEL: define i8* @extract_4xi8ptr_at_0(<4 x i8*>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <4 x i8*> %0, i32 0
+; CHECK-NEXT: ret i8* %1
+; CHECK-NEXT: }
+
+define i8* @extract_4xi8ptr_at_1(<4 x i8*>) {
+entry:
+ %1 = extractelement <4 x i8*> %0, i32 1
+ ret i8* %1
+}
+; CHECK-LABEL: define i8* @extract_4xi8ptr_at_1(<4 x i8*>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <4 x i8*> %0, i32 1
+; CHECK-NEXT: ret i8* %1
+; CHECK-NEXT: }
+
+define i8* @extract_4xi8ptr_at_2(<4 x i8*>) {
+entry:
+ %1 = extractelement <4 x i8*> %0, i32 2
+ ret i8* %1
+}
+; CHECK-LABEL: define i8* @extract_4xi8ptr_at_2(<4 x i8*>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <4 x i8*> %0, i32 2
+; CHECK-NEXT: ret i8* %1
+; CHECK-NEXT: }
+
+define i8* @extract_4xi8ptr_at_3(<4 x i8*>) {
+entry:
+ %1 = extractelement <4 x i8*> %0, i32 3
+ ret i8* %1
+}
+; CHECK-LABEL: define i8* @extract_4xi8ptr_at_3(<4 x i8*>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <4 x i8*> %0, i32 3
+; CHECK-NEXT: ret i8* %1
+; CHECK-NEXT: }
+
+define i8* @extract_4xi8ptr_undef_idx(<4 x i8*>) {
+entry:
+ %1 = extractelement <4 x i8*> %0, i32 4
+ ret i8* %1
+}
+; CHECK-LABEL: define i8* @extract_4xi8ptr_undef_idx(<4 x i8*>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <4 x i8*> %0, i32 4
+; CHECK-NEXT: ret i8* %1
+; CHECK-NEXT: }
+
+define float @extract_4xfloat_at_0(<4 x float>) {
+entry:
+ %1 = extractelement <4 x float> %0, i32 0
+ ret float %1
+}
+; CHECK-LABEL: define float @extract_4xfloat_at_0(<4 x float>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <4 x float> %0, i32 0
+; CHECK-NEXT: ret float %1
+; CHECK-NEXT: }
+
+define float @extract_4xfloat_at_1(<4 x float>) {
+entry:
+ %1 = extractelement <4 x float> %0, i32 1
+ ret float %1
+}
+; CHECK-LABEL: define float @extract_4xfloat_at_1(<4 x float>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <4 x float> %0, i32 1
+; CHECK-NEXT: ret float %1
+; CHECK-NEXT: }
+
+define float @extract_4xfloat_at_2(<4 x float>) {
+entry:
+ %1 = extractelement <4 x float> %0, i32 2
+ ret float %1
+}
+; CHECK-LABEL: define float @extract_4xfloat_at_2(<4 x float>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <4 x float> %0, i32 2
+; CHECK-NEXT: ret float %1
+; CHECK-NEXT: }
+
+define float @extract_4xfloat_at_3(<4 x float>) {
+entry:
+ %1 = extractelement <4 x float> %0, i32 3
+ ret float %1
+}
+; CHECK-LABEL: define float @extract_4xfloat_at_3(<4 x float>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <4 x float> %0, i32 3
+; CHECK-NEXT: ret float %1
+; CHECK-NEXT: }
+
+define float @extract_4xfloat_undef_idx(<4 x float>) {
+entry:
+ %1 = extractelement <4 x float> %0, i32 4
+ ret float %1
+}
+; CHECK-LABEL: define float @extract_4xfloat_undef_idx(<4 x float>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <4 x float> %0, i32 4
+; CHECK-NEXT: ret float %1
+; CHECK-NEXT: }
+
+define double @extract_4xdouble_at_0(<4 x double>) {
+entry:
+ %1 = extractelement <4 x double> %0, i32 0
+ ret double %1
+}
+; CHECK-LABEL: define double @extract_4xdouble_at_0(<2 x double>, <2 x double>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <2 x double> %0, i32 0
+; CHECK-NEXT: ret double %2
+; CHECK-NEXT: }
+
+define double @extract_4xdouble_at_1(<4 x double>) {
+entry:
+ %1 = extractelement <4 x double> %0, i32 1
+ ret double %1
+}
+; CHECK-LABEL: define double @extract_4xdouble_at_1(<2 x double>, <2 x double>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <2 x double> %0, i32 1
+; CHECK-NEXT: ret double %2
+; CHECK-NEXT: }
+
+define double @extract_4xdouble_at_2(<4 x double>) {
+entry:
+ %1 = extractelement <4 x double> %0, i32 2
+ ret double %1
+}
+; CHECK-LABEL: define double @extract_4xdouble_at_2(<2 x double>, <2 x double>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <2 x double> %1, i32 0
+; CHECK-NEXT: ret double %2
+; CHECK-NEXT: }
+
+define double @extract_4xdouble_at_3(<4 x double>) {
+entry:
+ %1 = extractelement <4 x double> %0, i32 3
+ ret double %1
+}
+; CHECK-LABEL: define double @extract_4xdouble_at_3(<2 x double>, <2 x double>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <2 x double> %1, i32 1
+; CHECK-NEXT: ret double %2
+; CHECK-NEXT: }
+
+define double @extract_4xdouble_undef_idx(<4 x double>) {
+entry:
+ %1 = extractelement <4 x double> %0, i32 4
+ ret double %1
+}
+; CHECK-LABEL: define double @extract_4xdouble_undef_idx(<2 x double>, <2 x double>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <2 x double> %1, i32 2
+; CHECK-NEXT: ret double %2
+; CHECK-NEXT: }
+
+define i8 @extract_6xi8_at_0(<6 x i8>) {
+entry:
+ %1 = extractelement <6 x i8> %0, i32 0
+ ret i8 %1
+}
+; CHECK-LABEL: define i8 @extract_6xi8_at_0(<16 x i8>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <16 x i8> %0, i32 0
+; CHECK-NEXT: ret i8 %1
+; CHECK-NEXT: }
+
+define i8 @extract_6xi8_at_1(<6 x i8>) {
+entry:
+ %1 = extractelement <6 x i8> %0, i32 1
+ ret i8 %1
+}
+; CHECK-LABEL: define i8 @extract_6xi8_at_1(<16 x i8>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <16 x i8> %0, i32 1
+; CHECK-NEXT: ret i8 %1
+; CHECK-NEXT: }
+
+define i8 @extract_6xi8_at_2(<6 x i8>) {
+entry:
+ %1 = extractelement <6 x i8> %0, i32 2
+ ret i8 %1
+}
+; CHECK-LABEL: define i8 @extract_6xi8_at_2(<16 x i8>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <16 x i8> %0, i32 2
+; CHECK-NEXT: ret i8 %1
+; CHECK-NEXT: }
+
+define i8 @extract_6xi8_at_3(<6 x i8>) {
+entry:
+ %1 = extractelement <6 x i8> %0, i32 3
+ ret i8 %1
+}
+; CHECK-LABEL: define i8 @extract_6xi8_at_3(<16 x i8>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <16 x i8> %0, i32 3
+; CHECK-NEXT: ret i8 %1
+; CHECK-NEXT: }
+
+define i8 @extract_6xi8_at_4(<6 x i8>) {
+entry:
+ %1 = extractelement <6 x i8> %0, i32 4
+ ret i8 %1
+}
+; CHECK-LABEL: define i8 @extract_6xi8_at_4(<16 x i8>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <16 x i8> %0, i32 4
+; CHECK-NEXT: ret i8 %1
+; CHECK-NEXT: }
+
+define i8 @extract_6xi8_at_5(<6 x i8>) {
+entry:
+ %1 = extractelement <6 x i8> %0, i32 5
+ ret i8 %1
+}
+; CHECK-LABEL: define i8 @extract_6xi8_at_5(<16 x i8>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <16 x i8> %0, i32 5
+; CHECK-NEXT: ret i8 %1
+; CHECK-NEXT: }
+
+define i8 @extract_6xi8_undef_idx(<6 x i8>) {
+entry:
+ %1 = extractelement <6 x i8> %0, i32 6
+ ret i8 %1
+}
+; CHECK-LABEL: define i8 @extract_6xi8_undef_idx(<16 x i8>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <16 x i8> %0, i32 6
+; CHECK-NEXT: ret i8 %1
+; CHECK-NEXT: }
+
+define i16 @extract_6xi16_at_0(<6 x i16>) {
+entry:
+ %1 = extractelement <6 x i16> %0, i32 0
+ ret i16 %1
+}
+; CHECK-LABEL: define i16 @extract_6xi16_at_0(<8 x i16>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <8 x i16> %0, i32 0
+; CHECK-NEXT: ret i16 %1
+; CHECK-NEXT: }
+
+define i16 @extract_6xi16_at_1(<6 x i16>) {
+entry:
+ %1 = extractelement <6 x i16> %0, i32 1
+ ret i16 %1
+}
+; CHECK-LABEL: define i16 @extract_6xi16_at_1(<8 x i16>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <8 x i16> %0, i32 1
+; CHECK-NEXT: ret i16 %1
+; CHECK-NEXT: }
+
+define i16 @extract_6xi16_at_2(<6 x i16>) {
+entry:
+ %1 = extractelement <6 x i16> %0, i32 2
+ ret i16 %1
+}
+; CHECK-LABEL: define i16 @extract_6xi16_at_2(<8 x i16>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <8 x i16> %0, i32 2
+; CHECK-NEXT: ret i16 %1
+; CHECK-NEXT: }
+
+define i16 @extract_6xi16_at_3(<6 x i16>) {
+entry:
+ %1 = extractelement <6 x i16> %0, i32 3
+ ret i16 %1
+}
+; CHECK-LABEL: define i16 @extract_6xi16_at_3(<8 x i16>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <8 x i16> %0, i32 3
+; CHECK-NEXT: ret i16 %1
+; CHECK-NEXT: }
+
+define i16 @extract_6xi16_at_4(<6 x i16>) {
+entry:
+ %1 = extractelement <6 x i16> %0, i32 4
+ ret i16 %1
+}
+; CHECK-LABEL: define i16 @extract_6xi16_at_4(<8 x i16>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <8 x i16> %0, i32 4
+; CHECK-NEXT: ret i16 %1
+; CHECK-NEXT: }
+
+define i16 @extract_6xi16_at_5(<6 x i16>) {
+entry:
+ %1 = extractelement <6 x i16> %0, i32 5
+ ret i16 %1
+}
+; CHECK-LABEL: define i16 @extract_6xi16_at_5(<8 x i16>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <8 x i16> %0, i32 5
+; CHECK-NEXT: ret i16 %1
+; CHECK-NEXT: }
+
+define i16 @extract_6xi16_undef_idx(<6 x i16>) {
+entry:
+ %1 = extractelement <6 x i16> %0, i32 6
+ ret i16 %1
+}
+; CHECK-LABEL: define i16 @extract_6xi16_undef_idx(<8 x i16>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <8 x i16> %0, i32 6
+; CHECK-NEXT: ret i16 %1
+; CHECK-NEXT: }
+
+define i32 @extract_6xi32_at_0(<6 x i32>) {
+entry:
+ %1 = extractelement <6 x i32> %0, i32 0
+ ret i32 %1
+}
+; CHECK-LABEL: define i32 @extract_6xi32_at_0(<4 x i32>, <4 x i32>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <4 x i32> %0, i32 0
+; CHECK-NEXT: ret i32 %2
+; CHECK-NEXT: }
+
+define i32 @extract_6xi32_at_1(<6 x i32>) {
+entry:
+ %1 = extractelement <6 x i32> %0, i32 1
+ ret i32 %1
+}
+; CHECK-LABEL: define i32 @extract_6xi32_at_1(<4 x i32>, <4 x i32>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <4 x i32> %0, i32 1
+; CHECK-NEXT: ret i32 %2
+; CHECK-NEXT: }
+
+define i32 @extract_6xi32_at_2(<6 x i32>) {
+entry:
+ %1 = extractelement <6 x i32> %0, i32 2
+ ret i32 %1
+}
+; CHECK-LABEL: define i32 @extract_6xi32_at_2(<4 x i32>, <4 x i32>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <4 x i32> %0, i32 2
+; CHECK-NEXT: ret i32 %2
+; CHECK-NEXT: }
+
+define i32 @extract_6xi32_at_3(<6 x i32>) {
+entry:
+ %1 = extractelement <6 x i32> %0, i32 3
+ ret i32 %1
+}
+; CHECK-LABEL: define i32 @extract_6xi32_at_3(<4 x i32>, <4 x i32>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <4 x i32> %0, i32 3
+; CHECK-NEXT: ret i32 %2
+; CHECK-NEXT: }
+
+define i32 @extract_6xi32_at_4(<6 x i32>) {
+entry:
+ %1 = extractelement <6 x i32> %0, i32 4
+ ret i32 %1
+}
+; CHECK-LABEL: define i32 @extract_6xi32_at_4(<4 x i32>, <4 x i32>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <4 x i32> %1, i32 0
+; CHECK-NEXT: ret i32 %2
+; CHECK-NEXT: }
+
+define i32 @extract_6xi32_at_5(<6 x i32>) {
+entry:
+ %1 = extractelement <6 x i32> %0, i32 5
+ ret i32 %1
+}
+; CHECK-LABEL: define i32 @extract_6xi32_at_5(<4 x i32>, <4 x i32>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <4 x i32> %1, i32 1
+; CHECK-NEXT: ret i32 %2
+; CHECK-NEXT: }
+
+define i32 @extract_6xi32_undef_idx(<6 x i32>) {
+entry:
+ %1 = extractelement <6 x i32> %0, i32 6
+ ret i32 %1
+}
+; CHECK-LABEL: define i32 @extract_6xi32_undef_idx(<4 x i32>, <4 x i32>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <4 x i32> %1, i32 2
+; CHECK-NEXT: ret i32 %2
+; CHECK-NEXT: }
+
+define i64 @extract_6xi64_at_0(<6 x i64>) {
+entry:
+ %1 = extractelement <6 x i64> %0, i32 0
+ ret i64 %1
+}
+; CHECK-LABEL: define i64 @extract_6xi64_at_0(<2 x i64>, <2 x i64>, <2 x i64>) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <2 x i64> %0, i32 0
+; CHECK-NEXT: ret i64 %3
+; CHECK-NEXT: }
+
+define i64 @extract_6xi64_at_1(<6 x i64>) {
+entry:
+ %1 = extractelement <6 x i64> %0, i32 1
+ ret i64 %1
+}
+; CHECK-LABEL: define i64 @extract_6xi64_at_1(<2 x i64>, <2 x i64>, <2 x i64>) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <2 x i64> %0, i32 1
+; CHECK-NEXT: ret i64 %3
+; CHECK-NEXT: }
+
+define i64 @extract_6xi64_at_2(<6 x i64>) {
+entry:
+ %1 = extractelement <6 x i64> %0, i32 2
+ ret i64 %1
+}
+; CHECK-LABEL: define i64 @extract_6xi64_at_2(<2 x i64>, <2 x i64>, <2 x i64>) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <2 x i64> %1, i32 0
+; CHECK-NEXT: ret i64 %3
+; CHECK-NEXT: }
+
+define i64 @extract_6xi64_at_3(<6 x i64>) {
+entry:
+ %1 = extractelement <6 x i64> %0, i32 3
+ ret i64 %1
+}
+; CHECK-LABEL: define i64 @extract_6xi64_at_3(<2 x i64>, <2 x i64>, <2 x i64>) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <2 x i64> %1, i32 1
+; CHECK-NEXT: ret i64 %3
+; CHECK-NEXT: }
+
+define i64 @extract_6xi64_at_4(<6 x i64>) {
+entry:
+ %1 = extractelement <6 x i64> %0, i32 4
+ ret i64 %1
+}
+; CHECK-LABEL: define i64 @extract_6xi64_at_4(<2 x i64>, <2 x i64>, <2 x i64>) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <2 x i64> %2, i32 0
+; CHECK-NEXT: ret i64 %3
+; CHECK-NEXT: }
+
+define i64 @extract_6xi64_at_5(<6 x i64>) {
+entry:
+ %1 = extractelement <6 x i64> %0, i32 5
+ ret i64 %1
+}
+; CHECK-LABEL: define i64 @extract_6xi64_at_5(<2 x i64>, <2 x i64>, <2 x i64>) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <2 x i64> %2, i32 1
+; CHECK-NEXT: ret i64 %3
+; CHECK-NEXT: }
+
+define i64 @extract_6xi64_undef_idx(<6 x i64>) {
+entry:
+ %1 = extractelement <6 x i64> %0, i32 6
+ ret i64 %1
+}
+; CHECK-LABEL: define i64 @extract_6xi64_undef_idx(<2 x i64>, <2 x i64>, <2 x i64>) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <2 x i64> %2, i32 2
+; CHECK-NEXT: ret i64 %3
+; CHECK-NEXT: }
+
+define i8* @extract_6xi8ptr_at_0(<6 x i8*>) {
+entry:
+ %1 = extractelement <6 x i8*> %0, i32 0
+ ret i8* %1
+}
+; CHECK-LABEL: define i8* @extract_6xi8ptr_at_0(<4 x i8*>, <4 x i8*>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <4 x i8*> %0, i32 0
+; CHECK-NEXT: ret i8* %2
+; CHECK-NEXT: }
+
+define i8* @extract_6xi8ptr_at_1(<6 x i8*>) {
+entry:
+ %1 = extractelement <6 x i8*> %0, i32 1
+ ret i8* %1
+}
+; CHECK-LABEL: define i8* @extract_6xi8ptr_at_1(<4 x i8*>, <4 x i8*>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <4 x i8*> %0, i32 1
+; CHECK-NEXT: ret i8* %2
+; CHECK-NEXT: }
+
+define i8* @extract_6xi8ptr_at_2(<6 x i8*>) {
+entry:
+ %1 = extractelement <6 x i8*> %0, i32 2
+ ret i8* %1
+}
+; CHECK-LABEL: define i8* @extract_6xi8ptr_at_2(<4 x i8*>, <4 x i8*>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <4 x i8*> %0, i32 2
+; CHECK-NEXT: ret i8* %2
+; CHECK-NEXT: }
+
+define i8* @extract_6xi8ptr_at_3(<6 x i8*>) {
+entry:
+ %1 = extractelement <6 x i8*> %0, i32 3
+ ret i8* %1
+}
+; CHECK-LABEL: define i8* @extract_6xi8ptr_at_3(<4 x i8*>, <4 x i8*>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <4 x i8*> %0, i32 3
+; CHECK-NEXT: ret i8* %2
+; CHECK-NEXT: }
+
+define i8* @extract_6xi8ptr_at_4(<6 x i8*>) {
+entry:
+ %1 = extractelement <6 x i8*> %0, i32 4
+ ret i8* %1
+}
+; CHECK-LABEL: define i8* @extract_6xi8ptr_at_4(<4 x i8*>, <4 x i8*>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <4 x i8*> %1, i32 0
+; CHECK-NEXT: ret i8* %2
+; CHECK-NEXT: }
+
+define i8* @extract_6xi8ptr_at_5(<6 x i8*>) {
+entry:
+ %1 = extractelement <6 x i8*> %0, i32 5
+ ret i8* %1
+}
+; CHECK-LABEL: define i8* @extract_6xi8ptr_at_5(<4 x i8*>, <4 x i8*>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <4 x i8*> %1, i32 1
+; CHECK-NEXT: ret i8* %2
+; CHECK-NEXT: }
+
+define i8* @extract_6xi8ptr_undef_idx(<6 x i8*>) {
+entry:
+ %1 = extractelement <6 x i8*> %0, i32 6
+ ret i8* %1
+}
+; CHECK-LABEL: define i8* @extract_6xi8ptr_undef_idx(<4 x i8*>, <4 x i8*>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <4 x i8*> %1, i32 2
+; CHECK-NEXT: ret i8* %2
+; CHECK-NEXT: }
+
+define float @extract_6xfloat_at_0(<6 x float>) {
+entry:
+ %1 = extractelement <6 x float> %0, i32 0
+ ret float %1
+}
+; CHECK-LABEL: define float @extract_6xfloat_at_0(<4 x float>, <4 x float>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <4 x float> %0, i32 0
+; CHECK-NEXT: ret float %2
+; CHECK-NEXT: }
+
+define float @extract_6xfloat_at_1(<6 x float>) {
+entry:
+ %1 = extractelement <6 x float> %0, i32 1
+ ret float %1
+}
+; CHECK-LABEL: define float @extract_6xfloat_at_1(<4 x float>, <4 x float>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <4 x float> %0, i32 1
+; CHECK-NEXT: ret float %2
+; CHECK-NEXT: }
+
+define float @extract_6xfloat_at_2(<6 x float>) {
+entry:
+ %1 = extractelement <6 x float> %0, i32 2
+ ret float %1
+}
+; CHECK-LABEL: define float @extract_6xfloat_at_2(<4 x float>, <4 x float>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <4 x float> %0, i32 2
+; CHECK-NEXT: ret float %2
+; CHECK-NEXT: }
+
+define float @extract_6xfloat_at_3(<6 x float>) {
+entry:
+ %1 = extractelement <6 x float> %0, i32 3
+ ret float %1
+}
+; CHECK-LABEL: define float @extract_6xfloat_at_3(<4 x float>, <4 x float>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <4 x float> %0, i32 3
+; CHECK-NEXT: ret float %2
+; CHECK-NEXT: }
+
+define float @extract_6xfloat_at_4(<6 x float>) {
+entry:
+ %1 = extractelement <6 x float> %0, i32 4
+ ret float %1
+}
+; CHECK-LABEL: define float @extract_6xfloat_at_4(<4 x float>, <4 x float>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <4 x float> %1, i32 0
+; CHECK-NEXT: ret float %2
+; CHECK-NEXT: }
+
+define float @extract_6xfloat_at_5(<6 x float>) {
+entry:
+ %1 = extractelement <6 x float> %0, i32 5
+ ret float %1
+}
+; CHECK-LABEL: define float @extract_6xfloat_at_5(<4 x float>, <4 x float>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <4 x float> %1, i32 1
+; CHECK-NEXT: ret float %2
+; CHECK-NEXT: }
+
+define float @extract_6xfloat_undef_idx(<6 x float>) {
+entry:
+ %1 = extractelement <6 x float> %0, i32 6
+ ret float %1
+}
+; CHECK-LABEL: define float @extract_6xfloat_undef_idx(<4 x float>, <4 x float>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <4 x float> %1, i32 2
+; CHECK-NEXT: ret float %2
+; CHECK-NEXT: }
+
+define double @extract_6xdouble_at_0(<6 x double>) {
+entry:
+ %1 = extractelement <6 x double> %0, i32 0
+ ret double %1
+}
+; CHECK-LABEL: define double @extract_6xdouble_at_0(<2 x double>, <2 x double>, <2 x double>) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <2 x double> %0, i32 0
+; CHECK-NEXT: ret double %3
+; CHECK-NEXT: }
+
+define double @extract_6xdouble_at_1(<6 x double>) {
+entry:
+ %1 = extractelement <6 x double> %0, i32 1
+ ret double %1
+}
+; CHECK-LABEL: define double @extract_6xdouble_at_1(<2 x double>, <2 x double>, <2 x double>) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <2 x double> %0, i32 1
+; CHECK-NEXT: ret double %3
+; CHECK-NEXT: }
+
+define double @extract_6xdouble_at_2(<6 x double>) {
+entry:
+ %1 = extractelement <6 x double> %0, i32 2
+ ret double %1
+}
+; CHECK-LABEL: define double @extract_6xdouble_at_2(<2 x double>, <2 x double>, <2 x double>) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <2 x double> %1, i32 0
+; CHECK-NEXT: ret double %3
+; CHECK-NEXT: }
+
+define double @extract_6xdouble_at_3(<6 x double>) {
+entry:
+ %1 = extractelement <6 x double> %0, i32 3
+ ret double %1
+}
+; CHECK-LABEL: define double @extract_6xdouble_at_3(<2 x double>, <2 x double>, <2 x double>) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <2 x double> %1, i32 1
+; CHECK-NEXT: ret double %3
+; CHECK-NEXT: }
+
+define double @extract_6xdouble_at_4(<6 x double>) {
+entry:
+ %1 = extractelement <6 x double> %0, i32 4
+ ret double %1
+}
+; CHECK-LABEL: define double @extract_6xdouble_at_4(<2 x double>, <2 x double>, <2 x double>) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <2 x double> %2, i32 0
+; CHECK-NEXT: ret double %3
+; CHECK-NEXT: }
+
+define double @extract_6xdouble_at_5(<6 x double>) {
+entry:
+ %1 = extractelement <6 x double> %0, i32 5
+ ret double %1
+}
+; CHECK-LABEL: define double @extract_6xdouble_at_5(<2 x double>, <2 x double>, <2 x double>) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <2 x double> %2, i32 1
+; CHECK-NEXT: ret double %3
+; CHECK-NEXT: }
+
+define double @extract_6xdouble_undef_idx(<6 x double>) {
+entry:
+ %1 = extractelement <6 x double> %0, i32 6
+ ret double %1
+}
+; CHECK-LABEL: define double @extract_6xdouble_undef_idx(<2 x double>, <2 x double>, <2 x double>) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <2 x double> %2, i32 2
+; CHECK-NEXT: ret double %3
+; CHECK-NEXT: }
+
+define i8 @extract_8xi8_at_0(<8 x i8>) {
+entry:
+ %1 = extractelement <8 x i8> %0, i32 0
+ ret i8 %1
+}
+; CHECK-LABEL: define i8 @extract_8xi8_at_0(<16 x i8>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <16 x i8> %0, i32 0
+; CHECK-NEXT: ret i8 %1
+; CHECK-NEXT: }
+
+define i8 @extract_8xi8_at_1(<8 x i8>) {
+entry:
+ %1 = extractelement <8 x i8> %0, i32 1
+ ret i8 %1
+}
+; CHECK-LABEL: define i8 @extract_8xi8_at_1(<16 x i8>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <16 x i8> %0, i32 1
+; CHECK-NEXT: ret i8 %1
+; CHECK-NEXT: }
+
+define i8 @extract_8xi8_at_2(<8 x i8>) {
+entry:
+ %1 = extractelement <8 x i8> %0, i32 2
+ ret i8 %1
+}
+; CHECK-LABEL: define i8 @extract_8xi8_at_2(<16 x i8>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <16 x i8> %0, i32 2
+; CHECK-NEXT: ret i8 %1
+; CHECK-NEXT: }
+
+define i8 @extract_8xi8_at_3(<8 x i8>) {
+entry:
+ %1 = extractelement <8 x i8> %0, i32 3
+ ret i8 %1
+}
+; CHECK-LABEL: define i8 @extract_8xi8_at_3(<16 x i8>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <16 x i8> %0, i32 3
+; CHECK-NEXT: ret i8 %1
+; CHECK-NEXT: }
+
+define i8 @extract_8xi8_at_4(<8 x i8>) {
+entry:
+ %1 = extractelement <8 x i8> %0, i32 4
+ ret i8 %1
+}
+; CHECK-LABEL: define i8 @extract_8xi8_at_4(<16 x i8>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <16 x i8> %0, i32 4
+; CHECK-NEXT: ret i8 %1
+; CHECK-NEXT: }
+
+define i8 @extract_8xi8_at_5(<8 x i8>) {
+entry:
+ %1 = extractelement <8 x i8> %0, i32 5
+ ret i8 %1
+}
+; CHECK-LABEL: define i8 @extract_8xi8_at_5(<16 x i8>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <16 x i8> %0, i32 5
+; CHECK-NEXT: ret i8 %1
+; CHECK-NEXT: }
+
+define i8 @extract_8xi8_at_6(<8 x i8>) {
+entry:
+ %1 = extractelement <8 x i8> %0, i32 6
+ ret i8 %1
+}
+; CHECK-LABEL: define i8 @extract_8xi8_at_6(<16 x i8>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <16 x i8> %0, i32 6
+; CHECK-NEXT: ret i8 %1
+; CHECK-NEXT: }
+
+define i8 @extract_8xi8_at_7(<8 x i8>) {
+entry:
+ %1 = extractelement <8 x i8> %0, i32 7
+ ret i8 %1
+}
+; CHECK-LABEL: define i8 @extract_8xi8_at_7(<16 x i8>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <16 x i8> %0, i32 7
+; CHECK-NEXT: ret i8 %1
+; CHECK-NEXT: }
+
+define i8 @extract_8xi8_undef_idx(<8 x i8>) {
+entry:
+ %1 = extractelement <8 x i8> %0, i32 8
+ ret i8 %1
+}
+; CHECK-LABEL: define i8 @extract_8xi8_undef_idx(<16 x i8>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <16 x i8> %0, i32 8
+; CHECK-NEXT: ret i8 %1
+; CHECK-NEXT: }
+
+define i16 @extract_8xi16_at_0(<8 x i16>) {
+entry:
+ %1 = extractelement <8 x i16> %0, i32 0
+ ret i16 %1
+}
+; CHECK-LABEL: define i16 @extract_8xi16_at_0(<8 x i16>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <8 x i16> %0, i32 0
+; CHECK-NEXT: ret i16 %1
+; CHECK-NEXT: }
+
+define i16 @extract_8xi16_at_1(<8 x i16>) {
+entry:
+ %1 = extractelement <8 x i16> %0, i32 1
+ ret i16 %1
+}
+; CHECK-LABEL: define i16 @extract_8xi16_at_1(<8 x i16>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <8 x i16> %0, i32 1
+; CHECK-NEXT: ret i16 %1
+; CHECK-NEXT: }
+
+define i16 @extract_8xi16_at_2(<8 x i16>) {
+entry:
+ %1 = extractelement <8 x i16> %0, i32 2
+ ret i16 %1
+}
+; CHECK-LABEL: define i16 @extract_8xi16_at_2(<8 x i16>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <8 x i16> %0, i32 2
+; CHECK-NEXT: ret i16 %1
+; CHECK-NEXT: }
+
+define i16 @extract_8xi16_at_3(<8 x i16>) {
+entry:
+ %1 = extractelement <8 x i16> %0, i32 3
+ ret i16 %1
+}
+; CHECK-LABEL: define i16 @extract_8xi16_at_3(<8 x i16>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <8 x i16> %0, i32 3
+; CHECK-NEXT: ret i16 %1
+; CHECK-NEXT: }
+
+define i16 @extract_8xi16_at_4(<8 x i16>) {
+entry:
+ %1 = extractelement <8 x i16> %0, i32 4
+ ret i16 %1
+}
+; CHECK-LABEL: define i16 @extract_8xi16_at_4(<8 x i16>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <8 x i16> %0, i32 4
+; CHECK-NEXT: ret i16 %1
+; CHECK-NEXT: }
+
+define i16 @extract_8xi16_at_5(<8 x i16>) {
+entry:
+ %1 = extractelement <8 x i16> %0, i32 5
+ ret i16 %1
+}
+; CHECK-LABEL: define i16 @extract_8xi16_at_5(<8 x i16>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <8 x i16> %0, i32 5
+; CHECK-NEXT: ret i16 %1
+; CHECK-NEXT: }
+
+define i16 @extract_8xi16_at_6(<8 x i16>) {
+entry:
+ %1 = extractelement <8 x i16> %0, i32 6
+ ret i16 %1
+}
+; CHECK-LABEL: define i16 @extract_8xi16_at_6(<8 x i16>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <8 x i16> %0, i32 6
+; CHECK-NEXT: ret i16 %1
+; CHECK-NEXT: }
+
+define i16 @extract_8xi16_at_7(<8 x i16>) {
+entry:
+ %1 = extractelement <8 x i16> %0, i32 7
+ ret i16 %1
+}
+; CHECK-LABEL: define i16 @extract_8xi16_at_7(<8 x i16>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <8 x i16> %0, i32 7
+; CHECK-NEXT: ret i16 %1
+; CHECK-NEXT: }
+
+define i16 @extract_8xi16_undef_idx(<8 x i16>) {
+entry:
+ %1 = extractelement <8 x i16> %0, i32 8
+ ret i16 %1
+}
+; CHECK-LABEL: define i16 @extract_8xi16_undef_idx(<8 x i16>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <8 x i16> %0, i32 8
+; CHECK-NEXT: ret i16 %1
+; CHECK-NEXT: }
+
+define i32 @extract_8xi32_at_0(<8 x i32>) {
+entry:
+ %1 = extractelement <8 x i32> %0, i32 0
+ ret i32 %1
+}
+; CHECK-LABEL: define i32 @extract_8xi32_at_0(<4 x i32>, <4 x i32>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <4 x i32> %0, i32 0
+; CHECK-NEXT: ret i32 %2
+; CHECK-NEXT: }
+
+define i32 @extract_8xi32_at_1(<8 x i32>) {
+entry:
+ %1 = extractelement <8 x i32> %0, i32 1
+ ret i32 %1
+}
+; CHECK-LABEL: define i32 @extract_8xi32_at_1(<4 x i32>, <4 x i32>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <4 x i32> %0, i32 1
+; CHECK-NEXT: ret i32 %2
+; CHECK-NEXT: }
+
+define i32 @extract_8xi32_at_2(<8 x i32>) {
+entry:
+ %1 = extractelement <8 x i32> %0, i32 2
+ ret i32 %1
+}
+; CHECK-LABEL: define i32 @extract_8xi32_at_2(<4 x i32>, <4 x i32>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <4 x i32> %0, i32 2
+; CHECK-NEXT: ret i32 %2
+; CHECK-NEXT: }
+
+define i32 @extract_8xi32_at_3(<8 x i32>) {
+entry:
+ %1 = extractelement <8 x i32> %0, i32 3
+ ret i32 %1
+}
+; CHECK-LABEL: define i32 @extract_8xi32_at_3(<4 x i32>, <4 x i32>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <4 x i32> %0, i32 3
+; CHECK-NEXT: ret i32 %2
+; CHECK-NEXT: }
+
+define i32 @extract_8xi32_at_4(<8 x i32>) {
+entry:
+ %1 = extractelement <8 x i32> %0, i32 4
+ ret i32 %1
+}
+; CHECK-LABEL: define i32 @extract_8xi32_at_4(<4 x i32>, <4 x i32>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <4 x i32> %1, i32 0
+; CHECK-NEXT: ret i32 %2
+; CHECK-NEXT: }
+
+define i32 @extract_8xi32_at_5(<8 x i32>) {
+entry:
+ %1 = extractelement <8 x i32> %0, i32 5
+ ret i32 %1
+}
+; CHECK-LABEL: define i32 @extract_8xi32_at_5(<4 x i32>, <4 x i32>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <4 x i32> %1, i32 1
+; CHECK-NEXT: ret i32 %2
+; CHECK-NEXT: }
+
+define i32 @extract_8xi32_at_6(<8 x i32>) {
+entry:
+ %1 = extractelement <8 x i32> %0, i32 6
+ ret i32 %1
+}
+; CHECK-LABEL: define i32 @extract_8xi32_at_6(<4 x i32>, <4 x i32>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <4 x i32> %1, i32 2
+; CHECK-NEXT: ret i32 %2
+; CHECK-NEXT: }
+
+define i32 @extract_8xi32_at_7(<8 x i32>) {
+entry:
+ %1 = extractelement <8 x i32> %0, i32 7
+ ret i32 %1
+}
+; CHECK-LABEL: define i32 @extract_8xi32_at_7(<4 x i32>, <4 x i32>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <4 x i32> %1, i32 3
+; CHECK-NEXT: ret i32 %2
+; CHECK-NEXT: }
+
+define i32 @extract_8xi32_undef_idx(<8 x i32>) {
+entry:
+ %1 = extractelement <8 x i32> %0, i32 8
+ ret i32 %1
+}
+; CHECK-LABEL: define i32 @extract_8xi32_undef_idx(<4 x i32>, <4 x i32>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <4 x i32> %1, i32 4
+; CHECK-NEXT: ret i32 %2
+; CHECK-NEXT: }
+
+define i64 @extract_8xi64_at_0(<8 x i64>) {
+entry:
+ %1 = extractelement <8 x i64> %0, i32 0
+ ret i64 %1
+}
+; CHECK-LABEL: define i64 @extract_8xi64_at_0(<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>) {
+; CHECK: entry:
+; CHECK-NEXT: %4 = extractelement <2 x i64> %0, i32 0
+; CHECK-NEXT: ret i64 %4
+; CHECK-NEXT: }
+
+define i64 @extract_8xi64_at_1(<8 x i64>) {
+entry:
+ %1 = extractelement <8 x i64> %0, i32 1
+ ret i64 %1
+}
+; CHECK-LABEL: define i64 @extract_8xi64_at_1(<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>) {
+; CHECK: entry:
+; CHECK-NEXT: %4 = extractelement <2 x i64> %0, i32 1
+; CHECK-NEXT: ret i64 %4
+; CHECK-NEXT: }
+
+define i64 @extract_8xi64_at_2(<8 x i64>) {
+entry:
+ %1 = extractelement <8 x i64> %0, i32 2
+ ret i64 %1
+}
+; CHECK-LABEL: define i64 @extract_8xi64_at_2(<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>) {
+; CHECK: entry:
+; CHECK-NEXT: %4 = extractelement <2 x i64> %1, i32 0
+; CHECK-NEXT: ret i64 %4
+; CHECK-NEXT: }
+
+define i64 @extract_8xi64_at_3(<8 x i64>) {
+entry:
+ %1 = extractelement <8 x i64> %0, i32 3
+ ret i64 %1
+}
+; CHECK-LABEL: define i64 @extract_8xi64_at_3(<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>) {
+; CHECK: entry:
+; CHECK-NEXT: %4 = extractelement <2 x i64> %1, i32 1
+; CHECK-NEXT: ret i64 %4
+; CHECK-NEXT: }
+
+define i64 @extract_8xi64_at_4(<8 x i64>) {
+entry:
+ %1 = extractelement <8 x i64> %0, i32 4
+ ret i64 %1
+}
+; CHECK-LABEL: define i64 @extract_8xi64_at_4(<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>) {
+; CHECK: entry:
+; CHECK-NEXT: %4 = extractelement <2 x i64> %2, i32 0
+; CHECK-NEXT: ret i64 %4
+; CHECK-NEXT: }
+
+define i64 @extract_8xi64_at_5(<8 x i64>) {
+entry:
+ %1 = extractelement <8 x i64> %0, i32 5
+ ret i64 %1
+}
+; CHECK-LABEL: define i64 @extract_8xi64_at_5(<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>) {
+; CHECK: entry:
+; CHECK-NEXT: %4 = extractelement <2 x i64> %2, i32 1
+; CHECK-NEXT: ret i64 %4
+; CHECK-NEXT: }
+
+define i64 @extract_8xi64_at_6(<8 x i64>) {
+entry:
+ %1 = extractelement <8 x i64> %0, i32 6
+ ret i64 %1
+}
+; CHECK-LABEL: define i64 @extract_8xi64_at_6(<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>) {
+; CHECK: entry:
+; CHECK-NEXT: %4 = extractelement <2 x i64> %3, i32 0
+; CHECK-NEXT: ret i64 %4
+; CHECK-NEXT: }
+
+define i64 @extract_8xi64_at_7(<8 x i64>) {
+entry:
+ %1 = extractelement <8 x i64> %0, i32 7
+ ret i64 %1
+}
+; CHECK-LABEL: define i64 @extract_8xi64_at_7(<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>) {
+; CHECK: entry:
+; CHECK-NEXT: %4 = extractelement <2 x i64> %3, i32 1
+; CHECK-NEXT: ret i64 %4
+; CHECK-NEXT: }
+
+define i64 @extract_8xi64_undef_idx(<8 x i64>) {
+entry:
+ %1 = extractelement <8 x i64> %0, i32 8
+ ret i64 %1
+}
+; CHECK-LABEL: define i64 @extract_8xi64_undef_idx(<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>) {
+; CHECK: entry:
+; CHECK-NEXT: %4 = extractelement <2 x i64> %3, i32 2
+; CHECK-NEXT: ret i64 %4
+; CHECK-NEXT: }
+
+define i8* @extract_8xi8ptr_at_0(<8 x i8*>) {
+entry:
+ %1 = extractelement <8 x i8*> %0, i32 0
+ ret i8* %1
+}
+; CHECK-LABEL: define i8* @extract_8xi8ptr_at_0(<4 x i8*>, <4 x i8*>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <4 x i8*> %0, i32 0
+; CHECK-NEXT: ret i8* %2
+; CHECK-NEXT: }
+
+define i8* @extract_8xi8ptr_at_1(<8 x i8*>) {
+entry:
+ %1 = extractelement <8 x i8*> %0, i32 1
+ ret i8* %1
+}
+; CHECK-LABEL: define i8* @extract_8xi8ptr_at_1(<4 x i8*>, <4 x i8*>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <4 x i8*> %0, i32 1
+; CHECK-NEXT: ret i8* %2
+; CHECK-NEXT: }
+
+define i8* @extract_8xi8ptr_at_2(<8 x i8*>) {
+entry:
+ %1 = extractelement <8 x i8*> %0, i32 2
+ ret i8* %1
+}
+; CHECK-LABEL: define i8* @extract_8xi8ptr_at_2(<4 x i8*>, <4 x i8*>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <4 x i8*> %0, i32 2
+; CHECK-NEXT: ret i8* %2
+; CHECK-NEXT: }
+
+define i8* @extract_8xi8ptr_at_3(<8 x i8*>) {
+entry:
+ %1 = extractelement <8 x i8*> %0, i32 3
+ ret i8* %1
+}
+; CHECK-LABEL: define i8* @extract_8xi8ptr_at_3(<4 x i8*>, <4 x i8*>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <4 x i8*> %0, i32 3
+; CHECK-NEXT: ret i8* %2
+; CHECK-NEXT: }
+
+define i8* @extract_8xi8ptr_at_4(<8 x i8*>) {
+entry:
+ %1 = extractelement <8 x i8*> %0, i32 4
+ ret i8* %1
+}
+; CHECK-LABEL: define i8* @extract_8xi8ptr_at_4(<4 x i8*>, <4 x i8*>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <4 x i8*> %1, i32 0
+; CHECK-NEXT: ret i8* %2
+; CHECK-NEXT: }
+
+define i8* @extract_8xi8ptr_at_5(<8 x i8*>) {
+entry:
+ %1 = extractelement <8 x i8*> %0, i32 5
+ ret i8* %1
+}
+; CHECK-LABEL: define i8* @extract_8xi8ptr_at_5(<4 x i8*>, <4 x i8*>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <4 x i8*> %1, i32 1
+; CHECK-NEXT: ret i8* %2
+; CHECK-NEXT: }
+
+define i8* @extract_8xi8ptr_at_6(<8 x i8*>) {
+entry:
+ %1 = extractelement <8 x i8*> %0, i32 6
+ ret i8* %1
+}
+; CHECK-LABEL: define i8* @extract_8xi8ptr_at_6(<4 x i8*>, <4 x i8*>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <4 x i8*> %1, i32 2
+; CHECK-NEXT: ret i8* %2
+; CHECK-NEXT: }
+
+define i8* @extract_8xi8ptr_at_7(<8 x i8*>) {
+entry:
+ %1 = extractelement <8 x i8*> %0, i32 7
+ ret i8* %1
+}
+; CHECK-LABEL: define i8* @extract_8xi8ptr_at_7(<4 x i8*>, <4 x i8*>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <4 x i8*> %1, i32 3
+; CHECK-NEXT: ret i8* %2
+; CHECK-NEXT: }
+
+define i8* @extract_8xi8ptr_undef_idx(<8 x i8*>) {
+entry:
+ %1 = extractelement <8 x i8*> %0, i32 8
+ ret i8* %1
+}
+; CHECK-LABEL: define i8* @extract_8xi8ptr_undef_idx(<4 x i8*>, <4 x i8*>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <4 x i8*> %1, i32 4
+; CHECK-NEXT: ret i8* %2
+; CHECK-NEXT: }
+
+define float @extract_8xfloat_at_0(<8 x float>) {
+entry:
+ %1 = extractelement <8 x float> %0, i32 0
+ ret float %1
+}
+; CHECK-LABEL: define float @extract_8xfloat_at_0(<4 x float>, <4 x float>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <4 x float> %0, i32 0
+; CHECK-NEXT: ret float %2
+; CHECK-NEXT: }
+
+define float @extract_8xfloat_at_1(<8 x float>) {
+entry:
+ %1 = extractelement <8 x float> %0, i32 1
+ ret float %1
+}
+; CHECK-LABEL: define float @extract_8xfloat_at_1(<4 x float>, <4 x float>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <4 x float> %0, i32 1
+; CHECK-NEXT: ret float %2
+; CHECK-NEXT: }
+
+define float @extract_8xfloat_at_2(<8 x float>) {
+entry:
+ %1 = extractelement <8 x float> %0, i32 2
+ ret float %1
+}
+; CHECK-LABEL: define float @extract_8xfloat_at_2(<4 x float>, <4 x float>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <4 x float> %0, i32 2
+; CHECK-NEXT: ret float %2
+; CHECK-NEXT: }
+
+define float @extract_8xfloat_at_3(<8 x float>) {
+entry:
+ %1 = extractelement <8 x float> %0, i32 3
+ ret float %1
+}
+; CHECK-LABEL: define float @extract_8xfloat_at_3(<4 x float>, <4 x float>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <4 x float> %0, i32 3
+; CHECK-NEXT: ret float %2
+; CHECK-NEXT: }
+
+define float @extract_8xfloat_at_4(<8 x float>) {
+entry:
+ %1 = extractelement <8 x float> %0, i32 4
+ ret float %1
+}
+; CHECK-LABEL: define float @extract_8xfloat_at_4(<4 x float>, <4 x float>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <4 x float> %1, i32 0
+; CHECK-NEXT: ret float %2
+; CHECK-NEXT: }
+
+define float @extract_8xfloat_at_5(<8 x float>) {
+entry:
+ %1 = extractelement <8 x float> %0, i32 5
+ ret float %1
+}
+; CHECK-LABEL: define float @extract_8xfloat_at_5(<4 x float>, <4 x float>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <4 x float> %1, i32 1
+; CHECK-NEXT: ret float %2
+; CHECK-NEXT: }
+
+define float @extract_8xfloat_at_6(<8 x float>) {
+entry:
+ %1 = extractelement <8 x float> %0, i32 6
+ ret float %1
+}
+; CHECK-LABEL: define float @extract_8xfloat_at_6(<4 x float>, <4 x float>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <4 x float> %1, i32 2
+; CHECK-NEXT: ret float %2
+; CHECK-NEXT: }
+
+define float @extract_8xfloat_at_7(<8 x float>) {
+entry:
+ %1 = extractelement <8 x float> %0, i32 7
+ ret float %1
+}
+; CHECK-LABEL: define float @extract_8xfloat_at_7(<4 x float>, <4 x float>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <4 x float> %1, i32 3
+; CHECK-NEXT: ret float %2
+; CHECK-NEXT: }
+
+define float @extract_8xfloat_undef_idx(<8 x float>) {
+entry:
+ %1 = extractelement <8 x float> %0, i32 8
+ ret float %1
+}
+; CHECK-LABEL: define float @extract_8xfloat_undef_idx(<4 x float>, <4 x float>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <4 x float> %1, i32 4
+; CHECK-NEXT: ret float %2
+; CHECK-NEXT: }
+
+define double @extract_8xdouble_at_0(<8 x double>) {
+entry:
+ %1 = extractelement <8 x double> %0, i32 0
+ ret double %1
+}
+; CHECK-LABEL: define double @extract_8xdouble_at_0(<2 x double>, <2 x double>, <2 x double>, <2 x double>) {
+; CHECK: entry:
+; CHECK-NEXT: %4 = extractelement <2 x double> %0, i32 0
+; CHECK-NEXT: ret double %4
+; CHECK-NEXT: }
+
+define double @extract_8xdouble_at_1(<8 x double>) {
+entry:
+ %1 = extractelement <8 x double> %0, i32 1
+ ret double %1
+}
+; CHECK-LABEL: define double @extract_8xdouble_at_1(<2 x double>, <2 x double>, <2 x double>, <2 x double>) {
+; CHECK: entry:
+; CHECK-NEXT: %4 = extractelement <2 x double> %0, i32 1
+; CHECK-NEXT: ret double %4
+; CHECK-NEXT: }
+
+define double @extract_8xdouble_at_2(<8 x double>) {
+entry:
+ %1 = extractelement <8 x double> %0, i32 2
+ ret double %1
+}
+; CHECK-LABEL: define double @extract_8xdouble_at_2(<2 x double>, <2 x double>, <2 x double>, <2 x double>) {
+; CHECK: entry:
+; CHECK-NEXT: %4 = extractelement <2 x double> %1, i32 0
+; CHECK-NEXT: ret double %4
+; CHECK-NEXT: }
+
+define double @extract_8xdouble_at_3(<8 x double>) {
+entry:
+ %1 = extractelement <8 x double> %0, i32 3
+ ret double %1
+}
+; CHECK-LABEL: define double @extract_8xdouble_at_3(<2 x double>, <2 x double>, <2 x double>, <2 x double>) {
+; CHECK: entry:
+; CHECK-NEXT: %4 = extractelement <2 x double> %1, i32 1
+; CHECK-NEXT: ret double %4
+; CHECK-NEXT: }
+
+define double @extract_8xdouble_at_4(<8 x double>) {
+entry:
+ %1 = extractelement <8 x double> %0, i32 4
+ ret double %1
+}
+; CHECK-LABEL: define double @extract_8xdouble_at_4(<2 x double>, <2 x double>, <2 x double>, <2 x double>) {
+; CHECK: entry:
+; CHECK-NEXT: %4 = extractelement <2 x double> %2, i32 0
+; CHECK-NEXT: ret double %4
+; CHECK-NEXT: }
+
+define double @extract_8xdouble_at_5(<8 x double>) {
+entry:
+ %1 = extractelement <8 x double> %0, i32 5
+ ret double %1
+}
+; CHECK-LABEL: define double @extract_8xdouble_at_5(<2 x double>, <2 x double>, <2 x double>, <2 x double>) {
+; CHECK: entry:
+; CHECK-NEXT: %4 = extractelement <2 x double> %2, i32 1
+; CHECK-NEXT: ret double %4
+; CHECK-NEXT: }
+
+define double @extract_8xdouble_at_6(<8 x double>) {
+entry:
+ %1 = extractelement <8 x double> %0, i32 6
+ ret double %1
+}
+; CHECK-LABEL: define double @extract_8xdouble_at_6(<2 x double>, <2 x double>, <2 x double>, <2 x double>) {
+; CHECK: entry:
+; CHECK-NEXT: %4 = extractelement <2 x double> %3, i32 0
+; CHECK-NEXT: ret double %4
+; CHECK-NEXT: }
+
+define double @extract_8xdouble_at_7(<8 x double>) {
+entry:
+ %1 = extractelement <8 x double> %0, i32 7
+ ret double %1
+}
+; CHECK-LABEL: define double @extract_8xdouble_at_7(<2 x double>, <2 x double>, <2 x double>, <2 x double>) {
+; CHECK: entry:
+; CHECK-NEXT: %4 = extractelement <2 x double> %3, i32 1
+; CHECK-NEXT: ret double %4
+; CHECK-NEXT: }
+
+define double @extract_8xdouble_undef_idx(<8 x double>) {
+entry:
+ %1 = extractelement <8 x double> %0, i32 8
+ ret double %1
+}
+; CHECK-LABEL: define double @extract_8xdouble_undef_idx(<2 x double>, <2 x double>, <2 x double>, <2 x double>) {
+; CHECK: entry:
+; CHECK-NEXT: %4 = extractelement <2 x double> %3, i32 2
+; CHECK-NEXT: ret double %4
+; CHECK-NEXT: }
+
+define i8 @extract_12xi8_at_0(<12 x i8>) {
+entry:
+ %1 = extractelement <12 x i8> %0, i32 0
+ ret i8 %1
+}
+; CHECK-LABEL: define i8 @extract_12xi8_at_0(<16 x i8>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <16 x i8> %0, i32 0
+; CHECK-NEXT: ret i8 %1
+; CHECK-NEXT: }
+
+define i8 @extract_12xi8_at_1(<12 x i8>) {
+entry:
+ %1 = extractelement <12 x i8> %0, i32 1
+ ret i8 %1
+}
+; CHECK-LABEL: define i8 @extract_12xi8_at_1(<16 x i8>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <16 x i8> %0, i32 1
+; CHECK-NEXT: ret i8 %1
+; CHECK-NEXT: }
+
+define i8 @extract_12xi8_at_2(<12 x i8>) {
+entry:
+ %1 = extractelement <12 x i8> %0, i32 2
+ ret i8 %1
+}
+; CHECK-LABEL: define i8 @extract_12xi8_at_2(<16 x i8>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <16 x i8> %0, i32 2
+; CHECK-NEXT: ret i8 %1
+; CHECK-NEXT: }
+
+define i8 @extract_12xi8_at_3(<12 x i8>) {
+entry:
+ %1 = extractelement <12 x i8> %0, i32 3
+ ret i8 %1
+}
+; CHECK-LABEL: define i8 @extract_12xi8_at_3(<16 x i8>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <16 x i8> %0, i32 3
+; CHECK-NEXT: ret i8 %1
+; CHECK-NEXT: }
+
+define i8 @extract_12xi8_at_4(<12 x i8>) {
+entry:
+ %1 = extractelement <12 x i8> %0, i32 4
+ ret i8 %1
+}
+; CHECK-LABEL: define i8 @extract_12xi8_at_4(<16 x i8>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <16 x i8> %0, i32 4
+; CHECK-NEXT: ret i8 %1
+; CHECK-NEXT: }
+
+define i8 @extract_12xi8_at_5(<12 x i8>) {
+entry:
+ %1 = extractelement <12 x i8> %0, i32 5
+ ret i8 %1
+}
+; CHECK-LABEL: define i8 @extract_12xi8_at_5(<16 x i8>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <16 x i8> %0, i32 5
+; CHECK-NEXT: ret i8 %1
+; CHECK-NEXT: }
+
+define i8 @extract_12xi8_at_6(<12 x i8>) {
+entry:
+ %1 = extractelement <12 x i8> %0, i32 6
+ ret i8 %1
+}
+; CHECK-LABEL: define i8 @extract_12xi8_at_6(<16 x i8>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <16 x i8> %0, i32 6
+; CHECK-NEXT: ret i8 %1
+; CHECK-NEXT: }
+
+define i8 @extract_12xi8_at_7(<12 x i8>) {
+entry:
+ %1 = extractelement <12 x i8> %0, i32 7
+ ret i8 %1
+}
+; CHECK-LABEL: define i8 @extract_12xi8_at_7(<16 x i8>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <16 x i8> %0, i32 7
+; CHECK-NEXT: ret i8 %1
+; CHECK-NEXT: }
+
+define i8 @extract_12xi8_at_8(<12 x i8>) {
+entry:
+ %1 = extractelement <12 x i8> %0, i32 8
+ ret i8 %1
+}
+; CHECK-LABEL: define i8 @extract_12xi8_at_8(<16 x i8>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <16 x i8> %0, i32 8
+; CHECK-NEXT: ret i8 %1
+; CHECK-NEXT: }
+
+define i8 @extract_12xi8_at_9(<12 x i8>) {
+entry:
+ %1 = extractelement <12 x i8> %0, i32 9
+ ret i8 %1
+}
+; CHECK-LABEL: define i8 @extract_12xi8_at_9(<16 x i8>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <16 x i8> %0, i32 9
+; CHECK-NEXT: ret i8 %1
+; CHECK-NEXT: }
+
+define i8 @extract_12xi8_at_10(<12 x i8>) {
+entry:
+ %1 = extractelement <12 x i8> %0, i32 10
+ ret i8 %1
+}
+; CHECK-LABEL: define i8 @extract_12xi8_at_10(<16 x i8>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <16 x i8> %0, i32 10
+; CHECK-NEXT: ret i8 %1
+; CHECK-NEXT: }
+
+define i8 @extract_12xi8_at_11(<12 x i8>) {
+entry:
+ %1 = extractelement <12 x i8> %0, i32 11
+ ret i8 %1
+}
+; CHECK-LABEL: define i8 @extract_12xi8_at_11(<16 x i8>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <16 x i8> %0, i32 11
+; CHECK-NEXT: ret i8 %1
+; CHECK-NEXT: }
+
+define i8 @extract_12xi8_undef_idx(<12 x i8>) {
+entry:
+ %1 = extractelement <12 x i8> %0, i32 12
+ ret i8 %1
+}
+; CHECK-LABEL: define i8 @extract_12xi8_undef_idx(<16 x i8>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <16 x i8> %0, i32 12
+; CHECK-NEXT: ret i8 %1
+; CHECK-NEXT: }
+
+define i16 @extract_12xi16_at_0(<12 x i16>) {
+entry:
+ %1 = extractelement <12 x i16> %0, i32 0
+ ret i16 %1
+}
+; CHECK-LABEL: define i16 @extract_12xi16_at_0(<8 x i16>, <8 x i16>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <8 x i16> %0, i32 0
+; CHECK-NEXT: ret i16 %2
+; CHECK-NEXT: }
+
+define i16 @extract_12xi16_at_1(<12 x i16>) {
+entry:
+ %1 = extractelement <12 x i16> %0, i32 1
+ ret i16 %1
+}
+; CHECK-LABEL: define i16 @extract_12xi16_at_1(<8 x i16>, <8 x i16>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <8 x i16> %0, i32 1
+; CHECK-NEXT: ret i16 %2
+; CHECK-NEXT: }
+
+define i16 @extract_12xi16_at_2(<12 x i16>) {
+entry:
+ %1 = extractelement <12 x i16> %0, i32 2
+ ret i16 %1
+}
+; CHECK-LABEL: define i16 @extract_12xi16_at_2(<8 x i16>, <8 x i16>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <8 x i16> %0, i32 2
+; CHECK-NEXT: ret i16 %2
+; CHECK-NEXT: }
+
+define i16 @extract_12xi16_at_3(<12 x i16>) {
+entry:
+ %1 = extractelement <12 x i16> %0, i32 3
+ ret i16 %1
+}
+; CHECK-LABEL: define i16 @extract_12xi16_at_3(<8 x i16>, <8 x i16>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <8 x i16> %0, i32 3
+; CHECK-NEXT: ret i16 %2
+; CHECK-NEXT: }
+
+define i16 @extract_12xi16_at_4(<12 x i16>) {
+entry:
+ %1 = extractelement <12 x i16> %0, i32 4
+ ret i16 %1
+}
+; CHECK-LABEL: define i16 @extract_12xi16_at_4(<8 x i16>, <8 x i16>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <8 x i16> %0, i32 4
+; CHECK-NEXT: ret i16 %2
+; CHECK-NEXT: }
+
+define i16 @extract_12xi16_at_5(<12 x i16>) {
+entry:
+ %1 = extractelement <12 x i16> %0, i32 5
+ ret i16 %1
+}
+; CHECK-LABEL: define i16 @extract_12xi16_at_5(<8 x i16>, <8 x i16>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <8 x i16> %0, i32 5
+; CHECK-NEXT: ret i16 %2
+; CHECK-NEXT: }
+
+define i16 @extract_12xi16_at_6(<12 x i16>) {
+entry:
+ %1 = extractelement <12 x i16> %0, i32 6
+ ret i16 %1
+}
+; CHECK-LABEL: define i16 @extract_12xi16_at_6(<8 x i16>, <8 x i16>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <8 x i16> %0, i32 6
+; CHECK-NEXT: ret i16 %2
+; CHECK-NEXT: }
+
+define i16 @extract_12xi16_at_7(<12 x i16>) {
+entry:
+ %1 = extractelement <12 x i16> %0, i32 7
+ ret i16 %1
+}
+; CHECK-LABEL: define i16 @extract_12xi16_at_7(<8 x i16>, <8 x i16>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <8 x i16> %0, i32 7
+; CHECK-NEXT: ret i16 %2
+; CHECK-NEXT: }
+
+define i16 @extract_12xi16_at_8(<12 x i16>) {
+entry:
+ %1 = extractelement <12 x i16> %0, i32 8
+ ret i16 %1
+}
+; CHECK-LABEL: define i16 @extract_12xi16_at_8(<8 x i16>, <8 x i16>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <8 x i16> %1, i32 0
+; CHECK-NEXT: ret i16 %2
+; CHECK-NEXT: }
+
+define i16 @extract_12xi16_at_9(<12 x i16>) {
+entry:
+ %1 = extractelement <12 x i16> %0, i32 9
+ ret i16 %1
+}
+; CHECK-LABEL: define i16 @extract_12xi16_at_9(<8 x i16>, <8 x i16>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <8 x i16> %1, i32 1
+; CHECK-NEXT: ret i16 %2
+; CHECK-NEXT: }
+
+define i16 @extract_12xi16_at_10(<12 x i16>) {
+entry:
+ %1 = extractelement <12 x i16> %0, i32 10
+ ret i16 %1
+}
+; CHECK-LABEL: define i16 @extract_12xi16_at_10(<8 x i16>, <8 x i16>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <8 x i16> %1, i32 2
+; CHECK-NEXT: ret i16 %2
+; CHECK-NEXT: }
+
+define i16 @extract_12xi16_at_11(<12 x i16>) {
+entry:
+ %1 = extractelement <12 x i16> %0, i32 11
+ ret i16 %1
+}
+; CHECK-LABEL: define i16 @extract_12xi16_at_11(<8 x i16>, <8 x i16>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <8 x i16> %1, i32 3
+; CHECK-NEXT: ret i16 %2
+; CHECK-NEXT: }
+
+define i16 @extract_12xi16_undef_idx(<12 x i16>) {
+entry:
+ %1 = extractelement <12 x i16> %0, i32 12
+ ret i16 %1
+}
+; CHECK-LABEL: define i16 @extract_12xi16_undef_idx(<8 x i16>, <8 x i16>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <8 x i16> %1, i32 4
+; CHECK-NEXT: ret i16 %2
+; CHECK-NEXT: }
+
+define i32 @extract_12xi32_at_0(<12 x i32>) {
+entry:
+ %1 = extractelement <12 x i32> %0, i32 0
+ ret i32 %1
+}
+; CHECK-LABEL: define i32 @extract_12xi32_at_0(<4 x i32>, <4 x i32>, <4 x i32>) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <4 x i32> %0, i32 0
+; CHECK-NEXT: ret i32 %3
+; CHECK-NEXT: }
+
+define i32 @extract_12xi32_at_1(<12 x i32>) {
+entry:
+ %1 = extractelement <12 x i32> %0, i32 1
+ ret i32 %1
+}
+; CHECK-LABEL: define i32 @extract_12xi32_at_1(<4 x i32>, <4 x i32>, <4 x i32>) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <4 x i32> %0, i32 1
+; CHECK-NEXT: ret i32 %3
+; CHECK-NEXT: }
+
+define i32 @extract_12xi32_at_2(<12 x i32>) {
+entry:
+ %1 = extractelement <12 x i32> %0, i32 2
+ ret i32 %1
+}
+; CHECK-LABEL: define i32 @extract_12xi32_at_2(<4 x i32>, <4 x i32>, <4 x i32>) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <4 x i32> %0, i32 2
+; CHECK-NEXT: ret i32 %3
+; CHECK-NEXT: }
+
+define i32 @extract_12xi32_at_3(<12 x i32>) {
+entry:
+ %1 = extractelement <12 x i32> %0, i32 3
+ ret i32 %1
+}
+; CHECK-LABEL: define i32 @extract_12xi32_at_3(<4 x i32>, <4 x i32>, <4 x i32>) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <4 x i32> %0, i32 3
+; CHECK-NEXT: ret i32 %3
+; CHECK-NEXT: }
+
+define i32 @extract_12xi32_at_4(<12 x i32>) {
+entry:
+ %1 = extractelement <12 x i32> %0, i32 4
+ ret i32 %1
+}
+; CHECK-LABEL: define i32 @extract_12xi32_at_4(<4 x i32>, <4 x i32>, <4 x i32>) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <4 x i32> %1, i32 0
+; CHECK-NEXT: ret i32 %3
+; CHECK-NEXT: }
+
+define i32 @extract_12xi32_at_5(<12 x i32>) {
+entry:
+ %1 = extractelement <12 x i32> %0, i32 5
+ ret i32 %1
+}
+; CHECK-LABEL: define i32 @extract_12xi32_at_5(<4 x i32>, <4 x i32>, <4 x i32>) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <4 x i32> %1, i32 1
+; CHECK-NEXT: ret i32 %3
+; CHECK-NEXT: }
+
+define i32 @extract_12xi32_at_6(<12 x i32>) {
+entry:
+ %1 = extractelement <12 x i32> %0, i32 6
+ ret i32 %1
+}
+; CHECK-LABEL: define i32 @extract_12xi32_at_6(<4 x i32>, <4 x i32>, <4 x i32>) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <4 x i32> %1, i32 2
+; CHECK-NEXT: ret i32 %3
+; CHECK-NEXT: }
+
+define i32 @extract_12xi32_at_7(<12 x i32>) {
+entry:
+ %1 = extractelement <12 x i32> %0, i32 7
+ ret i32 %1
+}
+; CHECK-LABEL: define i32 @extract_12xi32_at_7(<4 x i32>, <4 x i32>, <4 x i32>) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <4 x i32> %1, i32 3
+; CHECK-NEXT: ret i32 %3
+; CHECK-NEXT: }
+
+define i32 @extract_12xi32_at_8(<12 x i32>) {
+entry:
+ %1 = extractelement <12 x i32> %0, i32 8
+ ret i32 %1
+}
+; CHECK-LABEL: define i32 @extract_12xi32_at_8(<4 x i32>, <4 x i32>, <4 x i32>) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <4 x i32> %2, i32 0
+; CHECK-NEXT: ret i32 %3
+; CHECK-NEXT: }
+
+define i32 @extract_12xi32_at_9(<12 x i32>) {
+entry:
+ %1 = extractelement <12 x i32> %0, i32 9
+ ret i32 %1
+}
+; CHECK-LABEL: define i32 @extract_12xi32_at_9(<4 x i32>, <4 x i32>, <4 x i32>) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <4 x i32> %2, i32 1
+; CHECK-NEXT: ret i32 %3
+; CHECK-NEXT: }
+
+define i32 @extract_12xi32_at_10(<12 x i32>) {
+entry:
+ %1 = extractelement <12 x i32> %0, i32 10
+ ret i32 %1
+}
+; CHECK-LABEL: define i32 @extract_12xi32_at_10(<4 x i32>, <4 x i32>, <4 x i32>) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <4 x i32> %2, i32 2
+; CHECK-NEXT: ret i32 %3
+; CHECK-NEXT: }
+
+define i32 @extract_12xi32_at_11(<12 x i32>) {
+entry:
+ %1 = extractelement <12 x i32> %0, i32 11
+ ret i32 %1
+}
+; CHECK-LABEL: define i32 @extract_12xi32_at_11(<4 x i32>, <4 x i32>, <4 x i32>) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <4 x i32> %2, i32 3
+; CHECK-NEXT: ret i32 %3
+; CHECK-NEXT: }
+
+define i32 @extract_12xi32_undef_idx(<12 x i32>) {
+entry:
+ %1 = extractelement <12 x i32> %0, i32 12
+ ret i32 %1
+}
+; CHECK-LABEL: define i32 @extract_12xi32_undef_idx(<4 x i32>, <4 x i32>, <4 x i32>) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <4 x i32> %2, i32 4
+; CHECK-NEXT: ret i32 %3
+; CHECK-NEXT: }
+
+define i64 @extract_12xi64_at_0(<12 x i64>) {
+entry:
+ %1 = extractelement <12 x i64> %0, i32 0
+ ret i64 %1
+}
+; CHECK-LABEL: define i64 @extract_12xi64_at_0(<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>) {
+; CHECK: entry:
+; CHECK-NEXT: %6 = extractelement <2 x i64> %0, i32 0
+; CHECK-NEXT: ret i64 %6
+; CHECK-NEXT: }
+
+define i64 @extract_12xi64_at_1(<12 x i64>) {
+entry:
+ %1 = extractelement <12 x i64> %0, i32 1
+ ret i64 %1
+}
+; CHECK-LABEL: define i64 @extract_12xi64_at_1(<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>) {
+; CHECK: entry:
+; CHECK-NEXT: %6 = extractelement <2 x i64> %0, i32 1
+; CHECK-NEXT: ret i64 %6
+; CHECK-NEXT: }
+
+define i64 @extract_12xi64_at_2(<12 x i64>) {
+entry:
+ %1 = extractelement <12 x i64> %0, i32 2
+ ret i64 %1
+}
+; CHECK-LABEL: define i64 @extract_12xi64_at_2(<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>) {
+; CHECK: entry:
+; CHECK-NEXT: %6 = extractelement <2 x i64> %1, i32 0
+; CHECK-NEXT: ret i64 %6
+; CHECK-NEXT: }
+
+define i64 @extract_12xi64_at_3(<12 x i64>) {
+entry:
+ %1 = extractelement <12 x i64> %0, i32 3
+ ret i64 %1
+}
+; CHECK-LABEL: define i64 @extract_12xi64_at_3(<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>) {
+; CHECK: entry:
+; CHECK-NEXT: %6 = extractelement <2 x i64> %1, i32 1
+; CHECK-NEXT: ret i64 %6
+; CHECK-NEXT: }
+
+define i64 @extract_12xi64_at_4(<12 x i64>) {
+entry:
+ %1 = extractelement <12 x i64> %0, i32 4
+ ret i64 %1
+}
+; CHECK-LABEL: define i64 @extract_12xi64_at_4(<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>) {
+; CHECK: entry:
+; CHECK-NEXT: %6 = extractelement <2 x i64> %2, i32 0
+; CHECK-NEXT: ret i64 %6
+; CHECK-NEXT: }
+
+define i64 @extract_12xi64_at_5(<12 x i64>) {
+entry:
+ %1 = extractelement <12 x i64> %0, i32 5
+ ret i64 %1
+}
+; CHECK-LABEL: define i64 @extract_12xi64_at_5(<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>) {
+; CHECK: entry:
+; CHECK-NEXT: %6 = extractelement <2 x i64> %2, i32 1
+; CHECK-NEXT: ret i64 %6
+; CHECK-NEXT: }
+
+define i64 @extract_12xi64_at_6(<12 x i64>) {
+entry:
+ %1 = extractelement <12 x i64> %0, i32 6
+ ret i64 %1
+}
+; CHECK-LABEL: define i64 @extract_12xi64_at_6(<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>) {
+; CHECK: entry:
+; CHECK-NEXT: %6 = extractelement <2 x i64> %3, i32 0
+; CHECK-NEXT: ret i64 %6
+; CHECK-NEXT: }
+
+define i64 @extract_12xi64_at_7(<12 x i64>) {
+entry:
+ %1 = extractelement <12 x i64> %0, i32 7
+ ret i64 %1
+}
+; CHECK-LABEL: define i64 @extract_12xi64_at_7(<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>) {
+; CHECK: entry:
+; CHECK-NEXT: %6 = extractelement <2 x i64> %3, i32 1
+; CHECK-NEXT: ret i64 %6
+; CHECK-NEXT: }
+
+define i64 @extract_12xi64_at_8(<12 x i64>) {
+entry:
+ %1 = extractelement <12 x i64> %0, i32 8
+ ret i64 %1
+}
+; CHECK-LABEL: define i64 @extract_12xi64_at_8(<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>) {
+; CHECK: entry:
+; CHECK-NEXT: %6 = extractelement <2 x i64> %4, i32 0
+; CHECK-NEXT: ret i64 %6
+; CHECK-NEXT: }
+
+define i64 @extract_12xi64_at_9(<12 x i64>) {
+entry:
+ %1 = extractelement <12 x i64> %0, i32 9
+ ret i64 %1
+}
+; CHECK-LABEL: define i64 @extract_12xi64_at_9(<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>) {
+; CHECK: entry:
+; CHECK-NEXT: %6 = extractelement <2 x i64> %4, i32 1
+; CHECK-NEXT: ret i64 %6
+; CHECK-NEXT: }
+
+define i64 @extract_12xi64_at_10(<12 x i64>) {
+entry:
+ %1 = extractelement <12 x i64> %0, i32 10
+ ret i64 %1
+}
+; CHECK-LABEL: define i64 @extract_12xi64_at_10(<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>) {
+; CHECK: entry:
+; CHECK-NEXT: %6 = extractelement <2 x i64> %5, i32 0
+; CHECK-NEXT: ret i64 %6
+; CHECK-NEXT: }
+
+define i64 @extract_12xi64_at_11(<12 x i64>) {
+entry:
+ %1 = extractelement <12 x i64> %0, i32 11
+ ret i64 %1
+}
+; CHECK-LABEL: define i64 @extract_12xi64_at_11(<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>) {
+; CHECK: entry:
+; CHECK-NEXT: %6 = extractelement <2 x i64> %5, i32 1
+; CHECK-NEXT: ret i64 %6
+; CHECK-NEXT: }
+
+define i64 @extract_12xi64_undef_idx(<12 x i64>) {
+entry:
+ %1 = extractelement <12 x i64> %0, i32 12
+ ret i64 %1
+}
+; CHECK-LABEL: define i64 @extract_12xi64_undef_idx(<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>) {
+; CHECK: entry:
+; CHECK-NEXT: %6 = extractelement <2 x i64> %5, i32 2
+; CHECK-NEXT: ret i64 %6
+; CHECK-NEXT: }
+
+define i8* @extract_12xi8ptr_at_0(<12 x i8*>) {
+entry:
+ %1 = extractelement <12 x i8*> %0, i32 0
+ ret i8* %1
+}
+; CHECK-LABEL: define i8* @extract_12xi8ptr_at_0(<4 x i8*>, <4 x i8*>, <4 x i8*>) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <4 x i8*> %0, i32 0
+; CHECK-NEXT: ret i8* %3
+; CHECK-NEXT: }
+
+define i8* @extract_12xi8ptr_at_1(<12 x i8*>) {
+entry:
+ %1 = extractelement <12 x i8*> %0, i32 1
+ ret i8* %1
+}
+; CHECK-LABEL: define i8* @extract_12xi8ptr_at_1(<4 x i8*>, <4 x i8*>, <4 x i8*>) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <4 x i8*> %0, i32 1
+; CHECK-NEXT: ret i8* %3
+; CHECK-NEXT: }
+
+define i8* @extract_12xi8ptr_at_2(<12 x i8*>) {
+entry:
+ %1 = extractelement <12 x i8*> %0, i32 2
+ ret i8* %1
+}
+; CHECK-LABEL: define i8* @extract_12xi8ptr_at_2(<4 x i8*>, <4 x i8*>, <4 x i8*>) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <4 x i8*> %0, i32 2
+; CHECK-NEXT: ret i8* %3
+; CHECK-NEXT: }
+
+define i8* @extract_12xi8ptr_at_3(<12 x i8*>) {
+entry:
+ %1 = extractelement <12 x i8*> %0, i32 3
+ ret i8* %1
+}
+; CHECK-LABEL: define i8* @extract_12xi8ptr_at_3(<4 x i8*>, <4 x i8*>, <4 x i8*>) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <4 x i8*> %0, i32 3
+; CHECK-NEXT: ret i8* %3
+; CHECK-NEXT: }
+
+define i8* @extract_12xi8ptr_at_4(<12 x i8*>) {
+entry:
+ %1 = extractelement <12 x i8*> %0, i32 4
+ ret i8* %1
+}
+; CHECK-LABEL: define i8* @extract_12xi8ptr_at_4(<4 x i8*>, <4 x i8*>, <4 x i8*>) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <4 x i8*> %1, i32 0
+; CHECK-NEXT: ret i8* %3
+; CHECK-NEXT: }
+
+define i8* @extract_12xi8ptr_at_5(<12 x i8*>) {
+entry:
+ %1 = extractelement <12 x i8*> %0, i32 5
+ ret i8* %1
+}
+; CHECK-LABEL: define i8* @extract_12xi8ptr_at_5(<4 x i8*>, <4 x i8*>, <4 x i8*>) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <4 x i8*> %1, i32 1
+; CHECK-NEXT: ret i8* %3
+; CHECK-NEXT: }
+
+define i8* @extract_12xi8ptr_at_6(<12 x i8*>) {
+entry:
+ %1 = extractelement <12 x i8*> %0, i32 6
+ ret i8* %1
+}
+; CHECK-LABEL: define i8* @extract_12xi8ptr_at_6(<4 x i8*>, <4 x i8*>, <4 x i8*>) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <4 x i8*> %1, i32 2
+; CHECK-NEXT: ret i8* %3
+; CHECK-NEXT: }
+
+define i8* @extract_12xi8ptr_at_7(<12 x i8*>) {
+entry:
+ %1 = extractelement <12 x i8*> %0, i32 7
+ ret i8* %1
+}
+; CHECK-LABEL: define i8* @extract_12xi8ptr_at_7(<4 x i8*>, <4 x i8*>, <4 x i8*>) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <4 x i8*> %1, i32 3
+; CHECK-NEXT: ret i8* %3
+; CHECK-NEXT: }
+
+define i8* @extract_12xi8ptr_at_8(<12 x i8*>) {
+entry:
+ %1 = extractelement <12 x i8*> %0, i32 8
+ ret i8* %1
+}
+; CHECK-LABEL: define i8* @extract_12xi8ptr_at_8(<4 x i8*>, <4 x i8*>, <4 x i8*>) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <4 x i8*> %2, i32 0
+; CHECK-NEXT: ret i8* %3
+; CHECK-NEXT: }
+
+define i8* @extract_12xi8ptr_at_9(<12 x i8*>) {
+entry:
+ %1 = extractelement <12 x i8*> %0, i32 9
+ ret i8* %1
+}
+; CHECK-LABEL: define i8* @extract_12xi8ptr_at_9(<4 x i8*>, <4 x i8*>, <4 x i8*>) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <4 x i8*> %2, i32 1
+; CHECK-NEXT: ret i8* %3
+; CHECK-NEXT: }
+
+define i8* @extract_12xi8ptr_at_10(<12 x i8*>) {
+entry:
+ %1 = extractelement <12 x i8*> %0, i32 10
+ ret i8* %1
+}
+; CHECK-LABEL: define i8* @extract_12xi8ptr_at_10(<4 x i8*>, <4 x i8*>, <4 x i8*>) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <4 x i8*> %2, i32 2
+; CHECK-NEXT: ret i8* %3
+; CHECK-NEXT: }
+
+define i8* @extract_12xi8ptr_at_11(<12 x i8*>) {
+entry:
+ %1 = extractelement <12 x i8*> %0, i32 11
+ ret i8* %1
+}
+; CHECK-LABEL: define i8* @extract_12xi8ptr_at_11(<4 x i8*>, <4 x i8*>, <4 x i8*>) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <4 x i8*> %2, i32 3
+; CHECK-NEXT: ret i8* %3
+; CHECK-NEXT: }
+
+define i8* @extract_12xi8ptr_undef_idx(<12 x i8*>) {
+entry:
+ %1 = extractelement <12 x i8*> %0, i32 12
+ ret i8* %1
+}
+; CHECK-LABEL: define i8* @extract_12xi8ptr_undef_idx(<4 x i8*>, <4 x i8*>, <4 x i8*>) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <4 x i8*> %2, i32 4
+; CHECK-NEXT: ret i8* %3
+; CHECK-NEXT: }
+
+define float @extract_12xfloat_at_0(<12 x float>) {
+entry:
+ %1 = extractelement <12 x float> %0, i32 0
+ ret float %1
+}
+; CHECK-LABEL: define float @extract_12xfloat_at_0(<4 x float>, <4 x float>, <4 x float>) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <4 x float> %0, i32 0
+; CHECK-NEXT: ret float %3
+; CHECK-NEXT: }
+
+define float @extract_12xfloat_at_1(<12 x float>) {
+entry:
+ %1 = extractelement <12 x float> %0, i32 1
+ ret float %1
+}
+; CHECK-LABEL: define float @extract_12xfloat_at_1(<4 x float>, <4 x float>, <4 x float>) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <4 x float> %0, i32 1
+; CHECK-NEXT: ret float %3
+; CHECK-NEXT: }
+
+define float @extract_12xfloat_at_2(<12 x float>) {
+entry:
+ %1 = extractelement <12 x float> %0, i32 2
+ ret float %1
+}
+; CHECK-LABEL: define float @extract_12xfloat_at_2(<4 x float>, <4 x float>, <4 x float>) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <4 x float> %0, i32 2
+; CHECK-NEXT: ret float %3
+; CHECK-NEXT: }
+
+define float @extract_12xfloat_at_3(<12 x float>) {
+entry:
+ %1 = extractelement <12 x float> %0, i32 3
+ ret float %1
+}
+; CHECK-LABEL: define float @extract_12xfloat_at_3(<4 x float>, <4 x float>, <4 x float>) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <4 x float> %0, i32 3
+; CHECK-NEXT: ret float %3
+; CHECK-NEXT: }
+
+define float @extract_12xfloat_at_4(<12 x float>) {
+entry:
+ %1 = extractelement <12 x float> %0, i32 4
+ ret float %1
+}
+; CHECK-LABEL: define float @extract_12xfloat_at_4(<4 x float>, <4 x float>, <4 x float>) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <4 x float> %1, i32 0
+; CHECK-NEXT: ret float %3
+; CHECK-NEXT: }
+
+define float @extract_12xfloat_at_5(<12 x float>) {
+entry:
+ %1 = extractelement <12 x float> %0, i32 5
+ ret float %1
+}
+; CHECK-LABEL: define float @extract_12xfloat_at_5(<4 x float>, <4 x float>, <4 x float>) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <4 x float> %1, i32 1
+; CHECK-NEXT: ret float %3
+; CHECK-NEXT: }
+
+define float @extract_12xfloat_at_6(<12 x float>) {
+entry:
+ %1 = extractelement <12 x float> %0, i32 6
+ ret float %1
+}
+; CHECK-LABEL: define float @extract_12xfloat_at_6(<4 x float>, <4 x float>, <4 x float>) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <4 x float> %1, i32 2
+; CHECK-NEXT: ret float %3
+; CHECK-NEXT: }
+
+define float @extract_12xfloat_at_7(<12 x float>) {
+entry:
+ %1 = extractelement <12 x float> %0, i32 7
+ ret float %1
+}
+; CHECK-LABEL: define float @extract_12xfloat_at_7(<4 x float>, <4 x float>, <4 x float>) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <4 x float> %1, i32 3
+; CHECK-NEXT: ret float %3
+; CHECK-NEXT: }
+
+define float @extract_12xfloat_at_8(<12 x float>) {
+entry:
+ %1 = extractelement <12 x float> %0, i32 8
+ ret float %1
+}
+; CHECK-LABEL: define float @extract_12xfloat_at_8(<4 x float>, <4 x float>, <4 x float>) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <4 x float> %2, i32 0
+; CHECK-NEXT: ret float %3
+; CHECK-NEXT: }
+
+define float @extract_12xfloat_at_9(<12 x float>) {
+entry:
+ %1 = extractelement <12 x float> %0, i32 9
+ ret float %1
+}
+; CHECK-LABEL: define float @extract_12xfloat_at_9(<4 x float>, <4 x float>, <4 x float>) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <4 x float> %2, i32 1
+; CHECK-NEXT: ret float %3
+; CHECK-NEXT: }
+
+define float @extract_12xfloat_at_10(<12 x float>) {
+entry:
+ %1 = extractelement <12 x float> %0, i32 10
+ ret float %1
+}
+; CHECK-LABEL: define float @extract_12xfloat_at_10(<4 x float>, <4 x float>, <4 x float>) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <4 x float> %2, i32 2
+; CHECK-NEXT: ret float %3
+; CHECK-NEXT: }
+
+define float @extract_12xfloat_at_11(<12 x float>) {
+entry:
+ %1 = extractelement <12 x float> %0, i32 11
+ ret float %1
+}
+; CHECK-LABEL: define float @extract_12xfloat_at_11(<4 x float>, <4 x float>, <4 x float>) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <4 x float> %2, i32 3
+; CHECK-NEXT: ret float %3
+; CHECK-NEXT: }
+
+define float @extract_12xfloat_undef_idx(<12 x float>) {
+entry:
+ %1 = extractelement <12 x float> %0, i32 12
+ ret float %1
+}
+; CHECK-LABEL: define float @extract_12xfloat_undef_idx(<4 x float>, <4 x float>, <4 x float>) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <4 x float> %2, i32 4
+; CHECK-NEXT: ret float %3
+; CHECK-NEXT: }
+
+define double @extract_12xdouble_at_0(<12 x double>) {
+entry:
+ %1 = extractelement <12 x double> %0, i32 0
+ ret double %1
+}
+; CHECK-LABEL: define double @extract_12xdouble_at_0(<2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>) {
+; CHECK: entry:
+; CHECK-NEXT: %6 = extractelement <2 x double> %0, i32 0
+; CHECK-NEXT: ret double %6
+; CHECK-NEXT: }
+
+define double @extract_12xdouble_at_1(<12 x double>) {
+entry:
+ %1 = extractelement <12 x double> %0, i32 1
+ ret double %1
+}
+; CHECK-LABEL: define double @extract_12xdouble_at_1(<2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>) {
+; CHECK: entry:
+; CHECK-NEXT: %6 = extractelement <2 x double> %0, i32 1
+; CHECK-NEXT: ret double %6
+; CHECK-NEXT: }
+
+define double @extract_12xdouble_at_2(<12 x double>) {
+entry:
+ %1 = extractelement <12 x double> %0, i32 2
+ ret double %1
+}
+; CHECK-LABEL: define double @extract_12xdouble_at_2(<2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>) {
+; CHECK: entry:
+; CHECK-NEXT: %6 = extractelement <2 x double> %1, i32 0
+; CHECK-NEXT: ret double %6
+; CHECK-NEXT: }
+
+define double @extract_12xdouble_at_3(<12 x double>) {
+entry:
+ %1 = extractelement <12 x double> %0, i32 3
+ ret double %1
+}
+; CHECK-LABEL: define double @extract_12xdouble_at_3(<2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>) {
+; CHECK: entry:
+; CHECK-NEXT: %6 = extractelement <2 x double> %1, i32 1
+; CHECK-NEXT: ret double %6
+; CHECK-NEXT: }
+
+define double @extract_12xdouble_at_4(<12 x double>) {
+entry:
+ %1 = extractelement <12 x double> %0, i32 4
+ ret double %1
+}
+; CHECK-LABEL: define double @extract_12xdouble_at_4(<2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>) {
+; CHECK: entry:
+; CHECK-NEXT: %6 = extractelement <2 x double> %2, i32 0
+; CHECK-NEXT: ret double %6
+; CHECK-NEXT: }
+
+define double @extract_12xdouble_at_5(<12 x double>) {
+entry:
+ %1 = extractelement <12 x double> %0, i32 5
+ ret double %1
+}
+; CHECK-LABEL: define double @extract_12xdouble_at_5(<2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>) {
+; CHECK: entry:
+; CHECK-NEXT: %6 = extractelement <2 x double> %2, i32 1
+; CHECK-NEXT: ret double %6
+; CHECK-NEXT: }
+
+define double @extract_12xdouble_at_6(<12 x double>) {
+entry:
+ %1 = extractelement <12 x double> %0, i32 6
+ ret double %1
+}
+; CHECK-LABEL: define double @extract_12xdouble_at_6(<2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>) {
+; CHECK: entry:
+; CHECK-NEXT: %6 = extractelement <2 x double> %3, i32 0
+; CHECK-NEXT: ret double %6
+; CHECK-NEXT: }
+
+define double @extract_12xdouble_at_7(<12 x double>) {
+entry:
+ %1 = extractelement <12 x double> %0, i32 7
+ ret double %1
+}
+; CHECK-LABEL: define double @extract_12xdouble_at_7(<2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>) {
+; CHECK: entry:
+; CHECK-NEXT: %6 = extractelement <2 x double> %3, i32 1
+; CHECK-NEXT: ret double %6
+; CHECK-NEXT: }
+
+define double @extract_12xdouble_at_8(<12 x double>) {
+entry:
+ %1 = extractelement <12 x double> %0, i32 8
+ ret double %1
+}
+; CHECK-LABEL: define double @extract_12xdouble_at_8(<2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>) {
+; CHECK: entry:
+; CHECK-NEXT: %6 = extractelement <2 x double> %4, i32 0
+; CHECK-NEXT: ret double %6
+; CHECK-NEXT: }
+
+define double @extract_12xdouble_at_9(<12 x double>) {
+entry:
+ %1 = extractelement <12 x double> %0, i32 9
+ ret double %1
+}
+; CHECK-LABEL: define double @extract_12xdouble_at_9(<2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>) {
+; CHECK: entry:
+; CHECK-NEXT: %6 = extractelement <2 x double> %4, i32 1
+; CHECK-NEXT: ret double %6
+; CHECK-NEXT: }
+
+define double @extract_12xdouble_at_10(<12 x double>) {
+entry:
+ %1 = extractelement <12 x double> %0, i32 10
+ ret double %1
+}
+; CHECK-LABEL: define double @extract_12xdouble_at_10(<2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>) {
+; CHECK: entry:
+; CHECK-NEXT: %6 = extractelement <2 x double> %5, i32 0
+; CHECK-NEXT: ret double %6
+; CHECK-NEXT: }
+
+define double @extract_12xdouble_at_11(<12 x double>) {
+entry:
+ %1 = extractelement <12 x double> %0, i32 11
+ ret double %1
+}
+; CHECK-LABEL: define double @extract_12xdouble_at_11(<2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>) {
+; CHECK: entry:
+; CHECK-NEXT: %6 = extractelement <2 x double> %5, i32 1
+; CHECK-NEXT: ret double %6
+; CHECK-NEXT: }
+
+define double @extract_12xdouble_undef_idx(<12 x double>) {
+entry:
+ %1 = extractelement <12 x double> %0, i32 12
+ ret double %1
+}
+; CHECK-LABEL: define double @extract_12xdouble_undef_idx(<2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>) {
+; CHECK: entry:
+; CHECK-NEXT: %6 = extractelement <2 x double> %5, i32 2
+; CHECK-NEXT: ret double %6
+; CHECK-NEXT: }
+
+define i8 @extract_16xi8_at_0(<16 x i8>) {
+entry:
+ %1 = extractelement <16 x i8> %0, i32 0
+ ret i8 %1
+}
+; CHECK-LABEL: define i8 @extract_16xi8_at_0(<16 x i8>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <16 x i8> %0, i32 0
+; CHECK-NEXT: ret i8 %1
+; CHECK-NEXT: }
+
+define i8 @extract_16xi8_at_1(<16 x i8>) {
+entry:
+ %1 = extractelement <16 x i8> %0, i32 1
+ ret i8 %1
+}
+; CHECK-LABEL: define i8 @extract_16xi8_at_1(<16 x i8>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <16 x i8> %0, i32 1
+; CHECK-NEXT: ret i8 %1
+; CHECK-NEXT: }
+
+define i8 @extract_16xi8_at_2(<16 x i8>) {
+entry:
+ %1 = extractelement <16 x i8> %0, i32 2
+ ret i8 %1
+}
+; CHECK-LABEL: define i8 @extract_16xi8_at_2(<16 x i8>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <16 x i8> %0, i32 2
+; CHECK-NEXT: ret i8 %1
+; CHECK-NEXT: }
+
+define i8 @extract_16xi8_at_3(<16 x i8>) {
+entry:
+ %1 = extractelement <16 x i8> %0, i32 3
+ ret i8 %1
+}
+; CHECK-LABEL: define i8 @extract_16xi8_at_3(<16 x i8>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <16 x i8> %0, i32 3
+; CHECK-NEXT: ret i8 %1
+; CHECK-NEXT: }
+
+define i8 @extract_16xi8_at_4(<16 x i8>) {
+entry:
+ %1 = extractelement <16 x i8> %0, i32 4
+ ret i8 %1
+}
+; CHECK-LABEL: define i8 @extract_16xi8_at_4(<16 x i8>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <16 x i8> %0, i32 4
+; CHECK-NEXT: ret i8 %1
+; CHECK-NEXT: }
+
+define i8 @extract_16xi8_at_5(<16 x i8>) {
+entry:
+ %1 = extractelement <16 x i8> %0, i32 5
+ ret i8 %1
+}
+; CHECK-LABEL: define i8 @extract_16xi8_at_5(<16 x i8>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <16 x i8> %0, i32 5
+; CHECK-NEXT: ret i8 %1
+; CHECK-NEXT: }
+
+define i8 @extract_16xi8_at_6(<16 x i8>) {
+entry:
+ %1 = extractelement <16 x i8> %0, i32 6
+ ret i8 %1
+}
+; CHECK-LABEL: define i8 @extract_16xi8_at_6(<16 x i8>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <16 x i8> %0, i32 6
+; CHECK-NEXT: ret i8 %1
+; CHECK-NEXT: }
+
+define i8 @extract_16xi8_at_7(<16 x i8>) {
+entry:
+ %1 = extractelement <16 x i8> %0, i32 7
+ ret i8 %1
+}
+; CHECK-LABEL: define i8 @extract_16xi8_at_7(<16 x i8>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <16 x i8> %0, i32 7
+; CHECK-NEXT: ret i8 %1
+; CHECK-NEXT: }
+
+define i8 @extract_16xi8_at_8(<16 x i8>) {
+entry:
+ %1 = extractelement <16 x i8> %0, i32 8
+ ret i8 %1
+}
+; CHECK-LABEL: define i8 @extract_16xi8_at_8(<16 x i8>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <16 x i8> %0, i32 8
+; CHECK-NEXT: ret i8 %1
+; CHECK-NEXT: }
+
+define i8 @extract_16xi8_at_9(<16 x i8>) {
+entry:
+ %1 = extractelement <16 x i8> %0, i32 9
+ ret i8 %1
+}
+; CHECK-LABEL: define i8 @extract_16xi8_at_9(<16 x i8>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <16 x i8> %0, i32 9
+; CHECK-NEXT: ret i8 %1
+; CHECK-NEXT: }
+
+define i8 @extract_16xi8_at_10(<16 x i8>) {
+entry:
+ %1 = extractelement <16 x i8> %0, i32 10
+ ret i8 %1
+}
+; CHECK-LABEL: define i8 @extract_16xi8_at_10(<16 x i8>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <16 x i8> %0, i32 10
+; CHECK-NEXT: ret i8 %1
+; CHECK-NEXT: }
+
+define i8 @extract_16xi8_at_11(<16 x i8>) {
+entry:
+ %1 = extractelement <16 x i8> %0, i32 11
+ ret i8 %1
+}
+; CHECK-LABEL: define i8 @extract_16xi8_at_11(<16 x i8>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <16 x i8> %0, i32 11
+; CHECK-NEXT: ret i8 %1
+; CHECK-NEXT: }
+
+define i8 @extract_16xi8_at_12(<16 x i8>) {
+entry:
+ %1 = extractelement <16 x i8> %0, i32 12
+ ret i8 %1
+}
+; CHECK-LABEL: define i8 @extract_16xi8_at_12(<16 x i8>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <16 x i8> %0, i32 12
+; CHECK-NEXT: ret i8 %1
+; CHECK-NEXT: }
+
+define i8 @extract_16xi8_at_13(<16 x i8>) {
+entry:
+ %1 = extractelement <16 x i8> %0, i32 13
+ ret i8 %1
+}
+; CHECK-LABEL: define i8 @extract_16xi8_at_13(<16 x i8>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <16 x i8> %0, i32 13
+; CHECK-NEXT: ret i8 %1
+; CHECK-NEXT: }
+
+define i8 @extract_16xi8_at_14(<16 x i8>) {
+entry:
+ %1 = extractelement <16 x i8> %0, i32 14
+ ret i8 %1
+}
+; CHECK-LABEL: define i8 @extract_16xi8_at_14(<16 x i8>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <16 x i8> %0, i32 14
+; CHECK-NEXT: ret i8 %1
+; CHECK-NEXT: }
+
+define i8 @extract_16xi8_at_15(<16 x i8>) {
+entry:
+ %1 = extractelement <16 x i8> %0, i32 15
+ ret i8 %1
+}
+; CHECK-LABEL: define i8 @extract_16xi8_at_15(<16 x i8>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <16 x i8> %0, i32 15
+; CHECK-NEXT: ret i8 %1
+; CHECK-NEXT: }
+
+define i8 @extract_16xi8_undef_idx(<16 x i8>) {
+entry:
+ %1 = extractelement <16 x i8> %0, i32 16
+ ret i8 %1
+}
+; CHECK-LABEL: define i8 @extract_16xi8_undef_idx(<16 x i8>) {
+; CHECK: entry:
+; CHECK-NEXT: %1 = extractelement <16 x i8> %0, i32 16
+; CHECK-NEXT: ret i8 %1
+; CHECK-NEXT: }
+
+define i16 @extract_16xi16_at_0(<16 x i16>) {
+entry:
+ %1 = extractelement <16 x i16> %0, i32 0
+ ret i16 %1
+}
+; CHECK-LABEL: define i16 @extract_16xi16_at_0(<8 x i16>, <8 x i16>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <8 x i16> %0, i32 0
+; CHECK-NEXT: ret i16 %2
+; CHECK-NEXT: }
+
+define i16 @extract_16xi16_at_1(<16 x i16>) {
+entry:
+ %1 = extractelement <16 x i16> %0, i32 1
+ ret i16 %1
+}
+; CHECK-LABEL: define i16 @extract_16xi16_at_1(<8 x i16>, <8 x i16>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <8 x i16> %0, i32 1
+; CHECK-NEXT: ret i16 %2
+; CHECK-NEXT: }
+
+define i16 @extract_16xi16_at_2(<16 x i16>) {
+entry:
+ %1 = extractelement <16 x i16> %0, i32 2
+ ret i16 %1
+}
+; CHECK-LABEL: define i16 @extract_16xi16_at_2(<8 x i16>, <8 x i16>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <8 x i16> %0, i32 2
+; CHECK-NEXT: ret i16 %2
+; CHECK-NEXT: }
+
+define i16 @extract_16xi16_at_3(<16 x i16>) {
+entry:
+ %1 = extractelement <16 x i16> %0, i32 3
+ ret i16 %1
+}
+; CHECK-LABEL: define i16 @extract_16xi16_at_3(<8 x i16>, <8 x i16>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <8 x i16> %0, i32 3
+; CHECK-NEXT: ret i16 %2
+; CHECK-NEXT: }
+
+define i16 @extract_16xi16_at_4(<16 x i16>) {
+entry:
+ %1 = extractelement <16 x i16> %0, i32 4
+ ret i16 %1
+}
+; CHECK-LABEL: define i16 @extract_16xi16_at_4(<8 x i16>, <8 x i16>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <8 x i16> %0, i32 4
+; CHECK-NEXT: ret i16 %2
+; CHECK-NEXT: }
+
+define i16 @extract_16xi16_at_5(<16 x i16>) {
+entry:
+ %1 = extractelement <16 x i16> %0, i32 5
+ ret i16 %1
+}
+; CHECK-LABEL: define i16 @extract_16xi16_at_5(<8 x i16>, <8 x i16>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <8 x i16> %0, i32 5
+; CHECK-NEXT: ret i16 %2
+; CHECK-NEXT: }
+
+define i16 @extract_16xi16_at_6(<16 x i16>) {
+entry:
+ %1 = extractelement <16 x i16> %0, i32 6
+ ret i16 %1
+}
+; CHECK-LABEL: define i16 @extract_16xi16_at_6(<8 x i16>, <8 x i16>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <8 x i16> %0, i32 6
+; CHECK-NEXT: ret i16 %2
+; CHECK-NEXT: }
+
+define i16 @extract_16xi16_at_7(<16 x i16>) {
+entry:
+ %1 = extractelement <16 x i16> %0, i32 7
+ ret i16 %1
+}
+; CHECK-LABEL: define i16 @extract_16xi16_at_7(<8 x i16>, <8 x i16>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <8 x i16> %0, i32 7
+; CHECK-NEXT: ret i16 %2
+; CHECK-NEXT: }
+
+define i16 @extract_16xi16_at_8(<16 x i16>) {
+entry:
+ %1 = extractelement <16 x i16> %0, i32 8
+ ret i16 %1
+}
+; CHECK-LABEL: define i16 @extract_16xi16_at_8(<8 x i16>, <8 x i16>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <8 x i16> %1, i32 0
+; CHECK-NEXT: ret i16 %2
+; CHECK-NEXT: }
+
+define i16 @extract_16xi16_at_9(<16 x i16>) {
+entry:
+ %1 = extractelement <16 x i16> %0, i32 9
+ ret i16 %1
+}
+; CHECK-LABEL: define i16 @extract_16xi16_at_9(<8 x i16>, <8 x i16>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <8 x i16> %1, i32 1
+; CHECK-NEXT: ret i16 %2
+; CHECK-NEXT: }
+
+define i16 @extract_16xi16_at_10(<16 x i16>) {
+entry:
+ %1 = extractelement <16 x i16> %0, i32 10
+ ret i16 %1
+}
+; CHECK-LABEL: define i16 @extract_16xi16_at_10(<8 x i16>, <8 x i16>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <8 x i16> %1, i32 2
+; CHECK-NEXT: ret i16 %2
+; CHECK-NEXT: }
+
+define i16 @extract_16xi16_at_11(<16 x i16>) {
+entry:
+ %1 = extractelement <16 x i16> %0, i32 11
+ ret i16 %1
+}
+; CHECK-LABEL: define i16 @extract_16xi16_at_11(<8 x i16>, <8 x i16>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <8 x i16> %1, i32 3
+; CHECK-NEXT: ret i16 %2
+; CHECK-NEXT: }
+
+define i16 @extract_16xi16_at_12(<16 x i16>) {
+entry:
+ %1 = extractelement <16 x i16> %0, i32 12
+ ret i16 %1
+}
+; CHECK-LABEL: define i16 @extract_16xi16_at_12(<8 x i16>, <8 x i16>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <8 x i16> %1, i32 4
+; CHECK-NEXT: ret i16 %2
+; CHECK-NEXT: }
+
+define i16 @extract_16xi16_at_13(<16 x i16>) {
+entry:
+ %1 = extractelement <16 x i16> %0, i32 13
+ ret i16 %1
+}
+; CHECK-LABEL: define i16 @extract_16xi16_at_13(<8 x i16>, <8 x i16>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <8 x i16> %1, i32 5
+; CHECK-NEXT: ret i16 %2
+; CHECK-NEXT: }
+
+define i16 @extract_16xi16_at_14(<16 x i16>) {
+entry:
+ %1 = extractelement <16 x i16> %0, i32 14
+ ret i16 %1
+}
+; CHECK-LABEL: define i16 @extract_16xi16_at_14(<8 x i16>, <8 x i16>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <8 x i16> %1, i32 6
+; CHECK-NEXT: ret i16 %2
+; CHECK-NEXT: }
+
+define i16 @extract_16xi16_at_15(<16 x i16>) {
+entry:
+ %1 = extractelement <16 x i16> %0, i32 15
+ ret i16 %1
+}
+; CHECK-LABEL: define i16 @extract_16xi16_at_15(<8 x i16>, <8 x i16>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <8 x i16> %1, i32 7
+; CHECK-NEXT: ret i16 %2
+; CHECK-NEXT: }
+
+define i16 @extract_16xi16_undef_idx(<16 x i16>) {
+entry:
+ %1 = extractelement <16 x i16> %0, i32 16
+ ret i16 %1
+}
+; CHECK-LABEL: define i16 @extract_16xi16_undef_idx(<8 x i16>, <8 x i16>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <8 x i16> %1, i32 8
+; CHECK-NEXT: ret i16 %2
+; CHECK-NEXT: }
+
+define i32 @extract_16xi32_at_0(<16 x i32>) {
+entry:
+ %1 = extractelement <16 x i32> %0, i32 0
+ ret i32 %1
+}
+; CHECK-LABEL: define i32 @extract_16xi32_at_0(<4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>) {
+; CHECK: entry:
+; CHECK-NEXT: %4 = extractelement <4 x i32> %0, i32 0
+; CHECK-NEXT: ret i32 %4
+; CHECK-NEXT: }
+
+define i32 @extract_16xi32_at_1(<16 x i32>) {
+entry:
+ %1 = extractelement <16 x i32> %0, i32 1
+ ret i32 %1
+}
+; CHECK-LABEL: define i32 @extract_16xi32_at_1(<4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>) {
+; CHECK: entry:
+; CHECK-NEXT: %4 = extractelement <4 x i32> %0, i32 1
+; CHECK-NEXT: ret i32 %4
+; CHECK-NEXT: }
+
+define i32 @extract_16xi32_at_2(<16 x i32>) {
+entry:
+ %1 = extractelement <16 x i32> %0, i32 2
+ ret i32 %1
+}
+; CHECK-LABEL: define i32 @extract_16xi32_at_2(<4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>) {
+; CHECK: entry:
+; CHECK-NEXT: %4 = extractelement <4 x i32> %0, i32 2
+; CHECK-NEXT: ret i32 %4
+; CHECK-NEXT: }
+
+define i32 @extract_16xi32_at_3(<16 x i32>) {
+entry:
+ %1 = extractelement <16 x i32> %0, i32 3
+ ret i32 %1
+}
+; CHECK-LABEL: define i32 @extract_16xi32_at_3(<4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>) {
+; CHECK: entry:
+; CHECK-NEXT: %4 = extractelement <4 x i32> %0, i32 3
+; CHECK-NEXT: ret i32 %4
+; CHECK-NEXT: }
+
+define i32 @extract_16xi32_at_4(<16 x i32>) {
+entry:
+ %1 = extractelement <16 x i32> %0, i32 4
+ ret i32 %1
+}
+; CHECK-LABEL: define i32 @extract_16xi32_at_4(<4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>) {
+; CHECK: entry:
+; CHECK-NEXT: %4 = extractelement <4 x i32> %1, i32 0
+; CHECK-NEXT: ret i32 %4
+; CHECK-NEXT: }
+
+define i32 @extract_16xi32_at_5(<16 x i32>) {
+entry:
+ %1 = extractelement <16 x i32> %0, i32 5
+ ret i32 %1
+}
+; CHECK-LABEL: define i32 @extract_16xi32_at_5(<4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>) {
+; CHECK: entry:
+; CHECK-NEXT: %4 = extractelement <4 x i32> %1, i32 1
+; CHECK-NEXT: ret i32 %4
+; CHECK-NEXT: }
+
+define i32 @extract_16xi32_at_6(<16 x i32>) {
+entry:
+ %1 = extractelement <16 x i32> %0, i32 6
+ ret i32 %1
+}
+; CHECK-LABEL: define i32 @extract_16xi32_at_6(<4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>) {
+; CHECK: entry:
+; CHECK-NEXT: %4 = extractelement <4 x i32> %1, i32 2
+; CHECK-NEXT: ret i32 %4
+; CHECK-NEXT: }
+
+define i32 @extract_16xi32_at_7(<16 x i32>) {
+entry:
+ %1 = extractelement <16 x i32> %0, i32 7
+ ret i32 %1
+}
+; CHECK-LABEL: define i32 @extract_16xi32_at_7(<4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>) {
+; CHECK: entry:
+; CHECK-NEXT: %4 = extractelement <4 x i32> %1, i32 3
+; CHECK-NEXT: ret i32 %4
+; CHECK-NEXT: }
+
+define i32 @extract_16xi32_at_8(<16 x i32>) {
+entry:
+ %1 = extractelement <16 x i32> %0, i32 8
+ ret i32 %1
+}
+; CHECK-LABEL: define i32 @extract_16xi32_at_8(<4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>) {
+; CHECK: entry:
+; CHECK-NEXT: %4 = extractelement <4 x i32> %2, i32 0
+; CHECK-NEXT: ret i32 %4
+; CHECK-NEXT: }
+
+define i32 @extract_16xi32_at_9(<16 x i32>) {
+entry:
+ %1 = extractelement <16 x i32> %0, i32 9
+ ret i32 %1
+}
+; CHECK-LABEL: define i32 @extract_16xi32_at_9(<4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>) {
+; CHECK: entry:
+; CHECK-NEXT: %4 = extractelement <4 x i32> %2, i32 1
+; CHECK-NEXT: ret i32 %4
+; CHECK-NEXT: }
+
+define i32 @extract_16xi32_at_10(<16 x i32>) {
+entry:
+ %1 = extractelement <16 x i32> %0, i32 10
+ ret i32 %1
+}
+; CHECK-LABEL: define i32 @extract_16xi32_at_10(<4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>) {
+; CHECK: entry:
+; CHECK-NEXT: %4 = extractelement <4 x i32> %2, i32 2
+; CHECK-NEXT: ret i32 %4
+; CHECK-NEXT: }
+
+define i32 @extract_16xi32_at_11(<16 x i32>) {
+entry:
+ %1 = extractelement <16 x i32> %0, i32 11
+ ret i32 %1
+}
+; CHECK-LABEL: define i32 @extract_16xi32_at_11(<4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>) {
+; CHECK: entry:
+; CHECK-NEXT: %4 = extractelement <4 x i32> %2, i32 3
+; CHECK-NEXT: ret i32 %4
+; CHECK-NEXT: }
+
+define i32 @extract_16xi32_at_12(<16 x i32>) {
+entry:
+ %1 = extractelement <16 x i32> %0, i32 12
+ ret i32 %1
+}
+; CHECK-LABEL: define i32 @extract_16xi32_at_12(<4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>) {
+; CHECK: entry:
+; CHECK-NEXT: %4 = extractelement <4 x i32> %3, i32 0
+; CHECK-NEXT: ret i32 %4
+; CHECK-NEXT: }
+
+define i32 @extract_16xi32_at_13(<16 x i32>) {
+entry:
+ %1 = extractelement <16 x i32> %0, i32 13
+ ret i32 %1
+}
+; CHECK-LABEL: define i32 @extract_16xi32_at_13(<4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>) {
+; CHECK: entry:
+; CHECK-NEXT: %4 = extractelement <4 x i32> %3, i32 1
+; CHECK-NEXT: ret i32 %4
+; CHECK-NEXT: }
+
+define i32 @extract_16xi32_at_14(<16 x i32>) {
+entry:
+ %1 = extractelement <16 x i32> %0, i32 14
+ ret i32 %1
+}
+; CHECK-LABEL: define i32 @extract_16xi32_at_14(<4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>) {
+; CHECK: entry:
+; CHECK-NEXT: %4 = extractelement <4 x i32> %3, i32 2
+; CHECK-NEXT: ret i32 %4
+; CHECK-NEXT: }
+
+define i32 @extract_16xi32_at_15(<16 x i32>) {
+entry:
+ %1 = extractelement <16 x i32> %0, i32 15
+ ret i32 %1
+}
+; CHECK-LABEL: define i32 @extract_16xi32_at_15(<4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>) {
+; CHECK: entry:
+; CHECK-NEXT: %4 = extractelement <4 x i32> %3, i32 3
+; CHECK-NEXT: ret i32 %4
+; CHECK-NEXT: }
+
+define i32 @extract_16xi32_undef_idx(<16 x i32>) {
+entry:
+ %1 = extractelement <16 x i32> %0, i32 16
+ ret i32 %1
+}
+; CHECK-LABEL: define i32 @extract_16xi32_undef_idx(<4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>) {
+; CHECK: entry:
+; CHECK-NEXT: %4 = extractelement <4 x i32> %3, i32 4
+; CHECK-NEXT: ret i32 %4
+; CHECK-NEXT: }
+
+define i64 @extract_16xi64_at_0(<16 x i64>) {
+entry:
+ %1 = extractelement <16 x i64> %0, i32 0
+ ret i64 %1
+}
+; CHECK-LABEL: define i64 @extract_16xi64_at_0(<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>) {
+; CHECK: entry:
+; CHECK-NEXT: %8 = extractelement <2 x i64> %0, i32 0
+; CHECK-NEXT: ret i64 %8
+; CHECK-NEXT: }
+
+define i64 @extract_16xi64_at_1(<16 x i64>) {
+entry:
+ %1 = extractelement <16 x i64> %0, i32 1
+ ret i64 %1
+}
+; CHECK-LABEL: define i64 @extract_16xi64_at_1(<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>) {
+; CHECK: entry:
+; CHECK-NEXT: %8 = extractelement <2 x i64> %0, i32 1
+; CHECK-NEXT: ret i64 %8
+; CHECK-NEXT: }
+
+define i64 @extract_16xi64_at_2(<16 x i64>) {
+entry:
+ %1 = extractelement <16 x i64> %0, i32 2
+ ret i64 %1
+}
+; CHECK-LABEL: define i64 @extract_16xi64_at_2(<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>) {
+; CHECK: entry:
+; CHECK-NEXT: %8 = extractelement <2 x i64> %1, i32 0
+; CHECK-NEXT: ret i64 %8
+; CHECK-NEXT: }
+
+define i64 @extract_16xi64_at_3(<16 x i64>) {
+entry:
+ %1 = extractelement <16 x i64> %0, i32 3
+ ret i64 %1
+}
+; CHECK-LABEL: define i64 @extract_16xi64_at_3(<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>) {
+; CHECK: entry:
+; CHECK-NEXT: %8 = extractelement <2 x i64> %1, i32 1
+; CHECK-NEXT: ret i64 %8
+; CHECK-NEXT: }
+
+define i64 @extract_16xi64_at_4(<16 x i64>) {
+entry:
+ %1 = extractelement <16 x i64> %0, i32 4
+ ret i64 %1
+}
+; CHECK-LABEL: define i64 @extract_16xi64_at_4(<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>) {
+; CHECK: entry:
+; CHECK-NEXT: %8 = extractelement <2 x i64> %2, i32 0
+; CHECK-NEXT: ret i64 %8
+; CHECK-NEXT: }
+
+define i64 @extract_16xi64_at_5(<16 x i64>) {
+entry:
+ %1 = extractelement <16 x i64> %0, i32 5
+ ret i64 %1
+}
+; CHECK-LABEL: define i64 @extract_16xi64_at_5(<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>) {
+; CHECK: entry:
+; CHECK-NEXT: %8 = extractelement <2 x i64> %2, i32 1
+; CHECK-NEXT: ret i64 %8
+; CHECK-NEXT: }
+
+define i64 @extract_16xi64_at_6(<16 x i64>) {
+entry:
+ %1 = extractelement <16 x i64> %0, i32 6
+ ret i64 %1
+}
+; CHECK-LABEL: define i64 @extract_16xi64_at_6(<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>) {
+; CHECK: entry:
+; CHECK-NEXT: %8 = extractelement <2 x i64> %3, i32 0
+; CHECK-NEXT: ret i64 %8
+; CHECK-NEXT: }
+
+define i64 @extract_16xi64_at_7(<16 x i64>) {
+entry:
+ %1 = extractelement <16 x i64> %0, i32 7
+ ret i64 %1
+}
+; CHECK-LABEL: define i64 @extract_16xi64_at_7(<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>) {
+; CHECK: entry:
+; CHECK-NEXT: %8 = extractelement <2 x i64> %3, i32 1
+; CHECK-NEXT: ret i64 %8
+; CHECK-NEXT: }
+
+define i64 @extract_16xi64_at_8(<16 x i64>) {
+entry:
+ %1 = extractelement <16 x i64> %0, i32 8
+ ret i64 %1
+}
+; CHECK-LABEL: define i64 @extract_16xi64_at_8(<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>) {
+; CHECK: entry:
+; CHECK-NEXT: %8 = extractelement <2 x i64> %4, i32 0
+; CHECK-NEXT: ret i64 %8
+; CHECK-NEXT: }
+
+define i64 @extract_16xi64_at_9(<16 x i64>) {
+entry:
+ %1 = extractelement <16 x i64> %0, i32 9
+ ret i64 %1
+}
+; CHECK-LABEL: define i64 @extract_16xi64_at_9(<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>) {
+; CHECK: entry:
+; CHECK-NEXT: %8 = extractelement <2 x i64> %4, i32 1
+; CHECK-NEXT: ret i64 %8
+; CHECK-NEXT: }
+
+define i64 @extract_16xi64_at_10(<16 x i64>) {
+entry:
+ %1 = extractelement <16 x i64> %0, i32 10
+ ret i64 %1
+}
+; CHECK-LABEL: define i64 @extract_16xi64_at_10(<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>) {
+; CHECK: entry:
+; CHECK-NEXT: %8 = extractelement <2 x i64> %5, i32 0
+; CHECK-NEXT: ret i64 %8
+; CHECK-NEXT: }
+
+define i64 @extract_16xi64_at_11(<16 x i64>) {
+entry:
+ %1 = extractelement <16 x i64> %0, i32 11
+ ret i64 %1
+}
+; CHECK-LABEL: define i64 @extract_16xi64_at_11(<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>) {
+; CHECK: entry:
+; CHECK-NEXT: %8 = extractelement <2 x i64> %5, i32 1
+; CHECK-NEXT: ret i64 %8
+; CHECK-NEXT: }
+
+define i64 @extract_16xi64_at_12(<16 x i64>) {
+entry:
+ %1 = extractelement <16 x i64> %0, i32 12
+ ret i64 %1
+}
+; CHECK-LABEL: define i64 @extract_16xi64_at_12(<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>) {
+; CHECK: entry:
+; CHECK-NEXT: %8 = extractelement <2 x i64> %6, i32 0
+; CHECK-NEXT: ret i64 %8
+; CHECK-NEXT: }
+
+define i64 @extract_16xi64_at_13(<16 x i64>) {
+entry:
+ %1 = extractelement <16 x i64> %0, i32 13
+ ret i64 %1
+}
+; CHECK-LABEL: define i64 @extract_16xi64_at_13(<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>) {
+; CHECK: entry:
+; CHECK-NEXT: %8 = extractelement <2 x i64> %6, i32 1
+; CHECK-NEXT: ret i64 %8
+; CHECK-NEXT: }
+
+define i64 @extract_16xi64_at_14(<16 x i64>) {
+entry:
+ %1 = extractelement <16 x i64> %0, i32 14
+ ret i64 %1
+}
+; CHECK-LABEL: define i64 @extract_16xi64_at_14(<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>) {
+; CHECK: entry:
+; CHECK-NEXT: %8 = extractelement <2 x i64> %7, i32 0
+; CHECK-NEXT: ret i64 %8
+; CHECK-NEXT: }
+
+define i64 @extract_16xi64_at_15(<16 x i64>) {
+entry:
+ %1 = extractelement <16 x i64> %0, i32 15
+ ret i64 %1
+}
+; CHECK-LABEL: define i64 @extract_16xi64_at_15(<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>) {
+; CHECK: entry:
+; CHECK-NEXT: %8 = extractelement <2 x i64> %7, i32 1
+; CHECK-NEXT: ret i64 %8
+; CHECK-NEXT: }
+
+define i64 @extract_16xi64_undef_idx(<16 x i64>) {
+entry:
+ %1 = extractelement <16 x i64> %0, i32 16
+ ret i64 %1
+}
+; CHECK-LABEL: define i64 @extract_16xi64_undef_idx(<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>) {
+; CHECK: entry:
+; CHECK-NEXT: %8 = extractelement <2 x i64> %7, i32 2
+; CHECK-NEXT: ret i64 %8
+; CHECK-NEXT: }
+
+define i8* @extract_16xi8ptr_at_0(<16 x i8*>) {
+entry:
+ %1 = extractelement <16 x i8*> %0, i32 0
+ ret i8* %1
+}
+; CHECK-LABEL: define i8* @extract_16xi8ptr_at_0(<4 x i8*>, <4 x i8*>, <4 x i8*>, <4 x i8*>) {
+; CHECK: entry:
+; CHECK-NEXT: %4 = extractelement <4 x i8*> %0, i32 0
+; CHECK-NEXT: ret i8* %4
+; CHECK-NEXT: }
+
+define i8* @extract_16xi8ptr_at_1(<16 x i8*>) {
+entry:
+ %1 = extractelement <16 x i8*> %0, i32 1
+ ret i8* %1
+}
+; CHECK-LABEL: define i8* @extract_16xi8ptr_at_1(<4 x i8*>, <4 x i8*>, <4 x i8*>, <4 x i8*>) {
+; CHECK: entry:
+; CHECK-NEXT: %4 = extractelement <4 x i8*> %0, i32 1
+; CHECK-NEXT: ret i8* %4
+; CHECK-NEXT: }
+
+define i8* @extract_16xi8ptr_at_2(<16 x i8*>) {
+entry:
+ %1 = extractelement <16 x i8*> %0, i32 2
+ ret i8* %1
+}
+; CHECK-LABEL: define i8* @extract_16xi8ptr_at_2(<4 x i8*>, <4 x i8*>, <4 x i8*>, <4 x i8*>) {
+; CHECK: entry:
+; CHECK-NEXT: %4 = extractelement <4 x i8*> %0, i32 2
+; CHECK-NEXT: ret i8* %4
+; CHECK-NEXT: }
+
+define i8* @extract_16xi8ptr_at_3(<16 x i8*>) {
+entry:
+ %1 = extractelement <16 x i8*> %0, i32 3
+ ret i8* %1
+}
+; CHECK-LABEL: define i8* @extract_16xi8ptr_at_3(<4 x i8*>, <4 x i8*>, <4 x i8*>, <4 x i8*>) {
+; CHECK: entry:
+; CHECK-NEXT: %4 = extractelement <4 x i8*> %0, i32 3
+; CHECK-NEXT: ret i8* %4
+; CHECK-NEXT: }
+
+define i8* @extract_16xi8ptr_at_4(<16 x i8*>) {
+entry:
+ %1 = extractelement <16 x i8*> %0, i32 4
+ ret i8* %1
+}
+; CHECK-LABEL: define i8* @extract_16xi8ptr_at_4(<4 x i8*>, <4 x i8*>, <4 x i8*>, <4 x i8*>) {
+; CHECK: entry:
+; CHECK-NEXT: %4 = extractelement <4 x i8*> %1, i32 0
+; CHECK-NEXT: ret i8* %4
+; CHECK-NEXT: }
+
+define i8* @extract_16xi8ptr_at_5(<16 x i8*>) {
+entry:
+ %1 = extractelement <16 x i8*> %0, i32 5
+ ret i8* %1
+}
+; CHECK-LABEL: define i8* @extract_16xi8ptr_at_5(<4 x i8*>, <4 x i8*>, <4 x i8*>, <4 x i8*>) {
+; CHECK: entry:
+; CHECK-NEXT: %4 = extractelement <4 x i8*> %1, i32 1
+; CHECK-NEXT: ret i8* %4
+; CHECK-NEXT: }
+
+define i8* @extract_16xi8ptr_at_6(<16 x i8*>) {
+entry:
+ %1 = extractelement <16 x i8*> %0, i32 6
+ ret i8* %1
+}
+; CHECK-LABEL: define i8* @extract_16xi8ptr_at_6(<4 x i8*>, <4 x i8*>, <4 x i8*>, <4 x i8*>) {
+; CHECK: entry:
+; CHECK-NEXT: %4 = extractelement <4 x i8*> %1, i32 2
+; CHECK-NEXT: ret i8* %4
+; CHECK-NEXT: }
+
+define i8* @extract_16xi8ptr_at_7(<16 x i8*>) {
+entry:
+ %1 = extractelement <16 x i8*> %0, i32 7
+ ret i8* %1
+}
+; CHECK-LABEL: define i8* @extract_16xi8ptr_at_7(<4 x i8*>, <4 x i8*>, <4 x i8*>, <4 x i8*>) {
+; CHECK: entry:
+; CHECK-NEXT: %4 = extractelement <4 x i8*> %1, i32 3
+; CHECK-NEXT: ret i8* %4
+; CHECK-NEXT: }
+
+define i8* @extract_16xi8ptr_at_8(<16 x i8*>) {
+entry:
+ %1 = extractelement <16 x i8*> %0, i32 8
+ ret i8* %1
+}
+; CHECK-LABEL: define i8* @extract_16xi8ptr_at_8(<4 x i8*>, <4 x i8*>, <4 x i8*>, <4 x i8*>) {
+; CHECK: entry:
+; CHECK-NEXT: %4 = extractelement <4 x i8*> %2, i32 0
+; CHECK-NEXT: ret i8* %4
+; CHECK-NEXT: }
+
+define i8* @extract_16xi8ptr_at_9(<16 x i8*>) {
+entry:
+ %1 = extractelement <16 x i8*> %0, i32 9
+ ret i8* %1
+}
+; CHECK-LABEL: define i8* @extract_16xi8ptr_at_9(<4 x i8*>, <4 x i8*>, <4 x i8*>, <4 x i8*>) {
+; CHECK: entry:
+; CHECK-NEXT: %4 = extractelement <4 x i8*> %2, i32 1
+; CHECK-NEXT: ret i8* %4
+; CHECK-NEXT: }
+
+define i8* @extract_16xi8ptr_at_10(<16 x i8*>) {
+entry:
+ %1 = extractelement <16 x i8*> %0, i32 10
+ ret i8* %1
+}
+; CHECK-LABEL: define i8* @extract_16xi8ptr_at_10(<4 x i8*>, <4 x i8*>, <4 x i8*>, <4 x i8*>) {
+; CHECK: entry:
+; CHECK-NEXT: %4 = extractelement <4 x i8*> %2, i32 2
+; CHECK-NEXT: ret i8* %4
+; CHECK-NEXT: }
+
+define i8* @extract_16xi8ptr_at_11(<16 x i8*>) {
+entry:
+ %1 = extractelement <16 x i8*> %0, i32 11
+ ret i8* %1
+}
+; CHECK-LABEL: define i8* @extract_16xi8ptr_at_11(<4 x i8*>, <4 x i8*>, <4 x i8*>, <4 x i8*>) {
+; CHECK: entry:
+; CHECK-NEXT: %4 = extractelement <4 x i8*> %2, i32 3
+; CHECK-NEXT: ret i8* %4
+; CHECK-NEXT: }
+
+define i8* @extract_16xi8ptr_at_12(<16 x i8*>) {
+entry:
+ %1 = extractelement <16 x i8*> %0, i32 12
+ ret i8* %1
+}
+; CHECK-LABEL: define i8* @extract_16xi8ptr_at_12(<4 x i8*>, <4 x i8*>, <4 x i8*>, <4 x i8*>) {
+; CHECK: entry:
+; CHECK-NEXT: %4 = extractelement <4 x i8*> %3, i32 0
+; CHECK-NEXT: ret i8* %4
+; CHECK-NEXT: }
+
+define i8* @extract_16xi8ptr_at_13(<16 x i8*>) {
+entry:
+ %1 = extractelement <16 x i8*> %0, i32 13
+ ret i8* %1
+}
+; CHECK-LABEL: define i8* @extract_16xi8ptr_at_13(<4 x i8*>, <4 x i8*>, <4 x i8*>, <4 x i8*>) {
+; CHECK: entry:
+; CHECK-NEXT: %4 = extractelement <4 x i8*> %3, i32 1
+; CHECK-NEXT: ret i8* %4
+; CHECK-NEXT: }
+
+define i8* @extract_16xi8ptr_at_14(<16 x i8*>) {
+entry:
+ %1 = extractelement <16 x i8*> %0, i32 14
+ ret i8* %1
+}
+; CHECK-LABEL: define i8* @extract_16xi8ptr_at_14(<4 x i8*>, <4 x i8*>, <4 x i8*>, <4 x i8*>) {
+; CHECK: entry:
+; CHECK-NEXT: %4 = extractelement <4 x i8*> %3, i32 2
+; CHECK-NEXT: ret i8* %4
+; CHECK-NEXT: }
+
+define i8* @extract_16xi8ptr_at_15(<16 x i8*>) {
+entry:
+ %1 = extractelement <16 x i8*> %0, i32 15
+ ret i8* %1
+}
+; CHECK-LABEL: define i8* @extract_16xi8ptr_at_15(<4 x i8*>, <4 x i8*>, <4 x i8*>, <4 x i8*>) {
+; CHECK: entry:
+; CHECK-NEXT: %4 = extractelement <4 x i8*> %3, i32 3
+; CHECK-NEXT: ret i8* %4
+; CHECK-NEXT: }
+
+define i8* @extract_16xi8ptr_undef_idx(<16 x i8*>) {
+entry:
+ %1 = extractelement <16 x i8*> %0, i32 16
+ ret i8* %1
+}
+; CHECK-LABEL: define i8* @extract_16xi8ptr_undef_idx(<4 x i8*>, <4 x i8*>, <4 x i8*>, <4 x i8*>) {
+; CHECK: entry:
+; CHECK-NEXT: %4 = extractelement <4 x i8*> %3, i32 4
+; CHECK-NEXT: ret i8* %4
+; CHECK-NEXT: }
+
+define float @extract_16xfloat_at_0(<16 x float>) {
+entry:
+ %1 = extractelement <16 x float> %0, i32 0
+ ret float %1
+}
+; CHECK-LABEL: define float @extract_16xfloat_at_0(<4 x float>, <4 x float>, <4 x float>, <4 x float>) {
+; CHECK: entry:
+; CHECK-NEXT: %4 = extractelement <4 x float> %0, i32 0
+; CHECK-NEXT: ret float %4
+; CHECK-NEXT: }
+
+define float @extract_16xfloat_at_1(<16 x float>) {
+entry:
+ %1 = extractelement <16 x float> %0, i32 1
+ ret float %1
+}
+; CHECK-LABEL: define float @extract_16xfloat_at_1(<4 x float>, <4 x float>, <4 x float>, <4 x float>) {
+; CHECK: entry:
+; CHECK-NEXT: %4 = extractelement <4 x float> %0, i32 1
+; CHECK-NEXT: ret float %4
+; CHECK-NEXT: }
+
+define float @extract_16xfloat_at_2(<16 x float>) {
+entry:
+ %1 = extractelement <16 x float> %0, i32 2
+ ret float %1
+}
+; CHECK-LABEL: define float @extract_16xfloat_at_2(<4 x float>, <4 x float>, <4 x float>, <4 x float>) {
+; CHECK: entry:
+; CHECK-NEXT: %4 = extractelement <4 x float> %0, i32 2
+; CHECK-NEXT: ret float %4
+; CHECK-NEXT: }
+
+define float @extract_16xfloat_at_3(<16 x float>) {
+entry:
+ %1 = extractelement <16 x float> %0, i32 3
+ ret float %1
+}
+; CHECK-LABEL: define float @extract_16xfloat_at_3(<4 x float>, <4 x float>, <4 x float>, <4 x float>) {
+; CHECK: entry:
+; CHECK-NEXT: %4 = extractelement <4 x float> %0, i32 3
+; CHECK-NEXT: ret float %4
+; CHECK-NEXT: }
+
+define float @extract_16xfloat_at_4(<16 x float>) {
+entry:
+ %1 = extractelement <16 x float> %0, i32 4
+ ret float %1
+}
+; CHECK-LABEL: define float @extract_16xfloat_at_4(<4 x float>, <4 x float>, <4 x float>, <4 x float>) {
+; CHECK: entry:
+; CHECK-NEXT: %4 = extractelement <4 x float> %1, i32 0
+; CHECK-NEXT: ret float %4
+; CHECK-NEXT: }
+
+define float @extract_16xfloat_at_5(<16 x float>) {
+entry:
+ %1 = extractelement <16 x float> %0, i32 5
+ ret float %1
+}
+; CHECK-LABEL: define float @extract_16xfloat_at_5(<4 x float>, <4 x float>, <4 x float>, <4 x float>) {
+; CHECK: entry:
+; CHECK-NEXT: %4 = extractelement <4 x float> %1, i32 1
+; CHECK-NEXT: ret float %4
+; CHECK-NEXT: }
+
+define float @extract_16xfloat_at_6(<16 x float>) {
+entry:
+ %1 = extractelement <16 x float> %0, i32 6
+ ret float %1
+}
+; CHECK-LABEL: define float @extract_16xfloat_at_6(<4 x float>, <4 x float>, <4 x float>, <4 x float>) {
+; CHECK: entry:
+; CHECK-NEXT: %4 = extractelement <4 x float> %1, i32 2
+; CHECK-NEXT: ret float %4
+; CHECK-NEXT: }
+
+define float @extract_16xfloat_at_7(<16 x float>) {
+entry:
+ %1 = extractelement <16 x float> %0, i32 7
+ ret float %1
+}
+; CHECK-LABEL: define float @extract_16xfloat_at_7(<4 x float>, <4 x float>, <4 x float>, <4 x float>) {
+; CHECK: entry:
+; CHECK-NEXT: %4 = extractelement <4 x float> %1, i32 3
+; CHECK-NEXT: ret float %4
+; CHECK-NEXT: }
+
+define float @extract_16xfloat_at_8(<16 x float>) {
+entry:
+ %1 = extractelement <16 x float> %0, i32 8
+ ret float %1
+}
+; CHECK-LABEL: define float @extract_16xfloat_at_8(<4 x float>, <4 x float>, <4 x float>, <4 x float>) {
+; CHECK: entry:
+; CHECK-NEXT: %4 = extractelement <4 x float> %2, i32 0
+; CHECK-NEXT: ret float %4
+; CHECK-NEXT: }
+
+define float @extract_16xfloat_at_9(<16 x float>) {
+entry:
+ %1 = extractelement <16 x float> %0, i32 9
+ ret float %1
+}
+; CHECK-LABEL: define float @extract_16xfloat_at_9(<4 x float>, <4 x float>, <4 x float>, <4 x float>) {
+; CHECK: entry:
+; CHECK-NEXT: %4 = extractelement <4 x float> %2, i32 1
+; CHECK-NEXT: ret float %4
+; CHECK-NEXT: }
+
+define float @extract_16xfloat_at_10(<16 x float>) {
+entry:
+ %1 = extractelement <16 x float> %0, i32 10
+ ret float %1
+}
+; CHECK-LABEL: define float @extract_16xfloat_at_10(<4 x float>, <4 x float>, <4 x float>, <4 x float>) {
+; CHECK: entry:
+; CHECK-NEXT: %4 = extractelement <4 x float> %2, i32 2
+; CHECK-NEXT: ret float %4
+; CHECK-NEXT: }
+
+define float @extract_16xfloat_at_11(<16 x float>) {
+entry:
+ %1 = extractelement <16 x float> %0, i32 11
+ ret float %1
+}
+; CHECK-LABEL: define float @extract_16xfloat_at_11(<4 x float>, <4 x float>, <4 x float>, <4 x float>) {
+; CHECK: entry:
+; CHECK-NEXT: %4 = extractelement <4 x float> %2, i32 3
+; CHECK-NEXT: ret float %4
+; CHECK-NEXT: }
+
+define float @extract_16xfloat_at_12(<16 x float>) {
+entry:
+ %1 = extractelement <16 x float> %0, i32 12
+ ret float %1
+}
+; CHECK-LABEL: define float @extract_16xfloat_at_12(<4 x float>, <4 x float>, <4 x float>, <4 x float>) {
+; CHECK: entry:
+; CHECK-NEXT: %4 = extractelement <4 x float> %3, i32 0
+; CHECK-NEXT: ret float %4
+; CHECK-NEXT: }
+
+define float @extract_16xfloat_at_13(<16 x float>) {
+entry:
+ %1 = extractelement <16 x float> %0, i32 13
+ ret float %1
+}
+; CHECK-LABEL: define float @extract_16xfloat_at_13(<4 x float>, <4 x float>, <4 x float>, <4 x float>) {
+; CHECK: entry:
+; CHECK-NEXT: %4 = extractelement <4 x float> %3, i32 1
+; CHECK-NEXT: ret float %4
+; CHECK-NEXT: }
+
+define float @extract_16xfloat_at_14(<16 x float>) {
+entry:
+ %1 = extractelement <16 x float> %0, i32 14
+ ret float %1
+}
+; CHECK-LABEL: define float @extract_16xfloat_at_14(<4 x float>, <4 x float>, <4 x float>, <4 x float>) {
+; CHECK: entry:
+; CHECK-NEXT: %4 = extractelement <4 x float> %3, i32 2
+; CHECK-NEXT: ret float %4
+; CHECK-NEXT: }
+
+define float @extract_16xfloat_at_15(<16 x float>) {
+entry:
+ %1 = extractelement <16 x float> %0, i32 15
+ ret float %1
+}
+; CHECK-LABEL: define float @extract_16xfloat_at_15(<4 x float>, <4 x float>, <4 x float>, <4 x float>) {
+; CHECK: entry:
+; CHECK-NEXT: %4 = extractelement <4 x float> %3, i32 3
+; CHECK-NEXT: ret float %4
+; CHECK-NEXT: }
+
+define float @extract_16xfloat_undef_idx(<16 x float>) {
+entry:
+ %1 = extractelement <16 x float> %0, i32 16
+ ret float %1
+}
+; CHECK-LABEL: define float @extract_16xfloat_undef_idx(<4 x float>, <4 x float>, <4 x float>, <4 x float>) {
+; CHECK: entry:
+; CHECK-NEXT: %4 = extractelement <4 x float> %3, i32 4
+; CHECK-NEXT: ret float %4
+; CHECK-NEXT: }
+
+define double @extract_16xdouble_at_0(<16 x double>) {
+entry:
+ %1 = extractelement <16 x double> %0, i32 0
+ ret double %1
+}
+; CHECK-LABEL: define double @extract_16xdouble_at_0(<2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>) {
+; CHECK: entry:
+; CHECK-NEXT: %8 = extractelement <2 x double> %0, i32 0
+; CHECK-NEXT: ret double %8
+; CHECK-NEXT: }
+
+define double @extract_16xdouble_at_1(<16 x double>) {
+entry:
+ %1 = extractelement <16 x double> %0, i32 1
+ ret double %1
+}
+; CHECK-LABEL: define double @extract_16xdouble_at_1(<2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>) {
+; CHECK: entry:
+; CHECK-NEXT: %8 = extractelement <2 x double> %0, i32 1
+; CHECK-NEXT: ret double %8
+; CHECK-NEXT: }
+
+define double @extract_16xdouble_at_2(<16 x double>) {
+entry:
+ %1 = extractelement <16 x double> %0, i32 2
+ ret double %1
+}
+; CHECK-LABEL: define double @extract_16xdouble_at_2(<2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>) {
+; CHECK: entry:
+; CHECK-NEXT: %8 = extractelement <2 x double> %1, i32 0
+; CHECK-NEXT: ret double %8
+; CHECK-NEXT: }
+
+define double @extract_16xdouble_at_3(<16 x double>) {
+entry:
+ %1 = extractelement <16 x double> %0, i32 3
+ ret double %1
+}
+; CHECK-LABEL: define double @extract_16xdouble_at_3(<2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>) {
+; CHECK: entry:
+; CHECK-NEXT: %8 = extractelement <2 x double> %1, i32 1
+; CHECK-NEXT: ret double %8
+; CHECK-NEXT: }
+
+define double @extract_16xdouble_at_4(<16 x double>) {
+entry:
+ %1 = extractelement <16 x double> %0, i32 4
+ ret double %1
+}
+; CHECK-LABEL: define double @extract_16xdouble_at_4(<2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>) {
+; CHECK: entry:
+; CHECK-NEXT: %8 = extractelement <2 x double> %2, i32 0
+; CHECK-NEXT: ret double %8
+; CHECK-NEXT: }
+
+define double @extract_16xdouble_at_5(<16 x double>) {
+entry:
+ %1 = extractelement <16 x double> %0, i32 5
+ ret double %1
+}
+; CHECK-LABEL: define double @extract_16xdouble_at_5(<2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>) {
+; CHECK: entry:
+; CHECK-NEXT: %8 = extractelement <2 x double> %2, i32 1
+; CHECK-NEXT: ret double %8
+; CHECK-NEXT: }
+
+define double @extract_16xdouble_at_6(<16 x double>) {
+entry:
+ %1 = extractelement <16 x double> %0, i32 6
+ ret double %1
+}
+; CHECK-LABEL: define double @extract_16xdouble_at_6(<2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>) {
+; CHECK: entry:
+; CHECK-NEXT: %8 = extractelement <2 x double> %3, i32 0
+; CHECK-NEXT: ret double %8
+; CHECK-NEXT: }
+
+define double @extract_16xdouble_at_7(<16 x double>) {
+entry:
+ %1 = extractelement <16 x double> %0, i32 7
+ ret double %1
+}
+; CHECK-LABEL: define double @extract_16xdouble_at_7(<2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>) {
+; CHECK: entry:
+; CHECK-NEXT: %8 = extractelement <2 x double> %3, i32 1
+; CHECK-NEXT: ret double %8
+; CHECK-NEXT: }
+
+define double @extract_16xdouble_at_8(<16 x double>) {
+entry:
+ %1 = extractelement <16 x double> %0, i32 8
+ ret double %1
+}
+; CHECK-LABEL: define double @extract_16xdouble_at_8(<2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>) {
+; CHECK: entry:
+; CHECK-NEXT: %8 = extractelement <2 x double> %4, i32 0
+; CHECK-NEXT: ret double %8
+; CHECK-NEXT: }
+
+define double @extract_16xdouble_at_9(<16 x double>) {
+entry:
+ %1 = extractelement <16 x double> %0, i32 9
+ ret double %1
+}
+; CHECK-LABEL: define double @extract_16xdouble_at_9(<2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>) {
+; CHECK: entry:
+; CHECK-NEXT: %8 = extractelement <2 x double> %4, i32 1
+; CHECK-NEXT: ret double %8
+; CHECK-NEXT: }
+
+define double @extract_16xdouble_at_10(<16 x double>) {
+entry:
+ %1 = extractelement <16 x double> %0, i32 10
+ ret double %1
+}
+; CHECK-LABEL: define double @extract_16xdouble_at_10(<2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>) {
+; CHECK: entry:
+; CHECK-NEXT: %8 = extractelement <2 x double> %5, i32 0
+; CHECK-NEXT: ret double %8
+; CHECK-NEXT: }
+
+define double @extract_16xdouble_at_11(<16 x double>) {
+entry:
+ %1 = extractelement <16 x double> %0, i32 11
+ ret double %1
+}
+; CHECK-LABEL: define double @extract_16xdouble_at_11(<2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>) {
+; CHECK: entry:
+; CHECK-NEXT: %8 = extractelement <2 x double> %5, i32 1
+; CHECK-NEXT: ret double %8
+; CHECK-NEXT: }
+
+define double @extract_16xdouble_at_12(<16 x double>) {
+entry:
+ %1 = extractelement <16 x double> %0, i32 12
+ ret double %1
+}
+; CHECK-LABEL: define double @extract_16xdouble_at_12(<2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>) {
+; CHECK: entry:
+; CHECK-NEXT: %8 = extractelement <2 x double> %6, i32 0
+; CHECK-NEXT: ret double %8
+; CHECK-NEXT: }
+
+define double @extract_16xdouble_at_13(<16 x double>) {
+entry:
+ %1 = extractelement <16 x double> %0, i32 13
+ ret double %1
+}
+; CHECK-LABEL: define double @extract_16xdouble_at_13(<2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>) {
+; CHECK: entry:
+; CHECK-NEXT: %8 = extractelement <2 x double> %6, i32 1
+; CHECK-NEXT: ret double %8
+; CHECK-NEXT: }
+
+define double @extract_16xdouble_at_14(<16 x double>) {
+entry:
+ %1 = extractelement <16 x double> %0, i32 14
+ ret double %1
+}
+; CHECK-LABEL: define double @extract_16xdouble_at_14(<2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>) {
+; CHECK: entry:
+; CHECK-NEXT: %8 = extractelement <2 x double> %7, i32 0
+; CHECK-NEXT: ret double %8
+; CHECK-NEXT: }
+
+define double @extract_16xdouble_at_15(<16 x double>) {
+entry:
+ %1 = extractelement <16 x double> %0, i32 15
+ ret double %1
+}
+; CHECK-LABEL: define double @extract_16xdouble_at_15(<2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>) {
+; CHECK: entry:
+; CHECK-NEXT: %8 = extractelement <2 x double> %7, i32 1
+; CHECK-NEXT: ret double %8
+; CHECK-NEXT: }
+
+define double @extract_16xdouble_undef_idx(<16 x double>) {
+entry:
+ %1 = extractelement <16 x double> %0, i32 16
+ ret double %1
+}
+; CHECK-LABEL: define double @extract_16xdouble_undef_idx(<2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>) {
+; CHECK: entry:
+; CHECK-NEXT: %8 = extractelement <2 x double> %7, i32 2
+; CHECK-NEXT: ret double %8
+; CHECK-NEXT: }
+
+define i8 @extract_20xi8_at_0(<20 x i8>) {
+entry:
+ %1 = extractelement <20 x i8> %0, i32 0
+ ret i8 %1
+}
+; CHECK-LABEL: define i8 @extract_20xi8_at_0(<16 x i8>, <16 x i8>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <16 x i8> %0, i32 0
+; CHECK-NEXT: ret i8 %2
+; CHECK-NEXT: }
+
+define i8 @extract_20xi8_at_1(<20 x i8>) {
+entry:
+ %1 = extractelement <20 x i8> %0, i32 1
+ ret i8 %1
+}
+; CHECK-LABEL: define i8 @extract_20xi8_at_1(<16 x i8>, <16 x i8>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <16 x i8> %0, i32 1
+; CHECK-NEXT: ret i8 %2
+; CHECK-NEXT: }
+
+define i8 @extract_20xi8_at_2(<20 x i8>) {
+entry:
+ %1 = extractelement <20 x i8> %0, i32 2
+ ret i8 %1
+}
+; CHECK-LABEL: define i8 @extract_20xi8_at_2(<16 x i8>, <16 x i8>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <16 x i8> %0, i32 2
+; CHECK-NEXT: ret i8 %2
+; CHECK-NEXT: }
+
+define i8 @extract_20xi8_at_3(<20 x i8>) {
+entry:
+ %1 = extractelement <20 x i8> %0, i32 3
+ ret i8 %1
+}
+; CHECK-LABEL: define i8 @extract_20xi8_at_3(<16 x i8>, <16 x i8>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <16 x i8> %0, i32 3
+; CHECK-NEXT: ret i8 %2
+; CHECK-NEXT: }
+
+define i8 @extract_20xi8_at_4(<20 x i8>) {
+entry:
+ %1 = extractelement <20 x i8> %0, i32 4
+ ret i8 %1
+}
+; CHECK-LABEL: define i8 @extract_20xi8_at_4(<16 x i8>, <16 x i8>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <16 x i8> %0, i32 4
+; CHECK-NEXT: ret i8 %2
+; CHECK-NEXT: }
+
+define i8 @extract_20xi8_at_5(<20 x i8>) {
+entry:
+ %1 = extractelement <20 x i8> %0, i32 5
+ ret i8 %1
+}
+; CHECK-LABEL: define i8 @extract_20xi8_at_5(<16 x i8>, <16 x i8>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <16 x i8> %0, i32 5
+; CHECK-NEXT: ret i8 %2
+; CHECK-NEXT: }
+
+define i8 @extract_20xi8_at_6(<20 x i8>) {
+entry:
+ %1 = extractelement <20 x i8> %0, i32 6
+ ret i8 %1
+}
+; CHECK-LABEL: define i8 @extract_20xi8_at_6(<16 x i8>, <16 x i8>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <16 x i8> %0, i32 6
+; CHECK-NEXT: ret i8 %2
+; CHECK-NEXT: }
+
+define i8 @extract_20xi8_at_7(<20 x i8>) {
+entry:
+ %1 = extractelement <20 x i8> %0, i32 7
+ ret i8 %1
+}
+; CHECK-LABEL: define i8 @extract_20xi8_at_7(<16 x i8>, <16 x i8>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <16 x i8> %0, i32 7
+; CHECK-NEXT: ret i8 %2
+; CHECK-NEXT: }
+
+define i8 @extract_20xi8_at_8(<20 x i8>) {
+entry:
+ %1 = extractelement <20 x i8> %0, i32 8
+ ret i8 %1
+}
+; CHECK-LABEL: define i8 @extract_20xi8_at_8(<16 x i8>, <16 x i8>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <16 x i8> %0, i32 8
+; CHECK-NEXT: ret i8 %2
+; CHECK-NEXT: }
+
+define i8 @extract_20xi8_at_9(<20 x i8>) {
+entry:
+ %1 = extractelement <20 x i8> %0, i32 9
+ ret i8 %1
+}
+; CHECK-LABEL: define i8 @extract_20xi8_at_9(<16 x i8>, <16 x i8>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <16 x i8> %0, i32 9
+; CHECK-NEXT: ret i8 %2
+; CHECK-NEXT: }
+
+define i8 @extract_20xi8_at_10(<20 x i8>) {
+entry:
+ %1 = extractelement <20 x i8> %0, i32 10
+ ret i8 %1
+}
+; CHECK-LABEL: define i8 @extract_20xi8_at_10(<16 x i8>, <16 x i8>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <16 x i8> %0, i32 10
+; CHECK-NEXT: ret i8 %2
+; CHECK-NEXT: }
+
+define i8 @extract_20xi8_at_11(<20 x i8>) {
+entry:
+ %1 = extractelement <20 x i8> %0, i32 11
+ ret i8 %1
+}
+; CHECK-LABEL: define i8 @extract_20xi8_at_11(<16 x i8>, <16 x i8>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <16 x i8> %0, i32 11
+; CHECK-NEXT: ret i8 %2
+; CHECK-NEXT: }
+
+define i8 @extract_20xi8_at_12(<20 x i8>) {
+entry:
+ %1 = extractelement <20 x i8> %0, i32 12
+ ret i8 %1
+}
+; CHECK-LABEL: define i8 @extract_20xi8_at_12(<16 x i8>, <16 x i8>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <16 x i8> %0, i32 12
+; CHECK-NEXT: ret i8 %2
+; CHECK-NEXT: }
+
+define i8 @extract_20xi8_at_13(<20 x i8>) {
+entry:
+ %1 = extractelement <20 x i8> %0, i32 13
+ ret i8 %1
+}
+; CHECK-LABEL: define i8 @extract_20xi8_at_13(<16 x i8>, <16 x i8>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <16 x i8> %0, i32 13
+; CHECK-NEXT: ret i8 %2
+; CHECK-NEXT: }
+
+define i8 @extract_20xi8_at_14(<20 x i8>) {
+entry:
+ %1 = extractelement <20 x i8> %0, i32 14
+ ret i8 %1
+}
+; CHECK-LABEL: define i8 @extract_20xi8_at_14(<16 x i8>, <16 x i8>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <16 x i8> %0, i32 14
+; CHECK-NEXT: ret i8 %2
+; CHECK-NEXT: }
+
+define i8 @extract_20xi8_at_15(<20 x i8>) {
+entry:
+ %1 = extractelement <20 x i8> %0, i32 15
+ ret i8 %1
+}
+; CHECK-LABEL: define i8 @extract_20xi8_at_15(<16 x i8>, <16 x i8>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <16 x i8> %0, i32 15
+; CHECK-NEXT: ret i8 %2
+; CHECK-NEXT: }
+
+define i8 @extract_20xi8_at_16(<20 x i8>) {
+entry:
+ %1 = extractelement <20 x i8> %0, i32 16
+ ret i8 %1
+}
+; CHECK-LABEL: define i8 @extract_20xi8_at_16(<16 x i8>, <16 x i8>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <16 x i8> %1, i32 0
+; CHECK-NEXT: ret i8 %2
+; CHECK-NEXT: }
+
+define i8 @extract_20xi8_at_17(<20 x i8>) {
+entry:
+ %1 = extractelement <20 x i8> %0, i32 17
+ ret i8 %1
+}
+; CHECK-LABEL: define i8 @extract_20xi8_at_17(<16 x i8>, <16 x i8>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <16 x i8> %1, i32 1
+; CHECK-NEXT: ret i8 %2
+; CHECK-NEXT: }
+
+define i8 @extract_20xi8_at_18(<20 x i8>) {
+entry:
+ %1 = extractelement <20 x i8> %0, i32 18
+ ret i8 %1
+}
+; CHECK-LABEL: define i8 @extract_20xi8_at_18(<16 x i8>, <16 x i8>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <16 x i8> %1, i32 2
+; CHECK-NEXT: ret i8 %2
+; CHECK-NEXT: }
+
+define i8 @extract_20xi8_at_19(<20 x i8>) {
+entry:
+ %1 = extractelement <20 x i8> %0, i32 19
+ ret i8 %1
+}
+; CHECK-LABEL: define i8 @extract_20xi8_at_19(<16 x i8>, <16 x i8>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <16 x i8> %1, i32 3
+; CHECK-NEXT: ret i8 %2
+; CHECK-NEXT: }
+
+define i8 @extract_20xi8_undef_idx(<20 x i8>) {
+entry:
+ %1 = extractelement <20 x i8> %0, i32 20
+ ret i8 %1
+}
+; CHECK-LABEL: define i8 @extract_20xi8_undef_idx(<16 x i8>, <16 x i8>) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <16 x i8> %1, i32 4
+; CHECK-NEXT: ret i8 %2
+; CHECK-NEXT: }
+
+define i16 @extract_20xi16_at_0(<20 x i16>) {
+entry:
+ %1 = extractelement <20 x i16> %0, i32 0
+ ret i16 %1
+}
+; CHECK-LABEL: define i16 @extract_20xi16_at_0(<8 x i16>, <8 x i16>, <8 x i16>) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <8 x i16> %0, i32 0
+; CHECK-NEXT: ret i16 %3
+; CHECK-NEXT: }
+
+define i16 @extract_20xi16_at_1(<20 x i16>) {
+entry:
+ %1 = extractelement <20 x i16> %0, i32 1
+ ret i16 %1
+}
+; CHECK-LABEL: define i16 @extract_20xi16_at_1(<8 x i16>, <8 x i16>, <8 x i16>) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <8 x i16> %0, i32 1
+; CHECK-NEXT: ret i16 %3
+; CHECK-NEXT: }
+
+define i16 @extract_20xi16_at_2(<20 x i16>) {
+entry:
+ %1 = extractelement <20 x i16> %0, i32 2
+ ret i16 %1
+}
+; CHECK-LABEL: define i16 @extract_20xi16_at_2(<8 x i16>, <8 x i16>, <8 x i16>) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <8 x i16> %0, i32 2
+; CHECK-NEXT: ret i16 %3
+; CHECK-NEXT: }
+
+define i16 @extract_20xi16_at_3(<20 x i16>) {
+entry:
+ %1 = extractelement <20 x i16> %0, i32 3
+ ret i16 %1
+}
+; CHECK-LABEL: define i16 @extract_20xi16_at_3(<8 x i16>, <8 x i16>, <8 x i16>) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <8 x i16> %0, i32 3
+; CHECK-NEXT: ret i16 %3
+; CHECK-NEXT: }
+
+define i16 @extract_20xi16_at_4(<20 x i16>) {
+entry:
+ %1 = extractelement <20 x i16> %0, i32 4
+ ret i16 %1
+}
+; CHECK-LABEL: define i16 @extract_20xi16_at_4(<8 x i16>, <8 x i16>, <8 x i16>) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <8 x i16> %0, i32 4
+; CHECK-NEXT: ret i16 %3
+; CHECK-NEXT: }
+
+define i16 @extract_20xi16_at_5(<20 x i16>) {
+entry:
+ %1 = extractelement <20 x i16> %0, i32 5
+ ret i16 %1
+}
+; CHECK-LABEL: define i16 @extract_20xi16_at_5(<8 x i16>, <8 x i16>, <8 x i16>) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <8 x i16> %0, i32 5
+; CHECK-NEXT: ret i16 %3
+; CHECK-NEXT: }
+
+define i16 @extract_20xi16_at_6(<20 x i16>) {
+entry:
+ %1 = extractelement <20 x i16> %0, i32 6
+ ret i16 %1
+}
+; CHECK-LABEL: define i16 @extract_20xi16_at_6(<8 x i16>, <8 x i16>, <8 x i16>) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <8 x i16> %0, i32 6
+; CHECK-NEXT: ret i16 %3
+; CHECK-NEXT: }
+
+define i16 @extract_20xi16_at_7(<20 x i16>) {
+entry:
+ %1 = extractelement <20 x i16> %0, i32 7
+ ret i16 %1
+}
+; CHECK-LABEL: define i16 @extract_20xi16_at_7(<8 x i16>, <8 x i16>, <8 x i16>) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <8 x i16> %0, i32 7
+; CHECK-NEXT: ret i16 %3
+; CHECK-NEXT: }
+
+define i16 @extract_20xi16_at_8(<20 x i16>) {
+entry:
+ %1 = extractelement <20 x i16> %0, i32 8
+ ret i16 %1
+}
+; CHECK-LABEL: define i16 @extract_20xi16_at_8(<8 x i16>, <8 x i16>, <8 x i16>) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <8 x i16> %1, i32 0
+; CHECK-NEXT: ret i16 %3
+; CHECK-NEXT: }
+
+define i16 @extract_20xi16_at_9(<20 x i16>) {
+entry:
+ %1 = extractelement <20 x i16> %0, i32 9
+ ret i16 %1
+}
+; CHECK-LABEL: define i16 @extract_20xi16_at_9(<8 x i16>, <8 x i16>, <8 x i16>) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <8 x i16> %1, i32 1
+; CHECK-NEXT: ret i16 %3
+; CHECK-NEXT: }
+
+define i16 @extract_20xi16_at_10(<20 x i16>) {
+entry:
+ %1 = extractelement <20 x i16> %0, i32 10
+ ret i16 %1
+}
+; CHECK-LABEL: define i16 @extract_20xi16_at_10(<8 x i16>, <8 x i16>, <8 x i16>) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <8 x i16> %1, i32 2
+; CHECK-NEXT: ret i16 %3
+; CHECK-NEXT: }
+
+define i16 @extract_20xi16_at_11(<20 x i16>) {
+entry:
+ %1 = extractelement <20 x i16> %0, i32 11
+ ret i16 %1
+}
+; CHECK-LABEL: define i16 @extract_20xi16_at_11(<8 x i16>, <8 x i16>, <8 x i16>) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <8 x i16> %1, i32 3
+; CHECK-NEXT: ret i16 %3
+; CHECK-NEXT: }
+
+define i16 @extract_20xi16_at_12(<20 x i16>) {
+entry:
+ %1 = extractelement <20 x i16> %0, i32 12
+ ret i16 %1
+}
+; CHECK-LABEL: define i16 @extract_20xi16_at_12(<8 x i16>, <8 x i16>, <8 x i16>) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <8 x i16> %1, i32 4
+; CHECK-NEXT: ret i16 %3
+; CHECK-NEXT: }
+
+define i16 @extract_20xi16_at_13(<20 x i16>) {
+entry:
+ %1 = extractelement <20 x i16> %0, i32 13
+ ret i16 %1
+}
+; CHECK-LABEL: define i16 @extract_20xi16_at_13(<8 x i16>, <8 x i16>, <8 x i16>) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <8 x i16> %1, i32 5
+; CHECK-NEXT: ret i16 %3
+; CHECK-NEXT: }
+
+define i16 @extract_20xi16_at_14(<20 x i16>) {
+entry:
+ %1 = extractelement <20 x i16> %0, i32 14
+ ret i16 %1
+}
+; CHECK-LABEL: define i16 @extract_20xi16_at_14(<8 x i16>, <8 x i16>, <8 x i16>) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <8 x i16> %1, i32 6
+; CHECK-NEXT: ret i16 %3
+; CHECK-NEXT: }
+
+define i16 @extract_20xi16_at_15(<20 x i16>) {
+entry:
+ %1 = extractelement <20 x i16> %0, i32 15
+ ret i16 %1
+}
+; CHECK-LABEL: define i16 @extract_20xi16_at_15(<8 x i16>, <8 x i16>, <8 x i16>) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <8 x i16> %1, i32 7
+; CHECK-NEXT: ret i16 %3
+; CHECK-NEXT: }
+
+define i16 @extract_20xi16_at_16(<20 x i16>) {
+entry:
+ %1 = extractelement <20 x i16> %0, i32 16
+ ret i16 %1
+}
+; CHECK-LABEL: define i16 @extract_20xi16_at_16(<8 x i16>, <8 x i16>, <8 x i16>) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <8 x i16> %2, i32 0
+; CHECK-NEXT: ret i16 %3
+; CHECK-NEXT: }
+
+define i16 @extract_20xi16_at_17(<20 x i16>) {
+entry:
+ %1 = extractelement <20 x i16> %0, i32 17
+ ret i16 %1
+}
+; CHECK-LABEL: define i16 @extract_20xi16_at_17(<8 x i16>, <8 x i16>, <8 x i16>) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <8 x i16> %2, i32 1
+; CHECK-NEXT: ret i16 %3
+; CHECK-NEXT: }
+
+define i16 @extract_20xi16_at_18(<20 x i16>) {
+entry:
+ %1 = extractelement <20 x i16> %0, i32 18
+ ret i16 %1
+}
+; CHECK-LABEL: define i16 @extract_20xi16_at_18(<8 x i16>, <8 x i16>, <8 x i16>) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <8 x i16> %2, i32 2
+; CHECK-NEXT: ret i16 %3
+; CHECK-NEXT: }
+
+define i16 @extract_20xi16_at_19(<20 x i16>) {
+entry:
+ %1 = extractelement <20 x i16> %0, i32 19
+ ret i16 %1
+}
+; CHECK-LABEL: define i16 @extract_20xi16_at_19(<8 x i16>, <8 x i16>, <8 x i16>) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <8 x i16> %2, i32 3
+; CHECK-NEXT: ret i16 %3
+; CHECK-NEXT: }
+
+define i16 @extract_20xi16_undef_idx(<20 x i16>) {
+entry:
+ %1 = extractelement <20 x i16> %0, i32 20
+ ret i16 %1
+}
+; CHECK-LABEL: define i16 @extract_20xi16_undef_idx(<8 x i16>, <8 x i16>, <8 x i16>) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <8 x i16> %2, i32 4
+; CHECK-NEXT: ret i16 %3
+; CHECK-NEXT: }
+
+define i32 @extract_20xi32_at_0(<20 x i32>) {
+entry:
+ %1 = extractelement <20 x i32> %0, i32 0
+ ret i32 %1
+}
+; CHECK-LABEL: define i32 @extract_20xi32_at_0(<4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>) {
+; CHECK: entry:
+; CHECK-NEXT: %5 = extractelement <4 x i32> %0, i32 0
+; CHECK-NEXT: ret i32 %5
+; CHECK-NEXT: }
+
+define i32 @extract_20xi32_at_1(<20 x i32>) {
+entry:
+ %1 = extractelement <20 x i32> %0, i32 1
+ ret i32 %1
+}
+; CHECK-LABEL: define i32 @extract_20xi32_at_1(<4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>) {
+; CHECK: entry:
+; CHECK-NEXT: %5 = extractelement <4 x i32> %0, i32 1
+; CHECK-NEXT: ret i32 %5
+; CHECK-NEXT: }
+
+define i32 @extract_20xi32_at_2(<20 x i32>) {
+entry:
+ %1 = extractelement <20 x i32> %0, i32 2
+ ret i32 %1
+}
+; CHECK-LABEL: define i32 @extract_20xi32_at_2(<4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>) {
+; CHECK: entry:
+; CHECK-NEXT: %5 = extractelement <4 x i32> %0, i32 2
+; CHECK-NEXT: ret i32 %5
+; CHECK-NEXT: }
+
+define i32 @extract_20xi32_at_3(<20 x i32>) {
+entry:
+ %1 = extractelement <20 x i32> %0, i32 3
+ ret i32 %1
+}
+; CHECK-LABEL: define i32 @extract_20xi32_at_3(<4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>) {
+; CHECK: entry:
+; CHECK-NEXT: %5 = extractelement <4 x i32> %0, i32 3
+; CHECK-NEXT: ret i32 %5
+; CHECK-NEXT: }
+
+define i32 @extract_20xi32_at_4(<20 x i32>) {
+entry:
+ %1 = extractelement <20 x i32> %0, i32 4
+ ret i32 %1
+}
+; CHECK-LABEL: define i32 @extract_20xi32_at_4(<4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>) {
+; CHECK: entry:
+; CHECK-NEXT: %5 = extractelement <4 x i32> %1, i32 0
+; CHECK-NEXT: ret i32 %5
+; CHECK-NEXT: }
+
+define i32 @extract_20xi32_at_5(<20 x i32>) {
+entry:
+ %1 = extractelement <20 x i32> %0, i32 5
+ ret i32 %1
+}
+; CHECK-LABEL: define i32 @extract_20xi32_at_5(<4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>) {
+; CHECK: entry:
+; CHECK-NEXT: %5 = extractelement <4 x i32> %1, i32 1
+; CHECK-NEXT: ret i32 %5
+; CHECK-NEXT: }
+
+define i32 @extract_20xi32_at_6(<20 x i32>) {
+entry:
+ %1 = extractelement <20 x i32> %0, i32 6
+ ret i32 %1
+}
+; CHECK-LABEL: define i32 @extract_20xi32_at_6(<4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>) {
+; CHECK: entry:
+; CHECK-NEXT: %5 = extractelement <4 x i32> %1, i32 2
+; CHECK-NEXT: ret i32 %5
+; CHECK-NEXT: }
+
+define i32 @extract_20xi32_at_7(<20 x i32>) {
+entry:
+ %1 = extractelement <20 x i32> %0, i32 7
+ ret i32 %1
+}
+; CHECK-LABEL: define i32 @extract_20xi32_at_7(<4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>) {
+; CHECK: entry:
+; CHECK-NEXT: %5 = extractelement <4 x i32> %1, i32 3
+; CHECK-NEXT: ret i32 %5
+; CHECK-NEXT: }
+
+define i32 @extract_20xi32_at_8(<20 x i32>) {
+entry:
+ %1 = extractelement <20 x i32> %0, i32 8
+ ret i32 %1
+}
+; CHECK-LABEL: define i32 @extract_20xi32_at_8(<4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>) {
+; CHECK: entry:
+; CHECK-NEXT: %5 = extractelement <4 x i32> %2, i32 0
+; CHECK-NEXT: ret i32 %5
+; CHECK-NEXT: }
+
+define i32 @extract_20xi32_at_9(<20 x i32>) {
+entry:
+ %1 = extractelement <20 x i32> %0, i32 9
+ ret i32 %1
+}
+; CHECK-LABEL: define i32 @extract_20xi32_at_9(<4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>) {
+; CHECK: entry:
+; CHECK-NEXT: %5 = extractelement <4 x i32> %2, i32 1
+; CHECK-NEXT: ret i32 %5
+; CHECK-NEXT: }
+
+define i32 @extract_20xi32_at_10(<20 x i32>) {
+entry:
+ %1 = extractelement <20 x i32> %0, i32 10
+ ret i32 %1
+}
+; CHECK-LABEL: define i32 @extract_20xi32_at_10(<4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>) {
+; CHECK: entry:
+; CHECK-NEXT: %5 = extractelement <4 x i32> %2, i32 2
+; CHECK-NEXT: ret i32 %5
+; CHECK-NEXT: }
+
+define i32 @extract_20xi32_at_11(<20 x i32>) {
+entry:
+ %1 = extractelement <20 x i32> %0, i32 11
+ ret i32 %1
+}
+; CHECK-LABEL: define i32 @extract_20xi32_at_11(<4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>) {
+; CHECK: entry:
+; CHECK-NEXT: %5 = extractelement <4 x i32> %2, i32 3
+; CHECK-NEXT: ret i32 %5
+; CHECK-NEXT: }
+
+define i32 @extract_20xi32_at_12(<20 x i32>) {
+entry:
+ %1 = extractelement <20 x i32> %0, i32 12
+ ret i32 %1
+}
+; CHECK-LABEL: define i32 @extract_20xi32_at_12(<4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>) {
+; CHECK: entry:
+; CHECK-NEXT: %5 = extractelement <4 x i32> %3, i32 0
+; CHECK-NEXT: ret i32 %5
+; CHECK-NEXT: }
+
+define i32 @extract_20xi32_at_13(<20 x i32>) {
+entry:
+ %1 = extractelement <20 x i32> %0, i32 13
+ ret i32 %1
+}
+; CHECK-LABEL: define i32 @extract_20xi32_at_13(<4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>) {
+; CHECK: entry:
+; CHECK-NEXT: %5 = extractelement <4 x i32> %3, i32 1
+; CHECK-NEXT: ret i32 %5
+; CHECK-NEXT: }
+
+define i32 @extract_20xi32_at_14(<20 x i32>) {
+entry:
+ %1 = extractelement <20 x i32> %0, i32 14
+ ret i32 %1
+}
+; CHECK-LABEL: define i32 @extract_20xi32_at_14(<4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>) {
+; CHECK: entry:
+; CHECK-NEXT: %5 = extractelement <4 x i32> %3, i32 2
+; CHECK-NEXT: ret i32 %5
+; CHECK-NEXT: }
+
+define i32 @extract_20xi32_at_15(<20 x i32>) {
+entry:
+ %1 = extractelement <20 x i32> %0, i32 15
+ ret i32 %1
+}
+; CHECK-LABEL: define i32 @extract_20xi32_at_15(<4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>) {
+; CHECK: entry:
+; CHECK-NEXT: %5 = extractelement <4 x i32> %3, i32 3
+; CHECK-NEXT: ret i32 %5
+; CHECK-NEXT: }
+
+define i32 @extract_20xi32_at_16(<20 x i32>) {
+entry:
+ %1 = extractelement <20 x i32> %0, i32 16
+ ret i32 %1
+}
+; CHECK-LABEL: define i32 @extract_20xi32_at_16(<4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>) {
+; CHECK: entry:
+; CHECK-NEXT: %5 = extractelement <4 x i32> %4, i32 0
+; CHECK-NEXT: ret i32 %5
+; CHECK-NEXT: }
+
+define i32 @extract_20xi32_at_17(<20 x i32>) {
+entry:
+ %1 = extractelement <20 x i32> %0, i32 17
+ ret i32 %1
+}
+; CHECK-LABEL: define i32 @extract_20xi32_at_17(<4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>) {
+; CHECK: entry:
+; CHECK-NEXT: %5 = extractelement <4 x i32> %4, i32 1
+; CHECK-NEXT: ret i32 %5
+; CHECK-NEXT: }
+
+define i32 @extract_20xi32_at_18(<20 x i32>) {
+entry:
+ %1 = extractelement <20 x i32> %0, i32 18
+ ret i32 %1
+}
+; CHECK-LABEL: define i32 @extract_20xi32_at_18(<4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>) {
+; CHECK: entry:
+; CHECK-NEXT: %5 = extractelement <4 x i32> %4, i32 2
+; CHECK-NEXT: ret i32 %5
+; CHECK-NEXT: }
+
+define i32 @extract_20xi32_at_19(<20 x i32>) {
+entry:
+ %1 = extractelement <20 x i32> %0, i32 19
+ ret i32 %1
+}
+; CHECK-LABEL: define i32 @extract_20xi32_at_19(<4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>) {
+; CHECK: entry:
+; CHECK-NEXT: %5 = extractelement <4 x i32> %4, i32 3
+; CHECK-NEXT: ret i32 %5
+; CHECK-NEXT: }
+
+define i32 @extract_20xi32_undef_idx(<20 x i32>) {
+entry:
+ %1 = extractelement <20 x i32> %0, i32 20
+ ret i32 %1
+}
+; CHECK-LABEL: define i32 @extract_20xi32_undef_idx(<4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>) {
+; CHECK: entry:
+; CHECK-NEXT: %5 = extractelement <4 x i32> %4, i32 4
+; CHECK-NEXT: ret i32 %5
+; CHECK-NEXT: }
+
+define i64 @extract_20xi64_at_0(<20 x i64>) {
+entry:
+ %1 = extractelement <20 x i64> %0, i32 0
+ ret i64 %1
+}
+; CHECK-LABEL: define i64 @extract_20xi64_at_0(<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>) {
+; CHECK: entry:
+; CHECK-NEXT: %10 = extractelement <2 x i64> %0, i32 0
+; CHECK-NEXT: ret i64 %10
+; CHECK-NEXT: }
+
+define i64 @extract_20xi64_at_1(<20 x i64>) {
+entry:
+ %1 = extractelement <20 x i64> %0, i32 1
+ ret i64 %1
+}
+; CHECK-LABEL: define i64 @extract_20xi64_at_1(<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>) {
+; CHECK: entry:
+; CHECK-NEXT: %10 = extractelement <2 x i64> %0, i32 1
+; CHECK-NEXT: ret i64 %10
+; CHECK-NEXT: }
+
+define i64 @extract_20xi64_at_2(<20 x i64>) {
+entry:
+ %1 = extractelement <20 x i64> %0, i32 2
+ ret i64 %1
+}
+; CHECK-LABEL: define i64 @extract_20xi64_at_2(<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>) {
+; CHECK: entry:
+; CHECK-NEXT: %10 = extractelement <2 x i64> %1, i32 0
+; CHECK-NEXT: ret i64 %10
+; CHECK-NEXT: }
+
+define i64 @extract_20xi64_at_3(<20 x i64>) {
+entry:
+ %1 = extractelement <20 x i64> %0, i32 3
+ ret i64 %1
+}
+; CHECK-LABEL: define i64 @extract_20xi64_at_3(<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>) {
+; CHECK: entry:
+; CHECK-NEXT: %10 = extractelement <2 x i64> %1, i32 1
+; CHECK-NEXT: ret i64 %10
+; CHECK-NEXT: }
+
+define i64 @extract_20xi64_at_4(<20 x i64>) {
+entry:
+ %1 = extractelement <20 x i64> %0, i32 4
+ ret i64 %1
+}
+; CHECK-LABEL: define i64 @extract_20xi64_at_4(<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>) {
+; CHECK: entry:
+; CHECK-NEXT: %10 = extractelement <2 x i64> %2, i32 0
+; CHECK-NEXT: ret i64 %10
+; CHECK-NEXT: }
+
+define i64 @extract_20xi64_at_5(<20 x i64>) {
+entry:
+ %1 = extractelement <20 x i64> %0, i32 5
+ ret i64 %1
+}
+; CHECK-LABEL: define i64 @extract_20xi64_at_5(<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>) {
+; CHECK: entry:
+; CHECK-NEXT: %10 = extractelement <2 x i64> %2, i32 1
+; CHECK-NEXT: ret i64 %10
+; CHECK-NEXT: }
+
+define i64 @extract_20xi64_at_6(<20 x i64>) {
+entry:
+ %1 = extractelement <20 x i64> %0, i32 6
+ ret i64 %1
+}
+; CHECK-LABEL: define i64 @extract_20xi64_at_6(<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>) {
+; CHECK: entry:
+; CHECK-NEXT: %10 = extractelement <2 x i64> %3, i32 0
+; CHECK-NEXT: ret i64 %10
+; CHECK-NEXT: }
+
+define i64 @extract_20xi64_at_7(<20 x i64>) {
+entry:
+ %1 = extractelement <20 x i64> %0, i32 7
+ ret i64 %1
+}
+; CHECK-LABEL: define i64 @extract_20xi64_at_7(<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>) {
+; CHECK: entry:
+; CHECK-NEXT: %10 = extractelement <2 x i64> %3, i32 1
+; CHECK-NEXT: ret i64 %10
+; CHECK-NEXT: }
+
+define i64 @extract_20xi64_at_8(<20 x i64>) {
+entry:
+ %1 = extractelement <20 x i64> %0, i32 8
+ ret i64 %1
+}
+; CHECK-LABEL: define i64 @extract_20xi64_at_8(<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>) {
+; CHECK: entry:
+; CHECK-NEXT: %10 = extractelement <2 x i64> %4, i32 0
+; CHECK-NEXT: ret i64 %10
+; CHECK-NEXT: }
+
+define i64 @extract_20xi64_at_9(<20 x i64>) {
+entry:
+ %1 = extractelement <20 x i64> %0, i32 9
+ ret i64 %1
+}
+; CHECK-LABEL: define i64 @extract_20xi64_at_9(<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>) {
+; CHECK: entry:
+; CHECK-NEXT: %10 = extractelement <2 x i64> %4, i32 1
+; CHECK-NEXT: ret i64 %10
+; CHECK-NEXT: }
+
+define i64 @extract_20xi64_at_10(<20 x i64>) {
+entry:
+ %1 = extractelement <20 x i64> %0, i32 10
+ ret i64 %1
+}
+; CHECK-LABEL: define i64 @extract_20xi64_at_10(<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>) {
+; CHECK: entry:
+; CHECK-NEXT: %10 = extractelement <2 x i64> %5, i32 0
+; CHECK-NEXT: ret i64 %10
+; CHECK-NEXT: }
+
+define i64 @extract_20xi64_at_11(<20 x i64>) {
+entry:
+ %1 = extractelement <20 x i64> %0, i32 11
+ ret i64 %1
+}
+; CHECK-LABEL: define i64 @extract_20xi64_at_11(<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>) {
+; CHECK: entry:
+; CHECK-NEXT: %10 = extractelement <2 x i64> %5, i32 1
+; CHECK-NEXT: ret i64 %10
+; CHECK-NEXT: }
+
+define i64 @extract_20xi64_at_12(<20 x i64>) {
+entry:
+ %1 = extractelement <20 x i64> %0, i32 12
+ ret i64 %1
+}
+; CHECK-LABEL: define i64 @extract_20xi64_at_12(<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>) {
+; CHECK: entry:
+; CHECK-NEXT: %10 = extractelement <2 x i64> %6, i32 0
+; CHECK-NEXT: ret i64 %10
+; CHECK-NEXT: }
+
+define i64 @extract_20xi64_at_13(<20 x i64>) {
+entry:
+ %1 = extractelement <20 x i64> %0, i32 13
+ ret i64 %1
+}
+; CHECK-LABEL: define i64 @extract_20xi64_at_13(<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>) {
+; CHECK: entry:
+; CHECK-NEXT: %10 = extractelement <2 x i64> %6, i32 1
+; CHECK-NEXT: ret i64 %10
+; CHECK-NEXT: }
+
+define i64 @extract_20xi64_at_14(<20 x i64>) {
+entry:
+ %1 = extractelement <20 x i64> %0, i32 14
+ ret i64 %1
+}
+; CHECK-LABEL: define i64 @extract_20xi64_at_14(<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>) {
+; CHECK: entry:
+; CHECK-NEXT: %10 = extractelement <2 x i64> %7, i32 0
+; CHECK-NEXT: ret i64 %10
+; CHECK-NEXT: }
+
+define i64 @extract_20xi64_at_15(<20 x i64>) {
+entry:
+ %1 = extractelement <20 x i64> %0, i32 15
+ ret i64 %1
+}
+; CHECK-LABEL: define i64 @extract_20xi64_at_15(<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>) {
+; CHECK: entry:
+; CHECK-NEXT: %10 = extractelement <2 x i64> %7, i32 1
+; CHECK-NEXT: ret i64 %10
+; CHECK-NEXT: }
+
+define i64 @extract_20xi64_at_16(<20 x i64>) {
+entry:
+ %1 = extractelement <20 x i64> %0, i32 16
+ ret i64 %1
+}
+; CHECK-LABEL: define i64 @extract_20xi64_at_16(<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>) {
+; CHECK: entry:
+; CHECK-NEXT: %10 = extractelement <2 x i64> %8, i32 0
+; CHECK-NEXT: ret i64 %10
+; CHECK-NEXT: }
+
+define i64 @extract_20xi64_at_17(<20 x i64>) {
+entry:
+ %1 = extractelement <20 x i64> %0, i32 17
+ ret i64 %1
+}
+; CHECK-LABEL: define i64 @extract_20xi64_at_17(<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>) {
+; CHECK: entry:
+; CHECK-NEXT: %10 = extractelement <2 x i64> %8, i32 1
+; CHECK-NEXT: ret i64 %10
+; CHECK-NEXT: }
+
+define i64 @extract_20xi64_at_18(<20 x i64>) {
+entry:
+ %1 = extractelement <20 x i64> %0, i32 18
+ ret i64 %1
+}
+; CHECK-LABEL: define i64 @extract_20xi64_at_18(<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>) {
+; CHECK: entry:
+; CHECK-NEXT: %10 = extractelement <2 x i64> %9, i32 0
+; CHECK-NEXT: ret i64 %10
+; CHECK-NEXT: }
+
+define i64 @extract_20xi64_at_19(<20 x i64>) {
+entry:
+ %1 = extractelement <20 x i64> %0, i32 19
+ ret i64 %1
+}
+; CHECK-LABEL: define i64 @extract_20xi64_at_19(<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>) {
+; CHECK: entry:
+; CHECK-NEXT: %10 = extractelement <2 x i64> %9, i32 1
+; CHECK-NEXT: ret i64 %10
+; CHECK-NEXT: }
+
+define i64 @extract_20xi64_undef_idx(<20 x i64>) {
+entry:
+ %1 = extractelement <20 x i64> %0, i32 20
+ ret i64 %1
+}
+; CHECK-LABEL: define i64 @extract_20xi64_undef_idx(<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>) {
+; CHECK: entry:
+; CHECK-NEXT: %10 = extractelement <2 x i64> %9, i32 2
+; CHECK-NEXT: ret i64 %10
+; CHECK-NEXT: }
+
+define i8* @extract_20xi8ptr_at_0(<20 x i8*>) {
+entry:
+ %1 = extractelement <20 x i8*> %0, i32 0
+ ret i8* %1
+}
+; CHECK-LABEL: define i8* @extract_20xi8ptr_at_0(<4 x i8*>, <4 x i8*>, <4 x i8*>, <4 x i8*>, <4 x i8*>) {
+; CHECK: entry:
+; CHECK-NEXT: %5 = extractelement <4 x i8*> %0, i32 0
+; CHECK-NEXT: ret i8* %5
+; CHECK-NEXT: }
+
+define i8* @extract_20xi8ptr_at_1(<20 x i8*>) {
+entry:
+ %1 = extractelement <20 x i8*> %0, i32 1
+ ret i8* %1
+}
+; CHECK-LABEL: define i8* @extract_20xi8ptr_at_1(<4 x i8*>, <4 x i8*>, <4 x i8*>, <4 x i8*>, <4 x i8*>) {
+; CHECK: entry:
+; CHECK-NEXT: %5 = extractelement <4 x i8*> %0, i32 1
+; CHECK-NEXT: ret i8* %5
+; CHECK-NEXT: }
+
+define i8* @extract_20xi8ptr_at_2(<20 x i8*>) {
+entry:
+ %1 = extractelement <20 x i8*> %0, i32 2
+ ret i8* %1
+}
+; CHECK-LABEL: define i8* @extract_20xi8ptr_at_2(<4 x i8*>, <4 x i8*>, <4 x i8*>, <4 x i8*>, <4 x i8*>) {
+; CHECK: entry:
+; CHECK-NEXT: %5 = extractelement <4 x i8*> %0, i32 2
+; CHECK-NEXT: ret i8* %5
+; CHECK-NEXT: }
+
+define i8* @extract_20xi8ptr_at_3(<20 x i8*>) {
+entry:
+ %1 = extractelement <20 x i8*> %0, i32 3
+ ret i8* %1
+}
+; CHECK-LABEL: define i8* @extract_20xi8ptr_at_3(<4 x i8*>, <4 x i8*>, <4 x i8*>, <4 x i8*>, <4 x i8*>) {
+; CHECK: entry:
+; CHECK-NEXT: %5 = extractelement <4 x i8*> %0, i32 3
+; CHECK-NEXT: ret i8* %5
+; CHECK-NEXT: }
+
+define i8* @extract_20xi8ptr_at_4(<20 x i8*>) {
+entry:
+ %1 = extractelement <20 x i8*> %0, i32 4
+ ret i8* %1
+}
+; CHECK-LABEL: define i8* @extract_20xi8ptr_at_4(<4 x i8*>, <4 x i8*>, <4 x i8*>, <4 x i8*>, <4 x i8*>) {
+; CHECK: entry:
+; CHECK-NEXT: %5 = extractelement <4 x i8*> %1, i32 0
+; CHECK-NEXT: ret i8* %5
+; CHECK-NEXT: }
+
+define i8* @extract_20xi8ptr_at_5(<20 x i8*>) {
+entry:
+ %1 = extractelement <20 x i8*> %0, i32 5
+ ret i8* %1
+}
+; CHECK-LABEL: define i8* @extract_20xi8ptr_at_5(<4 x i8*>, <4 x i8*>, <4 x i8*>, <4 x i8*>, <4 x i8*>) {
+; CHECK: entry:
+; CHECK-NEXT: %5 = extractelement <4 x i8*> %1, i32 1
+; CHECK-NEXT: ret i8* %5
+; CHECK-NEXT: }
+
+define i8* @extract_20xi8ptr_at_6(<20 x i8*>) {
+entry:
+ %1 = extractelement <20 x i8*> %0, i32 6
+ ret i8* %1
+}
+; CHECK-LABEL: define i8* @extract_20xi8ptr_at_6(<4 x i8*>, <4 x i8*>, <4 x i8*>, <4 x i8*>, <4 x i8*>) {
+; CHECK: entry:
+; CHECK-NEXT: %5 = extractelement <4 x i8*> %1, i32 2
+; CHECK-NEXT: ret i8* %5
+; CHECK-NEXT: }
+
+define i8* @extract_20xi8ptr_at_7(<20 x i8*>) {
+entry:
+ %1 = extractelement <20 x i8*> %0, i32 7
+ ret i8* %1
+}
+; CHECK-LABEL: define i8* @extract_20xi8ptr_at_7(<4 x i8*>, <4 x i8*>, <4 x i8*>, <4 x i8*>, <4 x i8*>) {
+; CHECK: entry:
+; CHECK-NEXT: %5 = extractelement <4 x i8*> %1, i32 3
+; CHECK-NEXT: ret i8* %5
+; CHECK-NEXT: }
+
+define i8* @extract_20xi8ptr_at_8(<20 x i8*>) {
+entry:
+ %1 = extractelement <20 x i8*> %0, i32 8
+ ret i8* %1
+}
+; CHECK-LABEL: define i8* @extract_20xi8ptr_at_8(<4 x i8*>, <4 x i8*>, <4 x i8*>, <4 x i8*>, <4 x i8*>) {
+; CHECK: entry:
+; CHECK-NEXT: %5 = extractelement <4 x i8*> %2, i32 0
+; CHECK-NEXT: ret i8* %5
+; CHECK-NEXT: }
+
+define i8* @extract_20xi8ptr_at_9(<20 x i8*>) {
+entry:
+ %1 = extractelement <20 x i8*> %0, i32 9
+ ret i8* %1
+}
+; CHECK-LABEL: define i8* @extract_20xi8ptr_at_9(<4 x i8*>, <4 x i8*>, <4 x i8*>, <4 x i8*>, <4 x i8*>) {
+; CHECK: entry:
+; CHECK-NEXT: %5 = extractelement <4 x i8*> %2, i32 1
+; CHECK-NEXT: ret i8* %5
+; CHECK-NEXT: }
+
+define i8* @extract_20xi8ptr_at_10(<20 x i8*>) {
+entry:
+ %1 = extractelement <20 x i8*> %0, i32 10
+ ret i8* %1
+}
+; CHECK-LABEL: define i8* @extract_20xi8ptr_at_10(<4 x i8*>, <4 x i8*>, <4 x i8*>, <4 x i8*>, <4 x i8*>) {
+; CHECK: entry:
+; CHECK-NEXT: %5 = extractelement <4 x i8*> %2, i32 2
+; CHECK-NEXT: ret i8* %5
+; CHECK-NEXT: }
+
+define i8* @extract_20xi8ptr_at_11(<20 x i8*>) {
+entry:
+ %1 = extractelement <20 x i8*> %0, i32 11
+ ret i8* %1
+}
+; CHECK-LABEL: define i8* @extract_20xi8ptr_at_11(<4 x i8*>, <4 x i8*>, <4 x i8*>, <4 x i8*>, <4 x i8*>) {
+; CHECK: entry:
+; CHECK-NEXT: %5 = extractelement <4 x i8*> %2, i32 3
+; CHECK-NEXT: ret i8* %5
+; CHECK-NEXT: }
+
+define i8* @extract_20xi8ptr_at_12(<20 x i8*>) {
+entry:
+ %1 = extractelement <20 x i8*> %0, i32 12
+ ret i8* %1
+}
+; CHECK-LABEL: define i8* @extract_20xi8ptr_at_12(<4 x i8*>, <4 x i8*>, <4 x i8*>, <4 x i8*>, <4 x i8*>) {
+; CHECK: entry:
+; CHECK-NEXT: %5 = extractelement <4 x i8*> %3, i32 0
+; CHECK-NEXT: ret i8* %5
+; CHECK-NEXT: }
+
+define i8* @extract_20xi8ptr_at_13(<20 x i8*>) {
+entry:
+ %1 = extractelement <20 x i8*> %0, i32 13
+ ret i8* %1
+}
+; CHECK-LABEL: define i8* @extract_20xi8ptr_at_13(<4 x i8*>, <4 x i8*>, <4 x i8*>, <4 x i8*>, <4 x i8*>) {
+; CHECK: entry:
+; CHECK-NEXT: %5 = extractelement <4 x i8*> %3, i32 1
+; CHECK-NEXT: ret i8* %5
+; CHECK-NEXT: }
+
+define i8* @extract_20xi8ptr_at_14(<20 x i8*>) {
+entry:
+ %1 = extractelement <20 x i8*> %0, i32 14
+ ret i8* %1
+}
+; CHECK-LABEL: define i8* @extract_20xi8ptr_at_14(<4 x i8*>, <4 x i8*>, <4 x i8*>, <4 x i8*>, <4 x i8*>) {
+; CHECK: entry:
+; CHECK-NEXT: %5 = extractelement <4 x i8*> %3, i32 2
+; CHECK-NEXT: ret i8* %5
+; CHECK-NEXT: }
+
+define i8* @extract_20xi8ptr_at_15(<20 x i8*>) {
+entry:
+ %1 = extractelement <20 x i8*> %0, i32 15
+ ret i8* %1
+}
+; CHECK-LABEL: define i8* @extract_20xi8ptr_at_15(<4 x i8*>, <4 x i8*>, <4 x i8*>, <4 x i8*>, <4 x i8*>) {
+; CHECK: entry:
+; CHECK-NEXT: %5 = extractelement <4 x i8*> %3, i32 3
+; CHECK-NEXT: ret i8* %5
+; CHECK-NEXT: }
+
+define i8* @extract_20xi8ptr_at_16(<20 x i8*>) {
+entry:
+ %1 = extractelement <20 x i8*> %0, i32 16
+ ret i8* %1
+}
+; CHECK-LABEL: define i8* @extract_20xi8ptr_at_16(<4 x i8*>, <4 x i8*>, <4 x i8*>, <4 x i8*>, <4 x i8*>) {
+; CHECK: entry:
+; CHECK-NEXT: %5 = extractelement <4 x i8*> %4, i32 0
+; CHECK-NEXT: ret i8* %5
+; CHECK-NEXT: }
+
+define i8* @extract_20xi8ptr_at_17(<20 x i8*>) {
+entry:
+ %1 = extractelement <20 x i8*> %0, i32 17
+ ret i8* %1
+}
+; CHECK-LABEL: define i8* @extract_20xi8ptr_at_17(<4 x i8*>, <4 x i8*>, <4 x i8*>, <4 x i8*>, <4 x i8*>) {
+; CHECK: entry:
+; CHECK-NEXT: %5 = extractelement <4 x i8*> %4, i32 1
+; CHECK-NEXT: ret i8* %5
+; CHECK-NEXT: }
+
+define i8* @extract_20xi8ptr_at_18(<20 x i8*>) {
+entry:
+ %1 = extractelement <20 x i8*> %0, i32 18
+ ret i8* %1
+}
+; CHECK-LABEL: define i8* @extract_20xi8ptr_at_18(<4 x i8*>, <4 x i8*>, <4 x i8*>, <4 x i8*>, <4 x i8*>) {
+; CHECK: entry:
+; CHECK-NEXT: %5 = extractelement <4 x i8*> %4, i32 2
+; CHECK-NEXT: ret i8* %5
+; CHECK-NEXT: }
+
+define i8* @extract_20xi8ptr_at_19(<20 x i8*>) {
+entry:
+ %1 = extractelement <20 x i8*> %0, i32 19
+ ret i8* %1
+}
+; CHECK-LABEL: define i8* @extract_20xi8ptr_at_19(<4 x i8*>, <4 x i8*>, <4 x i8*>, <4 x i8*>, <4 x i8*>) {
+; CHECK: entry:
+; CHECK-NEXT: %5 = extractelement <4 x i8*> %4, i32 3
+; CHECK-NEXT: ret i8* %5
+; CHECK-NEXT: }
+
+define i8* @extract_20xi8ptr_undef_idx(<20 x i8*>) {
+entry:
+ %1 = extractelement <20 x i8*> %0, i32 20
+ ret i8* %1
+}
+; CHECK-LABEL: define i8* @extract_20xi8ptr_undef_idx(<4 x i8*>, <4 x i8*>, <4 x i8*>, <4 x i8*>, <4 x i8*>) {
+; CHECK: entry:
+; CHECK-NEXT: %5 = extractelement <4 x i8*> %4, i32 4
+; CHECK-NEXT: ret i8* %5
+; CHECK-NEXT: }
+
+define float @extract_20xfloat_at_0(<20 x float>) {
+entry:
+ %1 = extractelement <20 x float> %0, i32 0
+ ret float %1
+}
+; CHECK-LABEL: define float @extract_20xfloat_at_0(<4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>) {
+; CHECK: entry:
+; CHECK-NEXT: %5 = extractelement <4 x float> %0, i32 0
+; CHECK-NEXT: ret float %5
+; CHECK-NEXT: }
+
+define float @extract_20xfloat_at_1(<20 x float>) {
+entry:
+ %1 = extractelement <20 x float> %0, i32 1
+ ret float %1
+}
+; CHECK-LABEL: define float @extract_20xfloat_at_1(<4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>) {
+; CHECK: entry:
+; CHECK-NEXT: %5 = extractelement <4 x float> %0, i32 1
+; CHECK-NEXT: ret float %5
+; CHECK-NEXT: }
+
+define float @extract_20xfloat_at_2(<20 x float>) {
+entry:
+ %1 = extractelement <20 x float> %0, i32 2
+ ret float %1
+}
+; CHECK-LABEL: define float @extract_20xfloat_at_2(<4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>) {
+; CHECK: entry:
+; CHECK-NEXT: %5 = extractelement <4 x float> %0, i32 2
+; CHECK-NEXT: ret float %5
+; CHECK-NEXT: }
+
+define float @extract_20xfloat_at_3(<20 x float>) {
+entry:
+ %1 = extractelement <20 x float> %0, i32 3
+ ret float %1
+}
+; CHECK-LABEL: define float @extract_20xfloat_at_3(<4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>) {
+; CHECK: entry:
+; CHECK-NEXT: %5 = extractelement <4 x float> %0, i32 3
+; CHECK-NEXT: ret float %5
+; CHECK-NEXT: }
+
+define float @extract_20xfloat_at_4(<20 x float>) {
+entry:
+ %1 = extractelement <20 x float> %0, i32 4
+ ret float %1
+}
+; CHECK-LABEL: define float @extract_20xfloat_at_4(<4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>) {
+; CHECK: entry:
+; CHECK-NEXT: %5 = extractelement <4 x float> %1, i32 0
+; CHECK-NEXT: ret float %5
+; CHECK-NEXT: }
+
+define float @extract_20xfloat_at_5(<20 x float>) {
+entry:
+ %1 = extractelement <20 x float> %0, i32 5
+ ret float %1
+}
+; CHECK-LABEL: define float @extract_20xfloat_at_5(<4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>) {
+; CHECK: entry:
+; CHECK-NEXT: %5 = extractelement <4 x float> %1, i32 1
+; CHECK-NEXT: ret float %5
+; CHECK-NEXT: }
+
+define float @extract_20xfloat_at_6(<20 x float>) {
+entry:
+ %1 = extractelement <20 x float> %0, i32 6
+ ret float %1
+}
+; CHECK-LABEL: define float @extract_20xfloat_at_6(<4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>) {
+; CHECK: entry:
+; CHECK-NEXT: %5 = extractelement <4 x float> %1, i32 2
+; CHECK-NEXT: ret float %5
+; CHECK-NEXT: }
+
+define float @extract_20xfloat_at_7(<20 x float>) {
+entry:
+ %1 = extractelement <20 x float> %0, i32 7
+ ret float %1
+}
+; CHECK-LABEL: define float @extract_20xfloat_at_7(<4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>) {
+; CHECK: entry:
+; CHECK-NEXT: %5 = extractelement <4 x float> %1, i32 3
+; CHECK-NEXT: ret float %5
+; CHECK-NEXT: }
+
+define float @extract_20xfloat_at_8(<20 x float>) {
+entry:
+ %1 = extractelement <20 x float> %0, i32 8
+ ret float %1
+}
+; CHECK-LABEL: define float @extract_20xfloat_at_8(<4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>) {
+; CHECK: entry:
+; CHECK-NEXT: %5 = extractelement <4 x float> %2, i32 0
+; CHECK-NEXT: ret float %5
+; CHECK-NEXT: }
+
+define float @extract_20xfloat_at_9(<20 x float>) {
+entry:
+ %1 = extractelement <20 x float> %0, i32 9
+ ret float %1
+}
+; CHECK-LABEL: define float @extract_20xfloat_at_9(<4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>) {
+; CHECK: entry:
+; CHECK-NEXT: %5 = extractelement <4 x float> %2, i32 1
+; CHECK-NEXT: ret float %5
+; CHECK-NEXT: }
+
+define float @extract_20xfloat_at_10(<20 x float>) {
+entry:
+ %1 = extractelement <20 x float> %0, i32 10
+ ret float %1
+}
+; CHECK-LABEL: define float @extract_20xfloat_at_10(<4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>) {
+; CHECK: entry:
+; CHECK-NEXT: %5 = extractelement <4 x float> %2, i32 2
+; CHECK-NEXT: ret float %5
+; CHECK-NEXT: }
+
+define float @extract_20xfloat_at_11(<20 x float>) {
+entry:
+ %1 = extractelement <20 x float> %0, i32 11
+ ret float %1
+}
+; CHECK-LABEL: define float @extract_20xfloat_at_11(<4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>) {
+; CHECK: entry:
+; CHECK-NEXT: %5 = extractelement <4 x float> %2, i32 3
+; CHECK-NEXT: ret float %5
+; CHECK-NEXT: }
+
+define float @extract_20xfloat_at_12(<20 x float>) {
+entry:
+ %1 = extractelement <20 x float> %0, i32 12
+ ret float %1
+}
+; CHECK-LABEL: define float @extract_20xfloat_at_12(<4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>) {
+; CHECK: entry:
+; CHECK-NEXT: %5 = extractelement <4 x float> %3, i32 0
+; CHECK-NEXT: ret float %5
+; CHECK-NEXT: }
+
+define float @extract_20xfloat_at_13(<20 x float>) {
+entry:
+ %1 = extractelement <20 x float> %0, i32 13
+ ret float %1
+}
+; CHECK-LABEL: define float @extract_20xfloat_at_13(<4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>) {
+; CHECK: entry:
+; CHECK-NEXT: %5 = extractelement <4 x float> %3, i32 1
+; CHECK-NEXT: ret float %5
+; CHECK-NEXT: }
+
+define float @extract_20xfloat_at_14(<20 x float>) {
+entry:
+ %1 = extractelement <20 x float> %0, i32 14
+ ret float %1
+}
+; CHECK-LABEL: define float @extract_20xfloat_at_14(<4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>) {
+; CHECK: entry:
+; CHECK-NEXT: %5 = extractelement <4 x float> %3, i32 2
+; CHECK-NEXT: ret float %5
+; CHECK-NEXT: }
+
+define float @extract_20xfloat_at_15(<20 x float>) {
+entry:
+ %1 = extractelement <20 x float> %0, i32 15
+ ret float %1
+}
+; CHECK-LABEL: define float @extract_20xfloat_at_15(<4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>) {
+; CHECK: entry:
+; CHECK-NEXT: %5 = extractelement <4 x float> %3, i32 3
+; CHECK-NEXT: ret float %5
+; CHECK-NEXT: }
+
+define float @extract_20xfloat_at_16(<20 x float>) {
+entry:
+ %1 = extractelement <20 x float> %0, i32 16
+ ret float %1
+}
+; CHECK-LABEL: define float @extract_20xfloat_at_16(<4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>) {
+; CHECK: entry:
+; CHECK-NEXT: %5 = extractelement <4 x float> %4, i32 0
+; CHECK-NEXT: ret float %5
+; CHECK-NEXT: }
+
+define float @extract_20xfloat_at_17(<20 x float>) {
+entry:
+ %1 = extractelement <20 x float> %0, i32 17
+ ret float %1
+}
+; CHECK-LABEL: define float @extract_20xfloat_at_17(<4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>) {
+; CHECK: entry:
+; CHECK-NEXT: %5 = extractelement <4 x float> %4, i32 1
+; CHECK-NEXT: ret float %5
+; CHECK-NEXT: }
+
+define float @extract_20xfloat_at_18(<20 x float>) {
+entry:
+ %1 = extractelement <20 x float> %0, i32 18
+ ret float %1
+}
+; CHECK-LABEL: define float @extract_20xfloat_at_18(<4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>) {
+; CHECK: entry:
+; CHECK-NEXT: %5 = extractelement <4 x float> %4, i32 2
+; CHECK-NEXT: ret float %5
+; CHECK-NEXT: }
+
+define float @extract_20xfloat_at_19(<20 x float>) {
+entry:
+ %1 = extractelement <20 x float> %0, i32 19
+ ret float %1
+}
+; CHECK-LABEL: define float @extract_20xfloat_at_19(<4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>) {
+; CHECK: entry:
+; CHECK-NEXT: %5 = extractelement <4 x float> %4, i32 3
+; CHECK-NEXT: ret float %5
+; CHECK-NEXT: }
+
+define float @extract_20xfloat_undef_idx(<20 x float>) {
+entry:
+ %1 = extractelement <20 x float> %0, i32 20
+ ret float %1
+}
+; CHECK-LABEL: define float @extract_20xfloat_undef_idx(<4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>) {
+; CHECK: entry:
+; CHECK-NEXT: %5 = extractelement <4 x float> %4, i32 4
+; CHECK-NEXT: ret float %5
+; CHECK-NEXT: }
+
+define double @extract_20xdouble_at_0(<20 x double>) {
+entry:
+ %1 = extractelement <20 x double> %0, i32 0
+ ret double %1
+}
+; CHECK-LABEL: define double @extract_20xdouble_at_0(<2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>) {
+; CHECK: entry:
+; CHECK-NEXT: %10 = extractelement <2 x double> %0, i32 0
+; CHECK-NEXT: ret double %10
+; CHECK-NEXT: }
+
+define double @extract_20xdouble_at_1(<20 x double>) {
+entry:
+ %1 = extractelement <20 x double> %0, i32 1
+ ret double %1
+}
+; CHECK-LABEL: define double @extract_20xdouble_at_1(<2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>) {
+; CHECK: entry:
+; CHECK-NEXT: %10 = extractelement <2 x double> %0, i32 1
+; CHECK-NEXT: ret double %10
+; CHECK-NEXT: }
+
+define double @extract_20xdouble_at_2(<20 x double>) {
+entry:
+ %1 = extractelement <20 x double> %0, i32 2
+ ret double %1
+}
+; CHECK-LABEL: define double @extract_20xdouble_at_2(<2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>) {
+; CHECK: entry:
+; CHECK-NEXT: %10 = extractelement <2 x double> %1, i32 0
+; CHECK-NEXT: ret double %10
+; CHECK-NEXT: }
+
+define double @extract_20xdouble_at_3(<20 x double>) {
+entry:
+ %1 = extractelement <20 x double> %0, i32 3
+ ret double %1
+}
+; CHECK-LABEL: define double @extract_20xdouble_at_3(<2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>) {
+; CHECK: entry:
+; CHECK-NEXT: %10 = extractelement <2 x double> %1, i32 1
+; CHECK-NEXT: ret double %10
+; CHECK-NEXT: }
+
+define double @extract_20xdouble_at_4(<20 x double>) {
+entry:
+ %1 = extractelement <20 x double> %0, i32 4
+ ret double %1
+}
+; CHECK-LABEL: define double @extract_20xdouble_at_4(<2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>) {
+; CHECK: entry:
+; CHECK-NEXT: %10 = extractelement <2 x double> %2, i32 0
+; CHECK-NEXT: ret double %10
+; CHECK-NEXT: }
+
+define double @extract_20xdouble_at_5(<20 x double>) {
+entry:
+ %1 = extractelement <20 x double> %0, i32 5
+ ret double %1
+}
+; CHECK-LABEL: define double @extract_20xdouble_at_5(<2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>) {
+; CHECK: entry:
+; CHECK-NEXT: %10 = extractelement <2 x double> %2, i32 1
+; CHECK-NEXT: ret double %10
+; CHECK-NEXT: }
+
+define double @extract_20xdouble_at_6(<20 x double>) {
+entry:
+ %1 = extractelement <20 x double> %0, i32 6
+ ret double %1
+}
+; CHECK-LABEL: define double @extract_20xdouble_at_6(<2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>) {
+; CHECK: entry:
+; CHECK-NEXT: %10 = extractelement <2 x double> %3, i32 0
+; CHECK-NEXT: ret double %10
+; CHECK-NEXT: }
+
+define double @extract_20xdouble_at_7(<20 x double>) {
+entry:
+ %1 = extractelement <20 x double> %0, i32 7
+ ret double %1
+}
+; CHECK-LABEL: define double @extract_20xdouble_at_7(<2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>) {
+; CHECK: entry:
+; CHECK-NEXT: %10 = extractelement <2 x double> %3, i32 1
+; CHECK-NEXT: ret double %10
+; CHECK-NEXT: }
+
+define double @extract_20xdouble_at_8(<20 x double>) {
+entry:
+ %1 = extractelement <20 x double> %0, i32 8
+ ret double %1
+}
+; CHECK-LABEL: define double @extract_20xdouble_at_8(<2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>) {
+; CHECK: entry:
+; CHECK-NEXT: %10 = extractelement <2 x double> %4, i32 0
+; CHECK-NEXT: ret double %10
+; CHECK-NEXT: }
+
+define double @extract_20xdouble_at_9(<20 x double>) {
+entry:
+ %1 = extractelement <20 x double> %0, i32 9
+ ret double %1
+}
+; CHECK-LABEL: define double @extract_20xdouble_at_9(<2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>) {
+; CHECK: entry:
+; CHECK-NEXT: %10 = extractelement <2 x double> %4, i32 1
+; CHECK-NEXT: ret double %10
+; CHECK-NEXT: }
+
+define double @extract_20xdouble_at_10(<20 x double>) {
+entry:
+ %1 = extractelement <20 x double> %0, i32 10
+ ret double %1
+}
+; CHECK-LABEL: define double @extract_20xdouble_at_10(<2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>) {
+; CHECK: entry:
+; CHECK-NEXT: %10 = extractelement <2 x double> %5, i32 0
+; CHECK-NEXT: ret double %10
+; CHECK-NEXT: }
+
+define double @extract_20xdouble_at_11(<20 x double>) {
+entry:
+ %1 = extractelement <20 x double> %0, i32 11
+ ret double %1
+}
+; CHECK-LABEL: define double @extract_20xdouble_at_11(<2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>) {
+; CHECK: entry:
+; CHECK-NEXT: %10 = extractelement <2 x double> %5, i32 1
+; CHECK-NEXT: ret double %10
+; CHECK-NEXT: }
+
+define double @extract_20xdouble_at_12(<20 x double>) {
+entry:
+ %1 = extractelement <20 x double> %0, i32 12
+ ret double %1
+}
+; CHECK-LABEL: define double @extract_20xdouble_at_12(<2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>) {
+; CHECK: entry:
+; CHECK-NEXT: %10 = extractelement <2 x double> %6, i32 0
+; CHECK-NEXT: ret double %10
+; CHECK-NEXT: }
+
+define double @extract_20xdouble_at_13(<20 x double>) {
+entry:
+ %1 = extractelement <20 x double> %0, i32 13
+ ret double %1
+}
+; CHECK-LABEL: define double @extract_20xdouble_at_13(<2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>) {
+; CHECK: entry:
+; CHECK-NEXT: %10 = extractelement <2 x double> %6, i32 1
+; CHECK-NEXT: ret double %10
+; CHECK-NEXT: }
+
+define double @extract_20xdouble_at_14(<20 x double>) {
+entry:
+ %1 = extractelement <20 x double> %0, i32 14
+ ret double %1
+}
+; CHECK-LABEL: define double @extract_20xdouble_at_14(<2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>) {
+; CHECK: entry:
+; CHECK-NEXT: %10 = extractelement <2 x double> %7, i32 0
+; CHECK-NEXT: ret double %10
+; CHECK-NEXT: }
+
+define double @extract_20xdouble_at_15(<20 x double>) {
+entry:
+ %1 = extractelement <20 x double> %0, i32 15
+ ret double %1
+}
+; CHECK-LABEL: define double @extract_20xdouble_at_15(<2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>) {
+; CHECK: entry:
+; CHECK-NEXT: %10 = extractelement <2 x double> %7, i32 1
+; CHECK-NEXT: ret double %10
+; CHECK-NEXT: }
+
+define double @extract_20xdouble_at_16(<20 x double>) {
+entry:
+ %1 = extractelement <20 x double> %0, i32 16
+ ret double %1
+}
+; CHECK-LABEL: define double @extract_20xdouble_at_16(<2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>) {
+; CHECK: entry:
+; CHECK-NEXT: %10 = extractelement <2 x double> %8, i32 0
+; CHECK-NEXT: ret double %10
+; CHECK-NEXT: }
+
+define double @extract_20xdouble_at_17(<20 x double>) {
+entry:
+ %1 = extractelement <20 x double> %0, i32 17
+ ret double %1
+}
+; CHECK-LABEL: define double @extract_20xdouble_at_17(<2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>) {
+; CHECK: entry:
+; CHECK-NEXT: %10 = extractelement <2 x double> %8, i32 1
+; CHECK-NEXT: ret double %10
+; CHECK-NEXT: }
+
+define double @extract_20xdouble_at_18(<20 x double>) {
+entry:
+ %1 = extractelement <20 x double> %0, i32 18
+ ret double %1
+}
+; CHECK-LABEL: define double @extract_20xdouble_at_18(<2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>) {
+; CHECK: entry:
+; CHECK-NEXT: %10 = extractelement <2 x double> %9, i32 0
+; CHECK-NEXT: ret double %10
+; CHECK-NEXT: }
+
+define double @extract_20xdouble_at_19(<20 x double>) {
+entry:
+ %1 = extractelement <20 x double> %0, i32 19
+ ret double %1
+}
+; CHECK-LABEL: define double @extract_20xdouble_at_19(<2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>) {
+; CHECK: entry:
+; CHECK-NEXT: %10 = extractelement <2 x double> %9, i32 1
+; CHECK-NEXT: ret double %10
+; CHECK-NEXT: }
+
+define double @extract_20xdouble_undef_idx(<20 x double>) {
+entry:
+ %1 = extractelement <20 x double> %0, i32 20
+ ret double %1
+}
+; CHECK-LABEL: define double @extract_20xdouble_undef_idx(<2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>) {
+; CHECK: entry:
+; CHECK-NEXT: %10 = extractelement <2 x double> %9, i32 2
+; CHECK-NEXT: ret double %10
+; CHECK-NEXT: }
+
+define i8 @extract_2xi8_var_idx(<2 x i8>, i32) {
+entry:
+ %2 = extractelement <2 x i8> %0, i32 %1
+ ret i8 %2
+}
+; CHECK-LABEL: define i8 @extract_2xi8_var_idx(<16 x i8>, i32) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <16 x i8> %0, i32 %1
+; CHECK-NEXT: ret i8 %2
+; CHECK-NEXT: }
+
+define i16 @extract_2xi16_var_idx(<2 x i16>, i32) {
+entry:
+ %2 = extractelement <2 x i16> %0, i32 %1
+ ret i16 %2
+}
+; CHECK-LABEL: define i16 @extract_2xi16_var_idx(<8 x i16>, i32) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <8 x i16> %0, i32 %1
+; CHECK-NEXT: ret i16 %2
+; CHECK-NEXT: }
+
+define i32 @extract_2xi32_var_idx(<2 x i32>, i32) {
+entry:
+ %2 = extractelement <2 x i32> %0, i32 %1
+ ret i32 %2
+}
+; CHECK-LABEL: define i32 @extract_2xi32_var_idx(<4 x i32>, i32) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <4 x i32> %0, i32 %1
+; CHECK-NEXT: ret i32 %2
+; CHECK-NEXT: }
+
+define i64 @extract_2xi64_var_idx(<2 x i64>, i32) {
+entry:
+ %2 = extractelement <2 x i64> %0, i32 %1
+ ret i64 %2
+}
+; CHECK-LABEL: define i64 @extract_2xi64_var_idx(<2 x i64>, i32) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <2 x i64> %0, i32 %1
+; CHECK-NEXT: ret i64 %2
+; CHECK-NEXT: }
+
+define i8* @extract_2xi8ptr_var_idx(<2 x i8*>, i32) {
+entry:
+ %2 = extractelement <2 x i8*> %0, i32 %1
+ ret i8* %2
+}
+; CHECK-LABEL: define i8* @extract_2xi8ptr_var_idx(<4 x i8*>, i32) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <4 x i8*> %0, i32 %1
+; CHECK-NEXT: ret i8* %2
+; CHECK-NEXT: }
+
+define float @extract_2xfloat_var_idx(<2 x float>, i32) {
+entry:
+ %2 = extractelement <2 x float> %0, i32 %1
+ ret float %2
+}
+; CHECK-LABEL: define float @extract_2xfloat_var_idx(<4 x float>, i32) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <4 x float> %0, i32 %1
+; CHECK-NEXT: ret float %2
+; CHECK-NEXT: }
+
+define double @extract_2xdouble_var_idx(<2 x double>, i32) {
+entry:
+ %2 = extractelement <2 x double> %0, i32 %1
+ ret double %2
+}
+; CHECK-LABEL: define double @extract_2xdouble_var_idx(<2 x double>, i32) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <2 x double> %0, i32 %1
+; CHECK-NEXT: ret double %2
+; CHECK-NEXT: }
+
+define i8 @extract_4xi8_var_idx(<4 x i8>, i32) {
+entry:
+ %2 = extractelement <4 x i8> %0, i32 %1
+ ret i8 %2
+}
+; CHECK-LABEL: define i8 @extract_4xi8_var_idx(<16 x i8>, i32) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <16 x i8> %0, i32 %1
+; CHECK-NEXT: ret i8 %2
+; CHECK-NEXT: }
+
+define i16 @extract_4xi16_var_idx(<4 x i16>, i32) {
+entry:
+ %2 = extractelement <4 x i16> %0, i32 %1
+ ret i16 %2
+}
+; CHECK-LABEL: define i16 @extract_4xi16_var_idx(<8 x i16>, i32) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <8 x i16> %0, i32 %1
+; CHECK-NEXT: ret i16 %2
+; CHECK-NEXT: }
+
+define i32 @extract_4xi32_var_idx(<4 x i32>, i32) {
+entry:
+ %2 = extractelement <4 x i32> %0, i32 %1
+ ret i32 %2
+}
+; CHECK-LABEL: define i32 @extract_4xi32_var_idx(<4 x i32>, i32) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <4 x i32> %0, i32 %1
+; CHECK-NEXT: ret i32 %2
+; CHECK-NEXT: }
+
+define i64 @extract_4xi64_var_idx(<4 x i64>, i32) {
+entry:
+ %2 = extractelement <4 x i64> %0, i32 %1
+ ret i64 %2
+}
+; CHECK-LABEL: define i64 @extract_4xi64_var_idx(<2 x i64>, <2 x i64>, i32) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <2 x i64> %0, i32 0
+; CHECK-NEXT: %4 = icmp eq i32 0, %2
+; CHECK-NEXT: %5 = select i1 %4, i64 %3, i64 undef
+; CHECK-NEXT: %6 = extractelement <2 x i64> %0, i32 1
+; CHECK-NEXT: %7 = icmp eq i32 1, %2
+; CHECK-NEXT: %8 = select i1 %7, i64 %6, i64 %5
+; CHECK-NEXT: %9 = extractelement <2 x i64> %1, i32 0
+; CHECK-NEXT: %10 = icmp eq i32 2, %2
+; CHECK-NEXT: %11 = select i1 %10, i64 %9, i64 %8
+; CHECK-NEXT: %12 = extractelement <2 x i64> %1, i32 1
+; CHECK-NEXT: %13 = icmp eq i32 3, %2
+; CHECK-NEXT: %14 = select i1 %13, i64 %12, i64 %11
+; CHECK-NEXT: ret i64 %14
+; CHECK-NEXT: }
+
+define i8* @extract_4xi8ptr_var_idx(<4 x i8*>, i32) {
+entry:
+ %2 = extractelement <4 x i8*> %0, i32 %1
+ ret i8* %2
+}
+; CHECK-LABEL: define i8* @extract_4xi8ptr_var_idx(<4 x i8*>, i32) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <4 x i8*> %0, i32 %1
+; CHECK-NEXT: ret i8* %2
+; CHECK-NEXT: }
+
+define float @extract_4xfloat_var_idx(<4 x float>, i32) {
+entry:
+ %2 = extractelement <4 x float> %0, i32 %1
+ ret float %2
+}
+; CHECK-LABEL: define float @extract_4xfloat_var_idx(<4 x float>, i32) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <4 x float> %0, i32 %1
+; CHECK-NEXT: ret float %2
+; CHECK-NEXT: }
+
+define double @extract_4xdouble_var_idx(<4 x double>, i32) {
+entry:
+ %2 = extractelement <4 x double> %0, i32 %1
+ ret double %2
+}
+; CHECK-LABEL: define double @extract_4xdouble_var_idx(<2 x double>, <2 x double>, i32) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <2 x double> %0, i32 0
+; CHECK-NEXT: %4 = icmp eq i32 0, %2
+; CHECK-NEXT: %5 = select i1 %4, double %3, double undef
+; CHECK-NEXT: %6 = extractelement <2 x double> %0, i32 1
+; CHECK-NEXT: %7 = icmp eq i32 1, %2
+; CHECK-NEXT: %8 = select i1 %7, double %6, double %5
+; CHECK-NEXT: %9 = extractelement <2 x double> %1, i32 0
+; CHECK-NEXT: %10 = icmp eq i32 2, %2
+; CHECK-NEXT: %11 = select i1 %10, double %9, double %8
+; CHECK-NEXT: %12 = extractelement <2 x double> %1, i32 1
+; CHECK-NEXT: %13 = icmp eq i32 3, %2
+; CHECK-NEXT: %14 = select i1 %13, double %12, double %11
+; CHECK-NEXT: ret double %14
+; CHECK-NEXT: }
+
+define i8 @extract_6xi8_var_idx(<6 x i8>, i32) {
+entry:
+ %2 = extractelement <6 x i8> %0, i32 %1
+ ret i8 %2
+}
+; CHECK-LABEL: define i8 @extract_6xi8_var_idx(<16 x i8>, i32) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <16 x i8> %0, i32 %1
+; CHECK-NEXT: ret i8 %2
+; CHECK-NEXT: }
+
+define i16 @extract_6xi16_var_idx(<6 x i16>, i32) {
+entry:
+ %2 = extractelement <6 x i16> %0, i32 %1
+ ret i16 %2
+}
+; CHECK-LABEL: define i16 @extract_6xi16_var_idx(<8 x i16>, i32) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <8 x i16> %0, i32 %1
+; CHECK-NEXT: ret i16 %2
+; CHECK-NEXT: }
+
+define i32 @extract_6xi32_var_idx(<6 x i32>, i32) {
+entry:
+ %2 = extractelement <6 x i32> %0, i32 %1
+ ret i32 %2
+}
+; CHECK-LABEL: define i32 @extract_6xi32_var_idx(<4 x i32>, <4 x i32>, i32) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <4 x i32> %0, i32 0
+; CHECK-NEXT: %4 = icmp eq i32 0, %2
+; CHECK-NEXT: %5 = select i1 %4, i32 %3, i32 undef
+; CHECK-NEXT: %6 = extractelement <4 x i32> %0, i32 1
+; CHECK-NEXT: %7 = icmp eq i32 1, %2
+; CHECK-NEXT: %8 = select i1 %7, i32 %6, i32 %5
+; CHECK-NEXT: %9 = extractelement <4 x i32> %0, i32 2
+; CHECK-NEXT: %10 = icmp eq i32 2, %2
+; CHECK-NEXT: %11 = select i1 %10, i32 %9, i32 %8
+; CHECK-NEXT: %12 = extractelement <4 x i32> %0, i32 3
+; CHECK-NEXT: %13 = icmp eq i32 3, %2
+; CHECK-NEXT: %14 = select i1 %13, i32 %12, i32 %11
+; CHECK-NEXT: %15 = extractelement <4 x i32> %1, i32 0
+; CHECK-NEXT: %16 = icmp eq i32 4, %2
+; CHECK-NEXT: %17 = select i1 %16, i32 %15, i32 %14
+; CHECK-NEXT: %18 = extractelement <4 x i32> %1, i32 1
+; CHECK-NEXT: %19 = icmp eq i32 5, %2
+; CHECK-NEXT: %20 = select i1 %19, i32 %18, i32 %17
+; CHECK-NEXT: ret i32 %20
+; CHECK-NEXT: }
+
+define i64 @extract_6xi64_var_idx(<6 x i64>, i32) {
+entry:
+ %2 = extractelement <6 x i64> %0, i32 %1
+ ret i64 %2
+}
+; CHECK-LABEL: define i64 @extract_6xi64_var_idx(<2 x i64>, <2 x i64>, <2 x i64>, i32) {
+; CHECK: entry:
+; CHECK-NEXT: %4 = extractelement <2 x i64> %0, i32 0
+; CHECK-NEXT: %5 = icmp eq i32 0, %3
+; CHECK-NEXT: %6 = select i1 %5, i64 %4, i64 undef
+; CHECK-NEXT: %7 = extractelement <2 x i64> %0, i32 1
+; CHECK-NEXT: %8 = icmp eq i32 1, %3
+; CHECK-NEXT: %9 = select i1 %8, i64 %7, i64 %6
+; CHECK-NEXT: %10 = extractelement <2 x i64> %1, i32 0
+; CHECK-NEXT: %11 = icmp eq i32 2, %3
+; CHECK-NEXT: %12 = select i1 %11, i64 %10, i64 %9
+; CHECK-NEXT: %13 = extractelement <2 x i64> %1, i32 1
+; CHECK-NEXT: %14 = icmp eq i32 3, %3
+; CHECK-NEXT: %15 = select i1 %14, i64 %13, i64 %12
+; CHECK-NEXT: %16 = extractelement <2 x i64> %2, i32 0
+; CHECK-NEXT: %17 = icmp eq i32 4, %3
+; CHECK-NEXT: %18 = select i1 %17, i64 %16, i64 %15
+; CHECK-NEXT: %19 = extractelement <2 x i64> %2, i32 1
+; CHECK-NEXT: %20 = icmp eq i32 5, %3
+; CHECK-NEXT: %21 = select i1 %20, i64 %19, i64 %18
+; CHECK-NEXT: ret i64 %21
+; CHECK-NEXT: }
+
+define i8* @extract_6xi8ptr_var_idx(<6 x i8*>, i32) {
+entry:
+ %2 = extractelement <6 x i8*> %0, i32 %1
+ ret i8* %2
+}
+; CHECK-LABEL: define i8* @extract_6xi8ptr_var_idx(<4 x i8*>, <4 x i8*>, i32) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <4 x i8*> %0, i32 0
+; CHECK-NEXT: %4 = icmp eq i32 0, %2
+; CHECK-NEXT: %5 = select i1 %4, i8* %3, i8* undef
+; CHECK-NEXT: %6 = extractelement <4 x i8*> %0, i32 1
+; CHECK-NEXT: %7 = icmp eq i32 1, %2
+; CHECK-NEXT: %8 = select i1 %7, i8* %6, i8* %5
+; CHECK-NEXT: %9 = extractelement <4 x i8*> %0, i32 2
+; CHECK-NEXT: %10 = icmp eq i32 2, %2
+; CHECK-NEXT: %11 = select i1 %10, i8* %9, i8* %8
+; CHECK-NEXT: %12 = extractelement <4 x i8*> %0, i32 3
+; CHECK-NEXT: %13 = icmp eq i32 3, %2
+; CHECK-NEXT: %14 = select i1 %13, i8* %12, i8* %11
+; CHECK-NEXT: %15 = extractelement <4 x i8*> %1, i32 0
+; CHECK-NEXT: %16 = icmp eq i32 4, %2
+; CHECK-NEXT: %17 = select i1 %16, i8* %15, i8* %14
+; CHECK-NEXT: %18 = extractelement <4 x i8*> %1, i32 1
+; CHECK-NEXT: %19 = icmp eq i32 5, %2
+; CHECK-NEXT: %20 = select i1 %19, i8* %18, i8* %17
+; CHECK-NEXT: ret i8* %20
+; CHECK-NEXT: }
+
+define float @extract_6xfloat_var_idx(<6 x float>, i32) {
+entry:
+ %2 = extractelement <6 x float> %0, i32 %1
+ ret float %2
+}
+; CHECK-LABEL: define float @extract_6xfloat_var_idx(<4 x float>, <4 x float>, i32) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <4 x float> %0, i32 0
+; CHECK-NEXT: %4 = icmp eq i32 0, %2
+; CHECK-NEXT: %5 = select i1 %4, float %3, float undef
+; CHECK-NEXT: %6 = extractelement <4 x float> %0, i32 1
+; CHECK-NEXT: %7 = icmp eq i32 1, %2
+; CHECK-NEXT: %8 = select i1 %7, float %6, float %5
+; CHECK-NEXT: %9 = extractelement <4 x float> %0, i32 2
+; CHECK-NEXT: %10 = icmp eq i32 2, %2
+; CHECK-NEXT: %11 = select i1 %10, float %9, float %8
+; CHECK-NEXT: %12 = extractelement <4 x float> %0, i32 3
+; CHECK-NEXT: %13 = icmp eq i32 3, %2
+; CHECK-NEXT: %14 = select i1 %13, float %12, float %11
+; CHECK-NEXT: %15 = extractelement <4 x float> %1, i32 0
+; CHECK-NEXT: %16 = icmp eq i32 4, %2
+; CHECK-NEXT: %17 = select i1 %16, float %15, float %14
+; CHECK-NEXT: %18 = extractelement <4 x float> %1, i32 1
+; CHECK-NEXT: %19 = icmp eq i32 5, %2
+; CHECK-NEXT: %20 = select i1 %19, float %18, float %17
+; CHECK-NEXT: ret float %20
+; CHECK-NEXT: }
+
+define double @extract_6xdouble_var_idx(<6 x double>, i32) {
+entry:
+ %2 = extractelement <6 x double> %0, i32 %1
+ ret double %2
+}
+; CHECK-LABEL: define double @extract_6xdouble_var_idx(<2 x double>, <2 x double>, <2 x double>, i32) {
+; CHECK: entry:
+; CHECK-NEXT: %4 = extractelement <2 x double> %0, i32 0
+; CHECK-NEXT: %5 = icmp eq i32 0, %3
+; CHECK-NEXT: %6 = select i1 %5, double %4, double undef
+; CHECK-NEXT: %7 = extractelement <2 x double> %0, i32 1
+; CHECK-NEXT: %8 = icmp eq i32 1, %3
+; CHECK-NEXT: %9 = select i1 %8, double %7, double %6
+; CHECK-NEXT: %10 = extractelement <2 x double> %1, i32 0
+; CHECK-NEXT: %11 = icmp eq i32 2, %3
+; CHECK-NEXT: %12 = select i1 %11, double %10, double %9
+; CHECK-NEXT: %13 = extractelement <2 x double> %1, i32 1
+; CHECK-NEXT: %14 = icmp eq i32 3, %3
+; CHECK-NEXT: %15 = select i1 %14, double %13, double %12
+; CHECK-NEXT: %16 = extractelement <2 x double> %2, i32 0
+; CHECK-NEXT: %17 = icmp eq i32 4, %3
+; CHECK-NEXT: %18 = select i1 %17, double %16, double %15
+; CHECK-NEXT: %19 = extractelement <2 x double> %2, i32 1
+; CHECK-NEXT: %20 = icmp eq i32 5, %3
+; CHECK-NEXT: %21 = select i1 %20, double %19, double %18
+; CHECK-NEXT: ret double %21
+; CHECK-NEXT: }
+
+define i8 @extract_8xi8_var_idx(<8 x i8>, i32) {
+entry:
+ %2 = extractelement <8 x i8> %0, i32 %1
+ ret i8 %2
+}
+; CHECK-LABEL: define i8 @extract_8xi8_var_idx(<16 x i8>, i32) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <16 x i8> %0, i32 %1
+; CHECK-NEXT: ret i8 %2
+; CHECK-NEXT: }
+
+define i16 @extract_8xi16_var_idx(<8 x i16>, i32) {
+entry:
+ %2 = extractelement <8 x i16> %0, i32 %1
+ ret i16 %2
+}
+; CHECK-LABEL: define i16 @extract_8xi16_var_idx(<8 x i16>, i32) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <8 x i16> %0, i32 %1
+; CHECK-NEXT: ret i16 %2
+; CHECK-NEXT: }
+
+define i32 @extract_8xi32_var_idx(<8 x i32>, i32) {
+entry:
+ %2 = extractelement <8 x i32> %0, i32 %1
+ ret i32 %2
+}
+; CHECK-LABEL: define i32 @extract_8xi32_var_idx(<4 x i32>, <4 x i32>, i32) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <4 x i32> %0, i32 0
+; CHECK-NEXT: %4 = icmp eq i32 0, %2
+; CHECK-NEXT: %5 = select i1 %4, i32 %3, i32 undef
+; CHECK-NEXT: %6 = extractelement <4 x i32> %0, i32 1
+; CHECK-NEXT: %7 = icmp eq i32 1, %2
+; CHECK-NEXT: %8 = select i1 %7, i32 %6, i32 %5
+; CHECK-NEXT: %9 = extractelement <4 x i32> %0, i32 2
+; CHECK-NEXT: %10 = icmp eq i32 2, %2
+; CHECK-NEXT: %11 = select i1 %10, i32 %9, i32 %8
+; CHECK-NEXT: %12 = extractelement <4 x i32> %0, i32 3
+; CHECK-NEXT: %13 = icmp eq i32 3, %2
+; CHECK-NEXT: %14 = select i1 %13, i32 %12, i32 %11
+; CHECK-NEXT: %15 = extractelement <4 x i32> %1, i32 0
+; CHECK-NEXT: %16 = icmp eq i32 4, %2
+; CHECK-NEXT: %17 = select i1 %16, i32 %15, i32 %14
+; CHECK-NEXT: %18 = extractelement <4 x i32> %1, i32 1
+; CHECK-NEXT: %19 = icmp eq i32 5, %2
+; CHECK-NEXT: %20 = select i1 %19, i32 %18, i32 %17
+; CHECK-NEXT: %21 = extractelement <4 x i32> %1, i32 2
+; CHECK-NEXT: %22 = icmp eq i32 6, %2
+; CHECK-NEXT: %23 = select i1 %22, i32 %21, i32 %20
+; CHECK-NEXT: %24 = extractelement <4 x i32> %1, i32 3
+; CHECK-NEXT: %25 = icmp eq i32 7, %2
+; CHECK-NEXT: %26 = select i1 %25, i32 %24, i32 %23
+; CHECK-NEXT: ret i32 %26
+; CHECK-NEXT: }
+
+define i64 @extract_8xi64_var_idx(<8 x i64>, i32) {
+entry:
+ %2 = extractelement <8 x i64> %0, i32 %1
+ ret i64 %2
+}
+; CHECK-LABEL: define i64 @extract_8xi64_var_idx(<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, i32) {
+; CHECK: entry:
+; CHECK-NEXT: %5 = extractelement <2 x i64> %0, i32 0
+; CHECK-NEXT: %6 = icmp eq i32 0, %4
+; CHECK-NEXT: %7 = select i1 %6, i64 %5, i64 undef
+; CHECK-NEXT: %8 = extractelement <2 x i64> %0, i32 1
+; CHECK-NEXT: %9 = icmp eq i32 1, %4
+; CHECK-NEXT: %10 = select i1 %9, i64 %8, i64 %7
+; CHECK-NEXT: %11 = extractelement <2 x i64> %1, i32 0
+; CHECK-NEXT: %12 = icmp eq i32 2, %4
+; CHECK-NEXT: %13 = select i1 %12, i64 %11, i64 %10
+; CHECK-NEXT: %14 = extractelement <2 x i64> %1, i32 1
+; CHECK-NEXT: %15 = icmp eq i32 3, %4
+; CHECK-NEXT: %16 = select i1 %15, i64 %14, i64 %13
+; CHECK-NEXT: %17 = extractelement <2 x i64> %2, i32 0
+; CHECK-NEXT: %18 = icmp eq i32 4, %4
+; CHECK-NEXT: %19 = select i1 %18, i64 %17, i64 %16
+; CHECK-NEXT: %20 = extractelement <2 x i64> %2, i32 1
+; CHECK-NEXT: %21 = icmp eq i32 5, %4
+; CHECK-NEXT: %22 = select i1 %21, i64 %20, i64 %19
+; CHECK-NEXT: %23 = extractelement <2 x i64> %3, i32 0
+; CHECK-NEXT: %24 = icmp eq i32 6, %4
+; CHECK-NEXT: %25 = select i1 %24, i64 %23, i64 %22
+; CHECK-NEXT: %26 = extractelement <2 x i64> %3, i32 1
+; CHECK-NEXT: %27 = icmp eq i32 7, %4
+; CHECK-NEXT: %28 = select i1 %27, i64 %26, i64 %25
+; CHECK-NEXT: ret i64 %28
+; CHECK-NEXT: }
+
+define i8* @extract_8xi8ptr_var_idx(<8 x i8*>, i32) {
+entry:
+ %2 = extractelement <8 x i8*> %0, i32 %1
+ ret i8* %2
+}
+; CHECK-LABEL: define i8* @extract_8xi8ptr_var_idx(<4 x i8*>, <4 x i8*>, i32) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <4 x i8*> %0, i32 0
+; CHECK-NEXT: %4 = icmp eq i32 0, %2
+; CHECK-NEXT: %5 = select i1 %4, i8* %3, i8* undef
+; CHECK-NEXT: %6 = extractelement <4 x i8*> %0, i32 1
+; CHECK-NEXT: %7 = icmp eq i32 1, %2
+; CHECK-NEXT: %8 = select i1 %7, i8* %6, i8* %5
+; CHECK-NEXT: %9 = extractelement <4 x i8*> %0, i32 2
+; CHECK-NEXT: %10 = icmp eq i32 2, %2
+; CHECK-NEXT: %11 = select i1 %10, i8* %9, i8* %8
+; CHECK-NEXT: %12 = extractelement <4 x i8*> %0, i32 3
+; CHECK-NEXT: %13 = icmp eq i32 3, %2
+; CHECK-NEXT: %14 = select i1 %13, i8* %12, i8* %11
+; CHECK-NEXT: %15 = extractelement <4 x i8*> %1, i32 0
+; CHECK-NEXT: %16 = icmp eq i32 4, %2
+; CHECK-NEXT: %17 = select i1 %16, i8* %15, i8* %14
+; CHECK-NEXT: %18 = extractelement <4 x i8*> %1, i32 1
+; CHECK-NEXT: %19 = icmp eq i32 5, %2
+; CHECK-NEXT: %20 = select i1 %19, i8* %18, i8* %17
+; CHECK-NEXT: %21 = extractelement <4 x i8*> %1, i32 2
+; CHECK-NEXT: %22 = icmp eq i32 6, %2
+; CHECK-NEXT: %23 = select i1 %22, i8* %21, i8* %20
+; CHECK-NEXT: %24 = extractelement <4 x i8*> %1, i32 3
+; CHECK-NEXT: %25 = icmp eq i32 7, %2
+; CHECK-NEXT: %26 = select i1 %25, i8* %24, i8* %23
+; CHECK-NEXT: ret i8* %26
+; CHECK-NEXT: }
+
+define float @extract_8xfloat_var_idx(<8 x float>, i32) {
+entry:
+ %2 = extractelement <8 x float> %0, i32 %1
+ ret float %2
+}
+; CHECK-LABEL: define float @extract_8xfloat_var_idx(<4 x float>, <4 x float>, i32) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <4 x float> %0, i32 0
+; CHECK-NEXT: %4 = icmp eq i32 0, %2
+; CHECK-NEXT: %5 = select i1 %4, float %3, float undef
+; CHECK-NEXT: %6 = extractelement <4 x float> %0, i32 1
+; CHECK-NEXT: %7 = icmp eq i32 1, %2
+; CHECK-NEXT: %8 = select i1 %7, float %6, float %5
+; CHECK-NEXT: %9 = extractelement <4 x float> %0, i32 2
+; CHECK-NEXT: %10 = icmp eq i32 2, %2
+; CHECK-NEXT: %11 = select i1 %10, float %9, float %8
+; CHECK-NEXT: %12 = extractelement <4 x float> %0, i32 3
+; CHECK-NEXT: %13 = icmp eq i32 3, %2
+; CHECK-NEXT: %14 = select i1 %13, float %12, float %11
+; CHECK-NEXT: %15 = extractelement <4 x float> %1, i32 0
+; CHECK-NEXT: %16 = icmp eq i32 4, %2
+; CHECK-NEXT: %17 = select i1 %16, float %15, float %14
+; CHECK-NEXT: %18 = extractelement <4 x float> %1, i32 1
+; CHECK-NEXT: %19 = icmp eq i32 5, %2
+; CHECK-NEXT: %20 = select i1 %19, float %18, float %17
+; CHECK-NEXT: %21 = extractelement <4 x float> %1, i32 2
+; CHECK-NEXT: %22 = icmp eq i32 6, %2
+; CHECK-NEXT: %23 = select i1 %22, float %21, float %20
+; CHECK-NEXT: %24 = extractelement <4 x float> %1, i32 3
+; CHECK-NEXT: %25 = icmp eq i32 7, %2
+; CHECK-NEXT: %26 = select i1 %25, float %24, float %23
+; CHECK-NEXT: ret float %26
+; CHECK-NEXT: }
+
+define double @extract_8xdouble_var_idx(<8 x double>, i32) {
+entry:
+ %2 = extractelement <8 x double> %0, i32 %1
+ ret double %2
+}
+; CHECK-LABEL: define double @extract_8xdouble_var_idx(<2 x double>, <2 x double>, <2 x double>, <2 x double>, i32) {
+; CHECK: entry:
+; CHECK-NEXT: %5 = extractelement <2 x double> %0, i32 0
+; CHECK-NEXT: %6 = icmp eq i32 0, %4
+; CHECK-NEXT: %7 = select i1 %6, double %5, double undef
+; CHECK-NEXT: %8 = extractelement <2 x double> %0, i32 1
+; CHECK-NEXT: %9 = icmp eq i32 1, %4
+; CHECK-NEXT: %10 = select i1 %9, double %8, double %7
+; CHECK-NEXT: %11 = extractelement <2 x double> %1, i32 0
+; CHECK-NEXT: %12 = icmp eq i32 2, %4
+; CHECK-NEXT: %13 = select i1 %12, double %11, double %10
+; CHECK-NEXT: %14 = extractelement <2 x double> %1, i32 1
+; CHECK-NEXT: %15 = icmp eq i32 3, %4
+; CHECK-NEXT: %16 = select i1 %15, double %14, double %13
+; CHECK-NEXT: %17 = extractelement <2 x double> %2, i32 0
+; CHECK-NEXT: %18 = icmp eq i32 4, %4
+; CHECK-NEXT: %19 = select i1 %18, double %17, double %16
+; CHECK-NEXT: %20 = extractelement <2 x double> %2, i32 1
+; CHECK-NEXT: %21 = icmp eq i32 5, %4
+; CHECK-NEXT: %22 = select i1 %21, double %20, double %19
+; CHECK-NEXT: %23 = extractelement <2 x double> %3, i32 0
+; CHECK-NEXT: %24 = icmp eq i32 6, %4
+; CHECK-NEXT: %25 = select i1 %24, double %23, double %22
+; CHECK-NEXT: %26 = extractelement <2 x double> %3, i32 1
+; CHECK-NEXT: %27 = icmp eq i32 7, %4
+; CHECK-NEXT: %28 = select i1 %27, double %26, double %25
+; CHECK-NEXT: ret double %28
+; CHECK-NEXT: }
+
+define i8 @extract_12xi8_var_idx(<12 x i8>, i32) {
+entry:
+ %2 = extractelement <12 x i8> %0, i32 %1
+ ret i8 %2
+}
+; CHECK-LABEL: define i8 @extract_12xi8_var_idx(<16 x i8>, i32) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <16 x i8> %0, i32 %1
+; CHECK-NEXT: ret i8 %2
+; CHECK-NEXT: }
+
+define i16 @extract_12xi16_var_idx(<12 x i16>, i32) {
+entry:
+ %2 = extractelement <12 x i16> %0, i32 %1
+ ret i16 %2
+}
+; CHECK-LABEL: define i16 @extract_12xi16_var_idx(<8 x i16>, <8 x i16>, i32) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <8 x i16> %0, i32 0
+; CHECK-NEXT: %4 = icmp eq i32 0, %2
+; CHECK-NEXT: %5 = select i1 %4, i16 %3, i16 undef
+; CHECK-NEXT: %6 = extractelement <8 x i16> %0, i32 1
+; CHECK-NEXT: %7 = icmp eq i32 1, %2
+; CHECK-NEXT: %8 = select i1 %7, i16 %6, i16 %5
+; CHECK-NEXT: %9 = extractelement <8 x i16> %0, i32 2
+; CHECK-NEXT: %10 = icmp eq i32 2, %2
+; CHECK-NEXT: %11 = select i1 %10, i16 %9, i16 %8
+; CHECK-NEXT: %12 = extractelement <8 x i16> %0, i32 3
+; CHECK-NEXT: %13 = icmp eq i32 3, %2
+; CHECK-NEXT: %14 = select i1 %13, i16 %12, i16 %11
+; CHECK-NEXT: %15 = extractelement <8 x i16> %0, i32 4
+; CHECK-NEXT: %16 = icmp eq i32 4, %2
+; CHECK-NEXT: %17 = select i1 %16, i16 %15, i16 %14
+; CHECK-NEXT: %18 = extractelement <8 x i16> %0, i32 5
+; CHECK-NEXT: %19 = icmp eq i32 5, %2
+; CHECK-NEXT: %20 = select i1 %19, i16 %18, i16 %17
+; CHECK-NEXT: %21 = extractelement <8 x i16> %0, i32 6
+; CHECK-NEXT: %22 = icmp eq i32 6, %2
+; CHECK-NEXT: %23 = select i1 %22, i16 %21, i16 %20
+; CHECK-NEXT: %24 = extractelement <8 x i16> %0, i32 7
+; CHECK-NEXT: %25 = icmp eq i32 7, %2
+; CHECK-NEXT: %26 = select i1 %25, i16 %24, i16 %23
+; CHECK-NEXT: %27 = extractelement <8 x i16> %1, i32 0
+; CHECK-NEXT: %28 = icmp eq i32 8, %2
+; CHECK-NEXT: %29 = select i1 %28, i16 %27, i16 %26
+; CHECK-NEXT: %30 = extractelement <8 x i16> %1, i32 1
+; CHECK-NEXT: %31 = icmp eq i32 9, %2
+; CHECK-NEXT: %32 = select i1 %31, i16 %30, i16 %29
+; CHECK-NEXT: %33 = extractelement <8 x i16> %1, i32 2
+; CHECK-NEXT: %34 = icmp eq i32 10, %2
+; CHECK-NEXT: %35 = select i1 %34, i16 %33, i16 %32
+; CHECK-NEXT: %36 = extractelement <8 x i16> %1, i32 3
+; CHECK-NEXT: %37 = icmp eq i32 11, %2
+; CHECK-NEXT: %38 = select i1 %37, i16 %36, i16 %35
+; CHECK-NEXT: ret i16 %38
+; CHECK-NEXT: }
+
+define i32 @extract_12xi32_var_idx(<12 x i32>, i32) {
+entry:
+ %2 = extractelement <12 x i32> %0, i32 %1
+ ret i32 %2
+}
+; CHECK-LABEL: define i32 @extract_12xi32_var_idx(<4 x i32>, <4 x i32>, <4 x i32>, i32) {
+; CHECK: entry:
+; CHECK-NEXT: %4 = extractelement <4 x i32> %0, i32 0
+; CHECK-NEXT: %5 = icmp eq i32 0, %3
+; CHECK-NEXT: %6 = select i1 %5, i32 %4, i32 undef
+; CHECK-NEXT: %7 = extractelement <4 x i32> %0, i32 1
+; CHECK-NEXT: %8 = icmp eq i32 1, %3
+; CHECK-NEXT: %9 = select i1 %8, i32 %7, i32 %6
+; CHECK-NEXT: %10 = extractelement <4 x i32> %0, i32 2
+; CHECK-NEXT: %11 = icmp eq i32 2, %3
+; CHECK-NEXT: %12 = select i1 %11, i32 %10, i32 %9
+; CHECK-NEXT: %13 = extractelement <4 x i32> %0, i32 3
+; CHECK-NEXT: %14 = icmp eq i32 3, %3
+; CHECK-NEXT: %15 = select i1 %14, i32 %13, i32 %12
+; CHECK-NEXT: %16 = extractelement <4 x i32> %1, i32 0
+; CHECK-NEXT: %17 = icmp eq i32 4, %3
+; CHECK-NEXT: %18 = select i1 %17, i32 %16, i32 %15
+; CHECK-NEXT: %19 = extractelement <4 x i32> %1, i32 1
+; CHECK-NEXT: %20 = icmp eq i32 5, %3
+; CHECK-NEXT: %21 = select i1 %20, i32 %19, i32 %18
+; CHECK-NEXT: %22 = extractelement <4 x i32> %1, i32 2
+; CHECK-NEXT: %23 = icmp eq i32 6, %3
+; CHECK-NEXT: %24 = select i1 %23, i32 %22, i32 %21
+; CHECK-NEXT: %25 = extractelement <4 x i32> %1, i32 3
+; CHECK-NEXT: %26 = icmp eq i32 7, %3
+; CHECK-NEXT: %27 = select i1 %26, i32 %25, i32 %24
+; CHECK-NEXT: %28 = extractelement <4 x i32> %2, i32 0
+; CHECK-NEXT: %29 = icmp eq i32 8, %3
+; CHECK-NEXT: %30 = select i1 %29, i32 %28, i32 %27
+; CHECK-NEXT: %31 = extractelement <4 x i32> %2, i32 1
+; CHECK-NEXT: %32 = icmp eq i32 9, %3
+; CHECK-NEXT: %33 = select i1 %32, i32 %31, i32 %30
+; CHECK-NEXT: %34 = extractelement <4 x i32> %2, i32 2
+; CHECK-NEXT: %35 = icmp eq i32 10, %3
+; CHECK-NEXT: %36 = select i1 %35, i32 %34, i32 %33
+; CHECK-NEXT: %37 = extractelement <4 x i32> %2, i32 3
+; CHECK-NEXT: %38 = icmp eq i32 11, %3
+; CHECK-NEXT: %39 = select i1 %38, i32 %37, i32 %36
+; CHECK-NEXT: ret i32 %39
+; CHECK-NEXT: }
+
+define i64 @extract_12xi64_var_idx(<12 x i64>, i32) {
+entry:
+ %2 = extractelement <12 x i64> %0, i32 %1
+ ret i64 %2
+}
+; CHECK-LABEL: define i64 @extract_12xi64_var_idx(<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, i32) {
+; CHECK: entry:
+; CHECK-NEXT: %7 = extractelement <2 x i64> %0, i32 0
+; CHECK-NEXT: %8 = icmp eq i32 0, %6
+; CHECK-NEXT: %9 = select i1 %8, i64 %7, i64 undef
+; CHECK-NEXT: %10 = extractelement <2 x i64> %0, i32 1
+; CHECK-NEXT: %11 = icmp eq i32 1, %6
+; CHECK-NEXT: %12 = select i1 %11, i64 %10, i64 %9
+; CHECK-NEXT: %13 = extractelement <2 x i64> %1, i32 0
+; CHECK-NEXT: %14 = icmp eq i32 2, %6
+; CHECK-NEXT: %15 = select i1 %14, i64 %13, i64 %12
+; CHECK-NEXT: %16 = extractelement <2 x i64> %1, i32 1
+; CHECK-NEXT: %17 = icmp eq i32 3, %6
+; CHECK-NEXT: %18 = select i1 %17, i64 %16, i64 %15
+; CHECK-NEXT: %19 = extractelement <2 x i64> %2, i32 0
+; CHECK-NEXT: %20 = icmp eq i32 4, %6
+; CHECK-NEXT: %21 = select i1 %20, i64 %19, i64 %18
+; CHECK-NEXT: %22 = extractelement <2 x i64> %2, i32 1
+; CHECK-NEXT: %23 = icmp eq i32 5, %6
+; CHECK-NEXT: %24 = select i1 %23, i64 %22, i64 %21
+; CHECK-NEXT: %25 = extractelement <2 x i64> %3, i32 0
+; CHECK-NEXT: %26 = icmp eq i32 6, %6
+; CHECK-NEXT: %27 = select i1 %26, i64 %25, i64 %24
+; CHECK-NEXT: %28 = extractelement <2 x i64> %3, i32 1
+; CHECK-NEXT: %29 = icmp eq i32 7, %6
+; CHECK-NEXT: %30 = select i1 %29, i64 %28, i64 %27
+; CHECK-NEXT: %31 = extractelement <2 x i64> %4, i32 0
+; CHECK-NEXT: %32 = icmp eq i32 8, %6
+; CHECK-NEXT: %33 = select i1 %32, i64 %31, i64 %30
+; CHECK-NEXT: %34 = extractelement <2 x i64> %4, i32 1
+; CHECK-NEXT: %35 = icmp eq i32 9, %6
+; CHECK-NEXT: %36 = select i1 %35, i64 %34, i64 %33
+; CHECK-NEXT: %37 = extractelement <2 x i64> %5, i32 0
+; CHECK-NEXT: %38 = icmp eq i32 10, %6
+; CHECK-NEXT: %39 = select i1 %38, i64 %37, i64 %36
+; CHECK-NEXT: %40 = extractelement <2 x i64> %5, i32 1
+; CHECK-NEXT: %41 = icmp eq i32 11, %6
+; CHECK-NEXT: %42 = select i1 %41, i64 %40, i64 %39
+; CHECK-NEXT: ret i64 %42
+; CHECK-NEXT: }
+
+define i8* @extract_12xi8ptr_var_idx(<12 x i8*>, i32) {
+entry:
+ %2 = extractelement <12 x i8*> %0, i32 %1
+ ret i8* %2
+}
+; CHECK-LABEL: define i8* @extract_12xi8ptr_var_idx(<4 x i8*>, <4 x i8*>, <4 x i8*>, i32) {
+; CHECK: entry:
+; CHECK-NEXT: %4 = extractelement <4 x i8*> %0, i32 0
+; CHECK-NEXT: %5 = icmp eq i32 0, %3
+; CHECK-NEXT: %6 = select i1 %5, i8* %4, i8* undef
+; CHECK-NEXT: %7 = extractelement <4 x i8*> %0, i32 1
+; CHECK-NEXT: %8 = icmp eq i32 1, %3
+; CHECK-NEXT: %9 = select i1 %8, i8* %7, i8* %6
+; CHECK-NEXT: %10 = extractelement <4 x i8*> %0, i32 2
+; CHECK-NEXT: %11 = icmp eq i32 2, %3
+; CHECK-NEXT: %12 = select i1 %11, i8* %10, i8* %9
+; CHECK-NEXT: %13 = extractelement <4 x i8*> %0, i32 3
+; CHECK-NEXT: %14 = icmp eq i32 3, %3
+; CHECK-NEXT: %15 = select i1 %14, i8* %13, i8* %12
+; CHECK-NEXT: %16 = extractelement <4 x i8*> %1, i32 0
+; CHECK-NEXT: %17 = icmp eq i32 4, %3
+; CHECK-NEXT: %18 = select i1 %17, i8* %16, i8* %15
+; CHECK-NEXT: %19 = extractelement <4 x i8*> %1, i32 1
+; CHECK-NEXT: %20 = icmp eq i32 5, %3
+; CHECK-NEXT: %21 = select i1 %20, i8* %19, i8* %18
+; CHECK-NEXT: %22 = extractelement <4 x i8*> %1, i32 2
+; CHECK-NEXT: %23 = icmp eq i32 6, %3
+; CHECK-NEXT: %24 = select i1 %23, i8* %22, i8* %21
+; CHECK-NEXT: %25 = extractelement <4 x i8*> %1, i32 3
+; CHECK-NEXT: %26 = icmp eq i32 7, %3
+; CHECK-NEXT: %27 = select i1 %26, i8* %25, i8* %24
+; CHECK-NEXT: %28 = extractelement <4 x i8*> %2, i32 0
+; CHECK-NEXT: %29 = icmp eq i32 8, %3
+; CHECK-NEXT: %30 = select i1 %29, i8* %28, i8* %27
+; CHECK-NEXT: %31 = extractelement <4 x i8*> %2, i32 1
+; CHECK-NEXT: %32 = icmp eq i32 9, %3
+; CHECK-NEXT: %33 = select i1 %32, i8* %31, i8* %30
+; CHECK-NEXT: %34 = extractelement <4 x i8*> %2, i32 2
+; CHECK-NEXT: %35 = icmp eq i32 10, %3
+; CHECK-NEXT: %36 = select i1 %35, i8* %34, i8* %33
+; CHECK-NEXT: %37 = extractelement <4 x i8*> %2, i32 3
+; CHECK-NEXT: %38 = icmp eq i32 11, %3
+; CHECK-NEXT: %39 = select i1 %38, i8* %37, i8* %36
+; CHECK-NEXT: ret i8* %39
+; CHECK-NEXT: }
+
+define float @extract_12xfloat_var_idx(<12 x float>, i32) {
+entry:
+ %2 = extractelement <12 x float> %0, i32 %1
+ ret float %2
+}
+; CHECK-LABEL: define float @extract_12xfloat_var_idx(<4 x float>, <4 x float>, <4 x float>, i32) {
+; CHECK: entry:
+; CHECK-NEXT: %4 = extractelement <4 x float> %0, i32 0
+; CHECK-NEXT: %5 = icmp eq i32 0, %3
+; CHECK-NEXT: %6 = select i1 %5, float %4, float undef
+; CHECK-NEXT: %7 = extractelement <4 x float> %0, i32 1
+; CHECK-NEXT: %8 = icmp eq i32 1, %3
+; CHECK-NEXT: %9 = select i1 %8, float %7, float %6
+; CHECK-NEXT: %10 = extractelement <4 x float> %0, i32 2
+; CHECK-NEXT: %11 = icmp eq i32 2, %3
+; CHECK-NEXT: %12 = select i1 %11, float %10, float %9
+; CHECK-NEXT: %13 = extractelement <4 x float> %0, i32 3
+; CHECK-NEXT: %14 = icmp eq i32 3, %3
+; CHECK-NEXT: %15 = select i1 %14, float %13, float %12
+; CHECK-NEXT: %16 = extractelement <4 x float> %1, i32 0
+; CHECK-NEXT: %17 = icmp eq i32 4, %3
+; CHECK-NEXT: %18 = select i1 %17, float %16, float %15
+; CHECK-NEXT: %19 = extractelement <4 x float> %1, i32 1
+; CHECK-NEXT: %20 = icmp eq i32 5, %3
+; CHECK-NEXT: %21 = select i1 %20, float %19, float %18
+; CHECK-NEXT: %22 = extractelement <4 x float> %1, i32 2
+; CHECK-NEXT: %23 = icmp eq i32 6, %3
+; CHECK-NEXT: %24 = select i1 %23, float %22, float %21
+; CHECK-NEXT: %25 = extractelement <4 x float> %1, i32 3
+; CHECK-NEXT: %26 = icmp eq i32 7, %3
+; CHECK-NEXT: %27 = select i1 %26, float %25, float %24
+; CHECK-NEXT: %28 = extractelement <4 x float> %2, i32 0
+; CHECK-NEXT: %29 = icmp eq i32 8, %3
+; CHECK-NEXT: %30 = select i1 %29, float %28, float %27
+; CHECK-NEXT: %31 = extractelement <4 x float> %2, i32 1
+; CHECK-NEXT: %32 = icmp eq i32 9, %3
+; CHECK-NEXT: %33 = select i1 %32, float %31, float %30
+; CHECK-NEXT: %34 = extractelement <4 x float> %2, i32 2
+; CHECK-NEXT: %35 = icmp eq i32 10, %3
+; CHECK-NEXT: %36 = select i1 %35, float %34, float %33
+; CHECK-NEXT: %37 = extractelement <4 x float> %2, i32 3
+; CHECK-NEXT: %38 = icmp eq i32 11, %3
+; CHECK-NEXT: %39 = select i1 %38, float %37, float %36
+; CHECK-NEXT: ret float %39
+; CHECK-NEXT: }
+
+define double @extract_12xdouble_var_idx(<12 x double>, i32) {
+entry:
+ %2 = extractelement <12 x double> %0, i32 %1
+ ret double %2
+}
+; CHECK-LABEL: define double @extract_12xdouble_var_idx(<2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, i32) {
+; CHECK: entry:
+; CHECK-NEXT: %7 = extractelement <2 x double> %0, i32 0
+; CHECK-NEXT: %8 = icmp eq i32 0, %6
+; CHECK-NEXT: %9 = select i1 %8, double %7, double undef
+; CHECK-NEXT: %10 = extractelement <2 x double> %0, i32 1
+; CHECK-NEXT: %11 = icmp eq i32 1, %6
+; CHECK-NEXT: %12 = select i1 %11, double %10, double %9
+; CHECK-NEXT: %13 = extractelement <2 x double> %1, i32 0
+; CHECK-NEXT: %14 = icmp eq i32 2, %6
+; CHECK-NEXT: %15 = select i1 %14, double %13, double %12
+; CHECK-NEXT: %16 = extractelement <2 x double> %1, i32 1
+; CHECK-NEXT: %17 = icmp eq i32 3, %6
+; CHECK-NEXT: %18 = select i1 %17, double %16, double %15
+; CHECK-NEXT: %19 = extractelement <2 x double> %2, i32 0
+; CHECK-NEXT: %20 = icmp eq i32 4, %6
+; CHECK-NEXT: %21 = select i1 %20, double %19, double %18
+; CHECK-NEXT: %22 = extractelement <2 x double> %2, i32 1
+; CHECK-NEXT: %23 = icmp eq i32 5, %6
+; CHECK-NEXT: %24 = select i1 %23, double %22, double %21
+; CHECK-NEXT: %25 = extractelement <2 x double> %3, i32 0
+; CHECK-NEXT: %26 = icmp eq i32 6, %6
+; CHECK-NEXT: %27 = select i1 %26, double %25, double %24
+; CHECK-NEXT: %28 = extractelement <2 x double> %3, i32 1
+; CHECK-NEXT: %29 = icmp eq i32 7, %6
+; CHECK-NEXT: %30 = select i1 %29, double %28, double %27
+; CHECK-NEXT: %31 = extractelement <2 x double> %4, i32 0
+; CHECK-NEXT: %32 = icmp eq i32 8, %6
+; CHECK-NEXT: %33 = select i1 %32, double %31, double %30
+; CHECK-NEXT: %34 = extractelement <2 x double> %4, i32 1
+; CHECK-NEXT: %35 = icmp eq i32 9, %6
+; CHECK-NEXT: %36 = select i1 %35, double %34, double %33
+; CHECK-NEXT: %37 = extractelement <2 x double> %5, i32 0
+; CHECK-NEXT: %38 = icmp eq i32 10, %6
+; CHECK-NEXT: %39 = select i1 %38, double %37, double %36
+; CHECK-NEXT: %40 = extractelement <2 x double> %5, i32 1
+; CHECK-NEXT: %41 = icmp eq i32 11, %6
+; CHECK-NEXT: %42 = select i1 %41, double %40, double %39
+; CHECK-NEXT: ret double %42
+; CHECK-NEXT: }
+
+define i8 @extract_16xi8_var_idx(<16 x i8>, i32) {
+entry:
+ %2 = extractelement <16 x i8> %0, i32 %1
+ ret i8 %2
+}
+; CHECK-LABEL: define i8 @extract_16xi8_var_idx(<16 x i8>, i32) {
+; CHECK: entry:
+; CHECK-NEXT: %2 = extractelement <16 x i8> %0, i32 %1
+; CHECK-NEXT: ret i8 %2
+; CHECK-NEXT: }
+
+define i16 @extract_16xi16_var_idx(<16 x i16>, i32) {
+entry:
+ %2 = extractelement <16 x i16> %0, i32 %1
+ ret i16 %2
+}
+; CHECK-LABEL: define i16 @extract_16xi16_var_idx(<8 x i16>, <8 x i16>, i32) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <8 x i16> %0, i32 0
+; CHECK-NEXT: %4 = icmp eq i32 0, %2
+; CHECK-NEXT: %5 = select i1 %4, i16 %3, i16 undef
+; CHECK-NEXT: %6 = extractelement <8 x i16> %0, i32 1
+; CHECK-NEXT: %7 = icmp eq i32 1, %2
+; CHECK-NEXT: %8 = select i1 %7, i16 %6, i16 %5
+; CHECK-NEXT: %9 = extractelement <8 x i16> %0, i32 2
+; CHECK-NEXT: %10 = icmp eq i32 2, %2
+; CHECK-NEXT: %11 = select i1 %10, i16 %9, i16 %8
+; CHECK-NEXT: %12 = extractelement <8 x i16> %0, i32 3
+; CHECK-NEXT: %13 = icmp eq i32 3, %2
+; CHECK-NEXT: %14 = select i1 %13, i16 %12, i16 %11
+; CHECK-NEXT: %15 = extractelement <8 x i16> %0, i32 4
+; CHECK-NEXT: %16 = icmp eq i32 4, %2
+; CHECK-NEXT: %17 = select i1 %16, i16 %15, i16 %14
+; CHECK-NEXT: %18 = extractelement <8 x i16> %0, i32 5
+; CHECK-NEXT: %19 = icmp eq i32 5, %2
+; CHECK-NEXT: %20 = select i1 %19, i16 %18, i16 %17
+; CHECK-NEXT: %21 = extractelement <8 x i16> %0, i32 6
+; CHECK-NEXT: %22 = icmp eq i32 6, %2
+; CHECK-NEXT: %23 = select i1 %22, i16 %21, i16 %20
+; CHECK-NEXT: %24 = extractelement <8 x i16> %0, i32 7
+; CHECK-NEXT: %25 = icmp eq i32 7, %2
+; CHECK-NEXT: %26 = select i1 %25, i16 %24, i16 %23
+; CHECK-NEXT: %27 = extractelement <8 x i16> %1, i32 0
+; CHECK-NEXT: %28 = icmp eq i32 8, %2
+; CHECK-NEXT: %29 = select i1 %28, i16 %27, i16 %26
+; CHECK-NEXT: %30 = extractelement <8 x i16> %1, i32 1
+; CHECK-NEXT: %31 = icmp eq i32 9, %2
+; CHECK-NEXT: %32 = select i1 %31, i16 %30, i16 %29
+; CHECK-NEXT: %33 = extractelement <8 x i16> %1, i32 2
+; CHECK-NEXT: %34 = icmp eq i32 10, %2
+; CHECK-NEXT: %35 = select i1 %34, i16 %33, i16 %32
+; CHECK-NEXT: %36 = extractelement <8 x i16> %1, i32 3
+; CHECK-NEXT: %37 = icmp eq i32 11, %2
+; CHECK-NEXT: %38 = select i1 %37, i16 %36, i16 %35
+; CHECK-NEXT: %39 = extractelement <8 x i16> %1, i32 4
+; CHECK-NEXT: %40 = icmp eq i32 12, %2
+; CHECK-NEXT: %41 = select i1 %40, i16 %39, i16 %38
+; CHECK-NEXT: %42 = extractelement <8 x i16> %1, i32 5
+; CHECK-NEXT: %43 = icmp eq i32 13, %2
+; CHECK-NEXT: %44 = select i1 %43, i16 %42, i16 %41
+; CHECK-NEXT: %45 = extractelement <8 x i16> %1, i32 6
+; CHECK-NEXT: %46 = icmp eq i32 14, %2
+; CHECK-NEXT: %47 = select i1 %46, i16 %45, i16 %44
+; CHECK-NEXT: %48 = extractelement <8 x i16> %1, i32 7
+; CHECK-NEXT: %49 = icmp eq i32 15, %2
+; CHECK-NEXT: %50 = select i1 %49, i16 %48, i16 %47
+; CHECK-NEXT: ret i16 %50
+; CHECK-NEXT: }
+
+define i32 @extract_16xi32_var_idx(<16 x i32>, i32) {
+entry:
+ %2 = extractelement <16 x i32> %0, i32 %1
+ ret i32 %2
+}
+; CHECK-LABEL: define i32 @extract_16xi32_var_idx(<4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, i32) {
+; CHECK: entry:
+; CHECK-NEXT: %5 = extractelement <4 x i32> %0, i32 0
+; CHECK-NEXT: %6 = icmp eq i32 0, %4
+; CHECK-NEXT: %7 = select i1 %6, i32 %5, i32 undef
+; CHECK-NEXT: %8 = extractelement <4 x i32> %0, i32 1
+; CHECK-NEXT: %9 = icmp eq i32 1, %4
+; CHECK-NEXT: %10 = select i1 %9, i32 %8, i32 %7
+; CHECK-NEXT: %11 = extractelement <4 x i32> %0, i32 2
+; CHECK-NEXT: %12 = icmp eq i32 2, %4
+; CHECK-NEXT: %13 = select i1 %12, i32 %11, i32 %10
+; CHECK-NEXT: %14 = extractelement <4 x i32> %0, i32 3
+; CHECK-NEXT: %15 = icmp eq i32 3, %4
+; CHECK-NEXT: %16 = select i1 %15, i32 %14, i32 %13
+; CHECK-NEXT: %17 = extractelement <4 x i32> %1, i32 0
+; CHECK-NEXT: %18 = icmp eq i32 4, %4
+; CHECK-NEXT: %19 = select i1 %18, i32 %17, i32 %16
+; CHECK-NEXT: %20 = extractelement <4 x i32> %1, i32 1
+; CHECK-NEXT: %21 = icmp eq i32 5, %4
+; CHECK-NEXT: %22 = select i1 %21, i32 %20, i32 %19
+; CHECK-NEXT: %23 = extractelement <4 x i32> %1, i32 2
+; CHECK-NEXT: %24 = icmp eq i32 6, %4
+; CHECK-NEXT: %25 = select i1 %24, i32 %23, i32 %22
+; CHECK-NEXT: %26 = extractelement <4 x i32> %1, i32 3
+; CHECK-NEXT: %27 = icmp eq i32 7, %4
+; CHECK-NEXT: %28 = select i1 %27, i32 %26, i32 %25
+; CHECK-NEXT: %29 = extractelement <4 x i32> %2, i32 0
+; CHECK-NEXT: %30 = icmp eq i32 8, %4
+; CHECK-NEXT: %31 = select i1 %30, i32 %29, i32 %28
+; CHECK-NEXT: %32 = extractelement <4 x i32> %2, i32 1
+; CHECK-NEXT: %33 = icmp eq i32 9, %4
+; CHECK-NEXT: %34 = select i1 %33, i32 %32, i32 %31
+; CHECK-NEXT: %35 = extractelement <4 x i32> %2, i32 2
+; CHECK-NEXT: %36 = icmp eq i32 10, %4
+; CHECK-NEXT: %37 = select i1 %36, i32 %35, i32 %34
+; CHECK-NEXT: %38 = extractelement <4 x i32> %2, i32 3
+; CHECK-NEXT: %39 = icmp eq i32 11, %4
+; CHECK-NEXT: %40 = select i1 %39, i32 %38, i32 %37
+; CHECK-NEXT: %41 = extractelement <4 x i32> %3, i32 0
+; CHECK-NEXT: %42 = icmp eq i32 12, %4
+; CHECK-NEXT: %43 = select i1 %42, i32 %41, i32 %40
+; CHECK-NEXT: %44 = extractelement <4 x i32> %3, i32 1
+; CHECK-NEXT: %45 = icmp eq i32 13, %4
+; CHECK-NEXT: %46 = select i1 %45, i32 %44, i32 %43
+; CHECK-NEXT: %47 = extractelement <4 x i32> %3, i32 2
+; CHECK-NEXT: %48 = icmp eq i32 14, %4
+; CHECK-NEXT: %49 = select i1 %48, i32 %47, i32 %46
+; CHECK-NEXT: %50 = extractelement <4 x i32> %3, i32 3
+; CHECK-NEXT: %51 = icmp eq i32 15, %4
+; CHECK-NEXT: %52 = select i1 %51, i32 %50, i32 %49
+; CHECK-NEXT: ret i32 %52
+; CHECK-NEXT: }
+
+define i64 @extract_16xi64_var_idx(<16 x i64>, i32) {
+entry:
+ %2 = extractelement <16 x i64> %0, i32 %1
+ ret i64 %2
+}
+; CHECK-LABEL: define i64 @extract_16xi64_var_idx(<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, i32) {
+; CHECK: entry:
+; CHECK-NEXT: %9 = extractelement <2 x i64> %0, i32 0
+; CHECK-NEXT: %10 = icmp eq i32 0, %8
+; CHECK-NEXT: %11 = select i1 %10, i64 %9, i64 undef
+; CHECK-NEXT: %12 = extractelement <2 x i64> %0, i32 1
+; CHECK-NEXT: %13 = icmp eq i32 1, %8
+; CHECK-NEXT: %14 = select i1 %13, i64 %12, i64 %11
+; CHECK-NEXT: %15 = extractelement <2 x i64> %1, i32 0
+; CHECK-NEXT: %16 = icmp eq i32 2, %8
+; CHECK-NEXT: %17 = select i1 %16, i64 %15, i64 %14
+; CHECK-NEXT: %18 = extractelement <2 x i64> %1, i32 1
+; CHECK-NEXT: %19 = icmp eq i32 3, %8
+; CHECK-NEXT: %20 = select i1 %19, i64 %18, i64 %17
+; CHECK-NEXT: %21 = extractelement <2 x i64> %2, i32 0
+; CHECK-NEXT: %22 = icmp eq i32 4, %8
+; CHECK-NEXT: %23 = select i1 %22, i64 %21, i64 %20
+; CHECK-NEXT: %24 = extractelement <2 x i64> %2, i32 1
+; CHECK-NEXT: %25 = icmp eq i32 5, %8
+; CHECK-NEXT: %26 = select i1 %25, i64 %24, i64 %23
+; CHECK-NEXT: %27 = extractelement <2 x i64> %3, i32 0
+; CHECK-NEXT: %28 = icmp eq i32 6, %8
+; CHECK-NEXT: %29 = select i1 %28, i64 %27, i64 %26
+; CHECK-NEXT: %30 = extractelement <2 x i64> %3, i32 1
+; CHECK-NEXT: %31 = icmp eq i32 7, %8
+; CHECK-NEXT: %32 = select i1 %31, i64 %30, i64 %29
+; CHECK-NEXT: %33 = extractelement <2 x i64> %4, i32 0
+; CHECK-NEXT: %34 = icmp eq i32 8, %8
+; CHECK-NEXT: %35 = select i1 %34, i64 %33, i64 %32
+; CHECK-NEXT: %36 = extractelement <2 x i64> %4, i32 1
+; CHECK-NEXT: %37 = icmp eq i32 9, %8
+; CHECK-NEXT: %38 = select i1 %37, i64 %36, i64 %35
+; CHECK-NEXT: %39 = extractelement <2 x i64> %5, i32 0
+; CHECK-NEXT: %40 = icmp eq i32 10, %8
+; CHECK-NEXT: %41 = select i1 %40, i64 %39, i64 %38
+; CHECK-NEXT: %42 = extractelement <2 x i64> %5, i32 1
+; CHECK-NEXT: %43 = icmp eq i32 11, %8
+; CHECK-NEXT: %44 = select i1 %43, i64 %42, i64 %41
+; CHECK-NEXT: %45 = extractelement <2 x i64> %6, i32 0
+; CHECK-NEXT: %46 = icmp eq i32 12, %8
+; CHECK-NEXT: %47 = select i1 %46, i64 %45, i64 %44
+; CHECK-NEXT: %48 = extractelement <2 x i64> %6, i32 1
+; CHECK-NEXT: %49 = icmp eq i32 13, %8
+; CHECK-NEXT: %50 = select i1 %49, i64 %48, i64 %47
+; CHECK-NEXT: %51 = extractelement <2 x i64> %7, i32 0
+; CHECK-NEXT: %52 = icmp eq i32 14, %8
+; CHECK-NEXT: %53 = select i1 %52, i64 %51, i64 %50
+; CHECK-NEXT: %54 = extractelement <2 x i64> %7, i32 1
+; CHECK-NEXT: %55 = icmp eq i32 15, %8
+; CHECK-NEXT: %56 = select i1 %55, i64 %54, i64 %53
+; CHECK-NEXT: ret i64 %56
+; CHECK-NEXT: }
+
+define i8* @extract_16xi8ptr_var_idx(<16 x i8*>, i32) {
+entry:
+ %2 = extractelement <16 x i8*> %0, i32 %1
+ ret i8* %2
+}
+; CHECK-LABEL: define i8* @extract_16xi8ptr_var_idx(<4 x i8*>, <4 x i8*>, <4 x i8*>, <4 x i8*>, i32) {
+; CHECK: entry:
+; CHECK-NEXT: %5 = extractelement <4 x i8*> %0, i32 0
+; CHECK-NEXT: %6 = icmp eq i32 0, %4
+; CHECK-NEXT: %7 = select i1 %6, i8* %5, i8* undef
+; CHECK-NEXT: %8 = extractelement <4 x i8*> %0, i32 1
+; CHECK-NEXT: %9 = icmp eq i32 1, %4
+; CHECK-NEXT: %10 = select i1 %9, i8* %8, i8* %7
+; CHECK-NEXT: %11 = extractelement <4 x i8*> %0, i32 2
+; CHECK-NEXT: %12 = icmp eq i32 2, %4
+; CHECK-NEXT: %13 = select i1 %12, i8* %11, i8* %10
+; CHECK-NEXT: %14 = extractelement <4 x i8*> %0, i32 3
+; CHECK-NEXT: %15 = icmp eq i32 3, %4
+; CHECK-NEXT: %16 = select i1 %15, i8* %14, i8* %13
+; CHECK-NEXT: %17 = extractelement <4 x i8*> %1, i32 0
+; CHECK-NEXT: %18 = icmp eq i32 4, %4
+; CHECK-NEXT: %19 = select i1 %18, i8* %17, i8* %16
+; CHECK-NEXT: %20 = extractelement <4 x i8*> %1, i32 1
+; CHECK-NEXT: %21 = icmp eq i32 5, %4
+; CHECK-NEXT: %22 = select i1 %21, i8* %20, i8* %19
+; CHECK-NEXT: %23 = extractelement <4 x i8*> %1, i32 2
+; CHECK-NEXT: %24 = icmp eq i32 6, %4
+; CHECK-NEXT: %25 = select i1 %24, i8* %23, i8* %22
+; CHECK-NEXT: %26 = extractelement <4 x i8*> %1, i32 3
+; CHECK-NEXT: %27 = icmp eq i32 7, %4
+; CHECK-NEXT: %28 = select i1 %27, i8* %26, i8* %25
+; CHECK-NEXT: %29 = extractelement <4 x i8*> %2, i32 0
+; CHECK-NEXT: %30 = icmp eq i32 8, %4
+; CHECK-NEXT: %31 = select i1 %30, i8* %29, i8* %28
+; CHECK-NEXT: %32 = extractelement <4 x i8*> %2, i32 1
+; CHECK-NEXT: %33 = icmp eq i32 9, %4
+; CHECK-NEXT: %34 = select i1 %33, i8* %32, i8* %31
+; CHECK-NEXT: %35 = extractelement <4 x i8*> %2, i32 2
+; CHECK-NEXT: %36 = icmp eq i32 10, %4
+; CHECK-NEXT: %37 = select i1 %36, i8* %35, i8* %34
+; CHECK-NEXT: %38 = extractelement <4 x i8*> %2, i32 3
+; CHECK-NEXT: %39 = icmp eq i32 11, %4
+; CHECK-NEXT: %40 = select i1 %39, i8* %38, i8* %37
+; CHECK-NEXT: %41 = extractelement <4 x i8*> %3, i32 0
+; CHECK-NEXT: %42 = icmp eq i32 12, %4
+; CHECK-NEXT: %43 = select i1 %42, i8* %41, i8* %40
+; CHECK-NEXT: %44 = extractelement <4 x i8*> %3, i32 1
+; CHECK-NEXT: %45 = icmp eq i32 13, %4
+; CHECK-NEXT: %46 = select i1 %45, i8* %44, i8* %43
+; CHECK-NEXT: %47 = extractelement <4 x i8*> %3, i32 2
+; CHECK-NEXT: %48 = icmp eq i32 14, %4
+; CHECK-NEXT: %49 = select i1 %48, i8* %47, i8* %46
+; CHECK-NEXT: %50 = extractelement <4 x i8*> %3, i32 3
+; CHECK-NEXT: %51 = icmp eq i32 15, %4
+; CHECK-NEXT: %52 = select i1 %51, i8* %50, i8* %49
+; CHECK-NEXT: ret i8* %52
+; CHECK-NEXT: }
+
+define float @extract_16xfloat_var_idx(<16 x float>, i32) {
+entry:
+ %2 = extractelement <16 x float> %0, i32 %1
+ ret float %2
+}
+; CHECK-LABEL: define float @extract_16xfloat_var_idx(<4 x float>, <4 x float>, <4 x float>, <4 x float>, i32) {
+; CHECK: entry:
+; CHECK-NEXT: %5 = extractelement <4 x float> %0, i32 0
+; CHECK-NEXT: %6 = icmp eq i32 0, %4
+; CHECK-NEXT: %7 = select i1 %6, float %5, float undef
+; CHECK-NEXT: %8 = extractelement <4 x float> %0, i32 1
+; CHECK-NEXT: %9 = icmp eq i32 1, %4
+; CHECK-NEXT: %10 = select i1 %9, float %8, float %7
+; CHECK-NEXT: %11 = extractelement <4 x float> %0, i32 2
+; CHECK-NEXT: %12 = icmp eq i32 2, %4
+; CHECK-NEXT: %13 = select i1 %12, float %11, float %10
+; CHECK-NEXT: %14 = extractelement <4 x float> %0, i32 3
+; CHECK-NEXT: %15 = icmp eq i32 3, %4
+; CHECK-NEXT: %16 = select i1 %15, float %14, float %13
+; CHECK-NEXT: %17 = extractelement <4 x float> %1, i32 0
+; CHECK-NEXT: %18 = icmp eq i32 4, %4
+; CHECK-NEXT: %19 = select i1 %18, float %17, float %16
+; CHECK-NEXT: %20 = extractelement <4 x float> %1, i32 1
+; CHECK-NEXT: %21 = icmp eq i32 5, %4
+; CHECK-NEXT: %22 = select i1 %21, float %20, float %19
+; CHECK-NEXT: %23 = extractelement <4 x float> %1, i32 2
+; CHECK-NEXT: %24 = icmp eq i32 6, %4
+; CHECK-NEXT: %25 = select i1 %24, float %23, float %22
+; CHECK-NEXT: %26 = extractelement <4 x float> %1, i32 3
+; CHECK-NEXT: %27 = icmp eq i32 7, %4
+; CHECK-NEXT: %28 = select i1 %27, float %26, float %25
+; CHECK-NEXT: %29 = extractelement <4 x float> %2, i32 0
+; CHECK-NEXT: %30 = icmp eq i32 8, %4
+; CHECK-NEXT: %31 = select i1 %30, float %29, float %28
+; CHECK-NEXT: %32 = extractelement <4 x float> %2, i32 1
+; CHECK-NEXT: %33 = icmp eq i32 9, %4
+; CHECK-NEXT: %34 = select i1 %33, float %32, float %31
+; CHECK-NEXT: %35 = extractelement <4 x float> %2, i32 2
+; CHECK-NEXT: %36 = icmp eq i32 10, %4
+; CHECK-NEXT: %37 = select i1 %36, float %35, float %34
+; CHECK-NEXT: %38 = extractelement <4 x float> %2, i32 3
+; CHECK-NEXT: %39 = icmp eq i32 11, %4
+; CHECK-NEXT: %40 = select i1 %39, float %38, float %37
+; CHECK-NEXT: %41 = extractelement <4 x float> %3, i32 0
+; CHECK-NEXT: %42 = icmp eq i32 12, %4
+; CHECK-NEXT: %43 = select i1 %42, float %41, float %40
+; CHECK-NEXT: %44 = extractelement <4 x float> %3, i32 1
+; CHECK-NEXT: %45 = icmp eq i32 13, %4
+; CHECK-NEXT: %46 = select i1 %45, float %44, float %43
+; CHECK-NEXT: %47 = extractelement <4 x float> %3, i32 2
+; CHECK-NEXT: %48 = icmp eq i32 14, %4
+; CHECK-NEXT: %49 = select i1 %48, float %47, float %46
+; CHECK-NEXT: %50 = extractelement <4 x float> %3, i32 3
+; CHECK-NEXT: %51 = icmp eq i32 15, %4
+; CHECK-NEXT: %52 = select i1 %51, float %50, float %49
+; CHECK-NEXT: ret float %52
+; CHECK-NEXT: }
+
+define double @extract_16xdouble_var_idx(<16 x double>, i32) {
+entry:
+ %2 = extractelement <16 x double> %0, i32 %1
+ ret double %2
+}
+; CHECK-LABEL: define double @extract_16xdouble_var_idx(<2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, i32) {
+; CHECK: entry:
+; CHECK-NEXT: %9 = extractelement <2 x double> %0, i32 0
+; CHECK-NEXT: %10 = icmp eq i32 0, %8
+; CHECK-NEXT: %11 = select i1 %10, double %9, double undef
+; CHECK-NEXT: %12 = extractelement <2 x double> %0, i32 1
+; CHECK-NEXT: %13 = icmp eq i32 1, %8
+; CHECK-NEXT: %14 = select i1 %13, double %12, double %11
+; CHECK-NEXT: %15 = extractelement <2 x double> %1, i32 0
+; CHECK-NEXT: %16 = icmp eq i32 2, %8
+; CHECK-NEXT: %17 = select i1 %16, double %15, double %14
+; CHECK-NEXT: %18 = extractelement <2 x double> %1, i32 1
+; CHECK-NEXT: %19 = icmp eq i32 3, %8
+; CHECK-NEXT: %20 = select i1 %19, double %18, double %17
+; CHECK-NEXT: %21 = extractelement <2 x double> %2, i32 0
+; CHECK-NEXT: %22 = icmp eq i32 4, %8
+; CHECK-NEXT: %23 = select i1 %22, double %21, double %20
+; CHECK-NEXT: %24 = extractelement <2 x double> %2, i32 1
+; CHECK-NEXT: %25 = icmp eq i32 5, %8
+; CHECK-NEXT: %26 = select i1 %25, double %24, double %23
+; CHECK-NEXT: %27 = extractelement <2 x double> %3, i32 0
+; CHECK-NEXT: %28 = icmp eq i32 6, %8
+; CHECK-NEXT: %29 = select i1 %28, double %27, double %26
+; CHECK-NEXT: %30 = extractelement <2 x double> %3, i32 1
+; CHECK-NEXT: %31 = icmp eq i32 7, %8
+; CHECK-NEXT: %32 = select i1 %31, double %30, double %29
+; CHECK-NEXT: %33 = extractelement <2 x double> %4, i32 0
+; CHECK-NEXT: %34 = icmp eq i32 8, %8
+; CHECK-NEXT: %35 = select i1 %34, double %33, double %32
+; CHECK-NEXT: %36 = extractelement <2 x double> %4, i32 1
+; CHECK-NEXT: %37 = icmp eq i32 9, %8
+; CHECK-NEXT: %38 = select i1 %37, double %36, double %35
+; CHECK-NEXT: %39 = extractelement <2 x double> %5, i32 0
+; CHECK-NEXT: %40 = icmp eq i32 10, %8
+; CHECK-NEXT: %41 = select i1 %40, double %39, double %38
+; CHECK-NEXT: %42 = extractelement <2 x double> %5, i32 1
+; CHECK-NEXT: %43 = icmp eq i32 11, %8
+; CHECK-NEXT: %44 = select i1 %43, double %42, double %41
+; CHECK-NEXT: %45 = extractelement <2 x double> %6, i32 0
+; CHECK-NEXT: %46 = icmp eq i32 12, %8
+; CHECK-NEXT: %47 = select i1 %46, double %45, double %44
+; CHECK-NEXT: %48 = extractelement <2 x double> %6, i32 1
+; CHECK-NEXT: %49 = icmp eq i32 13, %8
+; CHECK-NEXT: %50 = select i1 %49, double %48, double %47
+; CHECK-NEXT: %51 = extractelement <2 x double> %7, i32 0
+; CHECK-NEXT: %52 = icmp eq i32 14, %8
+; CHECK-NEXT: %53 = select i1 %52, double %51, double %50
+; CHECK-NEXT: %54 = extractelement <2 x double> %7, i32 1
+; CHECK-NEXT: %55 = icmp eq i32 15, %8
+; CHECK-NEXT: %56 = select i1 %55, double %54, double %53
+; CHECK-NEXT: ret double %56
+; CHECK-NEXT: }
+
+define i8 @extract_20xi8_var_idx(<20 x i8>, i32) {
+entry:
+ %2 = extractelement <20 x i8> %0, i32 %1
+ ret i8 %2
+}
+; CHECK-LABEL: define i8 @extract_20xi8_var_idx(<16 x i8>, <16 x i8>, i32) {
+; CHECK: entry:
+; CHECK-NEXT: %3 = extractelement <16 x i8> %0, i32 0
+; CHECK-NEXT: %4 = icmp eq i32 0, %2
+; CHECK-NEXT: %5 = select i1 %4, i8 %3, i8 undef
+; CHECK-NEXT: %6 = extractelement <16 x i8> %0, i32 1
+; CHECK-NEXT: %7 = icmp eq i32 1, %2
+; CHECK-NEXT: %8 = select i1 %7, i8 %6, i8 %5
+; CHECK-NEXT: %9 = extractelement <16 x i8> %0, i32 2
+; CHECK-NEXT: %10 = icmp eq i32 2, %2
+; CHECK-NEXT: %11 = select i1 %10, i8 %9, i8 %8
+; CHECK-NEXT: %12 = extractelement <16 x i8> %0, i32 3
+; CHECK-NEXT: %13 = icmp eq i32 3, %2
+; CHECK-NEXT: %14 = select i1 %13, i8 %12, i8 %11
+; CHECK-NEXT: %15 = extractelement <16 x i8> %0, i32 4
+; CHECK-NEXT: %16 = icmp eq i32 4, %2
+; CHECK-NEXT: %17 = select i1 %16, i8 %15, i8 %14
+; CHECK-NEXT: %18 = extractelement <16 x i8> %0, i32 5
+; CHECK-NEXT: %19 = icmp eq i32 5, %2
+; CHECK-NEXT: %20 = select i1 %19, i8 %18, i8 %17
+; CHECK-NEXT: %21 = extractelement <16 x i8> %0, i32 6
+; CHECK-NEXT: %22 = icmp eq i32 6, %2
+; CHECK-NEXT: %23 = select i1 %22, i8 %21, i8 %20
+; CHECK-NEXT: %24 = extractelement <16 x i8> %0, i32 7
+; CHECK-NEXT: %25 = icmp eq i32 7, %2
+; CHECK-NEXT: %26 = select i1 %25, i8 %24, i8 %23
+; CHECK-NEXT: %27 = extractelement <16 x i8> %0, i32 8
+; CHECK-NEXT: %28 = icmp eq i32 8, %2
+; CHECK-NEXT: %29 = select i1 %28, i8 %27, i8 %26
+; CHECK-NEXT: %30 = extractelement <16 x i8> %0, i32 9
+; CHECK-NEXT: %31 = icmp eq i32 9, %2
+; CHECK-NEXT: %32 = select i1 %31, i8 %30, i8 %29
+; CHECK-NEXT: %33 = extractelement <16 x i8> %0, i32 10
+; CHECK-NEXT: %34 = icmp eq i32 10, %2
+; CHECK-NEXT: %35 = select i1 %34, i8 %33, i8 %32
+; CHECK-NEXT: %36 = extractelement <16 x i8> %0, i32 11
+; CHECK-NEXT: %37 = icmp eq i32 11, %2
+; CHECK-NEXT: %38 = select i1 %37, i8 %36, i8 %35
+; CHECK-NEXT: %39 = extractelement <16 x i8> %0, i32 12
+; CHECK-NEXT: %40 = icmp eq i32 12, %2
+; CHECK-NEXT: %41 = select i1 %40, i8 %39, i8 %38
+; CHECK-NEXT: %42 = extractelement <16 x i8> %0, i32 13
+; CHECK-NEXT: %43 = icmp eq i32 13, %2
+; CHECK-NEXT: %44 = select i1 %43, i8 %42, i8 %41
+; CHECK-NEXT: %45 = extractelement <16 x i8> %0, i32 14
+; CHECK-NEXT: %46 = icmp eq i32 14, %2
+; CHECK-NEXT: %47 = select i1 %46, i8 %45, i8 %44
+; CHECK-NEXT: %48 = extractelement <16 x i8> %0, i32 15
+; CHECK-NEXT: %49 = icmp eq i32 15, %2
+; CHECK-NEXT: %50 = select i1 %49, i8 %48, i8 %47
+; CHECK-NEXT: %51 = extractelement <16 x i8> %1, i32 0
+; CHECK-NEXT: %52 = icmp eq i32 16, %2
+; CHECK-NEXT: %53 = select i1 %52, i8 %51, i8 %50
+; CHECK-NEXT: %54 = extractelement <16 x i8> %1, i32 1
+; CHECK-NEXT: %55 = icmp eq i32 17, %2
+; CHECK-NEXT: %56 = select i1 %55, i8 %54, i8 %53
+; CHECK-NEXT: %57 = extractelement <16 x i8> %1, i32 2
+; CHECK-NEXT: %58 = icmp eq i32 18, %2
+; CHECK-NEXT: %59 = select i1 %58, i8 %57, i8 %56
+; CHECK-NEXT: %60 = extractelement <16 x i8> %1, i32 3
+; CHECK-NEXT: %61 = icmp eq i32 19, %2
+; CHECK-NEXT: %62 = select i1 %61, i8 %60, i8 %59
+; CHECK-NEXT: ret i8 %62
+; CHECK-NEXT: }
+
+define i16 @extract_20xi16_var_idx(<20 x i16>, i32) {
+entry:
+ %2 = extractelement <20 x i16> %0, i32 %1
+ ret i16 %2
+}
+; CHECK-LABEL: define i16 @extract_20xi16_var_idx(<8 x i16>, <8 x i16>, <8 x i16>, i32) {
+; CHECK: entry:
+; CHECK-NEXT: %4 = extractelement <8 x i16> %0, i32 0
+; CHECK-NEXT: %5 = icmp eq i32 0, %3
+; CHECK-NEXT: %6 = select i1 %5, i16 %4, i16 undef
+; CHECK-NEXT: %7 = extractelement <8 x i16> %0, i32 1
+; CHECK-NEXT: %8 = icmp eq i32 1, %3
+; CHECK-NEXT: %9 = select i1 %8, i16 %7, i16 %6
+; CHECK-NEXT: %10 = extractelement <8 x i16> %0, i32 2
+; CHECK-NEXT: %11 = icmp eq i32 2, %3
+; CHECK-NEXT: %12 = select i1 %11, i16 %10, i16 %9
+; CHECK-NEXT: %13 = extractelement <8 x i16> %0, i32 3
+; CHECK-NEXT: %14 = icmp eq i32 3, %3
+; CHECK-NEXT: %15 = select i1 %14, i16 %13, i16 %12
+; CHECK-NEXT: %16 = extractelement <8 x i16> %0, i32 4
+; CHECK-NEXT: %17 = icmp eq i32 4, %3
+; CHECK-NEXT: %18 = select i1 %17, i16 %16, i16 %15
+; CHECK-NEXT: %19 = extractelement <8 x i16> %0, i32 5
+; CHECK-NEXT: %20 = icmp eq i32 5, %3
+; CHECK-NEXT: %21 = select i1 %20, i16 %19, i16 %18
+; CHECK-NEXT: %22 = extractelement <8 x i16> %0, i32 6
+; CHECK-NEXT: %23 = icmp eq i32 6, %3
+; CHECK-NEXT: %24 = select i1 %23, i16 %22, i16 %21
+; CHECK-NEXT: %25 = extractelement <8 x i16> %0, i32 7
+; CHECK-NEXT: %26 = icmp eq i32 7, %3
+; CHECK-NEXT: %27 = select i1 %26, i16 %25, i16 %24
+; CHECK-NEXT: %28 = extractelement <8 x i16> %1, i32 0
+; CHECK-NEXT: %29 = icmp eq i32 8, %3
+; CHECK-NEXT: %30 = select i1 %29, i16 %28, i16 %27
+; CHECK-NEXT: %31 = extractelement <8 x i16> %1, i32 1
+; CHECK-NEXT: %32 = icmp eq i32 9, %3
+; CHECK-NEXT: %33 = select i1 %32, i16 %31, i16 %30
+; CHECK-NEXT: %34 = extractelement <8 x i16> %1, i32 2
+; CHECK-NEXT: %35 = icmp eq i32 10, %3
+; CHECK-NEXT: %36 = select i1 %35, i16 %34, i16 %33
+; CHECK-NEXT: %37 = extractelement <8 x i16> %1, i32 3
+; CHECK-NEXT: %38 = icmp eq i32 11, %3
+; CHECK-NEXT: %39 = select i1 %38, i16 %37, i16 %36
+; CHECK-NEXT: %40 = extractelement <8 x i16> %1, i32 4
+; CHECK-NEXT: %41 = icmp eq i32 12, %3
+; CHECK-NEXT: %42 = select i1 %41, i16 %40, i16 %39
+; CHECK-NEXT: %43 = extractelement <8 x i16> %1, i32 5
+; CHECK-NEXT: %44 = icmp eq i32 13, %3
+; CHECK-NEXT: %45 = select i1 %44, i16 %43, i16 %42
+; CHECK-NEXT: %46 = extractelement <8 x i16> %1, i32 6
+; CHECK-NEXT: %47 = icmp eq i32 14, %3
+; CHECK-NEXT: %48 = select i1 %47, i16 %46, i16 %45
+; CHECK-NEXT: %49 = extractelement <8 x i16> %1, i32 7
+; CHECK-NEXT: %50 = icmp eq i32 15, %3
+; CHECK-NEXT: %51 = select i1 %50, i16 %49, i16 %48
+; CHECK-NEXT: %52 = extractelement <8 x i16> %2, i32 0
+; CHECK-NEXT: %53 = icmp eq i32 16, %3
+; CHECK-NEXT: %54 = select i1 %53, i16 %52, i16 %51
+; CHECK-NEXT: %55 = extractelement <8 x i16> %2, i32 1
+; CHECK-NEXT: %56 = icmp eq i32 17, %3
+; CHECK-NEXT: %57 = select i1 %56, i16 %55, i16 %54
+; CHECK-NEXT: %58 = extractelement <8 x i16> %2, i32 2
+; CHECK-NEXT: %59 = icmp eq i32 18, %3
+; CHECK-NEXT: %60 = select i1 %59, i16 %58, i16 %57
+; CHECK-NEXT: %61 = extractelement <8 x i16> %2, i32 3
+; CHECK-NEXT: %62 = icmp eq i32 19, %3
+; CHECK-NEXT: %63 = select i1 %62, i16 %61, i16 %60
+; CHECK-NEXT: ret i16 %63
+; CHECK-NEXT: }
+
+define i32 @extract_20xi32_var_idx(<20 x i32>, i32) {
+entry:
+ %2 = extractelement <20 x i32> %0, i32 %1
+ ret i32 %2
+}
+; CHECK-LABEL: define i32 @extract_20xi32_var_idx(<4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, i32) {
+; CHECK: entry:
+; CHECK-NEXT: %6 = extractelement <4 x i32> %0, i32 0
+; CHECK-NEXT: %7 = icmp eq i32 0, %5
+; CHECK-NEXT: %8 = select i1 %7, i32 %6, i32 undef
+; CHECK-NEXT: %9 = extractelement <4 x i32> %0, i32 1
+; CHECK-NEXT: %10 = icmp eq i32 1, %5
+; CHECK-NEXT: %11 = select i1 %10, i32 %9, i32 %8
+; CHECK-NEXT: %12 = extractelement <4 x i32> %0, i32 2
+; CHECK-NEXT: %13 = icmp eq i32 2, %5
+; CHECK-NEXT: %14 = select i1 %13, i32 %12, i32 %11
+; CHECK-NEXT: %15 = extractelement <4 x i32> %0, i32 3
+; CHECK-NEXT: %16 = icmp eq i32 3, %5
+; CHECK-NEXT: %17 = select i1 %16, i32 %15, i32 %14
+; CHECK-NEXT: %18 = extractelement <4 x i32> %1, i32 0
+; CHECK-NEXT: %19 = icmp eq i32 4, %5
+; CHECK-NEXT: %20 = select i1 %19, i32 %18, i32 %17
+; CHECK-NEXT: %21 = extractelement <4 x i32> %1, i32 1
+; CHECK-NEXT: %22 = icmp eq i32 5, %5
+; CHECK-NEXT: %23 = select i1 %22, i32 %21, i32 %20
+; CHECK-NEXT: %24 = extractelement <4 x i32> %1, i32 2
+; CHECK-NEXT: %25 = icmp eq i32 6, %5
+; CHECK-NEXT: %26 = select i1 %25, i32 %24, i32 %23
+; CHECK-NEXT: %27 = extractelement <4 x i32> %1, i32 3
+; CHECK-NEXT: %28 = icmp eq i32 7, %5
+; CHECK-NEXT: %29 = select i1 %28, i32 %27, i32 %26
+; CHECK-NEXT: %30 = extractelement <4 x i32> %2, i32 0
+; CHECK-NEXT: %31 = icmp eq i32 8, %5
+; CHECK-NEXT: %32 = select i1 %31, i32 %30, i32 %29
+; CHECK-NEXT: %33 = extractelement <4 x i32> %2, i32 1
+; CHECK-NEXT: %34 = icmp eq i32 9, %5
+; CHECK-NEXT: %35 = select i1 %34, i32 %33, i32 %32
+; CHECK-NEXT: %36 = extractelement <4 x i32> %2, i32 2
+; CHECK-NEXT: %37 = icmp eq i32 10, %5
+; CHECK-NEXT: %38 = select i1 %37, i32 %36, i32 %35
+; CHECK-NEXT: %39 = extractelement <4 x i32> %2, i32 3
+; CHECK-NEXT: %40 = icmp eq i32 11, %5
+; CHECK-NEXT: %41 = select i1 %40, i32 %39, i32 %38
+; CHECK-NEXT: %42 = extractelement <4 x i32> %3, i32 0
+; CHECK-NEXT: %43 = icmp eq i32 12, %5
+; CHECK-NEXT: %44 = select i1 %43, i32 %42, i32 %41
+; CHECK-NEXT: %45 = extractelement <4 x i32> %3, i32 1
+; CHECK-NEXT: %46 = icmp eq i32 13, %5
+; CHECK-NEXT: %47 = select i1 %46, i32 %45, i32 %44
+; CHECK-NEXT: %48 = extractelement <4 x i32> %3, i32 2
+; CHECK-NEXT: %49 = icmp eq i32 14, %5
+; CHECK-NEXT: %50 = select i1 %49, i32 %48, i32 %47
+; CHECK-NEXT: %51 = extractelement <4 x i32> %3, i32 3
+; CHECK-NEXT: %52 = icmp eq i32 15, %5
+; CHECK-NEXT: %53 = select i1 %52, i32 %51, i32 %50
+; CHECK-NEXT: %54 = extractelement <4 x i32> %4, i32 0
+; CHECK-NEXT: %55 = icmp eq i32 16, %5
+; CHECK-NEXT: %56 = select i1 %55, i32 %54, i32 %53
+; CHECK-NEXT: %57 = extractelement <4 x i32> %4, i32 1
+; CHECK-NEXT: %58 = icmp eq i32 17, %5
+; CHECK-NEXT: %59 = select i1 %58, i32 %57, i32 %56
+; CHECK-NEXT: %60 = extractelement <4 x i32> %4, i32 2
+; CHECK-NEXT: %61 = icmp eq i32 18, %5
+; CHECK-NEXT: %62 = select i1 %61, i32 %60, i32 %59
+; CHECK-NEXT: %63 = extractelement <4 x i32> %4, i32 3
+; CHECK-NEXT: %64 = icmp eq i32 19, %5
+; CHECK-NEXT: %65 = select i1 %64, i32 %63, i32 %62
+; CHECK-NEXT: ret i32 %65
+; CHECK-NEXT: }
+
+define i64 @extract_20xi64_var_idx(<20 x i64>, i32) {
+entry:
+ %2 = extractelement <20 x i64> %0, i32 %1
+ ret i64 %2
+}
+; CHECK-LABEL: define i64 @extract_20xi64_var_idx(<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, i32) {
+; CHECK: entry:
+; CHECK-NEXT: %11 = extractelement <2 x i64> %0, i32 0
+; CHECK-NEXT: %12 = icmp eq i32 0, %10
+; CHECK-NEXT: %13 = select i1 %12, i64 %11, i64 undef
+; CHECK-NEXT: %14 = extractelement <2 x i64> %0, i32 1
+; CHECK-NEXT: %15 = icmp eq i32 1, %10
+; CHECK-NEXT: %16 = select i1 %15, i64 %14, i64 %13
+; CHECK-NEXT: %17 = extractelement <2 x i64> %1, i32 0
+; CHECK-NEXT: %18 = icmp eq i32 2, %10
+; CHECK-NEXT: %19 = select i1 %18, i64 %17, i64 %16
+; CHECK-NEXT: %20 = extractelement <2 x i64> %1, i32 1
+; CHECK-NEXT: %21 = icmp eq i32 3, %10
+; CHECK-NEXT: %22 = select i1 %21, i64 %20, i64 %19
+; CHECK-NEXT: %23 = extractelement <2 x i64> %2, i32 0
+; CHECK-NEXT: %24 = icmp eq i32 4, %10
+; CHECK-NEXT: %25 = select i1 %24, i64 %23, i64 %22
+; CHECK-NEXT: %26 = extractelement <2 x i64> %2, i32 1
+; CHECK-NEXT: %27 = icmp eq i32 5, %10
+; CHECK-NEXT: %28 = select i1 %27, i64 %26, i64 %25
+; CHECK-NEXT: %29 = extractelement <2 x i64> %3, i32 0
+; CHECK-NEXT: %30 = icmp eq i32 6, %10
+; CHECK-NEXT: %31 = select i1 %30, i64 %29, i64 %28
+; CHECK-NEXT: %32 = extractelement <2 x i64> %3, i32 1
+; CHECK-NEXT: %33 = icmp eq i32 7, %10
+; CHECK-NEXT: %34 = select i1 %33, i64 %32, i64 %31
+; CHECK-NEXT: %35 = extractelement <2 x i64> %4, i32 0
+; CHECK-NEXT: %36 = icmp eq i32 8, %10
+; CHECK-NEXT: %37 = select i1 %36, i64 %35, i64 %34
+; CHECK-NEXT: %38 = extractelement <2 x i64> %4, i32 1
+; CHECK-NEXT: %39 = icmp eq i32 9, %10
+; CHECK-NEXT: %40 = select i1 %39, i64 %38, i64 %37
+; CHECK-NEXT: %41 = extractelement <2 x i64> %5, i32 0
+; CHECK-NEXT: %42 = icmp eq i32 10, %10
+; CHECK-NEXT: %43 = select i1 %42, i64 %41, i64 %40
+; CHECK-NEXT: %44 = extractelement <2 x i64> %5, i32 1
+; CHECK-NEXT: %45 = icmp eq i32 11, %10
+; CHECK-NEXT: %46 = select i1 %45, i64 %44, i64 %43
+; CHECK-NEXT: %47 = extractelement <2 x i64> %6, i32 0
+; CHECK-NEXT: %48 = icmp eq i32 12, %10
+; CHECK-NEXT: %49 = select i1 %48, i64 %47, i64 %46
+; CHECK-NEXT: %50 = extractelement <2 x i64> %6, i32 1
+; CHECK-NEXT: %51 = icmp eq i32 13, %10
+; CHECK-NEXT: %52 = select i1 %51, i64 %50, i64 %49
+; CHECK-NEXT: %53 = extractelement <2 x i64> %7, i32 0
+; CHECK-NEXT: %54 = icmp eq i32 14, %10
+; CHECK-NEXT: %55 = select i1 %54, i64 %53, i64 %52
+; CHECK-NEXT: %56 = extractelement <2 x i64> %7, i32 1
+; CHECK-NEXT: %57 = icmp eq i32 15, %10
+; CHECK-NEXT: %58 = select i1 %57, i64 %56, i64 %55
+; CHECK-NEXT: %59 = extractelement <2 x i64> %8, i32 0
+; CHECK-NEXT: %60 = icmp eq i32 16, %10
+; CHECK-NEXT: %61 = select i1 %60, i64 %59, i64 %58
+; CHECK-NEXT: %62 = extractelement <2 x i64> %8, i32 1
+; CHECK-NEXT: %63 = icmp eq i32 17, %10
+; CHECK-NEXT: %64 = select i1 %63, i64 %62, i64 %61
+; CHECK-NEXT: %65 = extractelement <2 x i64> %9, i32 0
+; CHECK-NEXT: %66 = icmp eq i32 18, %10
+; CHECK-NEXT: %67 = select i1 %66, i64 %65, i64 %64
+; CHECK-NEXT: %68 = extractelement <2 x i64> %9, i32 1
+; CHECK-NEXT: %69 = icmp eq i32 19, %10
+; CHECK-NEXT: %70 = select i1 %69, i64 %68, i64 %67
+; CHECK-NEXT: ret i64 %70
+; CHECK-NEXT: }
+
+define i8* @extract_20xi8ptr_var_idx(<20 x i8*>, i32) {
+entry:
+ %2 = extractelement <20 x i8*> %0, i32 %1
+ ret i8* %2
+}
+; CHECK-LABEL: define i8* @extract_20xi8ptr_var_idx(<4 x i8*>, <4 x i8*>, <4 x i8*>, <4 x i8*>, <4 x i8*>, i32) {
+; CHECK: entry:
+; CHECK-NEXT: %6 = extractelement <4 x i8*> %0, i32 0
+; CHECK-NEXT: %7 = icmp eq i32 0, %5
+; CHECK-NEXT: %8 = select i1 %7, i8* %6, i8* undef
+; CHECK-NEXT: %9 = extractelement <4 x i8*> %0, i32 1
+; CHECK-NEXT: %10 = icmp eq i32 1, %5
+; CHECK-NEXT: %11 = select i1 %10, i8* %9, i8* %8
+; CHECK-NEXT: %12 = extractelement <4 x i8*> %0, i32 2
+; CHECK-NEXT: %13 = icmp eq i32 2, %5
+; CHECK-NEXT: %14 = select i1 %13, i8* %12, i8* %11
+; CHECK-NEXT: %15 = extractelement <4 x i8*> %0, i32 3
+; CHECK-NEXT: %16 = icmp eq i32 3, %5
+; CHECK-NEXT: %17 = select i1 %16, i8* %15, i8* %14
+; CHECK-NEXT: %18 = extractelement <4 x i8*> %1, i32 0
+; CHECK-NEXT: %19 = icmp eq i32 4, %5
+; CHECK-NEXT: %20 = select i1 %19, i8* %18, i8* %17
+; CHECK-NEXT: %21 = extractelement <4 x i8*> %1, i32 1
+; CHECK-NEXT: %22 = icmp eq i32 5, %5
+; CHECK-NEXT: %23 = select i1 %22, i8* %21, i8* %20
+; CHECK-NEXT: %24 = extractelement <4 x i8*> %1, i32 2
+; CHECK-NEXT: %25 = icmp eq i32 6, %5
+; CHECK-NEXT: %26 = select i1 %25, i8* %24, i8* %23
+; CHECK-NEXT: %27 = extractelement <4 x i8*> %1, i32 3
+; CHECK-NEXT: %28 = icmp eq i32 7, %5
+; CHECK-NEXT: %29 = select i1 %28, i8* %27, i8* %26
+; CHECK-NEXT: %30 = extractelement <4 x i8*> %2, i32 0
+; CHECK-NEXT: %31 = icmp eq i32 8, %5
+; CHECK-NEXT: %32 = select i1 %31, i8* %30, i8* %29
+; CHECK-NEXT: %33 = extractelement <4 x i8*> %2, i32 1
+; CHECK-NEXT: %34 = icmp eq i32 9, %5
+; CHECK-NEXT: %35 = select i1 %34, i8* %33, i8* %32
+; CHECK-NEXT: %36 = extractelement <4 x i8*> %2, i32 2
+; CHECK-NEXT: %37 = icmp eq i32 10, %5
+; CHECK-NEXT: %38 = select i1 %37, i8* %36, i8* %35
+; CHECK-NEXT: %39 = extractelement <4 x i8*> %2, i32 3
+; CHECK-NEXT: %40 = icmp eq i32 11, %5
+; CHECK-NEXT: %41 = select i1 %40, i8* %39, i8* %38
+; CHECK-NEXT: %42 = extractelement <4 x i8*> %3, i32 0
+; CHECK-NEXT: %43 = icmp eq i32 12, %5
+; CHECK-NEXT: %44 = select i1 %43, i8* %42, i8* %41
+; CHECK-NEXT: %45 = extractelement <4 x i8*> %3, i32 1
+; CHECK-NEXT: %46 = icmp eq i32 13, %5
+; CHECK-NEXT: %47 = select i1 %46, i8* %45, i8* %44
+; CHECK-NEXT: %48 = extractelement <4 x i8*> %3, i32 2
+; CHECK-NEXT: %49 = icmp eq i32 14, %5
+; CHECK-NEXT: %50 = select i1 %49, i8* %48, i8* %47
+; CHECK-NEXT: %51 = extractelement <4 x i8*> %3, i32 3
+; CHECK-NEXT: %52 = icmp eq i32 15, %5
+; CHECK-NEXT: %53 = select i1 %52, i8* %51, i8* %50
+; CHECK-NEXT: %54 = extractelement <4 x i8*> %4, i32 0
+; CHECK-NEXT: %55 = icmp eq i32 16, %5
+; CHECK-NEXT: %56 = select i1 %55, i8* %54, i8* %53
+; CHECK-NEXT: %57 = extractelement <4 x i8*> %4, i32 1
+; CHECK-NEXT: %58 = icmp eq i32 17, %5
+; CHECK-NEXT: %59 = select i1 %58, i8* %57, i8* %56
+; CHECK-NEXT: %60 = extractelement <4 x i8*> %4, i32 2
+; CHECK-NEXT: %61 = icmp eq i32 18, %5
+; CHECK-NEXT: %62 = select i1 %61, i8* %60, i8* %59
+; CHECK-NEXT: %63 = extractelement <4 x i8*> %4, i32 3
+; CHECK-NEXT: %64 = icmp eq i32 19, %5
+; CHECK-NEXT: %65 = select i1 %64, i8* %63, i8* %62
+; CHECK-NEXT: ret i8* %65
+; CHECK-NEXT: }
+
+define float @extract_20xfloat_var_idx(<20 x float>, i32) {
+entry:
+ %2 = extractelement <20 x float> %0, i32 %1
+ ret float %2
+}
+; CHECK-LABEL: define float @extract_20xfloat_var_idx(<4 x float>, <4 x float>, <4 x float>, <4 x float>, <4 x float>, i32) {
+; CHECK: entry:
+; CHECK-NEXT: %6 = extractelement <4 x float> %0, i32 0
+; CHECK-NEXT: %7 = icmp eq i32 0, %5
+; CHECK-NEXT: %8 = select i1 %7, float %6, float undef
+; CHECK-NEXT: %9 = extractelement <4 x float> %0, i32 1
+; CHECK-NEXT: %10 = icmp eq i32 1, %5
+; CHECK-NEXT: %11 = select i1 %10, float %9, float %8
+; CHECK-NEXT: %12 = extractelement <4 x float> %0, i32 2
+; CHECK-NEXT: %13 = icmp eq i32 2, %5
+; CHECK-NEXT: %14 = select i1 %13, float %12, float %11
+; CHECK-NEXT: %15 = extractelement <4 x float> %0, i32 3
+; CHECK-NEXT: %16 = icmp eq i32 3, %5
+; CHECK-NEXT: %17 = select i1 %16, float %15, float %14
+; CHECK-NEXT: %18 = extractelement <4 x float> %1, i32 0
+; CHECK-NEXT: %19 = icmp eq i32 4, %5
+; CHECK-NEXT: %20 = select i1 %19, float %18, float %17
+; CHECK-NEXT: %21 = extractelement <4 x float> %1, i32 1
+; CHECK-NEXT: %22 = icmp eq i32 5, %5
+; CHECK-NEXT: %23 = select i1 %22, float %21, float %20
+; CHECK-NEXT: %24 = extractelement <4 x float> %1, i32 2
+; CHECK-NEXT: %25 = icmp eq i32 6, %5
+; CHECK-NEXT: %26 = select i1 %25, float %24, float %23
+; CHECK-NEXT: %27 = extractelement <4 x float> %1, i32 3
+; CHECK-NEXT: %28 = icmp eq i32 7, %5
+; CHECK-NEXT: %29 = select i1 %28, float %27, float %26
+; CHECK-NEXT: %30 = extractelement <4 x float> %2, i32 0
+; CHECK-NEXT: %31 = icmp eq i32 8, %5
+; CHECK-NEXT: %32 = select i1 %31, float %30, float %29
+; CHECK-NEXT: %33 = extractelement <4 x float> %2, i32 1
+; CHECK-NEXT: %34 = icmp eq i32 9, %5
+; CHECK-NEXT: %35 = select i1 %34, float %33, float %32
+; CHECK-NEXT: %36 = extractelement <4 x float> %2, i32 2
+; CHECK-NEXT: %37 = icmp eq i32 10, %5
+; CHECK-NEXT: %38 = select i1 %37, float %36, float %35
+; CHECK-NEXT: %39 = extractelement <4 x float> %2, i32 3
+; CHECK-NEXT: %40 = icmp eq i32 11, %5
+; CHECK-NEXT: %41 = select i1 %40, float %39, float %38
+; CHECK-NEXT: %42 = extractelement <4 x float> %3, i32 0
+; CHECK-NEXT: %43 = icmp eq i32 12, %5
+; CHECK-NEXT: %44 = select i1 %43, float %42, float %41
+; CHECK-NEXT: %45 = extractelement <4 x float> %3, i32 1
+; CHECK-NEXT: %46 = icmp eq i32 13, %5
+; CHECK-NEXT: %47 = select i1 %46, float %45, float %44
+; CHECK-NEXT: %48 = extractelement <4 x float> %3, i32 2
+; CHECK-NEXT: %49 = icmp eq i32 14, %5
+; CHECK-NEXT: %50 = select i1 %49, float %48, float %47
+; CHECK-NEXT: %51 = extractelement <4 x float> %3, i32 3
+; CHECK-NEXT: %52 = icmp eq i32 15, %5
+; CHECK-NEXT: %53 = select i1 %52, float %51, float %50
+; CHECK-NEXT: %54 = extractelement <4 x float> %4, i32 0
+; CHECK-NEXT: %55 = icmp eq i32 16, %5
+; CHECK-NEXT: %56 = select i1 %55, float %54, float %53
+; CHECK-NEXT: %57 = extractelement <4 x float> %4, i32 1
+; CHECK-NEXT: %58 = icmp eq i32 17, %5
+; CHECK-NEXT: %59 = select i1 %58, float %57, float %56
+; CHECK-NEXT: %60 = extractelement <4 x float> %4, i32 2
+; CHECK-NEXT: %61 = icmp eq i32 18, %5
+; CHECK-NEXT: %62 = select i1 %61, float %60, float %59
+; CHECK-NEXT: %63 = extractelement <4 x float> %4, i32 3
+; CHECK-NEXT: %64 = icmp eq i32 19, %5
+; CHECK-NEXT: %65 = select i1 %64, float %63, float %62
+; CHECK-NEXT: ret float %65
+; CHECK-NEXT: }
+
+define double @extract_20xdouble_var_idx(<20 x double>, i32) {
+entry:
+ %2 = extractelement <20 x double> %0, i32 %1
+ ret double %2
+}
+; CHECK-LABEL: define double @extract_20xdouble_var_idx(<2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, <2 x double>, i32) {
+; CHECK: entry:
+; CHECK-NEXT: %11 = extractelement <2 x double> %0, i32 0
+; CHECK-NEXT: %12 = icmp eq i32 0, %10
+; CHECK-NEXT: %13 = select i1 %12, double %11, double undef
+; CHECK-NEXT: %14 = extractelement <2 x double> %0, i32 1
+; CHECK-NEXT: %15 = icmp eq i32 1, %10
+; CHECK-NEXT: %16 = select i1 %15, double %14, double %13
+; CHECK-NEXT: %17 = extractelement <2 x double> %1, i32 0
+; CHECK-NEXT: %18 = icmp eq i32 2, %10
+; CHECK-NEXT: %19 = select i1 %18, double %17, double %16
+; CHECK-NEXT: %20 = extractelement <2 x double> %1, i32 1
+; CHECK-NEXT: %21 = icmp eq i32 3, %10
+; CHECK-NEXT: %22 = select i1 %21, double %20, double %19
+; CHECK-NEXT: %23 = extractelement <2 x double> %2, i32 0
+; CHECK-NEXT: %24 = icmp eq i32 4, %10
+; CHECK-NEXT: %25 = select i1 %24, double %23, double %22
+; CHECK-NEXT: %26 = extractelement <2 x double> %2, i32 1
+; CHECK-NEXT: %27 = icmp eq i32 5, %10
+; CHECK-NEXT: %28 = select i1 %27, double %26, double %25
+; CHECK-NEXT: %29 = extractelement <2 x double> %3, i32 0
+; CHECK-NEXT: %30 = icmp eq i32 6, %10
+; CHECK-NEXT: %31 = select i1 %30, double %29, double %28
+; CHECK-NEXT: %32 = extractelement <2 x double> %3, i32 1
+; CHECK-NEXT: %33 = icmp eq i32 7, %10
+; CHECK-NEXT: %34 = select i1 %33, double %32, double %31
+; CHECK-NEXT: %35 = extractelement <2 x double> %4, i32 0
+; CHECK-NEXT: %36 = icmp eq i32 8, %10
+; CHECK-NEXT: %37 = select i1 %36, double %35, double %34
+; CHECK-NEXT: %38 = extractelement <2 x double> %4, i32 1
+; CHECK-NEXT: %39 = icmp eq i32 9, %10
+; CHECK-NEXT: %40 = select i1 %39, double %38, double %37
+; CHECK-NEXT: %41 = extractelement <2 x double> %5, i32 0
+; CHECK-NEXT: %42 = icmp eq i32 10, %10
+; CHECK-NEXT: %43 = select i1 %42, double %41, double %40
+; CHECK-NEXT: %44 = extractelement <2 x double> %5, i32 1
+; CHECK-NEXT: %45 = icmp eq i32 11, %10
+; CHECK-NEXT: %46 = select i1 %45, double %44, double %43
+; CHECK-NEXT: %47 = extractelement <2 x double> %6, i32 0
+; CHECK-NEXT: %48 = icmp eq i32 12, %10
+; CHECK-NEXT: %49 = select i1 %48, double %47, double %46
+; CHECK-NEXT: %50 = extractelement <2 x double> %6, i32 1
+; CHECK-NEXT: %51 = icmp eq i32 13, %10
+; CHECK-NEXT: %52 = select i1 %51, double %50, double %49
+; CHECK-NEXT: %53 = extractelement <2 x double> %7, i32 0
+; CHECK-NEXT: %54 = icmp eq i32 14, %10
+; CHECK-NEXT: %55 = select i1 %54, double %53, double %52
+; CHECK-NEXT: %56 = extractelement <2 x double> %7, i32 1
+; CHECK-NEXT: %57 = icmp eq i32 15, %10
+; CHECK-NEXT: %58 = select i1 %57, double %56, double %55
+; CHECK-NEXT: %59 = extractelement <2 x double> %8, i32 0
+; CHECK-NEXT: %60 = icmp eq i32 16, %10
+; CHECK-NEXT: %61 = select i1 %60, double %59, double %58
+; CHECK-NEXT: %62 = extractelement <2 x double> %8, i32 1
+; CHECK-NEXT: %63 = icmp eq i32 17, %10
+; CHECK-NEXT: %64 = select i1 %63, double %62, double %61
+; CHECK-NEXT: %65 = extractelement <2 x double> %9, i32 0
+; CHECK-NEXT: %66 = icmp eq i32 18, %10
+; CHECK-NEXT: %67 = select i1 %66, double %65, double %64
+; CHECK-NEXT: %68 = extractelement <2 x double> %9, i32 1
+; CHECK-NEXT: %69 = icmp eq i32 19, %10
+; CHECK-NEXT: %70 = select i1 %69, double %68, double %67
+; CHECK-NEXT: ret double %70
+; CHECK-NEXT: }
+
« no previous file with comments | « test/Transforms/NaCl/vector-canonicalization-cmps.ll ('k') | test/Transforms/NaCl/vector-canonicalization-inserts.ll » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698