protect label from being optimized

Kunal Parmar kunalparmar@gmail.com
Fri Apr 18 19:44:00 GMT 2008


Hi Jim,

 >>> But my return label is getting optimized away. Could you please tell
 >>> me how to avoid this.
 >
 >You may also need to add a (USE (REG RA)) to the call pattern.  Gcc 
will see that you set a register to the value of the
 >return label, but it won't see any code that uses that register, so it 
will optimize away both the load and the label.  To
 >prevent this, you need to add an explicit use of that register to the 
call insn pattern.

I have that.. :). Here  is the pattern for the call_insn produced.

(define_insn "brc_call_simulate"
  [(call (mem:HI (match_operand 0 "register_operand" "r"))
     (match_operand 1 "" "i"))
   (use (reg:HI 7))
   (clobber (reg:HI 7))]
  ""
  "jr\t%0")

But GCC is not optimizing the load away. Its just the the return label 
that gets optimized away.

CMIIW, I think the problem is this :
1. The label output is local to this function
2. The label creates a new basic block. There is no jump to this label. 
As a result, there is only
one incoming edge to this block and that is the fall through edge after 
the return from the call.
3. As a result, GCC tries to merge those two blocks and in the process 
removes the label.

How do I prevent this ?

Thanks in advance,
Kunal



More information about the Gcc mailing list