SelectionDAGISel.cpp revision 7041ee35adecb864e3e8df490aa73b0605fbfb5a
11c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner//===-- SelectionDAGISel.cpp - Implement the SelectionDAGISel class -------===// 21c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner// 31c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner// The LLVM Compiler Infrastructure 41c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner// 51c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner// This file was developed by the LLVM research group and is distributed under 61c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner// the University of Illinois Open Source License. See LICENSE.TXT for details. 71c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner// 81c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner//===----------------------------------------------------------------------===// 91c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner// 101c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner// This implements the SelectionDAGISel class. 111c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner// 121c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner//===----------------------------------------------------------------------===// 131c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 141c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner#define DEBUG_TYPE "isel" 151c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner#include "llvm/CodeGen/SelectionDAGISel.h" 161c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner#include "llvm/Constants.h" 171c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner#include "llvm/DerivedTypes.h" 181c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner#include "llvm/Function.h" 191c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner#include "llvm/Instructions.h" 201c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner#include "llvm/Intrinsics.h" 211c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner#include "llvm/CodeGen/MachineFunction.h" 221c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner#include "llvm/CodeGen/MachineFrameInfo.h" 231c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner#include "llvm/CodeGen/MachineInstrBuilder.h" 241c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner#include "llvm/CodeGen/SelectionDAG.h" 251c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner#include "llvm/CodeGen/SSARegMap.h" 261c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner#include "llvm/Target/TargetData.h" 271c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner#include "llvm/Target/TargetFrameInfo.h" 281c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner#include "llvm/Target/TargetInstrInfo.h" 291c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner#include "llvm/Target/TargetLowering.h" 301c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner#include "llvm/Target/TargetMachine.h" 311c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner#include "llvm/Support/Debug.h" 321c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner#include <map> 331c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner#include <iostream> 341c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattnerusing namespace llvm; 351c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 361c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattnernamespace llvm { 371c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner //===--------------------------------------------------------------------===// 381c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner /// FunctionLoweringInfo - This contains information that is global to a 391c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner /// function that is used when lowering a region of the function. 40f26bc8ef4827cf0023a7052b62b920b41813d473Chris Lattner class FunctionLoweringInfo { 41f26bc8ef4827cf0023a7052b62b920b41813d473Chris Lattner public: 421c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner TargetLowering &TLI; 431c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner Function &Fn; 441c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner MachineFunction &MF; 451c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner SSARegMap *RegMap; 461c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 471c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner FunctionLoweringInfo(TargetLowering &TLI, Function &Fn,MachineFunction &MF); 481c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 491c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner /// MBBMap - A mapping from LLVM basic blocks to their machine code entry. 501c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner std::map<const BasicBlock*, MachineBasicBlock *> MBBMap; 511c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 521c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner /// ValueMap - Since we emit code for the function a basic block at a time, 531c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner /// we must remember which virtual registers hold the values for 541c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner /// cross-basic-block values. 551c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner std::map<const Value*, unsigned> ValueMap; 561c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 571c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner /// StaticAllocaMap - Keep track of frame indices for fixed sized allocas in 581c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner /// the entry block. This allows the allocas to be efficiently referenced 591c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner /// anywhere in the function. 601c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner std::map<const AllocaInst*, int> StaticAllocaMap; 611c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 621c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner unsigned MakeReg(MVT::ValueType VT) { 631c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner return RegMap->createVirtualRegister(TLI.getRegClassFor(VT)); 641c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner } 651c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 661c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner unsigned CreateRegForValue(const Value *V) { 671c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner MVT::ValueType VT = TLI.getValueType(V->getType()); 681c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner // The common case is that we will only create one register for this 691c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner // value. If we have that case, create and return the virtual register. 701c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner unsigned NV = TLI.getNumElements(VT); 711c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner if (NV == 1) return MakeReg(VT); 721c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 731c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner // If this value is represented with multiple target registers, make sure 741c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner // to create enough consequtive registers of the right (smaller) type. 751c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner unsigned NT = VT-1; // Find the type to use. 761c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner while (TLI.getNumElements((MVT::ValueType)NT) != 1) 771c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner --NT; 781c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 791c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner unsigned R = MakeReg((MVT::ValueType)NT); 801c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner for (unsigned i = 1; i != NV; ++i) 811c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner MakeReg((MVT::ValueType)NT); 821c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner return R; 831c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner } 841c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 851c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner unsigned InitializeRegForValue(const Value *V) { 861c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner unsigned &R = ValueMap[V]; 871c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner assert(R == 0 && "Already initialized this value register!"); 881c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner return R = CreateRegForValue(V); 891c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner } 901c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner }; 911c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner} 921c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 931c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner/// isUsedOutsideOfDefiningBlock - Return true if this instruction is used by 941c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner/// PHI nodes or outside of the basic block that defines it. 951c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattnerstatic bool isUsedOutsideOfDefiningBlock(Instruction *I) { 961c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner if (isa<PHINode>(I)) return true; 971c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner BasicBlock *BB = I->getParent(); 981c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner for (Value::use_iterator UI = I->use_begin(), E = I->use_end(); UI != E; ++UI) 991c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner if (cast<Instruction>(*UI)->getParent() != BB || isa<PHINode>(*UI)) 1001c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner return true; 1011c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner return false; 1021c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner} 1031c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 1041c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris LattnerFunctionLoweringInfo::FunctionLoweringInfo(TargetLowering &tli, 1051c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner Function &fn, MachineFunction &mf) 1061c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner : TLI(tli), Fn(fn), MF(mf), RegMap(MF.getSSARegMap()) { 1071c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 1081c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner // Initialize the mapping of values to registers. This is only set up for 1091c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner // instruction values that are used outside of the block that defines 1101c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner // them. 1111c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner for (Function::aiterator AI = Fn.abegin(), E = Fn.aend(); AI != E; ++AI) 1121c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner InitializeRegForValue(AI); 1131c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 1141c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner Function::iterator BB = Fn.begin(), E = Fn.end(); 1151c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner for (BasicBlock::iterator I = BB->begin(), E = BB->end(); I != E; ++I) 1161c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner if (AllocaInst *AI = dyn_cast<AllocaInst>(I)) 1171c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner if (ConstantUInt *CUI = dyn_cast<ConstantUInt>(AI->getArraySize())) { 1181c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner const Type *Ty = AI->getAllocatedType(); 1191c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner uint64_t TySize = TLI.getTargetData().getTypeSize(Ty); 1201c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner unsigned Align = TLI.getTargetData().getTypeAlignment(Ty); 1211c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner TySize *= CUI->getValue(); // Get total allocated size. 1221c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner StaticAllocaMap[AI] = 123f26bc8ef4827cf0023a7052b62b920b41813d473Chris Lattner MF.getFrameInfo()->CreateStackObject((unsigned)TySize, Align); 1241c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner } 1251c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 1261c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner for (; BB != E; ++BB) 127f26bc8ef4827cf0023a7052b62b920b41813d473Chris Lattner for (BasicBlock::iterator I = BB->begin(), e = BB->end(); I != e; ++I) 1281c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner if (!I->use_empty() && isUsedOutsideOfDefiningBlock(I)) 1291c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner if (!isa<AllocaInst>(I) || 1301c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner !StaticAllocaMap.count(cast<AllocaInst>(I))) 1311c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner InitializeRegForValue(I); 1321c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 1331c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner // Create an initial MachineBasicBlock for each LLVM BasicBlock in F. This 1341c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner // also creates the initial PHI MachineInstrs, though none of the input 1351c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner // operands are populated. 1361c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner for (Function::iterator BB = Fn.begin(), E = Fn.end(); BB != E; ++BB) { 1371c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner MachineBasicBlock *MBB = new MachineBasicBlock(BB); 1381c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner MBBMap[BB] = MBB; 1391c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner MF.getBasicBlockList().push_back(MBB); 1401c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 1411c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner // Create Machine PHI nodes for LLVM PHI nodes, lowering them as 1421c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner // appropriate. 1431c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner PHINode *PN; 1441c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner for (BasicBlock::iterator I = BB->begin(); 145f44fd88e9cdd7b47acb71ac78e3dccb91319c72dChris Lattner (PN = dyn_cast<PHINode>(I)); ++I) 146f44fd88e9cdd7b47acb71ac78e3dccb91319c72dChris Lattner if (!PN->use_empty()) { 147f44fd88e9cdd7b47acb71ac78e3dccb91319c72dChris Lattner unsigned NumElements = 148f44fd88e9cdd7b47acb71ac78e3dccb91319c72dChris Lattner TLI.getNumElements(TLI.getValueType(PN->getType())); 149f44fd88e9cdd7b47acb71ac78e3dccb91319c72dChris Lattner unsigned PHIReg = ValueMap[PN]; 150f44fd88e9cdd7b47acb71ac78e3dccb91319c72dChris Lattner assert(PHIReg &&"PHI node does not have an assigned virtual register!"); 151f44fd88e9cdd7b47acb71ac78e3dccb91319c72dChris Lattner for (unsigned i = 0; i != NumElements; ++i) 152f44fd88e9cdd7b47acb71ac78e3dccb91319c72dChris Lattner BuildMI(MBB, TargetInstrInfo::PHI, PN->getNumOperands(), PHIReg+i); 153f44fd88e9cdd7b47acb71ac78e3dccb91319c72dChris Lattner } 1541c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner } 1551c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner} 1561c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 1571c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 1581c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 1591c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner//===----------------------------------------------------------------------===// 1601c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner/// SelectionDAGLowering - This is the common target-independent lowering 1611c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner/// implementation that is parameterized by a TargetLowering object. 1621c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner/// Also, targets can overload any lowering method. 1631c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner/// 1641c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattnernamespace llvm { 1651c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattnerclass SelectionDAGLowering { 1661c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner MachineBasicBlock *CurMBB; 1671c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 1681c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner std::map<const Value*, SDOperand> NodeMap; 1691c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 1701c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattnerpublic: 1711c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner // TLI - This is information that describes the available target features we 1721c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner // need for lowering. This indicates when operations are unavailable, 1731c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner // implemented with a libcall, etc. 1741c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner TargetLowering &TLI; 1751c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner SelectionDAG &DAG; 1761c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner const TargetData &TD; 1771c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 1781c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner /// FuncInfo - Information about the function as a whole. 1791c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner /// 1801c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner FunctionLoweringInfo &FuncInfo; 1811c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 1821c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner SelectionDAGLowering(SelectionDAG &dag, TargetLowering &tli, 1831c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner FunctionLoweringInfo &funcinfo) 1841c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner : TLI(tli), DAG(dag), TD(DAG.getTarget().getTargetData()), 1851c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner FuncInfo(funcinfo) { 1861c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner } 1871c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 1881c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner void visit(Instruction &I) { visit(I.getOpcode(), I); } 1891c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 1901c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner void visit(unsigned Opcode, User &I) { 1911c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner switch (Opcode) { 1921c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner default: assert(0 && "Unknown instruction type encountered!"); 1931c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner abort(); 1941c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner // Build the switch statement using the Instruction.def file. 1951c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner#define HANDLE_INST(NUM, OPCODE, CLASS) \ 1961c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner case Instruction::OPCODE:return visit##OPCODE((CLASS&)I); 1971c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner#include "llvm/Instruction.def" 1981c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner } 1991c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner } 2001c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 2011c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner void setCurrentBasicBlock(MachineBasicBlock *MBB) { CurMBB = MBB; } 2021c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 2031c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 2041c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner SDOperand getIntPtrConstant(uint64_t Val) { 2051c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner return DAG.getConstant(Val, TLI.getPointerTy()); 2061c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner } 2071c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 2081c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner SDOperand getValue(const Value *V) { 2091c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner SDOperand &N = NodeMap[V]; 2101c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner if (N.Val) return N; 2111c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 2121c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner MVT::ValueType VT = TLI.getValueType(V->getType()); 2131c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner if (Constant *C = const_cast<Constant*>(dyn_cast<Constant>(V))) 2141c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner if (ConstantExpr *CE = dyn_cast<ConstantExpr>(C)) { 2151c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner visit(CE->getOpcode(), *CE); 2161c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner assert(N.Val && "visit didn't populate the ValueMap!"); 2171c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner return N; 2181c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner } else if (GlobalValue *GV = dyn_cast<GlobalValue>(C)) { 2191c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner return N = DAG.getGlobalAddress(GV, VT); 2201c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner } else if (isa<ConstantPointerNull>(C)) { 2211c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner return N = DAG.getConstant(0, TLI.getPointerTy()); 2221c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner } else if (isa<UndefValue>(C)) { 2231c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner /// FIXME: Implement UNDEFVALUE better. 2241c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner if (MVT::isInteger(VT)) 2251c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner return N = DAG.getConstant(0, VT); 2261c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner else if (MVT::isFloatingPoint(VT)) 2271c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner return N = DAG.getConstantFP(0, VT); 2281c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner else 2291c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner assert(0 && "Unknown value type!"); 2301c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 2311c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner } else if (ConstantFP *CFP = dyn_cast<ConstantFP>(C)) { 2321c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner return N = DAG.getConstantFP(CFP->getValue(), VT); 2331c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner } else { 2341c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner // Canonicalize all constant ints to be unsigned. 2351c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner return N = DAG.getConstant(cast<ConstantIntegral>(C)->getRawValue(),VT); 2361c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner } 2371c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 2381c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner if (const AllocaInst *AI = dyn_cast<AllocaInst>(V)) { 2391c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner std::map<const AllocaInst*, int>::iterator SI = 2401c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner FuncInfo.StaticAllocaMap.find(AI); 2411c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner if (SI != FuncInfo.StaticAllocaMap.end()) 2421c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner return DAG.getFrameIndex(SI->second, TLI.getPointerTy()); 2431c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner } 2441c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 2451c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner std::map<const Value*, unsigned>::const_iterator VMI = 2461c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner FuncInfo.ValueMap.find(V); 2471c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner assert(VMI != FuncInfo.ValueMap.end() && "Value not in map!"); 2481c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner return N = DAG.getCopyFromReg(VMI->second, VT); 2491c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner } 2501c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 2511c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner const SDOperand &setValue(const Value *V, SDOperand NewN) { 2521c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner SDOperand &N = NodeMap[V]; 2531c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner assert(N.Val == 0 && "Already set a value for this node!"); 2541c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner return N = NewN; 2551c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner } 2561c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 2571c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner // Terminator instructions. 2581c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner void visitRet(ReturnInst &I); 2591c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner void visitBr(BranchInst &I); 2601c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner void visitUnreachable(UnreachableInst &I) { /* noop */ } 2611c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 2621c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner // These all get lowered before this pass. 2631c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner void visitSwitch(SwitchInst &I) { assert(0 && "TODO"); } 2641c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner void visitInvoke(InvokeInst &I) { assert(0 && "TODO"); } 2651c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner void visitUnwind(UnwindInst &I) { assert(0 && "TODO"); } 2661c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 2671c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner // 2681c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner void visitBinary(User &I, unsigned Opcode); 2691c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner void visitAdd(User &I) { visitBinary(I, ISD::ADD); } 2701c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner void visitSub(User &I) { visitBinary(I, ISD::SUB); } 2711c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner void visitMul(User &I) { visitBinary(I, ISD::MUL); } 2721c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner void visitDiv(User &I) { 2731c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner visitBinary(I, I.getType()->isUnsigned() ? ISD::UDIV : ISD::SDIV); 2741c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner } 2751c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner void visitRem(User &I) { 2761c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner visitBinary(I, I.getType()->isUnsigned() ? ISD::UREM : ISD::SREM); 2771c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner } 2781c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner void visitAnd(User &I) { visitBinary(I, ISD::AND); } 2791c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner void visitOr (User &I) { visitBinary(I, ISD::OR); } 2801c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner void visitXor(User &I) { visitBinary(I, ISD::XOR); } 2811c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner void visitShl(User &I) { visitBinary(I, ISD::SHL); } 2821c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner void visitShr(User &I) { 2831c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner visitBinary(I, I.getType()->isUnsigned() ? ISD::SRL : ISD::SRA); 2841c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner } 2851c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 2861c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner void visitSetCC(User &I, ISD::CondCode SignedOpc, ISD::CondCode UnsignedOpc); 2871c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner void visitSetEQ(User &I) { visitSetCC(I, ISD::SETEQ, ISD::SETEQ); } 2881c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner void visitSetNE(User &I) { visitSetCC(I, ISD::SETNE, ISD::SETNE); } 2891c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner void visitSetLE(User &I) { visitSetCC(I, ISD::SETLE, ISD::SETULE); } 2901c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner void visitSetGE(User &I) { visitSetCC(I, ISD::SETGE, ISD::SETUGE); } 2911c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner void visitSetLT(User &I) { visitSetCC(I, ISD::SETLT, ISD::SETULT); } 2921c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner void visitSetGT(User &I) { visitSetCC(I, ISD::SETGT, ISD::SETUGT); } 2931c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 2941c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner void visitGetElementPtr(User &I); 2951c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner void visitCast(User &I); 2961c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner void visitSelect(User &I); 2971c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner // 2981c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 2991c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner void visitMalloc(MallocInst &I); 3001c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner void visitFree(FreeInst &I); 3011c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner void visitAlloca(AllocaInst &I); 3021c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner void visitLoad(LoadInst &I); 3031c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner void visitStore(StoreInst &I); 3041c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner void visitPHI(PHINode &I) { } // PHI nodes are handled specially. 3051c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner void visitCall(CallInst &I); 3061c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 3071c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner void visitVAStart(CallInst &I); 3081c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner void visitVANext(VANextInst &I); 3091c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner void visitVAArg(VAArgInst &I); 3101c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner void visitVAEnd(CallInst &I); 3111c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner void visitVACopy(CallInst &I); 31239ae3622791986a0232f7e4797b633f8fa9e54d2Chris Lattner void visitFrameReturnAddress(CallInst &I, bool isFrameAddress); 3131c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 3147041ee35adecb864e3e8df490aa73b0605fbfb5aChris Lattner void visitMemIntrinsic(CallInst &I, unsigned Op); 3151c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 3161c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner void visitUserOp1(Instruction &I) { 3171c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner assert(0 && "UserOp1 should not exist at instruction selection time!"); 3181c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner abort(); 3191c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner } 3201c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner void visitUserOp2(Instruction &I) { 3211c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner assert(0 && "UserOp2 should not exist at instruction selection time!"); 3221c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner abort(); 3231c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner } 3241c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner}; 3251c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner} // end namespace llvm 3261c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 3271c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattnervoid SelectionDAGLowering::visitRet(ReturnInst &I) { 3281c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner if (I.getNumOperands() == 0) { 3291c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner DAG.setRoot(DAG.getNode(ISD::RET, MVT::Other, DAG.getRoot())); 3301c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner return; 3311c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner } 3321c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 3331c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner SDOperand Op1 = getValue(I.getOperand(0)); 3341c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner switch (Op1.getValueType()) { 3351c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner default: assert(0 && "Unknown value type!"); 3361c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner case MVT::i1: 3371c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner case MVT::i8: 3381c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner case MVT::i16: 3391c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner // Extend integer types to 32-bits. 3401c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner if (I.getOperand(0)->getType()->isSigned()) 3411c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner Op1 = DAG.getNode(ISD::SIGN_EXTEND, MVT::i32, Op1); 3421c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner else 3431c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner Op1 = DAG.getNode(ISD::ZERO_EXTEND, MVT::i32, Op1); 3441c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner break; 3451c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner case MVT::f32: 3461c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner // Extend float to double. 3471c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner Op1 = DAG.getNode(ISD::FP_EXTEND, MVT::f64, Op1); 3481c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner break; 3491c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner case MVT::i32: 3501c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner case MVT::i64: 3511c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner case MVT::f64: 3521c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner break; // No extension needed! 3531c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner } 3541c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 3551c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner DAG.setRoot(DAG.getNode(ISD::RET, MVT::Other, DAG.getRoot(), Op1)); 3561c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner} 3571c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 3581c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattnervoid SelectionDAGLowering::visitBr(BranchInst &I) { 3591c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner // Update machine-CFG edges. 3601c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner MachineBasicBlock *Succ0MBB = FuncInfo.MBBMap[I.getSuccessor(0)]; 3611c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner CurMBB->addSuccessor(Succ0MBB); 3621c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 3631c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner // Figure out which block is immediately after the current one. 3641c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner MachineBasicBlock *NextBlock = 0; 3651c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner MachineFunction::iterator BBI = CurMBB; 3661c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner if (++BBI != CurMBB->getParent()->end()) 3671c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner NextBlock = BBI; 3681c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 3691c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner if (I.isUnconditional()) { 3701c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner // If this is not a fall-through branch, emit the branch. 3711c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner if (Succ0MBB != NextBlock) 3721c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner DAG.setRoot(DAG.getNode(ISD::BR, MVT::Other, DAG.getRoot(), 3731c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner DAG.getBasicBlock(Succ0MBB))); 3741c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner } else { 3751c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner MachineBasicBlock *Succ1MBB = FuncInfo.MBBMap[I.getSuccessor(1)]; 3761c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner CurMBB->addSuccessor(Succ1MBB); 3771c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 3781c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner SDOperand Cond = getValue(I.getCondition()); 3791c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 3801c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner if (Succ1MBB == NextBlock) { 3811c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner // If the condition is false, fall through. This means we should branch 3821c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner // if the condition is true to Succ #0. 3831c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner DAG.setRoot(DAG.getNode(ISD::BRCOND, MVT::Other, DAG.getRoot(), 3841c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner Cond, DAG.getBasicBlock(Succ0MBB))); 3851c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner } else if (Succ0MBB == NextBlock) { 3861c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner // If the condition is true, fall through. This means we should branch if 3871c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner // the condition is false to Succ #1. Invert the condition first. 3881c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner SDOperand True = DAG.getConstant(1, Cond.getValueType()); 3891c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner Cond = DAG.getNode(ISD::XOR, Cond.getValueType(), Cond, True); 3901c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner DAG.setRoot(DAG.getNode(ISD::BRCOND, MVT::Other, DAG.getRoot(), 3911c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner Cond, DAG.getBasicBlock(Succ1MBB))); 3921c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner } else { 3931c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner // Neither edge is a fall through. If the comparison is true, jump to 3941c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner // Succ#0, otherwise branch unconditionally to succ #1. 3951c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner DAG.setRoot(DAG.getNode(ISD::BRCOND, MVT::Other, DAG.getRoot(), 3961c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner Cond, DAG.getBasicBlock(Succ0MBB))); 3971c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner DAG.setRoot(DAG.getNode(ISD::BR, MVT::Other, DAG.getRoot(), 3981c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner DAG.getBasicBlock(Succ1MBB))); 3991c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner } 4001c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner } 4011c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner} 4021c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 4031c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattnervoid SelectionDAGLowering::visitBinary(User &I, unsigned Opcode) { 4041c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner SDOperand Op1 = getValue(I.getOperand(0)); 4051c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner SDOperand Op2 = getValue(I.getOperand(1)); 4061c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner setValue(&I, DAG.getNode(Opcode, Op1.getValueType(), Op1, Op2)); 4071c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner} 4081c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 4091c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattnervoid SelectionDAGLowering::visitSetCC(User &I,ISD::CondCode SignedOpcode, 4101c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner ISD::CondCode UnsignedOpcode) { 4111c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner SDOperand Op1 = getValue(I.getOperand(0)); 4121c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner SDOperand Op2 = getValue(I.getOperand(1)); 4131c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner ISD::CondCode Opcode = SignedOpcode; 4141c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner if (I.getOperand(0)->getType()->isUnsigned()) 4151c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner Opcode = UnsignedOpcode; 4161c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner setValue(&I, DAG.getSetCC(Opcode, Op1, Op2)); 4171c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner} 4181c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 4191c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattnervoid SelectionDAGLowering::visitSelect(User &I) { 4201c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner SDOperand Cond = getValue(I.getOperand(0)); 4211c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner SDOperand TrueVal = getValue(I.getOperand(1)); 4221c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner SDOperand FalseVal = getValue(I.getOperand(2)); 4231c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner setValue(&I, DAG.getNode(ISD::SELECT, TrueVal.getValueType(), Cond, 4241c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner TrueVal, FalseVal)); 4251c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner} 4261c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 4271c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattnervoid SelectionDAGLowering::visitCast(User &I) { 4281c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner SDOperand N = getValue(I.getOperand(0)); 4291c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner MVT::ValueType SrcTy = TLI.getValueType(I.getOperand(0)->getType()); 4301c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner MVT::ValueType DestTy = TLI.getValueType(I.getType()); 4311c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 4321c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner if (N.getValueType() == DestTy) { 4331c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner setValue(&I, N); // noop cast. 434ae0aacb8331e1227abea6601e531a10d0e65fdcaChris Lattner } else if (isInteger(SrcTy)) { 435ae0aacb8331e1227abea6601e531a10d0e65fdcaChris Lattner if (isInteger(DestTy)) { // Int -> Int cast 436ae0aacb8331e1227abea6601e531a10d0e65fdcaChris Lattner if (DestTy < SrcTy) // Truncating cast? 437ae0aacb8331e1227abea6601e531a10d0e65fdcaChris Lattner setValue(&I, DAG.getNode(ISD::TRUNCATE, DestTy, N)); 438ae0aacb8331e1227abea6601e531a10d0e65fdcaChris Lattner else if (I.getOperand(0)->getType()->isSigned()) 439ae0aacb8331e1227abea6601e531a10d0e65fdcaChris Lattner setValue(&I, DAG.getNode(ISD::SIGN_EXTEND, DestTy, N)); 440ae0aacb8331e1227abea6601e531a10d0e65fdcaChris Lattner else 441ae0aacb8331e1227abea6601e531a10d0e65fdcaChris Lattner setValue(&I, DAG.getNode(ISD::ZERO_EXTEND, DestTy, N)); 442ae0aacb8331e1227abea6601e531a10d0e65fdcaChris Lattner } else { // Int -> FP cast 443ae0aacb8331e1227abea6601e531a10d0e65fdcaChris Lattner if (I.getOperand(0)->getType()->isSigned()) 444ae0aacb8331e1227abea6601e531a10d0e65fdcaChris Lattner setValue(&I, DAG.getNode(ISD::SINT_TO_FP, DestTy, N)); 445ae0aacb8331e1227abea6601e531a10d0e65fdcaChris Lattner else 446ae0aacb8331e1227abea6601e531a10d0e65fdcaChris Lattner setValue(&I, DAG.getNode(ISD::UINT_TO_FP, DestTy, N)); 447ae0aacb8331e1227abea6601e531a10d0e65fdcaChris Lattner } 4481c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner } else { 449ae0aacb8331e1227abea6601e531a10d0e65fdcaChris Lattner assert(isFloatingPoint(SrcTy) && "Unknown value type!"); 450ae0aacb8331e1227abea6601e531a10d0e65fdcaChris Lattner if (isFloatingPoint(DestTy)) { // FP -> FP cast 451ae0aacb8331e1227abea6601e531a10d0e65fdcaChris Lattner if (DestTy < SrcTy) // Rounding cast? 452ae0aacb8331e1227abea6601e531a10d0e65fdcaChris Lattner setValue(&I, DAG.getNode(ISD::FP_ROUND, DestTy, N)); 453ae0aacb8331e1227abea6601e531a10d0e65fdcaChris Lattner else 454ae0aacb8331e1227abea6601e531a10d0e65fdcaChris Lattner setValue(&I, DAG.getNode(ISD::FP_EXTEND, DestTy, N)); 455ae0aacb8331e1227abea6601e531a10d0e65fdcaChris Lattner } else { // FP -> Int cast. 456ae0aacb8331e1227abea6601e531a10d0e65fdcaChris Lattner if (I.getType()->isSigned()) 457ae0aacb8331e1227abea6601e531a10d0e65fdcaChris Lattner setValue(&I, DAG.getNode(ISD::FP_TO_SINT, DestTy, N)); 458ae0aacb8331e1227abea6601e531a10d0e65fdcaChris Lattner else 459ae0aacb8331e1227abea6601e531a10d0e65fdcaChris Lattner setValue(&I, DAG.getNode(ISD::FP_TO_UINT, DestTy, N)); 460ae0aacb8331e1227abea6601e531a10d0e65fdcaChris Lattner } 4611c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner } 4621c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner} 4631c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 4641c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattnervoid SelectionDAGLowering::visitGetElementPtr(User &I) { 4651c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner SDOperand N = getValue(I.getOperand(0)); 4661c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner const Type *Ty = I.getOperand(0)->getType(); 4671c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner const Type *UIntPtrTy = TD.getIntPtrType(); 4681c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 4691c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner for (GetElementPtrInst::op_iterator OI = I.op_begin()+1, E = I.op_end(); 4701c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner OI != E; ++OI) { 4711c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner Value *Idx = *OI; 4721c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner if (const StructType *StTy = dyn_cast<StructType> (Ty)) { 4731c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner unsigned Field = cast<ConstantUInt>(Idx)->getValue(); 4741c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner if (Field) { 4751c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner // N = N + Offset 4761c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner uint64_t Offset = TD.getStructLayout(StTy)->MemberOffsets[Field]; 4771c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner N = DAG.getNode(ISD::ADD, N.getValueType(), N, 4781c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner getIntPtrConstant(Offset)); 4791c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner } 4801c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner Ty = StTy->getElementType(Field); 4811c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner } else { 4821c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner Ty = cast<SequentialType>(Ty)->getElementType(); 4831c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner if (!isa<Constant>(Idx) || !cast<Constant>(Idx)->isNullValue()) { 4841c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner // N = N + Idx * ElementSize; 4851c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner uint64_t ElementSize = TD.getTypeSize(Ty); 4867cc4777a263f6a52877d29201311fde5f6edb632Chris Lattner SDOperand IdxN = getValue(Idx), Scale = getIntPtrConstant(ElementSize); 4877cc4777a263f6a52877d29201311fde5f6edb632Chris Lattner 4887cc4777a263f6a52877d29201311fde5f6edb632Chris Lattner // If the index is smaller or larger than intptr_t, truncate or extend 4897cc4777a263f6a52877d29201311fde5f6edb632Chris Lattner // it. 4907cc4777a263f6a52877d29201311fde5f6edb632Chris Lattner if (IdxN.getValueType() < Scale.getValueType()) { 4917cc4777a263f6a52877d29201311fde5f6edb632Chris Lattner if (Idx->getType()->isSigned()) 4927cc4777a263f6a52877d29201311fde5f6edb632Chris Lattner IdxN = DAG.getNode(ISD::SIGN_EXTEND, Scale.getValueType(), IdxN); 4937cc4777a263f6a52877d29201311fde5f6edb632Chris Lattner else 4947cc4777a263f6a52877d29201311fde5f6edb632Chris Lattner IdxN = DAG.getNode(ISD::ZERO_EXTEND, Scale.getValueType(), IdxN); 4957cc4777a263f6a52877d29201311fde5f6edb632Chris Lattner } else if (IdxN.getValueType() > Scale.getValueType()) 4967cc4777a263f6a52877d29201311fde5f6edb632Chris Lattner IdxN = DAG.getNode(ISD::TRUNCATE, Scale.getValueType(), IdxN); 4977cc4777a263f6a52877d29201311fde5f6edb632Chris Lattner 4987cc4777a263f6a52877d29201311fde5f6edb632Chris Lattner IdxN = DAG.getNode(ISD::MUL, N.getValueType(), IdxN, Scale); 4997cc4777a263f6a52877d29201311fde5f6edb632Chris Lattner 5001c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner N = DAG.getNode(ISD::ADD, N.getValueType(), N, IdxN); 5011c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner } 5021c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner } 5031c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner } 5041c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner setValue(&I, N); 5051c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner} 5061c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 5071c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattnervoid SelectionDAGLowering::visitAlloca(AllocaInst &I) { 5081c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner // If this is a fixed sized alloca in the entry block of the function, 5091c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner // allocate it statically on the stack. 5101c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner if (FuncInfo.StaticAllocaMap.count(&I)) 5111c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner return; // getValue will auto-populate this. 5121c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 5131c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner const Type *Ty = I.getAllocatedType(); 5141c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner uint64_t TySize = TLI.getTargetData().getTypeSize(Ty); 5151c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner unsigned Align = TLI.getTargetData().getTypeAlignment(Ty); 5161c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 5171c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner SDOperand AllocSize = getValue(I.getArraySize()); 5181c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 5191c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner assert(AllocSize.getValueType() == TLI.getPointerTy() && 5201c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner "FIXME: should extend or truncate to pointer size!"); 5211c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 5221c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner AllocSize = DAG.getNode(ISD::MUL, TLI.getPointerTy(), AllocSize, 5231c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner getIntPtrConstant(TySize)); 5241c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 5251c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner // Handle alignment. If the requested alignment is less than or equal to the 5261c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner // stack alignment, ignore it and round the size of the allocation up to the 5271c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner // stack alignment size. If the size is greater than the stack alignment, we 5281c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner // note this in the DYNAMIC_STACKALLOC node. 5291c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner unsigned StackAlign = 5301c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner TLI.getTargetMachine().getFrameInfo()->getStackAlignment(); 5311c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner if (Align <= StackAlign) { 5321c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner Align = 0; 5331c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner // Add SA-1 to the size. 5341c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner AllocSize = DAG.getNode(ISD::ADD, AllocSize.getValueType(), AllocSize, 5351c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner getIntPtrConstant(StackAlign-1)); 5361c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner // Mask out the low bits for alignment purposes. 5371c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner AllocSize = DAG.getNode(ISD::AND, AllocSize.getValueType(), AllocSize, 5381c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner getIntPtrConstant(~(uint64_t)(StackAlign-1))); 5391c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner } 5401c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 5411c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner SDOperand DSA = DAG.getNode(ISD::DYNAMIC_STACKALLOC, AllocSize.getValueType(), 5421c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner DAG.getRoot(), AllocSize, 5431c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner getIntPtrConstant(Align)); 5441c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner DAG.setRoot(setValue(&I, DSA).getValue(1)); 5451c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 5461c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner // Inform the Frame Information that we have just allocated a variable-sized 5471c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner // object. 5481c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner CurMBB->getParent()->getFrameInfo()->CreateVariableSizedObject(); 5491c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner} 5501c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 5511c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 5521c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattnervoid SelectionDAGLowering::visitLoad(LoadInst &I) { 5531c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner SDOperand Ptr = getValue(I.getOperand(0)); 5541c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner SDOperand L = DAG.getLoad(TLI.getValueType(I.getType()), DAG.getRoot(), Ptr); 5551c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner DAG.setRoot(setValue(&I, L).getValue(1)); 5561c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner} 5571c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 5581c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 5591c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattnervoid SelectionDAGLowering::visitStore(StoreInst &I) { 5601c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner Value *SrcV = I.getOperand(0); 5611c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner SDOperand Src = getValue(SrcV); 5621c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner SDOperand Ptr = getValue(I.getOperand(1)); 5631c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner DAG.setRoot(DAG.getNode(ISD::STORE, MVT::Other, DAG.getRoot(), Src, Ptr)); 5641c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner return; 5651c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner} 5661c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 5671c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattnervoid SelectionDAGLowering::visitCall(CallInst &I) { 56864e14b1679fa3649b286402ea254d663ac43ef91Chris Lattner const char *RenameFn = 0; 5691c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner if (Function *F = I.getCalledFunction()) 5701c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner switch (F->getIntrinsicID()) { 5711c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner case 0: break; // Not an intrinsic. 5721c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner case Intrinsic::vastart: visitVAStart(I); return; 5731c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner case Intrinsic::vaend: visitVAEnd(I); return; 5741c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner case Intrinsic::vacopy: visitVACopy(I); return; 57539ae3622791986a0232f7e4797b633f8fa9e54d2Chris Lattner case Intrinsic::returnaddress: visitFrameReturnAddress(I, false); return; 57639ae3622791986a0232f7e4797b633f8fa9e54d2Chris Lattner case Intrinsic::frameaddress: visitFrameReturnAddress(I, true); return; 5771c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner default: 5781c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner // FIXME: IMPLEMENT THESE. 5791c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner // readport, writeport, readio, writeio 5801c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner assert(0 && "This intrinsic is not implemented yet!"); 5811c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner return; 58264e14b1679fa3649b286402ea254d663ac43ef91Chris Lattner case Intrinsic::setjmp: RenameFn = "setjmp"; break; 58364e14b1679fa3649b286402ea254d663ac43ef91Chris Lattner case Intrinsic::longjmp: RenameFn = "longjmp"; break; 5847041ee35adecb864e3e8df490aa73b0605fbfb5aChris Lattner case Intrinsic::memcpy: visitMemIntrinsic(I, ISD::MEMCPY); return; 5857041ee35adecb864e3e8df490aa73b0605fbfb5aChris Lattner case Intrinsic::memset: visitMemIntrinsic(I, ISD::MEMSET); return; 5867041ee35adecb864e3e8df490aa73b0605fbfb5aChris Lattner case Intrinsic::memmove: visitMemIntrinsic(I, ISD::MEMMOVE); return; 5871c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 5881c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner case Intrinsic::isunordered: 5891c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner setValue(&I, DAG.getSetCC(ISD::SETUO, getValue(I.getOperand(1)), 5901c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner getValue(I.getOperand(2)))); 5911c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner return; 5921c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner } 5931c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 59464e14b1679fa3649b286402ea254d663ac43ef91Chris Lattner SDOperand Callee; 59564e14b1679fa3649b286402ea254d663ac43ef91Chris Lattner if (!RenameFn) 59664e14b1679fa3649b286402ea254d663ac43ef91Chris Lattner Callee = getValue(I.getOperand(0)); 59764e14b1679fa3649b286402ea254d663ac43ef91Chris Lattner else 59864e14b1679fa3649b286402ea254d663ac43ef91Chris Lattner Callee = DAG.getExternalSymbol(RenameFn, TLI.getPointerTy()); 5991c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner std::vector<std::pair<SDOperand, const Type*> > Args; 6001c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 6011c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner for (unsigned i = 1, e = I.getNumOperands(); i != e; ++i) { 6021c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner Value *Arg = I.getOperand(i); 6031c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner SDOperand ArgNode = getValue(Arg); 6041c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner Args.push_back(std::make_pair(ArgNode, Arg->getType())); 6051c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner } 6061c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 607cf5734dddd66af9388a171b44996505ede47feedChris Lattner std::pair<SDOperand,SDOperand> Result = 608cf5734dddd66af9388a171b44996505ede47feedChris Lattner TLI.LowerCallTo(DAG.getRoot(), I.getType(), Callee, Args, DAG); 6091c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner if (I.getType() != Type::VoidTy) 610cf5734dddd66af9388a171b44996505ede47feedChris Lattner setValue(&I, Result.first); 611cf5734dddd66af9388a171b44996505ede47feedChris Lattner DAG.setRoot(Result.second); 6121c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner} 6131c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 6141c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattnervoid SelectionDAGLowering::visitMalloc(MallocInst &I) { 6151c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner SDOperand Src = getValue(I.getOperand(0)); 6161c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 6171c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner MVT::ValueType IntPtr = TLI.getPointerTy(); 6181c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner // FIXME: Extend or truncate to the intptr size. 6191c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner assert(Src.getValueType() == IntPtr && "Need to adjust the amount!"); 6201c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 6211c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner // Scale the source by the type size. 6221c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner uint64_t ElementSize = TD.getTypeSize(I.getType()->getElementType()); 6231c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner Src = DAG.getNode(ISD::MUL, Src.getValueType(), 6241c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner Src, getIntPtrConstant(ElementSize)); 6251c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 6261c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner std::vector<std::pair<SDOperand, const Type*> > Args; 6271c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner Args.push_back(std::make_pair(Src, TLI.getTargetData().getIntPtrType())); 628cf5734dddd66af9388a171b44996505ede47feedChris Lattner 629cf5734dddd66af9388a171b44996505ede47feedChris Lattner std::pair<SDOperand,SDOperand> Result = 630cf5734dddd66af9388a171b44996505ede47feedChris Lattner TLI.LowerCallTo(DAG.getRoot(), I.getType(), 631cf5734dddd66af9388a171b44996505ede47feedChris Lattner DAG.getExternalSymbol("malloc", IntPtr), 632cf5734dddd66af9388a171b44996505ede47feedChris Lattner Args, DAG); 633cf5734dddd66af9388a171b44996505ede47feedChris Lattner setValue(&I, Result.first); // Pointers always fit in registers 634cf5734dddd66af9388a171b44996505ede47feedChris Lattner DAG.setRoot(Result.second); 6351c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner} 6361c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 6371c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattnervoid SelectionDAGLowering::visitFree(FreeInst &I) { 6381c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner std::vector<std::pair<SDOperand, const Type*> > Args; 6391c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner Args.push_back(std::make_pair(getValue(I.getOperand(0)), 6401c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner TLI.getTargetData().getIntPtrType())); 6411c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner MVT::ValueType IntPtr = TLI.getPointerTy(); 642cf5734dddd66af9388a171b44996505ede47feedChris Lattner std::pair<SDOperand,SDOperand> Result = 643cf5734dddd66af9388a171b44996505ede47feedChris Lattner TLI.LowerCallTo(DAG.getRoot(), Type::VoidTy, 644cf5734dddd66af9388a171b44996505ede47feedChris Lattner DAG.getExternalSymbol("free", IntPtr), Args, DAG); 645cf5734dddd66af9388a171b44996505ede47feedChris Lattner DAG.setRoot(Result.second); 6461c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner} 6471c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 64839ae3622791986a0232f7e4797b633f8fa9e54d2Chris Lattnerstd::pair<SDOperand, SDOperand> 64939ae3622791986a0232f7e4797b633f8fa9e54d2Chris LattnerTargetLowering::LowerVAStart(SDOperand Chain, SelectionDAG &DAG) { 6501c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner // We have no sane default behavior, just emit a useful error message and bail 6511c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner // out. 65239ae3622791986a0232f7e4797b633f8fa9e54d2Chris Lattner std::cerr << "Variable arguments handling not implemented on this target!\n"; 6531c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner abort(); 6541c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner} 6551c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 65639ae3622791986a0232f7e4797b633f8fa9e54d2Chris LattnerSDOperand TargetLowering::LowerVAEnd(SDOperand Chain, SDOperand L, 65739ae3622791986a0232f7e4797b633f8fa9e54d2Chris Lattner SelectionDAG &DAG) { 65839ae3622791986a0232f7e4797b633f8fa9e54d2Chris Lattner // Default to a noop. 65939ae3622791986a0232f7e4797b633f8fa9e54d2Chris Lattner return Chain; 66039ae3622791986a0232f7e4797b633f8fa9e54d2Chris Lattner} 66139ae3622791986a0232f7e4797b633f8fa9e54d2Chris Lattner 66239ae3622791986a0232f7e4797b633f8fa9e54d2Chris Lattnerstd::pair<SDOperand,SDOperand> 66339ae3622791986a0232f7e4797b633f8fa9e54d2Chris LattnerTargetLowering::LowerVACopy(SDOperand Chain, SDOperand L, SelectionDAG &DAG) { 66439ae3622791986a0232f7e4797b633f8fa9e54d2Chris Lattner // Default to returning the input list. 66539ae3622791986a0232f7e4797b633f8fa9e54d2Chris Lattner return std::make_pair(L, Chain); 66639ae3622791986a0232f7e4797b633f8fa9e54d2Chris Lattner} 66739ae3622791986a0232f7e4797b633f8fa9e54d2Chris Lattner 66839ae3622791986a0232f7e4797b633f8fa9e54d2Chris Lattnerstd::pair<SDOperand,SDOperand> 66939ae3622791986a0232f7e4797b633f8fa9e54d2Chris LattnerTargetLowering::LowerVAArgNext(bool isVANext, SDOperand Chain, SDOperand VAList, 67039ae3622791986a0232f7e4797b633f8fa9e54d2Chris Lattner const Type *ArgTy, SelectionDAG &DAG) { 6711c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner // We have no sane default behavior, just emit a useful error message and bail 6721c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner // out. 67339ae3622791986a0232f7e4797b633f8fa9e54d2Chris Lattner std::cerr << "Variable arguments handling not implemented on this target!\n"; 6741c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner abort(); 6751c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner} 67639ae3622791986a0232f7e4797b633f8fa9e54d2Chris Lattner 67739ae3622791986a0232f7e4797b633f8fa9e54d2Chris Lattner 67839ae3622791986a0232f7e4797b633f8fa9e54d2Chris Lattnervoid SelectionDAGLowering::visitVAStart(CallInst &I) { 67939ae3622791986a0232f7e4797b633f8fa9e54d2Chris Lattner std::pair<SDOperand,SDOperand> Result = TLI.LowerVAStart(DAG.getRoot(), DAG); 68039ae3622791986a0232f7e4797b633f8fa9e54d2Chris Lattner setValue(&I, Result.first); 68139ae3622791986a0232f7e4797b633f8fa9e54d2Chris Lattner DAG.setRoot(Result.second); 68239ae3622791986a0232f7e4797b633f8fa9e54d2Chris Lattner} 68339ae3622791986a0232f7e4797b633f8fa9e54d2Chris Lattner 6841c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattnervoid SelectionDAGLowering::visitVAArg(VAArgInst &I) { 68539ae3622791986a0232f7e4797b633f8fa9e54d2Chris Lattner std::pair<SDOperand,SDOperand> Result = 68639ae3622791986a0232f7e4797b633f8fa9e54d2Chris Lattner TLI.LowerVAArgNext(false, DAG.getRoot(), getValue(I.getOperand(0)), 68739ae3622791986a0232f7e4797b633f8fa9e54d2Chris Lattner I.getType(), DAG); 68839ae3622791986a0232f7e4797b633f8fa9e54d2Chris Lattner setValue(&I, Result.first); 68939ae3622791986a0232f7e4797b633f8fa9e54d2Chris Lattner DAG.setRoot(Result.second); 69039ae3622791986a0232f7e4797b633f8fa9e54d2Chris Lattner} 69139ae3622791986a0232f7e4797b633f8fa9e54d2Chris Lattner 69239ae3622791986a0232f7e4797b633f8fa9e54d2Chris Lattnervoid SelectionDAGLowering::visitVANext(VANextInst &I) { 69339ae3622791986a0232f7e4797b633f8fa9e54d2Chris Lattner std::pair<SDOperand,SDOperand> Result = 69439ae3622791986a0232f7e4797b633f8fa9e54d2Chris Lattner TLI.LowerVAArgNext(true, DAG.getRoot(), getValue(I.getOperand(0)), 69539ae3622791986a0232f7e4797b633f8fa9e54d2Chris Lattner I.getArgType(), DAG); 69639ae3622791986a0232f7e4797b633f8fa9e54d2Chris Lattner setValue(&I, Result.first); 69739ae3622791986a0232f7e4797b633f8fa9e54d2Chris Lattner DAG.setRoot(Result.second); 6981c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner} 6991c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 7001c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattnervoid SelectionDAGLowering::visitVAEnd(CallInst &I) { 70139ae3622791986a0232f7e4797b633f8fa9e54d2Chris Lattner DAG.setRoot(TLI.LowerVAEnd(DAG.getRoot(), getValue(I.getOperand(1)), DAG)); 7021c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner} 7031c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 7041c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattnervoid SelectionDAGLowering::visitVACopy(CallInst &I) { 70539ae3622791986a0232f7e4797b633f8fa9e54d2Chris Lattner std::pair<SDOperand,SDOperand> Result = 70639ae3622791986a0232f7e4797b633f8fa9e54d2Chris Lattner TLI.LowerVACopy(DAG.getRoot(), getValue(I.getOperand(1)), DAG); 70739ae3622791986a0232f7e4797b633f8fa9e54d2Chris Lattner setValue(&I, Result.first); 70839ae3622791986a0232f7e4797b633f8fa9e54d2Chris Lattner DAG.setRoot(Result.second); 7091c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner} 7101c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 7111c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 71239ae3622791986a0232f7e4797b633f8fa9e54d2Chris Lattner// It is always conservatively correct for llvm.returnaddress and 71339ae3622791986a0232f7e4797b633f8fa9e54d2Chris Lattner// llvm.frameaddress to return 0. 71439ae3622791986a0232f7e4797b633f8fa9e54d2Chris Lattnerstd::pair<SDOperand, SDOperand> 71539ae3622791986a0232f7e4797b633f8fa9e54d2Chris LattnerTargetLowering::LowerFrameReturnAddress(bool isFrameAddr, SDOperand Chain, 71639ae3622791986a0232f7e4797b633f8fa9e54d2Chris Lattner unsigned Depth, SelectionDAG &DAG) { 71739ae3622791986a0232f7e4797b633f8fa9e54d2Chris Lattner return std::make_pair(DAG.getConstant(0, getPointerTy()), Chain); 7181c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner} 7191c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 72039ae3622791986a0232f7e4797b633f8fa9e54d2Chris Lattnervoid SelectionDAGLowering::visitFrameReturnAddress(CallInst &I, bool isFrame) { 72139ae3622791986a0232f7e4797b633f8fa9e54d2Chris Lattner unsigned Depth = (unsigned)cast<ConstantUInt>(I.getOperand(1))->getValue(); 72239ae3622791986a0232f7e4797b633f8fa9e54d2Chris Lattner std::pair<SDOperand,SDOperand> Result = 72339ae3622791986a0232f7e4797b633f8fa9e54d2Chris Lattner TLI.LowerFrameReturnAddress(isFrame, DAG.getRoot(), Depth, DAG); 72439ae3622791986a0232f7e4797b633f8fa9e54d2Chris Lattner setValue(&I, Result.first); 72539ae3622791986a0232f7e4797b633f8fa9e54d2Chris Lattner DAG.setRoot(Result.second); 72639ae3622791986a0232f7e4797b633f8fa9e54d2Chris Lattner} 7271c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 7287041ee35adecb864e3e8df490aa73b0605fbfb5aChris Lattnervoid SelectionDAGLowering::visitMemIntrinsic(CallInst &I, unsigned Op) { 7297041ee35adecb864e3e8df490aa73b0605fbfb5aChris Lattner std::vector<SDOperand> Ops; 7307041ee35adecb864e3e8df490aa73b0605fbfb5aChris Lattner Ops.push_back(DAG.getRoot()); 7317041ee35adecb864e3e8df490aa73b0605fbfb5aChris Lattner Ops.push_back(getValue(I.getOperand(1))); 7327041ee35adecb864e3e8df490aa73b0605fbfb5aChris Lattner Ops.push_back(getValue(I.getOperand(2))); 7337041ee35adecb864e3e8df490aa73b0605fbfb5aChris Lattner Ops.push_back(getValue(I.getOperand(3))); 7347041ee35adecb864e3e8df490aa73b0605fbfb5aChris Lattner Ops.push_back(getValue(I.getOperand(4))); 7357041ee35adecb864e3e8df490aa73b0605fbfb5aChris Lattner DAG.setRoot(DAG.getNode(Op, MVT::Other, Ops)); 7361c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner} 7371c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 7387041ee35adecb864e3e8df490aa73b0605fbfb5aChris Lattner//===----------------------------------------------------------------------===// 7397041ee35adecb864e3e8df490aa73b0605fbfb5aChris Lattner// SelectionDAGISel code 7407041ee35adecb864e3e8df490aa73b0605fbfb5aChris Lattner//===----------------------------------------------------------------------===// 7411c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 7421c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattnerunsigned SelectionDAGISel::MakeReg(MVT::ValueType VT) { 7431c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner return RegMap->createVirtualRegister(TLI.getRegClassFor(VT)); 7441c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner} 7451c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 7461c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 7471c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 7481c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattnerbool SelectionDAGISel::runOnFunction(Function &Fn) { 7491c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner MachineFunction &MF = MachineFunction::construct(&Fn, TLI.getTargetMachine()); 7501c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner RegMap = MF.getSSARegMap(); 7511c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner DEBUG(std::cerr << "\n\n\n=== " << Fn.getName() << "\n"); 7521c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 7531c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner FunctionLoweringInfo FuncInfo(TLI, Fn, MF); 7541c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 7551c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner for (Function::iterator I = Fn.begin(), E = Fn.end(); I != E; ++I) 7561c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner SelectBasicBlock(I, MF, FuncInfo); 7571c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 7581c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner return true; 7591c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner} 7601c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 7611c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 7621c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattnervoid SelectionDAGISel::CopyValueToVirtualRegister(SelectionDAGLowering &SDL, 7631c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner Value *V, unsigned Reg) { 7641c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner SelectionDAG &DAG = SDL.DAG; 7651c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner DAG.setRoot(DAG.getCopyToReg(DAG.getRoot(), SDL.getValue(V), Reg)); 7661c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner} 7671c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 7681c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattnervoid SelectionDAGISel::BuildSelectionDAG(SelectionDAG &DAG, BasicBlock *LLVMBB, 7691c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner std::vector<std::pair<MachineInstr*, unsigned> > &PHINodesToUpdate, 7701c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner FunctionLoweringInfo &FuncInfo) { 7711c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner SelectionDAGLowering SDL(DAG, TLI, FuncInfo); 7721c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 7731c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner // If this is the entry block, emit arguments. 7741c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner Function *F = LLVMBB->getParent(); 7751c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner if (LLVMBB == &F->front()) { 7761c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner // FIXME: If an argument is only used in one basic block, we could directly 7771c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner // emit it (ONLY) into that block, not emitting the COPY_TO_VREG node. This 7781c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner // would improve codegen in several cases on X86 by allowing the loads to be 7791c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner // folded into the user operation. 7801c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner std::vector<SDOperand> Args = TLI.LowerArguments(*LLVMBB->getParent(), DAG); 7811c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 7821c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner unsigned a = 0; 7831c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner for (Function::aiterator AI = F->abegin(), E = F->aend(); AI != E; ++AI,++a) 7841c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner if (!AI->use_empty()) { 7851c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner SDL.setValue(AI, Args[a]); 7861c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner CopyValueToVirtualRegister(SDL, AI, FuncInfo.ValueMap[AI]); 7871c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner } 7881c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner } 7891c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 7901c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner BB = FuncInfo.MBBMap[LLVMBB]; 7911c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner SDL.setCurrentBasicBlock(BB); 7921c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 7931c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner // Lower all of the non-terminator instructions. 7941c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner for (BasicBlock::iterator I = LLVMBB->begin(), E = --LLVMBB->end(); 7951c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner I != E; ++I) 7961c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner SDL.visit(*I); 7971c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 7981c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner // Ensure that all instructions which are used outside of their defining 7991c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner // blocks are available as virtual registers. 8001c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner for (BasicBlock::iterator I = LLVMBB->begin(), E = LLVMBB->end(); I != E;++I) 8011c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner if (!I->use_empty()) { 802ee749d7488bd42df0f67e2d80048c63415943785Chris Lattner std::map<const Value*, unsigned>::iterator VMI =FuncInfo.ValueMap.find(I); 8031c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner if (VMI != FuncInfo.ValueMap.end()) 8041c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner CopyValueToVirtualRegister(SDL, I, VMI->second); 8051c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner } 8061c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 8071c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner // Handle PHI nodes in successor blocks. Emit code into the SelectionDAG to 8081c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner // ensure constants are generated when needed. Remember the virtual registers 8091c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner // that need to be added to the Machine PHI nodes as input. We cannot just 8101c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner // directly add them, because expansion might result in multiple MBB's for one 8111c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner // BB. As such, the start of the BB might correspond to a different MBB than 8121c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner // the end. 8131c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner // 8141c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 8151c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner // Emit constants only once even if used by multiple PHI nodes. 8161c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner std::map<Constant*, unsigned> ConstantsOut; 8171c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 8181c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner // Check successor nodes PHI nodes that expect a constant to be available from 8191c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner // this block. 8201c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner TerminatorInst *TI = LLVMBB->getTerminator(); 8211c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner for (unsigned succ = 0, e = TI->getNumSuccessors(); succ != e; ++succ) { 8221c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner BasicBlock *SuccBB = TI->getSuccessor(succ); 8231c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner MachineBasicBlock::iterator MBBI = FuncInfo.MBBMap[SuccBB]->begin(); 8241c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner PHINode *PN; 8251c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 8261c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner // At this point we know that there is a 1-1 correspondence between LLVM PHI 8271c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner // nodes and Machine PHI nodes, but the incoming operands have not been 8281c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner // emitted yet. 8291c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner for (BasicBlock::iterator I = SuccBB->begin(); 830f44fd88e9cdd7b47acb71ac78e3dccb91319c72dChris Lattner (PN = dyn_cast<PHINode>(I)); ++I) 831f44fd88e9cdd7b47acb71ac78e3dccb91319c72dChris Lattner if (!PN->use_empty()) { 832f44fd88e9cdd7b47acb71ac78e3dccb91319c72dChris Lattner unsigned Reg; 833f44fd88e9cdd7b47acb71ac78e3dccb91319c72dChris Lattner Value *PHIOp = PN->getIncomingValueForBlock(LLVMBB); 834f44fd88e9cdd7b47acb71ac78e3dccb91319c72dChris Lattner if (Constant *C = dyn_cast<Constant>(PHIOp)) { 835f44fd88e9cdd7b47acb71ac78e3dccb91319c72dChris Lattner unsigned &RegOut = ConstantsOut[C]; 836f44fd88e9cdd7b47acb71ac78e3dccb91319c72dChris Lattner if (RegOut == 0) { 837f44fd88e9cdd7b47acb71ac78e3dccb91319c72dChris Lattner RegOut = FuncInfo.CreateRegForValue(C); 838f44fd88e9cdd7b47acb71ac78e3dccb91319c72dChris Lattner CopyValueToVirtualRegister(SDL, C, RegOut); 839f44fd88e9cdd7b47acb71ac78e3dccb91319c72dChris Lattner } 840f44fd88e9cdd7b47acb71ac78e3dccb91319c72dChris Lattner Reg = RegOut; 841f44fd88e9cdd7b47acb71ac78e3dccb91319c72dChris Lattner } else { 842f44fd88e9cdd7b47acb71ac78e3dccb91319c72dChris Lattner Reg = FuncInfo.ValueMap[PHIOp]; 843ee749d7488bd42df0f67e2d80048c63415943785Chris Lattner if (Reg == 0) { 844ee749d7488bd42df0f67e2d80048c63415943785Chris Lattner assert(isa<AllocaInst>(PHIOp) && 845ee749d7488bd42df0f67e2d80048c63415943785Chris Lattner FuncInfo.StaticAllocaMap.count(cast<AllocaInst>(PHIOp)) && 846ee749d7488bd42df0f67e2d80048c63415943785Chris Lattner "Didn't codegen value into a register!??"); 847ee749d7488bd42df0f67e2d80048c63415943785Chris Lattner Reg = FuncInfo.CreateRegForValue(PHIOp); 848ee749d7488bd42df0f67e2d80048c63415943785Chris Lattner CopyValueToVirtualRegister(SDL, PHIOp, Reg); 849ee749d7488bd42df0f67e2d80048c63415943785Chris Lattner } 8501c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner } 851f44fd88e9cdd7b47acb71ac78e3dccb91319c72dChris Lattner 852f44fd88e9cdd7b47acb71ac78e3dccb91319c72dChris Lattner // Remember that this register needs to added to the machine PHI node as 853f44fd88e9cdd7b47acb71ac78e3dccb91319c72dChris Lattner // the input for this MBB. 854f44fd88e9cdd7b47acb71ac78e3dccb91319c72dChris Lattner unsigned NumElements = 855f44fd88e9cdd7b47acb71ac78e3dccb91319c72dChris Lattner TLI.getNumElements(TLI.getValueType(PN->getType())); 856f44fd88e9cdd7b47acb71ac78e3dccb91319c72dChris Lattner for (unsigned i = 0, e = NumElements; i != e; ++i) 857f44fd88e9cdd7b47acb71ac78e3dccb91319c72dChris Lattner PHINodesToUpdate.push_back(std::make_pair(MBBI++, Reg+i)); 8581c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner } 8591c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner } 8601c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner ConstantsOut.clear(); 8611c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 8621c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner // Lower the terminator after the copies are emitted. 8631c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner SDL.visit(*LLVMBB->getTerminator()); 8641c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner} 8651c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 8661c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattnervoid SelectionDAGISel::SelectBasicBlock(BasicBlock *LLVMBB, MachineFunction &MF, 8671c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner FunctionLoweringInfo &FuncInfo) { 8681c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner SelectionDAG DAG(TLI.getTargetMachine(), MF); 8691c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner CurDAG = &DAG; 8701c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner std::vector<std::pair<MachineInstr*, unsigned> > PHINodesToUpdate; 8711c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 8721c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner // First step, lower LLVM code to some DAG. This DAG may use operations and 8731c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner // types that are not supported by the target. 8741c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner BuildSelectionDAG(DAG, LLVMBB, PHINodesToUpdate, FuncInfo); 8751c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 8761c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner DEBUG(std::cerr << "Lowered selection DAG:\n"); 8771c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner DEBUG(DAG.dump()); 8781c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 8791c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner // Second step, hack on the DAG until it only uses operations and types that 8801c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner // the target supports. 8811c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner DAG.Legalize(TLI); 8821c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 8831c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner DEBUG(std::cerr << "Legalized selection DAG:\n"); 8841c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner DEBUG(DAG.dump()); 8851c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 8861c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner // Finally, instruction select all of the operations to machine code, adding 8871c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner // the code to the MachineBasicBlock. 8881c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner InstructionSelectBasicBlock(DAG); 8891c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 8901c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner DEBUG(std::cerr << "Selected machine code:\n"); 8911c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner DEBUG(BB->dump()); 8921c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner 8931c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner // Finally, now that we know what the last MBB the LLVM BB expanded is, update 8941c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner // PHI nodes in successors. 8951c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner for (unsigned i = 0, e = PHINodesToUpdate.size(); i != e; ++i) { 8961c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner MachineInstr *PHI = PHINodesToUpdate[i].first; 8971c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner assert(PHI->getOpcode() == TargetInstrInfo::PHI && 8981c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner "This is not a machine PHI node that we are updating!"); 8991c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner PHI->addRegOperand(PHINodesToUpdate[i].second); 9001c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner PHI->addMachineBasicBlockOperand(BB); 9011c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner } 9021c08c714bb3d07c3b39f06bfcbb4559fefca73f9Chris Lattner} 903