1480093f4SDimitry Andric //===-- VEISelDAGToDAG.cpp - A dag to dag inst selector for VE ------------===// 2480093f4SDimitry Andric // 3480093f4SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4480093f4SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5480093f4SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6480093f4SDimitry Andric // 7480093f4SDimitry Andric //===----------------------------------------------------------------------===// 8480093f4SDimitry Andric // 9480093f4SDimitry Andric // This file defines an instruction selector for the VE target. 10480093f4SDimitry Andric // 11480093f4SDimitry Andric //===----------------------------------------------------------------------===// 12480093f4SDimitry Andric 1381ad6265SDimitry Andric #include "VE.h" 14480093f4SDimitry Andric #include "VETargetMachine.h" 15480093f4SDimitry Andric #include "llvm/CodeGen/MachineRegisterInfo.h" 16480093f4SDimitry Andric #include "llvm/CodeGen/SelectionDAGISel.h" 17480093f4SDimitry Andric #include "llvm/IR/Intrinsics.h" 18480093f4SDimitry Andric #include "llvm/Support/Debug.h" 19480093f4SDimitry Andric #include "llvm/Support/ErrorHandling.h" 20480093f4SDimitry Andric #include "llvm/Support/raw_ostream.h" 21480093f4SDimitry Andric using namespace llvm; 22480093f4SDimitry Andric 23*bdd1243dSDimitry Andric #define DEBUG_TYPE "ve-isel" 24*bdd1243dSDimitry Andric #define PASS_NAME "VE DAG->DAG Pattern Instruction Selection" 255ffd83dbSDimitry Andric 26480093f4SDimitry Andric //===--------------------------------------------------------------------===// 27480093f4SDimitry Andric /// VEDAGToDAGISel - VE specific code to select VE machine 28480093f4SDimitry Andric /// instructions for SelectionDAG operations. 29480093f4SDimitry Andric /// 30480093f4SDimitry Andric namespace { 31480093f4SDimitry Andric class VEDAGToDAGISel : public SelectionDAGISel { 32480093f4SDimitry Andric /// Subtarget - Keep a pointer to the VE Subtarget around so that we can 33480093f4SDimitry Andric /// make the right decision when generating code for different targets. 34480093f4SDimitry Andric const VESubtarget *Subtarget; 35480093f4SDimitry Andric 36480093f4SDimitry Andric public: 37*bdd1243dSDimitry Andric static char ID; 38*bdd1243dSDimitry Andric 39*bdd1243dSDimitry Andric VEDAGToDAGISel() = delete; 40*bdd1243dSDimitry Andric 41*bdd1243dSDimitry Andric explicit VEDAGToDAGISel(VETargetMachine &tm) : SelectionDAGISel(ID, tm) {} 42480093f4SDimitry Andric 43480093f4SDimitry Andric bool runOnMachineFunction(MachineFunction &MF) override { 44480093f4SDimitry Andric Subtarget = &MF.getSubtarget<VESubtarget>(); 45480093f4SDimitry Andric return SelectionDAGISel::runOnMachineFunction(MF); 46480093f4SDimitry Andric } 47480093f4SDimitry Andric 48480093f4SDimitry Andric void Select(SDNode *N) override; 49480093f4SDimitry Andric 505ffd83dbSDimitry Andric // Complex Pattern Selectors. 515ffd83dbSDimitry Andric bool selectADDRrri(SDValue N, SDValue &Base, SDValue &Index, SDValue &Offset); 525ffd83dbSDimitry Andric bool selectADDRrii(SDValue N, SDValue &Base, SDValue &Index, SDValue &Offset); 535ffd83dbSDimitry Andric bool selectADDRzri(SDValue N, SDValue &Base, SDValue &Index, SDValue &Offset); 545ffd83dbSDimitry Andric bool selectADDRzii(SDValue N, SDValue &Base, SDValue &Index, SDValue &Offset); 555ffd83dbSDimitry Andric bool selectADDRri(SDValue N, SDValue &Base, SDValue &Offset); 56e8d8bef9SDimitry Andric bool selectADDRzi(SDValue N, SDValue &Base, SDValue &Offset); 575ffd83dbSDimitry Andric 58*bdd1243dSDimitry Andric /// SelectInlineAsmMemoryOperand - Implement addressing mode selection for 59*bdd1243dSDimitry Andric /// inline asm expressions. 60*bdd1243dSDimitry Andric bool SelectInlineAsmMemoryOperand(const SDValue &Op, 61*bdd1243dSDimitry Andric unsigned ConstraintID, 62*bdd1243dSDimitry Andric std::vector<SDValue> &OutOps) override; 63480093f4SDimitry Andric 64480093f4SDimitry Andric // Include the pieces autogenerated from the target description. 65480093f4SDimitry Andric #include "VEGenDAGISel.inc" 665ffd83dbSDimitry Andric 675ffd83dbSDimitry Andric private: 685ffd83dbSDimitry Andric SDNode *getGlobalBaseReg(); 695ffd83dbSDimitry Andric 705ffd83dbSDimitry Andric bool matchADDRrr(SDValue N, SDValue &Base, SDValue &Index); 715ffd83dbSDimitry Andric bool matchADDRri(SDValue N, SDValue &Base, SDValue &Offset); 72480093f4SDimitry Andric }; 73480093f4SDimitry Andric } // end anonymous namespace 74480093f4SDimitry Andric 75*bdd1243dSDimitry Andric char VEDAGToDAGISel::ID = 0; 76*bdd1243dSDimitry Andric 77*bdd1243dSDimitry Andric INITIALIZE_PASS(VEDAGToDAGISel, DEBUG_TYPE, PASS_NAME, false, false) 78*bdd1243dSDimitry Andric 795ffd83dbSDimitry Andric bool VEDAGToDAGISel::selectADDRrri(SDValue Addr, SDValue &Base, SDValue &Index, 805ffd83dbSDimitry Andric SDValue &Offset) { 815ffd83dbSDimitry Andric if (Addr.getOpcode() == ISD::FrameIndex) 825ffd83dbSDimitry Andric return false; 835ffd83dbSDimitry Andric if (Addr.getOpcode() == ISD::TargetExternalSymbol || 845ffd83dbSDimitry Andric Addr.getOpcode() == ISD::TargetGlobalAddress || 855ffd83dbSDimitry Andric Addr.getOpcode() == ISD::TargetGlobalTLSAddress) 865ffd83dbSDimitry Andric return false; // direct calls. 875ffd83dbSDimitry Andric 885ffd83dbSDimitry Andric SDValue LHS, RHS; 895ffd83dbSDimitry Andric if (matchADDRri(Addr, LHS, RHS)) { 905ffd83dbSDimitry Andric if (matchADDRrr(LHS, Base, Index)) { 915ffd83dbSDimitry Andric Offset = RHS; 925ffd83dbSDimitry Andric return true; 935ffd83dbSDimitry Andric } 945ffd83dbSDimitry Andric // Return false to try selectADDRrii. 955ffd83dbSDimitry Andric return false; 965ffd83dbSDimitry Andric } 975ffd83dbSDimitry Andric if (matchADDRrr(Addr, LHS, RHS)) { 98e8d8bef9SDimitry Andric // If the input is a pair of a frame-index and a register, move a 99e8d8bef9SDimitry Andric // frame-index to LHS. This generates MI with following operands. 100e8d8bef9SDimitry Andric // %dest, #FI, %reg, offset 101e8d8bef9SDimitry Andric // In the eliminateFrameIndex, above MI is converted to the following. 102e8d8bef9SDimitry Andric // %dest, %fp, %reg, fi_offset + offset 103fe6060f1SDimitry Andric if (isa<FrameIndexSDNode>(RHS)) 104e8d8bef9SDimitry Andric std::swap(LHS, RHS); 105e8d8bef9SDimitry Andric 1065ffd83dbSDimitry Andric if (matchADDRri(RHS, Index, Offset)) { 1075ffd83dbSDimitry Andric Base = LHS; 1085ffd83dbSDimitry Andric return true; 1095ffd83dbSDimitry Andric } 1105ffd83dbSDimitry Andric if (matchADDRri(LHS, Base, Offset)) { 1115ffd83dbSDimitry Andric Index = RHS; 1125ffd83dbSDimitry Andric return true; 1135ffd83dbSDimitry Andric } 1145ffd83dbSDimitry Andric Base = LHS; 1155ffd83dbSDimitry Andric Index = RHS; 1165ffd83dbSDimitry Andric Offset = CurDAG->getTargetConstant(0, SDLoc(Addr), MVT::i32); 1175ffd83dbSDimitry Andric return true; 1185ffd83dbSDimitry Andric } 1195ffd83dbSDimitry Andric return false; // Let the reg+imm(=0) pattern catch this! 1205ffd83dbSDimitry Andric } 1215ffd83dbSDimitry Andric 1225ffd83dbSDimitry Andric bool VEDAGToDAGISel::selectADDRrii(SDValue Addr, SDValue &Base, SDValue &Index, 1235ffd83dbSDimitry Andric SDValue &Offset) { 1245ffd83dbSDimitry Andric if (matchADDRri(Addr, Base, Offset)) { 1255ffd83dbSDimitry Andric Index = CurDAG->getTargetConstant(0, SDLoc(Addr), MVT::i32); 1265ffd83dbSDimitry Andric return true; 1275ffd83dbSDimitry Andric } 1285ffd83dbSDimitry Andric 1295ffd83dbSDimitry Andric Base = Addr; 1305ffd83dbSDimitry Andric Index = CurDAG->getTargetConstant(0, SDLoc(Addr), MVT::i32); 1315ffd83dbSDimitry Andric Offset = CurDAG->getTargetConstant(0, SDLoc(Addr), MVT::i32); 1325ffd83dbSDimitry Andric return true; 1335ffd83dbSDimitry Andric } 1345ffd83dbSDimitry Andric 1355ffd83dbSDimitry Andric bool VEDAGToDAGISel::selectADDRzri(SDValue Addr, SDValue &Base, SDValue &Index, 1365ffd83dbSDimitry Andric SDValue &Offset) { 1375ffd83dbSDimitry Andric // Prefer ADDRrii. 1385ffd83dbSDimitry Andric return false; 1395ffd83dbSDimitry Andric } 1405ffd83dbSDimitry Andric 1415ffd83dbSDimitry Andric bool VEDAGToDAGISel::selectADDRzii(SDValue Addr, SDValue &Base, SDValue &Index, 1425ffd83dbSDimitry Andric SDValue &Offset) { 143fe6060f1SDimitry Andric if (isa<FrameIndexSDNode>(Addr)) 1445ffd83dbSDimitry Andric return false; 1455ffd83dbSDimitry Andric if (Addr.getOpcode() == ISD::TargetExternalSymbol || 1465ffd83dbSDimitry Andric Addr.getOpcode() == ISD::TargetGlobalAddress || 1475ffd83dbSDimitry Andric Addr.getOpcode() == ISD::TargetGlobalTLSAddress) 1485ffd83dbSDimitry Andric return false; // direct calls. 1495ffd83dbSDimitry Andric 150e8d8bef9SDimitry Andric if (auto *CN = dyn_cast<ConstantSDNode>(Addr)) { 1515ffd83dbSDimitry Andric if (isInt<32>(CN->getSExtValue())) { 1525ffd83dbSDimitry Andric Base = CurDAG->getTargetConstant(0, SDLoc(Addr), MVT::i32); 1535ffd83dbSDimitry Andric Index = CurDAG->getTargetConstant(0, SDLoc(Addr), MVT::i32); 1545ffd83dbSDimitry Andric Offset = 1555ffd83dbSDimitry Andric CurDAG->getTargetConstant(CN->getZExtValue(), SDLoc(Addr), MVT::i32); 1565ffd83dbSDimitry Andric return true; 1575ffd83dbSDimitry Andric } 1585ffd83dbSDimitry Andric } 1595ffd83dbSDimitry Andric return false; 1605ffd83dbSDimitry Andric } 1615ffd83dbSDimitry Andric 1625ffd83dbSDimitry Andric bool VEDAGToDAGISel::selectADDRri(SDValue Addr, SDValue &Base, 1635ffd83dbSDimitry Andric SDValue &Offset) { 1645ffd83dbSDimitry Andric if (matchADDRri(Addr, Base, Offset)) 1655ffd83dbSDimitry Andric return true; 1665ffd83dbSDimitry Andric 1675ffd83dbSDimitry Andric Base = Addr; 1685ffd83dbSDimitry Andric Offset = CurDAG->getTargetConstant(0, SDLoc(Addr), MVT::i32); 1695ffd83dbSDimitry Andric return true; 1705ffd83dbSDimitry Andric } 1715ffd83dbSDimitry Andric 172e8d8bef9SDimitry Andric bool VEDAGToDAGISel::selectADDRzi(SDValue Addr, SDValue &Base, 173e8d8bef9SDimitry Andric SDValue &Offset) { 174fe6060f1SDimitry Andric if (isa<FrameIndexSDNode>(Addr)) 175e8d8bef9SDimitry Andric return false; 176e8d8bef9SDimitry Andric if (Addr.getOpcode() == ISD::TargetExternalSymbol || 177e8d8bef9SDimitry Andric Addr.getOpcode() == ISD::TargetGlobalAddress || 178e8d8bef9SDimitry Andric Addr.getOpcode() == ISD::TargetGlobalTLSAddress) 179e8d8bef9SDimitry Andric return false; // direct calls. 180e8d8bef9SDimitry Andric 181e8d8bef9SDimitry Andric if (auto *CN = dyn_cast<ConstantSDNode>(Addr)) { 182e8d8bef9SDimitry Andric if (isInt<32>(CN->getSExtValue())) { 183e8d8bef9SDimitry Andric Base = CurDAG->getTargetConstant(0, SDLoc(Addr), MVT::i32); 184e8d8bef9SDimitry Andric Offset = 185e8d8bef9SDimitry Andric CurDAG->getTargetConstant(CN->getZExtValue(), SDLoc(Addr), MVT::i32); 186e8d8bef9SDimitry Andric return true; 187e8d8bef9SDimitry Andric } 188e8d8bef9SDimitry Andric } 189e8d8bef9SDimitry Andric return false; 190e8d8bef9SDimitry Andric } 191e8d8bef9SDimitry Andric 1925ffd83dbSDimitry Andric bool VEDAGToDAGISel::matchADDRrr(SDValue Addr, SDValue &Base, SDValue &Index) { 193fe6060f1SDimitry Andric if (isa<FrameIndexSDNode>(Addr)) 1945ffd83dbSDimitry Andric return false; 1955ffd83dbSDimitry Andric if (Addr.getOpcode() == ISD::TargetExternalSymbol || 1965ffd83dbSDimitry Andric Addr.getOpcode() == ISD::TargetGlobalAddress || 1975ffd83dbSDimitry Andric Addr.getOpcode() == ISD::TargetGlobalTLSAddress) 1985ffd83dbSDimitry Andric return false; // direct calls. 1995ffd83dbSDimitry Andric 2005ffd83dbSDimitry Andric if (Addr.getOpcode() == ISD::ADD) { 2015ffd83dbSDimitry Andric ; // Nothing to do here. 2025ffd83dbSDimitry Andric } else if (Addr.getOpcode() == ISD::OR) { 2035ffd83dbSDimitry Andric // We want to look through a transform in InstCombine and DAGCombiner that 2045ffd83dbSDimitry Andric // turns 'add' into 'or', so we can treat this 'or' exactly like an 'add'. 2055ffd83dbSDimitry Andric if (!CurDAG->haveNoCommonBitsSet(Addr.getOperand(0), Addr.getOperand(1))) 2065ffd83dbSDimitry Andric return false; 2075ffd83dbSDimitry Andric } else { 2085ffd83dbSDimitry Andric return false; 2095ffd83dbSDimitry Andric } 2105ffd83dbSDimitry Andric 2115ffd83dbSDimitry Andric if (Addr.getOperand(0).getOpcode() == VEISD::Lo || 2125ffd83dbSDimitry Andric Addr.getOperand(1).getOpcode() == VEISD::Lo) 2135ffd83dbSDimitry Andric return false; // Let the LEASL patterns catch this! 2145ffd83dbSDimitry Andric 2155ffd83dbSDimitry Andric Base = Addr.getOperand(0); 2165ffd83dbSDimitry Andric Index = Addr.getOperand(1); 2175ffd83dbSDimitry Andric return true; 2185ffd83dbSDimitry Andric } 2195ffd83dbSDimitry Andric 2205ffd83dbSDimitry Andric bool VEDAGToDAGISel::matchADDRri(SDValue Addr, SDValue &Base, SDValue &Offset) { 2215ffd83dbSDimitry Andric auto AddrTy = Addr->getValueType(0); 2225ffd83dbSDimitry Andric if (FrameIndexSDNode *FIN = dyn_cast<FrameIndexSDNode>(Addr)) { 2235ffd83dbSDimitry Andric Base = CurDAG->getTargetFrameIndex(FIN->getIndex(), AddrTy); 2245ffd83dbSDimitry Andric Offset = CurDAG->getTargetConstant(0, SDLoc(Addr), MVT::i32); 2255ffd83dbSDimitry Andric return true; 2265ffd83dbSDimitry Andric } 2275ffd83dbSDimitry Andric if (Addr.getOpcode() == ISD::TargetExternalSymbol || 2285ffd83dbSDimitry Andric Addr.getOpcode() == ISD::TargetGlobalAddress || 2295ffd83dbSDimitry Andric Addr.getOpcode() == ISD::TargetGlobalTLSAddress) 2305ffd83dbSDimitry Andric return false; // direct calls. 2315ffd83dbSDimitry Andric 2325ffd83dbSDimitry Andric if (CurDAG->isBaseWithConstantOffset(Addr)) { 2335ffd83dbSDimitry Andric ConstantSDNode *CN = cast<ConstantSDNode>(Addr.getOperand(1)); 2345ffd83dbSDimitry Andric if (isInt<32>(CN->getSExtValue())) { 2355ffd83dbSDimitry Andric if (FrameIndexSDNode *FIN = 2365ffd83dbSDimitry Andric dyn_cast<FrameIndexSDNode>(Addr.getOperand(0))) { 2375ffd83dbSDimitry Andric // Constant offset from frame ref. 2385ffd83dbSDimitry Andric Base = CurDAG->getTargetFrameIndex(FIN->getIndex(), AddrTy); 2395ffd83dbSDimitry Andric } else { 2405ffd83dbSDimitry Andric Base = Addr.getOperand(0); 2415ffd83dbSDimitry Andric } 2425ffd83dbSDimitry Andric Offset = 2435ffd83dbSDimitry Andric CurDAG->getTargetConstant(CN->getZExtValue(), SDLoc(Addr), MVT::i32); 2445ffd83dbSDimitry Andric return true; 2455ffd83dbSDimitry Andric } 2465ffd83dbSDimitry Andric } 2475ffd83dbSDimitry Andric return false; 2485ffd83dbSDimitry Andric } 2495ffd83dbSDimitry Andric 250480093f4SDimitry Andric void VEDAGToDAGISel::Select(SDNode *N) { 251480093f4SDimitry Andric SDLoc dl(N); 252480093f4SDimitry Andric if (N->isMachineOpcode()) { 253480093f4SDimitry Andric N->setNodeId(-1); 254480093f4SDimitry Andric return; // Already selected. 255480093f4SDimitry Andric } 256480093f4SDimitry Andric 2575ffd83dbSDimitry Andric switch (N->getOpcode()) { 25881ad6265SDimitry Andric 25981ad6265SDimitry Andric // Late eliminate the LEGALAVL wrapper 26081ad6265SDimitry Andric case VEISD::LEGALAVL: 26181ad6265SDimitry Andric ReplaceNode(N, N->getOperand(0).getNode()); 26281ad6265SDimitry Andric return; 26381ad6265SDimitry Andric 26481ad6265SDimitry Andric // Lower (broadcast 1) and (broadcast 0) to VM[P]0 26581ad6265SDimitry Andric case VEISD::VEC_BROADCAST: { 26681ad6265SDimitry Andric MVT SplatResTy = N->getSimpleValueType(0); 26781ad6265SDimitry Andric if (SplatResTy.getVectorElementType() != MVT::i1) 26881ad6265SDimitry Andric break; 26981ad6265SDimitry Andric 27081ad6265SDimitry Andric // Constant non-zero broadcast. 27181ad6265SDimitry Andric auto BConst = dyn_cast<ConstantSDNode>(N->getOperand(0)); 27281ad6265SDimitry Andric if (!BConst) 27381ad6265SDimitry Andric break; 27481ad6265SDimitry Andric bool BCTrueMask = (BConst->getSExtValue() != 0); 27581ad6265SDimitry Andric if (!BCTrueMask) 27681ad6265SDimitry Andric break; 27781ad6265SDimitry Andric 27881ad6265SDimitry Andric // Packed or non-packed. 27981ad6265SDimitry Andric SDValue New; 28081ad6265SDimitry Andric if (SplatResTy.getVectorNumElements() == StandardVectorWidth) { 28181ad6265SDimitry Andric New = CurDAG->getCopyFromReg(CurDAG->getEntryNode(), SDLoc(N), VE::VM0, 28281ad6265SDimitry Andric MVT::v256i1); 28381ad6265SDimitry Andric } else if (SplatResTy.getVectorNumElements() == PackedVectorWidth) { 28481ad6265SDimitry Andric New = CurDAG->getCopyFromReg(CurDAG->getEntryNode(), SDLoc(N), VE::VMP0, 28581ad6265SDimitry Andric MVT::v512i1); 28681ad6265SDimitry Andric } else 28781ad6265SDimitry Andric break; 28881ad6265SDimitry Andric 28981ad6265SDimitry Andric // Replace. 29081ad6265SDimitry Andric ReplaceNode(N, New.getNode()); 29181ad6265SDimitry Andric return; 29281ad6265SDimitry Andric } 29381ad6265SDimitry Andric 2945ffd83dbSDimitry Andric case VEISD::GLOBAL_BASE_REG: 2955ffd83dbSDimitry Andric ReplaceNode(N, getGlobalBaseReg()); 2965ffd83dbSDimitry Andric return; 2975ffd83dbSDimitry Andric } 2985ffd83dbSDimitry Andric 299480093f4SDimitry Andric SelectCode(N); 300480093f4SDimitry Andric } 301480093f4SDimitry Andric 302*bdd1243dSDimitry Andric /// SelectInlineAsmMemoryOperand - Implement addressing mode selection for 303*bdd1243dSDimitry Andric /// inline asm expressions. 304*bdd1243dSDimitry Andric bool 305*bdd1243dSDimitry Andric VEDAGToDAGISel::SelectInlineAsmMemoryOperand(const SDValue &Op, 306*bdd1243dSDimitry Andric unsigned ConstraintID, 307*bdd1243dSDimitry Andric std::vector<SDValue> &OutOps) { 308*bdd1243dSDimitry Andric SDValue Op0, Op1; 309*bdd1243dSDimitry Andric switch (ConstraintID) { 310*bdd1243dSDimitry Andric default: 311*bdd1243dSDimitry Andric llvm_unreachable("Unexpected asm memory constraint"); 312*bdd1243dSDimitry Andric case InlineAsm::Constraint_o: 313*bdd1243dSDimitry Andric case InlineAsm::Constraint_m: // memory 314*bdd1243dSDimitry Andric // Try to match ADDRri since reg+imm style is safe for all VE instructions 315*bdd1243dSDimitry Andric // with a memory operand. 316*bdd1243dSDimitry Andric if (selectADDRri(Op, Op0, Op1)) { 317*bdd1243dSDimitry Andric OutOps.push_back(Op0); 318*bdd1243dSDimitry Andric OutOps.push_back(Op1); 319*bdd1243dSDimitry Andric return false; 320*bdd1243dSDimitry Andric } 321*bdd1243dSDimitry Andric // Otherwise, require the address to be in a register and immediate 0. 322*bdd1243dSDimitry Andric OutOps.push_back(Op); 323*bdd1243dSDimitry Andric OutOps.push_back(CurDAG->getTargetConstant(0, SDLoc(Op), MVT::i32)); 324*bdd1243dSDimitry Andric return false; 325*bdd1243dSDimitry Andric } 326*bdd1243dSDimitry Andric return true; 327*bdd1243dSDimitry Andric } 328*bdd1243dSDimitry Andric 3295ffd83dbSDimitry Andric SDNode *VEDAGToDAGISel::getGlobalBaseReg() { 3305ffd83dbSDimitry Andric Register GlobalBaseReg = Subtarget->getInstrInfo()->getGlobalBaseReg(MF); 3315ffd83dbSDimitry Andric return CurDAG 3325ffd83dbSDimitry Andric ->getRegister(GlobalBaseReg, TLI->getPointerTy(CurDAG->getDataLayout())) 3335ffd83dbSDimitry Andric .getNode(); 3345ffd83dbSDimitry Andric } 3355ffd83dbSDimitry Andric 336480093f4SDimitry Andric /// createVEISelDag - This pass converts a legalized DAG into a 337480093f4SDimitry Andric /// VE-specific DAG, ready for instruction scheduling. 338480093f4SDimitry Andric /// 339480093f4SDimitry Andric FunctionPass *llvm::createVEISelDag(VETargetMachine &TM) { 340480093f4SDimitry Andric return new VEDAGToDAGISel(TM); 341480093f4SDimitry Andric } 342