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

--- Comment #3 from Uroš Bizjak <ubizjak at gmail dot com> ---
(In reply to Andrew Pinski from comment #2)
> I suspect it is treating cost 0 as being free rather than unknown cost.  And
> the x86 backend is returning 0 cost for the upper multiple.

There is no truncate RTX present in the dumps.

But in any case, moving 10+ insns out of THEN block seems excessive:

IF-THEN-JOIN block found, pass 1, test 34, then 35, join 15
scanning new insn with uid = 320.
scanning new insn with uid = 321.
scanning new insn with uid = 322.
scanning new insn with uid = 323.
scanning new insn with uid = 324.
scanning new insn with uid = 325.
scanning new insn with uid = 326.
scanning new insn with uid = 327.
scanning new insn with uid = 328.
scanning new insn with uid = 329.
scanning new insn with uid = 330.
if-conversion succeeded through noce_try_cmove_arith
Removing jump 225.
deleting insn with uid = 225.
deleting insn with uid = 235.
deleting insn with uid = 286.
deleting insn with uid = 232.
deleting insn with uid = 231.
deleting insn with uid = 230.
deleting insn with uid = 229.
deleting insn with uid = 284.
deleting insn with uid = 227.
deleting block 35
Conversion succeeded on pass 1.

  ...
* 224: flags:CCZ=cmp(r245:SI,0)
*      REG_DEAD r245:SI
  225: pc={(flags:CCZ!=0)?L222:pc}
      REG_DEAD flags:CCZ
      REG_BR_PROB 536870916

  226: NOTE_INSN_BASIC_BLOCK 40
  227: {r246:TI=zero_extend(r91:DI)*zero_extend(r136:DI);clobber flags:CC;}
      REG_UNUSED flags:CC
  284: r262:DI=r246:TI#8
      REG_DEAD r246:TI
  229: r249:DI=0xfffff
  230: {r248:DI=r249:DI-r262:DI;clobber flags:CC;}
      REG_DEAD r262:DI
      REG_DEAD r249:DI
      REG_UNUSED flags:CC
  231: {r250:DI=r248:DI<<0x2c;clobber flags:CC;}
      REG_DEAD r248:DI
      REG_UNUSED flags:CC
  232: {r251:TI=zero_extend(r250:DI)*zero_extend(r91:DI);clobber flags:CC;}
      REG_DEAD r250:DI
      REG_DEAD r91:DI
      REG_UNUSED flags:CC
  286: r264:DI=r251:TI#8
      REG_DEAD r251:TI
  235: {r91:DI=r264:DI<<0x1;clobber flags:CC;}
      REG_DEAD r264:DI
      REG_UNUSED flags:CC
  ...

is moved to:
  ...
* 224: flags:CCZ=cmp(r245:SI,0)
*     REG_DEAD r245:SI
  320: {r246:TI=zero_extend(r91:DI)*zero_extend(r136:DI);clobber flags:CC;}
  321: r262:DI=r246:TI#8
  322: r249:DI=0xfffff
  323: {r248:DI=r249:DI-r262:DI;clobber flags:CC;}
  324: {r250:DI=r248:DI<<0x2c;clobber flags:CC;}
  325: {r251:TI=zero_extend(r250:DI)*zero_extend(r91:DI);clobber flags:CC;}
  326: r264:DI=r251:TI#8
  327: {r270:DI=r264:DI<<0x1;clobber flags:CC;}
  328: {r269:DI=r243:DI<<0xf;clobber flags:CC;}
* 329: flags:CCZ=cmp(r245:SI,0)
  330: r91:DI={(flags:CCZ!=0)?r269:DI:r270:DI}
  ...

(not to mention that (insn 224) in front should be removed as well, it is
duplicated as (insn 329)).

I don't think x86 declares all moved insn costs as 0.

Reply via email to