[llvm] [VectorCombine][AMDGPU] Narrow Phi of Shuffles. (PR #140188)

Leon Clark via llvm-commits llvm-commits at lists.llvm.org
Wed Jul 9 08:49:37 PDT 2025


https://github.com/PeddleSpam updated https://github.com/llvm/llvm-project/pull/140188

>From 7c380e0edf811d988450fd66785c0ec0966788d5 Mon Sep 17 00:00:00 2001
From: Leon Clark <leoclark at amd.com>
Date: Fri, 16 May 2025 05:10:43 +0100
Subject: [PATCH 01/14] [VectorCombine][AMDGPU] Narrow Phi of Shuffles.

---
 .../AMDGPU/narrow-phi-of-shuffles.ll          | 1266 +++++++++++++++++
 1 file changed, 1266 insertions(+)
 create mode 100644 llvm/test/Transforms/VectorCombine/AMDGPU/narrow-phi-of-shuffles.ll

diff --git a/llvm/test/Transforms/VectorCombine/AMDGPU/narrow-phi-of-shuffles.ll b/llvm/test/Transforms/VectorCombine/AMDGPU/narrow-phi-of-shuffles.ll
new file mode 100644
index 0000000000000..1b879d53202c0
--- /dev/null
+++ b/llvm/test/Transforms/VectorCombine/AMDGPU/narrow-phi-of-shuffles.ll
@@ -0,0 +1,1266 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
+; RUN: opt < %s -passes=vector-combine -S -mtriple=amdgcn-amd-amdhsa | FileCheck %s --check-prefixes=CHECK
+
+define <2 x i8> @shuffle_v2i8(<2 x i8> %arg0, i1 %cond) {
+; CHECK-LABEL: define <2 x i8> @shuffle_v2i8(
+; CHECK-SAME: <2 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i8> [[ARG0]], <2 x i8> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i8> [[ARG0]], <2 x i8> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <2 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <2 x i8> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <2 x i8> %arg0, <2 x i8> poison, <2 x i32> <i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <2 x i8> %arg0, <2 x i8> poison, <2 x i32> <i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <2 x i8> [ %val1, %then ], [ %val2, %else ]
+  ret <2 x i8> %val3
+}
+
+define <4 x i8> @shuffle_v4i8(<3 x i8> %arg0, i1 %cond) {
+; CHECK-LABEL: define <4 x i8> @shuffle_v4i8(
+; CHECK-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <4 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <4 x i8> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <4 x i8> [ %val1, %then ], [ %val2, %else ]
+  ret <4 x i8> %val3
+}
+
+define <8 x i8> @shuffle_v8i8(<3 x i8> %arg0, i1 %cond) {
+; CHECK-LABEL: define <8 x i8> @shuffle_v8i8(
+; CHECK-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <8 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <8 x i8> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <8 x i8> [ %val1, %then ], [ %val2, %else ]
+  ret <8 x i8> %val3
+}
+
+define <16 x i8> @shuffle_v16i8(<3 x i8> %arg0, i1 %cond) {
+; CHECK-LABEL: define <16 x i8> @shuffle_v16i8(
+; CHECK-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <16 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <16 x i8> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <16 x i8> [ %val1, %then ], [ %val2, %else ]
+  ret <16 x i8> %val3
+}
+
+define <32 x i8> @shuffle_v32i8(<3 x i8> %arg0, i1 %cond) {
+; CHECK-LABEL: define <32 x i8> @shuffle_v32i8(
+; CHECK-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <32 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <32 x i8> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <32 x i8> [ %val1, %then ], [ %val2, %else ]
+  ret <32 x i8> %val3
+}
+
+define <2 x i16> @shuffle_v2i16(<2 x i16> %arg0, i1 %cond) {
+; CHECK-LABEL: define <2 x i16> @shuffle_v2i16(
+; CHECK-SAME: <2 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i16> [[ARG0]], <2 x i16> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i16> [[ARG0]], <2 x i16> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <2 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <2 x i16> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <2 x i16> %arg0, <2 x i16> poison, <2 x i32> <i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <2 x i16> %arg0, <2 x i16> poison, <2 x i32> <i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <2 x i16> [ %val1, %then ], [ %val2, %else ]
+  ret <2 x i16> %val3
+}
+
+define <4 x i16> @shuffle_v4i16(<3 x i16> %arg0, i1 %cond) {
+; CHECK-LABEL: define <4 x i16> @shuffle_v4i16(
+; CHECK-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <4 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <4 x i16> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <4 x i16> [ %val1, %then ], [ %val2, %else ]
+  ret <4 x i16> %val3
+}
+
+define <8 x i16> @shuffle_v8i16(<3 x i16> %arg0, i1 %cond) {
+; CHECK-LABEL: define <8 x i16> @shuffle_v8i16(
+; CHECK-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <8 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <8 x i16> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <8 x i16> [ %val1, %then ], [ %val2, %else ]
+  ret <8 x i16> %val3
+}
+
+define <16 x i16> @shuffle_v16i16(<3 x i16> %arg0, i1 %cond) {
+; CHECK-LABEL: define <16 x i16> @shuffle_v16i16(
+; CHECK-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <16 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <16 x i16> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <16 x i16> [ %val1, %then ], [ %val2, %else ]
+  ret <16 x i16> %val3
+}
+
+define <32 x i16> @shuffle_v32i16(<3 x i16> %arg0, i1 %cond) {
+; CHECK-LABEL: define <32 x i16> @shuffle_v32i16(
+; CHECK-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <32 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <32 x i16> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <32 x i16> [ %val1, %then ], [ %val2, %else ]
+  ret <32 x i16> %val3
+}
+
+define <2 x i32> @shuffle_v2i32(<2 x i32> %arg0, i1 %cond) {
+; CHECK-LABEL: define <2 x i32> @shuffle_v2i32(
+; CHECK-SAME: <2 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i32> [[ARG0]], <2 x i32> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i32> [[ARG0]], <2 x i32> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <2 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <2 x i32> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <2 x i32> %arg0, <2 x i32> poison, <2 x i32> <i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <2 x i32> %arg0, <2 x i32> poison, <2 x i32> <i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <2 x i32> [ %val1, %then ], [ %val2, %else ]
+  ret <2 x i32> %val3
+}
+
+define <4 x i32> @shuffle_v4i32(<3 x i32> %arg0, i1 %cond) {
+; CHECK-LABEL: define <4 x i32> @shuffle_v4i32(
+; CHECK-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <4 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <4 x i32> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <4 x i32> [ %val1, %then ], [ %val2, %else ]
+  ret <4 x i32> %val3
+}
+
+define <8 x i32> @shuffle_v8i32(<3 x i32> %arg0, i1 %cond) {
+; CHECK-LABEL: define <8 x i32> @shuffle_v8i32(
+; CHECK-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <8 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <8 x i32> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <8 x i32> [ %val1, %then ], [ %val2, %else ]
+  ret <8 x i32> %val3
+}
+
+define <16 x i32> @shuffle_v16i32(<3 x i32> %arg0, i1 %cond) {
+; CHECK-LABEL: define <16 x i32> @shuffle_v16i32(
+; CHECK-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <16 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <16 x i32> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <16 x i32> [ %val1, %then ], [ %val2, %else ]
+  ret <16 x i32> %val3
+}
+
+define <32 x i32> @shuffle_v32i32(<3 x i32> %arg0, i1 %cond) {
+; CHECK-LABEL: define <32 x i32> @shuffle_v32i32(
+; CHECK-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <32 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <32 x i32> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <32 x i32> [ %val1, %then ], [ %val2, %else ]
+  ret <32 x i32> %val3
+}
+
+define <2 x bfloat> @shuffle_v2bf16(<2 x bfloat> %arg0, i1 %cond) {
+; CHECK-LABEL: define <2 x bfloat> @shuffle_v2bf16(
+; CHECK-SAME: <2 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <2 x bfloat> [[ARG0]], <2 x bfloat> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <2 x bfloat> [[ARG0]], <2 x bfloat> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <2 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <2 x bfloat> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <2 x bfloat> %arg0, <2 x bfloat> poison, <2 x i32> <i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <2 x bfloat> %arg0, <2 x bfloat> poison, <2 x i32> <i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <2 x bfloat> [ %val1, %then ], [ %val2, %else ]
+  ret <2 x bfloat> %val3
+}
+
+define <3 x bfloat> @shuffle_v3bf16(<3 x bfloat> %arg0, i1 %cond) {
+; CHECK-LABEL: define <3 x bfloat> @shuffle_v3bf16(
+; CHECK-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <3 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <3 x bfloat> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <3 x i32> <i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <3 x i32> <i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <3 x bfloat> [ %val1, %then ], [ %val2, %else ]
+  ret <3 x bfloat> %val3
+}
+
+define <4 x bfloat> @shuffle_v4bf16(<3 x bfloat> %arg0, i1 %cond) {
+; CHECK-LABEL: define <4 x bfloat> @shuffle_v4bf16(
+; CHECK-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <4 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <4 x bfloat> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <4 x bfloat> [ %val1, %then ], [ %val2, %else ]
+  ret <4 x bfloat> %val3
+}
+
+define <6 x bfloat> @shuffle_v6bf16(<3 x bfloat> %arg0, i1 %cond) {
+; CHECK-LABEL: define <6 x bfloat> @shuffle_v6bf16(
+; CHECK-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <6 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <6 x bfloat> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <6 x bfloat> [ %val1, %then ], [ %val2, %else ]
+  ret <6 x bfloat> %val3
+}
+
+define <8 x bfloat> @shuffle_v8bf16(<3 x bfloat> %arg0, i1 %cond) {
+; CHECK-LABEL: define <8 x bfloat> @shuffle_v8bf16(
+; CHECK-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <8 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <8 x bfloat> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <8 x bfloat> [ %val1, %then ], [ %val2, %else ]
+  ret <8 x bfloat> %val3
+}
+
+define <16 x bfloat> @shuffle_v16bf16(<3 x bfloat> %arg0, i1 %cond) {
+; CHECK-LABEL: define <16 x bfloat> @shuffle_v16bf16(
+; CHECK-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <16 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <16 x bfloat> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <16 x bfloat> [ %val1, %then ], [ %val2, %else ]
+  ret <16 x bfloat> %val3
+}
+
+define <32 x bfloat> @shuffle_v32bf16(<3 x bfloat> %arg0, i1 %cond) {
+; CHECK-LABEL: define <32 x bfloat> @shuffle_v32bf16(
+; CHECK-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <32 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <32 x bfloat> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <32 x bfloat> [ %val1, %then ], [ %val2, %else ]
+  ret <32 x bfloat> %val3
+}
+
+define <2 x half> @shuffle_v2f16(<2 x half> %arg0, i1 %cond) {
+; CHECK-LABEL: define <2 x half> @shuffle_v2f16(
+; CHECK-SAME: <2 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <2 x half> [[ARG0]], <2 x half> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <2 x half> [[ARG0]], <2 x half> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <2 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <2 x half> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <2 x half> %arg0, <2 x half> poison, <2 x i32> <i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <2 x half> %arg0, <2 x half> poison, <2 x i32> <i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <2 x half> [ %val1, %then ], [ %val2, %else ]
+  ret <2 x half> %val3
+}
+
+define <3 x half> @shuffle_v3f16(<3 x half> %arg0, i1 %cond) {
+; CHECK-LABEL: define <3 x half> @shuffle_v3f16(
+; CHECK-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <3 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <3 x half> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x half> %arg0, <3 x half> poison, <3 x i32> <i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <3 x i32> <i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <3 x half> [ %val1, %then ], [ %val2, %else ]
+  ret <3 x half> %val3
+}
+
+define <4 x half> @shuffle_v4f16(<3 x half> %arg0, i1 %cond) {
+; CHECK-LABEL: define <4 x half> @shuffle_v4f16(
+; CHECK-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <4 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <4 x half> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x half> %arg0, <3 x half> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <4 x half> [ %val1, %then ], [ %val2, %else ]
+  ret <4 x half> %val3
+}
+
+define <6 x half> @shuffle_v6f16(<3 x half> %arg0, i1 %cond) {
+; CHECK-LABEL: define <6 x half> @shuffle_v6f16(
+; CHECK-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <6 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <6 x half> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x half> %arg0, <3 x half> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <6 x half> [ %val1, %then ], [ %val2, %else ]
+  ret <6 x half> %val3
+}
+
+define <8 x half> @shuffle_v8f16(<3 x half> %arg0, i1 %cond) {
+; CHECK-LABEL: define <8 x half> @shuffle_v8f16(
+; CHECK-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <8 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <8 x half> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x half> %arg0, <3 x half> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <8 x half> [ %val1, %then ], [ %val2, %else ]
+  ret <8 x half> %val3
+}
+
+define <16 x half> @shuffle_v16f16(<3 x half> %arg0, i1 %cond) {
+; CHECK-LABEL: define <16 x half> @shuffle_v16f16(
+; CHECK-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <16 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <16 x half> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x half> %arg0, <3 x half> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <16 x half> [ %val1, %then ], [ %val2, %else ]
+  ret <16 x half> %val3
+}
+
+define <32 x half> @shuffle_v32f16(<3 x half> %arg0, i1 %cond) {
+; CHECK-LABEL: define <32 x half> @shuffle_v32f16(
+; CHECK-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <32 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <32 x half> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x half> %arg0, <3 x half> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <32 x half> [ %val1, %then ], [ %val2, %else ]
+  ret <32 x half> %val3
+}
+
+define <2 x float> @shuffle_v2f32(<2 x float> %arg0, i1 %cond) {
+; CHECK-LABEL: define <2 x float> @shuffle_v2f32(
+; CHECK-SAME: <2 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <2 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <2 x float> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <2 x float> %arg0, <2 x float> poison, <2 x i32> <i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <2 x float> %arg0, <2 x float> poison, <2 x i32> <i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <2 x float> [ %val1, %then ], [ %val2, %else ]
+  ret <2 x float> %val3
+}
+
+define <3 x float> @shuffle_v3f32(<3 x float> %arg0, i1 %cond) {
+; CHECK-LABEL: define <3 x float> @shuffle_v3f32(
+; CHECK-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <3 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <3 x float> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x float> %arg0, <3 x float> poison, <3 x i32> <i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <3 x i32> <i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <3 x float> [ %val1, %then ], [ %val2, %else ]
+  ret <3 x float> %val3
+}
+
+define <4 x float> @shuffle_v4f32(<3 x float> %arg0, i1 %cond) {
+; CHECK-LABEL: define <4 x float> @shuffle_v4f32(
+; CHECK-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <4 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <4 x float> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x float> %arg0, <3 x float> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <4 x float> [ %val1, %then ], [ %val2, %else ]
+  ret <4 x float> %val3
+}
+
+define <6 x float> @shuffle_v6f32(<3 x float> %arg0, i1 %cond) {
+; CHECK-LABEL: define <6 x float> @shuffle_v6f32(
+; CHECK-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <6 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <6 x float> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x float> %arg0, <3 x float> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <6 x float> [ %val1, %then ], [ %val2, %else ]
+  ret <6 x float> %val3
+}
+
+define <8 x float> @shuffle_v8f32(<3 x float> %arg0, i1 %cond) {
+; CHECK-LABEL: define <8 x float> @shuffle_v8f32(
+; CHECK-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <8 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <8 x float> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x float> %arg0, <3 x float> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <8 x float> [ %val1, %then ], [ %val2, %else ]
+  ret <8 x float> %val3
+}
+
+define <16 x float> @shuffle_v16f32(<3 x float> %arg0, i1 %cond) {
+; CHECK-LABEL: define <16 x float> @shuffle_v16f32(
+; CHECK-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <16 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <16 x float> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x float> %arg0, <3 x float> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <16 x float> [ %val1, %then ], [ %val2, %else ]
+  ret <16 x float> %val3
+}
+
+define <32 x float> @shuffle_v32f32(<3 x float> %arg0, i1 %cond) {
+; CHECK-LABEL: define <32 x float> @shuffle_v32f32(
+; CHECK-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <32 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <32 x float> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x float> %arg0, <3 x float> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <32 x float> [ %val1, %then ], [ %val2, %else ]
+  ret <32 x float> %val3
+}
+
+declare void @func0() local_unnamed_addr
+
+declare void @func1() local_unnamed_addr

>From 23dbed15faf5af217e681815fff2f81ca27249fa Mon Sep 17 00:00:00 2001
From: Leon Clark <leoclark at amd.com>
Date: Fri, 16 May 2025 05:50:36 +0100
Subject: [PATCH 02/14] Add VectorCombine transform and update tests.

---
 .../Transforms/Vectorize/VectorCombine.cpp    | 107 ++++++++++++++++++
 .../AMDGPU/narrow-phi-of-shuffles.ll          |  54 ++++-----
 2 files changed, 134 insertions(+), 27 deletions(-)

diff --git a/llvm/lib/Transforms/Vectorize/VectorCombine.cpp b/llvm/lib/Transforms/Vectorize/VectorCombine.cpp
index fe8d74c43dfdc..5c738e6529ac7 100644
--- a/llvm/lib/Transforms/Vectorize/VectorCombine.cpp
+++ b/llvm/lib/Transforms/Vectorize/VectorCombine.cpp
@@ -137,6 +137,7 @@ class VectorCombine {
   bool foldSelectShuffle(Instruction &I, bool FromReduction = false);
   bool foldInterleaveIntrinsics(Instruction &I);
   bool shrinkType(Instruction &I);
+  bool shrinkPhiOfShuffles(Instruction &I);
 
   void replaceValue(Value &Old, Value &New) {
     LLVM_DEBUG(dbgs() << "VC: Replacing: " << Old << '\n');
@@ -3691,6 +3692,109 @@ bool VectorCombine::foldInterleaveIntrinsics(Instruction &I) {
   return true;
 }
 
+// Attempt to narrow a phi of shufflevector instructions where the two incoming
+// values have the same operands but different masks. If the two shuffle masks
+// are offsets of one another we can use one branch to rotate the incoming
+// vector and perform one larger shuffle after the phi.
+bool VectorCombine::shrinkPhiOfShuffles(Instruction &I) {
+  auto *Phi = dyn_cast<PHINode>(&I);
+  if (!Phi || Phi->getNumIncomingValues() != 2u)
+    return false;
+
+  auto *Shuf0 = dyn_cast<ShuffleVectorInst>(Phi->getOperand(0u));
+  auto *Shuf1 = dyn_cast<ShuffleVectorInst>(Phi->getOperand(1u));
+  if (!Shuf0 || !Shuf1)
+    return false;
+
+  if (!Shuf0->hasOneUse() && !Shuf1->hasOneUse())
+    return false;
+
+  auto *Shuf0Op0 = Shuf0->getOperand(0u);
+  auto *Shuf0Op1 = Shuf0->getOperand(1u);
+  auto *Shuf1Op0 = Shuf1->getOperand(0u);
+  auto *Shuf1Op1 = Shuf1->getOperand(1u);
+
+  auto IsPoison = [](Value *Val) -> bool {
+    return isa<PoisonValue>(Val) || isa<UndefValue>(Val);
+  };
+
+  if (Shuf0Op0 != Shuf1Op0 || !IsPoison(Shuf0Op1) || !IsPoison(Shuf1Op1))
+    return false;
+
+  // Ensure result vectors are wider than the argument vector.
+  auto *InputVT = cast<FixedVectorType>(Shuf0Op0->getType());
+  auto *ResultVT = cast<FixedVectorType>(Shuf0->getType());
+  auto const InputNumElements = InputVT->getNumElements();
+
+  if (InputNumElements >= ResultVT->getNumElements())
+    return false;
+
+  // Take the difference of the two shuffle masks at each index. Ignore poison
+  // values at the same index in both masks.
+  auto Mask0 = Shuf0->getShuffleMask();
+  auto Mask1 = Shuf1->getShuffleMask();
+  auto NewMask0 = std::vector<int>();
+  NewMask0.reserve(Mask0.size());
+
+  for (auto I = 0u; I < Mask0.size(); ++I) {
+    if (Mask0[I] >= 0 && Mask1[I] >= 0)
+      NewMask0.push_back(Mask0[I] - Mask1[I]);
+    else if (Mask0[I] == -1 && Mask1[I] == -1)
+      continue;
+    else
+      return false;
+  }
+
+  if (NewMask0.empty() ||
+      !std::equal(NewMask0.begin() + 1u, NewMask0.end(), NewMask0.begin()))
+    return false;
+
+  // Create new mask using difference of the two incoming masks.
+  auto MaskOffset = NewMask0[0u];
+  if (!Shuf0->hasOneUse()) {
+    std::swap(Shuf0, Shuf1);
+    std::swap(Mask0, Mask1);
+    MaskOffset *= -1;
+  }
+
+  auto Index = (InputNumElements - MaskOffset) % InputNumElements;
+  NewMask0.clear();
+
+  for (auto I = 0u; I < InputNumElements; ++I) {
+    NewMask0.push_back(Index);
+    Index = (Index + 1u) % InputNumElements;
+  }
+
+  // Calculate costs for worst cases and compare.
+  auto const Kind = TTI::SK_PermuteSingleSrc;
+  auto OldCost = std::max(TTI.getShuffleCost(Kind, InputVT, Mask0, CostKind),
+                          TTI.getShuffleCost(Kind, InputVT, Mask1, CostKind));
+  auto NewCost = TTI.getShuffleCost(Kind, InputVT, NewMask0, CostKind) +
+                 TTI.getShuffleCost(Kind, InputVT, Mask1, CostKind);
+
+  if (NewCost > OldCost)
+    return false;
+
+  // Create new shuffles and narrowed phi.
+  auto Builder = IRBuilder(&I);
+  Builder.SetInsertPoint(Shuf0);
+  Builder.SetCurrentDebugLocation(Shuf0->getDebugLoc());
+  auto *NewShuf0 = Builder.CreateShuffleVector(Shuf0Op0, Shuf0Op1, NewMask0);
+
+  Builder.SetInsertPoint(Phi);
+  Builder.SetCurrentDebugLocation(Phi->getDebugLoc());
+  auto *NewPhi = Builder.CreatePHI(NewShuf0->getType(), 2u);
+  NewPhi->addIncoming(NewShuf0, Phi->getIncomingBlock(0u));
+  NewPhi->addIncoming(Shuf1Op0, Phi->getIncomingBlock(1u));
+
+  Builder.SetInsertPoint(*NewPhi->getInsertionPointAfterDef());
+  auto *NewPoison = PoisonValue::get(NewPhi->getType());
+  auto *NewShuf2 = Builder.CreateShuffleVector(NewPhi, NewPoison, Mask1);
+
+  replaceValue(*Phi, *NewShuf2);
+  return true;
+}
+
 /// This is the entry point for all transforms. Pass manager differences are
 /// handled in the callers of this function.
 bool VectorCombine::run() {
@@ -3775,6 +3879,9 @@ bool VectorCombine::run() {
       case Instruction::Xor:
         MadeChange |= foldBitOpOfBitcasts(I);
         break;
+      case Instruction::PHI:
+        MadeChange |= shrinkPhiOfShuffles(I);
+        break;
       default:
         MadeChange |= shrinkType(I);
         break;
diff --git a/llvm/test/Transforms/VectorCombine/AMDGPU/narrow-phi-of-shuffles.ll b/llvm/test/Transforms/VectorCombine/AMDGPU/narrow-phi-of-shuffles.ll
index 1b879d53202c0..9b4c4fc9a702d 100644
--- a/llvm/test/Transforms/VectorCombine/AMDGPU/narrow-phi-of-shuffles.ll
+++ b/llvm/test/Transforms/VectorCombine/AMDGPU/narrow-phi-of-shuffles.ll
@@ -392,15 +392,15 @@ define <4 x i32> @shuffle_v4i32(<3 x i32> %arg0, i1 %cond) {
 ; CHECK-NEXT:  [[ENTRY:.*:]]
 ; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
 ; CHECK:       [[THEN]]:
-; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    [[TMP0:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <3 x i32> <i32 1, i32 2, i32 0>
 ; CHECK-NEXT:    tail call void @func0()
 ; CHECK-NEXT:    br label %[[FINALLY:.*]]
 ; CHECK:       [[ELSE]]:
-; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
 ; CHECK-NEXT:    tail call void @func1()
 ; CHECK-NEXT:    br label %[[FINALLY]]
 ; CHECK:       [[FINALLY]]:
-; CHECK-NEXT:    [[VAL3:%.*]] = phi <4 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    [[TMP1:%.*]] = phi <3 x i32> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-NEXT:    [[VAL3:%.*]] = shufflevector <3 x i32> [[TMP1]], <3 x i32> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
 ; CHECK-NEXT:    ret <4 x i32> [[VAL3]]
 ;
 entry:
@@ -427,15 +427,15 @@ define <8 x i32> @shuffle_v8i32(<3 x i32> %arg0, i1 %cond) {
 ; CHECK-NEXT:  [[ENTRY:.*:]]
 ; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
 ; CHECK:       [[THEN]]:
-; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    [[TMP0:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <3 x i32> <i32 1, i32 2, i32 0>
 ; CHECK-NEXT:    tail call void @func0()
 ; CHECK-NEXT:    br label %[[FINALLY:.*]]
 ; CHECK:       [[ELSE]]:
-; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-NEXT:    tail call void @func1()
 ; CHECK-NEXT:    br label %[[FINALLY]]
 ; CHECK:       [[FINALLY]]:
-; CHECK-NEXT:    [[VAL3:%.*]] = phi <8 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    [[TMP1:%.*]] = phi <3 x i32> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-NEXT:    [[VAL3:%.*]] = shufflevector <3 x i32> [[TMP1]], <3 x i32> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-NEXT:    ret <8 x i32> [[VAL3]]
 ;
 entry:
@@ -462,15 +462,15 @@ define <16 x i32> @shuffle_v16i32(<3 x i32> %arg0, i1 %cond) {
 ; CHECK-NEXT:  [[ENTRY:.*:]]
 ; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
 ; CHECK:       [[THEN]]:
-; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    [[TMP0:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <3 x i32> <i32 1, i32 2, i32 0>
 ; CHECK-NEXT:    tail call void @func0()
 ; CHECK-NEXT:    br label %[[FINALLY:.*]]
 ; CHECK:       [[ELSE]]:
-; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-NEXT:    tail call void @func1()
 ; CHECK-NEXT:    br label %[[FINALLY]]
 ; CHECK:       [[FINALLY]]:
-; CHECK-NEXT:    [[VAL3:%.*]] = phi <16 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    [[TMP1:%.*]] = phi <3 x i32> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-NEXT:    [[VAL3:%.*]] = shufflevector <3 x i32> [[TMP1]], <3 x i32> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-NEXT:    ret <16 x i32> [[VAL3]]
 ;
 entry:
@@ -497,15 +497,15 @@ define <32 x i32> @shuffle_v32i32(<3 x i32> %arg0, i1 %cond) {
 ; CHECK-NEXT:  [[ENTRY:.*:]]
 ; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
 ; CHECK:       [[THEN]]:
-; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    [[TMP0:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <3 x i32> <i32 1, i32 2, i32 0>
 ; CHECK-NEXT:    tail call void @func0()
 ; CHECK-NEXT:    br label %[[FINALLY:.*]]
 ; CHECK:       [[ELSE]]:
-; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-NEXT:    tail call void @func1()
 ; CHECK-NEXT:    br label %[[FINALLY]]
 ; CHECK:       [[FINALLY]]:
-; CHECK-NEXT:    [[VAL3:%.*]] = phi <32 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    [[TMP1:%.*]] = phi <3 x i32> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-NEXT:    [[VAL3:%.*]] = shufflevector <3 x i32> [[TMP1]], <3 x i32> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-NEXT:    ret <32 x i32> [[VAL3]]
 ;
 entry:
@@ -1092,15 +1092,15 @@ define <4 x float> @shuffle_v4f32(<3 x float> %arg0, i1 %cond) {
 ; CHECK-NEXT:  [[ENTRY:.*:]]
 ; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
 ; CHECK:       [[THEN]]:
-; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    [[TMP0:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 1, i32 2, i32 0>
 ; CHECK-NEXT:    tail call void @func0()
 ; CHECK-NEXT:    br label %[[FINALLY:.*]]
 ; CHECK:       [[ELSE]]:
-; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
 ; CHECK-NEXT:    tail call void @func1()
 ; CHECK-NEXT:    br label %[[FINALLY]]
 ; CHECK:       [[FINALLY]]:
-; CHECK-NEXT:    [[VAL3:%.*]] = phi <4 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    [[TMP1:%.*]] = phi <3 x float> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-NEXT:    [[VAL3:%.*]] = shufflevector <3 x float> [[TMP1]], <3 x float> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
 ; CHECK-NEXT:    ret <4 x float> [[VAL3]]
 ;
 entry:
@@ -1127,15 +1127,15 @@ define <6 x float> @shuffle_v6f32(<3 x float> %arg0, i1 %cond) {
 ; CHECK-NEXT:  [[ENTRY:.*:]]
 ; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
 ; CHECK:       [[THEN]]:
-; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    [[TMP0:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 1, i32 2, i32 0>
 ; CHECK-NEXT:    tail call void @func0()
 ; CHECK-NEXT:    br label %[[FINALLY:.*]]
 ; CHECK:       [[ELSE]]:
-; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-NEXT:    tail call void @func1()
 ; CHECK-NEXT:    br label %[[FINALLY]]
 ; CHECK:       [[FINALLY]]:
-; CHECK-NEXT:    [[VAL3:%.*]] = phi <6 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    [[TMP1:%.*]] = phi <3 x float> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-NEXT:    [[VAL3:%.*]] = shufflevector <3 x float> [[TMP1]], <3 x float> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-NEXT:    ret <6 x float> [[VAL3]]
 ;
 entry:
@@ -1162,15 +1162,15 @@ define <8 x float> @shuffle_v8f32(<3 x float> %arg0, i1 %cond) {
 ; CHECK-NEXT:  [[ENTRY:.*:]]
 ; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
 ; CHECK:       [[THEN]]:
-; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    [[TMP0:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 1, i32 2, i32 0>
 ; CHECK-NEXT:    tail call void @func0()
 ; CHECK-NEXT:    br label %[[FINALLY:.*]]
 ; CHECK:       [[ELSE]]:
-; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-NEXT:    tail call void @func1()
 ; CHECK-NEXT:    br label %[[FINALLY]]
 ; CHECK:       [[FINALLY]]:
-; CHECK-NEXT:    [[VAL3:%.*]] = phi <8 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    [[TMP1:%.*]] = phi <3 x float> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-NEXT:    [[VAL3:%.*]] = shufflevector <3 x float> [[TMP1]], <3 x float> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-NEXT:    ret <8 x float> [[VAL3]]
 ;
 entry:
@@ -1197,15 +1197,15 @@ define <16 x float> @shuffle_v16f32(<3 x float> %arg0, i1 %cond) {
 ; CHECK-NEXT:  [[ENTRY:.*:]]
 ; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
 ; CHECK:       [[THEN]]:
-; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    [[TMP0:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 1, i32 2, i32 0>
 ; CHECK-NEXT:    tail call void @func0()
 ; CHECK-NEXT:    br label %[[FINALLY:.*]]
 ; CHECK:       [[ELSE]]:
-; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-NEXT:    tail call void @func1()
 ; CHECK-NEXT:    br label %[[FINALLY]]
 ; CHECK:       [[FINALLY]]:
-; CHECK-NEXT:    [[VAL3:%.*]] = phi <16 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    [[TMP1:%.*]] = phi <3 x float> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-NEXT:    [[VAL3:%.*]] = shufflevector <3 x float> [[TMP1]], <3 x float> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-NEXT:    ret <16 x float> [[VAL3]]
 ;
 entry:
@@ -1232,15 +1232,15 @@ define <32 x float> @shuffle_v32f32(<3 x float> %arg0, i1 %cond) {
 ; CHECK-NEXT:  [[ENTRY:.*:]]
 ; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
 ; CHECK:       [[THEN]]:
-; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    [[TMP0:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 1, i32 2, i32 0>
 ; CHECK-NEXT:    tail call void @func0()
 ; CHECK-NEXT:    br label %[[FINALLY:.*]]
 ; CHECK:       [[ELSE]]:
-; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-NEXT:    tail call void @func1()
 ; CHECK-NEXT:    br label %[[FINALLY]]
 ; CHECK:       [[FINALLY]]:
-; CHECK-NEXT:    [[VAL3:%.*]] = phi <32 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    [[TMP1:%.*]] = phi <3 x float> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-NEXT:    [[VAL3:%.*]] = shufflevector <3 x float> [[TMP1]], <3 x float> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-NEXT:    ret <32 x float> [[VAL3]]
 ;
 entry:

>From efb271e865d889851b5b52dfeb378f43b22945b4 Mon Sep 17 00:00:00 2001
From: Leon Clark <leoclark at amd.com>
Date: Mon, 19 May 2025 14:34:35 +0100
Subject: [PATCH 03/14] Address review comments.

---
 .../Transforms/Vectorize/VectorCombine.cpp    | 63 ++++++++-----------
 1 file changed, 27 insertions(+), 36 deletions(-)

diff --git a/llvm/lib/Transforms/Vectorize/VectorCombine.cpp b/llvm/lib/Transforms/Vectorize/VectorCombine.cpp
index 5c738e6529ac7..f09b1ad5e8246 100644
--- a/llvm/lib/Transforms/Vectorize/VectorCombine.cpp
+++ b/llvm/lib/Transforms/Vectorize/VectorCombine.cpp
@@ -3706,23 +3706,16 @@ bool VectorCombine::shrinkPhiOfShuffles(Instruction &I) {
   if (!Shuf0 || !Shuf1)
     return false;
 
-  if (!Shuf0->hasOneUse() && !Shuf1->hasOneUse())
-    return false;
-
-  auto *Shuf0Op0 = Shuf0->getOperand(0u);
-  auto *Shuf0Op1 = Shuf0->getOperand(1u);
-  auto *Shuf1Op0 = Shuf1->getOperand(0u);
-  auto *Shuf1Op1 = Shuf1->getOperand(1u);
-
-  auto IsPoison = [](Value *Val) -> bool {
-    return isa<PoisonValue>(Val) || isa<UndefValue>(Val);
-  };
+  Value *Op0 = nullptr;
+  Value *Op1 = nullptr;
 
-  if (Shuf0Op0 != Shuf1Op0 || !IsPoison(Shuf0Op1) || !IsPoison(Shuf1Op1))
+  if (!match(Shuf0, m_OneUse(m_Shuffle(m_Value(Op0), m_Poison()))) ||
+      !match(Shuf1, m_OneUse(m_Shuffle(m_Value(Op1), m_Poison()))) ||
+      Op0 != Op1)
     return false;
 
   // Ensure result vectors are wider than the argument vector.
-  auto *InputVT = cast<FixedVectorType>(Shuf0Op0->getType());
+  auto *InputVT = cast<FixedVectorType>(Op0->getType());
   auto *ResultVT = cast<FixedVectorType>(Shuf0->getType());
   auto const InputNumElements = InputVT->getNumElements();
 
@@ -3731,37 +3724,34 @@ bool VectorCombine::shrinkPhiOfShuffles(Instruction &I) {
 
   // Take the difference of the two shuffle masks at each index. Ignore poison
   // values at the same index in both masks.
-  auto Mask0 = Shuf0->getShuffleMask();
-  auto Mask1 = Shuf1->getShuffleMask();
-  auto NewMask0 = std::vector<int>();
-  NewMask0.reserve(Mask0.size());
+  ArrayRef Mask0 = Shuf0->getShuffleMask();
+  ArrayRef Mask1 = Shuf1->getShuffleMask();
+  SmallVector<int, 16> NewMask;
+  NewMask.reserve(Mask0.size());
 
   for (auto I = 0u; I < Mask0.size(); ++I) {
     if (Mask0[I] >= 0 && Mask1[I] >= 0)
-      NewMask0.push_back(Mask0[I] - Mask1[I]);
+      NewMask.push_back(Mask0[I] - Mask1[I]);
     else if (Mask0[I] == -1 && Mask1[I] == -1)
       continue;
     else
       return false;
   }
 
-  if (NewMask0.empty() ||
-      !std::equal(NewMask0.begin() + 1u, NewMask0.end(), NewMask0.begin()))
+  // Ensure all elements of the new mask are equal. If the difference between
+  // the incoming mask elements is the same, the two must be constant offsets
+  // of one another.
+  if (NewMask.empty() ||
+      !std::equal(NewMask.begin() + 1u, NewMask.end(), NewMask.begin()))
     return false;
 
   // Create new mask using difference of the two incoming masks.
-  auto MaskOffset = NewMask0[0u];
-  if (!Shuf0->hasOneUse()) {
-    std::swap(Shuf0, Shuf1);
-    std::swap(Mask0, Mask1);
-    MaskOffset *= -1;
-  }
-
-  auto Index = (InputNumElements - MaskOffset) % InputNumElements;
-  NewMask0.clear();
+  int MaskOffset = NewMask[0u];
+  unsigned Index = (InputNumElements - MaskOffset) % InputNumElements;
+  NewMask.clear();
 
-  for (auto I = 0u; I < InputNumElements; ++I) {
-    NewMask0.push_back(Index);
+  for (unsigned I = 0u; I < InputNumElements; ++I) {
+    NewMask.push_back(Index);
     Index = (Index + 1u) % InputNumElements;
   }
 
@@ -3769,7 +3759,7 @@ bool VectorCombine::shrinkPhiOfShuffles(Instruction &I) {
   auto const Kind = TTI::SK_PermuteSingleSrc;
   auto OldCost = std::max(TTI.getShuffleCost(Kind, InputVT, Mask0, CostKind),
                           TTI.getShuffleCost(Kind, InputVT, Mask1, CostKind));
-  auto NewCost = TTI.getShuffleCost(Kind, InputVT, NewMask0, CostKind) +
+  auto NewCost = TTI.getShuffleCost(Kind, InputVT, NewMask, CostKind) +
                  TTI.getShuffleCost(Kind, InputVT, Mask1, CostKind);
 
   if (NewCost > OldCost)
@@ -3779,17 +3769,18 @@ bool VectorCombine::shrinkPhiOfShuffles(Instruction &I) {
   auto Builder = IRBuilder(&I);
   Builder.SetInsertPoint(Shuf0);
   Builder.SetCurrentDebugLocation(Shuf0->getDebugLoc());
-  auto *NewShuf0 = Builder.CreateShuffleVector(Shuf0Op0, Shuf0Op1, NewMask0);
+  auto *PoisonVal = PoisonValue::get(InputVT);
+  auto *NewShuf0 = Builder.CreateShuffleVector(Op0, PoisonVal, NewMask);
 
   Builder.SetInsertPoint(Phi);
   Builder.SetCurrentDebugLocation(Phi->getDebugLoc());
   auto *NewPhi = Builder.CreatePHI(NewShuf0->getType(), 2u);
   NewPhi->addIncoming(NewShuf0, Phi->getIncomingBlock(0u));
-  NewPhi->addIncoming(Shuf1Op0, Phi->getIncomingBlock(1u));
+  NewPhi->addIncoming(Op1, Phi->getIncomingBlock(1u));
 
   Builder.SetInsertPoint(*NewPhi->getInsertionPointAfterDef());
-  auto *NewPoison = PoisonValue::get(NewPhi->getType());
-  auto *NewShuf2 = Builder.CreateShuffleVector(NewPhi, NewPoison, Mask1);
+  PoisonVal = PoisonValue::get(NewPhi->getType());
+  auto *NewShuf2 = Builder.CreateShuffleVector(NewPhi, PoisonVal, Mask1);
 
   replaceValue(*Phi, *NewShuf2);
   return true;

>From fb6b73d14a2b0a7a3667ef1a8adbee96d2af3f69 Mon Sep 17 00:00:00 2001
From: Leon Clark <leoclark at amd.com>
Date: Mon, 19 May 2025 18:25:45 +0100
Subject: [PATCH 04/14] Address review comments.

---
 .../Transforms/Vectorize/VectorCombine.cpp    | 37 +++++++++----------
 1 file changed, 17 insertions(+), 20 deletions(-)

diff --git a/llvm/lib/Transforms/Vectorize/VectorCombine.cpp b/llvm/lib/Transforms/Vectorize/VectorCombine.cpp
index f09b1ad5e8246..3c69810ecd36b 100644
--- a/llvm/lib/Transforms/Vectorize/VectorCombine.cpp
+++ b/llvm/lib/Transforms/Vectorize/VectorCombine.cpp
@@ -3701,22 +3701,21 @@ bool VectorCombine::shrinkPhiOfShuffles(Instruction &I) {
   if (!Phi || Phi->getNumIncomingValues() != 2u)
     return false;
 
-  auto *Shuf0 = dyn_cast<ShuffleVectorInst>(Phi->getOperand(0u));
-  auto *Shuf1 = dyn_cast<ShuffleVectorInst>(Phi->getOperand(1u));
-  if (!Shuf0 || !Shuf1)
-    return false;
-
-  Value *Op0 = nullptr;
-  Value *Op1 = nullptr;
+  Value *Op = nullptr;
+  ArrayRef<int> Mask0;
+  ArrayRef<int> Mask1;
 
-  if (!match(Shuf0, m_OneUse(m_Shuffle(m_Value(Op0), m_Poison()))) ||
-      !match(Shuf1, m_OneUse(m_Shuffle(m_Value(Op1), m_Poison()))) ||
-      Op0 != Op1)
+  if (!match(Phi->getOperand(0u), 
+             m_OneUse(m_Shuffle(m_Value(Op), m_Poison(), m_Mask(Mask0)))) ||
+      !match(Phi->getOperand(1u), 
+             m_OneUse(m_Shuffle(m_Specific(Op), m_Poison(), m_Mask(Mask1)))))
     return false;
 
+  auto *Shuf = cast<ShuffleVectorInst>(Phi->getOperand(0u));
+
   // Ensure result vectors are wider than the argument vector.
-  auto *InputVT = cast<FixedVectorType>(Op0->getType());
-  auto *ResultVT = cast<FixedVectorType>(Shuf0->getType());
+  auto *InputVT = cast<FixedVectorType>(Op->getType());
+  auto *ResultVT = cast<FixedVectorType>(Shuf->getType());
   auto const InputNumElements = InputVT->getNumElements();
 
   if (InputNumElements >= ResultVT->getNumElements())
@@ -3724,8 +3723,6 @@ bool VectorCombine::shrinkPhiOfShuffles(Instruction &I) {
 
   // Take the difference of the two shuffle masks at each index. Ignore poison
   // values at the same index in both masks.
-  ArrayRef Mask0 = Shuf0->getShuffleMask();
-  ArrayRef Mask1 = Shuf1->getShuffleMask();
   SmallVector<int, 16> NewMask;
   NewMask.reserve(Mask0.size());
 
@@ -3767,22 +3764,22 @@ bool VectorCombine::shrinkPhiOfShuffles(Instruction &I) {
 
   // Create new shuffles and narrowed phi.
   auto Builder = IRBuilder(&I);
-  Builder.SetInsertPoint(Shuf0);
-  Builder.SetCurrentDebugLocation(Shuf0->getDebugLoc());
+  Builder.SetInsertPoint(Shuf);
+  Builder.SetCurrentDebugLocation(Shuf->getDebugLoc());
   auto *PoisonVal = PoisonValue::get(InputVT);
-  auto *NewShuf0 = Builder.CreateShuffleVector(Op0, PoisonVal, NewMask);
+  auto *NewShuf0 = Builder.CreateShuffleVector(Op, PoisonVal, NewMask);
 
   Builder.SetInsertPoint(Phi);
   Builder.SetCurrentDebugLocation(Phi->getDebugLoc());
   auto *NewPhi = Builder.CreatePHI(NewShuf0->getType(), 2u);
   NewPhi->addIncoming(NewShuf0, Phi->getIncomingBlock(0u));
-  NewPhi->addIncoming(Op1, Phi->getIncomingBlock(1u));
+  NewPhi->addIncoming(Op, Phi->getIncomingBlock(1u));
 
   Builder.SetInsertPoint(*NewPhi->getInsertionPointAfterDef());
   PoisonVal = PoisonValue::get(NewPhi->getType());
-  auto *NewShuf2 = Builder.CreateShuffleVector(NewPhi, PoisonVal, Mask1);
+  auto *NewShuf1 = Builder.CreateShuffleVector(NewPhi, PoisonVal, Mask1);
 
-  replaceValue(*Phi, *NewShuf2);
+  replaceValue(*Phi, *NewShuf1);
   return true;
 }
 

>From d4de0926fd4b838f0b957994c79f45d648d91db9 Mon Sep 17 00:00:00 2001
From: Leon Clark <leoclark at amd.com>
Date: Mon, 19 May 2025 18:30:08 +0100
Subject: [PATCH 05/14] Formatting.

---
 llvm/lib/Transforms/Vectorize/VectorCombine.cpp | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/llvm/lib/Transforms/Vectorize/VectorCombine.cpp b/llvm/lib/Transforms/Vectorize/VectorCombine.cpp
index 3c69810ecd36b..e8cecc08a0a53 100644
--- a/llvm/lib/Transforms/Vectorize/VectorCombine.cpp
+++ b/llvm/lib/Transforms/Vectorize/VectorCombine.cpp
@@ -3705,9 +3705,9 @@ bool VectorCombine::shrinkPhiOfShuffles(Instruction &I) {
   ArrayRef<int> Mask0;
   ArrayRef<int> Mask1;
 
-  if (!match(Phi->getOperand(0u), 
+  if (!match(Phi->getOperand(0u),
              m_OneUse(m_Shuffle(m_Value(Op), m_Poison(), m_Mask(Mask0)))) ||
-      !match(Phi->getOperand(1u), 
+      !match(Phi->getOperand(1u),
              m_OneUse(m_Shuffle(m_Specific(Op), m_Poison(), m_Mask(Mask1)))))
     return false;
 

>From 896d320ffe586407bd734ecf81af4f2d92ea4323 Mon Sep 17 00:00:00 2001
From: Leon Clark <leoclark at amd.com>
Date: Tue, 20 May 2025 11:33:52 +0100
Subject: [PATCH 06/14] Retrigger checks.


>From 98fb688dfd725a5ec1d50d5d35820cb9fb9cd437 Mon Sep 17 00:00:00 2001
From: Leon Clark <leoclark at amd.com>
Date: Wed, 28 May 2025 13:26:54 +0100
Subject: [PATCH 07/14] Address comments.

---
 llvm/lib/Transforms/Vectorize/VectorCombine.cpp | 14 ++++++--------
 1 file changed, 6 insertions(+), 8 deletions(-)

diff --git a/llvm/lib/Transforms/Vectorize/VectorCombine.cpp b/llvm/lib/Transforms/Vectorize/VectorCombine.cpp
index e8cecc08a0a53..b447a50a9264c 100644
--- a/llvm/lib/Transforms/Vectorize/VectorCombine.cpp
+++ b/llvm/lib/Transforms/Vectorize/VectorCombine.cpp
@@ -3692,10 +3692,10 @@ bool VectorCombine::foldInterleaveIntrinsics(Instruction &I) {
   return true;
 }
 
-// Attempt to narrow a phi of shufflevector instructions where the two incoming
-// values have the same operands but different masks. If the two shuffle masks
-// are offsets of one another we can use one branch to rotate the incoming
-// vector and perform one larger shuffle after the phi.
+/// Attempt to narrow a phi of shufflevector instructions where the two incoming
+/// values have the same operands but different masks. If the two shuffle masks
+/// are offsets of one another we can use one branch to rotate the incoming
+/// vector and perform one larger shuffle after the phi.
 bool VectorCombine::shrinkPhiOfShuffles(Instruction &I) {
   auto *Phi = dyn_cast<PHINode>(&I);
   if (!Phi || Phi->getNumIncomingValues() != 2u)
@@ -3738,8 +3738,7 @@ bool VectorCombine::shrinkPhiOfShuffles(Instruction &I) {
   // Ensure all elements of the new mask are equal. If the difference between
   // the incoming mask elements is the same, the two must be constant offsets
   // of one another.
-  if (NewMask.empty() ||
-      !std::equal(NewMask.begin() + 1u, NewMask.end(), NewMask.begin()))
+  if (NewMask.empty() || !all_equal(NewMask))
     return false;
 
   // Create new mask using difference of the two incoming masks.
@@ -3763,8 +3762,7 @@ bool VectorCombine::shrinkPhiOfShuffles(Instruction &I) {
     return false;
 
   // Create new shuffles and narrowed phi.
-  auto Builder = IRBuilder(&I);
-  Builder.SetInsertPoint(Shuf);
+  auto Builder = IRBuilder(Shuf);
   Builder.SetCurrentDebugLocation(Shuf->getDebugLoc());
   auto *PoisonVal = PoisonValue::get(InputVT);
   auto *NewShuf0 = Builder.CreateShuffleVector(Op, PoisonVal, NewMask);

>From ba55ff0b47cc5d840fbda01dba7c58d580d4bc95 Mon Sep 17 00:00:00 2001
From: Leon Clark <leoclark at amd.com>
Date: Wed, 11 Jun 2025 06:51:07 +0100
Subject: [PATCH 08/14] Address review comments.

---
 .../Transforms/Vectorize/VectorCombine.cpp    |    9 +-
 .../AMDGPU/narrow-phi-of-shuffles.ll          | 1266 ----
 .../VectorCombine/narrow-phi-of-shuffles.ll   | 6459 +++++++++++++++++
 3 files changed, 6464 insertions(+), 1270 deletions(-)
 delete mode 100644 llvm/test/Transforms/VectorCombine/AMDGPU/narrow-phi-of-shuffles.ll
 create mode 100644 llvm/test/Transforms/VectorCombine/narrow-phi-of-shuffles.ll

diff --git a/llvm/lib/Transforms/Vectorize/VectorCombine.cpp b/llvm/lib/Transforms/Vectorize/VectorCombine.cpp
index b447a50a9264c..10f59f4844d61 100644
--- a/llvm/lib/Transforms/Vectorize/VectorCombine.cpp
+++ b/llvm/lib/Transforms/Vectorize/VectorCombine.cpp
@@ -3726,10 +3726,10 @@ bool VectorCombine::shrinkPhiOfShuffles(Instruction &I) {
   SmallVector<int, 16> NewMask;
   NewMask.reserve(Mask0.size());
 
-  for (auto I = 0u; I < Mask0.size(); ++I) {
-    if (Mask0[I] >= 0 && Mask1[I] >= 0)
-      NewMask.push_back(Mask0[I] - Mask1[I]);
-    else if (Mask0[I] == -1 && Mask1[I] == -1)
+  for (auto [M0, M1] : zip(Mask0, Mask1)) {
+    if (M0 >= 0 && M1 >= 0)
+      NewMask.push_back(M0 - M1);
+    else if (M0 == -1 && M1 == -1)
       continue;
     else
       return false;
@@ -3766,6 +3766,7 @@ bool VectorCombine::shrinkPhiOfShuffles(Instruction &I) {
   Builder.SetCurrentDebugLocation(Shuf->getDebugLoc());
   auto *PoisonVal = PoisonValue::get(InputVT);
   auto *NewShuf0 = Builder.CreateShuffleVector(Op, PoisonVal, NewMask);
+  Worklist.push(cast<Instruction>(NewShuf0));
 
   Builder.SetInsertPoint(Phi);
   Builder.SetCurrentDebugLocation(Phi->getDebugLoc());
diff --git a/llvm/test/Transforms/VectorCombine/AMDGPU/narrow-phi-of-shuffles.ll b/llvm/test/Transforms/VectorCombine/AMDGPU/narrow-phi-of-shuffles.ll
deleted file mode 100644
index 9b4c4fc9a702d..0000000000000
--- a/llvm/test/Transforms/VectorCombine/AMDGPU/narrow-phi-of-shuffles.ll
+++ /dev/null
@@ -1,1266 +0,0 @@
-; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
-; RUN: opt < %s -passes=vector-combine -S -mtriple=amdgcn-amd-amdhsa | FileCheck %s --check-prefixes=CHECK
-
-define <2 x i8> @shuffle_v2i8(<2 x i8> %arg0, i1 %cond) {
-; CHECK-LABEL: define <2 x i8> @shuffle_v2i8(
-; CHECK-SAME: <2 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-NEXT:  [[ENTRY:.*:]]
-; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK:       [[THEN]]:
-; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i8> [[ARG0]], <2 x i8> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-NEXT:    tail call void @func0()
-; CHECK-NEXT:    br label %[[FINALLY:.*]]
-; CHECK:       [[ELSE]]:
-; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i8> [[ARG0]], <2 x i8> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-NEXT:    tail call void @func1()
-; CHECK-NEXT:    br label %[[FINALLY]]
-; CHECK:       [[FINALLY]]:
-; CHECK-NEXT:    [[VAL3:%.*]] = phi <2 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-NEXT:    ret <2 x i8> [[VAL3]]
-;
-entry:
-  br i1 %cond, label %then, label %else
-
-then:
-  %val1 = shufflevector <2 x i8> %arg0, <2 x i8> poison, <2 x i32> <i32 1, i32 1>
-  tail call void @func0()
-  br label %finally
-
-else:
-  %val2 = shufflevector <2 x i8> %arg0, <2 x i8> poison, <2 x i32> <i32 2, i32 2>
-  tail call void @func1()
-  br label %finally
-
-finally:
-  %val3 = phi <2 x i8> [ %val1, %then ], [ %val2, %else ]
-  ret <2 x i8> %val3
-}
-
-define <4 x i8> @shuffle_v4i8(<3 x i8> %arg0, i1 %cond) {
-; CHECK-LABEL: define <4 x i8> @shuffle_v4i8(
-; CHECK-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-NEXT:  [[ENTRY:.*:]]
-; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK:       [[THEN]]:
-; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
-; CHECK-NEXT:    tail call void @func0()
-; CHECK-NEXT:    br label %[[FINALLY:.*]]
-; CHECK:       [[ELSE]]:
-; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-; CHECK-NEXT:    tail call void @func1()
-; CHECK-NEXT:    br label %[[FINALLY]]
-; CHECK:       [[FINALLY]]:
-; CHECK-NEXT:    [[VAL3:%.*]] = phi <4 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-NEXT:    ret <4 x i8> [[VAL3]]
-;
-entry:
-  br i1 %cond, label %then, label %else
-
-then:
-  %val1 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
-  tail call void @func0()
-  br label %finally
-
-else:
-  %val2 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-  tail call void @func1()
-  br label %finally
-
-finally:
-  %val3 = phi <4 x i8> [ %val1, %then ], [ %val2, %else ]
-  ret <4 x i8> %val3
-}
-
-define <8 x i8> @shuffle_v8i8(<3 x i8> %arg0, i1 %cond) {
-; CHECK-LABEL: define <8 x i8> @shuffle_v8i8(
-; CHECK-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-NEXT:  [[ENTRY:.*:]]
-; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK:       [[THEN]]:
-; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-NEXT:    tail call void @func0()
-; CHECK-NEXT:    br label %[[FINALLY:.*]]
-; CHECK:       [[ELSE]]:
-; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-NEXT:    tail call void @func1()
-; CHECK-NEXT:    br label %[[FINALLY]]
-; CHECK:       [[FINALLY]]:
-; CHECK-NEXT:    [[VAL3:%.*]] = phi <8 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-NEXT:    ret <8 x i8> [[VAL3]]
-;
-entry:
-  br i1 %cond, label %then, label %else
-
-then:
-  %val1 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-  tail call void @func0()
-  br label %finally
-
-else:
-  %val2 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-  tail call void @func1()
-  br label %finally
-
-finally:
-  %val3 = phi <8 x i8> [ %val1, %then ], [ %val2, %else ]
-  ret <8 x i8> %val3
-}
-
-define <16 x i8> @shuffle_v16i8(<3 x i8> %arg0, i1 %cond) {
-; CHECK-LABEL: define <16 x i8> @shuffle_v16i8(
-; CHECK-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-NEXT:  [[ENTRY:.*:]]
-; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK:       [[THEN]]:
-; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-NEXT:    tail call void @func0()
-; CHECK-NEXT:    br label %[[FINALLY:.*]]
-; CHECK:       [[ELSE]]:
-; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-NEXT:    tail call void @func1()
-; CHECK-NEXT:    br label %[[FINALLY]]
-; CHECK:       [[FINALLY]]:
-; CHECK-NEXT:    [[VAL3:%.*]] = phi <16 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-NEXT:    ret <16 x i8> [[VAL3]]
-;
-entry:
-  br i1 %cond, label %then, label %else
-
-then:
-  %val1 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-  tail call void @func0()
-  br label %finally
-
-else:
-  %val2 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-  tail call void @func1()
-  br label %finally
-
-finally:
-  %val3 = phi <16 x i8> [ %val1, %then ], [ %val2, %else ]
-  ret <16 x i8> %val3
-}
-
-define <32 x i8> @shuffle_v32i8(<3 x i8> %arg0, i1 %cond) {
-; CHECK-LABEL: define <32 x i8> @shuffle_v32i8(
-; CHECK-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-NEXT:  [[ENTRY:.*:]]
-; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK:       [[THEN]]:
-; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-NEXT:    tail call void @func0()
-; CHECK-NEXT:    br label %[[FINALLY:.*]]
-; CHECK:       [[ELSE]]:
-; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-NEXT:    tail call void @func1()
-; CHECK-NEXT:    br label %[[FINALLY]]
-; CHECK:       [[FINALLY]]:
-; CHECK-NEXT:    [[VAL3:%.*]] = phi <32 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-NEXT:    ret <32 x i8> [[VAL3]]
-;
-entry:
-  br i1 %cond, label %then, label %else
-
-then:
-  %val1 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-  tail call void @func0()
-  br label %finally
-
-else:
-  %val2 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-  tail call void @func1()
-  br label %finally
-
-finally:
-  %val3 = phi <32 x i8> [ %val1, %then ], [ %val2, %else ]
-  ret <32 x i8> %val3
-}
-
-define <2 x i16> @shuffle_v2i16(<2 x i16> %arg0, i1 %cond) {
-; CHECK-LABEL: define <2 x i16> @shuffle_v2i16(
-; CHECK-SAME: <2 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-NEXT:  [[ENTRY:.*:]]
-; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK:       [[THEN]]:
-; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i16> [[ARG0]], <2 x i16> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-NEXT:    tail call void @func0()
-; CHECK-NEXT:    br label %[[FINALLY:.*]]
-; CHECK:       [[ELSE]]:
-; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i16> [[ARG0]], <2 x i16> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-NEXT:    tail call void @func1()
-; CHECK-NEXT:    br label %[[FINALLY]]
-; CHECK:       [[FINALLY]]:
-; CHECK-NEXT:    [[VAL3:%.*]] = phi <2 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-NEXT:    ret <2 x i16> [[VAL3]]
-;
-entry:
-  br i1 %cond, label %then, label %else
-
-then:
-  %val1 = shufflevector <2 x i16> %arg0, <2 x i16> poison, <2 x i32> <i32 1, i32 1>
-  tail call void @func0()
-  br label %finally
-
-else:
-  %val2 = shufflevector <2 x i16> %arg0, <2 x i16> poison, <2 x i32> <i32 2, i32 2>
-  tail call void @func1()
-  br label %finally
-
-finally:
-  %val3 = phi <2 x i16> [ %val1, %then ], [ %val2, %else ]
-  ret <2 x i16> %val3
-}
-
-define <4 x i16> @shuffle_v4i16(<3 x i16> %arg0, i1 %cond) {
-; CHECK-LABEL: define <4 x i16> @shuffle_v4i16(
-; CHECK-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-NEXT:  [[ENTRY:.*:]]
-; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK:       [[THEN]]:
-; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
-; CHECK-NEXT:    tail call void @func0()
-; CHECK-NEXT:    br label %[[FINALLY:.*]]
-; CHECK:       [[ELSE]]:
-; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-; CHECK-NEXT:    tail call void @func1()
-; CHECK-NEXT:    br label %[[FINALLY]]
-; CHECK:       [[FINALLY]]:
-; CHECK-NEXT:    [[VAL3:%.*]] = phi <4 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-NEXT:    ret <4 x i16> [[VAL3]]
-;
-entry:
-  br i1 %cond, label %then, label %else
-
-then:
-  %val1 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
-  tail call void @func0()
-  br label %finally
-
-else:
-  %val2 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-  tail call void @func1()
-  br label %finally
-
-finally:
-  %val3 = phi <4 x i16> [ %val1, %then ], [ %val2, %else ]
-  ret <4 x i16> %val3
-}
-
-define <8 x i16> @shuffle_v8i16(<3 x i16> %arg0, i1 %cond) {
-; CHECK-LABEL: define <8 x i16> @shuffle_v8i16(
-; CHECK-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-NEXT:  [[ENTRY:.*:]]
-; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK:       [[THEN]]:
-; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-NEXT:    tail call void @func0()
-; CHECK-NEXT:    br label %[[FINALLY:.*]]
-; CHECK:       [[ELSE]]:
-; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-NEXT:    tail call void @func1()
-; CHECK-NEXT:    br label %[[FINALLY]]
-; CHECK:       [[FINALLY]]:
-; CHECK-NEXT:    [[VAL3:%.*]] = phi <8 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-NEXT:    ret <8 x i16> [[VAL3]]
-;
-entry:
-  br i1 %cond, label %then, label %else
-
-then:
-  %val1 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-  tail call void @func0()
-  br label %finally
-
-else:
-  %val2 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-  tail call void @func1()
-  br label %finally
-
-finally:
-  %val3 = phi <8 x i16> [ %val1, %then ], [ %val2, %else ]
-  ret <8 x i16> %val3
-}
-
-define <16 x i16> @shuffle_v16i16(<3 x i16> %arg0, i1 %cond) {
-; CHECK-LABEL: define <16 x i16> @shuffle_v16i16(
-; CHECK-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-NEXT:  [[ENTRY:.*:]]
-; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK:       [[THEN]]:
-; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-NEXT:    tail call void @func0()
-; CHECK-NEXT:    br label %[[FINALLY:.*]]
-; CHECK:       [[ELSE]]:
-; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-NEXT:    tail call void @func1()
-; CHECK-NEXT:    br label %[[FINALLY]]
-; CHECK:       [[FINALLY]]:
-; CHECK-NEXT:    [[VAL3:%.*]] = phi <16 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-NEXT:    ret <16 x i16> [[VAL3]]
-;
-entry:
-  br i1 %cond, label %then, label %else
-
-then:
-  %val1 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-  tail call void @func0()
-  br label %finally
-
-else:
-  %val2 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-  tail call void @func1()
-  br label %finally
-
-finally:
-  %val3 = phi <16 x i16> [ %val1, %then ], [ %val2, %else ]
-  ret <16 x i16> %val3
-}
-
-define <32 x i16> @shuffle_v32i16(<3 x i16> %arg0, i1 %cond) {
-; CHECK-LABEL: define <32 x i16> @shuffle_v32i16(
-; CHECK-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-NEXT:  [[ENTRY:.*:]]
-; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK:       [[THEN]]:
-; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-NEXT:    tail call void @func0()
-; CHECK-NEXT:    br label %[[FINALLY:.*]]
-; CHECK:       [[ELSE]]:
-; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-NEXT:    tail call void @func1()
-; CHECK-NEXT:    br label %[[FINALLY]]
-; CHECK:       [[FINALLY]]:
-; CHECK-NEXT:    [[VAL3:%.*]] = phi <32 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-NEXT:    ret <32 x i16> [[VAL3]]
-;
-entry:
-  br i1 %cond, label %then, label %else
-
-then:
-  %val1 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-  tail call void @func0()
-  br label %finally
-
-else:
-  %val2 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-  tail call void @func1()
-  br label %finally
-
-finally:
-  %val3 = phi <32 x i16> [ %val1, %then ], [ %val2, %else ]
-  ret <32 x i16> %val3
-}
-
-define <2 x i32> @shuffle_v2i32(<2 x i32> %arg0, i1 %cond) {
-; CHECK-LABEL: define <2 x i32> @shuffle_v2i32(
-; CHECK-SAME: <2 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-NEXT:  [[ENTRY:.*:]]
-; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK:       [[THEN]]:
-; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i32> [[ARG0]], <2 x i32> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-NEXT:    tail call void @func0()
-; CHECK-NEXT:    br label %[[FINALLY:.*]]
-; CHECK:       [[ELSE]]:
-; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i32> [[ARG0]], <2 x i32> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-NEXT:    tail call void @func1()
-; CHECK-NEXT:    br label %[[FINALLY]]
-; CHECK:       [[FINALLY]]:
-; CHECK-NEXT:    [[VAL3:%.*]] = phi <2 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-NEXT:    ret <2 x i32> [[VAL3]]
-;
-entry:
-  br i1 %cond, label %then, label %else
-
-then:
-  %val1 = shufflevector <2 x i32> %arg0, <2 x i32> poison, <2 x i32> <i32 1, i32 1>
-  tail call void @func0()
-  br label %finally
-
-else:
-  %val2 = shufflevector <2 x i32> %arg0, <2 x i32> poison, <2 x i32> <i32 2, i32 2>
-  tail call void @func1()
-  br label %finally
-
-finally:
-  %val3 = phi <2 x i32> [ %val1, %then ], [ %val2, %else ]
-  ret <2 x i32> %val3
-}
-
-define <4 x i32> @shuffle_v4i32(<3 x i32> %arg0, i1 %cond) {
-; CHECK-LABEL: define <4 x i32> @shuffle_v4i32(
-; CHECK-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-NEXT:  [[ENTRY:.*:]]
-; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK:       [[THEN]]:
-; CHECK-NEXT:    [[TMP0:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <3 x i32> <i32 1, i32 2, i32 0>
-; CHECK-NEXT:    tail call void @func0()
-; CHECK-NEXT:    br label %[[FINALLY:.*]]
-; CHECK:       [[ELSE]]:
-; CHECK-NEXT:    tail call void @func1()
-; CHECK-NEXT:    br label %[[FINALLY]]
-; CHECK:       [[FINALLY]]:
-; CHECK-NEXT:    [[TMP1:%.*]] = phi <3 x i32> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
-; CHECK-NEXT:    [[VAL3:%.*]] = shufflevector <3 x i32> [[TMP1]], <3 x i32> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-; CHECK-NEXT:    ret <4 x i32> [[VAL3]]
-;
-entry:
-  br i1 %cond, label %then, label %else
-
-then:
-  %val1 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
-  tail call void @func0()
-  br label %finally
-
-else:
-  %val2 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-  tail call void @func1()
-  br label %finally
-
-finally:
-  %val3 = phi <4 x i32> [ %val1, %then ], [ %val2, %else ]
-  ret <4 x i32> %val3
-}
-
-define <8 x i32> @shuffle_v8i32(<3 x i32> %arg0, i1 %cond) {
-; CHECK-LABEL: define <8 x i32> @shuffle_v8i32(
-; CHECK-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-NEXT:  [[ENTRY:.*:]]
-; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK:       [[THEN]]:
-; CHECK-NEXT:    [[TMP0:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <3 x i32> <i32 1, i32 2, i32 0>
-; CHECK-NEXT:    tail call void @func0()
-; CHECK-NEXT:    br label %[[FINALLY:.*]]
-; CHECK:       [[ELSE]]:
-; CHECK-NEXT:    tail call void @func1()
-; CHECK-NEXT:    br label %[[FINALLY]]
-; CHECK:       [[FINALLY]]:
-; CHECK-NEXT:    [[TMP1:%.*]] = phi <3 x i32> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
-; CHECK-NEXT:    [[VAL3:%.*]] = shufflevector <3 x i32> [[TMP1]], <3 x i32> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-NEXT:    ret <8 x i32> [[VAL3]]
-;
-entry:
-  br i1 %cond, label %then, label %else
-
-then:
-  %val1 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-  tail call void @func0()
-  br label %finally
-
-else:
-  %val2 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-  tail call void @func1()
-  br label %finally
-
-finally:
-  %val3 = phi <8 x i32> [ %val1, %then ], [ %val2, %else ]
-  ret <8 x i32> %val3
-}
-
-define <16 x i32> @shuffle_v16i32(<3 x i32> %arg0, i1 %cond) {
-; CHECK-LABEL: define <16 x i32> @shuffle_v16i32(
-; CHECK-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-NEXT:  [[ENTRY:.*:]]
-; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK:       [[THEN]]:
-; CHECK-NEXT:    [[TMP0:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <3 x i32> <i32 1, i32 2, i32 0>
-; CHECK-NEXT:    tail call void @func0()
-; CHECK-NEXT:    br label %[[FINALLY:.*]]
-; CHECK:       [[ELSE]]:
-; CHECK-NEXT:    tail call void @func1()
-; CHECK-NEXT:    br label %[[FINALLY]]
-; CHECK:       [[FINALLY]]:
-; CHECK-NEXT:    [[TMP1:%.*]] = phi <3 x i32> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
-; CHECK-NEXT:    [[VAL3:%.*]] = shufflevector <3 x i32> [[TMP1]], <3 x i32> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-NEXT:    ret <16 x i32> [[VAL3]]
-;
-entry:
-  br i1 %cond, label %then, label %else
-
-then:
-  %val1 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-  tail call void @func0()
-  br label %finally
-
-else:
-  %val2 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-  tail call void @func1()
-  br label %finally
-
-finally:
-  %val3 = phi <16 x i32> [ %val1, %then ], [ %val2, %else ]
-  ret <16 x i32> %val3
-}
-
-define <32 x i32> @shuffle_v32i32(<3 x i32> %arg0, i1 %cond) {
-; CHECK-LABEL: define <32 x i32> @shuffle_v32i32(
-; CHECK-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-NEXT:  [[ENTRY:.*:]]
-; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK:       [[THEN]]:
-; CHECK-NEXT:    [[TMP0:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <3 x i32> <i32 1, i32 2, i32 0>
-; CHECK-NEXT:    tail call void @func0()
-; CHECK-NEXT:    br label %[[FINALLY:.*]]
-; CHECK:       [[ELSE]]:
-; CHECK-NEXT:    tail call void @func1()
-; CHECK-NEXT:    br label %[[FINALLY]]
-; CHECK:       [[FINALLY]]:
-; CHECK-NEXT:    [[TMP1:%.*]] = phi <3 x i32> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
-; CHECK-NEXT:    [[VAL3:%.*]] = shufflevector <3 x i32> [[TMP1]], <3 x i32> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-NEXT:    ret <32 x i32> [[VAL3]]
-;
-entry:
-  br i1 %cond, label %then, label %else
-
-then:
-  %val1 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-  tail call void @func0()
-  br label %finally
-
-else:
-  %val2 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-  tail call void @func1()
-  br label %finally
-
-finally:
-  %val3 = phi <32 x i32> [ %val1, %then ], [ %val2, %else ]
-  ret <32 x i32> %val3
-}
-
-define <2 x bfloat> @shuffle_v2bf16(<2 x bfloat> %arg0, i1 %cond) {
-; CHECK-LABEL: define <2 x bfloat> @shuffle_v2bf16(
-; CHECK-SAME: <2 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-NEXT:  [[ENTRY:.*:]]
-; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK:       [[THEN]]:
-; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <2 x bfloat> [[ARG0]], <2 x bfloat> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-NEXT:    tail call void @func0()
-; CHECK-NEXT:    br label %[[FINALLY:.*]]
-; CHECK:       [[ELSE]]:
-; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <2 x bfloat> [[ARG0]], <2 x bfloat> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-NEXT:    tail call void @func1()
-; CHECK-NEXT:    br label %[[FINALLY]]
-; CHECK:       [[FINALLY]]:
-; CHECK-NEXT:    [[VAL3:%.*]] = phi <2 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-NEXT:    ret <2 x bfloat> [[VAL3]]
-;
-entry:
-  br i1 %cond, label %then, label %else
-
-then:
-  %val1 = shufflevector <2 x bfloat> %arg0, <2 x bfloat> poison, <2 x i32> <i32 1, i32 1>
-  tail call void @func0()
-  br label %finally
-
-else:
-  %val2 = shufflevector <2 x bfloat> %arg0, <2 x bfloat> poison, <2 x i32> <i32 2, i32 2>
-  tail call void @func1()
-  br label %finally
-
-finally:
-  %val3 = phi <2 x bfloat> [ %val1, %then ], [ %val2, %else ]
-  ret <2 x bfloat> %val3
-}
-
-define <3 x bfloat> @shuffle_v3bf16(<3 x bfloat> %arg0, i1 %cond) {
-; CHECK-LABEL: define <3 x bfloat> @shuffle_v3bf16(
-; CHECK-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-NEXT:  [[ENTRY:.*:]]
-; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK:       [[THEN]]:
-; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 1, i32 1>
-; CHECK-NEXT:    tail call void @func0()
-; CHECK-NEXT:    br label %[[FINALLY:.*]]
-; CHECK:       [[ELSE]]:
-; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 2, i32 2, i32 2>
-; CHECK-NEXT:    tail call void @func1()
-; CHECK-NEXT:    br label %[[FINALLY]]
-; CHECK:       [[FINALLY]]:
-; CHECK-NEXT:    [[VAL3:%.*]] = phi <3 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-NEXT:    ret <3 x bfloat> [[VAL3]]
-;
-entry:
-  br i1 %cond, label %then, label %else
-
-then:
-  %val1 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <3 x i32> <i32 1, i32 1, i32 1>
-  tail call void @func0()
-  br label %finally
-
-else:
-  %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <3 x i32> <i32 2, i32 2, i32 2>
-  tail call void @func1()
-  br label %finally
-
-finally:
-  %val3 = phi <3 x bfloat> [ %val1, %then ], [ %val2, %else ]
-  ret <3 x bfloat> %val3
-}
-
-define <4 x bfloat> @shuffle_v4bf16(<3 x bfloat> %arg0, i1 %cond) {
-; CHECK-LABEL: define <4 x bfloat> @shuffle_v4bf16(
-; CHECK-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-NEXT:  [[ENTRY:.*:]]
-; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK:       [[THEN]]:
-; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
-; CHECK-NEXT:    tail call void @func0()
-; CHECK-NEXT:    br label %[[FINALLY:.*]]
-; CHECK:       [[ELSE]]:
-; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-; CHECK-NEXT:    tail call void @func1()
-; CHECK-NEXT:    br label %[[FINALLY]]
-; CHECK:       [[FINALLY]]:
-; CHECK-NEXT:    [[VAL3:%.*]] = phi <4 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-NEXT:    ret <4 x bfloat> [[VAL3]]
-;
-entry:
-  br i1 %cond, label %then, label %else
-
-then:
-  %val1 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
-  tail call void @func0()
-  br label %finally
-
-else:
-  %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-  tail call void @func1()
-  br label %finally
-
-finally:
-  %val3 = phi <4 x bfloat> [ %val1, %then ], [ %val2, %else ]
-  ret <4 x bfloat> %val3
-}
-
-define <6 x bfloat> @shuffle_v6bf16(<3 x bfloat> %arg0, i1 %cond) {
-; CHECK-LABEL: define <6 x bfloat> @shuffle_v6bf16(
-; CHECK-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-NEXT:  [[ENTRY:.*:]]
-; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK:       [[THEN]]:
-; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-NEXT:    tail call void @func0()
-; CHECK-NEXT:    br label %[[FINALLY:.*]]
-; CHECK:       [[ELSE]]:
-; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-NEXT:    tail call void @func1()
-; CHECK-NEXT:    br label %[[FINALLY]]
-; CHECK:       [[FINALLY]]:
-; CHECK-NEXT:    [[VAL3:%.*]] = phi <6 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-NEXT:    ret <6 x bfloat> [[VAL3]]
-;
-entry:
-  br i1 %cond, label %then, label %else
-
-then:
-  %val1 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-  tail call void @func0()
-  br label %finally
-
-else:
-  %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-  tail call void @func1()
-  br label %finally
-
-finally:
-  %val3 = phi <6 x bfloat> [ %val1, %then ], [ %val2, %else ]
-  ret <6 x bfloat> %val3
-}
-
-define <8 x bfloat> @shuffle_v8bf16(<3 x bfloat> %arg0, i1 %cond) {
-; CHECK-LABEL: define <8 x bfloat> @shuffle_v8bf16(
-; CHECK-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-NEXT:  [[ENTRY:.*:]]
-; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK:       [[THEN]]:
-; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-NEXT:    tail call void @func0()
-; CHECK-NEXT:    br label %[[FINALLY:.*]]
-; CHECK:       [[ELSE]]:
-; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-NEXT:    tail call void @func1()
-; CHECK-NEXT:    br label %[[FINALLY]]
-; CHECK:       [[FINALLY]]:
-; CHECK-NEXT:    [[VAL3:%.*]] = phi <8 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-NEXT:    ret <8 x bfloat> [[VAL3]]
-;
-entry:
-  br i1 %cond, label %then, label %else
-
-then:
-  %val1 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-  tail call void @func0()
-  br label %finally
-
-else:
-  %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-  tail call void @func1()
-  br label %finally
-
-finally:
-  %val3 = phi <8 x bfloat> [ %val1, %then ], [ %val2, %else ]
-  ret <8 x bfloat> %val3
-}
-
-define <16 x bfloat> @shuffle_v16bf16(<3 x bfloat> %arg0, i1 %cond) {
-; CHECK-LABEL: define <16 x bfloat> @shuffle_v16bf16(
-; CHECK-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-NEXT:  [[ENTRY:.*:]]
-; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK:       [[THEN]]:
-; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-NEXT:    tail call void @func0()
-; CHECK-NEXT:    br label %[[FINALLY:.*]]
-; CHECK:       [[ELSE]]:
-; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-NEXT:    tail call void @func1()
-; CHECK-NEXT:    br label %[[FINALLY]]
-; CHECK:       [[FINALLY]]:
-; CHECK-NEXT:    [[VAL3:%.*]] = phi <16 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-NEXT:    ret <16 x bfloat> [[VAL3]]
-;
-entry:
-  br i1 %cond, label %then, label %else
-
-then:
-  %val1 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-  tail call void @func0()
-  br label %finally
-
-else:
-  %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-  tail call void @func1()
-  br label %finally
-
-finally:
-  %val3 = phi <16 x bfloat> [ %val1, %then ], [ %val2, %else ]
-  ret <16 x bfloat> %val3
-}
-
-define <32 x bfloat> @shuffle_v32bf16(<3 x bfloat> %arg0, i1 %cond) {
-; CHECK-LABEL: define <32 x bfloat> @shuffle_v32bf16(
-; CHECK-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-NEXT:  [[ENTRY:.*:]]
-; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK:       [[THEN]]:
-; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-NEXT:    tail call void @func0()
-; CHECK-NEXT:    br label %[[FINALLY:.*]]
-; CHECK:       [[ELSE]]:
-; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-NEXT:    tail call void @func1()
-; CHECK-NEXT:    br label %[[FINALLY]]
-; CHECK:       [[FINALLY]]:
-; CHECK-NEXT:    [[VAL3:%.*]] = phi <32 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-NEXT:    ret <32 x bfloat> [[VAL3]]
-;
-entry:
-  br i1 %cond, label %then, label %else
-
-then:
-  %val1 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-  tail call void @func0()
-  br label %finally
-
-else:
-  %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-  tail call void @func1()
-  br label %finally
-
-finally:
-  %val3 = phi <32 x bfloat> [ %val1, %then ], [ %val2, %else ]
-  ret <32 x bfloat> %val3
-}
-
-define <2 x half> @shuffle_v2f16(<2 x half> %arg0, i1 %cond) {
-; CHECK-LABEL: define <2 x half> @shuffle_v2f16(
-; CHECK-SAME: <2 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-NEXT:  [[ENTRY:.*:]]
-; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK:       [[THEN]]:
-; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <2 x half> [[ARG0]], <2 x half> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-NEXT:    tail call void @func0()
-; CHECK-NEXT:    br label %[[FINALLY:.*]]
-; CHECK:       [[ELSE]]:
-; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <2 x half> [[ARG0]], <2 x half> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-NEXT:    tail call void @func1()
-; CHECK-NEXT:    br label %[[FINALLY]]
-; CHECK:       [[FINALLY]]:
-; CHECK-NEXT:    [[VAL3:%.*]] = phi <2 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-NEXT:    ret <2 x half> [[VAL3]]
-;
-entry:
-  br i1 %cond, label %then, label %else
-
-then:
-  %val1 = shufflevector <2 x half> %arg0, <2 x half> poison, <2 x i32> <i32 1, i32 1>
-  tail call void @func0()
-  br label %finally
-
-else:
-  %val2 = shufflevector <2 x half> %arg0, <2 x half> poison, <2 x i32> <i32 2, i32 2>
-  tail call void @func1()
-  br label %finally
-
-finally:
-  %val3 = phi <2 x half> [ %val1, %then ], [ %val2, %else ]
-  ret <2 x half> %val3
-}
-
-define <3 x half> @shuffle_v3f16(<3 x half> %arg0, i1 %cond) {
-; CHECK-LABEL: define <3 x half> @shuffle_v3f16(
-; CHECK-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-NEXT:  [[ENTRY:.*:]]
-; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK:       [[THEN]]:
-; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 1, i32 1>
-; CHECK-NEXT:    tail call void @func0()
-; CHECK-NEXT:    br label %[[FINALLY:.*]]
-; CHECK:       [[ELSE]]:
-; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 2, i32 2, i32 2>
-; CHECK-NEXT:    tail call void @func1()
-; CHECK-NEXT:    br label %[[FINALLY]]
-; CHECK:       [[FINALLY]]:
-; CHECK-NEXT:    [[VAL3:%.*]] = phi <3 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-NEXT:    ret <3 x half> [[VAL3]]
-;
-entry:
-  br i1 %cond, label %then, label %else
-
-then:
-  %val1 = shufflevector <3 x half> %arg0, <3 x half> poison, <3 x i32> <i32 1, i32 1, i32 1>
-  tail call void @func0()
-  br label %finally
-
-else:
-  %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <3 x i32> <i32 2, i32 2, i32 2>
-  tail call void @func1()
-  br label %finally
-
-finally:
-  %val3 = phi <3 x half> [ %val1, %then ], [ %val2, %else ]
-  ret <3 x half> %val3
-}
-
-define <4 x half> @shuffle_v4f16(<3 x half> %arg0, i1 %cond) {
-; CHECK-LABEL: define <4 x half> @shuffle_v4f16(
-; CHECK-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-NEXT:  [[ENTRY:.*:]]
-; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK:       [[THEN]]:
-; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
-; CHECK-NEXT:    tail call void @func0()
-; CHECK-NEXT:    br label %[[FINALLY:.*]]
-; CHECK:       [[ELSE]]:
-; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-; CHECK-NEXT:    tail call void @func1()
-; CHECK-NEXT:    br label %[[FINALLY]]
-; CHECK:       [[FINALLY]]:
-; CHECK-NEXT:    [[VAL3:%.*]] = phi <4 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-NEXT:    ret <4 x half> [[VAL3]]
-;
-entry:
-  br i1 %cond, label %then, label %else
-
-then:
-  %val1 = shufflevector <3 x half> %arg0, <3 x half> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
-  tail call void @func0()
-  br label %finally
-
-else:
-  %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-  tail call void @func1()
-  br label %finally
-
-finally:
-  %val3 = phi <4 x half> [ %val1, %then ], [ %val2, %else ]
-  ret <4 x half> %val3
-}
-
-define <6 x half> @shuffle_v6f16(<3 x half> %arg0, i1 %cond) {
-; CHECK-LABEL: define <6 x half> @shuffle_v6f16(
-; CHECK-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-NEXT:  [[ENTRY:.*:]]
-; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK:       [[THEN]]:
-; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-NEXT:    tail call void @func0()
-; CHECK-NEXT:    br label %[[FINALLY:.*]]
-; CHECK:       [[ELSE]]:
-; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-NEXT:    tail call void @func1()
-; CHECK-NEXT:    br label %[[FINALLY]]
-; CHECK:       [[FINALLY]]:
-; CHECK-NEXT:    [[VAL3:%.*]] = phi <6 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-NEXT:    ret <6 x half> [[VAL3]]
-;
-entry:
-  br i1 %cond, label %then, label %else
-
-then:
-  %val1 = shufflevector <3 x half> %arg0, <3 x half> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-  tail call void @func0()
-  br label %finally
-
-else:
-  %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-  tail call void @func1()
-  br label %finally
-
-finally:
-  %val3 = phi <6 x half> [ %val1, %then ], [ %val2, %else ]
-  ret <6 x half> %val3
-}
-
-define <8 x half> @shuffle_v8f16(<3 x half> %arg0, i1 %cond) {
-; CHECK-LABEL: define <8 x half> @shuffle_v8f16(
-; CHECK-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-NEXT:  [[ENTRY:.*:]]
-; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK:       [[THEN]]:
-; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-NEXT:    tail call void @func0()
-; CHECK-NEXT:    br label %[[FINALLY:.*]]
-; CHECK:       [[ELSE]]:
-; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-NEXT:    tail call void @func1()
-; CHECK-NEXT:    br label %[[FINALLY]]
-; CHECK:       [[FINALLY]]:
-; CHECK-NEXT:    [[VAL3:%.*]] = phi <8 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-NEXT:    ret <8 x half> [[VAL3]]
-;
-entry:
-  br i1 %cond, label %then, label %else
-
-then:
-  %val1 = shufflevector <3 x half> %arg0, <3 x half> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-  tail call void @func0()
-  br label %finally
-
-else:
-  %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-  tail call void @func1()
-  br label %finally
-
-finally:
-  %val3 = phi <8 x half> [ %val1, %then ], [ %val2, %else ]
-  ret <8 x half> %val3
-}
-
-define <16 x half> @shuffle_v16f16(<3 x half> %arg0, i1 %cond) {
-; CHECK-LABEL: define <16 x half> @shuffle_v16f16(
-; CHECK-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-NEXT:  [[ENTRY:.*:]]
-; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK:       [[THEN]]:
-; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-NEXT:    tail call void @func0()
-; CHECK-NEXT:    br label %[[FINALLY:.*]]
-; CHECK:       [[ELSE]]:
-; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-NEXT:    tail call void @func1()
-; CHECK-NEXT:    br label %[[FINALLY]]
-; CHECK:       [[FINALLY]]:
-; CHECK-NEXT:    [[VAL3:%.*]] = phi <16 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-NEXT:    ret <16 x half> [[VAL3]]
-;
-entry:
-  br i1 %cond, label %then, label %else
-
-then:
-  %val1 = shufflevector <3 x half> %arg0, <3 x half> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-  tail call void @func0()
-  br label %finally
-
-else:
-  %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-  tail call void @func1()
-  br label %finally
-
-finally:
-  %val3 = phi <16 x half> [ %val1, %then ], [ %val2, %else ]
-  ret <16 x half> %val3
-}
-
-define <32 x half> @shuffle_v32f16(<3 x half> %arg0, i1 %cond) {
-; CHECK-LABEL: define <32 x half> @shuffle_v32f16(
-; CHECK-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-NEXT:  [[ENTRY:.*:]]
-; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK:       [[THEN]]:
-; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-NEXT:    tail call void @func0()
-; CHECK-NEXT:    br label %[[FINALLY:.*]]
-; CHECK:       [[ELSE]]:
-; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-NEXT:    tail call void @func1()
-; CHECK-NEXT:    br label %[[FINALLY]]
-; CHECK:       [[FINALLY]]:
-; CHECK-NEXT:    [[VAL3:%.*]] = phi <32 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-NEXT:    ret <32 x half> [[VAL3]]
-;
-entry:
-  br i1 %cond, label %then, label %else
-
-then:
-  %val1 = shufflevector <3 x half> %arg0, <3 x half> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-  tail call void @func0()
-  br label %finally
-
-else:
-  %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-  tail call void @func1()
-  br label %finally
-
-finally:
-  %val3 = phi <32 x half> [ %val1, %then ], [ %val2, %else ]
-  ret <32 x half> %val3
-}
-
-define <2 x float> @shuffle_v2f32(<2 x float> %arg0, i1 %cond) {
-; CHECK-LABEL: define <2 x float> @shuffle_v2f32(
-; CHECK-SAME: <2 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-NEXT:  [[ENTRY:.*:]]
-; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK:       [[THEN]]:
-; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-NEXT:    tail call void @func0()
-; CHECK-NEXT:    br label %[[FINALLY:.*]]
-; CHECK:       [[ELSE]]:
-; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-NEXT:    tail call void @func1()
-; CHECK-NEXT:    br label %[[FINALLY]]
-; CHECK:       [[FINALLY]]:
-; CHECK-NEXT:    [[VAL3:%.*]] = phi <2 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-NEXT:    ret <2 x float> [[VAL3]]
-;
-entry:
-  br i1 %cond, label %then, label %else
-
-then:
-  %val1 = shufflevector <2 x float> %arg0, <2 x float> poison, <2 x i32> <i32 1, i32 1>
-  tail call void @func0()
-  br label %finally
-
-else:
-  %val2 = shufflevector <2 x float> %arg0, <2 x float> poison, <2 x i32> <i32 2, i32 2>
-  tail call void @func1()
-  br label %finally
-
-finally:
-  %val3 = phi <2 x float> [ %val1, %then ], [ %val2, %else ]
-  ret <2 x float> %val3
-}
-
-define <3 x float> @shuffle_v3f32(<3 x float> %arg0, i1 %cond) {
-; CHECK-LABEL: define <3 x float> @shuffle_v3f32(
-; CHECK-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-NEXT:  [[ENTRY:.*:]]
-; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK:       [[THEN]]:
-; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 1, i32 1, i32 1>
-; CHECK-NEXT:    tail call void @func0()
-; CHECK-NEXT:    br label %[[FINALLY:.*]]
-; CHECK:       [[ELSE]]:
-; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 2, i32 2, i32 2>
-; CHECK-NEXT:    tail call void @func1()
-; CHECK-NEXT:    br label %[[FINALLY]]
-; CHECK:       [[FINALLY]]:
-; CHECK-NEXT:    [[VAL3:%.*]] = phi <3 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-NEXT:    ret <3 x float> [[VAL3]]
-;
-entry:
-  br i1 %cond, label %then, label %else
-
-then:
-  %val1 = shufflevector <3 x float> %arg0, <3 x float> poison, <3 x i32> <i32 1, i32 1, i32 1>
-  tail call void @func0()
-  br label %finally
-
-else:
-  %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <3 x i32> <i32 2, i32 2, i32 2>
-  tail call void @func1()
-  br label %finally
-
-finally:
-  %val3 = phi <3 x float> [ %val1, %then ], [ %val2, %else ]
-  ret <3 x float> %val3
-}
-
-define <4 x float> @shuffle_v4f32(<3 x float> %arg0, i1 %cond) {
-; CHECK-LABEL: define <4 x float> @shuffle_v4f32(
-; CHECK-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-NEXT:  [[ENTRY:.*:]]
-; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK:       [[THEN]]:
-; CHECK-NEXT:    [[TMP0:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 1, i32 2, i32 0>
-; CHECK-NEXT:    tail call void @func0()
-; CHECK-NEXT:    br label %[[FINALLY:.*]]
-; CHECK:       [[ELSE]]:
-; CHECK-NEXT:    tail call void @func1()
-; CHECK-NEXT:    br label %[[FINALLY]]
-; CHECK:       [[FINALLY]]:
-; CHECK-NEXT:    [[TMP1:%.*]] = phi <3 x float> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
-; CHECK-NEXT:    [[VAL3:%.*]] = shufflevector <3 x float> [[TMP1]], <3 x float> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-; CHECK-NEXT:    ret <4 x float> [[VAL3]]
-;
-entry:
-  br i1 %cond, label %then, label %else
-
-then:
-  %val1 = shufflevector <3 x float> %arg0, <3 x float> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
-  tail call void @func0()
-  br label %finally
-
-else:
-  %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-  tail call void @func1()
-  br label %finally
-
-finally:
-  %val3 = phi <4 x float> [ %val1, %then ], [ %val2, %else ]
-  ret <4 x float> %val3
-}
-
-define <6 x float> @shuffle_v6f32(<3 x float> %arg0, i1 %cond) {
-; CHECK-LABEL: define <6 x float> @shuffle_v6f32(
-; CHECK-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-NEXT:  [[ENTRY:.*:]]
-; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK:       [[THEN]]:
-; CHECK-NEXT:    [[TMP0:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 1, i32 2, i32 0>
-; CHECK-NEXT:    tail call void @func0()
-; CHECK-NEXT:    br label %[[FINALLY:.*]]
-; CHECK:       [[ELSE]]:
-; CHECK-NEXT:    tail call void @func1()
-; CHECK-NEXT:    br label %[[FINALLY]]
-; CHECK:       [[FINALLY]]:
-; CHECK-NEXT:    [[TMP1:%.*]] = phi <3 x float> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
-; CHECK-NEXT:    [[VAL3:%.*]] = shufflevector <3 x float> [[TMP1]], <3 x float> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-NEXT:    ret <6 x float> [[VAL3]]
-;
-entry:
-  br i1 %cond, label %then, label %else
-
-then:
-  %val1 = shufflevector <3 x float> %arg0, <3 x float> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-  tail call void @func0()
-  br label %finally
-
-else:
-  %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-  tail call void @func1()
-  br label %finally
-
-finally:
-  %val3 = phi <6 x float> [ %val1, %then ], [ %val2, %else ]
-  ret <6 x float> %val3
-}
-
-define <8 x float> @shuffle_v8f32(<3 x float> %arg0, i1 %cond) {
-; CHECK-LABEL: define <8 x float> @shuffle_v8f32(
-; CHECK-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-NEXT:  [[ENTRY:.*:]]
-; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK:       [[THEN]]:
-; CHECK-NEXT:    [[TMP0:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 1, i32 2, i32 0>
-; CHECK-NEXT:    tail call void @func0()
-; CHECK-NEXT:    br label %[[FINALLY:.*]]
-; CHECK:       [[ELSE]]:
-; CHECK-NEXT:    tail call void @func1()
-; CHECK-NEXT:    br label %[[FINALLY]]
-; CHECK:       [[FINALLY]]:
-; CHECK-NEXT:    [[TMP1:%.*]] = phi <3 x float> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
-; CHECK-NEXT:    [[VAL3:%.*]] = shufflevector <3 x float> [[TMP1]], <3 x float> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-NEXT:    ret <8 x float> [[VAL3]]
-;
-entry:
-  br i1 %cond, label %then, label %else
-
-then:
-  %val1 = shufflevector <3 x float> %arg0, <3 x float> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-  tail call void @func0()
-  br label %finally
-
-else:
-  %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-  tail call void @func1()
-  br label %finally
-
-finally:
-  %val3 = phi <8 x float> [ %val1, %then ], [ %val2, %else ]
-  ret <8 x float> %val3
-}
-
-define <16 x float> @shuffle_v16f32(<3 x float> %arg0, i1 %cond) {
-; CHECK-LABEL: define <16 x float> @shuffle_v16f32(
-; CHECK-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-NEXT:  [[ENTRY:.*:]]
-; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK:       [[THEN]]:
-; CHECK-NEXT:    [[TMP0:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 1, i32 2, i32 0>
-; CHECK-NEXT:    tail call void @func0()
-; CHECK-NEXT:    br label %[[FINALLY:.*]]
-; CHECK:       [[ELSE]]:
-; CHECK-NEXT:    tail call void @func1()
-; CHECK-NEXT:    br label %[[FINALLY]]
-; CHECK:       [[FINALLY]]:
-; CHECK-NEXT:    [[TMP1:%.*]] = phi <3 x float> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
-; CHECK-NEXT:    [[VAL3:%.*]] = shufflevector <3 x float> [[TMP1]], <3 x float> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-NEXT:    ret <16 x float> [[VAL3]]
-;
-entry:
-  br i1 %cond, label %then, label %else
-
-then:
-  %val1 = shufflevector <3 x float> %arg0, <3 x float> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-  tail call void @func0()
-  br label %finally
-
-else:
-  %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-  tail call void @func1()
-  br label %finally
-
-finally:
-  %val3 = phi <16 x float> [ %val1, %then ], [ %val2, %else ]
-  ret <16 x float> %val3
-}
-
-define <32 x float> @shuffle_v32f32(<3 x float> %arg0, i1 %cond) {
-; CHECK-LABEL: define <32 x float> @shuffle_v32f32(
-; CHECK-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-NEXT:  [[ENTRY:.*:]]
-; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK:       [[THEN]]:
-; CHECK-NEXT:    [[TMP0:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 1, i32 2, i32 0>
-; CHECK-NEXT:    tail call void @func0()
-; CHECK-NEXT:    br label %[[FINALLY:.*]]
-; CHECK:       [[ELSE]]:
-; CHECK-NEXT:    tail call void @func1()
-; CHECK-NEXT:    br label %[[FINALLY]]
-; CHECK:       [[FINALLY]]:
-; CHECK-NEXT:    [[TMP1:%.*]] = phi <3 x float> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
-; CHECK-NEXT:    [[VAL3:%.*]] = shufflevector <3 x float> [[TMP1]], <3 x float> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-NEXT:    ret <32 x float> [[VAL3]]
-;
-entry:
-  br i1 %cond, label %then, label %else
-
-then:
-  %val1 = shufflevector <3 x float> %arg0, <3 x float> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-  tail call void @func0()
-  br label %finally
-
-else:
-  %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-  tail call void @func1()
-  br label %finally
-
-finally:
-  %val3 = phi <32 x float> [ %val1, %then ], [ %val2, %else ]
-  ret <32 x float> %val3
-}
-
-declare void @func0() local_unnamed_addr
-
-declare void @func1() local_unnamed_addr
diff --git a/llvm/test/Transforms/VectorCombine/narrow-phi-of-shuffles.ll b/llvm/test/Transforms/VectorCombine/narrow-phi-of-shuffles.ll
new file mode 100644
index 0000000000000..c8ca944fcf896
--- /dev/null
+++ b/llvm/test/Transforms/VectorCombine/narrow-phi-of-shuffles.ll
@@ -0,0 +1,6459 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
+; RUN: opt -passes=vector-combine -S %s | FileCheck %s --check-prefixes=CHECK
+; RUN: opt -mtriple=aarch64 -passes=vector-combine -S %s | FileCheck %s --check-prefixes=CHECK-AARCH64
+; RUN: opt -mtriple=amdgcn-amd-amdhsa -passes=vector-combine -S %s | FileCheck %s --check-prefixes=CHECK-AMDGPU
+; RUN: opt -mtriple=arm -passes=vector-combine -S %s | FileCheck %s --check-prefixes=CHECK-ARM
+; RUN: opt -mtriple=hexagon-- -passes=vector-combine -S %s | FileCheck %s --check-prefixes=CHECK-HEXAGON
+; RUN: opt -mtriple=riscv64 -passes=vector-combine -S %s | FileCheck %s --check-prefixes=CHECK-RISCV
+; RUN: opt -mtriple=x86_64-- -mcpu=x86-64 -passes=vector-combine -S %s | FileCheck %s --check-prefixes=CHECK-X86-V1
+; RUN: opt -mtriple=x86_64-- -mcpu=x86-64-v2 -passes=vector-combine -S %s | FileCheck %s --check-prefixes=CHECK-X86-V2
+; RUN: opt -mtriple=x86_64-- -mcpu=x86-64-v3 -passes=vector-combine -S %s | FileCheck %s --check-prefixes=CHECK-X86-V3
+; RUN: opt -mtriple=x86_64-- -mcpu=x86-64-v4 -passes=vector-combine -S %s | FileCheck %s --check-prefixes=CHECK-X86-V4
+
+define <2 x i8> @shuffle_v2i8(<2 x i8> %arg0, i1 %cond) {
+; CHECK-LABEL: define <2 x i8> @shuffle_v2i8(
+; CHECK-SAME: <2 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i8> [[ARG0]], <2 x i8> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i8> [[ARG0]], <2 x i8> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <2 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <2 x i8> [[VAL3]]
+;
+; CHECK-AARCH64-LABEL: define <2 x i8> @shuffle_v2i8(
+; CHECK-AARCH64-SAME: <2 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-AARCH64-NEXT:  [[ENTRY:.*:]]
+; CHECK-AARCH64-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-AARCH64:       [[THEN]]:
+; CHECK-AARCH64-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i8> [[ARG0]], <2 x i8> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-AARCH64-NEXT:    tail call void @func0()
+; CHECK-AARCH64-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-AARCH64:       [[ELSE]]:
+; CHECK-AARCH64-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i8> [[ARG0]], <2 x i8> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-AARCH64-NEXT:    tail call void @func1()
+; CHECK-AARCH64-NEXT:    br label %[[FINALLY]]
+; CHECK-AARCH64:       [[FINALLY]]:
+; CHECK-AARCH64-NEXT:    [[VAL3:%.*]] = phi <2 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-AARCH64-NEXT:    ret <2 x i8> [[VAL3]]
+;
+; CHECK-AMDGPU-LABEL: define <2 x i8> @shuffle_v2i8(
+; CHECK-AMDGPU-SAME: <2 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-AMDGPU-NEXT:  [[ENTRY:.*:]]
+; CHECK-AMDGPU-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-AMDGPU:       [[THEN]]:
+; CHECK-AMDGPU-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i8> [[ARG0]], <2 x i8> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-AMDGPU-NEXT:    tail call void @func0()
+; CHECK-AMDGPU-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-AMDGPU:       [[ELSE]]:
+; CHECK-AMDGPU-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i8> [[ARG0]], <2 x i8> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-AMDGPU-NEXT:    tail call void @func1()
+; CHECK-AMDGPU-NEXT:    br label %[[FINALLY]]
+; CHECK-AMDGPU:       [[FINALLY]]:
+; CHECK-AMDGPU-NEXT:    [[VAL3:%.*]] = phi <2 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-AMDGPU-NEXT:    ret <2 x i8> [[VAL3]]
+;
+; CHECK-ARM-LABEL: define <2 x i8> @shuffle_v2i8(
+; CHECK-ARM-SAME: <2 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-ARM-NEXT:  [[ENTRY:.*:]]
+; CHECK-ARM-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-ARM:       [[THEN]]:
+; CHECK-ARM-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i8> [[ARG0]], <2 x i8> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-ARM-NEXT:    tail call void @func0()
+; CHECK-ARM-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-ARM:       [[ELSE]]:
+; CHECK-ARM-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i8> [[ARG0]], <2 x i8> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-ARM-NEXT:    tail call void @func1()
+; CHECK-ARM-NEXT:    br label %[[FINALLY]]
+; CHECK-ARM:       [[FINALLY]]:
+; CHECK-ARM-NEXT:    [[VAL3:%.*]] = phi <2 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-ARM-NEXT:    ret <2 x i8> [[VAL3]]
+;
+; CHECK-HEXAGON-LABEL: define <2 x i8> @shuffle_v2i8(
+; CHECK-HEXAGON-SAME: <2 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-HEXAGON-NEXT:  [[ENTRY:.*:]]
+; CHECK-HEXAGON-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-HEXAGON:       [[THEN]]:
+; CHECK-HEXAGON-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i8> [[ARG0]], <2 x i8> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-HEXAGON-NEXT:    tail call void @func0()
+; CHECK-HEXAGON-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-HEXAGON:       [[ELSE]]:
+; CHECK-HEXAGON-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i8> [[ARG0]], <2 x i8> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-HEXAGON-NEXT:    tail call void @func1()
+; CHECK-HEXAGON-NEXT:    br label %[[FINALLY]]
+; CHECK-HEXAGON:       [[FINALLY]]:
+; CHECK-HEXAGON-NEXT:    [[VAL3:%.*]] = phi <2 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-HEXAGON-NEXT:    ret <2 x i8> [[VAL3]]
+;
+; CHECK-RISCV-LABEL: define <2 x i8> @shuffle_v2i8(
+; CHECK-RISCV-SAME: <2 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-RISCV-NEXT:  [[ENTRY:.*:]]
+; CHECK-RISCV-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-RISCV:       [[THEN]]:
+; CHECK-RISCV-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i8> [[ARG0]], <2 x i8> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-RISCV-NEXT:    tail call void @func0()
+; CHECK-RISCV-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-RISCV:       [[ELSE]]:
+; CHECK-RISCV-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i8> [[ARG0]], <2 x i8> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-RISCV-NEXT:    tail call void @func1()
+; CHECK-RISCV-NEXT:    br label %[[FINALLY]]
+; CHECK-RISCV:       [[FINALLY]]:
+; CHECK-RISCV-NEXT:    [[VAL3:%.*]] = phi <2 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-RISCV-NEXT:    ret <2 x i8> [[VAL3]]
+;
+; CHECK-X86-V1-LABEL: define <2 x i8> @shuffle_v2i8(
+; CHECK-X86-V1-SAME: <2 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0:[0-9]+]] {
+; CHECK-X86-V1-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V1:       [[THEN]]:
+; CHECK-X86-V1-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i8> [[ARG0]], <2 x i8> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-X86-V1-NEXT:    tail call void @func0()
+; CHECK-X86-V1-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V1:       [[ELSE]]:
+; CHECK-X86-V1-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i8> [[ARG0]], <2 x i8> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-X86-V1-NEXT:    tail call void @func1()
+; CHECK-X86-V1-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V1:       [[FINALLY]]:
+; CHECK-X86-V1-NEXT:    [[VAL3:%.*]] = phi <2 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V1-NEXT:    ret <2 x i8> [[VAL3]]
+;
+; CHECK-X86-V2-LABEL: define <2 x i8> @shuffle_v2i8(
+; CHECK-X86-V2-SAME: <2 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0:[0-9]+]] {
+; CHECK-X86-V2-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V2:       [[THEN]]:
+; CHECK-X86-V2-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i8> [[ARG0]], <2 x i8> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-X86-V2-NEXT:    tail call void @func0()
+; CHECK-X86-V2-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V2:       [[ELSE]]:
+; CHECK-X86-V2-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i8> [[ARG0]], <2 x i8> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-X86-V2-NEXT:    tail call void @func1()
+; CHECK-X86-V2-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V2:       [[FINALLY]]:
+; CHECK-X86-V2-NEXT:    [[VAL3:%.*]] = phi <2 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V2-NEXT:    ret <2 x i8> [[VAL3]]
+;
+; CHECK-X86-V3-LABEL: define <2 x i8> @shuffle_v2i8(
+; CHECK-X86-V3-SAME: <2 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0:[0-9]+]] {
+; CHECK-X86-V3-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V3:       [[THEN]]:
+; CHECK-X86-V3-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i8> [[ARG0]], <2 x i8> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-X86-V3-NEXT:    tail call void @func0()
+; CHECK-X86-V3-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V3:       [[ELSE]]:
+; CHECK-X86-V3-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i8> [[ARG0]], <2 x i8> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-X86-V3-NEXT:    tail call void @func1()
+; CHECK-X86-V3-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V3:       [[FINALLY]]:
+; CHECK-X86-V3-NEXT:    [[VAL3:%.*]] = phi <2 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V3-NEXT:    ret <2 x i8> [[VAL3]]
+;
+; CHECK-X86-V4-LABEL: define <2 x i8> @shuffle_v2i8(
+; CHECK-X86-V4-SAME: <2 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0:[0-9]+]] {
+; CHECK-X86-V4-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V4:       [[THEN]]:
+; CHECK-X86-V4-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i8> [[ARG0]], <2 x i8> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-X86-V4-NEXT:    tail call void @func0()
+; CHECK-X86-V4-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V4:       [[ELSE]]:
+; CHECK-X86-V4-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i8> [[ARG0]], <2 x i8> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-X86-V4-NEXT:    tail call void @func1()
+; CHECK-X86-V4-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V4:       [[FINALLY]]:
+; CHECK-X86-V4-NEXT:    [[VAL3:%.*]] = phi <2 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V4-NEXT:    ret <2 x i8> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <2 x i8> %arg0, <2 x i8> poison, <2 x i32> <i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <2 x i8> %arg0, <2 x i8> poison, <2 x i32> <i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <2 x i8> [ %val1, %then ], [ %val2, %else ]
+  ret <2 x i8> %val3
+}
+
+define <4 x i8> @shuffle_v4i8(<3 x i8> %arg0, i1 %cond) {
+; CHECK-LABEL: define <4 x i8> @shuffle_v4i8(
+; CHECK-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <4 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <4 x i8> [[VAL3]]
+;
+; CHECK-AARCH64-LABEL: define <4 x i8> @shuffle_v4i8(
+; CHECK-AARCH64-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-AARCH64-NEXT:  [[ENTRY:.*:]]
+; CHECK-AARCH64-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-AARCH64:       [[THEN]]:
+; CHECK-AARCH64-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-AARCH64-NEXT:    tail call void @func0()
+; CHECK-AARCH64-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-AARCH64:       [[ELSE]]:
+; CHECK-AARCH64-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-AARCH64-NEXT:    tail call void @func1()
+; CHECK-AARCH64-NEXT:    br label %[[FINALLY]]
+; CHECK-AARCH64:       [[FINALLY]]:
+; CHECK-AARCH64-NEXT:    [[VAL3:%.*]] = phi <4 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-AARCH64-NEXT:    ret <4 x i8> [[VAL3]]
+;
+; CHECK-AMDGPU-LABEL: define <4 x i8> @shuffle_v4i8(
+; CHECK-AMDGPU-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-AMDGPU-NEXT:  [[ENTRY:.*:]]
+; CHECK-AMDGPU-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-AMDGPU:       [[THEN]]:
+; CHECK-AMDGPU-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-AMDGPU-NEXT:    tail call void @func0()
+; CHECK-AMDGPU-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-AMDGPU:       [[ELSE]]:
+; CHECK-AMDGPU-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-AMDGPU-NEXT:    tail call void @func1()
+; CHECK-AMDGPU-NEXT:    br label %[[FINALLY]]
+; CHECK-AMDGPU:       [[FINALLY]]:
+; CHECK-AMDGPU-NEXT:    [[VAL3:%.*]] = phi <4 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-AMDGPU-NEXT:    ret <4 x i8> [[VAL3]]
+;
+; CHECK-ARM-LABEL: define <4 x i8> @shuffle_v4i8(
+; CHECK-ARM-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-ARM-NEXT:  [[ENTRY:.*:]]
+; CHECK-ARM-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-ARM:       [[THEN]]:
+; CHECK-ARM-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-ARM-NEXT:    tail call void @func0()
+; CHECK-ARM-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-ARM:       [[ELSE]]:
+; CHECK-ARM-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-ARM-NEXT:    tail call void @func1()
+; CHECK-ARM-NEXT:    br label %[[FINALLY]]
+; CHECK-ARM:       [[FINALLY]]:
+; CHECK-ARM-NEXT:    [[VAL3:%.*]] = phi <4 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-ARM-NEXT:    ret <4 x i8> [[VAL3]]
+;
+; CHECK-HEXAGON-LABEL: define <4 x i8> @shuffle_v4i8(
+; CHECK-HEXAGON-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-HEXAGON-NEXT:  [[ENTRY:.*:]]
+; CHECK-HEXAGON-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-HEXAGON:       [[THEN]]:
+; CHECK-HEXAGON-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-HEXAGON-NEXT:    tail call void @func0()
+; CHECK-HEXAGON-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-HEXAGON:       [[ELSE]]:
+; CHECK-HEXAGON-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-HEXAGON-NEXT:    tail call void @func1()
+; CHECK-HEXAGON-NEXT:    br label %[[FINALLY]]
+; CHECK-HEXAGON:       [[FINALLY]]:
+; CHECK-HEXAGON-NEXT:    [[VAL3:%.*]] = phi <4 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-HEXAGON-NEXT:    ret <4 x i8> [[VAL3]]
+;
+; CHECK-RISCV-LABEL: define <4 x i8> @shuffle_v4i8(
+; CHECK-RISCV-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-RISCV-NEXT:  [[ENTRY:.*:]]
+; CHECK-RISCV-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-RISCV:       [[THEN]]:
+; CHECK-RISCV-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-RISCV-NEXT:    tail call void @func0()
+; CHECK-RISCV-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-RISCV:       [[ELSE]]:
+; CHECK-RISCV-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-RISCV-NEXT:    tail call void @func1()
+; CHECK-RISCV-NEXT:    br label %[[FINALLY]]
+; CHECK-RISCV:       [[FINALLY]]:
+; CHECK-RISCV-NEXT:    [[VAL3:%.*]] = phi <4 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-RISCV-NEXT:    ret <4 x i8> [[VAL3]]
+;
+; CHECK-X86-V1-LABEL: define <4 x i8> @shuffle_v4i8(
+; CHECK-X86-V1-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V1-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V1:       [[THEN]]:
+; CHECK-X86-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-X86-V1-NEXT:    tail call void @func0()
+; CHECK-X86-V1-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V1:       [[ELSE]]:
+; CHECK-X86-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V1-NEXT:    tail call void @func1()
+; CHECK-X86-V1-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V1:       [[FINALLY]]:
+; CHECK-X86-V1-NEXT:    [[VAL3:%.*]] = phi <4 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V1-NEXT:    ret <4 x i8> [[VAL3]]
+;
+; CHECK-X86-V2-LABEL: define <4 x i8> @shuffle_v4i8(
+; CHECK-X86-V2-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V2-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V2:       [[THEN]]:
+; CHECK-X86-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-X86-V2-NEXT:    tail call void @func0()
+; CHECK-X86-V2-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V2:       [[ELSE]]:
+; CHECK-X86-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V2-NEXT:    tail call void @func1()
+; CHECK-X86-V2-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V2:       [[FINALLY]]:
+; CHECK-X86-V2-NEXT:    [[VAL3:%.*]] = phi <4 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V2-NEXT:    ret <4 x i8> [[VAL3]]
+;
+; CHECK-X86-V3-LABEL: define <4 x i8> @shuffle_v4i8(
+; CHECK-X86-V3-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V3-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V3:       [[THEN]]:
+; CHECK-X86-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-X86-V3-NEXT:    tail call void @func0()
+; CHECK-X86-V3-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V3:       [[ELSE]]:
+; CHECK-X86-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V3-NEXT:    tail call void @func1()
+; CHECK-X86-V3-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V3:       [[FINALLY]]:
+; CHECK-X86-V3-NEXT:    [[VAL3:%.*]] = phi <4 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V3-NEXT:    ret <4 x i8> [[VAL3]]
+;
+; CHECK-X86-V4-LABEL: define <4 x i8> @shuffle_v4i8(
+; CHECK-X86-V4-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V4-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V4:       [[THEN]]:
+; CHECK-X86-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-X86-V4-NEXT:    tail call void @func0()
+; CHECK-X86-V4-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V4:       [[ELSE]]:
+; CHECK-X86-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V4-NEXT:    tail call void @func1()
+; CHECK-X86-V4-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V4:       [[FINALLY]]:
+; CHECK-X86-V4-NEXT:    [[VAL3:%.*]] = phi <4 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V4-NEXT:    ret <4 x i8> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <4 x i8> [ %val1, %then ], [ %val2, %else ]
+  ret <4 x i8> %val3
+}
+
+define <8 x i8> @shuffle_v8i8(<3 x i8> %arg0, i1 %cond) {
+; CHECK-LABEL: define <8 x i8> @shuffle_v8i8(
+; CHECK-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <8 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <8 x i8> [[VAL3]]
+;
+; CHECK-AARCH64-LABEL: define <8 x i8> @shuffle_v8i8(
+; CHECK-AARCH64-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-AARCH64-NEXT:  [[ENTRY:.*:]]
+; CHECK-AARCH64-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-AARCH64:       [[THEN]]:
+; CHECK-AARCH64-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-AARCH64-NEXT:    tail call void @func0()
+; CHECK-AARCH64-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-AARCH64:       [[ELSE]]:
+; CHECK-AARCH64-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-AARCH64-NEXT:    tail call void @func1()
+; CHECK-AARCH64-NEXT:    br label %[[FINALLY]]
+; CHECK-AARCH64:       [[FINALLY]]:
+; CHECK-AARCH64-NEXT:    [[VAL3:%.*]] = phi <8 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-AARCH64-NEXT:    ret <8 x i8> [[VAL3]]
+;
+; CHECK-AMDGPU-LABEL: define <8 x i8> @shuffle_v8i8(
+; CHECK-AMDGPU-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-AMDGPU-NEXT:  [[ENTRY:.*:]]
+; CHECK-AMDGPU-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-AMDGPU:       [[THEN]]:
+; CHECK-AMDGPU-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-AMDGPU-NEXT:    tail call void @func0()
+; CHECK-AMDGPU-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-AMDGPU:       [[ELSE]]:
+; CHECK-AMDGPU-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-AMDGPU-NEXT:    tail call void @func1()
+; CHECK-AMDGPU-NEXT:    br label %[[FINALLY]]
+; CHECK-AMDGPU:       [[FINALLY]]:
+; CHECK-AMDGPU-NEXT:    [[VAL3:%.*]] = phi <8 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-AMDGPU-NEXT:    ret <8 x i8> [[VAL3]]
+;
+; CHECK-ARM-LABEL: define <8 x i8> @shuffle_v8i8(
+; CHECK-ARM-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-ARM-NEXT:  [[ENTRY:.*:]]
+; CHECK-ARM-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-ARM:       [[THEN]]:
+; CHECK-ARM-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-ARM-NEXT:    tail call void @func0()
+; CHECK-ARM-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-ARM:       [[ELSE]]:
+; CHECK-ARM-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-ARM-NEXT:    tail call void @func1()
+; CHECK-ARM-NEXT:    br label %[[FINALLY]]
+; CHECK-ARM:       [[FINALLY]]:
+; CHECK-ARM-NEXT:    [[VAL3:%.*]] = phi <8 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-ARM-NEXT:    ret <8 x i8> [[VAL3]]
+;
+; CHECK-HEXAGON-LABEL: define <8 x i8> @shuffle_v8i8(
+; CHECK-HEXAGON-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-HEXAGON-NEXT:  [[ENTRY:.*:]]
+; CHECK-HEXAGON-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-HEXAGON:       [[THEN]]:
+; CHECK-HEXAGON-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-HEXAGON-NEXT:    tail call void @func0()
+; CHECK-HEXAGON-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-HEXAGON:       [[ELSE]]:
+; CHECK-HEXAGON-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-HEXAGON-NEXT:    tail call void @func1()
+; CHECK-HEXAGON-NEXT:    br label %[[FINALLY]]
+; CHECK-HEXAGON:       [[FINALLY]]:
+; CHECK-HEXAGON-NEXT:    [[VAL3:%.*]] = phi <8 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-HEXAGON-NEXT:    ret <8 x i8> [[VAL3]]
+;
+; CHECK-RISCV-LABEL: define <8 x i8> @shuffle_v8i8(
+; CHECK-RISCV-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-RISCV-NEXT:  [[ENTRY:.*:]]
+; CHECK-RISCV-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-RISCV:       [[THEN]]:
+; CHECK-RISCV-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-RISCV-NEXT:    tail call void @func0()
+; CHECK-RISCV-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-RISCV:       [[ELSE]]:
+; CHECK-RISCV-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-RISCV-NEXT:    tail call void @func1()
+; CHECK-RISCV-NEXT:    br label %[[FINALLY]]
+; CHECK-RISCV:       [[FINALLY]]:
+; CHECK-RISCV-NEXT:    [[VAL3:%.*]] = phi <8 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-RISCV-NEXT:    ret <8 x i8> [[VAL3]]
+;
+; CHECK-X86-V1-LABEL: define <8 x i8> @shuffle_v8i8(
+; CHECK-X86-V1-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V1-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V1:       [[THEN]]:
+; CHECK-X86-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-X86-V1-NEXT:    tail call void @func0()
+; CHECK-X86-V1-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V1:       [[ELSE]]:
+; CHECK-X86-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V1-NEXT:    tail call void @func1()
+; CHECK-X86-V1-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V1:       [[FINALLY]]:
+; CHECK-X86-V1-NEXT:    [[VAL3:%.*]] = phi <8 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V1-NEXT:    ret <8 x i8> [[VAL3]]
+;
+; CHECK-X86-V2-LABEL: define <8 x i8> @shuffle_v8i8(
+; CHECK-X86-V2-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V2-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V2:       [[THEN]]:
+; CHECK-X86-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-X86-V2-NEXT:    tail call void @func0()
+; CHECK-X86-V2-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V2:       [[ELSE]]:
+; CHECK-X86-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V2-NEXT:    tail call void @func1()
+; CHECK-X86-V2-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V2:       [[FINALLY]]:
+; CHECK-X86-V2-NEXT:    [[VAL3:%.*]] = phi <8 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V2-NEXT:    ret <8 x i8> [[VAL3]]
+;
+; CHECK-X86-V3-LABEL: define <8 x i8> @shuffle_v8i8(
+; CHECK-X86-V3-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V3-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V3:       [[THEN]]:
+; CHECK-X86-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-X86-V3-NEXT:    tail call void @func0()
+; CHECK-X86-V3-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V3:       [[ELSE]]:
+; CHECK-X86-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V3-NEXT:    tail call void @func1()
+; CHECK-X86-V3-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V3:       [[FINALLY]]:
+; CHECK-X86-V3-NEXT:    [[VAL3:%.*]] = phi <8 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V3-NEXT:    ret <8 x i8> [[VAL3]]
+;
+; CHECK-X86-V4-LABEL: define <8 x i8> @shuffle_v8i8(
+; CHECK-X86-V4-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V4-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V4:       [[THEN]]:
+; CHECK-X86-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-X86-V4-NEXT:    tail call void @func0()
+; CHECK-X86-V4-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V4:       [[ELSE]]:
+; CHECK-X86-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V4-NEXT:    tail call void @func1()
+; CHECK-X86-V4-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V4:       [[FINALLY]]:
+; CHECK-X86-V4-NEXT:    [[VAL3:%.*]] = phi <8 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V4-NEXT:    ret <8 x i8> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <8 x i8> [ %val1, %then ], [ %val2, %else ]
+  ret <8 x i8> %val3
+}
+
+define <16 x i8> @shuffle_v16i8(<3 x i8> %arg0, i1 %cond) {
+; CHECK-LABEL: define <16 x i8> @shuffle_v16i8(
+; CHECK-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <16 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <16 x i8> [[VAL3]]
+;
+; CHECK-AARCH64-LABEL: define <16 x i8> @shuffle_v16i8(
+; CHECK-AARCH64-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-AARCH64-NEXT:  [[ENTRY:.*:]]
+; CHECK-AARCH64-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-AARCH64:       [[THEN]]:
+; CHECK-AARCH64-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-AARCH64-NEXT:    tail call void @func0()
+; CHECK-AARCH64-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-AARCH64:       [[ELSE]]:
+; CHECK-AARCH64-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-AARCH64-NEXT:    tail call void @func1()
+; CHECK-AARCH64-NEXT:    br label %[[FINALLY]]
+; CHECK-AARCH64:       [[FINALLY]]:
+; CHECK-AARCH64-NEXT:    [[VAL3:%.*]] = phi <16 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-AARCH64-NEXT:    ret <16 x i8> [[VAL3]]
+;
+; CHECK-AMDGPU-LABEL: define <16 x i8> @shuffle_v16i8(
+; CHECK-AMDGPU-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-AMDGPU-NEXT:  [[ENTRY:.*:]]
+; CHECK-AMDGPU-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-AMDGPU:       [[THEN]]:
+; CHECK-AMDGPU-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-AMDGPU-NEXT:    tail call void @func0()
+; CHECK-AMDGPU-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-AMDGPU:       [[ELSE]]:
+; CHECK-AMDGPU-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-AMDGPU-NEXT:    tail call void @func1()
+; CHECK-AMDGPU-NEXT:    br label %[[FINALLY]]
+; CHECK-AMDGPU:       [[FINALLY]]:
+; CHECK-AMDGPU-NEXT:    [[VAL3:%.*]] = phi <16 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-AMDGPU-NEXT:    ret <16 x i8> [[VAL3]]
+;
+; CHECK-ARM-LABEL: define <16 x i8> @shuffle_v16i8(
+; CHECK-ARM-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-ARM-NEXT:  [[ENTRY:.*:]]
+; CHECK-ARM-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-ARM:       [[THEN]]:
+; CHECK-ARM-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-ARM-NEXT:    tail call void @func0()
+; CHECK-ARM-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-ARM:       [[ELSE]]:
+; CHECK-ARM-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-ARM-NEXT:    tail call void @func1()
+; CHECK-ARM-NEXT:    br label %[[FINALLY]]
+; CHECK-ARM:       [[FINALLY]]:
+; CHECK-ARM-NEXT:    [[VAL3:%.*]] = phi <16 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-ARM-NEXT:    ret <16 x i8> [[VAL3]]
+;
+; CHECK-HEXAGON-LABEL: define <16 x i8> @shuffle_v16i8(
+; CHECK-HEXAGON-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-HEXAGON-NEXT:  [[ENTRY:.*:]]
+; CHECK-HEXAGON-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-HEXAGON:       [[THEN]]:
+; CHECK-HEXAGON-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-HEXAGON-NEXT:    tail call void @func0()
+; CHECK-HEXAGON-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-HEXAGON:       [[ELSE]]:
+; CHECK-HEXAGON-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-HEXAGON-NEXT:    tail call void @func1()
+; CHECK-HEXAGON-NEXT:    br label %[[FINALLY]]
+; CHECK-HEXAGON:       [[FINALLY]]:
+; CHECK-HEXAGON-NEXT:    [[VAL3:%.*]] = phi <16 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-HEXAGON-NEXT:    ret <16 x i8> [[VAL3]]
+;
+; CHECK-RISCV-LABEL: define <16 x i8> @shuffle_v16i8(
+; CHECK-RISCV-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-RISCV-NEXT:  [[ENTRY:.*:]]
+; CHECK-RISCV-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-RISCV:       [[THEN]]:
+; CHECK-RISCV-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-RISCV-NEXT:    tail call void @func0()
+; CHECK-RISCV-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-RISCV:       [[ELSE]]:
+; CHECK-RISCV-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-RISCV-NEXT:    tail call void @func1()
+; CHECK-RISCV-NEXT:    br label %[[FINALLY]]
+; CHECK-RISCV:       [[FINALLY]]:
+; CHECK-RISCV-NEXT:    [[VAL3:%.*]] = phi <16 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-RISCV-NEXT:    ret <16 x i8> [[VAL3]]
+;
+; CHECK-X86-V1-LABEL: define <16 x i8> @shuffle_v16i8(
+; CHECK-X86-V1-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V1-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V1:       [[THEN]]:
+; CHECK-X86-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-X86-V1-NEXT:    tail call void @func0()
+; CHECK-X86-V1-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V1:       [[ELSE]]:
+; CHECK-X86-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V1-NEXT:    tail call void @func1()
+; CHECK-X86-V1-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V1:       [[FINALLY]]:
+; CHECK-X86-V1-NEXT:    [[VAL3:%.*]] = phi <16 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V1-NEXT:    ret <16 x i8> [[VAL3]]
+;
+; CHECK-X86-V2-LABEL: define <16 x i8> @shuffle_v16i8(
+; CHECK-X86-V2-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V2-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V2:       [[THEN]]:
+; CHECK-X86-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-X86-V2-NEXT:    tail call void @func0()
+; CHECK-X86-V2-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V2:       [[ELSE]]:
+; CHECK-X86-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V2-NEXT:    tail call void @func1()
+; CHECK-X86-V2-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V2:       [[FINALLY]]:
+; CHECK-X86-V2-NEXT:    [[VAL3:%.*]] = phi <16 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V2-NEXT:    ret <16 x i8> [[VAL3]]
+;
+; CHECK-X86-V3-LABEL: define <16 x i8> @shuffle_v16i8(
+; CHECK-X86-V3-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V3-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V3:       [[THEN]]:
+; CHECK-X86-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-X86-V3-NEXT:    tail call void @func0()
+; CHECK-X86-V3-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V3:       [[ELSE]]:
+; CHECK-X86-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V3-NEXT:    tail call void @func1()
+; CHECK-X86-V3-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V3:       [[FINALLY]]:
+; CHECK-X86-V3-NEXT:    [[VAL3:%.*]] = phi <16 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V3-NEXT:    ret <16 x i8> [[VAL3]]
+;
+; CHECK-X86-V4-LABEL: define <16 x i8> @shuffle_v16i8(
+; CHECK-X86-V4-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V4-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V4:       [[THEN]]:
+; CHECK-X86-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-X86-V4-NEXT:    tail call void @func0()
+; CHECK-X86-V4-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V4:       [[ELSE]]:
+; CHECK-X86-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V4-NEXT:    tail call void @func1()
+; CHECK-X86-V4-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V4:       [[FINALLY]]:
+; CHECK-X86-V4-NEXT:    [[VAL3:%.*]] = phi <16 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V4-NEXT:    ret <16 x i8> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <16 x i8> [ %val1, %then ], [ %val2, %else ]
+  ret <16 x i8> %val3
+}
+
+define <32 x i8> @shuffle_v32i8(<3 x i8> %arg0, i1 %cond) {
+; CHECK-LABEL: define <32 x i8> @shuffle_v32i8(
+; CHECK-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <32 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <32 x i8> [[VAL3]]
+;
+; CHECK-AARCH64-LABEL: define <32 x i8> @shuffle_v32i8(
+; CHECK-AARCH64-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-AARCH64-NEXT:  [[ENTRY:.*:]]
+; CHECK-AARCH64-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-AARCH64:       [[THEN]]:
+; CHECK-AARCH64-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-AARCH64-NEXT:    tail call void @func0()
+; CHECK-AARCH64-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-AARCH64:       [[ELSE]]:
+; CHECK-AARCH64-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-AARCH64-NEXT:    tail call void @func1()
+; CHECK-AARCH64-NEXT:    br label %[[FINALLY]]
+; CHECK-AARCH64:       [[FINALLY]]:
+; CHECK-AARCH64-NEXT:    [[VAL3:%.*]] = phi <32 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-AARCH64-NEXT:    ret <32 x i8> [[VAL3]]
+;
+; CHECK-AMDGPU-LABEL: define <32 x i8> @shuffle_v32i8(
+; CHECK-AMDGPU-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-AMDGPU-NEXT:  [[ENTRY:.*:]]
+; CHECK-AMDGPU-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-AMDGPU:       [[THEN]]:
+; CHECK-AMDGPU-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-AMDGPU-NEXT:    tail call void @func0()
+; CHECK-AMDGPU-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-AMDGPU:       [[ELSE]]:
+; CHECK-AMDGPU-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-AMDGPU-NEXT:    tail call void @func1()
+; CHECK-AMDGPU-NEXT:    br label %[[FINALLY]]
+; CHECK-AMDGPU:       [[FINALLY]]:
+; CHECK-AMDGPU-NEXT:    [[VAL3:%.*]] = phi <32 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-AMDGPU-NEXT:    ret <32 x i8> [[VAL3]]
+;
+; CHECK-ARM-LABEL: define <32 x i8> @shuffle_v32i8(
+; CHECK-ARM-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-ARM-NEXT:  [[ENTRY:.*:]]
+; CHECK-ARM-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-ARM:       [[THEN]]:
+; CHECK-ARM-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-ARM-NEXT:    tail call void @func0()
+; CHECK-ARM-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-ARM:       [[ELSE]]:
+; CHECK-ARM-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-ARM-NEXT:    tail call void @func1()
+; CHECK-ARM-NEXT:    br label %[[FINALLY]]
+; CHECK-ARM:       [[FINALLY]]:
+; CHECK-ARM-NEXT:    [[VAL3:%.*]] = phi <32 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-ARM-NEXT:    ret <32 x i8> [[VAL3]]
+;
+; CHECK-HEXAGON-LABEL: define <32 x i8> @shuffle_v32i8(
+; CHECK-HEXAGON-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-HEXAGON-NEXT:  [[ENTRY:.*:]]
+; CHECK-HEXAGON-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-HEXAGON:       [[THEN]]:
+; CHECK-HEXAGON-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-HEXAGON-NEXT:    tail call void @func0()
+; CHECK-HEXAGON-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-HEXAGON:       [[ELSE]]:
+; CHECK-HEXAGON-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-HEXAGON-NEXT:    tail call void @func1()
+; CHECK-HEXAGON-NEXT:    br label %[[FINALLY]]
+; CHECK-HEXAGON:       [[FINALLY]]:
+; CHECK-HEXAGON-NEXT:    [[VAL3:%.*]] = phi <32 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-HEXAGON-NEXT:    ret <32 x i8> [[VAL3]]
+;
+; CHECK-RISCV-LABEL: define <32 x i8> @shuffle_v32i8(
+; CHECK-RISCV-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-RISCV-NEXT:  [[ENTRY:.*:]]
+; CHECK-RISCV-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-RISCV:       [[THEN]]:
+; CHECK-RISCV-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-RISCV-NEXT:    tail call void @func0()
+; CHECK-RISCV-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-RISCV:       [[ELSE]]:
+; CHECK-RISCV-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-RISCV-NEXT:    tail call void @func1()
+; CHECK-RISCV-NEXT:    br label %[[FINALLY]]
+; CHECK-RISCV:       [[FINALLY]]:
+; CHECK-RISCV-NEXT:    [[VAL3:%.*]] = phi <32 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-RISCV-NEXT:    ret <32 x i8> [[VAL3]]
+;
+; CHECK-X86-V1-LABEL: define <32 x i8> @shuffle_v32i8(
+; CHECK-X86-V1-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V1-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V1:       [[THEN]]:
+; CHECK-X86-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-X86-V1-NEXT:    tail call void @func0()
+; CHECK-X86-V1-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V1:       [[ELSE]]:
+; CHECK-X86-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V1-NEXT:    tail call void @func1()
+; CHECK-X86-V1-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V1:       [[FINALLY]]:
+; CHECK-X86-V1-NEXT:    [[VAL3:%.*]] = phi <32 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V1-NEXT:    ret <32 x i8> [[VAL3]]
+;
+; CHECK-X86-V2-LABEL: define <32 x i8> @shuffle_v32i8(
+; CHECK-X86-V2-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V2-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V2:       [[THEN]]:
+; CHECK-X86-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-X86-V2-NEXT:    tail call void @func0()
+; CHECK-X86-V2-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V2:       [[ELSE]]:
+; CHECK-X86-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V2-NEXT:    tail call void @func1()
+; CHECK-X86-V2-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V2:       [[FINALLY]]:
+; CHECK-X86-V2-NEXT:    [[VAL3:%.*]] = phi <32 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V2-NEXT:    ret <32 x i8> [[VAL3]]
+;
+; CHECK-X86-V3-LABEL: define <32 x i8> @shuffle_v32i8(
+; CHECK-X86-V3-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V3-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V3:       [[THEN]]:
+; CHECK-X86-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-X86-V3-NEXT:    tail call void @func0()
+; CHECK-X86-V3-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V3:       [[ELSE]]:
+; CHECK-X86-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V3-NEXT:    tail call void @func1()
+; CHECK-X86-V3-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V3:       [[FINALLY]]:
+; CHECK-X86-V3-NEXT:    [[VAL3:%.*]] = phi <32 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V3-NEXT:    ret <32 x i8> [[VAL3]]
+;
+; CHECK-X86-V4-LABEL: define <32 x i8> @shuffle_v32i8(
+; CHECK-X86-V4-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V4-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V4:       [[THEN]]:
+; CHECK-X86-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-X86-V4-NEXT:    tail call void @func0()
+; CHECK-X86-V4-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V4:       [[ELSE]]:
+; CHECK-X86-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V4-NEXT:    tail call void @func1()
+; CHECK-X86-V4-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V4:       [[FINALLY]]:
+; CHECK-X86-V4-NEXT:    [[VAL3:%.*]] = phi <32 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V4-NEXT:    ret <32 x i8> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <32 x i8> [ %val1, %then ], [ %val2, %else ]
+  ret <32 x i8> %val3
+}
+
+define <2 x i16> @shuffle_v2i16(<2 x i16> %arg0, i1 %cond) {
+; CHECK-LABEL: define <2 x i16> @shuffle_v2i16(
+; CHECK-SAME: <2 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i16> [[ARG0]], <2 x i16> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i16> [[ARG0]], <2 x i16> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <2 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <2 x i16> [[VAL3]]
+;
+; CHECK-AARCH64-LABEL: define <2 x i16> @shuffle_v2i16(
+; CHECK-AARCH64-SAME: <2 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-AARCH64-NEXT:  [[ENTRY:.*:]]
+; CHECK-AARCH64-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-AARCH64:       [[THEN]]:
+; CHECK-AARCH64-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i16> [[ARG0]], <2 x i16> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-AARCH64-NEXT:    tail call void @func0()
+; CHECK-AARCH64-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-AARCH64:       [[ELSE]]:
+; CHECK-AARCH64-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i16> [[ARG0]], <2 x i16> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-AARCH64-NEXT:    tail call void @func1()
+; CHECK-AARCH64-NEXT:    br label %[[FINALLY]]
+; CHECK-AARCH64:       [[FINALLY]]:
+; CHECK-AARCH64-NEXT:    [[VAL3:%.*]] = phi <2 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-AARCH64-NEXT:    ret <2 x i16> [[VAL3]]
+;
+; CHECK-AMDGPU-LABEL: define <2 x i16> @shuffle_v2i16(
+; CHECK-AMDGPU-SAME: <2 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-AMDGPU-NEXT:  [[ENTRY:.*:]]
+; CHECK-AMDGPU-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-AMDGPU:       [[THEN]]:
+; CHECK-AMDGPU-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i16> [[ARG0]], <2 x i16> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-AMDGPU-NEXT:    tail call void @func0()
+; CHECK-AMDGPU-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-AMDGPU:       [[ELSE]]:
+; CHECK-AMDGPU-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i16> [[ARG0]], <2 x i16> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-AMDGPU-NEXT:    tail call void @func1()
+; CHECK-AMDGPU-NEXT:    br label %[[FINALLY]]
+; CHECK-AMDGPU:       [[FINALLY]]:
+; CHECK-AMDGPU-NEXT:    [[VAL3:%.*]] = phi <2 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-AMDGPU-NEXT:    ret <2 x i16> [[VAL3]]
+;
+; CHECK-ARM-LABEL: define <2 x i16> @shuffle_v2i16(
+; CHECK-ARM-SAME: <2 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-ARM-NEXT:  [[ENTRY:.*:]]
+; CHECK-ARM-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-ARM:       [[THEN]]:
+; CHECK-ARM-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i16> [[ARG0]], <2 x i16> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-ARM-NEXT:    tail call void @func0()
+; CHECK-ARM-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-ARM:       [[ELSE]]:
+; CHECK-ARM-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i16> [[ARG0]], <2 x i16> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-ARM-NEXT:    tail call void @func1()
+; CHECK-ARM-NEXT:    br label %[[FINALLY]]
+; CHECK-ARM:       [[FINALLY]]:
+; CHECK-ARM-NEXT:    [[VAL3:%.*]] = phi <2 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-ARM-NEXT:    ret <2 x i16> [[VAL3]]
+;
+; CHECK-HEXAGON-LABEL: define <2 x i16> @shuffle_v2i16(
+; CHECK-HEXAGON-SAME: <2 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-HEXAGON-NEXT:  [[ENTRY:.*:]]
+; CHECK-HEXAGON-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-HEXAGON:       [[THEN]]:
+; CHECK-HEXAGON-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i16> [[ARG0]], <2 x i16> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-HEXAGON-NEXT:    tail call void @func0()
+; CHECK-HEXAGON-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-HEXAGON:       [[ELSE]]:
+; CHECK-HEXAGON-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i16> [[ARG0]], <2 x i16> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-HEXAGON-NEXT:    tail call void @func1()
+; CHECK-HEXAGON-NEXT:    br label %[[FINALLY]]
+; CHECK-HEXAGON:       [[FINALLY]]:
+; CHECK-HEXAGON-NEXT:    [[VAL3:%.*]] = phi <2 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-HEXAGON-NEXT:    ret <2 x i16> [[VAL3]]
+;
+; CHECK-RISCV-LABEL: define <2 x i16> @shuffle_v2i16(
+; CHECK-RISCV-SAME: <2 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-RISCV-NEXT:  [[ENTRY:.*:]]
+; CHECK-RISCV-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-RISCV:       [[THEN]]:
+; CHECK-RISCV-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i16> [[ARG0]], <2 x i16> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-RISCV-NEXT:    tail call void @func0()
+; CHECK-RISCV-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-RISCV:       [[ELSE]]:
+; CHECK-RISCV-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i16> [[ARG0]], <2 x i16> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-RISCV-NEXT:    tail call void @func1()
+; CHECK-RISCV-NEXT:    br label %[[FINALLY]]
+; CHECK-RISCV:       [[FINALLY]]:
+; CHECK-RISCV-NEXT:    [[VAL3:%.*]] = phi <2 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-RISCV-NEXT:    ret <2 x i16> [[VAL3]]
+;
+; CHECK-X86-V1-LABEL: define <2 x i16> @shuffle_v2i16(
+; CHECK-X86-V1-SAME: <2 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V1-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V1:       [[THEN]]:
+; CHECK-X86-V1-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i16> [[ARG0]], <2 x i16> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-X86-V1-NEXT:    tail call void @func0()
+; CHECK-X86-V1-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V1:       [[ELSE]]:
+; CHECK-X86-V1-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i16> [[ARG0]], <2 x i16> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-X86-V1-NEXT:    tail call void @func1()
+; CHECK-X86-V1-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V1:       [[FINALLY]]:
+; CHECK-X86-V1-NEXT:    [[VAL3:%.*]] = phi <2 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V1-NEXT:    ret <2 x i16> [[VAL3]]
+;
+; CHECK-X86-V2-LABEL: define <2 x i16> @shuffle_v2i16(
+; CHECK-X86-V2-SAME: <2 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V2-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V2:       [[THEN]]:
+; CHECK-X86-V2-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i16> [[ARG0]], <2 x i16> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-X86-V2-NEXT:    tail call void @func0()
+; CHECK-X86-V2-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V2:       [[ELSE]]:
+; CHECK-X86-V2-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i16> [[ARG0]], <2 x i16> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-X86-V2-NEXT:    tail call void @func1()
+; CHECK-X86-V2-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V2:       [[FINALLY]]:
+; CHECK-X86-V2-NEXT:    [[VAL3:%.*]] = phi <2 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V2-NEXT:    ret <2 x i16> [[VAL3]]
+;
+; CHECK-X86-V3-LABEL: define <2 x i16> @shuffle_v2i16(
+; CHECK-X86-V3-SAME: <2 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V3-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V3:       [[THEN]]:
+; CHECK-X86-V3-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i16> [[ARG0]], <2 x i16> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-X86-V3-NEXT:    tail call void @func0()
+; CHECK-X86-V3-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V3:       [[ELSE]]:
+; CHECK-X86-V3-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i16> [[ARG0]], <2 x i16> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-X86-V3-NEXT:    tail call void @func1()
+; CHECK-X86-V3-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V3:       [[FINALLY]]:
+; CHECK-X86-V3-NEXT:    [[VAL3:%.*]] = phi <2 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V3-NEXT:    ret <2 x i16> [[VAL3]]
+;
+; CHECK-X86-V4-LABEL: define <2 x i16> @shuffle_v2i16(
+; CHECK-X86-V4-SAME: <2 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V4-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V4:       [[THEN]]:
+; CHECK-X86-V4-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i16> [[ARG0]], <2 x i16> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-X86-V4-NEXT:    tail call void @func0()
+; CHECK-X86-V4-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V4:       [[ELSE]]:
+; CHECK-X86-V4-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i16> [[ARG0]], <2 x i16> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-X86-V4-NEXT:    tail call void @func1()
+; CHECK-X86-V4-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V4:       [[FINALLY]]:
+; CHECK-X86-V4-NEXT:    [[VAL3:%.*]] = phi <2 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V4-NEXT:    ret <2 x i16> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <2 x i16> %arg0, <2 x i16> poison, <2 x i32> <i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <2 x i16> %arg0, <2 x i16> poison, <2 x i32> <i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <2 x i16> [ %val1, %then ], [ %val2, %else ]
+  ret <2 x i16> %val3
+}
+
+define <4 x i16> @shuffle_v4i16(<3 x i16> %arg0, i1 %cond) {
+; CHECK-LABEL: define <4 x i16> @shuffle_v4i16(
+; CHECK-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <4 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <4 x i16> [[VAL3]]
+;
+; CHECK-AARCH64-LABEL: define <4 x i16> @shuffle_v4i16(
+; CHECK-AARCH64-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-AARCH64-NEXT:  [[ENTRY:.*:]]
+; CHECK-AARCH64-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-AARCH64:       [[THEN]]:
+; CHECK-AARCH64-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-AARCH64-NEXT:    tail call void @func0()
+; CHECK-AARCH64-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-AARCH64:       [[ELSE]]:
+; CHECK-AARCH64-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-AARCH64-NEXT:    tail call void @func1()
+; CHECK-AARCH64-NEXT:    br label %[[FINALLY]]
+; CHECK-AARCH64:       [[FINALLY]]:
+; CHECK-AARCH64-NEXT:    [[VAL3:%.*]] = phi <4 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-AARCH64-NEXT:    ret <4 x i16> [[VAL3]]
+;
+; CHECK-AMDGPU-LABEL: define <4 x i16> @shuffle_v4i16(
+; CHECK-AMDGPU-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-AMDGPU-NEXT:  [[ENTRY:.*:]]
+; CHECK-AMDGPU-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-AMDGPU:       [[THEN]]:
+; CHECK-AMDGPU-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-AMDGPU-NEXT:    tail call void @func0()
+; CHECK-AMDGPU-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-AMDGPU:       [[ELSE]]:
+; CHECK-AMDGPU-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-AMDGPU-NEXT:    tail call void @func1()
+; CHECK-AMDGPU-NEXT:    br label %[[FINALLY]]
+; CHECK-AMDGPU:       [[FINALLY]]:
+; CHECK-AMDGPU-NEXT:    [[VAL3:%.*]] = phi <4 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-AMDGPU-NEXT:    ret <4 x i16> [[VAL3]]
+;
+; CHECK-ARM-LABEL: define <4 x i16> @shuffle_v4i16(
+; CHECK-ARM-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-ARM-NEXT:  [[ENTRY:.*:]]
+; CHECK-ARM-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-ARM:       [[THEN]]:
+; CHECK-ARM-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-ARM-NEXT:    tail call void @func0()
+; CHECK-ARM-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-ARM:       [[ELSE]]:
+; CHECK-ARM-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-ARM-NEXT:    tail call void @func1()
+; CHECK-ARM-NEXT:    br label %[[FINALLY]]
+; CHECK-ARM:       [[FINALLY]]:
+; CHECK-ARM-NEXT:    [[VAL3:%.*]] = phi <4 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-ARM-NEXT:    ret <4 x i16> [[VAL3]]
+;
+; CHECK-HEXAGON-LABEL: define <4 x i16> @shuffle_v4i16(
+; CHECK-HEXAGON-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-HEXAGON-NEXT:  [[ENTRY:.*:]]
+; CHECK-HEXAGON-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-HEXAGON:       [[THEN]]:
+; CHECK-HEXAGON-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-HEXAGON-NEXT:    tail call void @func0()
+; CHECK-HEXAGON-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-HEXAGON:       [[ELSE]]:
+; CHECK-HEXAGON-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-HEXAGON-NEXT:    tail call void @func1()
+; CHECK-HEXAGON-NEXT:    br label %[[FINALLY]]
+; CHECK-HEXAGON:       [[FINALLY]]:
+; CHECK-HEXAGON-NEXT:    [[VAL3:%.*]] = phi <4 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-HEXAGON-NEXT:    ret <4 x i16> [[VAL3]]
+;
+; CHECK-RISCV-LABEL: define <4 x i16> @shuffle_v4i16(
+; CHECK-RISCV-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-RISCV-NEXT:  [[ENTRY:.*:]]
+; CHECK-RISCV-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-RISCV:       [[THEN]]:
+; CHECK-RISCV-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-RISCV-NEXT:    tail call void @func0()
+; CHECK-RISCV-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-RISCV:       [[ELSE]]:
+; CHECK-RISCV-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-RISCV-NEXT:    tail call void @func1()
+; CHECK-RISCV-NEXT:    br label %[[FINALLY]]
+; CHECK-RISCV:       [[FINALLY]]:
+; CHECK-RISCV-NEXT:    [[VAL3:%.*]] = phi <4 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-RISCV-NEXT:    ret <4 x i16> [[VAL3]]
+;
+; CHECK-X86-V1-LABEL: define <4 x i16> @shuffle_v4i16(
+; CHECK-X86-V1-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V1-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V1:       [[THEN]]:
+; CHECK-X86-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-X86-V1-NEXT:    tail call void @func0()
+; CHECK-X86-V1-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V1:       [[ELSE]]:
+; CHECK-X86-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V1-NEXT:    tail call void @func1()
+; CHECK-X86-V1-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V1:       [[FINALLY]]:
+; CHECK-X86-V1-NEXT:    [[VAL3:%.*]] = phi <4 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V1-NEXT:    ret <4 x i16> [[VAL3]]
+;
+; CHECK-X86-V2-LABEL: define <4 x i16> @shuffle_v4i16(
+; CHECK-X86-V2-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V2-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V2:       [[THEN]]:
+; CHECK-X86-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-X86-V2-NEXT:    tail call void @func0()
+; CHECK-X86-V2-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V2:       [[ELSE]]:
+; CHECK-X86-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V2-NEXT:    tail call void @func1()
+; CHECK-X86-V2-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V2:       [[FINALLY]]:
+; CHECK-X86-V2-NEXT:    [[VAL3:%.*]] = phi <4 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V2-NEXT:    ret <4 x i16> [[VAL3]]
+;
+; CHECK-X86-V3-LABEL: define <4 x i16> @shuffle_v4i16(
+; CHECK-X86-V3-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V3-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V3:       [[THEN]]:
+; CHECK-X86-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-X86-V3-NEXT:    tail call void @func0()
+; CHECK-X86-V3-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V3:       [[ELSE]]:
+; CHECK-X86-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V3-NEXT:    tail call void @func1()
+; CHECK-X86-V3-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V3:       [[FINALLY]]:
+; CHECK-X86-V3-NEXT:    [[VAL3:%.*]] = phi <4 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V3-NEXT:    ret <4 x i16> [[VAL3]]
+;
+; CHECK-X86-V4-LABEL: define <4 x i16> @shuffle_v4i16(
+; CHECK-X86-V4-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V4-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V4:       [[THEN]]:
+; CHECK-X86-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-X86-V4-NEXT:    tail call void @func0()
+; CHECK-X86-V4-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V4:       [[ELSE]]:
+; CHECK-X86-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V4-NEXT:    tail call void @func1()
+; CHECK-X86-V4-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V4:       [[FINALLY]]:
+; CHECK-X86-V4-NEXT:    [[VAL3:%.*]] = phi <4 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V4-NEXT:    ret <4 x i16> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <4 x i16> [ %val1, %then ], [ %val2, %else ]
+  ret <4 x i16> %val3
+}
+
+define <8 x i16> @shuffle_v8i16(<3 x i16> %arg0, i1 %cond) {
+; CHECK-LABEL: define <8 x i16> @shuffle_v8i16(
+; CHECK-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <8 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <8 x i16> [[VAL3]]
+;
+; CHECK-AARCH64-LABEL: define <8 x i16> @shuffle_v8i16(
+; CHECK-AARCH64-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-AARCH64-NEXT:  [[ENTRY:.*:]]
+; CHECK-AARCH64-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-AARCH64:       [[THEN]]:
+; CHECK-AARCH64-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-AARCH64-NEXT:    tail call void @func0()
+; CHECK-AARCH64-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-AARCH64:       [[ELSE]]:
+; CHECK-AARCH64-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-AARCH64-NEXT:    tail call void @func1()
+; CHECK-AARCH64-NEXT:    br label %[[FINALLY]]
+; CHECK-AARCH64:       [[FINALLY]]:
+; CHECK-AARCH64-NEXT:    [[VAL3:%.*]] = phi <8 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-AARCH64-NEXT:    ret <8 x i16> [[VAL3]]
+;
+; CHECK-AMDGPU-LABEL: define <8 x i16> @shuffle_v8i16(
+; CHECK-AMDGPU-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-AMDGPU-NEXT:  [[ENTRY:.*:]]
+; CHECK-AMDGPU-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-AMDGPU:       [[THEN]]:
+; CHECK-AMDGPU-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-AMDGPU-NEXT:    tail call void @func0()
+; CHECK-AMDGPU-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-AMDGPU:       [[ELSE]]:
+; CHECK-AMDGPU-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-AMDGPU-NEXT:    tail call void @func1()
+; CHECK-AMDGPU-NEXT:    br label %[[FINALLY]]
+; CHECK-AMDGPU:       [[FINALLY]]:
+; CHECK-AMDGPU-NEXT:    [[VAL3:%.*]] = phi <8 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-AMDGPU-NEXT:    ret <8 x i16> [[VAL3]]
+;
+; CHECK-ARM-LABEL: define <8 x i16> @shuffle_v8i16(
+; CHECK-ARM-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-ARM-NEXT:  [[ENTRY:.*:]]
+; CHECK-ARM-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-ARM:       [[THEN]]:
+; CHECK-ARM-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-ARM-NEXT:    tail call void @func0()
+; CHECK-ARM-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-ARM:       [[ELSE]]:
+; CHECK-ARM-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-ARM-NEXT:    tail call void @func1()
+; CHECK-ARM-NEXT:    br label %[[FINALLY]]
+; CHECK-ARM:       [[FINALLY]]:
+; CHECK-ARM-NEXT:    [[VAL3:%.*]] = phi <8 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-ARM-NEXT:    ret <8 x i16> [[VAL3]]
+;
+; CHECK-HEXAGON-LABEL: define <8 x i16> @shuffle_v8i16(
+; CHECK-HEXAGON-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-HEXAGON-NEXT:  [[ENTRY:.*:]]
+; CHECK-HEXAGON-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-HEXAGON:       [[THEN]]:
+; CHECK-HEXAGON-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-HEXAGON-NEXT:    tail call void @func0()
+; CHECK-HEXAGON-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-HEXAGON:       [[ELSE]]:
+; CHECK-HEXAGON-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-HEXAGON-NEXT:    tail call void @func1()
+; CHECK-HEXAGON-NEXT:    br label %[[FINALLY]]
+; CHECK-HEXAGON:       [[FINALLY]]:
+; CHECK-HEXAGON-NEXT:    [[VAL3:%.*]] = phi <8 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-HEXAGON-NEXT:    ret <8 x i16> [[VAL3]]
+;
+; CHECK-RISCV-LABEL: define <8 x i16> @shuffle_v8i16(
+; CHECK-RISCV-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-RISCV-NEXT:  [[ENTRY:.*:]]
+; CHECK-RISCV-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-RISCV:       [[THEN]]:
+; CHECK-RISCV-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-RISCV-NEXT:    tail call void @func0()
+; CHECK-RISCV-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-RISCV:       [[ELSE]]:
+; CHECK-RISCV-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-RISCV-NEXT:    tail call void @func1()
+; CHECK-RISCV-NEXT:    br label %[[FINALLY]]
+; CHECK-RISCV:       [[FINALLY]]:
+; CHECK-RISCV-NEXT:    [[VAL3:%.*]] = phi <8 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-RISCV-NEXT:    ret <8 x i16> [[VAL3]]
+;
+; CHECK-X86-V1-LABEL: define <8 x i16> @shuffle_v8i16(
+; CHECK-X86-V1-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V1-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V1:       [[THEN]]:
+; CHECK-X86-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-X86-V1-NEXT:    tail call void @func0()
+; CHECK-X86-V1-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V1:       [[ELSE]]:
+; CHECK-X86-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V1-NEXT:    tail call void @func1()
+; CHECK-X86-V1-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V1:       [[FINALLY]]:
+; CHECK-X86-V1-NEXT:    [[VAL3:%.*]] = phi <8 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V1-NEXT:    ret <8 x i16> [[VAL3]]
+;
+; CHECK-X86-V2-LABEL: define <8 x i16> @shuffle_v8i16(
+; CHECK-X86-V2-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V2-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V2:       [[THEN]]:
+; CHECK-X86-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-X86-V2-NEXT:    tail call void @func0()
+; CHECK-X86-V2-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V2:       [[ELSE]]:
+; CHECK-X86-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V2-NEXT:    tail call void @func1()
+; CHECK-X86-V2-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V2:       [[FINALLY]]:
+; CHECK-X86-V2-NEXT:    [[VAL3:%.*]] = phi <8 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V2-NEXT:    ret <8 x i16> [[VAL3]]
+;
+; CHECK-X86-V3-LABEL: define <8 x i16> @shuffle_v8i16(
+; CHECK-X86-V3-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V3-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V3:       [[THEN]]:
+; CHECK-X86-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-X86-V3-NEXT:    tail call void @func0()
+; CHECK-X86-V3-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V3:       [[ELSE]]:
+; CHECK-X86-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V3-NEXT:    tail call void @func1()
+; CHECK-X86-V3-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V3:       [[FINALLY]]:
+; CHECK-X86-V3-NEXT:    [[VAL3:%.*]] = phi <8 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V3-NEXT:    ret <8 x i16> [[VAL3]]
+;
+; CHECK-X86-V4-LABEL: define <8 x i16> @shuffle_v8i16(
+; CHECK-X86-V4-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V4-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V4:       [[THEN]]:
+; CHECK-X86-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-X86-V4-NEXT:    tail call void @func0()
+; CHECK-X86-V4-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V4:       [[ELSE]]:
+; CHECK-X86-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V4-NEXT:    tail call void @func1()
+; CHECK-X86-V4-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V4:       [[FINALLY]]:
+; CHECK-X86-V4-NEXT:    [[VAL3:%.*]] = phi <8 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V4-NEXT:    ret <8 x i16> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <8 x i16> [ %val1, %then ], [ %val2, %else ]
+  ret <8 x i16> %val3
+}
+
+define <16 x i16> @shuffle_v16i16(<3 x i16> %arg0, i1 %cond) {
+; CHECK-LABEL: define <16 x i16> @shuffle_v16i16(
+; CHECK-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <16 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <16 x i16> [[VAL3]]
+;
+; CHECK-AARCH64-LABEL: define <16 x i16> @shuffle_v16i16(
+; CHECK-AARCH64-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-AARCH64-NEXT:  [[ENTRY:.*:]]
+; CHECK-AARCH64-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-AARCH64:       [[THEN]]:
+; CHECK-AARCH64-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-AARCH64-NEXT:    tail call void @func0()
+; CHECK-AARCH64-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-AARCH64:       [[ELSE]]:
+; CHECK-AARCH64-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-AARCH64-NEXT:    tail call void @func1()
+; CHECK-AARCH64-NEXT:    br label %[[FINALLY]]
+; CHECK-AARCH64:       [[FINALLY]]:
+; CHECK-AARCH64-NEXT:    [[VAL3:%.*]] = phi <16 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-AARCH64-NEXT:    ret <16 x i16> [[VAL3]]
+;
+; CHECK-AMDGPU-LABEL: define <16 x i16> @shuffle_v16i16(
+; CHECK-AMDGPU-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-AMDGPU-NEXT:  [[ENTRY:.*:]]
+; CHECK-AMDGPU-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-AMDGPU:       [[THEN]]:
+; CHECK-AMDGPU-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-AMDGPU-NEXT:    tail call void @func0()
+; CHECK-AMDGPU-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-AMDGPU:       [[ELSE]]:
+; CHECK-AMDGPU-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-AMDGPU-NEXT:    tail call void @func1()
+; CHECK-AMDGPU-NEXT:    br label %[[FINALLY]]
+; CHECK-AMDGPU:       [[FINALLY]]:
+; CHECK-AMDGPU-NEXT:    [[VAL3:%.*]] = phi <16 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-AMDGPU-NEXT:    ret <16 x i16> [[VAL3]]
+;
+; CHECK-ARM-LABEL: define <16 x i16> @shuffle_v16i16(
+; CHECK-ARM-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-ARM-NEXT:  [[ENTRY:.*:]]
+; CHECK-ARM-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-ARM:       [[THEN]]:
+; CHECK-ARM-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-ARM-NEXT:    tail call void @func0()
+; CHECK-ARM-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-ARM:       [[ELSE]]:
+; CHECK-ARM-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-ARM-NEXT:    tail call void @func1()
+; CHECK-ARM-NEXT:    br label %[[FINALLY]]
+; CHECK-ARM:       [[FINALLY]]:
+; CHECK-ARM-NEXT:    [[VAL3:%.*]] = phi <16 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-ARM-NEXT:    ret <16 x i16> [[VAL3]]
+;
+; CHECK-HEXAGON-LABEL: define <16 x i16> @shuffle_v16i16(
+; CHECK-HEXAGON-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-HEXAGON-NEXT:  [[ENTRY:.*:]]
+; CHECK-HEXAGON-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-HEXAGON:       [[THEN]]:
+; CHECK-HEXAGON-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-HEXAGON-NEXT:    tail call void @func0()
+; CHECK-HEXAGON-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-HEXAGON:       [[ELSE]]:
+; CHECK-HEXAGON-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-HEXAGON-NEXT:    tail call void @func1()
+; CHECK-HEXAGON-NEXT:    br label %[[FINALLY]]
+; CHECK-HEXAGON:       [[FINALLY]]:
+; CHECK-HEXAGON-NEXT:    [[VAL3:%.*]] = phi <16 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-HEXAGON-NEXT:    ret <16 x i16> [[VAL3]]
+;
+; CHECK-RISCV-LABEL: define <16 x i16> @shuffle_v16i16(
+; CHECK-RISCV-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-RISCV-NEXT:  [[ENTRY:.*:]]
+; CHECK-RISCV-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-RISCV:       [[THEN]]:
+; CHECK-RISCV-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-RISCV-NEXT:    tail call void @func0()
+; CHECK-RISCV-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-RISCV:       [[ELSE]]:
+; CHECK-RISCV-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-RISCV-NEXT:    tail call void @func1()
+; CHECK-RISCV-NEXT:    br label %[[FINALLY]]
+; CHECK-RISCV:       [[FINALLY]]:
+; CHECK-RISCV-NEXT:    [[VAL3:%.*]] = phi <16 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-RISCV-NEXT:    ret <16 x i16> [[VAL3]]
+;
+; CHECK-X86-V1-LABEL: define <16 x i16> @shuffle_v16i16(
+; CHECK-X86-V1-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V1-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V1:       [[THEN]]:
+; CHECK-X86-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-X86-V1-NEXT:    tail call void @func0()
+; CHECK-X86-V1-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V1:       [[ELSE]]:
+; CHECK-X86-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V1-NEXT:    tail call void @func1()
+; CHECK-X86-V1-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V1:       [[FINALLY]]:
+; CHECK-X86-V1-NEXT:    [[VAL3:%.*]] = phi <16 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V1-NEXT:    ret <16 x i16> [[VAL3]]
+;
+; CHECK-X86-V2-LABEL: define <16 x i16> @shuffle_v16i16(
+; CHECK-X86-V2-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V2-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V2:       [[THEN]]:
+; CHECK-X86-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-X86-V2-NEXT:    tail call void @func0()
+; CHECK-X86-V2-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V2:       [[ELSE]]:
+; CHECK-X86-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V2-NEXT:    tail call void @func1()
+; CHECK-X86-V2-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V2:       [[FINALLY]]:
+; CHECK-X86-V2-NEXT:    [[VAL3:%.*]] = phi <16 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V2-NEXT:    ret <16 x i16> [[VAL3]]
+;
+; CHECK-X86-V3-LABEL: define <16 x i16> @shuffle_v16i16(
+; CHECK-X86-V3-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V3-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V3:       [[THEN]]:
+; CHECK-X86-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-X86-V3-NEXT:    tail call void @func0()
+; CHECK-X86-V3-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V3:       [[ELSE]]:
+; CHECK-X86-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V3-NEXT:    tail call void @func1()
+; CHECK-X86-V3-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V3:       [[FINALLY]]:
+; CHECK-X86-V3-NEXT:    [[VAL3:%.*]] = phi <16 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V3-NEXT:    ret <16 x i16> [[VAL3]]
+;
+; CHECK-X86-V4-LABEL: define <16 x i16> @shuffle_v16i16(
+; CHECK-X86-V4-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V4-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V4:       [[THEN]]:
+; CHECK-X86-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-X86-V4-NEXT:    tail call void @func0()
+; CHECK-X86-V4-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V4:       [[ELSE]]:
+; CHECK-X86-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V4-NEXT:    tail call void @func1()
+; CHECK-X86-V4-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V4:       [[FINALLY]]:
+; CHECK-X86-V4-NEXT:    [[VAL3:%.*]] = phi <16 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V4-NEXT:    ret <16 x i16> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <16 x i16> [ %val1, %then ], [ %val2, %else ]
+  ret <16 x i16> %val3
+}
+
+define <32 x i16> @shuffle_v32i16(<3 x i16> %arg0, i1 %cond) {
+; CHECK-LABEL: define <32 x i16> @shuffle_v32i16(
+; CHECK-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <32 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <32 x i16> [[VAL3]]
+;
+; CHECK-AARCH64-LABEL: define <32 x i16> @shuffle_v32i16(
+; CHECK-AARCH64-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-AARCH64-NEXT:  [[ENTRY:.*:]]
+; CHECK-AARCH64-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-AARCH64:       [[THEN]]:
+; CHECK-AARCH64-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-AARCH64-NEXT:    tail call void @func0()
+; CHECK-AARCH64-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-AARCH64:       [[ELSE]]:
+; CHECK-AARCH64-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-AARCH64-NEXT:    tail call void @func1()
+; CHECK-AARCH64-NEXT:    br label %[[FINALLY]]
+; CHECK-AARCH64:       [[FINALLY]]:
+; CHECK-AARCH64-NEXT:    [[VAL3:%.*]] = phi <32 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-AARCH64-NEXT:    ret <32 x i16> [[VAL3]]
+;
+; CHECK-AMDGPU-LABEL: define <32 x i16> @shuffle_v32i16(
+; CHECK-AMDGPU-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-AMDGPU-NEXT:  [[ENTRY:.*:]]
+; CHECK-AMDGPU-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-AMDGPU:       [[THEN]]:
+; CHECK-AMDGPU-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-AMDGPU-NEXT:    tail call void @func0()
+; CHECK-AMDGPU-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-AMDGPU:       [[ELSE]]:
+; CHECK-AMDGPU-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-AMDGPU-NEXT:    tail call void @func1()
+; CHECK-AMDGPU-NEXT:    br label %[[FINALLY]]
+; CHECK-AMDGPU:       [[FINALLY]]:
+; CHECK-AMDGPU-NEXT:    [[VAL3:%.*]] = phi <32 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-AMDGPU-NEXT:    ret <32 x i16> [[VAL3]]
+;
+; CHECK-ARM-LABEL: define <32 x i16> @shuffle_v32i16(
+; CHECK-ARM-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-ARM-NEXT:  [[ENTRY:.*:]]
+; CHECK-ARM-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-ARM:       [[THEN]]:
+; CHECK-ARM-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-ARM-NEXT:    tail call void @func0()
+; CHECK-ARM-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-ARM:       [[ELSE]]:
+; CHECK-ARM-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-ARM-NEXT:    tail call void @func1()
+; CHECK-ARM-NEXT:    br label %[[FINALLY]]
+; CHECK-ARM:       [[FINALLY]]:
+; CHECK-ARM-NEXT:    [[VAL3:%.*]] = phi <32 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-ARM-NEXT:    ret <32 x i16> [[VAL3]]
+;
+; CHECK-HEXAGON-LABEL: define <32 x i16> @shuffle_v32i16(
+; CHECK-HEXAGON-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-HEXAGON-NEXT:  [[ENTRY:.*:]]
+; CHECK-HEXAGON-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-HEXAGON:       [[THEN]]:
+; CHECK-HEXAGON-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-HEXAGON-NEXT:    tail call void @func0()
+; CHECK-HEXAGON-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-HEXAGON:       [[ELSE]]:
+; CHECK-HEXAGON-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-HEXAGON-NEXT:    tail call void @func1()
+; CHECK-HEXAGON-NEXT:    br label %[[FINALLY]]
+; CHECK-HEXAGON:       [[FINALLY]]:
+; CHECK-HEXAGON-NEXT:    [[VAL3:%.*]] = phi <32 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-HEXAGON-NEXT:    ret <32 x i16> [[VAL3]]
+;
+; CHECK-RISCV-LABEL: define <32 x i16> @shuffle_v32i16(
+; CHECK-RISCV-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-RISCV-NEXT:  [[ENTRY:.*:]]
+; CHECK-RISCV-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-RISCV:       [[THEN]]:
+; CHECK-RISCV-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-RISCV-NEXT:    tail call void @func0()
+; CHECK-RISCV-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-RISCV:       [[ELSE]]:
+; CHECK-RISCV-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-RISCV-NEXT:    tail call void @func1()
+; CHECK-RISCV-NEXT:    br label %[[FINALLY]]
+; CHECK-RISCV:       [[FINALLY]]:
+; CHECK-RISCV-NEXT:    [[VAL3:%.*]] = phi <32 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-RISCV-NEXT:    ret <32 x i16> [[VAL3]]
+;
+; CHECK-X86-V1-LABEL: define <32 x i16> @shuffle_v32i16(
+; CHECK-X86-V1-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V1-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V1:       [[THEN]]:
+; CHECK-X86-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-X86-V1-NEXT:    tail call void @func0()
+; CHECK-X86-V1-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V1:       [[ELSE]]:
+; CHECK-X86-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V1-NEXT:    tail call void @func1()
+; CHECK-X86-V1-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V1:       [[FINALLY]]:
+; CHECK-X86-V1-NEXT:    [[VAL3:%.*]] = phi <32 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V1-NEXT:    ret <32 x i16> [[VAL3]]
+;
+; CHECK-X86-V2-LABEL: define <32 x i16> @shuffle_v32i16(
+; CHECK-X86-V2-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V2-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V2:       [[THEN]]:
+; CHECK-X86-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-X86-V2-NEXT:    tail call void @func0()
+; CHECK-X86-V2-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V2:       [[ELSE]]:
+; CHECK-X86-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V2-NEXT:    tail call void @func1()
+; CHECK-X86-V2-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V2:       [[FINALLY]]:
+; CHECK-X86-V2-NEXT:    [[VAL3:%.*]] = phi <32 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V2-NEXT:    ret <32 x i16> [[VAL3]]
+;
+; CHECK-X86-V3-LABEL: define <32 x i16> @shuffle_v32i16(
+; CHECK-X86-V3-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V3-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V3:       [[THEN]]:
+; CHECK-X86-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-X86-V3-NEXT:    tail call void @func0()
+; CHECK-X86-V3-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V3:       [[ELSE]]:
+; CHECK-X86-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V3-NEXT:    tail call void @func1()
+; CHECK-X86-V3-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V3:       [[FINALLY]]:
+; CHECK-X86-V3-NEXT:    [[VAL3:%.*]] = phi <32 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V3-NEXT:    ret <32 x i16> [[VAL3]]
+;
+; CHECK-X86-V4-LABEL: define <32 x i16> @shuffle_v32i16(
+; CHECK-X86-V4-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V4-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V4:       [[THEN]]:
+; CHECK-X86-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-X86-V4-NEXT:    tail call void @func0()
+; CHECK-X86-V4-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V4:       [[ELSE]]:
+; CHECK-X86-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V4-NEXT:    tail call void @func1()
+; CHECK-X86-V4-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V4:       [[FINALLY]]:
+; CHECK-X86-V4-NEXT:    [[VAL3:%.*]] = phi <32 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V4-NEXT:    ret <32 x i16> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <32 x i16> [ %val1, %then ], [ %val2, %else ]
+  ret <32 x i16> %val3
+}
+
+define <2 x i32> @shuffle_v2i32(<2 x i32> %arg0, i1 %cond) {
+; CHECK-LABEL: define <2 x i32> @shuffle_v2i32(
+; CHECK-SAME: <2 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i32> [[ARG0]], <2 x i32> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i32> [[ARG0]], <2 x i32> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <2 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <2 x i32> [[VAL3]]
+;
+; CHECK-AARCH64-LABEL: define <2 x i32> @shuffle_v2i32(
+; CHECK-AARCH64-SAME: <2 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-AARCH64-NEXT:  [[ENTRY:.*:]]
+; CHECK-AARCH64-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-AARCH64:       [[THEN]]:
+; CHECK-AARCH64-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i32> [[ARG0]], <2 x i32> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-AARCH64-NEXT:    tail call void @func0()
+; CHECK-AARCH64-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-AARCH64:       [[ELSE]]:
+; CHECK-AARCH64-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i32> [[ARG0]], <2 x i32> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-AARCH64-NEXT:    tail call void @func1()
+; CHECK-AARCH64-NEXT:    br label %[[FINALLY]]
+; CHECK-AARCH64:       [[FINALLY]]:
+; CHECK-AARCH64-NEXT:    [[VAL3:%.*]] = phi <2 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-AARCH64-NEXT:    ret <2 x i32> [[VAL3]]
+;
+; CHECK-AMDGPU-LABEL: define <2 x i32> @shuffle_v2i32(
+; CHECK-AMDGPU-SAME: <2 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-AMDGPU-NEXT:  [[ENTRY:.*:]]
+; CHECK-AMDGPU-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-AMDGPU:       [[THEN]]:
+; CHECK-AMDGPU-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i32> [[ARG0]], <2 x i32> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-AMDGPU-NEXT:    tail call void @func0()
+; CHECK-AMDGPU-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-AMDGPU:       [[ELSE]]:
+; CHECK-AMDGPU-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i32> [[ARG0]], <2 x i32> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-AMDGPU-NEXT:    tail call void @func1()
+; CHECK-AMDGPU-NEXT:    br label %[[FINALLY]]
+; CHECK-AMDGPU:       [[FINALLY]]:
+; CHECK-AMDGPU-NEXT:    [[VAL3:%.*]] = phi <2 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-AMDGPU-NEXT:    ret <2 x i32> [[VAL3]]
+;
+; CHECK-ARM-LABEL: define <2 x i32> @shuffle_v2i32(
+; CHECK-ARM-SAME: <2 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-ARM-NEXT:  [[ENTRY:.*:]]
+; CHECK-ARM-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-ARM:       [[THEN]]:
+; CHECK-ARM-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i32> [[ARG0]], <2 x i32> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-ARM-NEXT:    tail call void @func0()
+; CHECK-ARM-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-ARM:       [[ELSE]]:
+; CHECK-ARM-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i32> [[ARG0]], <2 x i32> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-ARM-NEXT:    tail call void @func1()
+; CHECK-ARM-NEXT:    br label %[[FINALLY]]
+; CHECK-ARM:       [[FINALLY]]:
+; CHECK-ARM-NEXT:    [[VAL3:%.*]] = phi <2 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-ARM-NEXT:    ret <2 x i32> [[VAL3]]
+;
+; CHECK-HEXAGON-LABEL: define <2 x i32> @shuffle_v2i32(
+; CHECK-HEXAGON-SAME: <2 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-HEXAGON-NEXT:  [[ENTRY:.*:]]
+; CHECK-HEXAGON-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-HEXAGON:       [[THEN]]:
+; CHECK-HEXAGON-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i32> [[ARG0]], <2 x i32> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-HEXAGON-NEXT:    tail call void @func0()
+; CHECK-HEXAGON-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-HEXAGON:       [[ELSE]]:
+; CHECK-HEXAGON-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i32> [[ARG0]], <2 x i32> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-HEXAGON-NEXT:    tail call void @func1()
+; CHECK-HEXAGON-NEXT:    br label %[[FINALLY]]
+; CHECK-HEXAGON:       [[FINALLY]]:
+; CHECK-HEXAGON-NEXT:    [[VAL3:%.*]] = phi <2 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-HEXAGON-NEXT:    ret <2 x i32> [[VAL3]]
+;
+; CHECK-RISCV-LABEL: define <2 x i32> @shuffle_v2i32(
+; CHECK-RISCV-SAME: <2 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-RISCV-NEXT:  [[ENTRY:.*:]]
+; CHECK-RISCV-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-RISCV:       [[THEN]]:
+; CHECK-RISCV-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i32> [[ARG0]], <2 x i32> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-RISCV-NEXT:    tail call void @func0()
+; CHECK-RISCV-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-RISCV:       [[ELSE]]:
+; CHECK-RISCV-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i32> [[ARG0]], <2 x i32> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-RISCV-NEXT:    tail call void @func1()
+; CHECK-RISCV-NEXT:    br label %[[FINALLY]]
+; CHECK-RISCV:       [[FINALLY]]:
+; CHECK-RISCV-NEXT:    [[VAL3:%.*]] = phi <2 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-RISCV-NEXT:    ret <2 x i32> [[VAL3]]
+;
+; CHECK-X86-V1-LABEL: define <2 x i32> @shuffle_v2i32(
+; CHECK-X86-V1-SAME: <2 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V1-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V1:       [[THEN]]:
+; CHECK-X86-V1-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i32> [[ARG0]], <2 x i32> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-X86-V1-NEXT:    tail call void @func0()
+; CHECK-X86-V1-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V1:       [[ELSE]]:
+; CHECK-X86-V1-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i32> [[ARG0]], <2 x i32> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-X86-V1-NEXT:    tail call void @func1()
+; CHECK-X86-V1-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V1:       [[FINALLY]]:
+; CHECK-X86-V1-NEXT:    [[VAL3:%.*]] = phi <2 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V1-NEXT:    ret <2 x i32> [[VAL3]]
+;
+; CHECK-X86-V2-LABEL: define <2 x i32> @shuffle_v2i32(
+; CHECK-X86-V2-SAME: <2 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V2-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V2:       [[THEN]]:
+; CHECK-X86-V2-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i32> [[ARG0]], <2 x i32> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-X86-V2-NEXT:    tail call void @func0()
+; CHECK-X86-V2-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V2:       [[ELSE]]:
+; CHECK-X86-V2-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i32> [[ARG0]], <2 x i32> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-X86-V2-NEXT:    tail call void @func1()
+; CHECK-X86-V2-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V2:       [[FINALLY]]:
+; CHECK-X86-V2-NEXT:    [[VAL3:%.*]] = phi <2 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V2-NEXT:    ret <2 x i32> [[VAL3]]
+;
+; CHECK-X86-V3-LABEL: define <2 x i32> @shuffle_v2i32(
+; CHECK-X86-V3-SAME: <2 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V3-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V3:       [[THEN]]:
+; CHECK-X86-V3-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i32> [[ARG0]], <2 x i32> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-X86-V3-NEXT:    tail call void @func0()
+; CHECK-X86-V3-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V3:       [[ELSE]]:
+; CHECK-X86-V3-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i32> [[ARG0]], <2 x i32> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-X86-V3-NEXT:    tail call void @func1()
+; CHECK-X86-V3-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V3:       [[FINALLY]]:
+; CHECK-X86-V3-NEXT:    [[VAL3:%.*]] = phi <2 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V3-NEXT:    ret <2 x i32> [[VAL3]]
+;
+; CHECK-X86-V4-LABEL: define <2 x i32> @shuffle_v2i32(
+; CHECK-X86-V4-SAME: <2 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V4-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V4:       [[THEN]]:
+; CHECK-X86-V4-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i32> [[ARG0]], <2 x i32> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-X86-V4-NEXT:    tail call void @func0()
+; CHECK-X86-V4-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V4:       [[ELSE]]:
+; CHECK-X86-V4-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i32> [[ARG0]], <2 x i32> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-X86-V4-NEXT:    tail call void @func1()
+; CHECK-X86-V4-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V4:       [[FINALLY]]:
+; CHECK-X86-V4-NEXT:    [[VAL3:%.*]] = phi <2 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V4-NEXT:    ret <2 x i32> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <2 x i32> %arg0, <2 x i32> poison, <2 x i32> <i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <2 x i32> %arg0, <2 x i32> poison, <2 x i32> <i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <2 x i32> [ %val1, %then ], [ %val2, %else ]
+  ret <2 x i32> %val3
+}
+
+define <4 x i32> @shuffle_v4i32(<3 x i32> %arg0, i1 %cond) {
+; CHECK-LABEL: define <4 x i32> @shuffle_v4i32(
+; CHECK-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <4 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <4 x i32> [[VAL3]]
+;
+; CHECK-AARCH64-LABEL: define <4 x i32> @shuffle_v4i32(
+; CHECK-AARCH64-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-AARCH64-NEXT:  [[ENTRY:.*:]]
+; CHECK-AARCH64-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-AARCH64:       [[THEN]]:
+; CHECK-AARCH64-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-AARCH64-NEXT:    tail call void @func0()
+; CHECK-AARCH64-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-AARCH64:       [[ELSE]]:
+; CHECK-AARCH64-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-AARCH64-NEXT:    tail call void @func1()
+; CHECK-AARCH64-NEXT:    br label %[[FINALLY]]
+; CHECK-AARCH64:       [[FINALLY]]:
+; CHECK-AARCH64-NEXT:    [[VAL3:%.*]] = phi <4 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-AARCH64-NEXT:    ret <4 x i32> [[VAL3]]
+;
+; CHECK-AMDGPU-LABEL: define <4 x i32> @shuffle_v4i32(
+; CHECK-AMDGPU-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-AMDGPU-NEXT:  [[ENTRY:.*:]]
+; CHECK-AMDGPU-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-AMDGPU:       [[THEN]]:
+; CHECK-AMDGPU-NEXT:    [[TMP0:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <3 x i32> <i32 1, i32 2, i32 0>
+; CHECK-AMDGPU-NEXT:    tail call void @func0()
+; CHECK-AMDGPU-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-AMDGPU:       [[ELSE]]:
+; CHECK-AMDGPU-NEXT:    tail call void @func1()
+; CHECK-AMDGPU-NEXT:    br label %[[FINALLY]]
+; CHECK-AMDGPU:       [[FINALLY]]:
+; CHECK-AMDGPU-NEXT:    [[TMP1:%.*]] = phi <3 x i32> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-AMDGPU-NEXT:    [[VAL3:%.*]] = shufflevector <3 x i32> [[TMP1]], <3 x i32> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-AMDGPU-NEXT:    ret <4 x i32> [[VAL3]]
+;
+; CHECK-ARM-LABEL: define <4 x i32> @shuffle_v4i32(
+; CHECK-ARM-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-ARM-NEXT:  [[ENTRY:.*:]]
+; CHECK-ARM-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-ARM:       [[THEN]]:
+; CHECK-ARM-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-ARM-NEXT:    tail call void @func0()
+; CHECK-ARM-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-ARM:       [[ELSE]]:
+; CHECK-ARM-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-ARM-NEXT:    tail call void @func1()
+; CHECK-ARM-NEXT:    br label %[[FINALLY]]
+; CHECK-ARM:       [[FINALLY]]:
+; CHECK-ARM-NEXT:    [[VAL3:%.*]] = phi <4 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-ARM-NEXT:    ret <4 x i32> [[VAL3]]
+;
+; CHECK-HEXAGON-LABEL: define <4 x i32> @shuffle_v4i32(
+; CHECK-HEXAGON-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-HEXAGON-NEXT:  [[ENTRY:.*:]]
+; CHECK-HEXAGON-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-HEXAGON:       [[THEN]]:
+; CHECK-HEXAGON-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-HEXAGON-NEXT:    tail call void @func0()
+; CHECK-HEXAGON-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-HEXAGON:       [[ELSE]]:
+; CHECK-HEXAGON-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-HEXAGON-NEXT:    tail call void @func1()
+; CHECK-HEXAGON-NEXT:    br label %[[FINALLY]]
+; CHECK-HEXAGON:       [[FINALLY]]:
+; CHECK-HEXAGON-NEXT:    [[VAL3:%.*]] = phi <4 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-HEXAGON-NEXT:    ret <4 x i32> [[VAL3]]
+;
+; CHECK-RISCV-LABEL: define <4 x i32> @shuffle_v4i32(
+; CHECK-RISCV-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-RISCV-NEXT:  [[ENTRY:.*:]]
+; CHECK-RISCV-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-RISCV:       [[THEN]]:
+; CHECK-RISCV-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-RISCV-NEXT:    tail call void @func0()
+; CHECK-RISCV-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-RISCV:       [[ELSE]]:
+; CHECK-RISCV-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-RISCV-NEXT:    tail call void @func1()
+; CHECK-RISCV-NEXT:    br label %[[FINALLY]]
+; CHECK-RISCV:       [[FINALLY]]:
+; CHECK-RISCV-NEXT:    [[VAL3:%.*]] = phi <4 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-RISCV-NEXT:    ret <4 x i32> [[VAL3]]
+;
+; CHECK-X86-V1-LABEL: define <4 x i32> @shuffle_v4i32(
+; CHECK-X86-V1-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V1-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V1:       [[THEN]]:
+; CHECK-X86-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-X86-V1-NEXT:    tail call void @func0()
+; CHECK-X86-V1-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V1:       [[ELSE]]:
+; CHECK-X86-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V1-NEXT:    tail call void @func1()
+; CHECK-X86-V1-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V1:       [[FINALLY]]:
+; CHECK-X86-V1-NEXT:    [[VAL3:%.*]] = phi <4 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V1-NEXT:    ret <4 x i32> [[VAL3]]
+;
+; CHECK-X86-V2-LABEL: define <4 x i32> @shuffle_v4i32(
+; CHECK-X86-V2-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V2-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V2:       [[THEN]]:
+; CHECK-X86-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-X86-V2-NEXT:    tail call void @func0()
+; CHECK-X86-V2-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V2:       [[ELSE]]:
+; CHECK-X86-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V2-NEXT:    tail call void @func1()
+; CHECK-X86-V2-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V2:       [[FINALLY]]:
+; CHECK-X86-V2-NEXT:    [[VAL3:%.*]] = phi <4 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V2-NEXT:    ret <4 x i32> [[VAL3]]
+;
+; CHECK-X86-V3-LABEL: define <4 x i32> @shuffle_v4i32(
+; CHECK-X86-V3-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V3-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V3:       [[THEN]]:
+; CHECK-X86-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-X86-V3-NEXT:    tail call void @func0()
+; CHECK-X86-V3-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V3:       [[ELSE]]:
+; CHECK-X86-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V3-NEXT:    tail call void @func1()
+; CHECK-X86-V3-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V3:       [[FINALLY]]:
+; CHECK-X86-V3-NEXT:    [[VAL3:%.*]] = phi <4 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V3-NEXT:    ret <4 x i32> [[VAL3]]
+;
+; CHECK-X86-V4-LABEL: define <4 x i32> @shuffle_v4i32(
+; CHECK-X86-V4-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V4-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V4:       [[THEN]]:
+; CHECK-X86-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-X86-V4-NEXT:    tail call void @func0()
+; CHECK-X86-V4-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V4:       [[ELSE]]:
+; CHECK-X86-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V4-NEXT:    tail call void @func1()
+; CHECK-X86-V4-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V4:       [[FINALLY]]:
+; CHECK-X86-V4-NEXT:    [[VAL3:%.*]] = phi <4 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V4-NEXT:    ret <4 x i32> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <4 x i32> [ %val1, %then ], [ %val2, %else ]
+  ret <4 x i32> %val3
+}
+
+define <8 x i32> @shuffle_v8i32(<3 x i32> %arg0, i1 %cond) {
+; CHECK-LABEL: define <8 x i32> @shuffle_v8i32(
+; CHECK-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <8 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <8 x i32> [[VAL3]]
+;
+; CHECK-AARCH64-LABEL: define <8 x i32> @shuffle_v8i32(
+; CHECK-AARCH64-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-AARCH64-NEXT:  [[ENTRY:.*:]]
+; CHECK-AARCH64-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-AARCH64:       [[THEN]]:
+; CHECK-AARCH64-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-AARCH64-NEXT:    tail call void @func0()
+; CHECK-AARCH64-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-AARCH64:       [[ELSE]]:
+; CHECK-AARCH64-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-AARCH64-NEXT:    tail call void @func1()
+; CHECK-AARCH64-NEXT:    br label %[[FINALLY]]
+; CHECK-AARCH64:       [[FINALLY]]:
+; CHECK-AARCH64-NEXT:    [[VAL3:%.*]] = phi <8 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-AARCH64-NEXT:    ret <8 x i32> [[VAL3]]
+;
+; CHECK-AMDGPU-LABEL: define <8 x i32> @shuffle_v8i32(
+; CHECK-AMDGPU-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-AMDGPU-NEXT:  [[ENTRY:.*:]]
+; CHECK-AMDGPU-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-AMDGPU:       [[THEN]]:
+; CHECK-AMDGPU-NEXT:    [[TMP0:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <3 x i32> <i32 1, i32 2, i32 0>
+; CHECK-AMDGPU-NEXT:    tail call void @func0()
+; CHECK-AMDGPU-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-AMDGPU:       [[ELSE]]:
+; CHECK-AMDGPU-NEXT:    tail call void @func1()
+; CHECK-AMDGPU-NEXT:    br label %[[FINALLY]]
+; CHECK-AMDGPU:       [[FINALLY]]:
+; CHECK-AMDGPU-NEXT:    [[TMP1:%.*]] = phi <3 x i32> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-AMDGPU-NEXT:    [[VAL3:%.*]] = shufflevector <3 x i32> [[TMP1]], <3 x i32> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-AMDGPU-NEXT:    ret <8 x i32> [[VAL3]]
+;
+; CHECK-ARM-LABEL: define <8 x i32> @shuffle_v8i32(
+; CHECK-ARM-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-ARM-NEXT:  [[ENTRY:.*:]]
+; CHECK-ARM-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-ARM:       [[THEN]]:
+; CHECK-ARM-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-ARM-NEXT:    tail call void @func0()
+; CHECK-ARM-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-ARM:       [[ELSE]]:
+; CHECK-ARM-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-ARM-NEXT:    tail call void @func1()
+; CHECK-ARM-NEXT:    br label %[[FINALLY]]
+; CHECK-ARM:       [[FINALLY]]:
+; CHECK-ARM-NEXT:    [[VAL3:%.*]] = phi <8 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-ARM-NEXT:    ret <8 x i32> [[VAL3]]
+;
+; CHECK-HEXAGON-LABEL: define <8 x i32> @shuffle_v8i32(
+; CHECK-HEXAGON-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-HEXAGON-NEXT:  [[ENTRY:.*:]]
+; CHECK-HEXAGON-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-HEXAGON:       [[THEN]]:
+; CHECK-HEXAGON-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-HEXAGON-NEXT:    tail call void @func0()
+; CHECK-HEXAGON-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-HEXAGON:       [[ELSE]]:
+; CHECK-HEXAGON-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-HEXAGON-NEXT:    tail call void @func1()
+; CHECK-HEXAGON-NEXT:    br label %[[FINALLY]]
+; CHECK-HEXAGON:       [[FINALLY]]:
+; CHECK-HEXAGON-NEXT:    [[VAL3:%.*]] = phi <8 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-HEXAGON-NEXT:    ret <8 x i32> [[VAL3]]
+;
+; CHECK-RISCV-LABEL: define <8 x i32> @shuffle_v8i32(
+; CHECK-RISCV-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-RISCV-NEXT:  [[ENTRY:.*:]]
+; CHECK-RISCV-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-RISCV:       [[THEN]]:
+; CHECK-RISCV-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-RISCV-NEXT:    tail call void @func0()
+; CHECK-RISCV-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-RISCV:       [[ELSE]]:
+; CHECK-RISCV-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-RISCV-NEXT:    tail call void @func1()
+; CHECK-RISCV-NEXT:    br label %[[FINALLY]]
+; CHECK-RISCV:       [[FINALLY]]:
+; CHECK-RISCV-NEXT:    [[VAL3:%.*]] = phi <8 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-RISCV-NEXT:    ret <8 x i32> [[VAL3]]
+;
+; CHECK-X86-V1-LABEL: define <8 x i32> @shuffle_v8i32(
+; CHECK-X86-V1-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V1-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V1:       [[THEN]]:
+; CHECK-X86-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-X86-V1-NEXT:    tail call void @func0()
+; CHECK-X86-V1-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V1:       [[ELSE]]:
+; CHECK-X86-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V1-NEXT:    tail call void @func1()
+; CHECK-X86-V1-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V1:       [[FINALLY]]:
+; CHECK-X86-V1-NEXT:    [[VAL3:%.*]] = phi <8 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V1-NEXT:    ret <8 x i32> [[VAL3]]
+;
+; CHECK-X86-V2-LABEL: define <8 x i32> @shuffle_v8i32(
+; CHECK-X86-V2-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V2-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V2:       [[THEN]]:
+; CHECK-X86-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-X86-V2-NEXT:    tail call void @func0()
+; CHECK-X86-V2-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V2:       [[ELSE]]:
+; CHECK-X86-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V2-NEXT:    tail call void @func1()
+; CHECK-X86-V2-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V2:       [[FINALLY]]:
+; CHECK-X86-V2-NEXT:    [[VAL3:%.*]] = phi <8 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V2-NEXT:    ret <8 x i32> [[VAL3]]
+;
+; CHECK-X86-V3-LABEL: define <8 x i32> @shuffle_v8i32(
+; CHECK-X86-V3-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V3-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V3:       [[THEN]]:
+; CHECK-X86-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-X86-V3-NEXT:    tail call void @func0()
+; CHECK-X86-V3-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V3:       [[ELSE]]:
+; CHECK-X86-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V3-NEXT:    tail call void @func1()
+; CHECK-X86-V3-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V3:       [[FINALLY]]:
+; CHECK-X86-V3-NEXT:    [[VAL3:%.*]] = phi <8 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V3-NEXT:    ret <8 x i32> [[VAL3]]
+;
+; CHECK-X86-V4-LABEL: define <8 x i32> @shuffle_v8i32(
+; CHECK-X86-V4-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V4-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V4:       [[THEN]]:
+; CHECK-X86-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-X86-V4-NEXT:    tail call void @func0()
+; CHECK-X86-V4-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V4:       [[ELSE]]:
+; CHECK-X86-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V4-NEXT:    tail call void @func1()
+; CHECK-X86-V4-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V4:       [[FINALLY]]:
+; CHECK-X86-V4-NEXT:    [[VAL3:%.*]] = phi <8 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V4-NEXT:    ret <8 x i32> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <8 x i32> [ %val1, %then ], [ %val2, %else ]
+  ret <8 x i32> %val3
+}
+
+define <16 x i32> @shuffle_v16i32(<3 x i32> %arg0, i1 %cond) {
+; CHECK-LABEL: define <16 x i32> @shuffle_v16i32(
+; CHECK-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <16 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <16 x i32> [[VAL3]]
+;
+; CHECK-AARCH64-LABEL: define <16 x i32> @shuffle_v16i32(
+; CHECK-AARCH64-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-AARCH64-NEXT:  [[ENTRY:.*:]]
+; CHECK-AARCH64-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-AARCH64:       [[THEN]]:
+; CHECK-AARCH64-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-AARCH64-NEXT:    tail call void @func0()
+; CHECK-AARCH64-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-AARCH64:       [[ELSE]]:
+; CHECK-AARCH64-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-AARCH64-NEXT:    tail call void @func1()
+; CHECK-AARCH64-NEXT:    br label %[[FINALLY]]
+; CHECK-AARCH64:       [[FINALLY]]:
+; CHECK-AARCH64-NEXT:    [[VAL3:%.*]] = phi <16 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-AARCH64-NEXT:    ret <16 x i32> [[VAL3]]
+;
+; CHECK-AMDGPU-LABEL: define <16 x i32> @shuffle_v16i32(
+; CHECK-AMDGPU-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-AMDGPU-NEXT:  [[ENTRY:.*:]]
+; CHECK-AMDGPU-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-AMDGPU:       [[THEN]]:
+; CHECK-AMDGPU-NEXT:    [[TMP0:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <3 x i32> <i32 1, i32 2, i32 0>
+; CHECK-AMDGPU-NEXT:    tail call void @func0()
+; CHECK-AMDGPU-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-AMDGPU:       [[ELSE]]:
+; CHECK-AMDGPU-NEXT:    tail call void @func1()
+; CHECK-AMDGPU-NEXT:    br label %[[FINALLY]]
+; CHECK-AMDGPU:       [[FINALLY]]:
+; CHECK-AMDGPU-NEXT:    [[TMP1:%.*]] = phi <3 x i32> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-AMDGPU-NEXT:    [[VAL3:%.*]] = shufflevector <3 x i32> [[TMP1]], <3 x i32> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-AMDGPU-NEXT:    ret <16 x i32> [[VAL3]]
+;
+; CHECK-ARM-LABEL: define <16 x i32> @shuffle_v16i32(
+; CHECK-ARM-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-ARM-NEXT:  [[ENTRY:.*:]]
+; CHECK-ARM-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-ARM:       [[THEN]]:
+; CHECK-ARM-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-ARM-NEXT:    tail call void @func0()
+; CHECK-ARM-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-ARM:       [[ELSE]]:
+; CHECK-ARM-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-ARM-NEXT:    tail call void @func1()
+; CHECK-ARM-NEXT:    br label %[[FINALLY]]
+; CHECK-ARM:       [[FINALLY]]:
+; CHECK-ARM-NEXT:    [[VAL3:%.*]] = phi <16 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-ARM-NEXT:    ret <16 x i32> [[VAL3]]
+;
+; CHECK-HEXAGON-LABEL: define <16 x i32> @shuffle_v16i32(
+; CHECK-HEXAGON-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-HEXAGON-NEXT:  [[ENTRY:.*:]]
+; CHECK-HEXAGON-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-HEXAGON:       [[THEN]]:
+; CHECK-HEXAGON-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-HEXAGON-NEXT:    tail call void @func0()
+; CHECK-HEXAGON-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-HEXAGON:       [[ELSE]]:
+; CHECK-HEXAGON-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-HEXAGON-NEXT:    tail call void @func1()
+; CHECK-HEXAGON-NEXT:    br label %[[FINALLY]]
+; CHECK-HEXAGON:       [[FINALLY]]:
+; CHECK-HEXAGON-NEXT:    [[VAL3:%.*]] = phi <16 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-HEXAGON-NEXT:    ret <16 x i32> [[VAL3]]
+;
+; CHECK-RISCV-LABEL: define <16 x i32> @shuffle_v16i32(
+; CHECK-RISCV-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-RISCV-NEXT:  [[ENTRY:.*:]]
+; CHECK-RISCV-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-RISCV:       [[THEN]]:
+; CHECK-RISCV-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-RISCV-NEXT:    tail call void @func0()
+; CHECK-RISCV-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-RISCV:       [[ELSE]]:
+; CHECK-RISCV-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-RISCV-NEXT:    tail call void @func1()
+; CHECK-RISCV-NEXT:    br label %[[FINALLY]]
+; CHECK-RISCV:       [[FINALLY]]:
+; CHECK-RISCV-NEXT:    [[VAL3:%.*]] = phi <16 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-RISCV-NEXT:    ret <16 x i32> [[VAL3]]
+;
+; CHECK-X86-V1-LABEL: define <16 x i32> @shuffle_v16i32(
+; CHECK-X86-V1-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V1-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V1:       [[THEN]]:
+; CHECK-X86-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-X86-V1-NEXT:    tail call void @func0()
+; CHECK-X86-V1-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V1:       [[ELSE]]:
+; CHECK-X86-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V1-NEXT:    tail call void @func1()
+; CHECK-X86-V1-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V1:       [[FINALLY]]:
+; CHECK-X86-V1-NEXT:    [[VAL3:%.*]] = phi <16 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V1-NEXT:    ret <16 x i32> [[VAL3]]
+;
+; CHECK-X86-V2-LABEL: define <16 x i32> @shuffle_v16i32(
+; CHECK-X86-V2-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V2-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V2:       [[THEN]]:
+; CHECK-X86-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-X86-V2-NEXT:    tail call void @func0()
+; CHECK-X86-V2-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V2:       [[ELSE]]:
+; CHECK-X86-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V2-NEXT:    tail call void @func1()
+; CHECK-X86-V2-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V2:       [[FINALLY]]:
+; CHECK-X86-V2-NEXT:    [[VAL3:%.*]] = phi <16 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V2-NEXT:    ret <16 x i32> [[VAL3]]
+;
+; CHECK-X86-V3-LABEL: define <16 x i32> @shuffle_v16i32(
+; CHECK-X86-V3-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V3-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V3:       [[THEN]]:
+; CHECK-X86-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-X86-V3-NEXT:    tail call void @func0()
+; CHECK-X86-V3-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V3:       [[ELSE]]:
+; CHECK-X86-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V3-NEXT:    tail call void @func1()
+; CHECK-X86-V3-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V3:       [[FINALLY]]:
+; CHECK-X86-V3-NEXT:    [[VAL3:%.*]] = phi <16 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V3-NEXT:    ret <16 x i32> [[VAL3]]
+;
+; CHECK-X86-V4-LABEL: define <16 x i32> @shuffle_v16i32(
+; CHECK-X86-V4-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V4-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V4:       [[THEN]]:
+; CHECK-X86-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-X86-V4-NEXT:    tail call void @func0()
+; CHECK-X86-V4-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V4:       [[ELSE]]:
+; CHECK-X86-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V4-NEXT:    tail call void @func1()
+; CHECK-X86-V4-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V4:       [[FINALLY]]:
+; CHECK-X86-V4-NEXT:    [[VAL3:%.*]] = phi <16 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V4-NEXT:    ret <16 x i32> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <16 x i32> [ %val1, %then ], [ %val2, %else ]
+  ret <16 x i32> %val3
+}
+
+define <32 x i32> @shuffle_v32i32(<3 x i32> %arg0, i1 %cond) {
+; CHECK-LABEL: define <32 x i32> @shuffle_v32i32(
+; CHECK-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <32 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <32 x i32> [[VAL3]]
+;
+; CHECK-AARCH64-LABEL: define <32 x i32> @shuffle_v32i32(
+; CHECK-AARCH64-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-AARCH64-NEXT:  [[ENTRY:.*:]]
+; CHECK-AARCH64-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-AARCH64:       [[THEN]]:
+; CHECK-AARCH64-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-AARCH64-NEXT:    tail call void @func0()
+; CHECK-AARCH64-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-AARCH64:       [[ELSE]]:
+; CHECK-AARCH64-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-AARCH64-NEXT:    tail call void @func1()
+; CHECK-AARCH64-NEXT:    br label %[[FINALLY]]
+; CHECK-AARCH64:       [[FINALLY]]:
+; CHECK-AARCH64-NEXT:    [[VAL3:%.*]] = phi <32 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-AARCH64-NEXT:    ret <32 x i32> [[VAL3]]
+;
+; CHECK-AMDGPU-LABEL: define <32 x i32> @shuffle_v32i32(
+; CHECK-AMDGPU-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-AMDGPU-NEXT:  [[ENTRY:.*:]]
+; CHECK-AMDGPU-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-AMDGPU:       [[THEN]]:
+; CHECK-AMDGPU-NEXT:    [[TMP0:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <3 x i32> <i32 1, i32 2, i32 0>
+; CHECK-AMDGPU-NEXT:    tail call void @func0()
+; CHECK-AMDGPU-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-AMDGPU:       [[ELSE]]:
+; CHECK-AMDGPU-NEXT:    tail call void @func1()
+; CHECK-AMDGPU-NEXT:    br label %[[FINALLY]]
+; CHECK-AMDGPU:       [[FINALLY]]:
+; CHECK-AMDGPU-NEXT:    [[TMP1:%.*]] = phi <3 x i32> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-AMDGPU-NEXT:    [[VAL3:%.*]] = shufflevector <3 x i32> [[TMP1]], <3 x i32> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-AMDGPU-NEXT:    ret <32 x i32> [[VAL3]]
+;
+; CHECK-ARM-LABEL: define <32 x i32> @shuffle_v32i32(
+; CHECK-ARM-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-ARM-NEXT:  [[ENTRY:.*:]]
+; CHECK-ARM-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-ARM:       [[THEN]]:
+; CHECK-ARM-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-ARM-NEXT:    tail call void @func0()
+; CHECK-ARM-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-ARM:       [[ELSE]]:
+; CHECK-ARM-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-ARM-NEXT:    tail call void @func1()
+; CHECK-ARM-NEXT:    br label %[[FINALLY]]
+; CHECK-ARM:       [[FINALLY]]:
+; CHECK-ARM-NEXT:    [[VAL3:%.*]] = phi <32 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-ARM-NEXT:    ret <32 x i32> [[VAL3]]
+;
+; CHECK-HEXAGON-LABEL: define <32 x i32> @shuffle_v32i32(
+; CHECK-HEXAGON-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-HEXAGON-NEXT:  [[ENTRY:.*:]]
+; CHECK-HEXAGON-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-HEXAGON:       [[THEN]]:
+; CHECK-HEXAGON-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-HEXAGON-NEXT:    tail call void @func0()
+; CHECK-HEXAGON-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-HEXAGON:       [[ELSE]]:
+; CHECK-HEXAGON-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-HEXAGON-NEXT:    tail call void @func1()
+; CHECK-HEXAGON-NEXT:    br label %[[FINALLY]]
+; CHECK-HEXAGON:       [[FINALLY]]:
+; CHECK-HEXAGON-NEXT:    [[VAL3:%.*]] = phi <32 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-HEXAGON-NEXT:    ret <32 x i32> [[VAL3]]
+;
+; CHECK-RISCV-LABEL: define <32 x i32> @shuffle_v32i32(
+; CHECK-RISCV-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-RISCV-NEXT:  [[ENTRY:.*:]]
+; CHECK-RISCV-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-RISCV:       [[THEN]]:
+; CHECK-RISCV-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-RISCV-NEXT:    tail call void @func0()
+; CHECK-RISCV-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-RISCV:       [[ELSE]]:
+; CHECK-RISCV-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-RISCV-NEXT:    tail call void @func1()
+; CHECK-RISCV-NEXT:    br label %[[FINALLY]]
+; CHECK-RISCV:       [[FINALLY]]:
+; CHECK-RISCV-NEXT:    [[VAL3:%.*]] = phi <32 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-RISCV-NEXT:    ret <32 x i32> [[VAL3]]
+;
+; CHECK-X86-V1-LABEL: define <32 x i32> @shuffle_v32i32(
+; CHECK-X86-V1-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V1-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V1:       [[THEN]]:
+; CHECK-X86-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-X86-V1-NEXT:    tail call void @func0()
+; CHECK-X86-V1-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V1:       [[ELSE]]:
+; CHECK-X86-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V1-NEXT:    tail call void @func1()
+; CHECK-X86-V1-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V1:       [[FINALLY]]:
+; CHECK-X86-V1-NEXT:    [[VAL3:%.*]] = phi <32 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V1-NEXT:    ret <32 x i32> [[VAL3]]
+;
+; CHECK-X86-V2-LABEL: define <32 x i32> @shuffle_v32i32(
+; CHECK-X86-V2-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V2-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V2:       [[THEN]]:
+; CHECK-X86-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-X86-V2-NEXT:    tail call void @func0()
+; CHECK-X86-V2-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V2:       [[ELSE]]:
+; CHECK-X86-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V2-NEXT:    tail call void @func1()
+; CHECK-X86-V2-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V2:       [[FINALLY]]:
+; CHECK-X86-V2-NEXT:    [[VAL3:%.*]] = phi <32 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V2-NEXT:    ret <32 x i32> [[VAL3]]
+;
+; CHECK-X86-V3-LABEL: define <32 x i32> @shuffle_v32i32(
+; CHECK-X86-V3-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V3-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V3:       [[THEN]]:
+; CHECK-X86-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-X86-V3-NEXT:    tail call void @func0()
+; CHECK-X86-V3-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V3:       [[ELSE]]:
+; CHECK-X86-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V3-NEXT:    tail call void @func1()
+; CHECK-X86-V3-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V3:       [[FINALLY]]:
+; CHECK-X86-V3-NEXT:    [[VAL3:%.*]] = phi <32 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V3-NEXT:    ret <32 x i32> [[VAL3]]
+;
+; CHECK-X86-V4-LABEL: define <32 x i32> @shuffle_v32i32(
+; CHECK-X86-V4-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V4-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V4:       [[THEN]]:
+; CHECK-X86-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-X86-V4-NEXT:    tail call void @func0()
+; CHECK-X86-V4-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V4:       [[ELSE]]:
+; CHECK-X86-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V4-NEXT:    tail call void @func1()
+; CHECK-X86-V4-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V4:       [[FINALLY]]:
+; CHECK-X86-V4-NEXT:    [[VAL3:%.*]] = phi <32 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V4-NEXT:    ret <32 x i32> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <32 x i32> [ %val1, %then ], [ %val2, %else ]
+  ret <32 x i32> %val3
+}
+
+define <2 x bfloat> @shuffle_v2bf16(<2 x bfloat> %arg0, i1 %cond) {
+; CHECK-LABEL: define <2 x bfloat> @shuffle_v2bf16(
+; CHECK-SAME: <2 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <2 x bfloat> [[ARG0]], <2 x bfloat> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <2 x bfloat> [[ARG0]], <2 x bfloat> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <2 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <2 x bfloat> [[VAL3]]
+;
+; CHECK-AARCH64-LABEL: define <2 x bfloat> @shuffle_v2bf16(
+; CHECK-AARCH64-SAME: <2 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-AARCH64-NEXT:  [[ENTRY:.*:]]
+; CHECK-AARCH64-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-AARCH64:       [[THEN]]:
+; CHECK-AARCH64-NEXT:    [[VAL1:%.*]] = shufflevector <2 x bfloat> [[ARG0]], <2 x bfloat> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-AARCH64-NEXT:    tail call void @func0()
+; CHECK-AARCH64-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-AARCH64:       [[ELSE]]:
+; CHECK-AARCH64-NEXT:    [[VAL2:%.*]] = shufflevector <2 x bfloat> [[ARG0]], <2 x bfloat> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-AARCH64-NEXT:    tail call void @func1()
+; CHECK-AARCH64-NEXT:    br label %[[FINALLY]]
+; CHECK-AARCH64:       [[FINALLY]]:
+; CHECK-AARCH64-NEXT:    [[VAL3:%.*]] = phi <2 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-AARCH64-NEXT:    ret <2 x bfloat> [[VAL3]]
+;
+; CHECK-AMDGPU-LABEL: define <2 x bfloat> @shuffle_v2bf16(
+; CHECK-AMDGPU-SAME: <2 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-AMDGPU-NEXT:  [[ENTRY:.*:]]
+; CHECK-AMDGPU-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-AMDGPU:       [[THEN]]:
+; CHECK-AMDGPU-NEXT:    [[VAL1:%.*]] = shufflevector <2 x bfloat> [[ARG0]], <2 x bfloat> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-AMDGPU-NEXT:    tail call void @func0()
+; CHECK-AMDGPU-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-AMDGPU:       [[ELSE]]:
+; CHECK-AMDGPU-NEXT:    [[VAL2:%.*]] = shufflevector <2 x bfloat> [[ARG0]], <2 x bfloat> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-AMDGPU-NEXT:    tail call void @func1()
+; CHECK-AMDGPU-NEXT:    br label %[[FINALLY]]
+; CHECK-AMDGPU:       [[FINALLY]]:
+; CHECK-AMDGPU-NEXT:    [[VAL3:%.*]] = phi <2 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-AMDGPU-NEXT:    ret <2 x bfloat> [[VAL3]]
+;
+; CHECK-ARM-LABEL: define <2 x bfloat> @shuffle_v2bf16(
+; CHECK-ARM-SAME: <2 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-ARM-NEXT:  [[ENTRY:.*:]]
+; CHECK-ARM-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-ARM:       [[THEN]]:
+; CHECK-ARM-NEXT:    [[VAL1:%.*]] = shufflevector <2 x bfloat> [[ARG0]], <2 x bfloat> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-ARM-NEXT:    tail call void @func0()
+; CHECK-ARM-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-ARM:       [[ELSE]]:
+; CHECK-ARM-NEXT:    [[VAL2:%.*]] = shufflevector <2 x bfloat> [[ARG0]], <2 x bfloat> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-ARM-NEXT:    tail call void @func1()
+; CHECK-ARM-NEXT:    br label %[[FINALLY]]
+; CHECK-ARM:       [[FINALLY]]:
+; CHECK-ARM-NEXT:    [[VAL3:%.*]] = phi <2 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-ARM-NEXT:    ret <2 x bfloat> [[VAL3]]
+;
+; CHECK-HEXAGON-LABEL: define <2 x bfloat> @shuffle_v2bf16(
+; CHECK-HEXAGON-SAME: <2 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-HEXAGON-NEXT:  [[ENTRY:.*:]]
+; CHECK-HEXAGON-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-HEXAGON:       [[THEN]]:
+; CHECK-HEXAGON-NEXT:    [[VAL1:%.*]] = shufflevector <2 x bfloat> [[ARG0]], <2 x bfloat> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-HEXAGON-NEXT:    tail call void @func0()
+; CHECK-HEXAGON-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-HEXAGON:       [[ELSE]]:
+; CHECK-HEXAGON-NEXT:    [[VAL2:%.*]] = shufflevector <2 x bfloat> [[ARG0]], <2 x bfloat> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-HEXAGON-NEXT:    tail call void @func1()
+; CHECK-HEXAGON-NEXT:    br label %[[FINALLY]]
+; CHECK-HEXAGON:       [[FINALLY]]:
+; CHECK-HEXAGON-NEXT:    [[VAL3:%.*]] = phi <2 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-HEXAGON-NEXT:    ret <2 x bfloat> [[VAL3]]
+;
+; CHECK-RISCV-LABEL: define <2 x bfloat> @shuffle_v2bf16(
+; CHECK-RISCV-SAME: <2 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-RISCV-NEXT:  [[ENTRY:.*:]]
+; CHECK-RISCV-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-RISCV:       [[THEN]]:
+; CHECK-RISCV-NEXT:    [[VAL1:%.*]] = shufflevector <2 x bfloat> [[ARG0]], <2 x bfloat> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-RISCV-NEXT:    tail call void @func0()
+; CHECK-RISCV-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-RISCV:       [[ELSE]]:
+; CHECK-RISCV-NEXT:    [[VAL2:%.*]] = shufflevector <2 x bfloat> [[ARG0]], <2 x bfloat> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-RISCV-NEXT:    tail call void @func1()
+; CHECK-RISCV-NEXT:    br label %[[FINALLY]]
+; CHECK-RISCV:       [[FINALLY]]:
+; CHECK-RISCV-NEXT:    [[VAL3:%.*]] = phi <2 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-RISCV-NEXT:    ret <2 x bfloat> [[VAL3]]
+;
+; CHECK-X86-V1-LABEL: define <2 x bfloat> @shuffle_v2bf16(
+; CHECK-X86-V1-SAME: <2 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V1-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V1:       [[THEN]]:
+; CHECK-X86-V1-NEXT:    [[VAL1:%.*]] = shufflevector <2 x bfloat> [[ARG0]], <2 x bfloat> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-X86-V1-NEXT:    tail call void @func0()
+; CHECK-X86-V1-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V1:       [[ELSE]]:
+; CHECK-X86-V1-NEXT:    [[VAL2:%.*]] = shufflevector <2 x bfloat> [[ARG0]], <2 x bfloat> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-X86-V1-NEXT:    tail call void @func1()
+; CHECK-X86-V1-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V1:       [[FINALLY]]:
+; CHECK-X86-V1-NEXT:    [[VAL3:%.*]] = phi <2 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V1-NEXT:    ret <2 x bfloat> [[VAL3]]
+;
+; CHECK-X86-V2-LABEL: define <2 x bfloat> @shuffle_v2bf16(
+; CHECK-X86-V2-SAME: <2 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V2-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V2:       [[THEN]]:
+; CHECK-X86-V2-NEXT:    [[VAL1:%.*]] = shufflevector <2 x bfloat> [[ARG0]], <2 x bfloat> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-X86-V2-NEXT:    tail call void @func0()
+; CHECK-X86-V2-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V2:       [[ELSE]]:
+; CHECK-X86-V2-NEXT:    [[VAL2:%.*]] = shufflevector <2 x bfloat> [[ARG0]], <2 x bfloat> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-X86-V2-NEXT:    tail call void @func1()
+; CHECK-X86-V2-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V2:       [[FINALLY]]:
+; CHECK-X86-V2-NEXT:    [[VAL3:%.*]] = phi <2 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V2-NEXT:    ret <2 x bfloat> [[VAL3]]
+;
+; CHECK-X86-V3-LABEL: define <2 x bfloat> @shuffle_v2bf16(
+; CHECK-X86-V3-SAME: <2 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V3-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V3:       [[THEN]]:
+; CHECK-X86-V3-NEXT:    [[VAL1:%.*]] = shufflevector <2 x bfloat> [[ARG0]], <2 x bfloat> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-X86-V3-NEXT:    tail call void @func0()
+; CHECK-X86-V3-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V3:       [[ELSE]]:
+; CHECK-X86-V3-NEXT:    [[VAL2:%.*]] = shufflevector <2 x bfloat> [[ARG0]], <2 x bfloat> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-X86-V3-NEXT:    tail call void @func1()
+; CHECK-X86-V3-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V3:       [[FINALLY]]:
+; CHECK-X86-V3-NEXT:    [[VAL3:%.*]] = phi <2 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V3-NEXT:    ret <2 x bfloat> [[VAL3]]
+;
+; CHECK-X86-V4-LABEL: define <2 x bfloat> @shuffle_v2bf16(
+; CHECK-X86-V4-SAME: <2 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V4-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V4:       [[THEN]]:
+; CHECK-X86-V4-NEXT:    [[VAL1:%.*]] = shufflevector <2 x bfloat> [[ARG0]], <2 x bfloat> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-X86-V4-NEXT:    tail call void @func0()
+; CHECK-X86-V4-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V4:       [[ELSE]]:
+; CHECK-X86-V4-NEXT:    [[VAL2:%.*]] = shufflevector <2 x bfloat> [[ARG0]], <2 x bfloat> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-X86-V4-NEXT:    tail call void @func1()
+; CHECK-X86-V4-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V4:       [[FINALLY]]:
+; CHECK-X86-V4-NEXT:    [[VAL3:%.*]] = phi <2 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V4-NEXT:    ret <2 x bfloat> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <2 x bfloat> %arg0, <2 x bfloat> poison, <2 x i32> <i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <2 x bfloat> %arg0, <2 x bfloat> poison, <2 x i32> <i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <2 x bfloat> [ %val1, %then ], [ %val2, %else ]
+  ret <2 x bfloat> %val3
+}
+
+define <3 x bfloat> @shuffle_v3bf16(<3 x bfloat> %arg0, i1 %cond) {
+; CHECK-LABEL: define <3 x bfloat> @shuffle_v3bf16(
+; CHECK-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <3 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <3 x bfloat> [[VAL3]]
+;
+; CHECK-AARCH64-LABEL: define <3 x bfloat> @shuffle_v3bf16(
+; CHECK-AARCH64-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-AARCH64-NEXT:  [[ENTRY:.*:]]
+; CHECK-AARCH64-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-AARCH64:       [[THEN]]:
+; CHECK-AARCH64-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 1, i32 1>
+; CHECK-AARCH64-NEXT:    tail call void @func0()
+; CHECK-AARCH64-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-AARCH64:       [[ELSE]]:
+; CHECK-AARCH64-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 2, i32 2, i32 2>
+; CHECK-AARCH64-NEXT:    tail call void @func1()
+; CHECK-AARCH64-NEXT:    br label %[[FINALLY]]
+; CHECK-AARCH64:       [[FINALLY]]:
+; CHECK-AARCH64-NEXT:    [[VAL3:%.*]] = phi <3 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-AARCH64-NEXT:    ret <3 x bfloat> [[VAL3]]
+;
+; CHECK-AMDGPU-LABEL: define <3 x bfloat> @shuffle_v3bf16(
+; CHECK-AMDGPU-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-AMDGPU-NEXT:  [[ENTRY:.*:]]
+; CHECK-AMDGPU-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-AMDGPU:       [[THEN]]:
+; CHECK-AMDGPU-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 1, i32 1>
+; CHECK-AMDGPU-NEXT:    tail call void @func0()
+; CHECK-AMDGPU-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-AMDGPU:       [[ELSE]]:
+; CHECK-AMDGPU-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 2, i32 2, i32 2>
+; CHECK-AMDGPU-NEXT:    tail call void @func1()
+; CHECK-AMDGPU-NEXT:    br label %[[FINALLY]]
+; CHECK-AMDGPU:       [[FINALLY]]:
+; CHECK-AMDGPU-NEXT:    [[VAL3:%.*]] = phi <3 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-AMDGPU-NEXT:    ret <3 x bfloat> [[VAL3]]
+;
+; CHECK-ARM-LABEL: define <3 x bfloat> @shuffle_v3bf16(
+; CHECK-ARM-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-ARM-NEXT:  [[ENTRY:.*:]]
+; CHECK-ARM-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-ARM:       [[THEN]]:
+; CHECK-ARM-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 1, i32 1>
+; CHECK-ARM-NEXT:    tail call void @func0()
+; CHECK-ARM-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-ARM:       [[ELSE]]:
+; CHECK-ARM-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 2, i32 2, i32 2>
+; CHECK-ARM-NEXT:    tail call void @func1()
+; CHECK-ARM-NEXT:    br label %[[FINALLY]]
+; CHECK-ARM:       [[FINALLY]]:
+; CHECK-ARM-NEXT:    [[VAL3:%.*]] = phi <3 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-ARM-NEXT:    ret <3 x bfloat> [[VAL3]]
+;
+; CHECK-HEXAGON-LABEL: define <3 x bfloat> @shuffle_v3bf16(
+; CHECK-HEXAGON-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-HEXAGON-NEXT:  [[ENTRY:.*:]]
+; CHECK-HEXAGON-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-HEXAGON:       [[THEN]]:
+; CHECK-HEXAGON-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 1, i32 1>
+; CHECK-HEXAGON-NEXT:    tail call void @func0()
+; CHECK-HEXAGON-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-HEXAGON:       [[ELSE]]:
+; CHECK-HEXAGON-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 2, i32 2, i32 2>
+; CHECK-HEXAGON-NEXT:    tail call void @func1()
+; CHECK-HEXAGON-NEXT:    br label %[[FINALLY]]
+; CHECK-HEXAGON:       [[FINALLY]]:
+; CHECK-HEXAGON-NEXT:    [[VAL3:%.*]] = phi <3 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-HEXAGON-NEXT:    ret <3 x bfloat> [[VAL3]]
+;
+; CHECK-RISCV-LABEL: define <3 x bfloat> @shuffle_v3bf16(
+; CHECK-RISCV-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-RISCV-NEXT:  [[ENTRY:.*:]]
+; CHECK-RISCV-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-RISCV:       [[THEN]]:
+; CHECK-RISCV-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 1, i32 1>
+; CHECK-RISCV-NEXT:    tail call void @func0()
+; CHECK-RISCV-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-RISCV:       [[ELSE]]:
+; CHECK-RISCV-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 2, i32 2, i32 2>
+; CHECK-RISCV-NEXT:    tail call void @func1()
+; CHECK-RISCV-NEXT:    br label %[[FINALLY]]
+; CHECK-RISCV:       [[FINALLY]]:
+; CHECK-RISCV-NEXT:    [[VAL3:%.*]] = phi <3 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-RISCV-NEXT:    ret <3 x bfloat> [[VAL3]]
+;
+; CHECK-X86-V1-LABEL: define <3 x bfloat> @shuffle_v3bf16(
+; CHECK-X86-V1-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V1-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V1:       [[THEN]]:
+; CHECK-X86-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 1, i32 1>
+; CHECK-X86-V1-NEXT:    tail call void @func0()
+; CHECK-X86-V1-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V1:       [[ELSE]]:
+; CHECK-X86-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 2, i32 2, i32 2>
+; CHECK-X86-V1-NEXT:    tail call void @func1()
+; CHECK-X86-V1-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V1:       [[FINALLY]]:
+; CHECK-X86-V1-NEXT:    [[VAL3:%.*]] = phi <3 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V1-NEXT:    ret <3 x bfloat> [[VAL3]]
+;
+; CHECK-X86-V2-LABEL: define <3 x bfloat> @shuffle_v3bf16(
+; CHECK-X86-V2-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V2-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V2:       [[THEN]]:
+; CHECK-X86-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 1, i32 1>
+; CHECK-X86-V2-NEXT:    tail call void @func0()
+; CHECK-X86-V2-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V2:       [[ELSE]]:
+; CHECK-X86-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 2, i32 2, i32 2>
+; CHECK-X86-V2-NEXT:    tail call void @func1()
+; CHECK-X86-V2-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V2:       [[FINALLY]]:
+; CHECK-X86-V2-NEXT:    [[VAL3:%.*]] = phi <3 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V2-NEXT:    ret <3 x bfloat> [[VAL3]]
+;
+; CHECK-X86-V3-LABEL: define <3 x bfloat> @shuffle_v3bf16(
+; CHECK-X86-V3-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V3-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V3:       [[THEN]]:
+; CHECK-X86-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 1, i32 1>
+; CHECK-X86-V3-NEXT:    tail call void @func0()
+; CHECK-X86-V3-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V3:       [[ELSE]]:
+; CHECK-X86-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 2, i32 2, i32 2>
+; CHECK-X86-V3-NEXT:    tail call void @func1()
+; CHECK-X86-V3-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V3:       [[FINALLY]]:
+; CHECK-X86-V3-NEXT:    [[VAL3:%.*]] = phi <3 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V3-NEXT:    ret <3 x bfloat> [[VAL3]]
+;
+; CHECK-X86-V4-LABEL: define <3 x bfloat> @shuffle_v3bf16(
+; CHECK-X86-V4-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V4-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V4:       [[THEN]]:
+; CHECK-X86-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 1, i32 1>
+; CHECK-X86-V4-NEXT:    tail call void @func0()
+; CHECK-X86-V4-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V4:       [[ELSE]]:
+; CHECK-X86-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 2, i32 2, i32 2>
+; CHECK-X86-V4-NEXT:    tail call void @func1()
+; CHECK-X86-V4-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V4:       [[FINALLY]]:
+; CHECK-X86-V4-NEXT:    [[VAL3:%.*]] = phi <3 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V4-NEXT:    ret <3 x bfloat> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <3 x i32> <i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <3 x i32> <i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <3 x bfloat> [ %val1, %then ], [ %val2, %else ]
+  ret <3 x bfloat> %val3
+}
+
+define <4 x bfloat> @shuffle_v4bf16(<3 x bfloat> %arg0, i1 %cond) {
+; CHECK-LABEL: define <4 x bfloat> @shuffle_v4bf16(
+; CHECK-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <4 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <4 x bfloat> [[VAL3]]
+;
+; CHECK-AARCH64-LABEL: define <4 x bfloat> @shuffle_v4bf16(
+; CHECK-AARCH64-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-AARCH64-NEXT:  [[ENTRY:.*:]]
+; CHECK-AARCH64-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-AARCH64:       [[THEN]]:
+; CHECK-AARCH64-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-AARCH64-NEXT:    tail call void @func0()
+; CHECK-AARCH64-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-AARCH64:       [[ELSE]]:
+; CHECK-AARCH64-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-AARCH64-NEXT:    tail call void @func1()
+; CHECK-AARCH64-NEXT:    br label %[[FINALLY]]
+; CHECK-AARCH64:       [[FINALLY]]:
+; CHECK-AARCH64-NEXT:    [[VAL3:%.*]] = phi <4 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-AARCH64-NEXT:    ret <4 x bfloat> [[VAL3]]
+;
+; CHECK-AMDGPU-LABEL: define <4 x bfloat> @shuffle_v4bf16(
+; CHECK-AMDGPU-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-AMDGPU-NEXT:  [[ENTRY:.*:]]
+; CHECK-AMDGPU-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-AMDGPU:       [[THEN]]:
+; CHECK-AMDGPU-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-AMDGPU-NEXT:    tail call void @func0()
+; CHECK-AMDGPU-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-AMDGPU:       [[ELSE]]:
+; CHECK-AMDGPU-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-AMDGPU-NEXT:    tail call void @func1()
+; CHECK-AMDGPU-NEXT:    br label %[[FINALLY]]
+; CHECK-AMDGPU:       [[FINALLY]]:
+; CHECK-AMDGPU-NEXT:    [[VAL3:%.*]] = phi <4 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-AMDGPU-NEXT:    ret <4 x bfloat> [[VAL3]]
+;
+; CHECK-ARM-LABEL: define <4 x bfloat> @shuffle_v4bf16(
+; CHECK-ARM-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-ARM-NEXT:  [[ENTRY:.*:]]
+; CHECK-ARM-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-ARM:       [[THEN]]:
+; CHECK-ARM-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-ARM-NEXT:    tail call void @func0()
+; CHECK-ARM-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-ARM:       [[ELSE]]:
+; CHECK-ARM-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-ARM-NEXT:    tail call void @func1()
+; CHECK-ARM-NEXT:    br label %[[FINALLY]]
+; CHECK-ARM:       [[FINALLY]]:
+; CHECK-ARM-NEXT:    [[VAL3:%.*]] = phi <4 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-ARM-NEXT:    ret <4 x bfloat> [[VAL3]]
+;
+; CHECK-HEXAGON-LABEL: define <4 x bfloat> @shuffle_v4bf16(
+; CHECK-HEXAGON-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-HEXAGON-NEXT:  [[ENTRY:.*:]]
+; CHECK-HEXAGON-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-HEXAGON:       [[THEN]]:
+; CHECK-HEXAGON-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-HEXAGON-NEXT:    tail call void @func0()
+; CHECK-HEXAGON-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-HEXAGON:       [[ELSE]]:
+; CHECK-HEXAGON-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-HEXAGON-NEXT:    tail call void @func1()
+; CHECK-HEXAGON-NEXT:    br label %[[FINALLY]]
+; CHECK-HEXAGON:       [[FINALLY]]:
+; CHECK-HEXAGON-NEXT:    [[VAL3:%.*]] = phi <4 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-HEXAGON-NEXT:    ret <4 x bfloat> [[VAL3]]
+;
+; CHECK-RISCV-LABEL: define <4 x bfloat> @shuffle_v4bf16(
+; CHECK-RISCV-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-RISCV-NEXT:  [[ENTRY:.*:]]
+; CHECK-RISCV-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-RISCV:       [[THEN]]:
+; CHECK-RISCV-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-RISCV-NEXT:    tail call void @func0()
+; CHECK-RISCV-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-RISCV:       [[ELSE]]:
+; CHECK-RISCV-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-RISCV-NEXT:    tail call void @func1()
+; CHECK-RISCV-NEXT:    br label %[[FINALLY]]
+; CHECK-RISCV:       [[FINALLY]]:
+; CHECK-RISCV-NEXT:    [[VAL3:%.*]] = phi <4 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-RISCV-NEXT:    ret <4 x bfloat> [[VAL3]]
+;
+; CHECK-X86-V1-LABEL: define <4 x bfloat> @shuffle_v4bf16(
+; CHECK-X86-V1-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V1-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V1:       [[THEN]]:
+; CHECK-X86-V1-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
+; CHECK-X86-V1-NEXT:    tail call void @func0()
+; CHECK-X86-V1-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V1:       [[ELSE]]:
+; CHECK-X86-V1-NEXT:    tail call void @func1()
+; CHECK-X86-V1-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V1:       [[FINALLY]]:
+; CHECK-X86-V1-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-X86-V1-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V1-NEXT:    ret <4 x bfloat> [[VAL3]]
+;
+; CHECK-X86-V2-LABEL: define <4 x bfloat> @shuffle_v4bf16(
+; CHECK-X86-V2-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V2-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V2:       [[THEN]]:
+; CHECK-X86-V2-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
+; CHECK-X86-V2-NEXT:    tail call void @func0()
+; CHECK-X86-V2-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V2:       [[ELSE]]:
+; CHECK-X86-V2-NEXT:    tail call void @func1()
+; CHECK-X86-V2-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V2:       [[FINALLY]]:
+; CHECK-X86-V2-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-X86-V2-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V2-NEXT:    ret <4 x bfloat> [[VAL3]]
+;
+; CHECK-X86-V3-LABEL: define <4 x bfloat> @shuffle_v4bf16(
+; CHECK-X86-V3-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V3-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V3:       [[THEN]]:
+; CHECK-X86-V3-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
+; CHECK-X86-V3-NEXT:    tail call void @func0()
+; CHECK-X86-V3-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V3:       [[ELSE]]:
+; CHECK-X86-V3-NEXT:    tail call void @func1()
+; CHECK-X86-V3-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V3:       [[FINALLY]]:
+; CHECK-X86-V3-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-X86-V3-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V3-NEXT:    ret <4 x bfloat> [[VAL3]]
+;
+; CHECK-X86-V4-LABEL: define <4 x bfloat> @shuffle_v4bf16(
+; CHECK-X86-V4-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V4-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V4:       [[THEN]]:
+; CHECK-X86-V4-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
+; CHECK-X86-V4-NEXT:    tail call void @func0()
+; CHECK-X86-V4-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V4:       [[ELSE]]:
+; CHECK-X86-V4-NEXT:    tail call void @func1()
+; CHECK-X86-V4-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V4:       [[FINALLY]]:
+; CHECK-X86-V4-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-X86-V4-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V4-NEXT:    ret <4 x bfloat> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <4 x bfloat> [ %val1, %then ], [ %val2, %else ]
+  ret <4 x bfloat> %val3
+}
+
+define <6 x bfloat> @shuffle_v6bf16(<3 x bfloat> %arg0, i1 %cond) {
+; CHECK-LABEL: define <6 x bfloat> @shuffle_v6bf16(
+; CHECK-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <6 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <6 x bfloat> [[VAL3]]
+;
+; CHECK-AARCH64-LABEL: define <6 x bfloat> @shuffle_v6bf16(
+; CHECK-AARCH64-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-AARCH64-NEXT:  [[ENTRY:.*:]]
+; CHECK-AARCH64-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-AARCH64:       [[THEN]]:
+; CHECK-AARCH64-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-AARCH64-NEXT:    tail call void @func0()
+; CHECK-AARCH64-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-AARCH64:       [[ELSE]]:
+; CHECK-AARCH64-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-AARCH64-NEXT:    tail call void @func1()
+; CHECK-AARCH64-NEXT:    br label %[[FINALLY]]
+; CHECK-AARCH64:       [[FINALLY]]:
+; CHECK-AARCH64-NEXT:    [[VAL3:%.*]] = phi <6 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-AARCH64-NEXT:    ret <6 x bfloat> [[VAL3]]
+;
+; CHECK-AMDGPU-LABEL: define <6 x bfloat> @shuffle_v6bf16(
+; CHECK-AMDGPU-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-AMDGPU-NEXT:  [[ENTRY:.*:]]
+; CHECK-AMDGPU-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-AMDGPU:       [[THEN]]:
+; CHECK-AMDGPU-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-AMDGPU-NEXT:    tail call void @func0()
+; CHECK-AMDGPU-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-AMDGPU:       [[ELSE]]:
+; CHECK-AMDGPU-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-AMDGPU-NEXT:    tail call void @func1()
+; CHECK-AMDGPU-NEXT:    br label %[[FINALLY]]
+; CHECK-AMDGPU:       [[FINALLY]]:
+; CHECK-AMDGPU-NEXT:    [[VAL3:%.*]] = phi <6 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-AMDGPU-NEXT:    ret <6 x bfloat> [[VAL3]]
+;
+; CHECK-ARM-LABEL: define <6 x bfloat> @shuffle_v6bf16(
+; CHECK-ARM-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-ARM-NEXT:  [[ENTRY:.*:]]
+; CHECK-ARM-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-ARM:       [[THEN]]:
+; CHECK-ARM-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-ARM-NEXT:    tail call void @func0()
+; CHECK-ARM-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-ARM:       [[ELSE]]:
+; CHECK-ARM-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-ARM-NEXT:    tail call void @func1()
+; CHECK-ARM-NEXT:    br label %[[FINALLY]]
+; CHECK-ARM:       [[FINALLY]]:
+; CHECK-ARM-NEXT:    [[VAL3:%.*]] = phi <6 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-ARM-NEXT:    ret <6 x bfloat> [[VAL3]]
+;
+; CHECK-HEXAGON-LABEL: define <6 x bfloat> @shuffle_v6bf16(
+; CHECK-HEXAGON-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-HEXAGON-NEXT:  [[ENTRY:.*:]]
+; CHECK-HEXAGON-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-HEXAGON:       [[THEN]]:
+; CHECK-HEXAGON-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-HEXAGON-NEXT:    tail call void @func0()
+; CHECK-HEXAGON-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-HEXAGON:       [[ELSE]]:
+; CHECK-HEXAGON-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-HEXAGON-NEXT:    tail call void @func1()
+; CHECK-HEXAGON-NEXT:    br label %[[FINALLY]]
+; CHECK-HEXAGON:       [[FINALLY]]:
+; CHECK-HEXAGON-NEXT:    [[VAL3:%.*]] = phi <6 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-HEXAGON-NEXT:    ret <6 x bfloat> [[VAL3]]
+;
+; CHECK-RISCV-LABEL: define <6 x bfloat> @shuffle_v6bf16(
+; CHECK-RISCV-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-RISCV-NEXT:  [[ENTRY:.*:]]
+; CHECK-RISCV-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-RISCV:       [[THEN]]:
+; CHECK-RISCV-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-RISCV-NEXT:    tail call void @func0()
+; CHECK-RISCV-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-RISCV:       [[ELSE]]:
+; CHECK-RISCV-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-RISCV-NEXT:    tail call void @func1()
+; CHECK-RISCV-NEXT:    br label %[[FINALLY]]
+; CHECK-RISCV:       [[FINALLY]]:
+; CHECK-RISCV-NEXT:    [[VAL3:%.*]] = phi <6 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-RISCV-NEXT:    ret <6 x bfloat> [[VAL3]]
+;
+; CHECK-X86-V1-LABEL: define <6 x bfloat> @shuffle_v6bf16(
+; CHECK-X86-V1-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V1-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V1:       [[THEN]]:
+; CHECK-X86-V1-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
+; CHECK-X86-V1-NEXT:    tail call void @func0()
+; CHECK-X86-V1-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V1:       [[ELSE]]:
+; CHECK-X86-V1-NEXT:    tail call void @func1()
+; CHECK-X86-V1-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V1:       [[FINALLY]]:
+; CHECK-X86-V1-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-X86-V1-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V1-NEXT:    ret <6 x bfloat> [[VAL3]]
+;
+; CHECK-X86-V2-LABEL: define <6 x bfloat> @shuffle_v6bf16(
+; CHECK-X86-V2-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V2-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V2:       [[THEN]]:
+; CHECK-X86-V2-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
+; CHECK-X86-V2-NEXT:    tail call void @func0()
+; CHECK-X86-V2-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V2:       [[ELSE]]:
+; CHECK-X86-V2-NEXT:    tail call void @func1()
+; CHECK-X86-V2-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V2:       [[FINALLY]]:
+; CHECK-X86-V2-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-X86-V2-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V2-NEXT:    ret <6 x bfloat> [[VAL3]]
+;
+; CHECK-X86-V3-LABEL: define <6 x bfloat> @shuffle_v6bf16(
+; CHECK-X86-V3-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V3-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V3:       [[THEN]]:
+; CHECK-X86-V3-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
+; CHECK-X86-V3-NEXT:    tail call void @func0()
+; CHECK-X86-V3-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V3:       [[ELSE]]:
+; CHECK-X86-V3-NEXT:    tail call void @func1()
+; CHECK-X86-V3-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V3:       [[FINALLY]]:
+; CHECK-X86-V3-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-X86-V3-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V3-NEXT:    ret <6 x bfloat> [[VAL3]]
+;
+; CHECK-X86-V4-LABEL: define <6 x bfloat> @shuffle_v6bf16(
+; CHECK-X86-V4-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V4-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V4:       [[THEN]]:
+; CHECK-X86-V4-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
+; CHECK-X86-V4-NEXT:    tail call void @func0()
+; CHECK-X86-V4-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V4:       [[ELSE]]:
+; CHECK-X86-V4-NEXT:    tail call void @func1()
+; CHECK-X86-V4-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V4:       [[FINALLY]]:
+; CHECK-X86-V4-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-X86-V4-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V4-NEXT:    ret <6 x bfloat> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <6 x bfloat> [ %val1, %then ], [ %val2, %else ]
+  ret <6 x bfloat> %val3
+}
+
+define <8 x bfloat> @shuffle_v8bf16(<3 x bfloat> %arg0, i1 %cond) {
+; CHECK-LABEL: define <8 x bfloat> @shuffle_v8bf16(
+; CHECK-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <8 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <8 x bfloat> [[VAL3]]
+;
+; CHECK-AARCH64-LABEL: define <8 x bfloat> @shuffle_v8bf16(
+; CHECK-AARCH64-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-AARCH64-NEXT:  [[ENTRY:.*:]]
+; CHECK-AARCH64-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-AARCH64:       [[THEN]]:
+; CHECK-AARCH64-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-AARCH64-NEXT:    tail call void @func0()
+; CHECK-AARCH64-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-AARCH64:       [[ELSE]]:
+; CHECK-AARCH64-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-AARCH64-NEXT:    tail call void @func1()
+; CHECK-AARCH64-NEXT:    br label %[[FINALLY]]
+; CHECK-AARCH64:       [[FINALLY]]:
+; CHECK-AARCH64-NEXT:    [[VAL3:%.*]] = phi <8 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-AARCH64-NEXT:    ret <8 x bfloat> [[VAL3]]
+;
+; CHECK-AMDGPU-LABEL: define <8 x bfloat> @shuffle_v8bf16(
+; CHECK-AMDGPU-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-AMDGPU-NEXT:  [[ENTRY:.*:]]
+; CHECK-AMDGPU-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-AMDGPU:       [[THEN]]:
+; CHECK-AMDGPU-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-AMDGPU-NEXT:    tail call void @func0()
+; CHECK-AMDGPU-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-AMDGPU:       [[ELSE]]:
+; CHECK-AMDGPU-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-AMDGPU-NEXT:    tail call void @func1()
+; CHECK-AMDGPU-NEXT:    br label %[[FINALLY]]
+; CHECK-AMDGPU:       [[FINALLY]]:
+; CHECK-AMDGPU-NEXT:    [[VAL3:%.*]] = phi <8 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-AMDGPU-NEXT:    ret <8 x bfloat> [[VAL3]]
+;
+; CHECK-ARM-LABEL: define <8 x bfloat> @shuffle_v8bf16(
+; CHECK-ARM-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-ARM-NEXT:  [[ENTRY:.*:]]
+; CHECK-ARM-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-ARM:       [[THEN]]:
+; CHECK-ARM-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-ARM-NEXT:    tail call void @func0()
+; CHECK-ARM-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-ARM:       [[ELSE]]:
+; CHECK-ARM-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-ARM-NEXT:    tail call void @func1()
+; CHECK-ARM-NEXT:    br label %[[FINALLY]]
+; CHECK-ARM:       [[FINALLY]]:
+; CHECK-ARM-NEXT:    [[VAL3:%.*]] = phi <8 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-ARM-NEXT:    ret <8 x bfloat> [[VAL3]]
+;
+; CHECK-HEXAGON-LABEL: define <8 x bfloat> @shuffle_v8bf16(
+; CHECK-HEXAGON-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-HEXAGON-NEXT:  [[ENTRY:.*:]]
+; CHECK-HEXAGON-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-HEXAGON:       [[THEN]]:
+; CHECK-HEXAGON-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-HEXAGON-NEXT:    tail call void @func0()
+; CHECK-HEXAGON-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-HEXAGON:       [[ELSE]]:
+; CHECK-HEXAGON-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-HEXAGON-NEXT:    tail call void @func1()
+; CHECK-HEXAGON-NEXT:    br label %[[FINALLY]]
+; CHECK-HEXAGON:       [[FINALLY]]:
+; CHECK-HEXAGON-NEXT:    [[VAL3:%.*]] = phi <8 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-HEXAGON-NEXT:    ret <8 x bfloat> [[VAL3]]
+;
+; CHECK-RISCV-LABEL: define <8 x bfloat> @shuffle_v8bf16(
+; CHECK-RISCV-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-RISCV-NEXT:  [[ENTRY:.*:]]
+; CHECK-RISCV-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-RISCV:       [[THEN]]:
+; CHECK-RISCV-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-RISCV-NEXT:    tail call void @func0()
+; CHECK-RISCV-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-RISCV:       [[ELSE]]:
+; CHECK-RISCV-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-RISCV-NEXT:    tail call void @func1()
+; CHECK-RISCV-NEXT:    br label %[[FINALLY]]
+; CHECK-RISCV:       [[FINALLY]]:
+; CHECK-RISCV-NEXT:    [[VAL3:%.*]] = phi <8 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-RISCV-NEXT:    ret <8 x bfloat> [[VAL3]]
+;
+; CHECK-X86-V1-LABEL: define <8 x bfloat> @shuffle_v8bf16(
+; CHECK-X86-V1-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V1-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V1:       [[THEN]]:
+; CHECK-X86-V1-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
+; CHECK-X86-V1-NEXT:    tail call void @func0()
+; CHECK-X86-V1-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V1:       [[ELSE]]:
+; CHECK-X86-V1-NEXT:    tail call void @func1()
+; CHECK-X86-V1-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V1:       [[FINALLY]]:
+; CHECK-X86-V1-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-X86-V1-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V1-NEXT:    ret <8 x bfloat> [[VAL3]]
+;
+; CHECK-X86-V2-LABEL: define <8 x bfloat> @shuffle_v8bf16(
+; CHECK-X86-V2-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V2-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V2:       [[THEN]]:
+; CHECK-X86-V2-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
+; CHECK-X86-V2-NEXT:    tail call void @func0()
+; CHECK-X86-V2-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V2:       [[ELSE]]:
+; CHECK-X86-V2-NEXT:    tail call void @func1()
+; CHECK-X86-V2-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V2:       [[FINALLY]]:
+; CHECK-X86-V2-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-X86-V2-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V2-NEXT:    ret <8 x bfloat> [[VAL3]]
+;
+; CHECK-X86-V3-LABEL: define <8 x bfloat> @shuffle_v8bf16(
+; CHECK-X86-V3-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V3-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V3:       [[THEN]]:
+; CHECK-X86-V3-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
+; CHECK-X86-V3-NEXT:    tail call void @func0()
+; CHECK-X86-V3-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V3:       [[ELSE]]:
+; CHECK-X86-V3-NEXT:    tail call void @func1()
+; CHECK-X86-V3-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V3:       [[FINALLY]]:
+; CHECK-X86-V3-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-X86-V3-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V3-NEXT:    ret <8 x bfloat> [[VAL3]]
+;
+; CHECK-X86-V4-LABEL: define <8 x bfloat> @shuffle_v8bf16(
+; CHECK-X86-V4-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V4-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V4:       [[THEN]]:
+; CHECK-X86-V4-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
+; CHECK-X86-V4-NEXT:    tail call void @func0()
+; CHECK-X86-V4-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V4:       [[ELSE]]:
+; CHECK-X86-V4-NEXT:    tail call void @func1()
+; CHECK-X86-V4-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V4:       [[FINALLY]]:
+; CHECK-X86-V4-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-X86-V4-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V4-NEXT:    ret <8 x bfloat> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <8 x bfloat> [ %val1, %then ], [ %val2, %else ]
+  ret <8 x bfloat> %val3
+}
+
+define <16 x bfloat> @shuffle_v16bf16(<3 x bfloat> %arg0, i1 %cond) {
+; CHECK-LABEL: define <16 x bfloat> @shuffle_v16bf16(
+; CHECK-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <16 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <16 x bfloat> [[VAL3]]
+;
+; CHECK-AARCH64-LABEL: define <16 x bfloat> @shuffle_v16bf16(
+; CHECK-AARCH64-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-AARCH64-NEXT:  [[ENTRY:.*:]]
+; CHECK-AARCH64-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-AARCH64:       [[THEN]]:
+; CHECK-AARCH64-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-AARCH64-NEXT:    tail call void @func0()
+; CHECK-AARCH64-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-AARCH64:       [[ELSE]]:
+; CHECK-AARCH64-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-AARCH64-NEXT:    tail call void @func1()
+; CHECK-AARCH64-NEXT:    br label %[[FINALLY]]
+; CHECK-AARCH64:       [[FINALLY]]:
+; CHECK-AARCH64-NEXT:    [[VAL3:%.*]] = phi <16 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-AARCH64-NEXT:    ret <16 x bfloat> [[VAL3]]
+;
+; CHECK-AMDGPU-LABEL: define <16 x bfloat> @shuffle_v16bf16(
+; CHECK-AMDGPU-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-AMDGPU-NEXT:  [[ENTRY:.*:]]
+; CHECK-AMDGPU-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-AMDGPU:       [[THEN]]:
+; CHECK-AMDGPU-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-AMDGPU-NEXT:    tail call void @func0()
+; CHECK-AMDGPU-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-AMDGPU:       [[ELSE]]:
+; CHECK-AMDGPU-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-AMDGPU-NEXT:    tail call void @func1()
+; CHECK-AMDGPU-NEXT:    br label %[[FINALLY]]
+; CHECK-AMDGPU:       [[FINALLY]]:
+; CHECK-AMDGPU-NEXT:    [[VAL3:%.*]] = phi <16 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-AMDGPU-NEXT:    ret <16 x bfloat> [[VAL3]]
+;
+; CHECK-ARM-LABEL: define <16 x bfloat> @shuffle_v16bf16(
+; CHECK-ARM-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-ARM-NEXT:  [[ENTRY:.*:]]
+; CHECK-ARM-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-ARM:       [[THEN]]:
+; CHECK-ARM-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-ARM-NEXT:    tail call void @func0()
+; CHECK-ARM-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-ARM:       [[ELSE]]:
+; CHECK-ARM-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-ARM-NEXT:    tail call void @func1()
+; CHECK-ARM-NEXT:    br label %[[FINALLY]]
+; CHECK-ARM:       [[FINALLY]]:
+; CHECK-ARM-NEXT:    [[VAL3:%.*]] = phi <16 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-ARM-NEXT:    ret <16 x bfloat> [[VAL3]]
+;
+; CHECK-HEXAGON-LABEL: define <16 x bfloat> @shuffle_v16bf16(
+; CHECK-HEXAGON-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-HEXAGON-NEXT:  [[ENTRY:.*:]]
+; CHECK-HEXAGON-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-HEXAGON:       [[THEN]]:
+; CHECK-HEXAGON-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-HEXAGON-NEXT:    tail call void @func0()
+; CHECK-HEXAGON-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-HEXAGON:       [[ELSE]]:
+; CHECK-HEXAGON-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-HEXAGON-NEXT:    tail call void @func1()
+; CHECK-HEXAGON-NEXT:    br label %[[FINALLY]]
+; CHECK-HEXAGON:       [[FINALLY]]:
+; CHECK-HEXAGON-NEXT:    [[VAL3:%.*]] = phi <16 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-HEXAGON-NEXT:    ret <16 x bfloat> [[VAL3]]
+;
+; CHECK-RISCV-LABEL: define <16 x bfloat> @shuffle_v16bf16(
+; CHECK-RISCV-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-RISCV-NEXT:  [[ENTRY:.*:]]
+; CHECK-RISCV-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-RISCV:       [[THEN]]:
+; CHECK-RISCV-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-RISCV-NEXT:    tail call void @func0()
+; CHECK-RISCV-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-RISCV:       [[ELSE]]:
+; CHECK-RISCV-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-RISCV-NEXT:    tail call void @func1()
+; CHECK-RISCV-NEXT:    br label %[[FINALLY]]
+; CHECK-RISCV:       [[FINALLY]]:
+; CHECK-RISCV-NEXT:    [[VAL3:%.*]] = phi <16 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-RISCV-NEXT:    ret <16 x bfloat> [[VAL3]]
+;
+; CHECK-X86-V1-LABEL: define <16 x bfloat> @shuffle_v16bf16(
+; CHECK-X86-V1-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V1-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V1:       [[THEN]]:
+; CHECK-X86-V1-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
+; CHECK-X86-V1-NEXT:    tail call void @func0()
+; CHECK-X86-V1-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V1:       [[ELSE]]:
+; CHECK-X86-V1-NEXT:    tail call void @func1()
+; CHECK-X86-V1-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V1:       [[FINALLY]]:
+; CHECK-X86-V1-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-X86-V1-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V1-NEXT:    ret <16 x bfloat> [[VAL3]]
+;
+; CHECK-X86-V2-LABEL: define <16 x bfloat> @shuffle_v16bf16(
+; CHECK-X86-V2-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V2-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V2:       [[THEN]]:
+; CHECK-X86-V2-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
+; CHECK-X86-V2-NEXT:    tail call void @func0()
+; CHECK-X86-V2-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V2:       [[ELSE]]:
+; CHECK-X86-V2-NEXT:    tail call void @func1()
+; CHECK-X86-V2-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V2:       [[FINALLY]]:
+; CHECK-X86-V2-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-X86-V2-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V2-NEXT:    ret <16 x bfloat> [[VAL3]]
+;
+; CHECK-X86-V3-LABEL: define <16 x bfloat> @shuffle_v16bf16(
+; CHECK-X86-V3-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V3-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V3:       [[THEN]]:
+; CHECK-X86-V3-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
+; CHECK-X86-V3-NEXT:    tail call void @func0()
+; CHECK-X86-V3-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V3:       [[ELSE]]:
+; CHECK-X86-V3-NEXT:    tail call void @func1()
+; CHECK-X86-V3-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V3:       [[FINALLY]]:
+; CHECK-X86-V3-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-X86-V3-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V3-NEXT:    ret <16 x bfloat> [[VAL3]]
+;
+; CHECK-X86-V4-LABEL: define <16 x bfloat> @shuffle_v16bf16(
+; CHECK-X86-V4-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V4-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V4:       [[THEN]]:
+; CHECK-X86-V4-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
+; CHECK-X86-V4-NEXT:    tail call void @func0()
+; CHECK-X86-V4-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V4:       [[ELSE]]:
+; CHECK-X86-V4-NEXT:    tail call void @func1()
+; CHECK-X86-V4-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V4:       [[FINALLY]]:
+; CHECK-X86-V4-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-X86-V4-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V4-NEXT:    ret <16 x bfloat> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <16 x bfloat> [ %val1, %then ], [ %val2, %else ]
+  ret <16 x bfloat> %val3
+}
+
+define <32 x bfloat> @shuffle_v32bf16(<3 x bfloat> %arg0, i1 %cond) {
+; CHECK-LABEL: define <32 x bfloat> @shuffle_v32bf16(
+; CHECK-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <32 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <32 x bfloat> [[VAL3]]
+;
+; CHECK-AARCH64-LABEL: define <32 x bfloat> @shuffle_v32bf16(
+; CHECK-AARCH64-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-AARCH64-NEXT:  [[ENTRY:.*:]]
+; CHECK-AARCH64-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-AARCH64:       [[THEN]]:
+; CHECK-AARCH64-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-AARCH64-NEXT:    tail call void @func0()
+; CHECK-AARCH64-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-AARCH64:       [[ELSE]]:
+; CHECK-AARCH64-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-AARCH64-NEXT:    tail call void @func1()
+; CHECK-AARCH64-NEXT:    br label %[[FINALLY]]
+; CHECK-AARCH64:       [[FINALLY]]:
+; CHECK-AARCH64-NEXT:    [[VAL3:%.*]] = phi <32 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-AARCH64-NEXT:    ret <32 x bfloat> [[VAL3]]
+;
+; CHECK-AMDGPU-LABEL: define <32 x bfloat> @shuffle_v32bf16(
+; CHECK-AMDGPU-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-AMDGPU-NEXT:  [[ENTRY:.*:]]
+; CHECK-AMDGPU-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-AMDGPU:       [[THEN]]:
+; CHECK-AMDGPU-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-AMDGPU-NEXT:    tail call void @func0()
+; CHECK-AMDGPU-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-AMDGPU:       [[ELSE]]:
+; CHECK-AMDGPU-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-AMDGPU-NEXT:    tail call void @func1()
+; CHECK-AMDGPU-NEXT:    br label %[[FINALLY]]
+; CHECK-AMDGPU:       [[FINALLY]]:
+; CHECK-AMDGPU-NEXT:    [[VAL3:%.*]] = phi <32 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-AMDGPU-NEXT:    ret <32 x bfloat> [[VAL3]]
+;
+; CHECK-ARM-LABEL: define <32 x bfloat> @shuffle_v32bf16(
+; CHECK-ARM-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-ARM-NEXT:  [[ENTRY:.*:]]
+; CHECK-ARM-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-ARM:       [[THEN]]:
+; CHECK-ARM-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-ARM-NEXT:    tail call void @func0()
+; CHECK-ARM-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-ARM:       [[ELSE]]:
+; CHECK-ARM-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-ARM-NEXT:    tail call void @func1()
+; CHECK-ARM-NEXT:    br label %[[FINALLY]]
+; CHECK-ARM:       [[FINALLY]]:
+; CHECK-ARM-NEXT:    [[VAL3:%.*]] = phi <32 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-ARM-NEXT:    ret <32 x bfloat> [[VAL3]]
+;
+; CHECK-HEXAGON-LABEL: define <32 x bfloat> @shuffle_v32bf16(
+; CHECK-HEXAGON-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-HEXAGON-NEXT:  [[ENTRY:.*:]]
+; CHECK-HEXAGON-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-HEXAGON:       [[THEN]]:
+; CHECK-HEXAGON-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-HEXAGON-NEXT:    tail call void @func0()
+; CHECK-HEXAGON-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-HEXAGON:       [[ELSE]]:
+; CHECK-HEXAGON-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-HEXAGON-NEXT:    tail call void @func1()
+; CHECK-HEXAGON-NEXT:    br label %[[FINALLY]]
+; CHECK-HEXAGON:       [[FINALLY]]:
+; CHECK-HEXAGON-NEXT:    [[VAL3:%.*]] = phi <32 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-HEXAGON-NEXT:    ret <32 x bfloat> [[VAL3]]
+;
+; CHECK-RISCV-LABEL: define <32 x bfloat> @shuffle_v32bf16(
+; CHECK-RISCV-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-RISCV-NEXT:  [[ENTRY:.*:]]
+; CHECK-RISCV-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-RISCV:       [[THEN]]:
+; CHECK-RISCV-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-RISCV-NEXT:    tail call void @func0()
+; CHECK-RISCV-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-RISCV:       [[ELSE]]:
+; CHECK-RISCV-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-RISCV-NEXT:    tail call void @func1()
+; CHECK-RISCV-NEXT:    br label %[[FINALLY]]
+; CHECK-RISCV:       [[FINALLY]]:
+; CHECK-RISCV-NEXT:    [[VAL3:%.*]] = phi <32 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-RISCV-NEXT:    ret <32 x bfloat> [[VAL3]]
+;
+; CHECK-X86-V1-LABEL: define <32 x bfloat> @shuffle_v32bf16(
+; CHECK-X86-V1-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V1-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V1:       [[THEN]]:
+; CHECK-X86-V1-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
+; CHECK-X86-V1-NEXT:    tail call void @func0()
+; CHECK-X86-V1-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V1:       [[ELSE]]:
+; CHECK-X86-V1-NEXT:    tail call void @func1()
+; CHECK-X86-V1-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V1:       [[FINALLY]]:
+; CHECK-X86-V1-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-X86-V1-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V1-NEXT:    ret <32 x bfloat> [[VAL3]]
+;
+; CHECK-X86-V2-LABEL: define <32 x bfloat> @shuffle_v32bf16(
+; CHECK-X86-V2-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V2-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V2:       [[THEN]]:
+; CHECK-X86-V2-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
+; CHECK-X86-V2-NEXT:    tail call void @func0()
+; CHECK-X86-V2-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V2:       [[ELSE]]:
+; CHECK-X86-V2-NEXT:    tail call void @func1()
+; CHECK-X86-V2-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V2:       [[FINALLY]]:
+; CHECK-X86-V2-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-X86-V2-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V2-NEXT:    ret <32 x bfloat> [[VAL3]]
+;
+; CHECK-X86-V3-LABEL: define <32 x bfloat> @shuffle_v32bf16(
+; CHECK-X86-V3-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V3-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V3:       [[THEN]]:
+; CHECK-X86-V3-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
+; CHECK-X86-V3-NEXT:    tail call void @func0()
+; CHECK-X86-V3-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V3:       [[ELSE]]:
+; CHECK-X86-V3-NEXT:    tail call void @func1()
+; CHECK-X86-V3-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V3:       [[FINALLY]]:
+; CHECK-X86-V3-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-X86-V3-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V3-NEXT:    ret <32 x bfloat> [[VAL3]]
+;
+; CHECK-X86-V4-LABEL: define <32 x bfloat> @shuffle_v32bf16(
+; CHECK-X86-V4-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V4-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V4:       [[THEN]]:
+; CHECK-X86-V4-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
+; CHECK-X86-V4-NEXT:    tail call void @func0()
+; CHECK-X86-V4-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V4:       [[ELSE]]:
+; CHECK-X86-V4-NEXT:    tail call void @func1()
+; CHECK-X86-V4-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V4:       [[FINALLY]]:
+; CHECK-X86-V4-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-X86-V4-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V4-NEXT:    ret <32 x bfloat> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <32 x bfloat> [ %val1, %then ], [ %val2, %else ]
+  ret <32 x bfloat> %val3
+}
+
+define <2 x half> @shuffle_v2f16(<2 x half> %arg0, i1 %cond) {
+; CHECK-LABEL: define <2 x half> @shuffle_v2f16(
+; CHECK-SAME: <2 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <2 x half> [[ARG0]], <2 x half> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <2 x half> [[ARG0]], <2 x half> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <2 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <2 x half> [[VAL3]]
+;
+; CHECK-AARCH64-LABEL: define <2 x half> @shuffle_v2f16(
+; CHECK-AARCH64-SAME: <2 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-AARCH64-NEXT:  [[ENTRY:.*:]]
+; CHECK-AARCH64-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-AARCH64:       [[THEN]]:
+; CHECK-AARCH64-NEXT:    [[VAL1:%.*]] = shufflevector <2 x half> [[ARG0]], <2 x half> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-AARCH64-NEXT:    tail call void @func0()
+; CHECK-AARCH64-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-AARCH64:       [[ELSE]]:
+; CHECK-AARCH64-NEXT:    [[VAL2:%.*]] = shufflevector <2 x half> [[ARG0]], <2 x half> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-AARCH64-NEXT:    tail call void @func1()
+; CHECK-AARCH64-NEXT:    br label %[[FINALLY]]
+; CHECK-AARCH64:       [[FINALLY]]:
+; CHECK-AARCH64-NEXT:    [[VAL3:%.*]] = phi <2 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-AARCH64-NEXT:    ret <2 x half> [[VAL3]]
+;
+; CHECK-AMDGPU-LABEL: define <2 x half> @shuffle_v2f16(
+; CHECK-AMDGPU-SAME: <2 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-AMDGPU-NEXT:  [[ENTRY:.*:]]
+; CHECK-AMDGPU-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-AMDGPU:       [[THEN]]:
+; CHECK-AMDGPU-NEXT:    [[VAL1:%.*]] = shufflevector <2 x half> [[ARG0]], <2 x half> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-AMDGPU-NEXT:    tail call void @func0()
+; CHECK-AMDGPU-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-AMDGPU:       [[ELSE]]:
+; CHECK-AMDGPU-NEXT:    [[VAL2:%.*]] = shufflevector <2 x half> [[ARG0]], <2 x half> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-AMDGPU-NEXT:    tail call void @func1()
+; CHECK-AMDGPU-NEXT:    br label %[[FINALLY]]
+; CHECK-AMDGPU:       [[FINALLY]]:
+; CHECK-AMDGPU-NEXT:    [[VAL3:%.*]] = phi <2 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-AMDGPU-NEXT:    ret <2 x half> [[VAL3]]
+;
+; CHECK-ARM-LABEL: define <2 x half> @shuffle_v2f16(
+; CHECK-ARM-SAME: <2 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-ARM-NEXT:  [[ENTRY:.*:]]
+; CHECK-ARM-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-ARM:       [[THEN]]:
+; CHECK-ARM-NEXT:    [[VAL1:%.*]] = shufflevector <2 x half> [[ARG0]], <2 x half> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-ARM-NEXT:    tail call void @func0()
+; CHECK-ARM-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-ARM:       [[ELSE]]:
+; CHECK-ARM-NEXT:    [[VAL2:%.*]] = shufflevector <2 x half> [[ARG0]], <2 x half> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-ARM-NEXT:    tail call void @func1()
+; CHECK-ARM-NEXT:    br label %[[FINALLY]]
+; CHECK-ARM:       [[FINALLY]]:
+; CHECK-ARM-NEXT:    [[VAL3:%.*]] = phi <2 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-ARM-NEXT:    ret <2 x half> [[VAL3]]
+;
+; CHECK-HEXAGON-LABEL: define <2 x half> @shuffle_v2f16(
+; CHECK-HEXAGON-SAME: <2 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-HEXAGON-NEXT:  [[ENTRY:.*:]]
+; CHECK-HEXAGON-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-HEXAGON:       [[THEN]]:
+; CHECK-HEXAGON-NEXT:    [[VAL1:%.*]] = shufflevector <2 x half> [[ARG0]], <2 x half> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-HEXAGON-NEXT:    tail call void @func0()
+; CHECK-HEXAGON-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-HEXAGON:       [[ELSE]]:
+; CHECK-HEXAGON-NEXT:    [[VAL2:%.*]] = shufflevector <2 x half> [[ARG0]], <2 x half> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-HEXAGON-NEXT:    tail call void @func1()
+; CHECK-HEXAGON-NEXT:    br label %[[FINALLY]]
+; CHECK-HEXAGON:       [[FINALLY]]:
+; CHECK-HEXAGON-NEXT:    [[VAL3:%.*]] = phi <2 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-HEXAGON-NEXT:    ret <2 x half> [[VAL3]]
+;
+; CHECK-RISCV-LABEL: define <2 x half> @shuffle_v2f16(
+; CHECK-RISCV-SAME: <2 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-RISCV-NEXT:  [[ENTRY:.*:]]
+; CHECK-RISCV-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-RISCV:       [[THEN]]:
+; CHECK-RISCV-NEXT:    [[VAL1:%.*]] = shufflevector <2 x half> [[ARG0]], <2 x half> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-RISCV-NEXT:    tail call void @func0()
+; CHECK-RISCV-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-RISCV:       [[ELSE]]:
+; CHECK-RISCV-NEXT:    [[VAL2:%.*]] = shufflevector <2 x half> [[ARG0]], <2 x half> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-RISCV-NEXT:    tail call void @func1()
+; CHECK-RISCV-NEXT:    br label %[[FINALLY]]
+; CHECK-RISCV:       [[FINALLY]]:
+; CHECK-RISCV-NEXT:    [[VAL3:%.*]] = phi <2 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-RISCV-NEXT:    ret <2 x half> [[VAL3]]
+;
+; CHECK-X86-V1-LABEL: define <2 x half> @shuffle_v2f16(
+; CHECK-X86-V1-SAME: <2 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V1-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V1:       [[THEN]]:
+; CHECK-X86-V1-NEXT:    [[VAL1:%.*]] = shufflevector <2 x half> [[ARG0]], <2 x half> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-X86-V1-NEXT:    tail call void @func0()
+; CHECK-X86-V1-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V1:       [[ELSE]]:
+; CHECK-X86-V1-NEXT:    [[VAL2:%.*]] = shufflevector <2 x half> [[ARG0]], <2 x half> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-X86-V1-NEXT:    tail call void @func1()
+; CHECK-X86-V1-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V1:       [[FINALLY]]:
+; CHECK-X86-V1-NEXT:    [[VAL3:%.*]] = phi <2 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V1-NEXT:    ret <2 x half> [[VAL3]]
+;
+; CHECK-X86-V2-LABEL: define <2 x half> @shuffle_v2f16(
+; CHECK-X86-V2-SAME: <2 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V2-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V2:       [[THEN]]:
+; CHECK-X86-V2-NEXT:    [[VAL1:%.*]] = shufflevector <2 x half> [[ARG0]], <2 x half> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-X86-V2-NEXT:    tail call void @func0()
+; CHECK-X86-V2-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V2:       [[ELSE]]:
+; CHECK-X86-V2-NEXT:    [[VAL2:%.*]] = shufflevector <2 x half> [[ARG0]], <2 x half> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-X86-V2-NEXT:    tail call void @func1()
+; CHECK-X86-V2-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V2:       [[FINALLY]]:
+; CHECK-X86-V2-NEXT:    [[VAL3:%.*]] = phi <2 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V2-NEXT:    ret <2 x half> [[VAL3]]
+;
+; CHECK-X86-V3-LABEL: define <2 x half> @shuffle_v2f16(
+; CHECK-X86-V3-SAME: <2 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V3-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V3:       [[THEN]]:
+; CHECK-X86-V3-NEXT:    [[VAL1:%.*]] = shufflevector <2 x half> [[ARG0]], <2 x half> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-X86-V3-NEXT:    tail call void @func0()
+; CHECK-X86-V3-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V3:       [[ELSE]]:
+; CHECK-X86-V3-NEXT:    [[VAL2:%.*]] = shufflevector <2 x half> [[ARG0]], <2 x half> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-X86-V3-NEXT:    tail call void @func1()
+; CHECK-X86-V3-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V3:       [[FINALLY]]:
+; CHECK-X86-V3-NEXT:    [[VAL3:%.*]] = phi <2 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V3-NEXT:    ret <2 x half> [[VAL3]]
+;
+; CHECK-X86-V4-LABEL: define <2 x half> @shuffle_v2f16(
+; CHECK-X86-V4-SAME: <2 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V4-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V4:       [[THEN]]:
+; CHECK-X86-V4-NEXT:    [[VAL1:%.*]] = shufflevector <2 x half> [[ARG0]], <2 x half> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-X86-V4-NEXT:    tail call void @func0()
+; CHECK-X86-V4-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V4:       [[ELSE]]:
+; CHECK-X86-V4-NEXT:    [[VAL2:%.*]] = shufflevector <2 x half> [[ARG0]], <2 x half> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-X86-V4-NEXT:    tail call void @func1()
+; CHECK-X86-V4-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V4:       [[FINALLY]]:
+; CHECK-X86-V4-NEXT:    [[VAL3:%.*]] = phi <2 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V4-NEXT:    ret <2 x half> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <2 x half> %arg0, <2 x half> poison, <2 x i32> <i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <2 x half> %arg0, <2 x half> poison, <2 x i32> <i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <2 x half> [ %val1, %then ], [ %val2, %else ]
+  ret <2 x half> %val3
+}
+
+define <3 x half> @shuffle_v3f16(<3 x half> %arg0, i1 %cond) {
+; CHECK-LABEL: define <3 x half> @shuffle_v3f16(
+; CHECK-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <3 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <3 x half> [[VAL3]]
+;
+; CHECK-AARCH64-LABEL: define <3 x half> @shuffle_v3f16(
+; CHECK-AARCH64-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-AARCH64-NEXT:  [[ENTRY:.*:]]
+; CHECK-AARCH64-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-AARCH64:       [[THEN]]:
+; CHECK-AARCH64-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 1, i32 1>
+; CHECK-AARCH64-NEXT:    tail call void @func0()
+; CHECK-AARCH64-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-AARCH64:       [[ELSE]]:
+; CHECK-AARCH64-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 2, i32 2, i32 2>
+; CHECK-AARCH64-NEXT:    tail call void @func1()
+; CHECK-AARCH64-NEXT:    br label %[[FINALLY]]
+; CHECK-AARCH64:       [[FINALLY]]:
+; CHECK-AARCH64-NEXT:    [[VAL3:%.*]] = phi <3 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-AARCH64-NEXT:    ret <3 x half> [[VAL3]]
+;
+; CHECK-AMDGPU-LABEL: define <3 x half> @shuffle_v3f16(
+; CHECK-AMDGPU-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-AMDGPU-NEXT:  [[ENTRY:.*:]]
+; CHECK-AMDGPU-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-AMDGPU:       [[THEN]]:
+; CHECK-AMDGPU-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 1, i32 1>
+; CHECK-AMDGPU-NEXT:    tail call void @func0()
+; CHECK-AMDGPU-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-AMDGPU:       [[ELSE]]:
+; CHECK-AMDGPU-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 2, i32 2, i32 2>
+; CHECK-AMDGPU-NEXT:    tail call void @func1()
+; CHECK-AMDGPU-NEXT:    br label %[[FINALLY]]
+; CHECK-AMDGPU:       [[FINALLY]]:
+; CHECK-AMDGPU-NEXT:    [[VAL3:%.*]] = phi <3 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-AMDGPU-NEXT:    ret <3 x half> [[VAL3]]
+;
+; CHECK-ARM-LABEL: define <3 x half> @shuffle_v3f16(
+; CHECK-ARM-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-ARM-NEXT:  [[ENTRY:.*:]]
+; CHECK-ARM-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-ARM:       [[THEN]]:
+; CHECK-ARM-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 1, i32 1>
+; CHECK-ARM-NEXT:    tail call void @func0()
+; CHECK-ARM-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-ARM:       [[ELSE]]:
+; CHECK-ARM-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 2, i32 2, i32 2>
+; CHECK-ARM-NEXT:    tail call void @func1()
+; CHECK-ARM-NEXT:    br label %[[FINALLY]]
+; CHECK-ARM:       [[FINALLY]]:
+; CHECK-ARM-NEXT:    [[VAL3:%.*]] = phi <3 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-ARM-NEXT:    ret <3 x half> [[VAL3]]
+;
+; CHECK-HEXAGON-LABEL: define <3 x half> @shuffle_v3f16(
+; CHECK-HEXAGON-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-HEXAGON-NEXT:  [[ENTRY:.*:]]
+; CHECK-HEXAGON-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-HEXAGON:       [[THEN]]:
+; CHECK-HEXAGON-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 1, i32 1>
+; CHECK-HEXAGON-NEXT:    tail call void @func0()
+; CHECK-HEXAGON-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-HEXAGON:       [[ELSE]]:
+; CHECK-HEXAGON-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 2, i32 2, i32 2>
+; CHECK-HEXAGON-NEXT:    tail call void @func1()
+; CHECK-HEXAGON-NEXT:    br label %[[FINALLY]]
+; CHECK-HEXAGON:       [[FINALLY]]:
+; CHECK-HEXAGON-NEXT:    [[VAL3:%.*]] = phi <3 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-HEXAGON-NEXT:    ret <3 x half> [[VAL3]]
+;
+; CHECK-RISCV-LABEL: define <3 x half> @shuffle_v3f16(
+; CHECK-RISCV-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-RISCV-NEXT:  [[ENTRY:.*:]]
+; CHECK-RISCV-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-RISCV:       [[THEN]]:
+; CHECK-RISCV-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 1, i32 1>
+; CHECK-RISCV-NEXT:    tail call void @func0()
+; CHECK-RISCV-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-RISCV:       [[ELSE]]:
+; CHECK-RISCV-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 2, i32 2, i32 2>
+; CHECK-RISCV-NEXT:    tail call void @func1()
+; CHECK-RISCV-NEXT:    br label %[[FINALLY]]
+; CHECK-RISCV:       [[FINALLY]]:
+; CHECK-RISCV-NEXT:    [[VAL3:%.*]] = phi <3 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-RISCV-NEXT:    ret <3 x half> [[VAL3]]
+;
+; CHECK-X86-V1-LABEL: define <3 x half> @shuffle_v3f16(
+; CHECK-X86-V1-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V1-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V1:       [[THEN]]:
+; CHECK-X86-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 1, i32 1>
+; CHECK-X86-V1-NEXT:    tail call void @func0()
+; CHECK-X86-V1-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V1:       [[ELSE]]:
+; CHECK-X86-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 2, i32 2, i32 2>
+; CHECK-X86-V1-NEXT:    tail call void @func1()
+; CHECK-X86-V1-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V1:       [[FINALLY]]:
+; CHECK-X86-V1-NEXT:    [[VAL3:%.*]] = phi <3 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V1-NEXT:    ret <3 x half> [[VAL3]]
+;
+; CHECK-X86-V2-LABEL: define <3 x half> @shuffle_v3f16(
+; CHECK-X86-V2-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V2-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V2:       [[THEN]]:
+; CHECK-X86-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 1, i32 1>
+; CHECK-X86-V2-NEXT:    tail call void @func0()
+; CHECK-X86-V2-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V2:       [[ELSE]]:
+; CHECK-X86-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 2, i32 2, i32 2>
+; CHECK-X86-V2-NEXT:    tail call void @func1()
+; CHECK-X86-V2-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V2:       [[FINALLY]]:
+; CHECK-X86-V2-NEXT:    [[VAL3:%.*]] = phi <3 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V2-NEXT:    ret <3 x half> [[VAL3]]
+;
+; CHECK-X86-V3-LABEL: define <3 x half> @shuffle_v3f16(
+; CHECK-X86-V3-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V3-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V3:       [[THEN]]:
+; CHECK-X86-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 1, i32 1>
+; CHECK-X86-V3-NEXT:    tail call void @func0()
+; CHECK-X86-V3-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V3:       [[ELSE]]:
+; CHECK-X86-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 2, i32 2, i32 2>
+; CHECK-X86-V3-NEXT:    tail call void @func1()
+; CHECK-X86-V3-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V3:       [[FINALLY]]:
+; CHECK-X86-V3-NEXT:    [[VAL3:%.*]] = phi <3 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V3-NEXT:    ret <3 x half> [[VAL3]]
+;
+; CHECK-X86-V4-LABEL: define <3 x half> @shuffle_v3f16(
+; CHECK-X86-V4-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V4-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V4:       [[THEN]]:
+; CHECK-X86-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 1, i32 1>
+; CHECK-X86-V4-NEXT:    tail call void @func0()
+; CHECK-X86-V4-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V4:       [[ELSE]]:
+; CHECK-X86-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 2, i32 2, i32 2>
+; CHECK-X86-V4-NEXT:    tail call void @func1()
+; CHECK-X86-V4-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V4:       [[FINALLY]]:
+; CHECK-X86-V4-NEXT:    [[VAL3:%.*]] = phi <3 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V4-NEXT:    ret <3 x half> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x half> %arg0, <3 x half> poison, <3 x i32> <i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <3 x i32> <i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <3 x half> [ %val1, %then ], [ %val2, %else ]
+  ret <3 x half> %val3
+}
+
+define <4 x half> @shuffle_v4f16(<3 x half> %arg0, i1 %cond) {
+; CHECK-LABEL: define <4 x half> @shuffle_v4f16(
+; CHECK-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <4 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <4 x half> [[VAL3]]
+;
+; CHECK-AARCH64-LABEL: define <4 x half> @shuffle_v4f16(
+; CHECK-AARCH64-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-AARCH64-NEXT:  [[ENTRY:.*:]]
+; CHECK-AARCH64-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-AARCH64:       [[THEN]]:
+; CHECK-AARCH64-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-AARCH64-NEXT:    tail call void @func0()
+; CHECK-AARCH64-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-AARCH64:       [[ELSE]]:
+; CHECK-AARCH64-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-AARCH64-NEXT:    tail call void @func1()
+; CHECK-AARCH64-NEXT:    br label %[[FINALLY]]
+; CHECK-AARCH64:       [[FINALLY]]:
+; CHECK-AARCH64-NEXT:    [[VAL3:%.*]] = phi <4 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-AARCH64-NEXT:    ret <4 x half> [[VAL3]]
+;
+; CHECK-AMDGPU-LABEL: define <4 x half> @shuffle_v4f16(
+; CHECK-AMDGPU-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-AMDGPU-NEXT:  [[ENTRY:.*:]]
+; CHECK-AMDGPU-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-AMDGPU:       [[THEN]]:
+; CHECK-AMDGPU-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-AMDGPU-NEXT:    tail call void @func0()
+; CHECK-AMDGPU-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-AMDGPU:       [[ELSE]]:
+; CHECK-AMDGPU-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-AMDGPU-NEXT:    tail call void @func1()
+; CHECK-AMDGPU-NEXT:    br label %[[FINALLY]]
+; CHECK-AMDGPU:       [[FINALLY]]:
+; CHECK-AMDGPU-NEXT:    [[VAL3:%.*]] = phi <4 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-AMDGPU-NEXT:    ret <4 x half> [[VAL3]]
+;
+; CHECK-ARM-LABEL: define <4 x half> @shuffle_v4f16(
+; CHECK-ARM-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-ARM-NEXT:  [[ENTRY:.*:]]
+; CHECK-ARM-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-ARM:       [[THEN]]:
+; CHECK-ARM-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-ARM-NEXT:    tail call void @func0()
+; CHECK-ARM-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-ARM:       [[ELSE]]:
+; CHECK-ARM-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-ARM-NEXT:    tail call void @func1()
+; CHECK-ARM-NEXT:    br label %[[FINALLY]]
+; CHECK-ARM:       [[FINALLY]]:
+; CHECK-ARM-NEXT:    [[VAL3:%.*]] = phi <4 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-ARM-NEXT:    ret <4 x half> [[VAL3]]
+;
+; CHECK-HEXAGON-LABEL: define <4 x half> @shuffle_v4f16(
+; CHECK-HEXAGON-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-HEXAGON-NEXT:  [[ENTRY:.*:]]
+; CHECK-HEXAGON-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-HEXAGON:       [[THEN]]:
+; CHECK-HEXAGON-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-HEXAGON-NEXT:    tail call void @func0()
+; CHECK-HEXAGON-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-HEXAGON:       [[ELSE]]:
+; CHECK-HEXAGON-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-HEXAGON-NEXT:    tail call void @func1()
+; CHECK-HEXAGON-NEXT:    br label %[[FINALLY]]
+; CHECK-HEXAGON:       [[FINALLY]]:
+; CHECK-HEXAGON-NEXT:    [[VAL3:%.*]] = phi <4 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-HEXAGON-NEXT:    ret <4 x half> [[VAL3]]
+;
+; CHECK-RISCV-LABEL: define <4 x half> @shuffle_v4f16(
+; CHECK-RISCV-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-RISCV-NEXT:  [[ENTRY:.*:]]
+; CHECK-RISCV-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-RISCV:       [[THEN]]:
+; CHECK-RISCV-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-RISCV-NEXT:    tail call void @func0()
+; CHECK-RISCV-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-RISCV:       [[ELSE]]:
+; CHECK-RISCV-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-RISCV-NEXT:    tail call void @func1()
+; CHECK-RISCV-NEXT:    br label %[[FINALLY]]
+; CHECK-RISCV:       [[FINALLY]]:
+; CHECK-RISCV-NEXT:    [[VAL3:%.*]] = phi <4 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-RISCV-NEXT:    ret <4 x half> [[VAL3]]
+;
+; CHECK-X86-V1-LABEL: define <4 x half> @shuffle_v4f16(
+; CHECK-X86-V1-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V1-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V1:       [[THEN]]:
+; CHECK-X86-V1-NEXT:    [[TMP0:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 2, i32 0>
+; CHECK-X86-V1-NEXT:    tail call void @func0()
+; CHECK-X86-V1-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V1:       [[ELSE]]:
+; CHECK-X86-V1-NEXT:    tail call void @func1()
+; CHECK-X86-V1-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V1:       [[FINALLY]]:
+; CHECK-X86-V1-NEXT:    [[TMP1:%.*]] = phi <3 x half> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-X86-V1-NEXT:    [[VAL3:%.*]] = shufflevector <3 x half> [[TMP1]], <3 x half> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V1-NEXT:    ret <4 x half> [[VAL3]]
+;
+; CHECK-X86-V2-LABEL: define <4 x half> @shuffle_v4f16(
+; CHECK-X86-V2-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V2-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V2:       [[THEN]]:
+; CHECK-X86-V2-NEXT:    [[TMP0:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 2, i32 0>
+; CHECK-X86-V2-NEXT:    tail call void @func0()
+; CHECK-X86-V2-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V2:       [[ELSE]]:
+; CHECK-X86-V2-NEXT:    tail call void @func1()
+; CHECK-X86-V2-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V2:       [[FINALLY]]:
+; CHECK-X86-V2-NEXT:    [[TMP1:%.*]] = phi <3 x half> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-X86-V2-NEXT:    [[VAL3:%.*]] = shufflevector <3 x half> [[TMP1]], <3 x half> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V2-NEXT:    ret <4 x half> [[VAL3]]
+;
+; CHECK-X86-V3-LABEL: define <4 x half> @shuffle_v4f16(
+; CHECK-X86-V3-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V3-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V3:       [[THEN]]:
+; CHECK-X86-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-X86-V3-NEXT:    tail call void @func0()
+; CHECK-X86-V3-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V3:       [[ELSE]]:
+; CHECK-X86-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V3-NEXT:    tail call void @func1()
+; CHECK-X86-V3-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V3:       [[FINALLY]]:
+; CHECK-X86-V3-NEXT:    [[VAL3:%.*]] = phi <4 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V3-NEXT:    ret <4 x half> [[VAL3]]
+;
+; CHECK-X86-V4-LABEL: define <4 x half> @shuffle_v4f16(
+; CHECK-X86-V4-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V4-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V4:       [[THEN]]:
+; CHECK-X86-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-X86-V4-NEXT:    tail call void @func0()
+; CHECK-X86-V4-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V4:       [[ELSE]]:
+; CHECK-X86-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V4-NEXT:    tail call void @func1()
+; CHECK-X86-V4-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V4:       [[FINALLY]]:
+; CHECK-X86-V4-NEXT:    [[VAL3:%.*]] = phi <4 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V4-NEXT:    ret <4 x half> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x half> %arg0, <3 x half> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <4 x half> [ %val1, %then ], [ %val2, %else ]
+  ret <4 x half> %val3
+}
+
+define <6 x half> @shuffle_v6f16(<3 x half> %arg0, i1 %cond) {
+; CHECK-LABEL: define <6 x half> @shuffle_v6f16(
+; CHECK-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <6 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <6 x half> [[VAL3]]
+;
+; CHECK-AARCH64-LABEL: define <6 x half> @shuffle_v6f16(
+; CHECK-AARCH64-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-AARCH64-NEXT:  [[ENTRY:.*:]]
+; CHECK-AARCH64-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-AARCH64:       [[THEN]]:
+; CHECK-AARCH64-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-AARCH64-NEXT:    tail call void @func0()
+; CHECK-AARCH64-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-AARCH64:       [[ELSE]]:
+; CHECK-AARCH64-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-AARCH64-NEXT:    tail call void @func1()
+; CHECK-AARCH64-NEXT:    br label %[[FINALLY]]
+; CHECK-AARCH64:       [[FINALLY]]:
+; CHECK-AARCH64-NEXT:    [[VAL3:%.*]] = phi <6 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-AARCH64-NEXT:    ret <6 x half> [[VAL3]]
+;
+; CHECK-AMDGPU-LABEL: define <6 x half> @shuffle_v6f16(
+; CHECK-AMDGPU-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-AMDGPU-NEXT:  [[ENTRY:.*:]]
+; CHECK-AMDGPU-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-AMDGPU:       [[THEN]]:
+; CHECK-AMDGPU-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-AMDGPU-NEXT:    tail call void @func0()
+; CHECK-AMDGPU-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-AMDGPU:       [[ELSE]]:
+; CHECK-AMDGPU-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-AMDGPU-NEXT:    tail call void @func1()
+; CHECK-AMDGPU-NEXT:    br label %[[FINALLY]]
+; CHECK-AMDGPU:       [[FINALLY]]:
+; CHECK-AMDGPU-NEXT:    [[VAL3:%.*]] = phi <6 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-AMDGPU-NEXT:    ret <6 x half> [[VAL3]]
+;
+; CHECK-ARM-LABEL: define <6 x half> @shuffle_v6f16(
+; CHECK-ARM-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-ARM-NEXT:  [[ENTRY:.*:]]
+; CHECK-ARM-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-ARM:       [[THEN]]:
+; CHECK-ARM-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-ARM-NEXT:    tail call void @func0()
+; CHECK-ARM-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-ARM:       [[ELSE]]:
+; CHECK-ARM-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-ARM-NEXT:    tail call void @func1()
+; CHECK-ARM-NEXT:    br label %[[FINALLY]]
+; CHECK-ARM:       [[FINALLY]]:
+; CHECK-ARM-NEXT:    [[VAL3:%.*]] = phi <6 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-ARM-NEXT:    ret <6 x half> [[VAL3]]
+;
+; CHECK-HEXAGON-LABEL: define <6 x half> @shuffle_v6f16(
+; CHECK-HEXAGON-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-HEXAGON-NEXT:  [[ENTRY:.*:]]
+; CHECK-HEXAGON-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-HEXAGON:       [[THEN]]:
+; CHECK-HEXAGON-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-HEXAGON-NEXT:    tail call void @func0()
+; CHECK-HEXAGON-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-HEXAGON:       [[ELSE]]:
+; CHECK-HEXAGON-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-HEXAGON-NEXT:    tail call void @func1()
+; CHECK-HEXAGON-NEXT:    br label %[[FINALLY]]
+; CHECK-HEXAGON:       [[FINALLY]]:
+; CHECK-HEXAGON-NEXT:    [[VAL3:%.*]] = phi <6 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-HEXAGON-NEXT:    ret <6 x half> [[VAL3]]
+;
+; CHECK-RISCV-LABEL: define <6 x half> @shuffle_v6f16(
+; CHECK-RISCV-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-RISCV-NEXT:  [[ENTRY:.*:]]
+; CHECK-RISCV-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-RISCV:       [[THEN]]:
+; CHECK-RISCV-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-RISCV-NEXT:    tail call void @func0()
+; CHECK-RISCV-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-RISCV:       [[ELSE]]:
+; CHECK-RISCV-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-RISCV-NEXT:    tail call void @func1()
+; CHECK-RISCV-NEXT:    br label %[[FINALLY]]
+; CHECK-RISCV:       [[FINALLY]]:
+; CHECK-RISCV-NEXT:    [[VAL3:%.*]] = phi <6 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-RISCV-NEXT:    ret <6 x half> [[VAL3]]
+;
+; CHECK-X86-V1-LABEL: define <6 x half> @shuffle_v6f16(
+; CHECK-X86-V1-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V1-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V1:       [[THEN]]:
+; CHECK-X86-V1-NEXT:    [[TMP0:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 2, i32 0>
+; CHECK-X86-V1-NEXT:    tail call void @func0()
+; CHECK-X86-V1-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V1:       [[ELSE]]:
+; CHECK-X86-V1-NEXT:    tail call void @func1()
+; CHECK-X86-V1-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V1:       [[FINALLY]]:
+; CHECK-X86-V1-NEXT:    [[TMP1:%.*]] = phi <3 x half> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-X86-V1-NEXT:    [[VAL3:%.*]] = shufflevector <3 x half> [[TMP1]], <3 x half> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V1-NEXT:    ret <6 x half> [[VAL3]]
+;
+; CHECK-X86-V2-LABEL: define <6 x half> @shuffle_v6f16(
+; CHECK-X86-V2-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V2-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V2:       [[THEN]]:
+; CHECK-X86-V2-NEXT:    [[TMP0:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 2, i32 0>
+; CHECK-X86-V2-NEXT:    tail call void @func0()
+; CHECK-X86-V2-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V2:       [[ELSE]]:
+; CHECK-X86-V2-NEXT:    tail call void @func1()
+; CHECK-X86-V2-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V2:       [[FINALLY]]:
+; CHECK-X86-V2-NEXT:    [[TMP1:%.*]] = phi <3 x half> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-X86-V2-NEXT:    [[VAL3:%.*]] = shufflevector <3 x half> [[TMP1]], <3 x half> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V2-NEXT:    ret <6 x half> [[VAL3]]
+;
+; CHECK-X86-V3-LABEL: define <6 x half> @shuffle_v6f16(
+; CHECK-X86-V3-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V3-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V3:       [[THEN]]:
+; CHECK-X86-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-X86-V3-NEXT:    tail call void @func0()
+; CHECK-X86-V3-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V3:       [[ELSE]]:
+; CHECK-X86-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V3-NEXT:    tail call void @func1()
+; CHECK-X86-V3-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V3:       [[FINALLY]]:
+; CHECK-X86-V3-NEXT:    [[VAL3:%.*]] = phi <6 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V3-NEXT:    ret <6 x half> [[VAL3]]
+;
+; CHECK-X86-V4-LABEL: define <6 x half> @shuffle_v6f16(
+; CHECK-X86-V4-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V4-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V4:       [[THEN]]:
+; CHECK-X86-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-X86-V4-NEXT:    tail call void @func0()
+; CHECK-X86-V4-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V4:       [[ELSE]]:
+; CHECK-X86-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V4-NEXT:    tail call void @func1()
+; CHECK-X86-V4-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V4:       [[FINALLY]]:
+; CHECK-X86-V4-NEXT:    [[VAL3:%.*]] = phi <6 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V4-NEXT:    ret <6 x half> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x half> %arg0, <3 x half> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <6 x half> [ %val1, %then ], [ %val2, %else ]
+  ret <6 x half> %val3
+}
+
+define <8 x half> @shuffle_v8f16(<3 x half> %arg0, i1 %cond) {
+; CHECK-LABEL: define <8 x half> @shuffle_v8f16(
+; CHECK-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <8 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <8 x half> [[VAL3]]
+;
+; CHECK-AARCH64-LABEL: define <8 x half> @shuffle_v8f16(
+; CHECK-AARCH64-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-AARCH64-NEXT:  [[ENTRY:.*:]]
+; CHECK-AARCH64-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-AARCH64:       [[THEN]]:
+; CHECK-AARCH64-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-AARCH64-NEXT:    tail call void @func0()
+; CHECK-AARCH64-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-AARCH64:       [[ELSE]]:
+; CHECK-AARCH64-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-AARCH64-NEXT:    tail call void @func1()
+; CHECK-AARCH64-NEXT:    br label %[[FINALLY]]
+; CHECK-AARCH64:       [[FINALLY]]:
+; CHECK-AARCH64-NEXT:    [[VAL3:%.*]] = phi <8 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-AARCH64-NEXT:    ret <8 x half> [[VAL3]]
+;
+; CHECK-AMDGPU-LABEL: define <8 x half> @shuffle_v8f16(
+; CHECK-AMDGPU-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-AMDGPU-NEXT:  [[ENTRY:.*:]]
+; CHECK-AMDGPU-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-AMDGPU:       [[THEN]]:
+; CHECK-AMDGPU-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-AMDGPU-NEXT:    tail call void @func0()
+; CHECK-AMDGPU-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-AMDGPU:       [[ELSE]]:
+; CHECK-AMDGPU-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-AMDGPU-NEXT:    tail call void @func1()
+; CHECK-AMDGPU-NEXT:    br label %[[FINALLY]]
+; CHECK-AMDGPU:       [[FINALLY]]:
+; CHECK-AMDGPU-NEXT:    [[VAL3:%.*]] = phi <8 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-AMDGPU-NEXT:    ret <8 x half> [[VAL3]]
+;
+; CHECK-ARM-LABEL: define <8 x half> @shuffle_v8f16(
+; CHECK-ARM-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-ARM-NEXT:  [[ENTRY:.*:]]
+; CHECK-ARM-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-ARM:       [[THEN]]:
+; CHECK-ARM-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-ARM-NEXT:    tail call void @func0()
+; CHECK-ARM-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-ARM:       [[ELSE]]:
+; CHECK-ARM-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-ARM-NEXT:    tail call void @func1()
+; CHECK-ARM-NEXT:    br label %[[FINALLY]]
+; CHECK-ARM:       [[FINALLY]]:
+; CHECK-ARM-NEXT:    [[VAL3:%.*]] = phi <8 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-ARM-NEXT:    ret <8 x half> [[VAL3]]
+;
+; CHECK-HEXAGON-LABEL: define <8 x half> @shuffle_v8f16(
+; CHECK-HEXAGON-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-HEXAGON-NEXT:  [[ENTRY:.*:]]
+; CHECK-HEXAGON-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-HEXAGON:       [[THEN]]:
+; CHECK-HEXAGON-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-HEXAGON-NEXT:    tail call void @func0()
+; CHECK-HEXAGON-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-HEXAGON:       [[ELSE]]:
+; CHECK-HEXAGON-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-HEXAGON-NEXT:    tail call void @func1()
+; CHECK-HEXAGON-NEXT:    br label %[[FINALLY]]
+; CHECK-HEXAGON:       [[FINALLY]]:
+; CHECK-HEXAGON-NEXT:    [[VAL3:%.*]] = phi <8 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-HEXAGON-NEXT:    ret <8 x half> [[VAL3]]
+;
+; CHECK-RISCV-LABEL: define <8 x half> @shuffle_v8f16(
+; CHECK-RISCV-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-RISCV-NEXT:  [[ENTRY:.*:]]
+; CHECK-RISCV-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-RISCV:       [[THEN]]:
+; CHECK-RISCV-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-RISCV-NEXT:    tail call void @func0()
+; CHECK-RISCV-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-RISCV:       [[ELSE]]:
+; CHECK-RISCV-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-RISCV-NEXT:    tail call void @func1()
+; CHECK-RISCV-NEXT:    br label %[[FINALLY]]
+; CHECK-RISCV:       [[FINALLY]]:
+; CHECK-RISCV-NEXT:    [[VAL3:%.*]] = phi <8 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-RISCV-NEXT:    ret <8 x half> [[VAL3]]
+;
+; CHECK-X86-V1-LABEL: define <8 x half> @shuffle_v8f16(
+; CHECK-X86-V1-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V1-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V1:       [[THEN]]:
+; CHECK-X86-V1-NEXT:    [[TMP0:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 2, i32 0>
+; CHECK-X86-V1-NEXT:    tail call void @func0()
+; CHECK-X86-V1-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V1:       [[ELSE]]:
+; CHECK-X86-V1-NEXT:    tail call void @func1()
+; CHECK-X86-V1-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V1:       [[FINALLY]]:
+; CHECK-X86-V1-NEXT:    [[TMP1:%.*]] = phi <3 x half> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-X86-V1-NEXT:    [[VAL3:%.*]] = shufflevector <3 x half> [[TMP1]], <3 x half> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V1-NEXT:    ret <8 x half> [[VAL3]]
+;
+; CHECK-X86-V2-LABEL: define <8 x half> @shuffle_v8f16(
+; CHECK-X86-V2-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V2-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V2:       [[THEN]]:
+; CHECK-X86-V2-NEXT:    [[TMP0:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 2, i32 0>
+; CHECK-X86-V2-NEXT:    tail call void @func0()
+; CHECK-X86-V2-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V2:       [[ELSE]]:
+; CHECK-X86-V2-NEXT:    tail call void @func1()
+; CHECK-X86-V2-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V2:       [[FINALLY]]:
+; CHECK-X86-V2-NEXT:    [[TMP1:%.*]] = phi <3 x half> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-X86-V2-NEXT:    [[VAL3:%.*]] = shufflevector <3 x half> [[TMP1]], <3 x half> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V2-NEXT:    ret <8 x half> [[VAL3]]
+;
+; CHECK-X86-V3-LABEL: define <8 x half> @shuffle_v8f16(
+; CHECK-X86-V3-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V3-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V3:       [[THEN]]:
+; CHECK-X86-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-X86-V3-NEXT:    tail call void @func0()
+; CHECK-X86-V3-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V3:       [[ELSE]]:
+; CHECK-X86-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V3-NEXT:    tail call void @func1()
+; CHECK-X86-V3-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V3:       [[FINALLY]]:
+; CHECK-X86-V3-NEXT:    [[VAL3:%.*]] = phi <8 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V3-NEXT:    ret <8 x half> [[VAL3]]
+;
+; CHECK-X86-V4-LABEL: define <8 x half> @shuffle_v8f16(
+; CHECK-X86-V4-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V4-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V4:       [[THEN]]:
+; CHECK-X86-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-X86-V4-NEXT:    tail call void @func0()
+; CHECK-X86-V4-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V4:       [[ELSE]]:
+; CHECK-X86-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V4-NEXT:    tail call void @func1()
+; CHECK-X86-V4-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V4:       [[FINALLY]]:
+; CHECK-X86-V4-NEXT:    [[VAL3:%.*]] = phi <8 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V4-NEXT:    ret <8 x half> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x half> %arg0, <3 x half> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <8 x half> [ %val1, %then ], [ %val2, %else ]
+  ret <8 x half> %val3
+}
+
+define <16 x half> @shuffle_v16f16(<3 x half> %arg0, i1 %cond) {
+; CHECK-LABEL: define <16 x half> @shuffle_v16f16(
+; CHECK-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <16 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <16 x half> [[VAL3]]
+;
+; CHECK-AARCH64-LABEL: define <16 x half> @shuffle_v16f16(
+; CHECK-AARCH64-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-AARCH64-NEXT:  [[ENTRY:.*:]]
+; CHECK-AARCH64-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-AARCH64:       [[THEN]]:
+; CHECK-AARCH64-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-AARCH64-NEXT:    tail call void @func0()
+; CHECK-AARCH64-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-AARCH64:       [[ELSE]]:
+; CHECK-AARCH64-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-AARCH64-NEXT:    tail call void @func1()
+; CHECK-AARCH64-NEXT:    br label %[[FINALLY]]
+; CHECK-AARCH64:       [[FINALLY]]:
+; CHECK-AARCH64-NEXT:    [[VAL3:%.*]] = phi <16 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-AARCH64-NEXT:    ret <16 x half> [[VAL3]]
+;
+; CHECK-AMDGPU-LABEL: define <16 x half> @shuffle_v16f16(
+; CHECK-AMDGPU-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-AMDGPU-NEXT:  [[ENTRY:.*:]]
+; CHECK-AMDGPU-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-AMDGPU:       [[THEN]]:
+; CHECK-AMDGPU-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-AMDGPU-NEXT:    tail call void @func0()
+; CHECK-AMDGPU-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-AMDGPU:       [[ELSE]]:
+; CHECK-AMDGPU-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-AMDGPU-NEXT:    tail call void @func1()
+; CHECK-AMDGPU-NEXT:    br label %[[FINALLY]]
+; CHECK-AMDGPU:       [[FINALLY]]:
+; CHECK-AMDGPU-NEXT:    [[VAL3:%.*]] = phi <16 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-AMDGPU-NEXT:    ret <16 x half> [[VAL3]]
+;
+; CHECK-ARM-LABEL: define <16 x half> @shuffle_v16f16(
+; CHECK-ARM-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-ARM-NEXT:  [[ENTRY:.*:]]
+; CHECK-ARM-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-ARM:       [[THEN]]:
+; CHECK-ARM-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-ARM-NEXT:    tail call void @func0()
+; CHECK-ARM-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-ARM:       [[ELSE]]:
+; CHECK-ARM-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-ARM-NEXT:    tail call void @func1()
+; CHECK-ARM-NEXT:    br label %[[FINALLY]]
+; CHECK-ARM:       [[FINALLY]]:
+; CHECK-ARM-NEXT:    [[VAL3:%.*]] = phi <16 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-ARM-NEXT:    ret <16 x half> [[VAL3]]
+;
+; CHECK-HEXAGON-LABEL: define <16 x half> @shuffle_v16f16(
+; CHECK-HEXAGON-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-HEXAGON-NEXT:  [[ENTRY:.*:]]
+; CHECK-HEXAGON-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-HEXAGON:       [[THEN]]:
+; CHECK-HEXAGON-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-HEXAGON-NEXT:    tail call void @func0()
+; CHECK-HEXAGON-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-HEXAGON:       [[ELSE]]:
+; CHECK-HEXAGON-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-HEXAGON-NEXT:    tail call void @func1()
+; CHECK-HEXAGON-NEXT:    br label %[[FINALLY]]
+; CHECK-HEXAGON:       [[FINALLY]]:
+; CHECK-HEXAGON-NEXT:    [[VAL3:%.*]] = phi <16 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-HEXAGON-NEXT:    ret <16 x half> [[VAL3]]
+;
+; CHECK-RISCV-LABEL: define <16 x half> @shuffle_v16f16(
+; CHECK-RISCV-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-RISCV-NEXT:  [[ENTRY:.*:]]
+; CHECK-RISCV-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-RISCV:       [[THEN]]:
+; CHECK-RISCV-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-RISCV-NEXT:    tail call void @func0()
+; CHECK-RISCV-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-RISCV:       [[ELSE]]:
+; CHECK-RISCV-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-RISCV-NEXT:    tail call void @func1()
+; CHECK-RISCV-NEXT:    br label %[[FINALLY]]
+; CHECK-RISCV:       [[FINALLY]]:
+; CHECK-RISCV-NEXT:    [[VAL3:%.*]] = phi <16 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-RISCV-NEXT:    ret <16 x half> [[VAL3]]
+;
+; CHECK-X86-V1-LABEL: define <16 x half> @shuffle_v16f16(
+; CHECK-X86-V1-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V1-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V1:       [[THEN]]:
+; CHECK-X86-V1-NEXT:    [[TMP0:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 2, i32 0>
+; CHECK-X86-V1-NEXT:    tail call void @func0()
+; CHECK-X86-V1-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V1:       [[ELSE]]:
+; CHECK-X86-V1-NEXT:    tail call void @func1()
+; CHECK-X86-V1-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V1:       [[FINALLY]]:
+; CHECK-X86-V1-NEXT:    [[TMP1:%.*]] = phi <3 x half> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-X86-V1-NEXT:    [[VAL3:%.*]] = shufflevector <3 x half> [[TMP1]], <3 x half> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V1-NEXT:    ret <16 x half> [[VAL3]]
+;
+; CHECK-X86-V2-LABEL: define <16 x half> @shuffle_v16f16(
+; CHECK-X86-V2-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V2-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V2:       [[THEN]]:
+; CHECK-X86-V2-NEXT:    [[TMP0:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 2, i32 0>
+; CHECK-X86-V2-NEXT:    tail call void @func0()
+; CHECK-X86-V2-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V2:       [[ELSE]]:
+; CHECK-X86-V2-NEXT:    tail call void @func1()
+; CHECK-X86-V2-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V2:       [[FINALLY]]:
+; CHECK-X86-V2-NEXT:    [[TMP1:%.*]] = phi <3 x half> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-X86-V2-NEXT:    [[VAL3:%.*]] = shufflevector <3 x half> [[TMP1]], <3 x half> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V2-NEXT:    ret <16 x half> [[VAL3]]
+;
+; CHECK-X86-V3-LABEL: define <16 x half> @shuffle_v16f16(
+; CHECK-X86-V3-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V3-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V3:       [[THEN]]:
+; CHECK-X86-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-X86-V3-NEXT:    tail call void @func0()
+; CHECK-X86-V3-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V3:       [[ELSE]]:
+; CHECK-X86-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V3-NEXT:    tail call void @func1()
+; CHECK-X86-V3-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V3:       [[FINALLY]]:
+; CHECK-X86-V3-NEXT:    [[VAL3:%.*]] = phi <16 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V3-NEXT:    ret <16 x half> [[VAL3]]
+;
+; CHECK-X86-V4-LABEL: define <16 x half> @shuffle_v16f16(
+; CHECK-X86-V4-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V4-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V4:       [[THEN]]:
+; CHECK-X86-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-X86-V4-NEXT:    tail call void @func0()
+; CHECK-X86-V4-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V4:       [[ELSE]]:
+; CHECK-X86-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V4-NEXT:    tail call void @func1()
+; CHECK-X86-V4-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V4:       [[FINALLY]]:
+; CHECK-X86-V4-NEXT:    [[VAL3:%.*]] = phi <16 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V4-NEXT:    ret <16 x half> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x half> %arg0, <3 x half> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <16 x half> [ %val1, %then ], [ %val2, %else ]
+  ret <16 x half> %val3
+}
+
+define <32 x half> @shuffle_v32f16(<3 x half> %arg0, i1 %cond) {
+; CHECK-LABEL: define <32 x half> @shuffle_v32f16(
+; CHECK-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <32 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <32 x half> [[VAL3]]
+;
+; CHECK-AARCH64-LABEL: define <32 x half> @shuffle_v32f16(
+; CHECK-AARCH64-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-AARCH64-NEXT:  [[ENTRY:.*:]]
+; CHECK-AARCH64-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-AARCH64:       [[THEN]]:
+; CHECK-AARCH64-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-AARCH64-NEXT:    tail call void @func0()
+; CHECK-AARCH64-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-AARCH64:       [[ELSE]]:
+; CHECK-AARCH64-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-AARCH64-NEXT:    tail call void @func1()
+; CHECK-AARCH64-NEXT:    br label %[[FINALLY]]
+; CHECK-AARCH64:       [[FINALLY]]:
+; CHECK-AARCH64-NEXT:    [[VAL3:%.*]] = phi <32 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-AARCH64-NEXT:    ret <32 x half> [[VAL3]]
+;
+; CHECK-AMDGPU-LABEL: define <32 x half> @shuffle_v32f16(
+; CHECK-AMDGPU-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-AMDGPU-NEXT:  [[ENTRY:.*:]]
+; CHECK-AMDGPU-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-AMDGPU:       [[THEN]]:
+; CHECK-AMDGPU-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-AMDGPU-NEXT:    tail call void @func0()
+; CHECK-AMDGPU-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-AMDGPU:       [[ELSE]]:
+; CHECK-AMDGPU-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-AMDGPU-NEXT:    tail call void @func1()
+; CHECK-AMDGPU-NEXT:    br label %[[FINALLY]]
+; CHECK-AMDGPU:       [[FINALLY]]:
+; CHECK-AMDGPU-NEXT:    [[VAL3:%.*]] = phi <32 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-AMDGPU-NEXT:    ret <32 x half> [[VAL3]]
+;
+; CHECK-ARM-LABEL: define <32 x half> @shuffle_v32f16(
+; CHECK-ARM-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-ARM-NEXT:  [[ENTRY:.*:]]
+; CHECK-ARM-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-ARM:       [[THEN]]:
+; CHECK-ARM-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-ARM-NEXT:    tail call void @func0()
+; CHECK-ARM-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-ARM:       [[ELSE]]:
+; CHECK-ARM-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-ARM-NEXT:    tail call void @func1()
+; CHECK-ARM-NEXT:    br label %[[FINALLY]]
+; CHECK-ARM:       [[FINALLY]]:
+; CHECK-ARM-NEXT:    [[VAL3:%.*]] = phi <32 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-ARM-NEXT:    ret <32 x half> [[VAL3]]
+;
+; CHECK-HEXAGON-LABEL: define <32 x half> @shuffle_v32f16(
+; CHECK-HEXAGON-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-HEXAGON-NEXT:  [[ENTRY:.*:]]
+; CHECK-HEXAGON-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-HEXAGON:       [[THEN]]:
+; CHECK-HEXAGON-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-HEXAGON-NEXT:    tail call void @func0()
+; CHECK-HEXAGON-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-HEXAGON:       [[ELSE]]:
+; CHECK-HEXAGON-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-HEXAGON-NEXT:    tail call void @func1()
+; CHECK-HEXAGON-NEXT:    br label %[[FINALLY]]
+; CHECK-HEXAGON:       [[FINALLY]]:
+; CHECK-HEXAGON-NEXT:    [[VAL3:%.*]] = phi <32 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-HEXAGON-NEXT:    ret <32 x half> [[VAL3]]
+;
+; CHECK-RISCV-LABEL: define <32 x half> @shuffle_v32f16(
+; CHECK-RISCV-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-RISCV-NEXT:  [[ENTRY:.*:]]
+; CHECK-RISCV-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-RISCV:       [[THEN]]:
+; CHECK-RISCV-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-RISCV-NEXT:    tail call void @func0()
+; CHECK-RISCV-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-RISCV:       [[ELSE]]:
+; CHECK-RISCV-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-RISCV-NEXT:    tail call void @func1()
+; CHECK-RISCV-NEXT:    br label %[[FINALLY]]
+; CHECK-RISCV:       [[FINALLY]]:
+; CHECK-RISCV-NEXT:    [[VAL3:%.*]] = phi <32 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-RISCV-NEXT:    ret <32 x half> [[VAL3]]
+;
+; CHECK-X86-V1-LABEL: define <32 x half> @shuffle_v32f16(
+; CHECK-X86-V1-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V1-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V1:       [[THEN]]:
+; CHECK-X86-V1-NEXT:    [[TMP0:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 2, i32 0>
+; CHECK-X86-V1-NEXT:    tail call void @func0()
+; CHECK-X86-V1-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V1:       [[ELSE]]:
+; CHECK-X86-V1-NEXT:    tail call void @func1()
+; CHECK-X86-V1-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V1:       [[FINALLY]]:
+; CHECK-X86-V1-NEXT:    [[TMP1:%.*]] = phi <3 x half> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-X86-V1-NEXT:    [[VAL3:%.*]] = shufflevector <3 x half> [[TMP1]], <3 x half> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V1-NEXT:    ret <32 x half> [[VAL3]]
+;
+; CHECK-X86-V2-LABEL: define <32 x half> @shuffle_v32f16(
+; CHECK-X86-V2-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V2-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V2:       [[THEN]]:
+; CHECK-X86-V2-NEXT:    [[TMP0:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 2, i32 0>
+; CHECK-X86-V2-NEXT:    tail call void @func0()
+; CHECK-X86-V2-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V2:       [[ELSE]]:
+; CHECK-X86-V2-NEXT:    tail call void @func1()
+; CHECK-X86-V2-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V2:       [[FINALLY]]:
+; CHECK-X86-V2-NEXT:    [[TMP1:%.*]] = phi <3 x half> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-X86-V2-NEXT:    [[VAL3:%.*]] = shufflevector <3 x half> [[TMP1]], <3 x half> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V2-NEXT:    ret <32 x half> [[VAL3]]
+;
+; CHECK-X86-V3-LABEL: define <32 x half> @shuffle_v32f16(
+; CHECK-X86-V3-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V3-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V3:       [[THEN]]:
+; CHECK-X86-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-X86-V3-NEXT:    tail call void @func0()
+; CHECK-X86-V3-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V3:       [[ELSE]]:
+; CHECK-X86-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V3-NEXT:    tail call void @func1()
+; CHECK-X86-V3-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V3:       [[FINALLY]]:
+; CHECK-X86-V3-NEXT:    [[VAL3:%.*]] = phi <32 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V3-NEXT:    ret <32 x half> [[VAL3]]
+;
+; CHECK-X86-V4-LABEL: define <32 x half> @shuffle_v32f16(
+; CHECK-X86-V4-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V4-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V4:       [[THEN]]:
+; CHECK-X86-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-X86-V4-NEXT:    tail call void @func0()
+; CHECK-X86-V4-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V4:       [[ELSE]]:
+; CHECK-X86-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V4-NEXT:    tail call void @func1()
+; CHECK-X86-V4-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V4:       [[FINALLY]]:
+; CHECK-X86-V4-NEXT:    [[VAL3:%.*]] = phi <32 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V4-NEXT:    ret <32 x half> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x half> %arg0, <3 x half> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <32 x half> [ %val1, %then ], [ %val2, %else ]
+  ret <32 x half> %val3
+}
+
+define <2 x float> @shuffle_v2f32(<2 x float> %arg0, i1 %cond) {
+; CHECK-LABEL: define <2 x float> @shuffle_v2f32(
+; CHECK-SAME: <2 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <2 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <2 x float> [[VAL3]]
+;
+; CHECK-AARCH64-LABEL: define <2 x float> @shuffle_v2f32(
+; CHECK-AARCH64-SAME: <2 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-AARCH64-NEXT:  [[ENTRY:.*:]]
+; CHECK-AARCH64-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-AARCH64:       [[THEN]]:
+; CHECK-AARCH64-NEXT:    [[VAL1:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-AARCH64-NEXT:    tail call void @func0()
+; CHECK-AARCH64-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-AARCH64:       [[ELSE]]:
+; CHECK-AARCH64-NEXT:    [[VAL2:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-AARCH64-NEXT:    tail call void @func1()
+; CHECK-AARCH64-NEXT:    br label %[[FINALLY]]
+; CHECK-AARCH64:       [[FINALLY]]:
+; CHECK-AARCH64-NEXT:    [[VAL3:%.*]] = phi <2 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-AARCH64-NEXT:    ret <2 x float> [[VAL3]]
+;
+; CHECK-AMDGPU-LABEL: define <2 x float> @shuffle_v2f32(
+; CHECK-AMDGPU-SAME: <2 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-AMDGPU-NEXT:  [[ENTRY:.*:]]
+; CHECK-AMDGPU-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-AMDGPU:       [[THEN]]:
+; CHECK-AMDGPU-NEXT:    [[VAL1:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-AMDGPU-NEXT:    tail call void @func0()
+; CHECK-AMDGPU-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-AMDGPU:       [[ELSE]]:
+; CHECK-AMDGPU-NEXT:    [[VAL2:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-AMDGPU-NEXT:    tail call void @func1()
+; CHECK-AMDGPU-NEXT:    br label %[[FINALLY]]
+; CHECK-AMDGPU:       [[FINALLY]]:
+; CHECK-AMDGPU-NEXT:    [[VAL3:%.*]] = phi <2 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-AMDGPU-NEXT:    ret <2 x float> [[VAL3]]
+;
+; CHECK-ARM-LABEL: define <2 x float> @shuffle_v2f32(
+; CHECK-ARM-SAME: <2 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-ARM-NEXT:  [[ENTRY:.*:]]
+; CHECK-ARM-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-ARM:       [[THEN]]:
+; CHECK-ARM-NEXT:    [[VAL1:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-ARM-NEXT:    tail call void @func0()
+; CHECK-ARM-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-ARM:       [[ELSE]]:
+; CHECK-ARM-NEXT:    [[VAL2:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-ARM-NEXT:    tail call void @func1()
+; CHECK-ARM-NEXT:    br label %[[FINALLY]]
+; CHECK-ARM:       [[FINALLY]]:
+; CHECK-ARM-NEXT:    [[VAL3:%.*]] = phi <2 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-ARM-NEXT:    ret <2 x float> [[VAL3]]
+;
+; CHECK-HEXAGON-LABEL: define <2 x float> @shuffle_v2f32(
+; CHECK-HEXAGON-SAME: <2 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-HEXAGON-NEXT:  [[ENTRY:.*:]]
+; CHECK-HEXAGON-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-HEXAGON:       [[THEN]]:
+; CHECK-HEXAGON-NEXT:    [[VAL1:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-HEXAGON-NEXT:    tail call void @func0()
+; CHECK-HEXAGON-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-HEXAGON:       [[ELSE]]:
+; CHECK-HEXAGON-NEXT:    [[VAL2:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-HEXAGON-NEXT:    tail call void @func1()
+; CHECK-HEXAGON-NEXT:    br label %[[FINALLY]]
+; CHECK-HEXAGON:       [[FINALLY]]:
+; CHECK-HEXAGON-NEXT:    [[VAL3:%.*]] = phi <2 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-HEXAGON-NEXT:    ret <2 x float> [[VAL3]]
+;
+; CHECK-RISCV-LABEL: define <2 x float> @shuffle_v2f32(
+; CHECK-RISCV-SAME: <2 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-RISCV-NEXT:  [[ENTRY:.*:]]
+; CHECK-RISCV-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-RISCV:       [[THEN]]:
+; CHECK-RISCV-NEXT:    [[VAL1:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-RISCV-NEXT:    tail call void @func0()
+; CHECK-RISCV-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-RISCV:       [[ELSE]]:
+; CHECK-RISCV-NEXT:    [[VAL2:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-RISCV-NEXT:    tail call void @func1()
+; CHECK-RISCV-NEXT:    br label %[[FINALLY]]
+; CHECK-RISCV:       [[FINALLY]]:
+; CHECK-RISCV-NEXT:    [[VAL3:%.*]] = phi <2 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-RISCV-NEXT:    ret <2 x float> [[VAL3]]
+;
+; CHECK-X86-V1-LABEL: define <2 x float> @shuffle_v2f32(
+; CHECK-X86-V1-SAME: <2 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V1-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V1:       [[THEN]]:
+; CHECK-X86-V1-NEXT:    [[VAL1:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-X86-V1-NEXT:    tail call void @func0()
+; CHECK-X86-V1-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V1:       [[ELSE]]:
+; CHECK-X86-V1-NEXT:    [[VAL2:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-X86-V1-NEXT:    tail call void @func1()
+; CHECK-X86-V1-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V1:       [[FINALLY]]:
+; CHECK-X86-V1-NEXT:    [[VAL3:%.*]] = phi <2 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V1-NEXT:    ret <2 x float> [[VAL3]]
+;
+; CHECK-X86-V2-LABEL: define <2 x float> @shuffle_v2f32(
+; CHECK-X86-V2-SAME: <2 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V2-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V2:       [[THEN]]:
+; CHECK-X86-V2-NEXT:    [[VAL1:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-X86-V2-NEXT:    tail call void @func0()
+; CHECK-X86-V2-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V2:       [[ELSE]]:
+; CHECK-X86-V2-NEXT:    [[VAL2:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-X86-V2-NEXT:    tail call void @func1()
+; CHECK-X86-V2-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V2:       [[FINALLY]]:
+; CHECK-X86-V2-NEXT:    [[VAL3:%.*]] = phi <2 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V2-NEXT:    ret <2 x float> [[VAL3]]
+;
+; CHECK-X86-V3-LABEL: define <2 x float> @shuffle_v2f32(
+; CHECK-X86-V3-SAME: <2 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V3-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V3:       [[THEN]]:
+; CHECK-X86-V3-NEXT:    [[VAL1:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-X86-V3-NEXT:    tail call void @func0()
+; CHECK-X86-V3-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V3:       [[ELSE]]:
+; CHECK-X86-V3-NEXT:    [[VAL2:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-X86-V3-NEXT:    tail call void @func1()
+; CHECK-X86-V3-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V3:       [[FINALLY]]:
+; CHECK-X86-V3-NEXT:    [[VAL3:%.*]] = phi <2 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V3-NEXT:    ret <2 x float> [[VAL3]]
+;
+; CHECK-X86-V4-LABEL: define <2 x float> @shuffle_v2f32(
+; CHECK-X86-V4-SAME: <2 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V4-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V4:       [[THEN]]:
+; CHECK-X86-V4-NEXT:    [[VAL1:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-X86-V4-NEXT:    tail call void @func0()
+; CHECK-X86-V4-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V4:       [[ELSE]]:
+; CHECK-X86-V4-NEXT:    [[VAL2:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-X86-V4-NEXT:    tail call void @func1()
+; CHECK-X86-V4-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V4:       [[FINALLY]]:
+; CHECK-X86-V4-NEXT:    [[VAL3:%.*]] = phi <2 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V4-NEXT:    ret <2 x float> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <2 x float> %arg0, <2 x float> poison, <2 x i32> <i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <2 x float> %arg0, <2 x float> poison, <2 x i32> <i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <2 x float> [ %val1, %then ], [ %val2, %else ]
+  ret <2 x float> %val3
+}
+
+define <3 x float> @shuffle_v3f32(<3 x float> %arg0, i1 %cond) {
+; CHECK-LABEL: define <3 x float> @shuffle_v3f32(
+; CHECK-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <3 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <3 x float> [[VAL3]]
+;
+; CHECK-AARCH64-LABEL: define <3 x float> @shuffle_v3f32(
+; CHECK-AARCH64-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-AARCH64-NEXT:  [[ENTRY:.*:]]
+; CHECK-AARCH64-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-AARCH64:       [[THEN]]:
+; CHECK-AARCH64-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 1, i32 1, i32 1>
+; CHECK-AARCH64-NEXT:    tail call void @func0()
+; CHECK-AARCH64-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-AARCH64:       [[ELSE]]:
+; CHECK-AARCH64-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 2, i32 2, i32 2>
+; CHECK-AARCH64-NEXT:    tail call void @func1()
+; CHECK-AARCH64-NEXT:    br label %[[FINALLY]]
+; CHECK-AARCH64:       [[FINALLY]]:
+; CHECK-AARCH64-NEXT:    [[VAL3:%.*]] = phi <3 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-AARCH64-NEXT:    ret <3 x float> [[VAL3]]
+;
+; CHECK-AMDGPU-LABEL: define <3 x float> @shuffle_v3f32(
+; CHECK-AMDGPU-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-AMDGPU-NEXT:  [[ENTRY:.*:]]
+; CHECK-AMDGPU-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-AMDGPU:       [[THEN]]:
+; CHECK-AMDGPU-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 1, i32 1, i32 1>
+; CHECK-AMDGPU-NEXT:    tail call void @func0()
+; CHECK-AMDGPU-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-AMDGPU:       [[ELSE]]:
+; CHECK-AMDGPU-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 2, i32 2, i32 2>
+; CHECK-AMDGPU-NEXT:    tail call void @func1()
+; CHECK-AMDGPU-NEXT:    br label %[[FINALLY]]
+; CHECK-AMDGPU:       [[FINALLY]]:
+; CHECK-AMDGPU-NEXT:    [[VAL3:%.*]] = phi <3 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-AMDGPU-NEXT:    ret <3 x float> [[VAL3]]
+;
+; CHECK-ARM-LABEL: define <3 x float> @shuffle_v3f32(
+; CHECK-ARM-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-ARM-NEXT:  [[ENTRY:.*:]]
+; CHECK-ARM-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-ARM:       [[THEN]]:
+; CHECK-ARM-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 1, i32 1, i32 1>
+; CHECK-ARM-NEXT:    tail call void @func0()
+; CHECK-ARM-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-ARM:       [[ELSE]]:
+; CHECK-ARM-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 2, i32 2, i32 2>
+; CHECK-ARM-NEXT:    tail call void @func1()
+; CHECK-ARM-NEXT:    br label %[[FINALLY]]
+; CHECK-ARM:       [[FINALLY]]:
+; CHECK-ARM-NEXT:    [[VAL3:%.*]] = phi <3 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-ARM-NEXT:    ret <3 x float> [[VAL3]]
+;
+; CHECK-HEXAGON-LABEL: define <3 x float> @shuffle_v3f32(
+; CHECK-HEXAGON-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-HEXAGON-NEXT:  [[ENTRY:.*:]]
+; CHECK-HEXAGON-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-HEXAGON:       [[THEN]]:
+; CHECK-HEXAGON-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 1, i32 1, i32 1>
+; CHECK-HEXAGON-NEXT:    tail call void @func0()
+; CHECK-HEXAGON-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-HEXAGON:       [[ELSE]]:
+; CHECK-HEXAGON-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 2, i32 2, i32 2>
+; CHECK-HEXAGON-NEXT:    tail call void @func1()
+; CHECK-HEXAGON-NEXT:    br label %[[FINALLY]]
+; CHECK-HEXAGON:       [[FINALLY]]:
+; CHECK-HEXAGON-NEXT:    [[VAL3:%.*]] = phi <3 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-HEXAGON-NEXT:    ret <3 x float> [[VAL3]]
+;
+; CHECK-RISCV-LABEL: define <3 x float> @shuffle_v3f32(
+; CHECK-RISCV-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-RISCV-NEXT:  [[ENTRY:.*:]]
+; CHECK-RISCV-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-RISCV:       [[THEN]]:
+; CHECK-RISCV-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 1, i32 1, i32 1>
+; CHECK-RISCV-NEXT:    tail call void @func0()
+; CHECK-RISCV-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-RISCV:       [[ELSE]]:
+; CHECK-RISCV-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 2, i32 2, i32 2>
+; CHECK-RISCV-NEXT:    tail call void @func1()
+; CHECK-RISCV-NEXT:    br label %[[FINALLY]]
+; CHECK-RISCV:       [[FINALLY]]:
+; CHECK-RISCV-NEXT:    [[VAL3:%.*]] = phi <3 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-RISCV-NEXT:    ret <3 x float> [[VAL3]]
+;
+; CHECK-X86-V1-LABEL: define <3 x float> @shuffle_v3f32(
+; CHECK-X86-V1-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V1-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V1:       [[THEN]]:
+; CHECK-X86-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 1, i32 1, i32 1>
+; CHECK-X86-V1-NEXT:    tail call void @func0()
+; CHECK-X86-V1-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V1:       [[ELSE]]:
+; CHECK-X86-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 2, i32 2, i32 2>
+; CHECK-X86-V1-NEXT:    tail call void @func1()
+; CHECK-X86-V1-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V1:       [[FINALLY]]:
+; CHECK-X86-V1-NEXT:    [[VAL3:%.*]] = phi <3 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V1-NEXT:    ret <3 x float> [[VAL3]]
+;
+; CHECK-X86-V2-LABEL: define <3 x float> @shuffle_v3f32(
+; CHECK-X86-V2-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V2-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V2:       [[THEN]]:
+; CHECK-X86-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 1, i32 1, i32 1>
+; CHECK-X86-V2-NEXT:    tail call void @func0()
+; CHECK-X86-V2-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V2:       [[ELSE]]:
+; CHECK-X86-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 2, i32 2, i32 2>
+; CHECK-X86-V2-NEXT:    tail call void @func1()
+; CHECK-X86-V2-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V2:       [[FINALLY]]:
+; CHECK-X86-V2-NEXT:    [[VAL3:%.*]] = phi <3 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V2-NEXT:    ret <3 x float> [[VAL3]]
+;
+; CHECK-X86-V3-LABEL: define <3 x float> @shuffle_v3f32(
+; CHECK-X86-V3-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V3-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V3:       [[THEN]]:
+; CHECK-X86-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 1, i32 1, i32 1>
+; CHECK-X86-V3-NEXT:    tail call void @func0()
+; CHECK-X86-V3-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V3:       [[ELSE]]:
+; CHECK-X86-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 2, i32 2, i32 2>
+; CHECK-X86-V3-NEXT:    tail call void @func1()
+; CHECK-X86-V3-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V3:       [[FINALLY]]:
+; CHECK-X86-V3-NEXT:    [[VAL3:%.*]] = phi <3 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V3-NEXT:    ret <3 x float> [[VAL3]]
+;
+; CHECK-X86-V4-LABEL: define <3 x float> @shuffle_v3f32(
+; CHECK-X86-V4-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V4-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V4:       [[THEN]]:
+; CHECK-X86-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 1, i32 1, i32 1>
+; CHECK-X86-V4-NEXT:    tail call void @func0()
+; CHECK-X86-V4-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V4:       [[ELSE]]:
+; CHECK-X86-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 2, i32 2, i32 2>
+; CHECK-X86-V4-NEXT:    tail call void @func1()
+; CHECK-X86-V4-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V4:       [[FINALLY]]:
+; CHECK-X86-V4-NEXT:    [[VAL3:%.*]] = phi <3 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V4-NEXT:    ret <3 x float> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x float> %arg0, <3 x float> poison, <3 x i32> <i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <3 x i32> <i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <3 x float> [ %val1, %then ], [ %val2, %else ]
+  ret <3 x float> %val3
+}
+
+define <4 x float> @shuffle_v4f32(<3 x float> %arg0, i1 %cond) {
+; CHECK-LABEL: define <4 x float> @shuffle_v4f32(
+; CHECK-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <4 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <4 x float> [[VAL3]]
+;
+; CHECK-AARCH64-LABEL: define <4 x float> @shuffle_v4f32(
+; CHECK-AARCH64-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-AARCH64-NEXT:  [[ENTRY:.*:]]
+; CHECK-AARCH64-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-AARCH64:       [[THEN]]:
+; CHECK-AARCH64-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-AARCH64-NEXT:    tail call void @func0()
+; CHECK-AARCH64-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-AARCH64:       [[ELSE]]:
+; CHECK-AARCH64-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-AARCH64-NEXT:    tail call void @func1()
+; CHECK-AARCH64-NEXT:    br label %[[FINALLY]]
+; CHECK-AARCH64:       [[FINALLY]]:
+; CHECK-AARCH64-NEXT:    [[VAL3:%.*]] = phi <4 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-AARCH64-NEXT:    ret <4 x float> [[VAL3]]
+;
+; CHECK-AMDGPU-LABEL: define <4 x float> @shuffle_v4f32(
+; CHECK-AMDGPU-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-AMDGPU-NEXT:  [[ENTRY:.*:]]
+; CHECK-AMDGPU-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-AMDGPU:       [[THEN]]:
+; CHECK-AMDGPU-NEXT:    [[TMP0:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 1, i32 2, i32 0>
+; CHECK-AMDGPU-NEXT:    tail call void @func0()
+; CHECK-AMDGPU-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-AMDGPU:       [[ELSE]]:
+; CHECK-AMDGPU-NEXT:    tail call void @func1()
+; CHECK-AMDGPU-NEXT:    br label %[[FINALLY]]
+; CHECK-AMDGPU:       [[FINALLY]]:
+; CHECK-AMDGPU-NEXT:    [[TMP1:%.*]] = phi <3 x float> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-AMDGPU-NEXT:    [[VAL3:%.*]] = shufflevector <3 x float> [[TMP1]], <3 x float> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-AMDGPU-NEXT:    ret <4 x float> [[VAL3]]
+;
+; CHECK-ARM-LABEL: define <4 x float> @shuffle_v4f32(
+; CHECK-ARM-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-ARM-NEXT:  [[ENTRY:.*:]]
+; CHECK-ARM-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-ARM:       [[THEN]]:
+; CHECK-ARM-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-ARM-NEXT:    tail call void @func0()
+; CHECK-ARM-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-ARM:       [[ELSE]]:
+; CHECK-ARM-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-ARM-NEXT:    tail call void @func1()
+; CHECK-ARM-NEXT:    br label %[[FINALLY]]
+; CHECK-ARM:       [[FINALLY]]:
+; CHECK-ARM-NEXT:    [[VAL3:%.*]] = phi <4 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-ARM-NEXT:    ret <4 x float> [[VAL3]]
+;
+; CHECK-HEXAGON-LABEL: define <4 x float> @shuffle_v4f32(
+; CHECK-HEXAGON-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-HEXAGON-NEXT:  [[ENTRY:.*:]]
+; CHECK-HEXAGON-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-HEXAGON:       [[THEN]]:
+; CHECK-HEXAGON-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-HEXAGON-NEXT:    tail call void @func0()
+; CHECK-HEXAGON-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-HEXAGON:       [[ELSE]]:
+; CHECK-HEXAGON-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-HEXAGON-NEXT:    tail call void @func1()
+; CHECK-HEXAGON-NEXT:    br label %[[FINALLY]]
+; CHECK-HEXAGON:       [[FINALLY]]:
+; CHECK-HEXAGON-NEXT:    [[VAL3:%.*]] = phi <4 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-HEXAGON-NEXT:    ret <4 x float> [[VAL3]]
+;
+; CHECK-RISCV-LABEL: define <4 x float> @shuffle_v4f32(
+; CHECK-RISCV-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-RISCV-NEXT:  [[ENTRY:.*:]]
+; CHECK-RISCV-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-RISCV:       [[THEN]]:
+; CHECK-RISCV-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-RISCV-NEXT:    tail call void @func0()
+; CHECK-RISCV-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-RISCV:       [[ELSE]]:
+; CHECK-RISCV-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-RISCV-NEXT:    tail call void @func1()
+; CHECK-RISCV-NEXT:    br label %[[FINALLY]]
+; CHECK-RISCV:       [[FINALLY]]:
+; CHECK-RISCV-NEXT:    [[VAL3:%.*]] = phi <4 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-RISCV-NEXT:    ret <4 x float> [[VAL3]]
+;
+; CHECK-X86-V1-LABEL: define <4 x float> @shuffle_v4f32(
+; CHECK-X86-V1-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V1-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V1:       [[THEN]]:
+; CHECK-X86-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-X86-V1-NEXT:    tail call void @func0()
+; CHECK-X86-V1-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V1:       [[ELSE]]:
+; CHECK-X86-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V1-NEXT:    tail call void @func1()
+; CHECK-X86-V1-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V1:       [[FINALLY]]:
+; CHECK-X86-V1-NEXT:    [[VAL3:%.*]] = phi <4 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V1-NEXT:    ret <4 x float> [[VAL3]]
+;
+; CHECK-X86-V2-LABEL: define <4 x float> @shuffle_v4f32(
+; CHECK-X86-V2-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V2-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V2:       [[THEN]]:
+; CHECK-X86-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-X86-V2-NEXT:    tail call void @func0()
+; CHECK-X86-V2-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V2:       [[ELSE]]:
+; CHECK-X86-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V2-NEXT:    tail call void @func1()
+; CHECK-X86-V2-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V2:       [[FINALLY]]:
+; CHECK-X86-V2-NEXT:    [[VAL3:%.*]] = phi <4 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V2-NEXT:    ret <4 x float> [[VAL3]]
+;
+; CHECK-X86-V3-LABEL: define <4 x float> @shuffle_v4f32(
+; CHECK-X86-V3-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V3-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V3:       [[THEN]]:
+; CHECK-X86-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-X86-V3-NEXT:    tail call void @func0()
+; CHECK-X86-V3-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V3:       [[ELSE]]:
+; CHECK-X86-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V3-NEXT:    tail call void @func1()
+; CHECK-X86-V3-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V3:       [[FINALLY]]:
+; CHECK-X86-V3-NEXT:    [[VAL3:%.*]] = phi <4 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V3-NEXT:    ret <4 x float> [[VAL3]]
+;
+; CHECK-X86-V4-LABEL: define <4 x float> @shuffle_v4f32(
+; CHECK-X86-V4-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V4-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V4:       [[THEN]]:
+; CHECK-X86-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-X86-V4-NEXT:    tail call void @func0()
+; CHECK-X86-V4-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V4:       [[ELSE]]:
+; CHECK-X86-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V4-NEXT:    tail call void @func1()
+; CHECK-X86-V4-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V4:       [[FINALLY]]:
+; CHECK-X86-V4-NEXT:    [[VAL3:%.*]] = phi <4 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V4-NEXT:    ret <4 x float> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x float> %arg0, <3 x float> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <4 x float> [ %val1, %then ], [ %val2, %else ]
+  ret <4 x float> %val3
+}
+
+define <6 x float> @shuffle_v6f32(<3 x float> %arg0, i1 %cond) {
+; CHECK-LABEL: define <6 x float> @shuffle_v6f32(
+; CHECK-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <6 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <6 x float> [[VAL3]]
+;
+; CHECK-AARCH64-LABEL: define <6 x float> @shuffle_v6f32(
+; CHECK-AARCH64-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-AARCH64-NEXT:  [[ENTRY:.*:]]
+; CHECK-AARCH64-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-AARCH64:       [[THEN]]:
+; CHECK-AARCH64-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-AARCH64-NEXT:    tail call void @func0()
+; CHECK-AARCH64-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-AARCH64:       [[ELSE]]:
+; CHECK-AARCH64-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-AARCH64-NEXT:    tail call void @func1()
+; CHECK-AARCH64-NEXT:    br label %[[FINALLY]]
+; CHECK-AARCH64:       [[FINALLY]]:
+; CHECK-AARCH64-NEXT:    [[VAL3:%.*]] = phi <6 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-AARCH64-NEXT:    ret <6 x float> [[VAL3]]
+;
+; CHECK-AMDGPU-LABEL: define <6 x float> @shuffle_v6f32(
+; CHECK-AMDGPU-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-AMDGPU-NEXT:  [[ENTRY:.*:]]
+; CHECK-AMDGPU-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-AMDGPU:       [[THEN]]:
+; CHECK-AMDGPU-NEXT:    [[TMP0:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 1, i32 2, i32 0>
+; CHECK-AMDGPU-NEXT:    tail call void @func0()
+; CHECK-AMDGPU-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-AMDGPU:       [[ELSE]]:
+; CHECK-AMDGPU-NEXT:    tail call void @func1()
+; CHECK-AMDGPU-NEXT:    br label %[[FINALLY]]
+; CHECK-AMDGPU:       [[FINALLY]]:
+; CHECK-AMDGPU-NEXT:    [[TMP1:%.*]] = phi <3 x float> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-AMDGPU-NEXT:    [[VAL3:%.*]] = shufflevector <3 x float> [[TMP1]], <3 x float> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-AMDGPU-NEXT:    ret <6 x float> [[VAL3]]
+;
+; CHECK-ARM-LABEL: define <6 x float> @shuffle_v6f32(
+; CHECK-ARM-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-ARM-NEXT:  [[ENTRY:.*:]]
+; CHECK-ARM-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-ARM:       [[THEN]]:
+; CHECK-ARM-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-ARM-NEXT:    tail call void @func0()
+; CHECK-ARM-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-ARM:       [[ELSE]]:
+; CHECK-ARM-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-ARM-NEXT:    tail call void @func1()
+; CHECK-ARM-NEXT:    br label %[[FINALLY]]
+; CHECK-ARM:       [[FINALLY]]:
+; CHECK-ARM-NEXT:    [[VAL3:%.*]] = phi <6 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-ARM-NEXT:    ret <6 x float> [[VAL3]]
+;
+; CHECK-HEXAGON-LABEL: define <6 x float> @shuffle_v6f32(
+; CHECK-HEXAGON-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-HEXAGON-NEXT:  [[ENTRY:.*:]]
+; CHECK-HEXAGON-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-HEXAGON:       [[THEN]]:
+; CHECK-HEXAGON-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-HEXAGON-NEXT:    tail call void @func0()
+; CHECK-HEXAGON-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-HEXAGON:       [[ELSE]]:
+; CHECK-HEXAGON-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-HEXAGON-NEXT:    tail call void @func1()
+; CHECK-HEXAGON-NEXT:    br label %[[FINALLY]]
+; CHECK-HEXAGON:       [[FINALLY]]:
+; CHECK-HEXAGON-NEXT:    [[VAL3:%.*]] = phi <6 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-HEXAGON-NEXT:    ret <6 x float> [[VAL3]]
+;
+; CHECK-RISCV-LABEL: define <6 x float> @shuffle_v6f32(
+; CHECK-RISCV-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-RISCV-NEXT:  [[ENTRY:.*:]]
+; CHECK-RISCV-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-RISCV:       [[THEN]]:
+; CHECK-RISCV-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-RISCV-NEXT:    tail call void @func0()
+; CHECK-RISCV-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-RISCV:       [[ELSE]]:
+; CHECK-RISCV-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-RISCV-NEXT:    tail call void @func1()
+; CHECK-RISCV-NEXT:    br label %[[FINALLY]]
+; CHECK-RISCV:       [[FINALLY]]:
+; CHECK-RISCV-NEXT:    [[VAL3:%.*]] = phi <6 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-RISCV-NEXT:    ret <6 x float> [[VAL3]]
+;
+; CHECK-X86-V1-LABEL: define <6 x float> @shuffle_v6f32(
+; CHECK-X86-V1-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V1-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V1:       [[THEN]]:
+; CHECK-X86-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-X86-V1-NEXT:    tail call void @func0()
+; CHECK-X86-V1-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V1:       [[ELSE]]:
+; CHECK-X86-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V1-NEXT:    tail call void @func1()
+; CHECK-X86-V1-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V1:       [[FINALLY]]:
+; CHECK-X86-V1-NEXT:    [[VAL3:%.*]] = phi <6 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V1-NEXT:    ret <6 x float> [[VAL3]]
+;
+; CHECK-X86-V2-LABEL: define <6 x float> @shuffle_v6f32(
+; CHECK-X86-V2-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V2-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V2:       [[THEN]]:
+; CHECK-X86-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-X86-V2-NEXT:    tail call void @func0()
+; CHECK-X86-V2-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V2:       [[ELSE]]:
+; CHECK-X86-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V2-NEXT:    tail call void @func1()
+; CHECK-X86-V2-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V2:       [[FINALLY]]:
+; CHECK-X86-V2-NEXT:    [[VAL3:%.*]] = phi <6 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V2-NEXT:    ret <6 x float> [[VAL3]]
+;
+; CHECK-X86-V3-LABEL: define <6 x float> @shuffle_v6f32(
+; CHECK-X86-V3-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V3-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V3:       [[THEN]]:
+; CHECK-X86-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-X86-V3-NEXT:    tail call void @func0()
+; CHECK-X86-V3-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V3:       [[ELSE]]:
+; CHECK-X86-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V3-NEXT:    tail call void @func1()
+; CHECK-X86-V3-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V3:       [[FINALLY]]:
+; CHECK-X86-V3-NEXT:    [[VAL3:%.*]] = phi <6 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V3-NEXT:    ret <6 x float> [[VAL3]]
+;
+; CHECK-X86-V4-LABEL: define <6 x float> @shuffle_v6f32(
+; CHECK-X86-V4-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V4-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V4:       [[THEN]]:
+; CHECK-X86-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-X86-V4-NEXT:    tail call void @func0()
+; CHECK-X86-V4-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V4:       [[ELSE]]:
+; CHECK-X86-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V4-NEXT:    tail call void @func1()
+; CHECK-X86-V4-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V4:       [[FINALLY]]:
+; CHECK-X86-V4-NEXT:    [[VAL3:%.*]] = phi <6 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V4-NEXT:    ret <6 x float> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x float> %arg0, <3 x float> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <6 x float> [ %val1, %then ], [ %val2, %else ]
+  ret <6 x float> %val3
+}
+
+define <8 x float> @shuffle_v8f32(<3 x float> %arg0, i1 %cond) {
+; CHECK-LABEL: define <8 x float> @shuffle_v8f32(
+; CHECK-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <8 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <8 x float> [[VAL3]]
+;
+; CHECK-AARCH64-LABEL: define <8 x float> @shuffle_v8f32(
+; CHECK-AARCH64-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-AARCH64-NEXT:  [[ENTRY:.*:]]
+; CHECK-AARCH64-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-AARCH64:       [[THEN]]:
+; CHECK-AARCH64-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-AARCH64-NEXT:    tail call void @func0()
+; CHECK-AARCH64-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-AARCH64:       [[ELSE]]:
+; CHECK-AARCH64-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-AARCH64-NEXT:    tail call void @func1()
+; CHECK-AARCH64-NEXT:    br label %[[FINALLY]]
+; CHECK-AARCH64:       [[FINALLY]]:
+; CHECK-AARCH64-NEXT:    [[VAL3:%.*]] = phi <8 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-AARCH64-NEXT:    ret <8 x float> [[VAL3]]
+;
+; CHECK-AMDGPU-LABEL: define <8 x float> @shuffle_v8f32(
+; CHECK-AMDGPU-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-AMDGPU-NEXT:  [[ENTRY:.*:]]
+; CHECK-AMDGPU-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-AMDGPU:       [[THEN]]:
+; CHECK-AMDGPU-NEXT:    [[TMP0:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 1, i32 2, i32 0>
+; CHECK-AMDGPU-NEXT:    tail call void @func0()
+; CHECK-AMDGPU-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-AMDGPU:       [[ELSE]]:
+; CHECK-AMDGPU-NEXT:    tail call void @func1()
+; CHECK-AMDGPU-NEXT:    br label %[[FINALLY]]
+; CHECK-AMDGPU:       [[FINALLY]]:
+; CHECK-AMDGPU-NEXT:    [[TMP1:%.*]] = phi <3 x float> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-AMDGPU-NEXT:    [[VAL3:%.*]] = shufflevector <3 x float> [[TMP1]], <3 x float> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-AMDGPU-NEXT:    ret <8 x float> [[VAL3]]
+;
+; CHECK-ARM-LABEL: define <8 x float> @shuffle_v8f32(
+; CHECK-ARM-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-ARM-NEXT:  [[ENTRY:.*:]]
+; CHECK-ARM-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-ARM:       [[THEN]]:
+; CHECK-ARM-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-ARM-NEXT:    tail call void @func0()
+; CHECK-ARM-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-ARM:       [[ELSE]]:
+; CHECK-ARM-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-ARM-NEXT:    tail call void @func1()
+; CHECK-ARM-NEXT:    br label %[[FINALLY]]
+; CHECK-ARM:       [[FINALLY]]:
+; CHECK-ARM-NEXT:    [[VAL3:%.*]] = phi <8 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-ARM-NEXT:    ret <8 x float> [[VAL3]]
+;
+; CHECK-HEXAGON-LABEL: define <8 x float> @shuffle_v8f32(
+; CHECK-HEXAGON-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-HEXAGON-NEXT:  [[ENTRY:.*:]]
+; CHECK-HEXAGON-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-HEXAGON:       [[THEN]]:
+; CHECK-HEXAGON-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-HEXAGON-NEXT:    tail call void @func0()
+; CHECK-HEXAGON-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-HEXAGON:       [[ELSE]]:
+; CHECK-HEXAGON-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-HEXAGON-NEXT:    tail call void @func1()
+; CHECK-HEXAGON-NEXT:    br label %[[FINALLY]]
+; CHECK-HEXAGON:       [[FINALLY]]:
+; CHECK-HEXAGON-NEXT:    [[VAL3:%.*]] = phi <8 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-HEXAGON-NEXT:    ret <8 x float> [[VAL3]]
+;
+; CHECK-RISCV-LABEL: define <8 x float> @shuffle_v8f32(
+; CHECK-RISCV-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-RISCV-NEXT:  [[ENTRY:.*:]]
+; CHECK-RISCV-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-RISCV:       [[THEN]]:
+; CHECK-RISCV-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-RISCV-NEXT:    tail call void @func0()
+; CHECK-RISCV-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-RISCV:       [[ELSE]]:
+; CHECK-RISCV-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-RISCV-NEXT:    tail call void @func1()
+; CHECK-RISCV-NEXT:    br label %[[FINALLY]]
+; CHECK-RISCV:       [[FINALLY]]:
+; CHECK-RISCV-NEXT:    [[VAL3:%.*]] = phi <8 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-RISCV-NEXT:    ret <8 x float> [[VAL3]]
+;
+; CHECK-X86-V1-LABEL: define <8 x float> @shuffle_v8f32(
+; CHECK-X86-V1-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V1-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V1:       [[THEN]]:
+; CHECK-X86-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-X86-V1-NEXT:    tail call void @func0()
+; CHECK-X86-V1-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V1:       [[ELSE]]:
+; CHECK-X86-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V1-NEXT:    tail call void @func1()
+; CHECK-X86-V1-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V1:       [[FINALLY]]:
+; CHECK-X86-V1-NEXT:    [[VAL3:%.*]] = phi <8 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V1-NEXT:    ret <8 x float> [[VAL3]]
+;
+; CHECK-X86-V2-LABEL: define <8 x float> @shuffle_v8f32(
+; CHECK-X86-V2-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V2-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V2:       [[THEN]]:
+; CHECK-X86-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-X86-V2-NEXT:    tail call void @func0()
+; CHECK-X86-V2-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V2:       [[ELSE]]:
+; CHECK-X86-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V2-NEXT:    tail call void @func1()
+; CHECK-X86-V2-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V2:       [[FINALLY]]:
+; CHECK-X86-V2-NEXT:    [[VAL3:%.*]] = phi <8 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V2-NEXT:    ret <8 x float> [[VAL3]]
+;
+; CHECK-X86-V3-LABEL: define <8 x float> @shuffle_v8f32(
+; CHECK-X86-V3-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V3-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V3:       [[THEN]]:
+; CHECK-X86-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-X86-V3-NEXT:    tail call void @func0()
+; CHECK-X86-V3-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V3:       [[ELSE]]:
+; CHECK-X86-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V3-NEXT:    tail call void @func1()
+; CHECK-X86-V3-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V3:       [[FINALLY]]:
+; CHECK-X86-V3-NEXT:    [[VAL3:%.*]] = phi <8 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V3-NEXT:    ret <8 x float> [[VAL3]]
+;
+; CHECK-X86-V4-LABEL: define <8 x float> @shuffle_v8f32(
+; CHECK-X86-V4-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V4-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V4:       [[THEN]]:
+; CHECK-X86-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-X86-V4-NEXT:    tail call void @func0()
+; CHECK-X86-V4-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V4:       [[ELSE]]:
+; CHECK-X86-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V4-NEXT:    tail call void @func1()
+; CHECK-X86-V4-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V4:       [[FINALLY]]:
+; CHECK-X86-V4-NEXT:    [[VAL3:%.*]] = phi <8 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V4-NEXT:    ret <8 x float> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x float> %arg0, <3 x float> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <8 x float> [ %val1, %then ], [ %val2, %else ]
+  ret <8 x float> %val3
+}
+
+define <16 x float> @shuffle_v16f32(<3 x float> %arg0, i1 %cond) {
+; CHECK-LABEL: define <16 x float> @shuffle_v16f32(
+; CHECK-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <16 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <16 x float> [[VAL3]]
+;
+; CHECK-AARCH64-LABEL: define <16 x float> @shuffle_v16f32(
+; CHECK-AARCH64-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-AARCH64-NEXT:  [[ENTRY:.*:]]
+; CHECK-AARCH64-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-AARCH64:       [[THEN]]:
+; CHECK-AARCH64-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-AARCH64-NEXT:    tail call void @func0()
+; CHECK-AARCH64-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-AARCH64:       [[ELSE]]:
+; CHECK-AARCH64-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-AARCH64-NEXT:    tail call void @func1()
+; CHECK-AARCH64-NEXT:    br label %[[FINALLY]]
+; CHECK-AARCH64:       [[FINALLY]]:
+; CHECK-AARCH64-NEXT:    [[VAL3:%.*]] = phi <16 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-AARCH64-NEXT:    ret <16 x float> [[VAL3]]
+;
+; CHECK-AMDGPU-LABEL: define <16 x float> @shuffle_v16f32(
+; CHECK-AMDGPU-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-AMDGPU-NEXT:  [[ENTRY:.*:]]
+; CHECK-AMDGPU-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-AMDGPU:       [[THEN]]:
+; CHECK-AMDGPU-NEXT:    [[TMP0:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 1, i32 2, i32 0>
+; CHECK-AMDGPU-NEXT:    tail call void @func0()
+; CHECK-AMDGPU-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-AMDGPU:       [[ELSE]]:
+; CHECK-AMDGPU-NEXT:    tail call void @func1()
+; CHECK-AMDGPU-NEXT:    br label %[[FINALLY]]
+; CHECK-AMDGPU:       [[FINALLY]]:
+; CHECK-AMDGPU-NEXT:    [[TMP1:%.*]] = phi <3 x float> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-AMDGPU-NEXT:    [[VAL3:%.*]] = shufflevector <3 x float> [[TMP1]], <3 x float> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-AMDGPU-NEXT:    ret <16 x float> [[VAL3]]
+;
+; CHECK-ARM-LABEL: define <16 x float> @shuffle_v16f32(
+; CHECK-ARM-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-ARM-NEXT:  [[ENTRY:.*:]]
+; CHECK-ARM-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-ARM:       [[THEN]]:
+; CHECK-ARM-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-ARM-NEXT:    tail call void @func0()
+; CHECK-ARM-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-ARM:       [[ELSE]]:
+; CHECK-ARM-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-ARM-NEXT:    tail call void @func1()
+; CHECK-ARM-NEXT:    br label %[[FINALLY]]
+; CHECK-ARM:       [[FINALLY]]:
+; CHECK-ARM-NEXT:    [[VAL3:%.*]] = phi <16 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-ARM-NEXT:    ret <16 x float> [[VAL3]]
+;
+; CHECK-HEXAGON-LABEL: define <16 x float> @shuffle_v16f32(
+; CHECK-HEXAGON-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-HEXAGON-NEXT:  [[ENTRY:.*:]]
+; CHECK-HEXAGON-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-HEXAGON:       [[THEN]]:
+; CHECK-HEXAGON-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-HEXAGON-NEXT:    tail call void @func0()
+; CHECK-HEXAGON-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-HEXAGON:       [[ELSE]]:
+; CHECK-HEXAGON-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-HEXAGON-NEXT:    tail call void @func1()
+; CHECK-HEXAGON-NEXT:    br label %[[FINALLY]]
+; CHECK-HEXAGON:       [[FINALLY]]:
+; CHECK-HEXAGON-NEXT:    [[VAL3:%.*]] = phi <16 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-HEXAGON-NEXT:    ret <16 x float> [[VAL3]]
+;
+; CHECK-RISCV-LABEL: define <16 x float> @shuffle_v16f32(
+; CHECK-RISCV-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-RISCV-NEXT:  [[ENTRY:.*:]]
+; CHECK-RISCV-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-RISCV:       [[THEN]]:
+; CHECK-RISCV-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-RISCV-NEXT:    tail call void @func0()
+; CHECK-RISCV-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-RISCV:       [[ELSE]]:
+; CHECK-RISCV-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-RISCV-NEXT:    tail call void @func1()
+; CHECK-RISCV-NEXT:    br label %[[FINALLY]]
+; CHECK-RISCV:       [[FINALLY]]:
+; CHECK-RISCV-NEXT:    [[VAL3:%.*]] = phi <16 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-RISCV-NEXT:    ret <16 x float> [[VAL3]]
+;
+; CHECK-X86-V1-LABEL: define <16 x float> @shuffle_v16f32(
+; CHECK-X86-V1-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V1-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V1:       [[THEN]]:
+; CHECK-X86-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-X86-V1-NEXT:    tail call void @func0()
+; CHECK-X86-V1-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V1:       [[ELSE]]:
+; CHECK-X86-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V1-NEXT:    tail call void @func1()
+; CHECK-X86-V1-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V1:       [[FINALLY]]:
+; CHECK-X86-V1-NEXT:    [[VAL3:%.*]] = phi <16 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V1-NEXT:    ret <16 x float> [[VAL3]]
+;
+; CHECK-X86-V2-LABEL: define <16 x float> @shuffle_v16f32(
+; CHECK-X86-V2-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V2-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V2:       [[THEN]]:
+; CHECK-X86-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-X86-V2-NEXT:    tail call void @func0()
+; CHECK-X86-V2-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V2:       [[ELSE]]:
+; CHECK-X86-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V2-NEXT:    tail call void @func1()
+; CHECK-X86-V2-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V2:       [[FINALLY]]:
+; CHECK-X86-V2-NEXT:    [[VAL3:%.*]] = phi <16 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V2-NEXT:    ret <16 x float> [[VAL3]]
+;
+; CHECK-X86-V3-LABEL: define <16 x float> @shuffle_v16f32(
+; CHECK-X86-V3-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V3-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V3:       [[THEN]]:
+; CHECK-X86-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-X86-V3-NEXT:    tail call void @func0()
+; CHECK-X86-V3-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V3:       [[ELSE]]:
+; CHECK-X86-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V3-NEXT:    tail call void @func1()
+; CHECK-X86-V3-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V3:       [[FINALLY]]:
+; CHECK-X86-V3-NEXT:    [[VAL3:%.*]] = phi <16 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V3-NEXT:    ret <16 x float> [[VAL3]]
+;
+; CHECK-X86-V4-LABEL: define <16 x float> @shuffle_v16f32(
+; CHECK-X86-V4-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V4-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V4:       [[THEN]]:
+; CHECK-X86-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-X86-V4-NEXT:    tail call void @func0()
+; CHECK-X86-V4-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V4:       [[ELSE]]:
+; CHECK-X86-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V4-NEXT:    tail call void @func1()
+; CHECK-X86-V4-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V4:       [[FINALLY]]:
+; CHECK-X86-V4-NEXT:    [[VAL3:%.*]] = phi <16 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V4-NEXT:    ret <16 x float> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x float> %arg0, <3 x float> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <16 x float> [ %val1, %then ], [ %val2, %else ]
+  ret <16 x float> %val3
+}
+
+define <32 x float> @shuffle_v32f32(<3 x float> %arg0, i1 %cond) {
+; CHECK-LABEL: define <32 x float> @shuffle_v32f32(
+; CHECK-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <32 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <32 x float> [[VAL3]]
+;
+; CHECK-AARCH64-LABEL: define <32 x float> @shuffle_v32f32(
+; CHECK-AARCH64-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-AARCH64-NEXT:  [[ENTRY:.*:]]
+; CHECK-AARCH64-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-AARCH64:       [[THEN]]:
+; CHECK-AARCH64-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-AARCH64-NEXT:    tail call void @func0()
+; CHECK-AARCH64-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-AARCH64:       [[ELSE]]:
+; CHECK-AARCH64-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-AARCH64-NEXT:    tail call void @func1()
+; CHECK-AARCH64-NEXT:    br label %[[FINALLY]]
+; CHECK-AARCH64:       [[FINALLY]]:
+; CHECK-AARCH64-NEXT:    [[VAL3:%.*]] = phi <32 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-AARCH64-NEXT:    ret <32 x float> [[VAL3]]
+;
+; CHECK-AMDGPU-LABEL: define <32 x float> @shuffle_v32f32(
+; CHECK-AMDGPU-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-AMDGPU-NEXT:  [[ENTRY:.*:]]
+; CHECK-AMDGPU-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-AMDGPU:       [[THEN]]:
+; CHECK-AMDGPU-NEXT:    [[TMP0:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 1, i32 2, i32 0>
+; CHECK-AMDGPU-NEXT:    tail call void @func0()
+; CHECK-AMDGPU-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-AMDGPU:       [[ELSE]]:
+; CHECK-AMDGPU-NEXT:    tail call void @func1()
+; CHECK-AMDGPU-NEXT:    br label %[[FINALLY]]
+; CHECK-AMDGPU:       [[FINALLY]]:
+; CHECK-AMDGPU-NEXT:    [[TMP1:%.*]] = phi <3 x float> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-AMDGPU-NEXT:    [[VAL3:%.*]] = shufflevector <3 x float> [[TMP1]], <3 x float> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-AMDGPU-NEXT:    ret <32 x float> [[VAL3]]
+;
+; CHECK-ARM-LABEL: define <32 x float> @shuffle_v32f32(
+; CHECK-ARM-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-ARM-NEXT:  [[ENTRY:.*:]]
+; CHECK-ARM-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-ARM:       [[THEN]]:
+; CHECK-ARM-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-ARM-NEXT:    tail call void @func0()
+; CHECK-ARM-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-ARM:       [[ELSE]]:
+; CHECK-ARM-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-ARM-NEXT:    tail call void @func1()
+; CHECK-ARM-NEXT:    br label %[[FINALLY]]
+; CHECK-ARM:       [[FINALLY]]:
+; CHECK-ARM-NEXT:    [[VAL3:%.*]] = phi <32 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-ARM-NEXT:    ret <32 x float> [[VAL3]]
+;
+; CHECK-HEXAGON-LABEL: define <32 x float> @shuffle_v32f32(
+; CHECK-HEXAGON-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-HEXAGON-NEXT:  [[ENTRY:.*:]]
+; CHECK-HEXAGON-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-HEXAGON:       [[THEN]]:
+; CHECK-HEXAGON-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-HEXAGON-NEXT:    tail call void @func0()
+; CHECK-HEXAGON-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-HEXAGON:       [[ELSE]]:
+; CHECK-HEXAGON-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-HEXAGON-NEXT:    tail call void @func1()
+; CHECK-HEXAGON-NEXT:    br label %[[FINALLY]]
+; CHECK-HEXAGON:       [[FINALLY]]:
+; CHECK-HEXAGON-NEXT:    [[VAL3:%.*]] = phi <32 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-HEXAGON-NEXT:    ret <32 x float> [[VAL3]]
+;
+; CHECK-RISCV-LABEL: define <32 x float> @shuffle_v32f32(
+; CHECK-RISCV-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-RISCV-NEXT:  [[ENTRY:.*:]]
+; CHECK-RISCV-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-RISCV:       [[THEN]]:
+; CHECK-RISCV-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-RISCV-NEXT:    tail call void @func0()
+; CHECK-RISCV-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-RISCV:       [[ELSE]]:
+; CHECK-RISCV-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-RISCV-NEXT:    tail call void @func1()
+; CHECK-RISCV-NEXT:    br label %[[FINALLY]]
+; CHECK-RISCV:       [[FINALLY]]:
+; CHECK-RISCV-NEXT:    [[VAL3:%.*]] = phi <32 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-RISCV-NEXT:    ret <32 x float> [[VAL3]]
+;
+; CHECK-X86-V1-LABEL: define <32 x float> @shuffle_v32f32(
+; CHECK-X86-V1-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V1-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V1:       [[THEN]]:
+; CHECK-X86-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-X86-V1-NEXT:    tail call void @func0()
+; CHECK-X86-V1-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V1:       [[ELSE]]:
+; CHECK-X86-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V1-NEXT:    tail call void @func1()
+; CHECK-X86-V1-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V1:       [[FINALLY]]:
+; CHECK-X86-V1-NEXT:    [[VAL3:%.*]] = phi <32 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V1-NEXT:    ret <32 x float> [[VAL3]]
+;
+; CHECK-X86-V2-LABEL: define <32 x float> @shuffle_v32f32(
+; CHECK-X86-V2-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V2-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V2:       [[THEN]]:
+; CHECK-X86-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-X86-V2-NEXT:    tail call void @func0()
+; CHECK-X86-V2-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V2:       [[ELSE]]:
+; CHECK-X86-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V2-NEXT:    tail call void @func1()
+; CHECK-X86-V2-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V2:       [[FINALLY]]:
+; CHECK-X86-V2-NEXT:    [[VAL3:%.*]] = phi <32 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V2-NEXT:    ret <32 x float> [[VAL3]]
+;
+; CHECK-X86-V3-LABEL: define <32 x float> @shuffle_v32f32(
+; CHECK-X86-V3-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V3-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V3:       [[THEN]]:
+; CHECK-X86-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-X86-V3-NEXT:    tail call void @func0()
+; CHECK-X86-V3-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V3:       [[ELSE]]:
+; CHECK-X86-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V3-NEXT:    tail call void @func1()
+; CHECK-X86-V3-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V3:       [[FINALLY]]:
+; CHECK-X86-V3-NEXT:    [[VAL3:%.*]] = phi <32 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V3-NEXT:    ret <32 x float> [[VAL3]]
+;
+; CHECK-X86-V4-LABEL: define <32 x float> @shuffle_v32f32(
+; CHECK-X86-V4-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-X86-V4-NEXT:  [[ENTRY:.*:]]
+; CHECK-X86-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-X86-V4:       [[THEN]]:
+; CHECK-X86-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-X86-V4-NEXT:    tail call void @func0()
+; CHECK-X86-V4-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-X86-V4:       [[ELSE]]:
+; CHECK-X86-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-X86-V4-NEXT:    tail call void @func1()
+; CHECK-X86-V4-NEXT:    br label %[[FINALLY]]
+; CHECK-X86-V4:       [[FINALLY]]:
+; CHECK-X86-V4-NEXT:    [[VAL3:%.*]] = phi <32 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-X86-V4-NEXT:    ret <32 x float> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x float> %arg0, <3 x float> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <32 x float> [ %val1, %then ], [ %val2, %else ]
+  ret <32 x float> %val3
+}
+
+declare void @func0() local_unnamed_addr
+
+declare void @func1() local_unnamed_addr

>From 71513967ec64d40b890373b01f91239e927207ec Mon Sep 17 00:00:00 2001
From: Leon Clark <leoclark at amd.com>
Date: Wed, 11 Jun 2025 11:21:00 +0100
Subject: [PATCH 09/14] Add tests for each target.

---
 .../AArch64/narrow-phi-of-shuffles.ll         | 1266 ++++
 .../AMDGPU/narrow-phi-of-shuffles.ll          | 1266 ++++
 .../ARM/narrow-phi-of-shuffles.ll             | 1266 ++++
 .../Hexagon/narrow-phi-of-shuffles.ll         | 1266 ++++
 .../RISCV/narrow-phi-of-shuffles.ll           | 1266 ++++
 .../X86/narrow-phi-of-shuffles.ll             | 2997 ++++++++++
 .../VectorCombine/narrow-phi-of-shuffles.ll   | 5193 -----------------
 7 files changed, 9327 insertions(+), 5193 deletions(-)
 create mode 100644 llvm/test/Transforms/VectorCombine/AArch64/narrow-phi-of-shuffles.ll
 create mode 100644 llvm/test/Transforms/VectorCombine/AMDGPU/narrow-phi-of-shuffles.ll
 create mode 100644 llvm/test/Transforms/VectorCombine/ARM/narrow-phi-of-shuffles.ll
 create mode 100644 llvm/test/Transforms/VectorCombine/Hexagon/narrow-phi-of-shuffles.ll
 create mode 100644 llvm/test/Transforms/VectorCombine/RISCV/narrow-phi-of-shuffles.ll
 create mode 100644 llvm/test/Transforms/VectorCombine/X86/narrow-phi-of-shuffles.ll

diff --git a/llvm/test/Transforms/VectorCombine/AArch64/narrow-phi-of-shuffles.ll b/llvm/test/Transforms/VectorCombine/AArch64/narrow-phi-of-shuffles.ll
new file mode 100644
index 0000000000000..0067c922b3892
--- /dev/null
+++ b/llvm/test/Transforms/VectorCombine/AArch64/narrow-phi-of-shuffles.ll
@@ -0,0 +1,1266 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
+; RUN: opt -mtriple=aarch64 -passes=vector-combine -S %s | FileCheck %s --check-prefixes=CHECK
+
+define <2 x i8> @shuffle_v2i8(<2 x i8> %arg0, i1 %cond) {
+; CHECK-LABEL: define <2 x i8> @shuffle_v2i8(
+; CHECK-SAME: <2 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i8> [[ARG0]], <2 x i8> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i8> [[ARG0]], <2 x i8> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <2 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <2 x i8> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <2 x i8> %arg0, <2 x i8> poison, <2 x i32> <i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <2 x i8> %arg0, <2 x i8> poison, <2 x i32> <i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <2 x i8> [ %val1, %then ], [ %val2, %else ]
+  ret <2 x i8> %val3
+}
+
+define <4 x i8> @shuffle_v4i8(<3 x i8> %arg0, i1 %cond) {
+; CHECK-LABEL: define <4 x i8> @shuffle_v4i8(
+; CHECK-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <4 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <4 x i8> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <4 x i8> [ %val1, %then ], [ %val2, %else ]
+  ret <4 x i8> %val3
+}
+
+define <8 x i8> @shuffle_v8i8(<3 x i8> %arg0, i1 %cond) {
+; CHECK-LABEL: define <8 x i8> @shuffle_v8i8(
+; CHECK-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <8 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <8 x i8> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <8 x i8> [ %val1, %then ], [ %val2, %else ]
+  ret <8 x i8> %val3
+}
+
+define <16 x i8> @shuffle_v16i8(<3 x i8> %arg0, i1 %cond) {
+; CHECK-LABEL: define <16 x i8> @shuffle_v16i8(
+; CHECK-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <16 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <16 x i8> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <16 x i8> [ %val1, %then ], [ %val2, %else ]
+  ret <16 x i8> %val3
+}
+
+define <32 x i8> @shuffle_v32i8(<3 x i8> %arg0, i1 %cond) {
+; CHECK-LABEL: define <32 x i8> @shuffle_v32i8(
+; CHECK-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <32 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <32 x i8> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <32 x i8> [ %val1, %then ], [ %val2, %else ]
+  ret <32 x i8> %val3
+}
+
+define <2 x i16> @shuffle_v2i16(<2 x i16> %arg0, i1 %cond) {
+; CHECK-LABEL: define <2 x i16> @shuffle_v2i16(
+; CHECK-SAME: <2 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i16> [[ARG0]], <2 x i16> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i16> [[ARG0]], <2 x i16> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <2 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <2 x i16> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <2 x i16> %arg0, <2 x i16> poison, <2 x i32> <i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <2 x i16> %arg0, <2 x i16> poison, <2 x i32> <i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <2 x i16> [ %val1, %then ], [ %val2, %else ]
+  ret <2 x i16> %val3
+}
+
+define <4 x i16> @shuffle_v4i16(<3 x i16> %arg0, i1 %cond) {
+; CHECK-LABEL: define <4 x i16> @shuffle_v4i16(
+; CHECK-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <4 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <4 x i16> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <4 x i16> [ %val1, %then ], [ %val2, %else ]
+  ret <4 x i16> %val3
+}
+
+define <8 x i16> @shuffle_v8i16(<3 x i16> %arg0, i1 %cond) {
+; CHECK-LABEL: define <8 x i16> @shuffle_v8i16(
+; CHECK-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <8 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <8 x i16> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <8 x i16> [ %val1, %then ], [ %val2, %else ]
+  ret <8 x i16> %val3
+}
+
+define <16 x i16> @shuffle_v16i16(<3 x i16> %arg0, i1 %cond) {
+; CHECK-LABEL: define <16 x i16> @shuffle_v16i16(
+; CHECK-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <16 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <16 x i16> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <16 x i16> [ %val1, %then ], [ %val2, %else ]
+  ret <16 x i16> %val3
+}
+
+define <32 x i16> @shuffle_v32i16(<3 x i16> %arg0, i1 %cond) {
+; CHECK-LABEL: define <32 x i16> @shuffle_v32i16(
+; CHECK-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <32 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <32 x i16> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <32 x i16> [ %val1, %then ], [ %val2, %else ]
+  ret <32 x i16> %val3
+}
+
+define <2 x i32> @shuffle_v2i32(<2 x i32> %arg0, i1 %cond) {
+; CHECK-LABEL: define <2 x i32> @shuffle_v2i32(
+; CHECK-SAME: <2 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i32> [[ARG0]], <2 x i32> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i32> [[ARG0]], <2 x i32> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <2 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <2 x i32> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <2 x i32> %arg0, <2 x i32> poison, <2 x i32> <i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <2 x i32> %arg0, <2 x i32> poison, <2 x i32> <i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <2 x i32> [ %val1, %then ], [ %val2, %else ]
+  ret <2 x i32> %val3
+}
+
+define <4 x i32> @shuffle_v4i32(<3 x i32> %arg0, i1 %cond) {
+; CHECK-LABEL: define <4 x i32> @shuffle_v4i32(
+; CHECK-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <4 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <4 x i32> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <4 x i32> [ %val1, %then ], [ %val2, %else ]
+  ret <4 x i32> %val3
+}
+
+define <8 x i32> @shuffle_v8i32(<3 x i32> %arg0, i1 %cond) {
+; CHECK-LABEL: define <8 x i32> @shuffle_v8i32(
+; CHECK-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <8 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <8 x i32> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <8 x i32> [ %val1, %then ], [ %val2, %else ]
+  ret <8 x i32> %val3
+}
+
+define <16 x i32> @shuffle_v16i32(<3 x i32> %arg0, i1 %cond) {
+; CHECK-LABEL: define <16 x i32> @shuffle_v16i32(
+; CHECK-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <16 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <16 x i32> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <16 x i32> [ %val1, %then ], [ %val2, %else ]
+  ret <16 x i32> %val3
+}
+
+define <32 x i32> @shuffle_v32i32(<3 x i32> %arg0, i1 %cond) {
+; CHECK-LABEL: define <32 x i32> @shuffle_v32i32(
+; CHECK-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <32 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <32 x i32> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <32 x i32> [ %val1, %then ], [ %val2, %else ]
+  ret <32 x i32> %val3
+}
+
+define <2 x bfloat> @shuffle_v2bf16(<2 x bfloat> %arg0, i1 %cond) {
+; CHECK-LABEL: define <2 x bfloat> @shuffle_v2bf16(
+; CHECK-SAME: <2 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <2 x bfloat> [[ARG0]], <2 x bfloat> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <2 x bfloat> [[ARG0]], <2 x bfloat> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <2 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <2 x bfloat> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <2 x bfloat> %arg0, <2 x bfloat> poison, <2 x i32> <i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <2 x bfloat> %arg0, <2 x bfloat> poison, <2 x i32> <i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <2 x bfloat> [ %val1, %then ], [ %val2, %else ]
+  ret <2 x bfloat> %val3
+}
+
+define <3 x bfloat> @shuffle_v3bf16(<3 x bfloat> %arg0, i1 %cond) {
+; CHECK-LABEL: define <3 x bfloat> @shuffle_v3bf16(
+; CHECK-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <3 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <3 x bfloat> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <3 x i32> <i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <3 x i32> <i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <3 x bfloat> [ %val1, %then ], [ %val2, %else ]
+  ret <3 x bfloat> %val3
+}
+
+define <4 x bfloat> @shuffle_v4bf16(<3 x bfloat> %arg0, i1 %cond) {
+; CHECK-LABEL: define <4 x bfloat> @shuffle_v4bf16(
+; CHECK-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <4 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <4 x bfloat> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <4 x bfloat> [ %val1, %then ], [ %val2, %else ]
+  ret <4 x bfloat> %val3
+}
+
+define <6 x bfloat> @shuffle_v6bf16(<3 x bfloat> %arg0, i1 %cond) {
+; CHECK-LABEL: define <6 x bfloat> @shuffle_v6bf16(
+; CHECK-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <6 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <6 x bfloat> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <6 x bfloat> [ %val1, %then ], [ %val2, %else ]
+  ret <6 x bfloat> %val3
+}
+
+define <8 x bfloat> @shuffle_v8bf16(<3 x bfloat> %arg0, i1 %cond) {
+; CHECK-LABEL: define <8 x bfloat> @shuffle_v8bf16(
+; CHECK-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <8 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <8 x bfloat> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <8 x bfloat> [ %val1, %then ], [ %val2, %else ]
+  ret <8 x bfloat> %val3
+}
+
+define <16 x bfloat> @shuffle_v16bf16(<3 x bfloat> %arg0, i1 %cond) {
+; CHECK-LABEL: define <16 x bfloat> @shuffle_v16bf16(
+; CHECK-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <16 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <16 x bfloat> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <16 x bfloat> [ %val1, %then ], [ %val2, %else ]
+  ret <16 x bfloat> %val3
+}
+
+define <32 x bfloat> @shuffle_v32bf16(<3 x bfloat> %arg0, i1 %cond) {
+; CHECK-LABEL: define <32 x bfloat> @shuffle_v32bf16(
+; CHECK-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <32 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <32 x bfloat> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <32 x bfloat> [ %val1, %then ], [ %val2, %else ]
+  ret <32 x bfloat> %val3
+}
+
+define <2 x half> @shuffle_v2f16(<2 x half> %arg0, i1 %cond) {
+; CHECK-LABEL: define <2 x half> @shuffle_v2f16(
+; CHECK-SAME: <2 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <2 x half> [[ARG0]], <2 x half> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <2 x half> [[ARG0]], <2 x half> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <2 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <2 x half> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <2 x half> %arg0, <2 x half> poison, <2 x i32> <i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <2 x half> %arg0, <2 x half> poison, <2 x i32> <i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <2 x half> [ %val1, %then ], [ %val2, %else ]
+  ret <2 x half> %val3
+}
+
+define <3 x half> @shuffle_v3f16(<3 x half> %arg0, i1 %cond) {
+; CHECK-LABEL: define <3 x half> @shuffle_v3f16(
+; CHECK-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <3 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <3 x half> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x half> %arg0, <3 x half> poison, <3 x i32> <i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <3 x i32> <i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <3 x half> [ %val1, %then ], [ %val2, %else ]
+  ret <3 x half> %val3
+}
+
+define <4 x half> @shuffle_v4f16(<3 x half> %arg0, i1 %cond) {
+; CHECK-LABEL: define <4 x half> @shuffle_v4f16(
+; CHECK-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <4 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <4 x half> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x half> %arg0, <3 x half> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <4 x half> [ %val1, %then ], [ %val2, %else ]
+  ret <4 x half> %val3
+}
+
+define <6 x half> @shuffle_v6f16(<3 x half> %arg0, i1 %cond) {
+; CHECK-LABEL: define <6 x half> @shuffle_v6f16(
+; CHECK-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <6 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <6 x half> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x half> %arg0, <3 x half> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <6 x half> [ %val1, %then ], [ %val2, %else ]
+  ret <6 x half> %val3
+}
+
+define <8 x half> @shuffle_v8f16(<3 x half> %arg0, i1 %cond) {
+; CHECK-LABEL: define <8 x half> @shuffle_v8f16(
+; CHECK-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <8 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <8 x half> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x half> %arg0, <3 x half> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <8 x half> [ %val1, %then ], [ %val2, %else ]
+  ret <8 x half> %val3
+}
+
+define <16 x half> @shuffle_v16f16(<3 x half> %arg0, i1 %cond) {
+; CHECK-LABEL: define <16 x half> @shuffle_v16f16(
+; CHECK-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <16 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <16 x half> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x half> %arg0, <3 x half> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <16 x half> [ %val1, %then ], [ %val2, %else ]
+  ret <16 x half> %val3
+}
+
+define <32 x half> @shuffle_v32f16(<3 x half> %arg0, i1 %cond) {
+; CHECK-LABEL: define <32 x half> @shuffle_v32f16(
+; CHECK-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <32 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <32 x half> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x half> %arg0, <3 x half> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <32 x half> [ %val1, %then ], [ %val2, %else ]
+  ret <32 x half> %val3
+}
+
+define <2 x float> @shuffle_v2f32(<2 x float> %arg0, i1 %cond) {
+; CHECK-LABEL: define <2 x float> @shuffle_v2f32(
+; CHECK-SAME: <2 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <2 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <2 x float> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <2 x float> %arg0, <2 x float> poison, <2 x i32> <i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <2 x float> %arg0, <2 x float> poison, <2 x i32> <i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <2 x float> [ %val1, %then ], [ %val2, %else ]
+  ret <2 x float> %val3
+}
+
+define <3 x float> @shuffle_v3f32(<3 x float> %arg0, i1 %cond) {
+; CHECK-LABEL: define <3 x float> @shuffle_v3f32(
+; CHECK-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <3 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <3 x float> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x float> %arg0, <3 x float> poison, <3 x i32> <i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <3 x i32> <i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <3 x float> [ %val1, %then ], [ %val2, %else ]
+  ret <3 x float> %val3
+}
+
+define <4 x float> @shuffle_v4f32(<3 x float> %arg0, i1 %cond) {
+; CHECK-LABEL: define <4 x float> @shuffle_v4f32(
+; CHECK-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <4 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <4 x float> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x float> %arg0, <3 x float> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <4 x float> [ %val1, %then ], [ %val2, %else ]
+  ret <4 x float> %val3
+}
+
+define <6 x float> @shuffle_v6f32(<3 x float> %arg0, i1 %cond) {
+; CHECK-LABEL: define <6 x float> @shuffle_v6f32(
+; CHECK-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <6 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <6 x float> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x float> %arg0, <3 x float> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <6 x float> [ %val1, %then ], [ %val2, %else ]
+  ret <6 x float> %val3
+}
+
+define <8 x float> @shuffle_v8f32(<3 x float> %arg0, i1 %cond) {
+; CHECK-LABEL: define <8 x float> @shuffle_v8f32(
+; CHECK-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <8 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <8 x float> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x float> %arg0, <3 x float> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <8 x float> [ %val1, %then ], [ %val2, %else ]
+  ret <8 x float> %val3
+}
+
+define <16 x float> @shuffle_v16f32(<3 x float> %arg0, i1 %cond) {
+; CHECK-LABEL: define <16 x float> @shuffle_v16f32(
+; CHECK-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <16 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <16 x float> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x float> %arg0, <3 x float> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <16 x float> [ %val1, %then ], [ %val2, %else ]
+  ret <16 x float> %val3
+}
+
+define <32 x float> @shuffle_v32f32(<3 x float> %arg0, i1 %cond) {
+; CHECK-LABEL: define <32 x float> @shuffle_v32f32(
+; CHECK-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <32 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <32 x float> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x float> %arg0, <3 x float> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <32 x float> [ %val1, %then ], [ %val2, %else ]
+  ret <32 x float> %val3
+}
+
+declare void @func0() local_unnamed_addr
+
+declare void @func1() local_unnamed_addr
diff --git a/llvm/test/Transforms/VectorCombine/AMDGPU/narrow-phi-of-shuffles.ll b/llvm/test/Transforms/VectorCombine/AMDGPU/narrow-phi-of-shuffles.ll
new file mode 100644
index 0000000000000..aa183034dea51
--- /dev/null
+++ b/llvm/test/Transforms/VectorCombine/AMDGPU/narrow-phi-of-shuffles.ll
@@ -0,0 +1,1266 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
+; RUN: opt -mtriple=amdgcn-amd-amdhsa -passes=vector-combine -S %s | FileCheck %s --check-prefixes=CHECK
+
+define <2 x i8> @shuffle_v2i8(<2 x i8> %arg0, i1 %cond) {
+; CHECK-LABEL: define <2 x i8> @shuffle_v2i8(
+; CHECK-SAME: <2 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i8> [[ARG0]], <2 x i8> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i8> [[ARG0]], <2 x i8> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <2 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <2 x i8> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <2 x i8> %arg0, <2 x i8> poison, <2 x i32> <i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <2 x i8> %arg0, <2 x i8> poison, <2 x i32> <i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <2 x i8> [ %val1, %then ], [ %val2, %else ]
+  ret <2 x i8> %val3
+}
+
+define <4 x i8> @shuffle_v4i8(<3 x i8> %arg0, i1 %cond) {
+; CHECK-LABEL: define <4 x i8> @shuffle_v4i8(
+; CHECK-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <4 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <4 x i8> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <4 x i8> [ %val1, %then ], [ %val2, %else ]
+  ret <4 x i8> %val3
+}
+
+define <8 x i8> @shuffle_v8i8(<3 x i8> %arg0, i1 %cond) {
+; CHECK-LABEL: define <8 x i8> @shuffle_v8i8(
+; CHECK-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <8 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <8 x i8> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <8 x i8> [ %val1, %then ], [ %val2, %else ]
+  ret <8 x i8> %val3
+}
+
+define <16 x i8> @shuffle_v16i8(<3 x i8> %arg0, i1 %cond) {
+; CHECK-LABEL: define <16 x i8> @shuffle_v16i8(
+; CHECK-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <16 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <16 x i8> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <16 x i8> [ %val1, %then ], [ %val2, %else ]
+  ret <16 x i8> %val3
+}
+
+define <32 x i8> @shuffle_v32i8(<3 x i8> %arg0, i1 %cond) {
+; CHECK-LABEL: define <32 x i8> @shuffle_v32i8(
+; CHECK-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <32 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <32 x i8> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <32 x i8> [ %val1, %then ], [ %val2, %else ]
+  ret <32 x i8> %val3
+}
+
+define <2 x i16> @shuffle_v2i16(<2 x i16> %arg0, i1 %cond) {
+; CHECK-LABEL: define <2 x i16> @shuffle_v2i16(
+; CHECK-SAME: <2 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i16> [[ARG0]], <2 x i16> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i16> [[ARG0]], <2 x i16> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <2 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <2 x i16> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <2 x i16> %arg0, <2 x i16> poison, <2 x i32> <i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <2 x i16> %arg0, <2 x i16> poison, <2 x i32> <i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <2 x i16> [ %val1, %then ], [ %val2, %else ]
+  ret <2 x i16> %val3
+}
+
+define <4 x i16> @shuffle_v4i16(<3 x i16> %arg0, i1 %cond) {
+; CHECK-LABEL: define <4 x i16> @shuffle_v4i16(
+; CHECK-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <4 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <4 x i16> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <4 x i16> [ %val1, %then ], [ %val2, %else ]
+  ret <4 x i16> %val3
+}
+
+define <8 x i16> @shuffle_v8i16(<3 x i16> %arg0, i1 %cond) {
+; CHECK-LABEL: define <8 x i16> @shuffle_v8i16(
+; CHECK-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <8 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <8 x i16> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <8 x i16> [ %val1, %then ], [ %val2, %else ]
+  ret <8 x i16> %val3
+}
+
+define <16 x i16> @shuffle_v16i16(<3 x i16> %arg0, i1 %cond) {
+; CHECK-LABEL: define <16 x i16> @shuffle_v16i16(
+; CHECK-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <16 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <16 x i16> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <16 x i16> [ %val1, %then ], [ %val2, %else ]
+  ret <16 x i16> %val3
+}
+
+define <32 x i16> @shuffle_v32i16(<3 x i16> %arg0, i1 %cond) {
+; CHECK-LABEL: define <32 x i16> @shuffle_v32i16(
+; CHECK-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <32 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <32 x i16> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <32 x i16> [ %val1, %then ], [ %val2, %else ]
+  ret <32 x i16> %val3
+}
+
+define <2 x i32> @shuffle_v2i32(<2 x i32> %arg0, i1 %cond) {
+; CHECK-LABEL: define <2 x i32> @shuffle_v2i32(
+; CHECK-SAME: <2 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i32> [[ARG0]], <2 x i32> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i32> [[ARG0]], <2 x i32> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <2 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <2 x i32> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <2 x i32> %arg0, <2 x i32> poison, <2 x i32> <i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <2 x i32> %arg0, <2 x i32> poison, <2 x i32> <i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <2 x i32> [ %val1, %then ], [ %val2, %else ]
+  ret <2 x i32> %val3
+}
+
+define <4 x i32> @shuffle_v4i32(<3 x i32> %arg0, i1 %cond) {
+; CHECK-LABEL: define <4 x i32> @shuffle_v4i32(
+; CHECK-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <4 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <4 x i32> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <4 x i32> [ %val1, %then ], [ %val2, %else ]
+  ret <4 x i32> %val3
+}
+
+define <8 x i32> @shuffle_v8i32(<3 x i32> %arg0, i1 %cond) {
+; CHECK-LABEL: define <8 x i32> @shuffle_v8i32(
+; CHECK-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <8 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <8 x i32> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <8 x i32> [ %val1, %then ], [ %val2, %else ]
+  ret <8 x i32> %val3
+}
+
+define <16 x i32> @shuffle_v16i32(<3 x i32> %arg0, i1 %cond) {
+; CHECK-LABEL: define <16 x i32> @shuffle_v16i32(
+; CHECK-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <16 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <16 x i32> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <16 x i32> [ %val1, %then ], [ %val2, %else ]
+  ret <16 x i32> %val3
+}
+
+define <32 x i32> @shuffle_v32i32(<3 x i32> %arg0, i1 %cond) {
+; CHECK-LABEL: define <32 x i32> @shuffle_v32i32(
+; CHECK-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <32 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <32 x i32> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <32 x i32> [ %val1, %then ], [ %val2, %else ]
+  ret <32 x i32> %val3
+}
+
+define <2 x bfloat> @shuffle_v2bf16(<2 x bfloat> %arg0, i1 %cond) {
+; CHECK-LABEL: define <2 x bfloat> @shuffle_v2bf16(
+; CHECK-SAME: <2 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <2 x bfloat> [[ARG0]], <2 x bfloat> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <2 x bfloat> [[ARG0]], <2 x bfloat> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <2 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <2 x bfloat> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <2 x bfloat> %arg0, <2 x bfloat> poison, <2 x i32> <i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <2 x bfloat> %arg0, <2 x bfloat> poison, <2 x i32> <i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <2 x bfloat> [ %val1, %then ], [ %val2, %else ]
+  ret <2 x bfloat> %val3
+}
+
+define <3 x bfloat> @shuffle_v3bf16(<3 x bfloat> %arg0, i1 %cond) {
+; CHECK-LABEL: define <3 x bfloat> @shuffle_v3bf16(
+; CHECK-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <3 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <3 x bfloat> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <3 x i32> <i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <3 x i32> <i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <3 x bfloat> [ %val1, %then ], [ %val2, %else ]
+  ret <3 x bfloat> %val3
+}
+
+define <4 x bfloat> @shuffle_v4bf16(<3 x bfloat> %arg0, i1 %cond) {
+; CHECK-LABEL: define <4 x bfloat> @shuffle_v4bf16(
+; CHECK-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <4 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <4 x bfloat> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <4 x bfloat> [ %val1, %then ], [ %val2, %else ]
+  ret <4 x bfloat> %val3
+}
+
+define <6 x bfloat> @shuffle_v6bf16(<3 x bfloat> %arg0, i1 %cond) {
+; CHECK-LABEL: define <6 x bfloat> @shuffle_v6bf16(
+; CHECK-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <6 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <6 x bfloat> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <6 x bfloat> [ %val1, %then ], [ %val2, %else ]
+  ret <6 x bfloat> %val3
+}
+
+define <8 x bfloat> @shuffle_v8bf16(<3 x bfloat> %arg0, i1 %cond) {
+; CHECK-LABEL: define <8 x bfloat> @shuffle_v8bf16(
+; CHECK-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <8 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <8 x bfloat> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <8 x bfloat> [ %val1, %then ], [ %val2, %else ]
+  ret <8 x bfloat> %val3
+}
+
+define <16 x bfloat> @shuffle_v16bf16(<3 x bfloat> %arg0, i1 %cond) {
+; CHECK-LABEL: define <16 x bfloat> @shuffle_v16bf16(
+; CHECK-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <16 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <16 x bfloat> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <16 x bfloat> [ %val1, %then ], [ %val2, %else ]
+  ret <16 x bfloat> %val3
+}
+
+define <32 x bfloat> @shuffle_v32bf16(<3 x bfloat> %arg0, i1 %cond) {
+; CHECK-LABEL: define <32 x bfloat> @shuffle_v32bf16(
+; CHECK-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <32 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <32 x bfloat> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <32 x bfloat> [ %val1, %then ], [ %val2, %else ]
+  ret <32 x bfloat> %val3
+}
+
+define <2 x half> @shuffle_v2f16(<2 x half> %arg0, i1 %cond) {
+; CHECK-LABEL: define <2 x half> @shuffle_v2f16(
+; CHECK-SAME: <2 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <2 x half> [[ARG0]], <2 x half> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <2 x half> [[ARG0]], <2 x half> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <2 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <2 x half> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <2 x half> %arg0, <2 x half> poison, <2 x i32> <i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <2 x half> %arg0, <2 x half> poison, <2 x i32> <i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <2 x half> [ %val1, %then ], [ %val2, %else ]
+  ret <2 x half> %val3
+}
+
+define <3 x half> @shuffle_v3f16(<3 x half> %arg0, i1 %cond) {
+; CHECK-LABEL: define <3 x half> @shuffle_v3f16(
+; CHECK-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <3 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <3 x half> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x half> %arg0, <3 x half> poison, <3 x i32> <i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <3 x i32> <i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <3 x half> [ %val1, %then ], [ %val2, %else ]
+  ret <3 x half> %val3
+}
+
+define <4 x half> @shuffle_v4f16(<3 x half> %arg0, i1 %cond) {
+; CHECK-LABEL: define <4 x half> @shuffle_v4f16(
+; CHECK-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <4 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <4 x half> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x half> %arg0, <3 x half> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <4 x half> [ %val1, %then ], [ %val2, %else ]
+  ret <4 x half> %val3
+}
+
+define <6 x half> @shuffle_v6f16(<3 x half> %arg0, i1 %cond) {
+; CHECK-LABEL: define <6 x half> @shuffle_v6f16(
+; CHECK-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <6 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <6 x half> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x half> %arg0, <3 x half> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <6 x half> [ %val1, %then ], [ %val2, %else ]
+  ret <6 x half> %val3
+}
+
+define <8 x half> @shuffle_v8f16(<3 x half> %arg0, i1 %cond) {
+; CHECK-LABEL: define <8 x half> @shuffle_v8f16(
+; CHECK-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <8 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <8 x half> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x half> %arg0, <3 x half> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <8 x half> [ %val1, %then ], [ %val2, %else ]
+  ret <8 x half> %val3
+}
+
+define <16 x half> @shuffle_v16f16(<3 x half> %arg0, i1 %cond) {
+; CHECK-LABEL: define <16 x half> @shuffle_v16f16(
+; CHECK-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <16 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <16 x half> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x half> %arg0, <3 x half> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <16 x half> [ %val1, %then ], [ %val2, %else ]
+  ret <16 x half> %val3
+}
+
+define <32 x half> @shuffle_v32f16(<3 x half> %arg0, i1 %cond) {
+; CHECK-LABEL: define <32 x half> @shuffle_v32f16(
+; CHECK-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <32 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <32 x half> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x half> %arg0, <3 x half> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <32 x half> [ %val1, %then ], [ %val2, %else ]
+  ret <32 x half> %val3
+}
+
+define <2 x float> @shuffle_v2f32(<2 x float> %arg0, i1 %cond) {
+; CHECK-LABEL: define <2 x float> @shuffle_v2f32(
+; CHECK-SAME: <2 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <2 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <2 x float> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <2 x float> %arg0, <2 x float> poison, <2 x i32> <i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <2 x float> %arg0, <2 x float> poison, <2 x i32> <i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <2 x float> [ %val1, %then ], [ %val2, %else ]
+  ret <2 x float> %val3
+}
+
+define <3 x float> @shuffle_v3f32(<3 x float> %arg0, i1 %cond) {
+; CHECK-LABEL: define <3 x float> @shuffle_v3f32(
+; CHECK-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <3 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <3 x float> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x float> %arg0, <3 x float> poison, <3 x i32> <i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <3 x i32> <i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <3 x float> [ %val1, %then ], [ %val2, %else ]
+  ret <3 x float> %val3
+}
+
+define <4 x float> @shuffle_v4f32(<3 x float> %arg0, i1 %cond) {
+; CHECK-LABEL: define <4 x float> @shuffle_v4f32(
+; CHECK-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <4 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <4 x float> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x float> %arg0, <3 x float> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <4 x float> [ %val1, %then ], [ %val2, %else ]
+  ret <4 x float> %val3
+}
+
+define <6 x float> @shuffle_v6f32(<3 x float> %arg0, i1 %cond) {
+; CHECK-LABEL: define <6 x float> @shuffle_v6f32(
+; CHECK-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <6 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <6 x float> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x float> %arg0, <3 x float> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <6 x float> [ %val1, %then ], [ %val2, %else ]
+  ret <6 x float> %val3
+}
+
+define <8 x float> @shuffle_v8f32(<3 x float> %arg0, i1 %cond) {
+; CHECK-LABEL: define <8 x float> @shuffle_v8f32(
+; CHECK-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <8 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <8 x float> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x float> %arg0, <3 x float> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <8 x float> [ %val1, %then ], [ %val2, %else ]
+  ret <8 x float> %val3
+}
+
+define <16 x float> @shuffle_v16f32(<3 x float> %arg0, i1 %cond) {
+; CHECK-LABEL: define <16 x float> @shuffle_v16f32(
+; CHECK-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <16 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <16 x float> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x float> %arg0, <3 x float> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <16 x float> [ %val1, %then ], [ %val2, %else ]
+  ret <16 x float> %val3
+}
+
+define <32 x float> @shuffle_v32f32(<3 x float> %arg0, i1 %cond) {
+; CHECK-LABEL: define <32 x float> @shuffle_v32f32(
+; CHECK-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <32 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <32 x float> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x float> %arg0, <3 x float> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <32 x float> [ %val1, %then ], [ %val2, %else ]
+  ret <32 x float> %val3
+}
+
+declare void @func0() local_unnamed_addr
+
+declare void @func1() local_unnamed_addr
diff --git a/llvm/test/Transforms/VectorCombine/ARM/narrow-phi-of-shuffles.ll b/llvm/test/Transforms/VectorCombine/ARM/narrow-phi-of-shuffles.ll
new file mode 100644
index 0000000000000..5263215ae209e
--- /dev/null
+++ b/llvm/test/Transforms/VectorCombine/ARM/narrow-phi-of-shuffles.ll
@@ -0,0 +1,1266 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
+; RUN: opt -mtriple=arm -passes=vector-combine -S %s | FileCheck %s --check-prefixes=CHECK
+
+define <2 x i8> @shuffle_v2i8(<2 x i8> %arg0, i1 %cond) {
+; CHECK-LABEL: define <2 x i8> @shuffle_v2i8(
+; CHECK-SAME: <2 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i8> [[ARG0]], <2 x i8> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i8> [[ARG0]], <2 x i8> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <2 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <2 x i8> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <2 x i8> %arg0, <2 x i8> poison, <2 x i32> <i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <2 x i8> %arg0, <2 x i8> poison, <2 x i32> <i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <2 x i8> [ %val1, %then ], [ %val2, %else ]
+  ret <2 x i8> %val3
+}
+
+define <4 x i8> @shuffle_v4i8(<3 x i8> %arg0, i1 %cond) {
+; CHECK-LABEL: define <4 x i8> @shuffle_v4i8(
+; CHECK-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <4 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <4 x i8> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <4 x i8> [ %val1, %then ], [ %val2, %else ]
+  ret <4 x i8> %val3
+}
+
+define <8 x i8> @shuffle_v8i8(<3 x i8> %arg0, i1 %cond) {
+; CHECK-LABEL: define <8 x i8> @shuffle_v8i8(
+; CHECK-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <8 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <8 x i8> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <8 x i8> [ %val1, %then ], [ %val2, %else ]
+  ret <8 x i8> %val3
+}
+
+define <16 x i8> @shuffle_v16i8(<3 x i8> %arg0, i1 %cond) {
+; CHECK-LABEL: define <16 x i8> @shuffle_v16i8(
+; CHECK-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <16 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <16 x i8> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <16 x i8> [ %val1, %then ], [ %val2, %else ]
+  ret <16 x i8> %val3
+}
+
+define <32 x i8> @shuffle_v32i8(<3 x i8> %arg0, i1 %cond) {
+; CHECK-LABEL: define <32 x i8> @shuffle_v32i8(
+; CHECK-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <32 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <32 x i8> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <32 x i8> [ %val1, %then ], [ %val2, %else ]
+  ret <32 x i8> %val3
+}
+
+define <2 x i16> @shuffle_v2i16(<2 x i16> %arg0, i1 %cond) {
+; CHECK-LABEL: define <2 x i16> @shuffle_v2i16(
+; CHECK-SAME: <2 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i16> [[ARG0]], <2 x i16> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i16> [[ARG0]], <2 x i16> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <2 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <2 x i16> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <2 x i16> %arg0, <2 x i16> poison, <2 x i32> <i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <2 x i16> %arg0, <2 x i16> poison, <2 x i32> <i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <2 x i16> [ %val1, %then ], [ %val2, %else ]
+  ret <2 x i16> %val3
+}
+
+define <4 x i16> @shuffle_v4i16(<3 x i16> %arg0, i1 %cond) {
+; CHECK-LABEL: define <4 x i16> @shuffle_v4i16(
+; CHECK-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <4 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <4 x i16> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <4 x i16> [ %val1, %then ], [ %val2, %else ]
+  ret <4 x i16> %val3
+}
+
+define <8 x i16> @shuffle_v8i16(<3 x i16> %arg0, i1 %cond) {
+; CHECK-LABEL: define <8 x i16> @shuffle_v8i16(
+; CHECK-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <8 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <8 x i16> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <8 x i16> [ %val1, %then ], [ %val2, %else ]
+  ret <8 x i16> %val3
+}
+
+define <16 x i16> @shuffle_v16i16(<3 x i16> %arg0, i1 %cond) {
+; CHECK-LABEL: define <16 x i16> @shuffle_v16i16(
+; CHECK-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <16 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <16 x i16> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <16 x i16> [ %val1, %then ], [ %val2, %else ]
+  ret <16 x i16> %val3
+}
+
+define <32 x i16> @shuffle_v32i16(<3 x i16> %arg0, i1 %cond) {
+; CHECK-LABEL: define <32 x i16> @shuffle_v32i16(
+; CHECK-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <32 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <32 x i16> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <32 x i16> [ %val1, %then ], [ %val2, %else ]
+  ret <32 x i16> %val3
+}
+
+define <2 x i32> @shuffle_v2i32(<2 x i32> %arg0, i1 %cond) {
+; CHECK-LABEL: define <2 x i32> @shuffle_v2i32(
+; CHECK-SAME: <2 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i32> [[ARG0]], <2 x i32> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i32> [[ARG0]], <2 x i32> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <2 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <2 x i32> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <2 x i32> %arg0, <2 x i32> poison, <2 x i32> <i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <2 x i32> %arg0, <2 x i32> poison, <2 x i32> <i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <2 x i32> [ %val1, %then ], [ %val2, %else ]
+  ret <2 x i32> %val3
+}
+
+define <4 x i32> @shuffle_v4i32(<3 x i32> %arg0, i1 %cond) {
+; CHECK-LABEL: define <4 x i32> @shuffle_v4i32(
+; CHECK-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <4 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <4 x i32> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <4 x i32> [ %val1, %then ], [ %val2, %else ]
+  ret <4 x i32> %val3
+}
+
+define <8 x i32> @shuffle_v8i32(<3 x i32> %arg0, i1 %cond) {
+; CHECK-LABEL: define <8 x i32> @shuffle_v8i32(
+; CHECK-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <8 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <8 x i32> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <8 x i32> [ %val1, %then ], [ %val2, %else ]
+  ret <8 x i32> %val3
+}
+
+define <16 x i32> @shuffle_v16i32(<3 x i32> %arg0, i1 %cond) {
+; CHECK-LABEL: define <16 x i32> @shuffle_v16i32(
+; CHECK-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <16 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <16 x i32> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <16 x i32> [ %val1, %then ], [ %val2, %else ]
+  ret <16 x i32> %val3
+}
+
+define <32 x i32> @shuffle_v32i32(<3 x i32> %arg0, i1 %cond) {
+; CHECK-LABEL: define <32 x i32> @shuffle_v32i32(
+; CHECK-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <32 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <32 x i32> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <32 x i32> [ %val1, %then ], [ %val2, %else ]
+  ret <32 x i32> %val3
+}
+
+define <2 x bfloat> @shuffle_v2bf16(<2 x bfloat> %arg0, i1 %cond) {
+; CHECK-LABEL: define <2 x bfloat> @shuffle_v2bf16(
+; CHECK-SAME: <2 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <2 x bfloat> [[ARG0]], <2 x bfloat> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <2 x bfloat> [[ARG0]], <2 x bfloat> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <2 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <2 x bfloat> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <2 x bfloat> %arg0, <2 x bfloat> poison, <2 x i32> <i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <2 x bfloat> %arg0, <2 x bfloat> poison, <2 x i32> <i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <2 x bfloat> [ %val1, %then ], [ %val2, %else ]
+  ret <2 x bfloat> %val3
+}
+
+define <3 x bfloat> @shuffle_v3bf16(<3 x bfloat> %arg0, i1 %cond) {
+; CHECK-LABEL: define <3 x bfloat> @shuffle_v3bf16(
+; CHECK-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <3 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <3 x bfloat> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <3 x i32> <i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <3 x i32> <i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <3 x bfloat> [ %val1, %then ], [ %val2, %else ]
+  ret <3 x bfloat> %val3
+}
+
+define <4 x bfloat> @shuffle_v4bf16(<3 x bfloat> %arg0, i1 %cond) {
+; CHECK-LABEL: define <4 x bfloat> @shuffle_v4bf16(
+; CHECK-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <4 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <4 x bfloat> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <4 x bfloat> [ %val1, %then ], [ %val2, %else ]
+  ret <4 x bfloat> %val3
+}
+
+define <6 x bfloat> @shuffle_v6bf16(<3 x bfloat> %arg0, i1 %cond) {
+; CHECK-LABEL: define <6 x bfloat> @shuffle_v6bf16(
+; CHECK-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <6 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <6 x bfloat> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <6 x bfloat> [ %val1, %then ], [ %val2, %else ]
+  ret <6 x bfloat> %val3
+}
+
+define <8 x bfloat> @shuffle_v8bf16(<3 x bfloat> %arg0, i1 %cond) {
+; CHECK-LABEL: define <8 x bfloat> @shuffle_v8bf16(
+; CHECK-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <8 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <8 x bfloat> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <8 x bfloat> [ %val1, %then ], [ %val2, %else ]
+  ret <8 x bfloat> %val3
+}
+
+define <16 x bfloat> @shuffle_v16bf16(<3 x bfloat> %arg0, i1 %cond) {
+; CHECK-LABEL: define <16 x bfloat> @shuffle_v16bf16(
+; CHECK-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <16 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <16 x bfloat> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <16 x bfloat> [ %val1, %then ], [ %val2, %else ]
+  ret <16 x bfloat> %val3
+}
+
+define <32 x bfloat> @shuffle_v32bf16(<3 x bfloat> %arg0, i1 %cond) {
+; CHECK-LABEL: define <32 x bfloat> @shuffle_v32bf16(
+; CHECK-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <32 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <32 x bfloat> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <32 x bfloat> [ %val1, %then ], [ %val2, %else ]
+  ret <32 x bfloat> %val3
+}
+
+define <2 x half> @shuffle_v2f16(<2 x half> %arg0, i1 %cond) {
+; CHECK-LABEL: define <2 x half> @shuffle_v2f16(
+; CHECK-SAME: <2 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <2 x half> [[ARG0]], <2 x half> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <2 x half> [[ARG0]], <2 x half> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <2 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <2 x half> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <2 x half> %arg0, <2 x half> poison, <2 x i32> <i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <2 x half> %arg0, <2 x half> poison, <2 x i32> <i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <2 x half> [ %val1, %then ], [ %val2, %else ]
+  ret <2 x half> %val3
+}
+
+define <3 x half> @shuffle_v3f16(<3 x half> %arg0, i1 %cond) {
+; CHECK-LABEL: define <3 x half> @shuffle_v3f16(
+; CHECK-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <3 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <3 x half> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x half> %arg0, <3 x half> poison, <3 x i32> <i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <3 x i32> <i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <3 x half> [ %val1, %then ], [ %val2, %else ]
+  ret <3 x half> %val3
+}
+
+define <4 x half> @shuffle_v4f16(<3 x half> %arg0, i1 %cond) {
+; CHECK-LABEL: define <4 x half> @shuffle_v4f16(
+; CHECK-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <4 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <4 x half> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x half> %arg0, <3 x half> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <4 x half> [ %val1, %then ], [ %val2, %else ]
+  ret <4 x half> %val3
+}
+
+define <6 x half> @shuffle_v6f16(<3 x half> %arg0, i1 %cond) {
+; CHECK-LABEL: define <6 x half> @shuffle_v6f16(
+; CHECK-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <6 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <6 x half> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x half> %arg0, <3 x half> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <6 x half> [ %val1, %then ], [ %val2, %else ]
+  ret <6 x half> %val3
+}
+
+define <8 x half> @shuffle_v8f16(<3 x half> %arg0, i1 %cond) {
+; CHECK-LABEL: define <8 x half> @shuffle_v8f16(
+; CHECK-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <8 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <8 x half> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x half> %arg0, <3 x half> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <8 x half> [ %val1, %then ], [ %val2, %else ]
+  ret <8 x half> %val3
+}
+
+define <16 x half> @shuffle_v16f16(<3 x half> %arg0, i1 %cond) {
+; CHECK-LABEL: define <16 x half> @shuffle_v16f16(
+; CHECK-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <16 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <16 x half> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x half> %arg0, <3 x half> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <16 x half> [ %val1, %then ], [ %val2, %else ]
+  ret <16 x half> %val3
+}
+
+define <32 x half> @shuffle_v32f16(<3 x half> %arg0, i1 %cond) {
+; CHECK-LABEL: define <32 x half> @shuffle_v32f16(
+; CHECK-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <32 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <32 x half> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x half> %arg0, <3 x half> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <32 x half> [ %val1, %then ], [ %val2, %else ]
+  ret <32 x half> %val3
+}
+
+define <2 x float> @shuffle_v2f32(<2 x float> %arg0, i1 %cond) {
+; CHECK-LABEL: define <2 x float> @shuffle_v2f32(
+; CHECK-SAME: <2 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <2 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <2 x float> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <2 x float> %arg0, <2 x float> poison, <2 x i32> <i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <2 x float> %arg0, <2 x float> poison, <2 x i32> <i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <2 x float> [ %val1, %then ], [ %val2, %else ]
+  ret <2 x float> %val3
+}
+
+define <3 x float> @shuffle_v3f32(<3 x float> %arg0, i1 %cond) {
+; CHECK-LABEL: define <3 x float> @shuffle_v3f32(
+; CHECK-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <3 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <3 x float> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x float> %arg0, <3 x float> poison, <3 x i32> <i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <3 x i32> <i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <3 x float> [ %val1, %then ], [ %val2, %else ]
+  ret <3 x float> %val3
+}
+
+define <4 x float> @shuffle_v4f32(<3 x float> %arg0, i1 %cond) {
+; CHECK-LABEL: define <4 x float> @shuffle_v4f32(
+; CHECK-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <4 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <4 x float> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x float> %arg0, <3 x float> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <4 x float> [ %val1, %then ], [ %val2, %else ]
+  ret <4 x float> %val3
+}
+
+define <6 x float> @shuffle_v6f32(<3 x float> %arg0, i1 %cond) {
+; CHECK-LABEL: define <6 x float> @shuffle_v6f32(
+; CHECK-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <6 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <6 x float> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x float> %arg0, <3 x float> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <6 x float> [ %val1, %then ], [ %val2, %else ]
+  ret <6 x float> %val3
+}
+
+define <8 x float> @shuffle_v8f32(<3 x float> %arg0, i1 %cond) {
+; CHECK-LABEL: define <8 x float> @shuffle_v8f32(
+; CHECK-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <8 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <8 x float> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x float> %arg0, <3 x float> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <8 x float> [ %val1, %then ], [ %val2, %else ]
+  ret <8 x float> %val3
+}
+
+define <16 x float> @shuffle_v16f32(<3 x float> %arg0, i1 %cond) {
+; CHECK-LABEL: define <16 x float> @shuffle_v16f32(
+; CHECK-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <16 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <16 x float> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x float> %arg0, <3 x float> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <16 x float> [ %val1, %then ], [ %val2, %else ]
+  ret <16 x float> %val3
+}
+
+define <32 x float> @shuffle_v32f32(<3 x float> %arg0, i1 %cond) {
+; CHECK-LABEL: define <32 x float> @shuffle_v32f32(
+; CHECK-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <32 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <32 x float> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x float> %arg0, <3 x float> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <32 x float> [ %val1, %then ], [ %val2, %else ]
+  ret <32 x float> %val3
+}
+
+declare void @func0() local_unnamed_addr
+
+declare void @func1() local_unnamed_addr
diff --git a/llvm/test/Transforms/VectorCombine/Hexagon/narrow-phi-of-shuffles.ll b/llvm/test/Transforms/VectorCombine/Hexagon/narrow-phi-of-shuffles.ll
new file mode 100644
index 0000000000000..d95ead49d38ae
--- /dev/null
+++ b/llvm/test/Transforms/VectorCombine/Hexagon/narrow-phi-of-shuffles.ll
@@ -0,0 +1,1266 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
+; RUN: opt -mtriple=hexagon-- -passes=vector-combine -S %s | FileCheck %s --check-prefixes=CHECK
+
+define <2 x i8> @shuffle_v2i8(<2 x i8> %arg0, i1 %cond) {
+; CHECK-LABEL: define <2 x i8> @shuffle_v2i8(
+; CHECK-SAME: <2 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i8> [[ARG0]], <2 x i8> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i8> [[ARG0]], <2 x i8> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <2 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <2 x i8> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <2 x i8> %arg0, <2 x i8> poison, <2 x i32> <i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <2 x i8> %arg0, <2 x i8> poison, <2 x i32> <i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <2 x i8> [ %val1, %then ], [ %val2, %else ]
+  ret <2 x i8> %val3
+}
+
+define <4 x i8> @shuffle_v4i8(<3 x i8> %arg0, i1 %cond) {
+; CHECK-LABEL: define <4 x i8> @shuffle_v4i8(
+; CHECK-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <4 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <4 x i8> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <4 x i8> [ %val1, %then ], [ %val2, %else ]
+  ret <4 x i8> %val3
+}
+
+define <8 x i8> @shuffle_v8i8(<3 x i8> %arg0, i1 %cond) {
+; CHECK-LABEL: define <8 x i8> @shuffle_v8i8(
+; CHECK-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <8 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <8 x i8> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <8 x i8> [ %val1, %then ], [ %val2, %else ]
+  ret <8 x i8> %val3
+}
+
+define <16 x i8> @shuffle_v16i8(<3 x i8> %arg0, i1 %cond) {
+; CHECK-LABEL: define <16 x i8> @shuffle_v16i8(
+; CHECK-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <16 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <16 x i8> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <16 x i8> [ %val1, %then ], [ %val2, %else ]
+  ret <16 x i8> %val3
+}
+
+define <32 x i8> @shuffle_v32i8(<3 x i8> %arg0, i1 %cond) {
+; CHECK-LABEL: define <32 x i8> @shuffle_v32i8(
+; CHECK-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <32 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <32 x i8> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <32 x i8> [ %val1, %then ], [ %val2, %else ]
+  ret <32 x i8> %val3
+}
+
+define <2 x i16> @shuffle_v2i16(<2 x i16> %arg0, i1 %cond) {
+; CHECK-LABEL: define <2 x i16> @shuffle_v2i16(
+; CHECK-SAME: <2 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i16> [[ARG0]], <2 x i16> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i16> [[ARG0]], <2 x i16> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <2 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <2 x i16> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <2 x i16> %arg0, <2 x i16> poison, <2 x i32> <i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <2 x i16> %arg0, <2 x i16> poison, <2 x i32> <i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <2 x i16> [ %val1, %then ], [ %val2, %else ]
+  ret <2 x i16> %val3
+}
+
+define <4 x i16> @shuffle_v4i16(<3 x i16> %arg0, i1 %cond) {
+; CHECK-LABEL: define <4 x i16> @shuffle_v4i16(
+; CHECK-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <4 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <4 x i16> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <4 x i16> [ %val1, %then ], [ %val2, %else ]
+  ret <4 x i16> %val3
+}
+
+define <8 x i16> @shuffle_v8i16(<3 x i16> %arg0, i1 %cond) {
+; CHECK-LABEL: define <8 x i16> @shuffle_v8i16(
+; CHECK-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <8 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <8 x i16> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <8 x i16> [ %val1, %then ], [ %val2, %else ]
+  ret <8 x i16> %val3
+}
+
+define <16 x i16> @shuffle_v16i16(<3 x i16> %arg0, i1 %cond) {
+; CHECK-LABEL: define <16 x i16> @shuffle_v16i16(
+; CHECK-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <16 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <16 x i16> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <16 x i16> [ %val1, %then ], [ %val2, %else ]
+  ret <16 x i16> %val3
+}
+
+define <32 x i16> @shuffle_v32i16(<3 x i16> %arg0, i1 %cond) {
+; CHECK-LABEL: define <32 x i16> @shuffle_v32i16(
+; CHECK-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <32 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <32 x i16> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <32 x i16> [ %val1, %then ], [ %val2, %else ]
+  ret <32 x i16> %val3
+}
+
+define <2 x i32> @shuffle_v2i32(<2 x i32> %arg0, i1 %cond) {
+; CHECK-LABEL: define <2 x i32> @shuffle_v2i32(
+; CHECK-SAME: <2 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i32> [[ARG0]], <2 x i32> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i32> [[ARG0]], <2 x i32> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <2 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <2 x i32> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <2 x i32> %arg0, <2 x i32> poison, <2 x i32> <i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <2 x i32> %arg0, <2 x i32> poison, <2 x i32> <i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <2 x i32> [ %val1, %then ], [ %val2, %else ]
+  ret <2 x i32> %val3
+}
+
+define <4 x i32> @shuffle_v4i32(<3 x i32> %arg0, i1 %cond) {
+; CHECK-LABEL: define <4 x i32> @shuffle_v4i32(
+; CHECK-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <4 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <4 x i32> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <4 x i32> [ %val1, %then ], [ %val2, %else ]
+  ret <4 x i32> %val3
+}
+
+define <8 x i32> @shuffle_v8i32(<3 x i32> %arg0, i1 %cond) {
+; CHECK-LABEL: define <8 x i32> @shuffle_v8i32(
+; CHECK-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <8 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <8 x i32> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <8 x i32> [ %val1, %then ], [ %val2, %else ]
+  ret <8 x i32> %val3
+}
+
+define <16 x i32> @shuffle_v16i32(<3 x i32> %arg0, i1 %cond) {
+; CHECK-LABEL: define <16 x i32> @shuffle_v16i32(
+; CHECK-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <16 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <16 x i32> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <16 x i32> [ %val1, %then ], [ %val2, %else ]
+  ret <16 x i32> %val3
+}
+
+define <32 x i32> @shuffle_v32i32(<3 x i32> %arg0, i1 %cond) {
+; CHECK-LABEL: define <32 x i32> @shuffle_v32i32(
+; CHECK-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <32 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <32 x i32> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <32 x i32> [ %val1, %then ], [ %val2, %else ]
+  ret <32 x i32> %val3
+}
+
+define <2 x bfloat> @shuffle_v2bf16(<2 x bfloat> %arg0, i1 %cond) {
+; CHECK-LABEL: define <2 x bfloat> @shuffle_v2bf16(
+; CHECK-SAME: <2 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <2 x bfloat> [[ARG0]], <2 x bfloat> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <2 x bfloat> [[ARG0]], <2 x bfloat> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <2 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <2 x bfloat> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <2 x bfloat> %arg0, <2 x bfloat> poison, <2 x i32> <i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <2 x bfloat> %arg0, <2 x bfloat> poison, <2 x i32> <i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <2 x bfloat> [ %val1, %then ], [ %val2, %else ]
+  ret <2 x bfloat> %val3
+}
+
+define <3 x bfloat> @shuffle_v3bf16(<3 x bfloat> %arg0, i1 %cond) {
+; CHECK-LABEL: define <3 x bfloat> @shuffle_v3bf16(
+; CHECK-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <3 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <3 x bfloat> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <3 x i32> <i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <3 x i32> <i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <3 x bfloat> [ %val1, %then ], [ %val2, %else ]
+  ret <3 x bfloat> %val3
+}
+
+define <4 x bfloat> @shuffle_v4bf16(<3 x bfloat> %arg0, i1 %cond) {
+; CHECK-LABEL: define <4 x bfloat> @shuffle_v4bf16(
+; CHECK-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <4 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <4 x bfloat> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <4 x bfloat> [ %val1, %then ], [ %val2, %else ]
+  ret <4 x bfloat> %val3
+}
+
+define <6 x bfloat> @shuffle_v6bf16(<3 x bfloat> %arg0, i1 %cond) {
+; CHECK-LABEL: define <6 x bfloat> @shuffle_v6bf16(
+; CHECK-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <6 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <6 x bfloat> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <6 x bfloat> [ %val1, %then ], [ %val2, %else ]
+  ret <6 x bfloat> %val3
+}
+
+define <8 x bfloat> @shuffle_v8bf16(<3 x bfloat> %arg0, i1 %cond) {
+; CHECK-LABEL: define <8 x bfloat> @shuffle_v8bf16(
+; CHECK-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <8 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <8 x bfloat> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <8 x bfloat> [ %val1, %then ], [ %val2, %else ]
+  ret <8 x bfloat> %val3
+}
+
+define <16 x bfloat> @shuffle_v16bf16(<3 x bfloat> %arg0, i1 %cond) {
+; CHECK-LABEL: define <16 x bfloat> @shuffle_v16bf16(
+; CHECK-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <16 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <16 x bfloat> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <16 x bfloat> [ %val1, %then ], [ %val2, %else ]
+  ret <16 x bfloat> %val3
+}
+
+define <32 x bfloat> @shuffle_v32bf16(<3 x bfloat> %arg0, i1 %cond) {
+; CHECK-LABEL: define <32 x bfloat> @shuffle_v32bf16(
+; CHECK-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <32 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <32 x bfloat> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <32 x bfloat> [ %val1, %then ], [ %val2, %else ]
+  ret <32 x bfloat> %val3
+}
+
+define <2 x half> @shuffle_v2f16(<2 x half> %arg0, i1 %cond) {
+; CHECK-LABEL: define <2 x half> @shuffle_v2f16(
+; CHECK-SAME: <2 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <2 x half> [[ARG0]], <2 x half> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <2 x half> [[ARG0]], <2 x half> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <2 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <2 x half> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <2 x half> %arg0, <2 x half> poison, <2 x i32> <i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <2 x half> %arg0, <2 x half> poison, <2 x i32> <i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <2 x half> [ %val1, %then ], [ %val2, %else ]
+  ret <2 x half> %val3
+}
+
+define <3 x half> @shuffle_v3f16(<3 x half> %arg0, i1 %cond) {
+; CHECK-LABEL: define <3 x half> @shuffle_v3f16(
+; CHECK-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <3 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <3 x half> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x half> %arg0, <3 x half> poison, <3 x i32> <i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <3 x i32> <i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <3 x half> [ %val1, %then ], [ %val2, %else ]
+  ret <3 x half> %val3
+}
+
+define <4 x half> @shuffle_v4f16(<3 x half> %arg0, i1 %cond) {
+; CHECK-LABEL: define <4 x half> @shuffle_v4f16(
+; CHECK-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <4 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <4 x half> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x half> %arg0, <3 x half> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <4 x half> [ %val1, %then ], [ %val2, %else ]
+  ret <4 x half> %val3
+}
+
+define <6 x half> @shuffle_v6f16(<3 x half> %arg0, i1 %cond) {
+; CHECK-LABEL: define <6 x half> @shuffle_v6f16(
+; CHECK-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <6 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <6 x half> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x half> %arg0, <3 x half> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <6 x half> [ %val1, %then ], [ %val2, %else ]
+  ret <6 x half> %val3
+}
+
+define <8 x half> @shuffle_v8f16(<3 x half> %arg0, i1 %cond) {
+; CHECK-LABEL: define <8 x half> @shuffle_v8f16(
+; CHECK-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <8 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <8 x half> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x half> %arg0, <3 x half> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <8 x half> [ %val1, %then ], [ %val2, %else ]
+  ret <8 x half> %val3
+}
+
+define <16 x half> @shuffle_v16f16(<3 x half> %arg0, i1 %cond) {
+; CHECK-LABEL: define <16 x half> @shuffle_v16f16(
+; CHECK-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <16 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <16 x half> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x half> %arg0, <3 x half> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <16 x half> [ %val1, %then ], [ %val2, %else ]
+  ret <16 x half> %val3
+}
+
+define <32 x half> @shuffle_v32f16(<3 x half> %arg0, i1 %cond) {
+; CHECK-LABEL: define <32 x half> @shuffle_v32f16(
+; CHECK-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <32 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <32 x half> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x half> %arg0, <3 x half> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <32 x half> [ %val1, %then ], [ %val2, %else ]
+  ret <32 x half> %val3
+}
+
+define <2 x float> @shuffle_v2f32(<2 x float> %arg0, i1 %cond) {
+; CHECK-LABEL: define <2 x float> @shuffle_v2f32(
+; CHECK-SAME: <2 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <2 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <2 x float> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <2 x float> %arg0, <2 x float> poison, <2 x i32> <i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <2 x float> %arg0, <2 x float> poison, <2 x i32> <i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <2 x float> [ %val1, %then ], [ %val2, %else ]
+  ret <2 x float> %val3
+}
+
+define <3 x float> @shuffle_v3f32(<3 x float> %arg0, i1 %cond) {
+; CHECK-LABEL: define <3 x float> @shuffle_v3f32(
+; CHECK-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <3 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <3 x float> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x float> %arg0, <3 x float> poison, <3 x i32> <i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <3 x i32> <i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <3 x float> [ %val1, %then ], [ %val2, %else ]
+  ret <3 x float> %val3
+}
+
+define <4 x float> @shuffle_v4f32(<3 x float> %arg0, i1 %cond) {
+; CHECK-LABEL: define <4 x float> @shuffle_v4f32(
+; CHECK-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <4 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <4 x float> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x float> %arg0, <3 x float> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <4 x float> [ %val1, %then ], [ %val2, %else ]
+  ret <4 x float> %val3
+}
+
+define <6 x float> @shuffle_v6f32(<3 x float> %arg0, i1 %cond) {
+; CHECK-LABEL: define <6 x float> @shuffle_v6f32(
+; CHECK-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <6 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <6 x float> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x float> %arg0, <3 x float> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <6 x float> [ %val1, %then ], [ %val2, %else ]
+  ret <6 x float> %val3
+}
+
+define <8 x float> @shuffle_v8f32(<3 x float> %arg0, i1 %cond) {
+; CHECK-LABEL: define <8 x float> @shuffle_v8f32(
+; CHECK-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <8 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <8 x float> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x float> %arg0, <3 x float> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <8 x float> [ %val1, %then ], [ %val2, %else ]
+  ret <8 x float> %val3
+}
+
+define <16 x float> @shuffle_v16f32(<3 x float> %arg0, i1 %cond) {
+; CHECK-LABEL: define <16 x float> @shuffle_v16f32(
+; CHECK-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <16 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <16 x float> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x float> %arg0, <3 x float> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <16 x float> [ %val1, %then ], [ %val2, %else ]
+  ret <16 x float> %val3
+}
+
+define <32 x float> @shuffle_v32f32(<3 x float> %arg0, i1 %cond) {
+; CHECK-LABEL: define <32 x float> @shuffle_v32f32(
+; CHECK-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <32 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <32 x float> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x float> %arg0, <3 x float> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <32 x float> [ %val1, %then ], [ %val2, %else ]
+  ret <32 x float> %val3
+}
+
+declare void @func0() local_unnamed_addr
+
+declare void @func1() local_unnamed_addr
diff --git a/llvm/test/Transforms/VectorCombine/RISCV/narrow-phi-of-shuffles.ll b/llvm/test/Transforms/VectorCombine/RISCV/narrow-phi-of-shuffles.ll
new file mode 100644
index 0000000000000..5e3b9a6a7e258
--- /dev/null
+++ b/llvm/test/Transforms/VectorCombine/RISCV/narrow-phi-of-shuffles.ll
@@ -0,0 +1,1266 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
+; RUN: opt -mtriple=riscv64 -passes=vector-combine -S %s | FileCheck %s --check-prefixes=CHECK
+
+define <2 x i8> @shuffle_v2i8(<2 x i8> %arg0, i1 %cond) {
+; CHECK-LABEL: define <2 x i8> @shuffle_v2i8(
+; CHECK-SAME: <2 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i8> [[ARG0]], <2 x i8> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i8> [[ARG0]], <2 x i8> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <2 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <2 x i8> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <2 x i8> %arg0, <2 x i8> poison, <2 x i32> <i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <2 x i8> %arg0, <2 x i8> poison, <2 x i32> <i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <2 x i8> [ %val1, %then ], [ %val2, %else ]
+  ret <2 x i8> %val3
+}
+
+define <4 x i8> @shuffle_v4i8(<3 x i8> %arg0, i1 %cond) {
+; CHECK-LABEL: define <4 x i8> @shuffle_v4i8(
+; CHECK-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <4 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <4 x i8> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <4 x i8> [ %val1, %then ], [ %val2, %else ]
+  ret <4 x i8> %val3
+}
+
+define <8 x i8> @shuffle_v8i8(<3 x i8> %arg0, i1 %cond) {
+; CHECK-LABEL: define <8 x i8> @shuffle_v8i8(
+; CHECK-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <8 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <8 x i8> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <8 x i8> [ %val1, %then ], [ %val2, %else ]
+  ret <8 x i8> %val3
+}
+
+define <16 x i8> @shuffle_v16i8(<3 x i8> %arg0, i1 %cond) {
+; CHECK-LABEL: define <16 x i8> @shuffle_v16i8(
+; CHECK-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <16 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <16 x i8> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <16 x i8> [ %val1, %then ], [ %val2, %else ]
+  ret <16 x i8> %val3
+}
+
+define <32 x i8> @shuffle_v32i8(<3 x i8> %arg0, i1 %cond) {
+; CHECK-LABEL: define <32 x i8> @shuffle_v32i8(
+; CHECK-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <32 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <32 x i8> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <32 x i8> [ %val1, %then ], [ %val2, %else ]
+  ret <32 x i8> %val3
+}
+
+define <2 x i16> @shuffle_v2i16(<2 x i16> %arg0, i1 %cond) {
+; CHECK-LABEL: define <2 x i16> @shuffle_v2i16(
+; CHECK-SAME: <2 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i16> [[ARG0]], <2 x i16> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i16> [[ARG0]], <2 x i16> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <2 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <2 x i16> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <2 x i16> %arg0, <2 x i16> poison, <2 x i32> <i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <2 x i16> %arg0, <2 x i16> poison, <2 x i32> <i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <2 x i16> [ %val1, %then ], [ %val2, %else ]
+  ret <2 x i16> %val3
+}
+
+define <4 x i16> @shuffle_v4i16(<3 x i16> %arg0, i1 %cond) {
+; CHECK-LABEL: define <4 x i16> @shuffle_v4i16(
+; CHECK-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <4 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <4 x i16> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <4 x i16> [ %val1, %then ], [ %val2, %else ]
+  ret <4 x i16> %val3
+}
+
+define <8 x i16> @shuffle_v8i16(<3 x i16> %arg0, i1 %cond) {
+; CHECK-LABEL: define <8 x i16> @shuffle_v8i16(
+; CHECK-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <8 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <8 x i16> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <8 x i16> [ %val1, %then ], [ %val2, %else ]
+  ret <8 x i16> %val3
+}
+
+define <16 x i16> @shuffle_v16i16(<3 x i16> %arg0, i1 %cond) {
+; CHECK-LABEL: define <16 x i16> @shuffle_v16i16(
+; CHECK-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <16 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <16 x i16> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <16 x i16> [ %val1, %then ], [ %val2, %else ]
+  ret <16 x i16> %val3
+}
+
+define <32 x i16> @shuffle_v32i16(<3 x i16> %arg0, i1 %cond) {
+; CHECK-LABEL: define <32 x i16> @shuffle_v32i16(
+; CHECK-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <32 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <32 x i16> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <32 x i16> [ %val1, %then ], [ %val2, %else ]
+  ret <32 x i16> %val3
+}
+
+define <2 x i32> @shuffle_v2i32(<2 x i32> %arg0, i1 %cond) {
+; CHECK-LABEL: define <2 x i32> @shuffle_v2i32(
+; CHECK-SAME: <2 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i32> [[ARG0]], <2 x i32> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i32> [[ARG0]], <2 x i32> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <2 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <2 x i32> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <2 x i32> %arg0, <2 x i32> poison, <2 x i32> <i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <2 x i32> %arg0, <2 x i32> poison, <2 x i32> <i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <2 x i32> [ %val1, %then ], [ %val2, %else ]
+  ret <2 x i32> %val3
+}
+
+define <4 x i32> @shuffle_v4i32(<3 x i32> %arg0, i1 %cond) {
+; CHECK-LABEL: define <4 x i32> @shuffle_v4i32(
+; CHECK-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <4 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <4 x i32> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <4 x i32> [ %val1, %then ], [ %val2, %else ]
+  ret <4 x i32> %val3
+}
+
+define <8 x i32> @shuffle_v8i32(<3 x i32> %arg0, i1 %cond) {
+; CHECK-LABEL: define <8 x i32> @shuffle_v8i32(
+; CHECK-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <8 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <8 x i32> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <8 x i32> [ %val1, %then ], [ %val2, %else ]
+  ret <8 x i32> %val3
+}
+
+define <16 x i32> @shuffle_v16i32(<3 x i32> %arg0, i1 %cond) {
+; CHECK-LABEL: define <16 x i32> @shuffle_v16i32(
+; CHECK-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <16 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <16 x i32> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <16 x i32> [ %val1, %then ], [ %val2, %else ]
+  ret <16 x i32> %val3
+}
+
+define <32 x i32> @shuffle_v32i32(<3 x i32> %arg0, i1 %cond) {
+; CHECK-LABEL: define <32 x i32> @shuffle_v32i32(
+; CHECK-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <32 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <32 x i32> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <32 x i32> [ %val1, %then ], [ %val2, %else ]
+  ret <32 x i32> %val3
+}
+
+define <2 x bfloat> @shuffle_v2bf16(<2 x bfloat> %arg0, i1 %cond) {
+; CHECK-LABEL: define <2 x bfloat> @shuffle_v2bf16(
+; CHECK-SAME: <2 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <2 x bfloat> [[ARG0]], <2 x bfloat> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <2 x bfloat> [[ARG0]], <2 x bfloat> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <2 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <2 x bfloat> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <2 x bfloat> %arg0, <2 x bfloat> poison, <2 x i32> <i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <2 x bfloat> %arg0, <2 x bfloat> poison, <2 x i32> <i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <2 x bfloat> [ %val1, %then ], [ %val2, %else ]
+  ret <2 x bfloat> %val3
+}
+
+define <3 x bfloat> @shuffle_v3bf16(<3 x bfloat> %arg0, i1 %cond) {
+; CHECK-LABEL: define <3 x bfloat> @shuffle_v3bf16(
+; CHECK-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <3 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <3 x bfloat> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <3 x i32> <i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <3 x i32> <i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <3 x bfloat> [ %val1, %then ], [ %val2, %else ]
+  ret <3 x bfloat> %val3
+}
+
+define <4 x bfloat> @shuffle_v4bf16(<3 x bfloat> %arg0, i1 %cond) {
+; CHECK-LABEL: define <4 x bfloat> @shuffle_v4bf16(
+; CHECK-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <4 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <4 x bfloat> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <4 x bfloat> [ %val1, %then ], [ %val2, %else ]
+  ret <4 x bfloat> %val3
+}
+
+define <6 x bfloat> @shuffle_v6bf16(<3 x bfloat> %arg0, i1 %cond) {
+; CHECK-LABEL: define <6 x bfloat> @shuffle_v6bf16(
+; CHECK-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <6 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <6 x bfloat> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <6 x bfloat> [ %val1, %then ], [ %val2, %else ]
+  ret <6 x bfloat> %val3
+}
+
+define <8 x bfloat> @shuffle_v8bf16(<3 x bfloat> %arg0, i1 %cond) {
+; CHECK-LABEL: define <8 x bfloat> @shuffle_v8bf16(
+; CHECK-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <8 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <8 x bfloat> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <8 x bfloat> [ %val1, %then ], [ %val2, %else ]
+  ret <8 x bfloat> %val3
+}
+
+define <16 x bfloat> @shuffle_v16bf16(<3 x bfloat> %arg0, i1 %cond) {
+; CHECK-LABEL: define <16 x bfloat> @shuffle_v16bf16(
+; CHECK-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <16 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <16 x bfloat> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <16 x bfloat> [ %val1, %then ], [ %val2, %else ]
+  ret <16 x bfloat> %val3
+}
+
+define <32 x bfloat> @shuffle_v32bf16(<3 x bfloat> %arg0, i1 %cond) {
+; CHECK-LABEL: define <32 x bfloat> @shuffle_v32bf16(
+; CHECK-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <32 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <32 x bfloat> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <32 x bfloat> [ %val1, %then ], [ %val2, %else ]
+  ret <32 x bfloat> %val3
+}
+
+define <2 x half> @shuffle_v2f16(<2 x half> %arg0, i1 %cond) {
+; CHECK-LABEL: define <2 x half> @shuffle_v2f16(
+; CHECK-SAME: <2 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <2 x half> [[ARG0]], <2 x half> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <2 x half> [[ARG0]], <2 x half> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <2 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <2 x half> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <2 x half> %arg0, <2 x half> poison, <2 x i32> <i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <2 x half> %arg0, <2 x half> poison, <2 x i32> <i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <2 x half> [ %val1, %then ], [ %val2, %else ]
+  ret <2 x half> %val3
+}
+
+define <3 x half> @shuffle_v3f16(<3 x half> %arg0, i1 %cond) {
+; CHECK-LABEL: define <3 x half> @shuffle_v3f16(
+; CHECK-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <3 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <3 x half> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x half> %arg0, <3 x half> poison, <3 x i32> <i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <3 x i32> <i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <3 x half> [ %val1, %then ], [ %val2, %else ]
+  ret <3 x half> %val3
+}
+
+define <4 x half> @shuffle_v4f16(<3 x half> %arg0, i1 %cond) {
+; CHECK-LABEL: define <4 x half> @shuffle_v4f16(
+; CHECK-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <4 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <4 x half> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x half> %arg0, <3 x half> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <4 x half> [ %val1, %then ], [ %val2, %else ]
+  ret <4 x half> %val3
+}
+
+define <6 x half> @shuffle_v6f16(<3 x half> %arg0, i1 %cond) {
+; CHECK-LABEL: define <6 x half> @shuffle_v6f16(
+; CHECK-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <6 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <6 x half> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x half> %arg0, <3 x half> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <6 x half> [ %val1, %then ], [ %val2, %else ]
+  ret <6 x half> %val3
+}
+
+define <8 x half> @shuffle_v8f16(<3 x half> %arg0, i1 %cond) {
+; CHECK-LABEL: define <8 x half> @shuffle_v8f16(
+; CHECK-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <8 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <8 x half> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x half> %arg0, <3 x half> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <8 x half> [ %val1, %then ], [ %val2, %else ]
+  ret <8 x half> %val3
+}
+
+define <16 x half> @shuffle_v16f16(<3 x half> %arg0, i1 %cond) {
+; CHECK-LABEL: define <16 x half> @shuffle_v16f16(
+; CHECK-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <16 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <16 x half> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x half> %arg0, <3 x half> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <16 x half> [ %val1, %then ], [ %val2, %else ]
+  ret <16 x half> %val3
+}
+
+define <32 x half> @shuffle_v32f16(<3 x half> %arg0, i1 %cond) {
+; CHECK-LABEL: define <32 x half> @shuffle_v32f16(
+; CHECK-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <32 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <32 x half> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x half> %arg0, <3 x half> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <32 x half> [ %val1, %then ], [ %val2, %else ]
+  ret <32 x half> %val3
+}
+
+define <2 x float> @shuffle_v2f32(<2 x float> %arg0, i1 %cond) {
+; CHECK-LABEL: define <2 x float> @shuffle_v2f32(
+; CHECK-SAME: <2 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <2 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <2 x float> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <2 x float> %arg0, <2 x float> poison, <2 x i32> <i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <2 x float> %arg0, <2 x float> poison, <2 x i32> <i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <2 x float> [ %val1, %then ], [ %val2, %else ]
+  ret <2 x float> %val3
+}
+
+define <3 x float> @shuffle_v3f32(<3 x float> %arg0, i1 %cond) {
+; CHECK-LABEL: define <3 x float> @shuffle_v3f32(
+; CHECK-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <3 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <3 x float> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x float> %arg0, <3 x float> poison, <3 x i32> <i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <3 x i32> <i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <3 x float> [ %val1, %then ], [ %val2, %else ]
+  ret <3 x float> %val3
+}
+
+define <4 x float> @shuffle_v4f32(<3 x float> %arg0, i1 %cond) {
+; CHECK-LABEL: define <4 x float> @shuffle_v4f32(
+; CHECK-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <4 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <4 x float> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x float> %arg0, <3 x float> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <4 x float> [ %val1, %then ], [ %val2, %else ]
+  ret <4 x float> %val3
+}
+
+define <6 x float> @shuffle_v6f32(<3 x float> %arg0, i1 %cond) {
+; CHECK-LABEL: define <6 x float> @shuffle_v6f32(
+; CHECK-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <6 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <6 x float> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x float> %arg0, <3 x float> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <6 x float> [ %val1, %then ], [ %val2, %else ]
+  ret <6 x float> %val3
+}
+
+define <8 x float> @shuffle_v8f32(<3 x float> %arg0, i1 %cond) {
+; CHECK-LABEL: define <8 x float> @shuffle_v8f32(
+; CHECK-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <8 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <8 x float> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x float> %arg0, <3 x float> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <8 x float> [ %val1, %then ], [ %val2, %else ]
+  ret <8 x float> %val3
+}
+
+define <16 x float> @shuffle_v16f32(<3 x float> %arg0, i1 %cond) {
+; CHECK-LABEL: define <16 x float> @shuffle_v16f32(
+; CHECK-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <16 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <16 x float> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x float> %arg0, <3 x float> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <16 x float> [ %val1, %then ], [ %val2, %else ]
+  ret <16 x float> %val3
+}
+
+define <32 x float> @shuffle_v32f32(<3 x float> %arg0, i1 %cond) {
+; CHECK-LABEL: define <32 x float> @shuffle_v32f32(
+; CHECK-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <32 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <32 x float> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x float> %arg0, <3 x float> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <32 x float> [ %val1, %then ], [ %val2, %else ]
+  ret <32 x float> %val3
+}
+
+declare void @func0() local_unnamed_addr
+
+declare void @func1() local_unnamed_addr
diff --git a/llvm/test/Transforms/VectorCombine/X86/narrow-phi-of-shuffles.ll b/llvm/test/Transforms/VectorCombine/X86/narrow-phi-of-shuffles.ll
new file mode 100644
index 0000000000000..22a4ae42c8597
--- /dev/null
+++ b/llvm/test/Transforms/VectorCombine/X86/narrow-phi-of-shuffles.ll
@@ -0,0 +1,2997 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
+; RUN: opt -mtriple=x86_64-- -mcpu=x86-64 -passes=vector-combine -S %s | FileCheck %s --check-prefixes=CHECK-V1
+; RUN: opt -mtriple=x86_64-- -mcpu=x86-64-v2 -passes=vector-combine -S %s | FileCheck %s --check-prefixes=CHECK-V2
+; RUN: opt -mtriple=x86_64-- -mcpu=x86-64-v3 -passes=vector-combine -S %s | FileCheck %s --check-prefixes=CHECK-V3
+; RUN: opt -mtriple=x86_64-- -mcpu=x86-64-v4 -passes=vector-combine -S %s | FileCheck %s --check-prefixes=CHECK-V4
+
+define <2 x i8> @shuffle_v2i8(<2 x i8> %arg0, i1 %cond) {
+; CHECK-V1-LABEL: define <2 x i8> @shuffle_v2i8(
+; CHECK-V1-SAME: <2 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0:[0-9]+]] {
+; CHECK-V1-NEXT:  [[ENTRY:.*:]]
+; CHECK-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V1:       [[THEN]]:
+; CHECK-V1-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i8> [[ARG0]], <2 x i8> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-V1-NEXT:    tail call void @func0()
+; CHECK-V1-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V1:       [[ELSE]]:
+; CHECK-V1-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i8> [[ARG0]], <2 x i8> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-V1-NEXT:    tail call void @func1()
+; CHECK-V1-NEXT:    br label %[[FINALLY]]
+; CHECK-V1:       [[FINALLY]]:
+; CHECK-V1-NEXT:    [[VAL3:%.*]] = phi <2 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V1-NEXT:    ret <2 x i8> [[VAL3]]
+;
+; CHECK-V2-LABEL: define <2 x i8> @shuffle_v2i8(
+; CHECK-V2-SAME: <2 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0:[0-9]+]] {
+; CHECK-V2-NEXT:  [[ENTRY:.*:]]
+; CHECK-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V2:       [[THEN]]:
+; CHECK-V2-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i8> [[ARG0]], <2 x i8> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-V2-NEXT:    tail call void @func0()
+; CHECK-V2-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V2:       [[ELSE]]:
+; CHECK-V2-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i8> [[ARG0]], <2 x i8> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-V2-NEXT:    tail call void @func1()
+; CHECK-V2-NEXT:    br label %[[FINALLY]]
+; CHECK-V2:       [[FINALLY]]:
+; CHECK-V2-NEXT:    [[VAL3:%.*]] = phi <2 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V2-NEXT:    ret <2 x i8> [[VAL3]]
+;
+; CHECK-V3-LABEL: define <2 x i8> @shuffle_v2i8(
+; CHECK-V3-SAME: <2 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0:[0-9]+]] {
+; CHECK-V3-NEXT:  [[ENTRY:.*:]]
+; CHECK-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V3:       [[THEN]]:
+; CHECK-V3-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i8> [[ARG0]], <2 x i8> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-V3-NEXT:    tail call void @func0()
+; CHECK-V3-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V3:       [[ELSE]]:
+; CHECK-V3-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i8> [[ARG0]], <2 x i8> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-V3-NEXT:    tail call void @func1()
+; CHECK-V3-NEXT:    br label %[[FINALLY]]
+; CHECK-V3:       [[FINALLY]]:
+; CHECK-V3-NEXT:    [[VAL3:%.*]] = phi <2 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V3-NEXT:    ret <2 x i8> [[VAL3]]
+;
+; CHECK-V4-LABEL: define <2 x i8> @shuffle_v2i8(
+; CHECK-V4-SAME: <2 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0:[0-9]+]] {
+; CHECK-V4-NEXT:  [[ENTRY:.*:]]
+; CHECK-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V4:       [[THEN]]:
+; CHECK-V4-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i8> [[ARG0]], <2 x i8> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-V4-NEXT:    tail call void @func0()
+; CHECK-V4-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V4:       [[ELSE]]:
+; CHECK-V4-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i8> [[ARG0]], <2 x i8> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-V4-NEXT:    tail call void @func1()
+; CHECK-V4-NEXT:    br label %[[FINALLY]]
+; CHECK-V4:       [[FINALLY]]:
+; CHECK-V4-NEXT:    [[VAL3:%.*]] = phi <2 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V4-NEXT:    ret <2 x i8> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <2 x i8> %arg0, <2 x i8> poison, <2 x i32> <i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <2 x i8> %arg0, <2 x i8> poison, <2 x i32> <i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <2 x i8> [ %val1, %then ], [ %val2, %else ]
+  ret <2 x i8> %val3
+}
+
+define <4 x i8> @shuffle_v4i8(<3 x i8> %arg0, i1 %cond) {
+; CHECK-V1-LABEL: define <4 x i8> @shuffle_v4i8(
+; CHECK-V1-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V1-NEXT:  [[ENTRY:.*:]]
+; CHECK-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V1:       [[THEN]]:
+; CHECK-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-V1-NEXT:    tail call void @func0()
+; CHECK-V1-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V1:       [[ELSE]]:
+; CHECK-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-V1-NEXT:    tail call void @func1()
+; CHECK-V1-NEXT:    br label %[[FINALLY]]
+; CHECK-V1:       [[FINALLY]]:
+; CHECK-V1-NEXT:    [[VAL3:%.*]] = phi <4 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V1-NEXT:    ret <4 x i8> [[VAL3]]
+;
+; CHECK-V2-LABEL: define <4 x i8> @shuffle_v4i8(
+; CHECK-V2-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V2-NEXT:  [[ENTRY:.*:]]
+; CHECK-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V2:       [[THEN]]:
+; CHECK-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-V2-NEXT:    tail call void @func0()
+; CHECK-V2-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V2:       [[ELSE]]:
+; CHECK-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-V2-NEXT:    tail call void @func1()
+; CHECK-V2-NEXT:    br label %[[FINALLY]]
+; CHECK-V2:       [[FINALLY]]:
+; CHECK-V2-NEXT:    [[VAL3:%.*]] = phi <4 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V2-NEXT:    ret <4 x i8> [[VAL3]]
+;
+; CHECK-V3-LABEL: define <4 x i8> @shuffle_v4i8(
+; CHECK-V3-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V3-NEXT:  [[ENTRY:.*:]]
+; CHECK-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V3:       [[THEN]]:
+; CHECK-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-V3-NEXT:    tail call void @func0()
+; CHECK-V3-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V3:       [[ELSE]]:
+; CHECK-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-V3-NEXT:    tail call void @func1()
+; CHECK-V3-NEXT:    br label %[[FINALLY]]
+; CHECK-V3:       [[FINALLY]]:
+; CHECK-V3-NEXT:    [[VAL3:%.*]] = phi <4 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V3-NEXT:    ret <4 x i8> [[VAL3]]
+;
+; CHECK-V4-LABEL: define <4 x i8> @shuffle_v4i8(
+; CHECK-V4-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V4-NEXT:  [[ENTRY:.*:]]
+; CHECK-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V4:       [[THEN]]:
+; CHECK-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-V4-NEXT:    tail call void @func0()
+; CHECK-V4-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V4:       [[ELSE]]:
+; CHECK-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-V4-NEXT:    tail call void @func1()
+; CHECK-V4-NEXT:    br label %[[FINALLY]]
+; CHECK-V4:       [[FINALLY]]:
+; CHECK-V4-NEXT:    [[VAL3:%.*]] = phi <4 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V4-NEXT:    ret <4 x i8> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <4 x i8> [ %val1, %then ], [ %val2, %else ]
+  ret <4 x i8> %val3
+}
+
+define <8 x i8> @shuffle_v8i8(<3 x i8> %arg0, i1 %cond) {
+; CHECK-V1-LABEL: define <8 x i8> @shuffle_v8i8(
+; CHECK-V1-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V1-NEXT:  [[ENTRY:.*:]]
+; CHECK-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V1:       [[THEN]]:
+; CHECK-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V1-NEXT:    tail call void @func0()
+; CHECK-V1-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V1:       [[ELSE]]:
+; CHECK-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V1-NEXT:    tail call void @func1()
+; CHECK-V1-NEXT:    br label %[[FINALLY]]
+; CHECK-V1:       [[FINALLY]]:
+; CHECK-V1-NEXT:    [[VAL3:%.*]] = phi <8 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V1-NEXT:    ret <8 x i8> [[VAL3]]
+;
+; CHECK-V2-LABEL: define <8 x i8> @shuffle_v8i8(
+; CHECK-V2-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V2-NEXT:  [[ENTRY:.*:]]
+; CHECK-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V2:       [[THEN]]:
+; CHECK-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V2-NEXT:    tail call void @func0()
+; CHECK-V2-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V2:       [[ELSE]]:
+; CHECK-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V2-NEXT:    tail call void @func1()
+; CHECK-V2-NEXT:    br label %[[FINALLY]]
+; CHECK-V2:       [[FINALLY]]:
+; CHECK-V2-NEXT:    [[VAL3:%.*]] = phi <8 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V2-NEXT:    ret <8 x i8> [[VAL3]]
+;
+; CHECK-V3-LABEL: define <8 x i8> @shuffle_v8i8(
+; CHECK-V3-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V3-NEXT:  [[ENTRY:.*:]]
+; CHECK-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V3:       [[THEN]]:
+; CHECK-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V3-NEXT:    tail call void @func0()
+; CHECK-V3-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V3:       [[ELSE]]:
+; CHECK-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V3-NEXT:    tail call void @func1()
+; CHECK-V3-NEXT:    br label %[[FINALLY]]
+; CHECK-V3:       [[FINALLY]]:
+; CHECK-V3-NEXT:    [[VAL3:%.*]] = phi <8 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V3-NEXT:    ret <8 x i8> [[VAL3]]
+;
+; CHECK-V4-LABEL: define <8 x i8> @shuffle_v8i8(
+; CHECK-V4-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V4-NEXT:  [[ENTRY:.*:]]
+; CHECK-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V4:       [[THEN]]:
+; CHECK-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V4-NEXT:    tail call void @func0()
+; CHECK-V4-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V4:       [[ELSE]]:
+; CHECK-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V4-NEXT:    tail call void @func1()
+; CHECK-V4-NEXT:    br label %[[FINALLY]]
+; CHECK-V4:       [[FINALLY]]:
+; CHECK-V4-NEXT:    [[VAL3:%.*]] = phi <8 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V4-NEXT:    ret <8 x i8> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <8 x i8> [ %val1, %then ], [ %val2, %else ]
+  ret <8 x i8> %val3
+}
+
+define <16 x i8> @shuffle_v16i8(<3 x i8> %arg0, i1 %cond) {
+; CHECK-V1-LABEL: define <16 x i8> @shuffle_v16i8(
+; CHECK-V1-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V1-NEXT:  [[ENTRY:.*:]]
+; CHECK-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V1:       [[THEN]]:
+; CHECK-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V1-NEXT:    tail call void @func0()
+; CHECK-V1-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V1:       [[ELSE]]:
+; CHECK-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V1-NEXT:    tail call void @func1()
+; CHECK-V1-NEXT:    br label %[[FINALLY]]
+; CHECK-V1:       [[FINALLY]]:
+; CHECK-V1-NEXT:    [[VAL3:%.*]] = phi <16 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V1-NEXT:    ret <16 x i8> [[VAL3]]
+;
+; CHECK-V2-LABEL: define <16 x i8> @shuffle_v16i8(
+; CHECK-V2-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V2-NEXT:  [[ENTRY:.*:]]
+; CHECK-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V2:       [[THEN]]:
+; CHECK-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V2-NEXT:    tail call void @func0()
+; CHECK-V2-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V2:       [[ELSE]]:
+; CHECK-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V2-NEXT:    tail call void @func1()
+; CHECK-V2-NEXT:    br label %[[FINALLY]]
+; CHECK-V2:       [[FINALLY]]:
+; CHECK-V2-NEXT:    [[VAL3:%.*]] = phi <16 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V2-NEXT:    ret <16 x i8> [[VAL3]]
+;
+; CHECK-V3-LABEL: define <16 x i8> @shuffle_v16i8(
+; CHECK-V3-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V3-NEXT:  [[ENTRY:.*:]]
+; CHECK-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V3:       [[THEN]]:
+; CHECK-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V3-NEXT:    tail call void @func0()
+; CHECK-V3-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V3:       [[ELSE]]:
+; CHECK-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V3-NEXT:    tail call void @func1()
+; CHECK-V3-NEXT:    br label %[[FINALLY]]
+; CHECK-V3:       [[FINALLY]]:
+; CHECK-V3-NEXT:    [[VAL3:%.*]] = phi <16 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V3-NEXT:    ret <16 x i8> [[VAL3]]
+;
+; CHECK-V4-LABEL: define <16 x i8> @shuffle_v16i8(
+; CHECK-V4-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V4-NEXT:  [[ENTRY:.*:]]
+; CHECK-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V4:       [[THEN]]:
+; CHECK-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V4-NEXT:    tail call void @func0()
+; CHECK-V4-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V4:       [[ELSE]]:
+; CHECK-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V4-NEXT:    tail call void @func1()
+; CHECK-V4-NEXT:    br label %[[FINALLY]]
+; CHECK-V4:       [[FINALLY]]:
+; CHECK-V4-NEXT:    [[VAL3:%.*]] = phi <16 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V4-NEXT:    ret <16 x i8> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <16 x i8> [ %val1, %then ], [ %val2, %else ]
+  ret <16 x i8> %val3
+}
+
+define <32 x i8> @shuffle_v32i8(<3 x i8> %arg0, i1 %cond) {
+; CHECK-V1-LABEL: define <32 x i8> @shuffle_v32i8(
+; CHECK-V1-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V1-NEXT:  [[ENTRY:.*:]]
+; CHECK-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V1:       [[THEN]]:
+; CHECK-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V1-NEXT:    tail call void @func0()
+; CHECK-V1-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V1:       [[ELSE]]:
+; CHECK-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V1-NEXT:    tail call void @func1()
+; CHECK-V1-NEXT:    br label %[[FINALLY]]
+; CHECK-V1:       [[FINALLY]]:
+; CHECK-V1-NEXT:    [[VAL3:%.*]] = phi <32 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V1-NEXT:    ret <32 x i8> [[VAL3]]
+;
+; CHECK-V2-LABEL: define <32 x i8> @shuffle_v32i8(
+; CHECK-V2-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V2-NEXT:  [[ENTRY:.*:]]
+; CHECK-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V2:       [[THEN]]:
+; CHECK-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V2-NEXT:    tail call void @func0()
+; CHECK-V2-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V2:       [[ELSE]]:
+; CHECK-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V2-NEXT:    tail call void @func1()
+; CHECK-V2-NEXT:    br label %[[FINALLY]]
+; CHECK-V2:       [[FINALLY]]:
+; CHECK-V2-NEXT:    [[VAL3:%.*]] = phi <32 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V2-NEXT:    ret <32 x i8> [[VAL3]]
+;
+; CHECK-V3-LABEL: define <32 x i8> @shuffle_v32i8(
+; CHECK-V3-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V3-NEXT:  [[ENTRY:.*:]]
+; CHECK-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V3:       [[THEN]]:
+; CHECK-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V3-NEXT:    tail call void @func0()
+; CHECK-V3-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V3:       [[ELSE]]:
+; CHECK-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V3-NEXT:    tail call void @func1()
+; CHECK-V3-NEXT:    br label %[[FINALLY]]
+; CHECK-V3:       [[FINALLY]]:
+; CHECK-V3-NEXT:    [[VAL3:%.*]] = phi <32 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V3-NEXT:    ret <32 x i8> [[VAL3]]
+;
+; CHECK-V4-LABEL: define <32 x i8> @shuffle_v32i8(
+; CHECK-V4-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V4-NEXT:  [[ENTRY:.*:]]
+; CHECK-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V4:       [[THEN]]:
+; CHECK-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V4-NEXT:    tail call void @func0()
+; CHECK-V4-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V4:       [[ELSE]]:
+; CHECK-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V4-NEXT:    tail call void @func1()
+; CHECK-V4-NEXT:    br label %[[FINALLY]]
+; CHECK-V4:       [[FINALLY]]:
+; CHECK-V4-NEXT:    [[VAL3:%.*]] = phi <32 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V4-NEXT:    ret <32 x i8> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <32 x i8> [ %val1, %then ], [ %val2, %else ]
+  ret <32 x i8> %val3
+}
+
+define <2 x i16> @shuffle_v2i16(<2 x i16> %arg0, i1 %cond) {
+; CHECK-V1-LABEL: define <2 x i16> @shuffle_v2i16(
+; CHECK-V1-SAME: <2 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V1-NEXT:  [[ENTRY:.*:]]
+; CHECK-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V1:       [[THEN]]:
+; CHECK-V1-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i16> [[ARG0]], <2 x i16> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-V1-NEXT:    tail call void @func0()
+; CHECK-V1-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V1:       [[ELSE]]:
+; CHECK-V1-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i16> [[ARG0]], <2 x i16> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-V1-NEXT:    tail call void @func1()
+; CHECK-V1-NEXT:    br label %[[FINALLY]]
+; CHECK-V1:       [[FINALLY]]:
+; CHECK-V1-NEXT:    [[VAL3:%.*]] = phi <2 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V1-NEXT:    ret <2 x i16> [[VAL3]]
+;
+; CHECK-V2-LABEL: define <2 x i16> @shuffle_v2i16(
+; CHECK-V2-SAME: <2 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V2-NEXT:  [[ENTRY:.*:]]
+; CHECK-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V2:       [[THEN]]:
+; CHECK-V2-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i16> [[ARG0]], <2 x i16> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-V2-NEXT:    tail call void @func0()
+; CHECK-V2-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V2:       [[ELSE]]:
+; CHECK-V2-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i16> [[ARG0]], <2 x i16> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-V2-NEXT:    tail call void @func1()
+; CHECK-V2-NEXT:    br label %[[FINALLY]]
+; CHECK-V2:       [[FINALLY]]:
+; CHECK-V2-NEXT:    [[VAL3:%.*]] = phi <2 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V2-NEXT:    ret <2 x i16> [[VAL3]]
+;
+; CHECK-V3-LABEL: define <2 x i16> @shuffle_v2i16(
+; CHECK-V3-SAME: <2 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V3-NEXT:  [[ENTRY:.*:]]
+; CHECK-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V3:       [[THEN]]:
+; CHECK-V3-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i16> [[ARG0]], <2 x i16> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-V3-NEXT:    tail call void @func0()
+; CHECK-V3-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V3:       [[ELSE]]:
+; CHECK-V3-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i16> [[ARG0]], <2 x i16> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-V3-NEXT:    tail call void @func1()
+; CHECK-V3-NEXT:    br label %[[FINALLY]]
+; CHECK-V3:       [[FINALLY]]:
+; CHECK-V3-NEXT:    [[VAL3:%.*]] = phi <2 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V3-NEXT:    ret <2 x i16> [[VAL3]]
+;
+; CHECK-V4-LABEL: define <2 x i16> @shuffle_v2i16(
+; CHECK-V4-SAME: <2 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V4-NEXT:  [[ENTRY:.*:]]
+; CHECK-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V4:       [[THEN]]:
+; CHECK-V4-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i16> [[ARG0]], <2 x i16> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-V4-NEXT:    tail call void @func0()
+; CHECK-V4-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V4:       [[ELSE]]:
+; CHECK-V4-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i16> [[ARG0]], <2 x i16> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-V4-NEXT:    tail call void @func1()
+; CHECK-V4-NEXT:    br label %[[FINALLY]]
+; CHECK-V4:       [[FINALLY]]:
+; CHECK-V4-NEXT:    [[VAL3:%.*]] = phi <2 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V4-NEXT:    ret <2 x i16> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <2 x i16> %arg0, <2 x i16> poison, <2 x i32> <i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <2 x i16> %arg0, <2 x i16> poison, <2 x i32> <i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <2 x i16> [ %val1, %then ], [ %val2, %else ]
+  ret <2 x i16> %val3
+}
+
+define <4 x i16> @shuffle_v4i16(<3 x i16> %arg0, i1 %cond) {
+; CHECK-V1-LABEL: define <4 x i16> @shuffle_v4i16(
+; CHECK-V1-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V1-NEXT:  [[ENTRY:.*:]]
+; CHECK-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V1:       [[THEN]]:
+; CHECK-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-V1-NEXT:    tail call void @func0()
+; CHECK-V1-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V1:       [[ELSE]]:
+; CHECK-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-V1-NEXT:    tail call void @func1()
+; CHECK-V1-NEXT:    br label %[[FINALLY]]
+; CHECK-V1:       [[FINALLY]]:
+; CHECK-V1-NEXT:    [[VAL3:%.*]] = phi <4 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V1-NEXT:    ret <4 x i16> [[VAL3]]
+;
+; CHECK-V2-LABEL: define <4 x i16> @shuffle_v4i16(
+; CHECK-V2-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V2-NEXT:  [[ENTRY:.*:]]
+; CHECK-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V2:       [[THEN]]:
+; CHECK-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-V2-NEXT:    tail call void @func0()
+; CHECK-V2-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V2:       [[ELSE]]:
+; CHECK-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-V2-NEXT:    tail call void @func1()
+; CHECK-V2-NEXT:    br label %[[FINALLY]]
+; CHECK-V2:       [[FINALLY]]:
+; CHECK-V2-NEXT:    [[VAL3:%.*]] = phi <4 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V2-NEXT:    ret <4 x i16> [[VAL3]]
+;
+; CHECK-V3-LABEL: define <4 x i16> @shuffle_v4i16(
+; CHECK-V3-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V3-NEXT:  [[ENTRY:.*:]]
+; CHECK-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V3:       [[THEN]]:
+; CHECK-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-V3-NEXT:    tail call void @func0()
+; CHECK-V3-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V3:       [[ELSE]]:
+; CHECK-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-V3-NEXT:    tail call void @func1()
+; CHECK-V3-NEXT:    br label %[[FINALLY]]
+; CHECK-V3:       [[FINALLY]]:
+; CHECK-V3-NEXT:    [[VAL3:%.*]] = phi <4 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V3-NEXT:    ret <4 x i16> [[VAL3]]
+;
+; CHECK-V4-LABEL: define <4 x i16> @shuffle_v4i16(
+; CHECK-V4-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V4-NEXT:  [[ENTRY:.*:]]
+; CHECK-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V4:       [[THEN]]:
+; CHECK-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-V4-NEXT:    tail call void @func0()
+; CHECK-V4-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V4:       [[ELSE]]:
+; CHECK-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-V4-NEXT:    tail call void @func1()
+; CHECK-V4-NEXT:    br label %[[FINALLY]]
+; CHECK-V4:       [[FINALLY]]:
+; CHECK-V4-NEXT:    [[VAL3:%.*]] = phi <4 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V4-NEXT:    ret <4 x i16> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <4 x i16> [ %val1, %then ], [ %val2, %else ]
+  ret <4 x i16> %val3
+}
+
+define <8 x i16> @shuffle_v8i16(<3 x i16> %arg0, i1 %cond) {
+; CHECK-V1-LABEL: define <8 x i16> @shuffle_v8i16(
+; CHECK-V1-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V1-NEXT:  [[ENTRY:.*:]]
+; CHECK-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V1:       [[THEN]]:
+; CHECK-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V1-NEXT:    tail call void @func0()
+; CHECK-V1-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V1:       [[ELSE]]:
+; CHECK-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V1-NEXT:    tail call void @func1()
+; CHECK-V1-NEXT:    br label %[[FINALLY]]
+; CHECK-V1:       [[FINALLY]]:
+; CHECK-V1-NEXT:    [[VAL3:%.*]] = phi <8 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V1-NEXT:    ret <8 x i16> [[VAL3]]
+;
+; CHECK-V2-LABEL: define <8 x i16> @shuffle_v8i16(
+; CHECK-V2-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V2-NEXT:  [[ENTRY:.*:]]
+; CHECK-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V2:       [[THEN]]:
+; CHECK-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V2-NEXT:    tail call void @func0()
+; CHECK-V2-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V2:       [[ELSE]]:
+; CHECK-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V2-NEXT:    tail call void @func1()
+; CHECK-V2-NEXT:    br label %[[FINALLY]]
+; CHECK-V2:       [[FINALLY]]:
+; CHECK-V2-NEXT:    [[VAL3:%.*]] = phi <8 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V2-NEXT:    ret <8 x i16> [[VAL3]]
+;
+; CHECK-V3-LABEL: define <8 x i16> @shuffle_v8i16(
+; CHECK-V3-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V3-NEXT:  [[ENTRY:.*:]]
+; CHECK-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V3:       [[THEN]]:
+; CHECK-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V3-NEXT:    tail call void @func0()
+; CHECK-V3-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V3:       [[ELSE]]:
+; CHECK-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V3-NEXT:    tail call void @func1()
+; CHECK-V3-NEXT:    br label %[[FINALLY]]
+; CHECK-V3:       [[FINALLY]]:
+; CHECK-V3-NEXT:    [[VAL3:%.*]] = phi <8 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V3-NEXT:    ret <8 x i16> [[VAL3]]
+;
+; CHECK-V4-LABEL: define <8 x i16> @shuffle_v8i16(
+; CHECK-V4-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V4-NEXT:  [[ENTRY:.*:]]
+; CHECK-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V4:       [[THEN]]:
+; CHECK-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V4-NEXT:    tail call void @func0()
+; CHECK-V4-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V4:       [[ELSE]]:
+; CHECK-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V4-NEXT:    tail call void @func1()
+; CHECK-V4-NEXT:    br label %[[FINALLY]]
+; CHECK-V4:       [[FINALLY]]:
+; CHECK-V4-NEXT:    [[VAL3:%.*]] = phi <8 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V4-NEXT:    ret <8 x i16> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <8 x i16> [ %val1, %then ], [ %val2, %else ]
+  ret <8 x i16> %val3
+}
+
+define <16 x i16> @shuffle_v16i16(<3 x i16> %arg0, i1 %cond) {
+; CHECK-V1-LABEL: define <16 x i16> @shuffle_v16i16(
+; CHECK-V1-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V1-NEXT:  [[ENTRY:.*:]]
+; CHECK-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V1:       [[THEN]]:
+; CHECK-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V1-NEXT:    tail call void @func0()
+; CHECK-V1-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V1:       [[ELSE]]:
+; CHECK-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V1-NEXT:    tail call void @func1()
+; CHECK-V1-NEXT:    br label %[[FINALLY]]
+; CHECK-V1:       [[FINALLY]]:
+; CHECK-V1-NEXT:    [[VAL3:%.*]] = phi <16 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V1-NEXT:    ret <16 x i16> [[VAL3]]
+;
+; CHECK-V2-LABEL: define <16 x i16> @shuffle_v16i16(
+; CHECK-V2-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V2-NEXT:  [[ENTRY:.*:]]
+; CHECK-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V2:       [[THEN]]:
+; CHECK-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V2-NEXT:    tail call void @func0()
+; CHECK-V2-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V2:       [[ELSE]]:
+; CHECK-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V2-NEXT:    tail call void @func1()
+; CHECK-V2-NEXT:    br label %[[FINALLY]]
+; CHECK-V2:       [[FINALLY]]:
+; CHECK-V2-NEXT:    [[VAL3:%.*]] = phi <16 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V2-NEXT:    ret <16 x i16> [[VAL3]]
+;
+; CHECK-V3-LABEL: define <16 x i16> @shuffle_v16i16(
+; CHECK-V3-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V3-NEXT:  [[ENTRY:.*:]]
+; CHECK-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V3:       [[THEN]]:
+; CHECK-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V3-NEXT:    tail call void @func0()
+; CHECK-V3-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V3:       [[ELSE]]:
+; CHECK-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V3-NEXT:    tail call void @func1()
+; CHECK-V3-NEXT:    br label %[[FINALLY]]
+; CHECK-V3:       [[FINALLY]]:
+; CHECK-V3-NEXT:    [[VAL3:%.*]] = phi <16 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V3-NEXT:    ret <16 x i16> [[VAL3]]
+;
+; CHECK-V4-LABEL: define <16 x i16> @shuffle_v16i16(
+; CHECK-V4-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V4-NEXT:  [[ENTRY:.*:]]
+; CHECK-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V4:       [[THEN]]:
+; CHECK-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V4-NEXT:    tail call void @func0()
+; CHECK-V4-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V4:       [[ELSE]]:
+; CHECK-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V4-NEXT:    tail call void @func1()
+; CHECK-V4-NEXT:    br label %[[FINALLY]]
+; CHECK-V4:       [[FINALLY]]:
+; CHECK-V4-NEXT:    [[VAL3:%.*]] = phi <16 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V4-NEXT:    ret <16 x i16> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <16 x i16> [ %val1, %then ], [ %val2, %else ]
+  ret <16 x i16> %val3
+}
+
+define <32 x i16> @shuffle_v32i16(<3 x i16> %arg0, i1 %cond) {
+; CHECK-V1-LABEL: define <32 x i16> @shuffle_v32i16(
+; CHECK-V1-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V1-NEXT:  [[ENTRY:.*:]]
+; CHECK-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V1:       [[THEN]]:
+; CHECK-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V1-NEXT:    tail call void @func0()
+; CHECK-V1-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V1:       [[ELSE]]:
+; CHECK-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V1-NEXT:    tail call void @func1()
+; CHECK-V1-NEXT:    br label %[[FINALLY]]
+; CHECK-V1:       [[FINALLY]]:
+; CHECK-V1-NEXT:    [[VAL3:%.*]] = phi <32 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V1-NEXT:    ret <32 x i16> [[VAL3]]
+;
+; CHECK-V2-LABEL: define <32 x i16> @shuffle_v32i16(
+; CHECK-V2-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V2-NEXT:  [[ENTRY:.*:]]
+; CHECK-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V2:       [[THEN]]:
+; CHECK-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V2-NEXT:    tail call void @func0()
+; CHECK-V2-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V2:       [[ELSE]]:
+; CHECK-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V2-NEXT:    tail call void @func1()
+; CHECK-V2-NEXT:    br label %[[FINALLY]]
+; CHECK-V2:       [[FINALLY]]:
+; CHECK-V2-NEXT:    [[VAL3:%.*]] = phi <32 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V2-NEXT:    ret <32 x i16> [[VAL3]]
+;
+; CHECK-V3-LABEL: define <32 x i16> @shuffle_v32i16(
+; CHECK-V3-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V3-NEXT:  [[ENTRY:.*:]]
+; CHECK-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V3:       [[THEN]]:
+; CHECK-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V3-NEXT:    tail call void @func0()
+; CHECK-V3-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V3:       [[ELSE]]:
+; CHECK-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V3-NEXT:    tail call void @func1()
+; CHECK-V3-NEXT:    br label %[[FINALLY]]
+; CHECK-V3:       [[FINALLY]]:
+; CHECK-V3-NEXT:    [[VAL3:%.*]] = phi <32 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V3-NEXT:    ret <32 x i16> [[VAL3]]
+;
+; CHECK-V4-LABEL: define <32 x i16> @shuffle_v32i16(
+; CHECK-V4-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V4-NEXT:  [[ENTRY:.*:]]
+; CHECK-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V4:       [[THEN]]:
+; CHECK-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V4-NEXT:    tail call void @func0()
+; CHECK-V4-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V4:       [[ELSE]]:
+; CHECK-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V4-NEXT:    tail call void @func1()
+; CHECK-V4-NEXT:    br label %[[FINALLY]]
+; CHECK-V4:       [[FINALLY]]:
+; CHECK-V4-NEXT:    [[VAL3:%.*]] = phi <32 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V4-NEXT:    ret <32 x i16> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <32 x i16> [ %val1, %then ], [ %val2, %else ]
+  ret <32 x i16> %val3
+}
+
+define <2 x i32> @shuffle_v2i32(<2 x i32> %arg0, i1 %cond) {
+; CHECK-V1-LABEL: define <2 x i32> @shuffle_v2i32(
+; CHECK-V1-SAME: <2 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V1-NEXT:  [[ENTRY:.*:]]
+; CHECK-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V1:       [[THEN]]:
+; CHECK-V1-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i32> [[ARG0]], <2 x i32> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-V1-NEXT:    tail call void @func0()
+; CHECK-V1-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V1:       [[ELSE]]:
+; CHECK-V1-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i32> [[ARG0]], <2 x i32> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-V1-NEXT:    tail call void @func1()
+; CHECK-V1-NEXT:    br label %[[FINALLY]]
+; CHECK-V1:       [[FINALLY]]:
+; CHECK-V1-NEXT:    [[VAL3:%.*]] = phi <2 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V1-NEXT:    ret <2 x i32> [[VAL3]]
+;
+; CHECK-V2-LABEL: define <2 x i32> @shuffle_v2i32(
+; CHECK-V2-SAME: <2 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V2-NEXT:  [[ENTRY:.*:]]
+; CHECK-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V2:       [[THEN]]:
+; CHECK-V2-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i32> [[ARG0]], <2 x i32> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-V2-NEXT:    tail call void @func0()
+; CHECK-V2-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V2:       [[ELSE]]:
+; CHECK-V2-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i32> [[ARG0]], <2 x i32> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-V2-NEXT:    tail call void @func1()
+; CHECK-V2-NEXT:    br label %[[FINALLY]]
+; CHECK-V2:       [[FINALLY]]:
+; CHECK-V2-NEXT:    [[VAL3:%.*]] = phi <2 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V2-NEXT:    ret <2 x i32> [[VAL3]]
+;
+; CHECK-V3-LABEL: define <2 x i32> @shuffle_v2i32(
+; CHECK-V3-SAME: <2 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V3-NEXT:  [[ENTRY:.*:]]
+; CHECK-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V3:       [[THEN]]:
+; CHECK-V3-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i32> [[ARG0]], <2 x i32> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-V3-NEXT:    tail call void @func0()
+; CHECK-V3-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V3:       [[ELSE]]:
+; CHECK-V3-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i32> [[ARG0]], <2 x i32> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-V3-NEXT:    tail call void @func1()
+; CHECK-V3-NEXT:    br label %[[FINALLY]]
+; CHECK-V3:       [[FINALLY]]:
+; CHECK-V3-NEXT:    [[VAL3:%.*]] = phi <2 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V3-NEXT:    ret <2 x i32> [[VAL3]]
+;
+; CHECK-V4-LABEL: define <2 x i32> @shuffle_v2i32(
+; CHECK-V4-SAME: <2 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V4-NEXT:  [[ENTRY:.*:]]
+; CHECK-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V4:       [[THEN]]:
+; CHECK-V4-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i32> [[ARG0]], <2 x i32> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-V4-NEXT:    tail call void @func0()
+; CHECK-V4-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V4:       [[ELSE]]:
+; CHECK-V4-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i32> [[ARG0]], <2 x i32> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-V4-NEXT:    tail call void @func1()
+; CHECK-V4-NEXT:    br label %[[FINALLY]]
+; CHECK-V4:       [[FINALLY]]:
+; CHECK-V4-NEXT:    [[VAL3:%.*]] = phi <2 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V4-NEXT:    ret <2 x i32> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <2 x i32> %arg0, <2 x i32> poison, <2 x i32> <i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <2 x i32> %arg0, <2 x i32> poison, <2 x i32> <i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <2 x i32> [ %val1, %then ], [ %val2, %else ]
+  ret <2 x i32> %val3
+}
+
+define <4 x i32> @shuffle_v4i32(<3 x i32> %arg0, i1 %cond) {
+; CHECK-V1-LABEL: define <4 x i32> @shuffle_v4i32(
+; CHECK-V1-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V1-NEXT:  [[ENTRY:.*:]]
+; CHECK-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V1:       [[THEN]]:
+; CHECK-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-V1-NEXT:    tail call void @func0()
+; CHECK-V1-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V1:       [[ELSE]]:
+; CHECK-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-V1-NEXT:    tail call void @func1()
+; CHECK-V1-NEXT:    br label %[[FINALLY]]
+; CHECK-V1:       [[FINALLY]]:
+; CHECK-V1-NEXT:    [[VAL3:%.*]] = phi <4 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V1-NEXT:    ret <4 x i32> [[VAL3]]
+;
+; CHECK-V2-LABEL: define <4 x i32> @shuffle_v4i32(
+; CHECK-V2-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V2-NEXT:  [[ENTRY:.*:]]
+; CHECK-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V2:       [[THEN]]:
+; CHECK-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-V2-NEXT:    tail call void @func0()
+; CHECK-V2-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V2:       [[ELSE]]:
+; CHECK-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-V2-NEXT:    tail call void @func1()
+; CHECK-V2-NEXT:    br label %[[FINALLY]]
+; CHECK-V2:       [[FINALLY]]:
+; CHECK-V2-NEXT:    [[VAL3:%.*]] = phi <4 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V2-NEXT:    ret <4 x i32> [[VAL3]]
+;
+; CHECK-V3-LABEL: define <4 x i32> @shuffle_v4i32(
+; CHECK-V3-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V3-NEXT:  [[ENTRY:.*:]]
+; CHECK-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V3:       [[THEN]]:
+; CHECK-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-V3-NEXT:    tail call void @func0()
+; CHECK-V3-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V3:       [[ELSE]]:
+; CHECK-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-V3-NEXT:    tail call void @func1()
+; CHECK-V3-NEXT:    br label %[[FINALLY]]
+; CHECK-V3:       [[FINALLY]]:
+; CHECK-V3-NEXT:    [[VAL3:%.*]] = phi <4 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V3-NEXT:    ret <4 x i32> [[VAL3]]
+;
+; CHECK-V4-LABEL: define <4 x i32> @shuffle_v4i32(
+; CHECK-V4-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V4-NEXT:  [[ENTRY:.*:]]
+; CHECK-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V4:       [[THEN]]:
+; CHECK-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-V4-NEXT:    tail call void @func0()
+; CHECK-V4-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V4:       [[ELSE]]:
+; CHECK-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-V4-NEXT:    tail call void @func1()
+; CHECK-V4-NEXT:    br label %[[FINALLY]]
+; CHECK-V4:       [[FINALLY]]:
+; CHECK-V4-NEXT:    [[VAL3:%.*]] = phi <4 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V4-NEXT:    ret <4 x i32> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <4 x i32> [ %val1, %then ], [ %val2, %else ]
+  ret <4 x i32> %val3
+}
+
+define <8 x i32> @shuffle_v8i32(<3 x i32> %arg0, i1 %cond) {
+; CHECK-V1-LABEL: define <8 x i32> @shuffle_v8i32(
+; CHECK-V1-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V1-NEXT:  [[ENTRY:.*:]]
+; CHECK-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V1:       [[THEN]]:
+; CHECK-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V1-NEXT:    tail call void @func0()
+; CHECK-V1-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V1:       [[ELSE]]:
+; CHECK-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V1-NEXT:    tail call void @func1()
+; CHECK-V1-NEXT:    br label %[[FINALLY]]
+; CHECK-V1:       [[FINALLY]]:
+; CHECK-V1-NEXT:    [[VAL3:%.*]] = phi <8 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V1-NEXT:    ret <8 x i32> [[VAL3]]
+;
+; CHECK-V2-LABEL: define <8 x i32> @shuffle_v8i32(
+; CHECK-V2-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V2-NEXT:  [[ENTRY:.*:]]
+; CHECK-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V2:       [[THEN]]:
+; CHECK-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V2-NEXT:    tail call void @func0()
+; CHECK-V2-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V2:       [[ELSE]]:
+; CHECK-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V2-NEXT:    tail call void @func1()
+; CHECK-V2-NEXT:    br label %[[FINALLY]]
+; CHECK-V2:       [[FINALLY]]:
+; CHECK-V2-NEXT:    [[VAL3:%.*]] = phi <8 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V2-NEXT:    ret <8 x i32> [[VAL3]]
+;
+; CHECK-V3-LABEL: define <8 x i32> @shuffle_v8i32(
+; CHECK-V3-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V3-NEXT:  [[ENTRY:.*:]]
+; CHECK-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V3:       [[THEN]]:
+; CHECK-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V3-NEXT:    tail call void @func0()
+; CHECK-V3-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V3:       [[ELSE]]:
+; CHECK-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V3-NEXT:    tail call void @func1()
+; CHECK-V3-NEXT:    br label %[[FINALLY]]
+; CHECK-V3:       [[FINALLY]]:
+; CHECK-V3-NEXT:    [[VAL3:%.*]] = phi <8 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V3-NEXT:    ret <8 x i32> [[VAL3]]
+;
+; CHECK-V4-LABEL: define <8 x i32> @shuffle_v8i32(
+; CHECK-V4-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V4-NEXT:  [[ENTRY:.*:]]
+; CHECK-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V4:       [[THEN]]:
+; CHECK-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V4-NEXT:    tail call void @func0()
+; CHECK-V4-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V4:       [[ELSE]]:
+; CHECK-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V4-NEXT:    tail call void @func1()
+; CHECK-V4-NEXT:    br label %[[FINALLY]]
+; CHECK-V4:       [[FINALLY]]:
+; CHECK-V4-NEXT:    [[VAL3:%.*]] = phi <8 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V4-NEXT:    ret <8 x i32> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <8 x i32> [ %val1, %then ], [ %val2, %else ]
+  ret <8 x i32> %val3
+}
+
+define <16 x i32> @shuffle_v16i32(<3 x i32> %arg0, i1 %cond) {
+; CHECK-V1-LABEL: define <16 x i32> @shuffle_v16i32(
+; CHECK-V1-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V1-NEXT:  [[ENTRY:.*:]]
+; CHECK-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V1:       [[THEN]]:
+; CHECK-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V1-NEXT:    tail call void @func0()
+; CHECK-V1-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V1:       [[ELSE]]:
+; CHECK-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V1-NEXT:    tail call void @func1()
+; CHECK-V1-NEXT:    br label %[[FINALLY]]
+; CHECK-V1:       [[FINALLY]]:
+; CHECK-V1-NEXT:    [[VAL3:%.*]] = phi <16 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V1-NEXT:    ret <16 x i32> [[VAL3]]
+;
+; CHECK-V2-LABEL: define <16 x i32> @shuffle_v16i32(
+; CHECK-V2-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V2-NEXT:  [[ENTRY:.*:]]
+; CHECK-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V2:       [[THEN]]:
+; CHECK-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V2-NEXT:    tail call void @func0()
+; CHECK-V2-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V2:       [[ELSE]]:
+; CHECK-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V2-NEXT:    tail call void @func1()
+; CHECK-V2-NEXT:    br label %[[FINALLY]]
+; CHECK-V2:       [[FINALLY]]:
+; CHECK-V2-NEXT:    [[VAL3:%.*]] = phi <16 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V2-NEXT:    ret <16 x i32> [[VAL3]]
+;
+; CHECK-V3-LABEL: define <16 x i32> @shuffle_v16i32(
+; CHECK-V3-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V3-NEXT:  [[ENTRY:.*:]]
+; CHECK-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V3:       [[THEN]]:
+; CHECK-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V3-NEXT:    tail call void @func0()
+; CHECK-V3-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V3:       [[ELSE]]:
+; CHECK-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V3-NEXT:    tail call void @func1()
+; CHECK-V3-NEXT:    br label %[[FINALLY]]
+; CHECK-V3:       [[FINALLY]]:
+; CHECK-V3-NEXT:    [[VAL3:%.*]] = phi <16 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V3-NEXT:    ret <16 x i32> [[VAL3]]
+;
+; CHECK-V4-LABEL: define <16 x i32> @shuffle_v16i32(
+; CHECK-V4-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V4-NEXT:  [[ENTRY:.*:]]
+; CHECK-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V4:       [[THEN]]:
+; CHECK-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V4-NEXT:    tail call void @func0()
+; CHECK-V4-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V4:       [[ELSE]]:
+; CHECK-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V4-NEXT:    tail call void @func1()
+; CHECK-V4-NEXT:    br label %[[FINALLY]]
+; CHECK-V4:       [[FINALLY]]:
+; CHECK-V4-NEXT:    [[VAL3:%.*]] = phi <16 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V4-NEXT:    ret <16 x i32> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <16 x i32> [ %val1, %then ], [ %val2, %else ]
+  ret <16 x i32> %val3
+}
+
+define <32 x i32> @shuffle_v32i32(<3 x i32> %arg0, i1 %cond) {
+; CHECK-V1-LABEL: define <32 x i32> @shuffle_v32i32(
+; CHECK-V1-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V1-NEXT:  [[ENTRY:.*:]]
+; CHECK-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V1:       [[THEN]]:
+; CHECK-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V1-NEXT:    tail call void @func0()
+; CHECK-V1-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V1:       [[ELSE]]:
+; CHECK-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V1-NEXT:    tail call void @func1()
+; CHECK-V1-NEXT:    br label %[[FINALLY]]
+; CHECK-V1:       [[FINALLY]]:
+; CHECK-V1-NEXT:    [[VAL3:%.*]] = phi <32 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V1-NEXT:    ret <32 x i32> [[VAL3]]
+;
+; CHECK-V2-LABEL: define <32 x i32> @shuffle_v32i32(
+; CHECK-V2-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V2-NEXT:  [[ENTRY:.*:]]
+; CHECK-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V2:       [[THEN]]:
+; CHECK-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V2-NEXT:    tail call void @func0()
+; CHECK-V2-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V2:       [[ELSE]]:
+; CHECK-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V2-NEXT:    tail call void @func1()
+; CHECK-V2-NEXT:    br label %[[FINALLY]]
+; CHECK-V2:       [[FINALLY]]:
+; CHECK-V2-NEXT:    [[VAL3:%.*]] = phi <32 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V2-NEXT:    ret <32 x i32> [[VAL3]]
+;
+; CHECK-V3-LABEL: define <32 x i32> @shuffle_v32i32(
+; CHECK-V3-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V3-NEXT:  [[ENTRY:.*:]]
+; CHECK-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V3:       [[THEN]]:
+; CHECK-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V3-NEXT:    tail call void @func0()
+; CHECK-V3-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V3:       [[ELSE]]:
+; CHECK-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V3-NEXT:    tail call void @func1()
+; CHECK-V3-NEXT:    br label %[[FINALLY]]
+; CHECK-V3:       [[FINALLY]]:
+; CHECK-V3-NEXT:    [[VAL3:%.*]] = phi <32 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V3-NEXT:    ret <32 x i32> [[VAL3]]
+;
+; CHECK-V4-LABEL: define <32 x i32> @shuffle_v32i32(
+; CHECK-V4-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V4-NEXT:  [[ENTRY:.*:]]
+; CHECK-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V4:       [[THEN]]:
+; CHECK-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V4-NEXT:    tail call void @func0()
+; CHECK-V4-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V4:       [[ELSE]]:
+; CHECK-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V4-NEXT:    tail call void @func1()
+; CHECK-V4-NEXT:    br label %[[FINALLY]]
+; CHECK-V4:       [[FINALLY]]:
+; CHECK-V4-NEXT:    [[VAL3:%.*]] = phi <32 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V4-NEXT:    ret <32 x i32> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <32 x i32> [ %val1, %then ], [ %val2, %else ]
+  ret <32 x i32> %val3
+}
+
+define <2 x bfloat> @shuffle_v2bf16(<2 x bfloat> %arg0, i1 %cond) {
+; CHECK-V1-LABEL: define <2 x bfloat> @shuffle_v2bf16(
+; CHECK-V1-SAME: <2 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V1-NEXT:  [[ENTRY:.*:]]
+; CHECK-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V1:       [[THEN]]:
+; CHECK-V1-NEXT:    [[VAL1:%.*]] = shufflevector <2 x bfloat> [[ARG0]], <2 x bfloat> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-V1-NEXT:    tail call void @func0()
+; CHECK-V1-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V1:       [[ELSE]]:
+; CHECK-V1-NEXT:    [[VAL2:%.*]] = shufflevector <2 x bfloat> [[ARG0]], <2 x bfloat> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-V1-NEXT:    tail call void @func1()
+; CHECK-V1-NEXT:    br label %[[FINALLY]]
+; CHECK-V1:       [[FINALLY]]:
+; CHECK-V1-NEXT:    [[VAL3:%.*]] = phi <2 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V1-NEXT:    ret <2 x bfloat> [[VAL3]]
+;
+; CHECK-V2-LABEL: define <2 x bfloat> @shuffle_v2bf16(
+; CHECK-V2-SAME: <2 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V2-NEXT:  [[ENTRY:.*:]]
+; CHECK-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V2:       [[THEN]]:
+; CHECK-V2-NEXT:    [[VAL1:%.*]] = shufflevector <2 x bfloat> [[ARG0]], <2 x bfloat> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-V2-NEXT:    tail call void @func0()
+; CHECK-V2-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V2:       [[ELSE]]:
+; CHECK-V2-NEXT:    [[VAL2:%.*]] = shufflevector <2 x bfloat> [[ARG0]], <2 x bfloat> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-V2-NEXT:    tail call void @func1()
+; CHECK-V2-NEXT:    br label %[[FINALLY]]
+; CHECK-V2:       [[FINALLY]]:
+; CHECK-V2-NEXT:    [[VAL3:%.*]] = phi <2 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V2-NEXT:    ret <2 x bfloat> [[VAL3]]
+;
+; CHECK-V3-LABEL: define <2 x bfloat> @shuffle_v2bf16(
+; CHECK-V3-SAME: <2 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V3-NEXT:  [[ENTRY:.*:]]
+; CHECK-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V3:       [[THEN]]:
+; CHECK-V3-NEXT:    [[VAL1:%.*]] = shufflevector <2 x bfloat> [[ARG0]], <2 x bfloat> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-V3-NEXT:    tail call void @func0()
+; CHECK-V3-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V3:       [[ELSE]]:
+; CHECK-V3-NEXT:    [[VAL2:%.*]] = shufflevector <2 x bfloat> [[ARG0]], <2 x bfloat> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-V3-NEXT:    tail call void @func1()
+; CHECK-V3-NEXT:    br label %[[FINALLY]]
+; CHECK-V3:       [[FINALLY]]:
+; CHECK-V3-NEXT:    [[VAL3:%.*]] = phi <2 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V3-NEXT:    ret <2 x bfloat> [[VAL3]]
+;
+; CHECK-V4-LABEL: define <2 x bfloat> @shuffle_v2bf16(
+; CHECK-V4-SAME: <2 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V4-NEXT:  [[ENTRY:.*:]]
+; CHECK-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V4:       [[THEN]]:
+; CHECK-V4-NEXT:    [[VAL1:%.*]] = shufflevector <2 x bfloat> [[ARG0]], <2 x bfloat> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-V4-NEXT:    tail call void @func0()
+; CHECK-V4-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V4:       [[ELSE]]:
+; CHECK-V4-NEXT:    [[VAL2:%.*]] = shufflevector <2 x bfloat> [[ARG0]], <2 x bfloat> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-V4-NEXT:    tail call void @func1()
+; CHECK-V4-NEXT:    br label %[[FINALLY]]
+; CHECK-V4:       [[FINALLY]]:
+; CHECK-V4-NEXT:    [[VAL3:%.*]] = phi <2 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V4-NEXT:    ret <2 x bfloat> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <2 x bfloat> %arg0, <2 x bfloat> poison, <2 x i32> <i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <2 x bfloat> %arg0, <2 x bfloat> poison, <2 x i32> <i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <2 x bfloat> [ %val1, %then ], [ %val2, %else ]
+  ret <2 x bfloat> %val3
+}
+
+define <3 x bfloat> @shuffle_v3bf16(<3 x bfloat> %arg0, i1 %cond) {
+; CHECK-V1-LABEL: define <3 x bfloat> @shuffle_v3bf16(
+; CHECK-V1-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V1-NEXT:  [[ENTRY:.*:]]
+; CHECK-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V1:       [[THEN]]:
+; CHECK-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 1, i32 1>
+; CHECK-V1-NEXT:    tail call void @func0()
+; CHECK-V1-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V1:       [[ELSE]]:
+; CHECK-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 2, i32 2, i32 2>
+; CHECK-V1-NEXT:    tail call void @func1()
+; CHECK-V1-NEXT:    br label %[[FINALLY]]
+; CHECK-V1:       [[FINALLY]]:
+; CHECK-V1-NEXT:    [[VAL3:%.*]] = phi <3 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V1-NEXT:    ret <3 x bfloat> [[VAL3]]
+;
+; CHECK-V2-LABEL: define <3 x bfloat> @shuffle_v3bf16(
+; CHECK-V2-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V2-NEXT:  [[ENTRY:.*:]]
+; CHECK-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V2:       [[THEN]]:
+; CHECK-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 1, i32 1>
+; CHECK-V2-NEXT:    tail call void @func0()
+; CHECK-V2-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V2:       [[ELSE]]:
+; CHECK-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 2, i32 2, i32 2>
+; CHECK-V2-NEXT:    tail call void @func1()
+; CHECK-V2-NEXT:    br label %[[FINALLY]]
+; CHECK-V2:       [[FINALLY]]:
+; CHECK-V2-NEXT:    [[VAL3:%.*]] = phi <3 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V2-NEXT:    ret <3 x bfloat> [[VAL3]]
+;
+; CHECK-V3-LABEL: define <3 x bfloat> @shuffle_v3bf16(
+; CHECK-V3-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V3-NEXT:  [[ENTRY:.*:]]
+; CHECK-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V3:       [[THEN]]:
+; CHECK-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 1, i32 1>
+; CHECK-V3-NEXT:    tail call void @func0()
+; CHECK-V3-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V3:       [[ELSE]]:
+; CHECK-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 2, i32 2, i32 2>
+; CHECK-V3-NEXT:    tail call void @func1()
+; CHECK-V3-NEXT:    br label %[[FINALLY]]
+; CHECK-V3:       [[FINALLY]]:
+; CHECK-V3-NEXT:    [[VAL3:%.*]] = phi <3 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V3-NEXT:    ret <3 x bfloat> [[VAL3]]
+;
+; CHECK-V4-LABEL: define <3 x bfloat> @shuffle_v3bf16(
+; CHECK-V4-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V4-NEXT:  [[ENTRY:.*:]]
+; CHECK-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V4:       [[THEN]]:
+; CHECK-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 1, i32 1>
+; CHECK-V4-NEXT:    tail call void @func0()
+; CHECK-V4-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V4:       [[ELSE]]:
+; CHECK-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 2, i32 2, i32 2>
+; CHECK-V4-NEXT:    tail call void @func1()
+; CHECK-V4-NEXT:    br label %[[FINALLY]]
+; CHECK-V4:       [[FINALLY]]:
+; CHECK-V4-NEXT:    [[VAL3:%.*]] = phi <3 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V4-NEXT:    ret <3 x bfloat> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <3 x i32> <i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <3 x i32> <i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <3 x bfloat> [ %val1, %then ], [ %val2, %else ]
+  ret <3 x bfloat> %val3
+}
+
+define <4 x bfloat> @shuffle_v4bf16(<3 x bfloat> %arg0, i1 %cond) {
+; CHECK-V1-LABEL: define <4 x bfloat> @shuffle_v4bf16(
+; CHECK-V1-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V1-NEXT:  [[ENTRY:.*:]]
+; CHECK-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V1:       [[THEN]]:
+; CHECK-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-V1-NEXT:    tail call void @func0()
+; CHECK-V1-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V1:       [[ELSE]]:
+; CHECK-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-V1-NEXT:    tail call void @func1()
+; CHECK-V1-NEXT:    br label %[[FINALLY]]
+; CHECK-V1:       [[FINALLY]]:
+; CHECK-V1-NEXT:    [[VAL3:%.*]] = phi <4 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V1-NEXT:    ret <4 x bfloat> [[VAL3]]
+;
+; CHECK-V2-LABEL: define <4 x bfloat> @shuffle_v4bf16(
+; CHECK-V2-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V2-NEXT:  [[ENTRY:.*:]]
+; CHECK-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V2:       [[THEN]]:
+; CHECK-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-V2-NEXT:    tail call void @func0()
+; CHECK-V2-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V2:       [[ELSE]]:
+; CHECK-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-V2-NEXT:    tail call void @func1()
+; CHECK-V2-NEXT:    br label %[[FINALLY]]
+; CHECK-V2:       [[FINALLY]]:
+; CHECK-V2-NEXT:    [[VAL3:%.*]] = phi <4 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V2-NEXT:    ret <4 x bfloat> [[VAL3]]
+;
+; CHECK-V3-LABEL: define <4 x bfloat> @shuffle_v4bf16(
+; CHECK-V3-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V3-NEXT:  [[ENTRY:.*:]]
+; CHECK-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V3:       [[THEN]]:
+; CHECK-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-V3-NEXT:    tail call void @func0()
+; CHECK-V3-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V3:       [[ELSE]]:
+; CHECK-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-V3-NEXT:    tail call void @func1()
+; CHECK-V3-NEXT:    br label %[[FINALLY]]
+; CHECK-V3:       [[FINALLY]]:
+; CHECK-V3-NEXT:    [[VAL3:%.*]] = phi <4 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V3-NEXT:    ret <4 x bfloat> [[VAL3]]
+;
+; CHECK-V4-LABEL: define <4 x bfloat> @shuffle_v4bf16(
+; CHECK-V4-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V4-NEXT:  [[ENTRY:.*:]]
+; CHECK-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V4:       [[THEN]]:
+; CHECK-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-V4-NEXT:    tail call void @func0()
+; CHECK-V4-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V4:       [[ELSE]]:
+; CHECK-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-V4-NEXT:    tail call void @func1()
+; CHECK-V4-NEXT:    br label %[[FINALLY]]
+; CHECK-V4:       [[FINALLY]]:
+; CHECK-V4-NEXT:    [[VAL3:%.*]] = phi <4 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V4-NEXT:    ret <4 x bfloat> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <4 x bfloat> [ %val1, %then ], [ %val2, %else ]
+  ret <4 x bfloat> %val3
+}
+
+define <6 x bfloat> @shuffle_v6bf16(<3 x bfloat> %arg0, i1 %cond) {
+; CHECK-V1-LABEL: define <6 x bfloat> @shuffle_v6bf16(
+; CHECK-V1-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V1-NEXT:  [[ENTRY:.*:]]
+; CHECK-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V1:       [[THEN]]:
+; CHECK-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V1-NEXT:    tail call void @func0()
+; CHECK-V1-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V1:       [[ELSE]]:
+; CHECK-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V1-NEXT:    tail call void @func1()
+; CHECK-V1-NEXT:    br label %[[FINALLY]]
+; CHECK-V1:       [[FINALLY]]:
+; CHECK-V1-NEXT:    [[VAL3:%.*]] = phi <6 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V1-NEXT:    ret <6 x bfloat> [[VAL3]]
+;
+; CHECK-V2-LABEL: define <6 x bfloat> @shuffle_v6bf16(
+; CHECK-V2-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V2-NEXT:  [[ENTRY:.*:]]
+; CHECK-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V2:       [[THEN]]:
+; CHECK-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V2-NEXT:    tail call void @func0()
+; CHECK-V2-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V2:       [[ELSE]]:
+; CHECK-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V2-NEXT:    tail call void @func1()
+; CHECK-V2-NEXT:    br label %[[FINALLY]]
+; CHECK-V2:       [[FINALLY]]:
+; CHECK-V2-NEXT:    [[VAL3:%.*]] = phi <6 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V2-NEXT:    ret <6 x bfloat> [[VAL3]]
+;
+; CHECK-V3-LABEL: define <6 x bfloat> @shuffle_v6bf16(
+; CHECK-V3-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V3-NEXT:  [[ENTRY:.*:]]
+; CHECK-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V3:       [[THEN]]:
+; CHECK-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V3-NEXT:    tail call void @func0()
+; CHECK-V3-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V3:       [[ELSE]]:
+; CHECK-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V3-NEXT:    tail call void @func1()
+; CHECK-V3-NEXT:    br label %[[FINALLY]]
+; CHECK-V3:       [[FINALLY]]:
+; CHECK-V3-NEXT:    [[VAL3:%.*]] = phi <6 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V3-NEXT:    ret <6 x bfloat> [[VAL3]]
+;
+; CHECK-V4-LABEL: define <6 x bfloat> @shuffle_v6bf16(
+; CHECK-V4-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V4-NEXT:  [[ENTRY:.*:]]
+; CHECK-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V4:       [[THEN]]:
+; CHECK-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V4-NEXT:    tail call void @func0()
+; CHECK-V4-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V4:       [[ELSE]]:
+; CHECK-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V4-NEXT:    tail call void @func1()
+; CHECK-V4-NEXT:    br label %[[FINALLY]]
+; CHECK-V4:       [[FINALLY]]:
+; CHECK-V4-NEXT:    [[VAL3:%.*]] = phi <6 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V4-NEXT:    ret <6 x bfloat> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <6 x bfloat> [ %val1, %then ], [ %val2, %else ]
+  ret <6 x bfloat> %val3
+}
+
+define <8 x bfloat> @shuffle_v8bf16(<3 x bfloat> %arg0, i1 %cond) {
+; CHECK-V1-LABEL: define <8 x bfloat> @shuffle_v8bf16(
+; CHECK-V1-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V1-NEXT:  [[ENTRY:.*:]]
+; CHECK-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V1:       [[THEN]]:
+; CHECK-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V1-NEXT:    tail call void @func0()
+; CHECK-V1-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V1:       [[ELSE]]:
+; CHECK-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V1-NEXT:    tail call void @func1()
+; CHECK-V1-NEXT:    br label %[[FINALLY]]
+; CHECK-V1:       [[FINALLY]]:
+; CHECK-V1-NEXT:    [[VAL3:%.*]] = phi <8 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V1-NEXT:    ret <8 x bfloat> [[VAL3]]
+;
+; CHECK-V2-LABEL: define <8 x bfloat> @shuffle_v8bf16(
+; CHECK-V2-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V2-NEXT:  [[ENTRY:.*:]]
+; CHECK-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V2:       [[THEN]]:
+; CHECK-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V2-NEXT:    tail call void @func0()
+; CHECK-V2-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V2:       [[ELSE]]:
+; CHECK-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V2-NEXT:    tail call void @func1()
+; CHECK-V2-NEXT:    br label %[[FINALLY]]
+; CHECK-V2:       [[FINALLY]]:
+; CHECK-V2-NEXT:    [[VAL3:%.*]] = phi <8 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V2-NEXT:    ret <8 x bfloat> [[VAL3]]
+;
+; CHECK-V3-LABEL: define <8 x bfloat> @shuffle_v8bf16(
+; CHECK-V3-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V3-NEXT:  [[ENTRY:.*:]]
+; CHECK-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V3:       [[THEN]]:
+; CHECK-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V3-NEXT:    tail call void @func0()
+; CHECK-V3-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V3:       [[ELSE]]:
+; CHECK-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V3-NEXT:    tail call void @func1()
+; CHECK-V3-NEXT:    br label %[[FINALLY]]
+; CHECK-V3:       [[FINALLY]]:
+; CHECK-V3-NEXT:    [[VAL3:%.*]] = phi <8 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V3-NEXT:    ret <8 x bfloat> [[VAL3]]
+;
+; CHECK-V4-LABEL: define <8 x bfloat> @shuffle_v8bf16(
+; CHECK-V4-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V4-NEXT:  [[ENTRY:.*:]]
+; CHECK-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V4:       [[THEN]]:
+; CHECK-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V4-NEXT:    tail call void @func0()
+; CHECK-V4-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V4:       [[ELSE]]:
+; CHECK-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V4-NEXT:    tail call void @func1()
+; CHECK-V4-NEXT:    br label %[[FINALLY]]
+; CHECK-V4:       [[FINALLY]]:
+; CHECK-V4-NEXT:    [[VAL3:%.*]] = phi <8 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V4-NEXT:    ret <8 x bfloat> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <8 x bfloat> [ %val1, %then ], [ %val2, %else ]
+  ret <8 x bfloat> %val3
+}
+
+define <16 x bfloat> @shuffle_v16bf16(<3 x bfloat> %arg0, i1 %cond) {
+; CHECK-V1-LABEL: define <16 x bfloat> @shuffle_v16bf16(
+; CHECK-V1-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V1-NEXT:  [[ENTRY:.*:]]
+; CHECK-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V1:       [[THEN]]:
+; CHECK-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V1-NEXT:    tail call void @func0()
+; CHECK-V1-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V1:       [[ELSE]]:
+; CHECK-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V1-NEXT:    tail call void @func1()
+; CHECK-V1-NEXT:    br label %[[FINALLY]]
+; CHECK-V1:       [[FINALLY]]:
+; CHECK-V1-NEXT:    [[VAL3:%.*]] = phi <16 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V1-NEXT:    ret <16 x bfloat> [[VAL3]]
+;
+; CHECK-V2-LABEL: define <16 x bfloat> @shuffle_v16bf16(
+; CHECK-V2-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V2-NEXT:  [[ENTRY:.*:]]
+; CHECK-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V2:       [[THEN]]:
+; CHECK-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V2-NEXT:    tail call void @func0()
+; CHECK-V2-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V2:       [[ELSE]]:
+; CHECK-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V2-NEXT:    tail call void @func1()
+; CHECK-V2-NEXT:    br label %[[FINALLY]]
+; CHECK-V2:       [[FINALLY]]:
+; CHECK-V2-NEXT:    [[VAL3:%.*]] = phi <16 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V2-NEXT:    ret <16 x bfloat> [[VAL3]]
+;
+; CHECK-V3-LABEL: define <16 x bfloat> @shuffle_v16bf16(
+; CHECK-V3-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V3-NEXT:  [[ENTRY:.*:]]
+; CHECK-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V3:       [[THEN]]:
+; CHECK-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V3-NEXT:    tail call void @func0()
+; CHECK-V3-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V3:       [[ELSE]]:
+; CHECK-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V3-NEXT:    tail call void @func1()
+; CHECK-V3-NEXT:    br label %[[FINALLY]]
+; CHECK-V3:       [[FINALLY]]:
+; CHECK-V3-NEXT:    [[VAL3:%.*]] = phi <16 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V3-NEXT:    ret <16 x bfloat> [[VAL3]]
+;
+; CHECK-V4-LABEL: define <16 x bfloat> @shuffle_v16bf16(
+; CHECK-V4-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V4-NEXT:  [[ENTRY:.*:]]
+; CHECK-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V4:       [[THEN]]:
+; CHECK-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V4-NEXT:    tail call void @func0()
+; CHECK-V4-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V4:       [[ELSE]]:
+; CHECK-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V4-NEXT:    tail call void @func1()
+; CHECK-V4-NEXT:    br label %[[FINALLY]]
+; CHECK-V4:       [[FINALLY]]:
+; CHECK-V4-NEXT:    [[VAL3:%.*]] = phi <16 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V4-NEXT:    ret <16 x bfloat> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <16 x bfloat> [ %val1, %then ], [ %val2, %else ]
+  ret <16 x bfloat> %val3
+}
+
+define <32 x bfloat> @shuffle_v32bf16(<3 x bfloat> %arg0, i1 %cond) {
+; CHECK-V1-LABEL: define <32 x bfloat> @shuffle_v32bf16(
+; CHECK-V1-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V1-NEXT:  [[ENTRY:.*:]]
+; CHECK-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V1:       [[THEN]]:
+; CHECK-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V1-NEXT:    tail call void @func0()
+; CHECK-V1-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V1:       [[ELSE]]:
+; CHECK-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V1-NEXT:    tail call void @func1()
+; CHECK-V1-NEXT:    br label %[[FINALLY]]
+; CHECK-V1:       [[FINALLY]]:
+; CHECK-V1-NEXT:    [[VAL3:%.*]] = phi <32 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V1-NEXT:    ret <32 x bfloat> [[VAL3]]
+;
+; CHECK-V2-LABEL: define <32 x bfloat> @shuffle_v32bf16(
+; CHECK-V2-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V2-NEXT:  [[ENTRY:.*:]]
+; CHECK-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V2:       [[THEN]]:
+; CHECK-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V2-NEXT:    tail call void @func0()
+; CHECK-V2-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V2:       [[ELSE]]:
+; CHECK-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V2-NEXT:    tail call void @func1()
+; CHECK-V2-NEXT:    br label %[[FINALLY]]
+; CHECK-V2:       [[FINALLY]]:
+; CHECK-V2-NEXT:    [[VAL3:%.*]] = phi <32 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V2-NEXT:    ret <32 x bfloat> [[VAL3]]
+;
+; CHECK-V3-LABEL: define <32 x bfloat> @shuffle_v32bf16(
+; CHECK-V3-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V3-NEXT:  [[ENTRY:.*:]]
+; CHECK-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V3:       [[THEN]]:
+; CHECK-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V3-NEXT:    tail call void @func0()
+; CHECK-V3-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V3:       [[ELSE]]:
+; CHECK-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V3-NEXT:    tail call void @func1()
+; CHECK-V3-NEXT:    br label %[[FINALLY]]
+; CHECK-V3:       [[FINALLY]]:
+; CHECK-V3-NEXT:    [[VAL3:%.*]] = phi <32 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V3-NEXT:    ret <32 x bfloat> [[VAL3]]
+;
+; CHECK-V4-LABEL: define <32 x bfloat> @shuffle_v32bf16(
+; CHECK-V4-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V4-NEXT:  [[ENTRY:.*:]]
+; CHECK-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V4:       [[THEN]]:
+; CHECK-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V4-NEXT:    tail call void @func0()
+; CHECK-V4-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V4:       [[ELSE]]:
+; CHECK-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V4-NEXT:    tail call void @func1()
+; CHECK-V4-NEXT:    br label %[[FINALLY]]
+; CHECK-V4:       [[FINALLY]]:
+; CHECK-V4-NEXT:    [[VAL3:%.*]] = phi <32 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V4-NEXT:    ret <32 x bfloat> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <32 x bfloat> [ %val1, %then ], [ %val2, %else ]
+  ret <32 x bfloat> %val3
+}
+
+define <2 x half> @shuffle_v2f16(<2 x half> %arg0, i1 %cond) {
+; CHECK-V1-LABEL: define <2 x half> @shuffle_v2f16(
+; CHECK-V1-SAME: <2 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V1-NEXT:  [[ENTRY:.*:]]
+; CHECK-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V1:       [[THEN]]:
+; CHECK-V1-NEXT:    [[VAL1:%.*]] = shufflevector <2 x half> [[ARG0]], <2 x half> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-V1-NEXT:    tail call void @func0()
+; CHECK-V1-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V1:       [[ELSE]]:
+; CHECK-V1-NEXT:    [[VAL2:%.*]] = shufflevector <2 x half> [[ARG0]], <2 x half> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-V1-NEXT:    tail call void @func1()
+; CHECK-V1-NEXT:    br label %[[FINALLY]]
+; CHECK-V1:       [[FINALLY]]:
+; CHECK-V1-NEXT:    [[VAL3:%.*]] = phi <2 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V1-NEXT:    ret <2 x half> [[VAL3]]
+;
+; CHECK-V2-LABEL: define <2 x half> @shuffle_v2f16(
+; CHECK-V2-SAME: <2 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V2-NEXT:  [[ENTRY:.*:]]
+; CHECK-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V2:       [[THEN]]:
+; CHECK-V2-NEXT:    [[VAL1:%.*]] = shufflevector <2 x half> [[ARG0]], <2 x half> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-V2-NEXT:    tail call void @func0()
+; CHECK-V2-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V2:       [[ELSE]]:
+; CHECK-V2-NEXT:    [[VAL2:%.*]] = shufflevector <2 x half> [[ARG0]], <2 x half> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-V2-NEXT:    tail call void @func1()
+; CHECK-V2-NEXT:    br label %[[FINALLY]]
+; CHECK-V2:       [[FINALLY]]:
+; CHECK-V2-NEXT:    [[VAL3:%.*]] = phi <2 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V2-NEXT:    ret <2 x half> [[VAL3]]
+;
+; CHECK-V3-LABEL: define <2 x half> @shuffle_v2f16(
+; CHECK-V3-SAME: <2 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V3-NEXT:  [[ENTRY:.*:]]
+; CHECK-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V3:       [[THEN]]:
+; CHECK-V3-NEXT:    [[VAL1:%.*]] = shufflevector <2 x half> [[ARG0]], <2 x half> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-V3-NEXT:    tail call void @func0()
+; CHECK-V3-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V3:       [[ELSE]]:
+; CHECK-V3-NEXT:    [[VAL2:%.*]] = shufflevector <2 x half> [[ARG0]], <2 x half> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-V3-NEXT:    tail call void @func1()
+; CHECK-V3-NEXT:    br label %[[FINALLY]]
+; CHECK-V3:       [[FINALLY]]:
+; CHECK-V3-NEXT:    [[VAL3:%.*]] = phi <2 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V3-NEXT:    ret <2 x half> [[VAL3]]
+;
+; CHECK-V4-LABEL: define <2 x half> @shuffle_v2f16(
+; CHECK-V4-SAME: <2 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V4-NEXT:  [[ENTRY:.*:]]
+; CHECK-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V4:       [[THEN]]:
+; CHECK-V4-NEXT:    [[VAL1:%.*]] = shufflevector <2 x half> [[ARG0]], <2 x half> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-V4-NEXT:    tail call void @func0()
+; CHECK-V4-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V4:       [[ELSE]]:
+; CHECK-V4-NEXT:    [[VAL2:%.*]] = shufflevector <2 x half> [[ARG0]], <2 x half> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-V4-NEXT:    tail call void @func1()
+; CHECK-V4-NEXT:    br label %[[FINALLY]]
+; CHECK-V4:       [[FINALLY]]:
+; CHECK-V4-NEXT:    [[VAL3:%.*]] = phi <2 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V4-NEXT:    ret <2 x half> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <2 x half> %arg0, <2 x half> poison, <2 x i32> <i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <2 x half> %arg0, <2 x half> poison, <2 x i32> <i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <2 x half> [ %val1, %then ], [ %val2, %else ]
+  ret <2 x half> %val3
+}
+
+define <3 x half> @shuffle_v3f16(<3 x half> %arg0, i1 %cond) {
+; CHECK-V1-LABEL: define <3 x half> @shuffle_v3f16(
+; CHECK-V1-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V1-NEXT:  [[ENTRY:.*:]]
+; CHECK-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V1:       [[THEN]]:
+; CHECK-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 1, i32 1>
+; CHECK-V1-NEXT:    tail call void @func0()
+; CHECK-V1-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V1:       [[ELSE]]:
+; CHECK-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 2, i32 2, i32 2>
+; CHECK-V1-NEXT:    tail call void @func1()
+; CHECK-V1-NEXT:    br label %[[FINALLY]]
+; CHECK-V1:       [[FINALLY]]:
+; CHECK-V1-NEXT:    [[VAL3:%.*]] = phi <3 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V1-NEXT:    ret <3 x half> [[VAL3]]
+;
+; CHECK-V2-LABEL: define <3 x half> @shuffle_v3f16(
+; CHECK-V2-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V2-NEXT:  [[ENTRY:.*:]]
+; CHECK-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V2:       [[THEN]]:
+; CHECK-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 1, i32 1>
+; CHECK-V2-NEXT:    tail call void @func0()
+; CHECK-V2-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V2:       [[ELSE]]:
+; CHECK-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 2, i32 2, i32 2>
+; CHECK-V2-NEXT:    tail call void @func1()
+; CHECK-V2-NEXT:    br label %[[FINALLY]]
+; CHECK-V2:       [[FINALLY]]:
+; CHECK-V2-NEXT:    [[VAL3:%.*]] = phi <3 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V2-NEXT:    ret <3 x half> [[VAL3]]
+;
+; CHECK-V3-LABEL: define <3 x half> @shuffle_v3f16(
+; CHECK-V3-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V3-NEXT:  [[ENTRY:.*:]]
+; CHECK-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V3:       [[THEN]]:
+; CHECK-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 1, i32 1>
+; CHECK-V3-NEXT:    tail call void @func0()
+; CHECK-V3-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V3:       [[ELSE]]:
+; CHECK-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 2, i32 2, i32 2>
+; CHECK-V3-NEXT:    tail call void @func1()
+; CHECK-V3-NEXT:    br label %[[FINALLY]]
+; CHECK-V3:       [[FINALLY]]:
+; CHECK-V3-NEXT:    [[VAL3:%.*]] = phi <3 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V3-NEXT:    ret <3 x half> [[VAL3]]
+;
+; CHECK-V4-LABEL: define <3 x half> @shuffle_v3f16(
+; CHECK-V4-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V4-NEXT:  [[ENTRY:.*:]]
+; CHECK-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V4:       [[THEN]]:
+; CHECK-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 1, i32 1>
+; CHECK-V4-NEXT:    tail call void @func0()
+; CHECK-V4-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V4:       [[ELSE]]:
+; CHECK-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 2, i32 2, i32 2>
+; CHECK-V4-NEXT:    tail call void @func1()
+; CHECK-V4-NEXT:    br label %[[FINALLY]]
+; CHECK-V4:       [[FINALLY]]:
+; CHECK-V4-NEXT:    [[VAL3:%.*]] = phi <3 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V4-NEXT:    ret <3 x half> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x half> %arg0, <3 x half> poison, <3 x i32> <i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <3 x i32> <i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <3 x half> [ %val1, %then ], [ %val2, %else ]
+  ret <3 x half> %val3
+}
+
+define <4 x half> @shuffle_v4f16(<3 x half> %arg0, i1 %cond) {
+; CHECK-V1-LABEL: define <4 x half> @shuffle_v4f16(
+; CHECK-V1-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V1-NEXT:  [[ENTRY:.*:]]
+; CHECK-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V1:       [[THEN]]:
+; CHECK-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-V1-NEXT:    tail call void @func0()
+; CHECK-V1-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V1:       [[ELSE]]:
+; CHECK-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-V1-NEXT:    tail call void @func1()
+; CHECK-V1-NEXT:    br label %[[FINALLY]]
+; CHECK-V1:       [[FINALLY]]:
+; CHECK-V1-NEXT:    [[VAL3:%.*]] = phi <4 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V1-NEXT:    ret <4 x half> [[VAL3]]
+;
+; CHECK-V2-LABEL: define <4 x half> @shuffle_v4f16(
+; CHECK-V2-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V2-NEXT:  [[ENTRY:.*:]]
+; CHECK-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V2:       [[THEN]]:
+; CHECK-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-V2-NEXT:    tail call void @func0()
+; CHECK-V2-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V2:       [[ELSE]]:
+; CHECK-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-V2-NEXT:    tail call void @func1()
+; CHECK-V2-NEXT:    br label %[[FINALLY]]
+; CHECK-V2:       [[FINALLY]]:
+; CHECK-V2-NEXT:    [[VAL3:%.*]] = phi <4 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V2-NEXT:    ret <4 x half> [[VAL3]]
+;
+; CHECK-V3-LABEL: define <4 x half> @shuffle_v4f16(
+; CHECK-V3-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V3-NEXT:  [[ENTRY:.*:]]
+; CHECK-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V3:       [[THEN]]:
+; CHECK-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-V3-NEXT:    tail call void @func0()
+; CHECK-V3-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V3:       [[ELSE]]:
+; CHECK-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-V3-NEXT:    tail call void @func1()
+; CHECK-V3-NEXT:    br label %[[FINALLY]]
+; CHECK-V3:       [[FINALLY]]:
+; CHECK-V3-NEXT:    [[VAL3:%.*]] = phi <4 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V3-NEXT:    ret <4 x half> [[VAL3]]
+;
+; CHECK-V4-LABEL: define <4 x half> @shuffle_v4f16(
+; CHECK-V4-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V4-NEXT:  [[ENTRY:.*:]]
+; CHECK-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V4:       [[THEN]]:
+; CHECK-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-V4-NEXT:    tail call void @func0()
+; CHECK-V4-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V4:       [[ELSE]]:
+; CHECK-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-V4-NEXT:    tail call void @func1()
+; CHECK-V4-NEXT:    br label %[[FINALLY]]
+; CHECK-V4:       [[FINALLY]]:
+; CHECK-V4-NEXT:    [[VAL3:%.*]] = phi <4 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V4-NEXT:    ret <4 x half> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x half> %arg0, <3 x half> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <4 x half> [ %val1, %then ], [ %val2, %else ]
+  ret <4 x half> %val3
+}
+
+define <6 x half> @shuffle_v6f16(<3 x half> %arg0, i1 %cond) {
+; CHECK-V1-LABEL: define <6 x half> @shuffle_v6f16(
+; CHECK-V1-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V1-NEXT:  [[ENTRY:.*:]]
+; CHECK-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V1:       [[THEN]]:
+; CHECK-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V1-NEXT:    tail call void @func0()
+; CHECK-V1-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V1:       [[ELSE]]:
+; CHECK-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V1-NEXT:    tail call void @func1()
+; CHECK-V1-NEXT:    br label %[[FINALLY]]
+; CHECK-V1:       [[FINALLY]]:
+; CHECK-V1-NEXT:    [[VAL3:%.*]] = phi <6 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V1-NEXT:    ret <6 x half> [[VAL3]]
+;
+; CHECK-V2-LABEL: define <6 x half> @shuffle_v6f16(
+; CHECK-V2-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V2-NEXT:  [[ENTRY:.*:]]
+; CHECK-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V2:       [[THEN]]:
+; CHECK-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V2-NEXT:    tail call void @func0()
+; CHECK-V2-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V2:       [[ELSE]]:
+; CHECK-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V2-NEXT:    tail call void @func1()
+; CHECK-V2-NEXT:    br label %[[FINALLY]]
+; CHECK-V2:       [[FINALLY]]:
+; CHECK-V2-NEXT:    [[VAL3:%.*]] = phi <6 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V2-NEXT:    ret <6 x half> [[VAL3]]
+;
+; CHECK-V3-LABEL: define <6 x half> @shuffle_v6f16(
+; CHECK-V3-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V3-NEXT:  [[ENTRY:.*:]]
+; CHECK-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V3:       [[THEN]]:
+; CHECK-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V3-NEXT:    tail call void @func0()
+; CHECK-V3-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V3:       [[ELSE]]:
+; CHECK-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V3-NEXT:    tail call void @func1()
+; CHECK-V3-NEXT:    br label %[[FINALLY]]
+; CHECK-V3:       [[FINALLY]]:
+; CHECK-V3-NEXT:    [[VAL3:%.*]] = phi <6 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V3-NEXT:    ret <6 x half> [[VAL3]]
+;
+; CHECK-V4-LABEL: define <6 x half> @shuffle_v6f16(
+; CHECK-V4-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V4-NEXT:  [[ENTRY:.*:]]
+; CHECK-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V4:       [[THEN]]:
+; CHECK-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V4-NEXT:    tail call void @func0()
+; CHECK-V4-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V4:       [[ELSE]]:
+; CHECK-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V4-NEXT:    tail call void @func1()
+; CHECK-V4-NEXT:    br label %[[FINALLY]]
+; CHECK-V4:       [[FINALLY]]:
+; CHECK-V4-NEXT:    [[VAL3:%.*]] = phi <6 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V4-NEXT:    ret <6 x half> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x half> %arg0, <3 x half> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <6 x half> [ %val1, %then ], [ %val2, %else ]
+  ret <6 x half> %val3
+}
+
+define <8 x half> @shuffle_v8f16(<3 x half> %arg0, i1 %cond) {
+; CHECK-V1-LABEL: define <8 x half> @shuffle_v8f16(
+; CHECK-V1-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V1-NEXT:  [[ENTRY:.*:]]
+; CHECK-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V1:       [[THEN]]:
+; CHECK-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V1-NEXT:    tail call void @func0()
+; CHECK-V1-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V1:       [[ELSE]]:
+; CHECK-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V1-NEXT:    tail call void @func1()
+; CHECK-V1-NEXT:    br label %[[FINALLY]]
+; CHECK-V1:       [[FINALLY]]:
+; CHECK-V1-NEXT:    [[VAL3:%.*]] = phi <8 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V1-NEXT:    ret <8 x half> [[VAL3]]
+;
+; CHECK-V2-LABEL: define <8 x half> @shuffle_v8f16(
+; CHECK-V2-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V2-NEXT:  [[ENTRY:.*:]]
+; CHECK-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V2:       [[THEN]]:
+; CHECK-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V2-NEXT:    tail call void @func0()
+; CHECK-V2-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V2:       [[ELSE]]:
+; CHECK-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V2-NEXT:    tail call void @func1()
+; CHECK-V2-NEXT:    br label %[[FINALLY]]
+; CHECK-V2:       [[FINALLY]]:
+; CHECK-V2-NEXT:    [[VAL3:%.*]] = phi <8 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V2-NEXT:    ret <8 x half> [[VAL3]]
+;
+; CHECK-V3-LABEL: define <8 x half> @shuffle_v8f16(
+; CHECK-V3-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V3-NEXT:  [[ENTRY:.*:]]
+; CHECK-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V3:       [[THEN]]:
+; CHECK-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V3-NEXT:    tail call void @func0()
+; CHECK-V3-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V3:       [[ELSE]]:
+; CHECK-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V3-NEXT:    tail call void @func1()
+; CHECK-V3-NEXT:    br label %[[FINALLY]]
+; CHECK-V3:       [[FINALLY]]:
+; CHECK-V3-NEXT:    [[VAL3:%.*]] = phi <8 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V3-NEXT:    ret <8 x half> [[VAL3]]
+;
+; CHECK-V4-LABEL: define <8 x half> @shuffle_v8f16(
+; CHECK-V4-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V4-NEXT:  [[ENTRY:.*:]]
+; CHECK-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V4:       [[THEN]]:
+; CHECK-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V4-NEXT:    tail call void @func0()
+; CHECK-V4-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V4:       [[ELSE]]:
+; CHECK-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V4-NEXT:    tail call void @func1()
+; CHECK-V4-NEXT:    br label %[[FINALLY]]
+; CHECK-V4:       [[FINALLY]]:
+; CHECK-V4-NEXT:    [[VAL3:%.*]] = phi <8 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V4-NEXT:    ret <8 x half> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x half> %arg0, <3 x half> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <8 x half> [ %val1, %then ], [ %val2, %else ]
+  ret <8 x half> %val3
+}
+
+define <16 x half> @shuffle_v16f16(<3 x half> %arg0, i1 %cond) {
+; CHECK-V1-LABEL: define <16 x half> @shuffle_v16f16(
+; CHECK-V1-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V1-NEXT:  [[ENTRY:.*:]]
+; CHECK-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V1:       [[THEN]]:
+; CHECK-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V1-NEXT:    tail call void @func0()
+; CHECK-V1-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V1:       [[ELSE]]:
+; CHECK-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V1-NEXT:    tail call void @func1()
+; CHECK-V1-NEXT:    br label %[[FINALLY]]
+; CHECK-V1:       [[FINALLY]]:
+; CHECK-V1-NEXT:    [[VAL3:%.*]] = phi <16 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V1-NEXT:    ret <16 x half> [[VAL3]]
+;
+; CHECK-V2-LABEL: define <16 x half> @shuffle_v16f16(
+; CHECK-V2-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V2-NEXT:  [[ENTRY:.*:]]
+; CHECK-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V2:       [[THEN]]:
+; CHECK-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V2-NEXT:    tail call void @func0()
+; CHECK-V2-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V2:       [[ELSE]]:
+; CHECK-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V2-NEXT:    tail call void @func1()
+; CHECK-V2-NEXT:    br label %[[FINALLY]]
+; CHECK-V2:       [[FINALLY]]:
+; CHECK-V2-NEXT:    [[VAL3:%.*]] = phi <16 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V2-NEXT:    ret <16 x half> [[VAL3]]
+;
+; CHECK-V3-LABEL: define <16 x half> @shuffle_v16f16(
+; CHECK-V3-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V3-NEXT:  [[ENTRY:.*:]]
+; CHECK-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V3:       [[THEN]]:
+; CHECK-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V3-NEXT:    tail call void @func0()
+; CHECK-V3-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V3:       [[ELSE]]:
+; CHECK-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V3-NEXT:    tail call void @func1()
+; CHECK-V3-NEXT:    br label %[[FINALLY]]
+; CHECK-V3:       [[FINALLY]]:
+; CHECK-V3-NEXT:    [[VAL3:%.*]] = phi <16 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V3-NEXT:    ret <16 x half> [[VAL3]]
+;
+; CHECK-V4-LABEL: define <16 x half> @shuffle_v16f16(
+; CHECK-V4-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V4-NEXT:  [[ENTRY:.*:]]
+; CHECK-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V4:       [[THEN]]:
+; CHECK-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V4-NEXT:    tail call void @func0()
+; CHECK-V4-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V4:       [[ELSE]]:
+; CHECK-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V4-NEXT:    tail call void @func1()
+; CHECK-V4-NEXT:    br label %[[FINALLY]]
+; CHECK-V4:       [[FINALLY]]:
+; CHECK-V4-NEXT:    [[VAL3:%.*]] = phi <16 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V4-NEXT:    ret <16 x half> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x half> %arg0, <3 x half> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <16 x half> [ %val1, %then ], [ %val2, %else ]
+  ret <16 x half> %val3
+}
+
+define <32 x half> @shuffle_v32f16(<3 x half> %arg0, i1 %cond) {
+; CHECK-V1-LABEL: define <32 x half> @shuffle_v32f16(
+; CHECK-V1-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V1-NEXT:  [[ENTRY:.*:]]
+; CHECK-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V1:       [[THEN]]:
+; CHECK-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V1-NEXT:    tail call void @func0()
+; CHECK-V1-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V1:       [[ELSE]]:
+; CHECK-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V1-NEXT:    tail call void @func1()
+; CHECK-V1-NEXT:    br label %[[FINALLY]]
+; CHECK-V1:       [[FINALLY]]:
+; CHECK-V1-NEXT:    [[VAL3:%.*]] = phi <32 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V1-NEXT:    ret <32 x half> [[VAL3]]
+;
+; CHECK-V2-LABEL: define <32 x half> @shuffle_v32f16(
+; CHECK-V2-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V2-NEXT:  [[ENTRY:.*:]]
+; CHECK-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V2:       [[THEN]]:
+; CHECK-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V2-NEXT:    tail call void @func0()
+; CHECK-V2-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V2:       [[ELSE]]:
+; CHECK-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V2-NEXT:    tail call void @func1()
+; CHECK-V2-NEXT:    br label %[[FINALLY]]
+; CHECK-V2:       [[FINALLY]]:
+; CHECK-V2-NEXT:    [[VAL3:%.*]] = phi <32 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V2-NEXT:    ret <32 x half> [[VAL3]]
+;
+; CHECK-V3-LABEL: define <32 x half> @shuffle_v32f16(
+; CHECK-V3-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V3-NEXT:  [[ENTRY:.*:]]
+; CHECK-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V3:       [[THEN]]:
+; CHECK-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V3-NEXT:    tail call void @func0()
+; CHECK-V3-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V3:       [[ELSE]]:
+; CHECK-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V3-NEXT:    tail call void @func1()
+; CHECK-V3-NEXT:    br label %[[FINALLY]]
+; CHECK-V3:       [[FINALLY]]:
+; CHECK-V3-NEXT:    [[VAL3:%.*]] = phi <32 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V3-NEXT:    ret <32 x half> [[VAL3]]
+;
+; CHECK-V4-LABEL: define <32 x half> @shuffle_v32f16(
+; CHECK-V4-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V4-NEXT:  [[ENTRY:.*:]]
+; CHECK-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V4:       [[THEN]]:
+; CHECK-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V4-NEXT:    tail call void @func0()
+; CHECK-V4-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V4:       [[ELSE]]:
+; CHECK-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V4-NEXT:    tail call void @func1()
+; CHECK-V4-NEXT:    br label %[[FINALLY]]
+; CHECK-V4:       [[FINALLY]]:
+; CHECK-V4-NEXT:    [[VAL3:%.*]] = phi <32 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V4-NEXT:    ret <32 x half> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x half> %arg0, <3 x half> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <32 x half> [ %val1, %then ], [ %val2, %else ]
+  ret <32 x half> %val3
+}
+
+define <2 x float> @shuffle_v2f32(<2 x float> %arg0, i1 %cond) {
+; CHECK-V1-LABEL: define <2 x float> @shuffle_v2f32(
+; CHECK-V1-SAME: <2 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V1-NEXT:  [[ENTRY:.*:]]
+; CHECK-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V1:       [[THEN]]:
+; CHECK-V1-NEXT:    [[VAL1:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-V1-NEXT:    tail call void @func0()
+; CHECK-V1-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V1:       [[ELSE]]:
+; CHECK-V1-NEXT:    [[VAL2:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-V1-NEXT:    tail call void @func1()
+; CHECK-V1-NEXT:    br label %[[FINALLY]]
+; CHECK-V1:       [[FINALLY]]:
+; CHECK-V1-NEXT:    [[VAL3:%.*]] = phi <2 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V1-NEXT:    ret <2 x float> [[VAL3]]
+;
+; CHECK-V2-LABEL: define <2 x float> @shuffle_v2f32(
+; CHECK-V2-SAME: <2 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V2-NEXT:  [[ENTRY:.*:]]
+; CHECK-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V2:       [[THEN]]:
+; CHECK-V2-NEXT:    [[VAL1:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-V2-NEXT:    tail call void @func0()
+; CHECK-V2-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V2:       [[ELSE]]:
+; CHECK-V2-NEXT:    [[VAL2:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-V2-NEXT:    tail call void @func1()
+; CHECK-V2-NEXT:    br label %[[FINALLY]]
+; CHECK-V2:       [[FINALLY]]:
+; CHECK-V2-NEXT:    [[VAL3:%.*]] = phi <2 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V2-NEXT:    ret <2 x float> [[VAL3]]
+;
+; CHECK-V3-LABEL: define <2 x float> @shuffle_v2f32(
+; CHECK-V3-SAME: <2 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V3-NEXT:  [[ENTRY:.*:]]
+; CHECK-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V3:       [[THEN]]:
+; CHECK-V3-NEXT:    [[VAL1:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-V3-NEXT:    tail call void @func0()
+; CHECK-V3-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V3:       [[ELSE]]:
+; CHECK-V3-NEXT:    [[VAL2:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-V3-NEXT:    tail call void @func1()
+; CHECK-V3-NEXT:    br label %[[FINALLY]]
+; CHECK-V3:       [[FINALLY]]:
+; CHECK-V3-NEXT:    [[VAL3:%.*]] = phi <2 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V3-NEXT:    ret <2 x float> [[VAL3]]
+;
+; CHECK-V4-LABEL: define <2 x float> @shuffle_v2f32(
+; CHECK-V4-SAME: <2 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V4-NEXT:  [[ENTRY:.*:]]
+; CHECK-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V4:       [[THEN]]:
+; CHECK-V4-NEXT:    [[VAL1:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-V4-NEXT:    tail call void @func0()
+; CHECK-V4-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V4:       [[ELSE]]:
+; CHECK-V4-NEXT:    [[VAL2:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-V4-NEXT:    tail call void @func1()
+; CHECK-V4-NEXT:    br label %[[FINALLY]]
+; CHECK-V4:       [[FINALLY]]:
+; CHECK-V4-NEXT:    [[VAL3:%.*]] = phi <2 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V4-NEXT:    ret <2 x float> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <2 x float> %arg0, <2 x float> poison, <2 x i32> <i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <2 x float> %arg0, <2 x float> poison, <2 x i32> <i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <2 x float> [ %val1, %then ], [ %val2, %else ]
+  ret <2 x float> %val3
+}
+
+define <3 x float> @shuffle_v3f32(<3 x float> %arg0, i1 %cond) {
+; CHECK-V1-LABEL: define <3 x float> @shuffle_v3f32(
+; CHECK-V1-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V1-NEXT:  [[ENTRY:.*:]]
+; CHECK-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V1:       [[THEN]]:
+; CHECK-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 1, i32 1, i32 1>
+; CHECK-V1-NEXT:    tail call void @func0()
+; CHECK-V1-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V1:       [[ELSE]]:
+; CHECK-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 2, i32 2, i32 2>
+; CHECK-V1-NEXT:    tail call void @func1()
+; CHECK-V1-NEXT:    br label %[[FINALLY]]
+; CHECK-V1:       [[FINALLY]]:
+; CHECK-V1-NEXT:    [[VAL3:%.*]] = phi <3 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V1-NEXT:    ret <3 x float> [[VAL3]]
+;
+; CHECK-V2-LABEL: define <3 x float> @shuffle_v3f32(
+; CHECK-V2-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V2-NEXT:  [[ENTRY:.*:]]
+; CHECK-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V2:       [[THEN]]:
+; CHECK-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 1, i32 1, i32 1>
+; CHECK-V2-NEXT:    tail call void @func0()
+; CHECK-V2-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V2:       [[ELSE]]:
+; CHECK-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 2, i32 2, i32 2>
+; CHECK-V2-NEXT:    tail call void @func1()
+; CHECK-V2-NEXT:    br label %[[FINALLY]]
+; CHECK-V2:       [[FINALLY]]:
+; CHECK-V2-NEXT:    [[VAL3:%.*]] = phi <3 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V2-NEXT:    ret <3 x float> [[VAL3]]
+;
+; CHECK-V3-LABEL: define <3 x float> @shuffle_v3f32(
+; CHECK-V3-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V3-NEXT:  [[ENTRY:.*:]]
+; CHECK-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V3:       [[THEN]]:
+; CHECK-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 1, i32 1, i32 1>
+; CHECK-V3-NEXT:    tail call void @func0()
+; CHECK-V3-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V3:       [[ELSE]]:
+; CHECK-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 2, i32 2, i32 2>
+; CHECK-V3-NEXT:    tail call void @func1()
+; CHECK-V3-NEXT:    br label %[[FINALLY]]
+; CHECK-V3:       [[FINALLY]]:
+; CHECK-V3-NEXT:    [[VAL3:%.*]] = phi <3 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V3-NEXT:    ret <3 x float> [[VAL3]]
+;
+; CHECK-V4-LABEL: define <3 x float> @shuffle_v3f32(
+; CHECK-V4-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V4-NEXT:  [[ENTRY:.*:]]
+; CHECK-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V4:       [[THEN]]:
+; CHECK-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 1, i32 1, i32 1>
+; CHECK-V4-NEXT:    tail call void @func0()
+; CHECK-V4-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V4:       [[ELSE]]:
+; CHECK-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 2, i32 2, i32 2>
+; CHECK-V4-NEXT:    tail call void @func1()
+; CHECK-V4-NEXT:    br label %[[FINALLY]]
+; CHECK-V4:       [[FINALLY]]:
+; CHECK-V4-NEXT:    [[VAL3:%.*]] = phi <3 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V4-NEXT:    ret <3 x float> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x float> %arg0, <3 x float> poison, <3 x i32> <i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <3 x i32> <i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <3 x float> [ %val1, %then ], [ %val2, %else ]
+  ret <3 x float> %val3
+}
+
+define <4 x float> @shuffle_v4f32(<3 x float> %arg0, i1 %cond) {
+; CHECK-V1-LABEL: define <4 x float> @shuffle_v4f32(
+; CHECK-V1-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V1-NEXT:  [[ENTRY:.*:]]
+; CHECK-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V1:       [[THEN]]:
+; CHECK-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-V1-NEXT:    tail call void @func0()
+; CHECK-V1-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V1:       [[ELSE]]:
+; CHECK-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-V1-NEXT:    tail call void @func1()
+; CHECK-V1-NEXT:    br label %[[FINALLY]]
+; CHECK-V1:       [[FINALLY]]:
+; CHECK-V1-NEXT:    [[VAL3:%.*]] = phi <4 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V1-NEXT:    ret <4 x float> [[VAL3]]
+;
+; CHECK-V2-LABEL: define <4 x float> @shuffle_v4f32(
+; CHECK-V2-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V2-NEXT:  [[ENTRY:.*:]]
+; CHECK-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V2:       [[THEN]]:
+; CHECK-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-V2-NEXT:    tail call void @func0()
+; CHECK-V2-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V2:       [[ELSE]]:
+; CHECK-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-V2-NEXT:    tail call void @func1()
+; CHECK-V2-NEXT:    br label %[[FINALLY]]
+; CHECK-V2:       [[FINALLY]]:
+; CHECK-V2-NEXT:    [[VAL3:%.*]] = phi <4 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V2-NEXT:    ret <4 x float> [[VAL3]]
+;
+; CHECK-V3-LABEL: define <4 x float> @shuffle_v4f32(
+; CHECK-V3-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V3-NEXT:  [[ENTRY:.*:]]
+; CHECK-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V3:       [[THEN]]:
+; CHECK-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-V3-NEXT:    tail call void @func0()
+; CHECK-V3-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V3:       [[ELSE]]:
+; CHECK-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-V3-NEXT:    tail call void @func1()
+; CHECK-V3-NEXT:    br label %[[FINALLY]]
+; CHECK-V3:       [[FINALLY]]:
+; CHECK-V3-NEXT:    [[VAL3:%.*]] = phi <4 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V3-NEXT:    ret <4 x float> [[VAL3]]
+;
+; CHECK-V4-LABEL: define <4 x float> @shuffle_v4f32(
+; CHECK-V4-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V4-NEXT:  [[ENTRY:.*:]]
+; CHECK-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V4:       [[THEN]]:
+; CHECK-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-V4-NEXT:    tail call void @func0()
+; CHECK-V4-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V4:       [[ELSE]]:
+; CHECK-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-V4-NEXT:    tail call void @func1()
+; CHECK-V4-NEXT:    br label %[[FINALLY]]
+; CHECK-V4:       [[FINALLY]]:
+; CHECK-V4-NEXT:    [[VAL3:%.*]] = phi <4 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V4-NEXT:    ret <4 x float> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x float> %arg0, <3 x float> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <4 x float> [ %val1, %then ], [ %val2, %else ]
+  ret <4 x float> %val3
+}
+
+define <6 x float> @shuffle_v6f32(<3 x float> %arg0, i1 %cond) {
+; CHECK-V1-LABEL: define <6 x float> @shuffle_v6f32(
+; CHECK-V1-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V1-NEXT:  [[ENTRY:.*:]]
+; CHECK-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V1:       [[THEN]]:
+; CHECK-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V1-NEXT:    tail call void @func0()
+; CHECK-V1-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V1:       [[ELSE]]:
+; CHECK-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V1-NEXT:    tail call void @func1()
+; CHECK-V1-NEXT:    br label %[[FINALLY]]
+; CHECK-V1:       [[FINALLY]]:
+; CHECK-V1-NEXT:    [[VAL3:%.*]] = phi <6 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V1-NEXT:    ret <6 x float> [[VAL3]]
+;
+; CHECK-V2-LABEL: define <6 x float> @shuffle_v6f32(
+; CHECK-V2-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V2-NEXT:  [[ENTRY:.*:]]
+; CHECK-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V2:       [[THEN]]:
+; CHECK-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V2-NEXT:    tail call void @func0()
+; CHECK-V2-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V2:       [[ELSE]]:
+; CHECK-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V2-NEXT:    tail call void @func1()
+; CHECK-V2-NEXT:    br label %[[FINALLY]]
+; CHECK-V2:       [[FINALLY]]:
+; CHECK-V2-NEXT:    [[VAL3:%.*]] = phi <6 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V2-NEXT:    ret <6 x float> [[VAL3]]
+;
+; CHECK-V3-LABEL: define <6 x float> @shuffle_v6f32(
+; CHECK-V3-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V3-NEXT:  [[ENTRY:.*:]]
+; CHECK-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V3:       [[THEN]]:
+; CHECK-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V3-NEXT:    tail call void @func0()
+; CHECK-V3-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V3:       [[ELSE]]:
+; CHECK-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V3-NEXT:    tail call void @func1()
+; CHECK-V3-NEXT:    br label %[[FINALLY]]
+; CHECK-V3:       [[FINALLY]]:
+; CHECK-V3-NEXT:    [[VAL3:%.*]] = phi <6 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V3-NEXT:    ret <6 x float> [[VAL3]]
+;
+; CHECK-V4-LABEL: define <6 x float> @shuffle_v6f32(
+; CHECK-V4-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V4-NEXT:  [[ENTRY:.*:]]
+; CHECK-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V4:       [[THEN]]:
+; CHECK-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V4-NEXT:    tail call void @func0()
+; CHECK-V4-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V4:       [[ELSE]]:
+; CHECK-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V4-NEXT:    tail call void @func1()
+; CHECK-V4-NEXT:    br label %[[FINALLY]]
+; CHECK-V4:       [[FINALLY]]:
+; CHECK-V4-NEXT:    [[VAL3:%.*]] = phi <6 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V4-NEXT:    ret <6 x float> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x float> %arg0, <3 x float> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <6 x float> [ %val1, %then ], [ %val2, %else ]
+  ret <6 x float> %val3
+}
+
+define <8 x float> @shuffle_v8f32(<3 x float> %arg0, i1 %cond) {
+; CHECK-V1-LABEL: define <8 x float> @shuffle_v8f32(
+; CHECK-V1-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V1-NEXT:  [[ENTRY:.*:]]
+; CHECK-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V1:       [[THEN]]:
+; CHECK-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V1-NEXT:    tail call void @func0()
+; CHECK-V1-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V1:       [[ELSE]]:
+; CHECK-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V1-NEXT:    tail call void @func1()
+; CHECK-V1-NEXT:    br label %[[FINALLY]]
+; CHECK-V1:       [[FINALLY]]:
+; CHECK-V1-NEXT:    [[VAL3:%.*]] = phi <8 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V1-NEXT:    ret <8 x float> [[VAL3]]
+;
+; CHECK-V2-LABEL: define <8 x float> @shuffle_v8f32(
+; CHECK-V2-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V2-NEXT:  [[ENTRY:.*:]]
+; CHECK-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V2:       [[THEN]]:
+; CHECK-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V2-NEXT:    tail call void @func0()
+; CHECK-V2-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V2:       [[ELSE]]:
+; CHECK-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V2-NEXT:    tail call void @func1()
+; CHECK-V2-NEXT:    br label %[[FINALLY]]
+; CHECK-V2:       [[FINALLY]]:
+; CHECK-V2-NEXT:    [[VAL3:%.*]] = phi <8 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V2-NEXT:    ret <8 x float> [[VAL3]]
+;
+; CHECK-V3-LABEL: define <8 x float> @shuffle_v8f32(
+; CHECK-V3-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V3-NEXT:  [[ENTRY:.*:]]
+; CHECK-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V3:       [[THEN]]:
+; CHECK-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V3-NEXT:    tail call void @func0()
+; CHECK-V3-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V3:       [[ELSE]]:
+; CHECK-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V3-NEXT:    tail call void @func1()
+; CHECK-V3-NEXT:    br label %[[FINALLY]]
+; CHECK-V3:       [[FINALLY]]:
+; CHECK-V3-NEXT:    [[VAL3:%.*]] = phi <8 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V3-NEXT:    ret <8 x float> [[VAL3]]
+;
+; CHECK-V4-LABEL: define <8 x float> @shuffle_v8f32(
+; CHECK-V4-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V4-NEXT:  [[ENTRY:.*:]]
+; CHECK-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V4:       [[THEN]]:
+; CHECK-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V4-NEXT:    tail call void @func0()
+; CHECK-V4-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V4:       [[ELSE]]:
+; CHECK-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V4-NEXT:    tail call void @func1()
+; CHECK-V4-NEXT:    br label %[[FINALLY]]
+; CHECK-V4:       [[FINALLY]]:
+; CHECK-V4-NEXT:    [[VAL3:%.*]] = phi <8 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V4-NEXT:    ret <8 x float> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x float> %arg0, <3 x float> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <8 x float> [ %val1, %then ], [ %val2, %else ]
+  ret <8 x float> %val3
+}
+
+define <16 x float> @shuffle_v16f32(<3 x float> %arg0, i1 %cond) {
+; CHECK-V1-LABEL: define <16 x float> @shuffle_v16f32(
+; CHECK-V1-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V1-NEXT:  [[ENTRY:.*:]]
+; CHECK-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V1:       [[THEN]]:
+; CHECK-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V1-NEXT:    tail call void @func0()
+; CHECK-V1-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V1:       [[ELSE]]:
+; CHECK-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V1-NEXT:    tail call void @func1()
+; CHECK-V1-NEXT:    br label %[[FINALLY]]
+; CHECK-V1:       [[FINALLY]]:
+; CHECK-V1-NEXT:    [[VAL3:%.*]] = phi <16 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V1-NEXT:    ret <16 x float> [[VAL3]]
+;
+; CHECK-V2-LABEL: define <16 x float> @shuffle_v16f32(
+; CHECK-V2-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V2-NEXT:  [[ENTRY:.*:]]
+; CHECK-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V2:       [[THEN]]:
+; CHECK-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V2-NEXT:    tail call void @func0()
+; CHECK-V2-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V2:       [[ELSE]]:
+; CHECK-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V2-NEXT:    tail call void @func1()
+; CHECK-V2-NEXT:    br label %[[FINALLY]]
+; CHECK-V2:       [[FINALLY]]:
+; CHECK-V2-NEXT:    [[VAL3:%.*]] = phi <16 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V2-NEXT:    ret <16 x float> [[VAL3]]
+;
+; CHECK-V3-LABEL: define <16 x float> @shuffle_v16f32(
+; CHECK-V3-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V3-NEXT:  [[ENTRY:.*:]]
+; CHECK-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V3:       [[THEN]]:
+; CHECK-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V3-NEXT:    tail call void @func0()
+; CHECK-V3-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V3:       [[ELSE]]:
+; CHECK-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V3-NEXT:    tail call void @func1()
+; CHECK-V3-NEXT:    br label %[[FINALLY]]
+; CHECK-V3:       [[FINALLY]]:
+; CHECK-V3-NEXT:    [[VAL3:%.*]] = phi <16 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V3-NEXT:    ret <16 x float> [[VAL3]]
+;
+; CHECK-V4-LABEL: define <16 x float> @shuffle_v16f32(
+; CHECK-V4-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V4-NEXT:  [[ENTRY:.*:]]
+; CHECK-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V4:       [[THEN]]:
+; CHECK-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V4-NEXT:    tail call void @func0()
+; CHECK-V4-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V4:       [[ELSE]]:
+; CHECK-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V4-NEXT:    tail call void @func1()
+; CHECK-V4-NEXT:    br label %[[FINALLY]]
+; CHECK-V4:       [[FINALLY]]:
+; CHECK-V4-NEXT:    [[VAL3:%.*]] = phi <16 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V4-NEXT:    ret <16 x float> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x float> %arg0, <3 x float> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <16 x float> [ %val1, %then ], [ %val2, %else ]
+  ret <16 x float> %val3
+}
+
+define <32 x float> @shuffle_v32f32(<3 x float> %arg0, i1 %cond) {
+; CHECK-V1-LABEL: define <32 x float> @shuffle_v32f32(
+; CHECK-V1-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V1-NEXT:  [[ENTRY:.*:]]
+; CHECK-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V1:       [[THEN]]:
+; CHECK-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V1-NEXT:    tail call void @func0()
+; CHECK-V1-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V1:       [[ELSE]]:
+; CHECK-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V1-NEXT:    tail call void @func1()
+; CHECK-V1-NEXT:    br label %[[FINALLY]]
+; CHECK-V1:       [[FINALLY]]:
+; CHECK-V1-NEXT:    [[VAL3:%.*]] = phi <32 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V1-NEXT:    ret <32 x float> [[VAL3]]
+;
+; CHECK-V2-LABEL: define <32 x float> @shuffle_v32f32(
+; CHECK-V2-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V2-NEXT:  [[ENTRY:.*:]]
+; CHECK-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V2:       [[THEN]]:
+; CHECK-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V2-NEXT:    tail call void @func0()
+; CHECK-V2-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V2:       [[ELSE]]:
+; CHECK-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V2-NEXT:    tail call void @func1()
+; CHECK-V2-NEXT:    br label %[[FINALLY]]
+; CHECK-V2:       [[FINALLY]]:
+; CHECK-V2-NEXT:    [[VAL3:%.*]] = phi <32 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V2-NEXT:    ret <32 x float> [[VAL3]]
+;
+; CHECK-V3-LABEL: define <32 x float> @shuffle_v32f32(
+; CHECK-V3-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V3-NEXT:  [[ENTRY:.*:]]
+; CHECK-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V3:       [[THEN]]:
+; CHECK-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V3-NEXT:    tail call void @func0()
+; CHECK-V3-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V3:       [[ELSE]]:
+; CHECK-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V3-NEXT:    tail call void @func1()
+; CHECK-V3-NEXT:    br label %[[FINALLY]]
+; CHECK-V3:       [[FINALLY]]:
+; CHECK-V3-NEXT:    [[VAL3:%.*]] = phi <32 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V3-NEXT:    ret <32 x float> [[VAL3]]
+;
+; CHECK-V4-LABEL: define <32 x float> @shuffle_v32f32(
+; CHECK-V4-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V4-NEXT:  [[ENTRY:.*:]]
+; CHECK-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK-V4:       [[THEN]]:
+; CHECK-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V4-NEXT:    tail call void @func0()
+; CHECK-V4-NEXT:    br label %[[FINALLY:.*]]
+; CHECK-V4:       [[ELSE]]:
+; CHECK-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V4-NEXT:    tail call void @func1()
+; CHECK-V4-NEXT:    br label %[[FINALLY]]
+; CHECK-V4:       [[FINALLY]]:
+; CHECK-V4-NEXT:    [[VAL3:%.*]] = phi <32 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V4-NEXT:    ret <32 x float> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x float> %arg0, <3 x float> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <32 x float> [ %val1, %then ], [ %val2, %else ]
+  ret <32 x float> %val3
+}
+
+declare void @func0() local_unnamed_addr
+
+declare void @func1() local_unnamed_addr
diff --git a/llvm/test/Transforms/VectorCombine/narrow-phi-of-shuffles.ll b/llvm/test/Transforms/VectorCombine/narrow-phi-of-shuffles.ll
index c8ca944fcf896..b70840f85fbf2 100644
--- a/llvm/test/Transforms/VectorCombine/narrow-phi-of-shuffles.ll
+++ b/llvm/test/Transforms/VectorCombine/narrow-phi-of-shuffles.ll
@@ -1,14 +1,5 @@
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
 ; RUN: opt -passes=vector-combine -S %s | FileCheck %s --check-prefixes=CHECK
-; RUN: opt -mtriple=aarch64 -passes=vector-combine -S %s | FileCheck %s --check-prefixes=CHECK-AARCH64
-; RUN: opt -mtriple=amdgcn-amd-amdhsa -passes=vector-combine -S %s | FileCheck %s --check-prefixes=CHECK-AMDGPU
-; RUN: opt -mtriple=arm -passes=vector-combine -S %s | FileCheck %s --check-prefixes=CHECK-ARM
-; RUN: opt -mtriple=hexagon-- -passes=vector-combine -S %s | FileCheck %s --check-prefixes=CHECK-HEXAGON
-; RUN: opt -mtriple=riscv64 -passes=vector-combine -S %s | FileCheck %s --check-prefixes=CHECK-RISCV
-; RUN: opt -mtriple=x86_64-- -mcpu=x86-64 -passes=vector-combine -S %s | FileCheck %s --check-prefixes=CHECK-X86-V1
-; RUN: opt -mtriple=x86_64-- -mcpu=x86-64-v2 -passes=vector-combine -S %s | FileCheck %s --check-prefixes=CHECK-X86-V2
-; RUN: opt -mtriple=x86_64-- -mcpu=x86-64-v3 -passes=vector-combine -S %s | FileCheck %s --check-prefixes=CHECK-X86-V3
-; RUN: opt -mtriple=x86_64-- -mcpu=x86-64-v4 -passes=vector-combine -S %s | FileCheck %s --check-prefixes=CHECK-X86-V4
 
 define <2 x i8> @shuffle_v2i8(<2 x i8> %arg0, i1 %cond) {
 ; CHECK-LABEL: define <2 x i8> @shuffle_v2i8(
@@ -27,150 +18,6 @@ define <2 x i8> @shuffle_v2i8(<2 x i8> %arg0, i1 %cond) {
 ; CHECK-NEXT:    [[VAL3:%.*]] = phi <2 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
 ; CHECK-NEXT:    ret <2 x i8> [[VAL3]]
 ;
-; CHECK-AARCH64-LABEL: define <2 x i8> @shuffle_v2i8(
-; CHECK-AARCH64-SAME: <2 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-AARCH64-NEXT:  [[ENTRY:.*:]]
-; CHECK-AARCH64-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-AARCH64:       [[THEN]]:
-; CHECK-AARCH64-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i8> [[ARG0]], <2 x i8> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-AARCH64-NEXT:    tail call void @func0()
-; CHECK-AARCH64-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-AARCH64:       [[ELSE]]:
-; CHECK-AARCH64-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i8> [[ARG0]], <2 x i8> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-AARCH64-NEXT:    tail call void @func1()
-; CHECK-AARCH64-NEXT:    br label %[[FINALLY]]
-; CHECK-AARCH64:       [[FINALLY]]:
-; CHECK-AARCH64-NEXT:    [[VAL3:%.*]] = phi <2 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-AARCH64-NEXT:    ret <2 x i8> [[VAL3]]
-;
-; CHECK-AMDGPU-LABEL: define <2 x i8> @shuffle_v2i8(
-; CHECK-AMDGPU-SAME: <2 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-AMDGPU-NEXT:  [[ENTRY:.*:]]
-; CHECK-AMDGPU-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-AMDGPU:       [[THEN]]:
-; CHECK-AMDGPU-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i8> [[ARG0]], <2 x i8> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-AMDGPU-NEXT:    tail call void @func0()
-; CHECK-AMDGPU-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-AMDGPU:       [[ELSE]]:
-; CHECK-AMDGPU-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i8> [[ARG0]], <2 x i8> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-AMDGPU-NEXT:    tail call void @func1()
-; CHECK-AMDGPU-NEXT:    br label %[[FINALLY]]
-; CHECK-AMDGPU:       [[FINALLY]]:
-; CHECK-AMDGPU-NEXT:    [[VAL3:%.*]] = phi <2 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-AMDGPU-NEXT:    ret <2 x i8> [[VAL3]]
-;
-; CHECK-ARM-LABEL: define <2 x i8> @shuffle_v2i8(
-; CHECK-ARM-SAME: <2 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-ARM-NEXT:  [[ENTRY:.*:]]
-; CHECK-ARM-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-ARM:       [[THEN]]:
-; CHECK-ARM-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i8> [[ARG0]], <2 x i8> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-ARM-NEXT:    tail call void @func0()
-; CHECK-ARM-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-ARM:       [[ELSE]]:
-; CHECK-ARM-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i8> [[ARG0]], <2 x i8> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-ARM-NEXT:    tail call void @func1()
-; CHECK-ARM-NEXT:    br label %[[FINALLY]]
-; CHECK-ARM:       [[FINALLY]]:
-; CHECK-ARM-NEXT:    [[VAL3:%.*]] = phi <2 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-ARM-NEXT:    ret <2 x i8> [[VAL3]]
-;
-; CHECK-HEXAGON-LABEL: define <2 x i8> @shuffle_v2i8(
-; CHECK-HEXAGON-SAME: <2 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-HEXAGON-NEXT:  [[ENTRY:.*:]]
-; CHECK-HEXAGON-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-HEXAGON:       [[THEN]]:
-; CHECK-HEXAGON-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i8> [[ARG0]], <2 x i8> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-HEXAGON-NEXT:    tail call void @func0()
-; CHECK-HEXAGON-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-HEXAGON:       [[ELSE]]:
-; CHECK-HEXAGON-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i8> [[ARG0]], <2 x i8> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-HEXAGON-NEXT:    tail call void @func1()
-; CHECK-HEXAGON-NEXT:    br label %[[FINALLY]]
-; CHECK-HEXAGON:       [[FINALLY]]:
-; CHECK-HEXAGON-NEXT:    [[VAL3:%.*]] = phi <2 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-HEXAGON-NEXT:    ret <2 x i8> [[VAL3]]
-;
-; CHECK-RISCV-LABEL: define <2 x i8> @shuffle_v2i8(
-; CHECK-RISCV-SAME: <2 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-RISCV-NEXT:  [[ENTRY:.*:]]
-; CHECK-RISCV-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-RISCV:       [[THEN]]:
-; CHECK-RISCV-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i8> [[ARG0]], <2 x i8> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-RISCV-NEXT:    tail call void @func0()
-; CHECK-RISCV-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-RISCV:       [[ELSE]]:
-; CHECK-RISCV-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i8> [[ARG0]], <2 x i8> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-RISCV-NEXT:    tail call void @func1()
-; CHECK-RISCV-NEXT:    br label %[[FINALLY]]
-; CHECK-RISCV:       [[FINALLY]]:
-; CHECK-RISCV-NEXT:    [[VAL3:%.*]] = phi <2 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-RISCV-NEXT:    ret <2 x i8> [[VAL3]]
-;
-; CHECK-X86-V1-LABEL: define <2 x i8> @shuffle_v2i8(
-; CHECK-X86-V1-SAME: <2 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0:[0-9]+]] {
-; CHECK-X86-V1-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V1:       [[THEN]]:
-; CHECK-X86-V1-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i8> [[ARG0]], <2 x i8> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-X86-V1-NEXT:    tail call void @func0()
-; CHECK-X86-V1-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V1:       [[ELSE]]:
-; CHECK-X86-V1-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i8> [[ARG0]], <2 x i8> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-X86-V1-NEXT:    tail call void @func1()
-; CHECK-X86-V1-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V1:       [[FINALLY]]:
-; CHECK-X86-V1-NEXT:    [[VAL3:%.*]] = phi <2 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V1-NEXT:    ret <2 x i8> [[VAL3]]
-;
-; CHECK-X86-V2-LABEL: define <2 x i8> @shuffle_v2i8(
-; CHECK-X86-V2-SAME: <2 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0:[0-9]+]] {
-; CHECK-X86-V2-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V2:       [[THEN]]:
-; CHECK-X86-V2-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i8> [[ARG0]], <2 x i8> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-X86-V2-NEXT:    tail call void @func0()
-; CHECK-X86-V2-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V2:       [[ELSE]]:
-; CHECK-X86-V2-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i8> [[ARG0]], <2 x i8> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-X86-V2-NEXT:    tail call void @func1()
-; CHECK-X86-V2-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V2:       [[FINALLY]]:
-; CHECK-X86-V2-NEXT:    [[VAL3:%.*]] = phi <2 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V2-NEXT:    ret <2 x i8> [[VAL3]]
-;
-; CHECK-X86-V3-LABEL: define <2 x i8> @shuffle_v2i8(
-; CHECK-X86-V3-SAME: <2 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0:[0-9]+]] {
-; CHECK-X86-V3-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V3:       [[THEN]]:
-; CHECK-X86-V3-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i8> [[ARG0]], <2 x i8> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-X86-V3-NEXT:    tail call void @func0()
-; CHECK-X86-V3-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V3:       [[ELSE]]:
-; CHECK-X86-V3-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i8> [[ARG0]], <2 x i8> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-X86-V3-NEXT:    tail call void @func1()
-; CHECK-X86-V3-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V3:       [[FINALLY]]:
-; CHECK-X86-V3-NEXT:    [[VAL3:%.*]] = phi <2 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V3-NEXT:    ret <2 x i8> [[VAL3]]
-;
-; CHECK-X86-V4-LABEL: define <2 x i8> @shuffle_v2i8(
-; CHECK-X86-V4-SAME: <2 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0:[0-9]+]] {
-; CHECK-X86-V4-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V4:       [[THEN]]:
-; CHECK-X86-V4-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i8> [[ARG0]], <2 x i8> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-X86-V4-NEXT:    tail call void @func0()
-; CHECK-X86-V4-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V4:       [[ELSE]]:
-; CHECK-X86-V4-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i8> [[ARG0]], <2 x i8> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-X86-V4-NEXT:    tail call void @func1()
-; CHECK-X86-V4-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V4:       [[FINALLY]]:
-; CHECK-X86-V4-NEXT:    [[VAL3:%.*]] = phi <2 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V4-NEXT:    ret <2 x i8> [[VAL3]]
-;
 entry:
   br i1 %cond, label %then, label %else
 
@@ -206,150 +53,6 @@ define <4 x i8> @shuffle_v4i8(<3 x i8> %arg0, i1 %cond) {
 ; CHECK-NEXT:    [[VAL3:%.*]] = phi <4 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
 ; CHECK-NEXT:    ret <4 x i8> [[VAL3]]
 ;
-; CHECK-AARCH64-LABEL: define <4 x i8> @shuffle_v4i8(
-; CHECK-AARCH64-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-AARCH64-NEXT:  [[ENTRY:.*:]]
-; CHECK-AARCH64-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-AARCH64:       [[THEN]]:
-; CHECK-AARCH64-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
-; CHECK-AARCH64-NEXT:    tail call void @func0()
-; CHECK-AARCH64-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-AARCH64:       [[ELSE]]:
-; CHECK-AARCH64-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-; CHECK-AARCH64-NEXT:    tail call void @func1()
-; CHECK-AARCH64-NEXT:    br label %[[FINALLY]]
-; CHECK-AARCH64:       [[FINALLY]]:
-; CHECK-AARCH64-NEXT:    [[VAL3:%.*]] = phi <4 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-AARCH64-NEXT:    ret <4 x i8> [[VAL3]]
-;
-; CHECK-AMDGPU-LABEL: define <4 x i8> @shuffle_v4i8(
-; CHECK-AMDGPU-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-AMDGPU-NEXT:  [[ENTRY:.*:]]
-; CHECK-AMDGPU-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-AMDGPU:       [[THEN]]:
-; CHECK-AMDGPU-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
-; CHECK-AMDGPU-NEXT:    tail call void @func0()
-; CHECK-AMDGPU-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-AMDGPU:       [[ELSE]]:
-; CHECK-AMDGPU-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-; CHECK-AMDGPU-NEXT:    tail call void @func1()
-; CHECK-AMDGPU-NEXT:    br label %[[FINALLY]]
-; CHECK-AMDGPU:       [[FINALLY]]:
-; CHECK-AMDGPU-NEXT:    [[VAL3:%.*]] = phi <4 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-AMDGPU-NEXT:    ret <4 x i8> [[VAL3]]
-;
-; CHECK-ARM-LABEL: define <4 x i8> @shuffle_v4i8(
-; CHECK-ARM-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-ARM-NEXT:  [[ENTRY:.*:]]
-; CHECK-ARM-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-ARM:       [[THEN]]:
-; CHECK-ARM-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
-; CHECK-ARM-NEXT:    tail call void @func0()
-; CHECK-ARM-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-ARM:       [[ELSE]]:
-; CHECK-ARM-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-; CHECK-ARM-NEXT:    tail call void @func1()
-; CHECK-ARM-NEXT:    br label %[[FINALLY]]
-; CHECK-ARM:       [[FINALLY]]:
-; CHECK-ARM-NEXT:    [[VAL3:%.*]] = phi <4 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-ARM-NEXT:    ret <4 x i8> [[VAL3]]
-;
-; CHECK-HEXAGON-LABEL: define <4 x i8> @shuffle_v4i8(
-; CHECK-HEXAGON-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-HEXAGON-NEXT:  [[ENTRY:.*:]]
-; CHECK-HEXAGON-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-HEXAGON:       [[THEN]]:
-; CHECK-HEXAGON-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
-; CHECK-HEXAGON-NEXT:    tail call void @func0()
-; CHECK-HEXAGON-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-HEXAGON:       [[ELSE]]:
-; CHECK-HEXAGON-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-; CHECK-HEXAGON-NEXT:    tail call void @func1()
-; CHECK-HEXAGON-NEXT:    br label %[[FINALLY]]
-; CHECK-HEXAGON:       [[FINALLY]]:
-; CHECK-HEXAGON-NEXT:    [[VAL3:%.*]] = phi <4 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-HEXAGON-NEXT:    ret <4 x i8> [[VAL3]]
-;
-; CHECK-RISCV-LABEL: define <4 x i8> @shuffle_v4i8(
-; CHECK-RISCV-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-RISCV-NEXT:  [[ENTRY:.*:]]
-; CHECK-RISCV-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-RISCV:       [[THEN]]:
-; CHECK-RISCV-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
-; CHECK-RISCV-NEXT:    tail call void @func0()
-; CHECK-RISCV-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-RISCV:       [[ELSE]]:
-; CHECK-RISCV-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-; CHECK-RISCV-NEXT:    tail call void @func1()
-; CHECK-RISCV-NEXT:    br label %[[FINALLY]]
-; CHECK-RISCV:       [[FINALLY]]:
-; CHECK-RISCV-NEXT:    [[VAL3:%.*]] = phi <4 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-RISCV-NEXT:    ret <4 x i8> [[VAL3]]
-;
-; CHECK-X86-V1-LABEL: define <4 x i8> @shuffle_v4i8(
-; CHECK-X86-V1-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V1-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V1:       [[THEN]]:
-; CHECK-X86-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
-; CHECK-X86-V1-NEXT:    tail call void @func0()
-; CHECK-X86-V1-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V1:       [[ELSE]]:
-; CHECK-X86-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V1-NEXT:    tail call void @func1()
-; CHECK-X86-V1-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V1:       [[FINALLY]]:
-; CHECK-X86-V1-NEXT:    [[VAL3:%.*]] = phi <4 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V1-NEXT:    ret <4 x i8> [[VAL3]]
-;
-; CHECK-X86-V2-LABEL: define <4 x i8> @shuffle_v4i8(
-; CHECK-X86-V2-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V2-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V2:       [[THEN]]:
-; CHECK-X86-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
-; CHECK-X86-V2-NEXT:    tail call void @func0()
-; CHECK-X86-V2-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V2:       [[ELSE]]:
-; CHECK-X86-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V2-NEXT:    tail call void @func1()
-; CHECK-X86-V2-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V2:       [[FINALLY]]:
-; CHECK-X86-V2-NEXT:    [[VAL3:%.*]] = phi <4 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V2-NEXT:    ret <4 x i8> [[VAL3]]
-;
-; CHECK-X86-V3-LABEL: define <4 x i8> @shuffle_v4i8(
-; CHECK-X86-V3-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V3-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V3:       [[THEN]]:
-; CHECK-X86-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
-; CHECK-X86-V3-NEXT:    tail call void @func0()
-; CHECK-X86-V3-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V3:       [[ELSE]]:
-; CHECK-X86-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V3-NEXT:    tail call void @func1()
-; CHECK-X86-V3-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V3:       [[FINALLY]]:
-; CHECK-X86-V3-NEXT:    [[VAL3:%.*]] = phi <4 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V3-NEXT:    ret <4 x i8> [[VAL3]]
-;
-; CHECK-X86-V4-LABEL: define <4 x i8> @shuffle_v4i8(
-; CHECK-X86-V4-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V4-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V4:       [[THEN]]:
-; CHECK-X86-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
-; CHECK-X86-V4-NEXT:    tail call void @func0()
-; CHECK-X86-V4-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V4:       [[ELSE]]:
-; CHECK-X86-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V4-NEXT:    tail call void @func1()
-; CHECK-X86-V4-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V4:       [[FINALLY]]:
-; CHECK-X86-V4-NEXT:    [[VAL3:%.*]] = phi <4 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V4-NEXT:    ret <4 x i8> [[VAL3]]
-;
 entry:
   br i1 %cond, label %then, label %else
 
@@ -385,150 +88,6 @@ define <8 x i8> @shuffle_v8i8(<3 x i8> %arg0, i1 %cond) {
 ; CHECK-NEXT:    [[VAL3:%.*]] = phi <8 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
 ; CHECK-NEXT:    ret <8 x i8> [[VAL3]]
 ;
-; CHECK-AARCH64-LABEL: define <8 x i8> @shuffle_v8i8(
-; CHECK-AARCH64-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-AARCH64-NEXT:  [[ENTRY:.*:]]
-; CHECK-AARCH64-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-AARCH64:       [[THEN]]:
-; CHECK-AARCH64-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-AARCH64-NEXT:    tail call void @func0()
-; CHECK-AARCH64-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-AARCH64:       [[ELSE]]:
-; CHECK-AARCH64-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-AARCH64-NEXT:    tail call void @func1()
-; CHECK-AARCH64-NEXT:    br label %[[FINALLY]]
-; CHECK-AARCH64:       [[FINALLY]]:
-; CHECK-AARCH64-NEXT:    [[VAL3:%.*]] = phi <8 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-AARCH64-NEXT:    ret <8 x i8> [[VAL3]]
-;
-; CHECK-AMDGPU-LABEL: define <8 x i8> @shuffle_v8i8(
-; CHECK-AMDGPU-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-AMDGPU-NEXT:  [[ENTRY:.*:]]
-; CHECK-AMDGPU-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-AMDGPU:       [[THEN]]:
-; CHECK-AMDGPU-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-AMDGPU-NEXT:    tail call void @func0()
-; CHECK-AMDGPU-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-AMDGPU:       [[ELSE]]:
-; CHECK-AMDGPU-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-AMDGPU-NEXT:    tail call void @func1()
-; CHECK-AMDGPU-NEXT:    br label %[[FINALLY]]
-; CHECK-AMDGPU:       [[FINALLY]]:
-; CHECK-AMDGPU-NEXT:    [[VAL3:%.*]] = phi <8 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-AMDGPU-NEXT:    ret <8 x i8> [[VAL3]]
-;
-; CHECK-ARM-LABEL: define <8 x i8> @shuffle_v8i8(
-; CHECK-ARM-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-ARM-NEXT:  [[ENTRY:.*:]]
-; CHECK-ARM-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-ARM:       [[THEN]]:
-; CHECK-ARM-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-ARM-NEXT:    tail call void @func0()
-; CHECK-ARM-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-ARM:       [[ELSE]]:
-; CHECK-ARM-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-ARM-NEXT:    tail call void @func1()
-; CHECK-ARM-NEXT:    br label %[[FINALLY]]
-; CHECK-ARM:       [[FINALLY]]:
-; CHECK-ARM-NEXT:    [[VAL3:%.*]] = phi <8 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-ARM-NEXT:    ret <8 x i8> [[VAL3]]
-;
-; CHECK-HEXAGON-LABEL: define <8 x i8> @shuffle_v8i8(
-; CHECK-HEXAGON-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-HEXAGON-NEXT:  [[ENTRY:.*:]]
-; CHECK-HEXAGON-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-HEXAGON:       [[THEN]]:
-; CHECK-HEXAGON-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-HEXAGON-NEXT:    tail call void @func0()
-; CHECK-HEXAGON-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-HEXAGON:       [[ELSE]]:
-; CHECK-HEXAGON-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-HEXAGON-NEXT:    tail call void @func1()
-; CHECK-HEXAGON-NEXT:    br label %[[FINALLY]]
-; CHECK-HEXAGON:       [[FINALLY]]:
-; CHECK-HEXAGON-NEXT:    [[VAL3:%.*]] = phi <8 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-HEXAGON-NEXT:    ret <8 x i8> [[VAL3]]
-;
-; CHECK-RISCV-LABEL: define <8 x i8> @shuffle_v8i8(
-; CHECK-RISCV-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-RISCV-NEXT:  [[ENTRY:.*:]]
-; CHECK-RISCV-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-RISCV:       [[THEN]]:
-; CHECK-RISCV-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-RISCV-NEXT:    tail call void @func0()
-; CHECK-RISCV-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-RISCV:       [[ELSE]]:
-; CHECK-RISCV-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-RISCV-NEXT:    tail call void @func1()
-; CHECK-RISCV-NEXT:    br label %[[FINALLY]]
-; CHECK-RISCV:       [[FINALLY]]:
-; CHECK-RISCV-NEXT:    [[VAL3:%.*]] = phi <8 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-RISCV-NEXT:    ret <8 x i8> [[VAL3]]
-;
-; CHECK-X86-V1-LABEL: define <8 x i8> @shuffle_v8i8(
-; CHECK-X86-V1-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V1-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V1:       [[THEN]]:
-; CHECK-X86-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-X86-V1-NEXT:    tail call void @func0()
-; CHECK-X86-V1-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V1:       [[ELSE]]:
-; CHECK-X86-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V1-NEXT:    tail call void @func1()
-; CHECK-X86-V1-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V1:       [[FINALLY]]:
-; CHECK-X86-V1-NEXT:    [[VAL3:%.*]] = phi <8 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V1-NEXT:    ret <8 x i8> [[VAL3]]
-;
-; CHECK-X86-V2-LABEL: define <8 x i8> @shuffle_v8i8(
-; CHECK-X86-V2-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V2-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V2:       [[THEN]]:
-; CHECK-X86-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-X86-V2-NEXT:    tail call void @func0()
-; CHECK-X86-V2-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V2:       [[ELSE]]:
-; CHECK-X86-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V2-NEXT:    tail call void @func1()
-; CHECK-X86-V2-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V2:       [[FINALLY]]:
-; CHECK-X86-V2-NEXT:    [[VAL3:%.*]] = phi <8 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V2-NEXT:    ret <8 x i8> [[VAL3]]
-;
-; CHECK-X86-V3-LABEL: define <8 x i8> @shuffle_v8i8(
-; CHECK-X86-V3-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V3-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V3:       [[THEN]]:
-; CHECK-X86-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-X86-V3-NEXT:    tail call void @func0()
-; CHECK-X86-V3-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V3:       [[ELSE]]:
-; CHECK-X86-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V3-NEXT:    tail call void @func1()
-; CHECK-X86-V3-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V3:       [[FINALLY]]:
-; CHECK-X86-V3-NEXT:    [[VAL3:%.*]] = phi <8 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V3-NEXT:    ret <8 x i8> [[VAL3]]
-;
-; CHECK-X86-V4-LABEL: define <8 x i8> @shuffle_v8i8(
-; CHECK-X86-V4-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V4-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V4:       [[THEN]]:
-; CHECK-X86-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-X86-V4-NEXT:    tail call void @func0()
-; CHECK-X86-V4-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V4:       [[ELSE]]:
-; CHECK-X86-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V4-NEXT:    tail call void @func1()
-; CHECK-X86-V4-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V4:       [[FINALLY]]:
-; CHECK-X86-V4-NEXT:    [[VAL3:%.*]] = phi <8 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V4-NEXT:    ret <8 x i8> [[VAL3]]
-;
 entry:
   br i1 %cond, label %then, label %else
 
@@ -564,150 +123,6 @@ define <16 x i8> @shuffle_v16i8(<3 x i8> %arg0, i1 %cond) {
 ; CHECK-NEXT:    [[VAL3:%.*]] = phi <16 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
 ; CHECK-NEXT:    ret <16 x i8> [[VAL3]]
 ;
-; CHECK-AARCH64-LABEL: define <16 x i8> @shuffle_v16i8(
-; CHECK-AARCH64-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-AARCH64-NEXT:  [[ENTRY:.*:]]
-; CHECK-AARCH64-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-AARCH64:       [[THEN]]:
-; CHECK-AARCH64-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-AARCH64-NEXT:    tail call void @func0()
-; CHECK-AARCH64-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-AARCH64:       [[ELSE]]:
-; CHECK-AARCH64-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-AARCH64-NEXT:    tail call void @func1()
-; CHECK-AARCH64-NEXT:    br label %[[FINALLY]]
-; CHECK-AARCH64:       [[FINALLY]]:
-; CHECK-AARCH64-NEXT:    [[VAL3:%.*]] = phi <16 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-AARCH64-NEXT:    ret <16 x i8> [[VAL3]]
-;
-; CHECK-AMDGPU-LABEL: define <16 x i8> @shuffle_v16i8(
-; CHECK-AMDGPU-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-AMDGPU-NEXT:  [[ENTRY:.*:]]
-; CHECK-AMDGPU-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-AMDGPU:       [[THEN]]:
-; CHECK-AMDGPU-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-AMDGPU-NEXT:    tail call void @func0()
-; CHECK-AMDGPU-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-AMDGPU:       [[ELSE]]:
-; CHECK-AMDGPU-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-AMDGPU-NEXT:    tail call void @func1()
-; CHECK-AMDGPU-NEXT:    br label %[[FINALLY]]
-; CHECK-AMDGPU:       [[FINALLY]]:
-; CHECK-AMDGPU-NEXT:    [[VAL3:%.*]] = phi <16 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-AMDGPU-NEXT:    ret <16 x i8> [[VAL3]]
-;
-; CHECK-ARM-LABEL: define <16 x i8> @shuffle_v16i8(
-; CHECK-ARM-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-ARM-NEXT:  [[ENTRY:.*:]]
-; CHECK-ARM-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-ARM:       [[THEN]]:
-; CHECK-ARM-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-ARM-NEXT:    tail call void @func0()
-; CHECK-ARM-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-ARM:       [[ELSE]]:
-; CHECK-ARM-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-ARM-NEXT:    tail call void @func1()
-; CHECK-ARM-NEXT:    br label %[[FINALLY]]
-; CHECK-ARM:       [[FINALLY]]:
-; CHECK-ARM-NEXT:    [[VAL3:%.*]] = phi <16 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-ARM-NEXT:    ret <16 x i8> [[VAL3]]
-;
-; CHECK-HEXAGON-LABEL: define <16 x i8> @shuffle_v16i8(
-; CHECK-HEXAGON-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-HEXAGON-NEXT:  [[ENTRY:.*:]]
-; CHECK-HEXAGON-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-HEXAGON:       [[THEN]]:
-; CHECK-HEXAGON-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-HEXAGON-NEXT:    tail call void @func0()
-; CHECK-HEXAGON-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-HEXAGON:       [[ELSE]]:
-; CHECK-HEXAGON-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-HEXAGON-NEXT:    tail call void @func1()
-; CHECK-HEXAGON-NEXT:    br label %[[FINALLY]]
-; CHECK-HEXAGON:       [[FINALLY]]:
-; CHECK-HEXAGON-NEXT:    [[VAL3:%.*]] = phi <16 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-HEXAGON-NEXT:    ret <16 x i8> [[VAL3]]
-;
-; CHECK-RISCV-LABEL: define <16 x i8> @shuffle_v16i8(
-; CHECK-RISCV-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-RISCV-NEXT:  [[ENTRY:.*:]]
-; CHECK-RISCV-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-RISCV:       [[THEN]]:
-; CHECK-RISCV-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-RISCV-NEXT:    tail call void @func0()
-; CHECK-RISCV-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-RISCV:       [[ELSE]]:
-; CHECK-RISCV-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-RISCV-NEXT:    tail call void @func1()
-; CHECK-RISCV-NEXT:    br label %[[FINALLY]]
-; CHECK-RISCV:       [[FINALLY]]:
-; CHECK-RISCV-NEXT:    [[VAL3:%.*]] = phi <16 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-RISCV-NEXT:    ret <16 x i8> [[VAL3]]
-;
-; CHECK-X86-V1-LABEL: define <16 x i8> @shuffle_v16i8(
-; CHECK-X86-V1-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V1-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V1:       [[THEN]]:
-; CHECK-X86-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-X86-V1-NEXT:    tail call void @func0()
-; CHECK-X86-V1-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V1:       [[ELSE]]:
-; CHECK-X86-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V1-NEXT:    tail call void @func1()
-; CHECK-X86-V1-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V1:       [[FINALLY]]:
-; CHECK-X86-V1-NEXT:    [[VAL3:%.*]] = phi <16 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V1-NEXT:    ret <16 x i8> [[VAL3]]
-;
-; CHECK-X86-V2-LABEL: define <16 x i8> @shuffle_v16i8(
-; CHECK-X86-V2-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V2-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V2:       [[THEN]]:
-; CHECK-X86-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-X86-V2-NEXT:    tail call void @func0()
-; CHECK-X86-V2-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V2:       [[ELSE]]:
-; CHECK-X86-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V2-NEXT:    tail call void @func1()
-; CHECK-X86-V2-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V2:       [[FINALLY]]:
-; CHECK-X86-V2-NEXT:    [[VAL3:%.*]] = phi <16 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V2-NEXT:    ret <16 x i8> [[VAL3]]
-;
-; CHECK-X86-V3-LABEL: define <16 x i8> @shuffle_v16i8(
-; CHECK-X86-V3-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V3-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V3:       [[THEN]]:
-; CHECK-X86-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-X86-V3-NEXT:    tail call void @func0()
-; CHECK-X86-V3-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V3:       [[ELSE]]:
-; CHECK-X86-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V3-NEXT:    tail call void @func1()
-; CHECK-X86-V3-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V3:       [[FINALLY]]:
-; CHECK-X86-V3-NEXT:    [[VAL3:%.*]] = phi <16 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V3-NEXT:    ret <16 x i8> [[VAL3]]
-;
-; CHECK-X86-V4-LABEL: define <16 x i8> @shuffle_v16i8(
-; CHECK-X86-V4-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V4-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V4:       [[THEN]]:
-; CHECK-X86-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-X86-V4-NEXT:    tail call void @func0()
-; CHECK-X86-V4-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V4:       [[ELSE]]:
-; CHECK-X86-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V4-NEXT:    tail call void @func1()
-; CHECK-X86-V4-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V4:       [[FINALLY]]:
-; CHECK-X86-V4-NEXT:    [[VAL3:%.*]] = phi <16 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V4-NEXT:    ret <16 x i8> [[VAL3]]
-;
 entry:
   br i1 %cond, label %then, label %else
 
@@ -743,150 +158,6 @@ define <32 x i8> @shuffle_v32i8(<3 x i8> %arg0, i1 %cond) {
 ; CHECK-NEXT:    [[VAL3:%.*]] = phi <32 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
 ; CHECK-NEXT:    ret <32 x i8> [[VAL3]]
 ;
-; CHECK-AARCH64-LABEL: define <32 x i8> @shuffle_v32i8(
-; CHECK-AARCH64-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-AARCH64-NEXT:  [[ENTRY:.*:]]
-; CHECK-AARCH64-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-AARCH64:       [[THEN]]:
-; CHECK-AARCH64-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-AARCH64-NEXT:    tail call void @func0()
-; CHECK-AARCH64-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-AARCH64:       [[ELSE]]:
-; CHECK-AARCH64-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-AARCH64-NEXT:    tail call void @func1()
-; CHECK-AARCH64-NEXT:    br label %[[FINALLY]]
-; CHECK-AARCH64:       [[FINALLY]]:
-; CHECK-AARCH64-NEXT:    [[VAL3:%.*]] = phi <32 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-AARCH64-NEXT:    ret <32 x i8> [[VAL3]]
-;
-; CHECK-AMDGPU-LABEL: define <32 x i8> @shuffle_v32i8(
-; CHECK-AMDGPU-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-AMDGPU-NEXT:  [[ENTRY:.*:]]
-; CHECK-AMDGPU-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-AMDGPU:       [[THEN]]:
-; CHECK-AMDGPU-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-AMDGPU-NEXT:    tail call void @func0()
-; CHECK-AMDGPU-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-AMDGPU:       [[ELSE]]:
-; CHECK-AMDGPU-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-AMDGPU-NEXT:    tail call void @func1()
-; CHECK-AMDGPU-NEXT:    br label %[[FINALLY]]
-; CHECK-AMDGPU:       [[FINALLY]]:
-; CHECK-AMDGPU-NEXT:    [[VAL3:%.*]] = phi <32 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-AMDGPU-NEXT:    ret <32 x i8> [[VAL3]]
-;
-; CHECK-ARM-LABEL: define <32 x i8> @shuffle_v32i8(
-; CHECK-ARM-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-ARM-NEXT:  [[ENTRY:.*:]]
-; CHECK-ARM-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-ARM:       [[THEN]]:
-; CHECK-ARM-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-ARM-NEXT:    tail call void @func0()
-; CHECK-ARM-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-ARM:       [[ELSE]]:
-; CHECK-ARM-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-ARM-NEXT:    tail call void @func1()
-; CHECK-ARM-NEXT:    br label %[[FINALLY]]
-; CHECK-ARM:       [[FINALLY]]:
-; CHECK-ARM-NEXT:    [[VAL3:%.*]] = phi <32 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-ARM-NEXT:    ret <32 x i8> [[VAL3]]
-;
-; CHECK-HEXAGON-LABEL: define <32 x i8> @shuffle_v32i8(
-; CHECK-HEXAGON-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-HEXAGON-NEXT:  [[ENTRY:.*:]]
-; CHECK-HEXAGON-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-HEXAGON:       [[THEN]]:
-; CHECK-HEXAGON-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-HEXAGON-NEXT:    tail call void @func0()
-; CHECK-HEXAGON-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-HEXAGON:       [[ELSE]]:
-; CHECK-HEXAGON-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-HEXAGON-NEXT:    tail call void @func1()
-; CHECK-HEXAGON-NEXT:    br label %[[FINALLY]]
-; CHECK-HEXAGON:       [[FINALLY]]:
-; CHECK-HEXAGON-NEXT:    [[VAL3:%.*]] = phi <32 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-HEXAGON-NEXT:    ret <32 x i8> [[VAL3]]
-;
-; CHECK-RISCV-LABEL: define <32 x i8> @shuffle_v32i8(
-; CHECK-RISCV-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-RISCV-NEXT:  [[ENTRY:.*:]]
-; CHECK-RISCV-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-RISCV:       [[THEN]]:
-; CHECK-RISCV-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-RISCV-NEXT:    tail call void @func0()
-; CHECK-RISCV-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-RISCV:       [[ELSE]]:
-; CHECK-RISCV-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-RISCV-NEXT:    tail call void @func1()
-; CHECK-RISCV-NEXT:    br label %[[FINALLY]]
-; CHECK-RISCV:       [[FINALLY]]:
-; CHECK-RISCV-NEXT:    [[VAL3:%.*]] = phi <32 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-RISCV-NEXT:    ret <32 x i8> [[VAL3]]
-;
-; CHECK-X86-V1-LABEL: define <32 x i8> @shuffle_v32i8(
-; CHECK-X86-V1-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V1-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V1:       [[THEN]]:
-; CHECK-X86-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-X86-V1-NEXT:    tail call void @func0()
-; CHECK-X86-V1-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V1:       [[ELSE]]:
-; CHECK-X86-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V1-NEXT:    tail call void @func1()
-; CHECK-X86-V1-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V1:       [[FINALLY]]:
-; CHECK-X86-V1-NEXT:    [[VAL3:%.*]] = phi <32 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V1-NEXT:    ret <32 x i8> [[VAL3]]
-;
-; CHECK-X86-V2-LABEL: define <32 x i8> @shuffle_v32i8(
-; CHECK-X86-V2-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V2-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V2:       [[THEN]]:
-; CHECK-X86-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-X86-V2-NEXT:    tail call void @func0()
-; CHECK-X86-V2-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V2:       [[ELSE]]:
-; CHECK-X86-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V2-NEXT:    tail call void @func1()
-; CHECK-X86-V2-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V2:       [[FINALLY]]:
-; CHECK-X86-V2-NEXT:    [[VAL3:%.*]] = phi <32 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V2-NEXT:    ret <32 x i8> [[VAL3]]
-;
-; CHECK-X86-V3-LABEL: define <32 x i8> @shuffle_v32i8(
-; CHECK-X86-V3-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V3-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V3:       [[THEN]]:
-; CHECK-X86-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-X86-V3-NEXT:    tail call void @func0()
-; CHECK-X86-V3-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V3:       [[ELSE]]:
-; CHECK-X86-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V3-NEXT:    tail call void @func1()
-; CHECK-X86-V3-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V3:       [[FINALLY]]:
-; CHECK-X86-V3-NEXT:    [[VAL3:%.*]] = phi <32 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V3-NEXT:    ret <32 x i8> [[VAL3]]
-;
-; CHECK-X86-V4-LABEL: define <32 x i8> @shuffle_v32i8(
-; CHECK-X86-V4-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V4-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V4:       [[THEN]]:
-; CHECK-X86-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-X86-V4-NEXT:    tail call void @func0()
-; CHECK-X86-V4-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V4:       [[ELSE]]:
-; CHECK-X86-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V4-NEXT:    tail call void @func1()
-; CHECK-X86-V4-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V4:       [[FINALLY]]:
-; CHECK-X86-V4-NEXT:    [[VAL3:%.*]] = phi <32 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V4-NEXT:    ret <32 x i8> [[VAL3]]
-;
 entry:
   br i1 %cond, label %then, label %else
 
@@ -922,150 +193,6 @@ define <2 x i16> @shuffle_v2i16(<2 x i16> %arg0, i1 %cond) {
 ; CHECK-NEXT:    [[VAL3:%.*]] = phi <2 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
 ; CHECK-NEXT:    ret <2 x i16> [[VAL3]]
 ;
-; CHECK-AARCH64-LABEL: define <2 x i16> @shuffle_v2i16(
-; CHECK-AARCH64-SAME: <2 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-AARCH64-NEXT:  [[ENTRY:.*:]]
-; CHECK-AARCH64-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-AARCH64:       [[THEN]]:
-; CHECK-AARCH64-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i16> [[ARG0]], <2 x i16> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-AARCH64-NEXT:    tail call void @func0()
-; CHECK-AARCH64-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-AARCH64:       [[ELSE]]:
-; CHECK-AARCH64-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i16> [[ARG0]], <2 x i16> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-AARCH64-NEXT:    tail call void @func1()
-; CHECK-AARCH64-NEXT:    br label %[[FINALLY]]
-; CHECK-AARCH64:       [[FINALLY]]:
-; CHECK-AARCH64-NEXT:    [[VAL3:%.*]] = phi <2 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-AARCH64-NEXT:    ret <2 x i16> [[VAL3]]
-;
-; CHECK-AMDGPU-LABEL: define <2 x i16> @shuffle_v2i16(
-; CHECK-AMDGPU-SAME: <2 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-AMDGPU-NEXT:  [[ENTRY:.*:]]
-; CHECK-AMDGPU-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-AMDGPU:       [[THEN]]:
-; CHECK-AMDGPU-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i16> [[ARG0]], <2 x i16> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-AMDGPU-NEXT:    tail call void @func0()
-; CHECK-AMDGPU-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-AMDGPU:       [[ELSE]]:
-; CHECK-AMDGPU-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i16> [[ARG0]], <2 x i16> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-AMDGPU-NEXT:    tail call void @func1()
-; CHECK-AMDGPU-NEXT:    br label %[[FINALLY]]
-; CHECK-AMDGPU:       [[FINALLY]]:
-; CHECK-AMDGPU-NEXT:    [[VAL3:%.*]] = phi <2 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-AMDGPU-NEXT:    ret <2 x i16> [[VAL3]]
-;
-; CHECK-ARM-LABEL: define <2 x i16> @shuffle_v2i16(
-; CHECK-ARM-SAME: <2 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-ARM-NEXT:  [[ENTRY:.*:]]
-; CHECK-ARM-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-ARM:       [[THEN]]:
-; CHECK-ARM-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i16> [[ARG0]], <2 x i16> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-ARM-NEXT:    tail call void @func0()
-; CHECK-ARM-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-ARM:       [[ELSE]]:
-; CHECK-ARM-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i16> [[ARG0]], <2 x i16> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-ARM-NEXT:    tail call void @func1()
-; CHECK-ARM-NEXT:    br label %[[FINALLY]]
-; CHECK-ARM:       [[FINALLY]]:
-; CHECK-ARM-NEXT:    [[VAL3:%.*]] = phi <2 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-ARM-NEXT:    ret <2 x i16> [[VAL3]]
-;
-; CHECK-HEXAGON-LABEL: define <2 x i16> @shuffle_v2i16(
-; CHECK-HEXAGON-SAME: <2 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-HEXAGON-NEXT:  [[ENTRY:.*:]]
-; CHECK-HEXAGON-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-HEXAGON:       [[THEN]]:
-; CHECK-HEXAGON-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i16> [[ARG0]], <2 x i16> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-HEXAGON-NEXT:    tail call void @func0()
-; CHECK-HEXAGON-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-HEXAGON:       [[ELSE]]:
-; CHECK-HEXAGON-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i16> [[ARG0]], <2 x i16> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-HEXAGON-NEXT:    tail call void @func1()
-; CHECK-HEXAGON-NEXT:    br label %[[FINALLY]]
-; CHECK-HEXAGON:       [[FINALLY]]:
-; CHECK-HEXAGON-NEXT:    [[VAL3:%.*]] = phi <2 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-HEXAGON-NEXT:    ret <2 x i16> [[VAL3]]
-;
-; CHECK-RISCV-LABEL: define <2 x i16> @shuffle_v2i16(
-; CHECK-RISCV-SAME: <2 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-RISCV-NEXT:  [[ENTRY:.*:]]
-; CHECK-RISCV-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-RISCV:       [[THEN]]:
-; CHECK-RISCV-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i16> [[ARG0]], <2 x i16> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-RISCV-NEXT:    tail call void @func0()
-; CHECK-RISCV-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-RISCV:       [[ELSE]]:
-; CHECK-RISCV-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i16> [[ARG0]], <2 x i16> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-RISCV-NEXT:    tail call void @func1()
-; CHECK-RISCV-NEXT:    br label %[[FINALLY]]
-; CHECK-RISCV:       [[FINALLY]]:
-; CHECK-RISCV-NEXT:    [[VAL3:%.*]] = phi <2 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-RISCV-NEXT:    ret <2 x i16> [[VAL3]]
-;
-; CHECK-X86-V1-LABEL: define <2 x i16> @shuffle_v2i16(
-; CHECK-X86-V1-SAME: <2 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V1-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V1:       [[THEN]]:
-; CHECK-X86-V1-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i16> [[ARG0]], <2 x i16> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-X86-V1-NEXT:    tail call void @func0()
-; CHECK-X86-V1-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V1:       [[ELSE]]:
-; CHECK-X86-V1-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i16> [[ARG0]], <2 x i16> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-X86-V1-NEXT:    tail call void @func1()
-; CHECK-X86-V1-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V1:       [[FINALLY]]:
-; CHECK-X86-V1-NEXT:    [[VAL3:%.*]] = phi <2 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V1-NEXT:    ret <2 x i16> [[VAL3]]
-;
-; CHECK-X86-V2-LABEL: define <2 x i16> @shuffle_v2i16(
-; CHECK-X86-V2-SAME: <2 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V2-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V2:       [[THEN]]:
-; CHECK-X86-V2-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i16> [[ARG0]], <2 x i16> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-X86-V2-NEXT:    tail call void @func0()
-; CHECK-X86-V2-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V2:       [[ELSE]]:
-; CHECK-X86-V2-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i16> [[ARG0]], <2 x i16> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-X86-V2-NEXT:    tail call void @func1()
-; CHECK-X86-V2-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V2:       [[FINALLY]]:
-; CHECK-X86-V2-NEXT:    [[VAL3:%.*]] = phi <2 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V2-NEXT:    ret <2 x i16> [[VAL3]]
-;
-; CHECK-X86-V3-LABEL: define <2 x i16> @shuffle_v2i16(
-; CHECK-X86-V3-SAME: <2 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V3-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V3:       [[THEN]]:
-; CHECK-X86-V3-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i16> [[ARG0]], <2 x i16> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-X86-V3-NEXT:    tail call void @func0()
-; CHECK-X86-V3-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V3:       [[ELSE]]:
-; CHECK-X86-V3-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i16> [[ARG0]], <2 x i16> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-X86-V3-NEXT:    tail call void @func1()
-; CHECK-X86-V3-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V3:       [[FINALLY]]:
-; CHECK-X86-V3-NEXT:    [[VAL3:%.*]] = phi <2 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V3-NEXT:    ret <2 x i16> [[VAL3]]
-;
-; CHECK-X86-V4-LABEL: define <2 x i16> @shuffle_v2i16(
-; CHECK-X86-V4-SAME: <2 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V4-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V4:       [[THEN]]:
-; CHECK-X86-V4-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i16> [[ARG0]], <2 x i16> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-X86-V4-NEXT:    tail call void @func0()
-; CHECK-X86-V4-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V4:       [[ELSE]]:
-; CHECK-X86-V4-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i16> [[ARG0]], <2 x i16> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-X86-V4-NEXT:    tail call void @func1()
-; CHECK-X86-V4-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V4:       [[FINALLY]]:
-; CHECK-X86-V4-NEXT:    [[VAL3:%.*]] = phi <2 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V4-NEXT:    ret <2 x i16> [[VAL3]]
-;
 entry:
   br i1 %cond, label %then, label %else
 
@@ -1101,150 +228,6 @@ define <4 x i16> @shuffle_v4i16(<3 x i16> %arg0, i1 %cond) {
 ; CHECK-NEXT:    [[VAL3:%.*]] = phi <4 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
 ; CHECK-NEXT:    ret <4 x i16> [[VAL3]]
 ;
-; CHECK-AARCH64-LABEL: define <4 x i16> @shuffle_v4i16(
-; CHECK-AARCH64-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-AARCH64-NEXT:  [[ENTRY:.*:]]
-; CHECK-AARCH64-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-AARCH64:       [[THEN]]:
-; CHECK-AARCH64-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
-; CHECK-AARCH64-NEXT:    tail call void @func0()
-; CHECK-AARCH64-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-AARCH64:       [[ELSE]]:
-; CHECK-AARCH64-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-; CHECK-AARCH64-NEXT:    tail call void @func1()
-; CHECK-AARCH64-NEXT:    br label %[[FINALLY]]
-; CHECK-AARCH64:       [[FINALLY]]:
-; CHECK-AARCH64-NEXT:    [[VAL3:%.*]] = phi <4 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-AARCH64-NEXT:    ret <4 x i16> [[VAL3]]
-;
-; CHECK-AMDGPU-LABEL: define <4 x i16> @shuffle_v4i16(
-; CHECK-AMDGPU-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-AMDGPU-NEXT:  [[ENTRY:.*:]]
-; CHECK-AMDGPU-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-AMDGPU:       [[THEN]]:
-; CHECK-AMDGPU-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
-; CHECK-AMDGPU-NEXT:    tail call void @func0()
-; CHECK-AMDGPU-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-AMDGPU:       [[ELSE]]:
-; CHECK-AMDGPU-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-; CHECK-AMDGPU-NEXT:    tail call void @func1()
-; CHECK-AMDGPU-NEXT:    br label %[[FINALLY]]
-; CHECK-AMDGPU:       [[FINALLY]]:
-; CHECK-AMDGPU-NEXT:    [[VAL3:%.*]] = phi <4 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-AMDGPU-NEXT:    ret <4 x i16> [[VAL3]]
-;
-; CHECK-ARM-LABEL: define <4 x i16> @shuffle_v4i16(
-; CHECK-ARM-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-ARM-NEXT:  [[ENTRY:.*:]]
-; CHECK-ARM-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-ARM:       [[THEN]]:
-; CHECK-ARM-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
-; CHECK-ARM-NEXT:    tail call void @func0()
-; CHECK-ARM-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-ARM:       [[ELSE]]:
-; CHECK-ARM-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-; CHECK-ARM-NEXT:    tail call void @func1()
-; CHECK-ARM-NEXT:    br label %[[FINALLY]]
-; CHECK-ARM:       [[FINALLY]]:
-; CHECK-ARM-NEXT:    [[VAL3:%.*]] = phi <4 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-ARM-NEXT:    ret <4 x i16> [[VAL3]]
-;
-; CHECK-HEXAGON-LABEL: define <4 x i16> @shuffle_v4i16(
-; CHECK-HEXAGON-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-HEXAGON-NEXT:  [[ENTRY:.*:]]
-; CHECK-HEXAGON-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-HEXAGON:       [[THEN]]:
-; CHECK-HEXAGON-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
-; CHECK-HEXAGON-NEXT:    tail call void @func0()
-; CHECK-HEXAGON-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-HEXAGON:       [[ELSE]]:
-; CHECK-HEXAGON-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-; CHECK-HEXAGON-NEXT:    tail call void @func1()
-; CHECK-HEXAGON-NEXT:    br label %[[FINALLY]]
-; CHECK-HEXAGON:       [[FINALLY]]:
-; CHECK-HEXAGON-NEXT:    [[VAL3:%.*]] = phi <4 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-HEXAGON-NEXT:    ret <4 x i16> [[VAL3]]
-;
-; CHECK-RISCV-LABEL: define <4 x i16> @shuffle_v4i16(
-; CHECK-RISCV-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-RISCV-NEXT:  [[ENTRY:.*:]]
-; CHECK-RISCV-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-RISCV:       [[THEN]]:
-; CHECK-RISCV-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
-; CHECK-RISCV-NEXT:    tail call void @func0()
-; CHECK-RISCV-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-RISCV:       [[ELSE]]:
-; CHECK-RISCV-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-; CHECK-RISCV-NEXT:    tail call void @func1()
-; CHECK-RISCV-NEXT:    br label %[[FINALLY]]
-; CHECK-RISCV:       [[FINALLY]]:
-; CHECK-RISCV-NEXT:    [[VAL3:%.*]] = phi <4 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-RISCV-NEXT:    ret <4 x i16> [[VAL3]]
-;
-; CHECK-X86-V1-LABEL: define <4 x i16> @shuffle_v4i16(
-; CHECK-X86-V1-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V1-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V1:       [[THEN]]:
-; CHECK-X86-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
-; CHECK-X86-V1-NEXT:    tail call void @func0()
-; CHECK-X86-V1-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V1:       [[ELSE]]:
-; CHECK-X86-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V1-NEXT:    tail call void @func1()
-; CHECK-X86-V1-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V1:       [[FINALLY]]:
-; CHECK-X86-V1-NEXT:    [[VAL3:%.*]] = phi <4 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V1-NEXT:    ret <4 x i16> [[VAL3]]
-;
-; CHECK-X86-V2-LABEL: define <4 x i16> @shuffle_v4i16(
-; CHECK-X86-V2-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V2-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V2:       [[THEN]]:
-; CHECK-X86-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
-; CHECK-X86-V2-NEXT:    tail call void @func0()
-; CHECK-X86-V2-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V2:       [[ELSE]]:
-; CHECK-X86-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V2-NEXT:    tail call void @func1()
-; CHECK-X86-V2-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V2:       [[FINALLY]]:
-; CHECK-X86-V2-NEXT:    [[VAL3:%.*]] = phi <4 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V2-NEXT:    ret <4 x i16> [[VAL3]]
-;
-; CHECK-X86-V3-LABEL: define <4 x i16> @shuffle_v4i16(
-; CHECK-X86-V3-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V3-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V3:       [[THEN]]:
-; CHECK-X86-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
-; CHECK-X86-V3-NEXT:    tail call void @func0()
-; CHECK-X86-V3-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V3:       [[ELSE]]:
-; CHECK-X86-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V3-NEXT:    tail call void @func1()
-; CHECK-X86-V3-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V3:       [[FINALLY]]:
-; CHECK-X86-V3-NEXT:    [[VAL3:%.*]] = phi <4 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V3-NEXT:    ret <4 x i16> [[VAL3]]
-;
-; CHECK-X86-V4-LABEL: define <4 x i16> @shuffle_v4i16(
-; CHECK-X86-V4-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V4-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V4:       [[THEN]]:
-; CHECK-X86-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
-; CHECK-X86-V4-NEXT:    tail call void @func0()
-; CHECK-X86-V4-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V4:       [[ELSE]]:
-; CHECK-X86-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V4-NEXT:    tail call void @func1()
-; CHECK-X86-V4-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V4:       [[FINALLY]]:
-; CHECK-X86-V4-NEXT:    [[VAL3:%.*]] = phi <4 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V4-NEXT:    ret <4 x i16> [[VAL3]]
-;
 entry:
   br i1 %cond, label %then, label %else
 
@@ -1280,150 +263,6 @@ define <8 x i16> @shuffle_v8i16(<3 x i16> %arg0, i1 %cond) {
 ; CHECK-NEXT:    [[VAL3:%.*]] = phi <8 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
 ; CHECK-NEXT:    ret <8 x i16> [[VAL3]]
 ;
-; CHECK-AARCH64-LABEL: define <8 x i16> @shuffle_v8i16(
-; CHECK-AARCH64-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-AARCH64-NEXT:  [[ENTRY:.*:]]
-; CHECK-AARCH64-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-AARCH64:       [[THEN]]:
-; CHECK-AARCH64-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-AARCH64-NEXT:    tail call void @func0()
-; CHECK-AARCH64-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-AARCH64:       [[ELSE]]:
-; CHECK-AARCH64-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-AARCH64-NEXT:    tail call void @func1()
-; CHECK-AARCH64-NEXT:    br label %[[FINALLY]]
-; CHECK-AARCH64:       [[FINALLY]]:
-; CHECK-AARCH64-NEXT:    [[VAL3:%.*]] = phi <8 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-AARCH64-NEXT:    ret <8 x i16> [[VAL3]]
-;
-; CHECK-AMDGPU-LABEL: define <8 x i16> @shuffle_v8i16(
-; CHECK-AMDGPU-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-AMDGPU-NEXT:  [[ENTRY:.*:]]
-; CHECK-AMDGPU-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-AMDGPU:       [[THEN]]:
-; CHECK-AMDGPU-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-AMDGPU-NEXT:    tail call void @func0()
-; CHECK-AMDGPU-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-AMDGPU:       [[ELSE]]:
-; CHECK-AMDGPU-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-AMDGPU-NEXT:    tail call void @func1()
-; CHECK-AMDGPU-NEXT:    br label %[[FINALLY]]
-; CHECK-AMDGPU:       [[FINALLY]]:
-; CHECK-AMDGPU-NEXT:    [[VAL3:%.*]] = phi <8 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-AMDGPU-NEXT:    ret <8 x i16> [[VAL3]]
-;
-; CHECK-ARM-LABEL: define <8 x i16> @shuffle_v8i16(
-; CHECK-ARM-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-ARM-NEXT:  [[ENTRY:.*:]]
-; CHECK-ARM-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-ARM:       [[THEN]]:
-; CHECK-ARM-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-ARM-NEXT:    tail call void @func0()
-; CHECK-ARM-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-ARM:       [[ELSE]]:
-; CHECK-ARM-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-ARM-NEXT:    tail call void @func1()
-; CHECK-ARM-NEXT:    br label %[[FINALLY]]
-; CHECK-ARM:       [[FINALLY]]:
-; CHECK-ARM-NEXT:    [[VAL3:%.*]] = phi <8 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-ARM-NEXT:    ret <8 x i16> [[VAL3]]
-;
-; CHECK-HEXAGON-LABEL: define <8 x i16> @shuffle_v8i16(
-; CHECK-HEXAGON-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-HEXAGON-NEXT:  [[ENTRY:.*:]]
-; CHECK-HEXAGON-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-HEXAGON:       [[THEN]]:
-; CHECK-HEXAGON-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-HEXAGON-NEXT:    tail call void @func0()
-; CHECK-HEXAGON-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-HEXAGON:       [[ELSE]]:
-; CHECK-HEXAGON-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-HEXAGON-NEXT:    tail call void @func1()
-; CHECK-HEXAGON-NEXT:    br label %[[FINALLY]]
-; CHECK-HEXAGON:       [[FINALLY]]:
-; CHECK-HEXAGON-NEXT:    [[VAL3:%.*]] = phi <8 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-HEXAGON-NEXT:    ret <8 x i16> [[VAL3]]
-;
-; CHECK-RISCV-LABEL: define <8 x i16> @shuffle_v8i16(
-; CHECK-RISCV-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-RISCV-NEXT:  [[ENTRY:.*:]]
-; CHECK-RISCV-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-RISCV:       [[THEN]]:
-; CHECK-RISCV-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-RISCV-NEXT:    tail call void @func0()
-; CHECK-RISCV-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-RISCV:       [[ELSE]]:
-; CHECK-RISCV-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-RISCV-NEXT:    tail call void @func1()
-; CHECK-RISCV-NEXT:    br label %[[FINALLY]]
-; CHECK-RISCV:       [[FINALLY]]:
-; CHECK-RISCV-NEXT:    [[VAL3:%.*]] = phi <8 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-RISCV-NEXT:    ret <8 x i16> [[VAL3]]
-;
-; CHECK-X86-V1-LABEL: define <8 x i16> @shuffle_v8i16(
-; CHECK-X86-V1-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V1-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V1:       [[THEN]]:
-; CHECK-X86-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-X86-V1-NEXT:    tail call void @func0()
-; CHECK-X86-V1-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V1:       [[ELSE]]:
-; CHECK-X86-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V1-NEXT:    tail call void @func1()
-; CHECK-X86-V1-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V1:       [[FINALLY]]:
-; CHECK-X86-V1-NEXT:    [[VAL3:%.*]] = phi <8 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V1-NEXT:    ret <8 x i16> [[VAL3]]
-;
-; CHECK-X86-V2-LABEL: define <8 x i16> @shuffle_v8i16(
-; CHECK-X86-V2-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V2-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V2:       [[THEN]]:
-; CHECK-X86-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-X86-V2-NEXT:    tail call void @func0()
-; CHECK-X86-V2-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V2:       [[ELSE]]:
-; CHECK-X86-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V2-NEXT:    tail call void @func1()
-; CHECK-X86-V2-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V2:       [[FINALLY]]:
-; CHECK-X86-V2-NEXT:    [[VAL3:%.*]] = phi <8 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V2-NEXT:    ret <8 x i16> [[VAL3]]
-;
-; CHECK-X86-V3-LABEL: define <8 x i16> @shuffle_v8i16(
-; CHECK-X86-V3-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V3-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V3:       [[THEN]]:
-; CHECK-X86-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-X86-V3-NEXT:    tail call void @func0()
-; CHECK-X86-V3-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V3:       [[ELSE]]:
-; CHECK-X86-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V3-NEXT:    tail call void @func1()
-; CHECK-X86-V3-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V3:       [[FINALLY]]:
-; CHECK-X86-V3-NEXT:    [[VAL3:%.*]] = phi <8 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V3-NEXT:    ret <8 x i16> [[VAL3]]
-;
-; CHECK-X86-V4-LABEL: define <8 x i16> @shuffle_v8i16(
-; CHECK-X86-V4-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V4-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V4:       [[THEN]]:
-; CHECK-X86-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-X86-V4-NEXT:    tail call void @func0()
-; CHECK-X86-V4-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V4:       [[ELSE]]:
-; CHECK-X86-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V4-NEXT:    tail call void @func1()
-; CHECK-X86-V4-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V4:       [[FINALLY]]:
-; CHECK-X86-V4-NEXT:    [[VAL3:%.*]] = phi <8 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V4-NEXT:    ret <8 x i16> [[VAL3]]
-;
 entry:
   br i1 %cond, label %then, label %else
 
@@ -1459,150 +298,6 @@ define <16 x i16> @shuffle_v16i16(<3 x i16> %arg0, i1 %cond) {
 ; CHECK-NEXT:    [[VAL3:%.*]] = phi <16 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
 ; CHECK-NEXT:    ret <16 x i16> [[VAL3]]
 ;
-; CHECK-AARCH64-LABEL: define <16 x i16> @shuffle_v16i16(
-; CHECK-AARCH64-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-AARCH64-NEXT:  [[ENTRY:.*:]]
-; CHECK-AARCH64-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-AARCH64:       [[THEN]]:
-; CHECK-AARCH64-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-AARCH64-NEXT:    tail call void @func0()
-; CHECK-AARCH64-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-AARCH64:       [[ELSE]]:
-; CHECK-AARCH64-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-AARCH64-NEXT:    tail call void @func1()
-; CHECK-AARCH64-NEXT:    br label %[[FINALLY]]
-; CHECK-AARCH64:       [[FINALLY]]:
-; CHECK-AARCH64-NEXT:    [[VAL3:%.*]] = phi <16 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-AARCH64-NEXT:    ret <16 x i16> [[VAL3]]
-;
-; CHECK-AMDGPU-LABEL: define <16 x i16> @shuffle_v16i16(
-; CHECK-AMDGPU-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-AMDGPU-NEXT:  [[ENTRY:.*:]]
-; CHECK-AMDGPU-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-AMDGPU:       [[THEN]]:
-; CHECK-AMDGPU-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-AMDGPU-NEXT:    tail call void @func0()
-; CHECK-AMDGPU-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-AMDGPU:       [[ELSE]]:
-; CHECK-AMDGPU-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-AMDGPU-NEXT:    tail call void @func1()
-; CHECK-AMDGPU-NEXT:    br label %[[FINALLY]]
-; CHECK-AMDGPU:       [[FINALLY]]:
-; CHECK-AMDGPU-NEXT:    [[VAL3:%.*]] = phi <16 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-AMDGPU-NEXT:    ret <16 x i16> [[VAL3]]
-;
-; CHECK-ARM-LABEL: define <16 x i16> @shuffle_v16i16(
-; CHECK-ARM-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-ARM-NEXT:  [[ENTRY:.*:]]
-; CHECK-ARM-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-ARM:       [[THEN]]:
-; CHECK-ARM-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-ARM-NEXT:    tail call void @func0()
-; CHECK-ARM-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-ARM:       [[ELSE]]:
-; CHECK-ARM-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-ARM-NEXT:    tail call void @func1()
-; CHECK-ARM-NEXT:    br label %[[FINALLY]]
-; CHECK-ARM:       [[FINALLY]]:
-; CHECK-ARM-NEXT:    [[VAL3:%.*]] = phi <16 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-ARM-NEXT:    ret <16 x i16> [[VAL3]]
-;
-; CHECK-HEXAGON-LABEL: define <16 x i16> @shuffle_v16i16(
-; CHECK-HEXAGON-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-HEXAGON-NEXT:  [[ENTRY:.*:]]
-; CHECK-HEXAGON-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-HEXAGON:       [[THEN]]:
-; CHECK-HEXAGON-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-HEXAGON-NEXT:    tail call void @func0()
-; CHECK-HEXAGON-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-HEXAGON:       [[ELSE]]:
-; CHECK-HEXAGON-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-HEXAGON-NEXT:    tail call void @func1()
-; CHECK-HEXAGON-NEXT:    br label %[[FINALLY]]
-; CHECK-HEXAGON:       [[FINALLY]]:
-; CHECK-HEXAGON-NEXT:    [[VAL3:%.*]] = phi <16 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-HEXAGON-NEXT:    ret <16 x i16> [[VAL3]]
-;
-; CHECK-RISCV-LABEL: define <16 x i16> @shuffle_v16i16(
-; CHECK-RISCV-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-RISCV-NEXT:  [[ENTRY:.*:]]
-; CHECK-RISCV-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-RISCV:       [[THEN]]:
-; CHECK-RISCV-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-RISCV-NEXT:    tail call void @func0()
-; CHECK-RISCV-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-RISCV:       [[ELSE]]:
-; CHECK-RISCV-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-RISCV-NEXT:    tail call void @func1()
-; CHECK-RISCV-NEXT:    br label %[[FINALLY]]
-; CHECK-RISCV:       [[FINALLY]]:
-; CHECK-RISCV-NEXT:    [[VAL3:%.*]] = phi <16 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-RISCV-NEXT:    ret <16 x i16> [[VAL3]]
-;
-; CHECK-X86-V1-LABEL: define <16 x i16> @shuffle_v16i16(
-; CHECK-X86-V1-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V1-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V1:       [[THEN]]:
-; CHECK-X86-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-X86-V1-NEXT:    tail call void @func0()
-; CHECK-X86-V1-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V1:       [[ELSE]]:
-; CHECK-X86-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V1-NEXT:    tail call void @func1()
-; CHECK-X86-V1-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V1:       [[FINALLY]]:
-; CHECK-X86-V1-NEXT:    [[VAL3:%.*]] = phi <16 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V1-NEXT:    ret <16 x i16> [[VAL3]]
-;
-; CHECK-X86-V2-LABEL: define <16 x i16> @shuffle_v16i16(
-; CHECK-X86-V2-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V2-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V2:       [[THEN]]:
-; CHECK-X86-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-X86-V2-NEXT:    tail call void @func0()
-; CHECK-X86-V2-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V2:       [[ELSE]]:
-; CHECK-X86-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V2-NEXT:    tail call void @func1()
-; CHECK-X86-V2-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V2:       [[FINALLY]]:
-; CHECK-X86-V2-NEXT:    [[VAL3:%.*]] = phi <16 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V2-NEXT:    ret <16 x i16> [[VAL3]]
-;
-; CHECK-X86-V3-LABEL: define <16 x i16> @shuffle_v16i16(
-; CHECK-X86-V3-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V3-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V3:       [[THEN]]:
-; CHECK-X86-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-X86-V3-NEXT:    tail call void @func0()
-; CHECK-X86-V3-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V3:       [[ELSE]]:
-; CHECK-X86-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V3-NEXT:    tail call void @func1()
-; CHECK-X86-V3-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V3:       [[FINALLY]]:
-; CHECK-X86-V3-NEXT:    [[VAL3:%.*]] = phi <16 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V3-NEXT:    ret <16 x i16> [[VAL3]]
-;
-; CHECK-X86-V4-LABEL: define <16 x i16> @shuffle_v16i16(
-; CHECK-X86-V4-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V4-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V4:       [[THEN]]:
-; CHECK-X86-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-X86-V4-NEXT:    tail call void @func0()
-; CHECK-X86-V4-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V4:       [[ELSE]]:
-; CHECK-X86-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V4-NEXT:    tail call void @func1()
-; CHECK-X86-V4-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V4:       [[FINALLY]]:
-; CHECK-X86-V4-NEXT:    [[VAL3:%.*]] = phi <16 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V4-NEXT:    ret <16 x i16> [[VAL3]]
-;
 entry:
   br i1 %cond, label %then, label %else
 
@@ -1638,150 +333,6 @@ define <32 x i16> @shuffle_v32i16(<3 x i16> %arg0, i1 %cond) {
 ; CHECK-NEXT:    [[VAL3:%.*]] = phi <32 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
 ; CHECK-NEXT:    ret <32 x i16> [[VAL3]]
 ;
-; CHECK-AARCH64-LABEL: define <32 x i16> @shuffle_v32i16(
-; CHECK-AARCH64-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-AARCH64-NEXT:  [[ENTRY:.*:]]
-; CHECK-AARCH64-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-AARCH64:       [[THEN]]:
-; CHECK-AARCH64-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-AARCH64-NEXT:    tail call void @func0()
-; CHECK-AARCH64-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-AARCH64:       [[ELSE]]:
-; CHECK-AARCH64-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-AARCH64-NEXT:    tail call void @func1()
-; CHECK-AARCH64-NEXT:    br label %[[FINALLY]]
-; CHECK-AARCH64:       [[FINALLY]]:
-; CHECK-AARCH64-NEXT:    [[VAL3:%.*]] = phi <32 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-AARCH64-NEXT:    ret <32 x i16> [[VAL3]]
-;
-; CHECK-AMDGPU-LABEL: define <32 x i16> @shuffle_v32i16(
-; CHECK-AMDGPU-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-AMDGPU-NEXT:  [[ENTRY:.*:]]
-; CHECK-AMDGPU-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-AMDGPU:       [[THEN]]:
-; CHECK-AMDGPU-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-AMDGPU-NEXT:    tail call void @func0()
-; CHECK-AMDGPU-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-AMDGPU:       [[ELSE]]:
-; CHECK-AMDGPU-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-AMDGPU-NEXT:    tail call void @func1()
-; CHECK-AMDGPU-NEXT:    br label %[[FINALLY]]
-; CHECK-AMDGPU:       [[FINALLY]]:
-; CHECK-AMDGPU-NEXT:    [[VAL3:%.*]] = phi <32 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-AMDGPU-NEXT:    ret <32 x i16> [[VAL3]]
-;
-; CHECK-ARM-LABEL: define <32 x i16> @shuffle_v32i16(
-; CHECK-ARM-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-ARM-NEXT:  [[ENTRY:.*:]]
-; CHECK-ARM-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-ARM:       [[THEN]]:
-; CHECK-ARM-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-ARM-NEXT:    tail call void @func0()
-; CHECK-ARM-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-ARM:       [[ELSE]]:
-; CHECK-ARM-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-ARM-NEXT:    tail call void @func1()
-; CHECK-ARM-NEXT:    br label %[[FINALLY]]
-; CHECK-ARM:       [[FINALLY]]:
-; CHECK-ARM-NEXT:    [[VAL3:%.*]] = phi <32 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-ARM-NEXT:    ret <32 x i16> [[VAL3]]
-;
-; CHECK-HEXAGON-LABEL: define <32 x i16> @shuffle_v32i16(
-; CHECK-HEXAGON-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-HEXAGON-NEXT:  [[ENTRY:.*:]]
-; CHECK-HEXAGON-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-HEXAGON:       [[THEN]]:
-; CHECK-HEXAGON-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-HEXAGON-NEXT:    tail call void @func0()
-; CHECK-HEXAGON-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-HEXAGON:       [[ELSE]]:
-; CHECK-HEXAGON-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-HEXAGON-NEXT:    tail call void @func1()
-; CHECK-HEXAGON-NEXT:    br label %[[FINALLY]]
-; CHECK-HEXAGON:       [[FINALLY]]:
-; CHECK-HEXAGON-NEXT:    [[VAL3:%.*]] = phi <32 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-HEXAGON-NEXT:    ret <32 x i16> [[VAL3]]
-;
-; CHECK-RISCV-LABEL: define <32 x i16> @shuffle_v32i16(
-; CHECK-RISCV-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-RISCV-NEXT:  [[ENTRY:.*:]]
-; CHECK-RISCV-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-RISCV:       [[THEN]]:
-; CHECK-RISCV-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-RISCV-NEXT:    tail call void @func0()
-; CHECK-RISCV-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-RISCV:       [[ELSE]]:
-; CHECK-RISCV-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-RISCV-NEXT:    tail call void @func1()
-; CHECK-RISCV-NEXT:    br label %[[FINALLY]]
-; CHECK-RISCV:       [[FINALLY]]:
-; CHECK-RISCV-NEXT:    [[VAL3:%.*]] = phi <32 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-RISCV-NEXT:    ret <32 x i16> [[VAL3]]
-;
-; CHECK-X86-V1-LABEL: define <32 x i16> @shuffle_v32i16(
-; CHECK-X86-V1-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V1-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V1:       [[THEN]]:
-; CHECK-X86-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-X86-V1-NEXT:    tail call void @func0()
-; CHECK-X86-V1-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V1:       [[ELSE]]:
-; CHECK-X86-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V1-NEXT:    tail call void @func1()
-; CHECK-X86-V1-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V1:       [[FINALLY]]:
-; CHECK-X86-V1-NEXT:    [[VAL3:%.*]] = phi <32 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V1-NEXT:    ret <32 x i16> [[VAL3]]
-;
-; CHECK-X86-V2-LABEL: define <32 x i16> @shuffle_v32i16(
-; CHECK-X86-V2-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V2-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V2:       [[THEN]]:
-; CHECK-X86-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-X86-V2-NEXT:    tail call void @func0()
-; CHECK-X86-V2-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V2:       [[ELSE]]:
-; CHECK-X86-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V2-NEXT:    tail call void @func1()
-; CHECK-X86-V2-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V2:       [[FINALLY]]:
-; CHECK-X86-V2-NEXT:    [[VAL3:%.*]] = phi <32 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V2-NEXT:    ret <32 x i16> [[VAL3]]
-;
-; CHECK-X86-V3-LABEL: define <32 x i16> @shuffle_v32i16(
-; CHECK-X86-V3-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V3-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V3:       [[THEN]]:
-; CHECK-X86-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-X86-V3-NEXT:    tail call void @func0()
-; CHECK-X86-V3-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V3:       [[ELSE]]:
-; CHECK-X86-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V3-NEXT:    tail call void @func1()
-; CHECK-X86-V3-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V3:       [[FINALLY]]:
-; CHECK-X86-V3-NEXT:    [[VAL3:%.*]] = phi <32 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V3-NEXT:    ret <32 x i16> [[VAL3]]
-;
-; CHECK-X86-V4-LABEL: define <32 x i16> @shuffle_v32i16(
-; CHECK-X86-V4-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V4-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V4:       [[THEN]]:
-; CHECK-X86-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-X86-V4-NEXT:    tail call void @func0()
-; CHECK-X86-V4-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V4:       [[ELSE]]:
-; CHECK-X86-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V4-NEXT:    tail call void @func1()
-; CHECK-X86-V4-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V4:       [[FINALLY]]:
-; CHECK-X86-V4-NEXT:    [[VAL3:%.*]] = phi <32 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V4-NEXT:    ret <32 x i16> [[VAL3]]
-;
 entry:
   br i1 %cond, label %then, label %else
 
@@ -1817,150 +368,6 @@ define <2 x i32> @shuffle_v2i32(<2 x i32> %arg0, i1 %cond) {
 ; CHECK-NEXT:    [[VAL3:%.*]] = phi <2 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
 ; CHECK-NEXT:    ret <2 x i32> [[VAL3]]
 ;
-; CHECK-AARCH64-LABEL: define <2 x i32> @shuffle_v2i32(
-; CHECK-AARCH64-SAME: <2 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-AARCH64-NEXT:  [[ENTRY:.*:]]
-; CHECK-AARCH64-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-AARCH64:       [[THEN]]:
-; CHECK-AARCH64-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i32> [[ARG0]], <2 x i32> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-AARCH64-NEXT:    tail call void @func0()
-; CHECK-AARCH64-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-AARCH64:       [[ELSE]]:
-; CHECK-AARCH64-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i32> [[ARG0]], <2 x i32> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-AARCH64-NEXT:    tail call void @func1()
-; CHECK-AARCH64-NEXT:    br label %[[FINALLY]]
-; CHECK-AARCH64:       [[FINALLY]]:
-; CHECK-AARCH64-NEXT:    [[VAL3:%.*]] = phi <2 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-AARCH64-NEXT:    ret <2 x i32> [[VAL3]]
-;
-; CHECK-AMDGPU-LABEL: define <2 x i32> @shuffle_v2i32(
-; CHECK-AMDGPU-SAME: <2 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-AMDGPU-NEXT:  [[ENTRY:.*:]]
-; CHECK-AMDGPU-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-AMDGPU:       [[THEN]]:
-; CHECK-AMDGPU-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i32> [[ARG0]], <2 x i32> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-AMDGPU-NEXT:    tail call void @func0()
-; CHECK-AMDGPU-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-AMDGPU:       [[ELSE]]:
-; CHECK-AMDGPU-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i32> [[ARG0]], <2 x i32> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-AMDGPU-NEXT:    tail call void @func1()
-; CHECK-AMDGPU-NEXT:    br label %[[FINALLY]]
-; CHECK-AMDGPU:       [[FINALLY]]:
-; CHECK-AMDGPU-NEXT:    [[VAL3:%.*]] = phi <2 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-AMDGPU-NEXT:    ret <2 x i32> [[VAL3]]
-;
-; CHECK-ARM-LABEL: define <2 x i32> @shuffle_v2i32(
-; CHECK-ARM-SAME: <2 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-ARM-NEXT:  [[ENTRY:.*:]]
-; CHECK-ARM-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-ARM:       [[THEN]]:
-; CHECK-ARM-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i32> [[ARG0]], <2 x i32> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-ARM-NEXT:    tail call void @func0()
-; CHECK-ARM-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-ARM:       [[ELSE]]:
-; CHECK-ARM-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i32> [[ARG0]], <2 x i32> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-ARM-NEXT:    tail call void @func1()
-; CHECK-ARM-NEXT:    br label %[[FINALLY]]
-; CHECK-ARM:       [[FINALLY]]:
-; CHECK-ARM-NEXT:    [[VAL3:%.*]] = phi <2 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-ARM-NEXT:    ret <2 x i32> [[VAL3]]
-;
-; CHECK-HEXAGON-LABEL: define <2 x i32> @shuffle_v2i32(
-; CHECK-HEXAGON-SAME: <2 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-HEXAGON-NEXT:  [[ENTRY:.*:]]
-; CHECK-HEXAGON-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-HEXAGON:       [[THEN]]:
-; CHECK-HEXAGON-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i32> [[ARG0]], <2 x i32> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-HEXAGON-NEXT:    tail call void @func0()
-; CHECK-HEXAGON-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-HEXAGON:       [[ELSE]]:
-; CHECK-HEXAGON-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i32> [[ARG0]], <2 x i32> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-HEXAGON-NEXT:    tail call void @func1()
-; CHECK-HEXAGON-NEXT:    br label %[[FINALLY]]
-; CHECK-HEXAGON:       [[FINALLY]]:
-; CHECK-HEXAGON-NEXT:    [[VAL3:%.*]] = phi <2 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-HEXAGON-NEXT:    ret <2 x i32> [[VAL3]]
-;
-; CHECK-RISCV-LABEL: define <2 x i32> @shuffle_v2i32(
-; CHECK-RISCV-SAME: <2 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-RISCV-NEXT:  [[ENTRY:.*:]]
-; CHECK-RISCV-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-RISCV:       [[THEN]]:
-; CHECK-RISCV-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i32> [[ARG0]], <2 x i32> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-RISCV-NEXT:    tail call void @func0()
-; CHECK-RISCV-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-RISCV:       [[ELSE]]:
-; CHECK-RISCV-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i32> [[ARG0]], <2 x i32> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-RISCV-NEXT:    tail call void @func1()
-; CHECK-RISCV-NEXT:    br label %[[FINALLY]]
-; CHECK-RISCV:       [[FINALLY]]:
-; CHECK-RISCV-NEXT:    [[VAL3:%.*]] = phi <2 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-RISCV-NEXT:    ret <2 x i32> [[VAL3]]
-;
-; CHECK-X86-V1-LABEL: define <2 x i32> @shuffle_v2i32(
-; CHECK-X86-V1-SAME: <2 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V1-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V1:       [[THEN]]:
-; CHECK-X86-V1-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i32> [[ARG0]], <2 x i32> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-X86-V1-NEXT:    tail call void @func0()
-; CHECK-X86-V1-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V1:       [[ELSE]]:
-; CHECK-X86-V1-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i32> [[ARG0]], <2 x i32> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-X86-V1-NEXT:    tail call void @func1()
-; CHECK-X86-V1-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V1:       [[FINALLY]]:
-; CHECK-X86-V1-NEXT:    [[VAL3:%.*]] = phi <2 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V1-NEXT:    ret <2 x i32> [[VAL3]]
-;
-; CHECK-X86-V2-LABEL: define <2 x i32> @shuffle_v2i32(
-; CHECK-X86-V2-SAME: <2 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V2-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V2:       [[THEN]]:
-; CHECK-X86-V2-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i32> [[ARG0]], <2 x i32> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-X86-V2-NEXT:    tail call void @func0()
-; CHECK-X86-V2-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V2:       [[ELSE]]:
-; CHECK-X86-V2-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i32> [[ARG0]], <2 x i32> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-X86-V2-NEXT:    tail call void @func1()
-; CHECK-X86-V2-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V2:       [[FINALLY]]:
-; CHECK-X86-V2-NEXT:    [[VAL3:%.*]] = phi <2 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V2-NEXT:    ret <2 x i32> [[VAL3]]
-;
-; CHECK-X86-V3-LABEL: define <2 x i32> @shuffle_v2i32(
-; CHECK-X86-V3-SAME: <2 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V3-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V3:       [[THEN]]:
-; CHECK-X86-V3-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i32> [[ARG0]], <2 x i32> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-X86-V3-NEXT:    tail call void @func0()
-; CHECK-X86-V3-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V3:       [[ELSE]]:
-; CHECK-X86-V3-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i32> [[ARG0]], <2 x i32> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-X86-V3-NEXT:    tail call void @func1()
-; CHECK-X86-V3-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V3:       [[FINALLY]]:
-; CHECK-X86-V3-NEXT:    [[VAL3:%.*]] = phi <2 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V3-NEXT:    ret <2 x i32> [[VAL3]]
-;
-; CHECK-X86-V4-LABEL: define <2 x i32> @shuffle_v2i32(
-; CHECK-X86-V4-SAME: <2 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V4-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V4:       [[THEN]]:
-; CHECK-X86-V4-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i32> [[ARG0]], <2 x i32> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-X86-V4-NEXT:    tail call void @func0()
-; CHECK-X86-V4-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V4:       [[ELSE]]:
-; CHECK-X86-V4-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i32> [[ARG0]], <2 x i32> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-X86-V4-NEXT:    tail call void @func1()
-; CHECK-X86-V4-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V4:       [[FINALLY]]:
-; CHECK-X86-V4-NEXT:    [[VAL3:%.*]] = phi <2 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V4-NEXT:    ret <2 x i32> [[VAL3]]
-;
 entry:
   br i1 %cond, label %then, label %else
 
@@ -1996,150 +403,6 @@ define <4 x i32> @shuffle_v4i32(<3 x i32> %arg0, i1 %cond) {
 ; CHECK-NEXT:    [[VAL3:%.*]] = phi <4 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
 ; CHECK-NEXT:    ret <4 x i32> [[VAL3]]
 ;
-; CHECK-AARCH64-LABEL: define <4 x i32> @shuffle_v4i32(
-; CHECK-AARCH64-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-AARCH64-NEXT:  [[ENTRY:.*:]]
-; CHECK-AARCH64-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-AARCH64:       [[THEN]]:
-; CHECK-AARCH64-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
-; CHECK-AARCH64-NEXT:    tail call void @func0()
-; CHECK-AARCH64-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-AARCH64:       [[ELSE]]:
-; CHECK-AARCH64-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-; CHECK-AARCH64-NEXT:    tail call void @func1()
-; CHECK-AARCH64-NEXT:    br label %[[FINALLY]]
-; CHECK-AARCH64:       [[FINALLY]]:
-; CHECK-AARCH64-NEXT:    [[VAL3:%.*]] = phi <4 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-AARCH64-NEXT:    ret <4 x i32> [[VAL3]]
-;
-; CHECK-AMDGPU-LABEL: define <4 x i32> @shuffle_v4i32(
-; CHECK-AMDGPU-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-AMDGPU-NEXT:  [[ENTRY:.*:]]
-; CHECK-AMDGPU-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-AMDGPU:       [[THEN]]:
-; CHECK-AMDGPU-NEXT:    [[TMP0:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <3 x i32> <i32 1, i32 2, i32 0>
-; CHECK-AMDGPU-NEXT:    tail call void @func0()
-; CHECK-AMDGPU-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-AMDGPU:       [[ELSE]]:
-; CHECK-AMDGPU-NEXT:    tail call void @func1()
-; CHECK-AMDGPU-NEXT:    br label %[[FINALLY]]
-; CHECK-AMDGPU:       [[FINALLY]]:
-; CHECK-AMDGPU-NEXT:    [[TMP1:%.*]] = phi <3 x i32> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
-; CHECK-AMDGPU-NEXT:    [[VAL3:%.*]] = shufflevector <3 x i32> [[TMP1]], <3 x i32> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-; CHECK-AMDGPU-NEXT:    ret <4 x i32> [[VAL3]]
-;
-; CHECK-ARM-LABEL: define <4 x i32> @shuffle_v4i32(
-; CHECK-ARM-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-ARM-NEXT:  [[ENTRY:.*:]]
-; CHECK-ARM-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-ARM:       [[THEN]]:
-; CHECK-ARM-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
-; CHECK-ARM-NEXT:    tail call void @func0()
-; CHECK-ARM-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-ARM:       [[ELSE]]:
-; CHECK-ARM-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-; CHECK-ARM-NEXT:    tail call void @func1()
-; CHECK-ARM-NEXT:    br label %[[FINALLY]]
-; CHECK-ARM:       [[FINALLY]]:
-; CHECK-ARM-NEXT:    [[VAL3:%.*]] = phi <4 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-ARM-NEXT:    ret <4 x i32> [[VAL3]]
-;
-; CHECK-HEXAGON-LABEL: define <4 x i32> @shuffle_v4i32(
-; CHECK-HEXAGON-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-HEXAGON-NEXT:  [[ENTRY:.*:]]
-; CHECK-HEXAGON-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-HEXAGON:       [[THEN]]:
-; CHECK-HEXAGON-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
-; CHECK-HEXAGON-NEXT:    tail call void @func0()
-; CHECK-HEXAGON-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-HEXAGON:       [[ELSE]]:
-; CHECK-HEXAGON-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-; CHECK-HEXAGON-NEXT:    tail call void @func1()
-; CHECK-HEXAGON-NEXT:    br label %[[FINALLY]]
-; CHECK-HEXAGON:       [[FINALLY]]:
-; CHECK-HEXAGON-NEXT:    [[VAL3:%.*]] = phi <4 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-HEXAGON-NEXT:    ret <4 x i32> [[VAL3]]
-;
-; CHECK-RISCV-LABEL: define <4 x i32> @shuffle_v4i32(
-; CHECK-RISCV-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-RISCV-NEXT:  [[ENTRY:.*:]]
-; CHECK-RISCV-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-RISCV:       [[THEN]]:
-; CHECK-RISCV-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
-; CHECK-RISCV-NEXT:    tail call void @func0()
-; CHECK-RISCV-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-RISCV:       [[ELSE]]:
-; CHECK-RISCV-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-; CHECK-RISCV-NEXT:    tail call void @func1()
-; CHECK-RISCV-NEXT:    br label %[[FINALLY]]
-; CHECK-RISCV:       [[FINALLY]]:
-; CHECK-RISCV-NEXT:    [[VAL3:%.*]] = phi <4 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-RISCV-NEXT:    ret <4 x i32> [[VAL3]]
-;
-; CHECK-X86-V1-LABEL: define <4 x i32> @shuffle_v4i32(
-; CHECK-X86-V1-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V1-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V1:       [[THEN]]:
-; CHECK-X86-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
-; CHECK-X86-V1-NEXT:    tail call void @func0()
-; CHECK-X86-V1-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V1:       [[ELSE]]:
-; CHECK-X86-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V1-NEXT:    tail call void @func1()
-; CHECK-X86-V1-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V1:       [[FINALLY]]:
-; CHECK-X86-V1-NEXT:    [[VAL3:%.*]] = phi <4 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V1-NEXT:    ret <4 x i32> [[VAL3]]
-;
-; CHECK-X86-V2-LABEL: define <4 x i32> @shuffle_v4i32(
-; CHECK-X86-V2-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V2-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V2:       [[THEN]]:
-; CHECK-X86-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
-; CHECK-X86-V2-NEXT:    tail call void @func0()
-; CHECK-X86-V2-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V2:       [[ELSE]]:
-; CHECK-X86-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V2-NEXT:    tail call void @func1()
-; CHECK-X86-V2-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V2:       [[FINALLY]]:
-; CHECK-X86-V2-NEXT:    [[VAL3:%.*]] = phi <4 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V2-NEXT:    ret <4 x i32> [[VAL3]]
-;
-; CHECK-X86-V3-LABEL: define <4 x i32> @shuffle_v4i32(
-; CHECK-X86-V3-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V3-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V3:       [[THEN]]:
-; CHECK-X86-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
-; CHECK-X86-V3-NEXT:    tail call void @func0()
-; CHECK-X86-V3-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V3:       [[ELSE]]:
-; CHECK-X86-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V3-NEXT:    tail call void @func1()
-; CHECK-X86-V3-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V3:       [[FINALLY]]:
-; CHECK-X86-V3-NEXT:    [[VAL3:%.*]] = phi <4 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V3-NEXT:    ret <4 x i32> [[VAL3]]
-;
-; CHECK-X86-V4-LABEL: define <4 x i32> @shuffle_v4i32(
-; CHECK-X86-V4-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V4-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V4:       [[THEN]]:
-; CHECK-X86-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
-; CHECK-X86-V4-NEXT:    tail call void @func0()
-; CHECK-X86-V4-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V4:       [[ELSE]]:
-; CHECK-X86-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V4-NEXT:    tail call void @func1()
-; CHECK-X86-V4-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V4:       [[FINALLY]]:
-; CHECK-X86-V4-NEXT:    [[VAL3:%.*]] = phi <4 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V4-NEXT:    ret <4 x i32> [[VAL3]]
-;
 entry:
   br i1 %cond, label %then, label %else
 
@@ -2175,150 +438,6 @@ define <8 x i32> @shuffle_v8i32(<3 x i32> %arg0, i1 %cond) {
 ; CHECK-NEXT:    [[VAL3:%.*]] = phi <8 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
 ; CHECK-NEXT:    ret <8 x i32> [[VAL3]]
 ;
-; CHECK-AARCH64-LABEL: define <8 x i32> @shuffle_v8i32(
-; CHECK-AARCH64-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-AARCH64-NEXT:  [[ENTRY:.*:]]
-; CHECK-AARCH64-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-AARCH64:       [[THEN]]:
-; CHECK-AARCH64-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-AARCH64-NEXT:    tail call void @func0()
-; CHECK-AARCH64-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-AARCH64:       [[ELSE]]:
-; CHECK-AARCH64-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-AARCH64-NEXT:    tail call void @func1()
-; CHECK-AARCH64-NEXT:    br label %[[FINALLY]]
-; CHECK-AARCH64:       [[FINALLY]]:
-; CHECK-AARCH64-NEXT:    [[VAL3:%.*]] = phi <8 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-AARCH64-NEXT:    ret <8 x i32> [[VAL3]]
-;
-; CHECK-AMDGPU-LABEL: define <8 x i32> @shuffle_v8i32(
-; CHECK-AMDGPU-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-AMDGPU-NEXT:  [[ENTRY:.*:]]
-; CHECK-AMDGPU-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-AMDGPU:       [[THEN]]:
-; CHECK-AMDGPU-NEXT:    [[TMP0:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <3 x i32> <i32 1, i32 2, i32 0>
-; CHECK-AMDGPU-NEXT:    tail call void @func0()
-; CHECK-AMDGPU-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-AMDGPU:       [[ELSE]]:
-; CHECK-AMDGPU-NEXT:    tail call void @func1()
-; CHECK-AMDGPU-NEXT:    br label %[[FINALLY]]
-; CHECK-AMDGPU:       [[FINALLY]]:
-; CHECK-AMDGPU-NEXT:    [[TMP1:%.*]] = phi <3 x i32> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
-; CHECK-AMDGPU-NEXT:    [[VAL3:%.*]] = shufflevector <3 x i32> [[TMP1]], <3 x i32> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-AMDGPU-NEXT:    ret <8 x i32> [[VAL3]]
-;
-; CHECK-ARM-LABEL: define <8 x i32> @shuffle_v8i32(
-; CHECK-ARM-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-ARM-NEXT:  [[ENTRY:.*:]]
-; CHECK-ARM-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-ARM:       [[THEN]]:
-; CHECK-ARM-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-ARM-NEXT:    tail call void @func0()
-; CHECK-ARM-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-ARM:       [[ELSE]]:
-; CHECK-ARM-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-ARM-NEXT:    tail call void @func1()
-; CHECK-ARM-NEXT:    br label %[[FINALLY]]
-; CHECK-ARM:       [[FINALLY]]:
-; CHECK-ARM-NEXT:    [[VAL3:%.*]] = phi <8 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-ARM-NEXT:    ret <8 x i32> [[VAL3]]
-;
-; CHECK-HEXAGON-LABEL: define <8 x i32> @shuffle_v8i32(
-; CHECK-HEXAGON-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-HEXAGON-NEXT:  [[ENTRY:.*:]]
-; CHECK-HEXAGON-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-HEXAGON:       [[THEN]]:
-; CHECK-HEXAGON-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-HEXAGON-NEXT:    tail call void @func0()
-; CHECK-HEXAGON-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-HEXAGON:       [[ELSE]]:
-; CHECK-HEXAGON-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-HEXAGON-NEXT:    tail call void @func1()
-; CHECK-HEXAGON-NEXT:    br label %[[FINALLY]]
-; CHECK-HEXAGON:       [[FINALLY]]:
-; CHECK-HEXAGON-NEXT:    [[VAL3:%.*]] = phi <8 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-HEXAGON-NEXT:    ret <8 x i32> [[VAL3]]
-;
-; CHECK-RISCV-LABEL: define <8 x i32> @shuffle_v8i32(
-; CHECK-RISCV-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-RISCV-NEXT:  [[ENTRY:.*:]]
-; CHECK-RISCV-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-RISCV:       [[THEN]]:
-; CHECK-RISCV-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-RISCV-NEXT:    tail call void @func0()
-; CHECK-RISCV-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-RISCV:       [[ELSE]]:
-; CHECK-RISCV-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-RISCV-NEXT:    tail call void @func1()
-; CHECK-RISCV-NEXT:    br label %[[FINALLY]]
-; CHECK-RISCV:       [[FINALLY]]:
-; CHECK-RISCV-NEXT:    [[VAL3:%.*]] = phi <8 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-RISCV-NEXT:    ret <8 x i32> [[VAL3]]
-;
-; CHECK-X86-V1-LABEL: define <8 x i32> @shuffle_v8i32(
-; CHECK-X86-V1-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V1-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V1:       [[THEN]]:
-; CHECK-X86-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-X86-V1-NEXT:    tail call void @func0()
-; CHECK-X86-V1-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V1:       [[ELSE]]:
-; CHECK-X86-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V1-NEXT:    tail call void @func1()
-; CHECK-X86-V1-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V1:       [[FINALLY]]:
-; CHECK-X86-V1-NEXT:    [[VAL3:%.*]] = phi <8 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V1-NEXT:    ret <8 x i32> [[VAL3]]
-;
-; CHECK-X86-V2-LABEL: define <8 x i32> @shuffle_v8i32(
-; CHECK-X86-V2-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V2-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V2:       [[THEN]]:
-; CHECK-X86-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-X86-V2-NEXT:    tail call void @func0()
-; CHECK-X86-V2-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V2:       [[ELSE]]:
-; CHECK-X86-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V2-NEXT:    tail call void @func1()
-; CHECK-X86-V2-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V2:       [[FINALLY]]:
-; CHECK-X86-V2-NEXT:    [[VAL3:%.*]] = phi <8 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V2-NEXT:    ret <8 x i32> [[VAL3]]
-;
-; CHECK-X86-V3-LABEL: define <8 x i32> @shuffle_v8i32(
-; CHECK-X86-V3-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V3-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V3:       [[THEN]]:
-; CHECK-X86-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-X86-V3-NEXT:    tail call void @func0()
-; CHECK-X86-V3-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V3:       [[ELSE]]:
-; CHECK-X86-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V3-NEXT:    tail call void @func1()
-; CHECK-X86-V3-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V3:       [[FINALLY]]:
-; CHECK-X86-V3-NEXT:    [[VAL3:%.*]] = phi <8 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V3-NEXT:    ret <8 x i32> [[VAL3]]
-;
-; CHECK-X86-V4-LABEL: define <8 x i32> @shuffle_v8i32(
-; CHECK-X86-V4-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V4-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V4:       [[THEN]]:
-; CHECK-X86-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-X86-V4-NEXT:    tail call void @func0()
-; CHECK-X86-V4-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V4:       [[ELSE]]:
-; CHECK-X86-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V4-NEXT:    tail call void @func1()
-; CHECK-X86-V4-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V4:       [[FINALLY]]:
-; CHECK-X86-V4-NEXT:    [[VAL3:%.*]] = phi <8 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V4-NEXT:    ret <8 x i32> [[VAL3]]
-;
 entry:
   br i1 %cond, label %then, label %else
 
@@ -2354,150 +473,6 @@ define <16 x i32> @shuffle_v16i32(<3 x i32> %arg0, i1 %cond) {
 ; CHECK-NEXT:    [[VAL3:%.*]] = phi <16 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
 ; CHECK-NEXT:    ret <16 x i32> [[VAL3]]
 ;
-; CHECK-AARCH64-LABEL: define <16 x i32> @shuffle_v16i32(
-; CHECK-AARCH64-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-AARCH64-NEXT:  [[ENTRY:.*:]]
-; CHECK-AARCH64-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-AARCH64:       [[THEN]]:
-; CHECK-AARCH64-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-AARCH64-NEXT:    tail call void @func0()
-; CHECK-AARCH64-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-AARCH64:       [[ELSE]]:
-; CHECK-AARCH64-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-AARCH64-NEXT:    tail call void @func1()
-; CHECK-AARCH64-NEXT:    br label %[[FINALLY]]
-; CHECK-AARCH64:       [[FINALLY]]:
-; CHECK-AARCH64-NEXT:    [[VAL3:%.*]] = phi <16 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-AARCH64-NEXT:    ret <16 x i32> [[VAL3]]
-;
-; CHECK-AMDGPU-LABEL: define <16 x i32> @shuffle_v16i32(
-; CHECK-AMDGPU-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-AMDGPU-NEXT:  [[ENTRY:.*:]]
-; CHECK-AMDGPU-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-AMDGPU:       [[THEN]]:
-; CHECK-AMDGPU-NEXT:    [[TMP0:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <3 x i32> <i32 1, i32 2, i32 0>
-; CHECK-AMDGPU-NEXT:    tail call void @func0()
-; CHECK-AMDGPU-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-AMDGPU:       [[ELSE]]:
-; CHECK-AMDGPU-NEXT:    tail call void @func1()
-; CHECK-AMDGPU-NEXT:    br label %[[FINALLY]]
-; CHECK-AMDGPU:       [[FINALLY]]:
-; CHECK-AMDGPU-NEXT:    [[TMP1:%.*]] = phi <3 x i32> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
-; CHECK-AMDGPU-NEXT:    [[VAL3:%.*]] = shufflevector <3 x i32> [[TMP1]], <3 x i32> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-AMDGPU-NEXT:    ret <16 x i32> [[VAL3]]
-;
-; CHECK-ARM-LABEL: define <16 x i32> @shuffle_v16i32(
-; CHECK-ARM-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-ARM-NEXT:  [[ENTRY:.*:]]
-; CHECK-ARM-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-ARM:       [[THEN]]:
-; CHECK-ARM-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-ARM-NEXT:    tail call void @func0()
-; CHECK-ARM-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-ARM:       [[ELSE]]:
-; CHECK-ARM-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-ARM-NEXT:    tail call void @func1()
-; CHECK-ARM-NEXT:    br label %[[FINALLY]]
-; CHECK-ARM:       [[FINALLY]]:
-; CHECK-ARM-NEXT:    [[VAL3:%.*]] = phi <16 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-ARM-NEXT:    ret <16 x i32> [[VAL3]]
-;
-; CHECK-HEXAGON-LABEL: define <16 x i32> @shuffle_v16i32(
-; CHECK-HEXAGON-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-HEXAGON-NEXT:  [[ENTRY:.*:]]
-; CHECK-HEXAGON-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-HEXAGON:       [[THEN]]:
-; CHECK-HEXAGON-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-HEXAGON-NEXT:    tail call void @func0()
-; CHECK-HEXAGON-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-HEXAGON:       [[ELSE]]:
-; CHECK-HEXAGON-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-HEXAGON-NEXT:    tail call void @func1()
-; CHECK-HEXAGON-NEXT:    br label %[[FINALLY]]
-; CHECK-HEXAGON:       [[FINALLY]]:
-; CHECK-HEXAGON-NEXT:    [[VAL3:%.*]] = phi <16 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-HEXAGON-NEXT:    ret <16 x i32> [[VAL3]]
-;
-; CHECK-RISCV-LABEL: define <16 x i32> @shuffle_v16i32(
-; CHECK-RISCV-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-RISCV-NEXT:  [[ENTRY:.*:]]
-; CHECK-RISCV-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-RISCV:       [[THEN]]:
-; CHECK-RISCV-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-RISCV-NEXT:    tail call void @func0()
-; CHECK-RISCV-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-RISCV:       [[ELSE]]:
-; CHECK-RISCV-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-RISCV-NEXT:    tail call void @func1()
-; CHECK-RISCV-NEXT:    br label %[[FINALLY]]
-; CHECK-RISCV:       [[FINALLY]]:
-; CHECK-RISCV-NEXT:    [[VAL3:%.*]] = phi <16 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-RISCV-NEXT:    ret <16 x i32> [[VAL3]]
-;
-; CHECK-X86-V1-LABEL: define <16 x i32> @shuffle_v16i32(
-; CHECK-X86-V1-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V1-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V1:       [[THEN]]:
-; CHECK-X86-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-X86-V1-NEXT:    tail call void @func0()
-; CHECK-X86-V1-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V1:       [[ELSE]]:
-; CHECK-X86-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V1-NEXT:    tail call void @func1()
-; CHECK-X86-V1-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V1:       [[FINALLY]]:
-; CHECK-X86-V1-NEXT:    [[VAL3:%.*]] = phi <16 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V1-NEXT:    ret <16 x i32> [[VAL3]]
-;
-; CHECK-X86-V2-LABEL: define <16 x i32> @shuffle_v16i32(
-; CHECK-X86-V2-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V2-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V2:       [[THEN]]:
-; CHECK-X86-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-X86-V2-NEXT:    tail call void @func0()
-; CHECK-X86-V2-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V2:       [[ELSE]]:
-; CHECK-X86-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V2-NEXT:    tail call void @func1()
-; CHECK-X86-V2-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V2:       [[FINALLY]]:
-; CHECK-X86-V2-NEXT:    [[VAL3:%.*]] = phi <16 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V2-NEXT:    ret <16 x i32> [[VAL3]]
-;
-; CHECK-X86-V3-LABEL: define <16 x i32> @shuffle_v16i32(
-; CHECK-X86-V3-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V3-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V3:       [[THEN]]:
-; CHECK-X86-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-X86-V3-NEXT:    tail call void @func0()
-; CHECK-X86-V3-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V3:       [[ELSE]]:
-; CHECK-X86-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V3-NEXT:    tail call void @func1()
-; CHECK-X86-V3-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V3:       [[FINALLY]]:
-; CHECK-X86-V3-NEXT:    [[VAL3:%.*]] = phi <16 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V3-NEXT:    ret <16 x i32> [[VAL3]]
-;
-; CHECK-X86-V4-LABEL: define <16 x i32> @shuffle_v16i32(
-; CHECK-X86-V4-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V4-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V4:       [[THEN]]:
-; CHECK-X86-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-X86-V4-NEXT:    tail call void @func0()
-; CHECK-X86-V4-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V4:       [[ELSE]]:
-; CHECK-X86-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V4-NEXT:    tail call void @func1()
-; CHECK-X86-V4-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V4:       [[FINALLY]]:
-; CHECK-X86-V4-NEXT:    [[VAL3:%.*]] = phi <16 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V4-NEXT:    ret <16 x i32> [[VAL3]]
-;
 entry:
   br i1 %cond, label %then, label %else
 
@@ -2533,150 +508,6 @@ define <32 x i32> @shuffle_v32i32(<3 x i32> %arg0, i1 %cond) {
 ; CHECK-NEXT:    [[VAL3:%.*]] = phi <32 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
 ; CHECK-NEXT:    ret <32 x i32> [[VAL3]]
 ;
-; CHECK-AARCH64-LABEL: define <32 x i32> @shuffle_v32i32(
-; CHECK-AARCH64-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-AARCH64-NEXT:  [[ENTRY:.*:]]
-; CHECK-AARCH64-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-AARCH64:       [[THEN]]:
-; CHECK-AARCH64-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-AARCH64-NEXT:    tail call void @func0()
-; CHECK-AARCH64-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-AARCH64:       [[ELSE]]:
-; CHECK-AARCH64-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-AARCH64-NEXT:    tail call void @func1()
-; CHECK-AARCH64-NEXT:    br label %[[FINALLY]]
-; CHECK-AARCH64:       [[FINALLY]]:
-; CHECK-AARCH64-NEXT:    [[VAL3:%.*]] = phi <32 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-AARCH64-NEXT:    ret <32 x i32> [[VAL3]]
-;
-; CHECK-AMDGPU-LABEL: define <32 x i32> @shuffle_v32i32(
-; CHECK-AMDGPU-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-AMDGPU-NEXT:  [[ENTRY:.*:]]
-; CHECK-AMDGPU-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-AMDGPU:       [[THEN]]:
-; CHECK-AMDGPU-NEXT:    [[TMP0:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <3 x i32> <i32 1, i32 2, i32 0>
-; CHECK-AMDGPU-NEXT:    tail call void @func0()
-; CHECK-AMDGPU-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-AMDGPU:       [[ELSE]]:
-; CHECK-AMDGPU-NEXT:    tail call void @func1()
-; CHECK-AMDGPU-NEXT:    br label %[[FINALLY]]
-; CHECK-AMDGPU:       [[FINALLY]]:
-; CHECK-AMDGPU-NEXT:    [[TMP1:%.*]] = phi <3 x i32> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
-; CHECK-AMDGPU-NEXT:    [[VAL3:%.*]] = shufflevector <3 x i32> [[TMP1]], <3 x i32> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-AMDGPU-NEXT:    ret <32 x i32> [[VAL3]]
-;
-; CHECK-ARM-LABEL: define <32 x i32> @shuffle_v32i32(
-; CHECK-ARM-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-ARM-NEXT:  [[ENTRY:.*:]]
-; CHECK-ARM-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-ARM:       [[THEN]]:
-; CHECK-ARM-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-ARM-NEXT:    tail call void @func0()
-; CHECK-ARM-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-ARM:       [[ELSE]]:
-; CHECK-ARM-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-ARM-NEXT:    tail call void @func1()
-; CHECK-ARM-NEXT:    br label %[[FINALLY]]
-; CHECK-ARM:       [[FINALLY]]:
-; CHECK-ARM-NEXT:    [[VAL3:%.*]] = phi <32 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-ARM-NEXT:    ret <32 x i32> [[VAL3]]
-;
-; CHECK-HEXAGON-LABEL: define <32 x i32> @shuffle_v32i32(
-; CHECK-HEXAGON-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-HEXAGON-NEXT:  [[ENTRY:.*:]]
-; CHECK-HEXAGON-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-HEXAGON:       [[THEN]]:
-; CHECK-HEXAGON-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-HEXAGON-NEXT:    tail call void @func0()
-; CHECK-HEXAGON-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-HEXAGON:       [[ELSE]]:
-; CHECK-HEXAGON-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-HEXAGON-NEXT:    tail call void @func1()
-; CHECK-HEXAGON-NEXT:    br label %[[FINALLY]]
-; CHECK-HEXAGON:       [[FINALLY]]:
-; CHECK-HEXAGON-NEXT:    [[VAL3:%.*]] = phi <32 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-HEXAGON-NEXT:    ret <32 x i32> [[VAL3]]
-;
-; CHECK-RISCV-LABEL: define <32 x i32> @shuffle_v32i32(
-; CHECK-RISCV-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-RISCV-NEXT:  [[ENTRY:.*:]]
-; CHECK-RISCV-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-RISCV:       [[THEN]]:
-; CHECK-RISCV-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-RISCV-NEXT:    tail call void @func0()
-; CHECK-RISCV-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-RISCV:       [[ELSE]]:
-; CHECK-RISCV-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-RISCV-NEXT:    tail call void @func1()
-; CHECK-RISCV-NEXT:    br label %[[FINALLY]]
-; CHECK-RISCV:       [[FINALLY]]:
-; CHECK-RISCV-NEXT:    [[VAL3:%.*]] = phi <32 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-RISCV-NEXT:    ret <32 x i32> [[VAL3]]
-;
-; CHECK-X86-V1-LABEL: define <32 x i32> @shuffle_v32i32(
-; CHECK-X86-V1-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V1-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V1:       [[THEN]]:
-; CHECK-X86-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-X86-V1-NEXT:    tail call void @func0()
-; CHECK-X86-V1-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V1:       [[ELSE]]:
-; CHECK-X86-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V1-NEXT:    tail call void @func1()
-; CHECK-X86-V1-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V1:       [[FINALLY]]:
-; CHECK-X86-V1-NEXT:    [[VAL3:%.*]] = phi <32 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V1-NEXT:    ret <32 x i32> [[VAL3]]
-;
-; CHECK-X86-V2-LABEL: define <32 x i32> @shuffle_v32i32(
-; CHECK-X86-V2-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V2-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V2:       [[THEN]]:
-; CHECK-X86-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-X86-V2-NEXT:    tail call void @func0()
-; CHECK-X86-V2-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V2:       [[ELSE]]:
-; CHECK-X86-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V2-NEXT:    tail call void @func1()
-; CHECK-X86-V2-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V2:       [[FINALLY]]:
-; CHECK-X86-V2-NEXT:    [[VAL3:%.*]] = phi <32 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V2-NEXT:    ret <32 x i32> [[VAL3]]
-;
-; CHECK-X86-V3-LABEL: define <32 x i32> @shuffle_v32i32(
-; CHECK-X86-V3-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V3-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V3:       [[THEN]]:
-; CHECK-X86-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-X86-V3-NEXT:    tail call void @func0()
-; CHECK-X86-V3-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V3:       [[ELSE]]:
-; CHECK-X86-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V3-NEXT:    tail call void @func1()
-; CHECK-X86-V3-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V3:       [[FINALLY]]:
-; CHECK-X86-V3-NEXT:    [[VAL3:%.*]] = phi <32 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V3-NEXT:    ret <32 x i32> [[VAL3]]
-;
-; CHECK-X86-V4-LABEL: define <32 x i32> @shuffle_v32i32(
-; CHECK-X86-V4-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V4-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V4:       [[THEN]]:
-; CHECK-X86-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-X86-V4-NEXT:    tail call void @func0()
-; CHECK-X86-V4-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V4:       [[ELSE]]:
-; CHECK-X86-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V4-NEXT:    tail call void @func1()
-; CHECK-X86-V4-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V4:       [[FINALLY]]:
-; CHECK-X86-V4-NEXT:    [[VAL3:%.*]] = phi <32 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V4-NEXT:    ret <32 x i32> [[VAL3]]
-;
 entry:
   br i1 %cond, label %then, label %else
 
@@ -2712,150 +543,6 @@ define <2 x bfloat> @shuffle_v2bf16(<2 x bfloat> %arg0, i1 %cond) {
 ; CHECK-NEXT:    [[VAL3:%.*]] = phi <2 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
 ; CHECK-NEXT:    ret <2 x bfloat> [[VAL3]]
 ;
-; CHECK-AARCH64-LABEL: define <2 x bfloat> @shuffle_v2bf16(
-; CHECK-AARCH64-SAME: <2 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-AARCH64-NEXT:  [[ENTRY:.*:]]
-; CHECK-AARCH64-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-AARCH64:       [[THEN]]:
-; CHECK-AARCH64-NEXT:    [[VAL1:%.*]] = shufflevector <2 x bfloat> [[ARG0]], <2 x bfloat> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-AARCH64-NEXT:    tail call void @func0()
-; CHECK-AARCH64-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-AARCH64:       [[ELSE]]:
-; CHECK-AARCH64-NEXT:    [[VAL2:%.*]] = shufflevector <2 x bfloat> [[ARG0]], <2 x bfloat> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-AARCH64-NEXT:    tail call void @func1()
-; CHECK-AARCH64-NEXT:    br label %[[FINALLY]]
-; CHECK-AARCH64:       [[FINALLY]]:
-; CHECK-AARCH64-NEXT:    [[VAL3:%.*]] = phi <2 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-AARCH64-NEXT:    ret <2 x bfloat> [[VAL3]]
-;
-; CHECK-AMDGPU-LABEL: define <2 x bfloat> @shuffle_v2bf16(
-; CHECK-AMDGPU-SAME: <2 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-AMDGPU-NEXT:  [[ENTRY:.*:]]
-; CHECK-AMDGPU-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-AMDGPU:       [[THEN]]:
-; CHECK-AMDGPU-NEXT:    [[VAL1:%.*]] = shufflevector <2 x bfloat> [[ARG0]], <2 x bfloat> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-AMDGPU-NEXT:    tail call void @func0()
-; CHECK-AMDGPU-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-AMDGPU:       [[ELSE]]:
-; CHECK-AMDGPU-NEXT:    [[VAL2:%.*]] = shufflevector <2 x bfloat> [[ARG0]], <2 x bfloat> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-AMDGPU-NEXT:    tail call void @func1()
-; CHECK-AMDGPU-NEXT:    br label %[[FINALLY]]
-; CHECK-AMDGPU:       [[FINALLY]]:
-; CHECK-AMDGPU-NEXT:    [[VAL3:%.*]] = phi <2 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-AMDGPU-NEXT:    ret <2 x bfloat> [[VAL3]]
-;
-; CHECK-ARM-LABEL: define <2 x bfloat> @shuffle_v2bf16(
-; CHECK-ARM-SAME: <2 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-ARM-NEXT:  [[ENTRY:.*:]]
-; CHECK-ARM-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-ARM:       [[THEN]]:
-; CHECK-ARM-NEXT:    [[VAL1:%.*]] = shufflevector <2 x bfloat> [[ARG0]], <2 x bfloat> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-ARM-NEXT:    tail call void @func0()
-; CHECK-ARM-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-ARM:       [[ELSE]]:
-; CHECK-ARM-NEXT:    [[VAL2:%.*]] = shufflevector <2 x bfloat> [[ARG0]], <2 x bfloat> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-ARM-NEXT:    tail call void @func1()
-; CHECK-ARM-NEXT:    br label %[[FINALLY]]
-; CHECK-ARM:       [[FINALLY]]:
-; CHECK-ARM-NEXT:    [[VAL3:%.*]] = phi <2 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-ARM-NEXT:    ret <2 x bfloat> [[VAL3]]
-;
-; CHECK-HEXAGON-LABEL: define <2 x bfloat> @shuffle_v2bf16(
-; CHECK-HEXAGON-SAME: <2 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-HEXAGON-NEXT:  [[ENTRY:.*:]]
-; CHECK-HEXAGON-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-HEXAGON:       [[THEN]]:
-; CHECK-HEXAGON-NEXT:    [[VAL1:%.*]] = shufflevector <2 x bfloat> [[ARG0]], <2 x bfloat> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-HEXAGON-NEXT:    tail call void @func0()
-; CHECK-HEXAGON-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-HEXAGON:       [[ELSE]]:
-; CHECK-HEXAGON-NEXT:    [[VAL2:%.*]] = shufflevector <2 x bfloat> [[ARG0]], <2 x bfloat> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-HEXAGON-NEXT:    tail call void @func1()
-; CHECK-HEXAGON-NEXT:    br label %[[FINALLY]]
-; CHECK-HEXAGON:       [[FINALLY]]:
-; CHECK-HEXAGON-NEXT:    [[VAL3:%.*]] = phi <2 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-HEXAGON-NEXT:    ret <2 x bfloat> [[VAL3]]
-;
-; CHECK-RISCV-LABEL: define <2 x bfloat> @shuffle_v2bf16(
-; CHECK-RISCV-SAME: <2 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-RISCV-NEXT:  [[ENTRY:.*:]]
-; CHECK-RISCV-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-RISCV:       [[THEN]]:
-; CHECK-RISCV-NEXT:    [[VAL1:%.*]] = shufflevector <2 x bfloat> [[ARG0]], <2 x bfloat> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-RISCV-NEXT:    tail call void @func0()
-; CHECK-RISCV-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-RISCV:       [[ELSE]]:
-; CHECK-RISCV-NEXT:    [[VAL2:%.*]] = shufflevector <2 x bfloat> [[ARG0]], <2 x bfloat> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-RISCV-NEXT:    tail call void @func1()
-; CHECK-RISCV-NEXT:    br label %[[FINALLY]]
-; CHECK-RISCV:       [[FINALLY]]:
-; CHECK-RISCV-NEXT:    [[VAL3:%.*]] = phi <2 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-RISCV-NEXT:    ret <2 x bfloat> [[VAL3]]
-;
-; CHECK-X86-V1-LABEL: define <2 x bfloat> @shuffle_v2bf16(
-; CHECK-X86-V1-SAME: <2 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V1-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V1:       [[THEN]]:
-; CHECK-X86-V1-NEXT:    [[VAL1:%.*]] = shufflevector <2 x bfloat> [[ARG0]], <2 x bfloat> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-X86-V1-NEXT:    tail call void @func0()
-; CHECK-X86-V1-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V1:       [[ELSE]]:
-; CHECK-X86-V1-NEXT:    [[VAL2:%.*]] = shufflevector <2 x bfloat> [[ARG0]], <2 x bfloat> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-X86-V1-NEXT:    tail call void @func1()
-; CHECK-X86-V1-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V1:       [[FINALLY]]:
-; CHECK-X86-V1-NEXT:    [[VAL3:%.*]] = phi <2 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V1-NEXT:    ret <2 x bfloat> [[VAL3]]
-;
-; CHECK-X86-V2-LABEL: define <2 x bfloat> @shuffle_v2bf16(
-; CHECK-X86-V2-SAME: <2 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V2-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V2:       [[THEN]]:
-; CHECK-X86-V2-NEXT:    [[VAL1:%.*]] = shufflevector <2 x bfloat> [[ARG0]], <2 x bfloat> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-X86-V2-NEXT:    tail call void @func0()
-; CHECK-X86-V2-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V2:       [[ELSE]]:
-; CHECK-X86-V2-NEXT:    [[VAL2:%.*]] = shufflevector <2 x bfloat> [[ARG0]], <2 x bfloat> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-X86-V2-NEXT:    tail call void @func1()
-; CHECK-X86-V2-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V2:       [[FINALLY]]:
-; CHECK-X86-V2-NEXT:    [[VAL3:%.*]] = phi <2 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V2-NEXT:    ret <2 x bfloat> [[VAL3]]
-;
-; CHECK-X86-V3-LABEL: define <2 x bfloat> @shuffle_v2bf16(
-; CHECK-X86-V3-SAME: <2 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V3-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V3:       [[THEN]]:
-; CHECK-X86-V3-NEXT:    [[VAL1:%.*]] = shufflevector <2 x bfloat> [[ARG0]], <2 x bfloat> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-X86-V3-NEXT:    tail call void @func0()
-; CHECK-X86-V3-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V3:       [[ELSE]]:
-; CHECK-X86-V3-NEXT:    [[VAL2:%.*]] = shufflevector <2 x bfloat> [[ARG0]], <2 x bfloat> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-X86-V3-NEXT:    tail call void @func1()
-; CHECK-X86-V3-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V3:       [[FINALLY]]:
-; CHECK-X86-V3-NEXT:    [[VAL3:%.*]] = phi <2 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V3-NEXT:    ret <2 x bfloat> [[VAL3]]
-;
-; CHECK-X86-V4-LABEL: define <2 x bfloat> @shuffle_v2bf16(
-; CHECK-X86-V4-SAME: <2 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V4-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V4:       [[THEN]]:
-; CHECK-X86-V4-NEXT:    [[VAL1:%.*]] = shufflevector <2 x bfloat> [[ARG0]], <2 x bfloat> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-X86-V4-NEXT:    tail call void @func0()
-; CHECK-X86-V4-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V4:       [[ELSE]]:
-; CHECK-X86-V4-NEXT:    [[VAL2:%.*]] = shufflevector <2 x bfloat> [[ARG0]], <2 x bfloat> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-X86-V4-NEXT:    tail call void @func1()
-; CHECK-X86-V4-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V4:       [[FINALLY]]:
-; CHECK-X86-V4-NEXT:    [[VAL3:%.*]] = phi <2 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V4-NEXT:    ret <2 x bfloat> [[VAL3]]
-;
 entry:
   br i1 %cond, label %then, label %else
 
@@ -2891,150 +578,6 @@ define <3 x bfloat> @shuffle_v3bf16(<3 x bfloat> %arg0, i1 %cond) {
 ; CHECK-NEXT:    [[VAL3:%.*]] = phi <3 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
 ; CHECK-NEXT:    ret <3 x bfloat> [[VAL3]]
 ;
-; CHECK-AARCH64-LABEL: define <3 x bfloat> @shuffle_v3bf16(
-; CHECK-AARCH64-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-AARCH64-NEXT:  [[ENTRY:.*:]]
-; CHECK-AARCH64-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-AARCH64:       [[THEN]]:
-; CHECK-AARCH64-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 1, i32 1>
-; CHECK-AARCH64-NEXT:    tail call void @func0()
-; CHECK-AARCH64-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-AARCH64:       [[ELSE]]:
-; CHECK-AARCH64-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 2, i32 2, i32 2>
-; CHECK-AARCH64-NEXT:    tail call void @func1()
-; CHECK-AARCH64-NEXT:    br label %[[FINALLY]]
-; CHECK-AARCH64:       [[FINALLY]]:
-; CHECK-AARCH64-NEXT:    [[VAL3:%.*]] = phi <3 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-AARCH64-NEXT:    ret <3 x bfloat> [[VAL3]]
-;
-; CHECK-AMDGPU-LABEL: define <3 x bfloat> @shuffle_v3bf16(
-; CHECK-AMDGPU-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-AMDGPU-NEXT:  [[ENTRY:.*:]]
-; CHECK-AMDGPU-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-AMDGPU:       [[THEN]]:
-; CHECK-AMDGPU-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 1, i32 1>
-; CHECK-AMDGPU-NEXT:    tail call void @func0()
-; CHECK-AMDGPU-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-AMDGPU:       [[ELSE]]:
-; CHECK-AMDGPU-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 2, i32 2, i32 2>
-; CHECK-AMDGPU-NEXT:    tail call void @func1()
-; CHECK-AMDGPU-NEXT:    br label %[[FINALLY]]
-; CHECK-AMDGPU:       [[FINALLY]]:
-; CHECK-AMDGPU-NEXT:    [[VAL3:%.*]] = phi <3 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-AMDGPU-NEXT:    ret <3 x bfloat> [[VAL3]]
-;
-; CHECK-ARM-LABEL: define <3 x bfloat> @shuffle_v3bf16(
-; CHECK-ARM-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-ARM-NEXT:  [[ENTRY:.*:]]
-; CHECK-ARM-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-ARM:       [[THEN]]:
-; CHECK-ARM-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 1, i32 1>
-; CHECK-ARM-NEXT:    tail call void @func0()
-; CHECK-ARM-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-ARM:       [[ELSE]]:
-; CHECK-ARM-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 2, i32 2, i32 2>
-; CHECK-ARM-NEXT:    tail call void @func1()
-; CHECK-ARM-NEXT:    br label %[[FINALLY]]
-; CHECK-ARM:       [[FINALLY]]:
-; CHECK-ARM-NEXT:    [[VAL3:%.*]] = phi <3 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-ARM-NEXT:    ret <3 x bfloat> [[VAL3]]
-;
-; CHECK-HEXAGON-LABEL: define <3 x bfloat> @shuffle_v3bf16(
-; CHECK-HEXAGON-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-HEXAGON-NEXT:  [[ENTRY:.*:]]
-; CHECK-HEXAGON-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-HEXAGON:       [[THEN]]:
-; CHECK-HEXAGON-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 1, i32 1>
-; CHECK-HEXAGON-NEXT:    tail call void @func0()
-; CHECK-HEXAGON-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-HEXAGON:       [[ELSE]]:
-; CHECK-HEXAGON-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 2, i32 2, i32 2>
-; CHECK-HEXAGON-NEXT:    tail call void @func1()
-; CHECK-HEXAGON-NEXT:    br label %[[FINALLY]]
-; CHECK-HEXAGON:       [[FINALLY]]:
-; CHECK-HEXAGON-NEXT:    [[VAL3:%.*]] = phi <3 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-HEXAGON-NEXT:    ret <3 x bfloat> [[VAL3]]
-;
-; CHECK-RISCV-LABEL: define <3 x bfloat> @shuffle_v3bf16(
-; CHECK-RISCV-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-RISCV-NEXT:  [[ENTRY:.*:]]
-; CHECK-RISCV-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-RISCV:       [[THEN]]:
-; CHECK-RISCV-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 1, i32 1>
-; CHECK-RISCV-NEXT:    tail call void @func0()
-; CHECK-RISCV-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-RISCV:       [[ELSE]]:
-; CHECK-RISCV-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 2, i32 2, i32 2>
-; CHECK-RISCV-NEXT:    tail call void @func1()
-; CHECK-RISCV-NEXT:    br label %[[FINALLY]]
-; CHECK-RISCV:       [[FINALLY]]:
-; CHECK-RISCV-NEXT:    [[VAL3:%.*]] = phi <3 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-RISCV-NEXT:    ret <3 x bfloat> [[VAL3]]
-;
-; CHECK-X86-V1-LABEL: define <3 x bfloat> @shuffle_v3bf16(
-; CHECK-X86-V1-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V1-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V1:       [[THEN]]:
-; CHECK-X86-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 1, i32 1>
-; CHECK-X86-V1-NEXT:    tail call void @func0()
-; CHECK-X86-V1-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V1:       [[ELSE]]:
-; CHECK-X86-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 2, i32 2, i32 2>
-; CHECK-X86-V1-NEXT:    tail call void @func1()
-; CHECK-X86-V1-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V1:       [[FINALLY]]:
-; CHECK-X86-V1-NEXT:    [[VAL3:%.*]] = phi <3 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V1-NEXT:    ret <3 x bfloat> [[VAL3]]
-;
-; CHECK-X86-V2-LABEL: define <3 x bfloat> @shuffle_v3bf16(
-; CHECK-X86-V2-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V2-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V2:       [[THEN]]:
-; CHECK-X86-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 1, i32 1>
-; CHECK-X86-V2-NEXT:    tail call void @func0()
-; CHECK-X86-V2-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V2:       [[ELSE]]:
-; CHECK-X86-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 2, i32 2, i32 2>
-; CHECK-X86-V2-NEXT:    tail call void @func1()
-; CHECK-X86-V2-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V2:       [[FINALLY]]:
-; CHECK-X86-V2-NEXT:    [[VAL3:%.*]] = phi <3 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V2-NEXT:    ret <3 x bfloat> [[VAL3]]
-;
-; CHECK-X86-V3-LABEL: define <3 x bfloat> @shuffle_v3bf16(
-; CHECK-X86-V3-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V3-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V3:       [[THEN]]:
-; CHECK-X86-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 1, i32 1>
-; CHECK-X86-V3-NEXT:    tail call void @func0()
-; CHECK-X86-V3-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V3:       [[ELSE]]:
-; CHECK-X86-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 2, i32 2, i32 2>
-; CHECK-X86-V3-NEXT:    tail call void @func1()
-; CHECK-X86-V3-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V3:       [[FINALLY]]:
-; CHECK-X86-V3-NEXT:    [[VAL3:%.*]] = phi <3 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V3-NEXT:    ret <3 x bfloat> [[VAL3]]
-;
-; CHECK-X86-V4-LABEL: define <3 x bfloat> @shuffle_v3bf16(
-; CHECK-X86-V4-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V4-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V4:       [[THEN]]:
-; CHECK-X86-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 1, i32 1>
-; CHECK-X86-V4-NEXT:    tail call void @func0()
-; CHECK-X86-V4-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V4:       [[ELSE]]:
-; CHECK-X86-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 2, i32 2, i32 2>
-; CHECK-X86-V4-NEXT:    tail call void @func1()
-; CHECK-X86-V4-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V4:       [[FINALLY]]:
-; CHECK-X86-V4-NEXT:    [[VAL3:%.*]] = phi <3 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V4-NEXT:    ret <3 x bfloat> [[VAL3]]
-;
 entry:
   br i1 %cond, label %then, label %else
 
@@ -3070,150 +613,6 @@ define <4 x bfloat> @shuffle_v4bf16(<3 x bfloat> %arg0, i1 %cond) {
 ; CHECK-NEXT:    [[VAL3:%.*]] = phi <4 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
 ; CHECK-NEXT:    ret <4 x bfloat> [[VAL3]]
 ;
-; CHECK-AARCH64-LABEL: define <4 x bfloat> @shuffle_v4bf16(
-; CHECK-AARCH64-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-AARCH64-NEXT:  [[ENTRY:.*:]]
-; CHECK-AARCH64-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-AARCH64:       [[THEN]]:
-; CHECK-AARCH64-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
-; CHECK-AARCH64-NEXT:    tail call void @func0()
-; CHECK-AARCH64-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-AARCH64:       [[ELSE]]:
-; CHECK-AARCH64-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-; CHECK-AARCH64-NEXT:    tail call void @func1()
-; CHECK-AARCH64-NEXT:    br label %[[FINALLY]]
-; CHECK-AARCH64:       [[FINALLY]]:
-; CHECK-AARCH64-NEXT:    [[VAL3:%.*]] = phi <4 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-AARCH64-NEXT:    ret <4 x bfloat> [[VAL3]]
-;
-; CHECK-AMDGPU-LABEL: define <4 x bfloat> @shuffle_v4bf16(
-; CHECK-AMDGPU-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-AMDGPU-NEXT:  [[ENTRY:.*:]]
-; CHECK-AMDGPU-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-AMDGPU:       [[THEN]]:
-; CHECK-AMDGPU-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
-; CHECK-AMDGPU-NEXT:    tail call void @func0()
-; CHECK-AMDGPU-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-AMDGPU:       [[ELSE]]:
-; CHECK-AMDGPU-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-; CHECK-AMDGPU-NEXT:    tail call void @func1()
-; CHECK-AMDGPU-NEXT:    br label %[[FINALLY]]
-; CHECK-AMDGPU:       [[FINALLY]]:
-; CHECK-AMDGPU-NEXT:    [[VAL3:%.*]] = phi <4 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-AMDGPU-NEXT:    ret <4 x bfloat> [[VAL3]]
-;
-; CHECK-ARM-LABEL: define <4 x bfloat> @shuffle_v4bf16(
-; CHECK-ARM-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-ARM-NEXT:  [[ENTRY:.*:]]
-; CHECK-ARM-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-ARM:       [[THEN]]:
-; CHECK-ARM-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
-; CHECK-ARM-NEXT:    tail call void @func0()
-; CHECK-ARM-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-ARM:       [[ELSE]]:
-; CHECK-ARM-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-; CHECK-ARM-NEXT:    tail call void @func1()
-; CHECK-ARM-NEXT:    br label %[[FINALLY]]
-; CHECK-ARM:       [[FINALLY]]:
-; CHECK-ARM-NEXT:    [[VAL3:%.*]] = phi <4 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-ARM-NEXT:    ret <4 x bfloat> [[VAL3]]
-;
-; CHECK-HEXAGON-LABEL: define <4 x bfloat> @shuffle_v4bf16(
-; CHECK-HEXAGON-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-HEXAGON-NEXT:  [[ENTRY:.*:]]
-; CHECK-HEXAGON-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-HEXAGON:       [[THEN]]:
-; CHECK-HEXAGON-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
-; CHECK-HEXAGON-NEXT:    tail call void @func0()
-; CHECK-HEXAGON-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-HEXAGON:       [[ELSE]]:
-; CHECK-HEXAGON-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-; CHECK-HEXAGON-NEXT:    tail call void @func1()
-; CHECK-HEXAGON-NEXT:    br label %[[FINALLY]]
-; CHECK-HEXAGON:       [[FINALLY]]:
-; CHECK-HEXAGON-NEXT:    [[VAL3:%.*]] = phi <4 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-HEXAGON-NEXT:    ret <4 x bfloat> [[VAL3]]
-;
-; CHECK-RISCV-LABEL: define <4 x bfloat> @shuffle_v4bf16(
-; CHECK-RISCV-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-RISCV-NEXT:  [[ENTRY:.*:]]
-; CHECK-RISCV-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-RISCV:       [[THEN]]:
-; CHECK-RISCV-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
-; CHECK-RISCV-NEXT:    tail call void @func0()
-; CHECK-RISCV-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-RISCV:       [[ELSE]]:
-; CHECK-RISCV-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-; CHECK-RISCV-NEXT:    tail call void @func1()
-; CHECK-RISCV-NEXT:    br label %[[FINALLY]]
-; CHECK-RISCV:       [[FINALLY]]:
-; CHECK-RISCV-NEXT:    [[VAL3:%.*]] = phi <4 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-RISCV-NEXT:    ret <4 x bfloat> [[VAL3]]
-;
-; CHECK-X86-V1-LABEL: define <4 x bfloat> @shuffle_v4bf16(
-; CHECK-X86-V1-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V1-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V1:       [[THEN]]:
-; CHECK-X86-V1-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
-; CHECK-X86-V1-NEXT:    tail call void @func0()
-; CHECK-X86-V1-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V1:       [[ELSE]]:
-; CHECK-X86-V1-NEXT:    tail call void @func1()
-; CHECK-X86-V1-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V1:       [[FINALLY]]:
-; CHECK-X86-V1-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
-; CHECK-X86-V1-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V1-NEXT:    ret <4 x bfloat> [[VAL3]]
-;
-; CHECK-X86-V2-LABEL: define <4 x bfloat> @shuffle_v4bf16(
-; CHECK-X86-V2-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V2-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V2:       [[THEN]]:
-; CHECK-X86-V2-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
-; CHECK-X86-V2-NEXT:    tail call void @func0()
-; CHECK-X86-V2-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V2:       [[ELSE]]:
-; CHECK-X86-V2-NEXT:    tail call void @func1()
-; CHECK-X86-V2-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V2:       [[FINALLY]]:
-; CHECK-X86-V2-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
-; CHECK-X86-V2-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V2-NEXT:    ret <4 x bfloat> [[VAL3]]
-;
-; CHECK-X86-V3-LABEL: define <4 x bfloat> @shuffle_v4bf16(
-; CHECK-X86-V3-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V3-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V3:       [[THEN]]:
-; CHECK-X86-V3-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
-; CHECK-X86-V3-NEXT:    tail call void @func0()
-; CHECK-X86-V3-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V3:       [[ELSE]]:
-; CHECK-X86-V3-NEXT:    tail call void @func1()
-; CHECK-X86-V3-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V3:       [[FINALLY]]:
-; CHECK-X86-V3-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
-; CHECK-X86-V3-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V3-NEXT:    ret <4 x bfloat> [[VAL3]]
-;
-; CHECK-X86-V4-LABEL: define <4 x bfloat> @shuffle_v4bf16(
-; CHECK-X86-V4-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V4-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V4:       [[THEN]]:
-; CHECK-X86-V4-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
-; CHECK-X86-V4-NEXT:    tail call void @func0()
-; CHECK-X86-V4-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V4:       [[ELSE]]:
-; CHECK-X86-V4-NEXT:    tail call void @func1()
-; CHECK-X86-V4-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V4:       [[FINALLY]]:
-; CHECK-X86-V4-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
-; CHECK-X86-V4-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V4-NEXT:    ret <4 x bfloat> [[VAL3]]
-;
 entry:
   br i1 %cond, label %then, label %else
 
@@ -3249,150 +648,6 @@ define <6 x bfloat> @shuffle_v6bf16(<3 x bfloat> %arg0, i1 %cond) {
 ; CHECK-NEXT:    [[VAL3:%.*]] = phi <6 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
 ; CHECK-NEXT:    ret <6 x bfloat> [[VAL3]]
 ;
-; CHECK-AARCH64-LABEL: define <6 x bfloat> @shuffle_v6bf16(
-; CHECK-AARCH64-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-AARCH64-NEXT:  [[ENTRY:.*:]]
-; CHECK-AARCH64-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-AARCH64:       [[THEN]]:
-; CHECK-AARCH64-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-AARCH64-NEXT:    tail call void @func0()
-; CHECK-AARCH64-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-AARCH64:       [[ELSE]]:
-; CHECK-AARCH64-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-AARCH64-NEXT:    tail call void @func1()
-; CHECK-AARCH64-NEXT:    br label %[[FINALLY]]
-; CHECK-AARCH64:       [[FINALLY]]:
-; CHECK-AARCH64-NEXT:    [[VAL3:%.*]] = phi <6 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-AARCH64-NEXT:    ret <6 x bfloat> [[VAL3]]
-;
-; CHECK-AMDGPU-LABEL: define <6 x bfloat> @shuffle_v6bf16(
-; CHECK-AMDGPU-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-AMDGPU-NEXT:  [[ENTRY:.*:]]
-; CHECK-AMDGPU-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-AMDGPU:       [[THEN]]:
-; CHECK-AMDGPU-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-AMDGPU-NEXT:    tail call void @func0()
-; CHECK-AMDGPU-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-AMDGPU:       [[ELSE]]:
-; CHECK-AMDGPU-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-AMDGPU-NEXT:    tail call void @func1()
-; CHECK-AMDGPU-NEXT:    br label %[[FINALLY]]
-; CHECK-AMDGPU:       [[FINALLY]]:
-; CHECK-AMDGPU-NEXT:    [[VAL3:%.*]] = phi <6 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-AMDGPU-NEXT:    ret <6 x bfloat> [[VAL3]]
-;
-; CHECK-ARM-LABEL: define <6 x bfloat> @shuffle_v6bf16(
-; CHECK-ARM-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-ARM-NEXT:  [[ENTRY:.*:]]
-; CHECK-ARM-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-ARM:       [[THEN]]:
-; CHECK-ARM-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-ARM-NEXT:    tail call void @func0()
-; CHECK-ARM-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-ARM:       [[ELSE]]:
-; CHECK-ARM-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-ARM-NEXT:    tail call void @func1()
-; CHECK-ARM-NEXT:    br label %[[FINALLY]]
-; CHECK-ARM:       [[FINALLY]]:
-; CHECK-ARM-NEXT:    [[VAL3:%.*]] = phi <6 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-ARM-NEXT:    ret <6 x bfloat> [[VAL3]]
-;
-; CHECK-HEXAGON-LABEL: define <6 x bfloat> @shuffle_v6bf16(
-; CHECK-HEXAGON-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-HEXAGON-NEXT:  [[ENTRY:.*:]]
-; CHECK-HEXAGON-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-HEXAGON:       [[THEN]]:
-; CHECK-HEXAGON-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-HEXAGON-NEXT:    tail call void @func0()
-; CHECK-HEXAGON-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-HEXAGON:       [[ELSE]]:
-; CHECK-HEXAGON-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-HEXAGON-NEXT:    tail call void @func1()
-; CHECK-HEXAGON-NEXT:    br label %[[FINALLY]]
-; CHECK-HEXAGON:       [[FINALLY]]:
-; CHECK-HEXAGON-NEXT:    [[VAL3:%.*]] = phi <6 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-HEXAGON-NEXT:    ret <6 x bfloat> [[VAL3]]
-;
-; CHECK-RISCV-LABEL: define <6 x bfloat> @shuffle_v6bf16(
-; CHECK-RISCV-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-RISCV-NEXT:  [[ENTRY:.*:]]
-; CHECK-RISCV-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-RISCV:       [[THEN]]:
-; CHECK-RISCV-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-RISCV-NEXT:    tail call void @func0()
-; CHECK-RISCV-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-RISCV:       [[ELSE]]:
-; CHECK-RISCV-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-RISCV-NEXT:    tail call void @func1()
-; CHECK-RISCV-NEXT:    br label %[[FINALLY]]
-; CHECK-RISCV:       [[FINALLY]]:
-; CHECK-RISCV-NEXT:    [[VAL3:%.*]] = phi <6 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-RISCV-NEXT:    ret <6 x bfloat> [[VAL3]]
-;
-; CHECK-X86-V1-LABEL: define <6 x bfloat> @shuffle_v6bf16(
-; CHECK-X86-V1-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V1-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V1:       [[THEN]]:
-; CHECK-X86-V1-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
-; CHECK-X86-V1-NEXT:    tail call void @func0()
-; CHECK-X86-V1-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V1:       [[ELSE]]:
-; CHECK-X86-V1-NEXT:    tail call void @func1()
-; CHECK-X86-V1-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V1:       [[FINALLY]]:
-; CHECK-X86-V1-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
-; CHECK-X86-V1-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V1-NEXT:    ret <6 x bfloat> [[VAL3]]
-;
-; CHECK-X86-V2-LABEL: define <6 x bfloat> @shuffle_v6bf16(
-; CHECK-X86-V2-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V2-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V2:       [[THEN]]:
-; CHECK-X86-V2-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
-; CHECK-X86-V2-NEXT:    tail call void @func0()
-; CHECK-X86-V2-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V2:       [[ELSE]]:
-; CHECK-X86-V2-NEXT:    tail call void @func1()
-; CHECK-X86-V2-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V2:       [[FINALLY]]:
-; CHECK-X86-V2-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
-; CHECK-X86-V2-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V2-NEXT:    ret <6 x bfloat> [[VAL3]]
-;
-; CHECK-X86-V3-LABEL: define <6 x bfloat> @shuffle_v6bf16(
-; CHECK-X86-V3-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V3-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V3:       [[THEN]]:
-; CHECK-X86-V3-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
-; CHECK-X86-V3-NEXT:    tail call void @func0()
-; CHECK-X86-V3-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V3:       [[ELSE]]:
-; CHECK-X86-V3-NEXT:    tail call void @func1()
-; CHECK-X86-V3-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V3:       [[FINALLY]]:
-; CHECK-X86-V3-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
-; CHECK-X86-V3-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V3-NEXT:    ret <6 x bfloat> [[VAL3]]
-;
-; CHECK-X86-V4-LABEL: define <6 x bfloat> @shuffle_v6bf16(
-; CHECK-X86-V4-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V4-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V4:       [[THEN]]:
-; CHECK-X86-V4-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
-; CHECK-X86-V4-NEXT:    tail call void @func0()
-; CHECK-X86-V4-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V4:       [[ELSE]]:
-; CHECK-X86-V4-NEXT:    tail call void @func1()
-; CHECK-X86-V4-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V4:       [[FINALLY]]:
-; CHECK-X86-V4-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
-; CHECK-X86-V4-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V4-NEXT:    ret <6 x bfloat> [[VAL3]]
-;
 entry:
   br i1 %cond, label %then, label %else
 
@@ -3428,150 +683,6 @@ define <8 x bfloat> @shuffle_v8bf16(<3 x bfloat> %arg0, i1 %cond) {
 ; CHECK-NEXT:    [[VAL3:%.*]] = phi <8 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
 ; CHECK-NEXT:    ret <8 x bfloat> [[VAL3]]
 ;
-; CHECK-AARCH64-LABEL: define <8 x bfloat> @shuffle_v8bf16(
-; CHECK-AARCH64-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-AARCH64-NEXT:  [[ENTRY:.*:]]
-; CHECK-AARCH64-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-AARCH64:       [[THEN]]:
-; CHECK-AARCH64-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-AARCH64-NEXT:    tail call void @func0()
-; CHECK-AARCH64-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-AARCH64:       [[ELSE]]:
-; CHECK-AARCH64-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-AARCH64-NEXT:    tail call void @func1()
-; CHECK-AARCH64-NEXT:    br label %[[FINALLY]]
-; CHECK-AARCH64:       [[FINALLY]]:
-; CHECK-AARCH64-NEXT:    [[VAL3:%.*]] = phi <8 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-AARCH64-NEXT:    ret <8 x bfloat> [[VAL3]]
-;
-; CHECK-AMDGPU-LABEL: define <8 x bfloat> @shuffle_v8bf16(
-; CHECK-AMDGPU-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-AMDGPU-NEXT:  [[ENTRY:.*:]]
-; CHECK-AMDGPU-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-AMDGPU:       [[THEN]]:
-; CHECK-AMDGPU-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-AMDGPU-NEXT:    tail call void @func0()
-; CHECK-AMDGPU-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-AMDGPU:       [[ELSE]]:
-; CHECK-AMDGPU-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-AMDGPU-NEXT:    tail call void @func1()
-; CHECK-AMDGPU-NEXT:    br label %[[FINALLY]]
-; CHECK-AMDGPU:       [[FINALLY]]:
-; CHECK-AMDGPU-NEXT:    [[VAL3:%.*]] = phi <8 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-AMDGPU-NEXT:    ret <8 x bfloat> [[VAL3]]
-;
-; CHECK-ARM-LABEL: define <8 x bfloat> @shuffle_v8bf16(
-; CHECK-ARM-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-ARM-NEXT:  [[ENTRY:.*:]]
-; CHECK-ARM-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-ARM:       [[THEN]]:
-; CHECK-ARM-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-ARM-NEXT:    tail call void @func0()
-; CHECK-ARM-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-ARM:       [[ELSE]]:
-; CHECK-ARM-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-ARM-NEXT:    tail call void @func1()
-; CHECK-ARM-NEXT:    br label %[[FINALLY]]
-; CHECK-ARM:       [[FINALLY]]:
-; CHECK-ARM-NEXT:    [[VAL3:%.*]] = phi <8 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-ARM-NEXT:    ret <8 x bfloat> [[VAL3]]
-;
-; CHECK-HEXAGON-LABEL: define <8 x bfloat> @shuffle_v8bf16(
-; CHECK-HEXAGON-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-HEXAGON-NEXT:  [[ENTRY:.*:]]
-; CHECK-HEXAGON-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-HEXAGON:       [[THEN]]:
-; CHECK-HEXAGON-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-HEXAGON-NEXT:    tail call void @func0()
-; CHECK-HEXAGON-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-HEXAGON:       [[ELSE]]:
-; CHECK-HEXAGON-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-HEXAGON-NEXT:    tail call void @func1()
-; CHECK-HEXAGON-NEXT:    br label %[[FINALLY]]
-; CHECK-HEXAGON:       [[FINALLY]]:
-; CHECK-HEXAGON-NEXT:    [[VAL3:%.*]] = phi <8 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-HEXAGON-NEXT:    ret <8 x bfloat> [[VAL3]]
-;
-; CHECK-RISCV-LABEL: define <8 x bfloat> @shuffle_v8bf16(
-; CHECK-RISCV-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-RISCV-NEXT:  [[ENTRY:.*:]]
-; CHECK-RISCV-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-RISCV:       [[THEN]]:
-; CHECK-RISCV-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-RISCV-NEXT:    tail call void @func0()
-; CHECK-RISCV-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-RISCV:       [[ELSE]]:
-; CHECK-RISCV-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-RISCV-NEXT:    tail call void @func1()
-; CHECK-RISCV-NEXT:    br label %[[FINALLY]]
-; CHECK-RISCV:       [[FINALLY]]:
-; CHECK-RISCV-NEXT:    [[VAL3:%.*]] = phi <8 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-RISCV-NEXT:    ret <8 x bfloat> [[VAL3]]
-;
-; CHECK-X86-V1-LABEL: define <8 x bfloat> @shuffle_v8bf16(
-; CHECK-X86-V1-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V1-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V1:       [[THEN]]:
-; CHECK-X86-V1-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
-; CHECK-X86-V1-NEXT:    tail call void @func0()
-; CHECK-X86-V1-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V1:       [[ELSE]]:
-; CHECK-X86-V1-NEXT:    tail call void @func1()
-; CHECK-X86-V1-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V1:       [[FINALLY]]:
-; CHECK-X86-V1-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
-; CHECK-X86-V1-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V1-NEXT:    ret <8 x bfloat> [[VAL3]]
-;
-; CHECK-X86-V2-LABEL: define <8 x bfloat> @shuffle_v8bf16(
-; CHECK-X86-V2-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V2-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V2:       [[THEN]]:
-; CHECK-X86-V2-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
-; CHECK-X86-V2-NEXT:    tail call void @func0()
-; CHECK-X86-V2-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V2:       [[ELSE]]:
-; CHECK-X86-V2-NEXT:    tail call void @func1()
-; CHECK-X86-V2-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V2:       [[FINALLY]]:
-; CHECK-X86-V2-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
-; CHECK-X86-V2-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V2-NEXT:    ret <8 x bfloat> [[VAL3]]
-;
-; CHECK-X86-V3-LABEL: define <8 x bfloat> @shuffle_v8bf16(
-; CHECK-X86-V3-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V3-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V3:       [[THEN]]:
-; CHECK-X86-V3-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
-; CHECK-X86-V3-NEXT:    tail call void @func0()
-; CHECK-X86-V3-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V3:       [[ELSE]]:
-; CHECK-X86-V3-NEXT:    tail call void @func1()
-; CHECK-X86-V3-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V3:       [[FINALLY]]:
-; CHECK-X86-V3-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
-; CHECK-X86-V3-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V3-NEXT:    ret <8 x bfloat> [[VAL3]]
-;
-; CHECK-X86-V4-LABEL: define <8 x bfloat> @shuffle_v8bf16(
-; CHECK-X86-V4-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V4-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V4:       [[THEN]]:
-; CHECK-X86-V4-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
-; CHECK-X86-V4-NEXT:    tail call void @func0()
-; CHECK-X86-V4-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V4:       [[ELSE]]:
-; CHECK-X86-V4-NEXT:    tail call void @func1()
-; CHECK-X86-V4-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V4:       [[FINALLY]]:
-; CHECK-X86-V4-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
-; CHECK-X86-V4-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V4-NEXT:    ret <8 x bfloat> [[VAL3]]
-;
 entry:
   br i1 %cond, label %then, label %else
 
@@ -3607,150 +718,6 @@ define <16 x bfloat> @shuffle_v16bf16(<3 x bfloat> %arg0, i1 %cond) {
 ; CHECK-NEXT:    [[VAL3:%.*]] = phi <16 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
 ; CHECK-NEXT:    ret <16 x bfloat> [[VAL3]]
 ;
-; CHECK-AARCH64-LABEL: define <16 x bfloat> @shuffle_v16bf16(
-; CHECK-AARCH64-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-AARCH64-NEXT:  [[ENTRY:.*:]]
-; CHECK-AARCH64-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-AARCH64:       [[THEN]]:
-; CHECK-AARCH64-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-AARCH64-NEXT:    tail call void @func0()
-; CHECK-AARCH64-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-AARCH64:       [[ELSE]]:
-; CHECK-AARCH64-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-AARCH64-NEXT:    tail call void @func1()
-; CHECK-AARCH64-NEXT:    br label %[[FINALLY]]
-; CHECK-AARCH64:       [[FINALLY]]:
-; CHECK-AARCH64-NEXT:    [[VAL3:%.*]] = phi <16 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-AARCH64-NEXT:    ret <16 x bfloat> [[VAL3]]
-;
-; CHECK-AMDGPU-LABEL: define <16 x bfloat> @shuffle_v16bf16(
-; CHECK-AMDGPU-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-AMDGPU-NEXT:  [[ENTRY:.*:]]
-; CHECK-AMDGPU-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-AMDGPU:       [[THEN]]:
-; CHECK-AMDGPU-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-AMDGPU-NEXT:    tail call void @func0()
-; CHECK-AMDGPU-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-AMDGPU:       [[ELSE]]:
-; CHECK-AMDGPU-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-AMDGPU-NEXT:    tail call void @func1()
-; CHECK-AMDGPU-NEXT:    br label %[[FINALLY]]
-; CHECK-AMDGPU:       [[FINALLY]]:
-; CHECK-AMDGPU-NEXT:    [[VAL3:%.*]] = phi <16 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-AMDGPU-NEXT:    ret <16 x bfloat> [[VAL3]]
-;
-; CHECK-ARM-LABEL: define <16 x bfloat> @shuffle_v16bf16(
-; CHECK-ARM-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-ARM-NEXT:  [[ENTRY:.*:]]
-; CHECK-ARM-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-ARM:       [[THEN]]:
-; CHECK-ARM-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-ARM-NEXT:    tail call void @func0()
-; CHECK-ARM-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-ARM:       [[ELSE]]:
-; CHECK-ARM-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-ARM-NEXT:    tail call void @func1()
-; CHECK-ARM-NEXT:    br label %[[FINALLY]]
-; CHECK-ARM:       [[FINALLY]]:
-; CHECK-ARM-NEXT:    [[VAL3:%.*]] = phi <16 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-ARM-NEXT:    ret <16 x bfloat> [[VAL3]]
-;
-; CHECK-HEXAGON-LABEL: define <16 x bfloat> @shuffle_v16bf16(
-; CHECK-HEXAGON-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-HEXAGON-NEXT:  [[ENTRY:.*:]]
-; CHECK-HEXAGON-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-HEXAGON:       [[THEN]]:
-; CHECK-HEXAGON-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-HEXAGON-NEXT:    tail call void @func0()
-; CHECK-HEXAGON-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-HEXAGON:       [[ELSE]]:
-; CHECK-HEXAGON-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-HEXAGON-NEXT:    tail call void @func1()
-; CHECK-HEXAGON-NEXT:    br label %[[FINALLY]]
-; CHECK-HEXAGON:       [[FINALLY]]:
-; CHECK-HEXAGON-NEXT:    [[VAL3:%.*]] = phi <16 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-HEXAGON-NEXT:    ret <16 x bfloat> [[VAL3]]
-;
-; CHECK-RISCV-LABEL: define <16 x bfloat> @shuffle_v16bf16(
-; CHECK-RISCV-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-RISCV-NEXT:  [[ENTRY:.*:]]
-; CHECK-RISCV-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-RISCV:       [[THEN]]:
-; CHECK-RISCV-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-RISCV-NEXT:    tail call void @func0()
-; CHECK-RISCV-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-RISCV:       [[ELSE]]:
-; CHECK-RISCV-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-RISCV-NEXT:    tail call void @func1()
-; CHECK-RISCV-NEXT:    br label %[[FINALLY]]
-; CHECK-RISCV:       [[FINALLY]]:
-; CHECK-RISCV-NEXT:    [[VAL3:%.*]] = phi <16 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-RISCV-NEXT:    ret <16 x bfloat> [[VAL3]]
-;
-; CHECK-X86-V1-LABEL: define <16 x bfloat> @shuffle_v16bf16(
-; CHECK-X86-V1-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V1-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V1:       [[THEN]]:
-; CHECK-X86-V1-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
-; CHECK-X86-V1-NEXT:    tail call void @func0()
-; CHECK-X86-V1-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V1:       [[ELSE]]:
-; CHECK-X86-V1-NEXT:    tail call void @func1()
-; CHECK-X86-V1-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V1:       [[FINALLY]]:
-; CHECK-X86-V1-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
-; CHECK-X86-V1-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V1-NEXT:    ret <16 x bfloat> [[VAL3]]
-;
-; CHECK-X86-V2-LABEL: define <16 x bfloat> @shuffle_v16bf16(
-; CHECK-X86-V2-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V2-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V2:       [[THEN]]:
-; CHECK-X86-V2-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
-; CHECK-X86-V2-NEXT:    tail call void @func0()
-; CHECK-X86-V2-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V2:       [[ELSE]]:
-; CHECK-X86-V2-NEXT:    tail call void @func1()
-; CHECK-X86-V2-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V2:       [[FINALLY]]:
-; CHECK-X86-V2-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
-; CHECK-X86-V2-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V2-NEXT:    ret <16 x bfloat> [[VAL3]]
-;
-; CHECK-X86-V3-LABEL: define <16 x bfloat> @shuffle_v16bf16(
-; CHECK-X86-V3-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V3-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V3:       [[THEN]]:
-; CHECK-X86-V3-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
-; CHECK-X86-V3-NEXT:    tail call void @func0()
-; CHECK-X86-V3-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V3:       [[ELSE]]:
-; CHECK-X86-V3-NEXT:    tail call void @func1()
-; CHECK-X86-V3-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V3:       [[FINALLY]]:
-; CHECK-X86-V3-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
-; CHECK-X86-V3-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V3-NEXT:    ret <16 x bfloat> [[VAL3]]
-;
-; CHECK-X86-V4-LABEL: define <16 x bfloat> @shuffle_v16bf16(
-; CHECK-X86-V4-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V4-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V4:       [[THEN]]:
-; CHECK-X86-V4-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
-; CHECK-X86-V4-NEXT:    tail call void @func0()
-; CHECK-X86-V4-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V4:       [[ELSE]]:
-; CHECK-X86-V4-NEXT:    tail call void @func1()
-; CHECK-X86-V4-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V4:       [[FINALLY]]:
-; CHECK-X86-V4-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
-; CHECK-X86-V4-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V4-NEXT:    ret <16 x bfloat> [[VAL3]]
-;
 entry:
   br i1 %cond, label %then, label %else
 
@@ -3786,150 +753,6 @@ define <32 x bfloat> @shuffle_v32bf16(<3 x bfloat> %arg0, i1 %cond) {
 ; CHECK-NEXT:    [[VAL3:%.*]] = phi <32 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
 ; CHECK-NEXT:    ret <32 x bfloat> [[VAL3]]
 ;
-; CHECK-AARCH64-LABEL: define <32 x bfloat> @shuffle_v32bf16(
-; CHECK-AARCH64-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-AARCH64-NEXT:  [[ENTRY:.*:]]
-; CHECK-AARCH64-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-AARCH64:       [[THEN]]:
-; CHECK-AARCH64-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-AARCH64-NEXT:    tail call void @func0()
-; CHECK-AARCH64-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-AARCH64:       [[ELSE]]:
-; CHECK-AARCH64-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-AARCH64-NEXT:    tail call void @func1()
-; CHECK-AARCH64-NEXT:    br label %[[FINALLY]]
-; CHECK-AARCH64:       [[FINALLY]]:
-; CHECK-AARCH64-NEXT:    [[VAL3:%.*]] = phi <32 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-AARCH64-NEXT:    ret <32 x bfloat> [[VAL3]]
-;
-; CHECK-AMDGPU-LABEL: define <32 x bfloat> @shuffle_v32bf16(
-; CHECK-AMDGPU-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-AMDGPU-NEXT:  [[ENTRY:.*:]]
-; CHECK-AMDGPU-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-AMDGPU:       [[THEN]]:
-; CHECK-AMDGPU-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-AMDGPU-NEXT:    tail call void @func0()
-; CHECK-AMDGPU-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-AMDGPU:       [[ELSE]]:
-; CHECK-AMDGPU-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-AMDGPU-NEXT:    tail call void @func1()
-; CHECK-AMDGPU-NEXT:    br label %[[FINALLY]]
-; CHECK-AMDGPU:       [[FINALLY]]:
-; CHECK-AMDGPU-NEXT:    [[VAL3:%.*]] = phi <32 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-AMDGPU-NEXT:    ret <32 x bfloat> [[VAL3]]
-;
-; CHECK-ARM-LABEL: define <32 x bfloat> @shuffle_v32bf16(
-; CHECK-ARM-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-ARM-NEXT:  [[ENTRY:.*:]]
-; CHECK-ARM-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-ARM:       [[THEN]]:
-; CHECK-ARM-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-ARM-NEXT:    tail call void @func0()
-; CHECK-ARM-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-ARM:       [[ELSE]]:
-; CHECK-ARM-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-ARM-NEXT:    tail call void @func1()
-; CHECK-ARM-NEXT:    br label %[[FINALLY]]
-; CHECK-ARM:       [[FINALLY]]:
-; CHECK-ARM-NEXT:    [[VAL3:%.*]] = phi <32 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-ARM-NEXT:    ret <32 x bfloat> [[VAL3]]
-;
-; CHECK-HEXAGON-LABEL: define <32 x bfloat> @shuffle_v32bf16(
-; CHECK-HEXAGON-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-HEXAGON-NEXT:  [[ENTRY:.*:]]
-; CHECK-HEXAGON-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-HEXAGON:       [[THEN]]:
-; CHECK-HEXAGON-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-HEXAGON-NEXT:    tail call void @func0()
-; CHECK-HEXAGON-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-HEXAGON:       [[ELSE]]:
-; CHECK-HEXAGON-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-HEXAGON-NEXT:    tail call void @func1()
-; CHECK-HEXAGON-NEXT:    br label %[[FINALLY]]
-; CHECK-HEXAGON:       [[FINALLY]]:
-; CHECK-HEXAGON-NEXT:    [[VAL3:%.*]] = phi <32 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-HEXAGON-NEXT:    ret <32 x bfloat> [[VAL3]]
-;
-; CHECK-RISCV-LABEL: define <32 x bfloat> @shuffle_v32bf16(
-; CHECK-RISCV-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-RISCV-NEXT:  [[ENTRY:.*:]]
-; CHECK-RISCV-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-RISCV:       [[THEN]]:
-; CHECK-RISCV-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-RISCV-NEXT:    tail call void @func0()
-; CHECK-RISCV-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-RISCV:       [[ELSE]]:
-; CHECK-RISCV-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-RISCV-NEXT:    tail call void @func1()
-; CHECK-RISCV-NEXT:    br label %[[FINALLY]]
-; CHECK-RISCV:       [[FINALLY]]:
-; CHECK-RISCV-NEXT:    [[VAL3:%.*]] = phi <32 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-RISCV-NEXT:    ret <32 x bfloat> [[VAL3]]
-;
-; CHECK-X86-V1-LABEL: define <32 x bfloat> @shuffle_v32bf16(
-; CHECK-X86-V1-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V1-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V1:       [[THEN]]:
-; CHECK-X86-V1-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
-; CHECK-X86-V1-NEXT:    tail call void @func0()
-; CHECK-X86-V1-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V1:       [[ELSE]]:
-; CHECK-X86-V1-NEXT:    tail call void @func1()
-; CHECK-X86-V1-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V1:       [[FINALLY]]:
-; CHECK-X86-V1-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
-; CHECK-X86-V1-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V1-NEXT:    ret <32 x bfloat> [[VAL3]]
-;
-; CHECK-X86-V2-LABEL: define <32 x bfloat> @shuffle_v32bf16(
-; CHECK-X86-V2-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V2-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V2:       [[THEN]]:
-; CHECK-X86-V2-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
-; CHECK-X86-V2-NEXT:    tail call void @func0()
-; CHECK-X86-V2-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V2:       [[ELSE]]:
-; CHECK-X86-V2-NEXT:    tail call void @func1()
-; CHECK-X86-V2-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V2:       [[FINALLY]]:
-; CHECK-X86-V2-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
-; CHECK-X86-V2-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V2-NEXT:    ret <32 x bfloat> [[VAL3]]
-;
-; CHECK-X86-V3-LABEL: define <32 x bfloat> @shuffle_v32bf16(
-; CHECK-X86-V3-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V3-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V3:       [[THEN]]:
-; CHECK-X86-V3-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
-; CHECK-X86-V3-NEXT:    tail call void @func0()
-; CHECK-X86-V3-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V3:       [[ELSE]]:
-; CHECK-X86-V3-NEXT:    tail call void @func1()
-; CHECK-X86-V3-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V3:       [[FINALLY]]:
-; CHECK-X86-V3-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
-; CHECK-X86-V3-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V3-NEXT:    ret <32 x bfloat> [[VAL3]]
-;
-; CHECK-X86-V4-LABEL: define <32 x bfloat> @shuffle_v32bf16(
-; CHECK-X86-V4-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V4-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V4:       [[THEN]]:
-; CHECK-X86-V4-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
-; CHECK-X86-V4-NEXT:    tail call void @func0()
-; CHECK-X86-V4-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V4:       [[ELSE]]:
-; CHECK-X86-V4-NEXT:    tail call void @func1()
-; CHECK-X86-V4-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V4:       [[FINALLY]]:
-; CHECK-X86-V4-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
-; CHECK-X86-V4-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V4-NEXT:    ret <32 x bfloat> [[VAL3]]
-;
 entry:
   br i1 %cond, label %then, label %else
 
@@ -3965,150 +788,6 @@ define <2 x half> @shuffle_v2f16(<2 x half> %arg0, i1 %cond) {
 ; CHECK-NEXT:    [[VAL3:%.*]] = phi <2 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
 ; CHECK-NEXT:    ret <2 x half> [[VAL3]]
 ;
-; CHECK-AARCH64-LABEL: define <2 x half> @shuffle_v2f16(
-; CHECK-AARCH64-SAME: <2 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-AARCH64-NEXT:  [[ENTRY:.*:]]
-; CHECK-AARCH64-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-AARCH64:       [[THEN]]:
-; CHECK-AARCH64-NEXT:    [[VAL1:%.*]] = shufflevector <2 x half> [[ARG0]], <2 x half> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-AARCH64-NEXT:    tail call void @func0()
-; CHECK-AARCH64-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-AARCH64:       [[ELSE]]:
-; CHECK-AARCH64-NEXT:    [[VAL2:%.*]] = shufflevector <2 x half> [[ARG0]], <2 x half> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-AARCH64-NEXT:    tail call void @func1()
-; CHECK-AARCH64-NEXT:    br label %[[FINALLY]]
-; CHECK-AARCH64:       [[FINALLY]]:
-; CHECK-AARCH64-NEXT:    [[VAL3:%.*]] = phi <2 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-AARCH64-NEXT:    ret <2 x half> [[VAL3]]
-;
-; CHECK-AMDGPU-LABEL: define <2 x half> @shuffle_v2f16(
-; CHECK-AMDGPU-SAME: <2 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-AMDGPU-NEXT:  [[ENTRY:.*:]]
-; CHECK-AMDGPU-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-AMDGPU:       [[THEN]]:
-; CHECK-AMDGPU-NEXT:    [[VAL1:%.*]] = shufflevector <2 x half> [[ARG0]], <2 x half> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-AMDGPU-NEXT:    tail call void @func0()
-; CHECK-AMDGPU-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-AMDGPU:       [[ELSE]]:
-; CHECK-AMDGPU-NEXT:    [[VAL2:%.*]] = shufflevector <2 x half> [[ARG0]], <2 x half> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-AMDGPU-NEXT:    tail call void @func1()
-; CHECK-AMDGPU-NEXT:    br label %[[FINALLY]]
-; CHECK-AMDGPU:       [[FINALLY]]:
-; CHECK-AMDGPU-NEXT:    [[VAL3:%.*]] = phi <2 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-AMDGPU-NEXT:    ret <2 x half> [[VAL3]]
-;
-; CHECK-ARM-LABEL: define <2 x half> @shuffle_v2f16(
-; CHECK-ARM-SAME: <2 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-ARM-NEXT:  [[ENTRY:.*:]]
-; CHECK-ARM-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-ARM:       [[THEN]]:
-; CHECK-ARM-NEXT:    [[VAL1:%.*]] = shufflevector <2 x half> [[ARG0]], <2 x half> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-ARM-NEXT:    tail call void @func0()
-; CHECK-ARM-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-ARM:       [[ELSE]]:
-; CHECK-ARM-NEXT:    [[VAL2:%.*]] = shufflevector <2 x half> [[ARG0]], <2 x half> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-ARM-NEXT:    tail call void @func1()
-; CHECK-ARM-NEXT:    br label %[[FINALLY]]
-; CHECK-ARM:       [[FINALLY]]:
-; CHECK-ARM-NEXT:    [[VAL3:%.*]] = phi <2 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-ARM-NEXT:    ret <2 x half> [[VAL3]]
-;
-; CHECK-HEXAGON-LABEL: define <2 x half> @shuffle_v2f16(
-; CHECK-HEXAGON-SAME: <2 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-HEXAGON-NEXT:  [[ENTRY:.*:]]
-; CHECK-HEXAGON-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-HEXAGON:       [[THEN]]:
-; CHECK-HEXAGON-NEXT:    [[VAL1:%.*]] = shufflevector <2 x half> [[ARG0]], <2 x half> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-HEXAGON-NEXT:    tail call void @func0()
-; CHECK-HEXAGON-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-HEXAGON:       [[ELSE]]:
-; CHECK-HEXAGON-NEXT:    [[VAL2:%.*]] = shufflevector <2 x half> [[ARG0]], <2 x half> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-HEXAGON-NEXT:    tail call void @func1()
-; CHECK-HEXAGON-NEXT:    br label %[[FINALLY]]
-; CHECK-HEXAGON:       [[FINALLY]]:
-; CHECK-HEXAGON-NEXT:    [[VAL3:%.*]] = phi <2 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-HEXAGON-NEXT:    ret <2 x half> [[VAL3]]
-;
-; CHECK-RISCV-LABEL: define <2 x half> @shuffle_v2f16(
-; CHECK-RISCV-SAME: <2 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-RISCV-NEXT:  [[ENTRY:.*:]]
-; CHECK-RISCV-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-RISCV:       [[THEN]]:
-; CHECK-RISCV-NEXT:    [[VAL1:%.*]] = shufflevector <2 x half> [[ARG0]], <2 x half> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-RISCV-NEXT:    tail call void @func0()
-; CHECK-RISCV-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-RISCV:       [[ELSE]]:
-; CHECK-RISCV-NEXT:    [[VAL2:%.*]] = shufflevector <2 x half> [[ARG0]], <2 x half> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-RISCV-NEXT:    tail call void @func1()
-; CHECK-RISCV-NEXT:    br label %[[FINALLY]]
-; CHECK-RISCV:       [[FINALLY]]:
-; CHECK-RISCV-NEXT:    [[VAL3:%.*]] = phi <2 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-RISCV-NEXT:    ret <2 x half> [[VAL3]]
-;
-; CHECK-X86-V1-LABEL: define <2 x half> @shuffle_v2f16(
-; CHECK-X86-V1-SAME: <2 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V1-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V1:       [[THEN]]:
-; CHECK-X86-V1-NEXT:    [[VAL1:%.*]] = shufflevector <2 x half> [[ARG0]], <2 x half> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-X86-V1-NEXT:    tail call void @func0()
-; CHECK-X86-V1-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V1:       [[ELSE]]:
-; CHECK-X86-V1-NEXT:    [[VAL2:%.*]] = shufflevector <2 x half> [[ARG0]], <2 x half> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-X86-V1-NEXT:    tail call void @func1()
-; CHECK-X86-V1-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V1:       [[FINALLY]]:
-; CHECK-X86-V1-NEXT:    [[VAL3:%.*]] = phi <2 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V1-NEXT:    ret <2 x half> [[VAL3]]
-;
-; CHECK-X86-V2-LABEL: define <2 x half> @shuffle_v2f16(
-; CHECK-X86-V2-SAME: <2 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V2-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V2:       [[THEN]]:
-; CHECK-X86-V2-NEXT:    [[VAL1:%.*]] = shufflevector <2 x half> [[ARG0]], <2 x half> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-X86-V2-NEXT:    tail call void @func0()
-; CHECK-X86-V2-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V2:       [[ELSE]]:
-; CHECK-X86-V2-NEXT:    [[VAL2:%.*]] = shufflevector <2 x half> [[ARG0]], <2 x half> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-X86-V2-NEXT:    tail call void @func1()
-; CHECK-X86-V2-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V2:       [[FINALLY]]:
-; CHECK-X86-V2-NEXT:    [[VAL3:%.*]] = phi <2 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V2-NEXT:    ret <2 x half> [[VAL3]]
-;
-; CHECK-X86-V3-LABEL: define <2 x half> @shuffle_v2f16(
-; CHECK-X86-V3-SAME: <2 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V3-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V3:       [[THEN]]:
-; CHECK-X86-V3-NEXT:    [[VAL1:%.*]] = shufflevector <2 x half> [[ARG0]], <2 x half> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-X86-V3-NEXT:    tail call void @func0()
-; CHECK-X86-V3-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V3:       [[ELSE]]:
-; CHECK-X86-V3-NEXT:    [[VAL2:%.*]] = shufflevector <2 x half> [[ARG0]], <2 x half> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-X86-V3-NEXT:    tail call void @func1()
-; CHECK-X86-V3-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V3:       [[FINALLY]]:
-; CHECK-X86-V3-NEXT:    [[VAL3:%.*]] = phi <2 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V3-NEXT:    ret <2 x half> [[VAL3]]
-;
-; CHECK-X86-V4-LABEL: define <2 x half> @shuffle_v2f16(
-; CHECK-X86-V4-SAME: <2 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V4-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V4:       [[THEN]]:
-; CHECK-X86-V4-NEXT:    [[VAL1:%.*]] = shufflevector <2 x half> [[ARG0]], <2 x half> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-X86-V4-NEXT:    tail call void @func0()
-; CHECK-X86-V4-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V4:       [[ELSE]]:
-; CHECK-X86-V4-NEXT:    [[VAL2:%.*]] = shufflevector <2 x half> [[ARG0]], <2 x half> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-X86-V4-NEXT:    tail call void @func1()
-; CHECK-X86-V4-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V4:       [[FINALLY]]:
-; CHECK-X86-V4-NEXT:    [[VAL3:%.*]] = phi <2 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V4-NEXT:    ret <2 x half> [[VAL3]]
-;
 entry:
   br i1 %cond, label %then, label %else
 
@@ -4144,150 +823,6 @@ define <3 x half> @shuffle_v3f16(<3 x half> %arg0, i1 %cond) {
 ; CHECK-NEXT:    [[VAL3:%.*]] = phi <3 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
 ; CHECK-NEXT:    ret <3 x half> [[VAL3]]
 ;
-; CHECK-AARCH64-LABEL: define <3 x half> @shuffle_v3f16(
-; CHECK-AARCH64-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-AARCH64-NEXT:  [[ENTRY:.*:]]
-; CHECK-AARCH64-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-AARCH64:       [[THEN]]:
-; CHECK-AARCH64-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 1, i32 1>
-; CHECK-AARCH64-NEXT:    tail call void @func0()
-; CHECK-AARCH64-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-AARCH64:       [[ELSE]]:
-; CHECK-AARCH64-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 2, i32 2, i32 2>
-; CHECK-AARCH64-NEXT:    tail call void @func1()
-; CHECK-AARCH64-NEXT:    br label %[[FINALLY]]
-; CHECK-AARCH64:       [[FINALLY]]:
-; CHECK-AARCH64-NEXT:    [[VAL3:%.*]] = phi <3 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-AARCH64-NEXT:    ret <3 x half> [[VAL3]]
-;
-; CHECK-AMDGPU-LABEL: define <3 x half> @shuffle_v3f16(
-; CHECK-AMDGPU-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-AMDGPU-NEXT:  [[ENTRY:.*:]]
-; CHECK-AMDGPU-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-AMDGPU:       [[THEN]]:
-; CHECK-AMDGPU-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 1, i32 1>
-; CHECK-AMDGPU-NEXT:    tail call void @func0()
-; CHECK-AMDGPU-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-AMDGPU:       [[ELSE]]:
-; CHECK-AMDGPU-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 2, i32 2, i32 2>
-; CHECK-AMDGPU-NEXT:    tail call void @func1()
-; CHECK-AMDGPU-NEXT:    br label %[[FINALLY]]
-; CHECK-AMDGPU:       [[FINALLY]]:
-; CHECK-AMDGPU-NEXT:    [[VAL3:%.*]] = phi <3 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-AMDGPU-NEXT:    ret <3 x half> [[VAL3]]
-;
-; CHECK-ARM-LABEL: define <3 x half> @shuffle_v3f16(
-; CHECK-ARM-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-ARM-NEXT:  [[ENTRY:.*:]]
-; CHECK-ARM-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-ARM:       [[THEN]]:
-; CHECK-ARM-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 1, i32 1>
-; CHECK-ARM-NEXT:    tail call void @func0()
-; CHECK-ARM-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-ARM:       [[ELSE]]:
-; CHECK-ARM-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 2, i32 2, i32 2>
-; CHECK-ARM-NEXT:    tail call void @func1()
-; CHECK-ARM-NEXT:    br label %[[FINALLY]]
-; CHECK-ARM:       [[FINALLY]]:
-; CHECK-ARM-NEXT:    [[VAL3:%.*]] = phi <3 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-ARM-NEXT:    ret <3 x half> [[VAL3]]
-;
-; CHECK-HEXAGON-LABEL: define <3 x half> @shuffle_v3f16(
-; CHECK-HEXAGON-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-HEXAGON-NEXT:  [[ENTRY:.*:]]
-; CHECK-HEXAGON-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-HEXAGON:       [[THEN]]:
-; CHECK-HEXAGON-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 1, i32 1>
-; CHECK-HEXAGON-NEXT:    tail call void @func0()
-; CHECK-HEXAGON-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-HEXAGON:       [[ELSE]]:
-; CHECK-HEXAGON-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 2, i32 2, i32 2>
-; CHECK-HEXAGON-NEXT:    tail call void @func1()
-; CHECK-HEXAGON-NEXT:    br label %[[FINALLY]]
-; CHECK-HEXAGON:       [[FINALLY]]:
-; CHECK-HEXAGON-NEXT:    [[VAL3:%.*]] = phi <3 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-HEXAGON-NEXT:    ret <3 x half> [[VAL3]]
-;
-; CHECK-RISCV-LABEL: define <3 x half> @shuffle_v3f16(
-; CHECK-RISCV-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-RISCV-NEXT:  [[ENTRY:.*:]]
-; CHECK-RISCV-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-RISCV:       [[THEN]]:
-; CHECK-RISCV-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 1, i32 1>
-; CHECK-RISCV-NEXT:    tail call void @func0()
-; CHECK-RISCV-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-RISCV:       [[ELSE]]:
-; CHECK-RISCV-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 2, i32 2, i32 2>
-; CHECK-RISCV-NEXT:    tail call void @func1()
-; CHECK-RISCV-NEXT:    br label %[[FINALLY]]
-; CHECK-RISCV:       [[FINALLY]]:
-; CHECK-RISCV-NEXT:    [[VAL3:%.*]] = phi <3 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-RISCV-NEXT:    ret <3 x half> [[VAL3]]
-;
-; CHECK-X86-V1-LABEL: define <3 x half> @shuffle_v3f16(
-; CHECK-X86-V1-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V1-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V1:       [[THEN]]:
-; CHECK-X86-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 1, i32 1>
-; CHECK-X86-V1-NEXT:    tail call void @func0()
-; CHECK-X86-V1-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V1:       [[ELSE]]:
-; CHECK-X86-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 2, i32 2, i32 2>
-; CHECK-X86-V1-NEXT:    tail call void @func1()
-; CHECK-X86-V1-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V1:       [[FINALLY]]:
-; CHECK-X86-V1-NEXT:    [[VAL3:%.*]] = phi <3 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V1-NEXT:    ret <3 x half> [[VAL3]]
-;
-; CHECK-X86-V2-LABEL: define <3 x half> @shuffle_v3f16(
-; CHECK-X86-V2-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V2-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V2:       [[THEN]]:
-; CHECK-X86-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 1, i32 1>
-; CHECK-X86-V2-NEXT:    tail call void @func0()
-; CHECK-X86-V2-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V2:       [[ELSE]]:
-; CHECK-X86-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 2, i32 2, i32 2>
-; CHECK-X86-V2-NEXT:    tail call void @func1()
-; CHECK-X86-V2-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V2:       [[FINALLY]]:
-; CHECK-X86-V2-NEXT:    [[VAL3:%.*]] = phi <3 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V2-NEXT:    ret <3 x half> [[VAL3]]
-;
-; CHECK-X86-V3-LABEL: define <3 x half> @shuffle_v3f16(
-; CHECK-X86-V3-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V3-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V3:       [[THEN]]:
-; CHECK-X86-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 1, i32 1>
-; CHECK-X86-V3-NEXT:    tail call void @func0()
-; CHECK-X86-V3-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V3:       [[ELSE]]:
-; CHECK-X86-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 2, i32 2, i32 2>
-; CHECK-X86-V3-NEXT:    tail call void @func1()
-; CHECK-X86-V3-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V3:       [[FINALLY]]:
-; CHECK-X86-V3-NEXT:    [[VAL3:%.*]] = phi <3 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V3-NEXT:    ret <3 x half> [[VAL3]]
-;
-; CHECK-X86-V4-LABEL: define <3 x half> @shuffle_v3f16(
-; CHECK-X86-V4-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V4-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V4:       [[THEN]]:
-; CHECK-X86-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 1, i32 1>
-; CHECK-X86-V4-NEXT:    tail call void @func0()
-; CHECK-X86-V4-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V4:       [[ELSE]]:
-; CHECK-X86-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 2, i32 2, i32 2>
-; CHECK-X86-V4-NEXT:    tail call void @func1()
-; CHECK-X86-V4-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V4:       [[FINALLY]]:
-; CHECK-X86-V4-NEXT:    [[VAL3:%.*]] = phi <3 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V4-NEXT:    ret <3 x half> [[VAL3]]
-;
 entry:
   br i1 %cond, label %then, label %else
 
@@ -4323,150 +858,6 @@ define <4 x half> @shuffle_v4f16(<3 x half> %arg0, i1 %cond) {
 ; CHECK-NEXT:    [[VAL3:%.*]] = phi <4 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
 ; CHECK-NEXT:    ret <4 x half> [[VAL3]]
 ;
-; CHECK-AARCH64-LABEL: define <4 x half> @shuffle_v4f16(
-; CHECK-AARCH64-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-AARCH64-NEXT:  [[ENTRY:.*:]]
-; CHECK-AARCH64-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-AARCH64:       [[THEN]]:
-; CHECK-AARCH64-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
-; CHECK-AARCH64-NEXT:    tail call void @func0()
-; CHECK-AARCH64-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-AARCH64:       [[ELSE]]:
-; CHECK-AARCH64-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-; CHECK-AARCH64-NEXT:    tail call void @func1()
-; CHECK-AARCH64-NEXT:    br label %[[FINALLY]]
-; CHECK-AARCH64:       [[FINALLY]]:
-; CHECK-AARCH64-NEXT:    [[VAL3:%.*]] = phi <4 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-AARCH64-NEXT:    ret <4 x half> [[VAL3]]
-;
-; CHECK-AMDGPU-LABEL: define <4 x half> @shuffle_v4f16(
-; CHECK-AMDGPU-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-AMDGPU-NEXT:  [[ENTRY:.*:]]
-; CHECK-AMDGPU-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-AMDGPU:       [[THEN]]:
-; CHECK-AMDGPU-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
-; CHECK-AMDGPU-NEXT:    tail call void @func0()
-; CHECK-AMDGPU-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-AMDGPU:       [[ELSE]]:
-; CHECK-AMDGPU-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-; CHECK-AMDGPU-NEXT:    tail call void @func1()
-; CHECK-AMDGPU-NEXT:    br label %[[FINALLY]]
-; CHECK-AMDGPU:       [[FINALLY]]:
-; CHECK-AMDGPU-NEXT:    [[VAL3:%.*]] = phi <4 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-AMDGPU-NEXT:    ret <4 x half> [[VAL3]]
-;
-; CHECK-ARM-LABEL: define <4 x half> @shuffle_v4f16(
-; CHECK-ARM-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-ARM-NEXT:  [[ENTRY:.*:]]
-; CHECK-ARM-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-ARM:       [[THEN]]:
-; CHECK-ARM-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
-; CHECK-ARM-NEXT:    tail call void @func0()
-; CHECK-ARM-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-ARM:       [[ELSE]]:
-; CHECK-ARM-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-; CHECK-ARM-NEXT:    tail call void @func1()
-; CHECK-ARM-NEXT:    br label %[[FINALLY]]
-; CHECK-ARM:       [[FINALLY]]:
-; CHECK-ARM-NEXT:    [[VAL3:%.*]] = phi <4 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-ARM-NEXT:    ret <4 x half> [[VAL3]]
-;
-; CHECK-HEXAGON-LABEL: define <4 x half> @shuffle_v4f16(
-; CHECK-HEXAGON-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-HEXAGON-NEXT:  [[ENTRY:.*:]]
-; CHECK-HEXAGON-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-HEXAGON:       [[THEN]]:
-; CHECK-HEXAGON-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
-; CHECK-HEXAGON-NEXT:    tail call void @func0()
-; CHECK-HEXAGON-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-HEXAGON:       [[ELSE]]:
-; CHECK-HEXAGON-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-; CHECK-HEXAGON-NEXT:    tail call void @func1()
-; CHECK-HEXAGON-NEXT:    br label %[[FINALLY]]
-; CHECK-HEXAGON:       [[FINALLY]]:
-; CHECK-HEXAGON-NEXT:    [[VAL3:%.*]] = phi <4 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-HEXAGON-NEXT:    ret <4 x half> [[VAL3]]
-;
-; CHECK-RISCV-LABEL: define <4 x half> @shuffle_v4f16(
-; CHECK-RISCV-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-RISCV-NEXT:  [[ENTRY:.*:]]
-; CHECK-RISCV-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-RISCV:       [[THEN]]:
-; CHECK-RISCV-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
-; CHECK-RISCV-NEXT:    tail call void @func0()
-; CHECK-RISCV-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-RISCV:       [[ELSE]]:
-; CHECK-RISCV-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-; CHECK-RISCV-NEXT:    tail call void @func1()
-; CHECK-RISCV-NEXT:    br label %[[FINALLY]]
-; CHECK-RISCV:       [[FINALLY]]:
-; CHECK-RISCV-NEXT:    [[VAL3:%.*]] = phi <4 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-RISCV-NEXT:    ret <4 x half> [[VAL3]]
-;
-; CHECK-X86-V1-LABEL: define <4 x half> @shuffle_v4f16(
-; CHECK-X86-V1-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V1-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V1:       [[THEN]]:
-; CHECK-X86-V1-NEXT:    [[TMP0:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 2, i32 0>
-; CHECK-X86-V1-NEXT:    tail call void @func0()
-; CHECK-X86-V1-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V1:       [[ELSE]]:
-; CHECK-X86-V1-NEXT:    tail call void @func1()
-; CHECK-X86-V1-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V1:       [[FINALLY]]:
-; CHECK-X86-V1-NEXT:    [[TMP1:%.*]] = phi <3 x half> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
-; CHECK-X86-V1-NEXT:    [[VAL3:%.*]] = shufflevector <3 x half> [[TMP1]], <3 x half> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V1-NEXT:    ret <4 x half> [[VAL3]]
-;
-; CHECK-X86-V2-LABEL: define <4 x half> @shuffle_v4f16(
-; CHECK-X86-V2-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V2-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V2:       [[THEN]]:
-; CHECK-X86-V2-NEXT:    [[TMP0:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 2, i32 0>
-; CHECK-X86-V2-NEXT:    tail call void @func0()
-; CHECK-X86-V2-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V2:       [[ELSE]]:
-; CHECK-X86-V2-NEXT:    tail call void @func1()
-; CHECK-X86-V2-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V2:       [[FINALLY]]:
-; CHECK-X86-V2-NEXT:    [[TMP1:%.*]] = phi <3 x half> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
-; CHECK-X86-V2-NEXT:    [[VAL3:%.*]] = shufflevector <3 x half> [[TMP1]], <3 x half> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V2-NEXT:    ret <4 x half> [[VAL3]]
-;
-; CHECK-X86-V3-LABEL: define <4 x half> @shuffle_v4f16(
-; CHECK-X86-V3-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V3-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V3:       [[THEN]]:
-; CHECK-X86-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
-; CHECK-X86-V3-NEXT:    tail call void @func0()
-; CHECK-X86-V3-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V3:       [[ELSE]]:
-; CHECK-X86-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V3-NEXT:    tail call void @func1()
-; CHECK-X86-V3-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V3:       [[FINALLY]]:
-; CHECK-X86-V3-NEXT:    [[VAL3:%.*]] = phi <4 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V3-NEXT:    ret <4 x half> [[VAL3]]
-;
-; CHECK-X86-V4-LABEL: define <4 x half> @shuffle_v4f16(
-; CHECK-X86-V4-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V4-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V4:       [[THEN]]:
-; CHECK-X86-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
-; CHECK-X86-V4-NEXT:    tail call void @func0()
-; CHECK-X86-V4-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V4:       [[ELSE]]:
-; CHECK-X86-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V4-NEXT:    tail call void @func1()
-; CHECK-X86-V4-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V4:       [[FINALLY]]:
-; CHECK-X86-V4-NEXT:    [[VAL3:%.*]] = phi <4 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V4-NEXT:    ret <4 x half> [[VAL3]]
-;
 entry:
   br i1 %cond, label %then, label %else
 
@@ -4502,150 +893,6 @@ define <6 x half> @shuffle_v6f16(<3 x half> %arg0, i1 %cond) {
 ; CHECK-NEXT:    [[VAL3:%.*]] = phi <6 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
 ; CHECK-NEXT:    ret <6 x half> [[VAL3]]
 ;
-; CHECK-AARCH64-LABEL: define <6 x half> @shuffle_v6f16(
-; CHECK-AARCH64-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-AARCH64-NEXT:  [[ENTRY:.*:]]
-; CHECK-AARCH64-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-AARCH64:       [[THEN]]:
-; CHECK-AARCH64-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-AARCH64-NEXT:    tail call void @func0()
-; CHECK-AARCH64-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-AARCH64:       [[ELSE]]:
-; CHECK-AARCH64-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-AARCH64-NEXT:    tail call void @func1()
-; CHECK-AARCH64-NEXT:    br label %[[FINALLY]]
-; CHECK-AARCH64:       [[FINALLY]]:
-; CHECK-AARCH64-NEXT:    [[VAL3:%.*]] = phi <6 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-AARCH64-NEXT:    ret <6 x half> [[VAL3]]
-;
-; CHECK-AMDGPU-LABEL: define <6 x half> @shuffle_v6f16(
-; CHECK-AMDGPU-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-AMDGPU-NEXT:  [[ENTRY:.*:]]
-; CHECK-AMDGPU-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-AMDGPU:       [[THEN]]:
-; CHECK-AMDGPU-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-AMDGPU-NEXT:    tail call void @func0()
-; CHECK-AMDGPU-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-AMDGPU:       [[ELSE]]:
-; CHECK-AMDGPU-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-AMDGPU-NEXT:    tail call void @func1()
-; CHECK-AMDGPU-NEXT:    br label %[[FINALLY]]
-; CHECK-AMDGPU:       [[FINALLY]]:
-; CHECK-AMDGPU-NEXT:    [[VAL3:%.*]] = phi <6 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-AMDGPU-NEXT:    ret <6 x half> [[VAL3]]
-;
-; CHECK-ARM-LABEL: define <6 x half> @shuffle_v6f16(
-; CHECK-ARM-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-ARM-NEXT:  [[ENTRY:.*:]]
-; CHECK-ARM-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-ARM:       [[THEN]]:
-; CHECK-ARM-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-ARM-NEXT:    tail call void @func0()
-; CHECK-ARM-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-ARM:       [[ELSE]]:
-; CHECK-ARM-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-ARM-NEXT:    tail call void @func1()
-; CHECK-ARM-NEXT:    br label %[[FINALLY]]
-; CHECK-ARM:       [[FINALLY]]:
-; CHECK-ARM-NEXT:    [[VAL3:%.*]] = phi <6 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-ARM-NEXT:    ret <6 x half> [[VAL3]]
-;
-; CHECK-HEXAGON-LABEL: define <6 x half> @shuffle_v6f16(
-; CHECK-HEXAGON-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-HEXAGON-NEXT:  [[ENTRY:.*:]]
-; CHECK-HEXAGON-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-HEXAGON:       [[THEN]]:
-; CHECK-HEXAGON-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-HEXAGON-NEXT:    tail call void @func0()
-; CHECK-HEXAGON-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-HEXAGON:       [[ELSE]]:
-; CHECK-HEXAGON-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-HEXAGON-NEXT:    tail call void @func1()
-; CHECK-HEXAGON-NEXT:    br label %[[FINALLY]]
-; CHECK-HEXAGON:       [[FINALLY]]:
-; CHECK-HEXAGON-NEXT:    [[VAL3:%.*]] = phi <6 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-HEXAGON-NEXT:    ret <6 x half> [[VAL3]]
-;
-; CHECK-RISCV-LABEL: define <6 x half> @shuffle_v6f16(
-; CHECK-RISCV-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-RISCV-NEXT:  [[ENTRY:.*:]]
-; CHECK-RISCV-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-RISCV:       [[THEN]]:
-; CHECK-RISCV-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-RISCV-NEXT:    tail call void @func0()
-; CHECK-RISCV-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-RISCV:       [[ELSE]]:
-; CHECK-RISCV-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-RISCV-NEXT:    tail call void @func1()
-; CHECK-RISCV-NEXT:    br label %[[FINALLY]]
-; CHECK-RISCV:       [[FINALLY]]:
-; CHECK-RISCV-NEXT:    [[VAL3:%.*]] = phi <6 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-RISCV-NEXT:    ret <6 x half> [[VAL3]]
-;
-; CHECK-X86-V1-LABEL: define <6 x half> @shuffle_v6f16(
-; CHECK-X86-V1-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V1-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V1:       [[THEN]]:
-; CHECK-X86-V1-NEXT:    [[TMP0:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 2, i32 0>
-; CHECK-X86-V1-NEXT:    tail call void @func0()
-; CHECK-X86-V1-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V1:       [[ELSE]]:
-; CHECK-X86-V1-NEXT:    tail call void @func1()
-; CHECK-X86-V1-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V1:       [[FINALLY]]:
-; CHECK-X86-V1-NEXT:    [[TMP1:%.*]] = phi <3 x half> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
-; CHECK-X86-V1-NEXT:    [[VAL3:%.*]] = shufflevector <3 x half> [[TMP1]], <3 x half> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V1-NEXT:    ret <6 x half> [[VAL3]]
-;
-; CHECK-X86-V2-LABEL: define <6 x half> @shuffle_v6f16(
-; CHECK-X86-V2-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V2-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V2:       [[THEN]]:
-; CHECK-X86-V2-NEXT:    [[TMP0:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 2, i32 0>
-; CHECK-X86-V2-NEXT:    tail call void @func0()
-; CHECK-X86-V2-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V2:       [[ELSE]]:
-; CHECK-X86-V2-NEXT:    tail call void @func1()
-; CHECK-X86-V2-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V2:       [[FINALLY]]:
-; CHECK-X86-V2-NEXT:    [[TMP1:%.*]] = phi <3 x half> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
-; CHECK-X86-V2-NEXT:    [[VAL3:%.*]] = shufflevector <3 x half> [[TMP1]], <3 x half> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V2-NEXT:    ret <6 x half> [[VAL3]]
-;
-; CHECK-X86-V3-LABEL: define <6 x half> @shuffle_v6f16(
-; CHECK-X86-V3-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V3-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V3:       [[THEN]]:
-; CHECK-X86-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-X86-V3-NEXT:    tail call void @func0()
-; CHECK-X86-V3-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V3:       [[ELSE]]:
-; CHECK-X86-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V3-NEXT:    tail call void @func1()
-; CHECK-X86-V3-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V3:       [[FINALLY]]:
-; CHECK-X86-V3-NEXT:    [[VAL3:%.*]] = phi <6 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V3-NEXT:    ret <6 x half> [[VAL3]]
-;
-; CHECK-X86-V4-LABEL: define <6 x half> @shuffle_v6f16(
-; CHECK-X86-V4-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V4-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V4:       [[THEN]]:
-; CHECK-X86-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-X86-V4-NEXT:    tail call void @func0()
-; CHECK-X86-V4-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V4:       [[ELSE]]:
-; CHECK-X86-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V4-NEXT:    tail call void @func1()
-; CHECK-X86-V4-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V4:       [[FINALLY]]:
-; CHECK-X86-V4-NEXT:    [[VAL3:%.*]] = phi <6 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V4-NEXT:    ret <6 x half> [[VAL3]]
-;
 entry:
   br i1 %cond, label %then, label %else
 
@@ -4681,150 +928,6 @@ define <8 x half> @shuffle_v8f16(<3 x half> %arg0, i1 %cond) {
 ; CHECK-NEXT:    [[VAL3:%.*]] = phi <8 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
 ; CHECK-NEXT:    ret <8 x half> [[VAL3]]
 ;
-; CHECK-AARCH64-LABEL: define <8 x half> @shuffle_v8f16(
-; CHECK-AARCH64-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-AARCH64-NEXT:  [[ENTRY:.*:]]
-; CHECK-AARCH64-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-AARCH64:       [[THEN]]:
-; CHECK-AARCH64-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-AARCH64-NEXT:    tail call void @func0()
-; CHECK-AARCH64-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-AARCH64:       [[ELSE]]:
-; CHECK-AARCH64-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-AARCH64-NEXT:    tail call void @func1()
-; CHECK-AARCH64-NEXT:    br label %[[FINALLY]]
-; CHECK-AARCH64:       [[FINALLY]]:
-; CHECK-AARCH64-NEXT:    [[VAL3:%.*]] = phi <8 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-AARCH64-NEXT:    ret <8 x half> [[VAL3]]
-;
-; CHECK-AMDGPU-LABEL: define <8 x half> @shuffle_v8f16(
-; CHECK-AMDGPU-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-AMDGPU-NEXT:  [[ENTRY:.*:]]
-; CHECK-AMDGPU-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-AMDGPU:       [[THEN]]:
-; CHECK-AMDGPU-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-AMDGPU-NEXT:    tail call void @func0()
-; CHECK-AMDGPU-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-AMDGPU:       [[ELSE]]:
-; CHECK-AMDGPU-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-AMDGPU-NEXT:    tail call void @func1()
-; CHECK-AMDGPU-NEXT:    br label %[[FINALLY]]
-; CHECK-AMDGPU:       [[FINALLY]]:
-; CHECK-AMDGPU-NEXT:    [[VAL3:%.*]] = phi <8 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-AMDGPU-NEXT:    ret <8 x half> [[VAL3]]
-;
-; CHECK-ARM-LABEL: define <8 x half> @shuffle_v8f16(
-; CHECK-ARM-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-ARM-NEXT:  [[ENTRY:.*:]]
-; CHECK-ARM-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-ARM:       [[THEN]]:
-; CHECK-ARM-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-ARM-NEXT:    tail call void @func0()
-; CHECK-ARM-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-ARM:       [[ELSE]]:
-; CHECK-ARM-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-ARM-NEXT:    tail call void @func1()
-; CHECK-ARM-NEXT:    br label %[[FINALLY]]
-; CHECK-ARM:       [[FINALLY]]:
-; CHECK-ARM-NEXT:    [[VAL3:%.*]] = phi <8 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-ARM-NEXT:    ret <8 x half> [[VAL3]]
-;
-; CHECK-HEXAGON-LABEL: define <8 x half> @shuffle_v8f16(
-; CHECK-HEXAGON-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-HEXAGON-NEXT:  [[ENTRY:.*:]]
-; CHECK-HEXAGON-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-HEXAGON:       [[THEN]]:
-; CHECK-HEXAGON-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-HEXAGON-NEXT:    tail call void @func0()
-; CHECK-HEXAGON-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-HEXAGON:       [[ELSE]]:
-; CHECK-HEXAGON-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-HEXAGON-NEXT:    tail call void @func1()
-; CHECK-HEXAGON-NEXT:    br label %[[FINALLY]]
-; CHECK-HEXAGON:       [[FINALLY]]:
-; CHECK-HEXAGON-NEXT:    [[VAL3:%.*]] = phi <8 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-HEXAGON-NEXT:    ret <8 x half> [[VAL3]]
-;
-; CHECK-RISCV-LABEL: define <8 x half> @shuffle_v8f16(
-; CHECK-RISCV-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-RISCV-NEXT:  [[ENTRY:.*:]]
-; CHECK-RISCV-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-RISCV:       [[THEN]]:
-; CHECK-RISCV-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-RISCV-NEXT:    tail call void @func0()
-; CHECK-RISCV-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-RISCV:       [[ELSE]]:
-; CHECK-RISCV-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-RISCV-NEXT:    tail call void @func1()
-; CHECK-RISCV-NEXT:    br label %[[FINALLY]]
-; CHECK-RISCV:       [[FINALLY]]:
-; CHECK-RISCV-NEXT:    [[VAL3:%.*]] = phi <8 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-RISCV-NEXT:    ret <8 x half> [[VAL3]]
-;
-; CHECK-X86-V1-LABEL: define <8 x half> @shuffle_v8f16(
-; CHECK-X86-V1-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V1-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V1:       [[THEN]]:
-; CHECK-X86-V1-NEXT:    [[TMP0:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 2, i32 0>
-; CHECK-X86-V1-NEXT:    tail call void @func0()
-; CHECK-X86-V1-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V1:       [[ELSE]]:
-; CHECK-X86-V1-NEXT:    tail call void @func1()
-; CHECK-X86-V1-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V1:       [[FINALLY]]:
-; CHECK-X86-V1-NEXT:    [[TMP1:%.*]] = phi <3 x half> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
-; CHECK-X86-V1-NEXT:    [[VAL3:%.*]] = shufflevector <3 x half> [[TMP1]], <3 x half> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V1-NEXT:    ret <8 x half> [[VAL3]]
-;
-; CHECK-X86-V2-LABEL: define <8 x half> @shuffle_v8f16(
-; CHECK-X86-V2-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V2-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V2:       [[THEN]]:
-; CHECK-X86-V2-NEXT:    [[TMP0:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 2, i32 0>
-; CHECK-X86-V2-NEXT:    tail call void @func0()
-; CHECK-X86-V2-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V2:       [[ELSE]]:
-; CHECK-X86-V2-NEXT:    tail call void @func1()
-; CHECK-X86-V2-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V2:       [[FINALLY]]:
-; CHECK-X86-V2-NEXT:    [[TMP1:%.*]] = phi <3 x half> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
-; CHECK-X86-V2-NEXT:    [[VAL3:%.*]] = shufflevector <3 x half> [[TMP1]], <3 x half> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V2-NEXT:    ret <8 x half> [[VAL3]]
-;
-; CHECK-X86-V3-LABEL: define <8 x half> @shuffle_v8f16(
-; CHECK-X86-V3-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V3-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V3:       [[THEN]]:
-; CHECK-X86-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-X86-V3-NEXT:    tail call void @func0()
-; CHECK-X86-V3-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V3:       [[ELSE]]:
-; CHECK-X86-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V3-NEXT:    tail call void @func1()
-; CHECK-X86-V3-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V3:       [[FINALLY]]:
-; CHECK-X86-V3-NEXT:    [[VAL3:%.*]] = phi <8 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V3-NEXT:    ret <8 x half> [[VAL3]]
-;
-; CHECK-X86-V4-LABEL: define <8 x half> @shuffle_v8f16(
-; CHECK-X86-V4-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V4-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V4:       [[THEN]]:
-; CHECK-X86-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-X86-V4-NEXT:    tail call void @func0()
-; CHECK-X86-V4-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V4:       [[ELSE]]:
-; CHECK-X86-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V4-NEXT:    tail call void @func1()
-; CHECK-X86-V4-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V4:       [[FINALLY]]:
-; CHECK-X86-V4-NEXT:    [[VAL3:%.*]] = phi <8 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V4-NEXT:    ret <8 x half> [[VAL3]]
-;
 entry:
   br i1 %cond, label %then, label %else
 
@@ -4860,150 +963,6 @@ define <16 x half> @shuffle_v16f16(<3 x half> %arg0, i1 %cond) {
 ; CHECK-NEXT:    [[VAL3:%.*]] = phi <16 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
 ; CHECK-NEXT:    ret <16 x half> [[VAL3]]
 ;
-; CHECK-AARCH64-LABEL: define <16 x half> @shuffle_v16f16(
-; CHECK-AARCH64-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-AARCH64-NEXT:  [[ENTRY:.*:]]
-; CHECK-AARCH64-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-AARCH64:       [[THEN]]:
-; CHECK-AARCH64-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-AARCH64-NEXT:    tail call void @func0()
-; CHECK-AARCH64-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-AARCH64:       [[ELSE]]:
-; CHECK-AARCH64-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-AARCH64-NEXT:    tail call void @func1()
-; CHECK-AARCH64-NEXT:    br label %[[FINALLY]]
-; CHECK-AARCH64:       [[FINALLY]]:
-; CHECK-AARCH64-NEXT:    [[VAL3:%.*]] = phi <16 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-AARCH64-NEXT:    ret <16 x half> [[VAL3]]
-;
-; CHECK-AMDGPU-LABEL: define <16 x half> @shuffle_v16f16(
-; CHECK-AMDGPU-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-AMDGPU-NEXT:  [[ENTRY:.*:]]
-; CHECK-AMDGPU-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-AMDGPU:       [[THEN]]:
-; CHECK-AMDGPU-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-AMDGPU-NEXT:    tail call void @func0()
-; CHECK-AMDGPU-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-AMDGPU:       [[ELSE]]:
-; CHECK-AMDGPU-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-AMDGPU-NEXT:    tail call void @func1()
-; CHECK-AMDGPU-NEXT:    br label %[[FINALLY]]
-; CHECK-AMDGPU:       [[FINALLY]]:
-; CHECK-AMDGPU-NEXT:    [[VAL3:%.*]] = phi <16 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-AMDGPU-NEXT:    ret <16 x half> [[VAL3]]
-;
-; CHECK-ARM-LABEL: define <16 x half> @shuffle_v16f16(
-; CHECK-ARM-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-ARM-NEXT:  [[ENTRY:.*:]]
-; CHECK-ARM-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-ARM:       [[THEN]]:
-; CHECK-ARM-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-ARM-NEXT:    tail call void @func0()
-; CHECK-ARM-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-ARM:       [[ELSE]]:
-; CHECK-ARM-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-ARM-NEXT:    tail call void @func1()
-; CHECK-ARM-NEXT:    br label %[[FINALLY]]
-; CHECK-ARM:       [[FINALLY]]:
-; CHECK-ARM-NEXT:    [[VAL3:%.*]] = phi <16 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-ARM-NEXT:    ret <16 x half> [[VAL3]]
-;
-; CHECK-HEXAGON-LABEL: define <16 x half> @shuffle_v16f16(
-; CHECK-HEXAGON-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-HEXAGON-NEXT:  [[ENTRY:.*:]]
-; CHECK-HEXAGON-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-HEXAGON:       [[THEN]]:
-; CHECK-HEXAGON-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-HEXAGON-NEXT:    tail call void @func0()
-; CHECK-HEXAGON-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-HEXAGON:       [[ELSE]]:
-; CHECK-HEXAGON-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-HEXAGON-NEXT:    tail call void @func1()
-; CHECK-HEXAGON-NEXT:    br label %[[FINALLY]]
-; CHECK-HEXAGON:       [[FINALLY]]:
-; CHECK-HEXAGON-NEXT:    [[VAL3:%.*]] = phi <16 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-HEXAGON-NEXT:    ret <16 x half> [[VAL3]]
-;
-; CHECK-RISCV-LABEL: define <16 x half> @shuffle_v16f16(
-; CHECK-RISCV-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-RISCV-NEXT:  [[ENTRY:.*:]]
-; CHECK-RISCV-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-RISCV:       [[THEN]]:
-; CHECK-RISCV-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-RISCV-NEXT:    tail call void @func0()
-; CHECK-RISCV-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-RISCV:       [[ELSE]]:
-; CHECK-RISCV-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-RISCV-NEXT:    tail call void @func1()
-; CHECK-RISCV-NEXT:    br label %[[FINALLY]]
-; CHECK-RISCV:       [[FINALLY]]:
-; CHECK-RISCV-NEXT:    [[VAL3:%.*]] = phi <16 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-RISCV-NEXT:    ret <16 x half> [[VAL3]]
-;
-; CHECK-X86-V1-LABEL: define <16 x half> @shuffle_v16f16(
-; CHECK-X86-V1-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V1-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V1:       [[THEN]]:
-; CHECK-X86-V1-NEXT:    [[TMP0:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 2, i32 0>
-; CHECK-X86-V1-NEXT:    tail call void @func0()
-; CHECK-X86-V1-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V1:       [[ELSE]]:
-; CHECK-X86-V1-NEXT:    tail call void @func1()
-; CHECK-X86-V1-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V1:       [[FINALLY]]:
-; CHECK-X86-V1-NEXT:    [[TMP1:%.*]] = phi <3 x half> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
-; CHECK-X86-V1-NEXT:    [[VAL3:%.*]] = shufflevector <3 x half> [[TMP1]], <3 x half> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V1-NEXT:    ret <16 x half> [[VAL3]]
-;
-; CHECK-X86-V2-LABEL: define <16 x half> @shuffle_v16f16(
-; CHECK-X86-V2-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V2-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V2:       [[THEN]]:
-; CHECK-X86-V2-NEXT:    [[TMP0:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 2, i32 0>
-; CHECK-X86-V2-NEXT:    tail call void @func0()
-; CHECK-X86-V2-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V2:       [[ELSE]]:
-; CHECK-X86-V2-NEXT:    tail call void @func1()
-; CHECK-X86-V2-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V2:       [[FINALLY]]:
-; CHECK-X86-V2-NEXT:    [[TMP1:%.*]] = phi <3 x half> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
-; CHECK-X86-V2-NEXT:    [[VAL3:%.*]] = shufflevector <3 x half> [[TMP1]], <3 x half> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V2-NEXT:    ret <16 x half> [[VAL3]]
-;
-; CHECK-X86-V3-LABEL: define <16 x half> @shuffle_v16f16(
-; CHECK-X86-V3-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V3-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V3:       [[THEN]]:
-; CHECK-X86-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-X86-V3-NEXT:    tail call void @func0()
-; CHECK-X86-V3-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V3:       [[ELSE]]:
-; CHECK-X86-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V3-NEXT:    tail call void @func1()
-; CHECK-X86-V3-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V3:       [[FINALLY]]:
-; CHECK-X86-V3-NEXT:    [[VAL3:%.*]] = phi <16 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V3-NEXT:    ret <16 x half> [[VAL3]]
-;
-; CHECK-X86-V4-LABEL: define <16 x half> @shuffle_v16f16(
-; CHECK-X86-V4-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V4-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V4:       [[THEN]]:
-; CHECK-X86-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-X86-V4-NEXT:    tail call void @func0()
-; CHECK-X86-V4-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V4:       [[ELSE]]:
-; CHECK-X86-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V4-NEXT:    tail call void @func1()
-; CHECK-X86-V4-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V4:       [[FINALLY]]:
-; CHECK-X86-V4-NEXT:    [[VAL3:%.*]] = phi <16 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V4-NEXT:    ret <16 x half> [[VAL3]]
-;
 entry:
   br i1 %cond, label %then, label %else
 
@@ -5039,150 +998,6 @@ define <32 x half> @shuffle_v32f16(<3 x half> %arg0, i1 %cond) {
 ; CHECK-NEXT:    [[VAL3:%.*]] = phi <32 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
 ; CHECK-NEXT:    ret <32 x half> [[VAL3]]
 ;
-; CHECK-AARCH64-LABEL: define <32 x half> @shuffle_v32f16(
-; CHECK-AARCH64-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-AARCH64-NEXT:  [[ENTRY:.*:]]
-; CHECK-AARCH64-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-AARCH64:       [[THEN]]:
-; CHECK-AARCH64-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-AARCH64-NEXT:    tail call void @func0()
-; CHECK-AARCH64-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-AARCH64:       [[ELSE]]:
-; CHECK-AARCH64-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-AARCH64-NEXT:    tail call void @func1()
-; CHECK-AARCH64-NEXT:    br label %[[FINALLY]]
-; CHECK-AARCH64:       [[FINALLY]]:
-; CHECK-AARCH64-NEXT:    [[VAL3:%.*]] = phi <32 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-AARCH64-NEXT:    ret <32 x half> [[VAL3]]
-;
-; CHECK-AMDGPU-LABEL: define <32 x half> @shuffle_v32f16(
-; CHECK-AMDGPU-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-AMDGPU-NEXT:  [[ENTRY:.*:]]
-; CHECK-AMDGPU-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-AMDGPU:       [[THEN]]:
-; CHECK-AMDGPU-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-AMDGPU-NEXT:    tail call void @func0()
-; CHECK-AMDGPU-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-AMDGPU:       [[ELSE]]:
-; CHECK-AMDGPU-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-AMDGPU-NEXT:    tail call void @func1()
-; CHECK-AMDGPU-NEXT:    br label %[[FINALLY]]
-; CHECK-AMDGPU:       [[FINALLY]]:
-; CHECK-AMDGPU-NEXT:    [[VAL3:%.*]] = phi <32 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-AMDGPU-NEXT:    ret <32 x half> [[VAL3]]
-;
-; CHECK-ARM-LABEL: define <32 x half> @shuffle_v32f16(
-; CHECK-ARM-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-ARM-NEXT:  [[ENTRY:.*:]]
-; CHECK-ARM-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-ARM:       [[THEN]]:
-; CHECK-ARM-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-ARM-NEXT:    tail call void @func0()
-; CHECK-ARM-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-ARM:       [[ELSE]]:
-; CHECK-ARM-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-ARM-NEXT:    tail call void @func1()
-; CHECK-ARM-NEXT:    br label %[[FINALLY]]
-; CHECK-ARM:       [[FINALLY]]:
-; CHECK-ARM-NEXT:    [[VAL3:%.*]] = phi <32 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-ARM-NEXT:    ret <32 x half> [[VAL3]]
-;
-; CHECK-HEXAGON-LABEL: define <32 x half> @shuffle_v32f16(
-; CHECK-HEXAGON-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-HEXAGON-NEXT:  [[ENTRY:.*:]]
-; CHECK-HEXAGON-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-HEXAGON:       [[THEN]]:
-; CHECK-HEXAGON-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-HEXAGON-NEXT:    tail call void @func0()
-; CHECK-HEXAGON-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-HEXAGON:       [[ELSE]]:
-; CHECK-HEXAGON-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-HEXAGON-NEXT:    tail call void @func1()
-; CHECK-HEXAGON-NEXT:    br label %[[FINALLY]]
-; CHECK-HEXAGON:       [[FINALLY]]:
-; CHECK-HEXAGON-NEXT:    [[VAL3:%.*]] = phi <32 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-HEXAGON-NEXT:    ret <32 x half> [[VAL3]]
-;
-; CHECK-RISCV-LABEL: define <32 x half> @shuffle_v32f16(
-; CHECK-RISCV-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-RISCV-NEXT:  [[ENTRY:.*:]]
-; CHECK-RISCV-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-RISCV:       [[THEN]]:
-; CHECK-RISCV-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-RISCV-NEXT:    tail call void @func0()
-; CHECK-RISCV-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-RISCV:       [[ELSE]]:
-; CHECK-RISCV-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-RISCV-NEXT:    tail call void @func1()
-; CHECK-RISCV-NEXT:    br label %[[FINALLY]]
-; CHECK-RISCV:       [[FINALLY]]:
-; CHECK-RISCV-NEXT:    [[VAL3:%.*]] = phi <32 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-RISCV-NEXT:    ret <32 x half> [[VAL3]]
-;
-; CHECK-X86-V1-LABEL: define <32 x half> @shuffle_v32f16(
-; CHECK-X86-V1-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V1-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V1:       [[THEN]]:
-; CHECK-X86-V1-NEXT:    [[TMP0:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 2, i32 0>
-; CHECK-X86-V1-NEXT:    tail call void @func0()
-; CHECK-X86-V1-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V1:       [[ELSE]]:
-; CHECK-X86-V1-NEXT:    tail call void @func1()
-; CHECK-X86-V1-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V1:       [[FINALLY]]:
-; CHECK-X86-V1-NEXT:    [[TMP1:%.*]] = phi <3 x half> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
-; CHECK-X86-V1-NEXT:    [[VAL3:%.*]] = shufflevector <3 x half> [[TMP1]], <3 x half> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V1-NEXT:    ret <32 x half> [[VAL3]]
-;
-; CHECK-X86-V2-LABEL: define <32 x half> @shuffle_v32f16(
-; CHECK-X86-V2-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V2-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V2:       [[THEN]]:
-; CHECK-X86-V2-NEXT:    [[TMP0:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 2, i32 0>
-; CHECK-X86-V2-NEXT:    tail call void @func0()
-; CHECK-X86-V2-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V2:       [[ELSE]]:
-; CHECK-X86-V2-NEXT:    tail call void @func1()
-; CHECK-X86-V2-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V2:       [[FINALLY]]:
-; CHECK-X86-V2-NEXT:    [[TMP1:%.*]] = phi <3 x half> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
-; CHECK-X86-V2-NEXT:    [[VAL3:%.*]] = shufflevector <3 x half> [[TMP1]], <3 x half> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V2-NEXT:    ret <32 x half> [[VAL3]]
-;
-; CHECK-X86-V3-LABEL: define <32 x half> @shuffle_v32f16(
-; CHECK-X86-V3-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V3-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V3:       [[THEN]]:
-; CHECK-X86-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-X86-V3-NEXT:    tail call void @func0()
-; CHECK-X86-V3-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V3:       [[ELSE]]:
-; CHECK-X86-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V3-NEXT:    tail call void @func1()
-; CHECK-X86-V3-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V3:       [[FINALLY]]:
-; CHECK-X86-V3-NEXT:    [[VAL3:%.*]] = phi <32 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V3-NEXT:    ret <32 x half> [[VAL3]]
-;
-; CHECK-X86-V4-LABEL: define <32 x half> @shuffle_v32f16(
-; CHECK-X86-V4-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V4-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V4:       [[THEN]]:
-; CHECK-X86-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-X86-V4-NEXT:    tail call void @func0()
-; CHECK-X86-V4-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V4:       [[ELSE]]:
-; CHECK-X86-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V4-NEXT:    tail call void @func1()
-; CHECK-X86-V4-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V4:       [[FINALLY]]:
-; CHECK-X86-V4-NEXT:    [[VAL3:%.*]] = phi <32 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V4-NEXT:    ret <32 x half> [[VAL3]]
-;
 entry:
   br i1 %cond, label %then, label %else
 
@@ -5218,150 +1033,6 @@ define <2 x float> @shuffle_v2f32(<2 x float> %arg0, i1 %cond) {
 ; CHECK-NEXT:    [[VAL3:%.*]] = phi <2 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
 ; CHECK-NEXT:    ret <2 x float> [[VAL3]]
 ;
-; CHECK-AARCH64-LABEL: define <2 x float> @shuffle_v2f32(
-; CHECK-AARCH64-SAME: <2 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-AARCH64-NEXT:  [[ENTRY:.*:]]
-; CHECK-AARCH64-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-AARCH64:       [[THEN]]:
-; CHECK-AARCH64-NEXT:    [[VAL1:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-AARCH64-NEXT:    tail call void @func0()
-; CHECK-AARCH64-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-AARCH64:       [[ELSE]]:
-; CHECK-AARCH64-NEXT:    [[VAL2:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-AARCH64-NEXT:    tail call void @func1()
-; CHECK-AARCH64-NEXT:    br label %[[FINALLY]]
-; CHECK-AARCH64:       [[FINALLY]]:
-; CHECK-AARCH64-NEXT:    [[VAL3:%.*]] = phi <2 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-AARCH64-NEXT:    ret <2 x float> [[VAL3]]
-;
-; CHECK-AMDGPU-LABEL: define <2 x float> @shuffle_v2f32(
-; CHECK-AMDGPU-SAME: <2 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-AMDGPU-NEXT:  [[ENTRY:.*:]]
-; CHECK-AMDGPU-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-AMDGPU:       [[THEN]]:
-; CHECK-AMDGPU-NEXT:    [[VAL1:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-AMDGPU-NEXT:    tail call void @func0()
-; CHECK-AMDGPU-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-AMDGPU:       [[ELSE]]:
-; CHECK-AMDGPU-NEXT:    [[VAL2:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-AMDGPU-NEXT:    tail call void @func1()
-; CHECK-AMDGPU-NEXT:    br label %[[FINALLY]]
-; CHECK-AMDGPU:       [[FINALLY]]:
-; CHECK-AMDGPU-NEXT:    [[VAL3:%.*]] = phi <2 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-AMDGPU-NEXT:    ret <2 x float> [[VAL3]]
-;
-; CHECK-ARM-LABEL: define <2 x float> @shuffle_v2f32(
-; CHECK-ARM-SAME: <2 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-ARM-NEXT:  [[ENTRY:.*:]]
-; CHECK-ARM-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-ARM:       [[THEN]]:
-; CHECK-ARM-NEXT:    [[VAL1:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-ARM-NEXT:    tail call void @func0()
-; CHECK-ARM-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-ARM:       [[ELSE]]:
-; CHECK-ARM-NEXT:    [[VAL2:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-ARM-NEXT:    tail call void @func1()
-; CHECK-ARM-NEXT:    br label %[[FINALLY]]
-; CHECK-ARM:       [[FINALLY]]:
-; CHECK-ARM-NEXT:    [[VAL3:%.*]] = phi <2 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-ARM-NEXT:    ret <2 x float> [[VAL3]]
-;
-; CHECK-HEXAGON-LABEL: define <2 x float> @shuffle_v2f32(
-; CHECK-HEXAGON-SAME: <2 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-HEXAGON-NEXT:  [[ENTRY:.*:]]
-; CHECK-HEXAGON-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-HEXAGON:       [[THEN]]:
-; CHECK-HEXAGON-NEXT:    [[VAL1:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-HEXAGON-NEXT:    tail call void @func0()
-; CHECK-HEXAGON-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-HEXAGON:       [[ELSE]]:
-; CHECK-HEXAGON-NEXT:    [[VAL2:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-HEXAGON-NEXT:    tail call void @func1()
-; CHECK-HEXAGON-NEXT:    br label %[[FINALLY]]
-; CHECK-HEXAGON:       [[FINALLY]]:
-; CHECK-HEXAGON-NEXT:    [[VAL3:%.*]] = phi <2 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-HEXAGON-NEXT:    ret <2 x float> [[VAL3]]
-;
-; CHECK-RISCV-LABEL: define <2 x float> @shuffle_v2f32(
-; CHECK-RISCV-SAME: <2 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-RISCV-NEXT:  [[ENTRY:.*:]]
-; CHECK-RISCV-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-RISCV:       [[THEN]]:
-; CHECK-RISCV-NEXT:    [[VAL1:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-RISCV-NEXT:    tail call void @func0()
-; CHECK-RISCV-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-RISCV:       [[ELSE]]:
-; CHECK-RISCV-NEXT:    [[VAL2:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-RISCV-NEXT:    tail call void @func1()
-; CHECK-RISCV-NEXT:    br label %[[FINALLY]]
-; CHECK-RISCV:       [[FINALLY]]:
-; CHECK-RISCV-NEXT:    [[VAL3:%.*]] = phi <2 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-RISCV-NEXT:    ret <2 x float> [[VAL3]]
-;
-; CHECK-X86-V1-LABEL: define <2 x float> @shuffle_v2f32(
-; CHECK-X86-V1-SAME: <2 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V1-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V1:       [[THEN]]:
-; CHECK-X86-V1-NEXT:    [[VAL1:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-X86-V1-NEXT:    tail call void @func0()
-; CHECK-X86-V1-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V1:       [[ELSE]]:
-; CHECK-X86-V1-NEXT:    [[VAL2:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-X86-V1-NEXT:    tail call void @func1()
-; CHECK-X86-V1-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V1:       [[FINALLY]]:
-; CHECK-X86-V1-NEXT:    [[VAL3:%.*]] = phi <2 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V1-NEXT:    ret <2 x float> [[VAL3]]
-;
-; CHECK-X86-V2-LABEL: define <2 x float> @shuffle_v2f32(
-; CHECK-X86-V2-SAME: <2 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V2-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V2:       [[THEN]]:
-; CHECK-X86-V2-NEXT:    [[VAL1:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-X86-V2-NEXT:    tail call void @func0()
-; CHECK-X86-V2-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V2:       [[ELSE]]:
-; CHECK-X86-V2-NEXT:    [[VAL2:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-X86-V2-NEXT:    tail call void @func1()
-; CHECK-X86-V2-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V2:       [[FINALLY]]:
-; CHECK-X86-V2-NEXT:    [[VAL3:%.*]] = phi <2 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V2-NEXT:    ret <2 x float> [[VAL3]]
-;
-; CHECK-X86-V3-LABEL: define <2 x float> @shuffle_v2f32(
-; CHECK-X86-V3-SAME: <2 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V3-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V3:       [[THEN]]:
-; CHECK-X86-V3-NEXT:    [[VAL1:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-X86-V3-NEXT:    tail call void @func0()
-; CHECK-X86-V3-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V3:       [[ELSE]]:
-; CHECK-X86-V3-NEXT:    [[VAL2:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-X86-V3-NEXT:    tail call void @func1()
-; CHECK-X86-V3-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V3:       [[FINALLY]]:
-; CHECK-X86-V3-NEXT:    [[VAL3:%.*]] = phi <2 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V3-NEXT:    ret <2 x float> [[VAL3]]
-;
-; CHECK-X86-V4-LABEL: define <2 x float> @shuffle_v2f32(
-; CHECK-X86-V4-SAME: <2 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V4-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V4:       [[THEN]]:
-; CHECK-X86-V4-NEXT:    [[VAL1:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-X86-V4-NEXT:    tail call void @func0()
-; CHECK-X86-V4-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V4:       [[ELSE]]:
-; CHECK-X86-V4-NEXT:    [[VAL2:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-X86-V4-NEXT:    tail call void @func1()
-; CHECK-X86-V4-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V4:       [[FINALLY]]:
-; CHECK-X86-V4-NEXT:    [[VAL3:%.*]] = phi <2 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V4-NEXT:    ret <2 x float> [[VAL3]]
-;
 entry:
   br i1 %cond, label %then, label %else
 
@@ -5397,150 +1068,6 @@ define <3 x float> @shuffle_v3f32(<3 x float> %arg0, i1 %cond) {
 ; CHECK-NEXT:    [[VAL3:%.*]] = phi <3 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
 ; CHECK-NEXT:    ret <3 x float> [[VAL3]]
 ;
-; CHECK-AARCH64-LABEL: define <3 x float> @shuffle_v3f32(
-; CHECK-AARCH64-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-AARCH64-NEXT:  [[ENTRY:.*:]]
-; CHECK-AARCH64-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-AARCH64:       [[THEN]]:
-; CHECK-AARCH64-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 1, i32 1, i32 1>
-; CHECK-AARCH64-NEXT:    tail call void @func0()
-; CHECK-AARCH64-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-AARCH64:       [[ELSE]]:
-; CHECK-AARCH64-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 2, i32 2, i32 2>
-; CHECK-AARCH64-NEXT:    tail call void @func1()
-; CHECK-AARCH64-NEXT:    br label %[[FINALLY]]
-; CHECK-AARCH64:       [[FINALLY]]:
-; CHECK-AARCH64-NEXT:    [[VAL3:%.*]] = phi <3 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-AARCH64-NEXT:    ret <3 x float> [[VAL3]]
-;
-; CHECK-AMDGPU-LABEL: define <3 x float> @shuffle_v3f32(
-; CHECK-AMDGPU-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-AMDGPU-NEXT:  [[ENTRY:.*:]]
-; CHECK-AMDGPU-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-AMDGPU:       [[THEN]]:
-; CHECK-AMDGPU-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 1, i32 1, i32 1>
-; CHECK-AMDGPU-NEXT:    tail call void @func0()
-; CHECK-AMDGPU-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-AMDGPU:       [[ELSE]]:
-; CHECK-AMDGPU-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 2, i32 2, i32 2>
-; CHECK-AMDGPU-NEXT:    tail call void @func1()
-; CHECK-AMDGPU-NEXT:    br label %[[FINALLY]]
-; CHECK-AMDGPU:       [[FINALLY]]:
-; CHECK-AMDGPU-NEXT:    [[VAL3:%.*]] = phi <3 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-AMDGPU-NEXT:    ret <3 x float> [[VAL3]]
-;
-; CHECK-ARM-LABEL: define <3 x float> @shuffle_v3f32(
-; CHECK-ARM-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-ARM-NEXT:  [[ENTRY:.*:]]
-; CHECK-ARM-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-ARM:       [[THEN]]:
-; CHECK-ARM-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 1, i32 1, i32 1>
-; CHECK-ARM-NEXT:    tail call void @func0()
-; CHECK-ARM-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-ARM:       [[ELSE]]:
-; CHECK-ARM-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 2, i32 2, i32 2>
-; CHECK-ARM-NEXT:    tail call void @func1()
-; CHECK-ARM-NEXT:    br label %[[FINALLY]]
-; CHECK-ARM:       [[FINALLY]]:
-; CHECK-ARM-NEXT:    [[VAL3:%.*]] = phi <3 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-ARM-NEXT:    ret <3 x float> [[VAL3]]
-;
-; CHECK-HEXAGON-LABEL: define <3 x float> @shuffle_v3f32(
-; CHECK-HEXAGON-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-HEXAGON-NEXT:  [[ENTRY:.*:]]
-; CHECK-HEXAGON-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-HEXAGON:       [[THEN]]:
-; CHECK-HEXAGON-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 1, i32 1, i32 1>
-; CHECK-HEXAGON-NEXT:    tail call void @func0()
-; CHECK-HEXAGON-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-HEXAGON:       [[ELSE]]:
-; CHECK-HEXAGON-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 2, i32 2, i32 2>
-; CHECK-HEXAGON-NEXT:    tail call void @func1()
-; CHECK-HEXAGON-NEXT:    br label %[[FINALLY]]
-; CHECK-HEXAGON:       [[FINALLY]]:
-; CHECK-HEXAGON-NEXT:    [[VAL3:%.*]] = phi <3 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-HEXAGON-NEXT:    ret <3 x float> [[VAL3]]
-;
-; CHECK-RISCV-LABEL: define <3 x float> @shuffle_v3f32(
-; CHECK-RISCV-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-RISCV-NEXT:  [[ENTRY:.*:]]
-; CHECK-RISCV-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-RISCV:       [[THEN]]:
-; CHECK-RISCV-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 1, i32 1, i32 1>
-; CHECK-RISCV-NEXT:    tail call void @func0()
-; CHECK-RISCV-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-RISCV:       [[ELSE]]:
-; CHECK-RISCV-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 2, i32 2, i32 2>
-; CHECK-RISCV-NEXT:    tail call void @func1()
-; CHECK-RISCV-NEXT:    br label %[[FINALLY]]
-; CHECK-RISCV:       [[FINALLY]]:
-; CHECK-RISCV-NEXT:    [[VAL3:%.*]] = phi <3 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-RISCV-NEXT:    ret <3 x float> [[VAL3]]
-;
-; CHECK-X86-V1-LABEL: define <3 x float> @shuffle_v3f32(
-; CHECK-X86-V1-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V1-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V1:       [[THEN]]:
-; CHECK-X86-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 1, i32 1, i32 1>
-; CHECK-X86-V1-NEXT:    tail call void @func0()
-; CHECK-X86-V1-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V1:       [[ELSE]]:
-; CHECK-X86-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 2, i32 2, i32 2>
-; CHECK-X86-V1-NEXT:    tail call void @func1()
-; CHECK-X86-V1-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V1:       [[FINALLY]]:
-; CHECK-X86-V1-NEXT:    [[VAL3:%.*]] = phi <3 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V1-NEXT:    ret <3 x float> [[VAL3]]
-;
-; CHECK-X86-V2-LABEL: define <3 x float> @shuffle_v3f32(
-; CHECK-X86-V2-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V2-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V2:       [[THEN]]:
-; CHECK-X86-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 1, i32 1, i32 1>
-; CHECK-X86-V2-NEXT:    tail call void @func0()
-; CHECK-X86-V2-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V2:       [[ELSE]]:
-; CHECK-X86-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 2, i32 2, i32 2>
-; CHECK-X86-V2-NEXT:    tail call void @func1()
-; CHECK-X86-V2-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V2:       [[FINALLY]]:
-; CHECK-X86-V2-NEXT:    [[VAL3:%.*]] = phi <3 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V2-NEXT:    ret <3 x float> [[VAL3]]
-;
-; CHECK-X86-V3-LABEL: define <3 x float> @shuffle_v3f32(
-; CHECK-X86-V3-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V3-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V3:       [[THEN]]:
-; CHECK-X86-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 1, i32 1, i32 1>
-; CHECK-X86-V3-NEXT:    tail call void @func0()
-; CHECK-X86-V3-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V3:       [[ELSE]]:
-; CHECK-X86-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 2, i32 2, i32 2>
-; CHECK-X86-V3-NEXT:    tail call void @func1()
-; CHECK-X86-V3-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V3:       [[FINALLY]]:
-; CHECK-X86-V3-NEXT:    [[VAL3:%.*]] = phi <3 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V3-NEXT:    ret <3 x float> [[VAL3]]
-;
-; CHECK-X86-V4-LABEL: define <3 x float> @shuffle_v3f32(
-; CHECK-X86-V4-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V4-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V4:       [[THEN]]:
-; CHECK-X86-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 1, i32 1, i32 1>
-; CHECK-X86-V4-NEXT:    tail call void @func0()
-; CHECK-X86-V4-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V4:       [[ELSE]]:
-; CHECK-X86-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 2, i32 2, i32 2>
-; CHECK-X86-V4-NEXT:    tail call void @func1()
-; CHECK-X86-V4-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V4:       [[FINALLY]]:
-; CHECK-X86-V4-NEXT:    [[VAL3:%.*]] = phi <3 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V4-NEXT:    ret <3 x float> [[VAL3]]
-;
 entry:
   br i1 %cond, label %then, label %else
 
@@ -5576,150 +1103,6 @@ define <4 x float> @shuffle_v4f32(<3 x float> %arg0, i1 %cond) {
 ; CHECK-NEXT:    [[VAL3:%.*]] = phi <4 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
 ; CHECK-NEXT:    ret <4 x float> [[VAL3]]
 ;
-; CHECK-AARCH64-LABEL: define <4 x float> @shuffle_v4f32(
-; CHECK-AARCH64-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-AARCH64-NEXT:  [[ENTRY:.*:]]
-; CHECK-AARCH64-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-AARCH64:       [[THEN]]:
-; CHECK-AARCH64-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
-; CHECK-AARCH64-NEXT:    tail call void @func0()
-; CHECK-AARCH64-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-AARCH64:       [[ELSE]]:
-; CHECK-AARCH64-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-; CHECK-AARCH64-NEXT:    tail call void @func1()
-; CHECK-AARCH64-NEXT:    br label %[[FINALLY]]
-; CHECK-AARCH64:       [[FINALLY]]:
-; CHECK-AARCH64-NEXT:    [[VAL3:%.*]] = phi <4 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-AARCH64-NEXT:    ret <4 x float> [[VAL3]]
-;
-; CHECK-AMDGPU-LABEL: define <4 x float> @shuffle_v4f32(
-; CHECK-AMDGPU-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-AMDGPU-NEXT:  [[ENTRY:.*:]]
-; CHECK-AMDGPU-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-AMDGPU:       [[THEN]]:
-; CHECK-AMDGPU-NEXT:    [[TMP0:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 1, i32 2, i32 0>
-; CHECK-AMDGPU-NEXT:    tail call void @func0()
-; CHECK-AMDGPU-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-AMDGPU:       [[ELSE]]:
-; CHECK-AMDGPU-NEXT:    tail call void @func1()
-; CHECK-AMDGPU-NEXT:    br label %[[FINALLY]]
-; CHECK-AMDGPU:       [[FINALLY]]:
-; CHECK-AMDGPU-NEXT:    [[TMP1:%.*]] = phi <3 x float> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
-; CHECK-AMDGPU-NEXT:    [[VAL3:%.*]] = shufflevector <3 x float> [[TMP1]], <3 x float> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-; CHECK-AMDGPU-NEXT:    ret <4 x float> [[VAL3]]
-;
-; CHECK-ARM-LABEL: define <4 x float> @shuffle_v4f32(
-; CHECK-ARM-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-ARM-NEXT:  [[ENTRY:.*:]]
-; CHECK-ARM-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-ARM:       [[THEN]]:
-; CHECK-ARM-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
-; CHECK-ARM-NEXT:    tail call void @func0()
-; CHECK-ARM-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-ARM:       [[ELSE]]:
-; CHECK-ARM-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-; CHECK-ARM-NEXT:    tail call void @func1()
-; CHECK-ARM-NEXT:    br label %[[FINALLY]]
-; CHECK-ARM:       [[FINALLY]]:
-; CHECK-ARM-NEXT:    [[VAL3:%.*]] = phi <4 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-ARM-NEXT:    ret <4 x float> [[VAL3]]
-;
-; CHECK-HEXAGON-LABEL: define <4 x float> @shuffle_v4f32(
-; CHECK-HEXAGON-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-HEXAGON-NEXT:  [[ENTRY:.*:]]
-; CHECK-HEXAGON-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-HEXAGON:       [[THEN]]:
-; CHECK-HEXAGON-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
-; CHECK-HEXAGON-NEXT:    tail call void @func0()
-; CHECK-HEXAGON-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-HEXAGON:       [[ELSE]]:
-; CHECK-HEXAGON-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-; CHECK-HEXAGON-NEXT:    tail call void @func1()
-; CHECK-HEXAGON-NEXT:    br label %[[FINALLY]]
-; CHECK-HEXAGON:       [[FINALLY]]:
-; CHECK-HEXAGON-NEXT:    [[VAL3:%.*]] = phi <4 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-HEXAGON-NEXT:    ret <4 x float> [[VAL3]]
-;
-; CHECK-RISCV-LABEL: define <4 x float> @shuffle_v4f32(
-; CHECK-RISCV-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-RISCV-NEXT:  [[ENTRY:.*:]]
-; CHECK-RISCV-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-RISCV:       [[THEN]]:
-; CHECK-RISCV-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
-; CHECK-RISCV-NEXT:    tail call void @func0()
-; CHECK-RISCV-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-RISCV:       [[ELSE]]:
-; CHECK-RISCV-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-; CHECK-RISCV-NEXT:    tail call void @func1()
-; CHECK-RISCV-NEXT:    br label %[[FINALLY]]
-; CHECK-RISCV:       [[FINALLY]]:
-; CHECK-RISCV-NEXT:    [[VAL3:%.*]] = phi <4 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-RISCV-NEXT:    ret <4 x float> [[VAL3]]
-;
-; CHECK-X86-V1-LABEL: define <4 x float> @shuffle_v4f32(
-; CHECK-X86-V1-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V1-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V1:       [[THEN]]:
-; CHECK-X86-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
-; CHECK-X86-V1-NEXT:    tail call void @func0()
-; CHECK-X86-V1-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V1:       [[ELSE]]:
-; CHECK-X86-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V1-NEXT:    tail call void @func1()
-; CHECK-X86-V1-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V1:       [[FINALLY]]:
-; CHECK-X86-V1-NEXT:    [[VAL3:%.*]] = phi <4 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V1-NEXT:    ret <4 x float> [[VAL3]]
-;
-; CHECK-X86-V2-LABEL: define <4 x float> @shuffle_v4f32(
-; CHECK-X86-V2-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V2-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V2:       [[THEN]]:
-; CHECK-X86-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
-; CHECK-X86-V2-NEXT:    tail call void @func0()
-; CHECK-X86-V2-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V2:       [[ELSE]]:
-; CHECK-X86-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V2-NEXT:    tail call void @func1()
-; CHECK-X86-V2-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V2:       [[FINALLY]]:
-; CHECK-X86-V2-NEXT:    [[VAL3:%.*]] = phi <4 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V2-NEXT:    ret <4 x float> [[VAL3]]
-;
-; CHECK-X86-V3-LABEL: define <4 x float> @shuffle_v4f32(
-; CHECK-X86-V3-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V3-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V3:       [[THEN]]:
-; CHECK-X86-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
-; CHECK-X86-V3-NEXT:    tail call void @func0()
-; CHECK-X86-V3-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V3:       [[ELSE]]:
-; CHECK-X86-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V3-NEXT:    tail call void @func1()
-; CHECK-X86-V3-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V3:       [[FINALLY]]:
-; CHECK-X86-V3-NEXT:    [[VAL3:%.*]] = phi <4 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V3-NEXT:    ret <4 x float> [[VAL3]]
-;
-; CHECK-X86-V4-LABEL: define <4 x float> @shuffle_v4f32(
-; CHECK-X86-V4-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V4-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V4:       [[THEN]]:
-; CHECK-X86-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
-; CHECK-X86-V4-NEXT:    tail call void @func0()
-; CHECK-X86-V4-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V4:       [[ELSE]]:
-; CHECK-X86-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V4-NEXT:    tail call void @func1()
-; CHECK-X86-V4-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V4:       [[FINALLY]]:
-; CHECK-X86-V4-NEXT:    [[VAL3:%.*]] = phi <4 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V4-NEXT:    ret <4 x float> [[VAL3]]
-;
 entry:
   br i1 %cond, label %then, label %else
 
@@ -5755,150 +1138,6 @@ define <6 x float> @shuffle_v6f32(<3 x float> %arg0, i1 %cond) {
 ; CHECK-NEXT:    [[VAL3:%.*]] = phi <6 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
 ; CHECK-NEXT:    ret <6 x float> [[VAL3]]
 ;
-; CHECK-AARCH64-LABEL: define <6 x float> @shuffle_v6f32(
-; CHECK-AARCH64-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-AARCH64-NEXT:  [[ENTRY:.*:]]
-; CHECK-AARCH64-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-AARCH64:       [[THEN]]:
-; CHECK-AARCH64-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-AARCH64-NEXT:    tail call void @func0()
-; CHECK-AARCH64-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-AARCH64:       [[ELSE]]:
-; CHECK-AARCH64-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-AARCH64-NEXT:    tail call void @func1()
-; CHECK-AARCH64-NEXT:    br label %[[FINALLY]]
-; CHECK-AARCH64:       [[FINALLY]]:
-; CHECK-AARCH64-NEXT:    [[VAL3:%.*]] = phi <6 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-AARCH64-NEXT:    ret <6 x float> [[VAL3]]
-;
-; CHECK-AMDGPU-LABEL: define <6 x float> @shuffle_v6f32(
-; CHECK-AMDGPU-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-AMDGPU-NEXT:  [[ENTRY:.*:]]
-; CHECK-AMDGPU-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-AMDGPU:       [[THEN]]:
-; CHECK-AMDGPU-NEXT:    [[TMP0:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 1, i32 2, i32 0>
-; CHECK-AMDGPU-NEXT:    tail call void @func0()
-; CHECK-AMDGPU-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-AMDGPU:       [[ELSE]]:
-; CHECK-AMDGPU-NEXT:    tail call void @func1()
-; CHECK-AMDGPU-NEXT:    br label %[[FINALLY]]
-; CHECK-AMDGPU:       [[FINALLY]]:
-; CHECK-AMDGPU-NEXT:    [[TMP1:%.*]] = phi <3 x float> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
-; CHECK-AMDGPU-NEXT:    [[VAL3:%.*]] = shufflevector <3 x float> [[TMP1]], <3 x float> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-AMDGPU-NEXT:    ret <6 x float> [[VAL3]]
-;
-; CHECK-ARM-LABEL: define <6 x float> @shuffle_v6f32(
-; CHECK-ARM-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-ARM-NEXT:  [[ENTRY:.*:]]
-; CHECK-ARM-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-ARM:       [[THEN]]:
-; CHECK-ARM-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-ARM-NEXT:    tail call void @func0()
-; CHECK-ARM-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-ARM:       [[ELSE]]:
-; CHECK-ARM-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-ARM-NEXT:    tail call void @func1()
-; CHECK-ARM-NEXT:    br label %[[FINALLY]]
-; CHECK-ARM:       [[FINALLY]]:
-; CHECK-ARM-NEXT:    [[VAL3:%.*]] = phi <6 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-ARM-NEXT:    ret <6 x float> [[VAL3]]
-;
-; CHECK-HEXAGON-LABEL: define <6 x float> @shuffle_v6f32(
-; CHECK-HEXAGON-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-HEXAGON-NEXT:  [[ENTRY:.*:]]
-; CHECK-HEXAGON-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-HEXAGON:       [[THEN]]:
-; CHECK-HEXAGON-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-HEXAGON-NEXT:    tail call void @func0()
-; CHECK-HEXAGON-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-HEXAGON:       [[ELSE]]:
-; CHECK-HEXAGON-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-HEXAGON-NEXT:    tail call void @func1()
-; CHECK-HEXAGON-NEXT:    br label %[[FINALLY]]
-; CHECK-HEXAGON:       [[FINALLY]]:
-; CHECK-HEXAGON-NEXT:    [[VAL3:%.*]] = phi <6 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-HEXAGON-NEXT:    ret <6 x float> [[VAL3]]
-;
-; CHECK-RISCV-LABEL: define <6 x float> @shuffle_v6f32(
-; CHECK-RISCV-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-RISCV-NEXT:  [[ENTRY:.*:]]
-; CHECK-RISCV-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-RISCV:       [[THEN]]:
-; CHECK-RISCV-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-RISCV-NEXT:    tail call void @func0()
-; CHECK-RISCV-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-RISCV:       [[ELSE]]:
-; CHECK-RISCV-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-RISCV-NEXT:    tail call void @func1()
-; CHECK-RISCV-NEXT:    br label %[[FINALLY]]
-; CHECK-RISCV:       [[FINALLY]]:
-; CHECK-RISCV-NEXT:    [[VAL3:%.*]] = phi <6 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-RISCV-NEXT:    ret <6 x float> [[VAL3]]
-;
-; CHECK-X86-V1-LABEL: define <6 x float> @shuffle_v6f32(
-; CHECK-X86-V1-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V1-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V1:       [[THEN]]:
-; CHECK-X86-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-X86-V1-NEXT:    tail call void @func0()
-; CHECK-X86-V1-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V1:       [[ELSE]]:
-; CHECK-X86-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V1-NEXT:    tail call void @func1()
-; CHECK-X86-V1-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V1:       [[FINALLY]]:
-; CHECK-X86-V1-NEXT:    [[VAL3:%.*]] = phi <6 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V1-NEXT:    ret <6 x float> [[VAL3]]
-;
-; CHECK-X86-V2-LABEL: define <6 x float> @shuffle_v6f32(
-; CHECK-X86-V2-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V2-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V2:       [[THEN]]:
-; CHECK-X86-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-X86-V2-NEXT:    tail call void @func0()
-; CHECK-X86-V2-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V2:       [[ELSE]]:
-; CHECK-X86-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V2-NEXT:    tail call void @func1()
-; CHECK-X86-V2-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V2:       [[FINALLY]]:
-; CHECK-X86-V2-NEXT:    [[VAL3:%.*]] = phi <6 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V2-NEXT:    ret <6 x float> [[VAL3]]
-;
-; CHECK-X86-V3-LABEL: define <6 x float> @shuffle_v6f32(
-; CHECK-X86-V3-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V3-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V3:       [[THEN]]:
-; CHECK-X86-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-X86-V3-NEXT:    tail call void @func0()
-; CHECK-X86-V3-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V3:       [[ELSE]]:
-; CHECK-X86-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V3-NEXT:    tail call void @func1()
-; CHECK-X86-V3-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V3:       [[FINALLY]]:
-; CHECK-X86-V3-NEXT:    [[VAL3:%.*]] = phi <6 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V3-NEXT:    ret <6 x float> [[VAL3]]
-;
-; CHECK-X86-V4-LABEL: define <6 x float> @shuffle_v6f32(
-; CHECK-X86-V4-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V4-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V4:       [[THEN]]:
-; CHECK-X86-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-X86-V4-NEXT:    tail call void @func0()
-; CHECK-X86-V4-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V4:       [[ELSE]]:
-; CHECK-X86-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V4-NEXT:    tail call void @func1()
-; CHECK-X86-V4-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V4:       [[FINALLY]]:
-; CHECK-X86-V4-NEXT:    [[VAL3:%.*]] = phi <6 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V4-NEXT:    ret <6 x float> [[VAL3]]
-;
 entry:
   br i1 %cond, label %then, label %else
 
@@ -5934,150 +1173,6 @@ define <8 x float> @shuffle_v8f32(<3 x float> %arg0, i1 %cond) {
 ; CHECK-NEXT:    [[VAL3:%.*]] = phi <8 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
 ; CHECK-NEXT:    ret <8 x float> [[VAL3]]
 ;
-; CHECK-AARCH64-LABEL: define <8 x float> @shuffle_v8f32(
-; CHECK-AARCH64-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-AARCH64-NEXT:  [[ENTRY:.*:]]
-; CHECK-AARCH64-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-AARCH64:       [[THEN]]:
-; CHECK-AARCH64-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-AARCH64-NEXT:    tail call void @func0()
-; CHECK-AARCH64-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-AARCH64:       [[ELSE]]:
-; CHECK-AARCH64-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-AARCH64-NEXT:    tail call void @func1()
-; CHECK-AARCH64-NEXT:    br label %[[FINALLY]]
-; CHECK-AARCH64:       [[FINALLY]]:
-; CHECK-AARCH64-NEXT:    [[VAL3:%.*]] = phi <8 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-AARCH64-NEXT:    ret <8 x float> [[VAL3]]
-;
-; CHECK-AMDGPU-LABEL: define <8 x float> @shuffle_v8f32(
-; CHECK-AMDGPU-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-AMDGPU-NEXT:  [[ENTRY:.*:]]
-; CHECK-AMDGPU-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-AMDGPU:       [[THEN]]:
-; CHECK-AMDGPU-NEXT:    [[TMP0:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 1, i32 2, i32 0>
-; CHECK-AMDGPU-NEXT:    tail call void @func0()
-; CHECK-AMDGPU-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-AMDGPU:       [[ELSE]]:
-; CHECK-AMDGPU-NEXT:    tail call void @func1()
-; CHECK-AMDGPU-NEXT:    br label %[[FINALLY]]
-; CHECK-AMDGPU:       [[FINALLY]]:
-; CHECK-AMDGPU-NEXT:    [[TMP1:%.*]] = phi <3 x float> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
-; CHECK-AMDGPU-NEXT:    [[VAL3:%.*]] = shufflevector <3 x float> [[TMP1]], <3 x float> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-AMDGPU-NEXT:    ret <8 x float> [[VAL3]]
-;
-; CHECK-ARM-LABEL: define <8 x float> @shuffle_v8f32(
-; CHECK-ARM-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-ARM-NEXT:  [[ENTRY:.*:]]
-; CHECK-ARM-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-ARM:       [[THEN]]:
-; CHECK-ARM-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-ARM-NEXT:    tail call void @func0()
-; CHECK-ARM-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-ARM:       [[ELSE]]:
-; CHECK-ARM-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-ARM-NEXT:    tail call void @func1()
-; CHECK-ARM-NEXT:    br label %[[FINALLY]]
-; CHECK-ARM:       [[FINALLY]]:
-; CHECK-ARM-NEXT:    [[VAL3:%.*]] = phi <8 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-ARM-NEXT:    ret <8 x float> [[VAL3]]
-;
-; CHECK-HEXAGON-LABEL: define <8 x float> @shuffle_v8f32(
-; CHECK-HEXAGON-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-HEXAGON-NEXT:  [[ENTRY:.*:]]
-; CHECK-HEXAGON-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-HEXAGON:       [[THEN]]:
-; CHECK-HEXAGON-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-HEXAGON-NEXT:    tail call void @func0()
-; CHECK-HEXAGON-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-HEXAGON:       [[ELSE]]:
-; CHECK-HEXAGON-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-HEXAGON-NEXT:    tail call void @func1()
-; CHECK-HEXAGON-NEXT:    br label %[[FINALLY]]
-; CHECK-HEXAGON:       [[FINALLY]]:
-; CHECK-HEXAGON-NEXT:    [[VAL3:%.*]] = phi <8 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-HEXAGON-NEXT:    ret <8 x float> [[VAL3]]
-;
-; CHECK-RISCV-LABEL: define <8 x float> @shuffle_v8f32(
-; CHECK-RISCV-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-RISCV-NEXT:  [[ENTRY:.*:]]
-; CHECK-RISCV-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-RISCV:       [[THEN]]:
-; CHECK-RISCV-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-RISCV-NEXT:    tail call void @func0()
-; CHECK-RISCV-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-RISCV:       [[ELSE]]:
-; CHECK-RISCV-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-RISCV-NEXT:    tail call void @func1()
-; CHECK-RISCV-NEXT:    br label %[[FINALLY]]
-; CHECK-RISCV:       [[FINALLY]]:
-; CHECK-RISCV-NEXT:    [[VAL3:%.*]] = phi <8 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-RISCV-NEXT:    ret <8 x float> [[VAL3]]
-;
-; CHECK-X86-V1-LABEL: define <8 x float> @shuffle_v8f32(
-; CHECK-X86-V1-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V1-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V1:       [[THEN]]:
-; CHECK-X86-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-X86-V1-NEXT:    tail call void @func0()
-; CHECK-X86-V1-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V1:       [[ELSE]]:
-; CHECK-X86-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V1-NEXT:    tail call void @func1()
-; CHECK-X86-V1-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V1:       [[FINALLY]]:
-; CHECK-X86-V1-NEXT:    [[VAL3:%.*]] = phi <8 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V1-NEXT:    ret <8 x float> [[VAL3]]
-;
-; CHECK-X86-V2-LABEL: define <8 x float> @shuffle_v8f32(
-; CHECK-X86-V2-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V2-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V2:       [[THEN]]:
-; CHECK-X86-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-X86-V2-NEXT:    tail call void @func0()
-; CHECK-X86-V2-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V2:       [[ELSE]]:
-; CHECK-X86-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V2-NEXT:    tail call void @func1()
-; CHECK-X86-V2-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V2:       [[FINALLY]]:
-; CHECK-X86-V2-NEXT:    [[VAL3:%.*]] = phi <8 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V2-NEXT:    ret <8 x float> [[VAL3]]
-;
-; CHECK-X86-V3-LABEL: define <8 x float> @shuffle_v8f32(
-; CHECK-X86-V3-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V3-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V3:       [[THEN]]:
-; CHECK-X86-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-X86-V3-NEXT:    tail call void @func0()
-; CHECK-X86-V3-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V3:       [[ELSE]]:
-; CHECK-X86-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V3-NEXT:    tail call void @func1()
-; CHECK-X86-V3-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V3:       [[FINALLY]]:
-; CHECK-X86-V3-NEXT:    [[VAL3:%.*]] = phi <8 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V3-NEXT:    ret <8 x float> [[VAL3]]
-;
-; CHECK-X86-V4-LABEL: define <8 x float> @shuffle_v8f32(
-; CHECK-X86-V4-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V4-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V4:       [[THEN]]:
-; CHECK-X86-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-X86-V4-NEXT:    tail call void @func0()
-; CHECK-X86-V4-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V4:       [[ELSE]]:
-; CHECK-X86-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V4-NEXT:    tail call void @func1()
-; CHECK-X86-V4-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V4:       [[FINALLY]]:
-; CHECK-X86-V4-NEXT:    [[VAL3:%.*]] = phi <8 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V4-NEXT:    ret <8 x float> [[VAL3]]
-;
 entry:
   br i1 %cond, label %then, label %else
 
@@ -6113,150 +1208,6 @@ define <16 x float> @shuffle_v16f32(<3 x float> %arg0, i1 %cond) {
 ; CHECK-NEXT:    [[VAL3:%.*]] = phi <16 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
 ; CHECK-NEXT:    ret <16 x float> [[VAL3]]
 ;
-; CHECK-AARCH64-LABEL: define <16 x float> @shuffle_v16f32(
-; CHECK-AARCH64-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-AARCH64-NEXT:  [[ENTRY:.*:]]
-; CHECK-AARCH64-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-AARCH64:       [[THEN]]:
-; CHECK-AARCH64-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-AARCH64-NEXT:    tail call void @func0()
-; CHECK-AARCH64-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-AARCH64:       [[ELSE]]:
-; CHECK-AARCH64-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-AARCH64-NEXT:    tail call void @func1()
-; CHECK-AARCH64-NEXT:    br label %[[FINALLY]]
-; CHECK-AARCH64:       [[FINALLY]]:
-; CHECK-AARCH64-NEXT:    [[VAL3:%.*]] = phi <16 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-AARCH64-NEXT:    ret <16 x float> [[VAL3]]
-;
-; CHECK-AMDGPU-LABEL: define <16 x float> @shuffle_v16f32(
-; CHECK-AMDGPU-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-AMDGPU-NEXT:  [[ENTRY:.*:]]
-; CHECK-AMDGPU-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-AMDGPU:       [[THEN]]:
-; CHECK-AMDGPU-NEXT:    [[TMP0:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 1, i32 2, i32 0>
-; CHECK-AMDGPU-NEXT:    tail call void @func0()
-; CHECK-AMDGPU-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-AMDGPU:       [[ELSE]]:
-; CHECK-AMDGPU-NEXT:    tail call void @func1()
-; CHECK-AMDGPU-NEXT:    br label %[[FINALLY]]
-; CHECK-AMDGPU:       [[FINALLY]]:
-; CHECK-AMDGPU-NEXT:    [[TMP1:%.*]] = phi <3 x float> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
-; CHECK-AMDGPU-NEXT:    [[VAL3:%.*]] = shufflevector <3 x float> [[TMP1]], <3 x float> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-AMDGPU-NEXT:    ret <16 x float> [[VAL3]]
-;
-; CHECK-ARM-LABEL: define <16 x float> @shuffle_v16f32(
-; CHECK-ARM-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-ARM-NEXT:  [[ENTRY:.*:]]
-; CHECK-ARM-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-ARM:       [[THEN]]:
-; CHECK-ARM-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-ARM-NEXT:    tail call void @func0()
-; CHECK-ARM-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-ARM:       [[ELSE]]:
-; CHECK-ARM-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-ARM-NEXT:    tail call void @func1()
-; CHECK-ARM-NEXT:    br label %[[FINALLY]]
-; CHECK-ARM:       [[FINALLY]]:
-; CHECK-ARM-NEXT:    [[VAL3:%.*]] = phi <16 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-ARM-NEXT:    ret <16 x float> [[VAL3]]
-;
-; CHECK-HEXAGON-LABEL: define <16 x float> @shuffle_v16f32(
-; CHECK-HEXAGON-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-HEXAGON-NEXT:  [[ENTRY:.*:]]
-; CHECK-HEXAGON-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-HEXAGON:       [[THEN]]:
-; CHECK-HEXAGON-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-HEXAGON-NEXT:    tail call void @func0()
-; CHECK-HEXAGON-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-HEXAGON:       [[ELSE]]:
-; CHECK-HEXAGON-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-HEXAGON-NEXT:    tail call void @func1()
-; CHECK-HEXAGON-NEXT:    br label %[[FINALLY]]
-; CHECK-HEXAGON:       [[FINALLY]]:
-; CHECK-HEXAGON-NEXT:    [[VAL3:%.*]] = phi <16 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-HEXAGON-NEXT:    ret <16 x float> [[VAL3]]
-;
-; CHECK-RISCV-LABEL: define <16 x float> @shuffle_v16f32(
-; CHECK-RISCV-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-RISCV-NEXT:  [[ENTRY:.*:]]
-; CHECK-RISCV-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-RISCV:       [[THEN]]:
-; CHECK-RISCV-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-RISCV-NEXT:    tail call void @func0()
-; CHECK-RISCV-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-RISCV:       [[ELSE]]:
-; CHECK-RISCV-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-RISCV-NEXT:    tail call void @func1()
-; CHECK-RISCV-NEXT:    br label %[[FINALLY]]
-; CHECK-RISCV:       [[FINALLY]]:
-; CHECK-RISCV-NEXT:    [[VAL3:%.*]] = phi <16 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-RISCV-NEXT:    ret <16 x float> [[VAL3]]
-;
-; CHECK-X86-V1-LABEL: define <16 x float> @shuffle_v16f32(
-; CHECK-X86-V1-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V1-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V1:       [[THEN]]:
-; CHECK-X86-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-X86-V1-NEXT:    tail call void @func0()
-; CHECK-X86-V1-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V1:       [[ELSE]]:
-; CHECK-X86-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V1-NEXT:    tail call void @func1()
-; CHECK-X86-V1-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V1:       [[FINALLY]]:
-; CHECK-X86-V1-NEXT:    [[VAL3:%.*]] = phi <16 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V1-NEXT:    ret <16 x float> [[VAL3]]
-;
-; CHECK-X86-V2-LABEL: define <16 x float> @shuffle_v16f32(
-; CHECK-X86-V2-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V2-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V2:       [[THEN]]:
-; CHECK-X86-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-X86-V2-NEXT:    tail call void @func0()
-; CHECK-X86-V2-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V2:       [[ELSE]]:
-; CHECK-X86-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V2-NEXT:    tail call void @func1()
-; CHECK-X86-V2-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V2:       [[FINALLY]]:
-; CHECK-X86-V2-NEXT:    [[VAL3:%.*]] = phi <16 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V2-NEXT:    ret <16 x float> [[VAL3]]
-;
-; CHECK-X86-V3-LABEL: define <16 x float> @shuffle_v16f32(
-; CHECK-X86-V3-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V3-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V3:       [[THEN]]:
-; CHECK-X86-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-X86-V3-NEXT:    tail call void @func0()
-; CHECK-X86-V3-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V3:       [[ELSE]]:
-; CHECK-X86-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V3-NEXT:    tail call void @func1()
-; CHECK-X86-V3-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V3:       [[FINALLY]]:
-; CHECK-X86-V3-NEXT:    [[VAL3:%.*]] = phi <16 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V3-NEXT:    ret <16 x float> [[VAL3]]
-;
-; CHECK-X86-V4-LABEL: define <16 x float> @shuffle_v16f32(
-; CHECK-X86-V4-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V4-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V4:       [[THEN]]:
-; CHECK-X86-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-X86-V4-NEXT:    tail call void @func0()
-; CHECK-X86-V4-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V4:       [[ELSE]]:
-; CHECK-X86-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V4-NEXT:    tail call void @func1()
-; CHECK-X86-V4-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V4:       [[FINALLY]]:
-; CHECK-X86-V4-NEXT:    [[VAL3:%.*]] = phi <16 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V4-NEXT:    ret <16 x float> [[VAL3]]
-;
 entry:
   br i1 %cond, label %then, label %else
 
@@ -6292,150 +1243,6 @@ define <32 x float> @shuffle_v32f32(<3 x float> %arg0, i1 %cond) {
 ; CHECK-NEXT:    [[VAL3:%.*]] = phi <32 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
 ; CHECK-NEXT:    ret <32 x float> [[VAL3]]
 ;
-; CHECK-AARCH64-LABEL: define <32 x float> @shuffle_v32f32(
-; CHECK-AARCH64-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-AARCH64-NEXT:  [[ENTRY:.*:]]
-; CHECK-AARCH64-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-AARCH64:       [[THEN]]:
-; CHECK-AARCH64-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-AARCH64-NEXT:    tail call void @func0()
-; CHECK-AARCH64-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-AARCH64:       [[ELSE]]:
-; CHECK-AARCH64-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-AARCH64-NEXT:    tail call void @func1()
-; CHECK-AARCH64-NEXT:    br label %[[FINALLY]]
-; CHECK-AARCH64:       [[FINALLY]]:
-; CHECK-AARCH64-NEXT:    [[VAL3:%.*]] = phi <32 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-AARCH64-NEXT:    ret <32 x float> [[VAL3]]
-;
-; CHECK-AMDGPU-LABEL: define <32 x float> @shuffle_v32f32(
-; CHECK-AMDGPU-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-AMDGPU-NEXT:  [[ENTRY:.*:]]
-; CHECK-AMDGPU-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-AMDGPU:       [[THEN]]:
-; CHECK-AMDGPU-NEXT:    [[TMP0:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 1, i32 2, i32 0>
-; CHECK-AMDGPU-NEXT:    tail call void @func0()
-; CHECK-AMDGPU-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-AMDGPU:       [[ELSE]]:
-; CHECK-AMDGPU-NEXT:    tail call void @func1()
-; CHECK-AMDGPU-NEXT:    br label %[[FINALLY]]
-; CHECK-AMDGPU:       [[FINALLY]]:
-; CHECK-AMDGPU-NEXT:    [[TMP1:%.*]] = phi <3 x float> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
-; CHECK-AMDGPU-NEXT:    [[VAL3:%.*]] = shufflevector <3 x float> [[TMP1]], <3 x float> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-AMDGPU-NEXT:    ret <32 x float> [[VAL3]]
-;
-; CHECK-ARM-LABEL: define <32 x float> @shuffle_v32f32(
-; CHECK-ARM-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-ARM-NEXT:  [[ENTRY:.*:]]
-; CHECK-ARM-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-ARM:       [[THEN]]:
-; CHECK-ARM-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-ARM-NEXT:    tail call void @func0()
-; CHECK-ARM-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-ARM:       [[ELSE]]:
-; CHECK-ARM-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-ARM-NEXT:    tail call void @func1()
-; CHECK-ARM-NEXT:    br label %[[FINALLY]]
-; CHECK-ARM:       [[FINALLY]]:
-; CHECK-ARM-NEXT:    [[VAL3:%.*]] = phi <32 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-ARM-NEXT:    ret <32 x float> [[VAL3]]
-;
-; CHECK-HEXAGON-LABEL: define <32 x float> @shuffle_v32f32(
-; CHECK-HEXAGON-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-HEXAGON-NEXT:  [[ENTRY:.*:]]
-; CHECK-HEXAGON-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-HEXAGON:       [[THEN]]:
-; CHECK-HEXAGON-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-HEXAGON-NEXT:    tail call void @func0()
-; CHECK-HEXAGON-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-HEXAGON:       [[ELSE]]:
-; CHECK-HEXAGON-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-HEXAGON-NEXT:    tail call void @func1()
-; CHECK-HEXAGON-NEXT:    br label %[[FINALLY]]
-; CHECK-HEXAGON:       [[FINALLY]]:
-; CHECK-HEXAGON-NEXT:    [[VAL3:%.*]] = phi <32 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-HEXAGON-NEXT:    ret <32 x float> [[VAL3]]
-;
-; CHECK-RISCV-LABEL: define <32 x float> @shuffle_v32f32(
-; CHECK-RISCV-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) {
-; CHECK-RISCV-NEXT:  [[ENTRY:.*:]]
-; CHECK-RISCV-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-RISCV:       [[THEN]]:
-; CHECK-RISCV-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-RISCV-NEXT:    tail call void @func0()
-; CHECK-RISCV-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-RISCV:       [[ELSE]]:
-; CHECK-RISCV-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-RISCV-NEXT:    tail call void @func1()
-; CHECK-RISCV-NEXT:    br label %[[FINALLY]]
-; CHECK-RISCV:       [[FINALLY]]:
-; CHECK-RISCV-NEXT:    [[VAL3:%.*]] = phi <32 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-RISCV-NEXT:    ret <32 x float> [[VAL3]]
-;
-; CHECK-X86-V1-LABEL: define <32 x float> @shuffle_v32f32(
-; CHECK-X86-V1-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V1-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V1:       [[THEN]]:
-; CHECK-X86-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-X86-V1-NEXT:    tail call void @func0()
-; CHECK-X86-V1-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V1:       [[ELSE]]:
-; CHECK-X86-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V1-NEXT:    tail call void @func1()
-; CHECK-X86-V1-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V1:       [[FINALLY]]:
-; CHECK-X86-V1-NEXT:    [[VAL3:%.*]] = phi <32 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V1-NEXT:    ret <32 x float> [[VAL3]]
-;
-; CHECK-X86-V2-LABEL: define <32 x float> @shuffle_v32f32(
-; CHECK-X86-V2-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V2-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V2:       [[THEN]]:
-; CHECK-X86-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-X86-V2-NEXT:    tail call void @func0()
-; CHECK-X86-V2-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V2:       [[ELSE]]:
-; CHECK-X86-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V2-NEXT:    tail call void @func1()
-; CHECK-X86-V2-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V2:       [[FINALLY]]:
-; CHECK-X86-V2-NEXT:    [[VAL3:%.*]] = phi <32 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V2-NEXT:    ret <32 x float> [[VAL3]]
-;
-; CHECK-X86-V3-LABEL: define <32 x float> @shuffle_v32f32(
-; CHECK-X86-V3-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V3-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V3:       [[THEN]]:
-; CHECK-X86-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-X86-V3-NEXT:    tail call void @func0()
-; CHECK-X86-V3-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V3:       [[ELSE]]:
-; CHECK-X86-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V3-NEXT:    tail call void @func1()
-; CHECK-X86-V3-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V3:       [[FINALLY]]:
-; CHECK-X86-V3-NEXT:    [[VAL3:%.*]] = phi <32 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V3-NEXT:    ret <32 x float> [[VAL3]]
-;
-; CHECK-X86-V4-LABEL: define <32 x float> @shuffle_v32f32(
-; CHECK-X86-V4-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-X86-V4-NEXT:  [[ENTRY:.*:]]
-; CHECK-X86-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-X86-V4:       [[THEN]]:
-; CHECK-X86-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-X86-V4-NEXT:    tail call void @func0()
-; CHECK-X86-V4-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-X86-V4:       [[ELSE]]:
-; CHECK-X86-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-X86-V4-NEXT:    tail call void @func1()
-; CHECK-X86-V4-NEXT:    br label %[[FINALLY]]
-; CHECK-X86-V4:       [[FINALLY]]:
-; CHECK-X86-V4-NEXT:    [[VAL3:%.*]] = phi <32 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-X86-V4-NEXT:    ret <32 x float> [[VAL3]]
-;
 entry:
   br i1 %cond, label %then, label %else
 

>From 6c133f5906abbf07b6266ce86d3cd6ea281aa322 Mon Sep 17 00:00:00 2001
From: Leon Clark <leoclark at amd.com>
Date: Wed, 11 Jun 2025 11:57:28 +0100
Subject: [PATCH 10/14] Update tests.

---
 .../AMDGPU/narrow-phi-of-shuffles.ll          |  54 +++---
 .../X86/narrow-phi-of-shuffles.ll             | 180 +++++++++---------
 2 files changed, 117 insertions(+), 117 deletions(-)

diff --git a/llvm/test/Transforms/VectorCombine/AMDGPU/narrow-phi-of-shuffles.ll b/llvm/test/Transforms/VectorCombine/AMDGPU/narrow-phi-of-shuffles.ll
index aa183034dea51..8c504843d87d8 100644
--- a/llvm/test/Transforms/VectorCombine/AMDGPU/narrow-phi-of-shuffles.ll
+++ b/llvm/test/Transforms/VectorCombine/AMDGPU/narrow-phi-of-shuffles.ll
@@ -392,15 +392,15 @@ define <4 x i32> @shuffle_v4i32(<3 x i32> %arg0, i1 %cond) {
 ; CHECK-NEXT:  [[ENTRY:.*:]]
 ; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
 ; CHECK:       [[THEN]]:
-; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    [[TMP0:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <3 x i32> <i32 1, i32 2, i32 0>
 ; CHECK-NEXT:    tail call void @func0()
 ; CHECK-NEXT:    br label %[[FINALLY:.*]]
 ; CHECK:       [[ELSE]]:
-; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
 ; CHECK-NEXT:    tail call void @func1()
 ; CHECK-NEXT:    br label %[[FINALLY]]
 ; CHECK:       [[FINALLY]]:
-; CHECK-NEXT:    [[VAL3:%.*]] = phi <4 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    [[TMP1:%.*]] = phi <3 x i32> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-NEXT:    [[VAL3:%.*]] = shufflevector <3 x i32> [[TMP1]], <3 x i32> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
 ; CHECK-NEXT:    ret <4 x i32> [[VAL3]]
 ;
 entry:
@@ -427,15 +427,15 @@ define <8 x i32> @shuffle_v8i32(<3 x i32> %arg0, i1 %cond) {
 ; CHECK-NEXT:  [[ENTRY:.*:]]
 ; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
 ; CHECK:       [[THEN]]:
-; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    [[TMP0:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <3 x i32> <i32 1, i32 2, i32 0>
 ; CHECK-NEXT:    tail call void @func0()
 ; CHECK-NEXT:    br label %[[FINALLY:.*]]
 ; CHECK:       [[ELSE]]:
-; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-NEXT:    tail call void @func1()
 ; CHECK-NEXT:    br label %[[FINALLY]]
 ; CHECK:       [[FINALLY]]:
-; CHECK-NEXT:    [[VAL3:%.*]] = phi <8 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    [[TMP1:%.*]] = phi <3 x i32> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-NEXT:    [[VAL3:%.*]] = shufflevector <3 x i32> [[TMP1]], <3 x i32> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-NEXT:    ret <8 x i32> [[VAL3]]
 ;
 entry:
@@ -462,15 +462,15 @@ define <16 x i32> @shuffle_v16i32(<3 x i32> %arg0, i1 %cond) {
 ; CHECK-NEXT:  [[ENTRY:.*:]]
 ; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
 ; CHECK:       [[THEN]]:
-; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    [[TMP0:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <3 x i32> <i32 1, i32 2, i32 0>
 ; CHECK-NEXT:    tail call void @func0()
 ; CHECK-NEXT:    br label %[[FINALLY:.*]]
 ; CHECK:       [[ELSE]]:
-; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-NEXT:    tail call void @func1()
 ; CHECK-NEXT:    br label %[[FINALLY]]
 ; CHECK:       [[FINALLY]]:
-; CHECK-NEXT:    [[VAL3:%.*]] = phi <16 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    [[TMP1:%.*]] = phi <3 x i32> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-NEXT:    [[VAL3:%.*]] = shufflevector <3 x i32> [[TMP1]], <3 x i32> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-NEXT:    ret <16 x i32> [[VAL3]]
 ;
 entry:
@@ -497,15 +497,15 @@ define <32 x i32> @shuffle_v32i32(<3 x i32> %arg0, i1 %cond) {
 ; CHECK-NEXT:  [[ENTRY:.*:]]
 ; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
 ; CHECK:       [[THEN]]:
-; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    [[TMP0:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <3 x i32> <i32 1, i32 2, i32 0>
 ; CHECK-NEXT:    tail call void @func0()
 ; CHECK-NEXT:    br label %[[FINALLY:.*]]
 ; CHECK:       [[ELSE]]:
-; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-NEXT:    tail call void @func1()
 ; CHECK-NEXT:    br label %[[FINALLY]]
 ; CHECK:       [[FINALLY]]:
-; CHECK-NEXT:    [[VAL3:%.*]] = phi <32 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    [[TMP1:%.*]] = phi <3 x i32> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-NEXT:    [[VAL3:%.*]] = shufflevector <3 x i32> [[TMP1]], <3 x i32> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-NEXT:    ret <32 x i32> [[VAL3]]
 ;
 entry:
@@ -1092,15 +1092,15 @@ define <4 x float> @shuffle_v4f32(<3 x float> %arg0, i1 %cond) {
 ; CHECK-NEXT:  [[ENTRY:.*:]]
 ; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
 ; CHECK:       [[THEN]]:
-; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    [[TMP0:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 1, i32 2, i32 0>
 ; CHECK-NEXT:    tail call void @func0()
 ; CHECK-NEXT:    br label %[[FINALLY:.*]]
 ; CHECK:       [[ELSE]]:
-; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
 ; CHECK-NEXT:    tail call void @func1()
 ; CHECK-NEXT:    br label %[[FINALLY]]
 ; CHECK:       [[FINALLY]]:
-; CHECK-NEXT:    [[VAL3:%.*]] = phi <4 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    [[TMP1:%.*]] = phi <3 x float> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-NEXT:    [[VAL3:%.*]] = shufflevector <3 x float> [[TMP1]], <3 x float> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
 ; CHECK-NEXT:    ret <4 x float> [[VAL3]]
 ;
 entry:
@@ -1127,15 +1127,15 @@ define <6 x float> @shuffle_v6f32(<3 x float> %arg0, i1 %cond) {
 ; CHECK-NEXT:  [[ENTRY:.*:]]
 ; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
 ; CHECK:       [[THEN]]:
-; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    [[TMP0:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 1, i32 2, i32 0>
 ; CHECK-NEXT:    tail call void @func0()
 ; CHECK-NEXT:    br label %[[FINALLY:.*]]
 ; CHECK:       [[ELSE]]:
-; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-NEXT:    tail call void @func1()
 ; CHECK-NEXT:    br label %[[FINALLY]]
 ; CHECK:       [[FINALLY]]:
-; CHECK-NEXT:    [[VAL3:%.*]] = phi <6 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    [[TMP1:%.*]] = phi <3 x float> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-NEXT:    [[VAL3:%.*]] = shufflevector <3 x float> [[TMP1]], <3 x float> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-NEXT:    ret <6 x float> [[VAL3]]
 ;
 entry:
@@ -1162,15 +1162,15 @@ define <8 x float> @shuffle_v8f32(<3 x float> %arg0, i1 %cond) {
 ; CHECK-NEXT:  [[ENTRY:.*:]]
 ; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
 ; CHECK:       [[THEN]]:
-; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    [[TMP0:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 1, i32 2, i32 0>
 ; CHECK-NEXT:    tail call void @func0()
 ; CHECK-NEXT:    br label %[[FINALLY:.*]]
 ; CHECK:       [[ELSE]]:
-; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-NEXT:    tail call void @func1()
 ; CHECK-NEXT:    br label %[[FINALLY]]
 ; CHECK:       [[FINALLY]]:
-; CHECK-NEXT:    [[VAL3:%.*]] = phi <8 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    [[TMP1:%.*]] = phi <3 x float> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-NEXT:    [[VAL3:%.*]] = shufflevector <3 x float> [[TMP1]], <3 x float> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-NEXT:    ret <8 x float> [[VAL3]]
 ;
 entry:
@@ -1197,15 +1197,15 @@ define <16 x float> @shuffle_v16f32(<3 x float> %arg0, i1 %cond) {
 ; CHECK-NEXT:  [[ENTRY:.*:]]
 ; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
 ; CHECK:       [[THEN]]:
-; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    [[TMP0:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 1, i32 2, i32 0>
 ; CHECK-NEXT:    tail call void @func0()
 ; CHECK-NEXT:    br label %[[FINALLY:.*]]
 ; CHECK:       [[ELSE]]:
-; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-NEXT:    tail call void @func1()
 ; CHECK-NEXT:    br label %[[FINALLY]]
 ; CHECK:       [[FINALLY]]:
-; CHECK-NEXT:    [[VAL3:%.*]] = phi <16 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    [[TMP1:%.*]] = phi <3 x float> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-NEXT:    [[VAL3:%.*]] = shufflevector <3 x float> [[TMP1]], <3 x float> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-NEXT:    ret <16 x float> [[VAL3]]
 ;
 entry:
@@ -1232,15 +1232,15 @@ define <32 x float> @shuffle_v32f32(<3 x float> %arg0, i1 %cond) {
 ; CHECK-NEXT:  [[ENTRY:.*:]]
 ; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
 ; CHECK:       [[THEN]]:
-; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    [[TMP0:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 1, i32 2, i32 0>
 ; CHECK-NEXT:    tail call void @func0()
 ; CHECK-NEXT:    br label %[[FINALLY:.*]]
 ; CHECK:       [[ELSE]]:
-; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-NEXT:    tail call void @func1()
 ; CHECK-NEXT:    br label %[[FINALLY]]
 ; CHECK:       [[FINALLY]]:
-; CHECK-NEXT:    [[VAL3:%.*]] = phi <32 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    [[TMP1:%.*]] = phi <3 x float> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-NEXT:    [[VAL3:%.*]] = shufflevector <3 x float> [[TMP1]], <3 x float> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-NEXT:    ret <32 x float> [[VAL3]]
 ;
 entry:
diff --git a/llvm/test/Transforms/VectorCombine/X86/narrow-phi-of-shuffles.ll b/llvm/test/Transforms/VectorCombine/X86/narrow-phi-of-shuffles.ll
index 22a4ae42c8597..fd6066e15b909 100644
--- a/llvm/test/Transforms/VectorCombine/X86/narrow-phi-of-shuffles.ll
+++ b/llvm/test/Transforms/VectorCombine/X86/narrow-phi-of-shuffles.ll
@@ -1421,15 +1421,15 @@ define <4 x bfloat> @shuffle_v4bf16(<3 x bfloat> %arg0, i1 %cond) {
 ; CHECK-V1-NEXT:  [[ENTRY:.*:]]
 ; CHECK-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
 ; CHECK-V1:       [[THEN]]:
-; CHECK-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-V1-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
 ; CHECK-V1-NEXT:    tail call void @func0()
 ; CHECK-V1-NEXT:    br label %[[FINALLY:.*]]
 ; CHECK-V1:       [[ELSE]]:
-; CHECK-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
 ; CHECK-V1-NEXT:    tail call void @func1()
 ; CHECK-V1-NEXT:    br label %[[FINALLY]]
 ; CHECK-V1:       [[FINALLY]]:
-; CHECK-V1-NEXT:    [[VAL3:%.*]] = phi <4 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V1-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-V1-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
 ; CHECK-V1-NEXT:    ret <4 x bfloat> [[VAL3]]
 ;
 ; CHECK-V2-LABEL: define <4 x bfloat> @shuffle_v4bf16(
@@ -1437,15 +1437,15 @@ define <4 x bfloat> @shuffle_v4bf16(<3 x bfloat> %arg0, i1 %cond) {
 ; CHECK-V2-NEXT:  [[ENTRY:.*:]]
 ; CHECK-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
 ; CHECK-V2:       [[THEN]]:
-; CHECK-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-V2-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
 ; CHECK-V2-NEXT:    tail call void @func0()
 ; CHECK-V2-NEXT:    br label %[[FINALLY:.*]]
 ; CHECK-V2:       [[ELSE]]:
-; CHECK-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
 ; CHECK-V2-NEXT:    tail call void @func1()
 ; CHECK-V2-NEXT:    br label %[[FINALLY]]
 ; CHECK-V2:       [[FINALLY]]:
-; CHECK-V2-NEXT:    [[VAL3:%.*]] = phi <4 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V2-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-V2-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
 ; CHECK-V2-NEXT:    ret <4 x bfloat> [[VAL3]]
 ;
 ; CHECK-V3-LABEL: define <4 x bfloat> @shuffle_v4bf16(
@@ -1453,15 +1453,15 @@ define <4 x bfloat> @shuffle_v4bf16(<3 x bfloat> %arg0, i1 %cond) {
 ; CHECK-V3-NEXT:  [[ENTRY:.*:]]
 ; CHECK-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
 ; CHECK-V3:       [[THEN]]:
-; CHECK-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-V3-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
 ; CHECK-V3-NEXT:    tail call void @func0()
 ; CHECK-V3-NEXT:    br label %[[FINALLY:.*]]
 ; CHECK-V3:       [[ELSE]]:
-; CHECK-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
 ; CHECK-V3-NEXT:    tail call void @func1()
 ; CHECK-V3-NEXT:    br label %[[FINALLY]]
 ; CHECK-V3:       [[FINALLY]]:
-; CHECK-V3-NEXT:    [[VAL3:%.*]] = phi <4 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V3-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-V3-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
 ; CHECK-V3-NEXT:    ret <4 x bfloat> [[VAL3]]
 ;
 ; CHECK-V4-LABEL: define <4 x bfloat> @shuffle_v4bf16(
@@ -1469,15 +1469,15 @@ define <4 x bfloat> @shuffle_v4bf16(<3 x bfloat> %arg0, i1 %cond) {
 ; CHECK-V4-NEXT:  [[ENTRY:.*:]]
 ; CHECK-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
 ; CHECK-V4:       [[THEN]]:
-; CHECK-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-V4-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
 ; CHECK-V4-NEXT:    tail call void @func0()
 ; CHECK-V4-NEXT:    br label %[[FINALLY:.*]]
 ; CHECK-V4:       [[ELSE]]:
-; CHECK-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
 ; CHECK-V4-NEXT:    tail call void @func1()
 ; CHECK-V4-NEXT:    br label %[[FINALLY]]
 ; CHECK-V4:       [[FINALLY]]:
-; CHECK-V4-NEXT:    [[VAL3:%.*]] = phi <4 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V4-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-V4-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
 ; CHECK-V4-NEXT:    ret <4 x bfloat> [[VAL3]]
 ;
 entry:
@@ -1504,15 +1504,15 @@ define <6 x bfloat> @shuffle_v6bf16(<3 x bfloat> %arg0, i1 %cond) {
 ; CHECK-V1-NEXT:  [[ENTRY:.*:]]
 ; CHECK-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
 ; CHECK-V1:       [[THEN]]:
-; CHECK-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V1-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
 ; CHECK-V1-NEXT:    tail call void @func0()
 ; CHECK-V1-NEXT:    br label %[[FINALLY:.*]]
 ; CHECK-V1:       [[ELSE]]:
-; CHECK-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-V1-NEXT:    tail call void @func1()
 ; CHECK-V1-NEXT:    br label %[[FINALLY]]
 ; CHECK-V1:       [[FINALLY]]:
-; CHECK-V1-NEXT:    [[VAL3:%.*]] = phi <6 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V1-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-V1-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-V1-NEXT:    ret <6 x bfloat> [[VAL3]]
 ;
 ; CHECK-V2-LABEL: define <6 x bfloat> @shuffle_v6bf16(
@@ -1520,15 +1520,15 @@ define <6 x bfloat> @shuffle_v6bf16(<3 x bfloat> %arg0, i1 %cond) {
 ; CHECK-V2-NEXT:  [[ENTRY:.*:]]
 ; CHECK-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
 ; CHECK-V2:       [[THEN]]:
-; CHECK-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V2-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
 ; CHECK-V2-NEXT:    tail call void @func0()
 ; CHECK-V2-NEXT:    br label %[[FINALLY:.*]]
 ; CHECK-V2:       [[ELSE]]:
-; CHECK-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-V2-NEXT:    tail call void @func1()
 ; CHECK-V2-NEXT:    br label %[[FINALLY]]
 ; CHECK-V2:       [[FINALLY]]:
-; CHECK-V2-NEXT:    [[VAL3:%.*]] = phi <6 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V2-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-V2-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-V2-NEXT:    ret <6 x bfloat> [[VAL3]]
 ;
 ; CHECK-V3-LABEL: define <6 x bfloat> @shuffle_v6bf16(
@@ -1536,15 +1536,15 @@ define <6 x bfloat> @shuffle_v6bf16(<3 x bfloat> %arg0, i1 %cond) {
 ; CHECK-V3-NEXT:  [[ENTRY:.*:]]
 ; CHECK-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
 ; CHECK-V3:       [[THEN]]:
-; CHECK-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V3-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
 ; CHECK-V3-NEXT:    tail call void @func0()
 ; CHECK-V3-NEXT:    br label %[[FINALLY:.*]]
 ; CHECK-V3:       [[ELSE]]:
-; CHECK-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-V3-NEXT:    tail call void @func1()
 ; CHECK-V3-NEXT:    br label %[[FINALLY]]
 ; CHECK-V3:       [[FINALLY]]:
-; CHECK-V3-NEXT:    [[VAL3:%.*]] = phi <6 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V3-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-V3-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-V3-NEXT:    ret <6 x bfloat> [[VAL3]]
 ;
 ; CHECK-V4-LABEL: define <6 x bfloat> @shuffle_v6bf16(
@@ -1552,15 +1552,15 @@ define <6 x bfloat> @shuffle_v6bf16(<3 x bfloat> %arg0, i1 %cond) {
 ; CHECK-V4-NEXT:  [[ENTRY:.*:]]
 ; CHECK-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
 ; CHECK-V4:       [[THEN]]:
-; CHECK-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V4-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
 ; CHECK-V4-NEXT:    tail call void @func0()
 ; CHECK-V4-NEXT:    br label %[[FINALLY:.*]]
 ; CHECK-V4:       [[ELSE]]:
-; CHECK-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-V4-NEXT:    tail call void @func1()
 ; CHECK-V4-NEXT:    br label %[[FINALLY]]
 ; CHECK-V4:       [[FINALLY]]:
-; CHECK-V4-NEXT:    [[VAL3:%.*]] = phi <6 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V4-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-V4-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-V4-NEXT:    ret <6 x bfloat> [[VAL3]]
 ;
 entry:
@@ -1587,15 +1587,15 @@ define <8 x bfloat> @shuffle_v8bf16(<3 x bfloat> %arg0, i1 %cond) {
 ; CHECK-V1-NEXT:  [[ENTRY:.*:]]
 ; CHECK-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
 ; CHECK-V1:       [[THEN]]:
-; CHECK-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V1-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
 ; CHECK-V1-NEXT:    tail call void @func0()
 ; CHECK-V1-NEXT:    br label %[[FINALLY:.*]]
 ; CHECK-V1:       [[ELSE]]:
-; CHECK-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-V1-NEXT:    tail call void @func1()
 ; CHECK-V1-NEXT:    br label %[[FINALLY]]
 ; CHECK-V1:       [[FINALLY]]:
-; CHECK-V1-NEXT:    [[VAL3:%.*]] = phi <8 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V1-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-V1-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-V1-NEXT:    ret <8 x bfloat> [[VAL3]]
 ;
 ; CHECK-V2-LABEL: define <8 x bfloat> @shuffle_v8bf16(
@@ -1603,15 +1603,15 @@ define <8 x bfloat> @shuffle_v8bf16(<3 x bfloat> %arg0, i1 %cond) {
 ; CHECK-V2-NEXT:  [[ENTRY:.*:]]
 ; CHECK-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
 ; CHECK-V2:       [[THEN]]:
-; CHECK-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V2-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
 ; CHECK-V2-NEXT:    tail call void @func0()
 ; CHECK-V2-NEXT:    br label %[[FINALLY:.*]]
 ; CHECK-V2:       [[ELSE]]:
-; CHECK-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-V2-NEXT:    tail call void @func1()
 ; CHECK-V2-NEXT:    br label %[[FINALLY]]
 ; CHECK-V2:       [[FINALLY]]:
-; CHECK-V2-NEXT:    [[VAL3:%.*]] = phi <8 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V2-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-V2-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-V2-NEXT:    ret <8 x bfloat> [[VAL3]]
 ;
 ; CHECK-V3-LABEL: define <8 x bfloat> @shuffle_v8bf16(
@@ -1619,15 +1619,15 @@ define <8 x bfloat> @shuffle_v8bf16(<3 x bfloat> %arg0, i1 %cond) {
 ; CHECK-V3-NEXT:  [[ENTRY:.*:]]
 ; CHECK-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
 ; CHECK-V3:       [[THEN]]:
-; CHECK-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V3-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
 ; CHECK-V3-NEXT:    tail call void @func0()
 ; CHECK-V3-NEXT:    br label %[[FINALLY:.*]]
 ; CHECK-V3:       [[ELSE]]:
-; CHECK-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-V3-NEXT:    tail call void @func1()
 ; CHECK-V3-NEXT:    br label %[[FINALLY]]
 ; CHECK-V3:       [[FINALLY]]:
-; CHECK-V3-NEXT:    [[VAL3:%.*]] = phi <8 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V3-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-V3-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-V3-NEXT:    ret <8 x bfloat> [[VAL3]]
 ;
 ; CHECK-V4-LABEL: define <8 x bfloat> @shuffle_v8bf16(
@@ -1635,15 +1635,15 @@ define <8 x bfloat> @shuffle_v8bf16(<3 x bfloat> %arg0, i1 %cond) {
 ; CHECK-V4-NEXT:  [[ENTRY:.*:]]
 ; CHECK-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
 ; CHECK-V4:       [[THEN]]:
-; CHECK-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V4-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
 ; CHECK-V4-NEXT:    tail call void @func0()
 ; CHECK-V4-NEXT:    br label %[[FINALLY:.*]]
 ; CHECK-V4:       [[ELSE]]:
-; CHECK-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-V4-NEXT:    tail call void @func1()
 ; CHECK-V4-NEXT:    br label %[[FINALLY]]
 ; CHECK-V4:       [[FINALLY]]:
-; CHECK-V4-NEXT:    [[VAL3:%.*]] = phi <8 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V4-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-V4-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-V4-NEXT:    ret <8 x bfloat> [[VAL3]]
 ;
 entry:
@@ -1670,15 +1670,15 @@ define <16 x bfloat> @shuffle_v16bf16(<3 x bfloat> %arg0, i1 %cond) {
 ; CHECK-V1-NEXT:  [[ENTRY:.*:]]
 ; CHECK-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
 ; CHECK-V1:       [[THEN]]:
-; CHECK-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V1-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
 ; CHECK-V1-NEXT:    tail call void @func0()
 ; CHECK-V1-NEXT:    br label %[[FINALLY:.*]]
 ; CHECK-V1:       [[ELSE]]:
-; CHECK-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-V1-NEXT:    tail call void @func1()
 ; CHECK-V1-NEXT:    br label %[[FINALLY]]
 ; CHECK-V1:       [[FINALLY]]:
-; CHECK-V1-NEXT:    [[VAL3:%.*]] = phi <16 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V1-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-V1-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-V1-NEXT:    ret <16 x bfloat> [[VAL3]]
 ;
 ; CHECK-V2-LABEL: define <16 x bfloat> @shuffle_v16bf16(
@@ -1686,15 +1686,15 @@ define <16 x bfloat> @shuffle_v16bf16(<3 x bfloat> %arg0, i1 %cond) {
 ; CHECK-V2-NEXT:  [[ENTRY:.*:]]
 ; CHECK-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
 ; CHECK-V2:       [[THEN]]:
-; CHECK-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V2-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
 ; CHECK-V2-NEXT:    tail call void @func0()
 ; CHECK-V2-NEXT:    br label %[[FINALLY:.*]]
 ; CHECK-V2:       [[ELSE]]:
-; CHECK-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-V2-NEXT:    tail call void @func1()
 ; CHECK-V2-NEXT:    br label %[[FINALLY]]
 ; CHECK-V2:       [[FINALLY]]:
-; CHECK-V2-NEXT:    [[VAL3:%.*]] = phi <16 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V2-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-V2-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-V2-NEXT:    ret <16 x bfloat> [[VAL3]]
 ;
 ; CHECK-V3-LABEL: define <16 x bfloat> @shuffle_v16bf16(
@@ -1702,15 +1702,15 @@ define <16 x bfloat> @shuffle_v16bf16(<3 x bfloat> %arg0, i1 %cond) {
 ; CHECK-V3-NEXT:  [[ENTRY:.*:]]
 ; CHECK-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
 ; CHECK-V3:       [[THEN]]:
-; CHECK-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V3-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
 ; CHECK-V3-NEXT:    tail call void @func0()
 ; CHECK-V3-NEXT:    br label %[[FINALLY:.*]]
 ; CHECK-V3:       [[ELSE]]:
-; CHECK-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-V3-NEXT:    tail call void @func1()
 ; CHECK-V3-NEXT:    br label %[[FINALLY]]
 ; CHECK-V3:       [[FINALLY]]:
-; CHECK-V3-NEXT:    [[VAL3:%.*]] = phi <16 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V3-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-V3-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-V3-NEXT:    ret <16 x bfloat> [[VAL3]]
 ;
 ; CHECK-V4-LABEL: define <16 x bfloat> @shuffle_v16bf16(
@@ -1718,15 +1718,15 @@ define <16 x bfloat> @shuffle_v16bf16(<3 x bfloat> %arg0, i1 %cond) {
 ; CHECK-V4-NEXT:  [[ENTRY:.*:]]
 ; CHECK-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
 ; CHECK-V4:       [[THEN]]:
-; CHECK-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V4-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
 ; CHECK-V4-NEXT:    tail call void @func0()
 ; CHECK-V4-NEXT:    br label %[[FINALLY:.*]]
 ; CHECK-V4:       [[ELSE]]:
-; CHECK-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-V4-NEXT:    tail call void @func1()
 ; CHECK-V4-NEXT:    br label %[[FINALLY]]
 ; CHECK-V4:       [[FINALLY]]:
-; CHECK-V4-NEXT:    [[VAL3:%.*]] = phi <16 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V4-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-V4-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-V4-NEXT:    ret <16 x bfloat> [[VAL3]]
 ;
 entry:
@@ -1753,15 +1753,15 @@ define <32 x bfloat> @shuffle_v32bf16(<3 x bfloat> %arg0, i1 %cond) {
 ; CHECK-V1-NEXT:  [[ENTRY:.*:]]
 ; CHECK-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
 ; CHECK-V1:       [[THEN]]:
-; CHECK-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V1-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
 ; CHECK-V1-NEXT:    tail call void @func0()
 ; CHECK-V1-NEXT:    br label %[[FINALLY:.*]]
 ; CHECK-V1:       [[ELSE]]:
-; CHECK-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-V1-NEXT:    tail call void @func1()
 ; CHECK-V1-NEXT:    br label %[[FINALLY]]
 ; CHECK-V1:       [[FINALLY]]:
-; CHECK-V1-NEXT:    [[VAL3:%.*]] = phi <32 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V1-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-V1-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-V1-NEXT:    ret <32 x bfloat> [[VAL3]]
 ;
 ; CHECK-V2-LABEL: define <32 x bfloat> @shuffle_v32bf16(
@@ -1769,15 +1769,15 @@ define <32 x bfloat> @shuffle_v32bf16(<3 x bfloat> %arg0, i1 %cond) {
 ; CHECK-V2-NEXT:  [[ENTRY:.*:]]
 ; CHECK-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
 ; CHECK-V2:       [[THEN]]:
-; CHECK-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V2-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
 ; CHECK-V2-NEXT:    tail call void @func0()
 ; CHECK-V2-NEXT:    br label %[[FINALLY:.*]]
 ; CHECK-V2:       [[ELSE]]:
-; CHECK-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-V2-NEXT:    tail call void @func1()
 ; CHECK-V2-NEXT:    br label %[[FINALLY]]
 ; CHECK-V2:       [[FINALLY]]:
-; CHECK-V2-NEXT:    [[VAL3:%.*]] = phi <32 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V2-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-V2-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-V2-NEXT:    ret <32 x bfloat> [[VAL3]]
 ;
 ; CHECK-V3-LABEL: define <32 x bfloat> @shuffle_v32bf16(
@@ -1785,15 +1785,15 @@ define <32 x bfloat> @shuffle_v32bf16(<3 x bfloat> %arg0, i1 %cond) {
 ; CHECK-V3-NEXT:  [[ENTRY:.*:]]
 ; CHECK-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
 ; CHECK-V3:       [[THEN]]:
-; CHECK-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V3-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
 ; CHECK-V3-NEXT:    tail call void @func0()
 ; CHECK-V3-NEXT:    br label %[[FINALLY:.*]]
 ; CHECK-V3:       [[ELSE]]:
-; CHECK-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-V3-NEXT:    tail call void @func1()
 ; CHECK-V3-NEXT:    br label %[[FINALLY]]
 ; CHECK-V3:       [[FINALLY]]:
-; CHECK-V3-NEXT:    [[VAL3:%.*]] = phi <32 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V3-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-V3-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-V3-NEXT:    ret <32 x bfloat> [[VAL3]]
 ;
 ; CHECK-V4-LABEL: define <32 x bfloat> @shuffle_v32bf16(
@@ -1801,15 +1801,15 @@ define <32 x bfloat> @shuffle_v32bf16(<3 x bfloat> %arg0, i1 %cond) {
 ; CHECK-V4-NEXT:  [[ENTRY:.*:]]
 ; CHECK-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
 ; CHECK-V4:       [[THEN]]:
-; CHECK-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V4-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
 ; CHECK-V4-NEXT:    tail call void @func0()
 ; CHECK-V4-NEXT:    br label %[[FINALLY:.*]]
 ; CHECK-V4:       [[ELSE]]:
-; CHECK-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-V4-NEXT:    tail call void @func1()
 ; CHECK-V4-NEXT:    br label %[[FINALLY]]
 ; CHECK-V4:       [[FINALLY]]:
-; CHECK-V4-NEXT:    [[VAL3:%.*]] = phi <32 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V4-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-V4-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-V4-NEXT:    ret <32 x bfloat> [[VAL3]]
 ;
 entry:
@@ -2002,15 +2002,15 @@ define <4 x half> @shuffle_v4f16(<3 x half> %arg0, i1 %cond) {
 ; CHECK-V1-NEXT:  [[ENTRY:.*:]]
 ; CHECK-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
 ; CHECK-V1:       [[THEN]]:
-; CHECK-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-V1-NEXT:    [[TMP0:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 2, i32 0>
 ; CHECK-V1-NEXT:    tail call void @func0()
 ; CHECK-V1-NEXT:    br label %[[FINALLY:.*]]
 ; CHECK-V1:       [[ELSE]]:
-; CHECK-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
 ; CHECK-V1-NEXT:    tail call void @func1()
 ; CHECK-V1-NEXT:    br label %[[FINALLY]]
 ; CHECK-V1:       [[FINALLY]]:
-; CHECK-V1-NEXT:    [[VAL3:%.*]] = phi <4 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V1-NEXT:    [[TMP1:%.*]] = phi <3 x half> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-V1-NEXT:    [[VAL3:%.*]] = shufflevector <3 x half> [[TMP1]], <3 x half> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
 ; CHECK-V1-NEXT:    ret <4 x half> [[VAL3]]
 ;
 ; CHECK-V2-LABEL: define <4 x half> @shuffle_v4f16(
@@ -2018,15 +2018,15 @@ define <4 x half> @shuffle_v4f16(<3 x half> %arg0, i1 %cond) {
 ; CHECK-V2-NEXT:  [[ENTRY:.*:]]
 ; CHECK-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
 ; CHECK-V2:       [[THEN]]:
-; CHECK-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-V2-NEXT:    [[TMP0:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 2, i32 0>
 ; CHECK-V2-NEXT:    tail call void @func0()
 ; CHECK-V2-NEXT:    br label %[[FINALLY:.*]]
 ; CHECK-V2:       [[ELSE]]:
-; CHECK-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
 ; CHECK-V2-NEXT:    tail call void @func1()
 ; CHECK-V2-NEXT:    br label %[[FINALLY]]
 ; CHECK-V2:       [[FINALLY]]:
-; CHECK-V2-NEXT:    [[VAL3:%.*]] = phi <4 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V2-NEXT:    [[TMP1:%.*]] = phi <3 x half> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-V2-NEXT:    [[VAL3:%.*]] = shufflevector <3 x half> [[TMP1]], <3 x half> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
 ; CHECK-V2-NEXT:    ret <4 x half> [[VAL3]]
 ;
 ; CHECK-V3-LABEL: define <4 x half> @shuffle_v4f16(
@@ -2085,15 +2085,15 @@ define <6 x half> @shuffle_v6f16(<3 x half> %arg0, i1 %cond) {
 ; CHECK-V1-NEXT:  [[ENTRY:.*:]]
 ; CHECK-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
 ; CHECK-V1:       [[THEN]]:
-; CHECK-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V1-NEXT:    [[TMP0:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 2, i32 0>
 ; CHECK-V1-NEXT:    tail call void @func0()
 ; CHECK-V1-NEXT:    br label %[[FINALLY:.*]]
 ; CHECK-V1:       [[ELSE]]:
-; CHECK-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-V1-NEXT:    tail call void @func1()
 ; CHECK-V1-NEXT:    br label %[[FINALLY]]
 ; CHECK-V1:       [[FINALLY]]:
-; CHECK-V1-NEXT:    [[VAL3:%.*]] = phi <6 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V1-NEXT:    [[TMP1:%.*]] = phi <3 x half> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-V1-NEXT:    [[VAL3:%.*]] = shufflevector <3 x half> [[TMP1]], <3 x half> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-V1-NEXT:    ret <6 x half> [[VAL3]]
 ;
 ; CHECK-V2-LABEL: define <6 x half> @shuffle_v6f16(
@@ -2101,15 +2101,15 @@ define <6 x half> @shuffle_v6f16(<3 x half> %arg0, i1 %cond) {
 ; CHECK-V2-NEXT:  [[ENTRY:.*:]]
 ; CHECK-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
 ; CHECK-V2:       [[THEN]]:
-; CHECK-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V2-NEXT:    [[TMP0:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 2, i32 0>
 ; CHECK-V2-NEXT:    tail call void @func0()
 ; CHECK-V2-NEXT:    br label %[[FINALLY:.*]]
 ; CHECK-V2:       [[ELSE]]:
-; CHECK-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-V2-NEXT:    tail call void @func1()
 ; CHECK-V2-NEXT:    br label %[[FINALLY]]
 ; CHECK-V2:       [[FINALLY]]:
-; CHECK-V2-NEXT:    [[VAL3:%.*]] = phi <6 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V2-NEXT:    [[TMP1:%.*]] = phi <3 x half> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-V2-NEXT:    [[VAL3:%.*]] = shufflevector <3 x half> [[TMP1]], <3 x half> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-V2-NEXT:    ret <6 x half> [[VAL3]]
 ;
 ; CHECK-V3-LABEL: define <6 x half> @shuffle_v6f16(
@@ -2168,15 +2168,15 @@ define <8 x half> @shuffle_v8f16(<3 x half> %arg0, i1 %cond) {
 ; CHECK-V1-NEXT:  [[ENTRY:.*:]]
 ; CHECK-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
 ; CHECK-V1:       [[THEN]]:
-; CHECK-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V1-NEXT:    [[TMP0:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 2, i32 0>
 ; CHECK-V1-NEXT:    tail call void @func0()
 ; CHECK-V1-NEXT:    br label %[[FINALLY:.*]]
 ; CHECK-V1:       [[ELSE]]:
-; CHECK-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-V1-NEXT:    tail call void @func1()
 ; CHECK-V1-NEXT:    br label %[[FINALLY]]
 ; CHECK-V1:       [[FINALLY]]:
-; CHECK-V1-NEXT:    [[VAL3:%.*]] = phi <8 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V1-NEXT:    [[TMP1:%.*]] = phi <3 x half> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-V1-NEXT:    [[VAL3:%.*]] = shufflevector <3 x half> [[TMP1]], <3 x half> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-V1-NEXT:    ret <8 x half> [[VAL3]]
 ;
 ; CHECK-V2-LABEL: define <8 x half> @shuffle_v8f16(
@@ -2184,15 +2184,15 @@ define <8 x half> @shuffle_v8f16(<3 x half> %arg0, i1 %cond) {
 ; CHECK-V2-NEXT:  [[ENTRY:.*:]]
 ; CHECK-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
 ; CHECK-V2:       [[THEN]]:
-; CHECK-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V2-NEXT:    [[TMP0:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 2, i32 0>
 ; CHECK-V2-NEXT:    tail call void @func0()
 ; CHECK-V2-NEXT:    br label %[[FINALLY:.*]]
 ; CHECK-V2:       [[ELSE]]:
-; CHECK-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-V2-NEXT:    tail call void @func1()
 ; CHECK-V2-NEXT:    br label %[[FINALLY]]
 ; CHECK-V2:       [[FINALLY]]:
-; CHECK-V2-NEXT:    [[VAL3:%.*]] = phi <8 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V2-NEXT:    [[TMP1:%.*]] = phi <3 x half> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-V2-NEXT:    [[VAL3:%.*]] = shufflevector <3 x half> [[TMP1]], <3 x half> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-V2-NEXT:    ret <8 x half> [[VAL3]]
 ;
 ; CHECK-V3-LABEL: define <8 x half> @shuffle_v8f16(
@@ -2251,15 +2251,15 @@ define <16 x half> @shuffle_v16f16(<3 x half> %arg0, i1 %cond) {
 ; CHECK-V1-NEXT:  [[ENTRY:.*:]]
 ; CHECK-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
 ; CHECK-V1:       [[THEN]]:
-; CHECK-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V1-NEXT:    [[TMP0:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 2, i32 0>
 ; CHECK-V1-NEXT:    tail call void @func0()
 ; CHECK-V1-NEXT:    br label %[[FINALLY:.*]]
 ; CHECK-V1:       [[ELSE]]:
-; CHECK-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-V1-NEXT:    tail call void @func1()
 ; CHECK-V1-NEXT:    br label %[[FINALLY]]
 ; CHECK-V1:       [[FINALLY]]:
-; CHECK-V1-NEXT:    [[VAL3:%.*]] = phi <16 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V1-NEXT:    [[TMP1:%.*]] = phi <3 x half> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-V1-NEXT:    [[VAL3:%.*]] = shufflevector <3 x half> [[TMP1]], <3 x half> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-V1-NEXT:    ret <16 x half> [[VAL3]]
 ;
 ; CHECK-V2-LABEL: define <16 x half> @shuffle_v16f16(
@@ -2267,15 +2267,15 @@ define <16 x half> @shuffle_v16f16(<3 x half> %arg0, i1 %cond) {
 ; CHECK-V2-NEXT:  [[ENTRY:.*:]]
 ; CHECK-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
 ; CHECK-V2:       [[THEN]]:
-; CHECK-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V2-NEXT:    [[TMP0:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 2, i32 0>
 ; CHECK-V2-NEXT:    tail call void @func0()
 ; CHECK-V2-NEXT:    br label %[[FINALLY:.*]]
 ; CHECK-V2:       [[ELSE]]:
-; CHECK-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-V2-NEXT:    tail call void @func1()
 ; CHECK-V2-NEXT:    br label %[[FINALLY]]
 ; CHECK-V2:       [[FINALLY]]:
-; CHECK-V2-NEXT:    [[VAL3:%.*]] = phi <16 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V2-NEXT:    [[TMP1:%.*]] = phi <3 x half> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-V2-NEXT:    [[VAL3:%.*]] = shufflevector <3 x half> [[TMP1]], <3 x half> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-V2-NEXT:    ret <16 x half> [[VAL3]]
 ;
 ; CHECK-V3-LABEL: define <16 x half> @shuffle_v16f16(
@@ -2334,15 +2334,15 @@ define <32 x half> @shuffle_v32f16(<3 x half> %arg0, i1 %cond) {
 ; CHECK-V1-NEXT:  [[ENTRY:.*:]]
 ; CHECK-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
 ; CHECK-V1:       [[THEN]]:
-; CHECK-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V1-NEXT:    [[TMP0:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 2, i32 0>
 ; CHECK-V1-NEXT:    tail call void @func0()
 ; CHECK-V1-NEXT:    br label %[[FINALLY:.*]]
 ; CHECK-V1:       [[ELSE]]:
-; CHECK-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-V1-NEXT:    tail call void @func1()
 ; CHECK-V1-NEXT:    br label %[[FINALLY]]
 ; CHECK-V1:       [[FINALLY]]:
-; CHECK-V1-NEXT:    [[VAL3:%.*]] = phi <32 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V1-NEXT:    [[TMP1:%.*]] = phi <3 x half> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-V1-NEXT:    [[VAL3:%.*]] = shufflevector <3 x half> [[TMP1]], <3 x half> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-V1-NEXT:    ret <32 x half> [[VAL3]]
 ;
 ; CHECK-V2-LABEL: define <32 x half> @shuffle_v32f16(
@@ -2350,15 +2350,15 @@ define <32 x half> @shuffle_v32f16(<3 x half> %arg0, i1 %cond) {
 ; CHECK-V2-NEXT:  [[ENTRY:.*:]]
 ; CHECK-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
 ; CHECK-V2:       [[THEN]]:
-; CHECK-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V2-NEXT:    [[TMP0:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 2, i32 0>
 ; CHECK-V2-NEXT:    tail call void @func0()
 ; CHECK-V2-NEXT:    br label %[[FINALLY:.*]]
 ; CHECK-V2:       [[ELSE]]:
-; CHECK-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-V2-NEXT:    tail call void @func1()
 ; CHECK-V2-NEXT:    br label %[[FINALLY]]
 ; CHECK-V2:       [[FINALLY]]:
-; CHECK-V2-NEXT:    [[VAL3:%.*]] = phi <32 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V2-NEXT:    [[TMP1:%.*]] = phi <3 x half> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-V2-NEXT:    [[VAL3:%.*]] = shufflevector <3 x half> [[TMP1]], <3 x half> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-V2-NEXT:    ret <32 x half> [[VAL3]]
 ;
 ; CHECK-V3-LABEL: define <32 x half> @shuffle_v32f16(

>From 7f0481c57fbf92c91f3b1dcb765cf0c5e8a00702 Mon Sep 17 00:00:00 2001
From: Leon Clark <leoclark at amd.com>
Date: Wed, 9 Jul 2025 00:20:14 +0100
Subject: [PATCH 11/14] Fix cost analysis after rebase.

---
 llvm/lib/Transforms/Vectorize/VectorCombine.cpp | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/llvm/lib/Transforms/Vectorize/VectorCombine.cpp b/llvm/lib/Transforms/Vectorize/VectorCombine.cpp
index 10f59f4844d61..c6069c8339f9c 100644
--- a/llvm/lib/Transforms/Vectorize/VectorCombine.cpp
+++ b/llvm/lib/Transforms/Vectorize/VectorCombine.cpp
@@ -3753,10 +3753,12 @@ bool VectorCombine::shrinkPhiOfShuffles(Instruction &I) {
 
   // Calculate costs for worst cases and compare.
   auto const Kind = TTI::SK_PermuteSingleSrc;
-  auto OldCost = std::max(TTI.getShuffleCost(Kind, InputVT, Mask0, CostKind),
-                          TTI.getShuffleCost(Kind, InputVT, Mask1, CostKind));
-  auto NewCost = TTI.getShuffleCost(Kind, InputVT, NewMask, CostKind) +
-                 TTI.getShuffleCost(Kind, InputVT, Mask1, CostKind);
+  auto OldCost =
+      std::max(TTI.getShuffleCost(Kind, ResultVT, InputVT, Mask0, CostKind),
+               TTI.getShuffleCost(Kind, ResultVT, InputVT, Mask1, CostKind));
+  auto NewCost =
+      TTI.getShuffleCost(Kind, InputVT, InputVT, NewMask, CostKind) +
+      TTI.getShuffleCost(Kind, ResultVT, InputVT, Mask1, CostKind);
 
   if (NewCost > OldCost)
     return false;

>From 4aa02e88000c1c21f7371fc6d28b7d9d5cab41ad Mon Sep 17 00:00:00 2001
From: Leon Clark <leoclark at amd.com>
Date: Wed, 9 Jul 2025 00:36:43 +0100
Subject: [PATCH 12/14] Add debug message.

---
 llvm/lib/Transforms/Vectorize/VectorCombine.cpp | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/llvm/lib/Transforms/Vectorize/VectorCombine.cpp b/llvm/lib/Transforms/Vectorize/VectorCombine.cpp
index c6069c8339f9c..4f759c9c88ea5 100644
--- a/llvm/lib/Transforms/Vectorize/VectorCombine.cpp
+++ b/llvm/lib/Transforms/Vectorize/VectorCombine.cpp
@@ -3763,6 +3763,10 @@ bool VectorCombine::shrinkPhiOfShuffles(Instruction &I) {
   if (NewCost > OldCost)
     return false;
 
+  LLVM_DEBUG(dbgs() << "Found a phi of mergeable shuffles: " << I
+                    << "\n  OldCost: " << OldCost << " vs NewCost: " << NewCost
+                    << "\n");
+
   // Create new shuffles and narrowed phi.
   auto Builder = IRBuilder(Shuf);
   Builder.SetCurrentDebugLocation(Shuf->getDebugLoc());

>From 8aa6aa94ab299d11a6341d76718656ba5e39e79f Mon Sep 17 00:00:00 2001
From: Leon Clark <leoclark at amd.com>
Date: Wed, 9 Jul 2025 01:31:49 +0100
Subject: [PATCH 13/14] Formatting.

---
 llvm/lib/Transforms/Vectorize/VectorCombine.cpp | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/llvm/lib/Transforms/Vectorize/VectorCombine.cpp b/llvm/lib/Transforms/Vectorize/VectorCombine.cpp
index 4f759c9c88ea5..a54dcfc772707 100644
--- a/llvm/lib/Transforms/Vectorize/VectorCombine.cpp
+++ b/llvm/lib/Transforms/Vectorize/VectorCombine.cpp
@@ -3756,9 +3756,8 @@ bool VectorCombine::shrinkPhiOfShuffles(Instruction &I) {
   auto OldCost =
       std::max(TTI.getShuffleCost(Kind, ResultVT, InputVT, Mask0, CostKind),
                TTI.getShuffleCost(Kind, ResultVT, InputVT, Mask1, CostKind));
-  auto NewCost =
-      TTI.getShuffleCost(Kind, InputVT, InputVT, NewMask, CostKind) +
-      TTI.getShuffleCost(Kind, ResultVT, InputVT, Mask1, CostKind);
+  auto NewCost = TTI.getShuffleCost(Kind, InputVT, InputVT, NewMask, CostKind) +
+                 TTI.getShuffleCost(Kind, ResultVT, InputVT, Mask1, CostKind);
 
   if (NewCost > OldCost)
     return false;

>From 5760b88e1528acafd446528b64e215b5c6a32625 Mon Sep 17 00:00:00 2001
From: Leon Clark <leoclark at amd.com>
Date: Wed, 9 Jul 2025 16:49:03 +0100
Subject: [PATCH 14/14] Address comments.

---
 .../Transforms/Vectorize/VectorCombine.cpp    |    6 +-
 .../X86/narrow-phi-of-shuffles.ll             | 3090 +++++------------
 2 files changed, 804 insertions(+), 2292 deletions(-)

diff --git a/llvm/lib/Transforms/Vectorize/VectorCombine.cpp b/llvm/lib/Transforms/Vectorize/VectorCombine.cpp
index a54dcfc772707..c275643e953c0 100644
--- a/llvm/lib/Transforms/Vectorize/VectorCombine.cpp
+++ b/llvm/lib/Transforms/Vectorize/VectorCombine.cpp
@@ -3759,13 +3759,13 @@ bool VectorCombine::shrinkPhiOfShuffles(Instruction &I) {
   auto NewCost = TTI.getShuffleCost(Kind, InputVT, InputVT, NewMask, CostKind) +
                  TTI.getShuffleCost(Kind, ResultVT, InputVT, Mask1, CostKind);
 
-  if (NewCost > OldCost)
-    return false;
-
   LLVM_DEBUG(dbgs() << "Found a phi of mergeable shuffles: " << I
                     << "\n  OldCost: " << OldCost << " vs NewCost: " << NewCost
                     << "\n");
 
+  if (NewCost > OldCost)
+    return false;
+
   // Create new shuffles and narrowed phi.
   auto Builder = IRBuilder(Shuf);
   Builder.SetCurrentDebugLocation(Shuf->getDebugLoc());
diff --git a/llvm/test/Transforms/VectorCombine/X86/narrow-phi-of-shuffles.ll b/llvm/test/Transforms/VectorCombine/X86/narrow-phi-of-shuffles.ll
index fd6066e15b909..59422e98cbcc6 100644
--- a/llvm/test/Transforms/VectorCombine/X86/narrow-phi-of-shuffles.ll
+++ b/llvm/test/Transforms/VectorCombine/X86/narrow-phi-of-shuffles.ll
@@ -1,73 +1,25 @@
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
-; RUN: opt -mtriple=x86_64-- -mcpu=x86-64 -passes=vector-combine -S %s | FileCheck %s --check-prefixes=CHECK-V1
-; RUN: opt -mtriple=x86_64-- -mcpu=x86-64-v2 -passes=vector-combine -S %s | FileCheck %s --check-prefixes=CHECK-V2
-; RUN: opt -mtriple=x86_64-- -mcpu=x86-64-v3 -passes=vector-combine -S %s | FileCheck %s --check-prefixes=CHECK-V3
-; RUN: opt -mtriple=x86_64-- -mcpu=x86-64-v4 -passes=vector-combine -S %s | FileCheck %s --check-prefixes=CHECK-V4
+; RUN: opt -mtriple=x86_64-- -mcpu=x86-64 -passes=vector-combine -S %s | FileCheck %s --check-prefixes=CHECK,CHECK-V1
+; RUN: opt -mtriple=x86_64-- -mcpu=x86-64-v2 -passes=vector-combine -S %s | FileCheck %s --check-prefixes=CHECK,CHECK-V2
+; RUN: opt -mtriple=x86_64-- -mcpu=x86-64-v3 -passes=vector-combine -S %s | FileCheck %s --check-prefixes=CHECK,CHECK-V3
+; RUN: opt -mtriple=x86_64-- -mcpu=x86-64-v4 -passes=vector-combine -S %s | FileCheck %s --check-prefixes=CHECK,CHECK-V4
 
 define <2 x i8> @shuffle_v2i8(<2 x i8> %arg0, i1 %cond) {
-; CHECK-V1-LABEL: define <2 x i8> @shuffle_v2i8(
-; CHECK-V1-SAME: <2 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0:[0-9]+]] {
-; CHECK-V1-NEXT:  [[ENTRY:.*:]]
-; CHECK-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V1:       [[THEN]]:
-; CHECK-V1-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i8> [[ARG0]], <2 x i8> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-V1-NEXT:    tail call void @func0()
-; CHECK-V1-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V1:       [[ELSE]]:
-; CHECK-V1-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i8> [[ARG0]], <2 x i8> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-V1-NEXT:    tail call void @func1()
-; CHECK-V1-NEXT:    br label %[[FINALLY]]
-; CHECK-V1:       [[FINALLY]]:
-; CHECK-V1-NEXT:    [[VAL3:%.*]] = phi <2 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V1-NEXT:    ret <2 x i8> [[VAL3]]
-;
-; CHECK-V2-LABEL: define <2 x i8> @shuffle_v2i8(
-; CHECK-V2-SAME: <2 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0:[0-9]+]] {
-; CHECK-V2-NEXT:  [[ENTRY:.*:]]
-; CHECK-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V2:       [[THEN]]:
-; CHECK-V2-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i8> [[ARG0]], <2 x i8> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-V2-NEXT:    tail call void @func0()
-; CHECK-V2-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V2:       [[ELSE]]:
-; CHECK-V2-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i8> [[ARG0]], <2 x i8> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-V2-NEXT:    tail call void @func1()
-; CHECK-V2-NEXT:    br label %[[FINALLY]]
-; CHECK-V2:       [[FINALLY]]:
-; CHECK-V2-NEXT:    [[VAL3:%.*]] = phi <2 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V2-NEXT:    ret <2 x i8> [[VAL3]]
-;
-; CHECK-V3-LABEL: define <2 x i8> @shuffle_v2i8(
-; CHECK-V3-SAME: <2 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0:[0-9]+]] {
-; CHECK-V3-NEXT:  [[ENTRY:.*:]]
-; CHECK-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V3:       [[THEN]]:
-; CHECK-V3-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i8> [[ARG0]], <2 x i8> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-V3-NEXT:    tail call void @func0()
-; CHECK-V3-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V3:       [[ELSE]]:
-; CHECK-V3-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i8> [[ARG0]], <2 x i8> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-V3-NEXT:    tail call void @func1()
-; CHECK-V3-NEXT:    br label %[[FINALLY]]
-; CHECK-V3:       [[FINALLY]]:
-; CHECK-V3-NEXT:    [[VAL3:%.*]] = phi <2 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V3-NEXT:    ret <2 x i8> [[VAL3]]
-;
-; CHECK-V4-LABEL: define <2 x i8> @shuffle_v2i8(
-; CHECK-V4-SAME: <2 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0:[0-9]+]] {
-; CHECK-V4-NEXT:  [[ENTRY:.*:]]
-; CHECK-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V4:       [[THEN]]:
-; CHECK-V4-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i8> [[ARG0]], <2 x i8> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-V4-NEXT:    tail call void @func0()
-; CHECK-V4-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V4:       [[ELSE]]:
-; CHECK-V4-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i8> [[ARG0]], <2 x i8> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-V4-NEXT:    tail call void @func1()
-; CHECK-V4-NEXT:    br label %[[FINALLY]]
-; CHECK-V4:       [[FINALLY]]:
-; CHECK-V4-NEXT:    [[VAL3:%.*]] = phi <2 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V4-NEXT:    ret <2 x i8> [[VAL3]]
+; CHECK-LABEL: define <2 x i8> @shuffle_v2i8(
+; CHECK-SAME: <2 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0:[0-9]+]] {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i8> [[ARG0]], <2 x i8> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i8> [[ARG0]], <2 x i8> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <2 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <2 x i8> [[VAL3]]
 ;
 entry:
   br i1 %cond, label %then, label %else
@@ -88,69 +40,21 @@ finally:
 }
 
 define <4 x i8> @shuffle_v4i8(<3 x i8> %arg0, i1 %cond) {
-; CHECK-V1-LABEL: define <4 x i8> @shuffle_v4i8(
-; CHECK-V1-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V1-NEXT:  [[ENTRY:.*:]]
-; CHECK-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V1:       [[THEN]]:
-; CHECK-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
-; CHECK-V1-NEXT:    tail call void @func0()
-; CHECK-V1-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V1:       [[ELSE]]:
-; CHECK-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-; CHECK-V1-NEXT:    tail call void @func1()
-; CHECK-V1-NEXT:    br label %[[FINALLY]]
-; CHECK-V1:       [[FINALLY]]:
-; CHECK-V1-NEXT:    [[VAL3:%.*]] = phi <4 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V1-NEXT:    ret <4 x i8> [[VAL3]]
-;
-; CHECK-V2-LABEL: define <4 x i8> @shuffle_v4i8(
-; CHECK-V2-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V2-NEXT:  [[ENTRY:.*:]]
-; CHECK-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V2:       [[THEN]]:
-; CHECK-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
-; CHECK-V2-NEXT:    tail call void @func0()
-; CHECK-V2-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V2:       [[ELSE]]:
-; CHECK-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-; CHECK-V2-NEXT:    tail call void @func1()
-; CHECK-V2-NEXT:    br label %[[FINALLY]]
-; CHECK-V2:       [[FINALLY]]:
-; CHECK-V2-NEXT:    [[VAL3:%.*]] = phi <4 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V2-NEXT:    ret <4 x i8> [[VAL3]]
-;
-; CHECK-V3-LABEL: define <4 x i8> @shuffle_v4i8(
-; CHECK-V3-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V3-NEXT:  [[ENTRY:.*:]]
-; CHECK-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V3:       [[THEN]]:
-; CHECK-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
-; CHECK-V3-NEXT:    tail call void @func0()
-; CHECK-V3-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V3:       [[ELSE]]:
-; CHECK-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-; CHECK-V3-NEXT:    tail call void @func1()
-; CHECK-V3-NEXT:    br label %[[FINALLY]]
-; CHECK-V3:       [[FINALLY]]:
-; CHECK-V3-NEXT:    [[VAL3:%.*]] = phi <4 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V3-NEXT:    ret <4 x i8> [[VAL3]]
-;
-; CHECK-V4-LABEL: define <4 x i8> @shuffle_v4i8(
-; CHECK-V4-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V4-NEXT:  [[ENTRY:.*:]]
-; CHECK-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V4:       [[THEN]]:
-; CHECK-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
-; CHECK-V4-NEXT:    tail call void @func0()
-; CHECK-V4-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V4:       [[ELSE]]:
-; CHECK-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-; CHECK-V4-NEXT:    tail call void @func1()
-; CHECK-V4-NEXT:    br label %[[FINALLY]]
-; CHECK-V4:       [[FINALLY]]:
-; CHECK-V4-NEXT:    [[VAL3:%.*]] = phi <4 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V4-NEXT:    ret <4 x i8> [[VAL3]]
+; CHECK-LABEL: define <4 x i8> @shuffle_v4i8(
+; CHECK-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <4 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <4 x i8> [[VAL3]]
 ;
 entry:
   br i1 %cond, label %then, label %else
@@ -171,69 +75,21 @@ finally:
 }
 
 define <8 x i8> @shuffle_v8i8(<3 x i8> %arg0, i1 %cond) {
-; CHECK-V1-LABEL: define <8 x i8> @shuffle_v8i8(
-; CHECK-V1-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V1-NEXT:  [[ENTRY:.*:]]
-; CHECK-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V1:       [[THEN]]:
-; CHECK-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-V1-NEXT:    tail call void @func0()
-; CHECK-V1-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V1:       [[ELSE]]:
-; CHECK-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-V1-NEXT:    tail call void @func1()
-; CHECK-V1-NEXT:    br label %[[FINALLY]]
-; CHECK-V1:       [[FINALLY]]:
-; CHECK-V1-NEXT:    [[VAL3:%.*]] = phi <8 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V1-NEXT:    ret <8 x i8> [[VAL3]]
-;
-; CHECK-V2-LABEL: define <8 x i8> @shuffle_v8i8(
-; CHECK-V2-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V2-NEXT:  [[ENTRY:.*:]]
-; CHECK-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V2:       [[THEN]]:
-; CHECK-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-V2-NEXT:    tail call void @func0()
-; CHECK-V2-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V2:       [[ELSE]]:
-; CHECK-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-V2-NEXT:    tail call void @func1()
-; CHECK-V2-NEXT:    br label %[[FINALLY]]
-; CHECK-V2:       [[FINALLY]]:
-; CHECK-V2-NEXT:    [[VAL3:%.*]] = phi <8 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V2-NEXT:    ret <8 x i8> [[VAL3]]
-;
-; CHECK-V3-LABEL: define <8 x i8> @shuffle_v8i8(
-; CHECK-V3-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V3-NEXT:  [[ENTRY:.*:]]
-; CHECK-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V3:       [[THEN]]:
-; CHECK-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-V3-NEXT:    tail call void @func0()
-; CHECK-V3-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V3:       [[ELSE]]:
-; CHECK-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-V3-NEXT:    tail call void @func1()
-; CHECK-V3-NEXT:    br label %[[FINALLY]]
-; CHECK-V3:       [[FINALLY]]:
-; CHECK-V3-NEXT:    [[VAL3:%.*]] = phi <8 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V3-NEXT:    ret <8 x i8> [[VAL3]]
-;
-; CHECK-V4-LABEL: define <8 x i8> @shuffle_v8i8(
-; CHECK-V4-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V4-NEXT:  [[ENTRY:.*:]]
-; CHECK-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V4:       [[THEN]]:
-; CHECK-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-V4-NEXT:    tail call void @func0()
-; CHECK-V4-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V4:       [[ELSE]]:
-; CHECK-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-V4-NEXT:    tail call void @func1()
-; CHECK-V4-NEXT:    br label %[[FINALLY]]
-; CHECK-V4:       [[FINALLY]]:
-; CHECK-V4-NEXT:    [[VAL3:%.*]] = phi <8 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V4-NEXT:    ret <8 x i8> [[VAL3]]
+; CHECK-LABEL: define <8 x i8> @shuffle_v8i8(
+; CHECK-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <8 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <8 x i8> [[VAL3]]
 ;
 entry:
   br i1 %cond, label %then, label %else
@@ -254,69 +110,21 @@ finally:
 }
 
 define <16 x i8> @shuffle_v16i8(<3 x i8> %arg0, i1 %cond) {
-; CHECK-V1-LABEL: define <16 x i8> @shuffle_v16i8(
-; CHECK-V1-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V1-NEXT:  [[ENTRY:.*:]]
-; CHECK-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V1:       [[THEN]]:
-; CHECK-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-V1-NEXT:    tail call void @func0()
-; CHECK-V1-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V1:       [[ELSE]]:
-; CHECK-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-V1-NEXT:    tail call void @func1()
-; CHECK-V1-NEXT:    br label %[[FINALLY]]
-; CHECK-V1:       [[FINALLY]]:
-; CHECK-V1-NEXT:    [[VAL3:%.*]] = phi <16 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V1-NEXT:    ret <16 x i8> [[VAL3]]
-;
-; CHECK-V2-LABEL: define <16 x i8> @shuffle_v16i8(
-; CHECK-V2-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V2-NEXT:  [[ENTRY:.*:]]
-; CHECK-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V2:       [[THEN]]:
-; CHECK-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-V2-NEXT:    tail call void @func0()
-; CHECK-V2-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V2:       [[ELSE]]:
-; CHECK-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-V2-NEXT:    tail call void @func1()
-; CHECK-V2-NEXT:    br label %[[FINALLY]]
-; CHECK-V2:       [[FINALLY]]:
-; CHECK-V2-NEXT:    [[VAL3:%.*]] = phi <16 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V2-NEXT:    ret <16 x i8> [[VAL3]]
-;
-; CHECK-V3-LABEL: define <16 x i8> @shuffle_v16i8(
-; CHECK-V3-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V3-NEXT:  [[ENTRY:.*:]]
-; CHECK-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V3:       [[THEN]]:
-; CHECK-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-V3-NEXT:    tail call void @func0()
-; CHECK-V3-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V3:       [[ELSE]]:
-; CHECK-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-V3-NEXT:    tail call void @func1()
-; CHECK-V3-NEXT:    br label %[[FINALLY]]
-; CHECK-V3:       [[FINALLY]]:
-; CHECK-V3-NEXT:    [[VAL3:%.*]] = phi <16 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V3-NEXT:    ret <16 x i8> [[VAL3]]
-;
-; CHECK-V4-LABEL: define <16 x i8> @shuffle_v16i8(
-; CHECK-V4-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V4-NEXT:  [[ENTRY:.*:]]
-; CHECK-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V4:       [[THEN]]:
-; CHECK-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-V4-NEXT:    tail call void @func0()
-; CHECK-V4-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V4:       [[ELSE]]:
-; CHECK-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-V4-NEXT:    tail call void @func1()
-; CHECK-V4-NEXT:    br label %[[FINALLY]]
-; CHECK-V4:       [[FINALLY]]:
-; CHECK-V4-NEXT:    [[VAL3:%.*]] = phi <16 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V4-NEXT:    ret <16 x i8> [[VAL3]]
+; CHECK-LABEL: define <16 x i8> @shuffle_v16i8(
+; CHECK-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <16 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <16 x i8> [[VAL3]]
 ;
 entry:
   br i1 %cond, label %then, label %else
@@ -337,69 +145,21 @@ finally:
 }
 
 define <32 x i8> @shuffle_v32i8(<3 x i8> %arg0, i1 %cond) {
-; CHECK-V1-LABEL: define <32 x i8> @shuffle_v32i8(
-; CHECK-V1-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V1-NEXT:  [[ENTRY:.*:]]
-; CHECK-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V1:       [[THEN]]:
-; CHECK-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-V1-NEXT:    tail call void @func0()
-; CHECK-V1-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V1:       [[ELSE]]:
-; CHECK-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-V1-NEXT:    tail call void @func1()
-; CHECK-V1-NEXT:    br label %[[FINALLY]]
-; CHECK-V1:       [[FINALLY]]:
-; CHECK-V1-NEXT:    [[VAL3:%.*]] = phi <32 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V1-NEXT:    ret <32 x i8> [[VAL3]]
-;
-; CHECK-V2-LABEL: define <32 x i8> @shuffle_v32i8(
-; CHECK-V2-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V2-NEXT:  [[ENTRY:.*:]]
-; CHECK-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V2:       [[THEN]]:
-; CHECK-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-V2-NEXT:    tail call void @func0()
-; CHECK-V2-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V2:       [[ELSE]]:
-; CHECK-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-V2-NEXT:    tail call void @func1()
-; CHECK-V2-NEXT:    br label %[[FINALLY]]
-; CHECK-V2:       [[FINALLY]]:
-; CHECK-V2-NEXT:    [[VAL3:%.*]] = phi <32 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V2-NEXT:    ret <32 x i8> [[VAL3]]
-;
-; CHECK-V3-LABEL: define <32 x i8> @shuffle_v32i8(
-; CHECK-V3-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V3-NEXT:  [[ENTRY:.*:]]
-; CHECK-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V3:       [[THEN]]:
-; CHECK-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-V3-NEXT:    tail call void @func0()
-; CHECK-V3-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V3:       [[ELSE]]:
-; CHECK-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-V3-NEXT:    tail call void @func1()
-; CHECK-V3-NEXT:    br label %[[FINALLY]]
-; CHECK-V3:       [[FINALLY]]:
-; CHECK-V3-NEXT:    [[VAL3:%.*]] = phi <32 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V3-NEXT:    ret <32 x i8> [[VAL3]]
-;
-; CHECK-V4-LABEL: define <32 x i8> @shuffle_v32i8(
-; CHECK-V4-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V4-NEXT:  [[ENTRY:.*:]]
-; CHECK-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V4:       [[THEN]]:
-; CHECK-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-V4-NEXT:    tail call void @func0()
-; CHECK-V4-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V4:       [[ELSE]]:
-; CHECK-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-V4-NEXT:    tail call void @func1()
-; CHECK-V4-NEXT:    br label %[[FINALLY]]
-; CHECK-V4:       [[FINALLY]]:
-; CHECK-V4-NEXT:    [[VAL3:%.*]] = phi <32 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V4-NEXT:    ret <32 x i8> [[VAL3]]
+; CHECK-LABEL: define <32 x i8> @shuffle_v32i8(
+; CHECK-SAME: <3 x i8> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i8> [[ARG0]], <3 x i8> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <32 x i8> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <32 x i8> [[VAL3]]
 ;
 entry:
   br i1 %cond, label %then, label %else
@@ -420,69 +180,21 @@ finally:
 }
 
 define <2 x i16> @shuffle_v2i16(<2 x i16> %arg0, i1 %cond) {
-; CHECK-V1-LABEL: define <2 x i16> @shuffle_v2i16(
-; CHECK-V1-SAME: <2 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V1-NEXT:  [[ENTRY:.*:]]
-; CHECK-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V1:       [[THEN]]:
-; CHECK-V1-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i16> [[ARG0]], <2 x i16> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-V1-NEXT:    tail call void @func0()
-; CHECK-V1-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V1:       [[ELSE]]:
-; CHECK-V1-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i16> [[ARG0]], <2 x i16> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-V1-NEXT:    tail call void @func1()
-; CHECK-V1-NEXT:    br label %[[FINALLY]]
-; CHECK-V1:       [[FINALLY]]:
-; CHECK-V1-NEXT:    [[VAL3:%.*]] = phi <2 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V1-NEXT:    ret <2 x i16> [[VAL3]]
-;
-; CHECK-V2-LABEL: define <2 x i16> @shuffle_v2i16(
-; CHECK-V2-SAME: <2 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V2-NEXT:  [[ENTRY:.*:]]
-; CHECK-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V2:       [[THEN]]:
-; CHECK-V2-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i16> [[ARG0]], <2 x i16> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-V2-NEXT:    tail call void @func0()
-; CHECK-V2-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V2:       [[ELSE]]:
-; CHECK-V2-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i16> [[ARG0]], <2 x i16> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-V2-NEXT:    tail call void @func1()
-; CHECK-V2-NEXT:    br label %[[FINALLY]]
-; CHECK-V2:       [[FINALLY]]:
-; CHECK-V2-NEXT:    [[VAL3:%.*]] = phi <2 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V2-NEXT:    ret <2 x i16> [[VAL3]]
-;
-; CHECK-V3-LABEL: define <2 x i16> @shuffle_v2i16(
-; CHECK-V3-SAME: <2 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V3-NEXT:  [[ENTRY:.*:]]
-; CHECK-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V3:       [[THEN]]:
-; CHECK-V3-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i16> [[ARG0]], <2 x i16> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-V3-NEXT:    tail call void @func0()
-; CHECK-V3-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V3:       [[ELSE]]:
-; CHECK-V3-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i16> [[ARG0]], <2 x i16> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-V3-NEXT:    tail call void @func1()
-; CHECK-V3-NEXT:    br label %[[FINALLY]]
-; CHECK-V3:       [[FINALLY]]:
-; CHECK-V3-NEXT:    [[VAL3:%.*]] = phi <2 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V3-NEXT:    ret <2 x i16> [[VAL3]]
-;
-; CHECK-V4-LABEL: define <2 x i16> @shuffle_v2i16(
-; CHECK-V4-SAME: <2 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V4-NEXT:  [[ENTRY:.*:]]
-; CHECK-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V4:       [[THEN]]:
-; CHECK-V4-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i16> [[ARG0]], <2 x i16> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-V4-NEXT:    tail call void @func0()
-; CHECK-V4-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V4:       [[ELSE]]:
-; CHECK-V4-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i16> [[ARG0]], <2 x i16> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-V4-NEXT:    tail call void @func1()
-; CHECK-V4-NEXT:    br label %[[FINALLY]]
-; CHECK-V4:       [[FINALLY]]:
-; CHECK-V4-NEXT:    [[VAL3:%.*]] = phi <2 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V4-NEXT:    ret <2 x i16> [[VAL3]]
+; CHECK-LABEL: define <2 x i16> @shuffle_v2i16(
+; CHECK-SAME: <2 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i16> [[ARG0]], <2 x i16> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i16> [[ARG0]], <2 x i16> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <2 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <2 x i16> [[VAL3]]
 ;
 entry:
   br i1 %cond, label %then, label %else
@@ -503,69 +215,21 @@ finally:
 }
 
 define <4 x i16> @shuffle_v4i16(<3 x i16> %arg0, i1 %cond) {
-; CHECK-V1-LABEL: define <4 x i16> @shuffle_v4i16(
-; CHECK-V1-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V1-NEXT:  [[ENTRY:.*:]]
-; CHECK-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V1:       [[THEN]]:
-; CHECK-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
-; CHECK-V1-NEXT:    tail call void @func0()
-; CHECK-V1-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V1:       [[ELSE]]:
-; CHECK-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-; CHECK-V1-NEXT:    tail call void @func1()
-; CHECK-V1-NEXT:    br label %[[FINALLY]]
-; CHECK-V1:       [[FINALLY]]:
-; CHECK-V1-NEXT:    [[VAL3:%.*]] = phi <4 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V1-NEXT:    ret <4 x i16> [[VAL3]]
-;
-; CHECK-V2-LABEL: define <4 x i16> @shuffle_v4i16(
-; CHECK-V2-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V2-NEXT:  [[ENTRY:.*:]]
-; CHECK-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V2:       [[THEN]]:
-; CHECK-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
-; CHECK-V2-NEXT:    tail call void @func0()
-; CHECK-V2-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V2:       [[ELSE]]:
-; CHECK-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-; CHECK-V2-NEXT:    tail call void @func1()
-; CHECK-V2-NEXT:    br label %[[FINALLY]]
-; CHECK-V2:       [[FINALLY]]:
-; CHECK-V2-NEXT:    [[VAL3:%.*]] = phi <4 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V2-NEXT:    ret <4 x i16> [[VAL3]]
-;
-; CHECK-V3-LABEL: define <4 x i16> @shuffle_v4i16(
-; CHECK-V3-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V3-NEXT:  [[ENTRY:.*:]]
-; CHECK-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V3:       [[THEN]]:
-; CHECK-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
-; CHECK-V3-NEXT:    tail call void @func0()
-; CHECK-V3-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V3:       [[ELSE]]:
-; CHECK-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-; CHECK-V3-NEXT:    tail call void @func1()
-; CHECK-V3-NEXT:    br label %[[FINALLY]]
-; CHECK-V3:       [[FINALLY]]:
-; CHECK-V3-NEXT:    [[VAL3:%.*]] = phi <4 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V3-NEXT:    ret <4 x i16> [[VAL3]]
-;
-; CHECK-V4-LABEL: define <4 x i16> @shuffle_v4i16(
-; CHECK-V4-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V4-NEXT:  [[ENTRY:.*:]]
-; CHECK-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V4:       [[THEN]]:
-; CHECK-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
-; CHECK-V4-NEXT:    tail call void @func0()
-; CHECK-V4-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V4:       [[ELSE]]:
-; CHECK-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-; CHECK-V4-NEXT:    tail call void @func1()
-; CHECK-V4-NEXT:    br label %[[FINALLY]]
-; CHECK-V4:       [[FINALLY]]:
-; CHECK-V4-NEXT:    [[VAL3:%.*]] = phi <4 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V4-NEXT:    ret <4 x i16> [[VAL3]]
+; CHECK-LABEL: define <4 x i16> @shuffle_v4i16(
+; CHECK-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <4 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <4 x i16> [[VAL3]]
 ;
 entry:
   br i1 %cond, label %then, label %else
@@ -586,69 +250,21 @@ finally:
 }
 
 define <8 x i16> @shuffle_v8i16(<3 x i16> %arg0, i1 %cond) {
-; CHECK-V1-LABEL: define <8 x i16> @shuffle_v8i16(
-; CHECK-V1-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V1-NEXT:  [[ENTRY:.*:]]
-; CHECK-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V1:       [[THEN]]:
-; CHECK-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-V1-NEXT:    tail call void @func0()
-; CHECK-V1-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V1:       [[ELSE]]:
-; CHECK-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-V1-NEXT:    tail call void @func1()
-; CHECK-V1-NEXT:    br label %[[FINALLY]]
-; CHECK-V1:       [[FINALLY]]:
-; CHECK-V1-NEXT:    [[VAL3:%.*]] = phi <8 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V1-NEXT:    ret <8 x i16> [[VAL3]]
-;
-; CHECK-V2-LABEL: define <8 x i16> @shuffle_v8i16(
-; CHECK-V2-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V2-NEXT:  [[ENTRY:.*:]]
-; CHECK-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V2:       [[THEN]]:
-; CHECK-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-V2-NEXT:    tail call void @func0()
-; CHECK-V2-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V2:       [[ELSE]]:
-; CHECK-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-V2-NEXT:    tail call void @func1()
-; CHECK-V2-NEXT:    br label %[[FINALLY]]
-; CHECK-V2:       [[FINALLY]]:
-; CHECK-V2-NEXT:    [[VAL3:%.*]] = phi <8 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V2-NEXT:    ret <8 x i16> [[VAL3]]
-;
-; CHECK-V3-LABEL: define <8 x i16> @shuffle_v8i16(
-; CHECK-V3-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V3-NEXT:  [[ENTRY:.*:]]
-; CHECK-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V3:       [[THEN]]:
-; CHECK-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-V3-NEXT:    tail call void @func0()
-; CHECK-V3-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V3:       [[ELSE]]:
-; CHECK-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-V3-NEXT:    tail call void @func1()
-; CHECK-V3-NEXT:    br label %[[FINALLY]]
-; CHECK-V3:       [[FINALLY]]:
-; CHECK-V3-NEXT:    [[VAL3:%.*]] = phi <8 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V3-NEXT:    ret <8 x i16> [[VAL3]]
-;
-; CHECK-V4-LABEL: define <8 x i16> @shuffle_v8i16(
-; CHECK-V4-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V4-NEXT:  [[ENTRY:.*:]]
-; CHECK-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V4:       [[THEN]]:
-; CHECK-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-V4-NEXT:    tail call void @func0()
-; CHECK-V4-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V4:       [[ELSE]]:
-; CHECK-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-V4-NEXT:    tail call void @func1()
-; CHECK-V4-NEXT:    br label %[[FINALLY]]
-; CHECK-V4:       [[FINALLY]]:
-; CHECK-V4-NEXT:    [[VAL3:%.*]] = phi <8 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V4-NEXT:    ret <8 x i16> [[VAL3]]
+; CHECK-LABEL: define <8 x i16> @shuffle_v8i16(
+; CHECK-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <8 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <8 x i16> [[VAL3]]
 ;
 entry:
   br i1 %cond, label %then, label %else
@@ -669,69 +285,21 @@ finally:
 }
 
 define <16 x i16> @shuffle_v16i16(<3 x i16> %arg0, i1 %cond) {
-; CHECK-V1-LABEL: define <16 x i16> @shuffle_v16i16(
-; CHECK-V1-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V1-NEXT:  [[ENTRY:.*:]]
-; CHECK-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V1:       [[THEN]]:
-; CHECK-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-V1-NEXT:    tail call void @func0()
-; CHECK-V1-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V1:       [[ELSE]]:
-; CHECK-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-V1-NEXT:    tail call void @func1()
-; CHECK-V1-NEXT:    br label %[[FINALLY]]
-; CHECK-V1:       [[FINALLY]]:
-; CHECK-V1-NEXT:    [[VAL3:%.*]] = phi <16 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V1-NEXT:    ret <16 x i16> [[VAL3]]
-;
-; CHECK-V2-LABEL: define <16 x i16> @shuffle_v16i16(
-; CHECK-V2-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V2-NEXT:  [[ENTRY:.*:]]
-; CHECK-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V2:       [[THEN]]:
-; CHECK-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-V2-NEXT:    tail call void @func0()
-; CHECK-V2-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V2:       [[ELSE]]:
-; CHECK-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-V2-NEXT:    tail call void @func1()
-; CHECK-V2-NEXT:    br label %[[FINALLY]]
-; CHECK-V2:       [[FINALLY]]:
-; CHECK-V2-NEXT:    [[VAL3:%.*]] = phi <16 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V2-NEXT:    ret <16 x i16> [[VAL3]]
-;
-; CHECK-V3-LABEL: define <16 x i16> @shuffle_v16i16(
-; CHECK-V3-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V3-NEXT:  [[ENTRY:.*:]]
-; CHECK-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V3:       [[THEN]]:
-; CHECK-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-V3-NEXT:    tail call void @func0()
-; CHECK-V3-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V3:       [[ELSE]]:
-; CHECK-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-V3-NEXT:    tail call void @func1()
-; CHECK-V3-NEXT:    br label %[[FINALLY]]
-; CHECK-V3:       [[FINALLY]]:
-; CHECK-V3-NEXT:    [[VAL3:%.*]] = phi <16 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V3-NEXT:    ret <16 x i16> [[VAL3]]
-;
-; CHECK-V4-LABEL: define <16 x i16> @shuffle_v16i16(
-; CHECK-V4-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V4-NEXT:  [[ENTRY:.*:]]
-; CHECK-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V4:       [[THEN]]:
-; CHECK-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-V4-NEXT:    tail call void @func0()
-; CHECK-V4-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V4:       [[ELSE]]:
-; CHECK-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-V4-NEXT:    tail call void @func1()
-; CHECK-V4-NEXT:    br label %[[FINALLY]]
-; CHECK-V4:       [[FINALLY]]:
-; CHECK-V4-NEXT:    [[VAL3:%.*]] = phi <16 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V4-NEXT:    ret <16 x i16> [[VAL3]]
+; CHECK-LABEL: define <16 x i16> @shuffle_v16i16(
+; CHECK-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <16 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <16 x i16> [[VAL3]]
 ;
 entry:
   br i1 %cond, label %then, label %else
@@ -752,69 +320,21 @@ finally:
 }
 
 define <32 x i16> @shuffle_v32i16(<3 x i16> %arg0, i1 %cond) {
-; CHECK-V1-LABEL: define <32 x i16> @shuffle_v32i16(
-; CHECK-V1-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V1-NEXT:  [[ENTRY:.*:]]
-; CHECK-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V1:       [[THEN]]:
-; CHECK-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-V1-NEXT:    tail call void @func0()
-; CHECK-V1-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V1:       [[ELSE]]:
-; CHECK-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-V1-NEXT:    tail call void @func1()
-; CHECK-V1-NEXT:    br label %[[FINALLY]]
-; CHECK-V1:       [[FINALLY]]:
-; CHECK-V1-NEXT:    [[VAL3:%.*]] = phi <32 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V1-NEXT:    ret <32 x i16> [[VAL3]]
-;
-; CHECK-V2-LABEL: define <32 x i16> @shuffle_v32i16(
-; CHECK-V2-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V2-NEXT:  [[ENTRY:.*:]]
-; CHECK-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V2:       [[THEN]]:
-; CHECK-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-V2-NEXT:    tail call void @func0()
-; CHECK-V2-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V2:       [[ELSE]]:
-; CHECK-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-V2-NEXT:    tail call void @func1()
-; CHECK-V2-NEXT:    br label %[[FINALLY]]
-; CHECK-V2:       [[FINALLY]]:
-; CHECK-V2-NEXT:    [[VAL3:%.*]] = phi <32 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V2-NEXT:    ret <32 x i16> [[VAL3]]
-;
-; CHECK-V3-LABEL: define <32 x i16> @shuffle_v32i16(
-; CHECK-V3-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V3-NEXT:  [[ENTRY:.*:]]
-; CHECK-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V3:       [[THEN]]:
-; CHECK-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-V3-NEXT:    tail call void @func0()
-; CHECK-V3-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V3:       [[ELSE]]:
-; CHECK-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-V3-NEXT:    tail call void @func1()
-; CHECK-V3-NEXT:    br label %[[FINALLY]]
-; CHECK-V3:       [[FINALLY]]:
-; CHECK-V3-NEXT:    [[VAL3:%.*]] = phi <32 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V3-NEXT:    ret <32 x i16> [[VAL3]]
-;
-; CHECK-V4-LABEL: define <32 x i16> @shuffle_v32i16(
-; CHECK-V4-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V4-NEXT:  [[ENTRY:.*:]]
-; CHECK-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V4:       [[THEN]]:
-; CHECK-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-V4-NEXT:    tail call void @func0()
-; CHECK-V4-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V4:       [[ELSE]]:
-; CHECK-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-V4-NEXT:    tail call void @func1()
-; CHECK-V4-NEXT:    br label %[[FINALLY]]
-; CHECK-V4:       [[FINALLY]]:
-; CHECK-V4-NEXT:    [[VAL3:%.*]] = phi <32 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V4-NEXT:    ret <32 x i16> [[VAL3]]
+; CHECK-LABEL: define <32 x i16> @shuffle_v32i16(
+; CHECK-SAME: <3 x i16> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i16> [[ARG0]], <3 x i16> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <32 x i16> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <32 x i16> [[VAL3]]
 ;
 entry:
   br i1 %cond, label %then, label %else
@@ -835,69 +355,21 @@ finally:
 }
 
 define <2 x i32> @shuffle_v2i32(<2 x i32> %arg0, i1 %cond) {
-; CHECK-V1-LABEL: define <2 x i32> @shuffle_v2i32(
-; CHECK-V1-SAME: <2 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V1-NEXT:  [[ENTRY:.*:]]
-; CHECK-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V1:       [[THEN]]:
-; CHECK-V1-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i32> [[ARG0]], <2 x i32> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-V1-NEXT:    tail call void @func0()
-; CHECK-V1-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V1:       [[ELSE]]:
-; CHECK-V1-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i32> [[ARG0]], <2 x i32> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-V1-NEXT:    tail call void @func1()
-; CHECK-V1-NEXT:    br label %[[FINALLY]]
-; CHECK-V1:       [[FINALLY]]:
-; CHECK-V1-NEXT:    [[VAL3:%.*]] = phi <2 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V1-NEXT:    ret <2 x i32> [[VAL3]]
-;
-; CHECK-V2-LABEL: define <2 x i32> @shuffle_v2i32(
-; CHECK-V2-SAME: <2 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V2-NEXT:  [[ENTRY:.*:]]
-; CHECK-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V2:       [[THEN]]:
-; CHECK-V2-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i32> [[ARG0]], <2 x i32> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-V2-NEXT:    tail call void @func0()
-; CHECK-V2-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V2:       [[ELSE]]:
-; CHECK-V2-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i32> [[ARG0]], <2 x i32> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-V2-NEXT:    tail call void @func1()
-; CHECK-V2-NEXT:    br label %[[FINALLY]]
-; CHECK-V2:       [[FINALLY]]:
-; CHECK-V2-NEXT:    [[VAL3:%.*]] = phi <2 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V2-NEXT:    ret <2 x i32> [[VAL3]]
-;
-; CHECK-V3-LABEL: define <2 x i32> @shuffle_v2i32(
-; CHECK-V3-SAME: <2 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V3-NEXT:  [[ENTRY:.*:]]
-; CHECK-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V3:       [[THEN]]:
-; CHECK-V3-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i32> [[ARG0]], <2 x i32> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-V3-NEXT:    tail call void @func0()
-; CHECK-V3-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V3:       [[ELSE]]:
-; CHECK-V3-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i32> [[ARG0]], <2 x i32> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-V3-NEXT:    tail call void @func1()
-; CHECK-V3-NEXT:    br label %[[FINALLY]]
-; CHECK-V3:       [[FINALLY]]:
-; CHECK-V3-NEXT:    [[VAL3:%.*]] = phi <2 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V3-NEXT:    ret <2 x i32> [[VAL3]]
-;
-; CHECK-V4-LABEL: define <2 x i32> @shuffle_v2i32(
-; CHECK-V4-SAME: <2 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V4-NEXT:  [[ENTRY:.*:]]
-; CHECK-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V4:       [[THEN]]:
-; CHECK-V4-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i32> [[ARG0]], <2 x i32> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-V4-NEXT:    tail call void @func0()
-; CHECK-V4-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V4:       [[ELSE]]:
-; CHECK-V4-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i32> [[ARG0]], <2 x i32> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-V4-NEXT:    tail call void @func1()
-; CHECK-V4-NEXT:    br label %[[FINALLY]]
-; CHECK-V4:       [[FINALLY]]:
-; CHECK-V4-NEXT:    [[VAL3:%.*]] = phi <2 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V4-NEXT:    ret <2 x i32> [[VAL3]]
+; CHECK-LABEL: define <2 x i32> @shuffle_v2i32(
+; CHECK-SAME: <2 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <2 x i32> [[ARG0]], <2 x i32> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <2 x i32> [[ARG0]], <2 x i32> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <2 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <2 x i32> [[VAL3]]
 ;
 entry:
   br i1 %cond, label %then, label %else
@@ -918,69 +390,21 @@ finally:
 }
 
 define <4 x i32> @shuffle_v4i32(<3 x i32> %arg0, i1 %cond) {
-; CHECK-V1-LABEL: define <4 x i32> @shuffle_v4i32(
-; CHECK-V1-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V1-NEXT:  [[ENTRY:.*:]]
-; CHECK-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V1:       [[THEN]]:
-; CHECK-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
-; CHECK-V1-NEXT:    tail call void @func0()
-; CHECK-V1-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V1:       [[ELSE]]:
-; CHECK-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-; CHECK-V1-NEXT:    tail call void @func1()
-; CHECK-V1-NEXT:    br label %[[FINALLY]]
-; CHECK-V1:       [[FINALLY]]:
-; CHECK-V1-NEXT:    [[VAL3:%.*]] = phi <4 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V1-NEXT:    ret <4 x i32> [[VAL3]]
-;
-; CHECK-V2-LABEL: define <4 x i32> @shuffle_v4i32(
-; CHECK-V2-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V2-NEXT:  [[ENTRY:.*:]]
-; CHECK-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V2:       [[THEN]]:
-; CHECK-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
-; CHECK-V2-NEXT:    tail call void @func0()
-; CHECK-V2-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V2:       [[ELSE]]:
-; CHECK-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-; CHECK-V2-NEXT:    tail call void @func1()
-; CHECK-V2-NEXT:    br label %[[FINALLY]]
-; CHECK-V2:       [[FINALLY]]:
-; CHECK-V2-NEXT:    [[VAL3:%.*]] = phi <4 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V2-NEXT:    ret <4 x i32> [[VAL3]]
-;
-; CHECK-V3-LABEL: define <4 x i32> @shuffle_v4i32(
-; CHECK-V3-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V3-NEXT:  [[ENTRY:.*:]]
-; CHECK-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V3:       [[THEN]]:
-; CHECK-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
-; CHECK-V3-NEXT:    tail call void @func0()
-; CHECK-V3-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V3:       [[ELSE]]:
-; CHECK-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-; CHECK-V3-NEXT:    tail call void @func1()
-; CHECK-V3-NEXT:    br label %[[FINALLY]]
-; CHECK-V3:       [[FINALLY]]:
-; CHECK-V3-NEXT:    [[VAL3:%.*]] = phi <4 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V3-NEXT:    ret <4 x i32> [[VAL3]]
-;
-; CHECK-V4-LABEL: define <4 x i32> @shuffle_v4i32(
-; CHECK-V4-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V4-NEXT:  [[ENTRY:.*:]]
-; CHECK-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V4:       [[THEN]]:
-; CHECK-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
-; CHECK-V4-NEXT:    tail call void @func0()
-; CHECK-V4-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V4:       [[ELSE]]:
-; CHECK-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-; CHECK-V4-NEXT:    tail call void @func1()
-; CHECK-V4-NEXT:    br label %[[FINALLY]]
-; CHECK-V4:       [[FINALLY]]:
-; CHECK-V4-NEXT:    [[VAL3:%.*]] = phi <4 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V4-NEXT:    ret <4 x i32> [[VAL3]]
+; CHECK-LABEL: define <4 x i32> @shuffle_v4i32(
+; CHECK-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <4 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <4 x i32> [[VAL3]]
 ;
 entry:
   br i1 %cond, label %then, label %else
@@ -1001,69 +425,21 @@ finally:
 }
 
 define <8 x i32> @shuffle_v8i32(<3 x i32> %arg0, i1 %cond) {
-; CHECK-V1-LABEL: define <8 x i32> @shuffle_v8i32(
-; CHECK-V1-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V1-NEXT:  [[ENTRY:.*:]]
-; CHECK-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V1:       [[THEN]]:
-; CHECK-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-V1-NEXT:    tail call void @func0()
-; CHECK-V1-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V1:       [[ELSE]]:
-; CHECK-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-V1-NEXT:    tail call void @func1()
-; CHECK-V1-NEXT:    br label %[[FINALLY]]
-; CHECK-V1:       [[FINALLY]]:
-; CHECK-V1-NEXT:    [[VAL3:%.*]] = phi <8 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V1-NEXT:    ret <8 x i32> [[VAL3]]
-;
-; CHECK-V2-LABEL: define <8 x i32> @shuffle_v8i32(
-; CHECK-V2-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V2-NEXT:  [[ENTRY:.*:]]
-; CHECK-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V2:       [[THEN]]:
-; CHECK-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-V2-NEXT:    tail call void @func0()
-; CHECK-V2-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V2:       [[ELSE]]:
-; CHECK-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-V2-NEXT:    tail call void @func1()
-; CHECK-V2-NEXT:    br label %[[FINALLY]]
-; CHECK-V2:       [[FINALLY]]:
-; CHECK-V2-NEXT:    [[VAL3:%.*]] = phi <8 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V2-NEXT:    ret <8 x i32> [[VAL3]]
-;
-; CHECK-V3-LABEL: define <8 x i32> @shuffle_v8i32(
-; CHECK-V3-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V3-NEXT:  [[ENTRY:.*:]]
-; CHECK-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V3:       [[THEN]]:
-; CHECK-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-V3-NEXT:    tail call void @func0()
-; CHECK-V3-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V3:       [[ELSE]]:
-; CHECK-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-V3-NEXT:    tail call void @func1()
-; CHECK-V3-NEXT:    br label %[[FINALLY]]
-; CHECK-V3:       [[FINALLY]]:
-; CHECK-V3-NEXT:    [[VAL3:%.*]] = phi <8 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V3-NEXT:    ret <8 x i32> [[VAL3]]
-;
-; CHECK-V4-LABEL: define <8 x i32> @shuffle_v8i32(
-; CHECK-V4-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V4-NEXT:  [[ENTRY:.*:]]
-; CHECK-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V4:       [[THEN]]:
-; CHECK-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-V4-NEXT:    tail call void @func0()
-; CHECK-V4-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V4:       [[ELSE]]:
-; CHECK-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-V4-NEXT:    tail call void @func1()
-; CHECK-V4-NEXT:    br label %[[FINALLY]]
-; CHECK-V4:       [[FINALLY]]:
-; CHECK-V4-NEXT:    [[VAL3:%.*]] = phi <8 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V4-NEXT:    ret <8 x i32> [[VAL3]]
+; CHECK-LABEL: define <8 x i32> @shuffle_v8i32(
+; CHECK-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <8 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <8 x i32> [[VAL3]]
 ;
 entry:
   br i1 %cond, label %then, label %else
@@ -1084,69 +460,21 @@ finally:
 }
 
 define <16 x i32> @shuffle_v16i32(<3 x i32> %arg0, i1 %cond) {
-; CHECK-V1-LABEL: define <16 x i32> @shuffle_v16i32(
-; CHECK-V1-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V1-NEXT:  [[ENTRY:.*:]]
-; CHECK-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V1:       [[THEN]]:
-; CHECK-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-V1-NEXT:    tail call void @func0()
-; CHECK-V1-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V1:       [[ELSE]]:
-; CHECK-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-V1-NEXT:    tail call void @func1()
-; CHECK-V1-NEXT:    br label %[[FINALLY]]
-; CHECK-V1:       [[FINALLY]]:
-; CHECK-V1-NEXT:    [[VAL3:%.*]] = phi <16 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V1-NEXT:    ret <16 x i32> [[VAL3]]
-;
-; CHECK-V2-LABEL: define <16 x i32> @shuffle_v16i32(
-; CHECK-V2-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V2-NEXT:  [[ENTRY:.*:]]
-; CHECK-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V2:       [[THEN]]:
-; CHECK-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-V2-NEXT:    tail call void @func0()
-; CHECK-V2-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V2:       [[ELSE]]:
-; CHECK-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-V2-NEXT:    tail call void @func1()
-; CHECK-V2-NEXT:    br label %[[FINALLY]]
-; CHECK-V2:       [[FINALLY]]:
-; CHECK-V2-NEXT:    [[VAL3:%.*]] = phi <16 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V2-NEXT:    ret <16 x i32> [[VAL3]]
-;
-; CHECK-V3-LABEL: define <16 x i32> @shuffle_v16i32(
-; CHECK-V3-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V3-NEXT:  [[ENTRY:.*:]]
-; CHECK-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V3:       [[THEN]]:
-; CHECK-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-V3-NEXT:    tail call void @func0()
-; CHECK-V3-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V3:       [[ELSE]]:
-; CHECK-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-V3-NEXT:    tail call void @func1()
-; CHECK-V3-NEXT:    br label %[[FINALLY]]
-; CHECK-V3:       [[FINALLY]]:
-; CHECK-V3-NEXT:    [[VAL3:%.*]] = phi <16 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V3-NEXT:    ret <16 x i32> [[VAL3]]
-;
-; CHECK-V4-LABEL: define <16 x i32> @shuffle_v16i32(
-; CHECK-V4-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V4-NEXT:  [[ENTRY:.*:]]
-; CHECK-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V4:       [[THEN]]:
-; CHECK-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-V4-NEXT:    tail call void @func0()
-; CHECK-V4-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V4:       [[ELSE]]:
-; CHECK-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-V4-NEXT:    tail call void @func1()
-; CHECK-V4-NEXT:    br label %[[FINALLY]]
-; CHECK-V4:       [[FINALLY]]:
-; CHECK-V4-NEXT:    [[VAL3:%.*]] = phi <16 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V4-NEXT:    ret <16 x i32> [[VAL3]]
+; CHECK-LABEL: define <16 x i32> @shuffle_v16i32(
+; CHECK-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <16 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <16 x i32> [[VAL3]]
 ;
 entry:
   br i1 %cond, label %then, label %else
@@ -1167,69 +495,21 @@ finally:
 }
 
 define <32 x i32> @shuffle_v32i32(<3 x i32> %arg0, i1 %cond) {
-; CHECK-V1-LABEL: define <32 x i32> @shuffle_v32i32(
-; CHECK-V1-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V1-NEXT:  [[ENTRY:.*:]]
-; CHECK-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V1:       [[THEN]]:
-; CHECK-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-V1-NEXT:    tail call void @func0()
-; CHECK-V1-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V1:       [[ELSE]]:
-; CHECK-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-V1-NEXT:    tail call void @func1()
-; CHECK-V1-NEXT:    br label %[[FINALLY]]
-; CHECK-V1:       [[FINALLY]]:
-; CHECK-V1-NEXT:    [[VAL3:%.*]] = phi <32 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V1-NEXT:    ret <32 x i32> [[VAL3]]
-;
-; CHECK-V2-LABEL: define <32 x i32> @shuffle_v32i32(
-; CHECK-V2-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V2-NEXT:  [[ENTRY:.*:]]
-; CHECK-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V2:       [[THEN]]:
-; CHECK-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-V2-NEXT:    tail call void @func0()
-; CHECK-V2-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V2:       [[ELSE]]:
-; CHECK-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-V2-NEXT:    tail call void @func1()
-; CHECK-V2-NEXT:    br label %[[FINALLY]]
-; CHECK-V2:       [[FINALLY]]:
-; CHECK-V2-NEXT:    [[VAL3:%.*]] = phi <32 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V2-NEXT:    ret <32 x i32> [[VAL3]]
-;
-; CHECK-V3-LABEL: define <32 x i32> @shuffle_v32i32(
-; CHECK-V3-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V3-NEXT:  [[ENTRY:.*:]]
-; CHECK-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V3:       [[THEN]]:
-; CHECK-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-V3-NEXT:    tail call void @func0()
-; CHECK-V3-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V3:       [[ELSE]]:
-; CHECK-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-V3-NEXT:    tail call void @func1()
-; CHECK-V3-NEXT:    br label %[[FINALLY]]
-; CHECK-V3:       [[FINALLY]]:
-; CHECK-V3-NEXT:    [[VAL3:%.*]] = phi <32 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V3-NEXT:    ret <32 x i32> [[VAL3]]
-;
-; CHECK-V4-LABEL: define <32 x i32> @shuffle_v32i32(
-; CHECK-V4-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V4-NEXT:  [[ENTRY:.*:]]
-; CHECK-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V4:       [[THEN]]:
-; CHECK-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-V4-NEXT:    tail call void @func0()
-; CHECK-V4-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V4:       [[ELSE]]:
-; CHECK-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-V4-NEXT:    tail call void @func1()
-; CHECK-V4-NEXT:    br label %[[FINALLY]]
-; CHECK-V4:       [[FINALLY]]:
-; CHECK-V4-NEXT:    [[VAL3:%.*]] = phi <32 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V4-NEXT:    ret <32 x i32> [[VAL3]]
+; CHECK-LABEL: define <32 x i32> @shuffle_v32i32(
+; CHECK-SAME: <3 x i32> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x i32> [[ARG0]], <3 x i32> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <32 x i32> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <32 x i32> [[VAL3]]
 ;
 entry:
   br i1 %cond, label %then, label %else
@@ -1250,69 +530,21 @@ finally:
 }
 
 define <2 x bfloat> @shuffle_v2bf16(<2 x bfloat> %arg0, i1 %cond) {
-; CHECK-V1-LABEL: define <2 x bfloat> @shuffle_v2bf16(
-; CHECK-V1-SAME: <2 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V1-NEXT:  [[ENTRY:.*:]]
-; CHECK-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V1:       [[THEN]]:
-; CHECK-V1-NEXT:    [[VAL1:%.*]] = shufflevector <2 x bfloat> [[ARG0]], <2 x bfloat> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-V1-NEXT:    tail call void @func0()
-; CHECK-V1-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V1:       [[ELSE]]:
-; CHECK-V1-NEXT:    [[VAL2:%.*]] = shufflevector <2 x bfloat> [[ARG0]], <2 x bfloat> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-V1-NEXT:    tail call void @func1()
-; CHECK-V1-NEXT:    br label %[[FINALLY]]
-; CHECK-V1:       [[FINALLY]]:
-; CHECK-V1-NEXT:    [[VAL3:%.*]] = phi <2 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V1-NEXT:    ret <2 x bfloat> [[VAL3]]
-;
-; CHECK-V2-LABEL: define <2 x bfloat> @shuffle_v2bf16(
-; CHECK-V2-SAME: <2 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V2-NEXT:  [[ENTRY:.*:]]
-; CHECK-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V2:       [[THEN]]:
-; CHECK-V2-NEXT:    [[VAL1:%.*]] = shufflevector <2 x bfloat> [[ARG0]], <2 x bfloat> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-V2-NEXT:    tail call void @func0()
-; CHECK-V2-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V2:       [[ELSE]]:
-; CHECK-V2-NEXT:    [[VAL2:%.*]] = shufflevector <2 x bfloat> [[ARG0]], <2 x bfloat> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-V2-NEXT:    tail call void @func1()
-; CHECK-V2-NEXT:    br label %[[FINALLY]]
-; CHECK-V2:       [[FINALLY]]:
-; CHECK-V2-NEXT:    [[VAL3:%.*]] = phi <2 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V2-NEXT:    ret <2 x bfloat> [[VAL3]]
-;
-; CHECK-V3-LABEL: define <2 x bfloat> @shuffle_v2bf16(
-; CHECK-V3-SAME: <2 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V3-NEXT:  [[ENTRY:.*:]]
-; CHECK-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V3:       [[THEN]]:
-; CHECK-V3-NEXT:    [[VAL1:%.*]] = shufflevector <2 x bfloat> [[ARG0]], <2 x bfloat> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-V3-NEXT:    tail call void @func0()
-; CHECK-V3-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V3:       [[ELSE]]:
-; CHECK-V3-NEXT:    [[VAL2:%.*]] = shufflevector <2 x bfloat> [[ARG0]], <2 x bfloat> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-V3-NEXT:    tail call void @func1()
-; CHECK-V3-NEXT:    br label %[[FINALLY]]
-; CHECK-V3:       [[FINALLY]]:
-; CHECK-V3-NEXT:    [[VAL3:%.*]] = phi <2 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V3-NEXT:    ret <2 x bfloat> [[VAL3]]
-;
-; CHECK-V4-LABEL: define <2 x bfloat> @shuffle_v2bf16(
-; CHECK-V4-SAME: <2 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V4-NEXT:  [[ENTRY:.*:]]
-; CHECK-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V4:       [[THEN]]:
-; CHECK-V4-NEXT:    [[VAL1:%.*]] = shufflevector <2 x bfloat> [[ARG0]], <2 x bfloat> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-V4-NEXT:    tail call void @func0()
-; CHECK-V4-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V4:       [[ELSE]]:
-; CHECK-V4-NEXT:    [[VAL2:%.*]] = shufflevector <2 x bfloat> [[ARG0]], <2 x bfloat> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-V4-NEXT:    tail call void @func1()
-; CHECK-V4-NEXT:    br label %[[FINALLY]]
-; CHECK-V4:       [[FINALLY]]:
-; CHECK-V4-NEXT:    [[VAL3:%.*]] = phi <2 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V4-NEXT:    ret <2 x bfloat> [[VAL3]]
+; CHECK-LABEL: define <2 x bfloat> @shuffle_v2bf16(
+; CHECK-SAME: <2 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <2 x bfloat> [[ARG0]], <2 x bfloat> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <2 x bfloat> [[ARG0]], <2 x bfloat> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <2 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <2 x bfloat> [[VAL3]]
 ;
 entry:
   br i1 %cond, label %then, label %else
@@ -1333,69 +565,21 @@ finally:
 }
 
 define <3 x bfloat> @shuffle_v3bf16(<3 x bfloat> %arg0, i1 %cond) {
-; CHECK-V1-LABEL: define <3 x bfloat> @shuffle_v3bf16(
-; CHECK-V1-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V1-NEXT:  [[ENTRY:.*:]]
-; CHECK-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V1:       [[THEN]]:
-; CHECK-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 1, i32 1>
-; CHECK-V1-NEXT:    tail call void @func0()
-; CHECK-V1-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V1:       [[ELSE]]:
-; CHECK-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 2, i32 2, i32 2>
-; CHECK-V1-NEXT:    tail call void @func1()
-; CHECK-V1-NEXT:    br label %[[FINALLY]]
-; CHECK-V1:       [[FINALLY]]:
-; CHECK-V1-NEXT:    [[VAL3:%.*]] = phi <3 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V1-NEXT:    ret <3 x bfloat> [[VAL3]]
-;
-; CHECK-V2-LABEL: define <3 x bfloat> @shuffle_v3bf16(
-; CHECK-V2-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V2-NEXT:  [[ENTRY:.*:]]
-; CHECK-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V2:       [[THEN]]:
-; CHECK-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 1, i32 1>
-; CHECK-V2-NEXT:    tail call void @func0()
-; CHECK-V2-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V2:       [[ELSE]]:
-; CHECK-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 2, i32 2, i32 2>
-; CHECK-V2-NEXT:    tail call void @func1()
-; CHECK-V2-NEXT:    br label %[[FINALLY]]
-; CHECK-V2:       [[FINALLY]]:
-; CHECK-V2-NEXT:    [[VAL3:%.*]] = phi <3 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V2-NEXT:    ret <3 x bfloat> [[VAL3]]
-;
-; CHECK-V3-LABEL: define <3 x bfloat> @shuffle_v3bf16(
-; CHECK-V3-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V3-NEXT:  [[ENTRY:.*:]]
-; CHECK-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V3:       [[THEN]]:
-; CHECK-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 1, i32 1>
-; CHECK-V3-NEXT:    tail call void @func0()
-; CHECK-V3-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V3:       [[ELSE]]:
-; CHECK-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 2, i32 2, i32 2>
-; CHECK-V3-NEXT:    tail call void @func1()
-; CHECK-V3-NEXT:    br label %[[FINALLY]]
-; CHECK-V3:       [[FINALLY]]:
-; CHECK-V3-NEXT:    [[VAL3:%.*]] = phi <3 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V3-NEXT:    ret <3 x bfloat> [[VAL3]]
-;
-; CHECK-V4-LABEL: define <3 x bfloat> @shuffle_v3bf16(
-; CHECK-V4-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V4-NEXT:  [[ENTRY:.*:]]
-; CHECK-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V4:       [[THEN]]:
-; CHECK-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 1, i32 1>
-; CHECK-V4-NEXT:    tail call void @func0()
-; CHECK-V4-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V4:       [[ELSE]]:
-; CHECK-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 2, i32 2, i32 2>
-; CHECK-V4-NEXT:    tail call void @func1()
-; CHECK-V4-NEXT:    br label %[[FINALLY]]
-; CHECK-V4:       [[FINALLY]]:
-; CHECK-V4-NEXT:    [[VAL3:%.*]] = phi <3 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V4-NEXT:    ret <3 x bfloat> [[VAL3]]
+; CHECK-LABEL: define <3 x bfloat> @shuffle_v3bf16(
+; CHECK-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <3 x bfloat> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <3 x bfloat> [[VAL3]]
 ;
 entry:
   br i1 %cond, label %then, label %else
@@ -1416,69 +600,21 @@ finally:
 }
 
 define <4 x bfloat> @shuffle_v4bf16(<3 x bfloat> %arg0, i1 %cond) {
-; CHECK-V1-LABEL: define <4 x bfloat> @shuffle_v4bf16(
-; CHECK-V1-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V1-NEXT:  [[ENTRY:.*:]]
-; CHECK-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V1:       [[THEN]]:
-; CHECK-V1-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
-; CHECK-V1-NEXT:    tail call void @func0()
-; CHECK-V1-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V1:       [[ELSE]]:
-; CHECK-V1-NEXT:    tail call void @func1()
-; CHECK-V1-NEXT:    br label %[[FINALLY]]
-; CHECK-V1:       [[FINALLY]]:
-; CHECK-V1-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
-; CHECK-V1-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-; CHECK-V1-NEXT:    ret <4 x bfloat> [[VAL3]]
-;
-; CHECK-V2-LABEL: define <4 x bfloat> @shuffle_v4bf16(
-; CHECK-V2-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V2-NEXT:  [[ENTRY:.*:]]
-; CHECK-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V2:       [[THEN]]:
-; CHECK-V2-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
-; CHECK-V2-NEXT:    tail call void @func0()
-; CHECK-V2-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V2:       [[ELSE]]:
-; CHECK-V2-NEXT:    tail call void @func1()
-; CHECK-V2-NEXT:    br label %[[FINALLY]]
-; CHECK-V2:       [[FINALLY]]:
-; CHECK-V2-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
-; CHECK-V2-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-; CHECK-V2-NEXT:    ret <4 x bfloat> [[VAL3]]
-;
-; CHECK-V3-LABEL: define <4 x bfloat> @shuffle_v4bf16(
-; CHECK-V3-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V3-NEXT:  [[ENTRY:.*:]]
-; CHECK-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V3:       [[THEN]]:
-; CHECK-V3-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
-; CHECK-V3-NEXT:    tail call void @func0()
-; CHECK-V3-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V3:       [[ELSE]]:
-; CHECK-V3-NEXT:    tail call void @func1()
-; CHECK-V3-NEXT:    br label %[[FINALLY]]
-; CHECK-V3:       [[FINALLY]]:
-; CHECK-V3-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
-; CHECK-V3-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-; CHECK-V3-NEXT:    ret <4 x bfloat> [[VAL3]]
-;
-; CHECK-V4-LABEL: define <4 x bfloat> @shuffle_v4bf16(
-; CHECK-V4-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V4-NEXT:  [[ENTRY:.*:]]
-; CHECK-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V4:       [[THEN]]:
-; CHECK-V4-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
-; CHECK-V4-NEXT:    tail call void @func0()
-; CHECK-V4-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V4:       [[ELSE]]:
-; CHECK-V4-NEXT:    tail call void @func1()
-; CHECK-V4-NEXT:    br label %[[FINALLY]]
-; CHECK-V4:       [[FINALLY]]:
-; CHECK-V4-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
-; CHECK-V4-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-; CHECK-V4-NEXT:    ret <4 x bfloat> [[VAL3]]
+; CHECK-LABEL: define <4 x bfloat> @shuffle_v4bf16(
+; CHECK-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    ret <4 x bfloat> [[VAL3]]
 ;
 entry:
   br i1 %cond, label %then, label %else
@@ -1499,69 +635,21 @@ finally:
 }
 
 define <6 x bfloat> @shuffle_v6bf16(<3 x bfloat> %arg0, i1 %cond) {
-; CHECK-V1-LABEL: define <6 x bfloat> @shuffle_v6bf16(
-; CHECK-V1-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V1-NEXT:  [[ENTRY:.*:]]
-; CHECK-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V1:       [[THEN]]:
-; CHECK-V1-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
-; CHECK-V1-NEXT:    tail call void @func0()
-; CHECK-V1-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V1:       [[ELSE]]:
-; CHECK-V1-NEXT:    tail call void @func1()
-; CHECK-V1-NEXT:    br label %[[FINALLY]]
-; CHECK-V1:       [[FINALLY]]:
-; CHECK-V1-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
-; CHECK-V1-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-V1-NEXT:    ret <6 x bfloat> [[VAL3]]
-;
-; CHECK-V2-LABEL: define <6 x bfloat> @shuffle_v6bf16(
-; CHECK-V2-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V2-NEXT:  [[ENTRY:.*:]]
-; CHECK-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V2:       [[THEN]]:
-; CHECK-V2-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
-; CHECK-V2-NEXT:    tail call void @func0()
-; CHECK-V2-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V2:       [[ELSE]]:
-; CHECK-V2-NEXT:    tail call void @func1()
-; CHECK-V2-NEXT:    br label %[[FINALLY]]
-; CHECK-V2:       [[FINALLY]]:
-; CHECK-V2-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
-; CHECK-V2-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-V2-NEXT:    ret <6 x bfloat> [[VAL3]]
-;
-; CHECK-V3-LABEL: define <6 x bfloat> @shuffle_v6bf16(
-; CHECK-V3-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V3-NEXT:  [[ENTRY:.*:]]
-; CHECK-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V3:       [[THEN]]:
-; CHECK-V3-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
-; CHECK-V3-NEXT:    tail call void @func0()
-; CHECK-V3-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V3:       [[ELSE]]:
-; CHECK-V3-NEXT:    tail call void @func1()
-; CHECK-V3-NEXT:    br label %[[FINALLY]]
-; CHECK-V3:       [[FINALLY]]:
-; CHECK-V3-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
-; CHECK-V3-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-V3-NEXT:    ret <6 x bfloat> [[VAL3]]
-;
-; CHECK-V4-LABEL: define <6 x bfloat> @shuffle_v6bf16(
-; CHECK-V4-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V4-NEXT:  [[ENTRY:.*:]]
-; CHECK-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V4:       [[THEN]]:
-; CHECK-V4-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
-; CHECK-V4-NEXT:    tail call void @func0()
-; CHECK-V4-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V4:       [[ELSE]]:
-; CHECK-V4-NEXT:    tail call void @func1()
-; CHECK-V4-NEXT:    br label %[[FINALLY]]
-; CHECK-V4:       [[FINALLY]]:
-; CHECK-V4-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
-; CHECK-V4-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-V4-NEXT:    ret <6 x bfloat> [[VAL3]]
+; CHECK-LABEL: define <6 x bfloat> @shuffle_v6bf16(
+; CHECK-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    ret <6 x bfloat> [[VAL3]]
 ;
 entry:
   br i1 %cond, label %then, label %else
@@ -1569,1410 +657,834 @@ entry:
 then:
   %val1 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
   tail call void @func0()
-  br label %finally
-
-else:
-  %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-  tail call void @func1()
-  br label %finally
-
-finally:
-  %val3 = phi <6 x bfloat> [ %val1, %then ], [ %val2, %else ]
-  ret <6 x bfloat> %val3
-}
-
-define <8 x bfloat> @shuffle_v8bf16(<3 x bfloat> %arg0, i1 %cond) {
-; CHECK-V1-LABEL: define <8 x bfloat> @shuffle_v8bf16(
-; CHECK-V1-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V1-NEXT:  [[ENTRY:.*:]]
-; CHECK-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V1:       [[THEN]]:
-; CHECK-V1-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
-; CHECK-V1-NEXT:    tail call void @func0()
-; CHECK-V1-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V1:       [[ELSE]]:
-; CHECK-V1-NEXT:    tail call void @func1()
-; CHECK-V1-NEXT:    br label %[[FINALLY]]
-; CHECK-V1:       [[FINALLY]]:
-; CHECK-V1-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
-; CHECK-V1-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-V1-NEXT:    ret <8 x bfloat> [[VAL3]]
-;
-; CHECK-V2-LABEL: define <8 x bfloat> @shuffle_v8bf16(
-; CHECK-V2-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V2-NEXT:  [[ENTRY:.*:]]
-; CHECK-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V2:       [[THEN]]:
-; CHECK-V2-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
-; CHECK-V2-NEXT:    tail call void @func0()
-; CHECK-V2-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V2:       [[ELSE]]:
-; CHECK-V2-NEXT:    tail call void @func1()
-; CHECK-V2-NEXT:    br label %[[FINALLY]]
-; CHECK-V2:       [[FINALLY]]:
-; CHECK-V2-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
-; CHECK-V2-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-V2-NEXT:    ret <8 x bfloat> [[VAL3]]
-;
-; CHECK-V3-LABEL: define <8 x bfloat> @shuffle_v8bf16(
-; CHECK-V3-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V3-NEXT:  [[ENTRY:.*:]]
-; CHECK-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V3:       [[THEN]]:
-; CHECK-V3-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
-; CHECK-V3-NEXT:    tail call void @func0()
-; CHECK-V3-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V3:       [[ELSE]]:
-; CHECK-V3-NEXT:    tail call void @func1()
-; CHECK-V3-NEXT:    br label %[[FINALLY]]
-; CHECK-V3:       [[FINALLY]]:
-; CHECK-V3-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
-; CHECK-V3-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-V3-NEXT:    ret <8 x bfloat> [[VAL3]]
-;
-; CHECK-V4-LABEL: define <8 x bfloat> @shuffle_v8bf16(
-; CHECK-V4-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V4-NEXT:  [[ENTRY:.*:]]
-; CHECK-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V4:       [[THEN]]:
-; CHECK-V4-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
-; CHECK-V4-NEXT:    tail call void @func0()
-; CHECK-V4-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V4:       [[ELSE]]:
-; CHECK-V4-NEXT:    tail call void @func1()
-; CHECK-V4-NEXT:    br label %[[FINALLY]]
-; CHECK-V4:       [[FINALLY]]:
-; CHECK-V4-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
-; CHECK-V4-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-V4-NEXT:    ret <8 x bfloat> [[VAL3]]
-;
-entry:
-  br i1 %cond, label %then, label %else
-
-then:
-  %val1 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-  tail call void @func0()
-  br label %finally
-
-else:
-  %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-  tail call void @func1()
-  br label %finally
-
-finally:
-  %val3 = phi <8 x bfloat> [ %val1, %then ], [ %val2, %else ]
-  ret <8 x bfloat> %val3
-}
-
-define <16 x bfloat> @shuffle_v16bf16(<3 x bfloat> %arg0, i1 %cond) {
-; CHECK-V1-LABEL: define <16 x bfloat> @shuffle_v16bf16(
-; CHECK-V1-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V1-NEXT:  [[ENTRY:.*:]]
-; CHECK-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V1:       [[THEN]]:
-; CHECK-V1-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
-; CHECK-V1-NEXT:    tail call void @func0()
-; CHECK-V1-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V1:       [[ELSE]]:
-; CHECK-V1-NEXT:    tail call void @func1()
-; CHECK-V1-NEXT:    br label %[[FINALLY]]
-; CHECK-V1:       [[FINALLY]]:
-; CHECK-V1-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
-; CHECK-V1-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-V1-NEXT:    ret <16 x bfloat> [[VAL3]]
-;
-; CHECK-V2-LABEL: define <16 x bfloat> @shuffle_v16bf16(
-; CHECK-V2-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V2-NEXT:  [[ENTRY:.*:]]
-; CHECK-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V2:       [[THEN]]:
-; CHECK-V2-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
-; CHECK-V2-NEXT:    tail call void @func0()
-; CHECK-V2-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V2:       [[ELSE]]:
-; CHECK-V2-NEXT:    tail call void @func1()
-; CHECK-V2-NEXT:    br label %[[FINALLY]]
-; CHECK-V2:       [[FINALLY]]:
-; CHECK-V2-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
-; CHECK-V2-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-V2-NEXT:    ret <16 x bfloat> [[VAL3]]
-;
-; CHECK-V3-LABEL: define <16 x bfloat> @shuffle_v16bf16(
-; CHECK-V3-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V3-NEXT:  [[ENTRY:.*:]]
-; CHECK-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V3:       [[THEN]]:
-; CHECK-V3-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
-; CHECK-V3-NEXT:    tail call void @func0()
-; CHECK-V3-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V3:       [[ELSE]]:
-; CHECK-V3-NEXT:    tail call void @func1()
-; CHECK-V3-NEXT:    br label %[[FINALLY]]
-; CHECK-V3:       [[FINALLY]]:
-; CHECK-V3-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
-; CHECK-V3-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-V3-NEXT:    ret <16 x bfloat> [[VAL3]]
-;
-; CHECK-V4-LABEL: define <16 x bfloat> @shuffle_v16bf16(
-; CHECK-V4-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V4-NEXT:  [[ENTRY:.*:]]
-; CHECK-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V4:       [[THEN]]:
-; CHECK-V4-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
-; CHECK-V4-NEXT:    tail call void @func0()
-; CHECK-V4-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V4:       [[ELSE]]:
-; CHECK-V4-NEXT:    tail call void @func1()
-; CHECK-V4-NEXT:    br label %[[FINALLY]]
-; CHECK-V4:       [[FINALLY]]:
-; CHECK-V4-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
-; CHECK-V4-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-V4-NEXT:    ret <16 x bfloat> [[VAL3]]
-;
-entry:
-  br i1 %cond, label %then, label %else
-
-then:
-  %val1 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-  tail call void @func0()
-  br label %finally
-
-else:
-  %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-  tail call void @func1()
-  br label %finally
-
-finally:
-  %val3 = phi <16 x bfloat> [ %val1, %then ], [ %val2, %else ]
-  ret <16 x bfloat> %val3
-}
-
-define <32 x bfloat> @shuffle_v32bf16(<3 x bfloat> %arg0, i1 %cond) {
-; CHECK-V1-LABEL: define <32 x bfloat> @shuffle_v32bf16(
-; CHECK-V1-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V1-NEXT:  [[ENTRY:.*:]]
-; CHECK-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V1:       [[THEN]]:
-; CHECK-V1-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
-; CHECK-V1-NEXT:    tail call void @func0()
-; CHECK-V1-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V1:       [[ELSE]]:
-; CHECK-V1-NEXT:    tail call void @func1()
-; CHECK-V1-NEXT:    br label %[[FINALLY]]
-; CHECK-V1:       [[FINALLY]]:
-; CHECK-V1-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
-; CHECK-V1-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-V1-NEXT:    ret <32 x bfloat> [[VAL3]]
-;
-; CHECK-V2-LABEL: define <32 x bfloat> @shuffle_v32bf16(
-; CHECK-V2-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V2-NEXT:  [[ENTRY:.*:]]
-; CHECK-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V2:       [[THEN]]:
-; CHECK-V2-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
-; CHECK-V2-NEXT:    tail call void @func0()
-; CHECK-V2-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V2:       [[ELSE]]:
-; CHECK-V2-NEXT:    tail call void @func1()
-; CHECK-V2-NEXT:    br label %[[FINALLY]]
-; CHECK-V2:       [[FINALLY]]:
-; CHECK-V2-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
-; CHECK-V2-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-V2-NEXT:    ret <32 x bfloat> [[VAL3]]
-;
-; CHECK-V3-LABEL: define <32 x bfloat> @shuffle_v32bf16(
-; CHECK-V3-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V3-NEXT:  [[ENTRY:.*:]]
-; CHECK-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V3:       [[THEN]]:
-; CHECK-V3-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
-; CHECK-V3-NEXT:    tail call void @func0()
-; CHECK-V3-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V3:       [[ELSE]]:
-; CHECK-V3-NEXT:    tail call void @func1()
-; CHECK-V3-NEXT:    br label %[[FINALLY]]
-; CHECK-V3:       [[FINALLY]]:
-; CHECK-V3-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
-; CHECK-V3-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-V3-NEXT:    ret <32 x bfloat> [[VAL3]]
-;
-; CHECK-V4-LABEL: define <32 x bfloat> @shuffle_v32bf16(
-; CHECK-V4-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V4-NEXT:  [[ENTRY:.*:]]
-; CHECK-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V4:       [[THEN]]:
-; CHECK-V4-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
-; CHECK-V4-NEXT:    tail call void @func0()
-; CHECK-V4-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V4:       [[ELSE]]:
-; CHECK-V4-NEXT:    tail call void @func1()
-; CHECK-V4-NEXT:    br label %[[FINALLY]]
-; CHECK-V4:       [[FINALLY]]:
-; CHECK-V4-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
-; CHECK-V4-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-V4-NEXT:    ret <32 x bfloat> [[VAL3]]
-;
-entry:
-  br i1 %cond, label %then, label %else
-
-then:
-  %val1 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-  tail call void @func0()
-  br label %finally
-
-else:
-  %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-  tail call void @func1()
-  br label %finally
-
-finally:
-  %val3 = phi <32 x bfloat> [ %val1, %then ], [ %val2, %else ]
-  ret <32 x bfloat> %val3
-}
-
-define <2 x half> @shuffle_v2f16(<2 x half> %arg0, i1 %cond) {
-; CHECK-V1-LABEL: define <2 x half> @shuffle_v2f16(
-; CHECK-V1-SAME: <2 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V1-NEXT:  [[ENTRY:.*:]]
-; CHECK-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V1:       [[THEN]]:
-; CHECK-V1-NEXT:    [[VAL1:%.*]] = shufflevector <2 x half> [[ARG0]], <2 x half> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-V1-NEXT:    tail call void @func0()
-; CHECK-V1-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V1:       [[ELSE]]:
-; CHECK-V1-NEXT:    [[VAL2:%.*]] = shufflevector <2 x half> [[ARG0]], <2 x half> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-V1-NEXT:    tail call void @func1()
-; CHECK-V1-NEXT:    br label %[[FINALLY]]
-; CHECK-V1:       [[FINALLY]]:
-; CHECK-V1-NEXT:    [[VAL3:%.*]] = phi <2 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V1-NEXT:    ret <2 x half> [[VAL3]]
-;
-; CHECK-V2-LABEL: define <2 x half> @shuffle_v2f16(
-; CHECK-V2-SAME: <2 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V2-NEXT:  [[ENTRY:.*:]]
-; CHECK-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V2:       [[THEN]]:
-; CHECK-V2-NEXT:    [[VAL1:%.*]] = shufflevector <2 x half> [[ARG0]], <2 x half> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-V2-NEXT:    tail call void @func0()
-; CHECK-V2-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V2:       [[ELSE]]:
-; CHECK-V2-NEXT:    [[VAL2:%.*]] = shufflevector <2 x half> [[ARG0]], <2 x half> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-V2-NEXT:    tail call void @func1()
-; CHECK-V2-NEXT:    br label %[[FINALLY]]
-; CHECK-V2:       [[FINALLY]]:
-; CHECK-V2-NEXT:    [[VAL3:%.*]] = phi <2 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V2-NEXT:    ret <2 x half> [[VAL3]]
-;
-; CHECK-V3-LABEL: define <2 x half> @shuffle_v2f16(
-; CHECK-V3-SAME: <2 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V3-NEXT:  [[ENTRY:.*:]]
-; CHECK-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V3:       [[THEN]]:
-; CHECK-V3-NEXT:    [[VAL1:%.*]] = shufflevector <2 x half> [[ARG0]], <2 x half> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-V3-NEXT:    tail call void @func0()
-; CHECK-V3-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V3:       [[ELSE]]:
-; CHECK-V3-NEXT:    [[VAL2:%.*]] = shufflevector <2 x half> [[ARG0]], <2 x half> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-V3-NEXT:    tail call void @func1()
-; CHECK-V3-NEXT:    br label %[[FINALLY]]
-; CHECK-V3:       [[FINALLY]]:
-; CHECK-V3-NEXT:    [[VAL3:%.*]] = phi <2 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V3-NEXT:    ret <2 x half> [[VAL3]]
-;
-; CHECK-V4-LABEL: define <2 x half> @shuffle_v2f16(
-; CHECK-V4-SAME: <2 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V4-NEXT:  [[ENTRY:.*:]]
-; CHECK-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V4:       [[THEN]]:
-; CHECK-V4-NEXT:    [[VAL1:%.*]] = shufflevector <2 x half> [[ARG0]], <2 x half> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-V4-NEXT:    tail call void @func0()
-; CHECK-V4-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V4:       [[ELSE]]:
-; CHECK-V4-NEXT:    [[VAL2:%.*]] = shufflevector <2 x half> [[ARG0]], <2 x half> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-V4-NEXT:    tail call void @func1()
-; CHECK-V4-NEXT:    br label %[[FINALLY]]
-; CHECK-V4:       [[FINALLY]]:
-; CHECK-V4-NEXT:    [[VAL3:%.*]] = phi <2 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V4-NEXT:    ret <2 x half> [[VAL3]]
-;
-entry:
-  br i1 %cond, label %then, label %else
-
-then:
-  %val1 = shufflevector <2 x half> %arg0, <2 x half> poison, <2 x i32> <i32 1, i32 1>
-  tail call void @func0()
-  br label %finally
-
-else:
-  %val2 = shufflevector <2 x half> %arg0, <2 x half> poison, <2 x i32> <i32 2, i32 2>
-  tail call void @func1()
-  br label %finally
-
-finally:
-  %val3 = phi <2 x half> [ %val1, %then ], [ %val2, %else ]
-  ret <2 x half> %val3
-}
-
-define <3 x half> @shuffle_v3f16(<3 x half> %arg0, i1 %cond) {
-; CHECK-V1-LABEL: define <3 x half> @shuffle_v3f16(
-; CHECK-V1-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V1-NEXT:  [[ENTRY:.*:]]
-; CHECK-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V1:       [[THEN]]:
-; CHECK-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 1, i32 1>
-; CHECK-V1-NEXT:    tail call void @func0()
-; CHECK-V1-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V1:       [[ELSE]]:
-; CHECK-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 2, i32 2, i32 2>
-; CHECK-V1-NEXT:    tail call void @func1()
-; CHECK-V1-NEXT:    br label %[[FINALLY]]
-; CHECK-V1:       [[FINALLY]]:
-; CHECK-V1-NEXT:    [[VAL3:%.*]] = phi <3 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V1-NEXT:    ret <3 x half> [[VAL3]]
-;
-; CHECK-V2-LABEL: define <3 x half> @shuffle_v3f16(
-; CHECK-V2-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V2-NEXT:  [[ENTRY:.*:]]
-; CHECK-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V2:       [[THEN]]:
-; CHECK-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 1, i32 1>
-; CHECK-V2-NEXT:    tail call void @func0()
-; CHECK-V2-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V2:       [[ELSE]]:
-; CHECK-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 2, i32 2, i32 2>
-; CHECK-V2-NEXT:    tail call void @func1()
-; CHECK-V2-NEXT:    br label %[[FINALLY]]
-; CHECK-V2:       [[FINALLY]]:
-; CHECK-V2-NEXT:    [[VAL3:%.*]] = phi <3 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V2-NEXT:    ret <3 x half> [[VAL3]]
-;
-; CHECK-V3-LABEL: define <3 x half> @shuffle_v3f16(
-; CHECK-V3-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V3-NEXT:  [[ENTRY:.*:]]
-; CHECK-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V3:       [[THEN]]:
-; CHECK-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 1, i32 1>
-; CHECK-V3-NEXT:    tail call void @func0()
-; CHECK-V3-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V3:       [[ELSE]]:
-; CHECK-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 2, i32 2, i32 2>
-; CHECK-V3-NEXT:    tail call void @func1()
-; CHECK-V3-NEXT:    br label %[[FINALLY]]
-; CHECK-V3:       [[FINALLY]]:
-; CHECK-V3-NEXT:    [[VAL3:%.*]] = phi <3 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V3-NEXT:    ret <3 x half> [[VAL3]]
-;
-; CHECK-V4-LABEL: define <3 x half> @shuffle_v3f16(
-; CHECK-V4-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V4-NEXT:  [[ENTRY:.*:]]
-; CHECK-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V4:       [[THEN]]:
-; CHECK-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 1, i32 1>
-; CHECK-V4-NEXT:    tail call void @func0()
-; CHECK-V4-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V4:       [[ELSE]]:
-; CHECK-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 2, i32 2, i32 2>
-; CHECK-V4-NEXT:    tail call void @func1()
-; CHECK-V4-NEXT:    br label %[[FINALLY]]
-; CHECK-V4:       [[FINALLY]]:
-; CHECK-V4-NEXT:    [[VAL3:%.*]] = phi <3 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V4-NEXT:    ret <3 x half> [[VAL3]]
-;
-entry:
-  br i1 %cond, label %then, label %else
-
-then:
-  %val1 = shufflevector <3 x half> %arg0, <3 x half> poison, <3 x i32> <i32 1, i32 1, i32 1>
-  tail call void @func0()
-  br label %finally
-
-else:
-  %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <3 x i32> <i32 2, i32 2, i32 2>
-  tail call void @func1()
-  br label %finally
-
-finally:
-  %val3 = phi <3 x half> [ %val1, %then ], [ %val2, %else ]
-  ret <3 x half> %val3
-}
-
-define <4 x half> @shuffle_v4f16(<3 x half> %arg0, i1 %cond) {
-; CHECK-V1-LABEL: define <4 x half> @shuffle_v4f16(
-; CHECK-V1-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V1-NEXT:  [[ENTRY:.*:]]
-; CHECK-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V1:       [[THEN]]:
-; CHECK-V1-NEXT:    [[TMP0:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 2, i32 0>
-; CHECK-V1-NEXT:    tail call void @func0()
-; CHECK-V1-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V1:       [[ELSE]]:
-; CHECK-V1-NEXT:    tail call void @func1()
-; CHECK-V1-NEXT:    br label %[[FINALLY]]
-; CHECK-V1:       [[FINALLY]]:
-; CHECK-V1-NEXT:    [[TMP1:%.*]] = phi <3 x half> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
-; CHECK-V1-NEXT:    [[VAL3:%.*]] = shufflevector <3 x half> [[TMP1]], <3 x half> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-; CHECK-V1-NEXT:    ret <4 x half> [[VAL3]]
-;
-; CHECK-V2-LABEL: define <4 x half> @shuffle_v4f16(
-; CHECK-V2-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V2-NEXT:  [[ENTRY:.*:]]
-; CHECK-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V2:       [[THEN]]:
-; CHECK-V2-NEXT:    [[TMP0:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 2, i32 0>
-; CHECK-V2-NEXT:    tail call void @func0()
-; CHECK-V2-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V2:       [[ELSE]]:
-; CHECK-V2-NEXT:    tail call void @func1()
-; CHECK-V2-NEXT:    br label %[[FINALLY]]
-; CHECK-V2:       [[FINALLY]]:
-; CHECK-V2-NEXT:    [[TMP1:%.*]] = phi <3 x half> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
-; CHECK-V2-NEXT:    [[VAL3:%.*]] = shufflevector <3 x half> [[TMP1]], <3 x half> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-; CHECK-V2-NEXT:    ret <4 x half> [[VAL3]]
-;
-; CHECK-V3-LABEL: define <4 x half> @shuffle_v4f16(
-; CHECK-V3-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V3-NEXT:  [[ENTRY:.*:]]
-; CHECK-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V3:       [[THEN]]:
-; CHECK-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
-; CHECK-V3-NEXT:    tail call void @func0()
-; CHECK-V3-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V3:       [[ELSE]]:
-; CHECK-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-; CHECK-V3-NEXT:    tail call void @func1()
-; CHECK-V3-NEXT:    br label %[[FINALLY]]
-; CHECK-V3:       [[FINALLY]]:
-; CHECK-V3-NEXT:    [[VAL3:%.*]] = phi <4 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V3-NEXT:    ret <4 x half> [[VAL3]]
-;
-; CHECK-V4-LABEL: define <4 x half> @shuffle_v4f16(
-; CHECK-V4-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V4-NEXT:  [[ENTRY:.*:]]
-; CHECK-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V4:       [[THEN]]:
-; CHECK-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
-; CHECK-V4-NEXT:    tail call void @func0()
-; CHECK-V4-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V4:       [[ELSE]]:
-; CHECK-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-; CHECK-V4-NEXT:    tail call void @func1()
-; CHECK-V4-NEXT:    br label %[[FINALLY]]
-; CHECK-V4:       [[FINALLY]]:
-; CHECK-V4-NEXT:    [[VAL3:%.*]] = phi <4 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V4-NEXT:    ret <4 x half> [[VAL3]]
-;
-entry:
-  br i1 %cond, label %then, label %else
-
-then:
-  %val1 = shufflevector <3 x half> %arg0, <3 x half> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
-  tail call void @func0()
-  br label %finally
-
-else:
-  %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
-  tail call void @func1()
-  br label %finally
-
-finally:
-  %val3 = phi <4 x half> [ %val1, %then ], [ %val2, %else ]
-  ret <4 x half> %val3
-}
-
-define <6 x half> @shuffle_v6f16(<3 x half> %arg0, i1 %cond) {
-; CHECK-V1-LABEL: define <6 x half> @shuffle_v6f16(
-; CHECK-V1-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V1-NEXT:  [[ENTRY:.*:]]
-; CHECK-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V1:       [[THEN]]:
-; CHECK-V1-NEXT:    [[TMP0:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 2, i32 0>
-; CHECK-V1-NEXT:    tail call void @func0()
-; CHECK-V1-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V1:       [[ELSE]]:
-; CHECK-V1-NEXT:    tail call void @func1()
-; CHECK-V1-NEXT:    br label %[[FINALLY]]
-; CHECK-V1:       [[FINALLY]]:
-; CHECK-V1-NEXT:    [[TMP1:%.*]] = phi <3 x half> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
-; CHECK-V1-NEXT:    [[VAL3:%.*]] = shufflevector <3 x half> [[TMP1]], <3 x half> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-V1-NEXT:    ret <6 x half> [[VAL3]]
-;
-; CHECK-V2-LABEL: define <6 x half> @shuffle_v6f16(
-; CHECK-V2-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V2-NEXT:  [[ENTRY:.*:]]
-; CHECK-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V2:       [[THEN]]:
-; CHECK-V2-NEXT:    [[TMP0:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 2, i32 0>
-; CHECK-V2-NEXT:    tail call void @func0()
-; CHECK-V2-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V2:       [[ELSE]]:
-; CHECK-V2-NEXT:    tail call void @func1()
-; CHECK-V2-NEXT:    br label %[[FINALLY]]
-; CHECK-V2:       [[FINALLY]]:
-; CHECK-V2-NEXT:    [[TMP1:%.*]] = phi <3 x half> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
-; CHECK-V2-NEXT:    [[VAL3:%.*]] = shufflevector <3 x half> [[TMP1]], <3 x half> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-V2-NEXT:    ret <6 x half> [[VAL3]]
-;
-; CHECK-V3-LABEL: define <6 x half> @shuffle_v6f16(
-; CHECK-V3-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V3-NEXT:  [[ENTRY:.*:]]
-; CHECK-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V3:       [[THEN]]:
-; CHECK-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-V3-NEXT:    tail call void @func0()
-; CHECK-V3-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V3:       [[ELSE]]:
-; CHECK-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-V3-NEXT:    tail call void @func1()
-; CHECK-V3-NEXT:    br label %[[FINALLY]]
-; CHECK-V3:       [[FINALLY]]:
-; CHECK-V3-NEXT:    [[VAL3:%.*]] = phi <6 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V3-NEXT:    ret <6 x half> [[VAL3]]
-;
-; CHECK-V4-LABEL: define <6 x half> @shuffle_v6f16(
-; CHECK-V4-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V4-NEXT:  [[ENTRY:.*:]]
-; CHECK-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V4:       [[THEN]]:
-; CHECK-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-V4-NEXT:    tail call void @func0()
-; CHECK-V4-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V4:       [[ELSE]]:
-; CHECK-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-V4-NEXT:    tail call void @func1()
-; CHECK-V4-NEXT:    br label %[[FINALLY]]
-; CHECK-V4:       [[FINALLY]]:
-; CHECK-V4-NEXT:    [[VAL3:%.*]] = phi <6 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V4-NEXT:    ret <6 x half> [[VAL3]]
-;
-entry:
-  br i1 %cond, label %then, label %else
-
-then:
-  %val1 = shufflevector <3 x half> %arg0, <3 x half> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-  tail call void @func0()
-  br label %finally
-
-else:
-  %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-  tail call void @func1()
-  br label %finally
-
-finally:
-  %val3 = phi <6 x half> [ %val1, %then ], [ %val2, %else ]
-  ret <6 x half> %val3
-}
-
-define <8 x half> @shuffle_v8f16(<3 x half> %arg0, i1 %cond) {
-; CHECK-V1-LABEL: define <8 x half> @shuffle_v8f16(
-; CHECK-V1-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V1-NEXT:  [[ENTRY:.*:]]
-; CHECK-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V1:       [[THEN]]:
-; CHECK-V1-NEXT:    [[TMP0:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 2, i32 0>
-; CHECK-V1-NEXT:    tail call void @func0()
-; CHECK-V1-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V1:       [[ELSE]]:
-; CHECK-V1-NEXT:    tail call void @func1()
-; CHECK-V1-NEXT:    br label %[[FINALLY]]
-; CHECK-V1:       [[FINALLY]]:
-; CHECK-V1-NEXT:    [[TMP1:%.*]] = phi <3 x half> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
-; CHECK-V1-NEXT:    [[VAL3:%.*]] = shufflevector <3 x half> [[TMP1]], <3 x half> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-V1-NEXT:    ret <8 x half> [[VAL3]]
-;
-; CHECK-V2-LABEL: define <8 x half> @shuffle_v8f16(
-; CHECK-V2-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V2-NEXT:  [[ENTRY:.*:]]
-; CHECK-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V2:       [[THEN]]:
-; CHECK-V2-NEXT:    [[TMP0:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 2, i32 0>
-; CHECK-V2-NEXT:    tail call void @func0()
-; CHECK-V2-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V2:       [[ELSE]]:
-; CHECK-V2-NEXT:    tail call void @func1()
-; CHECK-V2-NEXT:    br label %[[FINALLY]]
-; CHECK-V2:       [[FINALLY]]:
-; CHECK-V2-NEXT:    [[TMP1:%.*]] = phi <3 x half> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
-; CHECK-V2-NEXT:    [[VAL3:%.*]] = shufflevector <3 x half> [[TMP1]], <3 x half> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-V2-NEXT:    ret <8 x half> [[VAL3]]
-;
-; CHECK-V3-LABEL: define <8 x half> @shuffle_v8f16(
-; CHECK-V3-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V3-NEXT:  [[ENTRY:.*:]]
-; CHECK-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V3:       [[THEN]]:
-; CHECK-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-V3-NEXT:    tail call void @func0()
-; CHECK-V3-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V3:       [[ELSE]]:
-; CHECK-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-V3-NEXT:    tail call void @func1()
-; CHECK-V3-NEXT:    br label %[[FINALLY]]
-; CHECK-V3:       [[FINALLY]]:
-; CHECK-V3-NEXT:    [[VAL3:%.*]] = phi <8 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V3-NEXT:    ret <8 x half> [[VAL3]]
-;
-; CHECK-V4-LABEL: define <8 x half> @shuffle_v8f16(
-; CHECK-V4-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V4-NEXT:  [[ENTRY:.*:]]
-; CHECK-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V4:       [[THEN]]:
-; CHECK-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-V4-NEXT:    tail call void @func0()
-; CHECK-V4-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V4:       [[ELSE]]:
-; CHECK-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-V4-NEXT:    tail call void @func1()
-; CHECK-V4-NEXT:    br label %[[FINALLY]]
-; CHECK-V4:       [[FINALLY]]:
-; CHECK-V4-NEXT:    [[VAL3:%.*]] = phi <8 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V4-NEXT:    ret <8 x half> [[VAL3]]
-;
-entry:
-  br i1 %cond, label %then, label %else
-
-then:
-  %val1 = shufflevector <3 x half> %arg0, <3 x half> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-  tail call void @func0()
-  br label %finally
-
-else:
-  %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-  tail call void @func1()
-  br label %finally
-
-finally:
-  %val3 = phi <8 x half> [ %val1, %then ], [ %val2, %else ]
-  ret <8 x half> %val3
-}
-
-define <16 x half> @shuffle_v16f16(<3 x half> %arg0, i1 %cond) {
-; CHECK-V1-LABEL: define <16 x half> @shuffle_v16f16(
-; CHECK-V1-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V1-NEXT:  [[ENTRY:.*:]]
-; CHECK-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V1:       [[THEN]]:
-; CHECK-V1-NEXT:    [[TMP0:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 2, i32 0>
-; CHECK-V1-NEXT:    tail call void @func0()
-; CHECK-V1-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V1:       [[ELSE]]:
-; CHECK-V1-NEXT:    tail call void @func1()
-; CHECK-V1-NEXT:    br label %[[FINALLY]]
-; CHECK-V1:       [[FINALLY]]:
-; CHECK-V1-NEXT:    [[TMP1:%.*]] = phi <3 x half> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
-; CHECK-V1-NEXT:    [[VAL3:%.*]] = shufflevector <3 x half> [[TMP1]], <3 x half> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-V1-NEXT:    ret <16 x half> [[VAL3]]
-;
-; CHECK-V2-LABEL: define <16 x half> @shuffle_v16f16(
-; CHECK-V2-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V2-NEXT:  [[ENTRY:.*:]]
-; CHECK-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V2:       [[THEN]]:
-; CHECK-V2-NEXT:    [[TMP0:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 2, i32 0>
-; CHECK-V2-NEXT:    tail call void @func0()
-; CHECK-V2-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V2:       [[ELSE]]:
-; CHECK-V2-NEXT:    tail call void @func1()
-; CHECK-V2-NEXT:    br label %[[FINALLY]]
-; CHECK-V2:       [[FINALLY]]:
-; CHECK-V2-NEXT:    [[TMP1:%.*]] = phi <3 x half> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
-; CHECK-V2-NEXT:    [[VAL3:%.*]] = shufflevector <3 x half> [[TMP1]], <3 x half> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-V2-NEXT:    ret <16 x half> [[VAL3]]
-;
-; CHECK-V3-LABEL: define <16 x half> @shuffle_v16f16(
-; CHECK-V3-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V3-NEXT:  [[ENTRY:.*:]]
-; CHECK-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V3:       [[THEN]]:
-; CHECK-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-V3-NEXT:    tail call void @func0()
-; CHECK-V3-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V3:       [[ELSE]]:
-; CHECK-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-V3-NEXT:    tail call void @func1()
-; CHECK-V3-NEXT:    br label %[[FINALLY]]
-; CHECK-V3:       [[FINALLY]]:
-; CHECK-V3-NEXT:    [[VAL3:%.*]] = phi <16 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V3-NEXT:    ret <16 x half> [[VAL3]]
-;
-; CHECK-V4-LABEL: define <16 x half> @shuffle_v16f16(
-; CHECK-V4-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V4-NEXT:  [[ENTRY:.*:]]
-; CHECK-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V4:       [[THEN]]:
-; CHECK-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-V4-NEXT:    tail call void @func0()
-; CHECK-V4-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V4:       [[ELSE]]:
-; CHECK-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-V4-NEXT:    tail call void @func1()
-; CHECK-V4-NEXT:    br label %[[FINALLY]]
-; CHECK-V4:       [[FINALLY]]:
-; CHECK-V4-NEXT:    [[VAL3:%.*]] = phi <16 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V4-NEXT:    ret <16 x half> [[VAL3]]
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <6 x bfloat> [ %val1, %then ], [ %val2, %else ]
+  ret <6 x bfloat> %val3
+}
+
+define <8 x bfloat> @shuffle_v8bf16(<3 x bfloat> %arg0, i1 %cond) {
+; CHECK-LABEL: define <8 x bfloat> @shuffle_v8bf16(
+; CHECK-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    ret <8 x bfloat> [[VAL3]]
 ;
 entry:
   br i1 %cond, label %then, label %else
 
 then:
-  %val1 = shufflevector <3 x half> %arg0, <3 x half> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  %val1 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
   tail call void @func0()
   br label %finally
 
 else:
-  %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
   tail call void @func1()
   br label %finally
 
 finally:
-  %val3 = phi <16 x half> [ %val1, %then ], [ %val2, %else ]
-  ret <16 x half> %val3
+  %val3 = phi <8 x bfloat> [ %val1, %then ], [ %val2, %else ]
+  ret <8 x bfloat> %val3
 }
 
-define <32 x half> @shuffle_v32f16(<3 x half> %arg0, i1 %cond) {
-; CHECK-V1-LABEL: define <32 x half> @shuffle_v32f16(
-; CHECK-V1-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V1-NEXT:  [[ENTRY:.*:]]
-; CHECK-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V1:       [[THEN]]:
-; CHECK-V1-NEXT:    [[TMP0:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 2, i32 0>
-; CHECK-V1-NEXT:    tail call void @func0()
-; CHECK-V1-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V1:       [[ELSE]]:
-; CHECK-V1-NEXT:    tail call void @func1()
-; CHECK-V1-NEXT:    br label %[[FINALLY]]
-; CHECK-V1:       [[FINALLY]]:
-; CHECK-V1-NEXT:    [[TMP1:%.*]] = phi <3 x half> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
-; CHECK-V1-NEXT:    [[VAL3:%.*]] = shufflevector <3 x half> [[TMP1]], <3 x half> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-V1-NEXT:    ret <32 x half> [[VAL3]]
-;
-; CHECK-V2-LABEL: define <32 x half> @shuffle_v32f16(
-; CHECK-V2-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V2-NEXT:  [[ENTRY:.*:]]
-; CHECK-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V2:       [[THEN]]:
-; CHECK-V2-NEXT:    [[TMP0:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 2, i32 0>
-; CHECK-V2-NEXT:    tail call void @func0()
-; CHECK-V2-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V2:       [[ELSE]]:
-; CHECK-V2-NEXT:    tail call void @func1()
-; CHECK-V2-NEXT:    br label %[[FINALLY]]
-; CHECK-V2:       [[FINALLY]]:
-; CHECK-V2-NEXT:    [[TMP1:%.*]] = phi <3 x half> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
-; CHECK-V2-NEXT:    [[VAL3:%.*]] = shufflevector <3 x half> [[TMP1]], <3 x half> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-V2-NEXT:    ret <32 x half> [[VAL3]]
-;
-; CHECK-V3-LABEL: define <32 x half> @shuffle_v32f16(
-; CHECK-V3-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V3-NEXT:  [[ENTRY:.*:]]
-; CHECK-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V3:       [[THEN]]:
-; CHECK-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-V3-NEXT:    tail call void @func0()
-; CHECK-V3-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V3:       [[ELSE]]:
-; CHECK-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-V3-NEXT:    tail call void @func1()
-; CHECK-V3-NEXT:    br label %[[FINALLY]]
-; CHECK-V3:       [[FINALLY]]:
-; CHECK-V3-NEXT:    [[VAL3:%.*]] = phi <32 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V3-NEXT:    ret <32 x half> [[VAL3]]
-;
-; CHECK-V4-LABEL: define <32 x half> @shuffle_v32f16(
-; CHECK-V4-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V4-NEXT:  [[ENTRY:.*:]]
-; CHECK-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V4:       [[THEN]]:
-; CHECK-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
-; CHECK-V4-NEXT:    tail call void @func0()
-; CHECK-V4-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V4:       [[ELSE]]:
-; CHECK-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
-; CHECK-V4-NEXT:    tail call void @func1()
-; CHECK-V4-NEXT:    br label %[[FINALLY]]
-; CHECK-V4:       [[FINALLY]]:
-; CHECK-V4-NEXT:    [[VAL3:%.*]] = phi <32 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V4-NEXT:    ret <32 x half> [[VAL3]]
+define <16 x bfloat> @shuffle_v16bf16(<3 x bfloat> %arg0, i1 %cond) {
+; CHECK-LABEL: define <16 x bfloat> @shuffle_v16bf16(
+; CHECK-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    ret <16 x bfloat> [[VAL3]]
 ;
 entry:
   br i1 %cond, label %then, label %else
 
 then:
-  %val1 = shufflevector <3 x half> %arg0, <3 x half> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  %val1 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
   tail call void @func0()
   br label %finally
 
 else:
-  %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
   tail call void @func1()
   br label %finally
 
 finally:
-  %val3 = phi <32 x half> [ %val1, %then ], [ %val2, %else ]
-  ret <32 x half> %val3
+  %val3 = phi <16 x bfloat> [ %val1, %then ], [ %val2, %else ]
+  ret <16 x bfloat> %val3
 }
 
-define <2 x float> @shuffle_v2f32(<2 x float> %arg0, i1 %cond) {
-; CHECK-V1-LABEL: define <2 x float> @shuffle_v2f32(
-; CHECK-V1-SAME: <2 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V1-NEXT:  [[ENTRY:.*:]]
-; CHECK-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V1:       [[THEN]]:
-; CHECK-V1-NEXT:    [[VAL1:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-V1-NEXT:    tail call void @func0()
-; CHECK-V1-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V1:       [[ELSE]]:
-; CHECK-V1-NEXT:    [[VAL2:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-V1-NEXT:    tail call void @func1()
-; CHECK-V1-NEXT:    br label %[[FINALLY]]
-; CHECK-V1:       [[FINALLY]]:
-; CHECK-V1-NEXT:    [[VAL3:%.*]] = phi <2 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V1-NEXT:    ret <2 x float> [[VAL3]]
-;
-; CHECK-V2-LABEL: define <2 x float> @shuffle_v2f32(
-; CHECK-V2-SAME: <2 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V2-NEXT:  [[ENTRY:.*:]]
-; CHECK-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V2:       [[THEN]]:
-; CHECK-V2-NEXT:    [[VAL1:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-V2-NEXT:    tail call void @func0()
-; CHECK-V2-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V2:       [[ELSE]]:
-; CHECK-V2-NEXT:    [[VAL2:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-V2-NEXT:    tail call void @func1()
-; CHECK-V2-NEXT:    br label %[[FINALLY]]
-; CHECK-V2:       [[FINALLY]]:
-; CHECK-V2-NEXT:    [[VAL3:%.*]] = phi <2 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V2-NEXT:    ret <2 x float> [[VAL3]]
-;
-; CHECK-V3-LABEL: define <2 x float> @shuffle_v2f32(
-; CHECK-V3-SAME: <2 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V3-NEXT:  [[ENTRY:.*:]]
-; CHECK-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V3:       [[THEN]]:
-; CHECK-V3-NEXT:    [[VAL1:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-V3-NEXT:    tail call void @func0()
-; CHECK-V3-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V3:       [[ELSE]]:
-; CHECK-V3-NEXT:    [[VAL2:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-V3-NEXT:    tail call void @func1()
-; CHECK-V3-NEXT:    br label %[[FINALLY]]
-; CHECK-V3:       [[FINALLY]]:
-; CHECK-V3-NEXT:    [[VAL3:%.*]] = phi <2 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V3-NEXT:    ret <2 x float> [[VAL3]]
-;
-; CHECK-V4-LABEL: define <2 x float> @shuffle_v2f32(
-; CHECK-V4-SAME: <2 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V4-NEXT:  [[ENTRY:.*:]]
-; CHECK-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V4:       [[THEN]]:
-; CHECK-V4-NEXT:    [[VAL1:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> poison, <2 x i32> <i32 1, i32 1>
-; CHECK-V4-NEXT:    tail call void @func0()
-; CHECK-V4-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V4:       [[ELSE]]:
-; CHECK-V4-NEXT:    [[VAL2:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> poison, <2 x i32> <i32 2, i32 2>
-; CHECK-V4-NEXT:    tail call void @func1()
-; CHECK-V4-NEXT:    br label %[[FINALLY]]
-; CHECK-V4:       [[FINALLY]]:
-; CHECK-V4-NEXT:    [[VAL3:%.*]] = phi <2 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V4-NEXT:    ret <2 x float> [[VAL3]]
+define <32 x bfloat> @shuffle_v32bf16(<3 x bfloat> %arg0, i1 %cond) {
+; CHECK-LABEL: define <32 x bfloat> @shuffle_v32bf16(
+; CHECK-SAME: <3 x bfloat> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[TMP0:%.*]] = shufflevector <3 x bfloat> [[ARG0]], <3 x bfloat> poison, <3 x i32> <i32 1, i32 2, i32 0>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[TMP1:%.*]] = phi <3 x bfloat> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-NEXT:    [[VAL3:%.*]] = shufflevector <3 x bfloat> [[TMP1]], <3 x bfloat> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    ret <32 x bfloat> [[VAL3]]
 ;
 entry:
   br i1 %cond, label %then, label %else
 
 then:
-  %val1 = shufflevector <2 x float> %arg0, <2 x float> poison, <2 x i32> <i32 1, i32 1>
+  %val1 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
   tail call void @func0()
   br label %finally
 
 else:
-  %val2 = shufflevector <2 x float> %arg0, <2 x float> poison, <2 x i32> <i32 2, i32 2>
+  %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
   tail call void @func1()
   br label %finally
 
 finally:
-  %val3 = phi <2 x float> [ %val1, %then ], [ %val2, %else ]
-  ret <2 x float> %val3
+  %val3 = phi <32 x bfloat> [ %val1, %then ], [ %val2, %else ]
+  ret <32 x bfloat> %val3
 }
 
-define <3 x float> @shuffle_v3f32(<3 x float> %arg0, i1 %cond) {
-; CHECK-V1-LABEL: define <3 x float> @shuffle_v3f32(
-; CHECK-V1-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V1-NEXT:  [[ENTRY:.*:]]
-; CHECK-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V1:       [[THEN]]:
-; CHECK-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 1, i32 1, i32 1>
-; CHECK-V1-NEXT:    tail call void @func0()
-; CHECK-V1-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V1:       [[ELSE]]:
-; CHECK-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 2, i32 2, i32 2>
-; CHECK-V1-NEXT:    tail call void @func1()
-; CHECK-V1-NEXT:    br label %[[FINALLY]]
-; CHECK-V1:       [[FINALLY]]:
-; CHECK-V1-NEXT:    [[VAL3:%.*]] = phi <3 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V1-NEXT:    ret <3 x float> [[VAL3]]
-;
-; CHECK-V2-LABEL: define <3 x float> @shuffle_v3f32(
-; CHECK-V2-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V2-NEXT:  [[ENTRY:.*:]]
-; CHECK-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V2:       [[THEN]]:
-; CHECK-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 1, i32 1, i32 1>
-; CHECK-V2-NEXT:    tail call void @func0()
-; CHECK-V2-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V2:       [[ELSE]]:
-; CHECK-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 2, i32 2, i32 2>
-; CHECK-V2-NEXT:    tail call void @func1()
-; CHECK-V2-NEXT:    br label %[[FINALLY]]
-; CHECK-V2:       [[FINALLY]]:
-; CHECK-V2-NEXT:    [[VAL3:%.*]] = phi <3 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V2-NEXT:    ret <3 x float> [[VAL3]]
-;
-; CHECK-V3-LABEL: define <3 x float> @shuffle_v3f32(
-; CHECK-V3-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V3-NEXT:  [[ENTRY:.*:]]
-; CHECK-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V3:       [[THEN]]:
-; CHECK-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 1, i32 1, i32 1>
-; CHECK-V3-NEXT:    tail call void @func0()
-; CHECK-V3-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V3:       [[ELSE]]:
-; CHECK-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 2, i32 2, i32 2>
-; CHECK-V3-NEXT:    tail call void @func1()
-; CHECK-V3-NEXT:    br label %[[FINALLY]]
-; CHECK-V3:       [[FINALLY]]:
-; CHECK-V3-NEXT:    [[VAL3:%.*]] = phi <3 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V3-NEXT:    ret <3 x float> [[VAL3]]
+define <2 x half> @shuffle_v2f16(<2 x half> %arg0, i1 %cond) {
+; CHECK-LABEL: define <2 x half> @shuffle_v2f16(
+; CHECK-SAME: <2 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <2 x half> [[ARG0]], <2 x half> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <2 x half> [[ARG0]], <2 x half> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <2 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <2 x half> [[VAL3]]
 ;
-; CHECK-V4-LABEL: define <3 x float> @shuffle_v3f32(
-; CHECK-V4-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
-; CHECK-V4-NEXT:  [[ENTRY:.*:]]
-; CHECK-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
-; CHECK-V4:       [[THEN]]:
-; CHECK-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 1, i32 1, i32 1>
-; CHECK-V4-NEXT:    tail call void @func0()
-; CHECK-V4-NEXT:    br label %[[FINALLY:.*]]
-; CHECK-V4:       [[ELSE]]:
-; CHECK-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 2, i32 2, i32 2>
-; CHECK-V4-NEXT:    tail call void @func1()
-; CHECK-V4-NEXT:    br label %[[FINALLY]]
-; CHECK-V4:       [[FINALLY]]:
-; CHECK-V4-NEXT:    [[VAL3:%.*]] = phi <3 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V4-NEXT:    ret <3 x float> [[VAL3]]
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <2 x half> %arg0, <2 x half> poison, <2 x i32> <i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <2 x half> %arg0, <2 x half> poison, <2 x i32> <i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <2 x half> [ %val1, %then ], [ %val2, %else ]
+  ret <2 x half> %val3
+}
+
+define <3 x half> @shuffle_v3f16(<3 x half> %arg0, i1 %cond) {
+; CHECK-LABEL: define <3 x half> @shuffle_v3f16(
+; CHECK-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <3 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <3 x half> [[VAL3]]
 ;
 entry:
   br i1 %cond, label %then, label %else
 
 then:
-  %val1 = shufflevector <3 x float> %arg0, <3 x float> poison, <3 x i32> <i32 1, i32 1, i32 1>
+  %val1 = shufflevector <3 x half> %arg0, <3 x half> poison, <3 x i32> <i32 1, i32 1, i32 1>
   tail call void @func0()
   br label %finally
 
 else:
-  %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <3 x i32> <i32 2, i32 2, i32 2>
+  %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <3 x i32> <i32 2, i32 2, i32 2>
   tail call void @func1()
   br label %finally
 
 finally:
-  %val3 = phi <3 x float> [ %val1, %then ], [ %val2, %else ]
-  ret <3 x float> %val3
+  %val3 = phi <3 x half> [ %val1, %then ], [ %val2, %else ]
+  ret <3 x half> %val3
 }
 
-define <4 x float> @shuffle_v4f32(<3 x float> %arg0, i1 %cond) {
-; CHECK-V1-LABEL: define <4 x float> @shuffle_v4f32(
-; CHECK-V1-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+define <4 x half> @shuffle_v4f16(<3 x half> %arg0, i1 %cond) {
+; CHECK-V1-LABEL: define <4 x half> @shuffle_v4f16(
+; CHECK-V1-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
 ; CHECK-V1-NEXT:  [[ENTRY:.*:]]
 ; CHECK-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
 ; CHECK-V1:       [[THEN]]:
-; CHECK-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-V1-NEXT:    [[TMP0:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 2, i32 0>
 ; CHECK-V1-NEXT:    tail call void @func0()
 ; CHECK-V1-NEXT:    br label %[[FINALLY:.*]]
 ; CHECK-V1:       [[ELSE]]:
-; CHECK-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
 ; CHECK-V1-NEXT:    tail call void @func1()
 ; CHECK-V1-NEXT:    br label %[[FINALLY]]
 ; CHECK-V1:       [[FINALLY]]:
-; CHECK-V1-NEXT:    [[VAL3:%.*]] = phi <4 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V1-NEXT:    ret <4 x float> [[VAL3]]
+; CHECK-V1-NEXT:    [[TMP1:%.*]] = phi <3 x half> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-V1-NEXT:    [[VAL3:%.*]] = shufflevector <3 x half> [[TMP1]], <3 x half> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-V1-NEXT:    ret <4 x half> [[VAL3]]
 ;
-; CHECK-V2-LABEL: define <4 x float> @shuffle_v4f32(
-; CHECK-V2-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V2-LABEL: define <4 x half> @shuffle_v4f16(
+; CHECK-V2-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
 ; CHECK-V2-NEXT:  [[ENTRY:.*:]]
 ; CHECK-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
 ; CHECK-V2:       [[THEN]]:
-; CHECK-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-V2-NEXT:    [[TMP0:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 2, i32 0>
 ; CHECK-V2-NEXT:    tail call void @func0()
 ; CHECK-V2-NEXT:    br label %[[FINALLY:.*]]
 ; CHECK-V2:       [[ELSE]]:
-; CHECK-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
 ; CHECK-V2-NEXT:    tail call void @func1()
 ; CHECK-V2-NEXT:    br label %[[FINALLY]]
 ; CHECK-V2:       [[FINALLY]]:
-; CHECK-V2-NEXT:    [[VAL3:%.*]] = phi <4 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V2-NEXT:    ret <4 x float> [[VAL3]]
+; CHECK-V2-NEXT:    [[TMP1:%.*]] = phi <3 x half> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-V2-NEXT:    [[VAL3:%.*]] = shufflevector <3 x half> [[TMP1]], <3 x half> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-V2-NEXT:    ret <4 x half> [[VAL3]]
 ;
-; CHECK-V3-LABEL: define <4 x float> @shuffle_v4f32(
-; CHECK-V3-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V3-LABEL: define <4 x half> @shuffle_v4f16(
+; CHECK-V3-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
 ; CHECK-V3-NEXT:  [[ENTRY:.*:]]
 ; CHECK-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
 ; CHECK-V3:       [[THEN]]:
-; CHECK-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
 ; CHECK-V3-NEXT:    tail call void @func0()
 ; CHECK-V3-NEXT:    br label %[[FINALLY:.*]]
 ; CHECK-V3:       [[ELSE]]:
-; CHECK-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
 ; CHECK-V3-NEXT:    tail call void @func1()
 ; CHECK-V3-NEXT:    br label %[[FINALLY]]
 ; CHECK-V3:       [[FINALLY]]:
-; CHECK-V3-NEXT:    [[VAL3:%.*]] = phi <4 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V3-NEXT:    ret <4 x float> [[VAL3]]
+; CHECK-V3-NEXT:    [[VAL3:%.*]] = phi <4 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V3-NEXT:    ret <4 x half> [[VAL3]]
 ;
-; CHECK-V4-LABEL: define <4 x float> @shuffle_v4f32(
-; CHECK-V4-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V4-LABEL: define <4 x half> @shuffle_v4f16(
+; CHECK-V4-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
 ; CHECK-V4-NEXT:  [[ENTRY:.*:]]
 ; CHECK-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
 ; CHECK-V4:       [[THEN]]:
-; CHECK-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
 ; CHECK-V4-NEXT:    tail call void @func0()
 ; CHECK-V4-NEXT:    br label %[[FINALLY:.*]]
 ; CHECK-V4:       [[ELSE]]:
-; CHECK-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
 ; CHECK-V4-NEXT:    tail call void @func1()
 ; CHECK-V4-NEXT:    br label %[[FINALLY]]
 ; CHECK-V4:       [[FINALLY]]:
-; CHECK-V4-NEXT:    [[VAL3:%.*]] = phi <4 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V4-NEXT:    ret <4 x float> [[VAL3]]
+; CHECK-V4-NEXT:    [[VAL3:%.*]] = phi <4 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V4-NEXT:    ret <4 x half> [[VAL3]]
 ;
 entry:
   br i1 %cond, label %then, label %else
 
 then:
-  %val1 = shufflevector <3 x float> %arg0, <3 x float> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+  %val1 = shufflevector <3 x half> %arg0, <3 x half> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
   tail call void @func0()
   br label %finally
 
 else:
-  %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+  %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
   tail call void @func1()
   br label %finally
 
 finally:
-  %val3 = phi <4 x float> [ %val1, %then ], [ %val2, %else ]
-  ret <4 x float> %val3
+  %val3 = phi <4 x half> [ %val1, %then ], [ %val2, %else ]
+  ret <4 x half> %val3
 }
 
-define <6 x float> @shuffle_v6f32(<3 x float> %arg0, i1 %cond) {
-; CHECK-V1-LABEL: define <6 x float> @shuffle_v6f32(
-; CHECK-V1-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+define <6 x half> @shuffle_v6f16(<3 x half> %arg0, i1 %cond) {
+; CHECK-V1-LABEL: define <6 x half> @shuffle_v6f16(
+; CHECK-V1-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
 ; CHECK-V1-NEXT:  [[ENTRY:.*:]]
 ; CHECK-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
 ; CHECK-V1:       [[THEN]]:
-; CHECK-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V1-NEXT:    [[TMP0:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 2, i32 0>
 ; CHECK-V1-NEXT:    tail call void @func0()
 ; CHECK-V1-NEXT:    br label %[[FINALLY:.*]]
 ; CHECK-V1:       [[ELSE]]:
-; CHECK-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-V1-NEXT:    tail call void @func1()
 ; CHECK-V1-NEXT:    br label %[[FINALLY]]
 ; CHECK-V1:       [[FINALLY]]:
-; CHECK-V1-NEXT:    [[VAL3:%.*]] = phi <6 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V1-NEXT:    ret <6 x float> [[VAL3]]
+; CHECK-V1-NEXT:    [[TMP1:%.*]] = phi <3 x half> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-V1-NEXT:    [[VAL3:%.*]] = shufflevector <3 x half> [[TMP1]], <3 x half> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V1-NEXT:    ret <6 x half> [[VAL3]]
 ;
-; CHECK-V2-LABEL: define <6 x float> @shuffle_v6f32(
-; CHECK-V2-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V2-LABEL: define <6 x half> @shuffle_v6f16(
+; CHECK-V2-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
 ; CHECK-V2-NEXT:  [[ENTRY:.*:]]
 ; CHECK-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
 ; CHECK-V2:       [[THEN]]:
-; CHECK-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V2-NEXT:    [[TMP0:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 2, i32 0>
 ; CHECK-V2-NEXT:    tail call void @func0()
 ; CHECK-V2-NEXT:    br label %[[FINALLY:.*]]
 ; CHECK-V2:       [[ELSE]]:
-; CHECK-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-V2-NEXT:    tail call void @func1()
 ; CHECK-V2-NEXT:    br label %[[FINALLY]]
 ; CHECK-V2:       [[FINALLY]]:
-; CHECK-V2-NEXT:    [[VAL3:%.*]] = phi <6 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V2-NEXT:    ret <6 x float> [[VAL3]]
+; CHECK-V2-NEXT:    [[TMP1:%.*]] = phi <3 x half> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-V2-NEXT:    [[VAL3:%.*]] = shufflevector <3 x half> [[TMP1]], <3 x half> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V2-NEXT:    ret <6 x half> [[VAL3]]
 ;
-; CHECK-V3-LABEL: define <6 x float> @shuffle_v6f32(
-; CHECK-V3-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V3-LABEL: define <6 x half> @shuffle_v6f16(
+; CHECK-V3-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
 ; CHECK-V3-NEXT:  [[ENTRY:.*:]]
 ; CHECK-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
 ; CHECK-V3:       [[THEN]]:
-; CHECK-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
 ; CHECK-V3-NEXT:    tail call void @func0()
 ; CHECK-V3-NEXT:    br label %[[FINALLY:.*]]
 ; CHECK-V3:       [[ELSE]]:
-; CHECK-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-V3-NEXT:    tail call void @func1()
 ; CHECK-V3-NEXT:    br label %[[FINALLY]]
 ; CHECK-V3:       [[FINALLY]]:
-; CHECK-V3-NEXT:    [[VAL3:%.*]] = phi <6 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V3-NEXT:    ret <6 x float> [[VAL3]]
+; CHECK-V3-NEXT:    [[VAL3:%.*]] = phi <6 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V3-NEXT:    ret <6 x half> [[VAL3]]
 ;
-; CHECK-V4-LABEL: define <6 x float> @shuffle_v6f32(
-; CHECK-V4-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V4-LABEL: define <6 x half> @shuffle_v6f16(
+; CHECK-V4-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
 ; CHECK-V4-NEXT:  [[ENTRY:.*:]]
 ; CHECK-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
 ; CHECK-V4:       [[THEN]]:
-; CHECK-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
 ; CHECK-V4-NEXT:    tail call void @func0()
 ; CHECK-V4-NEXT:    br label %[[FINALLY:.*]]
 ; CHECK-V4:       [[ELSE]]:
-; CHECK-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-V4-NEXT:    tail call void @func1()
 ; CHECK-V4-NEXT:    br label %[[FINALLY]]
 ; CHECK-V4:       [[FINALLY]]:
-; CHECK-V4-NEXT:    [[VAL3:%.*]] = phi <6 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V4-NEXT:    ret <6 x float> [[VAL3]]
+; CHECK-V4-NEXT:    [[VAL3:%.*]] = phi <6 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V4-NEXT:    ret <6 x half> [[VAL3]]
 ;
 entry:
   br i1 %cond, label %then, label %else
 
 then:
-  %val1 = shufflevector <3 x float> %arg0, <3 x float> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  %val1 = shufflevector <3 x half> %arg0, <3 x half> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
   tail call void @func0()
   br label %finally
 
 else:
-  %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
   tail call void @func1()
   br label %finally
 
 finally:
-  %val3 = phi <6 x float> [ %val1, %then ], [ %val2, %else ]
-  ret <6 x float> %val3
+  %val3 = phi <6 x half> [ %val1, %then ], [ %val2, %else ]
+  ret <6 x half> %val3
 }
 
-define <8 x float> @shuffle_v8f32(<3 x float> %arg0, i1 %cond) {
-; CHECK-V1-LABEL: define <8 x float> @shuffle_v8f32(
-; CHECK-V1-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+define <8 x half> @shuffle_v8f16(<3 x half> %arg0, i1 %cond) {
+; CHECK-V1-LABEL: define <8 x half> @shuffle_v8f16(
+; CHECK-V1-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
 ; CHECK-V1-NEXT:  [[ENTRY:.*:]]
 ; CHECK-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
 ; CHECK-V1:       [[THEN]]:
-; CHECK-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V1-NEXT:    [[TMP0:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 2, i32 0>
 ; CHECK-V1-NEXT:    tail call void @func0()
 ; CHECK-V1-NEXT:    br label %[[FINALLY:.*]]
 ; CHECK-V1:       [[ELSE]]:
-; CHECK-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-V1-NEXT:    tail call void @func1()
 ; CHECK-V1-NEXT:    br label %[[FINALLY]]
 ; CHECK-V1:       [[FINALLY]]:
-; CHECK-V1-NEXT:    [[VAL3:%.*]] = phi <8 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V1-NEXT:    ret <8 x float> [[VAL3]]
+; CHECK-V1-NEXT:    [[TMP1:%.*]] = phi <3 x half> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-V1-NEXT:    [[VAL3:%.*]] = shufflevector <3 x half> [[TMP1]], <3 x half> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V1-NEXT:    ret <8 x half> [[VAL3]]
 ;
-; CHECK-V2-LABEL: define <8 x float> @shuffle_v8f32(
-; CHECK-V2-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V2-LABEL: define <8 x half> @shuffle_v8f16(
+; CHECK-V2-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
 ; CHECK-V2-NEXT:  [[ENTRY:.*:]]
 ; CHECK-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
 ; CHECK-V2:       [[THEN]]:
-; CHECK-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V2-NEXT:    [[TMP0:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 2, i32 0>
 ; CHECK-V2-NEXT:    tail call void @func0()
 ; CHECK-V2-NEXT:    br label %[[FINALLY:.*]]
 ; CHECK-V2:       [[ELSE]]:
-; CHECK-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-V2-NEXT:    tail call void @func1()
 ; CHECK-V2-NEXT:    br label %[[FINALLY]]
 ; CHECK-V2:       [[FINALLY]]:
-; CHECK-V2-NEXT:    [[VAL3:%.*]] = phi <8 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V2-NEXT:    ret <8 x float> [[VAL3]]
+; CHECK-V2-NEXT:    [[TMP1:%.*]] = phi <3 x half> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-V2-NEXT:    [[VAL3:%.*]] = shufflevector <3 x half> [[TMP1]], <3 x half> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V2-NEXT:    ret <8 x half> [[VAL3]]
 ;
-; CHECK-V3-LABEL: define <8 x float> @shuffle_v8f32(
-; CHECK-V3-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V3-LABEL: define <8 x half> @shuffle_v8f16(
+; CHECK-V3-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
 ; CHECK-V3-NEXT:  [[ENTRY:.*:]]
 ; CHECK-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
 ; CHECK-V3:       [[THEN]]:
-; CHECK-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
 ; CHECK-V3-NEXT:    tail call void @func0()
 ; CHECK-V3-NEXT:    br label %[[FINALLY:.*]]
 ; CHECK-V3:       [[ELSE]]:
-; CHECK-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-V3-NEXT:    tail call void @func1()
 ; CHECK-V3-NEXT:    br label %[[FINALLY]]
 ; CHECK-V3:       [[FINALLY]]:
-; CHECK-V3-NEXT:    [[VAL3:%.*]] = phi <8 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V3-NEXT:    ret <8 x float> [[VAL3]]
+; CHECK-V3-NEXT:    [[VAL3:%.*]] = phi <8 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V3-NEXT:    ret <8 x half> [[VAL3]]
 ;
-; CHECK-V4-LABEL: define <8 x float> @shuffle_v8f32(
-; CHECK-V4-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V4-LABEL: define <8 x half> @shuffle_v8f16(
+; CHECK-V4-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
 ; CHECK-V4-NEXT:  [[ENTRY:.*:]]
 ; CHECK-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
 ; CHECK-V4:       [[THEN]]:
-; CHECK-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
 ; CHECK-V4-NEXT:    tail call void @func0()
 ; CHECK-V4-NEXT:    br label %[[FINALLY:.*]]
 ; CHECK-V4:       [[ELSE]]:
-; CHECK-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-V4-NEXT:    tail call void @func1()
 ; CHECK-V4-NEXT:    br label %[[FINALLY]]
 ; CHECK-V4:       [[FINALLY]]:
-; CHECK-V4-NEXT:    [[VAL3:%.*]] = phi <8 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V4-NEXT:    ret <8 x float> [[VAL3]]
+; CHECK-V4-NEXT:    [[VAL3:%.*]] = phi <8 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V4-NEXT:    ret <8 x half> [[VAL3]]
 ;
 entry:
   br i1 %cond, label %then, label %else
 
 then:
-  %val1 = shufflevector <3 x float> %arg0, <3 x float> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  %val1 = shufflevector <3 x half> %arg0, <3 x half> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
   tail call void @func0()
   br label %finally
 
 else:
-  %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
   tail call void @func1()
   br label %finally
 
 finally:
-  %val3 = phi <8 x float> [ %val1, %then ], [ %val2, %else ]
-  ret <8 x float> %val3
+  %val3 = phi <8 x half> [ %val1, %then ], [ %val2, %else ]
+  ret <8 x half> %val3
 }
 
-define <16 x float> @shuffle_v16f32(<3 x float> %arg0, i1 %cond) {
-; CHECK-V1-LABEL: define <16 x float> @shuffle_v16f32(
-; CHECK-V1-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+define <16 x half> @shuffle_v16f16(<3 x half> %arg0, i1 %cond) {
+; CHECK-V1-LABEL: define <16 x half> @shuffle_v16f16(
+; CHECK-V1-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
 ; CHECK-V1-NEXT:  [[ENTRY:.*:]]
 ; CHECK-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
 ; CHECK-V1:       [[THEN]]:
-; CHECK-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V1-NEXT:    [[TMP0:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 2, i32 0>
 ; CHECK-V1-NEXT:    tail call void @func0()
 ; CHECK-V1-NEXT:    br label %[[FINALLY:.*]]
 ; CHECK-V1:       [[ELSE]]:
-; CHECK-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-V1-NEXT:    tail call void @func1()
 ; CHECK-V1-NEXT:    br label %[[FINALLY]]
 ; CHECK-V1:       [[FINALLY]]:
-; CHECK-V1-NEXT:    [[VAL3:%.*]] = phi <16 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V1-NEXT:    ret <16 x float> [[VAL3]]
+; CHECK-V1-NEXT:    [[TMP1:%.*]] = phi <3 x half> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-V1-NEXT:    [[VAL3:%.*]] = shufflevector <3 x half> [[TMP1]], <3 x half> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V1-NEXT:    ret <16 x half> [[VAL3]]
 ;
-; CHECK-V2-LABEL: define <16 x float> @shuffle_v16f32(
-; CHECK-V2-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V2-LABEL: define <16 x half> @shuffle_v16f16(
+; CHECK-V2-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
 ; CHECK-V2-NEXT:  [[ENTRY:.*:]]
 ; CHECK-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
 ; CHECK-V2:       [[THEN]]:
-; CHECK-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V2-NEXT:    [[TMP0:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 2, i32 0>
 ; CHECK-V2-NEXT:    tail call void @func0()
 ; CHECK-V2-NEXT:    br label %[[FINALLY:.*]]
 ; CHECK-V2:       [[ELSE]]:
-; CHECK-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-V2-NEXT:    tail call void @func1()
 ; CHECK-V2-NEXT:    br label %[[FINALLY]]
 ; CHECK-V2:       [[FINALLY]]:
-; CHECK-V2-NEXT:    [[VAL3:%.*]] = phi <16 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V2-NEXT:    ret <16 x float> [[VAL3]]
+; CHECK-V2-NEXT:    [[TMP1:%.*]] = phi <3 x half> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-V2-NEXT:    [[VAL3:%.*]] = shufflevector <3 x half> [[TMP1]], <3 x half> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V2-NEXT:    ret <16 x half> [[VAL3]]
 ;
-; CHECK-V3-LABEL: define <16 x float> @shuffle_v16f32(
-; CHECK-V3-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V3-LABEL: define <16 x half> @shuffle_v16f16(
+; CHECK-V3-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
 ; CHECK-V3-NEXT:  [[ENTRY:.*:]]
 ; CHECK-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
 ; CHECK-V3:       [[THEN]]:
-; CHECK-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
 ; CHECK-V3-NEXT:    tail call void @func0()
 ; CHECK-V3-NEXT:    br label %[[FINALLY:.*]]
 ; CHECK-V3:       [[ELSE]]:
-; CHECK-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-V3-NEXT:    tail call void @func1()
 ; CHECK-V3-NEXT:    br label %[[FINALLY]]
 ; CHECK-V3:       [[FINALLY]]:
-; CHECK-V3-NEXT:    [[VAL3:%.*]] = phi <16 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V3-NEXT:    ret <16 x float> [[VAL3]]
+; CHECK-V3-NEXT:    [[VAL3:%.*]] = phi <16 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V3-NEXT:    ret <16 x half> [[VAL3]]
 ;
-; CHECK-V4-LABEL: define <16 x float> @shuffle_v16f32(
-; CHECK-V4-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V4-LABEL: define <16 x half> @shuffle_v16f16(
+; CHECK-V4-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
 ; CHECK-V4-NEXT:  [[ENTRY:.*:]]
 ; CHECK-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
 ; CHECK-V4:       [[THEN]]:
-; CHECK-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
 ; CHECK-V4-NEXT:    tail call void @func0()
 ; CHECK-V4-NEXT:    br label %[[FINALLY:.*]]
 ; CHECK-V4:       [[ELSE]]:
-; CHECK-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-V4-NEXT:    tail call void @func1()
 ; CHECK-V4-NEXT:    br label %[[FINALLY]]
 ; CHECK-V4:       [[FINALLY]]:
-; CHECK-V4-NEXT:    [[VAL3:%.*]] = phi <16 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V4-NEXT:    ret <16 x float> [[VAL3]]
+; CHECK-V4-NEXT:    [[VAL3:%.*]] = phi <16 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V4-NEXT:    ret <16 x half> [[VAL3]]
 ;
 entry:
   br i1 %cond, label %then, label %else
 
 then:
-  %val1 = shufflevector <3 x float> %arg0, <3 x float> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  %val1 = shufflevector <3 x half> %arg0, <3 x half> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
   tail call void @func0()
   br label %finally
 
 else:
-  %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
   tail call void @func1()
   br label %finally
 
 finally:
-  %val3 = phi <16 x float> [ %val1, %then ], [ %val2, %else ]
-  ret <16 x float> %val3
+  %val3 = phi <16 x half> [ %val1, %then ], [ %val2, %else ]
+  ret <16 x half> %val3
 }
 
-define <32 x float> @shuffle_v32f32(<3 x float> %arg0, i1 %cond) {
-; CHECK-V1-LABEL: define <32 x float> @shuffle_v32f32(
-; CHECK-V1-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+define <32 x half> @shuffle_v32f16(<3 x half> %arg0, i1 %cond) {
+; CHECK-V1-LABEL: define <32 x half> @shuffle_v32f16(
+; CHECK-V1-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
 ; CHECK-V1-NEXT:  [[ENTRY:.*:]]
 ; CHECK-V1-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
 ; CHECK-V1:       [[THEN]]:
-; CHECK-V1-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V1-NEXT:    [[TMP0:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 2, i32 0>
 ; CHECK-V1-NEXT:    tail call void @func0()
 ; CHECK-V1-NEXT:    br label %[[FINALLY:.*]]
 ; CHECK-V1:       [[ELSE]]:
-; CHECK-V1-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-V1-NEXT:    tail call void @func1()
 ; CHECK-V1-NEXT:    br label %[[FINALLY]]
 ; CHECK-V1:       [[FINALLY]]:
-; CHECK-V1-NEXT:    [[VAL3:%.*]] = phi <32 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V1-NEXT:    ret <32 x float> [[VAL3]]
+; CHECK-V1-NEXT:    [[TMP1:%.*]] = phi <3 x half> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-V1-NEXT:    [[VAL3:%.*]] = shufflevector <3 x half> [[TMP1]], <3 x half> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V1-NEXT:    ret <32 x half> [[VAL3]]
 ;
-; CHECK-V2-LABEL: define <32 x float> @shuffle_v32f32(
-; CHECK-V2-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V2-LABEL: define <32 x half> @shuffle_v32f16(
+; CHECK-V2-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
 ; CHECK-V2-NEXT:  [[ENTRY:.*:]]
 ; CHECK-V2-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
 ; CHECK-V2:       [[THEN]]:
-; CHECK-V2-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V2-NEXT:    [[TMP0:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> <i32 1, i32 2, i32 0>
 ; CHECK-V2-NEXT:    tail call void @func0()
 ; CHECK-V2-NEXT:    br label %[[FINALLY:.*]]
 ; CHECK-V2:       [[ELSE]]:
-; CHECK-V2-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-V2-NEXT:    tail call void @func1()
 ; CHECK-V2-NEXT:    br label %[[FINALLY]]
 ; CHECK-V2:       [[FINALLY]]:
-; CHECK-V2-NEXT:    [[VAL3:%.*]] = phi <32 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V2-NEXT:    ret <32 x float> [[VAL3]]
+; CHECK-V2-NEXT:    [[TMP1:%.*]] = phi <3 x half> [ [[TMP0]], %[[THEN]] ], [ [[ARG0]], %[[ELSE]] ]
+; CHECK-V2-NEXT:    [[VAL3:%.*]] = shufflevector <3 x half> [[TMP1]], <3 x half> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V2-NEXT:    ret <32 x half> [[VAL3]]
 ;
-; CHECK-V3-LABEL: define <32 x float> @shuffle_v32f32(
-; CHECK-V3-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V3-LABEL: define <32 x half> @shuffle_v32f16(
+; CHECK-V3-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
 ; CHECK-V3-NEXT:  [[ENTRY:.*:]]
 ; CHECK-V3-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
 ; CHECK-V3:       [[THEN]]:
-; CHECK-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V3-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
 ; CHECK-V3-NEXT:    tail call void @func0()
 ; CHECK-V3-NEXT:    br label %[[FINALLY:.*]]
 ; CHECK-V3:       [[ELSE]]:
-; CHECK-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V3-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-V3-NEXT:    tail call void @func1()
 ; CHECK-V3-NEXT:    br label %[[FINALLY]]
 ; CHECK-V3:       [[FINALLY]]:
-; CHECK-V3-NEXT:    [[VAL3:%.*]] = phi <32 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V3-NEXT:    ret <32 x float> [[VAL3]]
+; CHECK-V3-NEXT:    [[VAL3:%.*]] = phi <32 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V3-NEXT:    ret <32 x half> [[VAL3]]
 ;
-; CHECK-V4-LABEL: define <32 x float> @shuffle_v32f32(
-; CHECK-V4-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-V4-LABEL: define <32 x half> @shuffle_v32f16(
+; CHECK-V4-SAME: <3 x half> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
 ; CHECK-V4-NEXT:  [[ENTRY:.*:]]
 ; CHECK-V4-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
 ; CHECK-V4:       [[THEN]]:
-; CHECK-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-V4-NEXT:    [[VAL1:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
 ; CHECK-V4-NEXT:    tail call void @func0()
 ; CHECK-V4-NEXT:    br label %[[FINALLY:.*]]
 ; CHECK-V4:       [[ELSE]]:
-; CHECK-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-V4-NEXT:    [[VAL2:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
 ; CHECK-V4-NEXT:    tail call void @func1()
 ; CHECK-V4-NEXT:    br label %[[FINALLY]]
 ; CHECK-V4:       [[FINALLY]]:
-; CHECK-V4-NEXT:    [[VAL3:%.*]] = phi <32 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
-; CHECK-V4-NEXT:    ret <32 x float> [[VAL3]]
+; CHECK-V4-NEXT:    [[VAL3:%.*]] = phi <32 x half> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-V4-NEXT:    ret <32 x half> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x half> %arg0, <3 x half> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <32 x half> [ %val1, %then ], [ %val2, %else ]
+  ret <32 x half> %val3
+}
+
+define <2 x float> @shuffle_v2f32(<2 x float> %arg0, i1 %cond) {
+; CHECK-LABEL: define <2 x float> @shuffle_v2f32(
+; CHECK-SAME: <2 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> poison, <2 x i32> <i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> poison, <2 x i32> <i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <2 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <2 x float> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <2 x float> %arg0, <2 x float> poison, <2 x i32> <i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <2 x float> %arg0, <2 x float> poison, <2 x i32> <i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <2 x float> [ %val1, %then ], [ %val2, %else ]
+  ret <2 x float> %val3
+}
+
+define <3 x float> @shuffle_v3f32(<3 x float> %arg0, i1 %cond) {
+; CHECK-LABEL: define <3 x float> @shuffle_v3f32(
+; CHECK-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <3 x i32> <i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <3 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <3 x float> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x float> %arg0, <3 x float> poison, <3 x i32> <i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <3 x i32> <i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <3 x float> [ %val1, %then ], [ %val2, %else ]
+  ret <3 x float> %val3
+}
+
+define <4 x float> @shuffle_v4f32(<3 x float> %arg0, i1 %cond) {
+; CHECK-LABEL: define <4 x float> @shuffle_v4f32(
+; CHECK-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <4 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <4 x float> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x float> %arg0, <3 x float> poison, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <4 x float> [ %val1, %then ], [ %val2, %else ]
+  ret <4 x float> %val3
+}
+
+define <6 x float> @shuffle_v6f32(<3 x float> %arg0, i1 %cond) {
+; CHECK-LABEL: define <6 x float> @shuffle_v6f32(
+; CHECK-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <6 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <6 x float> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x float> %arg0, <3 x float> poison, <6 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <6 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <6 x float> [ %val1, %then ], [ %val2, %else ]
+  ret <6 x float> %val3
+}
+
+define <8 x float> @shuffle_v8f32(<3 x float> %arg0, i1 %cond) {
+; CHECK-LABEL: define <8 x float> @shuffle_v8f32(
+; CHECK-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <8 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <8 x float> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x float> %arg0, <3 x float> poison, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <8 x float> [ %val1, %then ], [ %val2, %else ]
+  ret <8 x float> %val3
+}
+
+define <16 x float> @shuffle_v16f32(<3 x float> %arg0, i1 %cond) {
+; CHECK-LABEL: define <16 x float> @shuffle_v16f32(
+; CHECK-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <16 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <16 x float> [[VAL3]]
+;
+entry:
+  br i1 %cond, label %then, label %else
+
+then:
+  %val1 = shufflevector <3 x float> %arg0, <3 x float> poison, <16 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+  tail call void @func0()
+  br label %finally
+
+else:
+  %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <16 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+  tail call void @func1()
+  br label %finally
+
+finally:
+  %val3 = phi <16 x float> [ %val1, %then ], [ %val2, %else ]
+  ret <16 x float> %val3
+}
+
+define <32 x float> @shuffle_v32f32(<3 x float> %arg0, i1 %cond) {
+; CHECK-LABEL: define <32 x float> @shuffle_v32f32(
+; CHECK-SAME: <3 x float> [[ARG0:%.*]], i1 [[COND:%.*]]) #[[ATTR0]] {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[THEN:.*]], label %[[ELSE:.*]]
+; CHECK:       [[THEN]]:
+; CHECK-NEXT:    [[VAL1:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <32 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
+; CHECK-NEXT:    tail call void @func0()
+; CHECK-NEXT:    br label %[[FINALLY:.*]]
+; CHECK:       [[ELSE]]:
+; CHECK-NEXT:    [[VAL2:%.*]] = shufflevector <3 x float> [[ARG0]], <3 x float> poison, <32 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
+; CHECK-NEXT:    tail call void @func1()
+; CHECK-NEXT:    br label %[[FINALLY]]
+; CHECK:       [[FINALLY]]:
+; CHECK-NEXT:    [[VAL3:%.*]] = phi <32 x float> [ [[VAL1]], %[[THEN]] ], [ [[VAL2]], %[[ELSE]] ]
+; CHECK-NEXT:    ret <32 x float> [[VAL3]]
 ;
 entry:
   br i1 %cond, label %then, label %else



More information about the llvm-commits mailing list