Index: llvm/lib/Target/AMDGPU/AMDGPULibCalls.cpp =================================================================== --- llvm/lib/Target/AMDGPU/AMDGPULibCalls.cpp +++ llvm/lib/Target/AMDGPU/AMDGPULibCalls.cpp @@ -17,6 +17,7 @@ #include "llvm/Analysis/AssumptionCache.h" #include "llvm/Analysis/TargetLibraryInfo.h" #include "llvm/Analysis/ValueTracking.h" +#include "llvm/IR/AttributeMask.h" #include "llvm/IR/Dominators.h" #include "llvm/IR/IRBuilder.h" #include "llvm/IR/IntrinsicInst.h" @@ -168,6 +169,15 @@ return R; } +static FunctionType *getPownType(FunctionType *FT) { + Type *PowNExpTy = Type::getInt32Ty(FT->getContext()); + if (VectorType *VecTy = dyn_cast(FT->getReturnType())) + PowNExpTy = VectorType::get(PowNExpTy, VecTy->getElementCount()); + + return FunctionType::get(FT->getReturnType(), + {FT->getParamType(0), PowNExpTy}, false); +} + // Data structures for table-driven optimizations. // FuncTbl works for both f32 and f64 functions with 1 input argument @@ -738,6 +748,27 @@ return fold_pow(FPOp, B, PowrInfo) || true; } + // pow(x, y) -> pown(x, y) for known integral y + if (isKnownIntegral(FPOp->getOperand(1), M->getDataLayout(), + FPOp->getFastMathFlags())) { + FunctionType *PownType = getPownType(CI->getFunctionType()); + AMDGPULibFunc PownInfo(AMDGPULibFunc::EI_POWN, PownType, true); + FunctionCallee PownFunc = getFunction(M, PownInfo); + if (PownFunc) { + // TODO: If the incoming integral value is an sitofp/uitofp, it won't + // fold out without a known range. We can probably take the source + // value directly. + Value *CastedArg = + B.CreateFPToSI(FPOp->getOperand(1), PownType->getParamType(1)); + // Have to drop any nofpclass attributes on the original call site. + Call->removeParamAttrs( + 1, AttributeFuncs::typeIncompatible(CastedArg->getType())); + Call->setCalledFunction(PownFunc); + Call->setArgOperand(1, CastedArg); + return fold_pow(FPOp, B, PownInfo) || true; + } + } + return fold_pow(FPOp, B, FInfo); } case AMDGPULibFunc::EI_POWR: Index: llvm/lib/Target/AMDGPU/AMDGPULibFunc.h =================================================================== --- llvm/lib/Target/AMDGPU/AMDGPULibFunc.h +++ llvm/lib/Target/AMDGPU/AMDGPULibFunc.h @@ -18,6 +18,7 @@ class FunctionType; class Function; class Module; +class Type; class AMDGPULibFuncBase { public: @@ -290,18 +291,23 @@ }; struct Param { - unsigned char ArgType; - unsigned char VectorSize; - unsigned char PtrKind; + unsigned char ArgType = 0; + unsigned char VectorSize = 1; + unsigned char PtrKind = 0; - unsigned char Reserved; + unsigned char Reserved = 0; void reset() { ArgType = 0; VectorSize = 1; PtrKind = 0; } - Param() { reset(); } + + static Param getIntN(unsigned char NumElts) { + return Param{I32, NumElts, 0, 0}; + } + + static Param getFromTy(Type *Ty, bool Signed); template void mangleItanium(Stream& os); @@ -351,7 +357,7 @@ protected: EFuncId FuncId; std::string Name; - ENamePrefix FKind; + ENamePrefix FKind = NOPFX; }; /// Wrapper class for AMDGPULIbFuncImpl @@ -362,6 +368,8 @@ /// Clone a mangled library func with the Id \p Id and argument info from \p /// CopyFrom. explicit AMDGPULibFunc(EFuncId Id, const AMDGPULibFunc &CopyFrom); + explicit AMDGPULibFunc(EFuncId Id, FunctionType *FT, bool SignedInts); + /// Construct an unmangled library function on the fly. explicit AMDGPULibFunc(StringRef FName, FunctionType *FT); @@ -415,6 +423,8 @@ explicit AMDGPUMangledLibFunc(); explicit AMDGPUMangledLibFunc(EFuncId id, const AMDGPUMangledLibFunc ©From); + explicit AMDGPUMangledLibFunc(EFuncId id, FunctionType *FT, + bool SignedInts = true); std::string getName() const override; unsigned getNumArgs() const override; Index: llvm/lib/Target/AMDGPU/AMDGPULibFunc.cpp =================================================================== --- llvm/lib/Target/AMDGPU/AMDGPULibFunc.cpp +++ llvm/lib/Target/AMDGPU/AMDGPULibFunc.cpp @@ -527,6 +527,16 @@ Leads[1] = copyFrom.Leads[1]; } +AMDGPUMangledLibFunc::AMDGPUMangledLibFunc(EFuncId id, FunctionType *FT, + bool SignedInts) { + FuncId = id; + unsigned NumArgs = FT->getNumParams(); + if (NumArgs >= 1) + Leads[0] = Param::getFromTy(FT->getParamType(0), SignedInts); + if (NumArgs >= 2) + Leads[1] = Param::getFromTy(FT->getParamType(1), SignedInts); +} + /////////////////////////////////////////////////////////////////////////////// // Demangling @@ -875,6 +885,50 @@ /////////////////////////////////////////////////////////////////////////////// // Misc +AMDGPULibFuncBase::Param AMDGPULibFuncBase::Param::getFromTy(Type *Ty, + bool Signed) { + Param P; + if (FixedVectorType *VT = dyn_cast(Ty)) { + P.VectorSize = VT->getNumElements(); + Ty = VT->getElementType(); + } + + switch (Ty->getTypeID()) { + case Type::FloatTyID: + P.ArgType = AMDGPULibFunc::F32; + break; + case Type::DoubleTyID: + P.ArgType = AMDGPULibFunc::F64; + break; + case Type::HalfTyID: + P.ArgType = AMDGPULibFunc::F16; + break; + case Type::IntegerTyID: + switch (cast(Ty)->getBitWidth()) { + case 8: + P.ArgType = Signed ? AMDGPULibFunc::I8 : AMDGPULibFunc::U8; + break; + case 16: + P.ArgType = Signed ? AMDGPULibFunc::I16 : AMDGPULibFunc::U16; + break; + case 32: + P.ArgType = Signed ? AMDGPULibFunc::I32 : AMDGPULibFunc::U32; + break; + case 64: + P.ArgType = Signed ? AMDGPULibFunc::I64 : AMDGPULibFunc::U64; + break; + default: + llvm_unreachable("unhandled libcall argument type"); + } + + break; + default: + llvm_unreachable("unhandled libcall argument type"); + } + + return P; +} + static Type* getIntrinsicParamType( LLVMContext& C, const AMDGPULibFunc::Param& P, @@ -1051,6 +1105,10 @@ Id, *cast(CopyFrom.Impl.get()))); } +AMDGPULibFunc::AMDGPULibFunc(EFuncId Id, FunctionType *FT, bool SignedInts) { + Impl.reset(new AMDGPUMangledLibFunc(Id, FT, SignedInts)); +} + AMDGPULibFunc::AMDGPULibFunc(StringRef Name, FunctionType *FT) { Impl.reset(new AMDGPUUnmangledLibFunc(Name, FT)); } Index: llvm/test/CodeGen/AMDGPU/amdgpu-simplify-libcall-pow-codegen.ll =================================================================== --- llvm/test/CodeGen/AMDGPU/amdgpu-simplify-libcall-pow-codegen.ll +++ llvm/test/CodeGen/AMDGPU/amdgpu-simplify-libcall-pow-codegen.ll @@ -58,13 +58,16 @@ ; CHECK: ; %bb.0: ; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) ; CHECK-NEXT: v_cvt_f32_i32_e32 v1, v1 -; CHECK-NEXT: v_log_f16_e64 v2, |v0| +; CHECK-NEXT: v_log_f16_e64 v3, |v0| ; CHECK-NEXT: v_cvt_f16_f32_e32 v1, v1 -; CHECK-NEXT: v_mul_f16_e32 v2, v2, v1 -; CHECK-NEXT: v_exp_f16_e32 v2, v2 -; CHECK-NEXT: v_cvt_i16_f16_e32 v1, v1 +; CHECK-NEXT: v_cvt_f32_f16_e32 v1, v1 +; CHECK-NEXT: v_cvt_i32_f32_e32 v1, v1 +; CHECK-NEXT: v_cvt_f32_i32_e32 v2, v1 ; CHECK-NEXT: v_lshlrev_b16_e32 v1, 15, v1 ; CHECK-NEXT: v_and_b32_e32 v0, v1, v0 +; CHECK-NEXT: v_cvt_f16_f32_e32 v2, v2 +; CHECK-NEXT: v_mul_f16_e32 v2, v3, v2 +; CHECK-NEXT: v_exp_f16_e32 v2, v2 ; CHECK-NEXT: v_or_b32_e32 v0, v0, v2 ; CHECK-NEXT: s_setpc_b64 s[30:31] %y = sitofp i32 %y.i to half @@ -76,28 +79,29 @@ ; CHECK-LABEL: test_pow_fast_f32__integral_y: ; CHECK: ; %bb.0: ; CHECK-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) +; CHECK-NEXT: v_cvt_f32_i32_e32 v1, v1 ; CHECK-NEXT: s_mov_b32 s4, 0x800000 ; CHECK-NEXT: v_cmp_lt_f32_e64 vcc, |v0|, s4 ; CHECK-NEXT: v_mov_b32_e32 v3, 0x4f800000 +; CHECK-NEXT: v_cvt_i32_f32_e32 v1, v1 ; CHECK-NEXT: v_cndmask_b32_e32 v3, 1.0, v3, vcc ; CHECK-NEXT: v_mul_f32_e64 v3, |v0|, v3 ; CHECK-NEXT: v_log_f32_e32 v3, v3 -; CHECK-NEXT: v_cvt_f32_i32_e32 v1, v1 +; CHECK-NEXT: v_cvt_f32_i32_e32 v4, v1 ; CHECK-NEXT: v_mov_b32_e32 v2, 0x42000000 ; CHECK-NEXT: v_cndmask_b32_e32 v2, 0, v2, vcc ; CHECK-NEXT: v_sub_f32_e32 v2, v3, v2 -; CHECK-NEXT: v_mul_f32_e32 v3, v2, v1 +; CHECK-NEXT: v_mul_f32_e32 v3, v2, v4 ; CHECK-NEXT: s_mov_b32 s4, 0xc2fc0000 -; CHECK-NEXT: v_mov_b32_e32 v4, 0x42800000 +; CHECK-NEXT: v_mov_b32_e32 v5, 0x42800000 ; CHECK-NEXT: v_cmp_gt_f32_e32 vcc, s4, v3 -; CHECK-NEXT: v_cndmask_b32_e32 v3, 0, v4, vcc -; CHECK-NEXT: v_fma_f32 v2, v2, v1, v3 +; CHECK-NEXT: v_cndmask_b32_e32 v3, 0, v5, vcc +; CHECK-NEXT: v_fma_f32 v2, v2, v4, v3 ; CHECK-NEXT: v_exp_f32_e32 v2, v2 -; CHECK-NEXT: v_cvt_i32_f32_e32 v1, v1 ; CHECK-NEXT: v_mov_b32_e32 v3, 0x1f800000 ; CHECK-NEXT: v_cndmask_b32_e32 v3, 1.0, v3, vcc -; CHECK-NEXT: v_mul_f32_e32 v2, v2, v3 ; CHECK-NEXT: v_lshlrev_b32_e32 v1, 31, v1 +; CHECK-NEXT: v_mul_f32_e32 v2, v2, v3 ; CHECK-NEXT: v_and_or_b32 v0, v1, v0, v2 ; CHECK-NEXT: s_setpc_b64 s[30:31] %y = sitofp i32 %y.i to float @@ -112,7 +116,7 @@ ; CHECK-NEXT: s_mov_b32 s16, s33 ; CHECK-NEXT: s_mov_b32 s33, s32 ; CHECK-NEXT: s_or_saveexec_b64 s[18:19], -1 -; CHECK-NEXT: buffer_store_dword v40, off, s[0:3], s33 offset:20 ; 4-byte Folded Spill +; CHECK-NEXT: buffer_store_dword v40, off, s[0:3], s33 offset:12 ; 4-byte Folded Spill ; CHECK-NEXT: s_mov_b64 exec, s[18:19] ; CHECK-NEXT: v_writelane_b32 v40, s16, 14 ; CHECK-NEXT: v_writelane_b32 v40, s30, 0 @@ -132,15 +136,12 @@ ; CHECK-NEXT: s_addc_u32 s5, s5, _Z4log2d@gotpcrel32@hi+12 ; CHECK-NEXT: s_load_dwordx2 s[16:17], s[4:5], 0x0 ; CHECK-NEXT: v_writelane_b32 v40, s42, 10 -; CHECK-NEXT: buffer_store_dword v41, off, s[0:3], s33 offset:16 ; 4-byte Folded Spill -; CHECK-NEXT: buffer_store_dword v42, off, s[0:3], s33 offset:12 ; 4-byte Folded Spill -; CHECK-NEXT: buffer_store_dword v43, off, s[0:3], s33 offset:8 ; 4-byte Folded Spill -; CHECK-NEXT: buffer_store_dword v44, off, s[0:3], s33 offset:4 ; 4-byte Folded Spill -; CHECK-NEXT: buffer_store_dword v45, off, s[0:3], s33 ; 4-byte Folded Spill +; CHECK-NEXT: buffer_store_dword v41, off, s[0:3], s33 offset:8 ; 4-byte Folded Spill +; CHECK-NEXT: buffer_store_dword v42, off, s[0:3], s33 offset:4 ; 4-byte Folded Spill +; CHECK-NEXT: buffer_store_dword v43, off, s[0:3], s33 ; 4-byte Folded Spill ; CHECK-NEXT: v_writelane_b32 v40, s43, 11 ; CHECK-NEXT: v_mov_b32_e32 v43, v1 ; CHECK-NEXT: v_writelane_b32 v40, s44, 12 -; CHECK-NEXT: v_mov_b32_e32 v42, v2 ; CHECK-NEXT: v_and_b32_e32 v1, 0x7fffffff, v43 ; CHECK-NEXT: s_mov_b64 s[4:5], s[40:41] ; CHECK-NEXT: v_writelane_b32 v40, s45, 13 @@ -152,15 +153,16 @@ ; CHECK-NEXT: s_mov_b64 s[34:35], s[10:11] ; CHECK-NEXT: s_mov_b64 s[36:37], s[8:9] ; CHECK-NEXT: s_mov_b64 s[38:39], s[6:7] -; CHECK-NEXT: v_cvt_f64_i32_e32 v[44:45], v42 +; CHECK-NEXT: v_mov_b32_e32 v42, v2 ; CHECK-NEXT: s_waitcnt lgkmcnt(0) ; CHECK-NEXT: s_swappc_b64 s[30:31], s[16:17] -; CHECK-NEXT: v_mul_f64 v[0:1], v[0:1], v[44:45] +; CHECK-NEXT: v_cvt_f64_i32_e32 v[2:3], v42 ; CHECK-NEXT: s_getpc_b64 s[4:5] ; CHECK-NEXT: s_add_u32 s4, s4, _Z4exp2d@gotpcrel32@lo+4 ; CHECK-NEXT: s_addc_u32 s5, s5, _Z4exp2d@gotpcrel32@hi+12 ; CHECK-NEXT: s_load_dwordx2 s[16:17], s[4:5], 0x0 ; CHECK-NEXT: s_mov_b64 s[4:5], s[40:41] +; CHECK-NEXT: v_mul_f64 v[0:1], v[0:1], v[2:3] ; CHECK-NEXT: s_mov_b64 s[6:7], s[38:39] ; CHECK-NEXT: s_mov_b64 s[8:9], s[36:37] ; CHECK-NEXT: s_mov_b64 s[10:11], s[34:35] @@ -173,11 +175,9 @@ ; CHECK-NEXT: s_swappc_b64 s[30:31], s[16:17] ; CHECK-NEXT: v_lshlrev_b32_e32 v2, 31, v42 ; CHECK-NEXT: v_and_b32_e32 v2, v2, v43 -; CHECK-NEXT: buffer_load_dword v45, off, s[0:3], s33 ; 4-byte Folded Reload -; CHECK-NEXT: buffer_load_dword v44, off, s[0:3], s33 offset:4 ; 4-byte Folded Reload -; CHECK-NEXT: buffer_load_dword v43, off, s[0:3], s33 offset:8 ; 4-byte Folded Reload -; CHECK-NEXT: buffer_load_dword v42, off, s[0:3], s33 offset:12 ; 4-byte Folded Reload -; CHECK-NEXT: buffer_load_dword v41, off, s[0:3], s33 offset:16 ; 4-byte Folded Reload +; CHECK-NEXT: buffer_load_dword v43, off, s[0:3], s33 ; 4-byte Folded Reload +; CHECK-NEXT: buffer_load_dword v42, off, s[0:3], s33 offset:4 ; 4-byte Folded Reload +; CHECK-NEXT: buffer_load_dword v41, off, s[0:3], s33 offset:8 ; 4-byte Folded Reload ; CHECK-NEXT: v_or_b32_e32 v1, v2, v1 ; CHECK-NEXT: v_readlane_b32 s45, v40, 13 ; CHECK-NEXT: v_readlane_b32 s44, v40, 12 @@ -195,7 +195,7 @@ ; CHECK-NEXT: v_readlane_b32 s30, v40, 0 ; CHECK-NEXT: v_readlane_b32 s4, v40, 14 ; CHECK-NEXT: s_or_saveexec_b64 s[6:7], -1 -; CHECK-NEXT: buffer_load_dword v40, off, s[0:3], s33 offset:20 ; 4-byte Folded Reload +; CHECK-NEXT: buffer_load_dword v40, off, s[0:3], s33 offset:12 ; 4-byte Folded Reload ; CHECK-NEXT: s_mov_b64 exec, s[6:7] ; CHECK-NEXT: s_addk_i32 s32, 0xf800 ; CHECK-NEXT: s_mov_b32 s33, s4 Index: llvm/test/CodeGen/AMDGPU/amdgpu-simplify-libcall-pow.ll =================================================================== --- llvm/test/CodeGen/AMDGPU/amdgpu-simplify-libcall-pow.ll +++ llvm/test/CodeGen/AMDGPU/amdgpu-simplify-libcall-pow.ll @@ -559,8 +559,7 @@ define <2 x float> @test_pow_afn_v2f32_plus_minus_0.0(<2 x float> %x) { ; CHECK-LABEL: define <2 x float> @test_pow_afn_v2f32_plus_minus_0.0 ; CHECK-SAME: (<2 x float> [[X:%.*]]) { -; CHECK-NEXT: [[POW:%.*]] = tail call afn <2 x float> @_Z3powDv2_fS_(<2 x float> [[X]], <2 x float> ) -; CHECK-NEXT: ret <2 x float> [[POW]] +; CHECK-NEXT: ret <2 x float> ; %pow = tail call afn <2 x float> @_Z3powDv2_fS_(<2 x float> %x, <2 x float> ) ret <2 x float> %pow @@ -695,7 +694,7 @@ define <2 x float> @test_pow_afn_v2f32_plus_minus_1.0(<2 x float> %x) { ; CHECK-LABEL: define <2 x float> @test_pow_afn_v2f32_plus_minus_1.0 ; CHECK-SAME: (<2 x float> [[X:%.*]]) { -; CHECK-NEXT: [[POW:%.*]] = tail call afn <2 x float> @_Z3powDv2_fS_(<2 x float> [[X]], <2 x float> ) +; CHECK-NEXT: [[POW:%.*]] = tail call afn <2 x float> @_Z4pownDv2_fDv2_i(<2 x float> [[X]], <2 x i32> ) ; CHECK-NEXT: ret <2 x float> [[POW]] ; %pow = tail call afn <2 x float> @_Z3powDv2_fS_(<2 x float> %x, <2 x float> ) @@ -734,7 +733,7 @@ define float @test_pow_afn_f32_neg2.0(float %x) { ; CHECK-LABEL: define float @test_pow_afn_f32_neg2.0 ; CHECK-SAME: (float [[X:%.*]]) { -; CHECK-NEXT: [[POW:%.*]] = tail call afn float @_Z3powff(float [[X]], float -2.000000e+00) +; CHECK-NEXT: [[POW:%.*]] = tail call afn float @_Z4pownfi(float [[X]], i32 -2) ; CHECK-NEXT: ret float [[POW]] ; %pow = tail call afn float @_Z3powff(float %x, float -2.0) @@ -754,7 +753,7 @@ define <2 x float> @test_pow_afn_v2f32_neg2.0(<2 x float> %x) { ; CHECK-LABEL: define <2 x float> @test_pow_afn_v2f32_neg2.0 ; CHECK-SAME: (<2 x float> [[X:%.*]]) { -; CHECK-NEXT: [[POW:%.*]] = tail call afn <2 x float> @_Z3powDv2_fS_(<2 x float> [[X]], <2 x float> ) +; CHECK-NEXT: [[POW:%.*]] = tail call afn <2 x float> @_Z4pownDv2_fDv2_i(<2 x float> [[X]], <2 x i32> ) ; CHECK-NEXT: ret <2 x float> [[POW]] ; %pow = tail call afn <2 x float> @_Z3powDv2_fS_(<2 x float> %x, <2 x float> ) @@ -764,7 +763,7 @@ define <2 x float> @test_pow_afn_v2f32_plus_minus_2.0(<2 x float> %x) { ; CHECK-LABEL: define <2 x float> @test_pow_afn_v2f32_plus_minus_2.0 ; CHECK-SAME: (<2 x float> [[X:%.*]]) { -; CHECK-NEXT: [[POW:%.*]] = tail call afn <2 x float> @_Z3powDv2_fS_(<2 x float> [[X]], <2 x float> ) +; CHECK-NEXT: [[POW:%.*]] = tail call afn <2 x float> @_Z4pownDv2_fDv2_i(<2 x float> [[X]], <2 x i32> ) ; CHECK-NEXT: ret <2 x float> [[POW]] ; %pow = tail call afn <2 x float> @_Z3powDv2_fS_(<2 x float> %x, <2 x float> ) @@ -774,7 +773,7 @@ define float @test_pow_afn_f32_3.0(float %x) { ; CHECK-LABEL: define float @test_pow_afn_f32_3.0 ; CHECK-SAME: (float [[X:%.*]]) { -; CHECK-NEXT: [[POW:%.*]] = tail call afn float @_Z3powff(float [[X]], float 3.000000e+00) +; CHECK-NEXT: [[POW:%.*]] = tail call afn float @_Z4pownfi(float [[X]], i32 3) ; CHECK-NEXT: ret float [[POW]] ; %pow = tail call afn float @_Z3powff(float %x, float 3.0) @@ -784,7 +783,7 @@ define float @test_pow_afn_f32_neg3.0(float %x) { ; CHECK-LABEL: define float @test_pow_afn_f32_neg3.0 ; CHECK-SAME: (float [[X:%.*]]) { -; CHECK-NEXT: [[POW:%.*]] = tail call afn float @_Z3powff(float [[X]], float -3.000000e+00) +; CHECK-NEXT: [[POW:%.*]] = tail call afn float @_Z4pownfi(float [[X]], i32 -3) ; CHECK-NEXT: ret float [[POW]] ; %pow = tail call afn float @_Z3powff(float %x, float -3.0) @@ -794,7 +793,7 @@ define <2 x float> @test_pow_afn_v2f32_3.0(<2 x float> %x) { ; CHECK-LABEL: define <2 x float> @test_pow_afn_v2f32_3.0 ; CHECK-SAME: (<2 x float> [[X:%.*]]) { -; CHECK-NEXT: [[POW:%.*]] = tail call afn <2 x float> @_Z3powDv2_fS_(<2 x float> [[X]], <2 x float> ) +; CHECK-NEXT: [[POW:%.*]] = tail call afn <2 x float> @_Z4pownDv2_fDv2_i(<2 x float> [[X]], <2 x i32> ) ; CHECK-NEXT: ret <2 x float> [[POW]] ; %pow = tail call afn <2 x float> @_Z3powDv2_fS_(<2 x float> %x, <2 x float> ) @@ -804,7 +803,7 @@ define <2 x float> @test_pow_afn_v2f32_neg3.0(<2 x float> %x) { ; CHECK-LABEL: define <2 x float> @test_pow_afn_v2f32_neg3.0 ; CHECK-SAME: (<2 x float> [[X:%.*]]) { -; CHECK-NEXT: [[POW:%.*]] = tail call afn <2 x float> @_Z3powDv2_fS_(<2 x float> [[X]], <2 x float> ) +; CHECK-NEXT: [[POW:%.*]] = tail call afn <2 x float> @_Z4pownDv2_fDv2_i(<2 x float> [[X]], <2 x i32> ) ; CHECK-NEXT: ret <2 x float> [[POW]] ; %pow = tail call afn <2 x float> @_Z3powDv2_fS_(<2 x float> %x, <2 x float> ) @@ -814,7 +813,7 @@ define <2 x float> @test_pow_afn_v2f32_plus_minus_3.0(<2 x float> %x) { ; CHECK-LABEL: define <2 x float> @test_pow_afn_v2f32_plus_minus_3.0 ; CHECK-SAME: (<2 x float> [[X:%.*]]) { -; CHECK-NEXT: [[POW:%.*]] = tail call afn <2 x float> @_Z3powDv2_fS_(<2 x float> [[X]], <2 x float> ) +; CHECK-NEXT: [[POW:%.*]] = tail call afn <2 x float> @_Z4pownDv2_fDv2_i(<2 x float> [[X]], <2 x i32> ) ; CHECK-NEXT: ret <2 x float> [[POW]] ; %pow = tail call afn <2 x float> @_Z3powDv2_fS_(<2 x float> %x, <2 x float> ) @@ -874,7 +873,7 @@ define float @test_pow_afn_f32_8.0(float %x) { ; CHECK-LABEL: define float @test_pow_afn_f32_8.0 ; CHECK-SAME: (float [[X:%.*]]) { -; CHECK-NEXT: [[POW:%.*]] = tail call afn float @_Z3powff(float [[X]], float 8.000000e+00) +; CHECK-NEXT: [[POW:%.*]] = tail call afn float @_Z4pownfi(float [[X]], i32 8) ; CHECK-NEXT: ret float [[POW]] ; %pow = tail call afn float @_Z3powff(float %x, float 8.0) @@ -884,7 +883,7 @@ define float @test_pow_afn_f32_neg8.0(float %x) { ; CHECK-LABEL: define float @test_pow_afn_f32_neg8.0 ; CHECK-SAME: (float [[X:%.*]]) { -; CHECK-NEXT: [[POW:%.*]] = tail call afn float @_Z3powff(float [[X]], float -8.000000e+00) +; CHECK-NEXT: [[POW:%.*]] = tail call afn float @_Z4pownfi(float [[X]], i32 -8) ; CHECK-NEXT: ret float [[POW]] ; %pow = tail call afn float @_Z3powff(float %x, float -8.0) @@ -894,7 +893,7 @@ define <2 x float> @test_pow_afn_v2f32_8.0(<2 x float> %x) { ; CHECK-LABEL: define <2 x float> @test_pow_afn_v2f32_8.0 ; CHECK-SAME: (<2 x float> [[X:%.*]]) { -; CHECK-NEXT: [[POW:%.*]] = tail call afn <2 x float> @_Z3powDv2_fS_(<2 x float> [[X]], <2 x float> ) +; CHECK-NEXT: [[POW:%.*]] = tail call afn <2 x float> @_Z4pownDv2_fDv2_i(<2 x float> [[X]], <2 x i32> ) ; CHECK-NEXT: ret <2 x float> [[POW]] ; %pow = tail call afn <2 x float> @_Z3powDv2_fS_(<2 x float> %x, <2 x float> ) @@ -904,7 +903,7 @@ define <2 x float> @test_pow_afn_v2f32_neg8.0(<2 x float> %x) { ; CHECK-LABEL: define <2 x float> @test_pow_afn_v2f32_neg8.0 ; CHECK-SAME: (<2 x float> [[X:%.*]]) { -; CHECK-NEXT: [[POW:%.*]] = tail call afn <2 x float> @_Z3powDv2_fS_(<2 x float> [[X]], <2 x float> ) +; CHECK-NEXT: [[POW:%.*]] = tail call afn <2 x float> @_Z4pownDv2_fDv2_i(<2 x float> [[X]], <2 x i32> ) ; CHECK-NEXT: ret <2 x float> [[POW]] ; %pow = tail call afn <2 x float> @_Z3powDv2_fS_(<2 x float> %x, <2 x float> ) @@ -914,7 +913,7 @@ define <2 x float> @test_pow_afn_v2f32_plus_minus_8.0(<2 x float> %x) { ; CHECK-LABEL: define <2 x float> @test_pow_afn_v2f32_plus_minus_8.0 ; CHECK-SAME: (<2 x float> [[X:%.*]]) { -; CHECK-NEXT: [[POW:%.*]] = tail call afn <2 x float> @_Z3powDv2_fS_(<2 x float> [[X]], <2 x float> ) +; CHECK-NEXT: [[POW:%.*]] = tail call afn <2 x float> @_Z4pownDv2_fDv2_i(<2 x float> [[X]], <2 x i32> ) ; CHECK-NEXT: ret <2 x float> [[POW]] ; %pow = tail call afn <2 x float> @_Z3powDv2_fS_(<2 x float> %x, <2 x float> ) @@ -924,7 +923,7 @@ define float @test_pow_afn_f32_12.0(float %x) { ; CHECK-LABEL: define float @test_pow_afn_f32_12.0 ; CHECK-SAME: (float [[X:%.*]]) { -; CHECK-NEXT: [[POW:%.*]] = tail call afn float @_Z3powff(float [[X]], float 1.200000e+01) +; CHECK-NEXT: [[POW:%.*]] = tail call afn float @_Z4pownfi(float [[X]], i32 12) ; CHECK-NEXT: ret float [[POW]] ; %pow = tail call afn float @_Z3powff(float %x, float 12.0) @@ -934,7 +933,7 @@ define float @test_pow_afn_f32_neg12.0(float %x) { ; CHECK-LABEL: define float @test_pow_afn_f32_neg12.0 ; CHECK-SAME: (float [[X:%.*]]) { -; CHECK-NEXT: [[POW:%.*]] = tail call afn float @_Z3powff(float [[X]], float -1.200000e+01) +; CHECK-NEXT: [[POW:%.*]] = tail call afn float @_Z4pownfi(float [[X]], i32 -12) ; CHECK-NEXT: ret float [[POW]] ; %pow = tail call afn float @_Z3powff(float %x, float -12.0) @@ -944,7 +943,7 @@ define <2 x float> @test_pow_afn_v2f32_12.0(<2 x float> %x) { ; CHECK-LABEL: define <2 x float> @test_pow_afn_v2f32_12.0 ; CHECK-SAME: (<2 x float> [[X:%.*]]) { -; CHECK-NEXT: [[POW:%.*]] = tail call afn <2 x float> @_Z3powDv2_fS_(<2 x float> [[X]], <2 x float> ) +; CHECK-NEXT: [[POW:%.*]] = tail call afn <2 x float> @_Z4pownDv2_fDv2_i(<2 x float> [[X]], <2 x i32> ) ; CHECK-NEXT: ret <2 x float> [[POW]] ; %pow = tail call afn <2 x float> @_Z3powDv2_fS_(<2 x float> %x, <2 x float> ) @@ -954,7 +953,7 @@ define <2 x float> @test_pow_afn_v2f32_neg12.0(<2 x float> %x) { ; CHECK-LABEL: define <2 x float> @test_pow_afn_v2f32_neg12.0 ; CHECK-SAME: (<2 x float> [[X:%.*]]) { -; CHECK-NEXT: [[POW:%.*]] = tail call afn <2 x float> @_Z3powDv2_fS_(<2 x float> [[X]], <2 x float> ) +; CHECK-NEXT: [[POW:%.*]] = tail call afn <2 x float> @_Z4pownDv2_fDv2_i(<2 x float> [[X]], <2 x i32> ) ; CHECK-NEXT: ret <2 x float> [[POW]] ; %pow = tail call afn <2 x float> @_Z3powDv2_fS_(<2 x float> %x, <2 x float> ) @@ -964,7 +963,7 @@ define <2 x float> @test_pow_afn_v2f32_plus_minus_12.0(<2 x float> %x) { ; CHECK-LABEL: define <2 x float> @test_pow_afn_v2f32_plus_minus_12.0 ; CHECK-SAME: (<2 x float> [[X:%.*]]) { -; CHECK-NEXT: [[POW:%.*]] = tail call afn <2 x float> @_Z3powDv2_fS_(<2 x float> [[X]], <2 x float> ) +; CHECK-NEXT: [[POW:%.*]] = tail call afn <2 x float> @_Z4pownDv2_fDv2_i(<2 x float> [[X]], <2 x i32> ) ; CHECK-NEXT: ret <2 x float> [[POW]] ; %pow = tail call afn <2 x float> @_Z3powDv2_fS_(<2 x float> %x, <2 x float> ) @@ -974,7 +973,7 @@ define float @test_pow_afn_f32_13.0(float %x) { ; CHECK-LABEL: define float @test_pow_afn_f32_13.0 ; CHECK-SAME: (float [[X:%.*]]) { -; CHECK-NEXT: [[POW:%.*]] = tail call afn float @_Z3powff(float [[X]], float 1.300000e+01) +; CHECK-NEXT: [[POW:%.*]] = tail call afn float @_Z4pownfi(float [[X]], i32 13) ; CHECK-NEXT: ret float [[POW]] ; %pow = tail call afn float @_Z3powff(float %x, float 13.0) @@ -984,7 +983,7 @@ define float @test_pow_afn_f32_neg13.0(float %x) { ; CHECK-LABEL: define float @test_pow_afn_f32_neg13.0 ; CHECK-SAME: (float [[X:%.*]]) { -; CHECK-NEXT: [[POW:%.*]] = tail call afn float @_Z3powff(float [[X]], float -1.300000e+01) +; CHECK-NEXT: [[POW:%.*]] = tail call afn float @_Z4pownfi(float [[X]], i32 -13) ; CHECK-NEXT: ret float [[POW]] ; %pow = tail call afn float @_Z3powff(float %x, float -13.0) @@ -994,7 +993,7 @@ define <2 x float> @test_pow_afn_v2f32_13.0(<2 x float> %x) { ; CHECK-LABEL: define <2 x float> @test_pow_afn_v2f32_13.0 ; CHECK-SAME: (<2 x float> [[X:%.*]]) { -; CHECK-NEXT: [[POW:%.*]] = tail call afn <2 x float> @_Z3powDv2_fS_(<2 x float> [[X]], <2 x float> ) +; CHECK-NEXT: [[POW:%.*]] = tail call afn <2 x float> @_Z4pownDv2_fDv2_i(<2 x float> [[X]], <2 x i32> ) ; CHECK-NEXT: ret <2 x float> [[POW]] ; %pow = tail call afn <2 x float> @_Z3powDv2_fS_(<2 x float> %x, <2 x float> ) @@ -1004,7 +1003,7 @@ define <2 x float> @test_pow_afn_v2f32_neg13.0(<2 x float> %x) { ; CHECK-LABEL: define <2 x float> @test_pow_afn_v2f32_neg13.0 ; CHECK-SAME: (<2 x float> [[X:%.*]]) { -; CHECK-NEXT: [[POW:%.*]] = tail call afn <2 x float> @_Z3powDv2_fS_(<2 x float> [[X]], <2 x float> ) +; CHECK-NEXT: [[POW:%.*]] = tail call afn <2 x float> @_Z4pownDv2_fDv2_i(<2 x float> [[X]], <2 x i32> ) ; CHECK-NEXT: ret <2 x float> [[POW]] ; %pow = tail call afn <2 x float> @_Z3powDv2_fS_(<2 x float> %x, <2 x float> ) @@ -1014,7 +1013,7 @@ define <2 x float> @test_pow_afn_v2f32_13.0_15.0(<2 x float> %x) { ; CHECK-LABEL: define <2 x float> @test_pow_afn_v2f32_13.0_15.0 ; CHECK-SAME: (<2 x float> [[X:%.*]]) { -; CHECK-NEXT: [[POW:%.*]] = tail call afn <2 x float> @_Z3powDv2_fS_(<2 x float> [[X]], <2 x float> ) +; CHECK-NEXT: [[POW:%.*]] = tail call afn <2 x float> @_Z4pownDv2_fDv2_i(<2 x float> [[X]], <2 x i32> ) ; CHECK-NEXT: ret <2 x float> [[POW]] ; %pow = tail call afn <2 x float> @_Z3powDv2_fS_(<2 x float> %x, <2 x float> ) @@ -1024,7 +1023,7 @@ define <2 x float> @test_pow_afn_v2f32_13.0_14.0(<2 x float> %x) { ; CHECK-LABEL: define <2 x float> @test_pow_afn_v2f32_13.0_14.0 ; CHECK-SAME: (<2 x float> [[X:%.*]]) { -; CHECK-NEXT: [[POW:%.*]] = tail call afn <2 x float> @_Z3powDv2_fS_(<2 x float> [[X]], <2 x float> ) +; CHECK-NEXT: [[POW:%.*]] = tail call afn <2 x float> @_Z4pownDv2_fDv2_i(<2 x float> [[X]], <2 x i32> ) ; CHECK-NEXT: ret <2 x float> [[POW]] ; %pow = tail call afn <2 x float> @_Z3powDv2_fS_(<2 x float> %x, <2 x float> ) @@ -1034,7 +1033,7 @@ define <2 x float> @test_pow_afn_v2f32_14.0_16.0(<2 x float> %x) { ; CHECK-LABEL: define <2 x float> @test_pow_afn_v2f32_14.0_16.0 ; CHECK-SAME: (<2 x float> [[X:%.*]]) { -; CHECK-NEXT: [[POW:%.*]] = tail call afn <2 x float> @_Z3powDv2_fS_(<2 x float> [[X]], <2 x float> ) +; CHECK-NEXT: [[POW:%.*]] = tail call afn <2 x float> @_Z4pownDv2_fDv2_i(<2 x float> [[X]], <2 x i32> ) ; CHECK-NEXT: ret <2 x float> [[POW]] ; %pow = tail call afn <2 x float> @_Z3powDv2_fS_(<2 x float> %x, <2 x float> ) @@ -1044,7 +1043,7 @@ define <2 x float> @test_pow_afn_v2f32_plus_minus_13.0(<2 x float> %x) { ; CHECK-LABEL: define <2 x float> @test_pow_afn_v2f32_plus_minus_13.0 ; CHECK-SAME: (<2 x float> [[X:%.*]]) { -; CHECK-NEXT: [[POW:%.*]] = tail call afn <2 x float> @_Z3powDv2_fS_(<2 x float> [[X]], <2 x float> ) +; CHECK-NEXT: [[POW:%.*]] = tail call afn <2 x float> @_Z4pownDv2_fDv2_i(<2 x float> [[X]], <2 x i32> ) ; CHECK-NEXT: ret <2 x float> [[POW]] ; %pow = tail call afn <2 x float> @_Z3powDv2_fS_(<2 x float> %x, <2 x float> ) @@ -1054,7 +1053,7 @@ define <2 x float> @test_pow_afn_v2f32_plus_minus_13.0_minus_14.0(<2 x float> %x) { ; CHECK-LABEL: define <2 x float> @test_pow_afn_v2f32_plus_minus_13.0_minus_14.0 ; CHECK-SAME: (<2 x float> [[X:%.*]]) { -; CHECK-NEXT: [[POW:%.*]] = tail call afn <2 x float> @_Z3powDv2_fS_(<2 x float> [[X]], <2 x float> ) +; CHECK-NEXT: [[POW:%.*]] = tail call afn <2 x float> @_Z4pownDv2_fDv2_i(<2 x float> [[X]], <2 x i32> ) ; CHECK-NEXT: ret <2 x float> [[POW]] ; %pow = tail call afn <2 x float> @_Z3powDv2_fS_(<2 x float> %x, <2 x float> ) @@ -1363,7 +1362,7 @@ define float @test_pow_f32__y_n2(float %x) { ; CHECK-LABEL: define float @test_pow_f32__y_n2 ; CHECK-SAME: (float [[X:%.*]]) { -; CHECK-NEXT: [[POW:%.*]] = tail call float @_Z3powff(float [[X]], float -2.000000e+00) +; CHECK-NEXT: [[POW:%.*]] = tail call float @_Z4pownfi(float [[X]], i32 -2) ; CHECK-NEXT: ret float [[POW]] ; %pow = tail call float @_Z3powff(float %x, float -2.0) @@ -1393,7 +1392,7 @@ define float @test_pow_f32__y_3(float %x) { ; CHECK-LABEL: define float @test_pow_f32__y_3 ; CHECK-SAME: (float [[X:%.*]]) { -; CHECK-NEXT: [[POW:%.*]] = tail call float @_Z3powff(float [[X]], float 3.000000e+00) +; CHECK-NEXT: [[POW:%.*]] = tail call float @_Z4pownfi(float [[X]], i32 3) ; CHECK-NEXT: ret float [[POW]] ; %pow = tail call float @_Z3powff(float %x, float 3.0) @@ -1403,7 +1402,7 @@ define float @test_pow_f32__y_n3(float %x) { ; CHECK-LABEL: define float @test_pow_f32__y_n3 ; CHECK-SAME: (float [[X:%.*]]) { -; CHECK-NEXT: [[POW:%.*]] = tail call float @_Z3powff(float [[X]], float -3.000000e+00) +; CHECK-NEXT: [[POW:%.*]] = tail call float @_Z4pownfi(float [[X]], i32 -3) ; CHECK-NEXT: ret float [[POW]] ; %pow = tail call float @_Z3powff(float %x, float -3.0) @@ -1480,7 +1479,7 @@ define <2 x float> @test_pow_v2f32__y_n2(<2 x float> %x) { ; CHECK-LABEL: define <2 x float> @test_pow_v2f32__y_n2 ; CHECK-SAME: (<2 x float> [[X:%.*]]) { -; CHECK-NEXT: [[POW:%.*]] = tail call <2 x float> @_Z3powDv2_fS_(<2 x float> [[X]], <2 x float> ) +; CHECK-NEXT: [[POW:%.*]] = tail call <2 x float> @_Z4pownDv2_fDv2_i(<2 x float> [[X]], <2 x i32> ) ; CHECK-NEXT: ret <2 x float> [[POW]] ; %pow = tail call <2 x float> @_Z3powDv2_fS_(<2 x float> %x, <2 x float> ) @@ -1510,7 +1509,7 @@ define <2 x float> @test_pow_v2f32__y_3(<2 x float> %x) { ; CHECK-LABEL: define <2 x float> @test_pow_v2f32__y_3 ; CHECK-SAME: (<2 x float> [[X:%.*]]) { -; CHECK-NEXT: [[POW:%.*]] = tail call <2 x float> @_Z3powDv2_fS_(<2 x float> [[X]], <2 x float> ) +; CHECK-NEXT: [[POW:%.*]] = tail call <2 x float> @_Z4pownDv2_fDv2_i(<2 x float> [[X]], <2 x i32> ) ; CHECK-NEXT: ret <2 x float> [[POW]] ; %pow = tail call <2 x float> @_Z3powDv2_fS_(<2 x float> %x, <2 x float> ) @@ -1520,7 +1519,7 @@ define <2 x float> @test_pow_v2f32__y_n3(<2 x float> %x) { ; CHECK-LABEL: define <2 x float> @test_pow_v2f32__y_n3 ; CHECK-SAME: (<2 x float> [[X:%.*]]) { -; CHECK-NEXT: [[POW:%.*]] = tail call <2 x float> @_Z3powDv2_fS_(<2 x float> [[X]], <2 x float> ) +; CHECK-NEXT: [[POW:%.*]] = tail call <2 x float> @_Z4pownDv2_fDv2_i(<2 x float> [[X]], <2 x i32> ) ; CHECK-NEXT: ret <2 x float> [[POW]] ; %pow = tail call <2 x float> @_Z3powDv2_fS_(<2 x float> %x, <2 x float> ) @@ -1664,7 +1663,7 @@ define float @test_pow_afn_f32__y_poison(float %x) { ; CHECK-LABEL: define float @test_pow_afn_f32__y_poison ; CHECK-SAME: (float [[X:%.*]]) { -; CHECK-NEXT: [[POW:%.*]] = tail call afn float @_Z3powff(float [[X]], float poison) +; CHECK-NEXT: [[POW:%.*]] = tail call afn float @_Z4pownfi(float [[X]], i32 poison) ; CHECK-NEXT: ret float [[POW]] ; %pow = tail call afn float @_Z3powff(float %x, float poison) @@ -1674,7 +1673,7 @@ define float @test_pow_afn_f32__y_3(float %x) { ; CHECK-LABEL: define float @test_pow_afn_f32__y_3 ; CHECK-SAME: (float [[X:%.*]]) { -; CHECK-NEXT: [[POW:%.*]] = tail call afn float @_Z3powff(float [[X]], float 3.000000e+00) +; CHECK-NEXT: [[POW:%.*]] = tail call afn float @_Z4pownfi(float [[X]], i32 3) ; CHECK-NEXT: ret float [[POW]] ; %pow = tail call afn float @_Z3powff(float %x, float 3.0) @@ -1695,7 +1694,7 @@ define float @test_pow_afn_f32__y_4(float %x) { ; CHECK-LABEL: define float @test_pow_afn_f32__y_4 ; CHECK-SAME: (float [[X:%.*]]) { -; CHECK-NEXT: [[POW:%.*]] = tail call afn float @_Z3powff(float [[X]], float 4.000000e+00) +; CHECK-NEXT: [[POW:%.*]] = tail call afn float @_Z4pownfi(float [[X]], i32 4) ; CHECK-NEXT: ret float [[POW]] ; %pow = tail call afn float @_Z3powff(float %x, float 4.0) @@ -1726,7 +1725,7 @@ define float @test_pow_afn_f32__y_5(float %x) { ; CHECK-LABEL: define float @test_pow_afn_f32__y_5 ; CHECK-SAME: (float [[X:%.*]]) { -; CHECK-NEXT: [[POW:%.*]] = tail call afn float @_Z3powff(float [[X]], float 5.000000e+00) +; CHECK-NEXT: [[POW:%.*]] = tail call afn float @_Z4pownfi(float [[X]], i32 5) ; CHECK-NEXT: ret float [[POW]] ; %pow = tail call afn float @_Z3powff(float %x, float 5.0) @@ -1748,7 +1747,7 @@ define float @test_pow_afn_f32__y_neg5(float %x) { ; CHECK-LABEL: define float @test_pow_afn_f32__y_neg5 ; CHECK-SAME: (float [[X:%.*]]) { -; CHECK-NEXT: [[POW:%.*]] = tail call afn float @_Z3powff(float [[X]], float -5.000000e+00) +; CHECK-NEXT: [[POW:%.*]] = tail call afn float @_Z4pownfi(float [[X]], i32 -5) ; CHECK-NEXT: ret float [[POW]] ; %pow = tail call afn float @_Z3powff(float %x, float -5.0) @@ -1872,7 +1871,7 @@ define double @test_pow_afn_f64__y_3(double %x) { ; CHECK-LABEL: define double @test_pow_afn_f64__y_3 ; CHECK-SAME: (double [[X:%.*]]) { -; CHECK-NEXT: [[POW:%.*]] = tail call afn double @_Z3powdd(double [[X]], double 3.000000e+00) +; CHECK-NEXT: [[POW:%.*]] = tail call afn double @_Z4powndi(double [[X]], i32 3) ; CHECK-NEXT: ret double [[POW]] ; %pow = tail call afn double @_Z3powdd(double %x, double 3.0) @@ -1893,7 +1892,7 @@ define double @test_pow_afn_f64__y_4(double %x) { ; CHECK-LABEL: define double @test_pow_afn_f64__y_4 ; CHECK-SAME: (double [[X:%.*]]) { -; CHECK-NEXT: [[POW:%.*]] = tail call afn double @_Z3powdd(double [[X]], double 4.000000e+00) +; CHECK-NEXT: [[POW:%.*]] = tail call afn double @_Z4powndi(double [[X]], i32 4) ; CHECK-NEXT: ret double [[POW]] ; %pow = tail call afn double @_Z3powdd(double %x, double 4.0) @@ -1924,7 +1923,7 @@ define double @test_pow_afn_f64__y_5(double %x) { ; CHECK-LABEL: define double @test_pow_afn_f64__y_5 ; CHECK-SAME: (double [[X:%.*]]) { -; CHECK-NEXT: [[POW:%.*]] = tail call afn double @_Z3powdd(double [[X]], double 5.000000e+00) +; CHECK-NEXT: [[POW:%.*]] = tail call afn double @_Z4powndi(double [[X]], i32 5) ; CHECK-NEXT: ret double [[POW]] ; %pow = tail call afn double @_Z3powdd(double %x, double 5.0) @@ -1946,7 +1945,7 @@ define double @test_pow_afn_f64__y_neg5(double %x) { ; CHECK-LABEL: define double @test_pow_afn_f64__y_neg5 ; CHECK-SAME: (double [[X:%.*]]) { -; CHECK-NEXT: [[POW:%.*]] = tail call afn double @_Z3powdd(double [[X]], double -5.000000e+00) +; CHECK-NEXT: [[POW:%.*]] = tail call afn double @_Z4powndi(double [[X]], i32 -5) ; CHECK-NEXT: ret double [[POW]] ; %pow = tail call afn double @_Z3powdd(double %x, double -5.0) @@ -2026,7 +2025,7 @@ define half @test_pow_afn_f16__y_3(half %x) { ; CHECK-LABEL: define half @test_pow_afn_f16__y_3 ; CHECK-SAME: (half [[X:%.*]]) { -; CHECK-NEXT: [[POW:%.*]] = tail call afn half @_Z3powDhDh(half [[X]], half 0xH4200) +; CHECK-NEXT: [[POW:%.*]] = tail call afn half @_Z4pownDhi(half [[X]], i32 3) ; CHECK-NEXT: ret half [[POW]] ; %pow = tail call afn half @_Z3powDhDh(half %x, half 3.0) @@ -2047,7 +2046,7 @@ define half @test_pow_afn_f16__y_4(half %x) { ; CHECK-LABEL: define half @test_pow_afn_f16__y_4 ; CHECK-SAME: (half [[X:%.*]]) { -; CHECK-NEXT: [[POW:%.*]] = tail call afn half @_Z3powDhDh(half [[X]], half 0xH4400) +; CHECK-NEXT: [[POW:%.*]] = tail call afn half @_Z4pownDhi(half [[X]], i32 4) ; CHECK-NEXT: ret half [[POW]] ; %pow = tail call afn half @_Z3powDhDh(half %x, half 4.0) @@ -2078,7 +2077,7 @@ define half @test_pow_afn_f16__y_5(half %x) { ; CHECK-LABEL: define half @test_pow_afn_f16__y_5 ; CHECK-SAME: (half [[X:%.*]]) { -; CHECK-NEXT: [[POW:%.*]] = tail call afn half @_Z3powDhDh(half [[X]], half 0xH4500) +; CHECK-NEXT: [[POW:%.*]] = tail call afn half @_Z4pownDhi(half [[X]], i32 5) ; CHECK-NEXT: ret half [[POW]] ; %pow = tail call afn half @_Z3powDhDh(half %x, half 5.0) @@ -2100,7 +2099,7 @@ define half @test_pow_afn_f16__y_neg5(half %x) { ; CHECK-LABEL: define half @test_pow_afn_f16__y_neg5 ; CHECK-SAME: (half [[X:%.*]]) { -; CHECK-NEXT: [[POW:%.*]] = tail call afn half @_Z3powDhDh(half [[X]], half 0xHC500) +; CHECK-NEXT: [[POW:%.*]] = tail call afn half @_Z4pownDhi(half [[X]], i32 -5) ; CHECK-NEXT: ret half [[POW]] ; %pow = tail call afn half @_Z3powDhDh(half %x, half -5.0) @@ -2181,7 +2180,8 @@ ; CHECK-LABEL: define float @test_pow_f32_known_integral_sitofp ; CHECK-SAME: (float [[X:%.*]], i32 [[Y:%.*]]) { ; CHECK-NEXT: [[Y_CAST:%.*]] = sitofp i32 [[Y]] to float -; CHECK-NEXT: [[POW:%.*]] = tail call float @_Z3powff(float [[X]], float [[Y_CAST]]) +; CHECK-NEXT: [[TMP1:%.*]] = fptosi float [[Y_CAST]] to i32 +; CHECK-NEXT: [[POW:%.*]] = tail call float @_Z4pownfi(float [[X]], i32 [[TMP1]]) ; CHECK-NEXT: ret float [[POW]] ; %y.cast = sitofp i32 %y to float @@ -2193,7 +2193,8 @@ ; CHECK-LABEL: define float @test_pow_afn_f32_known_integral_sitofp ; CHECK-SAME: (float [[X:%.*]], i32 [[Y:%.*]]) { ; CHECK-NEXT: [[Y_CAST:%.*]] = sitofp i32 [[Y]] to float -; CHECK-NEXT: [[POW:%.*]] = tail call afn float @_Z3powff(float [[X]], float [[Y_CAST]]) +; CHECK-NEXT: [[TMP1:%.*]] = fptosi float [[Y_CAST]] to i32 +; CHECK-NEXT: [[POW:%.*]] = tail call afn float @_Z4pownfi(float [[X]], i32 [[TMP1]]) ; CHECK-NEXT: ret float [[POW]] ; %y.cast = sitofp i32 %y to float @@ -2205,18 +2206,19 @@ ; CHECK-LABEL: define float @test_pow_afn_nnan_ninf_f32_known_integral_sitofp ; CHECK-SAME: (float [[X:%.*]], i32 [[Y:%.*]]) { ; CHECK-NEXT: [[Y_CAST:%.*]] = sitofp i32 [[Y]] to float +; CHECK-NEXT: [[TMP1:%.*]] = fptosi float [[Y_CAST]] to i32 ; CHECK-NEXT: [[__FABS:%.*]] = call nnan ninf afn float @llvm.fabs.f32(float [[X]]) ; CHECK-NEXT: [[__LOG2:%.*]] = call nnan ninf afn float @llvm.log2.f32(float [[__FABS]]) -; CHECK-NEXT: [[__YLOGX:%.*]] = fmul nnan ninf afn float [[__LOG2]], [[Y_CAST]] +; CHECK-NEXT: [[POWNI2F:%.*]] = sitofp i32 [[TMP1]] to float +; CHECK-NEXT: [[__YLOGX:%.*]] = fmul nnan ninf afn float [[__LOG2]], [[POWNI2F]] ; CHECK-NEXT: [[__EXP2:%.*]] = call nnan ninf afn float @llvm.exp2.f32(float [[__YLOGX]]) -; CHECK-NEXT: [[__YTOU:%.*]] = fptosi float [[Y_CAST]] to i32 -; CHECK-NEXT: [[__YEVEN:%.*]] = shl i32 [[__YTOU]], 31 -; CHECK-NEXT: [[TMP1:%.*]] = bitcast float [[X]] to i32 -; CHECK-NEXT: [[__POW_SIGN:%.*]] = and i32 [[__YEVEN]], [[TMP1]] -; CHECK-NEXT: [[TMP2:%.*]] = bitcast float [[__EXP2]] to i32 -; CHECK-NEXT: [[TMP3:%.*]] = or i32 [[__POW_SIGN]], [[TMP2]] -; CHECK-NEXT: [[TMP4:%.*]] = bitcast i32 [[TMP3]] to float -; CHECK-NEXT: ret float [[TMP4]] +; CHECK-NEXT: [[__YEVEN:%.*]] = shl i32 [[TMP1]], 31 +; CHECK-NEXT: [[TMP2:%.*]] = bitcast float [[X]] to i32 +; CHECK-NEXT: [[__POW_SIGN:%.*]] = and i32 [[__YEVEN]], [[TMP2]] +; CHECK-NEXT: [[TMP3:%.*]] = bitcast float [[__EXP2]] to i32 +; CHECK-NEXT: [[TMP4:%.*]] = or i32 [[__POW_SIGN]], [[TMP3]] +; CHECK-NEXT: [[TMP5:%.*]] = bitcast i32 [[TMP4]] to float +; CHECK-NEXT: ret float [[TMP5]] ; %y.cast = sitofp i32 %y to float %pow = tail call afn nnan ninf float @_Z3powff(float %x, float %y.cast) @@ -2227,7 +2229,8 @@ ; CHECK-LABEL: define float @test_pow_afn_nnan_f32_known_integral_sitofp ; CHECK-SAME: (float [[X:%.*]], i32 [[Y:%.*]]) { ; CHECK-NEXT: [[Y_CAST:%.*]] = sitofp i32 [[Y]] to float -; CHECK-NEXT: [[POW:%.*]] = tail call nnan afn float @_Z3powff(float [[X]], float [[Y_CAST]]) +; CHECK-NEXT: [[TMP1:%.*]] = fptosi float [[Y_CAST]] to i32 +; CHECK-NEXT: [[POW:%.*]] = tail call nnan afn float @_Z4pownfi(float [[X]], i32 [[TMP1]]) ; CHECK-NEXT: ret float [[POW]] ; %y.cast = sitofp i32 %y to float @@ -2239,7 +2242,8 @@ ; CHECK-LABEL: define float @test_pow_afn_ninf_f32_known_integral_sitofp ; CHECK-SAME: (float [[X:%.*]], i32 [[Y:%.*]]) { ; CHECK-NEXT: [[Y_CAST:%.*]] = sitofp i32 [[Y]] to float -; CHECK-NEXT: [[POW:%.*]] = tail call ninf afn float @_Z3powff(float [[X]], float [[Y_CAST]]) +; CHECK-NEXT: [[TMP1:%.*]] = fptosi float [[Y_CAST]] to i32 +; CHECK-NEXT: [[POW:%.*]] = tail call ninf afn float @_Z4pownfi(float [[X]], i32 [[TMP1]]) ; CHECK-NEXT: ret float [[POW]] ; %y.cast = sitofp i32 %y to float @@ -2251,7 +2255,8 @@ ; CHECK-LABEL: define float @test_pow_afn_f32_known_integral_sitofp_finite_argument ; CHECK-SAME: (float [[X:%.*]], i32 [[Y:%.*]]) { ; CHECK-NEXT: [[Y_CAST:%.*]] = sitofp i32 [[Y]] to float -; CHECK-NEXT: [[POW:%.*]] = tail call float @_Z3powff(float [[X]], float nofpclass(nan inf) [[Y_CAST]]) +; CHECK-NEXT: [[TMP1:%.*]] = fptosi float [[Y_CAST]] to i32 +; CHECK-NEXT: [[POW:%.*]] = tail call float @_Z4pownfi(float [[X]], i32 [[TMP1]]) ; CHECK-NEXT: ret float [[POW]] ; %y.cast = sitofp i32 %y to float @@ -2263,7 +2268,8 @@ ; CHECK-LABEL: define float @test_pow_f32_known_integral_uitofp ; CHECK-SAME: (float [[X:%.*]], i32 [[Y:%.*]]) { ; CHECK-NEXT: [[Y_CAST:%.*]] = uitofp i32 [[Y]] to float -; CHECK-NEXT: [[POW:%.*]] = tail call float @_Z3powff(float [[X]], float [[Y_CAST]]) +; CHECK-NEXT: [[TMP1:%.*]] = fptosi float [[Y_CAST]] to i32 +; CHECK-NEXT: [[POW:%.*]] = tail call float @_Z4pownfi(float [[X]], i32 [[TMP1]]) ; CHECK-NEXT: ret float [[POW]] ; %y.cast = uitofp i32 %y to float @@ -2275,7 +2281,8 @@ ; CHECK-LABEL: define float @test_pow_afn_f32_known_integral_uitofp ; CHECK-SAME: (float [[X:%.*]], i32 [[Y:%.*]]) { ; CHECK-NEXT: [[Y_CAST:%.*]] = uitofp i32 [[Y]] to float -; CHECK-NEXT: [[POW:%.*]] = tail call afn float @_Z3powff(float [[X]], float [[Y_CAST]]) +; CHECK-NEXT: [[TMP1:%.*]] = fptosi float [[Y_CAST]] to i32 +; CHECK-NEXT: [[POW:%.*]] = tail call afn float @_Z4pownfi(float [[X]], i32 [[TMP1]]) ; CHECK-NEXT: ret float [[POW]] ; %y.cast = uitofp i32 %y to float @@ -2287,18 +2294,19 @@ ; CHECK-LABEL: define float @test_pow_afn_nnan_ninf_f32_known_integral_uitofp ; CHECK-SAME: (float [[X:%.*]], i32 [[Y:%.*]]) { ; CHECK-NEXT: [[Y_CAST:%.*]] = uitofp i32 [[Y]] to float +; CHECK-NEXT: [[TMP1:%.*]] = fptosi float [[Y_CAST]] to i32 ; CHECK-NEXT: [[__FABS:%.*]] = call nnan ninf afn float @llvm.fabs.f32(float [[X]]) ; CHECK-NEXT: [[__LOG2:%.*]] = call nnan ninf afn float @llvm.log2.f32(float [[__FABS]]) -; CHECK-NEXT: [[__YLOGX:%.*]] = fmul nnan ninf afn float [[__LOG2]], [[Y_CAST]] +; CHECK-NEXT: [[POWNI2F:%.*]] = sitofp i32 [[TMP1]] to float +; CHECK-NEXT: [[__YLOGX:%.*]] = fmul nnan ninf afn float [[__LOG2]], [[POWNI2F]] ; CHECK-NEXT: [[__EXP2:%.*]] = call nnan ninf afn float @llvm.exp2.f32(float [[__YLOGX]]) -; CHECK-NEXT: [[__YTOU:%.*]] = fptosi float [[Y_CAST]] to i32 -; CHECK-NEXT: [[__YEVEN:%.*]] = shl i32 [[__YTOU]], 31 -; CHECK-NEXT: [[TMP1:%.*]] = bitcast float [[X]] to i32 -; CHECK-NEXT: [[__POW_SIGN:%.*]] = and i32 [[__YEVEN]], [[TMP1]] -; CHECK-NEXT: [[TMP2:%.*]] = bitcast float [[__EXP2]] to i32 -; CHECK-NEXT: [[TMP3:%.*]] = or i32 [[__POW_SIGN]], [[TMP2]] -; CHECK-NEXT: [[TMP4:%.*]] = bitcast i32 [[TMP3]] to float -; CHECK-NEXT: ret float [[TMP4]] +; CHECK-NEXT: [[__YEVEN:%.*]] = shl i32 [[TMP1]], 31 +; CHECK-NEXT: [[TMP2:%.*]] = bitcast float [[X]] to i32 +; CHECK-NEXT: [[__POW_SIGN:%.*]] = and i32 [[__YEVEN]], [[TMP2]] +; CHECK-NEXT: [[TMP3:%.*]] = bitcast float [[__EXP2]] to i32 +; CHECK-NEXT: [[TMP4:%.*]] = or i32 [[__POW_SIGN]], [[TMP3]] +; CHECK-NEXT: [[TMP5:%.*]] = bitcast i32 [[TMP4]] to float +; CHECK-NEXT: ret float [[TMP5]] ; %y.cast = uitofp i32 %y to float %pow = tail call afn nnan ninf float @_Z3powff(float %x, float %y.cast) @@ -2335,18 +2343,19 @@ ; CHECK-LABEL: define float @test_pow_afn_nnan_ninf_f32_known_integral_uitofp_i256 ; CHECK-SAME: (float [[X:%.*]], i256 [[Y:%.*]]) { ; CHECK-NEXT: [[Y_CAST:%.*]] = uitofp i256 [[Y]] to float +; CHECK-NEXT: [[TMP1:%.*]] = fptosi float [[Y_CAST]] to i32 ; CHECK-NEXT: [[__FABS:%.*]] = call nnan ninf afn float @llvm.fabs.f32(float [[X]]) ; CHECK-NEXT: [[__LOG2:%.*]] = call nnan ninf afn float @llvm.log2.f32(float [[__FABS]]) -; CHECK-NEXT: [[__YLOGX:%.*]] = fmul nnan ninf afn float [[__LOG2]], [[Y_CAST]] +; CHECK-NEXT: [[POWNI2F:%.*]] = sitofp i32 [[TMP1]] to float +; CHECK-NEXT: [[__YLOGX:%.*]] = fmul nnan ninf afn float [[__LOG2]], [[POWNI2F]] ; CHECK-NEXT: [[__EXP2:%.*]] = call nnan ninf afn float @llvm.exp2.f32(float [[__YLOGX]]) -; CHECK-NEXT: [[__YTOU:%.*]] = fptosi float [[Y_CAST]] to i32 -; CHECK-NEXT: [[__YEVEN:%.*]] = shl i32 [[__YTOU]], 31 -; CHECK-NEXT: [[TMP1:%.*]] = bitcast float [[X]] to i32 -; CHECK-NEXT: [[__POW_SIGN:%.*]] = and i32 [[__YEVEN]], [[TMP1]] -; CHECK-NEXT: [[TMP2:%.*]] = bitcast float [[__EXP2]] to i32 -; CHECK-NEXT: [[TMP3:%.*]] = or i32 [[__POW_SIGN]], [[TMP2]] -; CHECK-NEXT: [[TMP4:%.*]] = bitcast i32 [[TMP3]] to float -; CHECK-NEXT: ret float [[TMP4]] +; CHECK-NEXT: [[__YEVEN:%.*]] = shl i32 [[TMP1]], 31 +; CHECK-NEXT: [[TMP2:%.*]] = bitcast float [[X]] to i32 +; CHECK-NEXT: [[__POW_SIGN:%.*]] = and i32 [[__YEVEN]], [[TMP2]] +; CHECK-NEXT: [[TMP3:%.*]] = bitcast float [[__EXP2]] to i32 +; CHECK-NEXT: [[TMP4:%.*]] = or i32 [[__POW_SIGN]], [[TMP3]] +; CHECK-NEXT: [[TMP5:%.*]] = bitcast i32 [[TMP4]] to float +; CHECK-NEXT: ret float [[TMP5]] ; %y.cast = uitofp i256 %y to float %pow = tail call afn nnan ninf float @_Z3powff(float %x, float %y.cast) @@ -2357,18 +2366,19 @@ ; CHECK-LABEL: define float @test_pow_afn_nnan_ninf_f32_known_integral_sitofp_i256 ; CHECK-SAME: (float [[X:%.*]], i256 [[Y:%.*]]) { ; CHECK-NEXT: [[Y_CAST:%.*]] = sitofp i256 [[Y]] to float +; CHECK-NEXT: [[TMP1:%.*]] = fptosi float [[Y_CAST]] to i32 ; CHECK-NEXT: [[__FABS:%.*]] = call nnan ninf afn float @llvm.fabs.f32(float [[X]]) ; CHECK-NEXT: [[__LOG2:%.*]] = call nnan ninf afn float @llvm.log2.f32(float [[__FABS]]) -; CHECK-NEXT: [[__YLOGX:%.*]] = fmul nnan ninf afn float [[__LOG2]], [[Y_CAST]] +; CHECK-NEXT: [[POWNI2F:%.*]] = sitofp i32 [[TMP1]] to float +; CHECK-NEXT: [[__YLOGX:%.*]] = fmul nnan ninf afn float [[__LOG2]], [[POWNI2F]] ; CHECK-NEXT: [[__EXP2:%.*]] = call nnan ninf afn float @llvm.exp2.f32(float [[__YLOGX]]) -; CHECK-NEXT: [[__YTOU:%.*]] = fptosi float [[Y_CAST]] to i32 -; CHECK-NEXT: [[__YEVEN:%.*]] = shl i32 [[__YTOU]], 31 -; CHECK-NEXT: [[TMP1:%.*]] = bitcast float [[X]] to i32 -; CHECK-NEXT: [[__POW_SIGN:%.*]] = and i32 [[__YEVEN]], [[TMP1]] -; CHECK-NEXT: [[TMP2:%.*]] = bitcast float [[__EXP2]] to i32 -; CHECK-NEXT: [[TMP3:%.*]] = or i32 [[__POW_SIGN]], [[TMP2]] -; CHECK-NEXT: [[TMP4:%.*]] = bitcast i32 [[TMP3]] to float -; CHECK-NEXT: ret float [[TMP4]] +; CHECK-NEXT: [[__YEVEN:%.*]] = shl i32 [[TMP1]], 31 +; CHECK-NEXT: [[TMP2:%.*]] = bitcast float [[X]] to i32 +; CHECK-NEXT: [[__POW_SIGN:%.*]] = and i32 [[__YEVEN]], [[TMP2]] +; CHECK-NEXT: [[TMP3:%.*]] = bitcast float [[__EXP2]] to i32 +; CHECK-NEXT: [[TMP4:%.*]] = or i32 [[__POW_SIGN]], [[TMP3]] +; CHECK-NEXT: [[TMP5:%.*]] = bitcast i32 [[TMP4]] to float +; CHECK-NEXT: ret float [[TMP5]] ; %y.cast = sitofp i256 %y to float %pow = tail call afn nnan ninf float @_Z3powff(float %x, float %y.cast) @@ -2379,18 +2389,19 @@ ; CHECK-LABEL: define <2 x float> @test_pow_afn_nnan_ninf_v2f32_known_integral_sitofp ; CHECK-SAME: (<2 x float> [[X:%.*]], <2 x i32> [[Y:%.*]]) { ; CHECK-NEXT: [[Y_CAST:%.*]] = sitofp <2 x i32> [[Y]] to <2 x float> +; CHECK-NEXT: [[TMP1:%.*]] = fptosi <2 x float> [[Y_CAST]] to <2 x i32> ; CHECK-NEXT: [[__FABS:%.*]] = call nnan ninf afn <2 x float> @llvm.fabs.v2f32(<2 x float> [[X]]) ; CHECK-NEXT: [[__LOG2:%.*]] = call nnan ninf afn <2 x float> @llvm.log2.v2f32(<2 x float> [[__FABS]]) -; CHECK-NEXT: [[__YLOGX:%.*]] = fmul nnan ninf afn <2 x float> [[__LOG2]], [[Y_CAST]] +; CHECK-NEXT: [[POWNI2F:%.*]] = sitofp <2 x i32> [[TMP1]] to <2 x float> +; CHECK-NEXT: [[__YLOGX:%.*]] = fmul nnan ninf afn <2 x float> [[__LOG2]], [[POWNI2F]] ; CHECK-NEXT: [[__EXP2:%.*]] = call nnan ninf afn <2 x float> @llvm.exp2.v2f32(<2 x float> [[__YLOGX]]) -; CHECK-NEXT: [[__YTOU:%.*]] = fptosi <2 x float> [[Y_CAST]] to <2 x i32> -; CHECK-NEXT: [[__YEVEN:%.*]] = shl <2 x i32> [[__YTOU]], -; CHECK-NEXT: [[TMP1:%.*]] = bitcast <2 x float> [[X]] to <2 x i32> -; CHECK-NEXT: [[__POW_SIGN:%.*]] = and <2 x i32> [[__YEVEN]], [[TMP1]] -; CHECK-NEXT: [[TMP2:%.*]] = bitcast <2 x float> [[__EXP2]] to <2 x i32> -; CHECK-NEXT: [[TMP3:%.*]] = or <2 x i32> [[__POW_SIGN]], [[TMP2]] -; CHECK-NEXT: [[TMP4:%.*]] = bitcast <2 x i32> [[TMP3]] to <2 x float> -; CHECK-NEXT: ret <2 x float> [[TMP4]] +; CHECK-NEXT: [[__YEVEN:%.*]] = shl <2 x i32> [[TMP1]], +; CHECK-NEXT: [[TMP2:%.*]] = bitcast <2 x float> [[X]] to <2 x i32> +; CHECK-NEXT: [[__POW_SIGN:%.*]] = and <2 x i32> [[__YEVEN]], [[TMP2]] +; CHECK-NEXT: [[TMP3:%.*]] = bitcast <2 x float> [[__EXP2]] to <2 x i32> +; CHECK-NEXT: [[TMP4:%.*]] = or <2 x i32> [[__POW_SIGN]], [[TMP3]] +; CHECK-NEXT: [[TMP5:%.*]] = bitcast <2 x i32> [[TMP4]] to <2 x float> +; CHECK-NEXT: ret <2 x float> [[TMP5]] ; %y.cast = sitofp <2 x i32> %y to <2 x float> %pow = tail call afn nnan ninf <2 x float> @_Z3powDv2_fS_(<2 x float> %x, <2 x float> %y.cast) @@ -2401,7 +2412,8 @@ ; CHECK-LABEL: define <2 x float> @test_pow_v2f32_known_integral_uitofp ; CHECK-SAME: (<2 x float> [[X:%.*]], <2 x i32> [[Y:%.*]]) { ; CHECK-NEXT: [[Y_CAST:%.*]] = uitofp <2 x i32> [[Y]] to <2 x float> -; CHECK-NEXT: [[POW:%.*]] = tail call <2 x float> @_Z3powDv2_fS_(<2 x float> [[X]], <2 x float> [[Y_CAST]]) +; CHECK-NEXT: [[TMP1:%.*]] = fptosi <2 x float> [[Y_CAST]] to <2 x i32> +; CHECK-NEXT: [[POW:%.*]] = tail call <2 x float> @_Z4pownDv2_fDv2_i(<2 x float> [[X]], <2 x i32> [[TMP1]]) ; CHECK-NEXT: ret <2 x float> [[POW]] ; %y.cast = uitofp <2 x i32> %y to <2 x float> @@ -2413,7 +2425,8 @@ ; CHECK-LABEL: define <2 x float> @test_pow_afn_v2f32_known_integral_uitofp ; CHECK-SAME: (<2 x float> [[X:%.*]], <2 x i32> [[Y:%.*]]) { ; CHECK-NEXT: [[Y_CAST:%.*]] = uitofp <2 x i32> [[Y]] to <2 x float> -; CHECK-NEXT: [[POW:%.*]] = tail call afn <2 x float> @_Z3powDv2_fS_(<2 x float> [[X]], <2 x float> [[Y_CAST]]) +; CHECK-NEXT: [[TMP1:%.*]] = fptosi <2 x float> [[Y_CAST]] to <2 x i32> +; CHECK-NEXT: [[POW:%.*]] = tail call afn <2 x float> @_Z4pownDv2_fDv2_i(<2 x float> [[X]], <2 x i32> [[TMP1]]) ; CHECK-NEXT: ret <2 x float> [[POW]] ; %y.cast = uitofp <2 x i32> %y to <2 x float> @@ -2425,18 +2438,19 @@ ; CHECK-LABEL: define <2 x float> @test_pow_afn_nnan_ninf_v2f32_known_integral_uitofp ; CHECK-SAME: (<2 x float> [[X:%.*]], <2 x i32> [[Y:%.*]]) { ; CHECK-NEXT: [[Y_CAST:%.*]] = uitofp <2 x i32> [[Y]] to <2 x float> +; CHECK-NEXT: [[TMP1:%.*]] = fptosi <2 x float> [[Y_CAST]] to <2 x i32> ; CHECK-NEXT: [[__FABS:%.*]] = call nnan ninf afn <2 x float> @llvm.fabs.v2f32(<2 x float> [[X]]) ; CHECK-NEXT: [[__LOG2:%.*]] = call nnan ninf afn <2 x float> @llvm.log2.v2f32(<2 x float> [[__FABS]]) -; CHECK-NEXT: [[__YLOGX:%.*]] = fmul nnan ninf afn <2 x float> [[__LOG2]], [[Y_CAST]] +; CHECK-NEXT: [[POWNI2F:%.*]] = sitofp <2 x i32> [[TMP1]] to <2 x float> +; CHECK-NEXT: [[__YLOGX:%.*]] = fmul nnan ninf afn <2 x float> [[__LOG2]], [[POWNI2F]] ; CHECK-NEXT: [[__EXP2:%.*]] = call nnan ninf afn <2 x float> @llvm.exp2.v2f32(<2 x float> [[__YLOGX]]) -; CHECK-NEXT: [[__YTOU:%.*]] = fptosi <2 x float> [[Y_CAST]] to <2 x i32> -; CHECK-NEXT: [[__YEVEN:%.*]] = shl <2 x i32> [[__YTOU]], -; CHECK-NEXT: [[TMP1:%.*]] = bitcast <2 x float> [[X]] to <2 x i32> -; CHECK-NEXT: [[__POW_SIGN:%.*]] = and <2 x i32> [[__YEVEN]], [[TMP1]] -; CHECK-NEXT: [[TMP2:%.*]] = bitcast <2 x float> [[__EXP2]] to <2 x i32> -; CHECK-NEXT: [[TMP3:%.*]] = or <2 x i32> [[__POW_SIGN]], [[TMP2]] -; CHECK-NEXT: [[TMP4:%.*]] = bitcast <2 x i32> [[TMP3]] to <2 x float> -; CHECK-NEXT: ret <2 x float> [[TMP4]] +; CHECK-NEXT: [[__YEVEN:%.*]] = shl <2 x i32> [[TMP1]], +; CHECK-NEXT: [[TMP2:%.*]] = bitcast <2 x float> [[X]] to <2 x i32> +; CHECK-NEXT: [[__POW_SIGN:%.*]] = and <2 x i32> [[__YEVEN]], [[TMP2]] +; CHECK-NEXT: [[TMP3:%.*]] = bitcast <2 x float> [[__EXP2]] to <2 x i32> +; CHECK-NEXT: [[TMP4:%.*]] = or <2 x i32> [[__POW_SIGN]], [[TMP3]] +; CHECK-NEXT: [[TMP5:%.*]] = bitcast <2 x i32> [[TMP4]] to <2 x float> +; CHECK-NEXT: ret <2 x float> [[TMP5]] ; %y.cast = uitofp <2 x i32> %y to <2 x float> %pow = tail call afn nnan ninf <2 x float> @_Z3powDv2_fS_(<2 x float> %x, <2 x float> %y.cast)