[LLVMdev] Remove redundant code after frame index elimination
Ivan Llopard
ivanllopard at gmail.com
Mon Feb 13 02:22:05 PST 2012
Hello again,
I checked the sparc BE and I've seen that it adds also some MI when it
eliminates FI references. Nevertheless, the testcase is very rare and it
hardly happens in real applications but it can describe my problem.
void test() {
short a1;
...
short a6003;
a6000 = 2;
a6000 = 3;
}
sethi 4194292, %g1
or %g1, 184, %g1
save %sp, %g1, %sp
or %g0, 2, %l0
sethi 4194292, %g1
add %g1, %fp, %g1
sth %l0, [%g1+288]
or %g0, 3, %l0
sethi 4194292, %g1
add %g1, %fp, %g1
sth %l0, [%g1+288]
jmp %i7+8
restore %g0, %g0, %g0
Before the 2nd STH instruction, redundant code is added by the FI
elimination routine (%g1 was already defined with the same value). My
target does not have an addressing mode to represent fp + offset, so I
need to store the result in an intermediate register to access the memory.
It seems to me that the FI abstract model implies an indexed absolute
addressing support provided by the target.
Do I need to rely in early optimizations phases to avoid this kind of
cases ? or, Is there a way to lower the FI node to extract its offset
and write an explicit add operation ?
I found that at the target lowering phase, no FI offset is represented
for different variables (it's just a slot). It's defined at the FI
elimination phase though. I could not find a way to lower it because of
that.
Please, any help would be appreciated.
Regards,
Ivan
Le 10/02/2012 13:47, Ivan Llopard a écrit :
> Hi list,
>
> I added custom code to eliminate frame index references. I replace
> each FI reference with a subtraction from my frame pointer register
> (just like ebp in x86). Its result is stored in another register which
> is used by the load/store instructions. Nevertheless, this operation
> gives me redundant subs that I would like to remove after all fi
> references have been eliminated. For example:
>
> r = load fi<1> -->
> {
> sp = subm fi, cst_offset
> r = load sp
> }
> ...
> store fi<1>, val -->
> {
> sp = subm fi, cst_offset
> store sp, val
> }
>
> Any advice on what is the better solution to remove that code ? Should
> I create a custom pass after the prolog/epilog insertion one ?
>
> Ivan
More information about the llvm-dev
mailing list