diff --git a/llvm/lib/Target/AMDGPU/AMDGPUCodeGenPrepare.cpp b/llvm/lib/Target/AMDGPU/AMDGPUCodeGenPrepare.cpp index 22b921fb2084f..5f1983791cfae 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPUCodeGenPrepare.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPUCodeGenPrepare.cpp @@ -45,12 +45,6 @@ static cl::opt WidenLoads( cl::ReallyHidden, cl::init(false)); -static cl::opt Widen16BitOps( - "amdgpu-codegenprepare-widen-16-bit-ops", - cl::desc( - "Widen uniform 16-bit instructions to 32-bit in AMDGPUCodeGenPrepare"), - cl::ReallyHidden, cl::init(false)); - static cl::opt BreakLargePHIs("amdgpu-codegenprepare-break-large-phis", cl::desc("Break large PHI nodes for DAGISel"), @@ -150,18 +144,6 @@ class AMDGPUCodeGenPrepareImpl bool canBreakPHINode(const PHINode &I); - /// Copies exact/nsw/nuw flags (if any) from binary operation \p I to - /// binary operation \p V. - /// - /// \returns Binary operation \p V. - /// \returns \p T's base element bit width. - unsigned getBaseElementBitWidth(const Type *T) const; - - /// \returns Equivalent 32 bit integer type for given type \p T. For example, - /// if \p T is i7, then i32 is returned; if \p T is <3 x i12>, then <3 x i32> - /// is returned. - Type *getI32Ty(IRBuilder<> &B, const Type *T) const; - /// \returns True if binary operation \p I is a signed binary operation, false /// otherwise. bool isSigned(const BinaryOperator &I) const; @@ -170,10 +152,6 @@ class AMDGPUCodeGenPrepareImpl /// signed 'icmp' operation, false otherwise. bool isSigned(const SelectInst &I) const; - /// \returns True if type \p T needs to be promoted to 32 bit integer type, - /// false otherwise. - bool needsPromotionToI32(const Type *T) const; - /// Return true if \p T is a legal scalar floating point type. bool isLegalFloatingTy(const Type *T) const; @@ -188,52 +166,6 @@ class AMDGPUCodeGenPrepareImpl computeKnownFPClass(V, fcSubnormal, CtxI).isKnownNeverSubnormal(); } - /// Promotes uniform binary operation \p I to equivalent 32 bit binary - /// operation. - /// - /// \details \p I's base element bit width must be greater than 1 and less - /// than or equal 16. Promotion is done by sign or zero extending operands to - /// 32 bits, replacing \p I with equivalent 32 bit binary operation, and - /// truncating the result of 32 bit binary operation back to \p I's original - /// type. Division operation is not promoted. - /// - /// \returns True if \p I is promoted to equivalent 32 bit binary operation, - /// false otherwise. - bool promoteUniformOpToI32(BinaryOperator &I) const; - - /// Promotes uniform 'icmp' operation \p I to 32 bit 'icmp' operation. - /// - /// \details \p I's base element bit width must be greater than 1 and less - /// than or equal 16. Promotion is done by sign or zero extending operands to - /// 32 bits, and replacing \p I with 32 bit 'icmp' operation. - /// - /// \returns True. - bool promoteUniformOpToI32(ICmpInst &I) const; - - /// Promotes uniform 'select' operation \p I to 32 bit 'select' - /// operation. - /// - /// \details \p I's base element bit width must be greater than 1 and less - /// than or equal 16. Promotion is done by sign or zero extending operands to - /// 32 bits, replacing \p I with 32 bit 'select' operation, and truncating the - /// result of 32 bit 'select' operation back to \p I's original type. - /// - /// \returns True. - bool promoteUniformOpToI32(SelectInst &I) const; - - /// Promotes uniform 'bitreverse' intrinsic \p I to 32 bit 'bitreverse' - /// intrinsic. - /// - /// \details \p I's base element bit width must be greater than 1 and less - /// than or equal 16. Promotion is done by zero extending the operand to 32 - /// bits, replacing \p I with 32 bit 'bitreverse' intrinsic, shifting the - /// result of 32 bit 'bitreverse' intrinsic to the right with zero fill (the - /// shift amount is 32 minus \p I's base element bit width), and truncating - /// the result of the shift operation back to \p I's original type. - /// - /// \returns True. - bool promoteUniformBitreverseToI32(IntrinsicInst &I) const; - /// \returns The minimum number of bits needed to store the value of \Op as an /// unsigned integer. Truncating to this size and then zero-extending to /// the original will not change the value. @@ -320,13 +252,11 @@ class AMDGPUCodeGenPrepareImpl bool visitInstruction(Instruction &I) { return false; } bool visitBinaryOperator(BinaryOperator &I); bool visitLoadInst(LoadInst &I); - bool visitICmpInst(ICmpInst &I); bool visitSelectInst(SelectInst &I); bool visitPHINode(PHINode &I); bool visitAddrSpaceCastInst(AddrSpaceCastInst &I); bool visitIntrinsicInst(IntrinsicInst &I); - bool visitBitreverseIntrinsicInst(IntrinsicInst &I); bool visitFMinLike(IntrinsicInst &I); bool visitSqrt(IntrinsicInst &I); bool run(); @@ -380,22 +310,6 @@ bool AMDGPUCodeGenPrepareImpl::run() { return MadeChange; } -unsigned AMDGPUCodeGenPrepareImpl::getBaseElementBitWidth(const Type *T) const { - assert(needsPromotionToI32(T) && "T does not need promotion to i32"); - - if (T->isIntegerTy()) - return T->getIntegerBitWidth(); - return cast(T)->getElementType()->getIntegerBitWidth(); -} - -Type *AMDGPUCodeGenPrepareImpl::getI32Ty(IRBuilder<> &B, const Type *T) const { - assert(needsPromotionToI32(T) && "T does not need promotion to i32"); - - if (T->isIntegerTy()) - return B.getInt32Ty(); - return FixedVectorType::get(B.getInt32Ty(), cast(T)); -} - bool AMDGPUCodeGenPrepareImpl::isSigned(const BinaryOperator &I) const { return I.getOpcode() == Instruction::AShr || I.getOpcode() == Instruction::SDiv || I.getOpcode() == Instruction::SRem; @@ -406,59 +320,11 @@ bool AMDGPUCodeGenPrepareImpl::isSigned(const SelectInst &I) const { cast(I.getOperand(0))->isSigned(); } -bool AMDGPUCodeGenPrepareImpl::needsPromotionToI32(const Type *T) const { - if (!Widen16BitOps) - return false; - - const IntegerType *IntTy = dyn_cast(T); - if (IntTy && IntTy->getBitWidth() > 1 && IntTy->getBitWidth() <= 16) - return true; - - if (const VectorType *VT = dyn_cast(T)) { - // TODO: The set of packed operations is more limited, so may want to - // promote some anyway. - if (ST.hasVOP3PInsts()) - return false; - - return needsPromotionToI32(VT->getElementType()); - } - - return false; -} - bool AMDGPUCodeGenPrepareImpl::isLegalFloatingTy(const Type *Ty) const { return Ty->isFloatTy() || Ty->isDoubleTy() || (Ty->isHalfTy() && ST.has16BitInsts()); } -// Return true if the op promoted to i32 should have nsw set. -static bool promotedOpIsNSW(const Instruction &I) { - switch (I.getOpcode()) { - case Instruction::Shl: - case Instruction::Add: - case Instruction::Sub: - return true; - case Instruction::Mul: - return I.hasNoUnsignedWrap(); - default: - return false; - } -} - -// Return true if the op promoted to i32 should have nuw set. -static bool promotedOpIsNUW(const Instruction &I) { - switch (I.getOpcode()) { - case Instruction::Shl: - case Instruction::Add: - case Instruction::Mul: - return true; - case Instruction::Sub: - return I.hasNoUnsignedWrap(); - default: - return false; - } -} - bool AMDGPUCodeGenPrepareImpl::canWidenScalarExtLoad(LoadInst &I) const { Type *Ty = I.getType(); int TySize = DL.getTypeSizeInBits(Ty); @@ -467,134 +333,6 @@ bool AMDGPUCodeGenPrepareImpl::canWidenScalarExtLoad(LoadInst &I) const { return I.isSimple() && TySize < 32 && Alignment >= 4 && UA.isUniform(&I); } -bool AMDGPUCodeGenPrepareImpl::promoteUniformOpToI32(BinaryOperator &I) const { - assert(needsPromotionToI32(I.getType()) && - "I does not need promotion to i32"); - - if (I.getOpcode() == Instruction::SDiv || - I.getOpcode() == Instruction::UDiv || - I.getOpcode() == Instruction::SRem || - I.getOpcode() == Instruction::URem) - return false; - - IRBuilder<> Builder(&I); - Builder.SetCurrentDebugLocation(I.getDebugLoc()); - - Type *I32Ty = getI32Ty(Builder, I.getType()); - Value *ExtOp0 = nullptr; - Value *ExtOp1 = nullptr; - Value *ExtRes = nullptr; - Value *TruncRes = nullptr; - - if (isSigned(I)) { - ExtOp0 = Builder.CreateSExt(I.getOperand(0), I32Ty); - ExtOp1 = Builder.CreateSExt(I.getOperand(1), I32Ty); - } else { - ExtOp0 = Builder.CreateZExt(I.getOperand(0), I32Ty); - ExtOp1 = Builder.CreateZExt(I.getOperand(1), I32Ty); - } - - ExtRes = Builder.CreateBinOp(I.getOpcode(), ExtOp0, ExtOp1); - if (Instruction *Inst = dyn_cast(ExtRes)) { - if (promotedOpIsNSW(cast(I))) - Inst->setHasNoSignedWrap(); - - if (promotedOpIsNUW(cast(I))) - Inst->setHasNoUnsignedWrap(); - - if (const auto *ExactOp = dyn_cast(&I)) - Inst->setIsExact(ExactOp->isExact()); - } - - TruncRes = Builder.CreateTrunc(ExtRes, I.getType()); - - I.replaceAllUsesWith(TruncRes); - I.eraseFromParent(); - - return true; -} - -bool AMDGPUCodeGenPrepareImpl::promoteUniformOpToI32(ICmpInst &I) const { - assert(needsPromotionToI32(I.getOperand(0)->getType()) && - "I does not need promotion to i32"); - - IRBuilder<> Builder(&I); - Builder.SetCurrentDebugLocation(I.getDebugLoc()); - - Type *I32Ty = getI32Ty(Builder, I.getOperand(0)->getType()); - Value *ExtOp0 = nullptr; - Value *ExtOp1 = nullptr; - Value *NewICmp = nullptr; - - if (I.isSigned()) { - ExtOp0 = Builder.CreateSExt(I.getOperand(0), I32Ty); - ExtOp1 = Builder.CreateSExt(I.getOperand(1), I32Ty); - } else { - ExtOp0 = Builder.CreateZExt(I.getOperand(0), I32Ty); - ExtOp1 = Builder.CreateZExt(I.getOperand(1), I32Ty); - } - NewICmp = Builder.CreateICmp(I.getPredicate(), ExtOp0, ExtOp1); - - I.replaceAllUsesWith(NewICmp); - I.eraseFromParent(); - - return true; -} - -bool AMDGPUCodeGenPrepareImpl::promoteUniformOpToI32(SelectInst &I) const { - assert(needsPromotionToI32(I.getType()) && - "I does not need promotion to i32"); - - IRBuilder<> Builder(&I); - Builder.SetCurrentDebugLocation(I.getDebugLoc()); - - Type *I32Ty = getI32Ty(Builder, I.getType()); - Value *ExtOp1 = nullptr; - Value *ExtOp2 = nullptr; - Value *ExtRes = nullptr; - Value *TruncRes = nullptr; - - if (isSigned(I)) { - ExtOp1 = Builder.CreateSExt(I.getOperand(1), I32Ty); - ExtOp2 = Builder.CreateSExt(I.getOperand(2), I32Ty); - } else { - ExtOp1 = Builder.CreateZExt(I.getOperand(1), I32Ty); - ExtOp2 = Builder.CreateZExt(I.getOperand(2), I32Ty); - } - ExtRes = Builder.CreateSelect(I.getOperand(0), ExtOp1, ExtOp2); - TruncRes = Builder.CreateTrunc(ExtRes, I.getType()); - - I.replaceAllUsesWith(TruncRes); - I.eraseFromParent(); - - return true; -} - -bool AMDGPUCodeGenPrepareImpl::promoteUniformBitreverseToI32( - IntrinsicInst &I) const { - assert(I.getIntrinsicID() == Intrinsic::bitreverse && - "I must be bitreverse intrinsic"); - assert(needsPromotionToI32(I.getType()) && - "I does not need promotion to i32"); - - IRBuilder<> Builder(&I); - Builder.SetCurrentDebugLocation(I.getDebugLoc()); - - Type *I32Ty = getI32Ty(Builder, I.getType()); - Value *ExtOp = Builder.CreateZExt(I.getOperand(0), I32Ty); - Value *ExtRes = - Builder.CreateIntrinsic(Intrinsic::bitreverse, {I32Ty}, {ExtOp}); - Value *LShrOp = - Builder.CreateLShr(ExtRes, 32 - getBaseElementBitWidth(I.getType())); - Value *TruncRes = - Builder.CreateTrunc(LShrOp, I.getType()); - - I.replaceAllUsesWith(TruncRes); - I.eraseFromParent(); - - return true; -} - unsigned AMDGPUCodeGenPrepareImpl::numBitsUnsigned(Value *Op) const { return computeKnownBits(Op, DL, AC).countMaxActiveBits(); } @@ -1635,10 +1373,6 @@ bool AMDGPUCodeGenPrepareImpl::visitBinaryOperator(BinaryOperator &I) { if (foldBinOpIntoSelect(I)) return true; - if (ST.has16BitInsts() && needsPromotionToI32(I.getType()) && - UA.isUniform(&I) && promoteUniformOpToI32(I)) - return true; - if (UseMul24Intrin && replaceMulWithMul24(I)) return true; if (tryNarrowMathIfNoOverflow(&I, ST.getTargetLowering(), @@ -1770,16 +1504,6 @@ bool AMDGPUCodeGenPrepareImpl::visitLoadInst(LoadInst &I) { return false; } -bool AMDGPUCodeGenPrepareImpl::visitICmpInst(ICmpInst &I) { - bool Changed = false; - - if (ST.has16BitInsts() && needsPromotionToI32(I.getOperand(0)->getType()) && - UA.isUniform(&I)) - Changed |= promoteUniformOpToI32(I); - - return Changed; -} - bool AMDGPUCodeGenPrepareImpl::visitSelectInst(SelectInst &I) { Value *Cond = I.getCondition(); Value *TrueVal = I.getTrueValue(); @@ -1787,12 +1511,6 @@ bool AMDGPUCodeGenPrepareImpl::visitSelectInst(SelectInst &I) { Value *CmpVal; CmpPredicate Pred; - if (ST.has16BitInsts() && needsPromotionToI32(I.getType())) { - if (UA.isUniform(&I)) - return promoteUniformOpToI32(I); - return false; - } - // Match fract pattern with nan check. if (!match(Cond, m_FCmp(Pred, m_Value(CmpVal), m_NonNaN()))) return false; @@ -2196,8 +1914,6 @@ bool AMDGPUCodeGenPrepareImpl::visitAddrSpaceCastInst(AddrSpaceCastInst &I) { bool AMDGPUCodeGenPrepareImpl::visitIntrinsicInst(IntrinsicInst &I) { switch (I.getIntrinsicID()) { - case Intrinsic::bitreverse: - return visitBitreverseIntrinsicInst(I); case Intrinsic::minnum: case Intrinsic::minimumnum: case Intrinsic::minimum: @@ -2209,16 +1925,6 @@ bool AMDGPUCodeGenPrepareImpl::visitIntrinsicInst(IntrinsicInst &I) { } } -bool AMDGPUCodeGenPrepareImpl::visitBitreverseIntrinsicInst(IntrinsicInst &I) { - bool Changed = false; - - if (ST.has16BitInsts() && needsPromotionToI32(I.getType()) && - UA.isUniform(&I)) - Changed |= promoteUniformBitreverseToI32(I); - - return Changed; -} - /// Match non-nan fract pattern. /// minnum(fsub(x, floor(x)), nextafter(1.0, -1.0)) /// minimumnum(fsub(x, floor(x)), nextafter(1.0, -1.0)) diff --git a/llvm/test/CodeGen/AMDGPU/GlobalISel/andn2.ll b/llvm/test/CodeGen/AMDGPU/GlobalISel/andn2.ll index 32e461ba09f06..e1ef3f9be0a5d 100644 --- a/llvm/test/CodeGen/AMDGPU/GlobalISel/andn2.ll +++ b/llvm/test/CodeGen/AMDGPU/GlobalISel/andn2.ll @@ -1,8 +1,8 @@ ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py -; RUN: llc -global-isel -amdgpu-codegenprepare-widen-16-bit-ops=0 -mtriple=amdgcn-mesa-mesa3d -mcpu=tahiti < %s | FileCheck -check-prefixes=GCN,GFX6 %s -; RUN: llc -global-isel -amdgpu-codegenprepare-widen-16-bit-ops=0 -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx900 < %s | FileCheck -check-prefixes=GCN,GFX9 %s -; RUN: llc -global-isel -amdgpu-codegenprepare-widen-16-bit-ops=0 -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx1010 < %s | FileCheck -check-prefixes=GFX10PLUS,GFX10 %s -; RUN: llc -global-isel -amdgpu-codegenprepare-widen-16-bit-ops=0 -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx1100 -mattr=-real-true16 -amdgpu-enable-delay-alu=0 < %s | FileCheck -check-prefixes=GFX10PLUS,GFX11 %s +; RUN: llc -global-isel -mtriple=amdgcn-mesa-mesa3d -mcpu=tahiti < %s | FileCheck -check-prefixes=GCN,GFX6 %s +; RUN: llc -global-isel -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx900 < %s | FileCheck -check-prefixes=GCN,GFX9 %s +; RUN: llc -global-isel -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx1010 < %s | FileCheck -check-prefixes=GFX10PLUS,GFX10 %s +; RUN: llc -global-isel -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx1100 -mattr=-real-true16 -amdgpu-enable-delay-alu=0 < %s | FileCheck -check-prefixes=GFX10PLUS,GFX11 %s define amdgpu_ps i32 @s_andn2_i32(i32 inreg %src0, i32 inreg %src1) { ; GCN-LABEL: s_andn2_i32: diff --git a/llvm/test/CodeGen/AMDGPU/GlobalISel/orn2.ll b/llvm/test/CodeGen/AMDGPU/GlobalISel/orn2.ll index 12b37c386c140..afabc7b62386f 100644 --- a/llvm/test/CodeGen/AMDGPU/GlobalISel/orn2.ll +++ b/llvm/test/CodeGen/AMDGPU/GlobalISel/orn2.ll @@ -1,8 +1,8 @@ ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py -; RUN: llc -global-isel -amdgpu-codegenprepare-widen-16-bit-ops=0 -mtriple=amdgcn-mesa-mesa3d -mcpu=tahiti < %s | FileCheck -check-prefixes=GCN,GFX6 %s -; RUN: llc -global-isel -amdgpu-codegenprepare-widen-16-bit-ops=0 -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx900 < %s | FileCheck -check-prefixes=GCN,GFX9 %s -; RUN: llc -global-isel -amdgpu-codegenprepare-widen-16-bit-ops=0 -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx1010 < %s | FileCheck -check-prefixes=GFX10PLUS,GFX10 %s -; RUN: llc -global-isel -amdgpu-codegenprepare-widen-16-bit-ops=0 -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx1100 -mattr=-real-true16 -amdgpu-enable-delay-alu=0 < %s | FileCheck -check-prefixes=GFX10PLUS,GFX11 %s +; RUN: llc -global-isel -mtriple=amdgcn-mesa-mesa3d -mcpu=tahiti < %s | FileCheck -check-prefixes=GCN,GFX6 %s +; RUN: llc -global-isel -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx900 < %s | FileCheck -check-prefixes=GCN,GFX9 %s +; RUN: llc -global-isel -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx1010 < %s | FileCheck -check-prefixes=GFX10PLUS,GFX10 %s +; RUN: llc -global-isel -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx1100 -mattr=-real-true16 -amdgpu-enable-delay-alu=0 < %s | FileCheck -check-prefixes=GFX10PLUS,GFX11 %s define amdgpu_ps i32 @s_orn2_i32(i32 inreg %src0, i32 inreg %src1) { ; GCN-LABEL: s_orn2_i32: diff --git a/llvm/test/CodeGen/AMDGPU/amdgpu-codegenprepare-i16-to-i32.ll b/llvm/test/CodeGen/AMDGPU/amdgpu-codegenprepare-i16-to-i32.ll deleted file mode 100644 index 8945708e0f0ca..0000000000000 --- a/llvm/test/CodeGen/AMDGPU/amdgpu-codegenprepare-i16-to-i32.ll +++ /dev/null @@ -1,2853 +0,0 @@ -; NOTE: Assertions have been autogenerated by utils/update_test_checks.py -; RUN: opt -S -amdgpu-codegenprepare-widen-16-bit-ops -mtriple=amdgcn-- -amdgpu-codegenprepare %s | FileCheck -check-prefix=SI %s -; RUN: opt -S -amdgpu-codegenprepare-widen-16-bit-ops -mtriple=amdgcn-- -mcpu=tonga -amdgpu-codegenprepare %s | FileCheck -check-prefix=VI %s - -define amdgpu_kernel void @add_i3(i3 %a, i3 %b) { -; SI-LABEL: @add_i3( -; SI-NEXT: [[R:%.*]] = add i3 [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile i3 [[R]], ptr addrspace(1) poison, align 1 -; SI-NEXT: ret void -; -; VI-LABEL: @add_i3( -; VI-NEXT: [[TMP1:%.*]] = zext i3 [[A:%.*]] to i32 -; VI-NEXT: [[TMP2:%.*]] = zext i3 [[B:%.*]] to i32 -; VI-NEXT: [[TMP3:%.*]] = add nuw nsw i32 [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc i32 [[TMP3]] to i3 -; VI-NEXT: store volatile i3 [[TMP4]], ptr addrspace(1) poison, align 1 -; VI-NEXT: ret void -; - %r = add i3 %a, %b - store volatile i3 %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @add_nsw_i3(i3 %a, i3 %b) { -; SI-LABEL: @add_nsw_i3( -; SI-NEXT: [[R:%.*]] = add nsw i3 [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile i3 [[R]], ptr addrspace(1) poison, align 1 -; SI-NEXT: ret void -; -; VI-LABEL: @add_nsw_i3( -; VI-NEXT: [[TMP1:%.*]] = zext i3 [[A:%.*]] to i32 -; VI-NEXT: [[TMP2:%.*]] = zext i3 [[B:%.*]] to i32 -; VI-NEXT: [[TMP3:%.*]] = add nuw nsw i32 [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc i32 [[TMP3]] to i3 -; VI-NEXT: store volatile i3 [[TMP4]], ptr addrspace(1) poison, align 1 -; VI-NEXT: ret void -; - %r = add nsw i3 %a, %b - store volatile i3 %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @add_nuw_i3(i3 %a, i3 %b) { -; SI-LABEL: @add_nuw_i3( -; SI-NEXT: [[R:%.*]] = add nuw i3 [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile i3 [[R]], ptr addrspace(1) poison, align 1 -; SI-NEXT: ret void -; -; VI-LABEL: @add_nuw_i3( -; VI-NEXT: [[TMP1:%.*]] = zext i3 [[A:%.*]] to i32 -; VI-NEXT: [[TMP2:%.*]] = zext i3 [[B:%.*]] to i32 -; VI-NEXT: [[TMP3:%.*]] = add nuw nsw i32 [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc i32 [[TMP3]] to i3 -; VI-NEXT: store volatile i3 [[TMP4]], ptr addrspace(1) poison, align 1 -; VI-NEXT: ret void -; - %r = add nuw i3 %a, %b - store volatile i3 %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @add_nuw_nsw_i3(i3 %a, i3 %b) { -; SI-LABEL: @add_nuw_nsw_i3( -; SI-NEXT: [[R:%.*]] = add nuw nsw i3 [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile i3 [[R]], ptr addrspace(1) poison, align 1 -; SI-NEXT: ret void -; -; VI-LABEL: @add_nuw_nsw_i3( -; VI-NEXT: [[TMP1:%.*]] = zext i3 [[A:%.*]] to i32 -; VI-NEXT: [[TMP2:%.*]] = zext i3 [[B:%.*]] to i32 -; VI-NEXT: [[TMP3:%.*]] = add nuw nsw i32 [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc i32 [[TMP3]] to i3 -; VI-NEXT: store volatile i3 [[TMP4]], ptr addrspace(1) poison, align 1 -; VI-NEXT: ret void -; - %r = add nuw nsw i3 %a, %b - store volatile i3 %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @sub_i3(i3 %a, i3 %b) { -; SI-LABEL: @sub_i3( -; SI-NEXT: [[R:%.*]] = sub i3 [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile i3 [[R]], ptr addrspace(1) poison, align 1 -; SI-NEXT: ret void -; -; VI-LABEL: @sub_i3( -; VI-NEXT: [[TMP1:%.*]] = zext i3 [[A:%.*]] to i32 -; VI-NEXT: [[TMP2:%.*]] = zext i3 [[B:%.*]] to i32 -; VI-NEXT: [[TMP3:%.*]] = sub nsw i32 [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc i32 [[TMP3]] to i3 -; VI-NEXT: store volatile i3 [[TMP4]], ptr addrspace(1) poison, align 1 -; VI-NEXT: ret void -; - %r = sub i3 %a, %b - store volatile i3 %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @sub_nsw_i3(i3 %a, i3 %b) { -; SI-LABEL: @sub_nsw_i3( -; SI-NEXT: [[R:%.*]] = sub nsw i3 [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile i3 [[R]], ptr addrspace(1) poison, align 1 -; SI-NEXT: ret void -; -; VI-LABEL: @sub_nsw_i3( -; VI-NEXT: [[TMP1:%.*]] = zext i3 [[A:%.*]] to i32 -; VI-NEXT: [[TMP2:%.*]] = zext i3 [[B:%.*]] to i32 -; VI-NEXT: [[TMP3:%.*]] = sub nsw i32 [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc i32 [[TMP3]] to i3 -; VI-NEXT: store volatile i3 [[TMP4]], ptr addrspace(1) poison, align 1 -; VI-NEXT: ret void -; - %r = sub nsw i3 %a, %b - store volatile i3 %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @sub_nuw_i3(i3 %a, i3 %b) { -; SI-LABEL: @sub_nuw_i3( -; SI-NEXT: [[R:%.*]] = sub nuw i3 [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile i3 [[R]], ptr addrspace(1) poison, align 1 -; SI-NEXT: ret void -; -; VI-LABEL: @sub_nuw_i3( -; VI-NEXT: [[TMP1:%.*]] = zext i3 [[A:%.*]] to i32 -; VI-NEXT: [[TMP2:%.*]] = zext i3 [[B:%.*]] to i32 -; VI-NEXT: [[TMP3:%.*]] = sub nuw nsw i32 [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc i32 [[TMP3]] to i3 -; VI-NEXT: store volatile i3 [[TMP4]], ptr addrspace(1) poison, align 1 -; VI-NEXT: ret void -; - %r = sub nuw i3 %a, %b - store volatile i3 %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @sub_nuw_nsw_i3(i3 %a, i3 %b) { -; SI-LABEL: @sub_nuw_nsw_i3( -; SI-NEXT: [[R:%.*]] = sub nuw nsw i3 [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile i3 [[R]], ptr addrspace(1) poison, align 1 -; SI-NEXT: ret void -; -; VI-LABEL: @sub_nuw_nsw_i3( -; VI-NEXT: [[TMP1:%.*]] = zext i3 [[A:%.*]] to i32 -; VI-NEXT: [[TMP2:%.*]] = zext i3 [[B:%.*]] to i32 -; VI-NEXT: [[TMP3:%.*]] = sub nuw nsw i32 [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc i32 [[TMP3]] to i3 -; VI-NEXT: store volatile i3 [[TMP4]], ptr addrspace(1) poison, align 1 -; VI-NEXT: ret void -; - %r = sub nuw nsw i3 %a, %b - store volatile i3 %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @mul_i3(i3 %a, i3 %b) { -; SI-LABEL: @mul_i3( -; SI-NEXT: [[R:%.*]] = mul i3 [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile i3 [[R]], ptr addrspace(1) poison, align 1 -; SI-NEXT: ret void -; -; VI-LABEL: @mul_i3( -; VI-NEXT: [[TMP1:%.*]] = zext i3 [[A:%.*]] to i32 -; VI-NEXT: [[TMP2:%.*]] = zext i3 [[B:%.*]] to i32 -; VI-NEXT: [[TMP3:%.*]] = mul nuw i32 [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc i32 [[TMP3]] to i3 -; VI-NEXT: store volatile i3 [[TMP4]], ptr addrspace(1) poison, align 1 -; VI-NEXT: ret void -; - %r = mul i3 %a, %b - store volatile i3 %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @mul_nsw_i3(i3 %a, i3 %b) { -; SI-LABEL: @mul_nsw_i3( -; SI-NEXT: [[R:%.*]] = mul nsw i3 [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile i3 [[R]], ptr addrspace(1) poison, align 1 -; SI-NEXT: ret void -; -; VI-LABEL: @mul_nsw_i3( -; VI-NEXT: [[TMP1:%.*]] = zext i3 [[A:%.*]] to i32 -; VI-NEXT: [[TMP2:%.*]] = zext i3 [[B:%.*]] to i32 -; VI-NEXT: [[TMP3:%.*]] = mul nuw i32 [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc i32 [[TMP3]] to i3 -; VI-NEXT: store volatile i3 [[TMP4]], ptr addrspace(1) poison, align 1 -; VI-NEXT: ret void -; - %r = mul nsw i3 %a, %b - store volatile i3 %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @mul_nuw_i3(i3 %a, i3 %b) { -; SI-LABEL: @mul_nuw_i3( -; SI-NEXT: [[R:%.*]] = mul nuw i3 [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile i3 [[R]], ptr addrspace(1) poison, align 1 -; SI-NEXT: ret void -; -; VI-LABEL: @mul_nuw_i3( -; VI-NEXT: [[TMP1:%.*]] = zext i3 [[A:%.*]] to i32 -; VI-NEXT: [[TMP2:%.*]] = zext i3 [[B:%.*]] to i32 -; VI-NEXT: [[TMP3:%.*]] = mul nuw nsw i32 [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc i32 [[TMP3]] to i3 -; VI-NEXT: store volatile i3 [[TMP4]], ptr addrspace(1) poison, align 1 -; VI-NEXT: ret void -; - %r = mul nuw i3 %a, %b - store volatile i3 %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @mul_nuw_nsw_i3(i3 %a, i3 %b) { -; SI-LABEL: @mul_nuw_nsw_i3( -; SI-NEXT: [[R:%.*]] = mul nuw nsw i3 [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile i3 [[R]], ptr addrspace(1) poison, align 1 -; SI-NEXT: ret void -; -; VI-LABEL: @mul_nuw_nsw_i3( -; VI-NEXT: [[TMP1:%.*]] = zext i3 [[A:%.*]] to i32 -; VI-NEXT: [[TMP2:%.*]] = zext i3 [[B:%.*]] to i32 -; VI-NEXT: [[TMP3:%.*]] = mul nuw nsw i32 [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc i32 [[TMP3]] to i3 -; VI-NEXT: store volatile i3 [[TMP4]], ptr addrspace(1) poison, align 1 -; VI-NEXT: ret void -; - %r = mul nuw nsw i3 %a, %b - store volatile i3 %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @shl_i3(i3 %a, i3 %b) { -; SI-LABEL: @shl_i3( -; SI-NEXT: [[R:%.*]] = shl i3 [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile i3 [[R]], ptr addrspace(1) poison, align 1 -; SI-NEXT: ret void -; -; VI-LABEL: @shl_i3( -; VI-NEXT: [[TMP1:%.*]] = zext i3 [[A:%.*]] to i32 -; VI-NEXT: [[TMP2:%.*]] = zext i3 [[B:%.*]] to i32 -; VI-NEXT: [[TMP3:%.*]] = shl nuw nsw i32 [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc i32 [[TMP3]] to i3 -; VI-NEXT: store volatile i3 [[TMP4]], ptr addrspace(1) poison, align 1 -; VI-NEXT: ret void -; - %r = shl i3 %a, %b - store volatile i3 %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @shl_nsw_i3(i3 %a, i3 %b) { -; SI-LABEL: @shl_nsw_i3( -; SI-NEXT: [[R:%.*]] = shl nsw i3 [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile i3 [[R]], ptr addrspace(1) poison, align 1 -; SI-NEXT: ret void -; -; VI-LABEL: @shl_nsw_i3( -; VI-NEXT: [[TMP1:%.*]] = zext i3 [[A:%.*]] to i32 -; VI-NEXT: [[TMP2:%.*]] = zext i3 [[B:%.*]] to i32 -; VI-NEXT: [[TMP3:%.*]] = shl nuw nsw i32 [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc i32 [[TMP3]] to i3 -; VI-NEXT: store volatile i3 [[TMP4]], ptr addrspace(1) poison, align 1 -; VI-NEXT: ret void -; - %r = shl nsw i3 %a, %b - store volatile i3 %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @shl_nuw_i3(i3 %a, i3 %b) { -; SI-LABEL: @shl_nuw_i3( -; SI-NEXT: [[R:%.*]] = shl nuw i3 [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile i3 [[R]], ptr addrspace(1) poison, align 1 -; SI-NEXT: ret void -; -; VI-LABEL: @shl_nuw_i3( -; VI-NEXT: [[TMP1:%.*]] = zext i3 [[A:%.*]] to i32 -; VI-NEXT: [[TMP2:%.*]] = zext i3 [[B:%.*]] to i32 -; VI-NEXT: [[TMP3:%.*]] = shl nuw nsw i32 [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc i32 [[TMP3]] to i3 -; VI-NEXT: store volatile i3 [[TMP4]], ptr addrspace(1) poison, align 1 -; VI-NEXT: ret void -; - %r = shl nuw i3 %a, %b - store volatile i3 %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @shl_nuw_nsw_i3(i3 %a, i3 %b) { -; SI-LABEL: @shl_nuw_nsw_i3( -; SI-NEXT: [[R:%.*]] = shl nuw nsw i3 [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile i3 [[R]], ptr addrspace(1) poison, align 1 -; SI-NEXT: ret void -; -; VI-LABEL: @shl_nuw_nsw_i3( -; VI-NEXT: [[TMP1:%.*]] = zext i3 [[A:%.*]] to i32 -; VI-NEXT: [[TMP2:%.*]] = zext i3 [[B:%.*]] to i32 -; VI-NEXT: [[TMP3:%.*]] = shl nuw nsw i32 [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc i32 [[TMP3]] to i3 -; VI-NEXT: store volatile i3 [[TMP4]], ptr addrspace(1) poison, align 1 -; VI-NEXT: ret void -; - %r = shl nuw nsw i3 %a, %b - store volatile i3 %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @lshr_i3(i3 %a, i3 %b) { -; SI-LABEL: @lshr_i3( -; SI-NEXT: [[R:%.*]] = lshr i3 [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile i3 [[R]], ptr addrspace(1) poison, align 1 -; SI-NEXT: ret void -; -; VI-LABEL: @lshr_i3( -; VI-NEXT: [[TMP1:%.*]] = zext i3 [[A:%.*]] to i32 -; VI-NEXT: [[TMP2:%.*]] = zext i3 [[B:%.*]] to i32 -; VI-NEXT: [[TMP3:%.*]] = lshr i32 [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc i32 [[TMP3]] to i3 -; VI-NEXT: store volatile i3 [[TMP4]], ptr addrspace(1) poison, align 1 -; VI-NEXT: ret void -; - %r = lshr i3 %a, %b - store volatile i3 %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @lshr_exact_i3(i3 %a, i3 %b) { -; SI-LABEL: @lshr_exact_i3( -; SI-NEXT: [[R:%.*]] = lshr exact i3 [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile i3 [[R]], ptr addrspace(1) poison, align 1 -; SI-NEXT: ret void -; -; VI-LABEL: @lshr_exact_i3( -; VI-NEXT: [[TMP1:%.*]] = zext i3 [[A:%.*]] to i32 -; VI-NEXT: [[TMP2:%.*]] = zext i3 [[B:%.*]] to i32 -; VI-NEXT: [[TMP3:%.*]] = lshr exact i32 [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc i32 [[TMP3]] to i3 -; VI-NEXT: store volatile i3 [[TMP4]], ptr addrspace(1) poison, align 1 -; VI-NEXT: ret void -; - %r = lshr exact i3 %a, %b - store volatile i3 %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @ashr_i3(i3 %a, i3 %b) { -; SI-LABEL: @ashr_i3( -; SI-NEXT: [[R:%.*]] = ashr i3 [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile i3 [[R]], ptr addrspace(1) poison, align 1 -; SI-NEXT: ret void -; -; VI-LABEL: @ashr_i3( -; VI-NEXT: [[TMP1:%.*]] = sext i3 [[A:%.*]] to i32 -; VI-NEXT: [[TMP2:%.*]] = sext i3 [[B:%.*]] to i32 -; VI-NEXT: [[TMP3:%.*]] = ashr i32 [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc i32 [[TMP3]] to i3 -; VI-NEXT: store volatile i3 [[TMP4]], ptr addrspace(1) poison, align 1 -; VI-NEXT: ret void -; - %r = ashr i3 %a, %b - store volatile i3 %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @ashr_exact_i3(i3 %a, i3 %b) { -; SI-LABEL: @ashr_exact_i3( -; SI-NEXT: [[R:%.*]] = ashr exact i3 [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile i3 [[R]], ptr addrspace(1) poison, align 1 -; SI-NEXT: ret void -; -; VI-LABEL: @ashr_exact_i3( -; VI-NEXT: [[TMP1:%.*]] = sext i3 [[A:%.*]] to i32 -; VI-NEXT: [[TMP2:%.*]] = sext i3 [[B:%.*]] to i32 -; VI-NEXT: [[TMP3:%.*]] = ashr exact i32 [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc i32 [[TMP3]] to i3 -; VI-NEXT: store volatile i3 [[TMP4]], ptr addrspace(1) poison, align 1 -; VI-NEXT: ret void -; - %r = ashr exact i3 %a, %b - store volatile i3 %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @and_i3(i3 %a, i3 %b) { -; SI-LABEL: @and_i3( -; SI-NEXT: [[R:%.*]] = and i3 [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile i3 [[R]], ptr addrspace(1) poison, align 1 -; SI-NEXT: ret void -; -; VI-LABEL: @and_i3( -; VI-NEXT: [[TMP1:%.*]] = zext i3 [[A:%.*]] to i32 -; VI-NEXT: [[TMP2:%.*]] = zext i3 [[B:%.*]] to i32 -; VI-NEXT: [[TMP3:%.*]] = and i32 [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc i32 [[TMP3]] to i3 -; VI-NEXT: store volatile i3 [[TMP4]], ptr addrspace(1) poison, align 1 -; VI-NEXT: ret void -; - %r = and i3 %a, %b - store volatile i3 %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @or_i3(i3 %a, i3 %b) { -; SI-LABEL: @or_i3( -; SI-NEXT: [[R:%.*]] = or i3 [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile i3 [[R]], ptr addrspace(1) poison, align 1 -; SI-NEXT: ret void -; -; VI-LABEL: @or_i3( -; VI-NEXT: [[TMP1:%.*]] = zext i3 [[A:%.*]] to i32 -; VI-NEXT: [[TMP2:%.*]] = zext i3 [[B:%.*]] to i32 -; VI-NEXT: [[TMP3:%.*]] = or i32 [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc i32 [[TMP3]] to i3 -; VI-NEXT: store volatile i3 [[TMP4]], ptr addrspace(1) poison, align 1 -; VI-NEXT: ret void -; - %r = or i3 %a, %b - store volatile i3 %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @xor_i3(i3 %a, i3 %b) { -; SI-LABEL: @xor_i3( -; SI-NEXT: [[R:%.*]] = xor i3 [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile i3 [[R]], ptr addrspace(1) poison, align 1 -; SI-NEXT: ret void -; -; VI-LABEL: @xor_i3( -; VI-NEXT: [[TMP1:%.*]] = zext i3 [[A:%.*]] to i32 -; VI-NEXT: [[TMP2:%.*]] = zext i3 [[B:%.*]] to i32 -; VI-NEXT: [[TMP3:%.*]] = xor i32 [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc i32 [[TMP3]] to i3 -; VI-NEXT: store volatile i3 [[TMP4]], ptr addrspace(1) poison, align 1 -; VI-NEXT: ret void -; - %r = xor i3 %a, %b - store volatile i3 %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @select_eq_i3(i3 %a, i3 %b) { -; SI-LABEL: @select_eq_i3( -; SI-NEXT: [[CMP:%.*]] = icmp eq i3 [[A:%.*]], [[B:%.*]] -; SI-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i3 [[A]], i3 [[B]] -; SI-NEXT: store volatile i3 [[SEL]], ptr addrspace(1) poison, align 1 -; SI-NEXT: ret void -; -; VI-LABEL: @select_eq_i3( -; VI-NEXT: [[TMP1:%.*]] = zext i3 [[A:%.*]] to i32 -; VI-NEXT: [[TMP2:%.*]] = zext i3 [[B:%.*]] to i32 -; VI-NEXT: [[TMP3:%.*]] = icmp eq i32 [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = zext i3 [[A]] to i32 -; VI-NEXT: [[TMP5:%.*]] = zext i3 [[B]] to i32 -; VI-NEXT: [[TMP6:%.*]] = select i1 [[TMP3]], i32 [[TMP4]], i32 [[TMP5]] -; VI-NEXT: [[TMP7:%.*]] = trunc i32 [[TMP6]] to i3 -; VI-NEXT: store volatile i3 [[TMP7]], ptr addrspace(1) poison, align 1 -; VI-NEXT: ret void -; - %cmp = icmp eq i3 %a, %b - %sel = select i1 %cmp, i3 %a, i3 %b - store volatile i3 %sel, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @select_ne_i3(i3 %a, i3 %b) { -; SI-LABEL: @select_ne_i3( -; SI-NEXT: [[CMP:%.*]] = icmp ne i3 [[A:%.*]], [[B:%.*]] -; SI-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i3 [[A]], i3 [[B]] -; SI-NEXT: store volatile i3 [[SEL]], ptr addrspace(1) poison, align 1 -; SI-NEXT: ret void -; -; VI-LABEL: @select_ne_i3( -; VI-NEXT: [[TMP1:%.*]] = zext i3 [[A:%.*]] to i32 -; VI-NEXT: [[TMP2:%.*]] = zext i3 [[B:%.*]] to i32 -; VI-NEXT: [[TMP3:%.*]] = icmp ne i32 [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = zext i3 [[A]] to i32 -; VI-NEXT: [[TMP5:%.*]] = zext i3 [[B]] to i32 -; VI-NEXT: [[TMP6:%.*]] = select i1 [[TMP3]], i32 [[TMP4]], i32 [[TMP5]] -; VI-NEXT: [[TMP7:%.*]] = trunc i32 [[TMP6]] to i3 -; VI-NEXT: store volatile i3 [[TMP7]], ptr addrspace(1) poison, align 1 -; VI-NEXT: ret void -; - %cmp = icmp ne i3 %a, %b - %sel = select i1 %cmp, i3 %a, i3 %b - store volatile i3 %sel, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @select_ugt_i3(i3 %a, i3 %b) { -; SI-LABEL: @select_ugt_i3( -; SI-NEXT: [[CMP:%.*]] = icmp ugt i3 [[A:%.*]], [[B:%.*]] -; SI-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i3 [[A]], i3 [[B]] -; SI-NEXT: store volatile i3 [[SEL]], ptr addrspace(1) poison, align 1 -; SI-NEXT: ret void -; -; VI-LABEL: @select_ugt_i3( -; VI-NEXT: [[TMP1:%.*]] = zext i3 [[A:%.*]] to i32 -; VI-NEXT: [[TMP2:%.*]] = zext i3 [[B:%.*]] to i32 -; VI-NEXT: [[TMP3:%.*]] = icmp ugt i32 [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = zext i3 [[A]] to i32 -; VI-NEXT: [[TMP5:%.*]] = zext i3 [[B]] to i32 -; VI-NEXT: [[TMP6:%.*]] = select i1 [[TMP3]], i32 [[TMP4]], i32 [[TMP5]] -; VI-NEXT: [[TMP7:%.*]] = trunc i32 [[TMP6]] to i3 -; VI-NEXT: store volatile i3 [[TMP7]], ptr addrspace(1) poison, align 1 -; VI-NEXT: ret void -; - %cmp = icmp ugt i3 %a, %b - %sel = select i1 %cmp, i3 %a, i3 %b - store volatile i3 %sel, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @select_uge_i3(i3 %a, i3 %b) { -; SI-LABEL: @select_uge_i3( -; SI-NEXT: [[CMP:%.*]] = icmp uge i3 [[A:%.*]], [[B:%.*]] -; SI-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i3 [[A]], i3 [[B]] -; SI-NEXT: store volatile i3 [[SEL]], ptr addrspace(1) poison, align 1 -; SI-NEXT: ret void -; -; VI-LABEL: @select_uge_i3( -; VI-NEXT: [[TMP1:%.*]] = zext i3 [[A:%.*]] to i32 -; VI-NEXT: [[TMP2:%.*]] = zext i3 [[B:%.*]] to i32 -; VI-NEXT: [[TMP3:%.*]] = icmp uge i32 [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = zext i3 [[A]] to i32 -; VI-NEXT: [[TMP5:%.*]] = zext i3 [[B]] to i32 -; VI-NEXT: [[TMP6:%.*]] = select i1 [[TMP3]], i32 [[TMP4]], i32 [[TMP5]] -; VI-NEXT: [[TMP7:%.*]] = trunc i32 [[TMP6]] to i3 -; VI-NEXT: store volatile i3 [[TMP7]], ptr addrspace(1) poison, align 1 -; VI-NEXT: ret void -; - %cmp = icmp uge i3 %a, %b - %sel = select i1 %cmp, i3 %a, i3 %b - store volatile i3 %sel, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @select_ult_i3(i3 %a, i3 %b) { -; SI-LABEL: @select_ult_i3( -; SI-NEXT: [[CMP:%.*]] = icmp ult i3 [[A:%.*]], [[B:%.*]] -; SI-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i3 [[A]], i3 [[B]] -; SI-NEXT: store volatile i3 [[SEL]], ptr addrspace(1) poison, align 1 -; SI-NEXT: ret void -; -; VI-LABEL: @select_ult_i3( -; VI-NEXT: [[TMP1:%.*]] = zext i3 [[A:%.*]] to i32 -; VI-NEXT: [[TMP2:%.*]] = zext i3 [[B:%.*]] to i32 -; VI-NEXT: [[TMP3:%.*]] = icmp ult i32 [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = zext i3 [[A]] to i32 -; VI-NEXT: [[TMP5:%.*]] = zext i3 [[B]] to i32 -; VI-NEXT: [[TMP6:%.*]] = select i1 [[TMP3]], i32 [[TMP4]], i32 [[TMP5]] -; VI-NEXT: [[TMP7:%.*]] = trunc i32 [[TMP6]] to i3 -; VI-NEXT: store volatile i3 [[TMP7]], ptr addrspace(1) poison, align 1 -; VI-NEXT: ret void -; - %cmp = icmp ult i3 %a, %b - %sel = select i1 %cmp, i3 %a, i3 %b - store volatile i3 %sel, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @select_ule_i3(i3 %a, i3 %b) { -; SI-LABEL: @select_ule_i3( -; SI-NEXT: [[CMP:%.*]] = icmp ule i3 [[A:%.*]], [[B:%.*]] -; SI-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i3 [[A]], i3 [[B]] -; SI-NEXT: store volatile i3 [[SEL]], ptr addrspace(1) poison, align 1 -; SI-NEXT: ret void -; -; VI-LABEL: @select_ule_i3( -; VI-NEXT: [[TMP1:%.*]] = zext i3 [[A:%.*]] to i32 -; VI-NEXT: [[TMP2:%.*]] = zext i3 [[B:%.*]] to i32 -; VI-NEXT: [[TMP3:%.*]] = icmp ule i32 [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = zext i3 [[A]] to i32 -; VI-NEXT: [[TMP5:%.*]] = zext i3 [[B]] to i32 -; VI-NEXT: [[TMP6:%.*]] = select i1 [[TMP3]], i32 [[TMP4]], i32 [[TMP5]] -; VI-NEXT: [[TMP7:%.*]] = trunc i32 [[TMP6]] to i3 -; VI-NEXT: store volatile i3 [[TMP7]], ptr addrspace(1) poison, align 1 -; VI-NEXT: ret void -; - %cmp = icmp ule i3 %a, %b - %sel = select i1 %cmp, i3 %a, i3 %b - store volatile i3 %sel, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @select_sgt_i3(i3 %a, i3 %b) { -; SI-LABEL: @select_sgt_i3( -; SI-NEXT: [[CMP:%.*]] = icmp sgt i3 [[A:%.*]], [[B:%.*]] -; SI-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i3 [[A]], i3 [[B]] -; SI-NEXT: store volatile i3 [[SEL]], ptr addrspace(1) poison, align 1 -; SI-NEXT: ret void -; -; VI-LABEL: @select_sgt_i3( -; VI-NEXT: [[TMP1:%.*]] = sext i3 [[A:%.*]] to i32 -; VI-NEXT: [[TMP2:%.*]] = sext i3 [[B:%.*]] to i32 -; VI-NEXT: [[TMP3:%.*]] = icmp sgt i32 [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = sext i3 [[A]] to i32 -; VI-NEXT: [[TMP5:%.*]] = sext i3 [[B]] to i32 -; VI-NEXT: [[TMP6:%.*]] = select i1 [[TMP3]], i32 [[TMP4]], i32 [[TMP5]] -; VI-NEXT: [[TMP7:%.*]] = trunc i32 [[TMP6]] to i3 -; VI-NEXT: store volatile i3 [[TMP7]], ptr addrspace(1) poison, align 1 -; VI-NEXT: ret void -; - %cmp = icmp sgt i3 %a, %b - %sel = select i1 %cmp, i3 %a, i3 %b - store volatile i3 %sel, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @select_sge_i3(i3 %a, i3 %b) { -; SI-LABEL: @select_sge_i3( -; SI-NEXT: [[CMP:%.*]] = icmp sge i3 [[A:%.*]], [[B:%.*]] -; SI-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i3 [[A]], i3 [[B]] -; SI-NEXT: store volatile i3 [[SEL]], ptr addrspace(1) poison, align 1 -; SI-NEXT: ret void -; -; VI-LABEL: @select_sge_i3( -; VI-NEXT: [[TMP1:%.*]] = sext i3 [[A:%.*]] to i32 -; VI-NEXT: [[TMP2:%.*]] = sext i3 [[B:%.*]] to i32 -; VI-NEXT: [[TMP3:%.*]] = icmp sge i32 [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = sext i3 [[A]] to i32 -; VI-NEXT: [[TMP5:%.*]] = sext i3 [[B]] to i32 -; VI-NEXT: [[TMP6:%.*]] = select i1 [[TMP3]], i32 [[TMP4]], i32 [[TMP5]] -; VI-NEXT: [[TMP7:%.*]] = trunc i32 [[TMP6]] to i3 -; VI-NEXT: store volatile i3 [[TMP7]], ptr addrspace(1) poison, align 1 -; VI-NEXT: ret void -; - %cmp = icmp sge i3 %a, %b - %sel = select i1 %cmp, i3 %a, i3 %b - store volatile i3 %sel, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @select_slt_i3(i3 %a, i3 %b) { -; SI-LABEL: @select_slt_i3( -; SI-NEXT: [[CMP:%.*]] = icmp slt i3 [[A:%.*]], [[B:%.*]] -; SI-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i3 [[A]], i3 [[B]] -; SI-NEXT: store volatile i3 [[SEL]], ptr addrspace(1) poison, align 1 -; SI-NEXT: ret void -; -; VI-LABEL: @select_slt_i3( -; VI-NEXT: [[TMP1:%.*]] = sext i3 [[A:%.*]] to i32 -; VI-NEXT: [[TMP2:%.*]] = sext i3 [[B:%.*]] to i32 -; VI-NEXT: [[TMP3:%.*]] = icmp slt i32 [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = sext i3 [[A]] to i32 -; VI-NEXT: [[TMP5:%.*]] = sext i3 [[B]] to i32 -; VI-NEXT: [[TMP6:%.*]] = select i1 [[TMP3]], i32 [[TMP4]], i32 [[TMP5]] -; VI-NEXT: [[TMP7:%.*]] = trunc i32 [[TMP6]] to i3 -; VI-NEXT: store volatile i3 [[TMP7]], ptr addrspace(1) poison, align 1 -; VI-NEXT: ret void -; - %cmp = icmp slt i3 %a, %b - %sel = select i1 %cmp, i3 %a, i3 %b - store volatile i3 %sel, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @select_sle_i3(i3 %a, i3 %b) { -; SI-LABEL: @select_sle_i3( -; SI-NEXT: [[CMP:%.*]] = icmp sle i3 [[A:%.*]], [[B:%.*]] -; SI-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i3 [[A]], i3 [[B]] -; SI-NEXT: store volatile i3 [[SEL]], ptr addrspace(1) poison, align 1 -; SI-NEXT: ret void -; -; VI-LABEL: @select_sle_i3( -; VI-NEXT: [[TMP1:%.*]] = sext i3 [[A:%.*]] to i32 -; VI-NEXT: [[TMP2:%.*]] = sext i3 [[B:%.*]] to i32 -; VI-NEXT: [[TMP3:%.*]] = icmp sle i32 [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = sext i3 [[A]] to i32 -; VI-NEXT: [[TMP5:%.*]] = sext i3 [[B]] to i32 -; VI-NEXT: [[TMP6:%.*]] = select i1 [[TMP3]], i32 [[TMP4]], i32 [[TMP5]] -; VI-NEXT: [[TMP7:%.*]] = trunc i32 [[TMP6]] to i3 -; VI-NEXT: store volatile i3 [[TMP7]], ptr addrspace(1) poison, align 1 -; VI-NEXT: ret void -; - %cmp = icmp sle i3 %a, %b - %sel = select i1 %cmp, i3 %a, i3 %b - store volatile i3 %sel, ptr addrspace(1) poison - ret void -} - -declare i3 @llvm.bitreverse.i3(i3) -define amdgpu_kernel void @bitreverse_i3(i3 %a) { -; SI-LABEL: @bitreverse_i3( -; SI-NEXT: [[BREV:%.*]] = call i3 @llvm.bitreverse.i3(i3 [[A:%.*]]) -; SI-NEXT: store volatile i3 [[BREV]], ptr addrspace(1) poison, align 1 -; SI-NEXT: ret void -; -; VI-LABEL: @bitreverse_i3( -; VI-NEXT: [[TMP1:%.*]] = zext i3 [[A:%.*]] to i32 -; VI-NEXT: [[TMP2:%.*]] = call i32 @llvm.bitreverse.i32(i32 [[TMP1]]) -; VI-NEXT: [[TMP3:%.*]] = lshr i32 [[TMP2]], 29 -; VI-NEXT: [[TMP4:%.*]] = trunc i32 [[TMP3]] to i3 -; VI-NEXT: store volatile i3 [[TMP4]], ptr addrspace(1) poison, align 1 -; VI-NEXT: ret void -; - %brev = call i3 @llvm.bitreverse.i3(i3 %a) - store volatile i3 %brev, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @add_i16(i16 %a, i16 %b) { -; SI-LABEL: @add_i16( -; SI-NEXT: [[R:%.*]] = add i16 [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile i16 [[R]], ptr addrspace(1) poison, align 2 -; SI-NEXT: ret void -; -; VI-LABEL: @add_i16( -; VI-NEXT: [[TMP1:%.*]] = zext i16 [[A:%.*]] to i32 -; VI-NEXT: [[TMP2:%.*]] = zext i16 [[B:%.*]] to i32 -; VI-NEXT: [[TMP3:%.*]] = add nuw nsw i32 [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc i32 [[TMP3]] to i16 -; VI-NEXT: store volatile i16 [[TMP4]], ptr addrspace(1) poison, align 2 -; VI-NEXT: ret void -; - %r = add i16 %a, %b - store volatile i16 %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @constant_add_i16() { -; SI-LABEL: @constant_add_i16( -; SI-NEXT: [[R:%.*]] = add i16 1, 2 -; SI-NEXT: store volatile i16 [[R]], ptr addrspace(1) poison, align 2 -; SI-NEXT: ret void -; -; VI-LABEL: @constant_add_i16( -; VI-NEXT: store volatile i16 3, ptr addrspace(1) poison, align 2 -; VI-NEXT: ret void -; - %r = add i16 1, 2 - store volatile i16 %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @constant_add_nsw_i16() { -; SI-LABEL: @constant_add_nsw_i16( -; SI-NEXT: [[R:%.*]] = add nsw i16 1, 2 -; SI-NEXT: store volatile i16 [[R]], ptr addrspace(1) poison, align 2 -; SI-NEXT: ret void -; -; VI-LABEL: @constant_add_nsw_i16( -; VI-NEXT: store volatile i16 3, ptr addrspace(1) poison, align 2 -; VI-NEXT: ret void -; - %r = add nsw i16 1, 2 - store volatile i16 %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @constant_add_nuw_i16() { -; SI-LABEL: @constant_add_nuw_i16( -; SI-NEXT: [[R:%.*]] = add nsw i16 1, 2 -; SI-NEXT: store volatile i16 [[R]], ptr addrspace(1) poison, align 2 -; SI-NEXT: ret void -; -; VI-LABEL: @constant_add_nuw_i16( -; VI-NEXT: store volatile i16 3, ptr addrspace(1) poison, align 2 -; VI-NEXT: ret void -; - %r = add nsw i16 1, 2 - store volatile i16 %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @add_nsw_i16(i16 %a, i16 %b) { -; SI-LABEL: @add_nsw_i16( -; SI-NEXT: [[R:%.*]] = add nsw i16 [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile i16 [[R]], ptr addrspace(1) poison, align 2 -; SI-NEXT: ret void -; -; VI-LABEL: @add_nsw_i16( -; VI-NEXT: [[TMP1:%.*]] = zext i16 [[A:%.*]] to i32 -; VI-NEXT: [[TMP2:%.*]] = zext i16 [[B:%.*]] to i32 -; VI-NEXT: [[TMP3:%.*]] = add nuw nsw i32 [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc i32 [[TMP3]] to i16 -; VI-NEXT: store volatile i16 [[TMP4]], ptr addrspace(1) poison, align 2 -; VI-NEXT: ret void -; - %r = add nsw i16 %a, %b - store volatile i16 %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @add_nuw_i16(i16 %a, i16 %b) { -; SI-LABEL: @add_nuw_i16( -; SI-NEXT: [[R:%.*]] = add nuw i16 [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile i16 [[R]], ptr addrspace(1) poison, align 2 -; SI-NEXT: ret void -; -; VI-LABEL: @add_nuw_i16( -; VI-NEXT: [[TMP1:%.*]] = zext i16 [[A:%.*]] to i32 -; VI-NEXT: [[TMP2:%.*]] = zext i16 [[B:%.*]] to i32 -; VI-NEXT: [[TMP3:%.*]] = add nuw nsw i32 [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc i32 [[TMP3]] to i16 -; VI-NEXT: store volatile i16 [[TMP4]], ptr addrspace(1) poison, align 2 -; VI-NEXT: ret void -; - %r = add nuw i16 %a, %b - store volatile i16 %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @add_nuw_nsw_i16(i16 %a, i16 %b) { -; SI-LABEL: @add_nuw_nsw_i16( -; SI-NEXT: [[R:%.*]] = add nuw nsw i16 [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile i16 [[R]], ptr addrspace(1) poison, align 2 -; SI-NEXT: ret void -; -; VI-LABEL: @add_nuw_nsw_i16( -; VI-NEXT: [[TMP1:%.*]] = zext i16 [[A:%.*]] to i32 -; VI-NEXT: [[TMP2:%.*]] = zext i16 [[B:%.*]] to i32 -; VI-NEXT: [[TMP3:%.*]] = add nuw nsw i32 [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc i32 [[TMP3]] to i16 -; VI-NEXT: store volatile i16 [[TMP4]], ptr addrspace(1) poison, align 2 -; VI-NEXT: ret void -; - %r = add nuw nsw i16 %a, %b - store volatile i16 %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @sub_i16(i16 %a, i16 %b) { -; SI-LABEL: @sub_i16( -; SI-NEXT: [[R:%.*]] = sub i16 [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile i16 [[R]], ptr addrspace(1) poison, align 2 -; SI-NEXT: ret void -; -; VI-LABEL: @sub_i16( -; VI-NEXT: [[TMP1:%.*]] = zext i16 [[A:%.*]] to i32 -; VI-NEXT: [[TMP2:%.*]] = zext i16 [[B:%.*]] to i32 -; VI-NEXT: [[TMP3:%.*]] = sub nsw i32 [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc i32 [[TMP3]] to i16 -; VI-NEXT: store volatile i16 [[TMP4]], ptr addrspace(1) poison, align 2 -; VI-NEXT: ret void -; - %r = sub i16 %a, %b - store volatile i16 %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @sub_nsw_i16(i16 %a, i16 %b) { -; SI-LABEL: @sub_nsw_i16( -; SI-NEXT: [[R:%.*]] = sub nsw i16 [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile i16 [[R]], ptr addrspace(1) poison, align 2 -; SI-NEXT: ret void -; -; VI-LABEL: @sub_nsw_i16( -; VI-NEXT: [[TMP1:%.*]] = zext i16 [[A:%.*]] to i32 -; VI-NEXT: [[TMP2:%.*]] = zext i16 [[B:%.*]] to i32 -; VI-NEXT: [[TMP3:%.*]] = sub nsw i32 [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc i32 [[TMP3]] to i16 -; VI-NEXT: store volatile i16 [[TMP4]], ptr addrspace(1) poison, align 2 -; VI-NEXT: ret void -; - %r = sub nsw i16 %a, %b - store volatile i16 %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @sub_nuw_i16(i16 %a, i16 %b) { -; SI-LABEL: @sub_nuw_i16( -; SI-NEXT: [[R:%.*]] = sub nuw i16 [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile i16 [[R]], ptr addrspace(1) poison, align 2 -; SI-NEXT: ret void -; -; VI-LABEL: @sub_nuw_i16( -; VI-NEXT: [[TMP1:%.*]] = zext i16 [[A:%.*]] to i32 -; VI-NEXT: [[TMP2:%.*]] = zext i16 [[B:%.*]] to i32 -; VI-NEXT: [[TMP3:%.*]] = sub nuw nsw i32 [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc i32 [[TMP3]] to i16 -; VI-NEXT: store volatile i16 [[TMP4]], ptr addrspace(1) poison, align 2 -; VI-NEXT: ret void -; - %r = sub nuw i16 %a, %b - store volatile i16 %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @sub_nuw_nsw_i16(i16 %a, i16 %b) { -; SI-LABEL: @sub_nuw_nsw_i16( -; SI-NEXT: [[R:%.*]] = sub nuw nsw i16 [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile i16 [[R]], ptr addrspace(1) poison, align 2 -; SI-NEXT: ret void -; -; VI-LABEL: @sub_nuw_nsw_i16( -; VI-NEXT: [[TMP1:%.*]] = zext i16 [[A:%.*]] to i32 -; VI-NEXT: [[TMP2:%.*]] = zext i16 [[B:%.*]] to i32 -; VI-NEXT: [[TMP3:%.*]] = sub nuw nsw i32 [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc i32 [[TMP3]] to i16 -; VI-NEXT: store volatile i16 [[TMP4]], ptr addrspace(1) poison, align 2 -; VI-NEXT: ret void -; - %r = sub nuw nsw i16 %a, %b - store volatile i16 %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @mul_i16(i16 %a, i16 %b) { -; SI-LABEL: @mul_i16( -; SI-NEXT: [[R:%.*]] = mul i16 [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile i16 [[R]], ptr addrspace(1) poison, align 2 -; SI-NEXT: ret void -; -; VI-LABEL: @mul_i16( -; VI-NEXT: [[TMP1:%.*]] = zext i16 [[A:%.*]] to i32 -; VI-NEXT: [[TMP2:%.*]] = zext i16 [[B:%.*]] to i32 -; VI-NEXT: [[TMP3:%.*]] = mul nuw i32 [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc i32 [[TMP3]] to i16 -; VI-NEXT: store volatile i16 [[TMP4]], ptr addrspace(1) poison, align 2 -; VI-NEXT: ret void -; - %r = mul i16 %a, %b - store volatile i16 %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @mul_nsw_i16(i16 %a, i16 %b) { -; SI-LABEL: @mul_nsw_i16( -; SI-NEXT: [[R:%.*]] = mul nsw i16 [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile i16 [[R]], ptr addrspace(1) poison, align 2 -; SI-NEXT: ret void -; -; VI-LABEL: @mul_nsw_i16( -; VI-NEXT: [[TMP1:%.*]] = zext i16 [[A:%.*]] to i32 -; VI-NEXT: [[TMP2:%.*]] = zext i16 [[B:%.*]] to i32 -; VI-NEXT: [[TMP3:%.*]] = mul nuw i32 [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc i32 [[TMP3]] to i16 -; VI-NEXT: store volatile i16 [[TMP4]], ptr addrspace(1) poison, align 2 -; VI-NEXT: ret void -; - %r = mul nsw i16 %a, %b - store volatile i16 %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @mul_nuw_i16(i16 %a, i16 %b) { -; SI-LABEL: @mul_nuw_i16( -; SI-NEXT: [[R:%.*]] = mul nuw i16 [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile i16 [[R]], ptr addrspace(1) poison, align 2 -; SI-NEXT: ret void -; -; VI-LABEL: @mul_nuw_i16( -; VI-NEXT: [[TMP1:%.*]] = zext i16 [[A:%.*]] to i32 -; VI-NEXT: [[TMP2:%.*]] = zext i16 [[B:%.*]] to i32 -; VI-NEXT: [[TMP3:%.*]] = mul nuw nsw i32 [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc i32 [[TMP3]] to i16 -; VI-NEXT: store volatile i16 [[TMP4]], ptr addrspace(1) poison, align 2 -; VI-NEXT: ret void -; - %r = mul nuw i16 %a, %b - store volatile i16 %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @mul_nuw_nsw_i16(i16 %a, i16 %b) { -; SI-LABEL: @mul_nuw_nsw_i16( -; SI-NEXT: [[R:%.*]] = mul nuw nsw i16 [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile i16 [[R]], ptr addrspace(1) poison, align 2 -; SI-NEXT: ret void -; -; VI-LABEL: @mul_nuw_nsw_i16( -; VI-NEXT: [[TMP1:%.*]] = zext i16 [[A:%.*]] to i32 -; VI-NEXT: [[TMP2:%.*]] = zext i16 [[B:%.*]] to i32 -; VI-NEXT: [[TMP3:%.*]] = mul nuw nsw i32 [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc i32 [[TMP3]] to i16 -; VI-NEXT: store volatile i16 [[TMP4]], ptr addrspace(1) poison, align 2 -; VI-NEXT: ret void -; - %r = mul nuw nsw i16 %a, %b - store volatile i16 %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @shl_i16(i16 %a, i16 %b) { -; SI-LABEL: @shl_i16( -; SI-NEXT: [[R:%.*]] = shl i16 [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile i16 [[R]], ptr addrspace(1) poison, align 2 -; SI-NEXT: ret void -; -; VI-LABEL: @shl_i16( -; VI-NEXT: [[TMP1:%.*]] = zext i16 [[A:%.*]] to i32 -; VI-NEXT: [[TMP2:%.*]] = zext i16 [[B:%.*]] to i32 -; VI-NEXT: [[TMP3:%.*]] = shl nuw nsw i32 [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc i32 [[TMP3]] to i16 -; VI-NEXT: store volatile i16 [[TMP4]], ptr addrspace(1) poison, align 2 -; VI-NEXT: ret void -; - %r = shl i16 %a, %b - store volatile i16 %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @shl_nsw_i16(i16 %a, i16 %b) { -; SI-LABEL: @shl_nsw_i16( -; SI-NEXT: [[R:%.*]] = shl nsw i16 [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile i16 [[R]], ptr addrspace(1) poison, align 2 -; SI-NEXT: ret void -; -; VI-LABEL: @shl_nsw_i16( -; VI-NEXT: [[TMP1:%.*]] = zext i16 [[A:%.*]] to i32 -; VI-NEXT: [[TMP2:%.*]] = zext i16 [[B:%.*]] to i32 -; VI-NEXT: [[TMP3:%.*]] = shl nuw nsw i32 [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc i32 [[TMP3]] to i16 -; VI-NEXT: store volatile i16 [[TMP4]], ptr addrspace(1) poison, align 2 -; VI-NEXT: ret void -; - %r = shl nsw i16 %a, %b - store volatile i16 %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @shl_nuw_i16(i16 %a, i16 %b) { -; SI-LABEL: @shl_nuw_i16( -; SI-NEXT: [[R:%.*]] = shl nuw i16 [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile i16 [[R]], ptr addrspace(1) poison, align 2 -; SI-NEXT: ret void -; -; VI-LABEL: @shl_nuw_i16( -; VI-NEXT: [[TMP1:%.*]] = zext i16 [[A:%.*]] to i32 -; VI-NEXT: [[TMP2:%.*]] = zext i16 [[B:%.*]] to i32 -; VI-NEXT: [[TMP3:%.*]] = shl nuw nsw i32 [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc i32 [[TMP3]] to i16 -; VI-NEXT: store volatile i16 [[TMP4]], ptr addrspace(1) poison, align 2 -; VI-NEXT: ret void -; - %r = shl nuw i16 %a, %b - store volatile i16 %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @shl_nuw_nsw_i16(i16 %a, i16 %b) { -; SI-LABEL: @shl_nuw_nsw_i16( -; SI-NEXT: [[R:%.*]] = shl nuw nsw i16 [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile i16 [[R]], ptr addrspace(1) poison, align 2 -; SI-NEXT: ret void -; -; VI-LABEL: @shl_nuw_nsw_i16( -; VI-NEXT: [[TMP1:%.*]] = zext i16 [[A:%.*]] to i32 -; VI-NEXT: [[TMP2:%.*]] = zext i16 [[B:%.*]] to i32 -; VI-NEXT: [[TMP3:%.*]] = shl nuw nsw i32 [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc i32 [[TMP3]] to i16 -; VI-NEXT: store volatile i16 [[TMP4]], ptr addrspace(1) poison, align 2 -; VI-NEXT: ret void -; - %r = shl nuw nsw i16 %a, %b - store volatile i16 %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @lshr_i16(i16 %a, i16 %b) { -; SI-LABEL: @lshr_i16( -; SI-NEXT: [[R:%.*]] = lshr i16 [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile i16 [[R]], ptr addrspace(1) poison, align 2 -; SI-NEXT: ret void -; -; VI-LABEL: @lshr_i16( -; VI-NEXT: [[TMP1:%.*]] = zext i16 [[A:%.*]] to i32 -; VI-NEXT: [[TMP2:%.*]] = zext i16 [[B:%.*]] to i32 -; VI-NEXT: [[TMP3:%.*]] = lshr i32 [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc i32 [[TMP3]] to i16 -; VI-NEXT: store volatile i16 [[TMP4]], ptr addrspace(1) poison, align 2 -; VI-NEXT: ret void -; - %r = lshr i16 %a, %b - store volatile i16 %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @lshr_exact_i16(i16 %a, i16 %b) { -; SI-LABEL: @lshr_exact_i16( -; SI-NEXT: [[R:%.*]] = lshr exact i16 [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile i16 [[R]], ptr addrspace(1) poison, align 2 -; SI-NEXT: ret void -; -; VI-LABEL: @lshr_exact_i16( -; VI-NEXT: [[TMP1:%.*]] = zext i16 [[A:%.*]] to i32 -; VI-NEXT: [[TMP2:%.*]] = zext i16 [[B:%.*]] to i32 -; VI-NEXT: [[TMP3:%.*]] = lshr exact i32 [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc i32 [[TMP3]] to i16 -; VI-NEXT: store volatile i16 [[TMP4]], ptr addrspace(1) poison, align 2 -; VI-NEXT: ret void -; - %r = lshr exact i16 %a, %b - store volatile i16 %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @ashr_i16(i16 %a, i16 %b) { -; SI-LABEL: @ashr_i16( -; SI-NEXT: [[R:%.*]] = ashr i16 [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile i16 [[R]], ptr addrspace(1) poison, align 2 -; SI-NEXT: ret void -; -; VI-LABEL: @ashr_i16( -; VI-NEXT: [[TMP1:%.*]] = sext i16 [[A:%.*]] to i32 -; VI-NEXT: [[TMP2:%.*]] = sext i16 [[B:%.*]] to i32 -; VI-NEXT: [[TMP3:%.*]] = ashr i32 [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc i32 [[TMP3]] to i16 -; VI-NEXT: store volatile i16 [[TMP4]], ptr addrspace(1) poison, align 2 -; VI-NEXT: ret void -; - %r = ashr i16 %a, %b - store volatile i16 %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @ashr_exact_i16(i16 %a, i16 %b) { -; SI-LABEL: @ashr_exact_i16( -; SI-NEXT: [[R:%.*]] = ashr exact i16 [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile i16 [[R]], ptr addrspace(1) poison, align 2 -; SI-NEXT: ret void -; -; VI-LABEL: @ashr_exact_i16( -; VI-NEXT: [[TMP1:%.*]] = sext i16 [[A:%.*]] to i32 -; VI-NEXT: [[TMP2:%.*]] = sext i16 [[B:%.*]] to i32 -; VI-NEXT: [[TMP3:%.*]] = ashr exact i32 [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc i32 [[TMP3]] to i16 -; VI-NEXT: store volatile i16 [[TMP4]], ptr addrspace(1) poison, align 2 -; VI-NEXT: ret void -; - %r = ashr exact i16 %a, %b - store volatile i16 %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @constant_lshr_exact_i16(i16 %a, i16 %b) { -; SI-LABEL: @constant_lshr_exact_i16( -; SI-NEXT: [[R:%.*]] = lshr exact i16 4, 1 -; SI-NEXT: store volatile i16 [[R]], ptr addrspace(1) poison, align 2 -; SI-NEXT: ret void -; -; VI-LABEL: @constant_lshr_exact_i16( -; VI-NEXT: store volatile i16 2, ptr addrspace(1) poison, align 2 -; VI-NEXT: ret void -; - %r = lshr exact i16 4, 1 - store volatile i16 %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @and_i16(i16 %a, i16 %b) { -; SI-LABEL: @and_i16( -; SI-NEXT: [[R:%.*]] = and i16 [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile i16 [[R]], ptr addrspace(1) poison, align 2 -; SI-NEXT: ret void -; -; VI-LABEL: @and_i16( -; VI-NEXT: [[TMP1:%.*]] = zext i16 [[A:%.*]] to i32 -; VI-NEXT: [[TMP2:%.*]] = zext i16 [[B:%.*]] to i32 -; VI-NEXT: [[TMP3:%.*]] = and i32 [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc i32 [[TMP3]] to i16 -; VI-NEXT: store volatile i16 [[TMP4]], ptr addrspace(1) poison, align 2 -; VI-NEXT: ret void -; - %r = and i16 %a, %b - store volatile i16 %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @or_i16(i16 %a, i16 %b) { -; SI-LABEL: @or_i16( -; SI-NEXT: [[R:%.*]] = or i16 [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile i16 [[R]], ptr addrspace(1) poison, align 2 -; SI-NEXT: ret void -; -; VI-LABEL: @or_i16( -; VI-NEXT: [[TMP1:%.*]] = zext i16 [[A:%.*]] to i32 -; VI-NEXT: [[TMP2:%.*]] = zext i16 [[B:%.*]] to i32 -; VI-NEXT: [[TMP3:%.*]] = or i32 [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc i32 [[TMP3]] to i16 -; VI-NEXT: store volatile i16 [[TMP4]], ptr addrspace(1) poison, align 2 -; VI-NEXT: ret void -; - %r = or i16 %a, %b - store volatile i16 %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @xor_i16(i16 %a, i16 %b) { -; SI-LABEL: @xor_i16( -; SI-NEXT: [[R:%.*]] = xor i16 [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile i16 [[R]], ptr addrspace(1) poison, align 2 -; SI-NEXT: ret void -; -; VI-LABEL: @xor_i16( -; VI-NEXT: [[TMP1:%.*]] = zext i16 [[A:%.*]] to i32 -; VI-NEXT: [[TMP2:%.*]] = zext i16 [[B:%.*]] to i32 -; VI-NEXT: [[TMP3:%.*]] = xor i32 [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc i32 [[TMP3]] to i16 -; VI-NEXT: store volatile i16 [[TMP4]], ptr addrspace(1) poison, align 2 -; VI-NEXT: ret void -; - %r = xor i16 %a, %b - store volatile i16 %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @select_eq_i16(i16 %a, i16 %b) { -; SI-LABEL: @select_eq_i16( -; SI-NEXT: [[CMP:%.*]] = icmp eq i16 [[A:%.*]], [[B:%.*]] -; SI-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i16 [[A]], i16 [[B]] -; SI-NEXT: store volatile i16 [[SEL]], ptr addrspace(1) poison, align 2 -; SI-NEXT: ret void -; -; VI-LABEL: @select_eq_i16( -; VI-NEXT: [[TMP1:%.*]] = zext i16 [[A:%.*]] to i32 -; VI-NEXT: [[TMP2:%.*]] = zext i16 [[B:%.*]] to i32 -; VI-NEXT: [[TMP3:%.*]] = icmp eq i32 [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = zext i16 [[A]] to i32 -; VI-NEXT: [[TMP5:%.*]] = zext i16 [[B]] to i32 -; VI-NEXT: [[TMP6:%.*]] = select i1 [[TMP3]], i32 [[TMP4]], i32 [[TMP5]] -; VI-NEXT: [[TMP7:%.*]] = trunc i32 [[TMP6]] to i16 -; VI-NEXT: store volatile i16 [[TMP7]], ptr addrspace(1) poison, align 2 -; VI-NEXT: ret void -; - %cmp = icmp eq i16 %a, %b - %sel = select i1 %cmp, i16 %a, i16 %b - store volatile i16 %sel, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @select_ne_i16(i16 %a, i16 %b) { -; SI-LABEL: @select_ne_i16( -; SI-NEXT: [[CMP:%.*]] = icmp ne i16 [[A:%.*]], [[B:%.*]] -; SI-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i16 [[A]], i16 [[B]] -; SI-NEXT: store volatile i16 [[SEL]], ptr addrspace(1) poison, align 2 -; SI-NEXT: ret void -; -; VI-LABEL: @select_ne_i16( -; VI-NEXT: [[TMP1:%.*]] = zext i16 [[A:%.*]] to i32 -; VI-NEXT: [[TMP2:%.*]] = zext i16 [[B:%.*]] to i32 -; VI-NEXT: [[TMP3:%.*]] = icmp ne i32 [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = zext i16 [[A]] to i32 -; VI-NEXT: [[TMP5:%.*]] = zext i16 [[B]] to i32 -; VI-NEXT: [[TMP6:%.*]] = select i1 [[TMP3]], i32 [[TMP4]], i32 [[TMP5]] -; VI-NEXT: [[TMP7:%.*]] = trunc i32 [[TMP6]] to i16 -; VI-NEXT: store volatile i16 [[TMP7]], ptr addrspace(1) poison, align 2 -; VI-NEXT: ret void -; - %cmp = icmp ne i16 %a, %b - %sel = select i1 %cmp, i16 %a, i16 %b - store volatile i16 %sel, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @select_ugt_i16(i16 %a, i16 %b) { -; SI-LABEL: @select_ugt_i16( -; SI-NEXT: [[CMP:%.*]] = icmp ugt i16 [[A:%.*]], [[B:%.*]] -; SI-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i16 [[A]], i16 [[B]] -; SI-NEXT: store volatile i16 [[SEL]], ptr addrspace(1) poison, align 2 -; SI-NEXT: ret void -; -; VI-LABEL: @select_ugt_i16( -; VI-NEXT: [[TMP1:%.*]] = zext i16 [[A:%.*]] to i32 -; VI-NEXT: [[TMP2:%.*]] = zext i16 [[B:%.*]] to i32 -; VI-NEXT: [[TMP3:%.*]] = icmp ugt i32 [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = zext i16 [[A]] to i32 -; VI-NEXT: [[TMP5:%.*]] = zext i16 [[B]] to i32 -; VI-NEXT: [[TMP6:%.*]] = select i1 [[TMP3]], i32 [[TMP4]], i32 [[TMP5]] -; VI-NEXT: [[TMP7:%.*]] = trunc i32 [[TMP6]] to i16 -; VI-NEXT: store volatile i16 [[TMP7]], ptr addrspace(1) poison, align 2 -; VI-NEXT: ret void -; - %cmp = icmp ugt i16 %a, %b - %sel = select i1 %cmp, i16 %a, i16 %b - store volatile i16 %sel, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @select_uge_i16(i16 %a, i16 %b) { -; SI-LABEL: @select_uge_i16( -; SI-NEXT: [[CMP:%.*]] = icmp uge i16 [[A:%.*]], [[B:%.*]] -; SI-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i16 [[A]], i16 [[B]] -; SI-NEXT: store volatile i16 [[SEL]], ptr addrspace(1) poison, align 2 -; SI-NEXT: ret void -; -; VI-LABEL: @select_uge_i16( -; VI-NEXT: [[TMP1:%.*]] = zext i16 [[A:%.*]] to i32 -; VI-NEXT: [[TMP2:%.*]] = zext i16 [[B:%.*]] to i32 -; VI-NEXT: [[TMP3:%.*]] = icmp uge i32 [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = zext i16 [[A]] to i32 -; VI-NEXT: [[TMP5:%.*]] = zext i16 [[B]] to i32 -; VI-NEXT: [[TMP6:%.*]] = select i1 [[TMP3]], i32 [[TMP4]], i32 [[TMP5]] -; VI-NEXT: [[TMP7:%.*]] = trunc i32 [[TMP6]] to i16 -; VI-NEXT: store volatile i16 [[TMP7]], ptr addrspace(1) poison, align 2 -; VI-NEXT: ret void -; - %cmp = icmp uge i16 %a, %b - %sel = select i1 %cmp, i16 %a, i16 %b - store volatile i16 %sel, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @select_ult_i16(i16 %a, i16 %b) { -; SI-LABEL: @select_ult_i16( -; SI-NEXT: [[CMP:%.*]] = icmp ult i16 [[A:%.*]], [[B:%.*]] -; SI-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i16 [[A]], i16 [[B]] -; SI-NEXT: store volatile i16 [[SEL]], ptr addrspace(1) poison, align 2 -; SI-NEXT: ret void -; -; VI-LABEL: @select_ult_i16( -; VI-NEXT: [[TMP1:%.*]] = zext i16 [[A:%.*]] to i32 -; VI-NEXT: [[TMP2:%.*]] = zext i16 [[B:%.*]] to i32 -; VI-NEXT: [[TMP3:%.*]] = icmp ult i32 [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = zext i16 [[A]] to i32 -; VI-NEXT: [[TMP5:%.*]] = zext i16 [[B]] to i32 -; VI-NEXT: [[TMP6:%.*]] = select i1 [[TMP3]], i32 [[TMP4]], i32 [[TMP5]] -; VI-NEXT: [[TMP7:%.*]] = trunc i32 [[TMP6]] to i16 -; VI-NEXT: store volatile i16 [[TMP7]], ptr addrspace(1) poison, align 2 -; VI-NEXT: ret void -; - %cmp = icmp ult i16 %a, %b - %sel = select i1 %cmp, i16 %a, i16 %b - store volatile i16 %sel, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @select_ule_i16(i16 %a, i16 %b) { -; SI-LABEL: @select_ule_i16( -; SI-NEXT: [[CMP:%.*]] = icmp ule i16 [[A:%.*]], [[B:%.*]] -; SI-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i16 [[A]], i16 [[B]] -; SI-NEXT: store volatile i16 [[SEL]], ptr addrspace(1) poison, align 2 -; SI-NEXT: ret void -; -; VI-LABEL: @select_ule_i16( -; VI-NEXT: [[TMP1:%.*]] = zext i16 [[A:%.*]] to i32 -; VI-NEXT: [[TMP2:%.*]] = zext i16 [[B:%.*]] to i32 -; VI-NEXT: [[TMP3:%.*]] = icmp ule i32 [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = zext i16 [[A]] to i32 -; VI-NEXT: [[TMP5:%.*]] = zext i16 [[B]] to i32 -; VI-NEXT: [[TMP6:%.*]] = select i1 [[TMP3]], i32 [[TMP4]], i32 [[TMP5]] -; VI-NEXT: [[TMP7:%.*]] = trunc i32 [[TMP6]] to i16 -; VI-NEXT: store volatile i16 [[TMP7]], ptr addrspace(1) poison, align 2 -; VI-NEXT: ret void -; - %cmp = icmp ule i16 %a, %b - %sel = select i1 %cmp, i16 %a, i16 %b - store volatile i16 %sel, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @select_sgt_i16(i16 %a, i16 %b) { -; SI-LABEL: @select_sgt_i16( -; SI-NEXT: [[CMP:%.*]] = icmp sgt i16 [[A:%.*]], [[B:%.*]] -; SI-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i16 [[A]], i16 [[B]] -; SI-NEXT: store volatile i16 [[SEL]], ptr addrspace(1) poison, align 2 -; SI-NEXT: ret void -; -; VI-LABEL: @select_sgt_i16( -; VI-NEXT: [[TMP1:%.*]] = sext i16 [[A:%.*]] to i32 -; VI-NEXT: [[TMP2:%.*]] = sext i16 [[B:%.*]] to i32 -; VI-NEXT: [[TMP3:%.*]] = icmp sgt i32 [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = sext i16 [[A]] to i32 -; VI-NEXT: [[TMP5:%.*]] = sext i16 [[B]] to i32 -; VI-NEXT: [[TMP6:%.*]] = select i1 [[TMP3]], i32 [[TMP4]], i32 [[TMP5]] -; VI-NEXT: [[TMP7:%.*]] = trunc i32 [[TMP6]] to i16 -; VI-NEXT: store volatile i16 [[TMP7]], ptr addrspace(1) poison, align 2 -; VI-NEXT: ret void -; - %cmp = icmp sgt i16 %a, %b - %sel = select i1 %cmp, i16 %a, i16 %b - store volatile i16 %sel, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @select_sge_i16(i16 %a, i16 %b) { -; SI-LABEL: @select_sge_i16( -; SI-NEXT: [[CMP:%.*]] = icmp sge i16 [[A:%.*]], [[B:%.*]] -; SI-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i16 [[A]], i16 [[B]] -; SI-NEXT: store volatile i16 [[SEL]], ptr addrspace(1) poison, align 2 -; SI-NEXT: ret void -; -; VI-LABEL: @select_sge_i16( -; VI-NEXT: [[TMP1:%.*]] = sext i16 [[A:%.*]] to i32 -; VI-NEXT: [[TMP2:%.*]] = sext i16 [[B:%.*]] to i32 -; VI-NEXT: [[TMP3:%.*]] = icmp sge i32 [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = sext i16 [[A]] to i32 -; VI-NEXT: [[TMP5:%.*]] = sext i16 [[B]] to i32 -; VI-NEXT: [[TMP6:%.*]] = select i1 [[TMP3]], i32 [[TMP4]], i32 [[TMP5]] -; VI-NEXT: [[TMP7:%.*]] = trunc i32 [[TMP6]] to i16 -; VI-NEXT: store volatile i16 [[TMP7]], ptr addrspace(1) poison, align 2 -; VI-NEXT: ret void -; - %cmp = icmp sge i16 %a, %b - %sel = select i1 %cmp, i16 %a, i16 %b - store volatile i16 %sel, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @select_slt_i16(i16 %a, i16 %b) { -; SI-LABEL: @select_slt_i16( -; SI-NEXT: [[CMP:%.*]] = icmp slt i16 [[A:%.*]], [[B:%.*]] -; SI-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i16 [[A]], i16 [[B]] -; SI-NEXT: store volatile i16 [[SEL]], ptr addrspace(1) poison, align 2 -; SI-NEXT: ret void -; -; VI-LABEL: @select_slt_i16( -; VI-NEXT: [[TMP1:%.*]] = sext i16 [[A:%.*]] to i32 -; VI-NEXT: [[TMP2:%.*]] = sext i16 [[B:%.*]] to i32 -; VI-NEXT: [[TMP3:%.*]] = icmp slt i32 [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = sext i16 [[A]] to i32 -; VI-NEXT: [[TMP5:%.*]] = sext i16 [[B]] to i32 -; VI-NEXT: [[TMP6:%.*]] = select i1 [[TMP3]], i32 [[TMP4]], i32 [[TMP5]] -; VI-NEXT: [[TMP7:%.*]] = trunc i32 [[TMP6]] to i16 -; VI-NEXT: store volatile i16 [[TMP7]], ptr addrspace(1) poison, align 2 -; VI-NEXT: ret void -; - %cmp = icmp slt i16 %a, %b - %sel = select i1 %cmp, i16 %a, i16 %b - store volatile i16 %sel, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @select_sle_i16(i16 %a, i16 %b) { -; SI-LABEL: @select_sle_i16( -; SI-NEXT: [[CMP:%.*]] = icmp sle i16 [[A:%.*]], [[B:%.*]] -; SI-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i16 [[A]], i16 [[B]] -; SI-NEXT: store volatile i16 [[SEL]], ptr addrspace(1) poison, align 2 -; SI-NEXT: ret void -; -; VI-LABEL: @select_sle_i16( -; VI-NEXT: [[TMP1:%.*]] = sext i16 [[A:%.*]] to i32 -; VI-NEXT: [[TMP2:%.*]] = sext i16 [[B:%.*]] to i32 -; VI-NEXT: [[TMP3:%.*]] = icmp sle i32 [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = sext i16 [[A]] to i32 -; VI-NEXT: [[TMP5:%.*]] = sext i16 [[B]] to i32 -; VI-NEXT: [[TMP6:%.*]] = select i1 [[TMP3]], i32 [[TMP4]], i32 [[TMP5]] -; VI-NEXT: [[TMP7:%.*]] = trunc i32 [[TMP6]] to i16 -; VI-NEXT: store volatile i16 [[TMP7]], ptr addrspace(1) poison, align 2 -; VI-NEXT: ret void -; - %cmp = icmp sle i16 %a, %b - %sel = select i1 %cmp, i16 %a, i16 %b - store volatile i16 %sel, ptr addrspace(1) poison - ret void -} - -declare i16 @llvm.bitreverse.i16(i16) - -define amdgpu_kernel void @bitreverse_i16(i16 %a) { -; SI-LABEL: @bitreverse_i16( -; SI-NEXT: [[BREV:%.*]] = call i16 @llvm.bitreverse.i16(i16 [[A:%.*]]) -; SI-NEXT: store volatile i16 [[BREV]], ptr addrspace(1) poison, align 2 -; SI-NEXT: ret void -; -; VI-LABEL: @bitreverse_i16( -; VI-NEXT: [[TMP1:%.*]] = zext i16 [[A:%.*]] to i32 -; VI-NEXT: [[TMP2:%.*]] = call i32 @llvm.bitreverse.i32(i32 [[TMP1]]) -; VI-NEXT: [[TMP3:%.*]] = lshr i32 [[TMP2]], 16 -; VI-NEXT: [[TMP4:%.*]] = trunc i32 [[TMP3]] to i16 -; VI-NEXT: store volatile i16 [[TMP4]], ptr addrspace(1) poison, align 2 -; VI-NEXT: ret void -; - %brev = call i16 @llvm.bitreverse.i16(i16 %a) - store volatile i16 %brev, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @add_3xi15(<3 x i15> %a, <3 x i15> %b) { -; SI-LABEL: @add_3xi15( -; SI-NEXT: [[R:%.*]] = add <3 x i15> [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile <3 x i15> [[R]], ptr addrspace(1) poison, align 8 -; SI-NEXT: ret void -; -; VI-LABEL: @add_3xi15( -; VI-NEXT: [[TMP1:%.*]] = zext <3 x i15> [[A:%.*]] to <3 x i32> -; VI-NEXT: [[TMP2:%.*]] = zext <3 x i15> [[B:%.*]] to <3 x i32> -; VI-NEXT: [[TMP3:%.*]] = add nuw nsw <3 x i32> [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc <3 x i32> [[TMP3]] to <3 x i15> -; VI-NEXT: store volatile <3 x i15> [[TMP4]], ptr addrspace(1) poison, align 8 -; VI-NEXT: ret void -; - %r = add <3 x i15> %a, %b - store volatile <3 x i15> %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @add_nsw_3xi15(<3 x i15> %a, <3 x i15> %b) { -; SI-LABEL: @add_nsw_3xi15( -; SI-NEXT: [[R:%.*]] = add nsw <3 x i15> [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile <3 x i15> [[R]], ptr addrspace(1) poison, align 8 -; SI-NEXT: ret void -; -; VI-LABEL: @add_nsw_3xi15( -; VI-NEXT: [[TMP1:%.*]] = zext <3 x i15> [[A:%.*]] to <3 x i32> -; VI-NEXT: [[TMP2:%.*]] = zext <3 x i15> [[B:%.*]] to <3 x i32> -; VI-NEXT: [[TMP3:%.*]] = add nuw nsw <3 x i32> [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc <3 x i32> [[TMP3]] to <3 x i15> -; VI-NEXT: store volatile <3 x i15> [[TMP4]], ptr addrspace(1) poison, align 8 -; VI-NEXT: ret void -; - %r = add nsw <3 x i15> %a, %b - store volatile <3 x i15> %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @add_nuw_3xi15(<3 x i15> %a, <3 x i15> %b) { -; SI-LABEL: @add_nuw_3xi15( -; SI-NEXT: [[R:%.*]] = add nuw <3 x i15> [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile <3 x i15> [[R]], ptr addrspace(1) poison, align 8 -; SI-NEXT: ret void -; -; VI-LABEL: @add_nuw_3xi15( -; VI-NEXT: [[TMP1:%.*]] = zext <3 x i15> [[A:%.*]] to <3 x i32> -; VI-NEXT: [[TMP2:%.*]] = zext <3 x i15> [[B:%.*]] to <3 x i32> -; VI-NEXT: [[TMP3:%.*]] = add nuw nsw <3 x i32> [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc <3 x i32> [[TMP3]] to <3 x i15> -; VI-NEXT: store volatile <3 x i15> [[TMP4]], ptr addrspace(1) poison, align 8 -; VI-NEXT: ret void -; - %r = add nuw <3 x i15> %a, %b - store volatile <3 x i15> %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @add_nuw_nsw_3xi15(<3 x i15> %a, <3 x i15> %b) { -; SI-LABEL: @add_nuw_nsw_3xi15( -; SI-NEXT: [[R:%.*]] = add nuw nsw <3 x i15> [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile <3 x i15> [[R]], ptr addrspace(1) poison, align 8 -; SI-NEXT: ret void -; -; VI-LABEL: @add_nuw_nsw_3xi15( -; VI-NEXT: [[TMP1:%.*]] = zext <3 x i15> [[A:%.*]] to <3 x i32> -; VI-NEXT: [[TMP2:%.*]] = zext <3 x i15> [[B:%.*]] to <3 x i32> -; VI-NEXT: [[TMP3:%.*]] = add nuw nsw <3 x i32> [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc <3 x i32> [[TMP3]] to <3 x i15> -; VI-NEXT: store volatile <3 x i15> [[TMP4]], ptr addrspace(1) poison, align 8 -; VI-NEXT: ret void -; - %r = add nuw nsw <3 x i15> %a, %b - store volatile <3 x i15> %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @sub_3xi15(<3 x i15> %a, <3 x i15> %b) { -; SI-LABEL: @sub_3xi15( -; SI-NEXT: [[R:%.*]] = sub <3 x i15> [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile <3 x i15> [[R]], ptr addrspace(1) poison, align 8 -; SI-NEXT: ret void -; -; VI-LABEL: @sub_3xi15( -; VI-NEXT: [[TMP1:%.*]] = zext <3 x i15> [[A:%.*]] to <3 x i32> -; VI-NEXT: [[TMP2:%.*]] = zext <3 x i15> [[B:%.*]] to <3 x i32> -; VI-NEXT: [[TMP3:%.*]] = sub nsw <3 x i32> [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc <3 x i32> [[TMP3]] to <3 x i15> -; VI-NEXT: store volatile <3 x i15> [[TMP4]], ptr addrspace(1) poison, align 8 -; VI-NEXT: ret void -; - %r = sub <3 x i15> %a, %b - store volatile <3 x i15> %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @sub_nsw_3xi15(<3 x i15> %a, <3 x i15> %b) { -; SI-LABEL: @sub_nsw_3xi15( -; SI-NEXT: [[R:%.*]] = sub nsw <3 x i15> [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile <3 x i15> [[R]], ptr addrspace(1) poison, align 8 -; SI-NEXT: ret void -; -; VI-LABEL: @sub_nsw_3xi15( -; VI-NEXT: [[TMP1:%.*]] = zext <3 x i15> [[A:%.*]] to <3 x i32> -; VI-NEXT: [[TMP2:%.*]] = zext <3 x i15> [[B:%.*]] to <3 x i32> -; VI-NEXT: [[TMP3:%.*]] = sub nsw <3 x i32> [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc <3 x i32> [[TMP3]] to <3 x i15> -; VI-NEXT: store volatile <3 x i15> [[TMP4]], ptr addrspace(1) poison, align 8 -; VI-NEXT: ret void -; - %r = sub nsw <3 x i15> %a, %b - store volatile <3 x i15> %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @sub_nuw_3xi15(<3 x i15> %a, <3 x i15> %b) { -; SI-LABEL: @sub_nuw_3xi15( -; SI-NEXT: [[R:%.*]] = sub nuw <3 x i15> [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile <3 x i15> [[R]], ptr addrspace(1) poison, align 8 -; SI-NEXT: ret void -; -; VI-LABEL: @sub_nuw_3xi15( -; VI-NEXT: [[TMP1:%.*]] = zext <3 x i15> [[A:%.*]] to <3 x i32> -; VI-NEXT: [[TMP2:%.*]] = zext <3 x i15> [[B:%.*]] to <3 x i32> -; VI-NEXT: [[TMP3:%.*]] = sub nuw nsw <3 x i32> [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc <3 x i32> [[TMP3]] to <3 x i15> -; VI-NEXT: store volatile <3 x i15> [[TMP4]], ptr addrspace(1) poison, align 8 -; VI-NEXT: ret void -; - %r = sub nuw <3 x i15> %a, %b - store volatile <3 x i15> %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @sub_nuw_nsw_3xi15(<3 x i15> %a, <3 x i15> %b) { -; SI-LABEL: @sub_nuw_nsw_3xi15( -; SI-NEXT: [[R:%.*]] = sub nuw nsw <3 x i15> [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile <3 x i15> [[R]], ptr addrspace(1) poison, align 8 -; SI-NEXT: ret void -; -; VI-LABEL: @sub_nuw_nsw_3xi15( -; VI-NEXT: [[TMP1:%.*]] = zext <3 x i15> [[A:%.*]] to <3 x i32> -; VI-NEXT: [[TMP2:%.*]] = zext <3 x i15> [[B:%.*]] to <3 x i32> -; VI-NEXT: [[TMP3:%.*]] = sub nuw nsw <3 x i32> [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc <3 x i32> [[TMP3]] to <3 x i15> -; VI-NEXT: store volatile <3 x i15> [[TMP4]], ptr addrspace(1) poison, align 8 -; VI-NEXT: ret void -; - %r = sub nuw nsw <3 x i15> %a, %b - store volatile <3 x i15> %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @mul_3xi15(<3 x i15> %a, <3 x i15> %b) { -; SI-LABEL: @mul_3xi15( -; SI-NEXT: [[R:%.*]] = mul <3 x i15> [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile <3 x i15> [[R]], ptr addrspace(1) poison, align 8 -; SI-NEXT: ret void -; -; VI-LABEL: @mul_3xi15( -; VI-NEXT: [[TMP1:%.*]] = zext <3 x i15> [[A:%.*]] to <3 x i32> -; VI-NEXT: [[TMP2:%.*]] = zext <3 x i15> [[B:%.*]] to <3 x i32> -; VI-NEXT: [[TMP3:%.*]] = mul nuw <3 x i32> [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc <3 x i32> [[TMP3]] to <3 x i15> -; VI-NEXT: store volatile <3 x i15> [[TMP4]], ptr addrspace(1) poison, align 8 -; VI-NEXT: ret void -; - %r = mul <3 x i15> %a, %b - store volatile <3 x i15> %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @mul_nsw_3xi15(<3 x i15> %a, <3 x i15> %b) { -; SI-LABEL: @mul_nsw_3xi15( -; SI-NEXT: [[R:%.*]] = mul nsw <3 x i15> [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile <3 x i15> [[R]], ptr addrspace(1) poison, align 8 -; SI-NEXT: ret void -; -; VI-LABEL: @mul_nsw_3xi15( -; VI-NEXT: [[TMP1:%.*]] = zext <3 x i15> [[A:%.*]] to <3 x i32> -; VI-NEXT: [[TMP2:%.*]] = zext <3 x i15> [[B:%.*]] to <3 x i32> -; VI-NEXT: [[TMP3:%.*]] = mul nuw <3 x i32> [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc <3 x i32> [[TMP3]] to <3 x i15> -; VI-NEXT: store volatile <3 x i15> [[TMP4]], ptr addrspace(1) poison, align 8 -; VI-NEXT: ret void -; - %r = mul nsw <3 x i15> %a, %b - store volatile <3 x i15> %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @mul_nuw_3xi15(<3 x i15> %a, <3 x i15> %b) { -; SI-LABEL: @mul_nuw_3xi15( -; SI-NEXT: [[R:%.*]] = mul nuw <3 x i15> [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile <3 x i15> [[R]], ptr addrspace(1) poison, align 8 -; SI-NEXT: ret void -; -; VI-LABEL: @mul_nuw_3xi15( -; VI-NEXT: [[TMP1:%.*]] = zext <3 x i15> [[A:%.*]] to <3 x i32> -; VI-NEXT: [[TMP2:%.*]] = zext <3 x i15> [[B:%.*]] to <3 x i32> -; VI-NEXT: [[TMP3:%.*]] = mul nuw nsw <3 x i32> [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc <3 x i32> [[TMP3]] to <3 x i15> -; VI-NEXT: store volatile <3 x i15> [[TMP4]], ptr addrspace(1) poison, align 8 -; VI-NEXT: ret void -; - %r = mul nuw <3 x i15> %a, %b - store volatile <3 x i15> %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @mul_nuw_nsw_3xi15(<3 x i15> %a, <3 x i15> %b) { -; SI-LABEL: @mul_nuw_nsw_3xi15( -; SI-NEXT: [[R:%.*]] = mul nuw nsw <3 x i15> [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile <3 x i15> [[R]], ptr addrspace(1) poison, align 8 -; SI-NEXT: ret void -; -; VI-LABEL: @mul_nuw_nsw_3xi15( -; VI-NEXT: [[TMP1:%.*]] = zext <3 x i15> [[A:%.*]] to <3 x i32> -; VI-NEXT: [[TMP2:%.*]] = zext <3 x i15> [[B:%.*]] to <3 x i32> -; VI-NEXT: [[TMP3:%.*]] = mul nuw nsw <3 x i32> [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc <3 x i32> [[TMP3]] to <3 x i15> -; VI-NEXT: store volatile <3 x i15> [[TMP4]], ptr addrspace(1) poison, align 8 -; VI-NEXT: ret void -; - %r = mul nuw nsw <3 x i15> %a, %b - store volatile <3 x i15> %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @shl_3xi15(<3 x i15> %a, <3 x i15> %b) { -; SI-LABEL: @shl_3xi15( -; SI-NEXT: [[R:%.*]] = shl <3 x i15> [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile <3 x i15> [[R]], ptr addrspace(1) poison, align 8 -; SI-NEXT: ret void -; -; VI-LABEL: @shl_3xi15( -; VI-NEXT: [[TMP1:%.*]] = zext <3 x i15> [[A:%.*]] to <3 x i32> -; VI-NEXT: [[TMP2:%.*]] = zext <3 x i15> [[B:%.*]] to <3 x i32> -; VI-NEXT: [[TMP3:%.*]] = shl nuw nsw <3 x i32> [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc <3 x i32> [[TMP3]] to <3 x i15> -; VI-NEXT: store volatile <3 x i15> [[TMP4]], ptr addrspace(1) poison, align 8 -; VI-NEXT: ret void -; - %r = shl <3 x i15> %a, %b - store volatile <3 x i15> %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @shl_nsw_3xi15(<3 x i15> %a, <3 x i15> %b) { -; SI-LABEL: @shl_nsw_3xi15( -; SI-NEXT: [[R:%.*]] = shl nsw <3 x i15> [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile <3 x i15> [[R]], ptr addrspace(1) poison, align 8 -; SI-NEXT: ret void -; -; VI-LABEL: @shl_nsw_3xi15( -; VI-NEXT: [[TMP1:%.*]] = zext <3 x i15> [[A:%.*]] to <3 x i32> -; VI-NEXT: [[TMP2:%.*]] = zext <3 x i15> [[B:%.*]] to <3 x i32> -; VI-NEXT: [[TMP3:%.*]] = shl nuw nsw <3 x i32> [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc <3 x i32> [[TMP3]] to <3 x i15> -; VI-NEXT: store volatile <3 x i15> [[TMP4]], ptr addrspace(1) poison, align 8 -; VI-NEXT: ret void -; - %r = shl nsw <3 x i15> %a, %b - store volatile <3 x i15> %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @shl_nuw_3xi15(<3 x i15> %a, <3 x i15> %b) { -; SI-LABEL: @shl_nuw_3xi15( -; SI-NEXT: [[R:%.*]] = shl nuw <3 x i15> [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile <3 x i15> [[R]], ptr addrspace(1) poison, align 8 -; SI-NEXT: ret void -; -; VI-LABEL: @shl_nuw_3xi15( -; VI-NEXT: [[TMP1:%.*]] = zext <3 x i15> [[A:%.*]] to <3 x i32> -; VI-NEXT: [[TMP2:%.*]] = zext <3 x i15> [[B:%.*]] to <3 x i32> -; VI-NEXT: [[TMP3:%.*]] = shl nuw nsw <3 x i32> [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc <3 x i32> [[TMP3]] to <3 x i15> -; VI-NEXT: store volatile <3 x i15> [[TMP4]], ptr addrspace(1) poison, align 8 -; VI-NEXT: ret void -; - %r = shl nuw <3 x i15> %a, %b - store volatile <3 x i15> %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @shl_nuw_nsw_3xi15(<3 x i15> %a, <3 x i15> %b) { -; SI-LABEL: @shl_nuw_nsw_3xi15( -; SI-NEXT: [[R:%.*]] = shl nuw nsw <3 x i15> [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile <3 x i15> [[R]], ptr addrspace(1) poison, align 8 -; SI-NEXT: ret void -; -; VI-LABEL: @shl_nuw_nsw_3xi15( -; VI-NEXT: [[TMP1:%.*]] = zext <3 x i15> [[A:%.*]] to <3 x i32> -; VI-NEXT: [[TMP2:%.*]] = zext <3 x i15> [[B:%.*]] to <3 x i32> -; VI-NEXT: [[TMP3:%.*]] = shl nuw nsw <3 x i32> [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc <3 x i32> [[TMP3]] to <3 x i15> -; VI-NEXT: store volatile <3 x i15> [[TMP4]], ptr addrspace(1) poison, align 8 -; VI-NEXT: ret void -; - %r = shl nuw nsw <3 x i15> %a, %b - store volatile <3 x i15> %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @lshr_3xi15(<3 x i15> %a, <3 x i15> %b) { -; SI-LABEL: @lshr_3xi15( -; SI-NEXT: [[R:%.*]] = lshr <3 x i15> [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile <3 x i15> [[R]], ptr addrspace(1) poison, align 8 -; SI-NEXT: ret void -; -; VI-LABEL: @lshr_3xi15( -; VI-NEXT: [[TMP1:%.*]] = zext <3 x i15> [[A:%.*]] to <3 x i32> -; VI-NEXT: [[TMP2:%.*]] = zext <3 x i15> [[B:%.*]] to <3 x i32> -; VI-NEXT: [[TMP3:%.*]] = lshr <3 x i32> [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc <3 x i32> [[TMP3]] to <3 x i15> -; VI-NEXT: store volatile <3 x i15> [[TMP4]], ptr addrspace(1) poison, align 8 -; VI-NEXT: ret void -; - %r = lshr <3 x i15> %a, %b - store volatile <3 x i15> %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @lshr_exact_3xi15(<3 x i15> %a, <3 x i15> %b) { -; SI-LABEL: @lshr_exact_3xi15( -; SI-NEXT: [[R:%.*]] = lshr exact <3 x i15> [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile <3 x i15> [[R]], ptr addrspace(1) poison, align 8 -; SI-NEXT: ret void -; -; VI-LABEL: @lshr_exact_3xi15( -; VI-NEXT: [[TMP1:%.*]] = zext <3 x i15> [[A:%.*]] to <3 x i32> -; VI-NEXT: [[TMP2:%.*]] = zext <3 x i15> [[B:%.*]] to <3 x i32> -; VI-NEXT: [[TMP3:%.*]] = lshr exact <3 x i32> [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc <3 x i32> [[TMP3]] to <3 x i15> -; VI-NEXT: store volatile <3 x i15> [[TMP4]], ptr addrspace(1) poison, align 8 -; VI-NEXT: ret void -; - %r = lshr exact <3 x i15> %a, %b - store volatile <3 x i15> %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @ashr_3xi15(<3 x i15> %a, <3 x i15> %b) { -; SI-LABEL: @ashr_3xi15( -; SI-NEXT: [[R:%.*]] = ashr <3 x i15> [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile <3 x i15> [[R]], ptr addrspace(1) poison, align 8 -; SI-NEXT: ret void -; -; VI-LABEL: @ashr_3xi15( -; VI-NEXT: [[TMP1:%.*]] = sext <3 x i15> [[A:%.*]] to <3 x i32> -; VI-NEXT: [[TMP2:%.*]] = sext <3 x i15> [[B:%.*]] to <3 x i32> -; VI-NEXT: [[TMP3:%.*]] = ashr <3 x i32> [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc <3 x i32> [[TMP3]] to <3 x i15> -; VI-NEXT: store volatile <3 x i15> [[TMP4]], ptr addrspace(1) poison, align 8 -; VI-NEXT: ret void -; - %r = ashr <3 x i15> %a, %b - store volatile <3 x i15> %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @ashr_exact_3xi15(<3 x i15> %a, <3 x i15> %b) { -; SI-LABEL: @ashr_exact_3xi15( -; SI-NEXT: [[R:%.*]] = ashr exact <3 x i15> [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile <3 x i15> [[R]], ptr addrspace(1) poison, align 8 -; SI-NEXT: ret void -; -; VI-LABEL: @ashr_exact_3xi15( -; VI-NEXT: [[TMP1:%.*]] = sext <3 x i15> [[A:%.*]] to <3 x i32> -; VI-NEXT: [[TMP2:%.*]] = sext <3 x i15> [[B:%.*]] to <3 x i32> -; VI-NEXT: [[TMP3:%.*]] = ashr exact <3 x i32> [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc <3 x i32> [[TMP3]] to <3 x i15> -; VI-NEXT: store volatile <3 x i15> [[TMP4]], ptr addrspace(1) poison, align 8 -; VI-NEXT: ret void -; - %r = ashr exact <3 x i15> %a, %b - store volatile <3 x i15> %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @and_3xi15(<3 x i15> %a, <3 x i15> %b) { -; SI-LABEL: @and_3xi15( -; SI-NEXT: [[R:%.*]] = and <3 x i15> [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile <3 x i15> [[R]], ptr addrspace(1) poison, align 8 -; SI-NEXT: ret void -; -; VI-LABEL: @and_3xi15( -; VI-NEXT: [[TMP1:%.*]] = zext <3 x i15> [[A:%.*]] to <3 x i32> -; VI-NEXT: [[TMP2:%.*]] = zext <3 x i15> [[B:%.*]] to <3 x i32> -; VI-NEXT: [[TMP3:%.*]] = and <3 x i32> [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc <3 x i32> [[TMP3]] to <3 x i15> -; VI-NEXT: store volatile <3 x i15> [[TMP4]], ptr addrspace(1) poison, align 8 -; VI-NEXT: ret void -; - %r = and <3 x i15> %a, %b - store volatile <3 x i15> %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @or_3xi15(<3 x i15> %a, <3 x i15> %b) { -; SI-LABEL: @or_3xi15( -; SI-NEXT: [[R:%.*]] = or <3 x i15> [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile <3 x i15> [[R]], ptr addrspace(1) poison, align 8 -; SI-NEXT: ret void -; -; VI-LABEL: @or_3xi15( -; VI-NEXT: [[TMP1:%.*]] = zext <3 x i15> [[A:%.*]] to <3 x i32> -; VI-NEXT: [[TMP2:%.*]] = zext <3 x i15> [[B:%.*]] to <3 x i32> -; VI-NEXT: [[TMP3:%.*]] = or <3 x i32> [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc <3 x i32> [[TMP3]] to <3 x i15> -; VI-NEXT: store volatile <3 x i15> [[TMP4]], ptr addrspace(1) poison, align 8 -; VI-NEXT: ret void -; - %r = or <3 x i15> %a, %b - store volatile <3 x i15> %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @xor_3xi15(<3 x i15> %a, <3 x i15> %b) { -; SI-LABEL: @xor_3xi15( -; SI-NEXT: [[R:%.*]] = xor <3 x i15> [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile <3 x i15> [[R]], ptr addrspace(1) poison, align 8 -; SI-NEXT: ret void -; -; VI-LABEL: @xor_3xi15( -; VI-NEXT: [[TMP1:%.*]] = zext <3 x i15> [[A:%.*]] to <3 x i32> -; VI-NEXT: [[TMP2:%.*]] = zext <3 x i15> [[B:%.*]] to <3 x i32> -; VI-NEXT: [[TMP3:%.*]] = xor <3 x i32> [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc <3 x i32> [[TMP3]] to <3 x i15> -; VI-NEXT: store volatile <3 x i15> [[TMP4]], ptr addrspace(1) poison, align 8 -; VI-NEXT: ret void -; - %r = xor <3 x i15> %a, %b - store volatile <3 x i15> %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @select_eq_3xi15(<3 x i15> %a, <3 x i15> %b) { -; SI-LABEL: @select_eq_3xi15( -; SI-NEXT: [[CMP:%.*]] = icmp eq <3 x i15> [[A:%.*]], [[B:%.*]] -; SI-NEXT: [[SEL:%.*]] = select <3 x i1> [[CMP]], <3 x i15> [[A]], <3 x i15> [[B]] -; SI-NEXT: store volatile <3 x i15> [[SEL]], ptr addrspace(1) poison, align 8 -; SI-NEXT: ret void -; -; VI-LABEL: @select_eq_3xi15( -; VI-NEXT: [[TMP1:%.*]] = zext <3 x i15> [[A:%.*]] to <3 x i32> -; VI-NEXT: [[TMP2:%.*]] = zext <3 x i15> [[B:%.*]] to <3 x i32> -; VI-NEXT: [[TMP3:%.*]] = icmp eq <3 x i32> [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = zext <3 x i15> [[A]] to <3 x i32> -; VI-NEXT: [[TMP5:%.*]] = zext <3 x i15> [[B]] to <3 x i32> -; VI-NEXT: [[TMP6:%.*]] = select <3 x i1> [[TMP3]], <3 x i32> [[TMP4]], <3 x i32> [[TMP5]] -; VI-NEXT: [[TMP7:%.*]] = trunc <3 x i32> [[TMP6]] to <3 x i15> -; VI-NEXT: store volatile <3 x i15> [[TMP7]], ptr addrspace(1) poison, align 8 -; VI-NEXT: ret void -; - %cmp = icmp eq <3 x i15> %a, %b - %sel = select <3 x i1> %cmp, <3 x i15> %a, <3 x i15> %b - store volatile <3 x i15> %sel, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @select_ne_3xi15(<3 x i15> %a, <3 x i15> %b) { -; SI-LABEL: @select_ne_3xi15( -; SI-NEXT: [[CMP:%.*]] = icmp ne <3 x i15> [[A:%.*]], [[B:%.*]] -; SI-NEXT: [[SEL:%.*]] = select <3 x i1> [[CMP]], <3 x i15> [[A]], <3 x i15> [[B]] -; SI-NEXT: store volatile <3 x i15> [[SEL]], ptr addrspace(1) poison, align 8 -; SI-NEXT: ret void -; -; VI-LABEL: @select_ne_3xi15( -; VI-NEXT: [[TMP1:%.*]] = zext <3 x i15> [[A:%.*]] to <3 x i32> -; VI-NEXT: [[TMP2:%.*]] = zext <3 x i15> [[B:%.*]] to <3 x i32> -; VI-NEXT: [[TMP3:%.*]] = icmp ne <3 x i32> [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = zext <3 x i15> [[A]] to <3 x i32> -; VI-NEXT: [[TMP5:%.*]] = zext <3 x i15> [[B]] to <3 x i32> -; VI-NEXT: [[TMP6:%.*]] = select <3 x i1> [[TMP3]], <3 x i32> [[TMP4]], <3 x i32> [[TMP5]] -; VI-NEXT: [[TMP7:%.*]] = trunc <3 x i32> [[TMP6]] to <3 x i15> -; VI-NEXT: store volatile <3 x i15> [[TMP7]], ptr addrspace(1) poison, align 8 -; VI-NEXT: ret void -; - %cmp = icmp ne <3 x i15> %a, %b - %sel = select <3 x i1> %cmp, <3 x i15> %a, <3 x i15> %b - store volatile <3 x i15> %sel, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @select_ugt_3xi15(<3 x i15> %a, <3 x i15> %b) { -; SI-LABEL: @select_ugt_3xi15( -; SI-NEXT: [[CMP:%.*]] = icmp ugt <3 x i15> [[A:%.*]], [[B:%.*]] -; SI-NEXT: [[SEL:%.*]] = select <3 x i1> [[CMP]], <3 x i15> [[A]], <3 x i15> [[B]] -; SI-NEXT: store volatile <3 x i15> [[SEL]], ptr addrspace(1) poison, align 8 -; SI-NEXT: ret void -; -; VI-LABEL: @select_ugt_3xi15( -; VI-NEXT: [[TMP1:%.*]] = zext <3 x i15> [[A:%.*]] to <3 x i32> -; VI-NEXT: [[TMP2:%.*]] = zext <3 x i15> [[B:%.*]] to <3 x i32> -; VI-NEXT: [[TMP3:%.*]] = icmp ugt <3 x i32> [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = zext <3 x i15> [[A]] to <3 x i32> -; VI-NEXT: [[TMP5:%.*]] = zext <3 x i15> [[B]] to <3 x i32> -; VI-NEXT: [[TMP6:%.*]] = select <3 x i1> [[TMP3]], <3 x i32> [[TMP4]], <3 x i32> [[TMP5]] -; VI-NEXT: [[TMP7:%.*]] = trunc <3 x i32> [[TMP6]] to <3 x i15> -; VI-NEXT: store volatile <3 x i15> [[TMP7]], ptr addrspace(1) poison, align 8 -; VI-NEXT: ret void -; - %cmp = icmp ugt <3 x i15> %a, %b - %sel = select <3 x i1> %cmp, <3 x i15> %a, <3 x i15> %b - store volatile <3 x i15> %sel, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @select_uge_3xi15(<3 x i15> %a, <3 x i15> %b) { -; SI-LABEL: @select_uge_3xi15( -; SI-NEXT: [[CMP:%.*]] = icmp uge <3 x i15> [[A:%.*]], [[B:%.*]] -; SI-NEXT: [[SEL:%.*]] = select <3 x i1> [[CMP]], <3 x i15> [[A]], <3 x i15> [[B]] -; SI-NEXT: store volatile <3 x i15> [[SEL]], ptr addrspace(1) poison, align 8 -; SI-NEXT: ret void -; -; VI-LABEL: @select_uge_3xi15( -; VI-NEXT: [[TMP1:%.*]] = zext <3 x i15> [[A:%.*]] to <3 x i32> -; VI-NEXT: [[TMP2:%.*]] = zext <3 x i15> [[B:%.*]] to <3 x i32> -; VI-NEXT: [[TMP3:%.*]] = icmp uge <3 x i32> [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = zext <3 x i15> [[A]] to <3 x i32> -; VI-NEXT: [[TMP5:%.*]] = zext <3 x i15> [[B]] to <3 x i32> -; VI-NEXT: [[TMP6:%.*]] = select <3 x i1> [[TMP3]], <3 x i32> [[TMP4]], <3 x i32> [[TMP5]] -; VI-NEXT: [[TMP7:%.*]] = trunc <3 x i32> [[TMP6]] to <3 x i15> -; VI-NEXT: store volatile <3 x i15> [[TMP7]], ptr addrspace(1) poison, align 8 -; VI-NEXT: ret void -; - %cmp = icmp uge <3 x i15> %a, %b - %sel = select <3 x i1> %cmp, <3 x i15> %a, <3 x i15> %b - store volatile <3 x i15> %sel, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @select_ult_3xi15(<3 x i15> %a, <3 x i15> %b) { -; SI-LABEL: @select_ult_3xi15( -; SI-NEXT: [[CMP:%.*]] = icmp ult <3 x i15> [[A:%.*]], [[B:%.*]] -; SI-NEXT: [[SEL:%.*]] = select <3 x i1> [[CMP]], <3 x i15> [[A]], <3 x i15> [[B]] -; SI-NEXT: store volatile <3 x i15> [[SEL]], ptr addrspace(1) poison, align 8 -; SI-NEXT: ret void -; -; VI-LABEL: @select_ult_3xi15( -; VI-NEXT: [[TMP1:%.*]] = zext <3 x i15> [[A:%.*]] to <3 x i32> -; VI-NEXT: [[TMP2:%.*]] = zext <3 x i15> [[B:%.*]] to <3 x i32> -; VI-NEXT: [[TMP3:%.*]] = icmp ult <3 x i32> [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = zext <3 x i15> [[A]] to <3 x i32> -; VI-NEXT: [[TMP5:%.*]] = zext <3 x i15> [[B]] to <3 x i32> -; VI-NEXT: [[TMP6:%.*]] = select <3 x i1> [[TMP3]], <3 x i32> [[TMP4]], <3 x i32> [[TMP5]] -; VI-NEXT: [[TMP7:%.*]] = trunc <3 x i32> [[TMP6]] to <3 x i15> -; VI-NEXT: store volatile <3 x i15> [[TMP7]], ptr addrspace(1) poison, align 8 -; VI-NEXT: ret void -; - %cmp = icmp ult <3 x i15> %a, %b - %sel = select <3 x i1> %cmp, <3 x i15> %a, <3 x i15> %b - store volatile <3 x i15> %sel, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @select_ule_3xi15(<3 x i15> %a, <3 x i15> %b) { -; SI-LABEL: @select_ule_3xi15( -; SI-NEXT: [[CMP:%.*]] = icmp ule <3 x i15> [[A:%.*]], [[B:%.*]] -; SI-NEXT: [[SEL:%.*]] = select <3 x i1> [[CMP]], <3 x i15> [[A]], <3 x i15> [[B]] -; SI-NEXT: store volatile <3 x i15> [[SEL]], ptr addrspace(1) poison, align 8 -; SI-NEXT: ret void -; -; VI-LABEL: @select_ule_3xi15( -; VI-NEXT: [[TMP1:%.*]] = zext <3 x i15> [[A:%.*]] to <3 x i32> -; VI-NEXT: [[TMP2:%.*]] = zext <3 x i15> [[B:%.*]] to <3 x i32> -; VI-NEXT: [[TMP3:%.*]] = icmp ule <3 x i32> [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = zext <3 x i15> [[A]] to <3 x i32> -; VI-NEXT: [[TMP5:%.*]] = zext <3 x i15> [[B]] to <3 x i32> -; VI-NEXT: [[TMP6:%.*]] = select <3 x i1> [[TMP3]], <3 x i32> [[TMP4]], <3 x i32> [[TMP5]] -; VI-NEXT: [[TMP7:%.*]] = trunc <3 x i32> [[TMP6]] to <3 x i15> -; VI-NEXT: store volatile <3 x i15> [[TMP7]], ptr addrspace(1) poison, align 8 -; VI-NEXT: ret void -; - %cmp = icmp ule <3 x i15> %a, %b - %sel = select <3 x i1> %cmp, <3 x i15> %a, <3 x i15> %b - store volatile <3 x i15> %sel, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @select_sgt_3xi15(<3 x i15> %a, <3 x i15> %b) { -; SI-LABEL: @select_sgt_3xi15( -; SI-NEXT: [[CMP:%.*]] = icmp sgt <3 x i15> [[A:%.*]], [[B:%.*]] -; SI-NEXT: [[SEL:%.*]] = select <3 x i1> [[CMP]], <3 x i15> [[A]], <3 x i15> [[B]] -; SI-NEXT: store volatile <3 x i15> [[SEL]], ptr addrspace(1) poison, align 8 -; SI-NEXT: ret void -; -; VI-LABEL: @select_sgt_3xi15( -; VI-NEXT: [[TMP1:%.*]] = sext <3 x i15> [[A:%.*]] to <3 x i32> -; VI-NEXT: [[TMP2:%.*]] = sext <3 x i15> [[B:%.*]] to <3 x i32> -; VI-NEXT: [[TMP3:%.*]] = icmp sgt <3 x i32> [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = sext <3 x i15> [[A]] to <3 x i32> -; VI-NEXT: [[TMP5:%.*]] = sext <3 x i15> [[B]] to <3 x i32> -; VI-NEXT: [[TMP6:%.*]] = select <3 x i1> [[TMP3]], <3 x i32> [[TMP4]], <3 x i32> [[TMP5]] -; VI-NEXT: [[TMP7:%.*]] = trunc <3 x i32> [[TMP6]] to <3 x i15> -; VI-NEXT: store volatile <3 x i15> [[TMP7]], ptr addrspace(1) poison, align 8 -; VI-NEXT: ret void -; - %cmp = icmp sgt <3 x i15> %a, %b - %sel = select <3 x i1> %cmp, <3 x i15> %a, <3 x i15> %b - store volatile <3 x i15> %sel, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @select_sge_3xi15(<3 x i15> %a, <3 x i15> %b) { -; SI-LABEL: @select_sge_3xi15( -; SI-NEXT: [[CMP:%.*]] = icmp sge <3 x i15> [[A:%.*]], [[B:%.*]] -; SI-NEXT: [[SEL:%.*]] = select <3 x i1> [[CMP]], <3 x i15> [[A]], <3 x i15> [[B]] -; SI-NEXT: store volatile <3 x i15> [[SEL]], ptr addrspace(1) poison, align 8 -; SI-NEXT: ret void -; -; VI-LABEL: @select_sge_3xi15( -; VI-NEXT: [[TMP1:%.*]] = sext <3 x i15> [[A:%.*]] to <3 x i32> -; VI-NEXT: [[TMP2:%.*]] = sext <3 x i15> [[B:%.*]] to <3 x i32> -; VI-NEXT: [[TMP3:%.*]] = icmp sge <3 x i32> [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = sext <3 x i15> [[A]] to <3 x i32> -; VI-NEXT: [[TMP5:%.*]] = sext <3 x i15> [[B]] to <3 x i32> -; VI-NEXT: [[TMP6:%.*]] = select <3 x i1> [[TMP3]], <3 x i32> [[TMP4]], <3 x i32> [[TMP5]] -; VI-NEXT: [[TMP7:%.*]] = trunc <3 x i32> [[TMP6]] to <3 x i15> -; VI-NEXT: store volatile <3 x i15> [[TMP7]], ptr addrspace(1) poison, align 8 -; VI-NEXT: ret void -; - %cmp = icmp sge <3 x i15> %a, %b - %sel = select <3 x i1> %cmp, <3 x i15> %a, <3 x i15> %b - store volatile <3 x i15> %sel, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @select_slt_3xi15(<3 x i15> %a, <3 x i15> %b) { -; SI-LABEL: @select_slt_3xi15( -; SI-NEXT: [[CMP:%.*]] = icmp slt <3 x i15> [[A:%.*]], [[B:%.*]] -; SI-NEXT: [[SEL:%.*]] = select <3 x i1> [[CMP]], <3 x i15> [[A]], <3 x i15> [[B]] -; SI-NEXT: store volatile <3 x i15> [[SEL]], ptr addrspace(1) poison, align 8 -; SI-NEXT: ret void -; -; VI-LABEL: @select_slt_3xi15( -; VI-NEXT: [[TMP1:%.*]] = sext <3 x i15> [[A:%.*]] to <3 x i32> -; VI-NEXT: [[TMP2:%.*]] = sext <3 x i15> [[B:%.*]] to <3 x i32> -; VI-NEXT: [[TMP3:%.*]] = icmp slt <3 x i32> [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = sext <3 x i15> [[A]] to <3 x i32> -; VI-NEXT: [[TMP5:%.*]] = sext <3 x i15> [[B]] to <3 x i32> -; VI-NEXT: [[TMP6:%.*]] = select <3 x i1> [[TMP3]], <3 x i32> [[TMP4]], <3 x i32> [[TMP5]] -; VI-NEXT: [[TMP7:%.*]] = trunc <3 x i32> [[TMP6]] to <3 x i15> -; VI-NEXT: store volatile <3 x i15> [[TMP7]], ptr addrspace(1) poison, align 8 -; VI-NEXT: ret void -; - %cmp = icmp slt <3 x i15> %a, %b - %sel = select <3 x i1> %cmp, <3 x i15> %a, <3 x i15> %b - store volatile <3 x i15> %sel, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @select_sle_3xi15(<3 x i15> %a, <3 x i15> %b) { -; SI-LABEL: @select_sle_3xi15( -; SI-NEXT: [[CMP:%.*]] = icmp sle <3 x i15> [[A:%.*]], [[B:%.*]] -; SI-NEXT: [[SEL:%.*]] = select <3 x i1> [[CMP]], <3 x i15> [[A]], <3 x i15> [[B]] -; SI-NEXT: store volatile <3 x i15> [[SEL]], ptr addrspace(1) poison, align 8 -; SI-NEXT: ret void -; -; VI-LABEL: @select_sle_3xi15( -; VI-NEXT: [[TMP1:%.*]] = sext <3 x i15> [[A:%.*]] to <3 x i32> -; VI-NEXT: [[TMP2:%.*]] = sext <3 x i15> [[B:%.*]] to <3 x i32> -; VI-NEXT: [[TMP3:%.*]] = icmp sle <3 x i32> [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = sext <3 x i15> [[A]] to <3 x i32> -; VI-NEXT: [[TMP5:%.*]] = sext <3 x i15> [[B]] to <3 x i32> -; VI-NEXT: [[TMP6:%.*]] = select <3 x i1> [[TMP3]], <3 x i32> [[TMP4]], <3 x i32> [[TMP5]] -; VI-NEXT: [[TMP7:%.*]] = trunc <3 x i32> [[TMP6]] to <3 x i15> -; VI-NEXT: store volatile <3 x i15> [[TMP7]], ptr addrspace(1) poison, align 8 -; VI-NEXT: ret void -; - %cmp = icmp sle <3 x i15> %a, %b - %sel = select <3 x i1> %cmp, <3 x i15> %a, <3 x i15> %b - store volatile <3 x i15> %sel, ptr addrspace(1) poison - ret void -} - -declare <3 x i15> @llvm.bitreverse.v3i15(<3 x i15>) -define amdgpu_kernel void @bitreverse_3xi15(<3 x i15> %a) { -; SI-LABEL: @bitreverse_3xi15( -; SI-NEXT: [[BREV:%.*]] = call <3 x i15> @llvm.bitreverse.v3i15(<3 x i15> [[A:%.*]]) -; SI-NEXT: store volatile <3 x i15> [[BREV]], ptr addrspace(1) poison, align 8 -; SI-NEXT: ret void -; -; VI-LABEL: @bitreverse_3xi15( -; VI-NEXT: [[TMP1:%.*]] = zext <3 x i15> [[A:%.*]] to <3 x i32> -; VI-NEXT: [[TMP2:%.*]] = call <3 x i32> @llvm.bitreverse.v3i32(<3 x i32> [[TMP1]]) -; VI-NEXT: [[TMP3:%.*]] = lshr <3 x i32> [[TMP2]], splat (i32 17) -; VI-NEXT: [[TMP4:%.*]] = trunc <3 x i32> [[TMP3]] to <3 x i15> -; VI-NEXT: store volatile <3 x i15> [[TMP4]], ptr addrspace(1) poison, align 8 -; VI-NEXT: ret void -; - %brev = call <3 x i15> @llvm.bitreverse.v3i15(<3 x i15> %a) - store volatile <3 x i15> %brev, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @add_3xi16(<3 x i16> %a, <3 x i16> %b) { -; SI-LABEL: @add_3xi16( -; SI-NEXT: [[R:%.*]] = add <3 x i16> [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile <3 x i16> [[R]], ptr addrspace(1) poison, align 8 -; SI-NEXT: ret void -; -; VI-LABEL: @add_3xi16( -; VI-NEXT: [[TMP1:%.*]] = zext <3 x i16> [[A:%.*]] to <3 x i32> -; VI-NEXT: [[TMP2:%.*]] = zext <3 x i16> [[B:%.*]] to <3 x i32> -; VI-NEXT: [[TMP3:%.*]] = add nuw nsw <3 x i32> [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc <3 x i32> [[TMP3]] to <3 x i16> -; VI-NEXT: store volatile <3 x i16> [[TMP4]], ptr addrspace(1) poison, align 8 -; VI-NEXT: ret void -; - %r = add <3 x i16> %a, %b - store volatile <3 x i16> %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @add_nsw_3xi16(<3 x i16> %a, <3 x i16> %b) { -; SI-LABEL: @add_nsw_3xi16( -; SI-NEXT: [[R:%.*]] = add nsw <3 x i16> [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile <3 x i16> [[R]], ptr addrspace(1) poison, align 8 -; SI-NEXT: ret void -; -; VI-LABEL: @add_nsw_3xi16( -; VI-NEXT: [[TMP1:%.*]] = zext <3 x i16> [[A:%.*]] to <3 x i32> -; VI-NEXT: [[TMP2:%.*]] = zext <3 x i16> [[B:%.*]] to <3 x i32> -; VI-NEXT: [[TMP3:%.*]] = add nuw nsw <3 x i32> [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc <3 x i32> [[TMP3]] to <3 x i16> -; VI-NEXT: store volatile <3 x i16> [[TMP4]], ptr addrspace(1) poison, align 8 -; VI-NEXT: ret void -; - %r = add nsw <3 x i16> %a, %b - store volatile <3 x i16> %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @add_nuw_3xi16(<3 x i16> %a, <3 x i16> %b) { -; SI-LABEL: @add_nuw_3xi16( -; SI-NEXT: [[R:%.*]] = add nuw <3 x i16> [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile <3 x i16> [[R]], ptr addrspace(1) poison, align 8 -; SI-NEXT: ret void -; -; VI-LABEL: @add_nuw_3xi16( -; VI-NEXT: [[TMP1:%.*]] = zext <3 x i16> [[A:%.*]] to <3 x i32> -; VI-NEXT: [[TMP2:%.*]] = zext <3 x i16> [[B:%.*]] to <3 x i32> -; VI-NEXT: [[TMP3:%.*]] = add nuw nsw <3 x i32> [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc <3 x i32> [[TMP3]] to <3 x i16> -; VI-NEXT: store volatile <3 x i16> [[TMP4]], ptr addrspace(1) poison, align 8 -; VI-NEXT: ret void -; - %r = add nuw <3 x i16> %a, %b - store volatile <3 x i16> %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @add_nuw_nsw_3xi16(<3 x i16> %a, <3 x i16> %b) { -; SI-LABEL: @add_nuw_nsw_3xi16( -; SI-NEXT: [[R:%.*]] = add nuw nsw <3 x i16> [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile <3 x i16> [[R]], ptr addrspace(1) poison, align 8 -; SI-NEXT: ret void -; -; VI-LABEL: @add_nuw_nsw_3xi16( -; VI-NEXT: [[TMP1:%.*]] = zext <3 x i16> [[A:%.*]] to <3 x i32> -; VI-NEXT: [[TMP2:%.*]] = zext <3 x i16> [[B:%.*]] to <3 x i32> -; VI-NEXT: [[TMP3:%.*]] = add nuw nsw <3 x i32> [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc <3 x i32> [[TMP3]] to <3 x i16> -; VI-NEXT: store volatile <3 x i16> [[TMP4]], ptr addrspace(1) poison, align 8 -; VI-NEXT: ret void -; - %r = add nuw nsw <3 x i16> %a, %b - store volatile <3 x i16> %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @sub_3xi16(<3 x i16> %a, <3 x i16> %b) { -; SI-LABEL: @sub_3xi16( -; SI-NEXT: [[R:%.*]] = sub <3 x i16> [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile <3 x i16> [[R]], ptr addrspace(1) poison, align 8 -; SI-NEXT: ret void -; -; VI-LABEL: @sub_3xi16( -; VI-NEXT: [[TMP1:%.*]] = zext <3 x i16> [[A:%.*]] to <3 x i32> -; VI-NEXT: [[TMP2:%.*]] = zext <3 x i16> [[B:%.*]] to <3 x i32> -; VI-NEXT: [[TMP3:%.*]] = sub nsw <3 x i32> [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc <3 x i32> [[TMP3]] to <3 x i16> -; VI-NEXT: store volatile <3 x i16> [[TMP4]], ptr addrspace(1) poison, align 8 -; VI-NEXT: ret void -; - %r = sub <3 x i16> %a, %b - store volatile <3 x i16> %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @sub_nsw_3xi16(<3 x i16> %a, <3 x i16> %b) { -; SI-LABEL: @sub_nsw_3xi16( -; SI-NEXT: [[R:%.*]] = sub nsw <3 x i16> [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile <3 x i16> [[R]], ptr addrspace(1) poison, align 8 -; SI-NEXT: ret void -; -; VI-LABEL: @sub_nsw_3xi16( -; VI-NEXT: [[TMP1:%.*]] = zext <3 x i16> [[A:%.*]] to <3 x i32> -; VI-NEXT: [[TMP2:%.*]] = zext <3 x i16> [[B:%.*]] to <3 x i32> -; VI-NEXT: [[TMP3:%.*]] = sub nsw <3 x i32> [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc <3 x i32> [[TMP3]] to <3 x i16> -; VI-NEXT: store volatile <3 x i16> [[TMP4]], ptr addrspace(1) poison, align 8 -; VI-NEXT: ret void -; - %r = sub nsw <3 x i16> %a, %b - store volatile <3 x i16> %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @sub_nuw_3xi16(<3 x i16> %a, <3 x i16> %b) { -; SI-LABEL: @sub_nuw_3xi16( -; SI-NEXT: [[R:%.*]] = sub nuw <3 x i16> [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile <3 x i16> [[R]], ptr addrspace(1) poison, align 8 -; SI-NEXT: ret void -; -; VI-LABEL: @sub_nuw_3xi16( -; VI-NEXT: [[TMP1:%.*]] = zext <3 x i16> [[A:%.*]] to <3 x i32> -; VI-NEXT: [[TMP2:%.*]] = zext <3 x i16> [[B:%.*]] to <3 x i32> -; VI-NEXT: [[TMP3:%.*]] = sub nuw nsw <3 x i32> [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc <3 x i32> [[TMP3]] to <3 x i16> -; VI-NEXT: store volatile <3 x i16> [[TMP4]], ptr addrspace(1) poison, align 8 -; VI-NEXT: ret void -; - %r = sub nuw <3 x i16> %a, %b - store volatile <3 x i16> %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @sub_nuw_nsw_3xi16(<3 x i16> %a, <3 x i16> %b) { -; SI-LABEL: @sub_nuw_nsw_3xi16( -; SI-NEXT: [[R:%.*]] = sub nuw nsw <3 x i16> [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile <3 x i16> [[R]], ptr addrspace(1) poison, align 8 -; SI-NEXT: ret void -; -; VI-LABEL: @sub_nuw_nsw_3xi16( -; VI-NEXT: [[TMP1:%.*]] = zext <3 x i16> [[A:%.*]] to <3 x i32> -; VI-NEXT: [[TMP2:%.*]] = zext <3 x i16> [[B:%.*]] to <3 x i32> -; VI-NEXT: [[TMP3:%.*]] = sub nuw nsw <3 x i32> [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc <3 x i32> [[TMP3]] to <3 x i16> -; VI-NEXT: store volatile <3 x i16> [[TMP4]], ptr addrspace(1) poison, align 8 -; VI-NEXT: ret void -; - %r = sub nuw nsw <3 x i16> %a, %b - store volatile <3 x i16> %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @mul_3xi16(<3 x i16> %a, <3 x i16> %b) { -; SI-LABEL: @mul_3xi16( -; SI-NEXT: [[R:%.*]] = mul <3 x i16> [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile <3 x i16> [[R]], ptr addrspace(1) poison, align 8 -; SI-NEXT: ret void -; -; VI-LABEL: @mul_3xi16( -; VI-NEXT: [[TMP1:%.*]] = zext <3 x i16> [[A:%.*]] to <3 x i32> -; VI-NEXT: [[TMP2:%.*]] = zext <3 x i16> [[B:%.*]] to <3 x i32> -; VI-NEXT: [[TMP3:%.*]] = mul nuw <3 x i32> [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc <3 x i32> [[TMP3]] to <3 x i16> -; VI-NEXT: store volatile <3 x i16> [[TMP4]], ptr addrspace(1) poison, align 8 -; VI-NEXT: ret void -; - %r = mul <3 x i16> %a, %b - store volatile <3 x i16> %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @mul_nsw_3xi16(<3 x i16> %a, <3 x i16> %b) { -; SI-LABEL: @mul_nsw_3xi16( -; SI-NEXT: [[R:%.*]] = mul nsw <3 x i16> [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile <3 x i16> [[R]], ptr addrspace(1) poison, align 8 -; SI-NEXT: ret void -; -; VI-LABEL: @mul_nsw_3xi16( -; VI-NEXT: [[TMP1:%.*]] = zext <3 x i16> [[A:%.*]] to <3 x i32> -; VI-NEXT: [[TMP2:%.*]] = zext <3 x i16> [[B:%.*]] to <3 x i32> -; VI-NEXT: [[TMP3:%.*]] = mul nuw <3 x i32> [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc <3 x i32> [[TMP3]] to <3 x i16> -; VI-NEXT: store volatile <3 x i16> [[TMP4]], ptr addrspace(1) poison, align 8 -; VI-NEXT: ret void -; - %r = mul nsw <3 x i16> %a, %b - store volatile <3 x i16> %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @mul_nuw_3xi16(<3 x i16> %a, <3 x i16> %b) { -; SI-LABEL: @mul_nuw_3xi16( -; SI-NEXT: [[R:%.*]] = mul nuw <3 x i16> [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile <3 x i16> [[R]], ptr addrspace(1) poison, align 8 -; SI-NEXT: ret void -; -; VI-LABEL: @mul_nuw_3xi16( -; VI-NEXT: [[TMP1:%.*]] = zext <3 x i16> [[A:%.*]] to <3 x i32> -; VI-NEXT: [[TMP2:%.*]] = zext <3 x i16> [[B:%.*]] to <3 x i32> -; VI-NEXT: [[TMP3:%.*]] = mul nuw nsw <3 x i32> [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc <3 x i32> [[TMP3]] to <3 x i16> -; VI-NEXT: store volatile <3 x i16> [[TMP4]], ptr addrspace(1) poison, align 8 -; VI-NEXT: ret void -; - %r = mul nuw <3 x i16> %a, %b - store volatile <3 x i16> %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @mul_nuw_nsw_3xi16(<3 x i16> %a, <3 x i16> %b) { -; SI-LABEL: @mul_nuw_nsw_3xi16( -; SI-NEXT: [[R:%.*]] = mul nuw nsw <3 x i16> [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile <3 x i16> [[R]], ptr addrspace(1) poison, align 8 -; SI-NEXT: ret void -; -; VI-LABEL: @mul_nuw_nsw_3xi16( -; VI-NEXT: [[TMP1:%.*]] = zext <3 x i16> [[A:%.*]] to <3 x i32> -; VI-NEXT: [[TMP2:%.*]] = zext <3 x i16> [[B:%.*]] to <3 x i32> -; VI-NEXT: [[TMP3:%.*]] = mul nuw nsw <3 x i32> [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc <3 x i32> [[TMP3]] to <3 x i16> -; VI-NEXT: store volatile <3 x i16> [[TMP4]], ptr addrspace(1) poison, align 8 -; VI-NEXT: ret void -; - %r = mul nuw nsw <3 x i16> %a, %b - store volatile <3 x i16> %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @shl_3xi16(<3 x i16> %a, <3 x i16> %b) { -; SI-LABEL: @shl_3xi16( -; SI-NEXT: [[R:%.*]] = shl <3 x i16> [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile <3 x i16> [[R]], ptr addrspace(1) poison, align 8 -; SI-NEXT: ret void -; -; VI-LABEL: @shl_3xi16( -; VI-NEXT: [[TMP1:%.*]] = zext <3 x i16> [[A:%.*]] to <3 x i32> -; VI-NEXT: [[TMP2:%.*]] = zext <3 x i16> [[B:%.*]] to <3 x i32> -; VI-NEXT: [[TMP3:%.*]] = shl nuw nsw <3 x i32> [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc <3 x i32> [[TMP3]] to <3 x i16> -; VI-NEXT: store volatile <3 x i16> [[TMP4]], ptr addrspace(1) poison, align 8 -; VI-NEXT: ret void -; - %r = shl <3 x i16> %a, %b - store volatile <3 x i16> %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @shl_nsw_3xi16(<3 x i16> %a, <3 x i16> %b) { -; SI-LABEL: @shl_nsw_3xi16( -; SI-NEXT: [[R:%.*]] = shl nsw <3 x i16> [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile <3 x i16> [[R]], ptr addrspace(1) poison, align 8 -; SI-NEXT: ret void -; -; VI-LABEL: @shl_nsw_3xi16( -; VI-NEXT: [[TMP1:%.*]] = zext <3 x i16> [[A:%.*]] to <3 x i32> -; VI-NEXT: [[TMP2:%.*]] = zext <3 x i16> [[B:%.*]] to <3 x i32> -; VI-NEXT: [[TMP3:%.*]] = shl nuw nsw <3 x i32> [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc <3 x i32> [[TMP3]] to <3 x i16> -; VI-NEXT: store volatile <3 x i16> [[TMP4]], ptr addrspace(1) poison, align 8 -; VI-NEXT: ret void -; - %r = shl nsw <3 x i16> %a, %b - store volatile <3 x i16> %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @shl_nuw_3xi16(<3 x i16> %a, <3 x i16> %b) { -; SI-LABEL: @shl_nuw_3xi16( -; SI-NEXT: [[R:%.*]] = shl nuw <3 x i16> [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile <3 x i16> [[R]], ptr addrspace(1) poison, align 8 -; SI-NEXT: ret void -; -; VI-LABEL: @shl_nuw_3xi16( -; VI-NEXT: [[TMP1:%.*]] = zext <3 x i16> [[A:%.*]] to <3 x i32> -; VI-NEXT: [[TMP2:%.*]] = zext <3 x i16> [[B:%.*]] to <3 x i32> -; VI-NEXT: [[TMP3:%.*]] = shl nuw nsw <3 x i32> [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc <3 x i32> [[TMP3]] to <3 x i16> -; VI-NEXT: store volatile <3 x i16> [[TMP4]], ptr addrspace(1) poison, align 8 -; VI-NEXT: ret void -; - %r = shl nuw <3 x i16> %a, %b - store volatile <3 x i16> %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @shl_nuw_nsw_3xi16(<3 x i16> %a, <3 x i16> %b) { -; SI-LABEL: @shl_nuw_nsw_3xi16( -; SI-NEXT: [[R:%.*]] = shl nuw nsw <3 x i16> [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile <3 x i16> [[R]], ptr addrspace(1) poison, align 8 -; SI-NEXT: ret void -; -; VI-LABEL: @shl_nuw_nsw_3xi16( -; VI-NEXT: [[TMP1:%.*]] = zext <3 x i16> [[A:%.*]] to <3 x i32> -; VI-NEXT: [[TMP2:%.*]] = zext <3 x i16> [[B:%.*]] to <3 x i32> -; VI-NEXT: [[TMP3:%.*]] = shl nuw nsw <3 x i32> [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc <3 x i32> [[TMP3]] to <3 x i16> -; VI-NEXT: store volatile <3 x i16> [[TMP4]], ptr addrspace(1) poison, align 8 -; VI-NEXT: ret void -; - %r = shl nuw nsw <3 x i16> %a, %b - store volatile <3 x i16> %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @lshr_3xi16(<3 x i16> %a, <3 x i16> %b) { -; SI-LABEL: @lshr_3xi16( -; SI-NEXT: [[R:%.*]] = lshr <3 x i16> [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile <3 x i16> [[R]], ptr addrspace(1) poison, align 8 -; SI-NEXT: ret void -; -; VI-LABEL: @lshr_3xi16( -; VI-NEXT: [[TMP1:%.*]] = zext <3 x i16> [[A:%.*]] to <3 x i32> -; VI-NEXT: [[TMP2:%.*]] = zext <3 x i16> [[B:%.*]] to <3 x i32> -; VI-NEXT: [[TMP3:%.*]] = lshr <3 x i32> [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc <3 x i32> [[TMP3]] to <3 x i16> -; VI-NEXT: store volatile <3 x i16> [[TMP4]], ptr addrspace(1) poison, align 8 -; VI-NEXT: ret void -; - %r = lshr <3 x i16> %a, %b - store volatile <3 x i16> %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @lshr_exact_3xi16(<3 x i16> %a, <3 x i16> %b) { -; SI-LABEL: @lshr_exact_3xi16( -; SI-NEXT: [[R:%.*]] = lshr exact <3 x i16> [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile <3 x i16> [[R]], ptr addrspace(1) poison, align 8 -; SI-NEXT: ret void -; -; VI-LABEL: @lshr_exact_3xi16( -; VI-NEXT: [[TMP1:%.*]] = zext <3 x i16> [[A:%.*]] to <3 x i32> -; VI-NEXT: [[TMP2:%.*]] = zext <3 x i16> [[B:%.*]] to <3 x i32> -; VI-NEXT: [[TMP3:%.*]] = lshr exact <3 x i32> [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc <3 x i32> [[TMP3]] to <3 x i16> -; VI-NEXT: store volatile <3 x i16> [[TMP4]], ptr addrspace(1) poison, align 8 -; VI-NEXT: ret void -; - %r = lshr exact <3 x i16> %a, %b - store volatile <3 x i16> %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @ashr_3xi16(<3 x i16> %a, <3 x i16> %b) { -; SI-LABEL: @ashr_3xi16( -; SI-NEXT: [[R:%.*]] = ashr <3 x i16> [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile <3 x i16> [[R]], ptr addrspace(1) poison, align 8 -; SI-NEXT: ret void -; -; VI-LABEL: @ashr_3xi16( -; VI-NEXT: [[TMP1:%.*]] = sext <3 x i16> [[A:%.*]] to <3 x i32> -; VI-NEXT: [[TMP2:%.*]] = sext <3 x i16> [[B:%.*]] to <3 x i32> -; VI-NEXT: [[TMP3:%.*]] = ashr <3 x i32> [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc <3 x i32> [[TMP3]] to <3 x i16> -; VI-NEXT: store volatile <3 x i16> [[TMP4]], ptr addrspace(1) poison, align 8 -; VI-NEXT: ret void -; - %r = ashr <3 x i16> %a, %b - store volatile <3 x i16> %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @ashr_exact_3xi16(<3 x i16> %a, <3 x i16> %b) { -; SI-LABEL: @ashr_exact_3xi16( -; SI-NEXT: [[R:%.*]] = ashr exact <3 x i16> [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile <3 x i16> [[R]], ptr addrspace(1) poison, align 8 -; SI-NEXT: ret void -; -; VI-LABEL: @ashr_exact_3xi16( -; VI-NEXT: [[TMP1:%.*]] = sext <3 x i16> [[A:%.*]] to <3 x i32> -; VI-NEXT: [[TMP2:%.*]] = sext <3 x i16> [[B:%.*]] to <3 x i32> -; VI-NEXT: [[TMP3:%.*]] = ashr exact <3 x i32> [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc <3 x i32> [[TMP3]] to <3 x i16> -; VI-NEXT: store volatile <3 x i16> [[TMP4]], ptr addrspace(1) poison, align 8 -; VI-NEXT: ret void -; - %r = ashr exact <3 x i16> %a, %b - store volatile <3 x i16> %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @and_3xi16(<3 x i16> %a, <3 x i16> %b) { -; SI-LABEL: @and_3xi16( -; SI-NEXT: [[R:%.*]] = and <3 x i16> [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile <3 x i16> [[R]], ptr addrspace(1) poison, align 8 -; SI-NEXT: ret void -; -; VI-LABEL: @and_3xi16( -; VI-NEXT: [[TMP1:%.*]] = zext <3 x i16> [[A:%.*]] to <3 x i32> -; VI-NEXT: [[TMP2:%.*]] = zext <3 x i16> [[B:%.*]] to <3 x i32> -; VI-NEXT: [[TMP3:%.*]] = and <3 x i32> [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc <3 x i32> [[TMP3]] to <3 x i16> -; VI-NEXT: store volatile <3 x i16> [[TMP4]], ptr addrspace(1) poison, align 8 -; VI-NEXT: ret void -; - %r = and <3 x i16> %a, %b - store volatile <3 x i16> %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @or_3xi16(<3 x i16> %a, <3 x i16> %b) { -; SI-LABEL: @or_3xi16( -; SI-NEXT: [[R:%.*]] = or <3 x i16> [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile <3 x i16> [[R]], ptr addrspace(1) poison, align 8 -; SI-NEXT: ret void -; -; VI-LABEL: @or_3xi16( -; VI-NEXT: [[TMP1:%.*]] = zext <3 x i16> [[A:%.*]] to <3 x i32> -; VI-NEXT: [[TMP2:%.*]] = zext <3 x i16> [[B:%.*]] to <3 x i32> -; VI-NEXT: [[TMP3:%.*]] = or <3 x i32> [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc <3 x i32> [[TMP3]] to <3 x i16> -; VI-NEXT: store volatile <3 x i16> [[TMP4]], ptr addrspace(1) poison, align 8 -; VI-NEXT: ret void -; - %r = or <3 x i16> %a, %b - store volatile <3 x i16> %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @xor_3xi16(<3 x i16> %a, <3 x i16> %b) { -; SI-LABEL: @xor_3xi16( -; SI-NEXT: [[R:%.*]] = xor <3 x i16> [[A:%.*]], [[B:%.*]] -; SI-NEXT: store volatile <3 x i16> [[R]], ptr addrspace(1) poison, align 8 -; SI-NEXT: ret void -; -; VI-LABEL: @xor_3xi16( -; VI-NEXT: [[TMP1:%.*]] = zext <3 x i16> [[A:%.*]] to <3 x i32> -; VI-NEXT: [[TMP2:%.*]] = zext <3 x i16> [[B:%.*]] to <3 x i32> -; VI-NEXT: [[TMP3:%.*]] = xor <3 x i32> [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = trunc <3 x i32> [[TMP3]] to <3 x i16> -; VI-NEXT: store volatile <3 x i16> [[TMP4]], ptr addrspace(1) poison, align 8 -; VI-NEXT: ret void -; - %r = xor <3 x i16> %a, %b - store volatile <3 x i16> %r, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @select_eq_3xi16(<3 x i16> %a, <3 x i16> %b) { -; SI-LABEL: @select_eq_3xi16( -; SI-NEXT: [[CMP:%.*]] = icmp eq <3 x i16> [[A:%.*]], [[B:%.*]] -; SI-NEXT: [[SEL:%.*]] = select <3 x i1> [[CMP]], <3 x i16> [[A]], <3 x i16> [[B]] -; SI-NEXT: store volatile <3 x i16> [[SEL]], ptr addrspace(1) poison, align 8 -; SI-NEXT: ret void -; -; VI-LABEL: @select_eq_3xi16( -; VI-NEXT: [[TMP1:%.*]] = zext <3 x i16> [[A:%.*]] to <3 x i32> -; VI-NEXT: [[TMP2:%.*]] = zext <3 x i16> [[B:%.*]] to <3 x i32> -; VI-NEXT: [[TMP3:%.*]] = icmp eq <3 x i32> [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = zext <3 x i16> [[A]] to <3 x i32> -; VI-NEXT: [[TMP5:%.*]] = zext <3 x i16> [[B]] to <3 x i32> -; VI-NEXT: [[TMP6:%.*]] = select <3 x i1> [[TMP3]], <3 x i32> [[TMP4]], <3 x i32> [[TMP5]] -; VI-NEXT: [[TMP7:%.*]] = trunc <3 x i32> [[TMP6]] to <3 x i16> -; VI-NEXT: store volatile <3 x i16> [[TMP7]], ptr addrspace(1) poison, align 8 -; VI-NEXT: ret void -; - %cmp = icmp eq <3 x i16> %a, %b - %sel = select <3 x i1> %cmp, <3 x i16> %a, <3 x i16> %b - store volatile <3 x i16> %sel, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @select_ne_3xi16(<3 x i16> %a, <3 x i16> %b) { -; SI-LABEL: @select_ne_3xi16( -; SI-NEXT: [[CMP:%.*]] = icmp ne <3 x i16> [[A:%.*]], [[B:%.*]] -; SI-NEXT: [[SEL:%.*]] = select <3 x i1> [[CMP]], <3 x i16> [[A]], <3 x i16> [[B]] -; SI-NEXT: store volatile <3 x i16> [[SEL]], ptr addrspace(1) poison, align 8 -; SI-NEXT: ret void -; -; VI-LABEL: @select_ne_3xi16( -; VI-NEXT: [[TMP1:%.*]] = zext <3 x i16> [[A:%.*]] to <3 x i32> -; VI-NEXT: [[TMP2:%.*]] = zext <3 x i16> [[B:%.*]] to <3 x i32> -; VI-NEXT: [[TMP3:%.*]] = icmp ne <3 x i32> [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = zext <3 x i16> [[A]] to <3 x i32> -; VI-NEXT: [[TMP5:%.*]] = zext <3 x i16> [[B]] to <3 x i32> -; VI-NEXT: [[TMP6:%.*]] = select <3 x i1> [[TMP3]], <3 x i32> [[TMP4]], <3 x i32> [[TMP5]] -; VI-NEXT: [[TMP7:%.*]] = trunc <3 x i32> [[TMP6]] to <3 x i16> -; VI-NEXT: store volatile <3 x i16> [[TMP7]], ptr addrspace(1) poison, align 8 -; VI-NEXT: ret void -; - %cmp = icmp ne <3 x i16> %a, %b - %sel = select <3 x i1> %cmp, <3 x i16> %a, <3 x i16> %b - store volatile <3 x i16> %sel, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @select_ugt_3xi16(<3 x i16> %a, <3 x i16> %b) { -; SI-LABEL: @select_ugt_3xi16( -; SI-NEXT: [[CMP:%.*]] = icmp ugt <3 x i16> [[A:%.*]], [[B:%.*]] -; SI-NEXT: [[SEL:%.*]] = select <3 x i1> [[CMP]], <3 x i16> [[A]], <3 x i16> [[B]] -; SI-NEXT: store volatile <3 x i16> [[SEL]], ptr addrspace(1) poison, align 8 -; SI-NEXT: ret void -; -; VI-LABEL: @select_ugt_3xi16( -; VI-NEXT: [[TMP1:%.*]] = zext <3 x i16> [[A:%.*]] to <3 x i32> -; VI-NEXT: [[TMP2:%.*]] = zext <3 x i16> [[B:%.*]] to <3 x i32> -; VI-NEXT: [[TMP3:%.*]] = icmp ugt <3 x i32> [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = zext <3 x i16> [[A]] to <3 x i32> -; VI-NEXT: [[TMP5:%.*]] = zext <3 x i16> [[B]] to <3 x i32> -; VI-NEXT: [[TMP6:%.*]] = select <3 x i1> [[TMP3]], <3 x i32> [[TMP4]], <3 x i32> [[TMP5]] -; VI-NEXT: [[TMP7:%.*]] = trunc <3 x i32> [[TMP6]] to <3 x i16> -; VI-NEXT: store volatile <3 x i16> [[TMP7]], ptr addrspace(1) poison, align 8 -; VI-NEXT: ret void -; - %cmp = icmp ugt <3 x i16> %a, %b - %sel = select <3 x i1> %cmp, <3 x i16> %a, <3 x i16> %b - store volatile <3 x i16> %sel, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @select_uge_3xi16(<3 x i16> %a, <3 x i16> %b) { -; SI-LABEL: @select_uge_3xi16( -; SI-NEXT: [[CMP:%.*]] = icmp uge <3 x i16> [[A:%.*]], [[B:%.*]] -; SI-NEXT: [[SEL:%.*]] = select <3 x i1> [[CMP]], <3 x i16> [[A]], <3 x i16> [[B]] -; SI-NEXT: store volatile <3 x i16> [[SEL]], ptr addrspace(1) poison, align 8 -; SI-NEXT: ret void -; -; VI-LABEL: @select_uge_3xi16( -; VI-NEXT: [[TMP1:%.*]] = zext <3 x i16> [[A:%.*]] to <3 x i32> -; VI-NEXT: [[TMP2:%.*]] = zext <3 x i16> [[B:%.*]] to <3 x i32> -; VI-NEXT: [[TMP3:%.*]] = icmp uge <3 x i32> [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = zext <3 x i16> [[A]] to <3 x i32> -; VI-NEXT: [[TMP5:%.*]] = zext <3 x i16> [[B]] to <3 x i32> -; VI-NEXT: [[TMP6:%.*]] = select <3 x i1> [[TMP3]], <3 x i32> [[TMP4]], <3 x i32> [[TMP5]] -; VI-NEXT: [[TMP7:%.*]] = trunc <3 x i32> [[TMP6]] to <3 x i16> -; VI-NEXT: store volatile <3 x i16> [[TMP7]], ptr addrspace(1) poison, align 8 -; VI-NEXT: ret void -; - %cmp = icmp uge <3 x i16> %a, %b - %sel = select <3 x i1> %cmp, <3 x i16> %a, <3 x i16> %b - store volatile <3 x i16> %sel, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @select_ult_3xi16(<3 x i16> %a, <3 x i16> %b) { -; SI-LABEL: @select_ult_3xi16( -; SI-NEXT: [[CMP:%.*]] = icmp ult <3 x i16> [[A:%.*]], [[B:%.*]] -; SI-NEXT: [[SEL:%.*]] = select <3 x i1> [[CMP]], <3 x i16> [[A]], <3 x i16> [[B]] -; SI-NEXT: store volatile <3 x i16> [[SEL]], ptr addrspace(1) poison, align 8 -; SI-NEXT: ret void -; -; VI-LABEL: @select_ult_3xi16( -; VI-NEXT: [[TMP1:%.*]] = zext <3 x i16> [[A:%.*]] to <3 x i32> -; VI-NEXT: [[TMP2:%.*]] = zext <3 x i16> [[B:%.*]] to <3 x i32> -; VI-NEXT: [[TMP3:%.*]] = icmp ult <3 x i32> [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = zext <3 x i16> [[A]] to <3 x i32> -; VI-NEXT: [[TMP5:%.*]] = zext <3 x i16> [[B]] to <3 x i32> -; VI-NEXT: [[TMP6:%.*]] = select <3 x i1> [[TMP3]], <3 x i32> [[TMP4]], <3 x i32> [[TMP5]] -; VI-NEXT: [[TMP7:%.*]] = trunc <3 x i32> [[TMP6]] to <3 x i16> -; VI-NEXT: store volatile <3 x i16> [[TMP7]], ptr addrspace(1) poison, align 8 -; VI-NEXT: ret void -; - %cmp = icmp ult <3 x i16> %a, %b - %sel = select <3 x i1> %cmp, <3 x i16> %a, <3 x i16> %b - store volatile <3 x i16> %sel, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @select_ule_3xi16(<3 x i16> %a, <3 x i16> %b) { -; SI-LABEL: @select_ule_3xi16( -; SI-NEXT: [[CMP:%.*]] = icmp ule <3 x i16> [[A:%.*]], [[B:%.*]] -; SI-NEXT: [[SEL:%.*]] = select <3 x i1> [[CMP]], <3 x i16> [[A]], <3 x i16> [[B]] -; SI-NEXT: store volatile <3 x i16> [[SEL]], ptr addrspace(1) poison, align 8 -; SI-NEXT: ret void -; -; VI-LABEL: @select_ule_3xi16( -; VI-NEXT: [[TMP1:%.*]] = zext <3 x i16> [[A:%.*]] to <3 x i32> -; VI-NEXT: [[TMP2:%.*]] = zext <3 x i16> [[B:%.*]] to <3 x i32> -; VI-NEXT: [[TMP3:%.*]] = icmp ule <3 x i32> [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = zext <3 x i16> [[A]] to <3 x i32> -; VI-NEXT: [[TMP5:%.*]] = zext <3 x i16> [[B]] to <3 x i32> -; VI-NEXT: [[TMP6:%.*]] = select <3 x i1> [[TMP3]], <3 x i32> [[TMP4]], <3 x i32> [[TMP5]] -; VI-NEXT: [[TMP7:%.*]] = trunc <3 x i32> [[TMP6]] to <3 x i16> -; VI-NEXT: store volatile <3 x i16> [[TMP7]], ptr addrspace(1) poison, align 8 -; VI-NEXT: ret void -; - %cmp = icmp ule <3 x i16> %a, %b - %sel = select <3 x i1> %cmp, <3 x i16> %a, <3 x i16> %b - store volatile <3 x i16> %sel, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @select_sgt_3xi16(<3 x i16> %a, <3 x i16> %b) { -; SI-LABEL: @select_sgt_3xi16( -; SI-NEXT: [[CMP:%.*]] = icmp sgt <3 x i16> [[A:%.*]], [[B:%.*]] -; SI-NEXT: [[SEL:%.*]] = select <3 x i1> [[CMP]], <3 x i16> [[A]], <3 x i16> [[B]] -; SI-NEXT: store volatile <3 x i16> [[SEL]], ptr addrspace(1) poison, align 8 -; SI-NEXT: ret void -; -; VI-LABEL: @select_sgt_3xi16( -; VI-NEXT: [[TMP1:%.*]] = sext <3 x i16> [[A:%.*]] to <3 x i32> -; VI-NEXT: [[TMP2:%.*]] = sext <3 x i16> [[B:%.*]] to <3 x i32> -; VI-NEXT: [[TMP3:%.*]] = icmp sgt <3 x i32> [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = sext <3 x i16> [[A]] to <3 x i32> -; VI-NEXT: [[TMP5:%.*]] = sext <3 x i16> [[B]] to <3 x i32> -; VI-NEXT: [[TMP6:%.*]] = select <3 x i1> [[TMP3]], <3 x i32> [[TMP4]], <3 x i32> [[TMP5]] -; VI-NEXT: [[TMP7:%.*]] = trunc <3 x i32> [[TMP6]] to <3 x i16> -; VI-NEXT: store volatile <3 x i16> [[TMP7]], ptr addrspace(1) poison, align 8 -; VI-NEXT: ret void -; - %cmp = icmp sgt <3 x i16> %a, %b - %sel = select <3 x i1> %cmp, <3 x i16> %a, <3 x i16> %b - store volatile <3 x i16> %sel, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @select_sge_3xi16(<3 x i16> %a, <3 x i16> %b) { -; SI-LABEL: @select_sge_3xi16( -; SI-NEXT: [[CMP:%.*]] = icmp sge <3 x i16> [[A:%.*]], [[B:%.*]] -; SI-NEXT: [[SEL:%.*]] = select <3 x i1> [[CMP]], <3 x i16> [[A]], <3 x i16> [[B]] -; SI-NEXT: store volatile <3 x i16> [[SEL]], ptr addrspace(1) poison, align 8 -; SI-NEXT: ret void -; -; VI-LABEL: @select_sge_3xi16( -; VI-NEXT: [[TMP1:%.*]] = sext <3 x i16> [[A:%.*]] to <3 x i32> -; VI-NEXT: [[TMP2:%.*]] = sext <3 x i16> [[B:%.*]] to <3 x i32> -; VI-NEXT: [[TMP3:%.*]] = icmp sge <3 x i32> [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = sext <3 x i16> [[A]] to <3 x i32> -; VI-NEXT: [[TMP5:%.*]] = sext <3 x i16> [[B]] to <3 x i32> -; VI-NEXT: [[TMP6:%.*]] = select <3 x i1> [[TMP3]], <3 x i32> [[TMP4]], <3 x i32> [[TMP5]] -; VI-NEXT: [[TMP7:%.*]] = trunc <3 x i32> [[TMP6]] to <3 x i16> -; VI-NEXT: store volatile <3 x i16> [[TMP7]], ptr addrspace(1) poison, align 8 -; VI-NEXT: ret void -; - %cmp = icmp sge <3 x i16> %a, %b - %sel = select <3 x i1> %cmp, <3 x i16> %a, <3 x i16> %b - store volatile <3 x i16> %sel, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @select_slt_3xi16(<3 x i16> %a, <3 x i16> %b) { -; SI-LABEL: @select_slt_3xi16( -; SI-NEXT: [[CMP:%.*]] = icmp slt <3 x i16> [[A:%.*]], [[B:%.*]] -; SI-NEXT: [[SEL:%.*]] = select <3 x i1> [[CMP]], <3 x i16> [[A]], <3 x i16> [[B]] -; SI-NEXT: store volatile <3 x i16> [[SEL]], ptr addrspace(1) poison, align 8 -; SI-NEXT: ret void -; -; VI-LABEL: @select_slt_3xi16( -; VI-NEXT: [[TMP1:%.*]] = sext <3 x i16> [[A:%.*]] to <3 x i32> -; VI-NEXT: [[TMP2:%.*]] = sext <3 x i16> [[B:%.*]] to <3 x i32> -; VI-NEXT: [[TMP3:%.*]] = icmp slt <3 x i32> [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = sext <3 x i16> [[A]] to <3 x i32> -; VI-NEXT: [[TMP5:%.*]] = sext <3 x i16> [[B]] to <3 x i32> -; VI-NEXT: [[TMP6:%.*]] = select <3 x i1> [[TMP3]], <3 x i32> [[TMP4]], <3 x i32> [[TMP5]] -; VI-NEXT: [[TMP7:%.*]] = trunc <3 x i32> [[TMP6]] to <3 x i16> -; VI-NEXT: store volatile <3 x i16> [[TMP7]], ptr addrspace(1) poison, align 8 -; VI-NEXT: ret void -; - %cmp = icmp slt <3 x i16> %a, %b - %sel = select <3 x i1> %cmp, <3 x i16> %a, <3 x i16> %b - store volatile <3 x i16> %sel, ptr addrspace(1) poison - ret void -} - -define amdgpu_kernel void @select_sle_3xi16(<3 x i16> %a, <3 x i16> %b) { -; SI-LABEL: @select_sle_3xi16( -; SI-NEXT: [[CMP:%.*]] = icmp sle <3 x i16> [[A:%.*]], [[B:%.*]] -; SI-NEXT: [[SEL:%.*]] = select <3 x i1> [[CMP]], <3 x i16> [[A]], <3 x i16> [[B]] -; SI-NEXT: store volatile <3 x i16> [[SEL]], ptr addrspace(1) poison, align 8 -; SI-NEXT: ret void -; -; VI-LABEL: @select_sle_3xi16( -; VI-NEXT: [[TMP1:%.*]] = sext <3 x i16> [[A:%.*]] to <3 x i32> -; VI-NEXT: [[TMP2:%.*]] = sext <3 x i16> [[B:%.*]] to <3 x i32> -; VI-NEXT: [[TMP3:%.*]] = icmp sle <3 x i32> [[TMP1]], [[TMP2]] -; VI-NEXT: [[TMP4:%.*]] = sext <3 x i16> [[A]] to <3 x i32> -; VI-NEXT: [[TMP5:%.*]] = sext <3 x i16> [[B]] to <3 x i32> -; VI-NEXT: [[TMP6:%.*]] = select <3 x i1> [[TMP3]], <3 x i32> [[TMP4]], <3 x i32> [[TMP5]] -; VI-NEXT: [[TMP7:%.*]] = trunc <3 x i32> [[TMP6]] to <3 x i16> -; VI-NEXT: store volatile <3 x i16> [[TMP7]], ptr addrspace(1) poison, align 8 -; VI-NEXT: ret void -; - %cmp = icmp sle <3 x i16> %a, %b - %sel = select <3 x i1> %cmp, <3 x i16> %a, <3 x i16> %b - store volatile <3 x i16> %sel, ptr addrspace(1) poison - ret void -} - -declare <3 x i16> @llvm.bitreverse.v3i16(<3 x i16>) - -define amdgpu_kernel void @bitreverse_3xi16(<3 x i16> %a) { -; SI-LABEL: @bitreverse_3xi16( -; SI-NEXT: [[BREV:%.*]] = call <3 x i16> @llvm.bitreverse.v3i16(<3 x i16> [[A:%.*]]) -; SI-NEXT: store volatile <3 x i16> [[BREV]], ptr addrspace(1) poison, align 8 -; SI-NEXT: ret void -; -; VI-LABEL: @bitreverse_3xi16( -; VI-NEXT: [[TMP1:%.*]] = zext <3 x i16> [[A:%.*]] to <3 x i32> -; VI-NEXT: [[TMP2:%.*]] = call <3 x i32> @llvm.bitreverse.v3i32(<3 x i32> [[TMP1]]) -; VI-NEXT: [[TMP3:%.*]] = lshr <3 x i32> [[TMP2]], splat (i32 16) -; VI-NEXT: [[TMP4:%.*]] = trunc <3 x i32> [[TMP3]] to <3 x i16> -; VI-NEXT: store volatile <3 x i16> [[TMP4]], ptr addrspace(1) poison, align 8 -; VI-NEXT: ret void -; - %brev = call <3 x i16> @llvm.bitreverse.v3i16(<3 x i16> %a) - store volatile <3 x i16> %brev, ptr addrspace(1) poison - ret void -}