Re: [Mesa-dev] [PATCH 05/15] ac: revert new LLVM 7.0 behavior for fdiv
Fixed in master. Marek On Mon, Oct 29, 2018 at 6:50 AM Connor Abbott wrote: > ctx->f32_1 probably needs to be replaced by the appropriately-sized > float, like LLVMConstReal(1., ...) > On Mon, Oct 29, 2018 at 11:45 AM Timothy Arceri > wrote: > > > > Hi Marek, > > > > It's late and I haven't dug into this any further but this patch causes > > a whole bunch of f64 piglit tests to fail for the radeonsi nir backend. > > > > e.g. > > > > ./bin/shader_runner > > > generated_tests/spec/glsl-4.00/execution/built-in-functions/fs-inverse-dmat2.shader_test > > -auto -fbo > > > > > > LLVM ERROR: Cannot select: 0x7fbc48075aa8: f64 = bitcast 0x7fbc48077730 > >0x7fbc48077730: f32 = RCP 0x7fbc4806e788 > > 0x7fbc4806e788: f64 = fadd nsz 0x7fbc480757d0, 0x7fbc48075a40 > >0x7fbc480757d0: f64 = fmul nsz 0x7fbc4806f0e0, 0x7fbc4806f420 > > 0x7fbc4806f0e0: f64 = bitcast 0x7fbc4806f078 > > > > On 30/8/18 6:13 am, Marek Olšák wrote: > > > From: Marek Olšák > > > > > > Cc: 18.1 18.2 > > > --- > > > src/amd/common/ac_llvm_build.c | 9 - > > > 1 file changed, 8 insertions(+), 1 deletion(-) > > > > > > diff --git a/src/amd/common/ac_llvm_build.c > b/src/amd/common/ac_llvm_build.c > > > index c741a1ab62d..629cd2a7527 100644 > > > --- a/src/amd/common/ac_llvm_build.c > > > +++ b/src/amd/common/ac_llvm_build.c > > > @@ -554,21 +554,28 @@ LLVMValueRef ac_build_expand_to_vec4(struct > ac_llvm_context *ctx, > > > chan[num_channels++] = LLVMGetUndef(elemtype); > > > > > > return ac_build_gather_values(ctx, chan, 4); > > > } > > > > > > LLVMValueRef > > > ac_build_fdiv(struct ac_llvm_context *ctx, > > > LLVMValueRef num, > > > LLVMValueRef den) > > > { > > > - LLVMValueRef ret = LLVMBuildFDiv(ctx->builder, num, den, ""); > > > + /* If we do (num / den), LLVM >= 7.0 does: > > > + *return num * v_rcp_f32(den * (fabs(den) > 0x1.0p+96f ? > 0x1.0p-32f : 1.0f)); > > > + * > > > + * If we do (num * (1 / den)), LLVM does: > > > + *return num * v_rcp_f32(den); > > > + */ > > > + LLVMValueRef rcp = LLVMBuildFDiv(ctx->builder, ctx->f32_1, den, > ""); > > > + LLVMValueRef ret = LLVMBuildFMul(ctx->builder, num, rcp, ""); > > > > > > /* Use v_rcp_f32 instead of precise division. */ > > > if (!LLVMIsConstant(ret)) > > > LLVMSetMetadata(ret, ctx->fpmath_md_kind, > ctx->fpmath_md_2p5_ulp); > > > return ret; > > > } > > > > > > /* Coordinates for cube map selection. sc, tc, and ma are as in > Table 8.27 > > >* of the OpenGL 4.5 (Compatibility Profile) specification, except > ma is > > >* already multiplied by two. id is the cube face number. > > > > > ___ > > mesa-dev mailing list > > mesa-dev@lists.freedesktop.org > > https://lists.freedesktop.org/mailman/listinfo/mesa-dev > ___ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev
Re: [Mesa-dev] [PATCH 05/15] ac: revert new LLVM 7.0 behavior for fdiv
ctx->f32_1 probably needs to be replaced by the appropriately-sized float, like LLVMConstReal(1., ...) On Mon, Oct 29, 2018 at 11:45 AM Timothy Arceri wrote: > > Hi Marek, > > It's late and I haven't dug into this any further but this patch causes > a whole bunch of f64 piglit tests to fail for the radeonsi nir backend. > > e.g. > > ./bin/shader_runner > generated_tests/spec/glsl-4.00/execution/built-in-functions/fs-inverse-dmat2.shader_test > -auto -fbo > > > LLVM ERROR: Cannot select: 0x7fbc48075aa8: f64 = bitcast 0x7fbc48077730 >0x7fbc48077730: f32 = RCP 0x7fbc4806e788 > 0x7fbc4806e788: f64 = fadd nsz 0x7fbc480757d0, 0x7fbc48075a40 >0x7fbc480757d0: f64 = fmul nsz 0x7fbc4806f0e0, 0x7fbc4806f420 > 0x7fbc4806f0e0: f64 = bitcast 0x7fbc4806f078 > > On 30/8/18 6:13 am, Marek Olšák wrote: > > From: Marek Olšák > > > > Cc: 18.1 18.2 > > --- > > src/amd/common/ac_llvm_build.c | 9 - > > 1 file changed, 8 insertions(+), 1 deletion(-) > > > > diff --git a/src/amd/common/ac_llvm_build.c b/src/amd/common/ac_llvm_build.c > > index c741a1ab62d..629cd2a7527 100644 > > --- a/src/amd/common/ac_llvm_build.c > > +++ b/src/amd/common/ac_llvm_build.c > > @@ -554,21 +554,28 @@ LLVMValueRef ac_build_expand_to_vec4(struct > > ac_llvm_context *ctx, > > chan[num_channels++] = LLVMGetUndef(elemtype); > > > > return ac_build_gather_values(ctx, chan, 4); > > } > > > > LLVMValueRef > > ac_build_fdiv(struct ac_llvm_context *ctx, > > LLVMValueRef num, > > LLVMValueRef den) > > { > > - LLVMValueRef ret = LLVMBuildFDiv(ctx->builder, num, den, ""); > > + /* If we do (num / den), LLVM >= 7.0 does: > > + *return num * v_rcp_f32(den * (fabs(den) > 0x1.0p+96f ? > > 0x1.0p-32f : 1.0f)); > > + * > > + * If we do (num * (1 / den)), LLVM does: > > + *return num * v_rcp_f32(den); > > + */ > > + LLVMValueRef rcp = LLVMBuildFDiv(ctx->builder, ctx->f32_1, den, ""); > > + LLVMValueRef ret = LLVMBuildFMul(ctx->builder, num, rcp, ""); > > > > /* Use v_rcp_f32 instead of precise division. */ > > if (!LLVMIsConstant(ret)) > > LLVMSetMetadata(ret, ctx->fpmath_md_kind, > > ctx->fpmath_md_2p5_ulp); > > return ret; > > } > > > > /* Coordinates for cube map selection. sc, tc, and ma are as in Table 8.27 > >* of the OpenGL 4.5 (Compatibility Profile) specification, except ma is > >* already multiplied by two. id is the cube face number. > > > ___ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/mesa-dev ___ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev
Re: [Mesa-dev] [PATCH 05/15] ac: revert new LLVM 7.0 behavior for fdiv
Hi Marek, It's late and I haven't dug into this any further but this patch causes a whole bunch of f64 piglit tests to fail for the radeonsi nir backend. e.g. ./bin/shader_runner generated_tests/spec/glsl-4.00/execution/built-in-functions/fs-inverse-dmat2.shader_test -auto -fbo LLVM ERROR: Cannot select: 0x7fbc48075aa8: f64 = bitcast 0x7fbc48077730 0x7fbc48077730: f32 = RCP 0x7fbc4806e788 0x7fbc4806e788: f64 = fadd nsz 0x7fbc480757d0, 0x7fbc48075a40 0x7fbc480757d0: f64 = fmul nsz 0x7fbc4806f0e0, 0x7fbc4806f420 0x7fbc4806f0e0: f64 = bitcast 0x7fbc4806f078 On 30/8/18 6:13 am, Marek Olšák wrote: From: Marek Olšák Cc: 18.1 18.2 --- src/amd/common/ac_llvm_build.c | 9 - 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/amd/common/ac_llvm_build.c b/src/amd/common/ac_llvm_build.c index c741a1ab62d..629cd2a7527 100644 --- a/src/amd/common/ac_llvm_build.c +++ b/src/amd/common/ac_llvm_build.c @@ -554,21 +554,28 @@ LLVMValueRef ac_build_expand_to_vec4(struct ac_llvm_context *ctx, chan[num_channels++] = LLVMGetUndef(elemtype); return ac_build_gather_values(ctx, chan, 4); } LLVMValueRef ac_build_fdiv(struct ac_llvm_context *ctx, LLVMValueRef num, LLVMValueRef den) { - LLVMValueRef ret = LLVMBuildFDiv(ctx->builder, num, den, ""); + /* If we do (num / den), LLVM >= 7.0 does: +*return num * v_rcp_f32(den * (fabs(den) > 0x1.0p+96f ? 0x1.0p-32f : 1.0f)); +* +* If we do (num * (1 / den)), LLVM does: +*return num * v_rcp_f32(den); +*/ + LLVMValueRef rcp = LLVMBuildFDiv(ctx->builder, ctx->f32_1, den, ""); + LLVMValueRef ret = LLVMBuildFMul(ctx->builder, num, rcp, ""); /* Use v_rcp_f32 instead of precise division. */ if (!LLVMIsConstant(ret)) LLVMSetMetadata(ret, ctx->fpmath_md_kind, ctx->fpmath_md_2p5_ulp); return ret; } /* Coordinates for cube map selection. sc, tc, and ma are as in Table 8.27 * of the OpenGL 4.5 (Compatibility Profile) specification, except ma is * already multiplied by two. id is the cube face number. ___ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev
[Mesa-dev] [PATCH 05/15] ac: revert new LLVM 7.0 behavior for fdiv
From: Marek Olšák Cc: 18.1 18.2 --- src/amd/common/ac_llvm_build.c | 9 - 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/amd/common/ac_llvm_build.c b/src/amd/common/ac_llvm_build.c index c741a1ab62d..629cd2a7527 100644 --- a/src/amd/common/ac_llvm_build.c +++ b/src/amd/common/ac_llvm_build.c @@ -554,21 +554,28 @@ LLVMValueRef ac_build_expand_to_vec4(struct ac_llvm_context *ctx, chan[num_channels++] = LLVMGetUndef(elemtype); return ac_build_gather_values(ctx, chan, 4); } LLVMValueRef ac_build_fdiv(struct ac_llvm_context *ctx, LLVMValueRef num, LLVMValueRef den) { - LLVMValueRef ret = LLVMBuildFDiv(ctx->builder, num, den, ""); + /* If we do (num / den), LLVM >= 7.0 does: +*return num * v_rcp_f32(den * (fabs(den) > 0x1.0p+96f ? 0x1.0p-32f : 1.0f)); +* +* If we do (num * (1 / den)), LLVM does: +*return num * v_rcp_f32(den); +*/ + LLVMValueRef rcp = LLVMBuildFDiv(ctx->builder, ctx->f32_1, den, ""); + LLVMValueRef ret = LLVMBuildFMul(ctx->builder, num, rcp, ""); /* Use v_rcp_f32 instead of precise division. */ if (!LLVMIsConstant(ret)) LLVMSetMetadata(ret, ctx->fpmath_md_kind, ctx->fpmath_md_2p5_ulp); return ret; } /* Coordinates for cube map selection. sc, tc, and ma are as in Table 8.27 * of the OpenGL 4.5 (Compatibility Profile) specification, except ma is * already multiplied by two. id is the cube face number. -- 2.17.1 ___ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev