[LLVMdev] problem trying to write an LLVM register-allocation pass
Susan Horwitz
horwitz at cs.wisc.edu
Wed Oct 31 15:54:06 PDT 2012
Thanks Lang!
Here's another question: I'm trying to process this input:
int main() {
return 0;
}
but I'm getting an error
Assertion `!Fn.getRegInfo().getNumVirtRegs() && "Regalloc must assign
all vregs"' failed.
At the start of runOnMachineFunction I call
Fn.getRegInfo().getNumVirtRegs();
and find that there is 1 virtual register. However, MRI->reg_empty(vreg)
tells me that it is not used or defined. So my register-allocation code
never sees it, and thus can't allocate a preg for it. I tried using
MRI->replaceRegWith(vreg, preg);
(where preg is available to vreg's register class) but that didn't work.
When I look, the number of vregs in the function is still 1.
Can you help with this?
Thanks again!
Susan
On 10/31/2012 04:55 PM, Lang Hames wrote:
> Hi Susan,
>
> The meaning of "addRequired(X)" is that your pass needs X to be run, and
> for X to be preserved by all passes that run after X and before your
> pass. The PHIElemination and TwoAddressInstruction passes do not
> preserve each other, hence there's no way for the pass manager to
> schedule them for you if you addRequire(...) them.
>
> The trick is that CodeGen will schedule both of these passes to be run
> before _any_ register allocation pass (see Passes.cpp), so you needn't
> require them explicitly - you can just assume they have been run. If you
> just remove those lines from your getAnalysisUsage method your pass
> should now run as you expect.
>
> Cheers,
> Lang.
>
> On Wed, Oct 31, 2012 at 1:46 PM, Susan Horwitz <horwitz at cs.wisc.edu
> <mailto:horwitz at cs.wisc.edu>> wrote:
>
> I'm trying to write a MachineFunctionPass to do register allocation.
> I have code that worked with an old version of LLVM. It does not
> work with llvm-3.1. (or various other versions that I've tried).
>
> The first problem is that including this line:
>
> AU.addRequiredID(__TwoAddressInstructionPassID);
>
> in method getAnalysisUsage causes a runtime error:
>
> Unable to schedule 'Eliminate PHI nodes for register allocation'
> required by 'Unnamed pass: implement Pass::getPassName()'
> Unable to schedule pass
> UNREACHABLE executed at ...
>
> I'm invoking the pass like this (given input file foo.c):
>
> clang -emit-llvm -O0 -c foo.c -o foo.bc
> opt -mem2reg foo.bc > foo.ssa
> mv foo.ssa foo.bc
> llc -load Debug/lib/P4.so -regalloc=gc foo.bc
>
>
> I've attached my entire file (it's very short). Any help would be
> much appreciated!
>
> Susan Horwitz
>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu <mailto:LLVMdev at cs.uiuc.edu> http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>
>
More information about the llvm-dev
mailing list