[Bug target/39723] [4.8/4.9/5 Regression][cond-optab] worse code with long long shifts on v850

law at redhat dot com gcc-bugzilla@gcc.gnu.org
Fri Feb 6 18:36:00 GMT 2015


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

Jeffrey A. Law <law at redhat dot com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |law at redhat dot com
           Assignee|unassigned at gcc dot gnu.org      |vmakarov at redhat dot com

--- Comment #8 from Jeffrey A. Law <law at redhat dot com> ---
Vlad, this looks like a register allocation issue to me.

Using the current trunk configured for v850-elf, compiling the testcase from
c#0 with -O2 and comparing it to the pre-cond-optab merge, I see that we're not
coalescing some of the allocnos as aggressively as perhaps we should.

Let's start with a13 and a17 and work backwards from their hard register
assignments:



      Popping a13(r46,l0)  -- assign reg 12
      Popping a17(r53,l0)  -- assign reg 10



These registers are related by a "copy" if we look up a bit in the .ira dump:

      Forming thread by copy 0:a13r46-a17r53 (freq=125):
        Result (freq=7000): a13r46(5000) a17r53(2000)

  cp0:a13(r46)<->a17(r53)@125:shuffle

Looking at the conflicts:

;; a13(r46,l0) conflicts: a1(r68,l0) a0(r69,l0) a2(r70,l0) a4(r42,l0)
a5(r67,l0) a6(r66,l0) a14(r62,l0) a15(r61,l0) a16(r60,l0)
;;     total conflict hard regs:
;;     conflict hard regs:

;; a17(r53,l0) conflicts: a2(r70,l0) a4(r42,l0) a5(r67,l0) a6(r66,l0)
;;     total conflict hard regs:
;;     conflict hard regs:

Failing to allocate these two registers to r10 results in a 3-operand add (2
bytes longer) and an unnecessary move (2 bytes).  Fixing that would appear to
eliminate the regression.

For reference, the add insn is defined as:

(define_insn "addsi3"
  [(set (match_operand:SI 0 "register_operand" "=r,r,r")
        (plus:SI (match_operand:SI 1 "register_operand" "%0,r,r")
                 (match_operand:SI 2 "nonmemory_operand" "rJ,K,U")))
   (clobber (reg:CC CC_REGNUM))]

Alternative 0 is preferred whenever possible as it allows us to generate the
shorter add instruction.

I'd appreciate if you could investigate when you have the opportunity.



More information about the Gcc-bugs mailing list