From bf8e64754725ee54786453315cd71a77c522f79d Mon Sep 17 00:00:00 2001 From: Matt Arsenault Date: Sat, 2 Dec 2023 13:17:45 +0900 Subject: [PATCH] AMDGPU: Relax vector restriction for rootn libcall folds We could try harder for nonsplat vectors but probably not worth the effort. --- llvm/lib/Target/AMDGPU/AMDGPULibCalls.cpp | 10 +- .../AMDGPU/amdgpu-simplify-libcall-rootn.ll | 111 ++++++++---------- 2 files changed, 54 insertions(+), 67 deletions(-) diff --git a/llvm/lib/Target/AMDGPU/AMDGPULibCalls.cpp b/llvm/lib/Target/AMDGPU/AMDGPULibCalls.cpp index faf04c3c7e709ff..0a5fbf5034c0170 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPULibCalls.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPULibCalls.cpp @@ -1156,17 +1156,13 @@ bool AMDGPULibCalls::fold_pow(FPMathOperator *FPOp, IRBuilder<> &B, bool AMDGPULibCalls::fold_rootn(FPMathOperator *FPOp, IRBuilder<> &B, const FuncInfo &FInfo) { - // skip vector function - if (getVecSize(FInfo) != 1) - return false; - Value *opr0 = FPOp->getOperand(0); Value *opr1 = FPOp->getOperand(1); - ConstantInt *CINT = dyn_cast(opr1); - if (!CINT) { + const APInt *CINT = nullptr; + if (!match(opr1, m_APIntAllowPoison(CINT))) return false; - } + int ci_opr1 = (int)CINT->getSExtValue(); if (ci_opr1 == 1) { // rootn(x, 1) = x LLVM_DEBUG(errs() << "AMDIC: " << *FPOp << " ---> " << *opr0 << "\n"); diff --git a/llvm/test/CodeGen/AMDGPU/amdgpu-simplify-libcall-rootn.ll b/llvm/test/CodeGen/AMDGPU/amdgpu-simplify-libcall-rootn.ll index 2e64a3456c2427b..f79983e2491a4f0 100644 --- a/llvm/test/CodeGen/AMDGPU/amdgpu-simplify-libcall-rootn.ll +++ b/llvm/test/CodeGen/AMDGPU/amdgpu-simplify-libcall-rootn.ll @@ -342,8 +342,7 @@ define <2 x half> @test_rootn_v2f16_0(<2 x half> %x) { define <2 x half> @test_rootn_v2f16_1(<2 x half> %x) { ; CHECK-LABEL: define <2 x half> @test_rootn_v2f16_1( ; CHECK-SAME: <2 x half> [[X:%.*]]) { -; CHECK-NEXT: [[CALL:%.*]] = tail call <2 x half> @_Z5rootnDv2_DhDv2_i(<2 x half> [[X]], <2 x i32> ) -; CHECK-NEXT: ret <2 x half> [[CALL]] +; CHECK-NEXT: ret <2 x half> [[X]] ; %call = tail call <2 x half> @_Z5rootnDv2_DhDv2_i(<2 x half> %x, <2 x i32> ) ret <2 x half> %call @@ -352,8 +351,8 @@ define <2 x half> @test_rootn_v2f16_1(<2 x half> %x) { define <2 x half> @test_rootn_v2f16_2(<2 x half> %x) { ; CHECK-LABEL: define <2 x half> @test_rootn_v2f16_2( ; CHECK-SAME: <2 x half> [[X:%.*]]) { -; CHECK-NEXT: [[CALL:%.*]] = tail call <2 x half> @_Z5rootnDv2_DhDv2_i(<2 x half> [[X]], <2 x i32> ) -; CHECK-NEXT: ret <2 x half> [[CALL]] +; CHECK-NEXT: [[__ROOTN2SQRT:%.*]] = call <2 x half> @_Z4sqrtDv2_Dh(<2 x half> [[X]]) +; CHECK-NEXT: ret <2 x half> [[__ROOTN2SQRT]] ; %call = tail call <2 x half> @_Z5rootnDv2_DhDv2_i(<2 x half> %x, <2 x i32> ) ret <2 x half> %call @@ -362,8 +361,8 @@ define <2 x half> @test_rootn_v2f16_2(<2 x half> %x) { define <2 x half> @test_rootn_v2f16_neg1(<2 x half> %x) { ; CHECK-LABEL: define <2 x half> @test_rootn_v2f16_neg1( ; CHECK-SAME: <2 x half> [[X:%.*]]) { -; CHECK-NEXT: [[CALL:%.*]] = tail call <2 x half> @_Z5rootnDv2_DhDv2_i(<2 x half> [[X]], <2 x i32> ) -; CHECK-NEXT: ret <2 x half> [[CALL]] +; CHECK-NEXT: [[__ROOTN2DIV:%.*]] = fdiv <2 x half> , [[X]] +; CHECK-NEXT: ret <2 x half> [[__ROOTN2DIV]] ; %call = tail call <2 x half> @_Z5rootnDv2_DhDv2_i(<2 x half> %x, <2 x i32> ) ret <2 x half> %call @@ -372,8 +371,8 @@ define <2 x half> @test_rootn_v2f16_neg1(<2 x half> %x) { define <2 x half> @test_rootn_v2f16_neg2(<2 x half> %x) { ; CHECK-LABEL: define <2 x half> @test_rootn_v2f16_neg2( ; CHECK-SAME: <2 x half> [[X:%.*]]) { -; CHECK-NEXT: [[CALL:%.*]] = tail call <2 x half> @_Z5rootnDv2_DhDv2_i(<2 x half> [[X]], <2 x i32> ) -; CHECK-NEXT: ret <2 x half> [[CALL]] +; CHECK-NEXT: [[__ROOTN2RSQRT:%.*]] = call <2 x half> @_Z5rsqrtDv2_Dh(<2 x half> [[X]]) +; CHECK-NEXT: ret <2 x half> [[__ROOTN2RSQRT]] ; %call = tail call <2 x half> @_Z5rootnDv2_DhDv2_i(<2 x half> %x, <2 x i32> ) ret <2 x half> %call @@ -523,8 +522,7 @@ define <2 x float> @test_rootn_v2f32__y_1(<2 x float> %x) { ; CHECK-LABEL: define <2 x float> @test_rootn_v2f32__y_1( ; CHECK-SAME: <2 x float> [[X:%.*]]) { ; CHECK-NEXT: entry: -; CHECK-NEXT: [[CALL:%.*]] = tail call <2 x float> @_Z5rootnDv2_fDv2_i(<2 x float> [[X]], <2 x i32> ) -; CHECK-NEXT: ret <2 x float> [[CALL]] +; CHECK-NEXT: ret <2 x float> [[X]] ; entry: %call = tail call <2 x float> @_Z5rootnDv2_fDv2_i(<2 x float> %x, <2 x i32> ) @@ -535,8 +533,7 @@ define <2 x float> @test_rootn_v2f32__y_1__strictfp(<2 x float> %x) #1 { ; CHECK-LABEL: define <2 x float> @test_rootn_v2f32__y_1__strictfp( ; CHECK-SAME: <2 x float> [[X:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: entry: -; CHECK-NEXT: [[CALL:%.*]] = tail call <2 x float> @_Z5rootnDv2_fDv2_i(<2 x float> [[X]], <2 x i32> ) #[[ATTR0]] -; CHECK-NEXT: ret <2 x float> [[CALL]] +; CHECK-NEXT: ret <2 x float> [[X]] ; entry: %call = tail call <2 x float> @_Z5rootnDv2_fDv2_i(<2 x float> %x, <2 x i32> ) #1 @@ -547,8 +544,7 @@ define <2 x float> @test_rootn_v2f32__y_1_undef(<2 x float> %x) { ; CHECK-LABEL: define <2 x float> @test_rootn_v2f32__y_1_undef( ; CHECK-SAME: <2 x float> [[X:%.*]]) { ; CHECK-NEXT: entry: -; CHECK-NEXT: [[CALL:%.*]] = tail call <2 x float> @_Z5rootnDv2_fDv2_i(<2 x float> [[X]], <2 x i32> ) -; CHECK-NEXT: ret <2 x float> [[CALL]] +; CHECK-NEXT: ret <2 x float> [[X]] ; entry: %call = tail call <2 x float> @_Z5rootnDv2_fDv2_i(<2 x float> %x, <2 x i32> ) @@ -559,8 +555,7 @@ define <3 x float> @test_rootn_v3f32__y_1(<3 x float> %x) { ; CHECK-LABEL: define <3 x float> @test_rootn_v3f32__y_1( ; CHECK-SAME: <3 x float> [[X:%.*]]) { ; CHECK-NEXT: entry: -; CHECK-NEXT: [[CALL:%.*]] = tail call <3 x float> @_Z5rootnDv3_fDv3_i(<3 x float> [[X]], <3 x i32> ) -; CHECK-NEXT: ret <3 x float> [[CALL]] +; CHECK-NEXT: ret <3 x float> [[X]] ; entry: %call = tail call <3 x float> @_Z5rootnDv3_fDv3_i(<3 x float> %x, <3 x i32> ) @@ -571,8 +566,7 @@ define <3 x float> @test_rootn_v3f32__y_1_undef(<3 x float> %x) { ; CHECK-LABEL: define <3 x float> @test_rootn_v3f32__y_1_undef( ; CHECK-SAME: <3 x float> [[X:%.*]]) { ; CHECK-NEXT: entry: -; CHECK-NEXT: [[CALL:%.*]] = tail call <3 x float> @_Z5rootnDv3_fDv3_i(<3 x float> [[X]], <3 x i32> ) -; CHECK-NEXT: ret <3 x float> [[CALL]] +; CHECK-NEXT: ret <3 x float> [[X]] ; entry: %call = tail call <3 x float> @_Z5rootnDv3_fDv3_i(<3 x float> %x, <3 x i32> ) @@ -583,8 +577,7 @@ define <4 x float> @test_rootn_v4f32__y_1(<4 x float> %x) { ; CHECK-LABEL: define <4 x float> @test_rootn_v4f32__y_1( ; CHECK-SAME: <4 x float> [[X:%.*]]) { ; CHECK-NEXT: entry: -; CHECK-NEXT: [[CALL:%.*]] = tail call <4 x float> @_Z5rootnDv4_fDv4_i(<4 x float> [[X]], <4 x i32> ) -; CHECK-NEXT: ret <4 x float> [[CALL]] +; CHECK-NEXT: ret <4 x float> [[X]] ; entry: %call = tail call <4 x float> @_Z5rootnDv4_fDv4_i(<4 x float> %x, <4 x i32> ) @@ -595,8 +588,7 @@ define <8 x float> @test_rootn_v8f32__y_1(<8 x float> %x) { ; CHECK-LABEL: define <8 x float> @test_rootn_v8f32__y_1( ; CHECK-SAME: <8 x float> [[X:%.*]]) { ; CHECK-NEXT: entry: -; CHECK-NEXT: [[CALL:%.*]] = tail call <8 x float> @_Z5rootnDv8_fDv8_i(<8 x float> [[X]], <8 x i32> ) -; CHECK-NEXT: ret <8 x float> [[CALL]] +; CHECK-NEXT: ret <8 x float> [[X]] ; entry: %call = tail call <8 x float> @_Z5rootnDv8_fDv8_i(<8 x float> %x, <8 x i32> ) @@ -607,8 +599,7 @@ define <16 x float> @test_rootn_v16f32__y_1(<16 x float> %x) { ; CHECK-LABEL: define <16 x float> @test_rootn_v16f32__y_1( ; CHECK-SAME: <16 x float> [[X:%.*]]) { ; CHECK-NEXT: entry: -; CHECK-NEXT: [[CALL:%.*]] = tail call <16 x float> @_Z5rootnDv16_fDv16_i(<16 x float> [[X]], <16 x i32> ) -; CHECK-NEXT: ret <16 x float> [[CALL]] +; CHECK-NEXT: ret <16 x float> [[X]] ; entry: %call = tail call <16 x float> @_Z5rootnDv16_fDv16_i(<16 x float> %x, <16 x i32> ) @@ -656,8 +647,8 @@ define <2 x float> @test_rootn_v2f32__y_2_flags(<2 x float> %x) { ; CHECK-LABEL: define <2 x float> @test_rootn_v2f32__y_2_flags( ; CHECK-SAME: <2 x float> [[X:%.*]]) { ; CHECK-NEXT: entry: -; CHECK-NEXT: [[CALL:%.*]] = tail call nnan nsz <2 x float> @_Z5rootnDv2_fDv2_i(<2 x float> [[X]], <2 x i32> ) -; CHECK-NEXT: ret <2 x float> [[CALL]] +; CHECK-NEXT: [[__ROOTN2SQRT:%.*]] = call nnan nsz <2 x float> @_Z4sqrtDv2_f(<2 x float> [[X]]) +; CHECK-NEXT: ret <2 x float> [[__ROOTN2SQRT]] ; entry: %call = tail call nnan nsz <2 x float> @_Z5rootnDv2_fDv2_i(<2 x float> %x, <2 x i32> ) @@ -668,8 +659,8 @@ define <3 x float> @test_rootn_v3f32__y_2(<3 x float> %x) { ; CHECK-LABEL: define <3 x float> @test_rootn_v3f32__y_2( ; CHECK-SAME: <3 x float> [[X:%.*]]) { ; CHECK-NEXT: entry: -; CHECK-NEXT: [[CALL:%.*]] = tail call <3 x float> @_Z5rootnDv3_fDv3_i(<3 x float> [[X]], <3 x i32> ) -; CHECK-NEXT: ret <3 x float> [[CALL]] +; CHECK-NEXT: [[__ROOTN2SQRT:%.*]] = call <3 x float> @_Z4sqrtDv3_f(<3 x float> [[X]]) +; CHECK-NEXT: ret <3 x float> [[__ROOTN2SQRT]] ; entry: %call = tail call <3 x float> @_Z5rootnDv3_fDv3_i(<3 x float> %x, <3 x i32> ) @@ -680,8 +671,8 @@ define <3 x float> @test_rootn_v3f32__y_2_undef(<3 x float> %x) { ; CHECK-LABEL: define <3 x float> @test_rootn_v3f32__y_2_undef( ; CHECK-SAME: <3 x float> [[X:%.*]]) { ; CHECK-NEXT: entry: -; CHECK-NEXT: [[CALL:%.*]] = tail call <3 x float> @_Z5rootnDv3_fDv3_i(<3 x float> [[X]], <3 x i32> ) -; CHECK-NEXT: ret <3 x float> [[CALL]] +; CHECK-NEXT: [[__ROOTN2SQRT:%.*]] = call <3 x float> @_Z4sqrtDv3_f(<3 x float> [[X]]) +; CHECK-NEXT: ret <3 x float> [[__ROOTN2SQRT]] ; entry: %call = tail call <3 x float> @_Z5rootnDv3_fDv3_i(<3 x float> %x, <3 x i32> ) @@ -692,8 +683,8 @@ define <4 x float> @test_rootn_v4f32__y_2(<4 x float> %x) { ; CHECK-LABEL: define <4 x float> @test_rootn_v4f32__y_2( ; CHECK-SAME: <4 x float> [[X:%.*]]) { ; CHECK-NEXT: entry: -; CHECK-NEXT: [[CALL:%.*]] = tail call <4 x float> @_Z5rootnDv4_fDv4_i(<4 x float> [[X]], <4 x i32> ) -; CHECK-NEXT: ret <4 x float> [[CALL]] +; CHECK-NEXT: [[__ROOTN2SQRT:%.*]] = call <4 x float> @_Z4sqrtDv4_f(<4 x float> [[X]]) +; CHECK-NEXT: ret <4 x float> [[__ROOTN2SQRT]] ; entry: %call = tail call <4 x float> @_Z5rootnDv4_fDv4_i(<4 x float> %x, <4 x i32> ) @@ -704,8 +695,8 @@ define <8 x float> @test_rootn_v8f32__y_2(<8 x float> %x) { ; CHECK-LABEL: define <8 x float> @test_rootn_v8f32__y_2( ; CHECK-SAME: <8 x float> [[X:%.*]]) { ; CHECK-NEXT: entry: -; CHECK-NEXT: [[CALL:%.*]] = tail call <8 x float> @_Z5rootnDv8_fDv8_i(<8 x float> [[X]], <8 x i32> ) -; CHECK-NEXT: ret <8 x float> [[CALL]] +; CHECK-NEXT: [[__ROOTN2SQRT:%.*]] = call <8 x float> @_Z4sqrtDv8_f(<8 x float> [[X]]) +; CHECK-NEXT: ret <8 x float> [[__ROOTN2SQRT]] ; entry: %call = tail call <8 x float> @_Z5rootnDv8_fDv8_i(<8 x float> %x, <8 x i32> ) @@ -716,8 +707,8 @@ define <16 x float> @test_rootn_v16f32__y_2(<16 x float> %x) { ; CHECK-LABEL: define <16 x float> @test_rootn_v16f32__y_2( ; CHECK-SAME: <16 x float> [[X:%.*]]) { ; CHECK-NEXT: entry: -; CHECK-NEXT: [[CALL:%.*]] = tail call <16 x float> @_Z5rootnDv16_fDv16_i(<16 x float> [[X]], <16 x i32> ) -; CHECK-NEXT: ret <16 x float> [[CALL]] +; CHECK-NEXT: [[__ROOTN2SQRT:%.*]] = call <16 x float> @_Z4sqrtDv16_f(<16 x float> [[X]]) +; CHECK-NEXT: ret <16 x float> [[__ROOTN2SQRT]] ; entry: %call = tail call <16 x float> @_Z5rootnDv16_fDv16_i(<16 x float> %x, <16 x i32> ) @@ -740,8 +731,8 @@ define <2 x float> @test_rootn_v2f32__y_3(<2 x float> %x) { ; CHECK-LABEL: define <2 x float> @test_rootn_v2f32__y_3( ; CHECK-SAME: <2 x float> [[X:%.*]]) { ; CHECK-NEXT: entry: -; CHECK-NEXT: [[CALL:%.*]] = tail call <2 x float> @_Z5rootnDv2_fDv2_i(<2 x float> [[X]], <2 x i32> ) -; CHECK-NEXT: ret <2 x float> [[CALL]] +; CHECK-NEXT: [[__ROOTN2CBRT:%.*]] = call <2 x float> @_Z4cbrtDv2_f(<2 x float> [[X]]) +; CHECK-NEXT: ret <2 x float> [[__ROOTN2CBRT]] ; entry: %call = tail call <2 x float> @_Z5rootnDv2_fDv2_i(<2 x float> %x, <2 x i32> ) @@ -764,8 +755,8 @@ define <2 x float> @test_rootn_v2f32__y_nonsplat_2_poison(<2 x float> %x) { ; CHECK-LABEL: define <2 x float> @test_rootn_v2f32__y_nonsplat_2_poison( ; CHECK-SAME: <2 x float> [[X:%.*]]) { ; CHECK-NEXT: entry: -; CHECK-NEXT: [[CALL:%.*]] = tail call <2 x float> @_Z5rootnDv2_fDv2_i(<2 x float> [[X]], <2 x i32> ) -; CHECK-NEXT: ret <2 x float> [[CALL]] +; CHECK-NEXT: [[__ROOTN2SQRT:%.*]] = call <2 x float> @_Z4sqrtDv2_f(<2 x float> [[X]]) +; CHECK-NEXT: ret <2 x float> [[__ROOTN2SQRT]] ; entry: %call = tail call <2 x float> @_Z5rootnDv2_fDv2_i(<2 x float> %x, <2 x i32> ) @@ -800,8 +791,8 @@ define <2 x float> @test_rootn_v2f32__y_neg1(<2 x float> %x) { ; CHECK-LABEL: define <2 x float> @test_rootn_v2f32__y_neg1( ; CHECK-SAME: <2 x float> [[X:%.*]]) { ; CHECK-NEXT: entry: -; CHECK-NEXT: [[CALL:%.*]] = tail call <2 x float> @_Z5rootnDv2_fDv2_i(<2 x float> [[X]], <2 x i32> ) -; CHECK-NEXT: ret <2 x float> [[CALL]] +; CHECK-NEXT: [[__ROOTN2DIV:%.*]] = fdiv <2 x float> , [[X]] +; CHECK-NEXT: ret <2 x float> [[__ROOTN2DIV]] ; entry: %call = tail call <2 x float> @_Z5rootnDv2_fDv2_i(<2 x float> %x, <2 x i32> ) @@ -812,8 +803,8 @@ define <3 x float> @test_rootn_v3f32__y_neg1(<3 x float> %x) { ; CHECK-LABEL: define <3 x float> @test_rootn_v3f32__y_neg1( ; CHECK-SAME: <3 x float> [[X:%.*]]) { ; CHECK-NEXT: entry: -; CHECK-NEXT: [[CALL:%.*]] = tail call <3 x float> @_Z5rootnDv3_fDv3_i(<3 x float> [[X]], <3 x i32> ) -; CHECK-NEXT: ret <3 x float> [[CALL]] +; CHECK-NEXT: [[__ROOTN2DIV:%.*]] = fdiv <3 x float> , [[X]] +; CHECK-NEXT: ret <3 x float> [[__ROOTN2DIV]] ; entry: %call = tail call <3 x float> @_Z5rootnDv3_fDv3_i(<3 x float> %x, <3 x i32> ) @@ -824,8 +815,8 @@ define <3 x float> @test_rootn_v3f32__y_neg1_undef(<3 x float> %x) { ; CHECK-LABEL: define <3 x float> @test_rootn_v3f32__y_neg1_undef( ; CHECK-SAME: <3 x float> [[X:%.*]]) { ; CHECK-NEXT: entry: -; CHECK-NEXT: [[CALL:%.*]] = tail call <3 x float> @_Z5rootnDv3_fDv3_i(<3 x float> [[X]], <3 x i32> ) -; CHECK-NEXT: ret <3 x float> [[CALL]] +; CHECK-NEXT: [[__ROOTN2DIV:%.*]] = fdiv <3 x float> , [[X]] +; CHECK-NEXT: ret <3 x float> [[__ROOTN2DIV]] ; entry: %call = tail call <3 x float> @_Z5rootnDv3_fDv3_i(<3 x float> %x, <3 x i32> ) @@ -836,8 +827,8 @@ define <4 x float> @test_rootn_v4f32__y_neg1(<4 x float> %x) { ; CHECK-LABEL: define <4 x float> @test_rootn_v4f32__y_neg1( ; CHECK-SAME: <4 x float> [[X:%.*]]) { ; CHECK-NEXT: entry: -; CHECK-NEXT: [[CALL:%.*]] = tail call <4 x float> @_Z5rootnDv4_fDv4_i(<4 x float> [[X]], <4 x i32> ) -; CHECK-NEXT: ret <4 x float> [[CALL]] +; CHECK-NEXT: [[__ROOTN2DIV:%.*]] = fdiv <4 x float> , [[X]] +; CHECK-NEXT: ret <4 x float> [[__ROOTN2DIV]] ; entry: %call = tail call <4 x float> @_Z5rootnDv4_fDv4_i(<4 x float> %x, <4 x i32> ) @@ -848,8 +839,8 @@ define <8 x float> @test_rootn_v8f32__y_neg1(<8 x float> %x) { ; CHECK-LABEL: define <8 x float> @test_rootn_v8f32__y_neg1( ; CHECK-SAME: <8 x float> [[X:%.*]]) { ; CHECK-NEXT: entry: -; CHECK-NEXT: [[CALL:%.*]] = tail call <8 x float> @_Z5rootnDv8_fDv8_i(<8 x float> [[X]], <8 x i32> ) -; CHECK-NEXT: ret <8 x float> [[CALL]] +; CHECK-NEXT: [[__ROOTN2DIV:%.*]] = fdiv <8 x float> , [[X]] +; CHECK-NEXT: ret <8 x float> [[__ROOTN2DIV]] ; entry: %call = tail call <8 x float> @_Z5rootnDv8_fDv8_i(<8 x float> %x, <8 x i32> ) @@ -860,8 +851,8 @@ define <16 x float> @test_rootn_v16f32__y_neg1(<16 x float> %x) { ; CHECK-LABEL: define <16 x float> @test_rootn_v16f32__y_neg1( ; CHECK-SAME: <16 x float> [[X:%.*]]) { ; CHECK-NEXT: entry: -; CHECK-NEXT: [[CALL:%.*]] = tail call <16 x float> @_Z5rootnDv16_fDv16_i(<16 x float> [[X]], <16 x i32> ) -; CHECK-NEXT: ret <16 x float> [[CALL]] +; CHECK-NEXT: [[__ROOTN2DIV:%.*]] = fdiv <16 x float> , [[X]] +; CHECK-NEXT: ret <16 x float> [[__ROOTN2DIV]] ; entry: %call = tail call <16 x float> @_Z5rootnDv16_fDv16_i(<16 x float> %x, <16 x i32> ) @@ -932,8 +923,8 @@ define <2 x float> @test_rootn_v2f32__y_neg2(<2 x float> %x) { ; CHECK-LABEL: define <2 x float> @test_rootn_v2f32__y_neg2( ; CHECK-SAME: <2 x float> [[X:%.*]]) { ; CHECK-NEXT: entry: -; CHECK-NEXT: [[CALL:%.*]] = tail call <2 x float> @_Z5rootnDv2_fDv2_i(<2 x float> [[X]], <2 x i32> ) -; CHECK-NEXT: ret <2 x float> [[CALL]] +; CHECK-NEXT: [[__ROOTN2RSQRT:%.*]] = call <2 x float> @_Z5rsqrtDv2_f(<2 x float> [[X]]) +; CHECK-NEXT: ret <2 x float> [[__ROOTN2RSQRT]] ; entry: %call = tail call <2 x float> @_Z5rootnDv2_fDv2_i(<2 x float> %x, <2 x i32> ) @@ -944,8 +935,8 @@ define <2 x float> @test_rootn_v2f32__y_neg2__flags(<2 x float> %x) { ; CHECK-LABEL: define <2 x float> @test_rootn_v2f32__y_neg2__flags( ; CHECK-SAME: <2 x float> [[X:%.*]]) { ; CHECK-NEXT: entry: -; CHECK-NEXT: [[CALL:%.*]] = tail call nnan nsz <2 x float> @_Z5rootnDv2_fDv2_i(<2 x float> [[X]], <2 x i32> ) -; CHECK-NEXT: ret <2 x float> [[CALL]] +; CHECK-NEXT: [[__ROOTN2RSQRT:%.*]] = call nnan nsz <2 x float> @_Z5rsqrtDv2_f(<2 x float> [[X]]) +; CHECK-NEXT: ret <2 x float> [[__ROOTN2RSQRT]] ; entry: %call = tail call nsz nnan <2 x float> @_Z5rootnDv2_fDv2_i(<2 x float> %x, <2 x i32> ) @@ -956,8 +947,8 @@ define <2 x float> @test_rootn_v2f32__y_neg2__strictfp(<2 x float> %x) #1 { ; CHECK-LABEL: define <2 x float> @test_rootn_v2f32__y_neg2__strictfp( ; CHECK-SAME: <2 x float> [[X:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: entry: -; CHECK-NEXT: [[CALL:%.*]] = tail call <2 x float> @_Z5rootnDv2_fDv2_i(<2 x float> [[X]], <2 x i32> ) #[[ATTR0]] -; CHECK-NEXT: ret <2 x float> [[CALL]] +; CHECK-NEXT: [[__ROOTN2RSQRT:%.*]] = call <2 x float> @_Z5rsqrtDv2_f(<2 x float> [[X]]) #[[ATTR0]] +; CHECK-NEXT: ret <2 x float> [[__ROOTN2RSQRT]] ; entry: %call = tail call <2 x float> @_Z5rootnDv2_fDv2_i(<2 x float> %x, <2 x i32> ) #1 @@ -1266,8 +1257,8 @@ define <2 x float> @test_rootn_afn_nnan_ninf_v2f32__y_3(<2 x float> %x) { ; CHECK-LABEL: define <2 x float> @test_rootn_afn_nnan_ninf_v2f32__y_3( ; CHECK-SAME: <2 x float> [[X:%.*]]) { ; CHECK-NEXT: entry: -; CHECK-NEXT: [[CALL:%.*]] = tail call nnan ninf afn <2 x float> @_Z5rootnDv2_fDv2_i(<2 x float> [[X]], <2 x i32> ) -; CHECK-NEXT: ret <2 x float> [[CALL]] +; CHECK-NEXT: [[__ROOTN2CBRT:%.*]] = call nnan ninf afn <2 x float> @_Z4cbrtDv2_f(<2 x float> [[X]]) +; CHECK-NEXT: ret <2 x float> [[__ROOTN2CBRT]] ; entry: %call = tail call afn nnan ninf <2 x float> @_Z5rootnDv2_fDv2_i(<2 x float> %x, <2 x i32> )