This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: protect label from being optimized


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]