1 //===-- SelectionDAG.cpp - Implement the SelectionDAG data structures -----===//
3 // The LLVM Compiler Infrastructure
5 // This file was developed by the LLVM research group and is distributed under
6 // the University of Illinois Open Source License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This implements the SelectionDAG class.
12 //===----------------------------------------------------------------------===//
14 #include "llvm/CodeGen/SelectionDAG.h"
15 #include "llvm/Constants.h"
16 #include "llvm/GlobalVariable.h"
17 #include "llvm/Intrinsics.h"
18 #include "llvm/DerivedTypes.h"
19 #include "llvm/Assembly/Writer.h"
20 #include "llvm/CodeGen/MachineBasicBlock.h"
21 #include "llvm/CodeGen/MachineConstantPool.h"
22 #include "llvm/Support/MathExtras.h"
23 #include "llvm/Target/MRegisterInfo.h"
24 #include "llvm/Target/TargetData.h"
25 #include "llvm/Target/TargetLowering.h"
26 #include "llvm/Target/TargetInstrInfo.h"
27 #include "llvm/Target/TargetMachine.h"
28 #include "llvm/ADT/SetVector.h"
29 #include "llvm/ADT/SmallPtrSet.h"
30 #include "llvm/ADT/SmallVector.h"
31 #include "llvm/ADT/StringExtras.h"
36 /// makeVTList - Return an instance of the SDVTList struct initialized with the
37 /// specified members.
38 static SDVTList
makeVTList(const MVT::ValueType
*VTs
, unsigned NumVTs
) {
39 SDVTList Res
= {VTs
, NumVTs
};
43 //===----------------------------------------------------------------------===//
44 // ConstantFPSDNode Class
45 //===----------------------------------------------------------------------===//
47 /// isExactlyValue - We don't rely on operator== working on double values, as
48 /// it returns true for things that are clearly not equal, like -0.0 and 0.0.
49 /// As such, this method can be used to do an exact bit-for-bit comparison of
50 /// two floating point values.
51 bool ConstantFPSDNode::isExactlyValue(double V
) const {
52 return DoubleToBits(V
) == DoubleToBits(Value
);
55 //===----------------------------------------------------------------------===//
57 //===----------------------------------------------------------------------===//
59 /// isBuildVectorAllOnes - Return true if the specified node is a
60 /// BUILD_VECTOR where all of the elements are ~0 or undef.
61 bool ISD::isBuildVectorAllOnes(const SDNode
*N
) {
62 // Look through a bit convert.
63 if (N
->getOpcode() == ISD::BIT_CONVERT
)
64 N
= N
->getOperand(0).Val
;
66 if (N
->getOpcode() != ISD::BUILD_VECTOR
) return false;
68 unsigned i
= 0, e
= N
->getNumOperands();
70 // Skip over all of the undef values.
71 while (i
!= e
&& N
->getOperand(i
).getOpcode() == ISD::UNDEF
)
74 // Do not accept an all-undef vector.
75 if (i
== e
) return false;
77 // Do not accept build_vectors that aren't all constants or which have non-~0
79 SDOperand NotZero
= N
->getOperand(i
);
80 if (isa
<ConstantSDNode
>(NotZero
)) {
81 if (!cast
<ConstantSDNode
>(NotZero
)->isAllOnesValue())
83 } else if (isa
<ConstantFPSDNode
>(NotZero
)) {
84 MVT::ValueType VT
= NotZero
.getValueType();
86 if (DoubleToBits(cast
<ConstantFPSDNode
>(NotZero
)->getValue()) !=
90 if (FloatToBits(cast
<ConstantFPSDNode
>(NotZero
)->getValue()) !=
97 // Okay, we have at least one ~0 value, check to see if the rest match or are
99 for (++i
; i
!= e
; ++i
)
100 if (N
->getOperand(i
) != NotZero
&&
101 N
->getOperand(i
).getOpcode() != ISD::UNDEF
)
107 /// isBuildVectorAllZeros - Return true if the specified node is a
108 /// BUILD_VECTOR where all of the elements are 0 or undef.
109 bool ISD::isBuildVectorAllZeros(const SDNode
*N
) {
110 // Look through a bit convert.
111 if (N
->getOpcode() == ISD::BIT_CONVERT
)
112 N
= N
->getOperand(0).Val
;
114 if (N
->getOpcode() != ISD::BUILD_VECTOR
) return false;
116 unsigned i
= 0, e
= N
->getNumOperands();
118 // Skip over all of the undef values.
119 while (i
!= e
&& N
->getOperand(i
).getOpcode() == ISD::UNDEF
)
122 // Do not accept an all-undef vector.
123 if (i
== e
) return false;
125 // Do not accept build_vectors that aren't all constants or which have non-~0
127 SDOperand Zero
= N
->getOperand(i
);
128 if (isa
<ConstantSDNode
>(Zero
)) {
129 if (!cast
<ConstantSDNode
>(Zero
)->isNullValue())
131 } else if (isa
<ConstantFPSDNode
>(Zero
)) {
132 if (!cast
<ConstantFPSDNode
>(Zero
)->isExactlyValue(0.0))
137 // Okay, we have at least one ~0 value, check to see if the rest match or are
139 for (++i
; i
!= e
; ++i
)
140 if (N
->getOperand(i
) != Zero
&&
141 N
->getOperand(i
).getOpcode() != ISD::UNDEF
)
146 /// getSetCCSwappedOperands - Return the operation corresponding to (Y op X)
147 /// when given the operation for (X op Y).
148 ISD::CondCode
ISD::getSetCCSwappedOperands(ISD::CondCode Operation
) {
149 // To perform this operation, we just need to swap the L and G bits of the
151 unsigned OldL
= (Operation
>> 2) & 1;
152 unsigned OldG
= (Operation
>> 1) & 1;
153 return ISD::CondCode((Operation
& ~6) | // Keep the N, U, E bits
154 (OldL
<< 1) | // New G bit
155 (OldG
<< 2)); // New L bit.
158 /// getSetCCInverse - Return the operation corresponding to !(X op Y), where
159 /// 'op' is a valid SetCC operation.
160 ISD::CondCode
ISD::getSetCCInverse(ISD::CondCode Op
, bool isInteger
) {
161 unsigned Operation
= Op
;
163 Operation
^= 7; // Flip L, G, E bits, but not U.
165 Operation
^= 15; // Flip all of the condition bits.
166 if (Operation
> ISD::SETTRUE2
)
167 Operation
&= ~8; // Don't let N and U bits get set.
168 return ISD::CondCode(Operation
);
172 /// isSignedOp - For an integer comparison, return 1 if the comparison is a
173 /// signed operation and 2 if the result is an unsigned comparison. Return zero
174 /// if the operation does not depend on the sign of the input (setne and seteq).
175 static int isSignedOp(ISD::CondCode Opcode
) {
177 default: assert(0 && "Illegal integer setcc operation!");
179 case ISD::SETNE
: return 0;
183 case ISD::SETGE
: return 1;
187 case ISD::SETUGE
: return 2;
191 /// getSetCCOrOperation - Return the result of a logical OR between different
192 /// comparisons of identical values: ((X op1 Y) | (X op2 Y)). This function
193 /// returns SETCC_INVALID if it is not possible to represent the resultant
195 ISD::CondCode
ISD::getSetCCOrOperation(ISD::CondCode Op1
, ISD::CondCode Op2
,
197 if (isInteger
&& (isSignedOp(Op1
) | isSignedOp(Op2
)) == 3)
198 // Cannot fold a signed integer setcc with an unsigned integer setcc.
199 return ISD::SETCC_INVALID
;
201 unsigned Op
= Op1
| Op2
; // Combine all of the condition bits.
203 // If the N and U bits get set then the resultant comparison DOES suddenly
204 // care about orderedness, and is true when ordered.
205 if (Op
> ISD::SETTRUE2
)
206 Op
&= ~16; // Clear the U bit if the N bit is set.
208 // Canonicalize illegal integer setcc's.
209 if (isInteger
&& Op
== ISD::SETUNE
) // e.g. SETUGT | SETULT
212 return ISD::CondCode(Op
);
215 /// getSetCCAndOperation - Return the result of a logical AND between different
216 /// comparisons of identical values: ((X op1 Y) & (X op2 Y)). This
217 /// function returns zero if it is not possible to represent the resultant
219 ISD::CondCode
ISD::getSetCCAndOperation(ISD::CondCode Op1
, ISD::CondCode Op2
,
221 if (isInteger
&& (isSignedOp(Op1
) | isSignedOp(Op2
)) == 3)
222 // Cannot fold a signed setcc with an unsigned setcc.
223 return ISD::SETCC_INVALID
;
225 // Combine all of the condition bits.
226 ISD::CondCode Result
= ISD::CondCode(Op1
& Op2
);
228 // Canonicalize illegal integer setcc's.
232 case ISD::SETUO
: Result
= ISD::SETFALSE
; break; // SETUGT & SETULT
233 case ISD::SETUEQ
: Result
= ISD::SETEQ
; break; // SETUGE & SETULE
234 case ISD::SETOLT
: Result
= ISD::SETULT
; break; // SETULT & SETNE
235 case ISD::SETOGT
: Result
= ISD::SETUGT
; break; // SETUGT & SETNE
242 const TargetMachine
&SelectionDAG::getTarget() const {
243 return TLI
.getTargetMachine();
246 //===----------------------------------------------------------------------===//
247 // SDNode Profile Support
248 //===----------------------------------------------------------------------===//
250 /// AddNodeIDOpcode - Add the node opcode to the NodeID data.
252 static void AddNodeIDOpcode(FoldingSetNodeID
&ID
, unsigned OpC
) {
256 /// AddNodeIDValueTypes - Value type lists are intern'd so we can represent them
257 /// solely with their pointer.
258 void AddNodeIDValueTypes(FoldingSetNodeID
&ID
, SDVTList VTList
) {
259 ID
.AddPointer(VTList
.VTs
);
262 /// AddNodeIDOperands - Various routines for adding operands to the NodeID data.
264 static void AddNodeIDOperands(FoldingSetNodeID
&ID
,
265 const SDOperand
*Ops
, unsigned NumOps
) {
266 for (; NumOps
; --NumOps
, ++Ops
) {
267 ID
.AddPointer(Ops
->Val
);
268 ID
.AddInteger(Ops
->ResNo
);
272 static void AddNodeIDNode(FoldingSetNodeID
&ID
,
273 unsigned short OpC
, SDVTList VTList
,
274 const SDOperand
*OpList
, unsigned N
) {
275 AddNodeIDOpcode(ID
, OpC
);
276 AddNodeIDValueTypes(ID
, VTList
);
277 AddNodeIDOperands(ID
, OpList
, N
);
280 /// AddNodeIDNode - Generic routine for adding a nodes info to the NodeID
282 static void AddNodeIDNode(FoldingSetNodeID
&ID
, SDNode
*N
) {
283 AddNodeIDOpcode(ID
, N
->getOpcode());
284 // Add the return value info.
285 AddNodeIDValueTypes(ID
, N
->getVTList());
286 // Add the operand info.
287 AddNodeIDOperands(ID
, N
->op_begin(), N
->getNumOperands());
289 // Handle SDNode leafs with special info.
290 switch (N
->getOpcode()) {
291 default: break; // Normal nodes don't need extra info.
292 case ISD::TargetConstant
:
294 ID
.AddInteger(cast
<ConstantSDNode
>(N
)->getValue());
296 case ISD::TargetConstantFP
:
297 case ISD::ConstantFP
:
298 ID
.AddDouble(cast
<ConstantFPSDNode
>(N
)->getValue());
300 case ISD::TargetGlobalAddress
:
301 case ISD::GlobalAddress
:
302 case ISD::TargetGlobalTLSAddress
:
303 case ISD::GlobalTLSAddress
: {
304 GlobalAddressSDNode
*GA
= cast
<GlobalAddressSDNode
>(N
);
305 ID
.AddPointer(GA
->getGlobal());
306 ID
.AddInteger(GA
->getOffset());
309 case ISD::BasicBlock
:
310 ID
.AddPointer(cast
<BasicBlockSDNode
>(N
)->getBasicBlock());
313 ID
.AddInteger(cast
<RegisterSDNode
>(N
)->getReg());
315 case ISD::SRCVALUE
: {
316 SrcValueSDNode
*SV
= cast
<SrcValueSDNode
>(N
);
317 ID
.AddPointer(SV
->getValue());
318 ID
.AddInteger(SV
->getOffset());
321 case ISD::FrameIndex
:
322 case ISD::TargetFrameIndex
:
323 ID
.AddInteger(cast
<FrameIndexSDNode
>(N
)->getIndex());
326 case ISD::TargetJumpTable
:
327 ID
.AddInteger(cast
<JumpTableSDNode
>(N
)->getIndex());
329 case ISD::ConstantPool
:
330 case ISD::TargetConstantPool
: {
331 ConstantPoolSDNode
*CP
= cast
<ConstantPoolSDNode
>(N
);
332 ID
.AddInteger(CP
->getAlignment());
333 ID
.AddInteger(CP
->getOffset());
334 if (CP
->isMachineConstantPoolEntry())
335 CP
->getMachineCPVal()->AddSelectionDAGCSEId(ID
);
337 ID
.AddPointer(CP
->getConstVal());
341 LoadSDNode
*LD
= cast
<LoadSDNode
>(N
);
342 ID
.AddInteger(LD
->getAddressingMode());
343 ID
.AddInteger(LD
->getExtensionType());
344 ID
.AddInteger(LD
->getLoadedVT());
345 ID
.AddPointer(LD
->getSrcValue());
346 ID
.AddInteger(LD
->getSrcValueOffset());
347 ID
.AddInteger(LD
->getAlignment());
348 ID
.AddInteger(LD
->isVolatile());
352 StoreSDNode
*ST
= cast
<StoreSDNode
>(N
);
353 ID
.AddInteger(ST
->getAddressingMode());
354 ID
.AddInteger(ST
->isTruncatingStore());
355 ID
.AddInteger(ST
->getStoredVT());
356 ID
.AddPointer(ST
->getSrcValue());
357 ID
.AddInteger(ST
->getSrcValueOffset());
358 ID
.AddInteger(ST
->getAlignment());
359 ID
.AddInteger(ST
->isVolatile());
365 //===----------------------------------------------------------------------===//
366 // SelectionDAG Class
367 //===----------------------------------------------------------------------===//
369 /// RemoveDeadNodes - This method deletes all unreachable nodes in the
371 void SelectionDAG::RemoveDeadNodes() {
372 // Create a dummy node (which is not added to allnodes), that adds a reference
373 // to the root node, preventing it from being deleted.
374 HandleSDNode
Dummy(getRoot());
376 SmallVector
<SDNode
*, 128> DeadNodes
;
378 // Add all obviously-dead nodes to the DeadNodes worklist.
379 for (allnodes_iterator I
= allnodes_begin(), E
= allnodes_end(); I
!= E
; ++I
)
381 DeadNodes
.push_back(I
);
383 // Process the worklist, deleting the nodes and adding their uses to the
385 while (!DeadNodes
.empty()) {
386 SDNode
*N
= DeadNodes
.back();
387 DeadNodes
.pop_back();
389 // Take the node out of the appropriate CSE map.
390 RemoveNodeFromCSEMaps(N
);
392 // Next, brutally remove the operand list. This is safe to do, as there are
393 // no cycles in the graph.
394 for (SDNode::op_iterator I
= N
->op_begin(), E
= N
->op_end(); I
!= E
; ++I
) {
395 SDNode
*Operand
= I
->Val
;
396 Operand
->removeUser(N
);
398 // Now that we removed this operand, see if there are no uses of it left.
399 if (Operand
->use_empty())
400 DeadNodes
.push_back(Operand
);
402 if (N
->OperandsNeedDelete
)
403 delete[] N
->OperandList
;
407 // Finally, remove N itself.
411 // If the root changed (e.g. it was a dead load, update the root).
412 setRoot(Dummy
.getValue());
415 void SelectionDAG::RemoveDeadNode(SDNode
*N
, std::vector
<SDNode
*> &Deleted
) {
416 SmallVector
<SDNode
*, 16> DeadNodes
;
417 DeadNodes
.push_back(N
);
419 // Process the worklist, deleting the nodes and adding their uses to the
421 while (!DeadNodes
.empty()) {
422 SDNode
*N
= DeadNodes
.back();
423 DeadNodes
.pop_back();
425 // Take the node out of the appropriate CSE map.
426 RemoveNodeFromCSEMaps(N
);
428 // Next, brutally remove the operand list. This is safe to do, as there are
429 // no cycles in the graph.
430 for (SDNode::op_iterator I
= N
->op_begin(), E
= N
->op_end(); I
!= E
; ++I
) {
431 SDNode
*Operand
= I
->Val
;
432 Operand
->removeUser(N
);
434 // Now that we removed this operand, see if there are no uses of it left.
435 if (Operand
->use_empty())
436 DeadNodes
.push_back(Operand
);
438 if (N
->OperandsNeedDelete
)
439 delete[] N
->OperandList
;
443 // Finally, remove N itself.
444 Deleted
.push_back(N
);
449 void SelectionDAG::DeleteNode(SDNode
*N
) {
450 assert(N
->use_empty() && "Cannot delete a node that is not dead!");
452 // First take this out of the appropriate CSE map.
453 RemoveNodeFromCSEMaps(N
);
455 // Finally, remove uses due to operands of this node, remove from the
456 // AllNodes list, and delete the node.
457 DeleteNodeNotInCSEMaps(N
);
460 void SelectionDAG::DeleteNodeNotInCSEMaps(SDNode
*N
) {
462 // Remove it from the AllNodes list.
465 // Drop all of the operands and decrement used nodes use counts.
466 for (SDNode::op_iterator I
= N
->op_begin(), E
= N
->op_end(); I
!= E
; ++I
)
467 I
->Val
->removeUser(N
);
468 if (N
->OperandsNeedDelete
)
469 delete[] N
->OperandList
;
476 /// RemoveNodeFromCSEMaps - Take the specified node out of the CSE map that
477 /// correspond to it. This is useful when we're about to delete or repurpose
478 /// the node. We don't want future request for structurally identical nodes
479 /// to return N anymore.
480 void SelectionDAG::RemoveNodeFromCSEMaps(SDNode
*N
) {
482 switch (N
->getOpcode()) {
483 case ISD::HANDLENODE
: return; // noop.
485 Erased
= StringNodes
.erase(cast
<StringSDNode
>(N
)->getValue());
488 assert(CondCodeNodes
[cast
<CondCodeSDNode
>(N
)->get()] &&
489 "Cond code doesn't exist!");
490 Erased
= CondCodeNodes
[cast
<CondCodeSDNode
>(N
)->get()] != 0;
491 CondCodeNodes
[cast
<CondCodeSDNode
>(N
)->get()] = 0;
493 case ISD::ExternalSymbol
:
494 Erased
= ExternalSymbols
.erase(cast
<ExternalSymbolSDNode
>(N
)->getSymbol());
496 case ISD::TargetExternalSymbol
:
498 TargetExternalSymbols
.erase(cast
<ExternalSymbolSDNode
>(N
)->getSymbol());
501 Erased
= ValueTypeNodes
[cast
<VTSDNode
>(N
)->getVT()] != 0;
502 ValueTypeNodes
[cast
<VTSDNode
>(N
)->getVT()] = 0;
505 // Remove it from the CSE Map.
506 Erased
= CSEMap
.RemoveNode(N
);
510 // Verify that the node was actually in one of the CSE maps, unless it has a
511 // flag result (which cannot be CSE'd) or is one of the special cases that are
512 // not subject to CSE.
513 if (!Erased
&& N
->getValueType(N
->getNumValues()-1) != MVT::Flag
&&
514 !N
->isTargetOpcode()) {
517 assert(0 && "Node is not in map!");
522 /// AddNonLeafNodeToCSEMaps - Add the specified node back to the CSE maps. It
523 /// has been taken out and modified in some way. If the specified node already
524 /// exists in the CSE maps, do not modify the maps, but return the existing node
525 /// instead. If it doesn't exist, add it and return null.
527 SDNode
*SelectionDAG::AddNonLeafNodeToCSEMaps(SDNode
*N
) {
528 assert(N
->getNumOperands() && "This is a leaf node!");
529 if (N
->getOpcode() == ISD::HANDLENODE
|| N
->getValueType(0) == MVT::Flag
)
530 return 0; // Never add these nodes.
532 // Check that remaining values produced are not flags.
533 for (unsigned i
= 1, e
= N
->getNumValues(); i
!= e
; ++i
)
534 if (N
->getValueType(i
) == MVT::Flag
)
535 return 0; // Never CSE anything that produces a flag.
537 SDNode
*New
= CSEMap
.GetOrInsertNode(N
);
538 if (New
!= N
) return New
; // Node already existed.
542 /// FindModifiedNodeSlot - Find a slot for the specified node if its operands
543 /// were replaced with those specified. If this node is never memoized,
544 /// return null, otherwise return a pointer to the slot it would take. If a
545 /// node already exists with these operands, the slot will be non-null.
546 SDNode
*SelectionDAG::FindModifiedNodeSlot(SDNode
*N
, SDOperand Op
,
548 if (N
->getOpcode() == ISD::HANDLENODE
|| N
->getValueType(0) == MVT::Flag
)
549 return 0; // Never add these nodes.
551 // Check that remaining values produced are not flags.
552 for (unsigned i
= 1, e
= N
->getNumValues(); i
!= e
; ++i
)
553 if (N
->getValueType(i
) == MVT::Flag
)
554 return 0; // Never CSE anything that produces a flag.
556 SDOperand Ops
[] = { Op
};
558 AddNodeIDNode(ID
, N
->getOpcode(), N
->getVTList(), Ops
, 1);
559 return CSEMap
.FindNodeOrInsertPos(ID
, InsertPos
);
562 /// FindModifiedNodeSlot - Find a slot for the specified node if its operands
563 /// were replaced with those specified. If this node is never memoized,
564 /// return null, otherwise return a pointer to the slot it would take. If a
565 /// node already exists with these operands, the slot will be non-null.
566 SDNode
*SelectionDAG::FindModifiedNodeSlot(SDNode
*N
,
567 SDOperand Op1
, SDOperand Op2
,
569 if (N
->getOpcode() == ISD::HANDLENODE
|| N
->getValueType(0) == MVT::Flag
)
570 return 0; // Never add these nodes.
572 // Check that remaining values produced are not flags.
573 for (unsigned i
= 1, e
= N
->getNumValues(); i
!= e
; ++i
)
574 if (N
->getValueType(i
) == MVT::Flag
)
575 return 0; // Never CSE anything that produces a flag.
577 SDOperand Ops
[] = { Op1
, Op2
};
579 AddNodeIDNode(ID
, N
->getOpcode(), N
->getVTList(), Ops
, 2);
580 return CSEMap
.FindNodeOrInsertPos(ID
, InsertPos
);
584 /// FindModifiedNodeSlot - Find a slot for the specified node if its operands
585 /// were replaced with those specified. If this node is never memoized,
586 /// return null, otherwise return a pointer to the slot it would take. If a
587 /// node already exists with these operands, the slot will be non-null.
588 SDNode
*SelectionDAG::FindModifiedNodeSlot(SDNode
*N
,
589 const SDOperand
*Ops
,unsigned NumOps
,
591 if (N
->getOpcode() == ISD::HANDLENODE
|| N
->getValueType(0) == MVT::Flag
)
592 return 0; // Never add these nodes.
594 // Check that remaining values produced are not flags.
595 for (unsigned i
= 1, e
= N
->getNumValues(); i
!= e
; ++i
)
596 if (N
->getValueType(i
) == MVT::Flag
)
597 return 0; // Never CSE anything that produces a flag.
600 AddNodeIDNode(ID
, N
->getOpcode(), N
->getVTList(), Ops
, NumOps
);
602 if (const LoadSDNode
*LD
= dyn_cast
<LoadSDNode
>(N
)) {
603 ID
.AddInteger(LD
->getAddressingMode());
604 ID
.AddInteger(LD
->getExtensionType());
605 ID
.AddInteger(LD
->getLoadedVT());
606 ID
.AddPointer(LD
->getSrcValue());
607 ID
.AddInteger(LD
->getSrcValueOffset());
608 ID
.AddInteger(LD
->getAlignment());
609 ID
.AddInteger(LD
->isVolatile());
610 } else if (const StoreSDNode
*ST
= dyn_cast
<StoreSDNode
>(N
)) {
611 ID
.AddInteger(ST
->getAddressingMode());
612 ID
.AddInteger(ST
->isTruncatingStore());
613 ID
.AddInteger(ST
->getStoredVT());
614 ID
.AddPointer(ST
->getSrcValue());
615 ID
.AddInteger(ST
->getSrcValueOffset());
616 ID
.AddInteger(ST
->getAlignment());
617 ID
.AddInteger(ST
->isVolatile());
620 return CSEMap
.FindNodeOrInsertPos(ID
, InsertPos
);
624 SelectionDAG::~SelectionDAG() {
625 while (!AllNodes
.empty()) {
626 SDNode
*N
= AllNodes
.begin();
627 N
->SetNextInBucket(0);
628 if (N
->OperandsNeedDelete
)
629 delete [] N
->OperandList
;
632 AllNodes
.pop_front();
636 SDOperand
SelectionDAG::getZeroExtendInReg(SDOperand Op
, MVT::ValueType VT
) {
637 if (Op
.getValueType() == VT
) return Op
;
638 int64_t Imm
= ~0ULL >> (64-MVT::getSizeInBits(VT
));
639 return getNode(ISD::AND
, Op
.getValueType(), Op
,
640 getConstant(Imm
, Op
.getValueType()));
643 SDOperand
SelectionDAG::getString(const std::string
&Val
) {
644 StringSDNode
*&N
= StringNodes
[Val
];
646 N
= new StringSDNode(Val
);
647 AllNodes
.push_back(N
);
649 return SDOperand(N
, 0);
652 SDOperand
SelectionDAG::getConstant(uint64_t Val
, MVT::ValueType VT
, bool isT
) {
653 assert(MVT::isInteger(VT
) && "Cannot create FP integer constant!");
654 assert(!MVT::isVector(VT
) && "Cannot create Vector ConstantSDNodes!");
656 // Mask out any bits that are not valid for this constant.
657 Val
&= MVT::getIntVTBitMask(VT
);
659 unsigned Opc
= isT
? ISD::TargetConstant
: ISD::Constant
;
661 AddNodeIDNode(ID
, Opc
, getVTList(VT
), 0, 0);
664 if (SDNode
*E
= CSEMap
.FindNodeOrInsertPos(ID
, IP
))
665 return SDOperand(E
, 0);
666 SDNode
*N
= new ConstantSDNode(isT
, Val
, VT
);
667 CSEMap
.InsertNode(N
, IP
);
668 AllNodes
.push_back(N
);
669 return SDOperand(N
, 0);
673 SDOperand
SelectionDAG::getConstantFP(double Val
, MVT::ValueType VT
,
675 assert(MVT::isFloatingPoint(VT
) && "Cannot create integer FP constant!");
677 Val
= (float)Val
; // Mask out extra precision.
679 // Do the map lookup using the actual bit pattern for the floating point
680 // value, so that we don't have problems with 0.0 comparing equal to -0.0, and
681 // we don't have issues with SNANs.
682 unsigned Opc
= isTarget
? ISD::TargetConstantFP
: ISD::ConstantFP
;
684 AddNodeIDNode(ID
, Opc
, getVTList(VT
), 0, 0);
687 if (SDNode
*E
= CSEMap
.FindNodeOrInsertPos(ID
, IP
))
688 return SDOperand(E
, 0);
689 SDNode
*N
= new ConstantFPSDNode(isTarget
, Val
, VT
);
690 CSEMap
.InsertNode(N
, IP
);
691 AllNodes
.push_back(N
);
692 return SDOperand(N
, 0);
695 SDOperand
SelectionDAG::getGlobalAddress(const GlobalValue
*GV
,
696 MVT::ValueType VT
, int Offset
,
698 const GlobalVariable
*GVar
= dyn_cast
<GlobalVariable
>(GV
);
700 if (GVar
&& GVar
->isThreadLocal())
701 Opc
= isTargetGA
? ISD::TargetGlobalTLSAddress
: ISD::GlobalTLSAddress
;
703 Opc
= isTargetGA
? ISD::TargetGlobalAddress
: ISD::GlobalAddress
;
705 AddNodeIDNode(ID
, Opc
, getVTList(VT
), 0, 0);
707 ID
.AddInteger(Offset
);
709 if (SDNode
*E
= CSEMap
.FindNodeOrInsertPos(ID
, IP
))
710 return SDOperand(E
, 0);
711 SDNode
*N
= new GlobalAddressSDNode(isTargetGA
, GV
, VT
, Offset
);
712 CSEMap
.InsertNode(N
, IP
);
713 AllNodes
.push_back(N
);
714 return SDOperand(N
, 0);
717 SDOperand
SelectionDAG::getFrameIndex(int FI
, MVT::ValueType VT
,
719 unsigned Opc
= isTarget
? ISD::TargetFrameIndex
: ISD::FrameIndex
;
721 AddNodeIDNode(ID
, Opc
, getVTList(VT
), 0, 0);
724 if (SDNode
*E
= CSEMap
.FindNodeOrInsertPos(ID
, IP
))
725 return SDOperand(E
, 0);
726 SDNode
*N
= new FrameIndexSDNode(FI
, VT
, isTarget
);
727 CSEMap
.InsertNode(N
, IP
);
728 AllNodes
.push_back(N
);
729 return SDOperand(N
, 0);
732 SDOperand
SelectionDAG::getJumpTable(int JTI
, MVT::ValueType VT
, bool isTarget
){
733 unsigned Opc
= isTarget
? ISD::TargetJumpTable
: ISD::JumpTable
;
735 AddNodeIDNode(ID
, Opc
, getVTList(VT
), 0, 0);
738 if (SDNode
*E
= CSEMap
.FindNodeOrInsertPos(ID
, IP
))
739 return SDOperand(E
, 0);
740 SDNode
*N
= new JumpTableSDNode(JTI
, VT
, isTarget
);
741 CSEMap
.InsertNode(N
, IP
);
742 AllNodes
.push_back(N
);
743 return SDOperand(N
, 0);
746 SDOperand
SelectionDAG::getConstantPool(Constant
*C
, MVT::ValueType VT
,
747 unsigned Alignment
, int Offset
,
749 unsigned Opc
= isTarget
? ISD::TargetConstantPool
: ISD::ConstantPool
;
751 AddNodeIDNode(ID
, Opc
, getVTList(VT
), 0, 0);
752 ID
.AddInteger(Alignment
);
753 ID
.AddInteger(Offset
);
756 if (SDNode
*E
= CSEMap
.FindNodeOrInsertPos(ID
, IP
))
757 return SDOperand(E
, 0);
758 SDNode
*N
= new ConstantPoolSDNode(isTarget
, C
, VT
, Offset
, Alignment
);
759 CSEMap
.InsertNode(N
, IP
);
760 AllNodes
.push_back(N
);
761 return SDOperand(N
, 0);
765 SDOperand
SelectionDAG::getConstantPool(MachineConstantPoolValue
*C
,
767 unsigned Alignment
, int Offset
,
769 unsigned Opc
= isTarget
? ISD::TargetConstantPool
: ISD::ConstantPool
;
771 AddNodeIDNode(ID
, Opc
, getVTList(VT
), 0, 0);
772 ID
.AddInteger(Alignment
);
773 ID
.AddInteger(Offset
);
774 C
->AddSelectionDAGCSEId(ID
);
776 if (SDNode
*E
= CSEMap
.FindNodeOrInsertPos(ID
, IP
))
777 return SDOperand(E
, 0);
778 SDNode
*N
= new ConstantPoolSDNode(isTarget
, C
, VT
, Offset
, Alignment
);
779 CSEMap
.InsertNode(N
, IP
);
780 AllNodes
.push_back(N
);
781 return SDOperand(N
, 0);
785 SDOperand
SelectionDAG::getBasicBlock(MachineBasicBlock
*MBB
) {
787 AddNodeIDNode(ID
, ISD::BasicBlock
, getVTList(MVT::Other
), 0, 0);
790 if (SDNode
*E
= CSEMap
.FindNodeOrInsertPos(ID
, IP
))
791 return SDOperand(E
, 0);
792 SDNode
*N
= new BasicBlockSDNode(MBB
);
793 CSEMap
.InsertNode(N
, IP
);
794 AllNodes
.push_back(N
);
795 return SDOperand(N
, 0);
798 SDOperand
SelectionDAG::getValueType(MVT::ValueType VT
) {
799 if ((unsigned)VT
>= ValueTypeNodes
.size())
800 ValueTypeNodes
.resize(VT
+1);
801 if (ValueTypeNodes
[VT
] == 0) {
802 ValueTypeNodes
[VT
] = new VTSDNode(VT
);
803 AllNodes
.push_back(ValueTypeNodes
[VT
]);
806 return SDOperand(ValueTypeNodes
[VT
], 0);
809 SDOperand
SelectionDAG::getExternalSymbol(const char *Sym
, MVT::ValueType VT
) {
810 SDNode
*&N
= ExternalSymbols
[Sym
];
811 if (N
) return SDOperand(N
, 0);
812 N
= new ExternalSymbolSDNode(false, Sym
, VT
);
813 AllNodes
.push_back(N
);
814 return SDOperand(N
, 0);
817 SDOperand
SelectionDAG::getTargetExternalSymbol(const char *Sym
,
819 SDNode
*&N
= TargetExternalSymbols
[Sym
];
820 if (N
) return SDOperand(N
, 0);
821 N
= new ExternalSymbolSDNode(true, Sym
, VT
);
822 AllNodes
.push_back(N
);
823 return SDOperand(N
, 0);
826 SDOperand
SelectionDAG::getCondCode(ISD::CondCode Cond
) {
827 if ((unsigned)Cond
>= CondCodeNodes
.size())
828 CondCodeNodes
.resize(Cond
+1);
830 if (CondCodeNodes
[Cond
] == 0) {
831 CondCodeNodes
[Cond
] = new CondCodeSDNode(Cond
);
832 AllNodes
.push_back(CondCodeNodes
[Cond
]);
834 return SDOperand(CondCodeNodes
[Cond
], 0);
837 SDOperand
SelectionDAG::getRegister(unsigned RegNo
, MVT::ValueType VT
) {
839 AddNodeIDNode(ID
, ISD::Register
, getVTList(VT
), 0, 0);
840 ID
.AddInteger(RegNo
);
842 if (SDNode
*E
= CSEMap
.FindNodeOrInsertPos(ID
, IP
))
843 return SDOperand(E
, 0);
844 SDNode
*N
= new RegisterSDNode(RegNo
, VT
);
845 CSEMap
.InsertNode(N
, IP
);
846 AllNodes
.push_back(N
);
847 return SDOperand(N
, 0);
850 SDOperand
SelectionDAG::getSrcValue(const Value
*V
, int Offset
) {
851 assert((!V
|| isa
<PointerType
>(V
->getType())) &&
852 "SrcValue is not a pointer?");
855 AddNodeIDNode(ID
, ISD::SRCVALUE
, getVTList(MVT::Other
), 0, 0);
857 ID
.AddInteger(Offset
);
859 if (SDNode
*E
= CSEMap
.FindNodeOrInsertPos(ID
, IP
))
860 return SDOperand(E
, 0);
861 SDNode
*N
= new SrcValueSDNode(V
, Offset
);
862 CSEMap
.InsertNode(N
, IP
);
863 AllNodes
.push_back(N
);
864 return SDOperand(N
, 0);
867 SDOperand
SelectionDAG::FoldSetCC(MVT::ValueType VT
, SDOperand N1
,
868 SDOperand N2
, ISD::CondCode Cond
) {
869 // These setcc operations always fold.
873 case ISD::SETFALSE2
: return getConstant(0, VT
);
875 case ISD::SETTRUE2
: return getConstant(1, VT
);
887 assert(!MVT::isInteger(N1
.getValueType()) && "Illegal setcc for integer!");
891 if (ConstantSDNode
*N2C
= dyn_cast
<ConstantSDNode
>(N2
.Val
)) {
892 uint64_t C2
= N2C
->getValue();
893 if (ConstantSDNode
*N1C
= dyn_cast
<ConstantSDNode
>(N1
.Val
)) {
894 uint64_t C1
= N1C
->getValue();
896 // Sign extend the operands if required
897 if (ISD::isSignedIntSetCC(Cond
)) {
898 C1
= N1C
->getSignExtended();
899 C2
= N2C
->getSignExtended();
903 default: assert(0 && "Unknown integer setcc!");
904 case ISD::SETEQ
: return getConstant(C1
== C2
, VT
);
905 case ISD::SETNE
: return getConstant(C1
!= C2
, VT
);
906 case ISD::SETULT
: return getConstant(C1
< C2
, VT
);
907 case ISD::SETUGT
: return getConstant(C1
> C2
, VT
);
908 case ISD::SETULE
: return getConstant(C1
<= C2
, VT
);
909 case ISD::SETUGE
: return getConstant(C1
>= C2
, VT
);
910 case ISD::SETLT
: return getConstant((int64_t)C1
< (int64_t)C2
, VT
);
911 case ISD::SETGT
: return getConstant((int64_t)C1
> (int64_t)C2
, VT
);
912 case ISD::SETLE
: return getConstant((int64_t)C1
<= (int64_t)C2
, VT
);
913 case ISD::SETGE
: return getConstant((int64_t)C1
>= (int64_t)C2
, VT
);
917 if (ConstantFPSDNode
*N1C
= dyn_cast
<ConstantFPSDNode
>(N1
.Val
))
918 if (ConstantFPSDNode
*N2C
= dyn_cast
<ConstantFPSDNode
>(N2
.Val
)) {
919 double C1
= N1C
->getValue(), C2
= N2C
->getValue();
922 default: break; // FIXME: Implement the rest of these!
923 case ISD::SETEQ
: return getConstant(C1
== C2
, VT
);
924 case ISD::SETNE
: return getConstant(C1
!= C2
, VT
);
925 case ISD::SETLT
: return getConstant(C1
< C2
, VT
);
926 case ISD::SETGT
: return getConstant(C1
> C2
, VT
);
927 case ISD::SETLE
: return getConstant(C1
<= C2
, VT
);
928 case ISD::SETGE
: return getConstant(C1
>= C2
, VT
);
931 // Ensure that the constant occurs on the RHS.
932 return getSetCC(VT
, N2
, N1
, ISD::getSetCCSwappedOperands(Cond
));
935 // Could not fold it.
940 /// getNode - Gets or creates the specified node.
942 SDOperand
SelectionDAG::getNode(unsigned Opcode
, MVT::ValueType VT
) {
944 AddNodeIDNode(ID
, Opcode
, getVTList(VT
), 0, 0);
946 if (SDNode
*E
= CSEMap
.FindNodeOrInsertPos(ID
, IP
))
947 return SDOperand(E
, 0);
948 SDNode
*N
= new SDNode(Opcode
, SDNode::getSDVTList(VT
));
949 CSEMap
.InsertNode(N
, IP
);
951 AllNodes
.push_back(N
);
952 return SDOperand(N
, 0);
955 SDOperand
SelectionDAG::getNode(unsigned Opcode
, MVT::ValueType VT
,
958 // Constant fold unary operations with an integer constant operand.
959 if (ConstantSDNode
*C
= dyn_cast
<ConstantSDNode
>(Operand
.Val
)) {
960 uint64_t Val
= C
->getValue();
963 case ISD::SIGN_EXTEND
: return getConstant(C
->getSignExtended(), VT
);
964 case ISD::ANY_EXTEND
:
965 case ISD::ZERO_EXTEND
: return getConstant(Val
, VT
);
966 case ISD::TRUNCATE
: return getConstant(Val
, VT
);
967 case ISD::SINT_TO_FP
: return getConstantFP(C
->getSignExtended(), VT
);
968 case ISD::UINT_TO_FP
: return getConstantFP(C
->getValue(), VT
);
969 case ISD::BIT_CONVERT
:
970 if (VT
== MVT::f32
&& C
->getValueType(0) == MVT::i32
)
971 return getConstantFP(BitsToFloat(Val
), VT
);
972 else if (VT
== MVT::f64
&& C
->getValueType(0) == MVT::i64
)
973 return getConstantFP(BitsToDouble(Val
), VT
);
977 default: assert(0 && "Invalid bswap!"); break;
978 case MVT::i16
: return getConstant(ByteSwap_16((unsigned short)Val
), VT
);
979 case MVT::i32
: return getConstant(ByteSwap_32((unsigned)Val
), VT
);
980 case MVT::i64
: return getConstant(ByteSwap_64(Val
), VT
);
985 default: assert(0 && "Invalid ctpop!"); break;
986 case MVT::i1
: return getConstant(Val
!= 0, VT
);
988 Tmp1
= (unsigned)Val
& 0xFF;
989 return getConstant(CountPopulation_32(Tmp1
), VT
);
991 Tmp1
= (unsigned)Val
& 0xFFFF;
992 return getConstant(CountPopulation_32(Tmp1
), VT
);
994 return getConstant(CountPopulation_32((unsigned)Val
), VT
);
996 return getConstant(CountPopulation_64(Val
), VT
);
1000 default: assert(0 && "Invalid ctlz!"); break;
1001 case MVT::i1
: return getConstant(Val
== 0, VT
);
1003 Tmp1
= (unsigned)Val
& 0xFF;
1004 return getConstant(CountLeadingZeros_32(Tmp1
)-24, VT
);
1006 Tmp1
= (unsigned)Val
& 0xFFFF;
1007 return getConstant(CountLeadingZeros_32(Tmp1
)-16, VT
);
1009 return getConstant(CountLeadingZeros_32((unsigned)Val
), VT
);
1011 return getConstant(CountLeadingZeros_64(Val
), VT
);
1015 default: assert(0 && "Invalid cttz!"); break;
1016 case MVT::i1
: return getConstant(Val
== 0, VT
);
1018 Tmp1
= (unsigned)Val
| 0x100;
1019 return getConstant(CountTrailingZeros_32(Tmp1
), VT
);
1021 Tmp1
= (unsigned)Val
| 0x10000;
1022 return getConstant(CountTrailingZeros_32(Tmp1
), VT
);
1024 return getConstant(CountTrailingZeros_32((unsigned)Val
), VT
);
1026 return getConstant(CountTrailingZeros_64(Val
), VT
);
1031 // Constant fold unary operations with an floating point constant operand.
1032 if (ConstantFPSDNode
*C
= dyn_cast
<ConstantFPSDNode
>(Operand
.Val
))
1035 return getConstantFP(-C
->getValue(), VT
);
1037 return getConstantFP(fabs(C
->getValue()), VT
);
1039 case ISD::FP_EXTEND
:
1040 return getConstantFP(C
->getValue(), VT
);
1041 case ISD::FP_TO_SINT
:
1042 return getConstant((int64_t)C
->getValue(), VT
);
1043 case ISD::FP_TO_UINT
:
1044 return getConstant((uint64_t)C
->getValue(), VT
);
1045 case ISD::BIT_CONVERT
:
1046 if (VT
== MVT::i32
&& C
->getValueType(0) == MVT::f32
)
1047 return getConstant(FloatToBits(C
->getValue()), VT
);
1048 else if (VT
== MVT::i64
&& C
->getValueType(0) == MVT::f64
)
1049 return getConstant(DoubleToBits(C
->getValue()), VT
);
1053 unsigned OpOpcode
= Operand
.Val
->getOpcode();
1055 case ISD::TokenFactor
:
1056 return Operand
; // Factor of one node? No factor.
1058 case ISD::FP_EXTEND
:
1059 assert(MVT::isFloatingPoint(VT
) &&
1060 MVT::isFloatingPoint(Operand
.getValueType()) && "Invalid FP cast!");
1062 case ISD::SIGN_EXTEND
:
1063 assert(MVT::isInteger(VT
) && MVT::isInteger(Operand
.getValueType()) &&
1064 "Invalid SIGN_EXTEND!");
1065 if (Operand
.getValueType() == VT
) return Operand
; // noop extension
1066 assert(Operand
.getValueType() < VT
&& "Invalid sext node, dst < src!");
1067 if (OpOpcode
== ISD::SIGN_EXTEND
|| OpOpcode
== ISD::ZERO_EXTEND
)
1068 return getNode(OpOpcode
, VT
, Operand
.Val
->getOperand(0));
1070 case ISD::ZERO_EXTEND
:
1071 assert(MVT::isInteger(VT
) && MVT::isInteger(Operand
.getValueType()) &&
1072 "Invalid ZERO_EXTEND!");
1073 if (Operand
.getValueType() == VT
) return Operand
; // noop extension
1074 assert(Operand
.getValueType() < VT
&& "Invalid zext node, dst < src!");
1075 if (OpOpcode
== ISD::ZERO_EXTEND
) // (zext (zext x)) -> (zext x)
1076 return getNode(ISD::ZERO_EXTEND
, VT
, Operand
.Val
->getOperand(0));
1078 case ISD::ANY_EXTEND
:
1079 assert(MVT::isInteger(VT
) && MVT::isInteger(Operand
.getValueType()) &&
1080 "Invalid ANY_EXTEND!");
1081 if (Operand
.getValueType() == VT
) return Operand
; // noop extension
1082 assert(Operand
.getValueType() < VT
&& "Invalid anyext node, dst < src!");
1083 if (OpOpcode
== ISD::ZERO_EXTEND
|| OpOpcode
== ISD::SIGN_EXTEND
)
1084 // (ext (zext x)) -> (zext x) and (ext (sext x)) -> (sext x)
1085 return getNode(OpOpcode
, VT
, Operand
.Val
->getOperand(0));
1088 assert(MVT::isInteger(VT
) && MVT::isInteger(Operand
.getValueType()) &&
1089 "Invalid TRUNCATE!");
1090 if (Operand
.getValueType() == VT
) return Operand
; // noop truncate
1091 assert(Operand
.getValueType() > VT
&& "Invalid truncate node, src < dst!");
1092 if (OpOpcode
== ISD::TRUNCATE
)
1093 return getNode(ISD::TRUNCATE
, VT
, Operand
.Val
->getOperand(0));
1094 else if (OpOpcode
== ISD::ZERO_EXTEND
|| OpOpcode
== ISD::SIGN_EXTEND
||
1095 OpOpcode
== ISD::ANY_EXTEND
) {
1096 // If the source is smaller than the dest, we still need an extend.
1097 if (Operand
.Val
->getOperand(0).getValueType() < VT
)
1098 return getNode(OpOpcode
, VT
, Operand
.Val
->getOperand(0));
1099 else if (Operand
.Val
->getOperand(0).getValueType() > VT
)
1100 return getNode(ISD::TRUNCATE
, VT
, Operand
.Val
->getOperand(0));
1102 return Operand
.Val
->getOperand(0);
1105 case ISD::BIT_CONVERT
:
1106 // Basic sanity checking.
1107 assert(MVT::getSizeInBits(VT
) == MVT::getSizeInBits(Operand
.getValueType())
1108 && "Cannot BIT_CONVERT between types of different sizes!");
1109 if (VT
== Operand
.getValueType()) return Operand
; // noop conversion.
1110 if (OpOpcode
== ISD::BIT_CONVERT
) // bitconv(bitconv(x)) -> bitconv(x)
1111 return getNode(ISD::BIT_CONVERT
, VT
, Operand
.getOperand(0));
1112 if (OpOpcode
== ISD::UNDEF
)
1113 return getNode(ISD::UNDEF
, VT
);
1115 case ISD::SCALAR_TO_VECTOR
:
1116 assert(MVT::isVector(VT
) && !MVT::isVector(Operand
.getValueType()) &&
1117 MVT::getVectorElementType(VT
) == Operand
.getValueType() &&
1118 "Illegal SCALAR_TO_VECTOR node!");
1121 if (OpOpcode
== ISD::FSUB
) // -(X-Y) -> (Y-X)
1122 return getNode(ISD::FSUB
, VT
, Operand
.Val
->getOperand(1),
1123 Operand
.Val
->getOperand(0));
1124 if (OpOpcode
== ISD::FNEG
) // --X -> X
1125 return Operand
.Val
->getOperand(0);
1128 if (OpOpcode
== ISD::FNEG
) // abs(-X) -> abs(X)
1129 return getNode(ISD::FABS
, VT
, Operand
.Val
->getOperand(0));
1134 SDVTList VTs
= getVTList(VT
);
1135 if (VT
!= MVT::Flag
) { // Don't CSE flag producing nodes
1136 FoldingSetNodeID ID
;
1137 SDOperand Ops
[1] = { Operand
};
1138 AddNodeIDNode(ID
, Opcode
, VTs
, Ops
, 1);
1140 if (SDNode
*E
= CSEMap
.FindNodeOrInsertPos(ID
, IP
))
1141 return SDOperand(E
, 0);
1142 N
= new UnarySDNode(Opcode
, VTs
, Operand
);
1143 CSEMap
.InsertNode(N
, IP
);
1145 N
= new UnarySDNode(Opcode
, VTs
, Operand
);
1147 AllNodes
.push_back(N
);
1148 return SDOperand(N
, 0);
1153 SDOperand
SelectionDAG::getNode(unsigned Opcode
, MVT::ValueType VT
,
1154 SDOperand N1
, SDOperand N2
) {
1157 case ISD::TokenFactor
:
1158 assert(VT
== MVT::Other
&& N1
.getValueType() == MVT::Other
&&
1159 N2
.getValueType() == MVT::Other
&& "Invalid token factor!");
1168 assert(MVT::isInteger(VT
) && "This operator does not apply to FP types!");
1175 assert(MVT::isInteger(N1
.getValueType()) && "Should use F* for FP ops");
1182 assert(N1
.getValueType() == N2
.getValueType() &&
1183 N1
.getValueType() == VT
&& "Binary operator types must match!");
1185 case ISD::FCOPYSIGN
: // N1 and result must match. N1/N2 need not match.
1186 assert(N1
.getValueType() == VT
&&
1187 MVT::isFloatingPoint(N1
.getValueType()) &&
1188 MVT::isFloatingPoint(N2
.getValueType()) &&
1189 "Invalid FCOPYSIGN!");
1196 assert(VT
== N1
.getValueType() &&
1197 "Shift operators return type must be the same as their first arg");
1198 assert(MVT::isInteger(VT
) && MVT::isInteger(N2
.getValueType()) &&
1199 VT
!= MVT::i1
&& "Shifts only work on integers");
1201 case ISD::FP_ROUND_INREG
: {
1202 MVT::ValueType EVT
= cast
<VTSDNode
>(N2
)->getVT();
1203 assert(VT
== N1
.getValueType() && "Not an inreg round!");
1204 assert(MVT::isFloatingPoint(VT
) && MVT::isFloatingPoint(EVT
) &&
1205 "Cannot FP_ROUND_INREG integer types");
1206 assert(EVT
<= VT
&& "Not rounding down!");
1209 case ISD::AssertSext
:
1210 case ISD::AssertZext
:
1211 case ISD::SIGN_EXTEND_INREG
: {
1212 MVT::ValueType EVT
= cast
<VTSDNode
>(N2
)->getVT();
1213 assert(VT
== N1
.getValueType() && "Not an inreg extend!");
1214 assert(MVT::isInteger(VT
) && MVT::isInteger(EVT
) &&
1215 "Cannot *_EXTEND_INREG FP types");
1216 assert(EVT
<= VT
&& "Not extending!");
1223 ConstantSDNode
*N1C
= dyn_cast
<ConstantSDNode
>(N1
.Val
);
1224 ConstantSDNode
*N2C
= dyn_cast
<ConstantSDNode
>(N2
.Val
);
1226 if (Opcode
== ISD::SIGN_EXTEND_INREG
) {
1227 int64_t Val
= N1C
->getValue();
1228 unsigned FromBits
= MVT::getSizeInBits(cast
<VTSDNode
>(N2
)->getVT());
1229 Val
<<= 64-FromBits
;
1230 Val
>>= 64-FromBits
;
1231 return getConstant(Val
, VT
);
1235 uint64_t C1
= N1C
->getValue(), C2
= N2C
->getValue();
1237 case ISD::ADD
: return getConstant(C1
+ C2
, VT
);
1238 case ISD::SUB
: return getConstant(C1
- C2
, VT
);
1239 case ISD::MUL
: return getConstant(C1
* C2
, VT
);
1241 if (C2
) return getConstant(C1
/ C2
, VT
);
1244 if (C2
) return getConstant(C1
% C2
, VT
);
1247 if (C2
) return getConstant(N1C
->getSignExtended() /
1248 N2C
->getSignExtended(), VT
);
1251 if (C2
) return getConstant(N1C
->getSignExtended() %
1252 N2C
->getSignExtended(), VT
);
1254 case ISD::AND
: return getConstant(C1
& C2
, VT
);
1255 case ISD::OR
: return getConstant(C1
| C2
, VT
);
1256 case ISD::XOR
: return getConstant(C1
^ C2
, VT
);
1257 case ISD::SHL
: return getConstant(C1
<< C2
, VT
);
1258 case ISD::SRL
: return getConstant(C1
>> C2
, VT
);
1259 case ISD::SRA
: return getConstant(N1C
->getSignExtended() >>(int)C2
, VT
);
1261 return getConstant((C1
<< C2
) | (C1
>> (MVT::getSizeInBits(VT
) - C2
)),
1264 return getConstant((C1
>> C2
) | (C1
<< (MVT::getSizeInBits(VT
) - C2
)),
1268 } else { // Cannonicalize constant to RHS if commutative
1269 if (isCommutativeBinOp(Opcode
)) {
1270 std::swap(N1C
, N2C
);
1276 ConstantFPSDNode
*N1CFP
= dyn_cast
<ConstantFPSDNode
>(N1
.Val
);
1277 ConstantFPSDNode
*N2CFP
= dyn_cast
<ConstantFPSDNode
>(N2
.Val
);
1280 double C1
= N1CFP
->getValue(), C2
= N2CFP
->getValue();
1282 case ISD::FADD
: return getConstantFP(C1
+ C2
, VT
);
1283 case ISD::FSUB
: return getConstantFP(C1
- C2
, VT
);
1284 case ISD::FMUL
: return getConstantFP(C1
* C2
, VT
);
1286 if (C2
) return getConstantFP(C1
/ C2
, VT
);
1289 if (C2
) return getConstantFP(fmod(C1
, C2
), VT
);
1291 case ISD::FCOPYSIGN
: {
1297 if (int64_t(DoubleToBits(C2
)) < 0) // Sign bit of RHS set?
1298 u1
.I
|= 1ULL << 63; // Set the sign bit of the LHS.
1300 u1
.I
&= (1ULL << 63)-1; // Clear the sign bit of the LHS.
1301 return getConstantFP(u1
.F
, VT
);
1305 } else { // Cannonicalize constant to RHS if commutative
1306 if (isCommutativeBinOp(Opcode
)) {
1307 std::swap(N1CFP
, N2CFP
);
1313 // Canonicalize an UNDEF to the RHS, even over a constant.
1314 if (N1
.getOpcode() == ISD::UNDEF
) {
1315 if (isCommutativeBinOp(Opcode
)) {
1319 case ISD::FP_ROUND_INREG
:
1320 case ISD::SIGN_EXTEND_INREG
:
1326 return N1
; // fold op(undef, arg2) -> undef
1333 if (!MVT::isVector(VT
))
1334 return getConstant(0, VT
); // fold op(undef, arg2) -> 0
1335 // For vectors, we can't easily build an all zero vector, just return
1342 // Fold a bunch of operators when the RHS is undef.
1343 if (N2
.getOpcode() == ISD::UNDEF
) {
1359 return N2
; // fold op(arg1, undef) -> undef
1364 if (!MVT::isVector(VT
))
1365 return getConstant(0, VT
); // fold op(arg1, undef) -> 0
1366 // For vectors, we can't easily build an all zero vector, just return
1370 if (!MVT::isVector(VT
))
1371 return getConstant(MVT::getIntVTBitMask(VT
), VT
);
1372 // For vectors, we can't easily build an all one vector, just return
1382 case ISD::TokenFactor
:
1383 // Fold trivial token factors.
1384 if (N1
.getOpcode() == ISD::EntryToken
) return N2
;
1385 if (N2
.getOpcode() == ISD::EntryToken
) return N1
;
1389 // (X & 0) -> 0. This commonly occurs when legalizing i64 values, so it's
1390 // worth handling here.
1391 if (N2C
&& N2C
->getValue() == 0)
1396 // (X ^| 0) -> X. This commonly occurs when legalizing i64 values, so it's
1397 // worth handling here.
1398 if (N2C
&& N2C
->getValue() == 0)
1401 case ISD::FP_ROUND_INREG
:
1402 if (cast
<VTSDNode
>(N2
)->getVT() == VT
) return N1
; // Not actually rounding.
1404 case ISD::SIGN_EXTEND_INREG
: {
1405 MVT::ValueType EVT
= cast
<VTSDNode
>(N2
)->getVT();
1406 if (EVT
== VT
) return N1
; // Not actually extending
1409 case ISD::EXTRACT_ELEMENT
:
1410 assert(N2C
&& (unsigned)N2C
->getValue() < 2 && "Bad EXTRACT_ELEMENT!");
1412 // EXTRACT_ELEMENT of BUILD_PAIR is often formed while legalize is expanding
1413 // 64-bit integers into 32-bit parts. Instead of building the extract of
1414 // the BUILD_PAIR, only to have legalize rip it apart, just do it now.
1415 if (N1
.getOpcode() == ISD::BUILD_PAIR
)
1416 return N1
.getOperand(N2C
->getValue());
1418 // EXTRACT_ELEMENT of a constant int is also very common.
1419 if (ConstantSDNode
*C
= dyn_cast
<ConstantSDNode
>(N1
)) {
1420 unsigned Shift
= MVT::getSizeInBits(VT
) * N2C
->getValue();
1421 return getConstant(C
->getValue() >> Shift
, VT
);
1425 // FIXME: figure out how to safely handle things like
1426 // int foo(int x) { return 1 << (x & 255); }
1427 // int bar() { return foo(256); }
1432 if (N2
.getOpcode() == ISD::SIGN_EXTEND_INREG
&&
1433 cast
<VTSDNode
>(N2
.getOperand(1))->getVT() != MVT::i1
)
1434 return getNode(Opcode
, VT
, N1
, N2
.getOperand(0));
1435 else if (N2
.getOpcode() == ISD::AND
)
1436 if (ConstantSDNode
*AndRHS
= dyn_cast
<ConstantSDNode
>(N2
.getOperand(1))) {
1437 // If the and is only masking out bits that cannot effect the shift,
1438 // eliminate the and.
1439 unsigned NumBits
= MVT::getSizeInBits(VT
);
1440 if ((AndRHS
->getValue() & (NumBits
-1)) == NumBits
-1)
1441 return getNode(Opcode
, VT
, N1
, N2
.getOperand(0));
1447 // Memoize this node if possible.
1449 SDVTList VTs
= getVTList(VT
);
1450 if (VT
!= MVT::Flag
) {
1451 SDOperand Ops
[] = { N1
, N2
};
1452 FoldingSetNodeID ID
;
1453 AddNodeIDNode(ID
, Opcode
, VTs
, Ops
, 2);
1455 if (SDNode
*E
= CSEMap
.FindNodeOrInsertPos(ID
, IP
))
1456 return SDOperand(E
, 0);
1457 N
= new BinarySDNode(Opcode
, VTs
, N1
, N2
);
1458 CSEMap
.InsertNode(N
, IP
);
1460 N
= new BinarySDNode(Opcode
, VTs
, N1
, N2
);
1463 AllNodes
.push_back(N
);
1464 return SDOperand(N
, 0);
1467 SDOperand
SelectionDAG::getNode(unsigned Opcode
, MVT::ValueType VT
,
1468 SDOperand N1
, SDOperand N2
, SDOperand N3
) {
1469 // Perform various simplifications.
1470 ConstantSDNode
*N1C
= dyn_cast
<ConstantSDNode
>(N1
.Val
);
1471 ConstantSDNode
*N2C
= dyn_cast
<ConstantSDNode
>(N2
.Val
);
1474 // Use FoldSetCC to simplify SETCC's.
1475 SDOperand Simp
= FoldSetCC(VT
, N1
, N2
, cast
<CondCodeSDNode
>(N3
)->get());
1476 if (Simp
.Val
) return Simp
;
1481 if (N1C
->getValue())
1482 return N2
; // select true, X, Y -> X
1484 return N3
; // select false, X, Y -> Y
1486 if (N2
== N3
) return N2
; // select C, X, X -> X
1490 if (N2C
->getValue()) // Unconditional branch
1491 return getNode(ISD::BR
, MVT::Other
, N1
, N3
);
1493 return N1
; // Never-taken branch
1495 case ISD::VECTOR_SHUFFLE
:
1496 assert(VT
== N1
.getValueType() && VT
== N2
.getValueType() &&
1497 MVT::isVector(VT
) && MVT::isVector(N3
.getValueType()) &&
1498 N3
.getOpcode() == ISD::BUILD_VECTOR
&&
1499 MVT::getVectorNumElements(VT
) == N3
.getNumOperands() &&
1500 "Illegal VECTOR_SHUFFLE node!");
1502 case ISD::VBIT_CONVERT
:
1503 // Fold vbit_convert nodes from a type to themselves.
1504 if (N1
.getValueType() == MVT::Vector
) {
1505 assert(isa
<ConstantSDNode
>(*(N1
.Val
->op_end()-2)) &&
1506 isa
<VTSDNode
>(*(N1
.Val
->op_end()-1)) && "Malformed vector input!");
1507 if (*(N1
.Val
->op_end()-2) == N2
&& *(N1
.Val
->op_end()-1) == N3
)
1513 // Memoize node if it doesn't produce a flag.
1515 SDVTList VTs
= getVTList(VT
);
1516 if (VT
!= MVT::Flag
) {
1517 SDOperand Ops
[] = { N1
, N2
, N3
};
1518 FoldingSetNodeID ID
;
1519 AddNodeIDNode(ID
, Opcode
, VTs
, Ops
, 3);
1521 if (SDNode
*E
= CSEMap
.FindNodeOrInsertPos(ID
, IP
))
1522 return SDOperand(E
, 0);
1523 N
= new TernarySDNode(Opcode
, VTs
, N1
, N2
, N3
);
1524 CSEMap
.InsertNode(N
, IP
);
1526 N
= new TernarySDNode(Opcode
, VTs
, N1
, N2
, N3
);
1528 AllNodes
.push_back(N
);
1529 return SDOperand(N
, 0);
1532 SDOperand
SelectionDAG::getNode(unsigned Opcode
, MVT::ValueType VT
,
1533 SDOperand N1
, SDOperand N2
, SDOperand N3
,
1535 SDOperand Ops
[] = { N1
, N2
, N3
, N4
};
1536 return getNode(Opcode
, VT
, Ops
, 4);
1539 SDOperand
SelectionDAG::getNode(unsigned Opcode
, MVT::ValueType VT
,
1540 SDOperand N1
, SDOperand N2
, SDOperand N3
,
1541 SDOperand N4
, SDOperand N5
) {
1542 SDOperand Ops
[] = { N1
, N2
, N3
, N4
, N5
};
1543 return getNode(Opcode
, VT
, Ops
, 5);
1546 SDOperand
SelectionDAG::getLoad(MVT::ValueType VT
,
1547 SDOperand Chain
, SDOperand Ptr
,
1548 const Value
*SV
, int SVOffset
,
1549 bool isVolatile
, unsigned Alignment
) {
1550 if (Alignment
== 0) { // Ensure that codegen never sees alignment 0
1552 if (VT
!= MVT::Vector
&& VT
!= MVT::iPTR
) {
1553 Ty
= MVT::getTypeForValueType(VT
);
1555 const PointerType
*PT
= dyn_cast
<PointerType
>(SV
->getType());
1556 assert(PT
&& "Value for load must be a pointer");
1557 Ty
= PT
->getElementType();
1559 assert(Ty
&& "Could not get type information for load");
1560 Alignment
= TLI
.getTargetData()->getABITypeAlignment(Ty
);
1562 SDVTList VTs
= getVTList(VT
, MVT::Other
);
1563 SDOperand Undef
= getNode(ISD::UNDEF
, Ptr
.getValueType());
1564 SDOperand Ops
[] = { Chain
, Ptr
, Undef
};
1565 FoldingSetNodeID ID
;
1566 AddNodeIDNode(ID
, ISD::LOAD
, VTs
, Ops
, 3);
1567 ID
.AddInteger(ISD::UNINDEXED
);
1568 ID
.AddInteger(ISD::NON_EXTLOAD
);
1571 ID
.AddInteger(SVOffset
);
1572 ID
.AddInteger(Alignment
);
1573 ID
.AddInteger(isVolatile
);
1575 if (SDNode
*E
= CSEMap
.FindNodeOrInsertPos(ID
, IP
))
1576 return SDOperand(E
, 0);
1577 SDNode
*N
= new LoadSDNode(Ops
, VTs
, ISD::UNINDEXED
,
1578 ISD::NON_EXTLOAD
, VT
, SV
, SVOffset
, Alignment
,
1580 CSEMap
.InsertNode(N
, IP
);
1581 AllNodes
.push_back(N
);
1582 return SDOperand(N
, 0);
1585 SDOperand
SelectionDAG::getExtLoad(ISD::LoadExtType ExtType
, MVT::ValueType VT
,
1586 SDOperand Chain
, SDOperand Ptr
,
1588 int SVOffset
, MVT::ValueType EVT
,
1589 bool isVolatile
, unsigned Alignment
) {
1590 // If they are asking for an extending load from/to the same thing, return a
1593 ExtType
= ISD::NON_EXTLOAD
;
1595 if (MVT::isVector(VT
))
1596 assert(EVT
== MVT::getVectorElementType(VT
) && "Invalid vector extload!");
1598 assert(EVT
< VT
&& "Should only be an extending load, not truncating!");
1599 assert((ExtType
== ISD::EXTLOAD
|| MVT::isInteger(VT
)) &&
1600 "Cannot sign/zero extend a FP/Vector load!");
1601 assert(MVT::isInteger(VT
) == MVT::isInteger(EVT
) &&
1602 "Cannot convert from FP to Int or Int -> FP!");
1604 if (Alignment
== 0) { // Ensure that codegen never sees alignment 0
1606 if (VT
!= MVT::Vector
&& VT
!= MVT::iPTR
) {
1607 Ty
= MVT::getTypeForValueType(VT
);
1609 const PointerType
*PT
= dyn_cast
<PointerType
>(SV
->getType());
1610 assert(PT
&& "Value for load must be a pointer");
1611 Ty
= PT
->getElementType();
1613 assert(Ty
&& "Could not get type information for load");
1614 Alignment
= TLI
.getTargetData()->getABITypeAlignment(Ty
);
1616 SDVTList VTs
= getVTList(VT
, MVT::Other
);
1617 SDOperand Undef
= getNode(ISD::UNDEF
, Ptr
.getValueType());
1618 SDOperand Ops
[] = { Chain
, Ptr
, Undef
};
1619 FoldingSetNodeID ID
;
1620 AddNodeIDNode(ID
, ISD::LOAD
, VTs
, Ops
, 3);
1621 ID
.AddInteger(ISD::UNINDEXED
);
1622 ID
.AddInteger(ExtType
);
1625 ID
.AddInteger(SVOffset
);
1626 ID
.AddInteger(Alignment
);
1627 ID
.AddInteger(isVolatile
);
1629 if (SDNode
*E
= CSEMap
.FindNodeOrInsertPos(ID
, IP
))
1630 return SDOperand(E
, 0);
1631 SDNode
*N
= new LoadSDNode(Ops
, VTs
, ISD::UNINDEXED
, ExtType
, EVT
,
1632 SV
, SVOffset
, Alignment
, isVolatile
);
1633 CSEMap
.InsertNode(N
, IP
);
1634 AllNodes
.push_back(N
);
1635 return SDOperand(N
, 0);
1639 SelectionDAG::getIndexedLoad(SDOperand OrigLoad
, SDOperand Base
,
1640 SDOperand Offset
, ISD::MemIndexedMode AM
) {
1641 LoadSDNode
*LD
= cast
<LoadSDNode
>(OrigLoad
);
1642 assert(LD
->getOffset().getOpcode() == ISD::UNDEF
&&
1643 "Load is already a indexed load!");
1644 MVT::ValueType VT
= OrigLoad
.getValueType();
1645 SDVTList VTs
= getVTList(VT
, Base
.getValueType(), MVT::Other
);
1646 SDOperand Ops
[] = { LD
->getChain(), Base
, Offset
};
1647 FoldingSetNodeID ID
;
1648 AddNodeIDNode(ID
, ISD::LOAD
, VTs
, Ops
, 3);
1650 ID
.AddInteger(LD
->getExtensionType());
1651 ID
.AddInteger(LD
->getLoadedVT());
1652 ID
.AddPointer(LD
->getSrcValue());
1653 ID
.AddInteger(LD
->getSrcValueOffset());
1654 ID
.AddInteger(LD
->getAlignment());
1655 ID
.AddInteger(LD
->isVolatile());
1657 if (SDNode
*E
= CSEMap
.FindNodeOrInsertPos(ID
, IP
))
1658 return SDOperand(E
, 0);
1659 SDNode
*N
= new LoadSDNode(Ops
, VTs
, AM
,
1660 LD
->getExtensionType(), LD
->getLoadedVT(),
1661 LD
->getSrcValue(), LD
->getSrcValueOffset(),
1662 LD
->getAlignment(), LD
->isVolatile());
1663 CSEMap
.InsertNode(N
, IP
);
1664 AllNodes
.push_back(N
);
1665 return SDOperand(N
, 0);
1668 SDOperand
SelectionDAG::getVecLoad(unsigned Count
, MVT::ValueType EVT
,
1669 SDOperand Chain
, SDOperand Ptr
,
1671 SDOperand Ops
[] = { Chain
, Ptr
, SV
, getConstant(Count
, MVT::i32
),
1672 getValueType(EVT
) };
1673 return getNode(ISD::VLOAD
, getVTList(MVT::Vector
, MVT::Other
), Ops
, 5);
1676 SDOperand
SelectionDAG::getStore(SDOperand Chain
, SDOperand Val
,
1677 SDOperand Ptr
, const Value
*SV
, int SVOffset
,
1678 bool isVolatile
, unsigned Alignment
) {
1679 MVT::ValueType VT
= Val
.getValueType();
1681 if (Alignment
== 0) { // Ensure that codegen never sees alignment 0
1683 if (VT
!= MVT::Vector
&& VT
!= MVT::iPTR
) {
1684 Ty
= MVT::getTypeForValueType(VT
);
1686 const PointerType
*PT
= dyn_cast
<PointerType
>(SV
->getType());
1687 assert(PT
&& "Value for store must be a pointer");
1688 Ty
= PT
->getElementType();
1690 assert(Ty
&& "Could not get type information for store");
1691 Alignment
= TLI
.getTargetData()->getABITypeAlignment(Ty
);
1693 SDVTList VTs
= getVTList(MVT::Other
);
1694 SDOperand Undef
= getNode(ISD::UNDEF
, Ptr
.getValueType());
1695 SDOperand Ops
[] = { Chain
, Val
, Ptr
, Undef
};
1696 FoldingSetNodeID ID
;
1697 AddNodeIDNode(ID
, ISD::STORE
, VTs
, Ops
, 4);
1698 ID
.AddInteger(ISD::UNINDEXED
);
1699 ID
.AddInteger(false);
1702 ID
.AddInteger(SVOffset
);
1703 ID
.AddInteger(Alignment
);
1704 ID
.AddInteger(isVolatile
);
1706 if (SDNode
*E
= CSEMap
.FindNodeOrInsertPos(ID
, IP
))
1707 return SDOperand(E
, 0);
1708 SDNode
*N
= new StoreSDNode(Ops
, VTs
, ISD::UNINDEXED
, false,
1709 VT
, SV
, SVOffset
, Alignment
, isVolatile
);
1710 CSEMap
.InsertNode(N
, IP
);
1711 AllNodes
.push_back(N
);
1712 return SDOperand(N
, 0);
1715 SDOperand
SelectionDAG::getTruncStore(SDOperand Chain
, SDOperand Val
,
1716 SDOperand Ptr
, const Value
*SV
,
1717 int SVOffset
, MVT::ValueType SVT
,
1718 bool isVolatile
, unsigned Alignment
) {
1719 MVT::ValueType VT
= Val
.getValueType();
1720 bool isTrunc
= VT
!= SVT
;
1722 assert(VT
> SVT
&& "Not a truncation?");
1723 assert(MVT::isInteger(VT
) == MVT::isInteger(SVT
) &&
1724 "Can't do FP-INT conversion!");
1726 if (Alignment
== 0) { // Ensure that codegen never sees alignment 0
1728 if (VT
!= MVT::Vector
&& VT
!= MVT::iPTR
) {
1729 Ty
= MVT::getTypeForValueType(VT
);
1731 const PointerType
*PT
= dyn_cast
<PointerType
>(SV
->getType());
1732 assert(PT
&& "Value for store must be a pointer");
1733 Ty
= PT
->getElementType();
1735 assert(Ty
&& "Could not get type information for store");
1736 Alignment
= TLI
.getTargetData()->getABITypeAlignment(Ty
);
1738 SDVTList VTs
= getVTList(MVT::Other
);
1739 SDOperand Undef
= getNode(ISD::UNDEF
, Ptr
.getValueType());
1740 SDOperand Ops
[] = { Chain
, Val
, Ptr
, Undef
};
1741 FoldingSetNodeID ID
;
1742 AddNodeIDNode(ID
, ISD::STORE
, VTs
, Ops
, 4);
1743 ID
.AddInteger(ISD::UNINDEXED
);
1744 ID
.AddInteger(isTrunc
);
1747 ID
.AddInteger(SVOffset
);
1748 ID
.AddInteger(Alignment
);
1749 ID
.AddInteger(isVolatile
);
1751 if (SDNode
*E
= CSEMap
.FindNodeOrInsertPos(ID
, IP
))
1752 return SDOperand(E
, 0);
1753 SDNode
*N
= new StoreSDNode(Ops
, VTs
, ISD::UNINDEXED
, isTrunc
,
1754 SVT
, SV
, SVOffset
, Alignment
, isVolatile
);
1755 CSEMap
.InsertNode(N
, IP
);
1756 AllNodes
.push_back(N
);
1757 return SDOperand(N
, 0);
1761 SelectionDAG::getIndexedStore(SDOperand OrigStore
, SDOperand Base
,
1762 SDOperand Offset
, ISD::MemIndexedMode AM
) {
1763 StoreSDNode
*ST
= cast
<StoreSDNode
>(OrigStore
);
1764 assert(ST
->getOffset().getOpcode() == ISD::UNDEF
&&
1765 "Store is already a indexed store!");
1766 SDVTList VTs
= getVTList(Base
.getValueType(), MVT::Other
);
1767 SDOperand Ops
[] = { ST
->getChain(), ST
->getValue(), Base
, Offset
};
1768 FoldingSetNodeID ID
;
1769 AddNodeIDNode(ID
, ISD::STORE
, VTs
, Ops
, 4);
1771 ID
.AddInteger(ST
->isTruncatingStore());
1772 ID
.AddInteger(ST
->getStoredVT());
1773 ID
.AddPointer(ST
->getSrcValue());
1774 ID
.AddInteger(ST
->getSrcValueOffset());
1775 ID
.AddInteger(ST
->getAlignment());
1776 ID
.AddInteger(ST
->isVolatile());
1778 if (SDNode
*E
= CSEMap
.FindNodeOrInsertPos(ID
, IP
))
1779 return SDOperand(E
, 0);
1780 SDNode
*N
= new StoreSDNode(Ops
, VTs
, AM
,
1781 ST
->isTruncatingStore(), ST
->getStoredVT(),
1782 ST
->getSrcValue(), ST
->getSrcValueOffset(),
1783 ST
->getAlignment(), ST
->isVolatile());
1784 CSEMap
.InsertNode(N
, IP
);
1785 AllNodes
.push_back(N
);
1786 return SDOperand(N
, 0);
1789 SDOperand
SelectionDAG::getVAArg(MVT::ValueType VT
,
1790 SDOperand Chain
, SDOperand Ptr
,
1792 SDOperand Ops
[] = { Chain
, Ptr
, SV
};
1793 return getNode(ISD::VAARG
, getVTList(VT
, MVT::Other
), Ops
, 3);
1796 SDOperand
SelectionDAG::getNode(unsigned Opcode
, MVT::ValueType VT
,
1797 const SDOperand
*Ops
, unsigned NumOps
) {
1799 case 0: return getNode(Opcode
, VT
);
1800 case 1: return getNode(Opcode
, VT
, Ops
[0]);
1801 case 2: return getNode(Opcode
, VT
, Ops
[0], Ops
[1]);
1802 case 3: return getNode(Opcode
, VT
, Ops
[0], Ops
[1], Ops
[2]);
1808 case ISD::SELECT_CC
: {
1809 assert(NumOps
== 5 && "SELECT_CC takes 5 operands!");
1810 assert(Ops
[0].getValueType() == Ops
[1].getValueType() &&
1811 "LHS and RHS of condition must have same type!");
1812 assert(Ops
[2].getValueType() == Ops
[3].getValueType() &&
1813 "True and False arms of SelectCC must have same type!");
1814 assert(Ops
[2].getValueType() == VT
&&
1815 "select_cc node must be of same type as true and false value!");
1819 assert(NumOps
== 5 && "BR_CC takes 5 operands!");
1820 assert(Ops
[2].getValueType() == Ops
[3].getValueType() &&
1821 "LHS/RHS of comparison should match types!");
1828 SDVTList VTs
= getVTList(VT
);
1829 if (VT
!= MVT::Flag
) {
1830 FoldingSetNodeID ID
;
1831 AddNodeIDNode(ID
, Opcode
, VTs
, Ops
, NumOps
);
1833 if (SDNode
*E
= CSEMap
.FindNodeOrInsertPos(ID
, IP
))
1834 return SDOperand(E
, 0);
1835 N
= new SDNode(Opcode
, VTs
, Ops
, NumOps
);
1836 CSEMap
.InsertNode(N
, IP
);
1838 N
= new SDNode(Opcode
, VTs
, Ops
, NumOps
);
1840 AllNodes
.push_back(N
);
1841 return SDOperand(N
, 0);
1844 SDOperand
SelectionDAG::getNode(unsigned Opcode
,
1845 std::vector
<MVT::ValueType
> &ResultTys
,
1846 const SDOperand
*Ops
, unsigned NumOps
) {
1847 return getNode(Opcode
, getNodeValueTypes(ResultTys
), ResultTys
.size(),
1851 SDOperand
SelectionDAG::getNode(unsigned Opcode
,
1852 const MVT::ValueType
*VTs
, unsigned NumVTs
,
1853 const SDOperand
*Ops
, unsigned NumOps
) {
1855 return getNode(Opcode
, VTs
[0], Ops
, NumOps
);
1856 return getNode(Opcode
, makeVTList(VTs
, NumVTs
), Ops
, NumOps
);
1859 SDOperand
SelectionDAG::getNode(unsigned Opcode
, SDVTList VTList
,
1860 const SDOperand
*Ops
, unsigned NumOps
) {
1861 if (VTList
.NumVTs
== 1)
1862 return getNode(Opcode
, VTList
.VTs
[0], Ops
, NumOps
);
1865 // FIXME: figure out how to safely handle things like
1866 // int foo(int x) { return 1 << (x & 255); }
1867 // int bar() { return foo(256); }
1869 case ISD::SRA_PARTS
:
1870 case ISD::SRL_PARTS
:
1871 case ISD::SHL_PARTS
:
1872 if (N3
.getOpcode() == ISD::SIGN_EXTEND_INREG
&&
1873 cast
<VTSDNode
>(N3
.getOperand(1))->getVT() != MVT::i1
)
1874 return getNode(Opcode
, VT
, N1
, N2
, N3
.getOperand(0));
1875 else if (N3
.getOpcode() == ISD::AND
)
1876 if (ConstantSDNode
*AndRHS
= dyn_cast
<ConstantSDNode
>(N3
.getOperand(1))) {
1877 // If the and is only masking out bits that cannot effect the shift,
1878 // eliminate the and.
1879 unsigned NumBits
= MVT::getSizeInBits(VT
)*2;
1880 if ((AndRHS
->getValue() & (NumBits
-1)) == NumBits
-1)
1881 return getNode(Opcode
, VT
, N1
, N2
, N3
.getOperand(0));
1887 // Memoize the node unless it returns a flag.
1889 if (VTList
.VTs
[VTList
.NumVTs
-1] != MVT::Flag
) {
1890 FoldingSetNodeID ID
;
1891 AddNodeIDNode(ID
, Opcode
, VTList
, Ops
, NumOps
);
1893 if (SDNode
*E
= CSEMap
.FindNodeOrInsertPos(ID
, IP
))
1894 return SDOperand(E
, 0);
1896 N
= new UnarySDNode(Opcode
, VTList
, Ops
[0]);
1897 else if (NumOps
== 2)
1898 N
= new BinarySDNode(Opcode
, VTList
, Ops
[0], Ops
[1]);
1899 else if (NumOps
== 3)
1900 N
= new TernarySDNode(Opcode
, VTList
, Ops
[0], Ops
[1], Ops
[2]);
1902 N
= new SDNode(Opcode
, VTList
, Ops
, NumOps
);
1903 CSEMap
.InsertNode(N
, IP
);
1906 N
= new UnarySDNode(Opcode
, VTList
, Ops
[0]);
1907 else if (NumOps
== 2)
1908 N
= new BinarySDNode(Opcode
, VTList
, Ops
[0], Ops
[1]);
1909 else if (NumOps
== 3)
1910 N
= new TernarySDNode(Opcode
, VTList
, Ops
[0], Ops
[1], Ops
[2]);
1912 N
= new SDNode(Opcode
, VTList
, Ops
, NumOps
);
1914 AllNodes
.push_back(N
);
1915 return SDOperand(N
, 0);
1918 SDVTList
SelectionDAG::getVTList(MVT::ValueType VT
) {
1919 return makeVTList(SDNode::getValueTypeList(VT
), 1);
1922 SDVTList
SelectionDAG::getVTList(MVT::ValueType VT1
, MVT::ValueType VT2
) {
1923 for (std::list
<std::vector
<MVT::ValueType
> >::iterator I
= VTList
.begin(),
1924 E
= VTList
.end(); I
!= E
; ++I
) {
1925 if (I
->size() == 2 && (*I
)[0] == VT1
&& (*I
)[1] == VT2
)
1926 return makeVTList(&(*I
)[0], 2);
1928 std::vector
<MVT::ValueType
> V
;
1931 VTList
.push_front(V
);
1932 return makeVTList(&(*VTList
.begin())[0], 2);
1934 SDVTList
SelectionDAG::getVTList(MVT::ValueType VT1
, MVT::ValueType VT2
,
1935 MVT::ValueType VT3
) {
1936 for (std::list
<std::vector
<MVT::ValueType
> >::iterator I
= VTList
.begin(),
1937 E
= VTList
.end(); I
!= E
; ++I
) {
1938 if (I
->size() == 3 && (*I
)[0] == VT1
&& (*I
)[1] == VT2
&&
1940 return makeVTList(&(*I
)[0], 3);
1942 std::vector
<MVT::ValueType
> V
;
1946 VTList
.push_front(V
);
1947 return makeVTList(&(*VTList
.begin())[0], 3);
1950 SDVTList
SelectionDAG::getVTList(const MVT::ValueType
*VTs
, unsigned NumVTs
) {
1952 case 0: assert(0 && "Cannot have nodes without results!");
1953 case 1: return makeVTList(SDNode::getValueTypeList(VTs
[0]), 1);
1954 case 2: return getVTList(VTs
[0], VTs
[1]);
1955 case 3: return getVTList(VTs
[0], VTs
[1], VTs
[2]);
1959 for (std::list
<std::vector
<MVT::ValueType
> >::iterator I
= VTList
.begin(),
1960 E
= VTList
.end(); I
!= E
; ++I
) {
1961 if (I
->size() != NumVTs
|| VTs
[0] != (*I
)[0] || VTs
[1] != (*I
)[1]) continue;
1963 bool NoMatch
= false;
1964 for (unsigned i
= 2; i
!= NumVTs
; ++i
)
1965 if (VTs
[i
] != (*I
)[i
]) {
1970 return makeVTList(&*I
->begin(), NumVTs
);
1973 VTList
.push_front(std::vector
<MVT::ValueType
>(VTs
, VTs
+NumVTs
));
1974 return makeVTList(&*VTList
.begin()->begin(), NumVTs
);
1978 /// UpdateNodeOperands - *Mutate* the specified node in-place to have the
1979 /// specified operands. If the resultant node already exists in the DAG,
1980 /// this does not modify the specified node, instead it returns the node that
1981 /// already exists. If the resultant node does not exist in the DAG, the
1982 /// input node is returned. As a degenerate case, if you specify the same
1983 /// input operands as the node already has, the input node is returned.
1984 SDOperand
SelectionDAG::
1985 UpdateNodeOperands(SDOperand InN
, SDOperand Op
) {
1986 SDNode
*N
= InN
.Val
;
1987 assert(N
->getNumOperands() == 1 && "Update with wrong number of operands");
1989 // Check to see if there is no change.
1990 if (Op
== N
->getOperand(0)) return InN
;
1992 // See if the modified node already exists.
1993 void *InsertPos
= 0;
1994 if (SDNode
*Existing
= FindModifiedNodeSlot(N
, Op
, InsertPos
))
1995 return SDOperand(Existing
, InN
.ResNo
);
1997 // Nope it doesn't. Remove the node from it's current place in the maps.
1999 RemoveNodeFromCSEMaps(N
);
2001 // Now we update the operands.
2002 N
->OperandList
[0].Val
->removeUser(N
);
2004 N
->OperandList
[0] = Op
;
2006 // If this gets put into a CSE map, add it.
2007 if (InsertPos
) CSEMap
.InsertNode(N
, InsertPos
);
2011 SDOperand
SelectionDAG::
2012 UpdateNodeOperands(SDOperand InN
, SDOperand Op1
, SDOperand Op2
) {
2013 SDNode
*N
= InN
.Val
;
2014 assert(N
->getNumOperands() == 2 && "Update with wrong number of operands");
2016 // Check to see if there is no change.
2017 if (Op1
== N
->getOperand(0) && Op2
== N
->getOperand(1))
2018 return InN
; // No operands changed, just return the input node.
2020 // See if the modified node already exists.
2021 void *InsertPos
= 0;
2022 if (SDNode
*Existing
= FindModifiedNodeSlot(N
, Op1
, Op2
, InsertPos
))
2023 return SDOperand(Existing
, InN
.ResNo
);
2025 // Nope it doesn't. Remove the node from it's current place in the maps.
2027 RemoveNodeFromCSEMaps(N
);
2029 // Now we update the operands.
2030 if (N
->OperandList
[0] != Op1
) {
2031 N
->OperandList
[0].Val
->removeUser(N
);
2032 Op1
.Val
->addUser(N
);
2033 N
->OperandList
[0] = Op1
;
2035 if (N
->OperandList
[1] != Op2
) {
2036 N
->OperandList
[1].Val
->removeUser(N
);
2037 Op2
.Val
->addUser(N
);
2038 N
->OperandList
[1] = Op2
;
2041 // If this gets put into a CSE map, add it.
2042 if (InsertPos
) CSEMap
.InsertNode(N
, InsertPos
);
2046 SDOperand
SelectionDAG::
2047 UpdateNodeOperands(SDOperand N
, SDOperand Op1
, SDOperand Op2
, SDOperand Op3
) {
2048 SDOperand Ops
[] = { Op1
, Op2
, Op3
};
2049 return UpdateNodeOperands(N
, Ops
, 3);
2052 SDOperand
SelectionDAG::
2053 UpdateNodeOperands(SDOperand N
, SDOperand Op1
, SDOperand Op2
,
2054 SDOperand Op3
, SDOperand Op4
) {
2055 SDOperand Ops
[] = { Op1
, Op2
, Op3
, Op4
};
2056 return UpdateNodeOperands(N
, Ops
, 4);
2059 SDOperand
SelectionDAG::
2060 UpdateNodeOperands(SDOperand N
, SDOperand Op1
, SDOperand Op2
,
2061 SDOperand Op3
, SDOperand Op4
, SDOperand Op5
) {
2062 SDOperand Ops
[] = { Op1
, Op2
, Op3
, Op4
, Op5
};
2063 return UpdateNodeOperands(N
, Ops
, 5);
2067 SDOperand
SelectionDAG::
2068 UpdateNodeOperands(SDOperand InN
, SDOperand
*Ops
, unsigned NumOps
) {
2069 SDNode
*N
= InN
.Val
;
2070 assert(N
->getNumOperands() == NumOps
&&
2071 "Update with wrong number of operands");
2073 // Check to see if there is no change.
2074 bool AnyChange
= false;
2075 for (unsigned i
= 0; i
!= NumOps
; ++i
) {
2076 if (Ops
[i
] != N
->getOperand(i
)) {
2082 // No operands changed, just return the input node.
2083 if (!AnyChange
) return InN
;
2085 // See if the modified node already exists.
2086 void *InsertPos
= 0;
2087 if (SDNode
*Existing
= FindModifiedNodeSlot(N
, Ops
, NumOps
, InsertPos
))
2088 return SDOperand(Existing
, InN
.ResNo
);
2090 // Nope it doesn't. Remove the node from it's current place in the maps.
2092 RemoveNodeFromCSEMaps(N
);
2094 // Now we update the operands.
2095 for (unsigned i
= 0; i
!= NumOps
; ++i
) {
2096 if (N
->OperandList
[i
] != Ops
[i
]) {
2097 N
->OperandList
[i
].Val
->removeUser(N
);
2098 Ops
[i
].Val
->addUser(N
);
2099 N
->OperandList
[i
] = Ops
[i
];
2103 // If this gets put into a CSE map, add it.
2104 if (InsertPos
) CSEMap
.InsertNode(N
, InsertPos
);
2109 /// MorphNodeTo - This frees the operands of the current node, resets the
2110 /// opcode, types, and operands to the specified value. This should only be
2111 /// used by the SelectionDAG class.
2112 void SDNode::MorphNodeTo(unsigned Opc
, SDVTList L
,
2113 const SDOperand
*Ops
, unsigned NumOps
) {
2116 NumValues
= L
.NumVTs
;
2118 // Clear the operands list, updating used nodes to remove this from their
2120 for (op_iterator I
= op_begin(), E
= op_end(); I
!= E
; ++I
)
2121 I
->Val
->removeUser(this);
2123 // If NumOps is larger than the # of operands we currently have, reallocate
2124 // the operand list.
2125 if (NumOps
> NumOperands
) {
2126 if (OperandsNeedDelete
)
2127 delete [] OperandList
;
2128 OperandList
= new SDOperand
[NumOps
];
2129 OperandsNeedDelete
= true;
2132 // Assign the new operands.
2133 NumOperands
= NumOps
;
2135 for (unsigned i
= 0, e
= NumOps
; i
!= e
; ++i
) {
2136 OperandList
[i
] = Ops
[i
];
2137 SDNode
*N
= OperandList
[i
].Val
;
2138 N
->Uses
.push_back(this);
2142 /// SelectNodeTo - These are used for target selectors to *mutate* the
2143 /// specified node to have the specified return type, Target opcode, and
2144 /// operands. Note that target opcodes are stored as
2145 /// ISD::BUILTIN_OP_END+TargetOpcode in the node opcode field.
2147 /// Note that SelectNodeTo returns the resultant node. If there is already a
2148 /// node of the specified opcode and operands, it returns that node instead of
2149 /// the current one.
2150 SDNode
*SelectionDAG::SelectNodeTo(SDNode
*N
, unsigned TargetOpc
,
2151 MVT::ValueType VT
) {
2152 SDVTList VTs
= getVTList(VT
);
2153 FoldingSetNodeID ID
;
2154 AddNodeIDNode(ID
, ISD::BUILTIN_OP_END
+TargetOpc
, VTs
, 0, 0);
2156 if (SDNode
*ON
= CSEMap
.FindNodeOrInsertPos(ID
, IP
))
2159 RemoveNodeFromCSEMaps(N
);
2161 N
->MorphNodeTo(ISD::BUILTIN_OP_END
+TargetOpc
, VTs
, 0, 0);
2163 CSEMap
.InsertNode(N
, IP
);
2167 SDNode
*SelectionDAG::SelectNodeTo(SDNode
*N
, unsigned TargetOpc
,
2168 MVT::ValueType VT
, SDOperand Op1
) {
2169 // If an identical node already exists, use it.
2170 SDVTList VTs
= getVTList(VT
);
2171 SDOperand Ops
[] = { Op1
};
2173 FoldingSetNodeID ID
;
2174 AddNodeIDNode(ID
, ISD::BUILTIN_OP_END
+TargetOpc
, VTs
, Ops
, 1);
2176 if (SDNode
*ON
= CSEMap
.FindNodeOrInsertPos(ID
, IP
))
2179 RemoveNodeFromCSEMaps(N
);
2180 N
->MorphNodeTo(ISD::BUILTIN_OP_END
+TargetOpc
, VTs
, Ops
, 1);
2181 CSEMap
.InsertNode(N
, IP
);
2185 SDNode
*SelectionDAG::SelectNodeTo(SDNode
*N
, unsigned TargetOpc
,
2186 MVT::ValueType VT
, SDOperand Op1
,
2188 // If an identical node already exists, use it.
2189 SDVTList VTs
= getVTList(VT
);
2190 SDOperand Ops
[] = { Op1
, Op2
};
2192 FoldingSetNodeID ID
;
2193 AddNodeIDNode(ID
, ISD::BUILTIN_OP_END
+TargetOpc
, VTs
, Ops
, 2);
2195 if (SDNode
*ON
= CSEMap
.FindNodeOrInsertPos(ID
, IP
))
2198 RemoveNodeFromCSEMaps(N
);
2200 N
->MorphNodeTo(ISD::BUILTIN_OP_END
+TargetOpc
, VTs
, Ops
, 2);
2202 CSEMap
.InsertNode(N
, IP
); // Memoize the new node.
2206 SDNode
*SelectionDAG::SelectNodeTo(SDNode
*N
, unsigned TargetOpc
,
2207 MVT::ValueType VT
, SDOperand Op1
,
2208 SDOperand Op2
, SDOperand Op3
) {
2209 // If an identical node already exists, use it.
2210 SDVTList VTs
= getVTList(VT
);
2211 SDOperand Ops
[] = { Op1
, Op2
, Op3
};
2212 FoldingSetNodeID ID
;
2213 AddNodeIDNode(ID
, ISD::BUILTIN_OP_END
+TargetOpc
, VTs
, Ops
, 3);
2215 if (SDNode
*ON
= CSEMap
.FindNodeOrInsertPos(ID
, IP
))
2218 RemoveNodeFromCSEMaps(N
);
2220 N
->MorphNodeTo(ISD::BUILTIN_OP_END
+TargetOpc
, VTs
, Ops
, 3);
2222 CSEMap
.InsertNode(N
, IP
); // Memoize the new node.
2226 SDNode
*SelectionDAG::SelectNodeTo(SDNode
*N
, unsigned TargetOpc
,
2227 MVT::ValueType VT
, const SDOperand
*Ops
,
2229 // If an identical node already exists, use it.
2230 SDVTList VTs
= getVTList(VT
);
2231 FoldingSetNodeID ID
;
2232 AddNodeIDNode(ID
, ISD::BUILTIN_OP_END
+TargetOpc
, VTs
, Ops
, NumOps
);
2234 if (SDNode
*ON
= CSEMap
.FindNodeOrInsertPos(ID
, IP
))
2237 RemoveNodeFromCSEMaps(N
);
2238 N
->MorphNodeTo(ISD::BUILTIN_OP_END
+TargetOpc
, VTs
, Ops
, NumOps
);
2240 CSEMap
.InsertNode(N
, IP
); // Memoize the new node.
2244 SDNode
*SelectionDAG::SelectNodeTo(SDNode
*N
, unsigned TargetOpc
,
2245 MVT::ValueType VT1
, MVT::ValueType VT2
,
2246 SDOperand Op1
, SDOperand Op2
) {
2247 SDVTList VTs
= getVTList(VT1
, VT2
);
2248 FoldingSetNodeID ID
;
2249 SDOperand Ops
[] = { Op1
, Op2
};
2250 AddNodeIDNode(ID
, ISD::BUILTIN_OP_END
+TargetOpc
, VTs
, Ops
, 2);
2252 if (SDNode
*ON
= CSEMap
.FindNodeOrInsertPos(ID
, IP
))
2255 RemoveNodeFromCSEMaps(N
);
2256 N
->MorphNodeTo(ISD::BUILTIN_OP_END
+TargetOpc
, VTs
, Ops
, 2);
2257 CSEMap
.InsertNode(N
, IP
); // Memoize the new node.
2261 SDNode
*SelectionDAG::SelectNodeTo(SDNode
*N
, unsigned TargetOpc
,
2262 MVT::ValueType VT1
, MVT::ValueType VT2
,
2263 SDOperand Op1
, SDOperand Op2
,
2265 // If an identical node already exists, use it.
2266 SDVTList VTs
= getVTList(VT1
, VT2
);
2267 SDOperand Ops
[] = { Op1
, Op2
, Op3
};
2268 FoldingSetNodeID ID
;
2269 AddNodeIDNode(ID
, ISD::BUILTIN_OP_END
+TargetOpc
, VTs
, Ops
, 3);
2271 if (SDNode
*ON
= CSEMap
.FindNodeOrInsertPos(ID
, IP
))
2274 RemoveNodeFromCSEMaps(N
);
2276 N
->MorphNodeTo(ISD::BUILTIN_OP_END
+TargetOpc
, VTs
, Ops
, 3);
2277 CSEMap
.InsertNode(N
, IP
); // Memoize the new node.
2282 /// getTargetNode - These are used for target selectors to create a new node
2283 /// with specified return type(s), target opcode, and operands.
2285 /// Note that getTargetNode returns the resultant node. If there is already a
2286 /// node of the specified opcode and operands, it returns that node instead of
2287 /// the current one.
2288 SDNode
*SelectionDAG::getTargetNode(unsigned Opcode
, MVT::ValueType VT
) {
2289 return getNode(ISD::BUILTIN_OP_END
+Opcode
, VT
).Val
;
2291 SDNode
*SelectionDAG::getTargetNode(unsigned Opcode
, MVT::ValueType VT
,
2293 return getNode(ISD::BUILTIN_OP_END
+Opcode
, VT
, Op1
).Val
;
2295 SDNode
*SelectionDAG::getTargetNode(unsigned Opcode
, MVT::ValueType VT
,
2296 SDOperand Op1
, SDOperand Op2
) {
2297 return getNode(ISD::BUILTIN_OP_END
+Opcode
, VT
, Op1
, Op2
).Val
;
2299 SDNode
*SelectionDAG::getTargetNode(unsigned Opcode
, MVT::ValueType VT
,
2300 SDOperand Op1
, SDOperand Op2
,
2302 return getNode(ISD::BUILTIN_OP_END
+Opcode
, VT
, Op1
, Op2
, Op3
).Val
;
2304 SDNode
*SelectionDAG::getTargetNode(unsigned Opcode
, MVT::ValueType VT
,
2305 const SDOperand
*Ops
, unsigned NumOps
) {
2306 return getNode(ISD::BUILTIN_OP_END
+Opcode
, VT
, Ops
, NumOps
).Val
;
2308 SDNode
*SelectionDAG::getTargetNode(unsigned Opcode
, MVT::ValueType VT1
,
2309 MVT::ValueType VT2
, SDOperand Op1
) {
2310 const MVT::ValueType
*VTs
= getNodeValueTypes(VT1
, VT2
);
2311 return getNode(ISD::BUILTIN_OP_END
+Opcode
, VTs
, 2, &Op1
, 1).Val
;
2313 SDNode
*SelectionDAG::getTargetNode(unsigned Opcode
, MVT::ValueType VT1
,
2314 MVT::ValueType VT2
, SDOperand Op1
,
2316 const MVT::ValueType
*VTs
= getNodeValueTypes(VT1
, VT2
);
2317 SDOperand Ops
[] = { Op1
, Op2
};
2318 return getNode(ISD::BUILTIN_OP_END
+Opcode
, VTs
, 2, Ops
, 2).Val
;
2320 SDNode
*SelectionDAG::getTargetNode(unsigned Opcode
, MVT::ValueType VT1
,
2321 MVT::ValueType VT2
, SDOperand Op1
,
2322 SDOperand Op2
, SDOperand Op3
) {
2323 const MVT::ValueType
*VTs
= getNodeValueTypes(VT1
, VT2
);
2324 SDOperand Ops
[] = { Op1
, Op2
, Op3
};
2325 return getNode(ISD::BUILTIN_OP_END
+Opcode
, VTs
, 2, Ops
, 3).Val
;
2327 SDNode
*SelectionDAG::getTargetNode(unsigned Opcode
, MVT::ValueType VT1
,
2329 const SDOperand
*Ops
, unsigned NumOps
) {
2330 const MVT::ValueType
*VTs
= getNodeValueTypes(VT1
, VT2
);
2331 return getNode(ISD::BUILTIN_OP_END
+Opcode
, VTs
, 2, Ops
, NumOps
).Val
;
2333 SDNode
*SelectionDAG::getTargetNode(unsigned Opcode
, MVT::ValueType VT1
,
2334 MVT::ValueType VT2
, MVT::ValueType VT3
,
2335 SDOperand Op1
, SDOperand Op2
) {
2336 const MVT::ValueType
*VTs
= getNodeValueTypes(VT1
, VT2
, VT3
);
2337 SDOperand Ops
[] = { Op1
, Op2
};
2338 return getNode(ISD::BUILTIN_OP_END
+Opcode
, VTs
, 3, Ops
, 2).Val
;
2340 SDNode
*SelectionDAG::getTargetNode(unsigned Opcode
, MVT::ValueType VT1
,
2341 MVT::ValueType VT2
, MVT::ValueType VT3
,
2342 SDOperand Op1
, SDOperand Op2
,
2344 const MVT::ValueType
*VTs
= getNodeValueTypes(VT1
, VT2
, VT3
);
2345 SDOperand Ops
[] = { Op1
, Op2
, Op3
};
2346 return getNode(ISD::BUILTIN_OP_END
+Opcode
, VTs
, 3, Ops
, 3).Val
;
2348 SDNode
*SelectionDAG::getTargetNode(unsigned Opcode
, MVT::ValueType VT1
,
2349 MVT::ValueType VT2
, MVT::ValueType VT3
,
2350 const SDOperand
*Ops
, unsigned NumOps
) {
2351 const MVT::ValueType
*VTs
= getNodeValueTypes(VT1
, VT2
, VT3
);
2352 return getNode(ISD::BUILTIN_OP_END
+Opcode
, VTs
, 3, Ops
, NumOps
).Val
;
2355 /// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead.
2356 /// This can cause recursive merging of nodes in the DAG.
2358 /// This version assumes From/To have a single result value.
2360 void SelectionDAG::ReplaceAllUsesWith(SDOperand FromN
, SDOperand ToN
,
2361 std::vector
<SDNode
*> *Deleted
) {
2362 SDNode
*From
= FromN
.Val
, *To
= ToN
.Val
;
2363 assert(From
->getNumValues() == 1 && To
->getNumValues() == 1 &&
2364 "Cannot replace with this method!");
2365 assert(From
!= To
&& "Cannot replace uses of with self");
2367 while (!From
->use_empty()) {
2368 // Process users until they are all gone.
2369 SDNode
*U
= *From
->use_begin();
2371 // This node is about to morph, remove its old self from the CSE maps.
2372 RemoveNodeFromCSEMaps(U
);
2374 for (SDOperand
*I
= U
->OperandList
, *E
= U
->OperandList
+U
->NumOperands
;
2376 if (I
->Val
== From
) {
2377 From
->removeUser(U
);
2382 // Now that we have modified U, add it back to the CSE maps. If it already
2383 // exists there, recursively merge the results together.
2384 if (SDNode
*Existing
= AddNonLeafNodeToCSEMaps(U
)) {
2385 ReplaceAllUsesWith(U
, Existing
, Deleted
);
2387 if (Deleted
) Deleted
->push_back(U
);
2388 DeleteNodeNotInCSEMaps(U
);
2393 /// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead.
2394 /// This can cause recursive merging of nodes in the DAG.
2396 /// This version assumes From/To have matching types and numbers of result
2399 void SelectionDAG::ReplaceAllUsesWith(SDNode
*From
, SDNode
*To
,
2400 std::vector
<SDNode
*> *Deleted
) {
2401 assert(From
!= To
&& "Cannot replace uses of with self");
2402 assert(From
->getNumValues() == To
->getNumValues() &&
2403 "Cannot use this version of ReplaceAllUsesWith!");
2404 if (From
->getNumValues() == 1) { // If possible, use the faster version.
2405 ReplaceAllUsesWith(SDOperand(From
, 0), SDOperand(To
, 0), Deleted
);
2409 while (!From
->use_empty()) {
2410 // Process users until they are all gone.
2411 SDNode
*U
= *From
->use_begin();
2413 // This node is about to morph, remove its old self from the CSE maps.
2414 RemoveNodeFromCSEMaps(U
);
2416 for (SDOperand
*I
= U
->OperandList
, *E
= U
->OperandList
+U
->NumOperands
;
2418 if (I
->Val
== From
) {
2419 From
->removeUser(U
);
2424 // Now that we have modified U, add it back to the CSE maps. If it already
2425 // exists there, recursively merge the results together.
2426 if (SDNode
*Existing
= AddNonLeafNodeToCSEMaps(U
)) {
2427 ReplaceAllUsesWith(U
, Existing
, Deleted
);
2429 if (Deleted
) Deleted
->push_back(U
);
2430 DeleteNodeNotInCSEMaps(U
);
2435 /// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead.
2436 /// This can cause recursive merging of nodes in the DAG.
2438 /// This version can replace From with any result values. To must match the
2439 /// number and types of values returned by From.
2440 void SelectionDAG::ReplaceAllUsesWith(SDNode
*From
,
2441 const SDOperand
*To
,
2442 std::vector
<SDNode
*> *Deleted
) {
2443 if (From
->getNumValues() == 1 && To
[0].Val
->getNumValues() == 1) {
2444 // Degenerate case handled above.
2445 ReplaceAllUsesWith(SDOperand(From
, 0), To
[0], Deleted
);
2449 while (!From
->use_empty()) {
2450 // Process users until they are all gone.
2451 SDNode
*U
= *From
->use_begin();
2453 // This node is about to morph, remove its old self from the CSE maps.
2454 RemoveNodeFromCSEMaps(U
);
2456 for (SDOperand
*I
= U
->OperandList
, *E
= U
->OperandList
+U
->NumOperands
;
2458 if (I
->Val
== From
) {
2459 const SDOperand
&ToOp
= To
[I
->ResNo
];
2460 From
->removeUser(U
);
2462 ToOp
.Val
->addUser(U
);
2465 // Now that we have modified U, add it back to the CSE maps. If it already
2466 // exists there, recursively merge the results together.
2467 if (SDNode
*Existing
= AddNonLeafNodeToCSEMaps(U
)) {
2468 ReplaceAllUsesWith(U
, Existing
, Deleted
);
2470 if (Deleted
) Deleted
->push_back(U
);
2471 DeleteNodeNotInCSEMaps(U
);
2476 /// ReplaceAllUsesOfValueWith - Replace any uses of From with To, leaving
2477 /// uses of other values produced by From.Val alone. The Deleted vector is
2478 /// handled the same was as for ReplaceAllUsesWith.
2479 void SelectionDAG::ReplaceAllUsesOfValueWith(SDOperand From
, SDOperand To
,
2480 std::vector
<SDNode
*> &Deleted
) {
2481 assert(From
!= To
&& "Cannot replace a value with itself");
2482 // Handle the simple, trivial, case efficiently.
2483 if (From
.Val
->getNumValues() == 1 && To
.Val
->getNumValues() == 1) {
2484 ReplaceAllUsesWith(From
, To
, &Deleted
);
2488 // Get all of the users of From.Val. We want these in a nice,
2489 // deterministically ordered and uniqued set, so we use a SmallSetVector.
2490 SmallSetVector
<SDNode
*, 16> Users(From
.Val
->use_begin(), From
.Val
->use_end());
2492 while (!Users
.empty()) {
2493 // We know that this user uses some value of From. If it is the right
2494 // value, update it.
2495 SDNode
*User
= Users
.back();
2498 for (SDOperand
*Op
= User
->OperandList
,
2499 *E
= User
->OperandList
+User
->NumOperands
; Op
!= E
; ++Op
) {
2501 // Okay, we know this user needs to be updated. Remove its old self
2502 // from the CSE maps.
2503 RemoveNodeFromCSEMaps(User
);
2505 // Update all operands that match "From".
2506 for (; Op
!= E
; ++Op
) {
2508 From
.Val
->removeUser(User
);
2510 To
.Val
->addUser(User
);
2514 // Now that we have modified User, add it back to the CSE maps. If it
2515 // already exists there, recursively merge the results together.
2516 if (SDNode
*Existing
= AddNonLeafNodeToCSEMaps(User
)) {
2517 unsigned NumDeleted
= Deleted
.size();
2518 ReplaceAllUsesWith(User
, Existing
, &Deleted
);
2520 // User is now dead.
2521 Deleted
.push_back(User
);
2522 DeleteNodeNotInCSEMaps(User
);
2524 // We have to be careful here, because ReplaceAllUsesWith could have
2525 // deleted a user of From, which means there may be dangling pointers
2526 // in the "Users" setvector. Scan over the deleted node pointers and
2527 // remove them from the setvector.
2528 for (unsigned i
= NumDeleted
, e
= Deleted
.size(); i
!= e
; ++i
)
2529 Users
.remove(Deleted
[i
]);
2531 break; // Exit the operand scanning loop.
2538 /// AssignNodeIds - Assign a unique node id for each node in the DAG based on
2539 /// their allnodes order. It returns the maximum id.
2540 unsigned SelectionDAG::AssignNodeIds() {
2542 for (allnodes_iterator I
= allnodes_begin(), E
= allnodes_end(); I
!= E
; ++I
){
2549 /// AssignTopologicalOrder - Assign a unique node id for each node in the DAG
2550 /// based on their topological order. It returns the maximum id and a vector
2551 /// of the SDNodes* in assigned order by reference.
2552 unsigned SelectionDAG::AssignTopologicalOrder(std::vector
<SDNode
*> &TopOrder
) {
2553 unsigned DAGSize
= AllNodes
.size();
2554 std::vector
<unsigned> InDegree(DAGSize
);
2555 std::vector
<SDNode
*> Sources
;
2557 // Use a two pass approach to avoid using a std::map which is slow.
2559 for (allnodes_iterator I
= allnodes_begin(),E
= allnodes_end(); I
!= E
; ++I
){
2562 unsigned Degree
= N
->use_size();
2563 InDegree
[N
->getNodeId()] = Degree
;
2565 Sources
.push_back(N
);
2569 while (!Sources
.empty()) {
2570 SDNode
*N
= Sources
.back();
2572 TopOrder
.push_back(N
);
2573 for (SDNode::op_iterator I
= N
->op_begin(), E
= N
->op_end(); I
!= E
; ++I
) {
2575 unsigned Degree
= --InDegree
[P
->getNodeId()];
2577 Sources
.push_back(P
);
2581 // Second pass, assign the actual topological order as node ids.
2583 for (std::vector
<SDNode
*>::iterator TI
= TopOrder
.begin(),TE
= TopOrder
.end();
2585 (*TI
)->setNodeId(Id
++);
2592 //===----------------------------------------------------------------------===//
2594 //===----------------------------------------------------------------------===//
2596 // Out-of-line virtual method to give class a home.
2597 void SDNode::ANCHOR() {}
2598 void UnarySDNode::ANCHOR() {}
2599 void BinarySDNode::ANCHOR() {}
2600 void TernarySDNode::ANCHOR() {}
2601 void HandleSDNode::ANCHOR() {}
2602 void StringSDNode::ANCHOR() {}
2603 void ConstantSDNode::ANCHOR() {}
2604 void ConstantFPSDNode::ANCHOR() {}
2605 void GlobalAddressSDNode::ANCHOR() {}
2606 void FrameIndexSDNode::ANCHOR() {}
2607 void JumpTableSDNode::ANCHOR() {}
2608 void ConstantPoolSDNode::ANCHOR() {}
2609 void BasicBlockSDNode::ANCHOR() {}
2610 void SrcValueSDNode::ANCHOR() {}
2611 void RegisterSDNode::ANCHOR() {}
2612 void ExternalSymbolSDNode::ANCHOR() {}
2613 void CondCodeSDNode::ANCHOR() {}
2614 void VTSDNode::ANCHOR() {}
2615 void LoadSDNode::ANCHOR() {}
2616 void StoreSDNode::ANCHOR() {}
2618 HandleSDNode::~HandleSDNode() {
2619 SDVTList VTs
= { 0, 0 };
2620 MorphNodeTo(ISD::HANDLENODE
, VTs
, 0, 0); // Drops operand uses.
2623 GlobalAddressSDNode::GlobalAddressSDNode(bool isTarget
, const GlobalValue
*GA
,
2624 MVT::ValueType VT
, int o
)
2625 : SDNode(isa
<GlobalVariable
>(GA
) &&
2626 dyn_cast
<GlobalVariable
>(GA
)->isThreadLocal() ?
2628 (isTarget
? ISD::TargetGlobalTLSAddress
: ISD::GlobalTLSAddress
) :
2630 (isTarget
? ISD::TargetGlobalAddress
: ISD::GlobalAddress
),
2631 getSDVTList(VT
)), Offset(o
) {
2632 TheGlobal
= const_cast<GlobalValue
*>(GA
);
2635 /// Profile - Gather unique data for the node.
2637 void SDNode::Profile(FoldingSetNodeID
&ID
) {
2638 AddNodeIDNode(ID
, this);
2641 /// getValueTypeList - Return a pointer to the specified value type.
2643 MVT::ValueType
*SDNode::getValueTypeList(MVT::ValueType VT
) {
2644 static MVT::ValueType VTs
[MVT::LAST_VALUETYPE
];
2649 /// hasNUsesOfValue - Return true if there are exactly NUSES uses of the
2650 /// indicated value. This method ignores uses of other values defined by this
2652 bool SDNode::hasNUsesOfValue(unsigned NUses
, unsigned Value
) const {
2653 assert(Value
< getNumValues() && "Bad value!");
2655 // If there is only one value, this is easy.
2656 if (getNumValues() == 1)
2657 return use_size() == NUses
;
2658 if (Uses
.size() < NUses
) return false;
2660 SDOperand
TheValue(const_cast<SDNode
*>(this), Value
);
2662 SmallPtrSet
<SDNode
*, 32> UsersHandled
;
2664 for (SDNode::use_iterator UI
= Uses
.begin(), E
= Uses
.end(); UI
!= E
; ++UI
) {
2666 if (User
->getNumOperands() == 1 ||
2667 UsersHandled
.insert(User
)) // First time we've seen this?
2668 for (unsigned i
= 0, e
= User
->getNumOperands(); i
!= e
; ++i
)
2669 if (User
->getOperand(i
) == TheValue
) {
2671 return false; // too many uses
2676 // Found exactly the right number of uses?
2681 /// isOnlyUse - Return true if this node is the only use of N.
2683 bool SDNode::isOnlyUse(SDNode
*N
) const {
2685 for (SDNode::use_iterator I
= N
->use_begin(), E
= N
->use_end(); I
!= E
; ++I
) {
2696 /// isOperand - Return true if this node is an operand of N.
2698 bool SDOperand::isOperand(SDNode
*N
) const {
2699 for (unsigned i
= 0, e
= N
->getNumOperands(); i
!= e
; ++i
)
2700 if (*this == N
->getOperand(i
))
2705 bool SDNode::isOperand(SDNode
*N
) const {
2706 for (unsigned i
= 0, e
= N
->NumOperands
; i
!= e
; ++i
)
2707 if (this == N
->OperandList
[i
].Val
)
2712 static void findPredecessor(SDNode
*N
, const SDNode
*P
, bool &found
,
2713 SmallPtrSet
<SDNode
*, 32> &Visited
) {
2714 if (found
|| !Visited
.insert(N
))
2717 for (unsigned i
= 0, e
= N
->getNumOperands(); !found
&& i
!= e
; ++i
) {
2718 SDNode
*Op
= N
->getOperand(i
).Val
;
2723 findPredecessor(Op
, P
, found
, Visited
);
2727 /// isPredecessor - Return true if this node is a predecessor of N. This node
2728 /// is either an operand of N or it can be reached by recursively traversing
2729 /// up the operands.
2730 /// NOTE: this is an expensive method. Use it carefully.
2731 bool SDNode::isPredecessor(SDNode
*N
) const {
2732 SmallPtrSet
<SDNode
*, 32> Visited
;
2734 findPredecessor(N
, this, found
, Visited
);
2738 uint64_t SDNode::getConstantOperandVal(unsigned Num
) const {
2739 assert(Num
< NumOperands
&& "Invalid child # of SDNode!");
2740 return cast
<ConstantSDNode
>(OperandList
[Num
])->getValue();
2743 std::string
SDNode::getOperationName(const SelectionDAG
*G
) const {
2744 switch (getOpcode()) {
2746 if (getOpcode() < ISD::BUILTIN_OP_END
)
2747 return "<<Unknown DAG Node>>";
2750 if (const TargetInstrInfo
*TII
= G
->getTarget().getInstrInfo())
2751 if (getOpcode()-ISD::BUILTIN_OP_END
< TII
->getNumOpcodes())
2752 return TII
->getName(getOpcode()-ISD::BUILTIN_OP_END
);
2754 TargetLowering
&TLI
= G
->getTargetLoweringInfo();
2756 TLI
.getTargetNodeName(getOpcode());
2757 if (Name
) return Name
;
2760 return "<<Unknown Target Node>>";
2763 case ISD::PCMARKER
: return "PCMarker";
2764 case ISD::READCYCLECOUNTER
: return "ReadCycleCounter";
2765 case ISD::SRCVALUE
: return "SrcValue";
2766 case ISD::EntryToken
: return "EntryToken";
2767 case ISD::TokenFactor
: return "TokenFactor";
2768 case ISD::AssertSext
: return "AssertSext";
2769 case ISD::AssertZext
: return "AssertZext";
2771 case ISD::STRING
: return "String";
2772 case ISD::BasicBlock
: return "BasicBlock";
2773 case ISD::VALUETYPE
: return "ValueType";
2774 case ISD::Register
: return "Register";
2776 case ISD::Constant
: return "Constant";
2777 case ISD::ConstantFP
: return "ConstantFP";
2778 case ISD::GlobalAddress
: return "GlobalAddress";
2779 case ISD::GlobalTLSAddress
: return "GlobalTLSAddress";
2780 case ISD::FrameIndex
: return "FrameIndex";
2781 case ISD::JumpTable
: return "JumpTable";
2782 case ISD::GLOBAL_OFFSET_TABLE
: return "GLOBAL_OFFSET_TABLE";
2783 case ISD::RETURNADDR
: return "RETURNADDR";
2784 case ISD::FRAMEADDR
: return "FRAMEADDR";
2785 case ISD::EXCEPTIONADDR
: return "EXCEPTIONADDR";
2786 case ISD::EHSELECTION
: return "EHSELECTION";
2787 case ISD::ConstantPool
: return "ConstantPool";
2788 case ISD::ExternalSymbol
: return "ExternalSymbol";
2789 case ISD::INTRINSIC_WO_CHAIN
: {
2790 unsigned IID
= cast
<ConstantSDNode
>(getOperand(0))->getValue();
2791 return Intrinsic::getName((Intrinsic::ID
)IID
);
2793 case ISD::INTRINSIC_VOID
:
2794 case ISD::INTRINSIC_W_CHAIN
: {
2795 unsigned IID
= cast
<ConstantSDNode
>(getOperand(1))->getValue();
2796 return Intrinsic::getName((Intrinsic::ID
)IID
);
2799 case ISD::BUILD_VECTOR
: return "BUILD_VECTOR";
2800 case ISD::TargetConstant
: return "TargetConstant";
2801 case ISD::TargetConstantFP
:return "TargetConstantFP";
2802 case ISD::TargetGlobalAddress
: return "TargetGlobalAddress";
2803 case ISD::TargetGlobalTLSAddress
: return "TargetGlobalTLSAddress";
2804 case ISD::TargetFrameIndex
: return "TargetFrameIndex";
2805 case ISD::TargetJumpTable
: return "TargetJumpTable";
2806 case ISD::TargetConstantPool
: return "TargetConstantPool";
2807 case ISD::TargetExternalSymbol
: return "TargetExternalSymbol";
2809 case ISD::CopyToReg
: return "CopyToReg";
2810 case ISD::CopyFromReg
: return "CopyFromReg";
2811 case ISD::UNDEF
: return "undef";
2812 case ISD::MERGE_VALUES
: return "mergevalues";
2813 case ISD::INLINEASM
: return "inlineasm";
2814 case ISD::LABEL
: return "label";
2815 case ISD::HANDLENODE
: return "handlenode";
2816 case ISD::FORMAL_ARGUMENTS
: return "formal_arguments";
2817 case ISD::CALL
: return "call";
2820 case ISD::FABS
: return "fabs";
2821 case ISD::FNEG
: return "fneg";
2822 case ISD::FSQRT
: return "fsqrt";
2823 case ISD::FSIN
: return "fsin";
2824 case ISD::FCOS
: return "fcos";
2825 case ISD::FPOWI
: return "fpowi";
2828 case ISD::ADD
: return "add";
2829 case ISD::SUB
: return "sub";
2830 case ISD::MUL
: return "mul";
2831 case ISD::MULHU
: return "mulhu";
2832 case ISD::MULHS
: return "mulhs";
2833 case ISD::SDIV
: return "sdiv";
2834 case ISD::UDIV
: return "udiv";
2835 case ISD::SREM
: return "srem";
2836 case ISD::UREM
: return "urem";
2837 case ISD::AND
: return "and";
2838 case ISD::OR
: return "or";
2839 case ISD::XOR
: return "xor";
2840 case ISD::SHL
: return "shl";
2841 case ISD::SRA
: return "sra";
2842 case ISD::SRL
: return "srl";
2843 case ISD::ROTL
: return "rotl";
2844 case ISD::ROTR
: return "rotr";
2845 case ISD::FADD
: return "fadd";
2846 case ISD::FSUB
: return "fsub";
2847 case ISD::FMUL
: return "fmul";
2848 case ISD::FDIV
: return "fdiv";
2849 case ISD::FREM
: return "frem";
2850 case ISD::FCOPYSIGN
: return "fcopysign";
2851 case ISD::VADD
: return "vadd";
2852 case ISD::VSUB
: return "vsub";
2853 case ISD::VMUL
: return "vmul";
2854 case ISD::VSDIV
: return "vsdiv";
2855 case ISD::VUDIV
: return "vudiv";
2856 case ISD::VAND
: return "vand";
2857 case ISD::VOR
: return "vor";
2858 case ISD::VXOR
: return "vxor";
2860 case ISD::SETCC
: return "setcc";
2861 case ISD::SELECT
: return "select";
2862 case ISD::SELECT_CC
: return "select_cc";
2863 case ISD::VSELECT
: return "vselect";
2864 case ISD::INSERT_VECTOR_ELT
: return "insert_vector_elt";
2865 case ISD::VINSERT_VECTOR_ELT
: return "vinsert_vector_elt";
2866 case ISD::EXTRACT_VECTOR_ELT
: return "extract_vector_elt";
2867 case ISD::VEXTRACT_VECTOR_ELT
: return "vextract_vector_elt";
2868 case ISD::VCONCAT_VECTORS
: return "vconcat_vectors";
2869 case ISD::VEXTRACT_SUBVECTOR
: return "vextract_subvector";
2870 case ISD::SCALAR_TO_VECTOR
: return "scalar_to_vector";
2871 case ISD::VBUILD_VECTOR
: return "vbuild_vector";
2872 case ISD::VECTOR_SHUFFLE
: return "vector_shuffle";
2873 case ISD::VVECTOR_SHUFFLE
: return "vvector_shuffle";
2874 case ISD::VBIT_CONVERT
: return "vbit_convert";
2875 case ISD::CARRY_FALSE
: return "carry_false";
2876 case ISD::ADDC
: return "addc";
2877 case ISD::ADDE
: return "adde";
2878 case ISD::SUBC
: return "subc";
2879 case ISD::SUBE
: return "sube";
2880 case ISD::SHL_PARTS
: return "shl_parts";
2881 case ISD::SRA_PARTS
: return "sra_parts";
2882 case ISD::SRL_PARTS
: return "srl_parts";
2884 // Conversion operators.
2885 case ISD::SIGN_EXTEND
: return "sign_extend";
2886 case ISD::ZERO_EXTEND
: return "zero_extend";
2887 case ISD::ANY_EXTEND
: return "any_extend";
2888 case ISD::SIGN_EXTEND_INREG
: return "sign_extend_inreg";
2889 case ISD::TRUNCATE
: return "truncate";
2890 case ISD::FP_ROUND
: return "fp_round";
2891 case ISD::FP_ROUND_INREG
: return "fp_round_inreg";
2892 case ISD::FP_EXTEND
: return "fp_extend";
2894 case ISD::SINT_TO_FP
: return "sint_to_fp";
2895 case ISD::UINT_TO_FP
: return "uint_to_fp";
2896 case ISD::FP_TO_SINT
: return "fp_to_sint";
2897 case ISD::FP_TO_UINT
: return "fp_to_uint";
2898 case ISD::BIT_CONVERT
: return "bit_convert";
2900 // Control flow instructions
2901 case ISD::BR
: return "br";
2902 case ISD::BRIND
: return "brind";
2903 case ISD::BR_JT
: return "br_jt";
2904 case ISD::BRCOND
: return "brcond";
2905 case ISD::BR_CC
: return "br_cc";
2906 case ISD::RET
: return "ret";
2907 case ISD::CALLSEQ_START
: return "callseq_start";
2908 case ISD::CALLSEQ_END
: return "callseq_end";
2911 case ISD::LOAD
: return "load";
2912 case ISD::STORE
: return "store";
2913 case ISD::VLOAD
: return "vload";
2914 case ISD::VAARG
: return "vaarg";
2915 case ISD::VACOPY
: return "vacopy";
2916 case ISD::VAEND
: return "vaend";
2917 case ISD::VASTART
: return "vastart";
2918 case ISD::DYNAMIC_STACKALLOC
: return "dynamic_stackalloc";
2919 case ISD::EXTRACT_ELEMENT
: return "extract_element";
2920 case ISD::BUILD_PAIR
: return "build_pair";
2921 case ISD::STACKSAVE
: return "stacksave";
2922 case ISD::STACKRESTORE
: return "stackrestore";
2924 // Block memory operations.
2925 case ISD::MEMSET
: return "memset";
2926 case ISD::MEMCPY
: return "memcpy";
2927 case ISD::MEMMOVE
: return "memmove";
2930 case ISD::BSWAP
: return "bswap";
2931 case ISD::CTPOP
: return "ctpop";
2932 case ISD::CTTZ
: return "cttz";
2933 case ISD::CTLZ
: return "ctlz";
2936 case ISD::LOCATION
: return "location";
2937 case ISD::DEBUG_LOC
: return "debug_loc";
2940 switch (cast
<CondCodeSDNode
>(this)->get()) {
2941 default: assert(0 && "Unknown setcc condition!");
2942 case ISD::SETOEQ
: return "setoeq";
2943 case ISD::SETOGT
: return "setogt";
2944 case ISD::SETOGE
: return "setoge";
2945 case ISD::SETOLT
: return "setolt";
2946 case ISD::SETOLE
: return "setole";
2947 case ISD::SETONE
: return "setone";
2949 case ISD::SETO
: return "seto";
2950 case ISD::SETUO
: return "setuo";
2951 case ISD::SETUEQ
: return "setue";
2952 case ISD::SETUGT
: return "setugt";
2953 case ISD::SETUGE
: return "setuge";
2954 case ISD::SETULT
: return "setult";
2955 case ISD::SETULE
: return "setule";
2956 case ISD::SETUNE
: return "setune";
2958 case ISD::SETEQ
: return "seteq";
2959 case ISD::SETGT
: return "setgt";
2960 case ISD::SETGE
: return "setge";
2961 case ISD::SETLT
: return "setlt";
2962 case ISD::SETLE
: return "setle";
2963 case ISD::SETNE
: return "setne";
2968 const char *SDNode::getIndexedModeName(ISD::MemIndexedMode AM
) {
2977 return "<post-inc>";
2979 return "<post-dec>";
2983 void SDNode::dump() const { dump(0); }
2984 void SDNode::dump(const SelectionDAG
*G
) const {
2985 cerr
<< (void*)this << ": ";
2987 for (unsigned i
= 0, e
= getNumValues(); i
!= e
; ++i
) {
2989 if (getValueType(i
) == MVT::Other
)
2992 cerr
<< MVT::getValueTypeString(getValueType(i
));
2994 cerr
<< " = " << getOperationName(G
);
2997 for (unsigned i
= 0, e
= getNumOperands(); i
!= e
; ++i
) {
2998 if (i
) cerr
<< ", ";
2999 cerr
<< (void*)getOperand(i
).Val
;
3000 if (unsigned RN
= getOperand(i
).ResNo
)
3004 if (const ConstantSDNode
*CSDN
= dyn_cast
<ConstantSDNode
>(this)) {
3005 cerr
<< "<" << CSDN
->getValue() << ">";
3006 } else if (const ConstantFPSDNode
*CSDN
= dyn_cast
<ConstantFPSDNode
>(this)) {
3007 cerr
<< "<" << CSDN
->getValue() << ">";
3008 } else if (const GlobalAddressSDNode
*GADN
=
3009 dyn_cast
<GlobalAddressSDNode
>(this)) {
3010 int offset
= GADN
->getOffset();
3012 WriteAsOperand(*cerr
.stream(), GADN
->getGlobal()) << ">";
3014 cerr
<< " + " << offset
;
3016 cerr
<< " " << offset
;
3017 } else if (const FrameIndexSDNode
*FIDN
= dyn_cast
<FrameIndexSDNode
>(this)) {
3018 cerr
<< "<" << FIDN
->getIndex() << ">";
3019 } else if (const JumpTableSDNode
*JTDN
= dyn_cast
<JumpTableSDNode
>(this)) {
3020 cerr
<< "<" << JTDN
->getIndex() << ">";
3021 } else if (const ConstantPoolSDNode
*CP
= dyn_cast
<ConstantPoolSDNode
>(this)){
3022 int offset
= CP
->getOffset();
3023 if (CP
->isMachineConstantPoolEntry())
3024 cerr
<< "<" << *CP
->getMachineCPVal() << ">";
3026 cerr
<< "<" << *CP
->getConstVal() << ">";
3028 cerr
<< " + " << offset
;
3030 cerr
<< " " << offset
;
3031 } else if (const BasicBlockSDNode
*BBDN
= dyn_cast
<BasicBlockSDNode
>(this)) {
3033 const Value
*LBB
= (const Value
*)BBDN
->getBasicBlock()->getBasicBlock();
3035 cerr
<< LBB
->getName() << " ";
3036 cerr
<< (const void*)BBDN
->getBasicBlock() << ">";
3037 } else if (const RegisterSDNode
*R
= dyn_cast
<RegisterSDNode
>(this)) {
3038 if (G
&& R
->getReg() && MRegisterInfo::isPhysicalRegister(R
->getReg())) {
3039 cerr
<< " " <<G
->getTarget().getRegisterInfo()->getName(R
->getReg());
3041 cerr
<< " #" << R
->getReg();
3043 } else if (const ExternalSymbolSDNode
*ES
=
3044 dyn_cast
<ExternalSymbolSDNode
>(this)) {
3045 cerr
<< "'" << ES
->getSymbol() << "'";
3046 } else if (const SrcValueSDNode
*M
= dyn_cast
<SrcValueSDNode
>(this)) {
3048 cerr
<< "<" << M
->getValue() << ":" << M
->getOffset() << ">";
3050 cerr
<< "<null:" << M
->getOffset() << ">";
3051 } else if (const VTSDNode
*N
= dyn_cast
<VTSDNode
>(this)) {
3052 cerr
<< ":" << MVT::getValueTypeString(N
->getVT());
3053 } else if (const LoadSDNode
*LD
= dyn_cast
<LoadSDNode
>(this)) {
3055 switch (LD
->getExtensionType()) {
3056 default: doExt
= false; break;
3058 cerr
<< " <anyext ";
3068 cerr
<< MVT::getValueTypeString(LD
->getLoadedVT()) << ">";
3070 const char *AM
= getIndexedModeName(LD
->getAddressingMode());
3073 } else if (const StoreSDNode
*ST
= dyn_cast
<StoreSDNode
>(this)) {
3074 if (ST
->isTruncatingStore())
3076 << MVT::getValueTypeString(ST
->getStoredVT()) << ">";
3078 const char *AM
= getIndexedModeName(ST
->getAddressingMode());
3084 static void DumpNodes(const SDNode
*N
, unsigned indent
, const SelectionDAG
*G
) {
3085 for (unsigned i
= 0, e
= N
->getNumOperands(); i
!= e
; ++i
)
3086 if (N
->getOperand(i
).Val
->hasOneUse())
3087 DumpNodes(N
->getOperand(i
).Val
, indent
+2, G
);
3089 cerr
<< "\n" << std::string(indent
+2, ' ')
3090 << (void*)N
->getOperand(i
).Val
<< ": <multiple use>";
3093 cerr
<< "\n" << std::string(indent
, ' ');
3097 void SelectionDAG::dump() const {
3098 cerr
<< "SelectionDAG has " << AllNodes
.size() << " nodes:";
3099 std::vector
<const SDNode
*> Nodes
;
3100 for (allnodes_const_iterator I
= allnodes_begin(), E
= allnodes_end();
3104 std::sort(Nodes
.begin(), Nodes
.end());
3106 for (unsigned i
= 0, e
= Nodes
.size(); i
!= e
; ++i
) {
3107 if (!Nodes
[i
]->hasOneUse() && Nodes
[i
] != getRoot().Val
)
3108 DumpNodes(Nodes
[i
], 2, this);
3111 if (getRoot().Val
) DumpNodes(getRoot().Val
, 2, this);
3116 const Type
*ConstantPoolSDNode::getType() const {
3117 if (isMachineConstantPoolEntry())
3118 return Val
.MachineCPVal
->getType();
3119 return Val
.ConstVal
->getType();