[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