Hi All ,

The following C  code snippet

unsigned char c ;
int d ;

int test ()
{
 d = c;
return d;
}

below is the RTL without optimisation enabled

(insn 6 5 0 (set (reg:QI 18 [ c.0 ])

        (mem/c:QI (symbol_ref:HI ("c")  <var_decl 0xb73a50b8 c>) [0
c+0 S1 A8])) cnv.c:5 -1

     (nil))


(insn 7 6 8 (set (reg:QI 19)

        (const_int 0 [0])) cnv.c:5 -1

     (nil))



(insn 8 7 0 (set (reg:HI 19 [ d.1 ])

        (subreg:HI (reg:QI 18 [ c.0 ]) 0)) cnv.c:5 -1

     (expr_list:REG_EQUAL (zero_extend:HI (reg:QI 18 [ c.0 ]))

        (nil)))



(insn 9 8 0 (set (mem/c:HI (symbol_ref:HI ("d")  <var_decl 0xb73a5114
d>) [0 d+0 S2 A16])

        (reg:HI 19 [ d.1 ])) cnv.c:5 -1

     (nil))



(insn 10 9 0 (set (reg:HI 20 [ D.1323 ])

        (mem/c:HI (symbol_ref:HI ("d")  <var_decl 0xb73a5114 d>) [0
d+0 S2 A16])) cnv.c:6 -1

     (nil))

and  respective ASM

ld      C, (c)
ld      B, 0
ld      (d), BC
ld      WA, (d)
ret


But problem arises when i enabled the optimisation -O3 ( with -da)  .

RTL is expanded  as show above, but after subreg pass(*.subreg)   we
see the below RTL


(note 4 0 3 2 [bb 2] NOTE_INSN_BASIC_BLOCK)

(note 3 4 8 2 NOTE_INSN_FUNCTION_BEG)

(insn 8 3 9 2 (set (mem/c:HI (symbol_ref:HI ("d")  <var_decl
0xb7356114 d>) [2 d+0 S2 A16])

        (reg:HI 19 [ d.1 ])) cnv.c:5 9 {*movhi}

     (nil))

(insn 9 8 13 2 (set (reg:HI 20 [ <retval> ])

        (reg:HI 19 [ d.1 ])) cnv.c:6 9 {*movhi}

     (nil))

(insn 13 9 16 2 (set (reg/i:HI 0 W)

        (reg:HI 20 [ <retval> ])) cnv.c:7 9 {*movhi}

     (nil))

(insn 16 13 0 2 (use (reg/i:HI 0 W)) cnv.c:7 -1

     (nil))

;;  su

and respective asm emited as


ld      C, (c)
ld      (d), BC ;This is invalid  since B can have a clobbered value
ld      WA, (d)
ret

Would like know there exist any target hook to surpass the above
optimization so that i ended up emitting valid instructions.

Any lights on the above problem is appreciated .

Thanks in advance
~Umesh

Reply via email to