[LLVMdev] SelectionDAG legality: isel creating cycles

David Greene dag at cray.com
Mon Feb 22 13:48:15 PST 2010

On Monday 22 February 2010 15:44:56 Anton Korobeynikov wrote:
> Hello, David
> > Ah, isLegalToFold saves us on trunk.  But we lose folding due to
> > prefetching, which is unfortunate.
> >
> > I am seeing the error with 2.5 (yes, we are upgrading!).
> >
> > I guess I'll have to backport some of the isLogalToFold logic.
> There was x86-only code at pre-2.6 times which was later moved into
> generic hook named "isLegalAndProfitableToFold". You might want to
> backport just that part.

I found the problem.  It's a bug in 2.5:

/// SelectScalarSSELoad - Match a scalar SSE load.  In particular, we want to
/// match a load whose top elements are either undef or zeros.  The load 
/// is derived from the type of N, which is either v4f32 or v2f64.
bool X86DAGToDAGISel::SelectScalarSSELoad(SDValue Op, SDValue Pred,
                                          SDValue N, SDValue &Base,
                                          SDValue &Scale, SDValue &Index,
                                          SDValue &Disp, SDValue &InChain,
                                          SDValue &OutChain) {
  if (N.getOpcode() == ISD::SCALAR_TO_VECTOR) {
    InChain = N.getOperand(0).getValue(1);
    if (ISD::isNON_EXTLoad(InChain.getNode()) &&
        InChain.getValue(0).hasOneUse() &&
        N.hasOneUse() &&
        // Cray: Bug 757517 (fixed in 2.7, possibly 2.6)
        IsLegalAndProfitableToFold(N.getOperand(0).getNode(), Pred.getNode(), 
Op.getNode())) {

The call used to be:

IsLegalAndProfitableToFold(N.getNode(), Pred.getNode(), Op.getNode()))

so it was checking the wrong thing for legality.

Thanks for the help, everyone!


More information about the llvm-dev mailing list