Hi,

I'm porting gcc 4.5.2 on a private processor.
I encountered a problem concerning delay slots of conditionnal branch 
instructions (Note : the processor has no 'annuled jump strategy')

Here is my delay slot definition :

     (define_delay (eq_attr "type" "jump")
       [(and (eq_attr "delayable" "yes") (eq_attr "length" "1")) (nil) (nil)])



Here is a sample of erroneous code :


        sub 0,$R5,$R1           #compare $R5 to 0 ($R1 is clobbered)
        jmpd.ifCC .L0            #conditionnal delayed branch followed by 1 
delay slot
        sub $R0,$R4,$R0      #compare $R4 to $R0 ($R0 is clobbered)             
   <<<< problem
       ...
        addk 1,$R0,$R0        #increment $R0,   but $R0 was modified by 'sub 
$R0,$R4,$R0' !!!
       ...
   .L0:
        bra.ifLS __chk_fail    #conditionnal call symbol_ref
        

GCC put my compare insn 'sub $R0,$R4,$R0' into the delay slot knowing that $R0 
was clobbered by the compare insn (see the definition below).
It's ok if 'jmpd.ifCC .L7' jumps otherwize it's ko because $R0 is used in the 
fall-through path by 'addk 1,$R0,$R0'.



Here is my compare insn :

     (define_insn "compare"
       [(set (reg:CC CCI_REG)
             (compare:CC
               (match_operand:SI 1 "general_operand"    "g ")
               (match_operand:SI 2 "general_operand"    "g")))
        (clobber (match_operand:SI 0 "register_operand" "=r "))]
       "sub %2,%1,%0"
      [(set_attr "length" "1")
      (set_attr " delayable " "yes")]
     )


I was expecting 'instruction reorganization pass' to produce the following code 
:

        sub 0,$R5,$R1           #compare $R5 to 0 ($R1 is clobbered)
        jmp.ifCC .L0              #conditionnal delayed branch (with 0 delay 
slot)
        ...
        addk 1,$R0,$R0        #increment $R0
        ...
   .L0:
        sub $R0,$R4,$R0       #compare $R4 to $R0 ($R0 is clobbered)
        bra.ifLS __chk_fail    #conditionnal call symbol_ref



Why GCC doesn't see, in this case, that it's not safe to fill the delay slot 
with my compare insn (which is a parallel RTX which clobber one register used 
in fallthrough branch) ?
Is a processor 'annuled jump strategy' mandatory to handle delay slot of 
conditionnal jump instructions ?


   Regards,


Selim Belbachir

Reply via email to