blob: 49ff4f2a5d5aa428294e22a92f84dd051ecd1004 [file] [log] [blame]
Chris Lattner1c08c712005-01-07 07:47:53 +00001//===-- SelectionDAGISel.cpp - Implement the SelectionDAGISel class -------===//
Misha Brukmanedf128a2005-04-21 22:36:52 +00002//
Chris Lattner1c08c712005-01-07 07:47:53 +00003// The LLVM Compiler Infrastructure
4//
Chris Lattner4ee451d2007-12-29 20:36:04 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Misha Brukmanedf128a2005-04-21 22:36:52 +00007//
Chris Lattner1c08c712005-01-07 07:47:53 +00008//===----------------------------------------------------------------------===//
9//
10// This implements the SelectionDAGISel class.
11//
12//===----------------------------------------------------------------------===//
13
14#define DEBUG_TYPE "isel"
Dan Gohman84fbac52009-02-06 17:22:58 +000015#include "ScheduleDAGSDNodes.h"
Dan Gohmanf0cbcd42008-09-03 16:12:24 +000016#include "SelectionDAGBuild.h"
Dan Gohman84fbac52009-02-06 17:22:58 +000017#include "llvm/CodeGen/SelectionDAGISel.h"
Jim Laskeyc7c3f112006-10-16 20:52:31 +000018#include "llvm/Analysis/AliasAnalysis.h"
Anton Korobeynikov5502bf62007-04-04 21:14:49 +000019#include "llvm/Constants.h"
Chris Lattneradf6a962005-05-13 18:50:42 +000020#include "llvm/CallingConv.h"
Chris Lattner1c08c712005-01-07 07:47:53 +000021#include "llvm/DerivedTypes.h"
22#include "llvm/Function.h"
Chris Lattner36ce6912005-11-29 06:21:05 +000023#include "llvm/GlobalVariable.h"
Chris Lattnerce7518c2006-01-26 22:24:51 +000024#include "llvm/InlineAsm.h"
Chris Lattner1c08c712005-01-07 07:47:53 +000025#include "llvm/Instructions.h"
26#include "llvm/Intrinsics.h"
Jim Laskey43970fe2006-03-23 18:06:46 +000027#include "llvm/IntrinsicInst.h"
Dan Gohman78eca172008-08-19 22:33:34 +000028#include "llvm/CodeGen/FastISel.h"
Gordon Henriksen5a29c9e2008-08-17 12:56:54 +000029#include "llvm/CodeGen/GCStrategy.h"
Gordon Henriksen5eca0752008-08-17 18:44:35 +000030#include "llvm/CodeGen/GCMetadata.h"
Chris Lattner1c08c712005-01-07 07:47:53 +000031#include "llvm/CodeGen/MachineFunction.h"
32#include "llvm/CodeGen/MachineFrameInfo.h"
33#include "llvm/CodeGen/MachineInstrBuilder.h"
Chris Lattner84bc5422007-12-31 04:13:23 +000034#include "llvm/CodeGen/MachineJumpTableInfo.h"
35#include "llvm/CodeGen/MachineModuleInfo.h"
36#include "llvm/CodeGen/MachineRegisterInfo.h"
Dan Gohmanfc54c552009-01-15 22:18:12 +000037#include "llvm/CodeGen/ScheduleHazardRecognizer.h"
Jim Laskeyeb577ba2006-08-02 12:30:23 +000038#include "llvm/CodeGen/SchedulerRegistry.h"
Chris Lattner1c08c712005-01-07 07:47:53 +000039#include "llvm/CodeGen/SelectionDAG.h"
Devang Patel6e7a1612009-01-09 19:11:50 +000040#include "llvm/CodeGen/DwarfWriter.h"
Dan Gohman6f0d0242008-02-10 18:45:23 +000041#include "llvm/Target/TargetRegisterInfo.h"
Chris Lattner1c08c712005-01-07 07:47:53 +000042#include "llvm/Target/TargetData.h"
43#include "llvm/Target/TargetFrameInfo.h"
44#include "llvm/Target/TargetInstrInfo.h"
45#include "llvm/Target/TargetLowering.h"
46#include "llvm/Target/TargetMachine.h"
Vladimir Prus12472912006-05-23 13:43:15 +000047#include "llvm/Target/TargetOptions.h"
Chris Lattnera4f0b3a2006-08-27 12:54:02 +000048#include "llvm/Support/Compiler.h"
Evan Chengdb8d56b2008-06-30 20:45:06 +000049#include "llvm/Support/Debug.h"
50#include "llvm/Support/MathExtras.h"
51#include "llvm/Support/Timer.h"
Jeff Cohen7e881032006-02-24 02:52:40 +000052#include <algorithm>
Chris Lattner1c08c712005-01-07 07:47:53 +000053using namespace llvm;
54
Chris Lattneread0d882008-06-17 06:09:18 +000055static cl::opt<bool>
Duncan Sands7cb07872008-10-27 08:42:46 +000056DisableLegalizeTypes("disable-legalize-types", cl::Hidden);
Dan Gohman727809a2008-10-28 19:08:46 +000057#ifndef NDEBUG
Dan Gohman78eca172008-08-19 22:33:34 +000058static cl::opt<bool>
Dan Gohman293d5f82008-09-09 22:06:46 +000059EnableFastISelVerbose("fast-isel-verbose", cl::Hidden,
Dan Gohmand659d502008-10-20 21:30:12 +000060 cl::desc("Enable verbose messages in the \"fast\" "
Dan Gohman293d5f82008-09-09 22:06:46 +000061 "instruction selector"));
62static cl::opt<bool>
Dan Gohman4344a5d2008-09-09 23:05:00 +000063EnableFastISelAbort("fast-isel-abort", cl::Hidden,
64 cl::desc("Enable abort calls when \"fast\" instruction fails"));
Dan Gohman22751052008-10-28 20:35:31 +000065#else
66static const bool EnableFastISelVerbose = false,
67 EnableFastISelAbort = false;
Dan Gohman727809a2008-10-28 19:08:46 +000068#endif
Dan Gohman8a110532008-09-05 22:59:21 +000069static cl::opt<bool>
70SchedLiveInCopies("schedule-livein-copies",
71 cl::desc("Schedule copies of livein registers"),
72 cl::init(false));
Chris Lattneread0d882008-06-17 06:09:18 +000073
Chris Lattnerda8abb02005-09-01 18:44:10 +000074#ifndef NDEBUG
Chris Lattner7944d9d2005-01-12 03:41:21 +000075static cl::opt<bool>
Dan Gohman462dc7f2008-07-21 20:00:07 +000076ViewDAGCombine1("view-dag-combine1-dags", cl::Hidden,
77 cl::desc("Pop up a window to show dags before the first "
78 "dag combine pass"));
79static cl::opt<bool>
80ViewLegalizeTypesDAGs("view-legalize-types-dags", cl::Hidden,
81 cl::desc("Pop up a window to show dags before legalize types"));
82static cl::opt<bool>
83ViewLegalizeDAGs("view-legalize-dags", cl::Hidden,
84 cl::desc("Pop up a window to show dags before legalize"));
85static cl::opt<bool>
86ViewDAGCombine2("view-dag-combine2-dags", cl::Hidden,
87 cl::desc("Pop up a window to show dags before the second "
88 "dag combine pass"));
89static cl::opt<bool>
Duncan Sands25cf2272008-11-24 14:53:14 +000090ViewDAGCombineLT("view-dag-combine-lt-dags", cl::Hidden,
91 cl::desc("Pop up a window to show dags before the post legalize types"
92 " dag combine pass"));
93static cl::opt<bool>
Evan Chenga9c20912006-01-21 02:32:06 +000094ViewISelDAGs("view-isel-dags", cl::Hidden,
95 cl::desc("Pop up a window to show isel dags as they are selected"));
96static cl::opt<bool>
97ViewSchedDAGs("view-sched-dags", cl::Hidden,
98 cl::desc("Pop up a window to show sched dags as they are processed"));
Dan Gohman3e1a7ae2007-08-28 20:32:58 +000099static cl::opt<bool>
100ViewSUnitDAGs("view-sunit-dags", cl::Hidden,
Chris Lattner5bab7852008-01-25 17:24:52 +0000101 cl::desc("Pop up a window to show SUnit dags after they are processed"));
Chris Lattner7944d9d2005-01-12 03:41:21 +0000102#else
Dan Gohman462dc7f2008-07-21 20:00:07 +0000103static const bool ViewDAGCombine1 = false,
104 ViewLegalizeTypesDAGs = false, ViewLegalizeDAGs = false,
105 ViewDAGCombine2 = false,
Duncan Sands25cf2272008-11-24 14:53:14 +0000106 ViewDAGCombineLT = false,
Dan Gohman462dc7f2008-07-21 20:00:07 +0000107 ViewISelDAGs = false, ViewSchedDAGs = false,
108 ViewSUnitDAGs = false;
Chris Lattner7944d9d2005-01-12 03:41:21 +0000109#endif
110
Jim Laskeyeb577ba2006-08-02 12:30:23 +0000111//===---------------------------------------------------------------------===//
112///
113/// RegisterScheduler class - Track the registration of instruction schedulers.
114///
115//===---------------------------------------------------------------------===//
116MachinePassRegistry RegisterScheduler::Registry;
117
118//===---------------------------------------------------------------------===//
119///
120/// ISHeuristic command line option for instruction schedulers.
121///
122//===---------------------------------------------------------------------===//
Dan Gohman844731a2008-05-13 00:00:25 +0000123static cl::opt<RegisterScheduler::FunctionPassCtor, false,
124 RegisterPassParser<RegisterScheduler> >
125ISHeuristic("pre-RA-sched",
126 cl::init(&createDefaultScheduler),
127 cl::desc("Instruction schedulers available (before register"
128 " allocation):"));
Jim Laskey13ec7022006-08-01 14:21:23 +0000129
Dan Gohman844731a2008-05-13 00:00:25 +0000130static RegisterScheduler
Dan Gohmanb8cab922008-10-14 20:25:08 +0000131defaultListDAGScheduler("default", "Best scheduler for the target",
Dan Gohman844731a2008-05-13 00:00:25 +0000132 createDefaultScheduler);
Evan Cheng4ef10862006-01-23 07:01:07 +0000133
Chris Lattner1c08c712005-01-07 07:47:53 +0000134namespace llvm {
135 //===--------------------------------------------------------------------===//
Jim Laskey9373beb2006-08-01 19:14:14 +0000136 /// createDefaultScheduler - This creates an instruction scheduler appropriate
137 /// for the target.
Dan Gohman47ac0f02009-02-11 04:27:20 +0000138 ScheduleDAGSDNodes* createDefaultScheduler(SelectionDAGISel *IS,
139 bool Fast) {
Dan Gohmane9530ec2009-01-15 16:58:17 +0000140 const TargetLowering &TLI = IS->getTargetLowering();
141
Dan Gohman9e76fea2008-11-20 03:11:19 +0000142 if (Fast)
Dan Gohman79ce2762009-01-15 19:20:50 +0000143 return createFastDAGScheduler(IS, Fast);
Dan Gohman9e76fea2008-11-20 03:11:19 +0000144 if (TLI.getSchedulingPreference() == TargetLowering::SchedulingForLatency)
Dan Gohman79ce2762009-01-15 19:20:50 +0000145 return createTDListDAGScheduler(IS, Fast);
Dan Gohman9e76fea2008-11-20 03:11:19 +0000146 assert(TLI.getSchedulingPreference() ==
147 TargetLowering::SchedulingForRegPressure && "Unknown sched type!");
Dan Gohman79ce2762009-01-15 19:20:50 +0000148 return createBURRListDAGScheduler(IS, Fast);
Jim Laskey9373beb2006-08-01 19:14:14 +0000149 }
Chris Lattner1c08c712005-01-07 07:47:53 +0000150}
151
Evan Chengff9b3732008-01-30 18:18:23 +0000152// EmitInstrWithCustomInserter - This method should be implemented by targets
153// that mark instructions with the 'usesCustomDAGSchedInserter' flag. These
Chris Lattner025c39b2005-08-26 20:54:47 +0000154// instructions are special in various ways, which require special support to
155// insert. The specified MachineInstr is created but not inserted into any
156// basic blocks, and the scheduler passes ownership of it to this method.
Evan Chengff9b3732008-01-30 18:18:23 +0000157MachineBasicBlock *TargetLowering::EmitInstrWithCustomInserter(MachineInstr *MI,
Dan Gohman1fdbc1d2009-02-07 16:15:20 +0000158 MachineBasicBlock *MBB) const {
Bill Wendling832171c2006-12-07 20:04:42 +0000159 cerr << "If a target marks an instruction with "
160 << "'usesCustomDAGSchedInserter', it must implement "
Evan Chengff9b3732008-01-30 18:18:23 +0000161 << "TargetLowering::EmitInstrWithCustomInserter!\n";
Chris Lattner025c39b2005-08-26 20:54:47 +0000162 abort();
163 return 0;
164}
165
Dan Gohman8a110532008-09-05 22:59:21 +0000166/// EmitLiveInCopy - Emit a copy for a live in physical register. If the
167/// physical register has only a single copy use, then coalesced the copy
168/// if possible.
169static void EmitLiveInCopy(MachineBasicBlock *MBB,
170 MachineBasicBlock::iterator &InsertPos,
171 unsigned VirtReg, unsigned PhysReg,
172 const TargetRegisterClass *RC,
173 DenseMap<MachineInstr*, unsigned> &CopyRegMap,
174 const MachineRegisterInfo &MRI,
175 const TargetRegisterInfo &TRI,
176 const TargetInstrInfo &TII) {
177 unsigned NumUses = 0;
178 MachineInstr *UseMI = NULL;
179 for (MachineRegisterInfo::use_iterator UI = MRI.use_begin(VirtReg),
180 UE = MRI.use_end(); UI != UE; ++UI) {
181 UseMI = &*UI;
182 if (++NumUses > 1)
183 break;
184 }
185
186 // If the number of uses is not one, or the use is not a move instruction,
187 // don't coalesce. Also, only coalesce away a virtual register to virtual
188 // register copy.
189 bool Coalesced = false;
Evan Cheng04ee5a12009-01-20 19:12:24 +0000190 unsigned SrcReg, DstReg, SrcSubReg, DstSubReg;
Dan Gohman8a110532008-09-05 22:59:21 +0000191 if (NumUses == 1 &&
Evan Cheng04ee5a12009-01-20 19:12:24 +0000192 TII.isMoveInstr(*UseMI, SrcReg, DstReg, SrcSubReg, DstSubReg) &&
Dan Gohman8a110532008-09-05 22:59:21 +0000193 TargetRegisterInfo::isVirtualRegister(DstReg)) {
194 VirtReg = DstReg;
195 Coalesced = true;
196 }
197
198 // Now find an ideal location to insert the copy.
199 MachineBasicBlock::iterator Pos = InsertPos;
200 while (Pos != MBB->begin()) {
201 MachineInstr *PrevMI = prior(Pos);
202 DenseMap<MachineInstr*, unsigned>::iterator RI = CopyRegMap.find(PrevMI);
203 // copyRegToReg might emit multiple instructions to do a copy.
204 unsigned CopyDstReg = (RI == CopyRegMap.end()) ? 0 : RI->second;
205 if (CopyDstReg && !TRI.regsOverlap(CopyDstReg, PhysReg))
206 // This is what the BB looks like right now:
207 // r1024 = mov r0
208 // ...
209 // r1 = mov r1024
210 //
211 // We want to insert "r1025 = mov r1". Inserting this copy below the
212 // move to r1024 makes it impossible for that move to be coalesced.
213 //
214 // r1025 = mov r1
215 // r1024 = mov r0
216 // ...
217 // r1 = mov 1024
218 // r2 = mov 1025
219 break; // Woot! Found a good location.
220 --Pos;
221 }
222
223 TII.copyRegToReg(*MBB, Pos, VirtReg, PhysReg, RC, RC);
224 CopyRegMap.insert(std::make_pair(prior(Pos), VirtReg));
225 if (Coalesced) {
226 if (&*InsertPos == UseMI) ++InsertPos;
227 MBB->erase(UseMI);
228 }
229}
230
231/// EmitLiveInCopies - If this is the first basic block in the function,
232/// and if it has live ins that need to be copied into vregs, emit the
233/// copies into the block.
234static void EmitLiveInCopies(MachineBasicBlock *EntryMBB,
235 const MachineRegisterInfo &MRI,
236 const TargetRegisterInfo &TRI,
237 const TargetInstrInfo &TII) {
238 if (SchedLiveInCopies) {
239 // Emit the copies at a heuristically-determined location in the block.
240 DenseMap<MachineInstr*, unsigned> CopyRegMap;
241 MachineBasicBlock::iterator InsertPos = EntryMBB->begin();
242 for (MachineRegisterInfo::livein_iterator LI = MRI.livein_begin(),
243 E = MRI.livein_end(); LI != E; ++LI)
244 if (LI->second) {
245 const TargetRegisterClass *RC = MRI.getRegClass(LI->second);
246 EmitLiveInCopy(EntryMBB, InsertPos, LI->second, LI->first,
247 RC, CopyRegMap, MRI, TRI, TII);
248 }
249 } else {
250 // Emit the copies into the top of the block.
251 for (MachineRegisterInfo::livein_iterator LI = MRI.livein_begin(),
252 E = MRI.livein_end(); LI != E; ++LI)
253 if (LI->second) {
254 const TargetRegisterClass *RC = MRI.getRegClass(LI->second);
255 TII.copyRegToReg(*EntryMBB, EntryMBB->begin(),
256 LI->second, LI->first, RC, RC);
257 }
258 }
259}
260
Chris Lattner7041ee32005-01-11 05:56:49 +0000261//===----------------------------------------------------------------------===//
262// SelectionDAGISel code
263//===----------------------------------------------------------------------===//
Chris Lattner1c08c712005-01-07 07:47:53 +0000264
Dan Gohman79ce2762009-01-15 19:20:50 +0000265SelectionDAGISel::SelectionDAGISel(TargetMachine &tm, bool fast) :
266 FunctionPass(&ID), TM(tm), TLI(*tm.getTargetLowering()),
Dan Gohman7c3234c2008-08-27 23:52:12 +0000267 FuncInfo(new FunctionLoweringInfo(TLI)),
268 CurDAG(new SelectionDAG(TLI, *FuncInfo)),
Bill Wendlingdfdacee2009-02-19 21:12:54 +0000269 SDL(new SelectionDAGLowering(*CurDAG, TLI, *FuncInfo, fast)),
Dan Gohman7c3234c2008-08-27 23:52:12 +0000270 GFI(),
271 Fast(fast),
272 DAGSize(0)
273{}
274
275SelectionDAGISel::~SelectionDAGISel() {
276 delete SDL;
277 delete CurDAG;
278 delete FuncInfo;
279}
280
Duncan Sands83ec4b62008-06-06 12:08:01 +0000281unsigned SelectionDAGISel::MakeReg(MVT VT) {
Chris Lattner84bc5422007-12-31 04:13:23 +0000282 return RegInfo->createVirtualRegister(TLI.getRegClassFor(VT));
Chris Lattner1c08c712005-01-07 07:47:53 +0000283}
284
Chris Lattner495a0b52005-08-17 06:37:43 +0000285void SelectionDAGISel::getAnalysisUsage(AnalysisUsage &AU) const {
Jim Laskeyc7c3f112006-10-16 20:52:31 +0000286 AU.addRequired<AliasAnalysis>();
Gordon Henriksen5eca0752008-08-17 18:44:35 +0000287 AU.addRequired<GCModuleInfo>();
Devang Patel6e7a1612009-01-09 19:11:50 +0000288 AU.addRequired<DwarfWriter>();
Chris Lattnerc8d288f2007-03-31 04:18:03 +0000289 AU.setPreservesAll();
Chris Lattner495a0b52005-08-17 06:37:43 +0000290}
Chris Lattner1c08c712005-01-07 07:47:53 +0000291
Chris Lattner1c08c712005-01-07 07:47:53 +0000292bool SelectionDAGISel::runOnFunction(Function &Fn) {
Dan Gohman4344a5d2008-09-09 23:05:00 +0000293 // Do some sanity-checking on the command-line options.
294 assert((!EnableFastISelVerbose || EnableFastISel) &&
295 "-fast-isel-verbose requires -fast-isel");
296 assert((!EnableFastISelAbort || EnableFastISel) &&
297 "-fast-isel-abort requires -fast-isel");
298
Devang Patel16f2ffd2009-04-16 02:33:41 +0000299 // Do not codegen any 'available_externally' functions at all, they have
300 // definitions outside the translation unit.
301 if (Fn.hasAvailableExternallyLinkage())
302 return false;
303
304
Dan Gohman5f43f922007-08-27 16:26:13 +0000305 // Get alias analysis for load/store combining.
306 AA = &getAnalysis<AliasAnalysis>();
307
Dan Gohman8a110532008-09-05 22:59:21 +0000308 TargetMachine &TM = TLI.getTargetMachine();
Dan Gohman79ce2762009-01-15 19:20:50 +0000309 MF = &MachineFunction::construct(&Fn, TM);
Dan Gohman8a110532008-09-05 22:59:21 +0000310 const TargetInstrInfo &TII = *TM.getInstrInfo();
311 const TargetRegisterInfo &TRI = *TM.getRegisterInfo();
312
Dan Gohman79ce2762009-01-15 19:20:50 +0000313 if (MF->getFunction()->hasGC())
314 GFI = &getAnalysis<GCModuleInfo>().getFunctionInfo(*MF->getFunction());
Gordon Henriksence224772008-01-07 01:30:38 +0000315 else
Gordon Henriksen5eca0752008-08-17 18:44:35 +0000316 GFI = 0;
Dan Gohman79ce2762009-01-15 19:20:50 +0000317 RegInfo = &MF->getRegInfo();
Bill Wendling832171c2006-12-07 20:04:42 +0000318 DOUT << "\n\n\n=== " << Fn.getName() << "\n";
Chris Lattner1c08c712005-01-07 07:47:53 +0000319
Duncan Sands1465d612009-01-28 13:14:17 +0000320 MachineModuleInfo *MMI = getAnalysisIfAvailable<MachineModuleInfo>();
321 DwarfWriter *DW = getAnalysisIfAvailable<DwarfWriter>();
Dan Gohman79ce2762009-01-15 19:20:50 +0000322 CurDAG->init(*MF, MMI, DW);
Devang Patelb51d40c2009-02-03 18:46:32 +0000323 FuncInfo->set(Fn, *MF, *CurDAG, EnableFastISel);
Dan Gohman7c3234c2008-08-27 23:52:12 +0000324 SDL->init(GFI, *AA);
Chris Lattner1c08c712005-01-07 07:47:53 +0000325
Dale Johannesen1532f3d2008-04-02 00:25:04 +0000326 for (Function::iterator I = Fn.begin(), E = Fn.end(); I != E; ++I)
327 if (InvokeInst *Invoke = dyn_cast<InvokeInst>(I->getTerminator()))
328 // Mark landing pad.
Dan Gohman7c3234c2008-08-27 23:52:12 +0000329 FuncInfo->MBBMap[Invoke->getSuccessor(1)]->setIsLandingPad();
Duncan Sands9fac0b52007-06-06 10:05:18 +0000330
Dan Gohman79ce2762009-01-15 19:20:50 +0000331 SelectAllBasicBlocks(Fn, *MF, MMI, DW, TII);
Misha Brukmanedf128a2005-04-21 22:36:52 +0000332
Dan Gohman8a110532008-09-05 22:59:21 +0000333 // If the first basic block in the function has live ins that need to be
334 // copied into vregs, emit the copies into the top of the block before
335 // emitting the code for the block.
Dan Gohman79ce2762009-01-15 19:20:50 +0000336 EmitLiveInCopies(MF->begin(), *RegInfo, TRI, TII);
Dan Gohman8a110532008-09-05 22:59:21 +0000337
Evan Chengad2070c2007-02-10 02:43:39 +0000338 // Add function live-ins to entry block live-in set.
Dan Gohman8a110532008-09-05 22:59:21 +0000339 for (MachineRegisterInfo::livein_iterator I = RegInfo->livein_begin(),
340 E = RegInfo->livein_end(); I != E; ++I)
Dan Gohman79ce2762009-01-15 19:20:50 +0000341 MF->begin()->addLiveIn(I->first);
Evan Chengad2070c2007-02-10 02:43:39 +0000342
Duncan Sandsf4070822007-06-15 19:04:19 +0000343#ifndef NDEBUG
Dan Gohman7c3234c2008-08-27 23:52:12 +0000344 assert(FuncInfo->CatchInfoFound.size() == FuncInfo->CatchInfoLost.size() &&
Duncan Sandsf4070822007-06-15 19:04:19 +0000345 "Not all catch info was assigned to a landing pad!");
346#endif
347
Dan Gohman7c3234c2008-08-27 23:52:12 +0000348 FuncInfo->clear();
349
Chris Lattner1c08c712005-01-07 07:47:53 +0000350 return true;
351}
352
Duncan Sandsf4070822007-06-15 19:04:19 +0000353static void copyCatchInfo(BasicBlock *SrcBB, BasicBlock *DestBB,
354 MachineModuleInfo *MMI, FunctionLoweringInfo &FLI) {
Duncan Sandsf4070822007-06-15 19:04:19 +0000355 for (BasicBlock::iterator I = SrcBB->begin(), E = --SrcBB->end(); I != E; ++I)
Dan Gohmanf0cbcd42008-09-03 16:12:24 +0000356 if (EHSelectorInst *EHSel = dyn_cast<EHSelectorInst>(I)) {
Duncan Sandsf4070822007-06-15 19:04:19 +0000357 // Apply the catch info to DestBB.
Dan Gohmanf0cbcd42008-09-03 16:12:24 +0000358 AddCatchInfo(*EHSel, MMI, FLI.MBBMap[DestBB]);
Duncan Sandsf4070822007-06-15 19:04:19 +0000359#ifndef NDEBUG
Duncan Sands560a7372007-11-15 09:54:37 +0000360 if (!FLI.MBBMap[SrcBB]->isLandingPad())
Dan Gohmanf0cbcd42008-09-03 16:12:24 +0000361 FLI.CatchInfoFound.insert(EHSel);
Duncan Sandsf4070822007-06-15 19:04:19 +0000362#endif
363 }
364}
365
Arnold Schwaighofer30e62c02008-04-30 09:16:33 +0000366/// IsFixedFrameObjectWithPosOffset - Check if object is a fixed frame object and
367/// whether object offset >= 0.
368static bool
Dan Gohman79ce2762009-01-15 19:20:50 +0000369IsFixedFrameObjectWithPosOffset(MachineFrameInfo *MFI, SDValue Op) {
Arnold Schwaighofer30e62c02008-04-30 09:16:33 +0000370 if (!isa<FrameIndexSDNode>(Op)) return false;
371
372 FrameIndexSDNode * FrameIdxNode = dyn_cast<FrameIndexSDNode>(Op);
373 int FrameIdx = FrameIdxNode->getIndex();
374 return MFI->isFixedObjectIndex(FrameIdx) &&
375 MFI->getObjectOffset(FrameIdx) >= 0;
376}
377
378/// IsPossiblyOverwrittenArgumentOfTailCall - Check if the operand could
379/// possibly be overwritten when lowering the outgoing arguments in a tail
380/// call. Currently the implementation of this call is very conservative and
381/// assumes all arguments sourcing from FORMAL_ARGUMENTS or a CopyFromReg with
382/// virtual registers would be overwritten by direct lowering.
Dan Gohman475871a2008-07-27 21:46:04 +0000383static bool IsPossiblyOverwrittenArgumentOfTailCall(SDValue Op,
Dan Gohman79ce2762009-01-15 19:20:50 +0000384 MachineFrameInfo *MFI) {
Arnold Schwaighofer30e62c02008-04-30 09:16:33 +0000385 RegisterSDNode * OpReg = NULL;
386 if (Op.getOpcode() == ISD::FORMAL_ARGUMENTS ||
387 (Op.getOpcode()== ISD::CopyFromReg &&
388 (OpReg = dyn_cast<RegisterSDNode>(Op.getOperand(1))) &&
389 (OpReg->getReg() >= TargetRegisterInfo::FirstVirtualRegister)) ||
390 (Op.getOpcode() == ISD::LOAD &&
391 IsFixedFrameObjectWithPosOffset(MFI, Op.getOperand(1))) ||
392 (Op.getOpcode() == ISD::MERGE_VALUES &&
Gabor Greif99a6cb92008-08-26 22:36:50 +0000393 Op.getOperand(Op.getResNo()).getOpcode() == ISD::LOAD &&
394 IsFixedFrameObjectWithPosOffset(MFI, Op.getOperand(Op.getResNo()).
Arnold Schwaighofer30e62c02008-04-30 09:16:33 +0000395 getOperand(1))))
396 return true;
397 return false;
398}
399
Arnold Schwaighoferc85e1712007-10-11 19:40:01 +0000400/// CheckDAGForTailCallsAndFixThem - This Function looks for CALL nodes in the
Arnold Schwaighofer48abc5c2007-10-12 21:30:57 +0000401/// DAG and fixes their tailcall attribute operand.
Arnold Schwaighoferc85e1712007-10-11 19:40:01 +0000402static void CheckDAGForTailCallsAndFixThem(SelectionDAG &DAG,
Dan Gohmane9530ec2009-01-15 16:58:17 +0000403 const TargetLowering& TLI) {
Arnold Schwaighoferc85e1712007-10-11 19:40:01 +0000404 SDNode * Ret = NULL;
Dan Gohman475871a2008-07-27 21:46:04 +0000405 SDValue Terminator = DAG.getRoot();
Arnold Schwaighoferc85e1712007-10-11 19:40:01 +0000406
407 // Find RET node.
408 if (Terminator.getOpcode() == ISD::RET) {
Gabor Greifba36cb52008-08-28 21:40:38 +0000409 Ret = Terminator.getNode();
Arnold Schwaighoferc85e1712007-10-11 19:40:01 +0000410 }
411
412 // Fix tail call attribute of CALL nodes.
413 for (SelectionDAG::allnodes_iterator BE = DAG.allnodes_begin(),
Dan Gohman0e5f1302008-07-07 23:02:41 +0000414 BI = DAG.allnodes_end(); BI != BE; ) {
415 --BI;
Dan Gohman095cc292008-09-13 01:54:27 +0000416 if (CallSDNode *TheCall = dyn_cast<CallSDNode>(BI)) {
Dan Gohman475871a2008-07-27 21:46:04 +0000417 SDValue OpRet(Ret, 0);
418 SDValue OpCall(BI, 0);
Dan Gohman095cc292008-09-13 01:54:27 +0000419 bool isMarkedTailCall = TheCall->isTailCall();
Arnold Schwaighoferc85e1712007-10-11 19:40:01 +0000420 // If CALL node has tail call attribute set to true and the call is not
421 // eligible (no RET or the target rejects) the attribute is fixed to
Arnold Schwaighofer48abc5c2007-10-12 21:30:57 +0000422 // false. The TargetLowering::IsEligibleForTailCallOptimization function
Arnold Schwaighoferc85e1712007-10-11 19:40:01 +0000423 // must correctly identify tail call optimizable calls.
Arnold Schwaighofer30e62c02008-04-30 09:16:33 +0000424 if (!isMarkedTailCall) continue;
425 if (Ret==NULL ||
Dan Gohman095cc292008-09-13 01:54:27 +0000426 !TLI.IsEligibleForTailCallOptimization(TheCall, OpRet, DAG)) {
427 // Not eligible. Mark CALL node as non tail call. Note that we
428 // can modify the call node in place since calls are not CSE'd.
429 TheCall->setNotTailCall();
Arnold Schwaighofer30e62c02008-04-30 09:16:33 +0000430 } else {
431 // Look for tail call clobbered arguments. Emit a series of
432 // copyto/copyfrom virtual register nodes to protect them.
Dan Gohman475871a2008-07-27 21:46:04 +0000433 SmallVector<SDValue, 32> Ops;
Dan Gohman095cc292008-09-13 01:54:27 +0000434 SDValue Chain = TheCall->getChain(), InFlag;
435 Ops.push_back(Chain);
436 Ops.push_back(TheCall->getCallee());
437 for (unsigned i = 0, e = TheCall->getNumArgs(); i != e; ++i) {
438 SDValue Arg = TheCall->getArg(i);
439 bool isByVal = TheCall->getArgFlags(i).isByVal();
440 MachineFunction &MF = DAG.getMachineFunction();
441 MachineFrameInfo *MFI = MF.getFrameInfo();
442 if (!isByVal &&
443 IsPossiblyOverwrittenArgumentOfTailCall(Arg, MFI)) {
444 MVT VT = Arg.getValueType();
445 unsigned VReg = MF.getRegInfo().
446 createVirtualRegister(TLI.getRegClassFor(VT));
Dale Johannesen6f38cb62009-02-07 19:59:05 +0000447 Chain = DAG.getCopyToReg(Chain, Arg.getDebugLoc(),
Dale Johannesenc460ae92009-02-04 00:13:36 +0000448 VReg, Arg, InFlag);
Dan Gohman095cc292008-09-13 01:54:27 +0000449 InFlag = Chain.getValue(1);
Dale Johannesen6f38cb62009-02-07 19:59:05 +0000450 Arg = DAG.getCopyFromReg(Chain, Arg.getDebugLoc(),
Dale Johannesenc460ae92009-02-04 00:13:36 +0000451 VReg, VT, InFlag);
Dan Gohman095cc292008-09-13 01:54:27 +0000452 Chain = Arg.getValue(1);
453 InFlag = Arg.getValue(2);
Arnold Schwaighofer30e62c02008-04-30 09:16:33 +0000454 }
455 Ops.push_back(Arg);
Dan Gohman095cc292008-09-13 01:54:27 +0000456 Ops.push_back(TheCall->getArgFlagsVal(i));
Arnold Schwaighofer30e62c02008-04-30 09:16:33 +0000457 }
458 // Link in chain of CopyTo/CopyFromReg.
459 Ops[0] = Chain;
460 DAG.UpdateNodeOperands(OpCall, Ops.begin(), Ops.size());
Arnold Schwaighoferc85e1712007-10-11 19:40:01 +0000461 }
462 }
463 }
464}
465
Dan Gohmanf350b272008-08-23 02:25:05 +0000466void SelectionDAGISel::SelectBasicBlock(BasicBlock *LLVMBB,
467 BasicBlock::iterator Begin,
Dan Gohman5edd3612008-08-28 20:28:56 +0000468 BasicBlock::iterator End) {
Dan Gohman7c3234c2008-08-27 23:52:12 +0000469 SDL->setCurrentBasicBlock(BB);
Dan Gohmanf350b272008-08-23 02:25:05 +0000470
Dan Gohmanf350b272008-08-23 02:25:05 +0000471 // Lower all of the non-terminator instructions.
472 for (BasicBlock::iterator I = Begin; I != End; ++I)
473 if (!isa<TerminatorInst>(I))
Dan Gohman7c3234c2008-08-27 23:52:12 +0000474 SDL->visit(*I);
Dan Gohmanf350b272008-08-23 02:25:05 +0000475
476 // Ensure that all instructions which are used outside of their defining
477 // blocks are available as virtual registers. Invoke is handled elsewhere.
478 for (BasicBlock::iterator I = Begin; I != End; ++I)
479 if (!I->use_empty() && !isa<PHINode>(I) && !isa<InvokeInst>(I)) {
Dan Gohman7c3234c2008-08-27 23:52:12 +0000480 DenseMap<const Value*,unsigned>::iterator VMI =FuncInfo->ValueMap.find(I);
481 if (VMI != FuncInfo->ValueMap.end())
482 SDL->CopyValueToVirtualRegister(I, VMI->second);
Dan Gohmanf350b272008-08-23 02:25:05 +0000483 }
484
485 // Handle PHI nodes in successor blocks.
Dan Gohman3df24e62008-09-03 23:12:08 +0000486 if (End == LLVMBB->end()) {
Dan Gohman7c3234c2008-08-27 23:52:12 +0000487 HandlePHINodesInSuccessorBlocks(LLVMBB);
Dan Gohman3df24e62008-09-03 23:12:08 +0000488
489 // Lower the terminator after the copies are emitted.
490 SDL->visit(*LLVMBB->getTerminator());
491 }
Anton Korobeynikov4198c582007-04-09 12:31:58 +0000492
Chris Lattnera651cf62005-01-17 19:43:36 +0000493 // Make sure the root of the DAG is up-to-date.
Dan Gohman7c3234c2008-08-27 23:52:12 +0000494 CurDAG->setRoot(SDL->getControlRoot());
Arnold Schwaighoferc85e1712007-10-11 19:40:01 +0000495
496 // Check whether calls in this block are real tail calls. Fix up CALL nodes
497 // with correct tailcall attribute so that the target can rely on the tailcall
498 // attribute indicating whether the call is really eligible for tail call
499 // optimization.
Dan Gohman1937e2f2008-09-16 01:42:28 +0000500 if (PerformTailCallOpt)
501 CheckDAGForTailCallsAndFixThem(*CurDAG, TLI);
Dan Gohmanf350b272008-08-23 02:25:05 +0000502
503 // Final step, emit the lowered DAG as machine code.
504 CodeGenAndEmitDAG();
Dan Gohman7c3234c2008-08-27 23:52:12 +0000505 SDL->clear();
Chris Lattner1c08c712005-01-07 07:47:53 +0000506}
507
Dan Gohmanf350b272008-08-23 02:25:05 +0000508void SelectionDAGISel::ComputeLiveOutVRegInfo() {
Chris Lattneread0d882008-06-17 06:09:18 +0000509 SmallPtrSet<SDNode*, 128> VisitedNodes;
510 SmallVector<SDNode*, 128> Worklist;
511
Gabor Greifba36cb52008-08-28 21:40:38 +0000512 Worklist.push_back(CurDAG->getRoot().getNode());
Chris Lattneread0d882008-06-17 06:09:18 +0000513
514 APInt Mask;
515 APInt KnownZero;
516 APInt KnownOne;
517
518 while (!Worklist.empty()) {
519 SDNode *N = Worklist.back();
520 Worklist.pop_back();
521
522 // If we've already seen this node, ignore it.
523 if (!VisitedNodes.insert(N))
524 continue;
525
526 // Otherwise, add all chain operands to the worklist.
527 for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i)
528 if (N->getOperand(i).getValueType() == MVT::Other)
Gabor Greifba36cb52008-08-28 21:40:38 +0000529 Worklist.push_back(N->getOperand(i).getNode());
Chris Lattneread0d882008-06-17 06:09:18 +0000530
531 // If this is a CopyToReg with a vreg dest, process it.
532 if (N->getOpcode() != ISD::CopyToReg)
533 continue;
534
535 unsigned DestReg = cast<RegisterSDNode>(N->getOperand(1))->getReg();
536 if (!TargetRegisterInfo::isVirtualRegister(DestReg))
537 continue;
538
539 // Ignore non-scalar or non-integer values.
Dan Gohman475871a2008-07-27 21:46:04 +0000540 SDValue Src = N->getOperand(2);
Chris Lattneread0d882008-06-17 06:09:18 +0000541 MVT SrcVT = Src.getValueType();
542 if (!SrcVT.isInteger() || SrcVT.isVector())
543 continue;
544
Dan Gohmanf350b272008-08-23 02:25:05 +0000545 unsigned NumSignBits = CurDAG->ComputeNumSignBits(Src);
Chris Lattneread0d882008-06-17 06:09:18 +0000546 Mask = APInt::getAllOnesValue(SrcVT.getSizeInBits());
Dan Gohmanf350b272008-08-23 02:25:05 +0000547 CurDAG->ComputeMaskedBits(Src, Mask, KnownZero, KnownOne);
Chris Lattneread0d882008-06-17 06:09:18 +0000548
549 // Only install this information if it tells us something.
550 if (NumSignBits != 1 || KnownZero != 0 || KnownOne != 0) {
551 DestReg -= TargetRegisterInfo::FirstVirtualRegister;
Dan Gohmanf350b272008-08-23 02:25:05 +0000552 FunctionLoweringInfo &FLI = CurDAG->getFunctionLoweringInfo();
Chris Lattneread0d882008-06-17 06:09:18 +0000553 if (DestReg >= FLI.LiveOutRegInfo.size())
554 FLI.LiveOutRegInfo.resize(DestReg+1);
555 FunctionLoweringInfo::LiveOutInfo &LOI = FLI.LiveOutRegInfo[DestReg];
556 LOI.NumSignBits = NumSignBits;
Dan Gohmana80efce2009-03-27 23:55:04 +0000557 LOI.KnownOne = KnownOne;
558 LOI.KnownZero = KnownZero;
Chris Lattneread0d882008-06-17 06:09:18 +0000559 }
560 }
561}
562
Dan Gohmanf350b272008-08-23 02:25:05 +0000563void SelectionDAGISel::CodeGenAndEmitDAG() {
Dan Gohman462dc7f2008-07-21 20:00:07 +0000564 std::string GroupName;
565 if (TimePassesIsEnabled)
566 GroupName = "Instruction Selection and Scheduling";
567 std::string BlockName;
568 if (ViewDAGCombine1 || ViewLegalizeTypesDAGs || ViewLegalizeDAGs ||
Duncan Sands25cf2272008-11-24 14:53:14 +0000569 ViewDAGCombine2 || ViewDAGCombineLT || ViewISelDAGs || ViewSchedDAGs ||
570 ViewSUnitDAGs)
Dan Gohmanf350b272008-08-23 02:25:05 +0000571 BlockName = CurDAG->getMachineFunction().getFunction()->getName() + ':' +
Dan Gohman462dc7f2008-07-21 20:00:07 +0000572 BB->getBasicBlock()->getName();
573
574 DOUT << "Initial selection DAG:\n";
Dan Gohmanf350b272008-08-23 02:25:05 +0000575 DEBUG(CurDAG->dump());
Dan Gohman462dc7f2008-07-21 20:00:07 +0000576
Dan Gohmanf350b272008-08-23 02:25:05 +0000577 if (ViewDAGCombine1) CurDAG->viewGraph("dag-combine1 input for " + BlockName);
Dan Gohman417e11b2007-10-08 15:12:17 +0000578
Chris Lattneraf21d552005-10-10 16:47:10 +0000579 // Run the DAG combiner in pre-legalize mode.
Evan Chengebffb662008-07-01 17:59:20 +0000580 if (TimePassesIsEnabled) {
Dan Gohman5e843682008-07-14 18:19:29 +0000581 NamedRegionTimer T("DAG Combining 1", GroupName);
Duncan Sands25cf2272008-11-24 14:53:14 +0000582 CurDAG->Combine(Unrestricted, *AA, Fast);
Evan Chengebffb662008-07-01 17:59:20 +0000583 } else {
Duncan Sands25cf2272008-11-24 14:53:14 +0000584 CurDAG->Combine(Unrestricted, *AA, Fast);
Evan Chengebffb662008-07-01 17:59:20 +0000585 }
Nate Begeman2300f552005-09-07 00:15:36 +0000586
Dan Gohman417e11b2007-10-08 15:12:17 +0000587 DOUT << "Optimized lowered selection DAG:\n";
Dan Gohmanf350b272008-08-23 02:25:05 +0000588 DEBUG(CurDAG->dump());
Duncan Sandsf00e74f2008-07-17 17:06:03 +0000589
Chris Lattner1c08c712005-01-07 07:47:53 +0000590 // Second step, hack on the DAG until it only uses operations and types that
591 // the target supports.
Duncan Sands7cb07872008-10-27 08:42:46 +0000592 if (!DisableLegalizeTypes) {
Dan Gohmanf350b272008-08-23 02:25:05 +0000593 if (ViewLegalizeTypesDAGs) CurDAG->viewGraph("legalize-types input for " +
594 BlockName);
Dan Gohman462dc7f2008-07-21 20:00:07 +0000595
Duncan Sands25cf2272008-11-24 14:53:14 +0000596 bool Changed;
Dan Gohman462dc7f2008-07-21 20:00:07 +0000597 if (TimePassesIsEnabled) {
598 NamedRegionTimer T("Type Legalization", GroupName);
Duncan Sands25cf2272008-11-24 14:53:14 +0000599 Changed = CurDAG->LegalizeTypes();
Dan Gohman462dc7f2008-07-21 20:00:07 +0000600 } else {
Duncan Sands25cf2272008-11-24 14:53:14 +0000601 Changed = CurDAG->LegalizeTypes();
Dan Gohman462dc7f2008-07-21 20:00:07 +0000602 }
603
604 DOUT << "Type-legalized selection DAG:\n";
Dan Gohmanf350b272008-08-23 02:25:05 +0000605 DEBUG(CurDAG->dump());
Dan Gohman462dc7f2008-07-21 20:00:07 +0000606
Duncan Sands25cf2272008-11-24 14:53:14 +0000607 if (Changed) {
608 if (ViewDAGCombineLT)
609 CurDAG->viewGraph("dag-combine-lt input for " + BlockName);
610
611 // Run the DAG combiner in post-type-legalize mode.
612 if (TimePassesIsEnabled) {
613 NamedRegionTimer T("DAG Combining after legalize types", GroupName);
614 CurDAG->Combine(NoIllegalTypes, *AA, Fast);
615 } else {
616 CurDAG->Combine(NoIllegalTypes, *AA, Fast);
617 }
618
619 DOUT << "Optimized type-legalized selection DAG:\n";
620 DEBUG(CurDAG->dump());
621 }
Chris Lattner70587ea2008-07-10 23:37:50 +0000622 }
Duncan Sandsf00e74f2008-07-17 17:06:03 +0000623
Dan Gohmanf350b272008-08-23 02:25:05 +0000624 if (ViewLegalizeDAGs) CurDAG->viewGraph("legalize input for " + BlockName);
Dan Gohman462dc7f2008-07-21 20:00:07 +0000625
Evan Chengebffb662008-07-01 17:59:20 +0000626 if (TimePassesIsEnabled) {
Dan Gohman5e843682008-07-14 18:19:29 +0000627 NamedRegionTimer T("DAG Legalization", GroupName);
Bill Wendling5aa49772009-02-24 02:35:30 +0000628 CurDAG->Legalize(DisableLegalizeTypes, Fast);
Evan Chengebffb662008-07-01 17:59:20 +0000629 } else {
Bill Wendling5aa49772009-02-24 02:35:30 +0000630 CurDAG->Legalize(DisableLegalizeTypes, Fast);
Evan Chengebffb662008-07-01 17:59:20 +0000631 }
Nate Begemanf15485a2006-03-27 01:32:24 +0000632
Bill Wendling832171c2006-12-07 20:04:42 +0000633 DOUT << "Legalized selection DAG:\n";
Dan Gohmanf350b272008-08-23 02:25:05 +0000634 DEBUG(CurDAG->dump());
Nate Begemanf15485a2006-03-27 01:32:24 +0000635
Dan Gohmanf350b272008-08-23 02:25:05 +0000636 if (ViewDAGCombine2) CurDAG->viewGraph("dag-combine2 input for " + BlockName);
Dan Gohman462dc7f2008-07-21 20:00:07 +0000637
Chris Lattneraf21d552005-10-10 16:47:10 +0000638 // Run the DAG combiner in post-legalize mode.
Evan Chengebffb662008-07-01 17:59:20 +0000639 if (TimePassesIsEnabled) {
Dan Gohman5e843682008-07-14 18:19:29 +0000640 NamedRegionTimer T("DAG Combining 2", GroupName);
Duncan Sands25cf2272008-11-24 14:53:14 +0000641 CurDAG->Combine(NoIllegalOperations, *AA, Fast);
Evan Chengebffb662008-07-01 17:59:20 +0000642 } else {
Duncan Sands25cf2272008-11-24 14:53:14 +0000643 CurDAG->Combine(NoIllegalOperations, *AA, Fast);
Evan Chengebffb662008-07-01 17:59:20 +0000644 }
Nate Begeman2300f552005-09-07 00:15:36 +0000645
Dan Gohman417e11b2007-10-08 15:12:17 +0000646 DOUT << "Optimized legalized selection DAG:\n";
Dan Gohmanf350b272008-08-23 02:25:05 +0000647 DEBUG(CurDAG->dump());
Dan Gohman417e11b2007-10-08 15:12:17 +0000648
Dan Gohmanf350b272008-08-23 02:25:05 +0000649 if (ViewISelDAGs) CurDAG->viewGraph("isel input for " + BlockName);
Chris Lattneread0d882008-06-17 06:09:18 +0000650
Evan Cheng80422552009-03-12 06:29:49 +0000651 if (!Fast)
Dan Gohmanf350b272008-08-23 02:25:05 +0000652 ComputeLiveOutVRegInfo();
Evan Cheng552c4a82006-04-28 02:09:19 +0000653
Chris Lattnera33ef482005-03-30 01:10:47 +0000654 // Third, instruction select all of the operations to machine code, adding the
655 // code to the MachineBasicBlock.
Evan Chengebffb662008-07-01 17:59:20 +0000656 if (TimePassesIsEnabled) {
Dan Gohman5e843682008-07-14 18:19:29 +0000657 NamedRegionTimer T("Instruction Selection", GroupName);
Dan Gohmanf350b272008-08-23 02:25:05 +0000658 InstructionSelect();
Evan Chengebffb662008-07-01 17:59:20 +0000659 } else {
Dan Gohmanf350b272008-08-23 02:25:05 +0000660 InstructionSelect();
Evan Chengebffb662008-07-01 17:59:20 +0000661 }
Evan Chengdb8d56b2008-06-30 20:45:06 +0000662
Dan Gohman462dc7f2008-07-21 20:00:07 +0000663 DOUT << "Selected selection DAG:\n";
Dan Gohmanf350b272008-08-23 02:25:05 +0000664 DEBUG(CurDAG->dump());
Dan Gohman462dc7f2008-07-21 20:00:07 +0000665
Dan Gohmanf350b272008-08-23 02:25:05 +0000666 if (ViewSchedDAGs) CurDAG->viewGraph("scheduler input for " + BlockName);
Dan Gohman462dc7f2008-07-21 20:00:07 +0000667
Dan Gohman5e843682008-07-14 18:19:29 +0000668 // Schedule machine code.
Dan Gohman47ac0f02009-02-11 04:27:20 +0000669 ScheduleDAGSDNodes *Scheduler = CreateScheduler();
Dan Gohman5e843682008-07-14 18:19:29 +0000670 if (TimePassesIsEnabled) {
671 NamedRegionTimer T("Instruction Scheduling", GroupName);
Dan Gohman47ac0f02009-02-11 04:27:20 +0000672 Scheduler->Run(CurDAG, BB, BB->end());
Dan Gohman5e843682008-07-14 18:19:29 +0000673 } else {
Dan Gohman47ac0f02009-02-11 04:27:20 +0000674 Scheduler->Run(CurDAG, BB, BB->end());
Dan Gohman5e843682008-07-14 18:19:29 +0000675 }
676
Dan Gohman462dc7f2008-07-21 20:00:07 +0000677 if (ViewSUnitDAGs) Scheduler->viewGraph();
678
Evan Chengdb8d56b2008-06-30 20:45:06 +0000679 // Emit machine code to BB. This can change 'BB' to the last block being
680 // inserted into.
Evan Chengebffb662008-07-01 17:59:20 +0000681 if (TimePassesIsEnabled) {
Dan Gohman5e843682008-07-14 18:19:29 +0000682 NamedRegionTimer T("Instruction Creation", GroupName);
683 BB = Scheduler->EmitSchedule();
Evan Chengebffb662008-07-01 17:59:20 +0000684 } else {
Dan Gohman5e843682008-07-14 18:19:29 +0000685 BB = Scheduler->EmitSchedule();
686 }
687
688 // Free the scheduler state.
689 if (TimePassesIsEnabled) {
690 NamedRegionTimer T("Instruction Scheduling Cleanup", GroupName);
691 delete Scheduler;
692 } else {
693 delete Scheduler;
Evan Chengebffb662008-07-01 17:59:20 +0000694 }
Evan Chengdb8d56b2008-06-30 20:45:06 +0000695
Bill Wendling832171c2006-12-07 20:04:42 +0000696 DOUT << "Selected machine code:\n";
Chris Lattner1c08c712005-01-07 07:47:53 +0000697 DEBUG(BB->dump());
Nate Begemanf15485a2006-03-27 01:32:24 +0000698}
Chris Lattner1c08c712005-01-07 07:47:53 +0000699
Dan Gohman79ce2762009-01-15 19:20:50 +0000700void SelectionDAGISel::SelectAllBasicBlocks(Function &Fn,
701 MachineFunction &MF,
Dan Gohmandd5b58a2008-10-14 23:54:11 +0000702 MachineModuleInfo *MMI,
Devang Patel83489bb2009-01-13 00:35:13 +0000703 DwarfWriter *DW,
Dan Gohmandd5b58a2008-10-14 23:54:11 +0000704 const TargetInstrInfo &TII) {
Dan Gohmana43abd12008-09-29 21:55:50 +0000705 // Initialize the Fast-ISel state, if needed.
706 FastISel *FastIS = 0;
707 if (EnableFastISel)
Dan Gohman79ce2762009-01-15 19:20:50 +0000708 FastIS = TLI.createFastISel(MF, MMI, DW,
Dan Gohmana43abd12008-09-29 21:55:50 +0000709 FuncInfo->ValueMap,
710 FuncInfo->MBBMap,
Dan Gohmandd5b58a2008-10-14 23:54:11 +0000711 FuncInfo->StaticAllocaMap
712#ifndef NDEBUG
713 , FuncInfo->CatchInfoLost
714#endif
715 );
Dan Gohmana43abd12008-09-29 21:55:50 +0000716
717 // Iterate over all basic blocks in the function.
Evan Cheng39fd6e82008-08-07 00:43:25 +0000718 for (Function::iterator I = Fn.begin(), E = Fn.end(); I != E; ++I) {
719 BasicBlock *LLVMBB = &*I;
Dan Gohman7c3234c2008-08-27 23:52:12 +0000720 BB = FuncInfo->MBBMap[LLVMBB];
Dan Gohmanf350b272008-08-23 02:25:05 +0000721
Dan Gohman3df24e62008-09-03 23:12:08 +0000722 BasicBlock::iterator const Begin = LLVMBB->begin();
723 BasicBlock::iterator const End = LLVMBB->end();
Evan Cheng9f118502008-09-08 16:01:27 +0000724 BasicBlock::iterator BI = Begin;
Dan Gohman5edd3612008-08-28 20:28:56 +0000725
726 // Lower any arguments needed in this block if this is the entry block.
Dan Gohman33134c42008-09-25 17:05:24 +0000727 bool SuppressFastISel = false;
728 if (LLVMBB == &Fn.getEntryBlock()) {
Dan Gohman5edd3612008-08-28 20:28:56 +0000729 LowerArguments(LLVMBB);
Dan Gohmanf350b272008-08-23 02:25:05 +0000730
Dan Gohman33134c42008-09-25 17:05:24 +0000731 // If any of the arguments has the byval attribute, forgo
732 // fast-isel in the entry block.
Dan Gohmana43abd12008-09-29 21:55:50 +0000733 if (FastIS) {
Dan Gohman33134c42008-09-25 17:05:24 +0000734 unsigned j = 1;
735 for (Function::arg_iterator I = Fn.arg_begin(), E = Fn.arg_end();
736 I != E; ++I, ++j)
Devang Patel05988662008-09-25 21:00:45 +0000737 if (Fn.paramHasAttr(j, Attribute::ByVal)) {
Dan Gohman77ca41e2008-09-25 17:21:42 +0000738 if (EnableFastISelVerbose || EnableFastISelAbort)
739 cerr << "FastISel skips entry block due to byval argument\n";
Dan Gohman33134c42008-09-25 17:05:24 +0000740 SuppressFastISel = true;
741 break;
742 }
743 }
744 }
745
Dan Gohmandd5b58a2008-10-14 23:54:11 +0000746 if (MMI && BB->isLandingPad()) {
747 // Add a label to mark the beginning of the landing pad. Deletion of the
748 // landing pad can thus be detected via the MachineModuleInfo.
749 unsigned LabelID = MMI->addLandingPad(BB);
750
751 const TargetInstrDesc &II = TII.get(TargetInstrInfo::EH_LABEL);
Bill Wendlingb2884872009-02-03 01:55:42 +0000752 BuildMI(BB, SDL->getCurDebugLoc(), II).addImm(LabelID);
Dan Gohmandd5b58a2008-10-14 23:54:11 +0000753
754 // Mark exception register as live in.
755 unsigned Reg = TLI.getExceptionAddressRegister();
756 if (Reg) BB->addLiveIn(Reg);
757
758 // Mark exception selector register as live in.
759 Reg = TLI.getExceptionSelectorRegister();
760 if (Reg) BB->addLiveIn(Reg);
761
762 // FIXME: Hack around an exception handling flaw (PR1508): the personality
763 // function and list of typeids logically belong to the invoke (or, if you
764 // like, the basic block containing the invoke), and need to be associated
765 // with it in the dwarf exception handling tables. Currently however the
766 // information is provided by an intrinsic (eh.selector) that can be moved
767 // to unexpected places by the optimizers: if the unwind edge is critical,
768 // then breaking it can result in the intrinsics being in the successor of
769 // the landing pad, not the landing pad itself. This results in exceptions
770 // not being caught because no typeids are associated with the invoke.
771 // This may not be the only way things can go wrong, but it is the only way
772 // we try to work around for the moment.
773 BranchInst *Br = dyn_cast<BranchInst>(LLVMBB->getTerminator());
774
775 if (Br && Br->isUnconditional()) { // Critical edge?
776 BasicBlock::iterator I, E;
777 for (I = LLVMBB->begin(), E = --LLVMBB->end(); I != E; ++I)
778 if (isa<EHSelectorInst>(I))
779 break;
780
781 if (I == E)
782 // No catch info found - try to extract some from the successor.
783 copyCatchInfo(Br->getSuccessor(0), LLVMBB, MMI, *FuncInfo);
784 }
785 }
786
Dan Gohmanf350b272008-08-23 02:25:05 +0000787 // Before doing SelectionDAG ISel, see if FastISel has been requested.
Dan Gohmandd5b58a2008-10-14 23:54:11 +0000788 if (FastIS && !SuppressFastISel) {
Dan Gohmana43abd12008-09-29 21:55:50 +0000789 // Emit code for any incoming arguments. This must happen before
790 // beginning FastISel on the entry block.
791 if (LLVMBB == &Fn.getEntryBlock()) {
792 CurDAG->setRoot(SDL->getControlRoot());
793 CodeGenAndEmitDAG();
794 SDL->clear();
795 }
Dan Gohman241f4642008-10-04 00:56:36 +0000796 FastIS->startNewBlock(BB);
Dan Gohmana43abd12008-09-29 21:55:50 +0000797 // Do FastISel on as many instructions as possible.
798 for (; BI != End; ++BI) {
799 // Just before the terminator instruction, insert instructions to
800 // feed PHI nodes in successor blocks.
801 if (isa<TerminatorInst>(BI))
802 if (!HandlePHINodesInSuccessorBlocksFast(LLVMBB, FastIS)) {
Dan Gohman4344a5d2008-09-09 23:05:00 +0000803 if (EnableFastISelVerbose || EnableFastISelAbort) {
Dan Gohman293d5f82008-09-09 22:06:46 +0000804 cerr << "FastISel miss: ";
805 BI->dump();
806 }
Dan Gohman4344a5d2008-09-09 23:05:00 +0000807 if (EnableFastISelAbort)
Dan Gohmana43abd12008-09-29 21:55:50 +0000808 assert(0 && "FastISel didn't handle a PHI in a successor");
809 break;
Dan Gohmanf350b272008-08-23 02:25:05 +0000810 }
Dan Gohmana43abd12008-09-29 21:55:50 +0000811
812 // First try normal tablegen-generated "fast" selection.
813 if (FastIS->SelectInstruction(BI))
814 continue;
815
816 // Next, try calling the target to attempt to handle the instruction.
817 if (FastIS->TargetSelectInstruction(BI))
818 continue;
819
820 // Then handle certain instructions as single-LLVM-Instruction blocks.
821 if (isa<CallInst>(BI)) {
822 if (EnableFastISelVerbose || EnableFastISelAbort) {
823 cerr << "FastISel missed call: ";
824 BI->dump();
825 }
826
827 if (BI->getType() != Type::VoidTy) {
828 unsigned &R = FuncInfo->ValueMap[BI];
829 if (!R)
830 R = FuncInfo->CreateRegForValue(BI);
831 }
832
Devang Patel390f3ac2009-04-16 01:33:10 +0000833 SDL->setCurDebugLoc(FastIS->getCurDebugLoc());
Dan Gohmana43abd12008-09-29 21:55:50 +0000834 SelectBasicBlock(LLVMBB, BI, next(BI));
Dan Gohman241f4642008-10-04 00:56:36 +0000835 // If the instruction was codegen'd with multiple blocks,
836 // inform the FastISel object where to resume inserting.
837 FastIS->setCurrentBlock(BB);
Dan Gohmana43abd12008-09-29 21:55:50 +0000838 continue;
Dan Gohmanf350b272008-08-23 02:25:05 +0000839 }
Dan Gohmana43abd12008-09-29 21:55:50 +0000840
841 // Otherwise, give up on FastISel for the rest of the block.
842 // For now, be a little lenient about non-branch terminators.
843 if (!isa<TerminatorInst>(BI) || isa<BranchInst>(BI)) {
844 if (EnableFastISelVerbose || EnableFastISelAbort) {
845 cerr << "FastISel miss: ";
846 BI->dump();
847 }
848 if (EnableFastISelAbort)
849 // The "fast" selector couldn't handle something and bailed.
850 // For the purpose of debugging, just abort.
851 assert(0 && "FastISel didn't select the entire block");
852 }
853 break;
Dan Gohmanf350b272008-08-23 02:25:05 +0000854 }
855 }
856
Dan Gohmand2ff6472008-09-02 20:17:56 +0000857 // Run SelectionDAG instruction selection on the remainder of the block
858 // not handled by FastISel. If FastISel is not run, this is the entire
Dan Gohman3df24e62008-09-03 23:12:08 +0000859 // block.
Devang Patel390f3ac2009-04-16 01:33:10 +0000860 if (BI != End) {
861 // If FastISel is run and it has known DebugLoc then use it.
862 if (FastIS && !FastIS->getCurDebugLoc().isUnknown())
863 SDL->setCurDebugLoc(FastIS->getCurDebugLoc());
Evan Cheng9f118502008-09-08 16:01:27 +0000864 SelectBasicBlock(LLVMBB, BI, End);
Devang Patel390f3ac2009-04-16 01:33:10 +0000865 }
Dan Gohmanf350b272008-08-23 02:25:05 +0000866
Dan Gohman7c3234c2008-08-27 23:52:12 +0000867 FinishBasicBlock();
Evan Cheng39fd6e82008-08-07 00:43:25 +0000868 }
Dan Gohmana43abd12008-09-29 21:55:50 +0000869
870 delete FastIS;
Dan Gohman0e5f1302008-07-07 23:02:41 +0000871}
872
Dan Gohmanfed90b62008-07-28 21:51:04 +0000873void
Dan Gohman7c3234c2008-08-27 23:52:12 +0000874SelectionDAGISel::FinishBasicBlock() {
Dan Gohmanf350b272008-08-23 02:25:05 +0000875
Dan Gohmanf350b272008-08-23 02:25:05 +0000876 DOUT << "Target-post-processed machine code:\n";
877 DEBUG(BB->dump());
Nate Begemanf15485a2006-03-27 01:32:24 +0000878
Anton Korobeynikov4198c582007-04-09 12:31:58 +0000879 DOUT << "Total amount of phi nodes to update: "
Dan Gohman7c3234c2008-08-27 23:52:12 +0000880 << SDL->PHINodesToUpdate.size() << "\n";
881 DEBUG(for (unsigned i = 0, e = SDL->PHINodesToUpdate.size(); i != e; ++i)
882 DOUT << "Node " << i << " : (" << SDL->PHINodesToUpdate[i].first
883 << ", " << SDL->PHINodesToUpdate[i].second << ")\n";);
Nate Begemanf15485a2006-03-27 01:32:24 +0000884
Chris Lattnera33ef482005-03-30 01:10:47 +0000885 // Next, now that we know what the last MBB the LLVM BB expanded is, update
Chris Lattner1c08c712005-01-07 07:47:53 +0000886 // PHI nodes in successors.
Dan Gohman7c3234c2008-08-27 23:52:12 +0000887 if (SDL->SwitchCases.empty() &&
888 SDL->JTCases.empty() &&
889 SDL->BitTestCases.empty()) {
890 for (unsigned i = 0, e = SDL->PHINodesToUpdate.size(); i != e; ++i) {
891 MachineInstr *PHI = SDL->PHINodesToUpdate[i].first;
Nate Begemanf15485a2006-03-27 01:32:24 +0000892 assert(PHI->getOpcode() == TargetInstrInfo::PHI &&
893 "This is not a machine PHI node that we are updating!");
Dan Gohman7c3234c2008-08-27 23:52:12 +0000894 PHI->addOperand(MachineOperand::CreateReg(SDL->PHINodesToUpdate[i].second,
Chris Lattner9ce2e9d2007-12-30 00:57:42 +0000895 false));
896 PHI->addOperand(MachineOperand::CreateMBB(BB));
Nate Begemanf15485a2006-03-27 01:32:24 +0000897 }
Dan Gohman7c3234c2008-08-27 23:52:12 +0000898 SDL->PHINodesToUpdate.clear();
Nate Begemanf15485a2006-03-27 01:32:24 +0000899 return;
Chris Lattner1c08c712005-01-07 07:47:53 +0000900 }
Anton Korobeynikov4198c582007-04-09 12:31:58 +0000901
Dan Gohman7c3234c2008-08-27 23:52:12 +0000902 for (unsigned i = 0, e = SDL->BitTestCases.size(); i != e; ++i) {
Anton Korobeynikov4198c582007-04-09 12:31:58 +0000903 // Lower header first, if it wasn't already lowered
Dan Gohman7c3234c2008-08-27 23:52:12 +0000904 if (!SDL->BitTestCases[i].Emitted) {
Anton Korobeynikov4198c582007-04-09 12:31:58 +0000905 // Set the current basic block to the mbb we wish to insert the code into
Dan Gohman7c3234c2008-08-27 23:52:12 +0000906 BB = SDL->BitTestCases[i].Parent;
907 SDL->setCurrentBasicBlock(BB);
Anton Korobeynikov4198c582007-04-09 12:31:58 +0000908 // Emit the code
Dan Gohman7c3234c2008-08-27 23:52:12 +0000909 SDL->visitBitTestHeader(SDL->BitTestCases[i]);
910 CurDAG->setRoot(SDL->getRoot());
Dan Gohmanf350b272008-08-23 02:25:05 +0000911 CodeGenAndEmitDAG();
Dan Gohman7c3234c2008-08-27 23:52:12 +0000912 SDL->clear();
Anton Korobeynikov4198c582007-04-09 12:31:58 +0000913 }
914
Dan Gohman7c3234c2008-08-27 23:52:12 +0000915 for (unsigned j = 0, ej = SDL->BitTestCases[i].Cases.size(); j != ej; ++j) {
Anton Korobeynikov4198c582007-04-09 12:31:58 +0000916 // Set the current basic block to the mbb we wish to insert the code into
Dan Gohman7c3234c2008-08-27 23:52:12 +0000917 BB = SDL->BitTestCases[i].Cases[j].ThisBB;
918 SDL->setCurrentBasicBlock(BB);
Anton Korobeynikov4198c582007-04-09 12:31:58 +0000919 // Emit the code
920 if (j+1 != ej)
Dan Gohman7c3234c2008-08-27 23:52:12 +0000921 SDL->visitBitTestCase(SDL->BitTestCases[i].Cases[j+1].ThisBB,
922 SDL->BitTestCases[i].Reg,
923 SDL->BitTestCases[i].Cases[j]);
Anton Korobeynikov4198c582007-04-09 12:31:58 +0000924 else
Dan Gohman7c3234c2008-08-27 23:52:12 +0000925 SDL->visitBitTestCase(SDL->BitTestCases[i].Default,
926 SDL->BitTestCases[i].Reg,
927 SDL->BitTestCases[i].Cases[j]);
Anton Korobeynikov4198c582007-04-09 12:31:58 +0000928
929
Dan Gohman7c3234c2008-08-27 23:52:12 +0000930 CurDAG->setRoot(SDL->getRoot());
Dan Gohmanf350b272008-08-23 02:25:05 +0000931 CodeGenAndEmitDAG();
Dan Gohman7c3234c2008-08-27 23:52:12 +0000932 SDL->clear();
Anton Korobeynikov4198c582007-04-09 12:31:58 +0000933 }
934
935 // Update PHI Nodes
Dan Gohman7c3234c2008-08-27 23:52:12 +0000936 for (unsigned pi = 0, pe = SDL->PHINodesToUpdate.size(); pi != pe; ++pi) {
937 MachineInstr *PHI = SDL->PHINodesToUpdate[pi].first;
Anton Korobeynikov4198c582007-04-09 12:31:58 +0000938 MachineBasicBlock *PHIBB = PHI->getParent();
939 assert(PHI->getOpcode() == TargetInstrInfo::PHI &&
940 "This is not a machine PHI node that we are updating!");
941 // This is "default" BB. We have two jumps to it. From "header" BB and
942 // from last "case" BB.
Dan Gohman7c3234c2008-08-27 23:52:12 +0000943 if (PHIBB == SDL->BitTestCases[i].Default) {
944 PHI->addOperand(MachineOperand::CreateReg(SDL->PHINodesToUpdate[pi].second,
Chris Lattner9ce2e9d2007-12-30 00:57:42 +0000945 false));
Dan Gohman7c3234c2008-08-27 23:52:12 +0000946 PHI->addOperand(MachineOperand::CreateMBB(SDL->BitTestCases[i].Parent));
947 PHI->addOperand(MachineOperand::CreateReg(SDL->PHINodesToUpdate[pi].second,
Chris Lattner9ce2e9d2007-12-30 00:57:42 +0000948 false));
Dan Gohman7c3234c2008-08-27 23:52:12 +0000949 PHI->addOperand(MachineOperand::CreateMBB(SDL->BitTestCases[i].Cases.
Chris Lattner9ce2e9d2007-12-30 00:57:42 +0000950 back().ThisBB));
Anton Korobeynikov4198c582007-04-09 12:31:58 +0000951 }
952 // One of "cases" BB.
Dan Gohman7c3234c2008-08-27 23:52:12 +0000953 for (unsigned j = 0, ej = SDL->BitTestCases[i].Cases.size();
954 j != ej; ++j) {
955 MachineBasicBlock* cBB = SDL->BitTestCases[i].Cases[j].ThisBB;
Anton Korobeynikov4198c582007-04-09 12:31:58 +0000956 if (cBB->succ_end() !=
957 std::find(cBB->succ_begin(),cBB->succ_end(), PHIBB)) {
Dan Gohman7c3234c2008-08-27 23:52:12 +0000958 PHI->addOperand(MachineOperand::CreateReg(SDL->PHINodesToUpdate[pi].second,
Chris Lattner9ce2e9d2007-12-30 00:57:42 +0000959 false));
960 PHI->addOperand(MachineOperand::CreateMBB(cBB));
Anton Korobeynikov4198c582007-04-09 12:31:58 +0000961 }
962 }
963 }
964 }
Dan Gohman7c3234c2008-08-27 23:52:12 +0000965 SDL->BitTestCases.clear();
Anton Korobeynikov4198c582007-04-09 12:31:58 +0000966
Nate Begeman9453eea2006-04-23 06:26:20 +0000967 // If the JumpTable record is filled in, then we need to emit a jump table.
968 // Updating the PHI nodes is tricky in this case, since we need to determine
969 // whether the PHI is a successor of the range check MBB or the jump table MBB
Dan Gohman7c3234c2008-08-27 23:52:12 +0000970 for (unsigned i = 0, e = SDL->JTCases.size(); i != e; ++i) {
Anton Korobeynikov3a84b9b2007-03-25 15:07:15 +0000971 // Lower header first, if it wasn't already lowered
Dan Gohman7c3234c2008-08-27 23:52:12 +0000972 if (!SDL->JTCases[i].first.Emitted) {
Anton Korobeynikov3a84b9b2007-03-25 15:07:15 +0000973 // Set the current basic block to the mbb we wish to insert the code into
Dan Gohman7c3234c2008-08-27 23:52:12 +0000974 BB = SDL->JTCases[i].first.HeaderBB;
975 SDL->setCurrentBasicBlock(BB);
Anton Korobeynikov3a84b9b2007-03-25 15:07:15 +0000976 // Emit the code
Dan Gohman7c3234c2008-08-27 23:52:12 +0000977 SDL->visitJumpTableHeader(SDL->JTCases[i].second, SDL->JTCases[i].first);
978 CurDAG->setRoot(SDL->getRoot());
Dan Gohmanf350b272008-08-23 02:25:05 +0000979 CodeGenAndEmitDAG();
Dan Gohman7c3234c2008-08-27 23:52:12 +0000980 SDL->clear();
Anton Korobeynikov4198c582007-04-09 12:31:58 +0000981 }
Anton Korobeynikov3a84b9b2007-03-25 15:07:15 +0000982
Nate Begeman37efe672006-04-22 18:53:45 +0000983 // Set the current basic block to the mbb we wish to insert the code into
Dan Gohman7c3234c2008-08-27 23:52:12 +0000984 BB = SDL->JTCases[i].second.MBB;
985 SDL->setCurrentBasicBlock(BB);
Nate Begeman37efe672006-04-22 18:53:45 +0000986 // Emit the code
Dan Gohman7c3234c2008-08-27 23:52:12 +0000987 SDL->visitJumpTable(SDL->JTCases[i].second);
988 CurDAG->setRoot(SDL->getRoot());
Dan Gohmanf350b272008-08-23 02:25:05 +0000989 CodeGenAndEmitDAG();
Dan Gohman7c3234c2008-08-27 23:52:12 +0000990 SDL->clear();
Anton Korobeynikov3a84b9b2007-03-25 15:07:15 +0000991
Nate Begeman37efe672006-04-22 18:53:45 +0000992 // Update PHI Nodes
Dan Gohman7c3234c2008-08-27 23:52:12 +0000993 for (unsigned pi = 0, pe = SDL->PHINodesToUpdate.size(); pi != pe; ++pi) {
994 MachineInstr *PHI = SDL->PHINodesToUpdate[pi].first;
Nate Begeman37efe672006-04-22 18:53:45 +0000995 MachineBasicBlock *PHIBB = PHI->getParent();
996 assert(PHI->getOpcode() == TargetInstrInfo::PHI &&
997 "This is not a machine PHI node that we are updating!");
Anton Korobeynikov4198c582007-04-09 12:31:58 +0000998 // "default" BB. We can go there only from header BB.
Dan Gohman7c3234c2008-08-27 23:52:12 +0000999 if (PHIBB == SDL->JTCases[i].second.Default) {
1000 PHI->addOperand(MachineOperand::CreateReg(SDL->PHINodesToUpdate[pi].second,
Chris Lattner9ce2e9d2007-12-30 00:57:42 +00001001 false));
Dan Gohman7c3234c2008-08-27 23:52:12 +00001002 PHI->addOperand(MachineOperand::CreateMBB(SDL->JTCases[i].first.HeaderBB));
Nate Begemanf4360a42006-05-03 03:48:02 +00001003 }
Anton Korobeynikov4198c582007-04-09 12:31:58 +00001004 // JT BB. Just iterate over successors here
Nate Begemanf4360a42006-05-03 03:48:02 +00001005 if (BB->succ_end() != std::find(BB->succ_begin(),BB->succ_end(), PHIBB)) {
Dan Gohman7c3234c2008-08-27 23:52:12 +00001006 PHI->addOperand(MachineOperand::CreateReg(SDL->PHINodesToUpdate[pi].second,
Chris Lattner9ce2e9d2007-12-30 00:57:42 +00001007 false));
1008 PHI->addOperand(MachineOperand::CreateMBB(BB));
Nate Begeman37efe672006-04-22 18:53:45 +00001009 }
1010 }
Nate Begeman37efe672006-04-22 18:53:45 +00001011 }
Dan Gohman7c3234c2008-08-27 23:52:12 +00001012 SDL->JTCases.clear();
Nate Begeman37efe672006-04-22 18:53:45 +00001013
Chris Lattnerb2e806e2006-10-22 23:00:53 +00001014 // If the switch block involved a branch to one of the actual successors, we
1015 // need to update PHI nodes in that block.
Dan Gohman7c3234c2008-08-27 23:52:12 +00001016 for (unsigned i = 0, e = SDL->PHINodesToUpdate.size(); i != e; ++i) {
1017 MachineInstr *PHI = SDL->PHINodesToUpdate[i].first;
Chris Lattnerb2e806e2006-10-22 23:00:53 +00001018 assert(PHI->getOpcode() == TargetInstrInfo::PHI &&
1019 "This is not a machine PHI node that we are updating!");
1020 if (BB->isSuccessor(PHI->getParent())) {
Dan Gohman7c3234c2008-08-27 23:52:12 +00001021 PHI->addOperand(MachineOperand::CreateReg(SDL->PHINodesToUpdate[i].second,
Chris Lattner9ce2e9d2007-12-30 00:57:42 +00001022 false));
1023 PHI->addOperand(MachineOperand::CreateMBB(BB));
Chris Lattnerb2e806e2006-10-22 23:00:53 +00001024 }
1025 }
1026
Nate Begemanf15485a2006-03-27 01:32:24 +00001027 // If we generated any switch lowering information, build and codegen any
1028 // additional DAGs necessary.
Dan Gohman7c3234c2008-08-27 23:52:12 +00001029 for (unsigned i = 0, e = SDL->SwitchCases.size(); i != e; ++i) {
Nate Begemanf15485a2006-03-27 01:32:24 +00001030 // Set the current basic block to the mbb we wish to insert the code into
Dan Gohman7c3234c2008-08-27 23:52:12 +00001031 BB = SDL->SwitchCases[i].ThisBB;
1032 SDL->setCurrentBasicBlock(BB);
Chris Lattnerd5e93c02006-09-07 01:59:34 +00001033
Nate Begemanf15485a2006-03-27 01:32:24 +00001034 // Emit the code
Dan Gohman7c3234c2008-08-27 23:52:12 +00001035 SDL->visitSwitchCase(SDL->SwitchCases[i]);
1036 CurDAG->setRoot(SDL->getRoot());
Dan Gohmanf350b272008-08-23 02:25:05 +00001037 CodeGenAndEmitDAG();
Dan Gohman7c3234c2008-08-27 23:52:12 +00001038 SDL->clear();
Chris Lattnerd5e93c02006-09-07 01:59:34 +00001039
1040 // Handle any PHI nodes in successors of this chunk, as if we were coming
1041 // from the original BB before switch expansion. Note that PHI nodes can
1042 // occur multiple times in PHINodesToUpdate. We have to be very careful to
1043 // handle them the right number of times.
Dan Gohman7c3234c2008-08-27 23:52:12 +00001044 while ((BB = SDL->SwitchCases[i].TrueBB)) { // Handle LHS and RHS.
Chris Lattnerd5e93c02006-09-07 01:59:34 +00001045 for (MachineBasicBlock::iterator Phi = BB->begin();
1046 Phi != BB->end() && Phi->getOpcode() == TargetInstrInfo::PHI; ++Phi){
1047 // This value for this PHI node is recorded in PHINodesToUpdate, get it.
1048 for (unsigned pn = 0; ; ++pn) {
Dan Gohman7c3234c2008-08-27 23:52:12 +00001049 assert(pn != SDL->PHINodesToUpdate.size() &&
1050 "Didn't find PHI entry!");
1051 if (SDL->PHINodesToUpdate[pn].first == Phi) {
1052 Phi->addOperand(MachineOperand::CreateReg(SDL->PHINodesToUpdate[pn].
Chris Lattner9ce2e9d2007-12-30 00:57:42 +00001053 second, false));
Dan Gohman7c3234c2008-08-27 23:52:12 +00001054 Phi->addOperand(MachineOperand::CreateMBB(SDL->SwitchCases[i].ThisBB));
Chris Lattnerd5e93c02006-09-07 01:59:34 +00001055 break;
1056 }
1057 }
Nate Begemanf15485a2006-03-27 01:32:24 +00001058 }
Chris Lattnerd5e93c02006-09-07 01:59:34 +00001059
1060 // Don't process RHS if same block as LHS.
Dan Gohman7c3234c2008-08-27 23:52:12 +00001061 if (BB == SDL->SwitchCases[i].FalseBB)
1062 SDL->SwitchCases[i].FalseBB = 0;
Chris Lattnerd5e93c02006-09-07 01:59:34 +00001063
1064 // If we haven't handled the RHS, do so now. Otherwise, we're done.
Dan Gohman7c3234c2008-08-27 23:52:12 +00001065 SDL->SwitchCases[i].TrueBB = SDL->SwitchCases[i].FalseBB;
1066 SDL->SwitchCases[i].FalseBB = 0;
Nate Begemanf15485a2006-03-27 01:32:24 +00001067 }
Dan Gohman7c3234c2008-08-27 23:52:12 +00001068 assert(SDL->SwitchCases[i].TrueBB == 0 && SDL->SwitchCases[i].FalseBB == 0);
Chris Lattnera33ef482005-03-30 01:10:47 +00001069 }
Dan Gohman7c3234c2008-08-27 23:52:12 +00001070 SDL->SwitchCases.clear();
1071
1072 SDL->PHINodesToUpdate.clear();
Chris Lattner1c08c712005-01-07 07:47:53 +00001073}
Evan Chenga9c20912006-01-21 02:32:06 +00001074
Jim Laskey13ec7022006-08-01 14:21:23 +00001075
Dan Gohman0a3776d2009-02-06 18:26:51 +00001076/// Create the scheduler. If a specific scheduler was specified
1077/// via the SchedulerRegistry, use it, otherwise select the
1078/// one preferred by the target.
Dan Gohman5e843682008-07-14 18:19:29 +00001079///
Dan Gohman47ac0f02009-02-11 04:27:20 +00001080ScheduleDAGSDNodes *SelectionDAGISel::CreateScheduler() {
Jim Laskeyeb577ba2006-08-02 12:30:23 +00001081 RegisterScheduler::FunctionPassCtor Ctor = RegisterScheduler::getDefault();
Jim Laskey13ec7022006-08-01 14:21:23 +00001082
1083 if (!Ctor) {
Jim Laskeyeb577ba2006-08-02 12:30:23 +00001084 Ctor = ISHeuristic;
Jim Laskey9373beb2006-08-01 19:14:14 +00001085 RegisterScheduler::setDefault(Ctor);
Evan Cheng4ef10862006-01-23 07:01:07 +00001086 }
Jim Laskey13ec7022006-08-01 14:21:23 +00001087
Dan Gohman0a3776d2009-02-06 18:26:51 +00001088 return Ctor(this, Fast);
Evan Chenga9c20912006-01-21 02:32:06 +00001089}
Chris Lattner0e43f2b2006-02-24 02:13:54 +00001090
Dan Gohmanfc54c552009-01-15 22:18:12 +00001091ScheduleHazardRecognizer *SelectionDAGISel::CreateTargetHazardRecognizer() {
1092 return new ScheduleHazardRecognizer();
Jim Laskey9ff542f2006-08-01 18:29:48 +00001093}
1094
Chris Lattner75548062006-10-11 03:58:02 +00001095//===----------------------------------------------------------------------===//
1096// Helper functions used by the generated instruction selector.
1097//===----------------------------------------------------------------------===//
1098// Calls to these methods are generated by tblgen.
1099
1100/// CheckAndMask - The isel is trying to match something like (and X, 255). If
1101/// the dag combiner simplified the 255, we still want to match. RHS is the
1102/// actual value in the DAG on the RHS of an AND, and DesiredMaskS is the value
1103/// specified in the .td file (e.g. 255).
Dan Gohman475871a2008-07-27 21:46:04 +00001104bool SelectionDAGISel::CheckAndMask(SDValue LHS, ConstantSDNode *RHS,
Dan Gohmandc9b3d02007-07-24 23:00:27 +00001105 int64_t DesiredMaskS) const {
Dan Gohman2e68b6f2008-02-25 21:11:39 +00001106 const APInt &ActualMask = RHS->getAPIntValue();
1107 const APInt &DesiredMask = APInt(LHS.getValueSizeInBits(), DesiredMaskS);
Chris Lattner75548062006-10-11 03:58:02 +00001108
1109 // If the actual mask exactly matches, success!
1110 if (ActualMask == DesiredMask)
1111 return true;
1112
1113 // If the actual AND mask is allowing unallowed bits, this doesn't match.
Dan Gohman2e68b6f2008-02-25 21:11:39 +00001114 if (ActualMask.intersects(~DesiredMask))
Chris Lattner75548062006-10-11 03:58:02 +00001115 return false;
1116
1117 // Otherwise, the DAG Combiner may have proven that the value coming in is
1118 // either already zero or is not demanded. Check for known zero input bits.
Dan Gohman2e68b6f2008-02-25 21:11:39 +00001119 APInt NeededMask = DesiredMask & ~ActualMask;
Dan Gohmanea859be2007-06-22 14:59:07 +00001120 if (CurDAG->MaskedValueIsZero(LHS, NeededMask))
Chris Lattner75548062006-10-11 03:58:02 +00001121 return true;
1122
1123 // TODO: check to see if missing bits are just not demanded.
1124
1125 // Otherwise, this pattern doesn't match.
1126 return false;
1127}
1128
1129/// CheckOrMask - The isel is trying to match something like (or X, 255). If
1130/// the dag combiner simplified the 255, we still want to match. RHS is the
1131/// actual value in the DAG on the RHS of an OR, and DesiredMaskS is the value
1132/// specified in the .td file (e.g. 255).
Dan Gohman475871a2008-07-27 21:46:04 +00001133bool SelectionDAGISel::CheckOrMask(SDValue LHS, ConstantSDNode *RHS,
Dan Gohman2e68b6f2008-02-25 21:11:39 +00001134 int64_t DesiredMaskS) const {
1135 const APInt &ActualMask = RHS->getAPIntValue();
1136 const APInt &DesiredMask = APInt(LHS.getValueSizeInBits(), DesiredMaskS);
Chris Lattner75548062006-10-11 03:58:02 +00001137
1138 // If the actual mask exactly matches, success!
1139 if (ActualMask == DesiredMask)
1140 return true;
1141
1142 // If the actual AND mask is allowing unallowed bits, this doesn't match.
Dan Gohman2e68b6f2008-02-25 21:11:39 +00001143 if (ActualMask.intersects(~DesiredMask))
Chris Lattner75548062006-10-11 03:58:02 +00001144 return false;
1145
1146 // Otherwise, the DAG Combiner may have proven that the value coming in is
1147 // either already zero or is not demanded. Check for known zero input bits.
Dan Gohman2e68b6f2008-02-25 21:11:39 +00001148 APInt NeededMask = DesiredMask & ~ActualMask;
Chris Lattner75548062006-10-11 03:58:02 +00001149
Dan Gohman2e68b6f2008-02-25 21:11:39 +00001150 APInt KnownZero, KnownOne;
Dan Gohmanea859be2007-06-22 14:59:07 +00001151 CurDAG->ComputeMaskedBits(LHS, NeededMask, KnownZero, KnownOne);
Chris Lattner75548062006-10-11 03:58:02 +00001152
1153 // If all the missing bits in the or are already known to be set, match!
1154 if ((NeededMask & KnownOne) == NeededMask)
1155 return true;
1156
1157 // TODO: check to see if missing bits are just not demanded.
1158
1159 // Otherwise, this pattern doesn't match.
1160 return false;
1161}
1162
Jim Laskey9ff542f2006-08-01 18:29:48 +00001163
Chris Lattner0e43f2b2006-02-24 02:13:54 +00001164/// SelectInlineAsmMemoryOperands - Calls to this are automatically generated
1165/// by tblgen. Others should not call it.
1166void SelectionDAGISel::
Dan Gohmanf350b272008-08-23 02:25:05 +00001167SelectInlineAsmMemoryOperands(std::vector<SDValue> &Ops) {
Dan Gohman475871a2008-07-27 21:46:04 +00001168 std::vector<SDValue> InOps;
Chris Lattner0e43f2b2006-02-24 02:13:54 +00001169 std::swap(InOps, Ops);
1170
1171 Ops.push_back(InOps[0]); // input chain.
1172 Ops.push_back(InOps[1]); // input asm string.
1173
Chris Lattner0e43f2b2006-02-24 02:13:54 +00001174 unsigned i = 2, e = InOps.size();
1175 if (InOps[e-1].getValueType() == MVT::Flag)
1176 --e; // Don't process a flag operand if it is here.
1177
1178 while (i != e) {
Dan Gohmanf5aeb1a2008-09-12 16:56:44 +00001179 unsigned Flags = cast<ConstantSDNode>(InOps[i])->getZExtValue();
Dale Johannesen86b49f82008-09-24 01:07:17 +00001180 if ((Flags & 7) != 4 /*MEM*/) {
Chris Lattner0e43f2b2006-02-24 02:13:54 +00001181 // Just skip over this operand, copying the operands verbatim.
Evan Cheng697cbbf2009-03-20 18:03:34 +00001182 Ops.insert(Ops.end(), InOps.begin()+i,
1183 InOps.begin()+i+InlineAsm::getNumOperandRegisters(Flags) + 1);
1184 i += InlineAsm::getNumOperandRegisters(Flags) + 1;
Chris Lattner0e43f2b2006-02-24 02:13:54 +00001185 } else {
Evan Cheng697cbbf2009-03-20 18:03:34 +00001186 assert(InlineAsm::getNumOperandRegisters(Flags) == 1 &&
1187 "Memory operand with multiple values?");
Chris Lattner0e43f2b2006-02-24 02:13:54 +00001188 // Otherwise, this is a memory operand. Ask the target to select it.
Dan Gohman475871a2008-07-27 21:46:04 +00001189 std::vector<SDValue> SelOps;
Dan Gohmanf350b272008-08-23 02:25:05 +00001190 if (SelectInlineAsmMemoryOperand(InOps[i+1], 'm', SelOps)) {
Bill Wendling832171c2006-12-07 20:04:42 +00001191 cerr << "Could not match memory address. Inline asm failure!\n";
Chris Lattner0e43f2b2006-02-24 02:13:54 +00001192 exit(1);
1193 }
1194
1195 // Add this to the output node.
Dan Gohmanf350b272008-08-23 02:25:05 +00001196 MVT IntPtrTy = CurDAG->getTargetLoweringInfo().getPointerTy();
Dale Johannesen86b49f82008-09-24 01:07:17 +00001197 Ops.push_back(CurDAG->getTargetConstant(4/*MEM*/ | (SelOps.size()<< 3),
Dan Gohmanf350b272008-08-23 02:25:05 +00001198 IntPtrTy));
Chris Lattner0e43f2b2006-02-24 02:13:54 +00001199 Ops.insert(Ops.end(), SelOps.begin(), SelOps.end());
1200 i += 2;
1201 }
1202 }
1203
1204 // Add the flag input back if present.
1205 if (e != InOps.size())
1206 Ops.push_back(InOps.back());
1207}
Devang Patel794fd752007-05-01 21:15:47 +00001208
Devang Patel19974732007-05-03 01:11:54 +00001209char SelectionDAGISel::ID = 0;