[LLVMdev] alias-aware scheduling

Dan Gohman djg at cray.com
Tue Dec 19 16:40:08 PST 2006

On Tue, Dec 19, 2006 at 01:31:10PM -0800, Evan Cheng wrote:
> On Dec 19, 2006, at 12:13 PM, Dan Gohman wrote:
> > Hello,
> >
> > I did a little experiment modifying LLVM to be able to use alias- 
> > analysis
> > information in scheduling so that independent memory operations may be
> > reordered.
> I am not sure if it is a good idea to do this at scheduling time.  
> LLVM explicitly models control flows dependencies as chain operands.   
> This eliminated the need to do a separate edge drawing pass before  
> scheduling.
> As you have seen there is transformations in dag combiner to  
> eliminate the unnecessary chain operands. It's not turned on by  
> default. Are you not getting satisfactory results by turning it on?

Oh, I see now that I misunderstood what the DAGCombiner was doing. The patch
I posted attempts to avoid unnecessary chain operands during the construction
of the DAG, while the DAGCombiner code works by cleaning up chain operands in
a separate pass. It looks like the end result is pretty similar.

> > Attached is a patch which implements this. I copied some routines from
> > DAGCombiner.cpp for using SDOperands with alias queries; it should
> > probably be factored out somewhere so the code can be shared. I
> > reorganized SelectionDAGLowering::getLoadFrom a little, to make it
> > simpler to use in other contexts.
> >
> > Also, the patch fixes a bug where SelectionDAG::getLoad and
> > SelectionDAG::getStore were being called with the wrong arguments,  
> > with
> > a default argument helping to hide it.
> Can you be more specific about what the bugs are?

Sure. SelectionDAG::getStore and getLoad are declared like this:

  SDOperand getLoad(MVT::ValueType VT, SDOperand Chain, SDOperand Ptr,
                    const Value *SV, int SVOffset, bool isVolatile=false);

  SDOperand getStore(SDOperand Chain, SDOperand Val, SDOperand Ptr,
                     const Value *SV, int SVOffset, bool isVolatile=false);

In SelectionDAGISel.cpp in SelectionDAGLowering::getLoadFrom and 
SelectionDAGLowering::visitStore they are called like this:

    L = DAG.getLoad(TLI.getValueType(Ty), Root, Ptr, SV, isVolatile);

  DAG.setRoot(DAG.getStore(getRoot(), Src, Ptr, I.getOperand(1),

The isVolatile arguments are being passed to the SVOffset parameters.


Dan Gohman, Cray Inc. <djg at cray.com>

More information about the llvm-dev mailing list