[LLVMdev] Question on selection DAG

Evan Cheng evan.cheng at apple.com
Thu Feb 18 18:12:49 PST 2010


There are two ways to enforce ordering. One is to make use of MVT::Flag operands, the other is to isel to a pseudo opcode which is expanded into a series of machine instructions at the end of pre-regalloc scheduling.

Evan

On Feb 18, 2010, at 3:57 PM, Manjunath Kudlur wrote:

> Hello,
> 
> I want to have an operation foo with variable number of operands, and
> I am trying to achieve it using multiple operations. Let's say I want
> to have [FOO r1, r2], I am constructing the DAG as follows :
> 
> consumeArg(r1) -> consumeArg(r2) ->  FOO -> arg(r1) -> arg(r2)
> 
> Note that the arrows are all "Chain"s. I need to have consumeArg(r1)
> because, I don't want the producer of r1 to be scheduled between FOO
> and arg(r1). Similarly I need to have consumeArg(r2). However, I am
> not able to prevent some unrelated operation from getting scheduled
> between FOO and arg(r1). If BAR1 and BAR2 are unrelated operations,
> the following is a legal schedule :
> 
> consumeArg(r1)
> consumeArg(r2)
> FOO
> BAR1
> arg(r1)
> BAR2
> arg(r2)
> 
> This leads to illegal assembly program because the assembler expects
> FOO r1, r2 to appear together.
> How can I make the subgraph FOO->arg(r1)->arg(r2) be always scheduled
> as a group, i.e., prevent unrelated ops from getting scheduled in
> between?
> 
> Thanks,
> Manjunath
> _______________________________________________
> LLVM Developers mailing list
> 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