ac: reassociate FP expressions for inexact instructions for radeonsi
authorMarek Olšák <marek.olsak@amd.com>
Thu, 23 Apr 2020 03:01:28 +0000 (23:01 -0400)
committerMarge Bot <eric+marge@anholt.net>
Mon, 27 Apr 2020 11:20:16 +0000 (11:20 +0000)
Totals:
SGPRS: 2591784 -> 2590696 (-0.04 %)
VGPRS: 1666888 -> 1666736 (-0.01 %)
Spilled SGPRs: 4131 -> 4107 (-0.58 %)
Spilled VGPRs: 38 -> 38 (0.00 %)
Private memory VGPRs: 2176 -> 2176 (0.00 %)
Scratch size: 2228 -> 2228 (0.00 %) dwords per thread
Code Size: 52715468 -> 52693584 (-0.04 %) bytes
LDS: 92 -> 92 (0.00 %) blocks
Max Waves: 479897 -> 479892 (-0.00 %)
Wait states: 0 -> 0 (0.00 %)

Reviewed-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4696>

src/amd/llvm/ac_llvm_helper.cpp

index f5383344dd4f3c37348449d0eb28c61dd6d3699d..97b9a1a035a09e34fa3181f678f94040a34e1950 100644 (file)
@@ -101,6 +101,11 @@ LLVMBuilderRef ac_create_builder(LLVMContextRef ctx,
                 */
                flags.setAllowContract(); /* contract */
 
+               /* Allow reassociation transformations for floating-point
+                * instructions. This may dramatically change results.
+                */
+               flags.setAllowReassoc(); /* reassoc */
+
                llvm::unwrap(builder)->setFastMathFlags(flags);
                break;
        }
@@ -113,11 +118,13 @@ bool ac_disable_inexact_math(LLVMBuilderRef builder)
 {
        auto *b = llvm::unwrap(builder);
        llvm::FastMathFlags flags = b->getFastMathFlags();
+       assert(flags.allowContract() == flags.allowReassoc());
 
        if (!flags.allowContract())
                return false;
 
        flags.setAllowContract(false);
+       flags.setAllowReassoc(false);
        b->setFastMathFlags(flags);
        return true;
 }
@@ -126,11 +133,13 @@ void ac_restore_inexact_math(LLVMBuilderRef builder, bool value)
 {
        auto *b = llvm::unwrap(builder);
        llvm::FastMathFlags flags = b->getFastMathFlags();
+       assert(flags.allowContract() == flags.allowReassoc());
 
        if (flags.allowContract() == value)
                return;
 
        flags.setAllowContract(value);
+       flags.setAllowReassoc(value);
        b->setFastMathFlags(flags);
 }