[Bug target/92905] [10 Regression] Spills float-int union to memory

jakub at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Wed Dec 11 09:58:00 GMT 2019


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92905

Jakub Jelinek <jakub at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |vmakarov at gcc dot gnu.org

--- Comment #2 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
In particular, reverting the:
--- gcc/config/i386/i386.md     2019-12-11 10:48:51.787820841 +0100
+++ gcc/config/i386/i386.md     2019-12-09 19:50:24.604955118 +0100
@@ -9223,10 +9223,10 @@
 })

 (define_insn "*<code><mode>_1"
-  [(set (match_operand:SWI248 0 "nonimmediate_operand" "=r,rm")
+  [(set (match_operand:SWI248 0 "nonimmediate_operand" "=rm,r")
        (any_or:SWI248
         (match_operand:SWI248 1 "nonimmediate_operand" "%0,0")
-        (match_operand:SWI248 2 "<general_operand>" "<g>,r<i>")))
+        (match_operand:SWI248 2 "<general_operand>" "r<i>,m")))
    (clobber (reg:CC FLAGS_REG))]
   "ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)"
   "<logic>{<imodesuffix>}\t{%2, %0|%0, %2}"

change fixes it.  I admit I have no idea why.  It is true that the operands are
commutative, so RA can choose whether to put the constant or what used to be in
xmm0 into the destination register, previously it chose what results in better
code by putting the constant into the instruction and xmm0 moved into a GPR,
now it spills xmm0 instead, puts the constant into the destination register and
uses a memory operand.  The above mentioned commit changed this for commutative
operands in several spots.


More information about the Gcc-bugs mailing list