This is the mail archive of the
gcc-help@gcc.gnu.org
mailing list for the GCC project.
[CR16] Improper register allocation
- From: "Jayant R. Sonar" <Jayant dot Sonar at kpitcummins dot com>
- To: "gcc-help at gcc dot gnu dot org" <gcc-help at gcc dot gnu dot org>
- Date: Sat, 19 Nov 2011 15:36:58 +0000
- Subject: [CR16] Improper register allocation
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?
Thanks and Regards,
Jayant Sonar
[KPIT Cummins, Pune]