diff --git a/llvm/lib/Transforms/Vectorize/VectorCombine.cpp b/llvm/lib/Transforms/Vectorize/VectorCombine.cpp index fe8d74c43dfdc..c275643e953c0 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,101 @@ 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(&I); + if (!Phi || Phi->getNumIncomingValues() != 2u) + return false; + + Value *Op = nullptr; + ArrayRef Mask0; + ArrayRef Mask1; + + 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(Phi->getOperand(0u)); + + // Ensure result vectors are wider than the argument vector. + auto *InputVT = cast(Op->getType()); + auto *ResultVT = cast(Shuf->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. + SmallVector NewMask; + NewMask.reserve(Mask0.size()); + + 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; + } + + // 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() || !all_equal(NewMask)) + return false; + + // Create new mask using difference of the two incoming masks. + int MaskOffset = NewMask[0u]; + unsigned Index = (InputNumElements - MaskOffset) % InputNumElements; + NewMask.clear(); + + for (unsigned I = 0u; I < InputNumElements; ++I) { + NewMask.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, 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); + + 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()); + auto *PoisonVal = PoisonValue::get(InputVT); + auto *NewShuf0 = Builder.CreateShuffleVector(Op, PoisonVal, NewMask); + Worklist.push(cast(NewShuf0)); + + Builder.SetInsertPoint(Phi); + Builder.SetCurrentDebugLocation(Phi->getDebugLoc()); + auto *NewPhi = Builder.CreatePHI(NewShuf0->getType(), 2u); + NewPhi->addIncoming(NewShuf0, Phi->getIncomingBlock(0u)); + NewPhi->addIncoming(Op, Phi->getIncomingBlock(1u)); + + Builder.SetInsertPoint(*NewPhi->getInsertionPointAfterDef()); + PoisonVal = PoisonValue::get(NewPhi->getType()); + auto *NewShuf1 = Builder.CreateShuffleVector(NewPhi, PoisonVal, Mask1); + + replaceValue(*Phi, *NewShuf1); + 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 +3871,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/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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <2 x i8> %arg0, <2 x i8> poison, <2 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <4 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <8 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <16 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <32 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <2 x i16> %arg0, <2 x i16> poison, <2 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <4 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <8 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <16 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <32 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <2 x i32> %arg0, <2 x i32> poison, <2 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <4 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <8 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <16 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <32 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <2 x bfloat> %arg0, <2 x bfloat> poison, <2 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <3 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <4 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <6 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <8 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <16 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <32 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <2 x half> %arg0, <2 x half> poison, <2 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <3 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <4 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <6 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <8 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <16 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <32 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <2 x float> %arg0, <2 x float> poison, <2 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <3 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <4 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <6 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <8 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <16 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <32 x i32> + 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..8c504843d87d8 --- /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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <2 x i8> %arg0, <2 x i8> poison, <2 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <4 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <8 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <16 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <32 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <2 x i16> %arg0, <2 x i16> poison, <2 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <4 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <8 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <16 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <32 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <2 x i32> %arg0, <2 x i32> poison, <2 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <4 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <8 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <16 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <32 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <2 x bfloat> %arg0, <2 x bfloat> poison, <2 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <3 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <4 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <6 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <8 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <16 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <32 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <2 x half> %arg0, <2 x half> poison, <2 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <3 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <4 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <6 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <8 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <16 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <32 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <2 x float> %arg0, <2 x float> poison, <2 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <3 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <4 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <6 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <8 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <16 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <32 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <2 x i8> %arg0, <2 x i8> poison, <2 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <4 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <8 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <16 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <32 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <2 x i16> %arg0, <2 x i16> poison, <2 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <4 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <8 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <16 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <32 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <2 x i32> %arg0, <2 x i32> poison, <2 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <4 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <8 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <16 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <32 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <2 x bfloat> %arg0, <2 x bfloat> poison, <2 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <3 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <4 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <6 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <8 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <16 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <32 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <2 x half> %arg0, <2 x half> poison, <2 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <3 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <4 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <6 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <8 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <16 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <32 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <2 x float> %arg0, <2 x float> poison, <2 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <3 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <4 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <6 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <8 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <16 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <32 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <2 x i8> %arg0, <2 x i8> poison, <2 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <4 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <8 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <16 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <32 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <2 x i16> %arg0, <2 x i16> poison, <2 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <4 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <8 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <16 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <32 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <2 x i32> %arg0, <2 x i32> poison, <2 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <4 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <8 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <16 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <32 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <2 x bfloat> %arg0, <2 x bfloat> poison, <2 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <3 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <4 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <6 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <8 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <16 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <32 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <2 x half> %arg0, <2 x half> poison, <2 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <3 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <4 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <6 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <8 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <16 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <32 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <2 x float> %arg0, <2 x float> poison, <2 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <3 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <4 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <6 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <8 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <16 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <32 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <2 x i8> %arg0, <2 x i8> poison, <2 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <4 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <8 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <16 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <32 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <2 x i16> %arg0, <2 x i16> poison, <2 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <4 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <8 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <16 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <32 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <2 x i32> %arg0, <2 x i32> poison, <2 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <4 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <8 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <16 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <32 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <2 x bfloat> %arg0, <2 x bfloat> poison, <2 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <3 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <4 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <6 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <8 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <16 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <32 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <2 x half> %arg0, <2 x half> poison, <2 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <3 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <4 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <6 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <8 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <16 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <32 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <2 x float> %arg0, <2 x float> poison, <2 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <3 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <4 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <6 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <8 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <16 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <32 x i32> + 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..59422e98cbcc6 --- /dev/null +++ b/llvm/test/Transforms/VectorCombine/X86/narrow-phi-of-shuffles.ll @@ -0,0 +1,1509 @@ +; 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,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-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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <2 x i8> %arg0, <2 x i8> poison, <2 x i32> + 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:%.*]]) #[[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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <4 x i32> + 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:%.*]]) #[[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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <8 x i32> + 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:%.*]]) #[[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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <16 x i32> + 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:%.*]]) #[[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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <32 x i32> + 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:%.*]]) #[[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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <2 x i16> %arg0, <2 x i16> poison, <2 x i32> + 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:%.*]]) #[[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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <4 x i32> + 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:%.*]]) #[[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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <8 x i32> + 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:%.*]]) #[[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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <16 x i32> + 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:%.*]]) #[[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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <32 x i32> + 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:%.*]]) #[[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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <2 x i32> %arg0, <2 x i32> poison, <2 x i32> + 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:%.*]]) #[[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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <4 x i32> + 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:%.*]]) #[[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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <8 x i32> + 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:%.*]]) #[[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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <16 x i32> + 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:%.*]]) #[[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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <32 x i32> + 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:%.*]]) #[[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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <2 x bfloat> %arg0, <2 x bfloat> poison, <2 x i32> + 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:%.*]]) #[[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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <3 x i32> + 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:%.*]]) #[[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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <4 x i32> + 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:%.*]]) #[[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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <6 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <8 x i32> + 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:%.*]]) #[[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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <16 x i32> + 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:%.*]]) #[[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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <32 x i32> + 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:%.*]]) #[[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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <2 x half> %arg0, <2 x half> poison, <2 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <3 x i32> + 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> +; 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> +; 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> +; 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> +; 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> +; 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> +; 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <4 x i32> + 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> +; 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> +; 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> +; 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> +; 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> +; 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> +; 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <6 x i32> + 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> +; 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> +; 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> +; 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> +; 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> +; 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> +; 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <8 x i32> + 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> +; 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> +; 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> +; 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> +; 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> +; 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> +; 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <16 x i32> + 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: [[TMP0:%.*]] = shufflevector <3 x half> [[ARG0]], <3 x half> poison, <3 x i32> +; 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> +; 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> +; 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> +; 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> +; 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> +; 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <32 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <2 x float> %arg0, <2 x float> poison, <2 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <3 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <4 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <6 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <8 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <16 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <32 x i32> + 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..b70840f85fbf2 --- /dev/null +++ b/llvm/test/Transforms/VectorCombine/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 -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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <2 x i8> %arg0, <2 x i8> poison, <2 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <4 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <8 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <16 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i8> %arg0, <3 x i8> poison, <32 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <2 x i16> %arg0, <2 x i16> poison, <2 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <4 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <8 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <16 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i16> %arg0, <3 x i16> poison, <32 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <2 x i32> %arg0, <2 x i32> poison, <2 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <4 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <8 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <16 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x i32> %arg0, <3 x i32> poison, <32 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <2 x bfloat> %arg0, <2 x bfloat> poison, <2 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <3 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <4 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <6 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <8 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <16 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x bfloat> %arg0, <3 x bfloat> poison, <32 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <2 x half> %arg0, <2 x half> poison, <2 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <3 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <4 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <6 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <8 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <16 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x half> %arg0, <3 x half> poison, <32 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <2 x float> %arg0, <2 x float> poison, <2 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <3 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <4 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <6 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <8 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <16 x i32> + 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> +; 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> +; 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> + tail call void @func0() + br label %finally + +else: + %val2 = shufflevector <3 x float> %arg0, <3 x float> poison, <32 x i32> + 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