1 //===-- SelectionDAGISel.cpp - Implement the SelectionDAGISel class -------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This implements the SelectionDAGISel class.
12 //===----------------------------------------------------------------------===//
14 #define DEBUG_TYPE "isel"
15 #include "ScheduleDAGSDNodes.h"
16 #include "SelectionDAGBuild.h"
17 #include "llvm/CodeGen/SelectionDAGISel.h"
18 #include "llvm/Analysis/AliasAnalysis.h"
19 #include "llvm/Constants.h"
20 #include "llvm/CallingConv.h"
21 #include "llvm/DerivedTypes.h"
22 #include "llvm/Function.h"
23 #include "llvm/GlobalVariable.h"
24 #include "llvm/InlineAsm.h"
25 #include "llvm/Instructions.h"
26 #include "llvm/Intrinsics.h"
27 #include "llvm/IntrinsicInst.h"
28 #include "llvm/CodeGen/FastISel.h"
29 #include "llvm/CodeGen/GCStrategy.h"
30 #include "llvm/CodeGen/GCMetadata.h"
31 #include "llvm/CodeGen/MachineFunction.h"
32 #include "llvm/CodeGen/MachineFunctionAnalysis.h"
33 #include "llvm/CodeGen/MachineFrameInfo.h"
34 #include "llvm/CodeGen/MachineInstrBuilder.h"
35 #include "llvm/CodeGen/MachineJumpTableInfo.h"
36 #include "llvm/CodeGen/MachineModuleInfo.h"
37 #include "llvm/CodeGen/MachineRegisterInfo.h"
38 #include "llvm/CodeGen/ScheduleHazardRecognizer.h"
39 #include "llvm/CodeGen/SchedulerRegistry.h"
40 #include "llvm/CodeGen/SelectionDAG.h"
41 #include "llvm/CodeGen/DwarfWriter.h"
42 #include "llvm/Target/TargetRegisterInfo.h"
43 #include "llvm/Target/TargetData.h"
44 #include "llvm/Target/TargetFrameInfo.h"
45 #include "llvm/Target/TargetInstrInfo.h"
46 #include "llvm/Target/TargetLowering.h"
47 #include "llvm/Target/TargetMachine.h"
48 #include "llvm/Target/TargetOptions.h"
49 #include "llvm/Support/Compiler.h"
50 #include "llvm/Support/Debug.h"
51 #include "llvm/Support/ErrorHandling.h"
52 #include "llvm/Support/MathExtras.h"
53 #include "llvm/Support/Timer.h"
54 #include "llvm/Support/raw_ostream.h"
59 DisableLegalizeTypes("disable-legalize-types", cl::Hidden
);
61 EnableFastISelVerbose("fast-isel-verbose", cl::Hidden
,
62 cl::desc("Enable verbose messages in the \"fast\" "
63 "instruction selector"));
65 EnableFastISelAbort("fast-isel-abort", cl::Hidden
,
66 cl::desc("Enable abort calls when \"fast\" instruction fails"));
68 SchedLiveInCopies("schedule-livein-copies",
69 cl::desc("Schedule copies of livein registers"),
74 ViewDAGCombine1("view-dag-combine1-dags", cl::Hidden
,
75 cl::desc("Pop up a window to show dags before the first "
78 ViewLegalizeTypesDAGs("view-legalize-types-dags", cl::Hidden
,
79 cl::desc("Pop up a window to show dags before legalize types"));
81 ViewLegalizeDAGs("view-legalize-dags", cl::Hidden
,
82 cl::desc("Pop up a window to show dags before legalize"));
84 ViewDAGCombine2("view-dag-combine2-dags", cl::Hidden
,
85 cl::desc("Pop up a window to show dags before the second "
88 ViewDAGCombineLT("view-dag-combine-lt-dags", cl::Hidden
,
89 cl::desc("Pop up a window to show dags before the post legalize types"
90 " dag combine pass"));
92 ViewISelDAGs("view-isel-dags", cl::Hidden
,
93 cl::desc("Pop up a window to show isel dags as they are selected"));
95 ViewSchedDAGs("view-sched-dags", cl::Hidden
,
96 cl::desc("Pop up a window to show sched dags as they are processed"));
98 ViewSUnitDAGs("view-sunit-dags", cl::Hidden
,
99 cl::desc("Pop up a window to show SUnit dags after they are processed"));
101 static const bool ViewDAGCombine1
= false,
102 ViewLegalizeTypesDAGs
= false, ViewLegalizeDAGs
= false,
103 ViewDAGCombine2
= false,
104 ViewDAGCombineLT
= false,
105 ViewISelDAGs
= false, ViewSchedDAGs
= false,
106 ViewSUnitDAGs
= false;
109 //===---------------------------------------------------------------------===//
111 /// RegisterScheduler class - Track the registration of instruction schedulers.
113 //===---------------------------------------------------------------------===//
114 MachinePassRegistry
RegisterScheduler::Registry
;
116 //===---------------------------------------------------------------------===//
118 /// ISHeuristic command line option for instruction schedulers.
120 //===---------------------------------------------------------------------===//
121 static cl::opt
<RegisterScheduler::FunctionPassCtor
, false,
122 RegisterPassParser
<RegisterScheduler
> >
123 ISHeuristic("pre-RA-sched",
124 cl::init(&createDefaultScheduler
),
125 cl::desc("Instruction schedulers available (before register"
128 static RegisterScheduler
129 defaultListDAGScheduler("default", "Best scheduler for the target",
130 createDefaultScheduler
);
133 //===--------------------------------------------------------------------===//
134 /// createDefaultScheduler - This creates an instruction scheduler appropriate
136 ScheduleDAGSDNodes
* createDefaultScheduler(SelectionDAGISel
*IS
,
137 CodeGenOpt::Level OptLevel
) {
138 const TargetLowering
&TLI
= IS
->getTargetLowering();
140 if (OptLevel
== CodeGenOpt::None
)
141 return createFastDAGScheduler(IS
, OptLevel
);
142 if (TLI
.getSchedulingPreference() == TargetLowering::SchedulingForLatency
)
143 return createTDListDAGScheduler(IS
, OptLevel
);
144 assert(TLI
.getSchedulingPreference() ==
145 TargetLowering::SchedulingForRegPressure
&& "Unknown sched type!");
146 return createBURRListDAGScheduler(IS
, OptLevel
);
150 // EmitInstrWithCustomInserter - This method should be implemented by targets
151 // that mark instructions with the 'usesCustomDAGSchedInserter' flag. These
152 // instructions are special in various ways, which require special support to
153 // insert. The specified MachineInstr is created but not inserted into any
154 // basic blocks, and the scheduler passes ownership of it to this method.
155 MachineBasicBlock
*TargetLowering::EmitInstrWithCustomInserter(MachineInstr
*MI
,
156 MachineBasicBlock
*MBB
) const {
158 cerr
<< "If a target marks an instruction with "
159 "'usesCustomDAGSchedInserter', it must implement "
160 "TargetLowering::EmitInstrWithCustomInserter!";
166 /// 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
169 static 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
) {
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
189 bool Coalesced
= false;
190 unsigned SrcReg
, DstReg
, SrcSubReg
, DstSubReg
;
192 TII
.isMoveInstr(*UseMI
, SrcReg
, DstReg
, SrcSubReg
, DstSubReg
) &&
193 TargetRegisterInfo::isVirtualRegister(DstReg
)) {
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:
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.
219 break; // Woot! Found a good location.
223 bool Emitted
= TII
.copyRegToReg(*MBB
, Pos
, VirtReg
, PhysReg
, RC
, RC
);
224 assert(Emitted
&& "Unable to issue a live-in copy instruction!\n");
227 CopyRegMap
.insert(std::make_pair(prior(Pos
), VirtReg
));
229 if (&*InsertPos
== UseMI
) ++InsertPos
;
234 /// EmitLiveInCopies - If this is the first basic block in the function,
235 /// and if it has live ins that need to be copied into vregs, emit the
236 /// copies into the block.
237 static void EmitLiveInCopies(MachineBasicBlock
*EntryMBB
,
238 const MachineRegisterInfo
&MRI
,
239 const TargetRegisterInfo
&TRI
,
240 const TargetInstrInfo
&TII
) {
241 if (SchedLiveInCopies
) {
242 // Emit the copies at a heuristically-determined location in the block.
243 DenseMap
<MachineInstr
*, unsigned> CopyRegMap
;
244 MachineBasicBlock::iterator InsertPos
= EntryMBB
->begin();
245 for (MachineRegisterInfo::livein_iterator LI
= MRI
.livein_begin(),
246 E
= MRI
.livein_end(); LI
!= E
; ++LI
)
248 const TargetRegisterClass
*RC
= MRI
.getRegClass(LI
->second
);
249 EmitLiveInCopy(EntryMBB
, InsertPos
, LI
->second
, LI
->first
,
250 RC
, CopyRegMap
, MRI
, TRI
, TII
);
253 // Emit the copies into the top of the block.
254 for (MachineRegisterInfo::livein_iterator LI
= MRI
.livein_begin(),
255 E
= MRI
.livein_end(); LI
!= E
; ++LI
)
257 const TargetRegisterClass
*RC
= MRI
.getRegClass(LI
->second
);
258 bool Emitted
= TII
.copyRegToReg(*EntryMBB
, EntryMBB
->begin(),
259 LI
->second
, LI
->first
, RC
, RC
);
260 assert(Emitted
&& "Unable to issue a live-in copy instruction!\n");
266 //===----------------------------------------------------------------------===//
267 // SelectionDAGISel code
268 //===----------------------------------------------------------------------===//
270 SelectionDAGISel::SelectionDAGISel(TargetMachine
&tm
, CodeGenOpt::Level OL
) :
271 MachineFunctionPass(&ID
), TM(tm
), TLI(*tm
.getTargetLowering()),
272 FuncInfo(new FunctionLoweringInfo(TLI
)),
273 CurDAG(new SelectionDAG(TLI
, *FuncInfo
)),
274 SDL(new SelectionDAGLowering(*CurDAG
, TLI
, *FuncInfo
, OL
)),
280 SelectionDAGISel::~SelectionDAGISel() {
286 unsigned SelectionDAGISel::MakeReg(EVT VT
) {
287 return RegInfo
->createVirtualRegister(TLI
.getRegClassFor(VT
));
290 void SelectionDAGISel::getAnalysisUsage(AnalysisUsage
&AU
) const {
291 AU
.addRequired
<AliasAnalysis
>();
292 AU
.addPreserved
<AliasAnalysis
>();
293 AU
.addRequired
<GCModuleInfo
>();
294 AU
.addPreserved
<GCModuleInfo
>();
295 AU
.addRequired
<DwarfWriter
>();
296 AU
.addPreserved
<DwarfWriter
>();
297 MachineFunctionPass::getAnalysisUsage(AU
);
300 bool SelectionDAGISel::runOnMachineFunction(MachineFunction
&mf
) {
301 Function
&Fn
= *mf
.getFunction();
303 // Do some sanity-checking on the command-line options.
304 assert((!EnableFastISelVerbose
|| EnableFastISel
) &&
305 "-fast-isel-verbose requires -fast-isel");
306 assert((!EnableFastISelAbort
|| EnableFastISel
) &&
307 "-fast-isel-abort requires -fast-isel");
309 // Get alias analysis for load/store combining.
310 AA
= &getAnalysis
<AliasAnalysis
>();
313 const TargetInstrInfo
&TII
= *TM
.getInstrInfo();
314 const TargetRegisterInfo
&TRI
= *TM
.getRegisterInfo();
317 GFI
= &getAnalysis
<GCModuleInfo
>().getFunctionInfo(Fn
);
320 RegInfo
= &MF
->getRegInfo();
321 DEBUG(errs() << "\n\n\n=== " << Fn
.getName() << "\n");
323 MachineModuleInfo
*MMI
= getAnalysisIfAvailable
<MachineModuleInfo
>();
324 DwarfWriter
*DW
= getAnalysisIfAvailable
<DwarfWriter
>();
325 CurDAG
->init(*MF
, MMI
, DW
);
326 FuncInfo
->set(Fn
, *MF
, *CurDAG
, EnableFastISel
);
329 for (Function::iterator I
= Fn
.begin(), E
= Fn
.end(); I
!= E
; ++I
)
330 if (InvokeInst
*Invoke
= dyn_cast
<InvokeInst
>(I
->getTerminator()))
332 FuncInfo
->MBBMap
[Invoke
->getSuccessor(1)]->setIsLandingPad();
334 SelectAllBasicBlocks(Fn
, *MF
, MMI
, DW
, TII
);
336 // If the first basic block in the function has live ins that need to be
337 // copied into vregs, emit the copies into the top of the block before
338 // emitting the code for the block.
339 EmitLiveInCopies(MF
->begin(), *RegInfo
, TRI
, TII
);
341 // Add function live-ins to entry block live-in set.
342 for (MachineRegisterInfo::livein_iterator I
= RegInfo
->livein_begin(),
343 E
= RegInfo
->livein_end(); I
!= E
; ++I
)
344 MF
->begin()->addLiveIn(I
->first
);
347 assert(FuncInfo
->CatchInfoFound
.size() == FuncInfo
->CatchInfoLost
.size() &&
348 "Not all catch info was assigned to a landing pad!");
356 static void copyCatchInfo(BasicBlock
*SrcBB
, BasicBlock
*DestBB
,
357 MachineModuleInfo
*MMI
, FunctionLoweringInfo
&FLI
) {
358 for (BasicBlock::iterator I
= SrcBB
->begin(), E
= --SrcBB
->end(); I
!= E
; ++I
)
359 if (EHSelectorInst
*EHSel
= dyn_cast
<EHSelectorInst
>(I
)) {
360 // Apply the catch info to DestBB.
361 AddCatchInfo(*EHSel
, MMI
, FLI
.MBBMap
[DestBB
]);
363 if (!FLI
.MBBMap
[SrcBB
]->isLandingPad())
364 FLI
.CatchInfoFound
.insert(EHSel
);
369 void SelectionDAGISel::SelectBasicBlock(BasicBlock
*LLVMBB
,
370 BasicBlock::iterator Begin
,
371 BasicBlock::iterator End
) {
372 SDL
->setCurrentBasicBlock(BB
);
374 // Lower all of the non-terminator instructions. If a call is emitted
375 // as a tail call, cease emitting nodes for this block.
376 for (BasicBlock::iterator I
= Begin
; I
!= End
&& !SDL
->HasTailCall
; ++I
)
377 if (!isa
<TerminatorInst
>(I
))
380 if (!SDL
->HasTailCall
) {
381 // Ensure that all instructions which are used outside of their defining
382 // blocks are available as virtual registers. Invoke is handled elsewhere.
383 for (BasicBlock::iterator I
= Begin
; I
!= End
; ++I
)
384 if (!isa
<PHINode
>(I
) && !isa
<InvokeInst
>(I
))
385 SDL
->CopyToExportRegsIfNeeded(I
);
387 // Handle PHI nodes in successor blocks.
388 if (End
== LLVMBB
->end()) {
389 HandlePHINodesInSuccessorBlocks(LLVMBB
);
391 // Lower the terminator after the copies are emitted.
392 SDL
->visit(*LLVMBB
->getTerminator());
396 // Make sure the root of the DAG is up-to-date.
397 CurDAG
->setRoot(SDL
->getControlRoot());
399 // Final step, emit the lowered DAG as machine code.
404 void SelectionDAGISel::ComputeLiveOutVRegInfo() {
405 SmallPtrSet
<SDNode
*, 128> VisitedNodes
;
406 SmallVector
<SDNode
*, 128> Worklist
;
408 Worklist
.push_back(CurDAG
->getRoot().getNode());
414 while (!Worklist
.empty()) {
415 SDNode
*N
= Worklist
.back();
418 // If we've already seen this node, ignore it.
419 if (!VisitedNodes
.insert(N
))
422 // Otherwise, add all chain operands to the worklist.
423 for (unsigned i
= 0, e
= N
->getNumOperands(); i
!= e
; ++i
)
424 if (N
->getOperand(i
).getValueType() == MVT::Other
)
425 Worklist
.push_back(N
->getOperand(i
).getNode());
427 // If this is a CopyToReg with a vreg dest, process it.
428 if (N
->getOpcode() != ISD::CopyToReg
)
431 unsigned DestReg
= cast
<RegisterSDNode
>(N
->getOperand(1))->getReg();
432 if (!TargetRegisterInfo::isVirtualRegister(DestReg
))
435 // Ignore non-scalar or non-integer values.
436 SDValue Src
= N
->getOperand(2);
437 EVT SrcVT
= Src
.getValueType();
438 if (!SrcVT
.isInteger() || SrcVT
.isVector())
441 unsigned NumSignBits
= CurDAG
->ComputeNumSignBits(Src
);
442 Mask
= APInt::getAllOnesValue(SrcVT
.getSizeInBits());
443 CurDAG
->ComputeMaskedBits(Src
, Mask
, KnownZero
, KnownOne
);
445 // Only install this information if it tells us something.
446 if (NumSignBits
!= 1 || KnownZero
!= 0 || KnownOne
!= 0) {
447 DestReg
-= TargetRegisterInfo::FirstVirtualRegister
;
448 if (DestReg
>= FuncInfo
->LiveOutRegInfo
.size())
449 FuncInfo
->LiveOutRegInfo
.resize(DestReg
+1);
450 FunctionLoweringInfo::LiveOutInfo
&LOI
=
451 FuncInfo
->LiveOutRegInfo
[DestReg
];
452 LOI
.NumSignBits
= NumSignBits
;
453 LOI
.KnownOne
= KnownOne
;
454 LOI
.KnownZero
= KnownZero
;
459 void SelectionDAGISel::CodeGenAndEmitDAG() {
460 std::string GroupName
;
461 if (TimePassesIsEnabled
)
462 GroupName
= "Instruction Selection and Scheduling";
463 std::string BlockName
;
464 if (ViewDAGCombine1
|| ViewLegalizeTypesDAGs
|| ViewLegalizeDAGs
||
465 ViewDAGCombine2
|| ViewDAGCombineLT
|| ViewISelDAGs
|| ViewSchedDAGs
||
467 BlockName
= MF
->getFunction()->getNameStr() + ":" +
468 BB
->getBasicBlock()->getNameStr();
470 DOUT
<< "Initial selection DAG:\n";
471 DEBUG(CurDAG
->dump());
473 if (ViewDAGCombine1
) CurDAG
->viewGraph("dag-combine1 input for " + BlockName
);
475 // Run the DAG combiner in pre-legalize mode.
476 if (TimePassesIsEnabled
) {
477 NamedRegionTimer
T("DAG Combining 1", GroupName
);
478 CurDAG
->Combine(Unrestricted
, *AA
, OptLevel
);
480 CurDAG
->Combine(Unrestricted
, *AA
, OptLevel
);
483 DOUT
<< "Optimized lowered selection DAG:\n";
484 DEBUG(CurDAG
->dump());
486 // Second step, hack on the DAG until it only uses operations and types that
487 // the target supports.
488 if (!DisableLegalizeTypes
) {
489 if (ViewLegalizeTypesDAGs
) CurDAG
->viewGraph("legalize-types input for " +
493 if (TimePassesIsEnabled
) {
494 NamedRegionTimer
T("Type Legalization", GroupName
);
495 Changed
= CurDAG
->LegalizeTypes();
497 Changed
= CurDAG
->LegalizeTypes();
500 DOUT
<< "Type-legalized selection DAG:\n";
501 DEBUG(CurDAG
->dump());
504 if (ViewDAGCombineLT
)
505 CurDAG
->viewGraph("dag-combine-lt input for " + BlockName
);
507 // Run the DAG combiner in post-type-legalize mode.
508 if (TimePassesIsEnabled
) {
509 NamedRegionTimer
T("DAG Combining after legalize types", GroupName
);
510 CurDAG
->Combine(NoIllegalTypes
, *AA
, OptLevel
);
512 CurDAG
->Combine(NoIllegalTypes
, *AA
, OptLevel
);
515 DOUT
<< "Optimized type-legalized selection DAG:\n";
516 DEBUG(CurDAG
->dump());
519 if (TimePassesIsEnabled
) {
520 NamedRegionTimer
T("Vector Legalization", GroupName
);
521 Changed
= CurDAG
->LegalizeVectors();
523 Changed
= CurDAG
->LegalizeVectors();
527 if (TimePassesIsEnabled
) {
528 NamedRegionTimer
T("Type Legalization 2", GroupName
);
529 Changed
= CurDAG
->LegalizeTypes();
531 Changed
= CurDAG
->LegalizeTypes();
534 if (ViewDAGCombineLT
)
535 CurDAG
->viewGraph("dag-combine-lv input for " + BlockName
);
537 // Run the DAG combiner in post-type-legalize mode.
538 if (TimePassesIsEnabled
) {
539 NamedRegionTimer
T("DAG Combining after legalize vectors", GroupName
);
540 CurDAG
->Combine(NoIllegalOperations
, *AA
, OptLevel
);
542 CurDAG
->Combine(NoIllegalOperations
, *AA
, OptLevel
);
545 DOUT
<< "Optimized vector-legalized selection DAG:\n";
546 DEBUG(CurDAG
->dump());
550 if (ViewLegalizeDAGs
) CurDAG
->viewGraph("legalize input for " + BlockName
);
552 if (TimePassesIsEnabled
) {
553 NamedRegionTimer
T("DAG Legalization", GroupName
);
554 CurDAG
->Legalize(DisableLegalizeTypes
, OptLevel
);
556 CurDAG
->Legalize(DisableLegalizeTypes
, OptLevel
);
559 DOUT
<< "Legalized selection DAG:\n";
560 DEBUG(CurDAG
->dump());
562 if (ViewDAGCombine2
) CurDAG
->viewGraph("dag-combine2 input for " + BlockName
);
564 // Run the DAG combiner in post-legalize mode.
565 if (TimePassesIsEnabled
) {
566 NamedRegionTimer
T("DAG Combining 2", GroupName
);
567 CurDAG
->Combine(NoIllegalOperations
, *AA
, OptLevel
);
569 CurDAG
->Combine(NoIllegalOperations
, *AA
, OptLevel
);
572 DOUT
<< "Optimized legalized selection DAG:\n";
573 DEBUG(CurDAG
->dump());
575 if (ViewISelDAGs
) CurDAG
->viewGraph("isel input for " + BlockName
);
577 if (OptLevel
!= CodeGenOpt::None
)
578 ComputeLiveOutVRegInfo();
580 // Third, instruction select all of the operations to machine code, adding the
581 // code to the MachineBasicBlock.
582 if (TimePassesIsEnabled
) {
583 NamedRegionTimer
T("Instruction Selection", GroupName
);
589 DOUT
<< "Selected selection DAG:\n";
590 DEBUG(CurDAG
->dump());
592 if (ViewSchedDAGs
) CurDAG
->viewGraph("scheduler input for " + BlockName
);
594 // Schedule machine code.
595 ScheduleDAGSDNodes
*Scheduler
= CreateScheduler();
596 if (TimePassesIsEnabled
) {
597 NamedRegionTimer
T("Instruction Scheduling", GroupName
);
598 Scheduler
->Run(CurDAG
, BB
, BB
->end());
600 Scheduler
->Run(CurDAG
, BB
, BB
->end());
603 if (ViewSUnitDAGs
) Scheduler
->viewGraph();
605 // Emit machine code to BB. This can change 'BB' to the last block being
607 if (TimePassesIsEnabled
) {
608 NamedRegionTimer
T("Instruction Creation", GroupName
);
609 BB
= Scheduler
->EmitSchedule();
611 BB
= Scheduler
->EmitSchedule();
614 // Free the scheduler state.
615 if (TimePassesIsEnabled
) {
616 NamedRegionTimer
T("Instruction Scheduling Cleanup", GroupName
);
622 DOUT
<< "Selected machine code:\n";
626 void SelectionDAGISel::SelectAllBasicBlocks(Function
&Fn
,
628 MachineModuleInfo
*MMI
,
630 const TargetInstrInfo
&TII
) {
631 // Initialize the Fast-ISel state, if needed.
632 FastISel
*FastIS
= 0;
634 FastIS
= TLI
.createFastISel(MF
, MMI
, DW
,
637 FuncInfo
->StaticAllocaMap
639 , FuncInfo
->CatchInfoLost
643 // Iterate over all basic blocks in the function.
644 for (Function::iterator I
= Fn
.begin(), E
= Fn
.end(); I
!= E
; ++I
) {
645 BasicBlock
*LLVMBB
= &*I
;
646 BB
= FuncInfo
->MBBMap
[LLVMBB
];
648 BasicBlock::iterator
const Begin
= LLVMBB
->begin();
649 BasicBlock::iterator
const End
= LLVMBB
->end();
650 BasicBlock::iterator BI
= Begin
;
652 // Lower any arguments needed in this block if this is the entry block.
653 bool SuppressFastISel
= false;
654 if (LLVMBB
== &Fn
.getEntryBlock()) {
655 LowerArguments(LLVMBB
);
657 // If any of the arguments has the byval attribute, forgo
658 // fast-isel in the entry block.
661 for (Function::arg_iterator I
= Fn
.arg_begin(), E
= Fn
.arg_end();
663 if (Fn
.paramHasAttr(j
, Attribute::ByVal
)) {
664 if (EnableFastISelVerbose
|| EnableFastISelAbort
)
665 cerr
<< "FastISel skips entry block due to byval argument\n";
666 SuppressFastISel
= true;
672 if (MMI
&& BB
->isLandingPad()) {
673 // Add a label to mark the beginning of the landing pad. Deletion of the
674 // landing pad can thus be detected via the MachineModuleInfo.
675 unsigned LabelID
= MMI
->addLandingPad(BB
);
677 const TargetInstrDesc
&II
= TII
.get(TargetInstrInfo::EH_LABEL
);
678 BuildMI(BB
, SDL
->getCurDebugLoc(), II
).addImm(LabelID
);
680 // Mark exception register as live in.
681 unsigned Reg
= TLI
.getExceptionAddressRegister();
682 if (Reg
) BB
->addLiveIn(Reg
);
684 // Mark exception selector register as live in.
685 Reg
= TLI
.getExceptionSelectorRegister();
686 if (Reg
) BB
->addLiveIn(Reg
);
688 // FIXME: Hack around an exception handling flaw (PR1508): the personality
689 // function and list of typeids logically belong to the invoke (or, if you
690 // like, the basic block containing the invoke), and need to be associated
691 // with it in the dwarf exception handling tables. Currently however the
692 // information is provided by an intrinsic (eh.selector) that can be moved
693 // to unexpected places by the optimizers: if the unwind edge is critical,
694 // then breaking it can result in the intrinsics being in the successor of
695 // the landing pad, not the landing pad itself. This results in exceptions
696 // not being caught because no typeids are associated with the invoke.
697 // This may not be the only way things can go wrong, but it is the only way
698 // we try to work around for the moment.
699 BranchInst
*Br
= dyn_cast
<BranchInst
>(LLVMBB
->getTerminator());
701 if (Br
&& Br
->isUnconditional()) { // Critical edge?
702 BasicBlock::iterator I
, E
;
703 for (I
= LLVMBB
->begin(), E
= --LLVMBB
->end(); I
!= E
; ++I
)
704 if (isa
<EHSelectorInst
>(I
))
708 // No catch info found - try to extract some from the successor.
709 copyCatchInfo(Br
->getSuccessor(0), LLVMBB
, MMI
, *FuncInfo
);
713 // Before doing SelectionDAG ISel, see if FastISel has been requested.
714 if (FastIS
&& !SuppressFastISel
) {
715 // Emit code for any incoming arguments. This must happen before
716 // beginning FastISel on the entry block.
717 if (LLVMBB
== &Fn
.getEntryBlock()) {
718 CurDAG
->setRoot(SDL
->getControlRoot());
722 FastIS
->startNewBlock(BB
);
723 // Do FastISel on as many instructions as possible.
724 for (; BI
!= End
; ++BI
) {
725 // Just before the terminator instruction, insert instructions to
726 // feed PHI nodes in successor blocks.
727 if (isa
<TerminatorInst
>(BI
))
728 if (!HandlePHINodesInSuccessorBlocksFast(LLVMBB
, FastIS
)) {
729 if (EnableFastISelVerbose
|| EnableFastISelAbort
) {
730 cerr
<< "FastISel miss: ";
733 assert(!EnableFastISelAbort
&&
734 "FastISel didn't handle a PHI in a successor");
738 // First try normal tablegen-generated "fast" selection.
739 if (FastIS
->SelectInstruction(BI
))
742 // Next, try calling the target to attempt to handle the instruction.
743 if (FastIS
->TargetSelectInstruction(BI
))
746 // Then handle certain instructions as single-LLVM-Instruction blocks.
747 if (isa
<CallInst
>(BI
)) {
748 if (EnableFastISelVerbose
|| EnableFastISelAbort
) {
749 cerr
<< "FastISel missed call: ";
753 if (BI
->getType() != Type::getVoidTy(*CurDAG
->getContext())) {
754 unsigned &R
= FuncInfo
->ValueMap
[BI
];
756 R
= FuncInfo
->CreateRegForValue(BI
);
759 SDL
->setCurDebugLoc(FastIS
->getCurDebugLoc());
760 SelectBasicBlock(LLVMBB
, BI
, next(BI
));
761 // If the instruction was codegen'd with multiple blocks,
762 // inform the FastISel object where to resume inserting.
763 FastIS
->setCurrentBlock(BB
);
767 // Otherwise, give up on FastISel for the rest of the block.
768 // For now, be a little lenient about non-branch terminators.
769 if (!isa
<TerminatorInst
>(BI
) || isa
<BranchInst
>(BI
)) {
770 if (EnableFastISelVerbose
|| EnableFastISelAbort
) {
771 cerr
<< "FastISel miss: ";
774 if (EnableFastISelAbort
)
775 // The "fast" selector couldn't handle something and bailed.
776 // For the purpose of debugging, just abort.
777 llvm_unreachable("FastISel didn't select the entire block");
783 // Run SelectionDAG instruction selection on the remainder of the block
784 // not handled by FastISel. If FastISel is not run, this is the entire
787 // If FastISel is run and it has known DebugLoc then use it.
788 if (FastIS
&& !FastIS
->getCurDebugLoc().isUnknown())
789 SDL
->setCurDebugLoc(FastIS
->getCurDebugLoc());
790 SelectBasicBlock(LLVMBB
, BI
, End
);
800 SelectionDAGISel::FinishBasicBlock() {
802 DOUT
<< "Target-post-processed machine code:\n";
805 DOUT
<< "Total amount of phi nodes to update: "
806 << SDL
->PHINodesToUpdate
.size() << "\n";
807 DEBUG(for (unsigned i
= 0, e
= SDL
->PHINodesToUpdate
.size(); i
!= e
; ++i
)
808 DOUT
<< "Node " << i
<< " : (" << SDL
->PHINodesToUpdate
[i
].first
809 << ", " << SDL
->PHINodesToUpdate
[i
].second
<< ")\n";);
811 // Next, now that we know what the last MBB the LLVM BB expanded is, update
812 // PHI nodes in successors.
813 if (SDL
->SwitchCases
.empty() &&
814 SDL
->JTCases
.empty() &&
815 SDL
->BitTestCases
.empty()) {
816 for (unsigned i
= 0, e
= SDL
->PHINodesToUpdate
.size(); i
!= e
; ++i
) {
817 MachineInstr
*PHI
= SDL
->PHINodesToUpdate
[i
].first
;
818 assert(PHI
->getOpcode() == TargetInstrInfo::PHI
&&
819 "This is not a machine PHI node that we are updating!");
820 PHI
->addOperand(MachineOperand::CreateReg(SDL
->PHINodesToUpdate
[i
].second
,
822 PHI
->addOperand(MachineOperand::CreateMBB(BB
));
824 SDL
->PHINodesToUpdate
.clear();
828 for (unsigned i
= 0, e
= SDL
->BitTestCases
.size(); i
!= e
; ++i
) {
829 // Lower header first, if it wasn't already lowered
830 if (!SDL
->BitTestCases
[i
].Emitted
) {
831 // Set the current basic block to the mbb we wish to insert the code into
832 BB
= SDL
->BitTestCases
[i
].Parent
;
833 SDL
->setCurrentBasicBlock(BB
);
835 SDL
->visitBitTestHeader(SDL
->BitTestCases
[i
]);
836 CurDAG
->setRoot(SDL
->getRoot());
841 for (unsigned j
= 0, ej
= SDL
->BitTestCases
[i
].Cases
.size(); j
!= ej
; ++j
) {
842 // Set the current basic block to the mbb we wish to insert the code into
843 BB
= SDL
->BitTestCases
[i
].Cases
[j
].ThisBB
;
844 SDL
->setCurrentBasicBlock(BB
);
847 SDL
->visitBitTestCase(SDL
->BitTestCases
[i
].Cases
[j
+1].ThisBB
,
848 SDL
->BitTestCases
[i
].Reg
,
849 SDL
->BitTestCases
[i
].Cases
[j
]);
851 SDL
->visitBitTestCase(SDL
->BitTestCases
[i
].Default
,
852 SDL
->BitTestCases
[i
].Reg
,
853 SDL
->BitTestCases
[i
].Cases
[j
]);
856 CurDAG
->setRoot(SDL
->getRoot());
862 for (unsigned pi
= 0, pe
= SDL
->PHINodesToUpdate
.size(); pi
!= pe
; ++pi
) {
863 MachineInstr
*PHI
= SDL
->PHINodesToUpdate
[pi
].first
;
864 MachineBasicBlock
*PHIBB
= PHI
->getParent();
865 assert(PHI
->getOpcode() == TargetInstrInfo::PHI
&&
866 "This is not a machine PHI node that we are updating!");
867 // This is "default" BB. We have two jumps to it. From "header" BB and
868 // from last "case" BB.
869 if (PHIBB
== SDL
->BitTestCases
[i
].Default
) {
870 PHI
->addOperand(MachineOperand::CreateReg(SDL
->PHINodesToUpdate
[pi
].second
,
872 PHI
->addOperand(MachineOperand::CreateMBB(SDL
->BitTestCases
[i
].Parent
));
873 PHI
->addOperand(MachineOperand::CreateReg(SDL
->PHINodesToUpdate
[pi
].second
,
875 PHI
->addOperand(MachineOperand::CreateMBB(SDL
->BitTestCases
[i
].Cases
.
878 // One of "cases" BB.
879 for (unsigned j
= 0, ej
= SDL
->BitTestCases
[i
].Cases
.size();
881 MachineBasicBlock
* cBB
= SDL
->BitTestCases
[i
].Cases
[j
].ThisBB
;
882 if (cBB
->succ_end() !=
883 std::find(cBB
->succ_begin(),cBB
->succ_end(), PHIBB
)) {
884 PHI
->addOperand(MachineOperand::CreateReg(SDL
->PHINodesToUpdate
[pi
].second
,
886 PHI
->addOperand(MachineOperand::CreateMBB(cBB
));
891 SDL
->BitTestCases
.clear();
893 // If the JumpTable record is filled in, then we need to emit a jump table.
894 // Updating the PHI nodes is tricky in this case, since we need to determine
895 // whether the PHI is a successor of the range check MBB or the jump table MBB
896 for (unsigned i
= 0, e
= SDL
->JTCases
.size(); i
!= e
; ++i
) {
897 // Lower header first, if it wasn't already lowered
898 if (!SDL
->JTCases
[i
].first
.Emitted
) {
899 // Set the current basic block to the mbb we wish to insert the code into
900 BB
= SDL
->JTCases
[i
].first
.HeaderBB
;
901 SDL
->setCurrentBasicBlock(BB
);
903 SDL
->visitJumpTableHeader(SDL
->JTCases
[i
].second
, SDL
->JTCases
[i
].first
);
904 CurDAG
->setRoot(SDL
->getRoot());
909 // Set the current basic block to the mbb we wish to insert the code into
910 BB
= SDL
->JTCases
[i
].second
.MBB
;
911 SDL
->setCurrentBasicBlock(BB
);
913 SDL
->visitJumpTable(SDL
->JTCases
[i
].second
);
914 CurDAG
->setRoot(SDL
->getRoot());
919 for (unsigned pi
= 0, pe
= SDL
->PHINodesToUpdate
.size(); pi
!= pe
; ++pi
) {
920 MachineInstr
*PHI
= SDL
->PHINodesToUpdate
[pi
].first
;
921 MachineBasicBlock
*PHIBB
= PHI
->getParent();
922 assert(PHI
->getOpcode() == TargetInstrInfo::PHI
&&
923 "This is not a machine PHI node that we are updating!");
924 // "default" BB. We can go there only from header BB.
925 if (PHIBB
== SDL
->JTCases
[i
].second
.Default
) {
926 PHI
->addOperand(MachineOperand::CreateReg(SDL
->PHINodesToUpdate
[pi
].second
,
928 PHI
->addOperand(MachineOperand::CreateMBB(SDL
->JTCases
[i
].first
.HeaderBB
));
930 // JT BB. Just iterate over successors here
931 if (BB
->succ_end() != std::find(BB
->succ_begin(),BB
->succ_end(), PHIBB
)) {
932 PHI
->addOperand(MachineOperand::CreateReg(SDL
->PHINodesToUpdate
[pi
].second
,
934 PHI
->addOperand(MachineOperand::CreateMBB(BB
));
938 SDL
->JTCases
.clear();
940 // If the switch block involved a branch to one of the actual successors, we
941 // need to update PHI nodes in that block.
942 for (unsigned i
= 0, e
= SDL
->PHINodesToUpdate
.size(); i
!= e
; ++i
) {
943 MachineInstr
*PHI
= SDL
->PHINodesToUpdate
[i
].first
;
944 assert(PHI
->getOpcode() == TargetInstrInfo::PHI
&&
945 "This is not a machine PHI node that we are updating!");
946 if (BB
->isSuccessor(PHI
->getParent())) {
947 PHI
->addOperand(MachineOperand::CreateReg(SDL
->PHINodesToUpdate
[i
].second
,
949 PHI
->addOperand(MachineOperand::CreateMBB(BB
));
953 // If we generated any switch lowering information, build and codegen any
954 // additional DAGs necessary.
955 for (unsigned i
= 0, e
= SDL
->SwitchCases
.size(); i
!= e
; ++i
) {
956 // Set the current basic block to the mbb we wish to insert the code into
957 BB
= SDL
->SwitchCases
[i
].ThisBB
;
958 SDL
->setCurrentBasicBlock(BB
);
961 SDL
->visitSwitchCase(SDL
->SwitchCases
[i
]);
962 CurDAG
->setRoot(SDL
->getRoot());
966 // Handle any PHI nodes in successors of this chunk, as if we were coming
967 // from the original BB before switch expansion. Note that PHI nodes can
968 // occur multiple times in PHINodesToUpdate. We have to be very careful to
969 // handle them the right number of times.
970 while ((BB
= SDL
->SwitchCases
[i
].TrueBB
)) { // Handle LHS and RHS.
971 for (MachineBasicBlock::iterator Phi
= BB
->begin();
972 Phi
!= BB
->end() && Phi
->getOpcode() == TargetInstrInfo::PHI
; ++Phi
){
973 // This value for this PHI node is recorded in PHINodesToUpdate, get it.
974 for (unsigned pn
= 0; ; ++pn
) {
975 assert(pn
!= SDL
->PHINodesToUpdate
.size() &&
976 "Didn't find PHI entry!");
977 if (SDL
->PHINodesToUpdate
[pn
].first
== Phi
) {
978 Phi
->addOperand(MachineOperand::CreateReg(SDL
->PHINodesToUpdate
[pn
].
980 Phi
->addOperand(MachineOperand::CreateMBB(SDL
->SwitchCases
[i
].ThisBB
));
986 // Don't process RHS if same block as LHS.
987 if (BB
== SDL
->SwitchCases
[i
].FalseBB
)
988 SDL
->SwitchCases
[i
].FalseBB
= 0;
990 // If we haven't handled the RHS, do so now. Otherwise, we're done.
991 SDL
->SwitchCases
[i
].TrueBB
= SDL
->SwitchCases
[i
].FalseBB
;
992 SDL
->SwitchCases
[i
].FalseBB
= 0;
994 assert(SDL
->SwitchCases
[i
].TrueBB
== 0 && SDL
->SwitchCases
[i
].FalseBB
== 0);
996 SDL
->SwitchCases
.clear();
998 SDL
->PHINodesToUpdate
.clear();
1002 /// Create the scheduler. If a specific scheduler was specified
1003 /// via the SchedulerRegistry, use it, otherwise select the
1004 /// one preferred by the target.
1006 ScheduleDAGSDNodes
*SelectionDAGISel::CreateScheduler() {
1007 RegisterScheduler::FunctionPassCtor Ctor
= RegisterScheduler::getDefault();
1011 RegisterScheduler::setDefault(Ctor
);
1014 return Ctor(this, OptLevel
);
1017 ScheduleHazardRecognizer
*SelectionDAGISel::CreateTargetHazardRecognizer() {
1018 return new ScheduleHazardRecognizer();
1021 //===----------------------------------------------------------------------===//
1022 // Helper functions used by the generated instruction selector.
1023 //===----------------------------------------------------------------------===//
1024 // Calls to these methods are generated by tblgen.
1026 /// CheckAndMask - The isel is trying to match something like (and X, 255). If
1027 /// the dag combiner simplified the 255, we still want to match. RHS is the
1028 /// actual value in the DAG on the RHS of an AND, and DesiredMaskS is the value
1029 /// specified in the .td file (e.g. 255).
1030 bool SelectionDAGISel::CheckAndMask(SDValue LHS
, ConstantSDNode
*RHS
,
1031 int64_t DesiredMaskS
) const {
1032 const APInt
&ActualMask
= RHS
->getAPIntValue();
1033 const APInt
&DesiredMask
= APInt(LHS
.getValueSizeInBits(), DesiredMaskS
);
1035 // If the actual mask exactly matches, success!
1036 if (ActualMask
== DesiredMask
)
1039 // If the actual AND mask is allowing unallowed bits, this doesn't match.
1040 if (ActualMask
.intersects(~DesiredMask
))
1043 // Otherwise, the DAG Combiner may have proven that the value coming in is
1044 // either already zero or is not demanded. Check for known zero input bits.
1045 APInt NeededMask
= DesiredMask
& ~ActualMask
;
1046 if (CurDAG
->MaskedValueIsZero(LHS
, NeededMask
))
1049 // TODO: check to see if missing bits are just not demanded.
1051 // Otherwise, this pattern doesn't match.
1055 /// CheckOrMask - The isel is trying to match something like (or X, 255). If
1056 /// the dag combiner simplified the 255, we still want to match. RHS is the
1057 /// actual value in the DAG on the RHS of an OR, and DesiredMaskS is the value
1058 /// specified in the .td file (e.g. 255).
1059 bool SelectionDAGISel::CheckOrMask(SDValue LHS
, ConstantSDNode
*RHS
,
1060 int64_t DesiredMaskS
) const {
1061 const APInt
&ActualMask
= RHS
->getAPIntValue();
1062 const APInt
&DesiredMask
= APInt(LHS
.getValueSizeInBits(), DesiredMaskS
);
1064 // If the actual mask exactly matches, success!
1065 if (ActualMask
== DesiredMask
)
1068 // If the actual AND mask is allowing unallowed bits, this doesn't match.
1069 if (ActualMask
.intersects(~DesiredMask
))
1072 // Otherwise, the DAG Combiner may have proven that the value coming in is
1073 // either already zero or is not demanded. Check for known zero input bits.
1074 APInt NeededMask
= DesiredMask
& ~ActualMask
;
1076 APInt KnownZero
, KnownOne
;
1077 CurDAG
->ComputeMaskedBits(LHS
, NeededMask
, KnownZero
, KnownOne
);
1079 // If all the missing bits in the or are already known to be set, match!
1080 if ((NeededMask
& KnownOne
) == NeededMask
)
1083 // TODO: check to see if missing bits are just not demanded.
1085 // Otherwise, this pattern doesn't match.
1090 /// SelectInlineAsmMemoryOperands - Calls to this are automatically generated
1091 /// by tblgen. Others should not call it.
1092 void SelectionDAGISel::
1093 SelectInlineAsmMemoryOperands(std::vector
<SDValue
> &Ops
) {
1094 std::vector
<SDValue
> InOps
;
1095 std::swap(InOps
, Ops
);
1097 Ops
.push_back(InOps
[0]); // input chain.
1098 Ops
.push_back(InOps
[1]); // input asm string.
1100 unsigned i
= 2, e
= InOps
.size();
1101 if (InOps
[e
-1].getValueType() == MVT::Flag
)
1102 --e
; // Don't process a flag operand if it is here.
1105 unsigned Flags
= cast
<ConstantSDNode
>(InOps
[i
])->getZExtValue();
1106 if ((Flags
& 7) != 4 /*MEM*/) {
1107 // Just skip over this operand, copying the operands verbatim.
1108 Ops
.insert(Ops
.end(), InOps
.begin()+i
,
1109 InOps
.begin()+i
+InlineAsm::getNumOperandRegisters(Flags
) + 1);
1110 i
+= InlineAsm::getNumOperandRegisters(Flags
) + 1;
1112 assert(InlineAsm::getNumOperandRegisters(Flags
) == 1 &&
1113 "Memory operand with multiple values?");
1114 // Otherwise, this is a memory operand. Ask the target to select it.
1115 std::vector
<SDValue
> SelOps
;
1116 if (SelectInlineAsmMemoryOperand(InOps
[i
+1], 'm', SelOps
)) {
1117 llvm_report_error("Could not match memory address. Inline asm"
1121 // Add this to the output node.
1122 EVT IntPtrTy
= TLI
.getPointerTy();
1123 Ops
.push_back(CurDAG
->getTargetConstant(4/*MEM*/ | (SelOps
.size()<< 3),
1125 Ops
.insert(Ops
.end(), SelOps
.begin(), SelOps
.end());
1130 // Add the flag input back if present.
1131 if (e
!= InOps
.size())
1132 Ops
.push_back(InOps
.back());
1135 /// findFlagUse - Return use of EVT::Flag value produced by the specified
1138 static SDNode
*findFlagUse(SDNode
*N
) {
1139 unsigned FlagResNo
= N
->getNumValues()-1;
1140 for (SDNode::use_iterator I
= N
->use_begin(), E
= N
->use_end(); I
!= E
; ++I
) {
1141 SDUse
&Use
= I
.getUse();
1142 if (Use
.getResNo() == FlagResNo
)
1143 return Use
.getUser();
1148 /// findNonImmUse - Return true if "Use" is a non-immediate use of "Def".
1149 /// This function recursively traverses up the operand chain, ignoring
1151 static bool findNonImmUse(SDNode
*Use
, SDNode
* Def
, SDNode
*ImmedUse
,
1153 SmallPtrSet
<SDNode
*, 16> &Visited
) {
1154 if (Use
->getNodeId() < Def
->getNodeId() ||
1155 !Visited
.insert(Use
))
1158 for (unsigned i
= 0, e
= Use
->getNumOperands(); i
!= e
; ++i
) {
1159 SDNode
*N
= Use
->getOperand(i
).getNode();
1161 if (Use
== ImmedUse
|| Use
== Root
)
1162 continue; // We are not looking for immediate use.
1167 // Traverse up the operand chain.
1168 if (findNonImmUse(N
, Def
, ImmedUse
, Root
, Visited
))
1174 /// isNonImmUse - Start searching from Root up the DAG to check is Def can
1175 /// be reached. Return true if that's the case. However, ignore direct uses
1176 /// by ImmedUse (which would be U in the example illustrated in
1177 /// IsLegalAndProfitableToFold) and by Root (which can happen in the store
1179 /// FIXME: to be really generic, we should allow direct use by any node
1180 /// that is being folded. But realisticly since we only fold loads which
1181 /// have one non-chain use, we only need to watch out for load/op/store
1182 /// and load/op/cmp case where the root (store / cmp) may reach the load via
1183 /// its chain operand.
1184 static inline bool isNonImmUse(SDNode
*Root
, SDNode
*Def
, SDNode
*ImmedUse
) {
1185 SmallPtrSet
<SDNode
*, 16> Visited
;
1186 return findNonImmUse(Root
, Def
, ImmedUse
, Root
, Visited
);
1189 /// IsLegalAndProfitableToFold - Returns true if the specific operand node N of
1190 /// U can be folded during instruction selection that starts at Root and
1191 /// folding N is profitable.
1192 bool SelectionDAGISel::IsLegalAndProfitableToFold(SDNode
*N
, SDNode
*U
,
1193 SDNode
*Root
) const {
1194 if (OptLevel
== CodeGenOpt::None
) return false;
1196 // If Root use can somehow reach N through a path that that doesn't contain
1197 // U then folding N would create a cycle. e.g. In the following
1198 // diagram, Root can reach N through X. If N is folded into into Root, then
1199 // X is both a predecessor and a successor of U.
1210 // * indicates nodes to be folded together.
1212 // If Root produces a flag, then it gets (even more) interesting. Since it
1213 // will be "glued" together with its flag use in the scheduler, we need to
1214 // check if it might reach N.
1233 // If FU (flag use) indirectly reaches N (the load), and Root folds N
1234 // (call it Fold), then X is a predecessor of FU and a successor of
1235 // Fold. But since Fold and FU are flagged together, this will create
1236 // a cycle in the scheduling graph.
1238 EVT VT
= Root
->getValueType(Root
->getNumValues()-1);
1239 while (VT
== MVT::Flag
) {
1240 SDNode
*FU
= findFlagUse(Root
);
1244 VT
= Root
->getValueType(Root
->getNumValues()-1);
1247 return !isNonImmUse(Root
, N
, U
);
1251 char SelectionDAGISel::ID
= 0;