This is the mail archive of the
gcc-help@gcc.gnu.org
mailing list for the GCC project.
Re: [CR16] Improper register allocation
- From: Ian Lance Taylor <iant at google dot com>
- To: "Jayant R. Sonar" <Jayant dot Sonar at kpitcummins dot com>
- Cc: "gcc-help\ at gcc dot gnu dot org" <gcc-help at gcc dot gnu dot org>
- Date: Sat, 19 Nov 2011 09:05:05 -0800
- Subject: Re: [CR16] Improper register allocation
- References: <C013F7BFDC93F047B111833D343777BD17A50D1E@KCHJEXMB01.kpit.com>
"Jayant R. Sonar" <Jayant.Sonar@kpitcummins.com> writes:
> I am working on CR16 port.
>
> Found an improper code is being generated for following part of the test
> code:
> ============================================================================
> IeData = (void *) RAlloc(DataLen);
> LAHType* p = (LAHType*)IeData;
>
> ReadFH (DpEntry, &FeData, &p->Table, &p->Masked, &p->NumAH, &p->Len, TData);
> ============================================================================
>
> Arguments are pushed on to the stack from right to left direction.
> Possible working assembly that could be generated for this code:
> Case 1:
> ================================================================
> bal (ra), _RAlloc@c
> stord (r1,r0), 32(sp)
> addd $-2, (sp)
> .LCFI547:
> movd $18, (r7,r6)
> addd (sp), (r7,r6)
> push $2,r6
> .LCFI548:
> addd $3, (r1,r0)
> push $2,r0
>
> OR lesser optimized code could be:
> Case 2:
> ============================================================
> bal (ra), _RAlloc@c
> stord (r1,r0), 32(sp)
> addd $-2, (sp)
> .LCFI547:
> movd $18, (r7,r6)
> addd (sp), (r7,r6)
> push $2,r6
> .LCFI548:
> loadd 32(sp), (r1,r0)
> addd $3, (r1,r0)
> push $2,r0
>
> However, I am getting following code:
> ============================================================
> bal (ra), _RAlloc@c
> stord (r1,r0), 20(sp)
> addd $-2, (sp)
> .LCFI547:
> movd $18, (r2,r1)
> addd (sp), (r2,r1)
> push $2,r1
> .LCFI548:
> addd $3, (r1,r0) <<============== PROBLEM
> push $2,r0
>
> 'R1' being the part of first push already has some value in it. So before
> next push, either (r1,r0) should be loaded with new address value as shown
> in Case 2. Otherwise, as in Case 1, different register pairs should be used
> for these two push operations.
>
> CR16 port did not have REG_ALLOC_ORDER defined.
> I am trying to control register allocation order using this. However, it
> looks like this sequence has to be decided very carefully as slightest of
> the alternation in sequence are causing some or other application failures.
>
> Is there any other way, I could address this problem?
I don't know this syntax. Are you saying that the instruction
push $2,r1
modifies r1? Or are you saying that that the instruction
addd $3, (r1,r0)
may modify r1, and therefore must be executed before the push
instruction?
Either way, REG_ALLOC_ORDER is not an issue here. You need to look at
the RTL dumps. See whether the original call sequence in the first RTL
dump is valid, using pseudo-registers. Then find out where it becomes
invalid.
One thing to consider is whether the push instruction is particularly
efficient on your processor. If it is not--if it is comparable to a mov
instruction to an offset from sp--then consider defining
ACCUMULATE_OUTGOING_ARGS rather than PUSH_ARGS. Most processors get
more efficient code from ACCUMULATE_OUTGOING_ARGS.
Ian