[Bug target/39726] New: [cond-optab] ColdFire pessimizations on QImode/HImode tests

bonzini at gnu dot org gcc-bugzilla@gcc.gnu.org
Fri Apr 10 14:35:00 GMT 2009


unsigned char v;

int baz (unsigned char u, unsigned char w)
{
  if ((u - w) & 0x80)
    v = 1; 
}

Combine does not like as much as for m68k the RTL produced by the optimizers,
because of the lack of byte operations:

 (insn 10 9 11 f.c:5 (set (reg:QI 35)
-        (and:QI (subreg:QI (reg:SI 34) 3)
-(insn 11 10 12 f.c:5 (set (cc0)
-        (compare (reg:QI 35)
             (const_int 0 [0x0]))) -1 (nil))

vs.

 (insn 10 9 11 f.c:5 (set (reg:QI 35)
+        (subreg:QI (reg:SI 34) 3)) -1 (nil))
+
+(insn 11 10 12 f.c:5 (set (reg:SI 36)
+        (and:SI (subreg:SI (reg:QI 35) 0)
             (const_int -128 [0xffffff80]))) -1 (nil))

+(insn 12 11 13 f.c:5 (set (reg:QI 37)
+        (subreg:QI (reg:SI 36) 3)) -1 (nil))
+
+(insn 13 12 14 f.c:5 (set (cc0)
+        (compare (reg:QI 37)
             (const_int 0 [0x0]))) -1 (nil))

The extra insn 12 is present because of this in dojump.c:

564           /* The RTL optimizers prefer comparisons against pseudos.  */
565           if (GET_CODE (temp) == SUBREG)
566             {
567               /* Compare promoted variables in their promoted mode.  */
568               if (SUBREG_PROMOTED_VAR_P (temp)
569                   && REG_P (XEXP (temp, 0)))
570                 temp = XEXP (temp, 0);
571               else
572                 temp = copy_to_reg (temp);
573             }


-- 
           Summary: [cond-optab] ColdFire pessimizations on QImode/HImode
                    tests
           Product: gcc
           Version: 4.5.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: target
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: bonzini at gnu dot org
OtherBugsDependingO 39714
             nThis:


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=39726



More information about the Gcc-bugs mailing list