Refactor code into a new method.
llvm-svn: 19635
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
index a8e3830..95da460 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
@@ -567,8 +567,7 @@
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/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
index f747b35..64940aa 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
@@ -806,6 +806,32 @@
return DAG.getCopyToReg(DAG.getRoot(), Op, Reg);
}
+void SelectionDAGISel::
+LowerArguments(BasicBlock *BB, SelectionDAGLowering &SDL,
+ std::vector<SDOperand> &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<SDOperand> 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<std::pair<MachineInstr*, unsigned> > &PHINodesToUpdate,
FunctionLoweringInfo &FuncInfo) {
@@ -813,23 +839,8 @@
std::vector<SDOperand> 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<SDOperand> 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);