From d69c3141ed6d237ad19fdfbfcef8901491b24c2e Mon Sep 17 00:00:00 2001 From: Bill Wendling Date: Fri, 30 Jan 2009 02:23:43 +0000 Subject: [PATCH] - Propagate debug loc info in combineSelectAndUse(). - Modify ReassociateOps so that the resulting SDValue is what the comment claims it is. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@63365 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/CodeGen/SelectionDAG.h | 23 +++++++++++--- lib/CodeGen/SelectionDAG/DAGCombiner.cpp | 39 ++++++++++++++---------- 2 files changed, 42 insertions(+), 20 deletions(-) diff --git a/include/llvm/CodeGen/SelectionDAG.h b/include/llvm/CodeGen/SelectionDAG.h index 6b09a745c33..895285c7484 100644 --- a/include/llvm/CodeGen/SelectionDAG.h +++ b/include/llvm/CodeGen/SelectionDAG.h @@ -487,7 +487,12 @@ public: /// SDValue getSetCC(MVT VT, SDValue LHS, SDValue RHS, ISD::CondCode Cond) { - return getNode(ISD::SETCC, VT, LHS, RHS, getCondCode(Cond)); + return getNode(ISD::SETCC, DebugLoc::getUnknownLoc(), VT, + LHS, RHS, getCondCode(Cond)); + } + SDValue getSetCC(DebugLoc DL, MVT VT, SDValue LHS, SDValue RHS, + ISD::CondCode Cond) { + return getNode(ISD::SETCC, DL, VT, LHS, RHS, getCondCode(Cond)); } /// getVSetCC - Helper function to make it easier to build VSetCC's nodes @@ -495,7 +500,12 @@ public: /// SDValue getVSetCC(MVT VT, SDValue LHS, SDValue RHS, ISD::CondCode Cond) { - return getNode(ISD::VSETCC, VT, LHS, RHS, getCondCode(Cond)); + return getNode(ISD::VSETCC, DebugLoc::getUnknownLoc(), VT, + LHS, RHS, getCondCode(Cond)); + } + SDValue getVSetCC(DebugLoc DL, MVT VT, SDValue LHS, SDValue RHS, + ISD::CondCode Cond) { + return getNode(ISD::VSETCC, DL, VT, LHS, RHS, getCondCode(Cond)); } /// getSelectCC - Helper function to make it easier to build SelectCC's if you @@ -503,8 +513,13 @@ public: /// SDValue getSelectCC(SDValue LHS, SDValue RHS, SDValue True, SDValue False, ISD::CondCode Cond) { - return getNode(ISD::SELECT_CC, True.getValueType(), LHS, RHS, True, False, - getCondCode(Cond)); + return getNode(ISD::SELECT_CC, DebugLoc::getUnknownLoc(), True.getValueType(), + LHS, RHS, True, False, getCondCode(Cond)); + } + SDValue getSelectCC(DebugLoc DL, SDValue LHS, SDValue RHS, + SDValue True, SDValue False, ISD::CondCode Cond) { + return getNode(ISD::SELECT_CC, DL, True.getValueType(), + LHS, RHS, True, False, getCondCode(Cond)); } /// getVAArg - VAArg produces a result and token chain, and takes a pointer diff --git a/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index 2947794e919..2c1db2f710e 100644 --- a/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -485,10 +485,10 @@ SDValue DAGCombiner::ReassociateOps(unsigned Opc, DebugLoc DL, if (N0.getOpcode() == Opc && isa(N0.getOperand(1))) { if (isa(N1)) { // reassoc. (op (op x, c1), c2) -> (op x, (op c1, c2)) - SDValue OpNode = DAG.getNode(Opc, N0.getDebugLoc(), VT, + SDValue OpNode = DAG.getNode(Opc, N1.getDebugLoc(), VT, N0.getOperand(1), N1); AddToWorkList(OpNode.getNode()); - return DAG.getNode(Opc, DL, VT, OpNode, N0.getOperand(0)); + return DAG.getNode(Opc, DL, VT, N0.getOperand(0), OpNode); } else if (N0.hasOneUse()) { // reassoc. (op (op x, c1), y) -> (op (op x, y), c1) iff x+c1 has one use SDValue OpNode = DAG.getNode(Opc, N0.getDebugLoc(), VT, @@ -504,10 +504,10 @@ SDValue DAGCombiner::ReassociateOps(unsigned Opc, DebugLoc DL, SDValue OpNode = DAG.getNode(Opc, N1.getDebugLoc(), VT, N1.getOperand(1), N0); AddToWorkList(OpNode.getNode()); - return DAG.getNode(Opc, DL, VT, OpNode, N1.getOperand(0)); + return DAG.getNode(Opc, DL, VT, N1.getOperand(0), OpNode); } else if (N1.hasOneUse()) { // reassoc. (op y, (op x, c1)) -> (op (op x, y), c1) iff x+c1 has one use - SDValue OpNode = DAG.getNode(Opc, N1.getDebugLoc(), VT, + SDValue OpNode = DAG.getNode(Opc, N0.getDebugLoc(), VT, N1.getOperand(0), N0); AddToWorkList(OpNode.getNode()); return DAG.getNode(Opc, DL, VT, OpNode, N1.getOperand(1)); @@ -913,18 +913,24 @@ SDValue DAGCombiner::visitMERGE_VALUES(SDNode *N) { } static -SDValue combineShlAddConstant(SDValue N0, SDValue N1, SelectionDAG &DAG) { +SDValue combineShlAddConstant(DebugLoc DL, SDValue N0, SDValue N1, + SelectionDAG &DAG) { MVT VT = N0.getValueType(); SDValue N00 = N0.getOperand(0); SDValue N01 = N0.getOperand(1); ConstantSDNode *N01C = dyn_cast(N01); + if (N01C && N00.getOpcode() == ISD::ADD && N00.getNode()->hasOneUse() && isa(N00.getOperand(1))) { - N0 = DAG.getNode(ISD::ADD, VT, - DAG.getNode(ISD::SHL, VT, N00.getOperand(0), N01), - DAG.getNode(ISD::SHL, VT, N00.getOperand(1), N01)); - return DAG.getNode(ISD::ADD, VT, N0, N1); + // fold (add (shl (add x, c1), c2), ) -> (add (add (shl x, c2), c1<getDebugLoc(), OtherOp, Result, Slct.getOperand(0), Slct.getOperand(1), CC); SDValue CCOp = Slct.getOperand(0); if (InvCC) - CCOp = DAG.getSetCC(CCOp.getValueType(), CCOp.getOperand(0), - CCOp.getOperand(1), CC); - return DAG.getNode(ISD::SELECT, VT, CCOp, OtherOp, Result); + CCOp = DAG.getSetCC(Slct.getDebugLoc(), CCOp.getValueType(), + CCOp.getOperand(0), CCOp.getOperand(1), CC); + return DAG.getNode(ISD::SELECT, N->getDebugLoc(), VT, + CCOp, OtherOp, Result); } return SDValue(); } @@ -1100,11 +1107,11 @@ SDValue DAGCombiner::visitADD(SDNode *N) { // fold (add (shl (add x, c1), c2), ) -> (add (add (shl x, c2), c1<hasOneUse()) { - SDValue Result = combineShlAddConstant(N0, N1, DAG); + SDValue Result = combineShlAddConstant(N->getDebugLoc(), N0, N1, DAG); if (Result.getNode()) return Result; } if (N1.getOpcode() == ISD::SHL && N1.getNode()->hasOneUse()) { - SDValue Result = combineShlAddConstant(N1, N0, DAG); + SDValue Result = combineShlAddConstant(N->getDebugLoc(), N1, N0, DAG); if (Result.getNode()) return Result; }