[PATCH] RemapValue() assert during type legalisation
Hal Finkel
hfinkel at anl.gov
Tue Jul 9 09:00:18 PDT 2013
Richard,
I've found that your patch only fixes some of my test cases hitting this assertion. I've uploaded another three examples to:
http://llvm.org/bugs/show_bug.cgi?id=16562
-Hal
----- Original Message -----
> Richard,
>
> I've just opened http://llvm.org/bugs/show_bug.cgi?id=16562 -- and
> thanks to Duncan for pointing out that this is a duplicate of this
> bug (and, indeed, fixed by your patch). So now we have a PPC test
> case too.
>
> + /// NeWNodes must not appear as targets of ReplacedValues.
> (I assume that you meant to write NewNodes not NeWNodes)
>
> FWIW, this does seem reasonable to me. Owen?
>
> -Hal
>
> ----- Original Message -----
> > In this testcase, lovingly reduced from a large llvmpipe one, we
> > abort
> > during type legalisation in DAGTypeLegalizer::RemapValue():
> >
> > void DAGTypeLegalizer::RemapValue(SDValue &N) {
> > DenseMap<SDValue, SDValue>::iterator I = ReplacedValues.find(N);
> > if (I != ReplacedValues.end()) {
> > // Use path compression to speed up future lookups if values
> > get
> > multiply
> > // replaced with other values.
> > RemapValue(I->second);
> > N = I->second;
> > assert(N.getNode()->getNodeId() != NewNode && "Mapped to new
> > node!");
> > }
> > }
> >
> > What seems to be happening is that for one particular node
> > replacement in
> > DAGTypeLegalizer::ReplaceValueWith():
> >
> > DAG.ReplaceAllUsesOfValueWith(From, To);
> >
> > there are two nodes N1 and N2 whose operands are CSEd, but which
> > themselves
> > remain unique. These nodes are marked "new" and are added to the
> > NodesToAnalyze worklist:
> >
> > virtual void NodeUpdated(SDNode *N) {
> > // Node updates can mean pretty much anything. It is
> > possible
> > that an
> > // operand was set to something already processed (f.e.) in
> > which case
> > // this node could become ready. Recompute its flags.
> > assert(N->getNodeId() != DAGTypeLegalizer::ReadyToProcess &&
> > N->getNodeId() != DAGTypeLegalizer::Processed &&
> > "Invalid node ID for RAUW deletion!");
> > N->setNodeId(DAGTypeLegalizer::NewNode);
> > NodesToAnalyze.insert(N);
> > }
> >
> > As it happens, N1 is the target of a ReplacedValues replacement.
> >
> > Later during this same replacement, there is a node N3 that is CSEd
> > to N4.
> > N4 is a NewNode at address A, and the previous (deleted)
> > incarnation
> > of
> > the node at address A is still mapped by ReplacedValues. So when
> > NodeUpdateListener::NodeDeleted() sees the N3->N4 replacement,
> > it indirectly calls ExpungeNode(N4) to flush out the stale data.
> > However, ExpungeNode calls:
> >
> > RemapValue(I->second);
> >
> > on _all_ entries in ReplacedValues, including the one that maps to
> > N1,
> > even though that entry is not related to A. (Which is fair enough.
> > It can't really know in advance which are related to A and which
> > aren't.)
> > We then assert because N1 was marked NeWNode before being added to
> > the
> > worklist, but hasn't been processed yet.
> >
> > Question is, what's the right fix? The comment at the top of the
> > file says:
> >
> > // The final node obtained by mapping by ReplacedValues is not
> > marked NewNode.
> >
> > but it also says:
> >
> > // Note that these invariants may not hold momentarily when
> > processing a node:
> >
> > which seems to be the case here. I'm not sure whether the assert
> > has
> > really found a bug or not.
> >
> > The patch below avoids asserting for nodes in the
> > ReplaceValueWith()
> > worklist, but at the cost of making the worklist a member of
> > DAGTypeLegalizer.
> >
> > I made the test force s390x-linux-gnu because the test won't fail
> > on
> > targets where the vector types are legal. The test also seems very
> > sensitive to the order of node reuse.
> >
> > What do you think? Is this the right fix, or is the assert
> > expected
> > to hold even in this situation?
> >
> > Thanks,
> > Richard
> >
> >
> >
> > _______________________________________________
> > llvm-commits mailing list
> > llvm-commits at cs.uiuc.edu
> > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
> >
>
> --
> Hal Finkel
> Assistant Computational Scientist
> Leadership Computing Facility
> Argonne National Laboratory
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
--
Hal Finkel
Assistant Computational Scientist
Leadership Computing Facility
Argonne National Laboratory
More information about the llvm-commits
mailing list