Author: evancheng Date: Tue Feb 5 16:50:29 2008 New Revision: 46776 URL: http://llvm.org/viewvc/llvm-project?rev=46776&view=rev Log: Fix PR1975: dag isel emitter produces patterns that isel wrong flag result.
Added: llvm/trunk/test/CodeGen/X86/2008-02-05-ISelCrash.ll Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp llvm/trunk/utils/TableGen/DAGISelEmitter.cpp Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp?rev=46776&r1=46775&r2=46776&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp (original) +++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Tue Feb 5 16:50:29 2008 @@ -3183,10 +3183,6 @@ void SelectionDAG::ReplaceAllUsesWith(SDOperand FromN, SDOperand To, DAGUpdateListener *UpdateListener) { SDNode *From = FromN.Val; - // FIXME: This works around a dag isel emitter bug. - if (From->getNumValues() == 1 && FromN.ResNo != 0) - return; // FIXME: THIS IS BOGUS - assert(From->getNumValues() == 1 && FromN.ResNo == 0 && "Cannot replace with this method!"); assert(From != To.Val && "Cannot replace uses of with self"); Added: llvm/trunk/test/CodeGen/X86/2008-02-05-ISelCrash.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/2008-02-05-ISelCrash.ll?rev=46776&view=auto ============================================================================== --- llvm/trunk/test/CodeGen/X86/2008-02-05-ISelCrash.ll (added) +++ llvm/trunk/test/CodeGen/X86/2008-02-05-ISelCrash.ll Tue Feb 5 16:50:29 2008 @@ -0,0 +1,12 @@ +; RUN: llvm-as < %s | llc -march=x86 +; PR1975 + [EMAIL PROTECTED] = external global i64 ; <i64*> [#uses=2] + +define fastcc i32 @ab(i32 %alpha, i32 %beta) nounwind { +entry: + %tmp1 = load i64* @nodes, align 8 ; <i64> [#uses=1] + %tmp2 = add i64 %tmp1, 1 ; <i64> [#uses=1] + store i64 %tmp2, i64* @nodes, align 8 + ret i32 0 +} Modified: llvm/trunk/utils/TableGen/DAGISelEmitter.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/DAGISelEmitter.cpp?rev=46776&r1=46775&r2=46776&view=diff ============================================================================== --- llvm/trunk/utils/TableGen/DAGISelEmitter.cpp (original) +++ llvm/trunk/utils/TableGen/DAGISelEmitter.cpp Tue Feb 5 16:50:29 2008 @@ -305,6 +305,8 @@ std::map<std::string, std::string> VariableMap; // Node to operator mapping std::map<std::string, Record*> OperatorMap; + // Name of the folded node which produces a flag. + std::pair<std::string, unsigned> FoldedFlag; // Names of all the folded nodes which produce chains. std::vector<std::pair<std::string, unsigned> > FoldedChains; // Original input chain(s). @@ -587,8 +589,17 @@ emitCheck(RootName + ".getOpcode() == " + CInfo.getEnumName()); EmitMatchCode(Child, Parent, RootName, ChainSuffix, FoundChain); - if (NodeHasProperty(Child, SDNPHasChain, CGP)) + bool HasChain = false; + if (NodeHasProperty(Child, SDNPHasChain, CGP)) { + HasChain = true; FoldedChains.push_back(std::make_pair(RootName, CInfo.getNumResults())); + } + if (NodeHasProperty(Child, SDNPOutFlag, CGP)) { + assert(FoldedFlag.first == "" && FoldedFlag.second == 0 && + "Pattern folded multiple nodes which produce flags?"); + FoldedFlag = std::make_pair(RootName, + CInfo.getNumResults() + (unsigned)HasChain); + } } else { // If this child has a name associated with it, capture it in VarMap. If // we already saw this in the pattern, emit code to verify dagness. @@ -1105,9 +1116,15 @@ } if (NodeHasOutFlag) { - emitCode("ReplaceUses(SDOperand(N.Val, " + - utostr(NumPatResults + (unsigned)InputHasChain) - +"), InFlag);"); + if (FoldedFlag.first != "") { + emitCode("ReplaceUses(SDOperand(" + FoldedFlag.first + ".Val, " + + utostr(FoldedFlag.second) + "), InFlag);"); + } else { + assert(NodeHasProperty(Pattern, SDNPOutFlag, CGP)); + emitCode("ReplaceUses(SDOperand(N.Val, " + + utostr(NumPatResults + (unsigned)InputHasChain) + +"), InFlag);"); + } NeedReplace = true; } _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits