------- Comment #3 from rguenth at gcc dot gnu dot org 2006-11-10 13:28 -------
combine combines
(insn 10 8 11 2 (parallel [
(set (reg:SI 121)
(and:SI (reg/v:SI 119 [ nStyle ])
(const_int 32768 [0x8000])))
(clobber (scratch:CC))
]) 131 {andsi3} (insn_list:REG_DEP_TRUE 8 (nil))
(expr_list:REG_UNUSED (scratch:CC)
(nil)))
(insn 11 10 12 2 (set (reg:CC 122)
(compare:CC (reg:SI 121)
(const_int 0 [0x0]))) 456 {*cmpsi_internal1}
(insn_list:REG_DEP_TRUE 10 (nil))
(expr_list:REG_DEAD (reg:SI 121)
(nil)))
to
(note 10 8 11 2 NOTE_INSN_DELETED)
(insn 11 10 12 2 (parallel [
(set (reg:CC 122)
(compare:CC (zero_extract:SI (reg/v:SI 119 [ nStyle ])
(const_int 1 [0x1])
(const_int 16 [0x10]))
(const_int 0 [0x0])))
(clobber (scratch:SI))
]) 157 {*extzvsi_internal1} (insn_list:REG_DEP_TRUE 8 (nil))
(expr_list:REG_UNUSED (scratch:SI)
(nil)))
then ifcvt comes along and produces
IF-THEN block found, pass 1, start block 2 [insn 5], then 3 [14], join 4 [17]
Conversion succeeded on pass 1.
IF-THEN block found, pass 1, start block 2 [insn 5], then 5 [24], join 6 [28]
IF-CASE-2 found, start 2, else 6
deleted 1 dead insns
3 possible IF blocks searched.
1 IF blocks converted.
2 true changes made.
(insn 8 7 10 2 (set (reg/v:SI 119 [ nStyle ])
(reg:SI 3 3)) 321 {*movsi_internal1} (insn_list:REG_DEP_TRUE 7 (nil))
(expr_list:REG_DEAD (reg:SI 3 3)
(nil)))
(note 10 8 20 2 NOTE_INSN_DELETED)
(insn 20 10 21 2 (set (reg:SI 123)
(const_int 98304 [0x18000])) 321 {*movsi_internal1} (nil)
(nil))
split then splits the constant load of reg:SI 123 (!?) so we end up with
main:
stwu %r1,-16(%r1)
mflr %r0
stw %r0,20(%r1)
bl bar
lis %r0,0x1
ori %r0,%r0,32768
cmpw %cr7,%r3,%r0
beq+ %cr7,.L6
bl abort
.L6:
li %r3,0
lwz %r0,20(%r1)
mtlr %r0
addi %r1,%r1,16
blr
and indeed, disabling if-conversion fixes the problem.
--
rguenth at gcc dot gnu dot org changed:
What |Removed |Added
----------------------------------------------------------------------------
Component|target |rtl-optimization
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29797