This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug middle-end/36884] New: ifcvt poor optimization
- From: "hutchinsonandy at gcc dot gnu dot org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 20 Jul 2008 19:44:48 -0000
- Subject: [Bug middle-end/36884] New: ifcvt poor optimization
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
If conversion is causing extraordinary bad code for AVR.
This occurs on 4.3 4.4 is no better.
Testcase:
int z;
int foo2(void)
{
return ( ++z >= 0);
}
Conversion replaces if using store flag. However, there appears to be no
account of relative costs and rather bad interactions with mode narrowing and
widening
After conversion we have:
z++
Extract upper byte of 'z'
Sign extend
One complement
Shift right 15
RTL prior to ce1 pass:
;; Pred edge ENTRY [100.0%] (fallthru)
(note 3 0 2 2 [bb 2] NOTE_INSN_BASIC_BLOCK)
(note 2 3 5 2 NOTE_INSN_FUNCTION_BEG)
(insn 5 2 6 2 test1.c:15 (set (reg:HI 43 [ z ])
(mem/c/i:HI (symbol_ref:HI ("z") <var_decl 0x7fe000b0 z>) [3 z+0 S2
A8])) 10 {*movhi} (nil))
(insn 6 5 7 2 test1.c:15 (set (reg:HI 41 [ z.5 ])
(plus:HI (reg:HI 43 [ z ])
(const_int 1 [0x1]))) 25 {addhi3} (expr_list:REG_DEAD (reg:HI 43 [
z ])
(nil)))
(insn 7 6 8 2 test1.c:15 (set (mem/c/i:HI (symbol_ref:HI ("z") <var_decl
0x7fe000b0 z>) [3 z+0 S2 A8])
(reg:HI 41 [ z.5 ])) 10 {*movhi} (nil))
(insn 8 7 9 2 test1.c:15 (set (reg:HI 44)
(const_int 0 [0x0])) 10 {*movhi} (nil))
(insn 9 8 10 2 test1.c:15 (set (cc0)
(reg:HI 41 [ z.5 ])) 95 {tsthi} (expr_list:REG_DEAD (reg:HI 41 [ z.5 ])
(nil)))
(jump_insn 10 9 25 2 test1.c:15 (set (pc)
(if_then_else (lt (cc0)
(const_int 0 [0x0]))
(label_ref 12)
(pc))) 109 {branch} (expr_list:REG_BR_PROB (const_int 2100 [0x834])
(nil)))
;; End of basic block 2 -> ( 4 3)
;; lr out 28 [r28] 32 [__SP_L__] 34 [argL] 44
;; live out 28 [r28] 32 [__SP_L__] 34 [argL] 44
RTL after ce1:
(note 2 3 5 2 NOTE_INSN_FUNCTION_BEG)
(insn 5 2 6 2 test1.c:15 (set (reg:HI 43 [ z ])
(mem/c/i:HI (symbol_ref:HI ("z") <var_decl 0x7fe000b0 z>) [3 z+0 S2
A8])) 10 {*movhi} (nil))
(insn 6 5 7 2 test1.c:15 (set (reg:HI 41 [ z.5 ])
(plus:HI (reg:HI 43 [ z ])
(const_int 1 [0x1]))) 25 {addhi3} (expr_list:REG_DEAD (reg:HI 43 [
z ])
(nil)))
(insn 7 6 8 2 test1.c:15 (set (mem/c/i:HI (symbol_ref:HI ("z") <var_decl
0x7fe000b0 z>) [3 z+0 S2 A8])
(reg:HI 41 [ z.5 ])) 10 {*movhi} (nil))
(insn 8 7 9 2 test1.c:15 (set (reg:HI 44)
(const_int 0 [0x0])) 10 {*movhi} (nil))
(insn 9 8 35 2 test1.c:15 (set (cc0)
(reg:HI 41 [ z.5 ])) 95 {tsthi} (expr_list:REG_DEAD (reg:HI 41 [ z.5 ])
(nil)))
(insn 35 9 36 2 test1.c:15 (set (reg:QI 49)
(subreg:QI (reg:HI 41 [ z.5 ]) 1)) 4 {*movqi} (nil))
(insn 36 35 37 2 test1.c:15 (set (reg:HI 48)
(sign_extend:HI (reg:QI 49))) 84 {extendqihi2} (nil))
(insn 37 36 38 2 test1.c:15 (set (reg:HI 50)
(not:HI (reg:HI 48))) 82 {one_cmplhi2} (nil))
(insn 38 37 32 2 test1.c:15 (set (reg:HI 44)
(lshiftrt:HI (reg:HI 50)
(const_int 15 [0xf]))) 71 {lshrhi3} (nil))
(insn 32 38 33 2 test1.c:16 (set (reg:QI 24 r24)
(subreg:QI (reg:HI 44) 0)) 4 {*movqi} (nil))
(insn 33 32 23 2 test1.c:16 (set (reg:QI 25 r25 [+1 ])
(subreg:QI (reg:HI 44) 1)) 4 {*movqi} (expr_list:REG_DEAD (reg:HI 44)
(nil)))
Final (annotated) code:
22 /* prologue: frame size=0 */
23 /* prologue end (size=0) */
24 .LM2:
25 0000 8091 0000 lds r24,z
26 0004 9091 0000 lds r25,(z)+1
27 0008 0196 adiw r24,1
28 000a 9093 0000 sts (z)+1,r25
29 000e 8093 0000 sts z,r24
30 0012 892F mov r24,r25
31 0014 9927 clr r25 ;SIGN EXTEND
32 0016 87FD sbrc r24,7 ;ditto
33 0018 9095 com r25 ; ditto
34 001a 8095 com r24 ; ONE'SCOMPLEMENT
35 001c 9095 com r25 ; ditto
36 .LM3:
37 001e 8827 clr r24 ;LSHIFT 15
38 0020 990F lsl r25 ; ditto
39 0022 881F rol r24 ; ditto
40 0024 9927 clr r25 ; ditto
41 /* epilogue: frame size=0 */
42 0026 0895 ret
--
Summary: ifcvt poor optimization
Product: gcc
Version: 4.3.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: middle-end
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: hutchinsonandy at gcc dot gnu dot org
GCC target triplet: avr-unknown-none
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=36884