[LLVMdev] matching "ret 0"

Chris Lattner sabre at nondot.org
Tue May 16 20:22:00 PDT 2006


On Tue, 16 May 2006, [UTF-8] Rafael Esp?ndola wrote:
> Or any tips for debugging instruction selection?

The most important thing that you can do, is to set up graphviz on your 
system, to allow you to visualize graphs:
http://llvm.org/docs/ProgrammersManual.html#ViewGraph

Once you have that, you can pass -view-legalize-dags, -view-isel-dags, and 
-view-sched-dags to llc to see the dags at various points in time.  To 
debug isel problems, -view-isel-dags should do it.

> I am trying to make the ARM backend compile
>
> int f() {return 0;}
>
> I have added a custom expansion of ret that is similar to the one used
> in ppc and sparc. If I understand it correctly, it will expand the ret
> into an assignment to the return register (R0) and a RETFLAG node.
>
> I declared the bx instruction to match RETFLAG.

Ok.

> Now the instruction selection says it can't match "
> i32 = Constant <0>"
>
> I tried to declare a fake mov that is capable of moving arbitrary i32
> constants to a register (ops IntRegs:$dst, i32imm:$src). But the error
> is still the same.
>
> Does anyone has a suggestion on what the problem might be?

It's most likely that your move doesn't have a pattern.  In particular, in 
addition to specifying the operands, you also need to specify what what 
opcode does.  In this case, a pattern like the X86 MOV32ri instruction is 
probably what you want:

   [(set GR32:$dst, imm:$src)]

Of course, replace GR32/IntRegs as appropriate.

-Chris

-- 
http://nondot.org/sabre/
http://llvm.org/




More information about the llvm-dev mailing list