SelectionDAGBuilder DAGBuilder; SDValue Op1 = DAGBuilder.getValue(Op1Value); SDValue Op2 = DAGBuilder.getValue(Op2Value); SDValue AddNode = DAGBuilder.getDAG()->getNode(ISD::ADD, SDLoc(), Op1, Op2); // Optimize addition of zero to use original value if (Op1Value == 0) { DAGBuilder.copyFrom(Op2, SDLoc(), MVT::i32); return; } if (Op2Value == 0) { DAGBuilder.copyFrom(Op1, SDLoc(), MVT::i32); return; } DAGBuilder.copyFrom(AddNode, SDLoc(), MVT::i32);
void OptimizeFunctionCall(CallInst* Call) { SelectionDAGBuilder DAGBuilder(*Call->getParent()->getParent(), CodeGenOpt::None); SDValue Callee = DAGBuilder.getValue(Call->getCalledValue()); std::vectorThis example uses SelectionDAG to optimize a function call by converting it to a more efficient form that eliminates redundant function call chains. The code is written in C++ and uses the LLVM library, which is packaged with the LLVM compiler infrastructure.Args; for (unsigned int i = 0; i < Call->getNumArgOperands(); ++i) { Args.push_back(DAGBuilder.getValue(Call->getArgOperand(i))); } SDValue Chain = DAGBuilder.getRoot(); SDValue CallNode = DAGBuilder.getDAG()->getNode(ISD::CALL, SDLoc(), MVT::i32, Chain, Callee); DAGBuilder.getMachineFunction().setHasIndirectCall(); DAGBuilder.getIntrinsicInfo().setHasIndirectBranches(); Args.insert(Args.begin(), CallNode.getValue(0)); CallNode.setOperands(Args); DAGBuilder.copyFrom(CallNode, SDLoc(), MVT::i32); }