From 068a81e9fca511b9a3b3a0f28a8988a57f994652 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Mon, 17 Jan 2005 17:15:02 +0000 Subject: [PATCH] Refactor code into a new method. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@19635 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/SelectionDAG/SelectionDAG.cpp | 3 +- lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp | 45 ++++++++++++------- 2 files changed, 29 insertions(+), 19 deletions(-) diff --git a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp index a8e383060f0..95da4600db5 100644 --- a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp +++ b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp @@ -567,8 +567,7 @@ SDOperand SelectionDAG::getNode(unsigned Opcode, MVT::ValueType VT, assert(VT == N1.getValueType() && "Shift operators return type must be the same as their first arg"); assert(MVT::isInteger(VT) && MVT::isInteger(N2.getValueType()) && - "Shifts only work on integers"); - assert(VT >= MVT::i8 && "Shift amount cannot be a MVT::i1"); + VT != MVT::i1 && "Shifts only work on integers"); break; default: break; } diff --git a/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp b/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp index f747b35cf8d..64940aa6b6c 100644 --- a/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp +++ b/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp @@ -806,6 +806,32 @@ CopyValueToVirtualRegister(SelectionDAGLowering &SDL, Value *V, unsigned Reg) { return DAG.getCopyToReg(DAG.getRoot(), Op, Reg); } +void SelectionDAGISel:: +LowerArguments(BasicBlock *BB, SelectionDAGLowering &SDL, + std::vector &UnorderedChains) { + // If this is the entry block, emit arguments. + Function &F = *BB->getParent(); + + if (BB == &F.front()) { + // FIXME: If an argument is only used in one basic block, we could directly + // emit it (ONLY) into that block, not emitting the COPY_TO_VREG node. This + // would improve codegen in several cases on X86 by allowing the loads to be + // folded into the user operation. + std::vector Args = TLI.LowerArguments(F, SDL.DAG); + + FunctionLoweringInfo &FuncInfo = SDL.FuncInfo; + + unsigned a = 0; + for (Function::aiterator AI = F.abegin(), E = F.aend(); AI != E; ++AI,++a) + if (!AI->use_empty()) { + SDL.setValue(AI, Args[a]); + UnorderedChains.push_back( + CopyValueToVirtualRegister(SDL, AI, FuncInfo.ValueMap[AI])); + } + } +} + + void SelectionDAGISel::BuildSelectionDAG(SelectionDAG &DAG, BasicBlock *LLVMBB, std::vector > &PHINodesToUpdate, FunctionLoweringInfo &FuncInfo) { @@ -813,23 +839,8 @@ void SelectionDAGISel::BuildSelectionDAG(SelectionDAG &DAG, BasicBlock *LLVMBB, std::vector UnorderedChains; - // If this is the entry block, emit arguments. - Function *F = LLVMBB->getParent(); - if (LLVMBB == &F->front()) { - // FIXME: If an argument is only used in one basic block, we could directly - // emit it (ONLY) into that block, not emitting the COPY_TO_VREG node. This - // would improve codegen in several cases on X86 by allowing the loads to be - // folded into the user operation. - std::vector Args = TLI.LowerArguments(*LLVMBB->getParent(), DAG); - - unsigned a = 0; - for (Function::aiterator AI = F->abegin(), E = F->aend(); AI != E; ++AI,++a) - if (!AI->use_empty()) { - SDL.setValue(AI, Args[a]); - UnorderedChains.push_back( - CopyValueToVirtualRegister(SDL, AI, FuncInfo.ValueMap[AI])); - } - } + // Lower any arguments needed in this block. + LowerArguments(LLVMBB, SDL, UnorderedChains); BB = FuncInfo.MBBMap[LLVMBB]; SDL.setCurrentBasicBlock(BB);