This is the mail archive of the
gcc-help@gcc.gnu.org
mailing list for the GCC project.
RE: Unable to remove pipeline stalls
> -----Original Message-----
> From: Ian Lance Taylor [mailto:iant@google.com]
> Sent: 18 July 2012 19:48
> To: Deepti Sharma
> Cc: gcc-help@gcc.gnu.org
> Subject: Re: Unable to remove pipeline stalls
>
> On Wed, Jul 18, 2012 at 2:19 AM, Deepti Sharma
<deepti.gccretarget@gmail.com>
> wrote:
> >
> > I am facing one issue with pipeline stalls. My compiler generates
> > below
> > assembly:
> > MOVE AR2, _rec2
> > MOVE AR0, _rec1
> > MOVE R3, (AR2)+ //Writes to R3
> > MOVE (AR0)+, R3 //Reads from R3; Stall Created MOV AR1, AR0 MOV
> > AR0, AR2 MOVE R2, (AR0)+ // MOVE (AR1)+, R2 // stall MOVE R1,
> > (AR0)+ // MOVE (AR1)+, R1 // stall MOVE R0, (AR0,0) MOVE (AR1,0),
> > R0 //stall
>
> ...
>
> > ;; ======================================================
> > ;; -- basic block 2 from 7 to 20 -- before reload
> > ;; ======================================================
> >
> > ;; 0--> 7 r62=`r1'
> > ;; 1--> 8 r63=`r2' :UNIT3
> > ;; 2--> 11 [r62++]=[r63++] :UNIT1|UNIT2
> > ;; 3--> 12 r65=r62 :UNIT4
> > ;; 4--> 13 r64=r63 :UNIT4
> > ;; 5--> 14 [r65++]=[r64++] :UNIT1|UNIT2
> > ;; 6--> 17 [r65++]=[r64++] :UNIT1|UNIT2
> > ;; 7--> 20 [r65]=[r64] :UNIT1|UNIT2
> >
> > Any pointers for this issue will be helpful.
>
> I don't understand how insns like [r65++]=[r64++] correspond to the
> assembler instruction sequence you show above. Do you have a
> define_split in there that only happens after reload is complete?
> Perhaps you need to be looking at the scheduler dump after reload,
> which is to say the one from -fschedule-insns2.
I have also checked the sched2 dump, which comes as:
;; ======================================================
;; -- basic block 2 from 8 to 27 -- after reload
;; ======================================================
;; 0--> 8 call <...>
;; 1--> 12 AR0=`r1'
;; 2--> 41 AR2=`r2'
;; 3--> 13 AR1=[AR0]
;; 4--> 15 AR0=[AR2]
;; 5--> 43 R4=[AR0++]
;; 6--> 18 [AR1++]=R4 //Stall
;; 7--> 44 R5=[AR0++]
;; 8--> 21 [AR1++]=R5 //Stall
;; 9--> 45 R6=[AR0++]
;; 10--> 24 [AR1++]=R6
;; 11--> 46 R7=[AR0]
;; 12--> 27 [AR1]=R7
As we see above, the scheduler is not able to reschedule the instructions to
remove stalls.
I understand that the removal of stalls is performed by scheduler-pass1
(sched1).
However, since the scheduler1 is receiving the instruction as a single
instruction "[r62++]=[r63++]",
it does not know that it is later broken down into two MOVE operations.
I don't have a define_split pattern for MOVE. I have a define_expand, like
below:
(define_expand "movsi"
[(set (match_operand:SI 0 "nonimmediate_operand" "")
(match_operand:SI 1 "general_operand" ""))]
""
"
{
if ((GET_CODE (operands[1]) == CONST_INT) ) ||
((GET_CODE (operands[1]) == LABEL_REF) || (GET_CODE (operands[1]) ==
SYMBOL_REF)))
{
if (register_operand(operands[0],SImode))
{
emit_insn (gen_movsi_high (operands[0], operands[1]));
DONE;
}
else if (!(reload_in_progress || reload_completed))
{
rtx REG1 = gen_reg_rtx(SImode);
emit_insn (gen_movsi_high (REG1, operands[1]));
emit_insn (gen_movsi_lo_sum (REG1, REG1, operands[1]));
emit_insn(gen_rtx_SET(SImode, operands[0], REG1));
DONE;
}
else FAIL;
}
}")
(define_insn "*movsi"
[(set (match_operand:SI 0 "nonimmediate_operand" "=z,z,x,x, xz,co1 ")
(match_operand:SI 1 "general_operand" " z,x,z,x, co1,xz "))]
""
"@
MOV %0, %1
MOVE %0, %1
MOVE %0, %1
MOVE %0, %1
MOVE %0, %1
MOVE %0, %1"
[(set_attr "ATTR1" "mem1, mem1, mem1, mem1, mem1, mem1")
(set_attr "ATTR2" "none, op1, op1, op1, op2, op1")])
-- Deepti