1 //===- LegalizeDAG.cpp - Implement SelectionDAG::Legalize -----------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file implements the SelectionDAG::Legalize method.
12 //===----------------------------------------------------------------------===//
14 #include "llvm/ADT/APFloat.h"
15 #include "llvm/ADT/APInt.h"
16 #include "llvm/ADT/ArrayRef.h"
17 #include "llvm/ADT/SetVector.h"
18 #include "llvm/ADT/SmallPtrSet.h"
19 #include "llvm/ADT/SmallSet.h"
20 #include "llvm/ADT/SmallVector.h"
21 #include "llvm/CodeGen/ISDOpcodes.h"
22 #include "llvm/CodeGen/MachineFunction.h"
23 #include "llvm/CodeGen/MachineJumpTableInfo.h"
24 #include "llvm/CodeGen/MachineMemOperand.h"
25 #include "llvm/CodeGen/RuntimeLibcalls.h"
26 #include "llvm/CodeGen/SelectionDAG.h"
27 #include "llvm/CodeGen/SelectionDAGNodes.h"
28 #include "llvm/CodeGen/TargetFrameLowering.h"
29 #include "llvm/CodeGen/TargetLowering.h"
30 #include "llvm/CodeGen/TargetSubtargetInfo.h"
31 #include "llvm/CodeGen/ValueTypes.h"
32 #include "llvm/IR/CallingConv.h"
33 #include "llvm/IR/Constants.h"
34 #include "llvm/IR/DataLayout.h"
35 #include "llvm/IR/DerivedTypes.h"
36 #include "llvm/IR/Function.h"
37 #include "llvm/IR/Metadata.h"
38 #include "llvm/IR/Type.h"
39 #include "llvm/Support/Casting.h"
40 #include "llvm/Support/Compiler.h"
41 #include "llvm/Support/Debug.h"
42 #include "llvm/Support/ErrorHandling.h"
43 #include "llvm/Support/MachineValueType.h"
44 #include "llvm/Support/MathExtras.h"
45 #include "llvm/Support/raw_ostream.h"
46 #include "llvm/Target/TargetMachine.h"
47 #include "llvm/Target/TargetOptions.h"
56 #define DEBUG_TYPE "legalizedag"
60 /// Keeps track of state when getting the sign of a floating-point value as an
62 struct FloatSignAsInt
{
67 MachinePointerInfo IntPointerInfo
;
68 MachinePointerInfo FloatPointerInfo
;
74 //===----------------------------------------------------------------------===//
75 /// This takes an arbitrary SelectionDAG as input and
76 /// hacks on it until the target machine can handle it. This involves
77 /// eliminating value sizes the machine cannot handle (promoting small sizes to
78 /// large sizes or splitting up large values into small values) as well as
79 /// eliminating operations the machine cannot handle.
81 /// This code also does a small amount of optimization and recognition of idioms
82 /// as part of its processing. For example, if a target does not support a
83 /// 'setcc' instruction efficiently, but does support 'brcc' instruction, this
84 /// will attempt merge setcc and brc instructions into brcc's.
85 class SelectionDAGLegalize
{
86 const TargetMachine
&TM
;
87 const TargetLowering
&TLI
;
90 /// The set of nodes which have already been legalized. We hold a
91 /// reference to it in order to update as necessary on node deletion.
92 SmallPtrSetImpl
<SDNode
*> &LegalizedNodes
;
94 /// A set of all the nodes updated during legalization.
95 SmallSetVector
<SDNode
*, 16> *UpdatedNodes
;
97 EVT
getSetCCResultType(EVT VT
) const {
98 return TLI
.getSetCCResultType(DAG
.getDataLayout(), *DAG
.getContext(), VT
);
101 // Libcall insertion helpers.
104 SelectionDAGLegalize(SelectionDAG
&DAG
,
105 SmallPtrSetImpl
<SDNode
*> &LegalizedNodes
,
106 SmallSetVector
<SDNode
*, 16> *UpdatedNodes
= nullptr)
107 : TM(DAG
.getTarget()), TLI(DAG
.getTargetLoweringInfo()), DAG(DAG
),
108 LegalizedNodes(LegalizedNodes
), UpdatedNodes(UpdatedNodes
) {}
110 /// Legalizes the given operation.
111 void LegalizeOp(SDNode
*Node
);
114 SDValue
OptimizeFloatStore(StoreSDNode
*ST
);
116 void LegalizeLoadOps(SDNode
*Node
);
117 void LegalizeStoreOps(SDNode
*Node
);
119 /// Some targets cannot handle a variable
120 /// insertion index for the INSERT_VECTOR_ELT instruction. In this case, it
121 /// is necessary to spill the vector being inserted into to memory, perform
122 /// the insert there, and then read the result back.
123 SDValue
PerformInsertVectorEltInMemory(SDValue Vec
, SDValue Val
, SDValue Idx
,
125 SDValue
ExpandINSERT_VECTOR_ELT(SDValue Vec
, SDValue Val
, SDValue Idx
,
128 /// Return a vector shuffle operation which
129 /// performs the same shuffe in terms of order or result bytes, but on a type
130 /// whose vector element type is narrower than the original shuffle type.
131 /// e.g. <v4i32> <0, 1, 0, 1> -> v8i16 <0, 1, 2, 3, 0, 1, 2, 3>
132 SDValue
ShuffleWithNarrowerEltType(EVT NVT
, EVT VT
, const SDLoc
&dl
,
133 SDValue N1
, SDValue N2
,
134 ArrayRef
<int> Mask
) const;
136 bool LegalizeSetCCCondCode(EVT VT
, SDValue
&LHS
, SDValue
&RHS
, SDValue
&CC
,
137 bool &NeedInvert
, const SDLoc
&dl
);
139 SDValue
ExpandLibCall(RTLIB::Libcall LC
, SDNode
*Node
, bool isSigned
);
140 SDValue
ExpandLibCall(RTLIB::Libcall LC
, EVT RetVT
, const SDValue
*Ops
,
141 unsigned NumOps
, bool isSigned
, const SDLoc
&dl
);
143 std::pair
<SDValue
, SDValue
> ExpandChainLibCall(RTLIB::Libcall LC
,
144 SDNode
*Node
, bool isSigned
);
145 SDValue
ExpandFPLibCall(SDNode
*Node
, RTLIB::Libcall Call_F32
,
146 RTLIB::Libcall Call_F64
, RTLIB::Libcall Call_F80
,
147 RTLIB::Libcall Call_F128
,
148 RTLIB::Libcall Call_PPCF128
);
149 SDValue
ExpandIntLibCall(SDNode
*Node
, bool isSigned
,
150 RTLIB::Libcall Call_I8
,
151 RTLIB::Libcall Call_I16
,
152 RTLIB::Libcall Call_I32
,
153 RTLIB::Libcall Call_I64
,
154 RTLIB::Libcall Call_I128
);
155 void ExpandDivRemLibCall(SDNode
*Node
, SmallVectorImpl
<SDValue
> &Results
);
156 void ExpandSinCosLibCall(SDNode
*Node
, SmallVectorImpl
<SDValue
> &Results
);
158 SDValue
EmitStackConvert(SDValue SrcOp
, EVT SlotVT
, EVT DestVT
,
160 SDValue
ExpandBUILD_VECTOR(SDNode
*Node
);
161 SDValue
ExpandSCALAR_TO_VECTOR(SDNode
*Node
);
162 void ExpandDYNAMIC_STACKALLOC(SDNode
*Node
,
163 SmallVectorImpl
<SDValue
> &Results
);
164 void getSignAsIntValue(FloatSignAsInt
&State
, const SDLoc
&DL
,
165 SDValue Value
) const;
166 SDValue
modifySignAsInt(const FloatSignAsInt
&State
, const SDLoc
&DL
,
167 SDValue NewIntValue
) const;
168 SDValue
ExpandFCOPYSIGN(SDNode
*Node
) const;
169 SDValue
ExpandFABS(SDNode
*Node
) const;
170 SDValue
ExpandLegalINT_TO_FP(bool isSigned
, SDValue Op0
, EVT DestVT
,
172 SDValue
PromoteLegalINT_TO_FP(SDValue LegalOp
, EVT DestVT
, bool isSigned
,
174 SDValue
PromoteLegalFP_TO_INT(SDValue LegalOp
, EVT DestVT
, bool isSigned
,
177 SDValue
ExpandBITREVERSE(SDValue Op
, const SDLoc
&dl
);
178 SDValue
ExpandBSWAP(SDValue Op
, const SDLoc
&dl
);
179 SDValue
ExpandBitCount(unsigned Opc
, SDValue Op
, const SDLoc
&dl
);
181 SDValue
ExpandExtractFromVectorThroughStack(SDValue Op
);
182 SDValue
ExpandInsertToVectorThroughStack(SDValue Op
);
183 SDValue
ExpandVectorBuildThroughStack(SDNode
* Node
);
185 SDValue
ExpandConstantFP(ConstantFPSDNode
*CFP
, bool UseCP
);
186 SDValue
ExpandConstant(ConstantSDNode
*CP
);
188 // if ExpandNode returns false, LegalizeOp falls back to ConvertNodeToLibcall
189 bool ExpandNode(SDNode
*Node
);
190 void ConvertNodeToLibcall(SDNode
*Node
);
191 void PromoteNode(SDNode
*Node
);
194 // Node replacement helpers
196 void ReplacedNode(SDNode
*N
) {
197 LegalizedNodes
.erase(N
);
199 UpdatedNodes
->insert(N
);
202 void ReplaceNode(SDNode
*Old
, SDNode
*New
) {
203 LLVM_DEBUG(dbgs() << " ... replacing: "; Old
->dump(&DAG
);
204 dbgs() << " with: "; New
->dump(&DAG
));
206 assert(Old
->getNumValues() == New
->getNumValues() &&
207 "Replacing one node with another that produces a different number "
209 DAG
.ReplaceAllUsesWith(Old
, New
);
211 UpdatedNodes
->insert(New
);
215 void ReplaceNode(SDValue Old
, SDValue New
) {
216 LLVM_DEBUG(dbgs() << " ... replacing: "; Old
->dump(&DAG
);
217 dbgs() << " with: "; New
->dump(&DAG
));
219 DAG
.ReplaceAllUsesWith(Old
, New
);
221 UpdatedNodes
->insert(New
.getNode());
222 ReplacedNode(Old
.getNode());
225 void ReplaceNode(SDNode
*Old
, const SDValue
*New
) {
226 LLVM_DEBUG(dbgs() << " ... replacing: "; Old
->dump(&DAG
));
228 DAG
.ReplaceAllUsesWith(Old
, New
);
229 for (unsigned i
= 0, e
= Old
->getNumValues(); i
!= e
; ++i
) {
230 LLVM_DEBUG(dbgs() << (i
== 0 ? " with: " : " and: ");
233 UpdatedNodes
->insert(New
[i
].getNode());
239 } // end anonymous namespace
241 /// Return a vector shuffle operation which
242 /// performs the same shuffe in terms of order or result bytes, but on a type
243 /// whose vector element type is narrower than the original shuffle type.
244 /// e.g. <v4i32> <0, 1, 0, 1> -> v8i16 <0, 1, 2, 3, 0, 1, 2, 3>
245 SDValue
SelectionDAGLegalize::ShuffleWithNarrowerEltType(
246 EVT NVT
, EVT VT
, const SDLoc
&dl
, SDValue N1
, SDValue N2
,
247 ArrayRef
<int> Mask
) const {
248 unsigned NumMaskElts
= VT
.getVectorNumElements();
249 unsigned NumDestElts
= NVT
.getVectorNumElements();
250 unsigned NumEltsGrowth
= NumDestElts
/ NumMaskElts
;
252 assert(NumEltsGrowth
&& "Cannot promote to vector type with fewer elts!");
254 if (NumEltsGrowth
== 1)
255 return DAG
.getVectorShuffle(NVT
, dl
, N1
, N2
, Mask
);
257 SmallVector
<int, 8> NewMask
;
258 for (unsigned i
= 0; i
!= NumMaskElts
; ++i
) {
260 for (unsigned j
= 0; j
!= NumEltsGrowth
; ++j
) {
262 NewMask
.push_back(-1);
264 NewMask
.push_back(Idx
* NumEltsGrowth
+ j
);
267 assert(NewMask
.size() == NumDestElts
&& "Non-integer NumEltsGrowth?");
268 assert(TLI
.isShuffleMaskLegal(NewMask
, NVT
) && "Shuffle not legal?");
269 return DAG
.getVectorShuffle(NVT
, dl
, N1
, N2
, NewMask
);
272 /// Expands the ConstantFP node to an integer constant or
273 /// a load from the constant pool.
275 SelectionDAGLegalize::ExpandConstantFP(ConstantFPSDNode
*CFP
, bool UseCP
) {
279 // If a FP immediate is precise when represented as a float and if the
280 // target can do an extending load from float to double, we put it into
281 // the constant pool as a float, even if it's is statically typed as a
282 // double. This shrinks FP constants and canonicalizes them for targets where
283 // an FP extending load is the same cost as a normal load (such as on the x87
284 // fp stack or PPC FP unit).
285 EVT VT
= CFP
->getValueType(0);
286 ConstantFP
*LLVMC
= const_cast<ConstantFP
*>(CFP
->getConstantFPValue());
288 assert((VT
== MVT::f64
|| VT
== MVT::f32
) && "Invalid type expansion");
289 return DAG
.getConstant(LLVMC
->getValueAPF().bitcastToAPInt(), dl
,
290 (VT
== MVT::f64
) ? MVT::i64
: MVT::i32
);
293 APFloat APF
= CFP
->getValueAPF();
297 // We don't want to shrink SNaNs. Converting the SNaN back to its real type
298 // can cause it to be changed into a QNaN on some platforms (e.g. on SystemZ).
299 if (!APF
.isSignaling()) {
300 while (SVT
!= MVT::f32
&& SVT
!= MVT::f16
) {
301 SVT
= (MVT::SimpleValueType
)(SVT
.getSimpleVT().SimpleTy
- 1);
302 if (ConstantFPSDNode::isValueValidForType(SVT
, APF
) &&
303 // Only do this if the target has a native EXTLOAD instruction from
305 TLI
.isLoadExtLegal(ISD::EXTLOAD
, OrigVT
, SVT
) &&
306 TLI
.ShouldShrinkFPConstant(OrigVT
)) {
307 Type
*SType
= SVT
.getTypeForEVT(*DAG
.getContext());
308 LLVMC
= cast
<ConstantFP
>(ConstantExpr::getFPTrunc(LLVMC
, SType
));
316 DAG
.getConstantPool(LLVMC
, TLI
.getPointerTy(DAG
.getDataLayout()));
317 unsigned Alignment
= cast
<ConstantPoolSDNode
>(CPIdx
)->getAlignment();
319 SDValue Result
= DAG
.getExtLoad(
320 ISD::EXTLOAD
, dl
, OrigVT
, DAG
.getEntryNode(), CPIdx
,
321 MachinePointerInfo::getConstantPool(DAG
.getMachineFunction()), VT
,
325 SDValue Result
= DAG
.getLoad(
326 OrigVT
, dl
, DAG
.getEntryNode(), CPIdx
,
327 MachinePointerInfo::getConstantPool(DAG
.getMachineFunction()), Alignment
);
331 /// Expands the Constant node to a load from the constant pool.
332 SDValue
SelectionDAGLegalize::ExpandConstant(ConstantSDNode
*CP
) {
334 EVT VT
= CP
->getValueType(0);
335 SDValue CPIdx
= DAG
.getConstantPool(CP
->getConstantIntValue(),
336 TLI
.getPointerTy(DAG
.getDataLayout()));
337 unsigned Alignment
= cast
<ConstantPoolSDNode
>(CPIdx
)->getAlignment();
338 SDValue Result
= DAG
.getLoad(
339 VT
, dl
, DAG
.getEntryNode(), CPIdx
,
340 MachinePointerInfo::getConstantPool(DAG
.getMachineFunction()), Alignment
);
344 /// Some target cannot handle a variable insertion index for the
345 /// INSERT_VECTOR_ELT instruction. In this case, it
346 /// is necessary to spill the vector being inserted into to memory, perform
347 /// the insert there, and then read the result back.
348 SDValue
SelectionDAGLegalize::PerformInsertVectorEltInMemory(SDValue Vec
,
356 // If the target doesn't support this, we have to spill the input vector
357 // to a temporary stack slot, update the element, then reload it. This is
358 // badness. We could also load the value into a vector register (either
359 // with a "move to register" or "extload into register" instruction, then
360 // permute it into place, if the idx is a constant and if the idx is
361 // supported by the target.
362 EVT VT
= Tmp1
.getValueType();
363 EVT EltVT
= VT
.getVectorElementType();
364 SDValue StackPtr
= DAG
.CreateStackTemporary(VT
);
366 int SPFI
= cast
<FrameIndexSDNode
>(StackPtr
.getNode())->getIndex();
369 SDValue Ch
= DAG
.getStore(
370 DAG
.getEntryNode(), dl
, Tmp1
, StackPtr
,
371 MachinePointerInfo::getFixedStack(DAG
.getMachineFunction(), SPFI
));
373 SDValue StackPtr2
= TLI
.getVectorElementPointer(DAG
, StackPtr
, VT
, Tmp3
);
375 // Store the scalar value.
376 Ch
= DAG
.getTruncStore(Ch
, dl
, Tmp2
, StackPtr2
, MachinePointerInfo(), EltVT
);
377 // Load the updated vector.
378 return DAG
.getLoad(VT
, dl
, Ch
, StackPtr
, MachinePointerInfo::getFixedStack(
379 DAG
.getMachineFunction(), SPFI
));
382 SDValue
SelectionDAGLegalize::ExpandINSERT_VECTOR_ELT(SDValue Vec
, SDValue Val
,
385 if (ConstantSDNode
*InsertPos
= dyn_cast
<ConstantSDNode
>(Idx
)) {
386 // SCALAR_TO_VECTOR requires that the type of the value being inserted
387 // match the element type of the vector being created, except for
388 // integers in which case the inserted value can be over width.
389 EVT EltVT
= Vec
.getValueType().getVectorElementType();
390 if (Val
.getValueType() == EltVT
||
391 (EltVT
.isInteger() && Val
.getValueType().bitsGE(EltVT
))) {
392 SDValue ScVec
= DAG
.getNode(ISD::SCALAR_TO_VECTOR
, dl
,
393 Vec
.getValueType(), Val
);
395 unsigned NumElts
= Vec
.getValueType().getVectorNumElements();
396 // We generate a shuffle of InVec and ScVec, so the shuffle mask
397 // should be 0,1,2,3,4,5... with the appropriate element replaced with
399 SmallVector
<int, 8> ShufOps
;
400 for (unsigned i
= 0; i
!= NumElts
; ++i
)
401 ShufOps
.push_back(i
!= InsertPos
->getZExtValue() ? i
: NumElts
);
403 return DAG
.getVectorShuffle(Vec
.getValueType(), dl
, Vec
, ScVec
, ShufOps
);
406 return PerformInsertVectorEltInMemory(Vec
, Val
, Idx
, dl
);
409 SDValue
SelectionDAGLegalize::OptimizeFloatStore(StoreSDNode
* ST
) {
410 LLVM_DEBUG(dbgs() << "Optimizing float store operations\n");
411 // Turn 'store float 1.0, Ptr' -> 'store int 0x12345678, Ptr'
412 // FIXME: We shouldn't do this for TargetConstantFP's.
413 // FIXME: move this to the DAG Combiner! Note that we can't regress due
414 // to phase ordering between legalized code and the dag combiner. This
415 // probably means that we need to integrate dag combiner and legalizer
417 // We generally can't do this one for long doubles.
418 SDValue Chain
= ST
->getChain();
419 SDValue Ptr
= ST
->getBasePtr();
420 unsigned Alignment
= ST
->getAlignment();
421 MachineMemOperand::Flags MMOFlags
= ST
->getMemOperand()->getFlags();
422 AAMDNodes AAInfo
= ST
->getAAInfo();
424 if (ConstantFPSDNode
*CFP
= dyn_cast
<ConstantFPSDNode
>(ST
->getValue())) {
425 if (CFP
->getValueType(0) == MVT::f32
&&
426 TLI
.isTypeLegal(MVT::i32
)) {
427 SDValue Con
= DAG
.getConstant(CFP
->getValueAPF().
428 bitcastToAPInt().zextOrTrunc(32),
429 SDLoc(CFP
), MVT::i32
);
430 return DAG
.getStore(Chain
, dl
, Con
, Ptr
, ST
->getPointerInfo(), Alignment
,
434 if (CFP
->getValueType(0) == MVT::f64
) {
435 // If this target supports 64-bit registers, do a single 64-bit store.
436 if (TLI
.isTypeLegal(MVT::i64
)) {
437 SDValue Con
= DAG
.getConstant(CFP
->getValueAPF().bitcastToAPInt().
438 zextOrTrunc(64), SDLoc(CFP
), MVT::i64
);
439 return DAG
.getStore(Chain
, dl
, Con
, Ptr
, ST
->getPointerInfo(),
440 Alignment
, MMOFlags
, AAInfo
);
443 if (TLI
.isTypeLegal(MVT::i32
) && !ST
->isVolatile()) {
444 // Otherwise, if the target supports 32-bit registers, use 2 32-bit
445 // stores. If the target supports neither 32- nor 64-bits, this
446 // xform is certainly not worth it.
447 const APInt
&IntVal
= CFP
->getValueAPF().bitcastToAPInt();
448 SDValue Lo
= DAG
.getConstant(IntVal
.trunc(32), dl
, MVT::i32
);
449 SDValue Hi
= DAG
.getConstant(IntVal
.lshr(32).trunc(32), dl
, MVT::i32
);
450 if (DAG
.getDataLayout().isBigEndian())
453 Lo
= DAG
.getStore(Chain
, dl
, Lo
, Ptr
, ST
->getPointerInfo(), Alignment
,
455 Ptr
= DAG
.getNode(ISD::ADD
, dl
, Ptr
.getValueType(), Ptr
,
456 DAG
.getConstant(4, dl
, Ptr
.getValueType()));
457 Hi
= DAG
.getStore(Chain
, dl
, Hi
, Ptr
,
458 ST
->getPointerInfo().getWithOffset(4),
459 MinAlign(Alignment
, 4U), MMOFlags
, AAInfo
);
461 return DAG
.getNode(ISD::TokenFactor
, dl
, MVT::Other
, Lo
, Hi
);
465 return SDValue(nullptr, 0);
468 void SelectionDAGLegalize::LegalizeStoreOps(SDNode
*Node
) {
469 StoreSDNode
*ST
= cast
<StoreSDNode
>(Node
);
470 SDValue Chain
= ST
->getChain();
471 SDValue Ptr
= ST
->getBasePtr();
474 unsigned Alignment
= ST
->getAlignment();
475 MachineMemOperand::Flags MMOFlags
= ST
->getMemOperand()->getFlags();
476 AAMDNodes AAInfo
= ST
->getAAInfo();
478 if (!ST
->isTruncatingStore()) {
479 LLVM_DEBUG(dbgs() << "Legalizing store operation\n");
480 if (SDNode
*OptStore
= OptimizeFloatStore(ST
).getNode()) {
481 ReplaceNode(ST
, OptStore
);
485 SDValue Value
= ST
->getValue();
486 MVT VT
= Value
.getSimpleValueType();
487 switch (TLI
.getOperationAction(ISD::STORE
, VT
)) {
488 default: llvm_unreachable("This action is not supported yet!");
489 case TargetLowering::Legal
: {
490 // If this is an unaligned store and the target doesn't support it,
492 EVT MemVT
= ST
->getMemoryVT();
493 unsigned AS
= ST
->getAddressSpace();
494 unsigned Align
= ST
->getAlignment();
495 const DataLayout
&DL
= DAG
.getDataLayout();
496 if (!TLI
.allowsMemoryAccess(*DAG
.getContext(), DL
, MemVT
, AS
, Align
)) {
497 LLVM_DEBUG(dbgs() << "Expanding unsupported unaligned store\n");
498 SDValue Result
= TLI
.expandUnalignedStore(ST
, DAG
);
499 ReplaceNode(SDValue(ST
, 0), Result
);
501 LLVM_DEBUG(dbgs() << "Legal store\n");
504 case TargetLowering::Custom
: {
505 LLVM_DEBUG(dbgs() << "Trying custom lowering\n");
506 SDValue Res
= TLI
.LowerOperation(SDValue(Node
, 0), DAG
);
507 if (Res
&& Res
!= SDValue(Node
, 0))
508 ReplaceNode(SDValue(Node
, 0), Res
);
511 case TargetLowering::Promote
: {
512 MVT NVT
= TLI
.getTypeToPromoteTo(ISD::STORE
, VT
);
513 assert(NVT
.getSizeInBits() == VT
.getSizeInBits() &&
514 "Can only promote stores to same size type");
515 Value
= DAG
.getNode(ISD::BITCAST
, dl
, NVT
, Value
);
517 DAG
.getStore(Chain
, dl
, Value
, Ptr
, ST
->getPointerInfo(),
518 Alignment
, MMOFlags
, AAInfo
);
519 ReplaceNode(SDValue(Node
, 0), Result
);
526 LLVM_DEBUG(dbgs() << "Legalizing truncating store operations\n");
527 SDValue Value
= ST
->getValue();
528 EVT StVT
= ST
->getMemoryVT();
529 unsigned StWidth
= StVT
.getSizeInBits();
530 auto &DL
= DAG
.getDataLayout();
532 if (StWidth
!= StVT
.getStoreSizeInBits()) {
533 // Promote to a byte-sized store with upper bits zero if not
534 // storing an integral number of bytes. For example, promote
535 // TRUNCSTORE:i1 X -> TRUNCSTORE:i8 (and X, 1)
536 EVT NVT
= EVT::getIntegerVT(*DAG
.getContext(),
537 StVT
.getStoreSizeInBits());
538 Value
= DAG
.getZeroExtendInReg(Value
, dl
, StVT
);
540 DAG
.getTruncStore(Chain
, dl
, Value
, Ptr
, ST
->getPointerInfo(), NVT
,
541 Alignment
, MMOFlags
, AAInfo
);
542 ReplaceNode(SDValue(Node
, 0), Result
);
543 } else if (StWidth
& (StWidth
- 1)) {
544 // If not storing a power-of-2 number of bits, expand as two stores.
545 assert(!StVT
.isVector() && "Unsupported truncstore!");
546 unsigned RoundWidth
= 1 << Log2_32(StWidth
);
547 assert(RoundWidth
< StWidth
);
548 unsigned ExtraWidth
= StWidth
- RoundWidth
;
549 assert(ExtraWidth
< RoundWidth
);
550 assert(!(RoundWidth
% 8) && !(ExtraWidth
% 8) &&
551 "Store size not an integral number of bytes!");
552 EVT RoundVT
= EVT::getIntegerVT(*DAG
.getContext(), RoundWidth
);
553 EVT ExtraVT
= EVT::getIntegerVT(*DAG
.getContext(), ExtraWidth
);
555 unsigned IncrementSize
;
557 if (DL
.isLittleEndian()) {
558 // TRUNCSTORE:i24 X -> TRUNCSTORE:i16 X, TRUNCSTORE@+2:i8 (srl X, 16)
559 // Store the bottom RoundWidth bits.
560 Lo
= DAG
.getTruncStore(Chain
, dl
, Value
, Ptr
, ST
->getPointerInfo(),
561 RoundVT
, Alignment
, MMOFlags
, AAInfo
);
563 // Store the remaining ExtraWidth bits.
564 IncrementSize
= RoundWidth
/ 8;
565 Ptr
= DAG
.getNode(ISD::ADD
, dl
, Ptr
.getValueType(), Ptr
,
566 DAG
.getConstant(IncrementSize
, dl
,
567 Ptr
.getValueType()));
569 ISD::SRL
, dl
, Value
.getValueType(), Value
,
570 DAG
.getConstant(RoundWidth
, dl
,
571 TLI
.getShiftAmountTy(Value
.getValueType(), DL
)));
572 Hi
= DAG
.getTruncStore(
574 ST
->getPointerInfo().getWithOffset(IncrementSize
), ExtraVT
,
575 MinAlign(Alignment
, IncrementSize
), MMOFlags
, AAInfo
);
577 // Big endian - avoid unaligned stores.
578 // TRUNCSTORE:i24 X -> TRUNCSTORE:i16 (srl X, 8), TRUNCSTORE@+2:i8 X
579 // Store the top RoundWidth bits.
581 ISD::SRL
, dl
, Value
.getValueType(), Value
,
582 DAG
.getConstant(ExtraWidth
, dl
,
583 TLI
.getShiftAmountTy(Value
.getValueType(), DL
)));
584 Hi
= DAG
.getTruncStore(Chain
, dl
, Hi
, Ptr
, ST
->getPointerInfo(),
585 RoundVT
, Alignment
, MMOFlags
, AAInfo
);
587 // Store the remaining ExtraWidth bits.
588 IncrementSize
= RoundWidth
/ 8;
589 Ptr
= DAG
.getNode(ISD::ADD
, dl
, Ptr
.getValueType(), Ptr
,
590 DAG
.getConstant(IncrementSize
, dl
,
591 Ptr
.getValueType()));
592 Lo
= DAG
.getTruncStore(
593 Chain
, dl
, Value
, Ptr
,
594 ST
->getPointerInfo().getWithOffset(IncrementSize
), ExtraVT
,
595 MinAlign(Alignment
, IncrementSize
), MMOFlags
, AAInfo
);
598 // The order of the stores doesn't matter.
599 SDValue Result
= DAG
.getNode(ISD::TokenFactor
, dl
, MVT::Other
, Lo
, Hi
);
600 ReplaceNode(SDValue(Node
, 0), Result
);
602 switch (TLI
.getTruncStoreAction(ST
->getValue().getValueType(), StVT
)) {
603 default: llvm_unreachable("This action is not supported yet!");
604 case TargetLowering::Legal
: {
605 EVT MemVT
= ST
->getMemoryVT();
606 unsigned AS
= ST
->getAddressSpace();
607 unsigned Align
= ST
->getAlignment();
608 // If this is an unaligned store and the target doesn't support it,
610 if (!TLI
.allowsMemoryAccess(*DAG
.getContext(), DL
, MemVT
, AS
, Align
)) {
611 SDValue Result
= TLI
.expandUnalignedStore(ST
, DAG
);
612 ReplaceNode(SDValue(ST
, 0), Result
);
616 case TargetLowering::Custom
: {
617 SDValue Res
= TLI
.LowerOperation(SDValue(Node
, 0), DAG
);
618 if (Res
&& Res
!= SDValue(Node
, 0))
619 ReplaceNode(SDValue(Node
, 0), Res
);
622 case TargetLowering::Expand
:
623 assert(!StVT
.isVector() &&
624 "Vector Stores are handled in LegalizeVectorOps");
628 // TRUNCSTORE:i16 i32 -> STORE i16
629 if (TLI
.isTypeLegal(StVT
)) {
630 Value
= DAG
.getNode(ISD::TRUNCATE
, dl
, StVT
, Value
);
631 Result
= DAG
.getStore(Chain
, dl
, Value
, Ptr
, ST
->getPointerInfo(),
632 Alignment
, MMOFlags
, AAInfo
);
634 // The in-memory type isn't legal. Truncate to the type it would promote
635 // to, and then do a truncstore.
636 Value
= DAG
.getNode(ISD::TRUNCATE
, dl
,
637 TLI
.getTypeToTransformTo(*DAG
.getContext(), StVT
),
639 Result
= DAG
.getTruncStore(Chain
, dl
, Value
, Ptr
, ST
->getPointerInfo(),
640 StVT
, Alignment
, MMOFlags
, AAInfo
);
643 ReplaceNode(SDValue(Node
, 0), Result
);
649 void SelectionDAGLegalize::LegalizeLoadOps(SDNode
*Node
) {
650 LoadSDNode
*LD
= cast
<LoadSDNode
>(Node
);
651 SDValue Chain
= LD
->getChain(); // The chain.
652 SDValue Ptr
= LD
->getBasePtr(); // The base pointer.
653 SDValue Value
; // The value returned by the load op.
656 ISD::LoadExtType ExtType
= LD
->getExtensionType();
657 if (ExtType
== ISD::NON_EXTLOAD
) {
658 LLVM_DEBUG(dbgs() << "Legalizing non-extending load operation\n");
659 MVT VT
= Node
->getSimpleValueType(0);
660 SDValue RVal
= SDValue(Node
, 0);
661 SDValue RChain
= SDValue(Node
, 1);
663 switch (TLI
.getOperationAction(Node
->getOpcode(), VT
)) {
664 default: llvm_unreachable("This action is not supported yet!");
665 case TargetLowering::Legal
: {
666 EVT MemVT
= LD
->getMemoryVT();
667 unsigned AS
= LD
->getAddressSpace();
668 unsigned Align
= LD
->getAlignment();
669 const DataLayout
&DL
= DAG
.getDataLayout();
670 // If this is an unaligned load and the target doesn't support it,
672 if (!TLI
.allowsMemoryAccess(*DAG
.getContext(), DL
, MemVT
, AS
, Align
)) {
673 std::tie(RVal
, RChain
) = TLI
.expandUnalignedLoad(LD
, DAG
);
677 case TargetLowering::Custom
:
678 if (SDValue Res
= TLI
.LowerOperation(RVal
, DAG
)) {
680 RChain
= Res
.getValue(1);
684 case TargetLowering::Promote
: {
685 MVT NVT
= TLI
.getTypeToPromoteTo(Node
->getOpcode(), VT
);
686 assert(NVT
.getSizeInBits() == VT
.getSizeInBits() &&
687 "Can only promote loads to same size type");
689 SDValue Res
= DAG
.getLoad(NVT
, dl
, Chain
, Ptr
, LD
->getMemOperand());
690 RVal
= DAG
.getNode(ISD::BITCAST
, dl
, VT
, Res
);
691 RChain
= Res
.getValue(1);
695 if (RChain
.getNode() != Node
) {
696 assert(RVal
.getNode() != Node
&& "Load must be completely replaced");
697 DAG
.ReplaceAllUsesOfValueWith(SDValue(Node
, 0), RVal
);
698 DAG
.ReplaceAllUsesOfValueWith(SDValue(Node
, 1), RChain
);
700 UpdatedNodes
->insert(RVal
.getNode());
701 UpdatedNodes
->insert(RChain
.getNode());
708 LLVM_DEBUG(dbgs() << "Legalizing extending load operation\n");
709 EVT SrcVT
= LD
->getMemoryVT();
710 unsigned SrcWidth
= SrcVT
.getSizeInBits();
711 unsigned Alignment
= LD
->getAlignment();
712 MachineMemOperand::Flags MMOFlags
= LD
->getMemOperand()->getFlags();
713 AAMDNodes AAInfo
= LD
->getAAInfo();
715 if (SrcWidth
!= SrcVT
.getStoreSizeInBits() &&
716 // Some targets pretend to have an i1 loading operation, and actually
717 // load an i8. This trick is correct for ZEXTLOAD because the top 7
718 // bits are guaranteed to be zero; it helps the optimizers understand
719 // that these bits are zero. It is also useful for EXTLOAD, since it
720 // tells the optimizers that those bits are undefined. It would be
721 // nice to have an effective generic way of getting these benefits...
722 // Until such a way is found, don't insist on promoting i1 here.
724 TLI
.getLoadExtAction(ExtType
, Node
->getValueType(0), MVT::i1
) ==
725 TargetLowering::Promote
)) {
726 // Promote to a byte-sized load if not loading an integral number of
727 // bytes. For example, promote EXTLOAD:i20 -> EXTLOAD:i24.
728 unsigned NewWidth
= SrcVT
.getStoreSizeInBits();
729 EVT NVT
= EVT::getIntegerVT(*DAG
.getContext(), NewWidth
);
732 // The extra bits are guaranteed to be zero, since we stored them that
733 // way. A zext load from NVT thus automatically gives zext from SrcVT.
735 ISD::LoadExtType NewExtType
=
736 ExtType
== ISD::ZEXTLOAD
? ISD::ZEXTLOAD
: ISD::EXTLOAD
;
739 DAG
.getExtLoad(NewExtType
, dl
, Node
->getValueType(0), Chain
, Ptr
,
740 LD
->getPointerInfo(), NVT
, Alignment
, MMOFlags
, AAInfo
);
742 Ch
= Result
.getValue(1); // The chain.
744 if (ExtType
== ISD::SEXTLOAD
)
745 // Having the top bits zero doesn't help when sign extending.
746 Result
= DAG
.getNode(ISD::SIGN_EXTEND_INREG
, dl
,
747 Result
.getValueType(),
748 Result
, DAG
.getValueType(SrcVT
));
749 else if (ExtType
== ISD::ZEXTLOAD
|| NVT
== Result
.getValueType())
750 // All the top bits are guaranteed to be zero - inform the optimizers.
751 Result
= DAG
.getNode(ISD::AssertZext
, dl
,
752 Result
.getValueType(), Result
,
753 DAG
.getValueType(SrcVT
));
757 } else if (SrcWidth
& (SrcWidth
- 1)) {
758 // If not loading a power-of-2 number of bits, expand as two loads.
759 assert(!SrcVT
.isVector() && "Unsupported extload!");
760 unsigned RoundWidth
= 1 << Log2_32(SrcWidth
);
761 assert(RoundWidth
< SrcWidth
);
762 unsigned ExtraWidth
= SrcWidth
- RoundWidth
;
763 assert(ExtraWidth
< RoundWidth
);
764 assert(!(RoundWidth
% 8) && !(ExtraWidth
% 8) &&
765 "Load size not an integral number of bytes!");
766 EVT RoundVT
= EVT::getIntegerVT(*DAG
.getContext(), RoundWidth
);
767 EVT ExtraVT
= EVT::getIntegerVT(*DAG
.getContext(), ExtraWidth
);
769 unsigned IncrementSize
;
770 auto &DL
= DAG
.getDataLayout();
772 if (DL
.isLittleEndian()) {
773 // EXTLOAD:i24 -> ZEXTLOAD:i16 | (shl EXTLOAD@+2:i8, 16)
774 // Load the bottom RoundWidth bits.
775 Lo
= DAG
.getExtLoad(ISD::ZEXTLOAD
, dl
, Node
->getValueType(0), Chain
, Ptr
,
776 LD
->getPointerInfo(), RoundVT
, Alignment
, MMOFlags
,
779 // Load the remaining ExtraWidth bits.
780 IncrementSize
= RoundWidth
/ 8;
781 Ptr
= DAG
.getNode(ISD::ADD
, dl
, Ptr
.getValueType(), Ptr
,
782 DAG
.getConstant(IncrementSize
, dl
,
783 Ptr
.getValueType()));
784 Hi
= DAG
.getExtLoad(ExtType
, dl
, Node
->getValueType(0), Chain
, Ptr
,
785 LD
->getPointerInfo().getWithOffset(IncrementSize
),
786 ExtraVT
, MinAlign(Alignment
, IncrementSize
), MMOFlags
,
789 // Build a factor node to remember that this load is independent of
791 Ch
= DAG
.getNode(ISD::TokenFactor
, dl
, MVT::Other
, Lo
.getValue(1),
794 // Move the top bits to the right place.
796 ISD::SHL
, dl
, Hi
.getValueType(), Hi
,
797 DAG
.getConstant(RoundWidth
, dl
,
798 TLI
.getShiftAmountTy(Hi
.getValueType(), DL
)));
800 // Join the hi and lo parts.
801 Value
= DAG
.getNode(ISD::OR
, dl
, Node
->getValueType(0), Lo
, Hi
);
803 // Big endian - avoid unaligned loads.
804 // EXTLOAD:i24 -> (shl EXTLOAD:i16, 8) | ZEXTLOAD@+2:i8
805 // Load the top RoundWidth bits.
806 Hi
= DAG
.getExtLoad(ExtType
, dl
, Node
->getValueType(0), Chain
, Ptr
,
807 LD
->getPointerInfo(), RoundVT
, Alignment
, MMOFlags
,
810 // Load the remaining ExtraWidth bits.
811 IncrementSize
= RoundWidth
/ 8;
812 Ptr
= DAG
.getNode(ISD::ADD
, dl
, Ptr
.getValueType(), Ptr
,
813 DAG
.getConstant(IncrementSize
, dl
,
814 Ptr
.getValueType()));
815 Lo
= DAG
.getExtLoad(ISD::ZEXTLOAD
, dl
, Node
->getValueType(0), Chain
, Ptr
,
816 LD
->getPointerInfo().getWithOffset(IncrementSize
),
817 ExtraVT
, MinAlign(Alignment
, IncrementSize
), MMOFlags
,
820 // Build a factor node to remember that this load is independent of
822 Ch
= DAG
.getNode(ISD::TokenFactor
, dl
, MVT::Other
, Lo
.getValue(1),
825 // Move the top bits to the right place.
827 ISD::SHL
, dl
, Hi
.getValueType(), Hi
,
828 DAG
.getConstant(ExtraWidth
, dl
,
829 TLI
.getShiftAmountTy(Hi
.getValueType(), DL
)));
831 // Join the hi and lo parts.
832 Value
= DAG
.getNode(ISD::OR
, dl
, Node
->getValueType(0), Lo
, Hi
);
837 bool isCustom
= false;
838 switch (TLI
.getLoadExtAction(ExtType
, Node
->getValueType(0),
839 SrcVT
.getSimpleVT())) {
840 default: llvm_unreachable("This action is not supported yet!");
841 case TargetLowering::Custom
:
844 case TargetLowering::Legal
:
845 Value
= SDValue(Node
, 0);
846 Chain
= SDValue(Node
, 1);
849 if (SDValue Res
= TLI
.LowerOperation(SDValue(Node
, 0), DAG
)) {
851 Chain
= Res
.getValue(1);
854 // If this is an unaligned load and the target doesn't support it,
856 EVT MemVT
= LD
->getMemoryVT();
857 unsigned AS
= LD
->getAddressSpace();
858 unsigned Align
= LD
->getAlignment();
859 const DataLayout
&DL
= DAG
.getDataLayout();
860 if (!TLI
.allowsMemoryAccess(*DAG
.getContext(), DL
, MemVT
, AS
, Align
)) {
861 std::tie(Value
, Chain
) = TLI
.expandUnalignedLoad(LD
, DAG
);
866 case TargetLowering::Expand
: {
867 EVT DestVT
= Node
->getValueType(0);
868 if (!TLI
.isLoadExtLegal(ISD::EXTLOAD
, DestVT
, SrcVT
)) {
869 // If the source type is not legal, see if there is a legal extload to
870 // an intermediate type that we can then extend further.
871 EVT LoadVT
= TLI
.getRegisterType(SrcVT
.getSimpleVT());
872 if (TLI
.isTypeLegal(SrcVT
) || // Same as SrcVT == LoadVT?
873 TLI
.isLoadExtLegal(ExtType
, LoadVT
, SrcVT
)) {
874 // If we are loading a legal type, this is a non-extload followed by a
876 ISD::LoadExtType MidExtType
=
877 (LoadVT
== SrcVT
) ? ISD::NON_EXTLOAD
: ExtType
;
879 SDValue Load
= DAG
.getExtLoad(MidExtType
, dl
, LoadVT
, Chain
, Ptr
,
880 SrcVT
, LD
->getMemOperand());
882 ISD::getExtForLoadExtType(SrcVT
.isFloatingPoint(), ExtType
);
883 Value
= DAG
.getNode(ExtendOp
, dl
, Node
->getValueType(0), Load
);
884 Chain
= Load
.getValue(1);
888 // Handle the special case of fp16 extloads. EXTLOAD doesn't have the
889 // normal undefined upper bits behavior to allow using an in-reg extend
890 // with the illegal FP type, so load as an integer and do the
891 // from-integer conversion.
892 if (SrcVT
.getScalarType() == MVT::f16
) {
893 EVT ISrcVT
= SrcVT
.changeTypeToInteger();
894 EVT IDestVT
= DestVT
.changeTypeToInteger();
895 EVT LoadVT
= TLI
.getRegisterType(IDestVT
.getSimpleVT());
897 SDValue Result
= DAG
.getExtLoad(ISD::ZEXTLOAD
, dl
, LoadVT
,
899 LD
->getMemOperand());
900 Value
= DAG
.getNode(ISD::FP16_TO_FP
, dl
, DestVT
, Result
);
901 Chain
= Result
.getValue(1);
906 assert(!SrcVT
.isVector() &&
907 "Vector Loads are handled in LegalizeVectorOps");
909 // FIXME: This does not work for vectors on most targets. Sign-
910 // and zero-extend operations are currently folded into extending
911 // loads, whether they are legal or not, and then we end up here
912 // without any support for legalizing them.
913 assert(ExtType
!= ISD::EXTLOAD
&&
914 "EXTLOAD should always be supported!");
915 // Turn the unsupported load into an EXTLOAD followed by an
916 // explicit zero/sign extend inreg.
917 SDValue Result
= DAG
.getExtLoad(ISD::EXTLOAD
, dl
,
918 Node
->getValueType(0),
920 LD
->getMemOperand());
922 if (ExtType
== ISD::SEXTLOAD
)
923 ValRes
= DAG
.getNode(ISD::SIGN_EXTEND_INREG
, dl
,
924 Result
.getValueType(),
925 Result
, DAG
.getValueType(SrcVT
));
927 ValRes
= DAG
.getZeroExtendInReg(Result
, dl
, SrcVT
.getScalarType());
929 Chain
= Result
.getValue(1);
935 // Since loads produce two values, make sure to remember that we legalized
937 if (Chain
.getNode() != Node
) {
938 assert(Value
.getNode() != Node
&& "Load must be completely replaced");
939 DAG
.ReplaceAllUsesOfValueWith(SDValue(Node
, 0), Value
);
940 DAG
.ReplaceAllUsesOfValueWith(SDValue(Node
, 1), Chain
);
942 UpdatedNodes
->insert(Value
.getNode());
943 UpdatedNodes
->insert(Chain
.getNode());
949 /// Return a legal replacement for the given operation, with all legal operands.
950 void SelectionDAGLegalize::LegalizeOp(SDNode
*Node
) {
951 LLVM_DEBUG(dbgs() << "\nLegalizing: "; Node
->dump(&DAG
));
953 // Allow illegal target nodes and illegal registers.
954 if (Node
->getOpcode() == ISD::TargetConstant
||
955 Node
->getOpcode() == ISD::Register
)
959 for (unsigned i
= 0, e
= Node
->getNumValues(); i
!= e
; ++i
)
960 assert((TLI
.getTypeAction(*DAG
.getContext(), Node
->getValueType(i
)) ==
961 TargetLowering::TypeLegal
||
962 TLI
.isTypeLegal(Node
->getValueType(i
))) &&
963 "Unexpected illegal type!");
965 for (const SDValue
&Op
: Node
->op_values())
966 assert((TLI
.getTypeAction(*DAG
.getContext(), Op
.getValueType()) ==
967 TargetLowering::TypeLegal
||
968 TLI
.isTypeLegal(Op
.getValueType()) ||
969 Op
.getOpcode() == ISD::TargetConstant
||
970 Op
.getOpcode() == ISD::Register
) &&
971 "Unexpected illegal type!");
974 // Figure out the correct action; the way to query this varies by opcode
975 TargetLowering::LegalizeAction Action
= TargetLowering::Legal
;
976 bool SimpleFinishLegalizing
= true;
977 switch (Node
->getOpcode()) {
978 case ISD::INTRINSIC_W_CHAIN
:
979 case ISD::INTRINSIC_WO_CHAIN
:
980 case ISD::INTRINSIC_VOID
:
982 Action
= TLI
.getOperationAction(Node
->getOpcode(), MVT::Other
);
984 case ISD::GET_DYNAMIC_AREA_OFFSET
:
985 Action
= TLI
.getOperationAction(Node
->getOpcode(),
986 Node
->getValueType(0));
989 Action
= TLI
.getOperationAction(Node
->getOpcode(),
990 Node
->getValueType(0));
991 if (Action
!= TargetLowering::Promote
)
992 Action
= TLI
.getOperationAction(Node
->getOpcode(), MVT::Other
);
994 case ISD::FP_TO_FP16
:
995 case ISD::SINT_TO_FP
:
996 case ISD::UINT_TO_FP
:
997 case ISD::EXTRACT_VECTOR_ELT
:
998 Action
= TLI
.getOperationAction(Node
->getOpcode(),
999 Node
->getOperand(0).getValueType());
1001 case ISD::FP_ROUND_INREG
:
1002 case ISD::SIGN_EXTEND_INREG
: {
1003 EVT InnerType
= cast
<VTSDNode
>(Node
->getOperand(1))->getVT();
1004 Action
= TLI
.getOperationAction(Node
->getOpcode(), InnerType
);
1007 case ISD::ATOMIC_STORE
:
1008 Action
= TLI
.getOperationAction(Node
->getOpcode(),
1009 Node
->getOperand(2).getValueType());
1011 case ISD::SELECT_CC
:
1014 unsigned CCOperand
= Node
->getOpcode() == ISD::SELECT_CC
? 4 :
1015 Node
->getOpcode() == ISD::SETCC
? 2 : 1;
1016 unsigned CompareOperand
= Node
->getOpcode() == ISD::BR_CC
? 2 : 0;
1017 MVT OpVT
= Node
->getOperand(CompareOperand
).getSimpleValueType();
1018 ISD::CondCode CCCode
=
1019 cast
<CondCodeSDNode
>(Node
->getOperand(CCOperand
))->get();
1020 Action
= TLI
.getCondCodeAction(CCCode
, OpVT
);
1021 if (Action
== TargetLowering::Legal
) {
1022 if (Node
->getOpcode() == ISD::SELECT_CC
)
1023 Action
= TLI
.getOperationAction(Node
->getOpcode(),
1024 Node
->getValueType(0));
1026 Action
= TLI
.getOperationAction(Node
->getOpcode(), OpVT
);
1032 // FIXME: Model these properly. LOAD and STORE are complicated, and
1033 // STORE expects the unlegalized operand in some cases.
1034 SimpleFinishLegalizing
= false;
1036 case ISD::CALLSEQ_START
:
1037 case ISD::CALLSEQ_END
:
1038 // FIXME: This shouldn't be necessary. These nodes have special properties
1039 // dealing with the recursive nature of legalization. Removing this
1040 // special case should be done as part of making LegalizeDAG non-recursive.
1041 SimpleFinishLegalizing
= false;
1043 case ISD::EXTRACT_ELEMENT
:
1044 case ISD::FLT_ROUNDS_
:
1045 case ISD::MERGE_VALUES
:
1046 case ISD::EH_RETURN
:
1047 case ISD::FRAME_TO_ARGS_OFFSET
:
1048 case ISD::EH_DWARF_CFA
:
1049 case ISD::EH_SJLJ_SETJMP
:
1050 case ISD::EH_SJLJ_LONGJMP
:
1051 case ISD::EH_SJLJ_SETUP_DISPATCH
:
1052 // These operations lie about being legal: when they claim to be legal,
1053 // they should actually be expanded.
1054 Action
= TLI
.getOperationAction(Node
->getOpcode(), Node
->getValueType(0));
1055 if (Action
== TargetLowering::Legal
)
1056 Action
= TargetLowering::Expand
;
1058 case ISD::INIT_TRAMPOLINE
:
1059 case ISD::ADJUST_TRAMPOLINE
:
1060 case ISD::FRAMEADDR
:
1061 case ISD::RETURNADDR
:
1062 case ISD::ADDROFRETURNADDR
:
1063 // These operations lie about being legal: when they claim to be legal,
1064 // they should actually be custom-lowered.
1065 Action
= TLI
.getOperationAction(Node
->getOpcode(), Node
->getValueType(0));
1066 if (Action
== TargetLowering::Legal
)
1067 Action
= TargetLowering::Custom
;
1069 case ISD::READCYCLECOUNTER
:
1070 // READCYCLECOUNTER returns an i64, even if type legalization might have
1071 // expanded that to several smaller types.
1072 Action
= TLI
.getOperationAction(Node
->getOpcode(), MVT::i64
);
1074 case ISD::READ_REGISTER
:
1075 case ISD::WRITE_REGISTER
:
1076 // Named register is legal in the DAG, but blocked by register name
1077 // selection if not implemented by target (to chose the correct register)
1078 // They'll be converted to Copy(To/From)Reg.
1079 Action
= TargetLowering::Legal
;
1081 case ISD::DEBUGTRAP
:
1082 Action
= TLI
.getOperationAction(Node
->getOpcode(), Node
->getValueType(0));
1083 if (Action
== TargetLowering::Expand
) {
1084 // replace ISD::DEBUGTRAP with ISD::TRAP
1086 NewVal
= DAG
.getNode(ISD::TRAP
, SDLoc(Node
), Node
->getVTList(),
1087 Node
->getOperand(0));
1088 ReplaceNode(Node
, NewVal
.getNode());
1089 LegalizeOp(NewVal
.getNode());
1093 case ISD::STRICT_FADD
:
1094 case ISD::STRICT_FSUB
:
1095 case ISD::STRICT_FMUL
:
1096 case ISD::STRICT_FDIV
:
1097 case ISD::STRICT_FREM
:
1098 case ISD::STRICT_FSQRT
:
1099 case ISD::STRICT_FMA
:
1100 case ISD::STRICT_FPOW
:
1101 case ISD::STRICT_FPOWI
:
1102 case ISD::STRICT_FSIN
:
1103 case ISD::STRICT_FCOS
:
1104 case ISD::STRICT_FEXP
:
1105 case ISD::STRICT_FEXP2
:
1106 case ISD::STRICT_FLOG
:
1107 case ISD::STRICT_FLOG10
:
1108 case ISD::STRICT_FLOG2
:
1109 case ISD::STRICT_FRINT
:
1110 case ISD::STRICT_FNEARBYINT
:
1111 // These pseudo-ops get legalized as if they were their non-strict
1112 // equivalent. For instance, if ISD::FSQRT is legal then ISD::STRICT_FSQRT
1113 // is also legal, but if ISD::FSQRT requires expansion then so does
1114 // ISD::STRICT_FSQRT.
1115 Action
= TLI
.getStrictFPOperationAction(Node
->getOpcode(),
1116 Node
->getValueType(0));
1119 Action
= TLI
.getOperationAction(Node
->getOpcode(),
1120 cast
<MaskedScatterSDNode
>(Node
)->getValue().getValueType());
1123 Action
= TLI
.getOperationAction(Node
->getOpcode(),
1124 cast
<MaskedStoreSDNode
>(Node
)->getValue().getValueType());
1127 if (Node
->getOpcode() >= ISD::BUILTIN_OP_END
) {
1128 Action
= TargetLowering::Legal
;
1130 Action
= TLI
.getOperationAction(Node
->getOpcode(), Node
->getValueType(0));
1135 if (SimpleFinishLegalizing
) {
1136 SDNode
*NewNode
= Node
;
1137 switch (Node
->getOpcode()) {
1144 // Legalizing shifts/rotates requires adjusting the shift amount
1145 // to the appropriate width.
1146 SDValue Op0
= Node
->getOperand(0);
1147 SDValue Op1
= Node
->getOperand(1);
1148 if (!Op1
.getValueType().isVector()) {
1149 SDValue SAO
= DAG
.getShiftAmountOperand(Op0
.getValueType(), Op1
);
1150 // The getShiftAmountOperand() may create a new operand node or
1151 // return the existing one. If new operand is created we need
1152 // to update the parent node.
1153 // Do not try to legalize SAO here! It will be automatically legalized
1154 // in the next round.
1156 NewNode
= DAG
.UpdateNodeOperands(Node
, Op0
, SAO
);
1160 case ISD::SRL_PARTS
:
1161 case ISD::SRA_PARTS
:
1162 case ISD::SHL_PARTS
: {
1163 // Legalizing shifts/rotates requires adjusting the shift amount
1164 // to the appropriate width.
1165 SDValue Op0
= Node
->getOperand(0);
1166 SDValue Op1
= Node
->getOperand(1);
1167 SDValue Op2
= Node
->getOperand(2);
1168 if (!Op2
.getValueType().isVector()) {
1169 SDValue SAO
= DAG
.getShiftAmountOperand(Op0
.getValueType(), Op2
);
1170 // The getShiftAmountOperand() may create a new operand node or
1171 // return the existing one. If new operand is created we need
1172 // to update the parent node.
1174 NewNode
= DAG
.UpdateNodeOperands(Node
, Op0
, Op1
, SAO
);
1180 if (NewNode
!= Node
) {
1181 ReplaceNode(Node
, NewNode
);
1185 case TargetLowering::Legal
:
1186 LLVM_DEBUG(dbgs() << "Legal node: nothing to do\n");
1188 case TargetLowering::Custom
:
1189 LLVM_DEBUG(dbgs() << "Trying custom legalization\n");
1190 // FIXME: The handling for custom lowering with multiple results is
1192 if (SDValue Res
= TLI
.LowerOperation(SDValue(Node
, 0), DAG
)) {
1193 if (!(Res
.getNode() != Node
|| Res
.getResNo() != 0))
1196 if (Node
->getNumValues() == 1) {
1197 LLVM_DEBUG(dbgs() << "Successfully custom legalized node\n");
1198 // We can just directly replace this node with the lowered value.
1199 ReplaceNode(SDValue(Node
, 0), Res
);
1203 SmallVector
<SDValue
, 8> ResultVals
;
1204 for (unsigned i
= 0, e
= Node
->getNumValues(); i
!= e
; ++i
)
1205 ResultVals
.push_back(Res
.getValue(i
));
1206 LLVM_DEBUG(dbgs() << "Successfully custom legalized node\n");
1207 ReplaceNode(Node
, ResultVals
.data());
1210 LLVM_DEBUG(dbgs() << "Could not custom legalize node\n");
1212 case TargetLowering::Expand
:
1213 if (ExpandNode(Node
))
1216 case TargetLowering::LibCall
:
1217 ConvertNodeToLibcall(Node
);
1219 case TargetLowering::Promote
:
1225 switch (Node
->getOpcode()) {
1232 llvm_unreachable("Do not know how to legalize this operator!");
1234 case ISD::CALLSEQ_START
:
1235 case ISD::CALLSEQ_END
:
1238 return LegalizeLoadOps(Node
);
1240 return LegalizeStoreOps(Node
);
1244 SDValue
SelectionDAGLegalize::ExpandExtractFromVectorThroughStack(SDValue Op
) {
1245 SDValue Vec
= Op
.getOperand(0);
1246 SDValue Idx
= Op
.getOperand(1);
1249 // Before we generate a new store to a temporary stack slot, see if there is
1250 // already one that we can use. There often is because when we scalarize
1251 // vector operations (using SelectionDAG::UnrollVectorOp for example) a whole
1252 // series of EXTRACT_VECTOR_ELT nodes are generated, one for each element in
1253 // the vector. If all are expanded here, we don't want one store per vector
1256 // Caches for hasPredecessorHelper
1257 SmallPtrSet
<const SDNode
*, 32> Visited
;
1258 SmallVector
<const SDNode
*, 16> Worklist
;
1259 Visited
.insert(Op
.getNode());
1260 Worklist
.push_back(Idx
.getNode());
1261 SDValue StackPtr
, Ch
;
1262 for (SDNode::use_iterator UI
= Vec
.getNode()->use_begin(),
1263 UE
= Vec
.getNode()->use_end(); UI
!= UE
; ++UI
) {
1265 if (StoreSDNode
*ST
= dyn_cast
<StoreSDNode
>(User
)) {
1266 if (ST
->isIndexed() || ST
->isTruncatingStore() ||
1267 ST
->getValue() != Vec
)
1270 // Make sure that nothing else could have stored into the destination of
1272 if (!ST
->getChain().reachesChainWithoutSideEffects(DAG
.getEntryNode()))
1275 // If the index is dependent on the store we will introduce a cycle when
1276 // creating the load (the load uses the index, and by replacing the chain
1277 // we will make the index dependent on the load). Also, the store might be
1278 // dependent on the extractelement and introduce a cycle when creating
1280 if (SDNode::hasPredecessorHelper(ST
, Visited
, Worklist
) ||
1281 ST
->hasPredecessor(Op
.getNode()))
1284 StackPtr
= ST
->getBasePtr();
1285 Ch
= SDValue(ST
, 0);
1290 EVT VecVT
= Vec
.getValueType();
1292 if (!Ch
.getNode()) {
1293 // Store the value to a temporary stack slot, then LOAD the returned part.
1294 StackPtr
= DAG
.CreateStackTemporary(VecVT
);
1295 Ch
= DAG
.getStore(DAG
.getEntryNode(), dl
, Vec
, StackPtr
,
1296 MachinePointerInfo());
1299 StackPtr
= TLI
.getVectorElementPointer(DAG
, StackPtr
, VecVT
, Idx
);
1303 if (Op
.getValueType().isVector())
1305 DAG
.getLoad(Op
.getValueType(), dl
, Ch
, StackPtr
, MachinePointerInfo());
1307 NewLoad
= DAG
.getExtLoad(ISD::EXTLOAD
, dl
, Op
.getValueType(), Ch
, StackPtr
,
1308 MachinePointerInfo(),
1309 VecVT
.getVectorElementType());
1311 // Replace the chain going out of the store, by the one out of the load.
1312 DAG
.ReplaceAllUsesOfValueWith(Ch
, SDValue(NewLoad
.getNode(), 1));
1314 // We introduced a cycle though, so update the loads operands, making sure
1315 // to use the original store's chain as an incoming chain.
1316 SmallVector
<SDValue
, 6> NewLoadOperands(NewLoad
->op_begin(),
1318 NewLoadOperands
[0] = Ch
;
1320 SDValue(DAG
.UpdateNodeOperands(NewLoad
.getNode(), NewLoadOperands
), 0);
1324 SDValue
SelectionDAGLegalize::ExpandInsertToVectorThroughStack(SDValue Op
) {
1325 assert(Op
.getValueType().isVector() && "Non-vector insert subvector!");
1327 SDValue Vec
= Op
.getOperand(0);
1328 SDValue Part
= Op
.getOperand(1);
1329 SDValue Idx
= Op
.getOperand(2);
1332 // Store the value to a temporary stack slot, then LOAD the returned part.
1333 EVT VecVT
= Vec
.getValueType();
1334 SDValue StackPtr
= DAG
.CreateStackTemporary(VecVT
);
1335 int FI
= cast
<FrameIndexSDNode
>(StackPtr
.getNode())->getIndex();
1336 MachinePointerInfo PtrInfo
=
1337 MachinePointerInfo::getFixedStack(DAG
.getMachineFunction(), FI
);
1339 // First store the whole vector.
1340 SDValue Ch
= DAG
.getStore(DAG
.getEntryNode(), dl
, Vec
, StackPtr
, PtrInfo
);
1342 // Then store the inserted part.
1343 SDValue SubStackPtr
= TLI
.getVectorElementPointer(DAG
, StackPtr
, VecVT
, Idx
);
1345 // Store the subvector.
1346 Ch
= DAG
.getStore(Ch
, dl
, Part
, SubStackPtr
, MachinePointerInfo());
1348 // Finally, load the updated vector.
1349 return DAG
.getLoad(Op
.getValueType(), dl
, Ch
, StackPtr
, PtrInfo
);
1352 SDValue
SelectionDAGLegalize::ExpandVectorBuildThroughStack(SDNode
* Node
) {
1353 // We can't handle this case efficiently. Allocate a sufficiently
1354 // aligned object on the stack, store each element into it, then load
1355 // the result as a vector.
1356 // Create the stack frame object.
1357 EVT VT
= Node
->getValueType(0);
1358 EVT EltVT
= VT
.getVectorElementType();
1360 SDValue FIPtr
= DAG
.CreateStackTemporary(VT
);
1361 int FI
= cast
<FrameIndexSDNode
>(FIPtr
.getNode())->getIndex();
1362 MachinePointerInfo PtrInfo
=
1363 MachinePointerInfo::getFixedStack(DAG
.getMachineFunction(), FI
);
1365 // Emit a store of each element to the stack slot.
1366 SmallVector
<SDValue
, 8> Stores
;
1367 unsigned TypeByteSize
= EltVT
.getSizeInBits() / 8;
1368 // Store (in the right endianness) the elements to memory.
1369 for (unsigned i
= 0, e
= Node
->getNumOperands(); i
!= e
; ++i
) {
1370 // Ignore undef elements.
1371 if (Node
->getOperand(i
).isUndef()) continue;
1373 unsigned Offset
= TypeByteSize
*i
;
1375 SDValue Idx
= DAG
.getConstant(Offset
, dl
, FIPtr
.getValueType());
1376 Idx
= DAG
.getNode(ISD::ADD
, dl
, FIPtr
.getValueType(), FIPtr
, Idx
);
1378 // If the destination vector element type is narrower than the source
1379 // element type, only store the bits necessary.
1380 if (EltVT
.bitsLT(Node
->getOperand(i
).getValueType().getScalarType())) {
1381 Stores
.push_back(DAG
.getTruncStore(DAG
.getEntryNode(), dl
,
1382 Node
->getOperand(i
), Idx
,
1383 PtrInfo
.getWithOffset(Offset
), EltVT
));
1385 Stores
.push_back(DAG
.getStore(DAG
.getEntryNode(), dl
, Node
->getOperand(i
),
1386 Idx
, PtrInfo
.getWithOffset(Offset
)));
1390 if (!Stores
.empty()) // Not all undef elements?
1391 StoreChain
= DAG
.getNode(ISD::TokenFactor
, dl
, MVT::Other
, Stores
);
1393 StoreChain
= DAG
.getEntryNode();
1395 // Result is a load from the stack slot.
1396 return DAG
.getLoad(VT
, dl
, StoreChain
, FIPtr
, PtrInfo
);
1399 /// Bitcast a floating-point value to an integer value. Only bitcast the part
1400 /// containing the sign bit if the target has no integer value capable of
1401 /// holding all bits of the floating-point value.
1402 void SelectionDAGLegalize::getSignAsIntValue(FloatSignAsInt
&State
,
1404 SDValue Value
) const {
1405 EVT FloatVT
= Value
.getValueType();
1406 unsigned NumBits
= FloatVT
.getSizeInBits();
1407 State
.FloatVT
= FloatVT
;
1408 EVT IVT
= EVT::getIntegerVT(*DAG
.getContext(), NumBits
);
1409 // Convert to an integer of the same size.
1410 if (TLI
.isTypeLegal(IVT
)) {
1411 State
.IntValue
= DAG
.getNode(ISD::BITCAST
, DL
, IVT
, Value
);
1412 State
.SignMask
= APInt::getSignMask(NumBits
);
1413 State
.SignBit
= NumBits
- 1;
1417 auto &DataLayout
= DAG
.getDataLayout();
1418 // Store the float to memory, then load the sign part out as an integer.
1419 MVT LoadTy
= TLI
.getRegisterType(*DAG
.getContext(), MVT::i8
);
1420 // First create a temporary that is aligned for both the load and store.
1421 SDValue StackPtr
= DAG
.CreateStackTemporary(FloatVT
, LoadTy
);
1422 int FI
= cast
<FrameIndexSDNode
>(StackPtr
.getNode())->getIndex();
1423 // Then store the float to it.
1424 State
.FloatPtr
= StackPtr
;
1425 MachineFunction
&MF
= DAG
.getMachineFunction();
1426 State
.FloatPointerInfo
= MachinePointerInfo::getFixedStack(MF
, FI
);
1427 State
.Chain
= DAG
.getStore(DAG
.getEntryNode(), DL
, Value
, State
.FloatPtr
,
1428 State
.FloatPointerInfo
);
1431 if (DataLayout
.isBigEndian()) {
1432 assert(FloatVT
.isByteSized() && "Unsupported floating point type!");
1433 // Load out a legal integer with the same sign bit as the float.
1435 State
.IntPointerInfo
= State
.FloatPointerInfo
;
1437 // Advance the pointer so that the loaded byte will contain the sign bit.
1438 unsigned ByteOffset
= (FloatVT
.getSizeInBits() / 8) - 1;
1439 IntPtr
= DAG
.getNode(ISD::ADD
, DL
, StackPtr
.getValueType(), StackPtr
,
1440 DAG
.getConstant(ByteOffset
, DL
, StackPtr
.getValueType()));
1441 State
.IntPointerInfo
= MachinePointerInfo::getFixedStack(MF
, FI
,
1445 State
.IntPtr
= IntPtr
;
1446 State
.IntValue
= DAG
.getExtLoad(ISD::EXTLOAD
, DL
, LoadTy
, State
.Chain
, IntPtr
,
1447 State
.IntPointerInfo
, MVT::i8
);
1448 State
.SignMask
= APInt::getOneBitSet(LoadTy
.getSizeInBits(), 7);
1452 /// Replace the integer value produced by getSignAsIntValue() with a new value
1453 /// and cast the result back to a floating-point type.
1454 SDValue
SelectionDAGLegalize::modifySignAsInt(const FloatSignAsInt
&State
,
1456 SDValue NewIntValue
) const {
1458 return DAG
.getNode(ISD::BITCAST
, DL
, State
.FloatVT
, NewIntValue
);
1460 // Override the part containing the sign bit in the value stored on the stack.
1461 SDValue Chain
= DAG
.getTruncStore(State
.Chain
, DL
, NewIntValue
, State
.IntPtr
,
1462 State
.IntPointerInfo
, MVT::i8
);
1463 return DAG
.getLoad(State
.FloatVT
, DL
, Chain
, State
.FloatPtr
,
1464 State
.FloatPointerInfo
);
1467 SDValue
SelectionDAGLegalize::ExpandFCOPYSIGN(SDNode
*Node
) const {
1469 SDValue Mag
= Node
->getOperand(0);
1470 SDValue Sign
= Node
->getOperand(1);
1472 // Get sign bit into an integer value.
1473 FloatSignAsInt SignAsInt
;
1474 getSignAsIntValue(SignAsInt
, DL
, Sign
);
1476 EVT IntVT
= SignAsInt
.IntValue
.getValueType();
1477 SDValue SignMask
= DAG
.getConstant(SignAsInt
.SignMask
, DL
, IntVT
);
1478 SDValue SignBit
= DAG
.getNode(ISD::AND
, DL
, IntVT
, SignAsInt
.IntValue
,
1481 // If FABS is legal transform FCOPYSIGN(x, y) => sign(x) ? -FABS(x) : FABS(X)
1482 EVT FloatVT
= Mag
.getValueType();
1483 if (TLI
.isOperationLegalOrCustom(ISD::FABS
, FloatVT
) &&
1484 TLI
.isOperationLegalOrCustom(ISD::FNEG
, FloatVT
)) {
1485 SDValue AbsValue
= DAG
.getNode(ISD::FABS
, DL
, FloatVT
, Mag
);
1486 SDValue NegValue
= DAG
.getNode(ISD::FNEG
, DL
, FloatVT
, AbsValue
);
1487 SDValue Cond
= DAG
.getSetCC(DL
, getSetCCResultType(IntVT
), SignBit
,
1488 DAG
.getConstant(0, DL
, IntVT
), ISD::SETNE
);
1489 return DAG
.getSelect(DL
, FloatVT
, Cond
, NegValue
, AbsValue
);
1492 // Transform Mag value to integer, and clear the sign bit.
1493 FloatSignAsInt MagAsInt
;
1494 getSignAsIntValue(MagAsInt
, DL
, Mag
);
1495 EVT MagVT
= MagAsInt
.IntValue
.getValueType();
1496 SDValue ClearSignMask
= DAG
.getConstant(~MagAsInt
.SignMask
, DL
, MagVT
);
1497 SDValue ClearedSign
= DAG
.getNode(ISD::AND
, DL
, MagVT
, MagAsInt
.IntValue
,
1500 // Get the signbit at the right position for MagAsInt.
1501 int ShiftAmount
= SignAsInt
.SignBit
- MagAsInt
.SignBit
;
1502 EVT ShiftVT
= IntVT
;
1503 if (SignBit
.getValueSizeInBits() < ClearedSign
.getValueSizeInBits()) {
1504 SignBit
= DAG
.getNode(ISD::ZERO_EXTEND
, DL
, MagVT
, SignBit
);
1507 if (ShiftAmount
> 0) {
1508 SDValue ShiftCnst
= DAG
.getConstant(ShiftAmount
, DL
, ShiftVT
);
1509 SignBit
= DAG
.getNode(ISD::SRL
, DL
, ShiftVT
, SignBit
, ShiftCnst
);
1510 } else if (ShiftAmount
< 0) {
1511 SDValue ShiftCnst
= DAG
.getConstant(-ShiftAmount
, DL
, ShiftVT
);
1512 SignBit
= DAG
.getNode(ISD::SHL
, DL
, ShiftVT
, SignBit
, ShiftCnst
);
1514 if (SignBit
.getValueSizeInBits() > ClearedSign
.getValueSizeInBits()) {
1515 SignBit
= DAG
.getNode(ISD::TRUNCATE
, DL
, MagVT
, SignBit
);
1518 // Store the part with the modified sign and convert back to float.
1519 SDValue CopiedSign
= DAG
.getNode(ISD::OR
, DL
, MagVT
, ClearedSign
, SignBit
);
1520 return modifySignAsInt(MagAsInt
, DL
, CopiedSign
);
1523 SDValue
SelectionDAGLegalize::ExpandFABS(SDNode
*Node
) const {
1525 SDValue Value
= Node
->getOperand(0);
1527 // Transform FABS(x) => FCOPYSIGN(x, 0.0) if FCOPYSIGN is legal.
1528 EVT FloatVT
= Value
.getValueType();
1529 if (TLI
.isOperationLegalOrCustom(ISD::FCOPYSIGN
, FloatVT
)) {
1530 SDValue Zero
= DAG
.getConstantFP(0.0, DL
, FloatVT
);
1531 return DAG
.getNode(ISD::FCOPYSIGN
, DL
, FloatVT
, Value
, Zero
);
1534 // Transform value to integer, clear the sign bit and transform back.
1535 FloatSignAsInt ValueAsInt
;
1536 getSignAsIntValue(ValueAsInt
, DL
, Value
);
1537 EVT IntVT
= ValueAsInt
.IntValue
.getValueType();
1538 SDValue ClearSignMask
= DAG
.getConstant(~ValueAsInt
.SignMask
, DL
, IntVT
);
1539 SDValue ClearedSign
= DAG
.getNode(ISD::AND
, DL
, IntVT
, ValueAsInt
.IntValue
,
1541 return modifySignAsInt(ValueAsInt
, DL
, ClearedSign
);
1544 void SelectionDAGLegalize::ExpandDYNAMIC_STACKALLOC(SDNode
* Node
,
1545 SmallVectorImpl
<SDValue
> &Results
) {
1546 unsigned SPReg
= TLI
.getStackPointerRegisterToSaveRestore();
1547 assert(SPReg
&& "Target cannot require DYNAMIC_STACKALLOC expansion and"
1548 " not tell us which reg is the stack pointer!");
1550 EVT VT
= Node
->getValueType(0);
1551 SDValue Tmp1
= SDValue(Node
, 0);
1552 SDValue Tmp2
= SDValue(Node
, 1);
1553 SDValue Tmp3
= Node
->getOperand(2);
1554 SDValue Chain
= Tmp1
.getOperand(0);
1556 // Chain the dynamic stack allocation so that it doesn't modify the stack
1557 // pointer when other instructions are using the stack.
1558 Chain
= DAG
.getCALLSEQ_START(Chain
, 0, 0, dl
);
1560 SDValue Size
= Tmp2
.getOperand(1);
1561 SDValue SP
= DAG
.getCopyFromReg(Chain
, dl
, SPReg
, VT
);
1562 Chain
= SP
.getValue(1);
1563 unsigned Align
= cast
<ConstantSDNode
>(Tmp3
)->getZExtValue();
1564 unsigned StackAlign
=
1565 DAG
.getSubtarget().getFrameLowering()->getStackAlignment();
1566 Tmp1
= DAG
.getNode(ISD::SUB
, dl
, VT
, SP
, Size
); // Value
1567 if (Align
> StackAlign
)
1568 Tmp1
= DAG
.getNode(ISD::AND
, dl
, VT
, Tmp1
,
1569 DAG
.getConstant(-(uint64_t)Align
, dl
, VT
));
1570 Chain
= DAG
.getCopyToReg(Chain
, dl
, SPReg
, Tmp1
); // Output chain
1572 Tmp2
= DAG
.getCALLSEQ_END(Chain
, DAG
.getIntPtrConstant(0, dl
, true),
1573 DAG
.getIntPtrConstant(0, dl
, true), SDValue(), dl
);
1575 Results
.push_back(Tmp1
);
1576 Results
.push_back(Tmp2
);
1579 /// Legalize a SETCC with given LHS and RHS and condition code CC on the current
1582 /// If the SETCC has been legalized using AND / OR, then the legalized node
1583 /// will be stored in LHS. RHS and CC will be set to SDValue(). NeedInvert
1584 /// will be set to false.
1586 /// If the SETCC has been legalized by using getSetCCSwappedOperands(),
1587 /// then the values of LHS and RHS will be swapped, CC will be set to the
1588 /// new condition, and NeedInvert will be set to false.
1590 /// If the SETCC has been legalized using the inverse condcode, then LHS and
1591 /// RHS will be unchanged, CC will set to the inverted condcode, and NeedInvert
1592 /// will be set to true. The caller must invert the result of the SETCC with
1593 /// SelectionDAG::getLogicalNOT() or take equivalent action to swap the effect
1594 /// of a true/false result.
1596 /// \returns true if the SetCC has been legalized, false if it hasn't.
1597 bool SelectionDAGLegalize::LegalizeSetCCCondCode(EVT VT
, SDValue
&LHS
,
1598 SDValue
&RHS
, SDValue
&CC
,
1601 MVT OpVT
= LHS
.getSimpleValueType();
1602 ISD::CondCode CCCode
= cast
<CondCodeSDNode
>(CC
)->get();
1604 bool NeedSwap
= false;
1605 switch (TLI
.getCondCodeAction(CCCode
, OpVT
)) {
1606 default: llvm_unreachable("Unknown condition code action!");
1607 case TargetLowering::Legal
:
1610 case TargetLowering::Expand
: {
1611 ISD::CondCode InvCC
= ISD::getSetCCSwappedOperands(CCCode
);
1612 if (TLI
.isCondCodeLegalOrCustom(InvCC
, OpVT
)) {
1613 std::swap(LHS
, RHS
);
1614 CC
= DAG
.getCondCode(InvCC
);
1617 // Swapping operands didn't work. Try inverting the condition.
1618 InvCC
= getSetCCInverse(CCCode
, OpVT
.isInteger());
1619 if (!TLI
.isCondCodeLegalOrCustom(InvCC
, OpVT
)) {
1620 // If inverting the condition is not enough, try swapping operands
1622 InvCC
= ISD::getSetCCSwappedOperands(InvCC
);
1625 if (TLI
.isCondCodeLegalOrCustom(InvCC
, OpVT
)) {
1626 CC
= DAG
.getCondCode(InvCC
);
1629 std::swap(LHS
, RHS
);
1633 ISD::CondCode CC1
= ISD::SETCC_INVALID
, CC2
= ISD::SETCC_INVALID
;
1636 default: llvm_unreachable("Don't know how to expand this condition!");
1638 assert(TLI
.isCondCodeLegal(ISD::SETOEQ
, OpVT
)
1639 && "If SETO is expanded, SETOEQ must be legal!");
1640 CC1
= ISD::SETOEQ
; CC2
= ISD::SETOEQ
; Opc
= ISD::AND
; break;
1642 assert(TLI
.isCondCodeLegal(ISD::SETUNE
, OpVT
)
1643 && "If SETUO is expanded, SETUNE must be legal!");
1644 CC1
= ISD::SETUNE
; CC2
= ISD::SETUNE
; Opc
= ISD::OR
; break;
1657 // If we are floating point, assign and break, otherwise fall through.
1658 if (!OpVT
.isInteger()) {
1659 // We can use the 4th bit to tell if we are the unordered
1660 // or ordered version of the opcode.
1661 CC2
= ((unsigned)CCCode
& 0x8U
) ? ISD::SETUO
: ISD::SETO
;
1662 Opc
= ((unsigned)CCCode
& 0x8U
) ? ISD::OR
: ISD::AND
;
1663 CC1
= (ISD::CondCode
)(((int)CCCode
& 0x7) | 0x10);
1666 // Fallthrough if we are unsigned integer.
1674 // If all combinations of inverting the condition and swapping operands
1675 // didn't work then we have no means to expand the condition.
1676 llvm_unreachable("Don't know how to expand this condition!");
1679 SDValue SetCC1
, SetCC2
;
1680 if (CCCode
!= ISD::SETO
&& CCCode
!= ISD::SETUO
) {
1681 // If we aren't the ordered or unorder operation,
1682 // then the pattern is (LHS CC1 RHS) Opc (LHS CC2 RHS).
1683 SetCC1
= DAG
.getSetCC(dl
, VT
, LHS
, RHS
, CC1
);
1684 SetCC2
= DAG
.getSetCC(dl
, VT
, LHS
, RHS
, CC2
);
1686 // Otherwise, the pattern is (LHS CC1 LHS) Opc (RHS CC2 RHS)
1687 SetCC1
= DAG
.getSetCC(dl
, VT
, LHS
, LHS
, CC1
);
1688 SetCC2
= DAG
.getSetCC(dl
, VT
, RHS
, RHS
, CC2
);
1690 LHS
= DAG
.getNode(Opc
, dl
, VT
, SetCC1
, SetCC2
);
1699 /// Emit a store/load combination to the stack. This stores
1700 /// SrcOp to a stack slot of type SlotVT, truncating it if needed. It then does
1701 /// a load from the stack slot to DestVT, extending it if needed.
1702 /// The resultant code need not be legal.
1703 SDValue
SelectionDAGLegalize::EmitStackConvert(SDValue SrcOp
, EVT SlotVT
,
1704 EVT DestVT
, const SDLoc
&dl
) {
1705 // Create the stack frame object.
1706 unsigned SrcAlign
= DAG
.getDataLayout().getPrefTypeAlignment(
1707 SrcOp
.getValueType().getTypeForEVT(*DAG
.getContext()));
1708 SDValue FIPtr
= DAG
.CreateStackTemporary(SlotVT
, SrcAlign
);
1710 FrameIndexSDNode
*StackPtrFI
= cast
<FrameIndexSDNode
>(FIPtr
);
1711 int SPFI
= StackPtrFI
->getIndex();
1712 MachinePointerInfo PtrInfo
=
1713 MachinePointerInfo::getFixedStack(DAG
.getMachineFunction(), SPFI
);
1715 unsigned SrcSize
= SrcOp
.getValueSizeInBits();
1716 unsigned SlotSize
= SlotVT
.getSizeInBits();
1717 unsigned DestSize
= DestVT
.getSizeInBits();
1718 Type
*DestType
= DestVT
.getTypeForEVT(*DAG
.getContext());
1719 unsigned DestAlign
= DAG
.getDataLayout().getPrefTypeAlignment(DestType
);
1721 // Emit a store to the stack slot. Use a truncstore if the input value is
1722 // later than DestVT.
1725 if (SrcSize
> SlotSize
)
1726 Store
= DAG
.getTruncStore(DAG
.getEntryNode(), dl
, SrcOp
, FIPtr
, PtrInfo
,
1729 assert(SrcSize
== SlotSize
&& "Invalid store");
1731 DAG
.getStore(DAG
.getEntryNode(), dl
, SrcOp
, FIPtr
, PtrInfo
, SrcAlign
);
1734 // Result is a load from the stack slot.
1735 if (SlotSize
== DestSize
)
1736 return DAG
.getLoad(DestVT
, dl
, Store
, FIPtr
, PtrInfo
, DestAlign
);
1738 assert(SlotSize
< DestSize
&& "Unknown extension!");
1739 return DAG
.getExtLoad(ISD::EXTLOAD
, dl
, DestVT
, Store
, FIPtr
, PtrInfo
, SlotVT
,
1743 SDValue
SelectionDAGLegalize::ExpandSCALAR_TO_VECTOR(SDNode
*Node
) {
1745 // Create a vector sized/aligned stack slot, store the value to element #0,
1746 // then load the whole vector back out.
1747 SDValue StackPtr
= DAG
.CreateStackTemporary(Node
->getValueType(0));
1749 FrameIndexSDNode
*StackPtrFI
= cast
<FrameIndexSDNode
>(StackPtr
);
1750 int SPFI
= StackPtrFI
->getIndex();
1752 SDValue Ch
= DAG
.getTruncStore(
1753 DAG
.getEntryNode(), dl
, Node
->getOperand(0), StackPtr
,
1754 MachinePointerInfo::getFixedStack(DAG
.getMachineFunction(), SPFI
),
1755 Node
->getValueType(0).getVectorElementType());
1757 Node
->getValueType(0), dl
, Ch
, StackPtr
,
1758 MachinePointerInfo::getFixedStack(DAG
.getMachineFunction(), SPFI
));
1762 ExpandBVWithShuffles(SDNode
*Node
, SelectionDAG
&DAG
,
1763 const TargetLowering
&TLI
, SDValue
&Res
) {
1764 unsigned NumElems
= Node
->getNumOperands();
1766 EVT VT
= Node
->getValueType(0);
1768 // Try to group the scalars into pairs, shuffle the pairs together, then
1769 // shuffle the pairs of pairs together, etc. until the vector has
1770 // been built. This will work only if all of the necessary shuffle masks
1773 // We do this in two phases; first to check the legality of the shuffles,
1774 // and next, assuming that all shuffles are legal, to create the new nodes.
1775 for (int Phase
= 0; Phase
< 2; ++Phase
) {
1776 SmallVector
<std::pair
<SDValue
, SmallVector
<int, 16>>, 16> IntermedVals
,
1778 for (unsigned i
= 0; i
< NumElems
; ++i
) {
1779 SDValue V
= Node
->getOperand(i
);
1785 Vec
= DAG
.getNode(ISD::SCALAR_TO_VECTOR
, dl
, VT
, V
);
1786 IntermedVals
.push_back(std::make_pair(Vec
, SmallVector
<int, 16>(1, i
)));
1789 while (IntermedVals
.size() > 2) {
1790 NewIntermedVals
.clear();
1791 for (unsigned i
= 0, e
= (IntermedVals
.size() & ~1u); i
< e
; i
+= 2) {
1792 // This vector and the next vector are shuffled together (simply to
1793 // append the one to the other).
1794 SmallVector
<int, 16> ShuffleVec(NumElems
, -1);
1796 SmallVector
<int, 16> FinalIndices
;
1797 FinalIndices
.reserve(IntermedVals
[i
].second
.size() +
1798 IntermedVals
[i
+1].second
.size());
1801 for (unsigned j
= 0, f
= IntermedVals
[i
].second
.size(); j
!= f
;
1804 FinalIndices
.push_back(IntermedVals
[i
].second
[j
]);
1806 for (unsigned j
= 0, f
= IntermedVals
[i
+1].second
.size(); j
!= f
;
1808 ShuffleVec
[k
] = NumElems
+ j
;
1809 FinalIndices
.push_back(IntermedVals
[i
+1].second
[j
]);
1814 Shuffle
= DAG
.getVectorShuffle(VT
, dl
, IntermedVals
[i
].first
,
1815 IntermedVals
[i
+1].first
,
1817 else if (!TLI
.isShuffleMaskLegal(ShuffleVec
, VT
))
1819 NewIntermedVals
.push_back(
1820 std::make_pair(Shuffle
, std::move(FinalIndices
)));
1823 // If we had an odd number of defined values, then append the last
1824 // element to the array of new vectors.
1825 if ((IntermedVals
.size() & 1) != 0)
1826 NewIntermedVals
.push_back(IntermedVals
.back());
1828 IntermedVals
.swap(NewIntermedVals
);
1831 assert(IntermedVals
.size() <= 2 && IntermedVals
.size() > 0 &&
1832 "Invalid number of intermediate vectors");
1833 SDValue Vec1
= IntermedVals
[0].first
;
1835 if (IntermedVals
.size() > 1)
1836 Vec2
= IntermedVals
[1].first
;
1838 Vec2
= DAG
.getUNDEF(VT
);
1840 SmallVector
<int, 16> ShuffleVec(NumElems
, -1);
1841 for (unsigned i
= 0, e
= IntermedVals
[0].second
.size(); i
!= e
; ++i
)
1842 ShuffleVec
[IntermedVals
[0].second
[i
]] = i
;
1843 for (unsigned i
= 0, e
= IntermedVals
[1].second
.size(); i
!= e
; ++i
)
1844 ShuffleVec
[IntermedVals
[1].second
[i
]] = NumElems
+ i
;
1847 Res
= DAG
.getVectorShuffle(VT
, dl
, Vec1
, Vec2
, ShuffleVec
);
1848 else if (!TLI
.isShuffleMaskLegal(ShuffleVec
, VT
))
1855 /// Expand a BUILD_VECTOR node on targets that don't
1856 /// support the operation, but do support the resultant vector type.
1857 SDValue
SelectionDAGLegalize::ExpandBUILD_VECTOR(SDNode
*Node
) {
1858 unsigned NumElems
= Node
->getNumOperands();
1859 SDValue Value1
, Value2
;
1861 EVT VT
= Node
->getValueType(0);
1862 EVT OpVT
= Node
->getOperand(0).getValueType();
1863 EVT EltVT
= VT
.getVectorElementType();
1865 // If the only non-undef value is the low element, turn this into a
1866 // SCALAR_TO_VECTOR node. If this is { X, X, X, X }, determine X.
1867 bool isOnlyLowElement
= true;
1868 bool MoreThanTwoValues
= false;
1869 bool isConstant
= true;
1870 for (unsigned i
= 0; i
< NumElems
; ++i
) {
1871 SDValue V
= Node
->getOperand(i
);
1875 isOnlyLowElement
= false;
1876 if (!isa
<ConstantFPSDNode
>(V
) && !isa
<ConstantSDNode
>(V
))
1879 if (!Value1
.getNode()) {
1881 } else if (!Value2
.getNode()) {
1884 } else if (V
!= Value1
&& V
!= Value2
) {
1885 MoreThanTwoValues
= true;
1889 if (!Value1
.getNode())
1890 return DAG
.getUNDEF(VT
);
1892 if (isOnlyLowElement
)
1893 return DAG
.getNode(ISD::SCALAR_TO_VECTOR
, dl
, VT
, Node
->getOperand(0));
1895 // If all elements are constants, create a load from the constant pool.
1897 SmallVector
<Constant
*, 16> CV
;
1898 for (unsigned i
= 0, e
= NumElems
; i
!= e
; ++i
) {
1899 if (ConstantFPSDNode
*V
=
1900 dyn_cast
<ConstantFPSDNode
>(Node
->getOperand(i
))) {
1901 CV
.push_back(const_cast<ConstantFP
*>(V
->getConstantFPValue()));
1902 } else if (ConstantSDNode
*V
=
1903 dyn_cast
<ConstantSDNode
>(Node
->getOperand(i
))) {
1905 CV
.push_back(const_cast<ConstantInt
*>(V
->getConstantIntValue()));
1907 // If OpVT and EltVT don't match, EltVT is not legal and the
1908 // element values have been promoted/truncated earlier. Undo this;
1909 // we don't want a v16i8 to become a v16i32 for example.
1910 const ConstantInt
*CI
= V
->getConstantIntValue();
1911 CV
.push_back(ConstantInt::get(EltVT
.getTypeForEVT(*DAG
.getContext()),
1912 CI
->getZExtValue()));
1915 assert(Node
->getOperand(i
).isUndef());
1916 Type
*OpNTy
= EltVT
.getTypeForEVT(*DAG
.getContext());
1917 CV
.push_back(UndefValue::get(OpNTy
));
1920 Constant
*CP
= ConstantVector::get(CV
);
1922 DAG
.getConstantPool(CP
, TLI
.getPointerTy(DAG
.getDataLayout()));
1923 unsigned Alignment
= cast
<ConstantPoolSDNode
>(CPIdx
)->getAlignment();
1925 VT
, dl
, DAG
.getEntryNode(), CPIdx
,
1926 MachinePointerInfo::getConstantPool(DAG
.getMachineFunction()),
1930 SmallSet
<SDValue
, 16> DefinedValues
;
1931 for (unsigned i
= 0; i
< NumElems
; ++i
) {
1932 if (Node
->getOperand(i
).isUndef())
1934 DefinedValues
.insert(Node
->getOperand(i
));
1937 if (TLI
.shouldExpandBuildVectorWithShuffles(VT
, DefinedValues
.size())) {
1938 if (!MoreThanTwoValues
) {
1939 SmallVector
<int, 8> ShuffleVec(NumElems
, -1);
1940 for (unsigned i
= 0; i
< NumElems
; ++i
) {
1941 SDValue V
= Node
->getOperand(i
);
1944 ShuffleVec
[i
] = V
== Value1
? 0 : NumElems
;
1946 if (TLI
.isShuffleMaskLegal(ShuffleVec
, Node
->getValueType(0))) {
1947 // Get the splatted value into the low element of a vector register.
1948 SDValue Vec1
= DAG
.getNode(ISD::SCALAR_TO_VECTOR
, dl
, VT
, Value1
);
1950 if (Value2
.getNode())
1951 Vec2
= DAG
.getNode(ISD::SCALAR_TO_VECTOR
, dl
, VT
, Value2
);
1953 Vec2
= DAG
.getUNDEF(VT
);
1955 // Return shuffle(LowValVec, undef, <0,0,0,0>)
1956 return DAG
.getVectorShuffle(VT
, dl
, Vec1
, Vec2
, ShuffleVec
);
1960 if (ExpandBVWithShuffles(Node
, DAG
, TLI
, Res
))
1965 // Otherwise, we can't handle this case efficiently.
1966 return ExpandVectorBuildThroughStack(Node
);
1969 // Expand a node into a call to a libcall. If the result value
1970 // does not fit into a register, return the lo part and set the hi part to the
1971 // by-reg argument. If it does fit into a single register, return the result
1972 // and leave the Hi part unset.
1973 SDValue
SelectionDAGLegalize::ExpandLibCall(RTLIB::Libcall LC
, SDNode
*Node
,
1975 TargetLowering::ArgListTy Args
;
1976 TargetLowering::ArgListEntry Entry
;
1977 for (const SDValue
&Op
: Node
->op_values()) {
1978 EVT ArgVT
= Op
.getValueType();
1979 Type
*ArgTy
= ArgVT
.getTypeForEVT(*DAG
.getContext());
1982 Entry
.IsSExt
= TLI
.shouldSignExtendTypeInLibCall(ArgVT
, isSigned
);
1983 Entry
.IsZExt
= !TLI
.shouldSignExtendTypeInLibCall(ArgVT
, isSigned
);
1984 Args
.push_back(Entry
);
1986 SDValue Callee
= DAG
.getExternalSymbol(TLI
.getLibcallName(LC
),
1987 TLI
.getPointerTy(DAG
.getDataLayout()));
1989 EVT RetVT
= Node
->getValueType(0);
1990 Type
*RetTy
= RetVT
.getTypeForEVT(*DAG
.getContext());
1992 // By default, the input chain to this libcall is the entry node of the
1993 // function. If the libcall is going to be emitted as a tail call then
1994 // TLI.isUsedByReturnOnly will change it to the right chain if the return
1995 // node which is being folded has a non-entry input chain.
1996 SDValue InChain
= DAG
.getEntryNode();
1998 // isTailCall may be true since the callee does not reference caller stack
1999 // frame. Check if it's in the right position and that the return types match.
2000 SDValue TCChain
= InChain
;
2001 const Function
&F
= DAG
.getMachineFunction().getFunction();
2003 TLI
.isInTailCallPosition(DAG
, Node
, TCChain
) &&
2004 (RetTy
== F
.getReturnType() || F
.getReturnType()->isVoidTy());
2008 TargetLowering::CallLoweringInfo
CLI(DAG
);
2009 bool signExtend
= TLI
.shouldSignExtendTypeInLibCall(RetVT
, isSigned
);
2010 CLI
.setDebugLoc(SDLoc(Node
))
2012 .setLibCallee(TLI
.getLibcallCallingConv(LC
), RetTy
, Callee
,
2014 .setTailCall(isTailCall
)
2015 .setSExtResult(signExtend
)
2016 .setZExtResult(!signExtend
)
2017 .setIsPostTypeLegalization(true);
2019 std::pair
<SDValue
, SDValue
> CallInfo
= TLI
.LowerCallTo(CLI
);
2021 if (!CallInfo
.second
.getNode()) {
2022 LLVM_DEBUG(dbgs() << "Created tailcall: "; DAG
.getRoot().dump());
2023 // It's a tailcall, return the chain (which is the DAG root).
2024 return DAG
.getRoot();
2027 LLVM_DEBUG(dbgs() << "Created libcall: "; CallInfo
.first
.dump());
2028 return CallInfo
.first
;
2031 /// Generate a libcall taking the given operands as arguments
2032 /// and returning a result of type RetVT.
2033 SDValue
SelectionDAGLegalize::ExpandLibCall(RTLIB::Libcall LC
, EVT RetVT
,
2034 const SDValue
*Ops
, unsigned NumOps
,
2035 bool isSigned
, const SDLoc
&dl
) {
2036 TargetLowering::ArgListTy Args
;
2037 Args
.reserve(NumOps
);
2039 TargetLowering::ArgListEntry Entry
;
2040 for (unsigned i
= 0; i
!= NumOps
; ++i
) {
2041 Entry
.Node
= Ops
[i
];
2042 Entry
.Ty
= Entry
.Node
.getValueType().getTypeForEVT(*DAG
.getContext());
2043 Entry
.IsSExt
= isSigned
;
2044 Entry
.IsZExt
= !isSigned
;
2045 Args
.push_back(Entry
);
2047 SDValue Callee
= DAG
.getExternalSymbol(TLI
.getLibcallName(LC
),
2048 TLI
.getPointerTy(DAG
.getDataLayout()));
2050 Type
*RetTy
= RetVT
.getTypeForEVT(*DAG
.getContext());
2052 TargetLowering::CallLoweringInfo
CLI(DAG
);
2054 .setChain(DAG
.getEntryNode())
2055 .setLibCallee(TLI
.getLibcallCallingConv(LC
), RetTy
, Callee
,
2057 .setSExtResult(isSigned
)
2058 .setZExtResult(!isSigned
)
2059 .setIsPostTypeLegalization(true);
2061 std::pair
<SDValue
,SDValue
> CallInfo
= TLI
.LowerCallTo(CLI
);
2063 return CallInfo
.first
;
2066 // Expand a node into a call to a libcall. Similar to
2067 // ExpandLibCall except that the first operand is the in-chain.
2068 std::pair
<SDValue
, SDValue
>
2069 SelectionDAGLegalize::ExpandChainLibCall(RTLIB::Libcall LC
,
2072 SDValue InChain
= Node
->getOperand(0);
2074 TargetLowering::ArgListTy Args
;
2075 TargetLowering::ArgListEntry Entry
;
2076 for (unsigned i
= 1, e
= Node
->getNumOperands(); i
!= e
; ++i
) {
2077 EVT ArgVT
= Node
->getOperand(i
).getValueType();
2078 Type
*ArgTy
= ArgVT
.getTypeForEVT(*DAG
.getContext());
2079 Entry
.Node
= Node
->getOperand(i
);
2081 Entry
.IsSExt
= isSigned
;
2082 Entry
.IsZExt
= !isSigned
;
2083 Args
.push_back(Entry
);
2085 SDValue Callee
= DAG
.getExternalSymbol(TLI
.getLibcallName(LC
),
2086 TLI
.getPointerTy(DAG
.getDataLayout()));
2088 Type
*RetTy
= Node
->getValueType(0).getTypeForEVT(*DAG
.getContext());
2090 TargetLowering::CallLoweringInfo
CLI(DAG
);
2091 CLI
.setDebugLoc(SDLoc(Node
))
2093 .setLibCallee(TLI
.getLibcallCallingConv(LC
), RetTy
, Callee
,
2095 .setSExtResult(isSigned
)
2096 .setZExtResult(!isSigned
);
2098 std::pair
<SDValue
, SDValue
> CallInfo
= TLI
.LowerCallTo(CLI
);
2103 SDValue
SelectionDAGLegalize::ExpandFPLibCall(SDNode
* Node
,
2104 RTLIB::Libcall Call_F32
,
2105 RTLIB::Libcall Call_F64
,
2106 RTLIB::Libcall Call_F80
,
2107 RTLIB::Libcall Call_F128
,
2108 RTLIB::Libcall Call_PPCF128
) {
2109 if (Node
->isStrictFPOpcode())
2110 Node
= DAG
.mutateStrictFPToFP(Node
);
2113 switch (Node
->getSimpleValueType(0).SimpleTy
) {
2114 default: llvm_unreachable("Unexpected request for libcall!");
2115 case MVT::f32
: LC
= Call_F32
; break;
2116 case MVT::f64
: LC
= Call_F64
; break;
2117 case MVT::f80
: LC
= Call_F80
; break;
2118 case MVT::f128
: LC
= Call_F128
; break;
2119 case MVT::ppcf128
: LC
= Call_PPCF128
; break;
2121 return ExpandLibCall(LC
, Node
, false);
2124 SDValue
SelectionDAGLegalize::ExpandIntLibCall(SDNode
* Node
, bool isSigned
,
2125 RTLIB::Libcall Call_I8
,
2126 RTLIB::Libcall Call_I16
,
2127 RTLIB::Libcall Call_I32
,
2128 RTLIB::Libcall Call_I64
,
2129 RTLIB::Libcall Call_I128
) {
2131 switch (Node
->getSimpleValueType(0).SimpleTy
) {
2132 default: llvm_unreachable("Unexpected request for libcall!");
2133 case MVT::i8
: LC
= Call_I8
; break;
2134 case MVT::i16
: LC
= Call_I16
; break;
2135 case MVT::i32
: LC
= Call_I32
; break;
2136 case MVT::i64
: LC
= Call_I64
; break;
2137 case MVT::i128
: LC
= Call_I128
; break;
2139 return ExpandLibCall(LC
, Node
, isSigned
);
2142 /// Issue libcalls to __{u}divmod to compute div / rem pairs.
2144 SelectionDAGLegalize::ExpandDivRemLibCall(SDNode
*Node
,
2145 SmallVectorImpl
<SDValue
> &Results
) {
2146 unsigned Opcode
= Node
->getOpcode();
2147 bool isSigned
= Opcode
== ISD::SDIVREM
;
2150 switch (Node
->getSimpleValueType(0).SimpleTy
) {
2151 default: llvm_unreachable("Unexpected request for libcall!");
2152 case MVT::i8
: LC
= isSigned
? RTLIB::SDIVREM_I8
: RTLIB::UDIVREM_I8
; break;
2153 case MVT::i16
: LC
= isSigned
? RTLIB::SDIVREM_I16
: RTLIB::UDIVREM_I16
; break;
2154 case MVT::i32
: LC
= isSigned
? RTLIB::SDIVREM_I32
: RTLIB::UDIVREM_I32
; break;
2155 case MVT::i64
: LC
= isSigned
? RTLIB::SDIVREM_I64
: RTLIB::UDIVREM_I64
; break;
2156 case MVT::i128
: LC
= isSigned
? RTLIB::SDIVREM_I128
:RTLIB::UDIVREM_I128
; break;
2159 // The input chain to this libcall is the entry node of the function.
2160 // Legalizing the call will automatically add the previous call to the
2162 SDValue InChain
= DAG
.getEntryNode();
2164 EVT RetVT
= Node
->getValueType(0);
2165 Type
*RetTy
= RetVT
.getTypeForEVT(*DAG
.getContext());
2167 TargetLowering::ArgListTy Args
;
2168 TargetLowering::ArgListEntry Entry
;
2169 for (const SDValue
&Op
: Node
->op_values()) {
2170 EVT ArgVT
= Op
.getValueType();
2171 Type
*ArgTy
= ArgVT
.getTypeForEVT(*DAG
.getContext());
2174 Entry
.IsSExt
= isSigned
;
2175 Entry
.IsZExt
= !isSigned
;
2176 Args
.push_back(Entry
);
2179 // Also pass the return address of the remainder.
2180 SDValue FIPtr
= DAG
.CreateStackTemporary(RetVT
);
2182 Entry
.Ty
= RetTy
->getPointerTo();
2183 Entry
.IsSExt
= isSigned
;
2184 Entry
.IsZExt
= !isSigned
;
2185 Args
.push_back(Entry
);
2187 SDValue Callee
= DAG
.getExternalSymbol(TLI
.getLibcallName(LC
),
2188 TLI
.getPointerTy(DAG
.getDataLayout()));
2191 TargetLowering::CallLoweringInfo
CLI(DAG
);
2194 .setLibCallee(TLI
.getLibcallCallingConv(LC
), RetTy
, Callee
,
2196 .setSExtResult(isSigned
)
2197 .setZExtResult(!isSigned
);
2199 std::pair
<SDValue
, SDValue
> CallInfo
= TLI
.LowerCallTo(CLI
);
2201 // Remainder is loaded back from the stack frame.
2203 DAG
.getLoad(RetVT
, dl
, CallInfo
.second
, FIPtr
, MachinePointerInfo());
2204 Results
.push_back(CallInfo
.first
);
2205 Results
.push_back(Rem
);
2208 /// Return true if sincos libcall is available.
2209 static bool isSinCosLibcallAvailable(SDNode
*Node
, const TargetLowering
&TLI
) {
2211 switch (Node
->getSimpleValueType(0).SimpleTy
) {
2212 default: llvm_unreachable("Unexpected request for libcall!");
2213 case MVT::f32
: LC
= RTLIB::SINCOS_F32
; break;
2214 case MVT::f64
: LC
= RTLIB::SINCOS_F64
; break;
2215 case MVT::f80
: LC
= RTLIB::SINCOS_F80
; break;
2216 case MVT::f128
: LC
= RTLIB::SINCOS_F128
; break;
2217 case MVT::ppcf128
: LC
= RTLIB::SINCOS_PPCF128
; break;
2219 return TLI
.getLibcallName(LC
) != nullptr;
2222 /// Only issue sincos libcall if both sin and cos are needed.
2223 static bool useSinCos(SDNode
*Node
) {
2224 unsigned OtherOpcode
= Node
->getOpcode() == ISD::FSIN
2225 ? ISD::FCOS
: ISD::FSIN
;
2227 SDValue Op0
= Node
->getOperand(0);
2228 for (SDNode::use_iterator UI
= Op0
.getNode()->use_begin(),
2229 UE
= Op0
.getNode()->use_end(); UI
!= UE
; ++UI
) {
2233 // The other user might have been turned into sincos already.
2234 if (User
->getOpcode() == OtherOpcode
|| User
->getOpcode() == ISD::FSINCOS
)
2240 /// Issue libcalls to sincos to compute sin / cos pairs.
2242 SelectionDAGLegalize::ExpandSinCosLibCall(SDNode
*Node
,
2243 SmallVectorImpl
<SDValue
> &Results
) {
2245 switch (Node
->getSimpleValueType(0).SimpleTy
) {
2246 default: llvm_unreachable("Unexpected request for libcall!");
2247 case MVT::f32
: LC
= RTLIB::SINCOS_F32
; break;
2248 case MVT::f64
: LC
= RTLIB::SINCOS_F64
; break;
2249 case MVT::f80
: LC
= RTLIB::SINCOS_F80
; break;
2250 case MVT::f128
: LC
= RTLIB::SINCOS_F128
; break;
2251 case MVT::ppcf128
: LC
= RTLIB::SINCOS_PPCF128
; break;
2254 // The input chain to this libcall is the entry node of the function.
2255 // Legalizing the call will automatically add the previous call to the
2257 SDValue InChain
= DAG
.getEntryNode();
2259 EVT RetVT
= Node
->getValueType(0);
2260 Type
*RetTy
= RetVT
.getTypeForEVT(*DAG
.getContext());
2262 TargetLowering::ArgListTy Args
;
2263 TargetLowering::ArgListEntry Entry
;
2265 // Pass the argument.
2266 Entry
.Node
= Node
->getOperand(0);
2268 Entry
.IsSExt
= false;
2269 Entry
.IsZExt
= false;
2270 Args
.push_back(Entry
);
2272 // Pass the return address of sin.
2273 SDValue SinPtr
= DAG
.CreateStackTemporary(RetVT
);
2274 Entry
.Node
= SinPtr
;
2275 Entry
.Ty
= RetTy
->getPointerTo();
2276 Entry
.IsSExt
= false;
2277 Entry
.IsZExt
= false;
2278 Args
.push_back(Entry
);
2280 // Also pass the return address of the cos.
2281 SDValue CosPtr
= DAG
.CreateStackTemporary(RetVT
);
2282 Entry
.Node
= CosPtr
;
2283 Entry
.Ty
= RetTy
->getPointerTo();
2284 Entry
.IsSExt
= false;
2285 Entry
.IsZExt
= false;
2286 Args
.push_back(Entry
);
2288 SDValue Callee
= DAG
.getExternalSymbol(TLI
.getLibcallName(LC
),
2289 TLI
.getPointerTy(DAG
.getDataLayout()));
2292 TargetLowering::CallLoweringInfo
CLI(DAG
);
2293 CLI
.setDebugLoc(dl
).setChain(InChain
).setLibCallee(
2294 TLI
.getLibcallCallingConv(LC
), Type::getVoidTy(*DAG
.getContext()), Callee
,
2297 std::pair
<SDValue
, SDValue
> CallInfo
= TLI
.LowerCallTo(CLI
);
2300 DAG
.getLoad(RetVT
, dl
, CallInfo
.second
, SinPtr
, MachinePointerInfo()));
2302 DAG
.getLoad(RetVT
, dl
, CallInfo
.second
, CosPtr
, MachinePointerInfo()));
2305 /// This function is responsible for legalizing a
2306 /// INT_TO_FP operation of the specified operand when the target requests that
2307 /// we expand it. At this point, we know that the result and operand types are
2308 /// legal for the target.
2309 SDValue
SelectionDAGLegalize::ExpandLegalINT_TO_FP(bool isSigned
, SDValue Op0
,
2312 EVT SrcVT
= Op0
.getValueType();
2314 // TODO: Should any fast-math-flags be set for the created nodes?
2315 LLVM_DEBUG(dbgs() << "Legalizing INT_TO_FP\n");
2316 if (SrcVT
== MVT::i32
&& TLI
.isTypeLegal(MVT::f64
)) {
2317 LLVM_DEBUG(dbgs() << "32-bit [signed|unsigned] integer to float/double "
2320 // Get the stack frame index of a 8 byte buffer.
2321 SDValue StackSlot
= DAG
.CreateStackTemporary(MVT::f64
);
2323 // word offset constant for Hi/Lo address computation
2324 SDValue WordOff
= DAG
.getConstant(sizeof(int), dl
,
2325 StackSlot
.getValueType());
2326 // set up Hi and Lo (into buffer) address based on endian
2327 SDValue Hi
= StackSlot
;
2328 SDValue Lo
= DAG
.getNode(ISD::ADD
, dl
, StackSlot
.getValueType(),
2329 StackSlot
, WordOff
);
2330 if (DAG
.getDataLayout().isLittleEndian())
2333 // if signed map to unsigned space
2336 // constant used to invert sign bit (signed to unsigned mapping)
2337 SDValue SignBit
= DAG
.getConstant(0x80000000u
, dl
, MVT::i32
);
2338 Op0Mapped
= DAG
.getNode(ISD::XOR
, dl
, MVT::i32
, Op0
, SignBit
);
2342 // store the lo of the constructed double - based on integer input
2343 SDValue Store1
= DAG
.getStore(DAG
.getEntryNode(), dl
, Op0Mapped
, Lo
,
2344 MachinePointerInfo());
2345 // initial hi portion of constructed double
2346 SDValue InitialHi
= DAG
.getConstant(0x43300000u
, dl
, MVT::i32
);
2347 // store the hi of the constructed double - biased exponent
2349 DAG
.getStore(Store1
, dl
, InitialHi
, Hi
, MachinePointerInfo());
2350 // load the constructed double
2352 DAG
.getLoad(MVT::f64
, dl
, Store2
, StackSlot
, MachinePointerInfo());
2353 // FP constant to bias correct the final result
2354 SDValue Bias
= DAG
.getConstantFP(isSigned
?
2355 BitsToDouble(0x4330000080000000ULL
) :
2356 BitsToDouble(0x4330000000000000ULL
),
2358 // subtract the bias
2359 SDValue Sub
= DAG
.getNode(ISD::FSUB
, dl
, MVT::f64
, Load
, Bias
);
2361 SDValue Result
= DAG
.getFPExtendOrRound(Sub
, dl
, DestVT
);
2364 assert(!isSigned
&& "Legalize cannot Expand SINT_TO_FP for i64 yet");
2365 // Code below here assumes !isSigned without checking again.
2367 // Implementation of unsigned i64 to f64 following the algorithm in
2368 // __floatundidf in compiler_rt. This implementation has the advantage
2369 // of performing rounding correctly, both in the default rounding mode
2370 // and in all alternate rounding modes.
2371 // TODO: Generalize this for use with other types.
2372 if (SrcVT
== MVT::i64
&& DestVT
== MVT::f64
) {
2373 LLVM_DEBUG(dbgs() << "Converting unsigned i64 to f64\n");
2375 DAG
.getConstant(UINT64_C(0x4330000000000000), dl
, MVT::i64
);
2376 SDValue TwoP84PlusTwoP52
=
2377 DAG
.getConstantFP(BitsToDouble(UINT64_C(0x4530000000100000)), dl
,
2380 DAG
.getConstant(UINT64_C(0x4530000000000000), dl
, MVT::i64
);
2382 SDValue Lo
= DAG
.getZeroExtendInReg(Op0
, dl
, MVT::i32
);
2383 SDValue Hi
= DAG
.getNode(ISD::SRL
, dl
, MVT::i64
, Op0
,
2384 DAG
.getConstant(32, dl
, MVT::i64
));
2385 SDValue LoOr
= DAG
.getNode(ISD::OR
, dl
, MVT::i64
, Lo
, TwoP52
);
2386 SDValue HiOr
= DAG
.getNode(ISD::OR
, dl
, MVT::i64
, Hi
, TwoP84
);
2387 SDValue LoFlt
= DAG
.getNode(ISD::BITCAST
, dl
, MVT::f64
, LoOr
);
2388 SDValue HiFlt
= DAG
.getNode(ISD::BITCAST
, dl
, MVT::f64
, HiOr
);
2389 SDValue HiSub
= DAG
.getNode(ISD::FSUB
, dl
, MVT::f64
, HiFlt
,
2391 return DAG
.getNode(ISD::FADD
, dl
, MVT::f64
, LoFlt
, HiSub
);
2394 // TODO: Generalize this for use with other types.
2395 if (SrcVT
== MVT::i64
&& DestVT
== MVT::f32
) {
2396 LLVM_DEBUG(dbgs() << "Converting unsigned i64 to f32\n");
2397 // For unsigned conversions, convert them to signed conversions using the
2398 // algorithm from the x86_64 __floatundidf in compiler_rt.
2400 SDValue Fast
= DAG
.getNode(ISD::SINT_TO_FP
, dl
, MVT::f32
, Op0
);
2402 SDValue ShiftConst
= DAG
.getConstant(
2403 1, dl
, TLI
.getShiftAmountTy(SrcVT
, DAG
.getDataLayout()));
2404 SDValue Shr
= DAG
.getNode(ISD::SRL
, dl
, MVT::i64
, Op0
, ShiftConst
);
2405 SDValue AndConst
= DAG
.getConstant(1, dl
, MVT::i64
);
2406 SDValue And
= DAG
.getNode(ISD::AND
, dl
, MVT::i64
, Op0
, AndConst
);
2407 SDValue Or
= DAG
.getNode(ISD::OR
, dl
, MVT::i64
, And
, Shr
);
2409 SDValue SignCvt
= DAG
.getNode(ISD::SINT_TO_FP
, dl
, MVT::f32
, Or
);
2410 SDValue Slow
= DAG
.getNode(ISD::FADD
, dl
, MVT::f32
, SignCvt
, SignCvt
);
2412 // TODO: This really should be implemented using a branch rather than a
2413 // select. We happen to get lucky and machinesink does the right
2414 // thing most of the time. This would be a good candidate for a
2415 //pseudo-op, or, even better, for whole-function isel.
2416 SDValue SignBitTest
= DAG
.getSetCC(dl
, getSetCCResultType(MVT::i64
),
2417 Op0
, DAG
.getConstant(0, dl
, MVT::i64
), ISD::SETLT
);
2418 return DAG
.getSelect(dl
, MVT::f32
, SignBitTest
, Slow
, Fast
);
2421 // Otherwise, implement the fully general conversion.
2423 SDValue And
= DAG
.getNode(ISD::AND
, dl
, MVT::i64
, Op0
,
2424 DAG
.getConstant(UINT64_C(0xfffffffffffff800), dl
, MVT::i64
));
2425 SDValue Or
= DAG
.getNode(ISD::OR
, dl
, MVT::i64
, And
,
2426 DAG
.getConstant(UINT64_C(0x800), dl
, MVT::i64
));
2427 SDValue And2
= DAG
.getNode(ISD::AND
, dl
, MVT::i64
, Op0
,
2428 DAG
.getConstant(UINT64_C(0x7ff), dl
, MVT::i64
));
2429 SDValue Ne
= DAG
.getSetCC(dl
, getSetCCResultType(MVT::i64
), And2
,
2430 DAG
.getConstant(UINT64_C(0), dl
, MVT::i64
),
2432 SDValue Sel
= DAG
.getSelect(dl
, MVT::i64
, Ne
, Or
, Op0
);
2433 SDValue Ge
= DAG
.getSetCC(dl
, getSetCCResultType(MVT::i64
), Op0
,
2434 DAG
.getConstant(UINT64_C(0x0020000000000000), dl
,
2437 SDValue Sel2
= DAG
.getSelect(dl
, MVT::i64
, Ge
, Sel
, Op0
);
2438 EVT SHVT
= TLI
.getShiftAmountTy(Sel2
.getValueType(), DAG
.getDataLayout());
2440 SDValue Sh
= DAG
.getNode(ISD::SRL
, dl
, MVT::i64
, Sel2
,
2441 DAG
.getConstant(32, dl
, SHVT
));
2442 SDValue Trunc
= DAG
.getNode(ISD::TRUNCATE
, dl
, MVT::i32
, Sh
);
2443 SDValue Fcvt
= DAG
.getNode(ISD::UINT_TO_FP
, dl
, MVT::f64
, Trunc
);
2445 DAG
.getConstantFP(BitsToDouble(UINT64_C(0x41f0000000000000)), dl
,
2447 SDValue Fmul
= DAG
.getNode(ISD::FMUL
, dl
, MVT::f64
, TwoP32
, Fcvt
);
2448 SDValue Lo
= DAG
.getNode(ISD::TRUNCATE
, dl
, MVT::i32
, Sel2
);
2449 SDValue Fcvt2
= DAG
.getNode(ISD::UINT_TO_FP
, dl
, MVT::f64
, Lo
);
2450 SDValue Fadd
= DAG
.getNode(ISD::FADD
, dl
, MVT::f64
, Fmul
, Fcvt2
);
2451 return DAG
.getNode(ISD::FP_ROUND
, dl
, MVT::f32
, Fadd
,
2452 DAG
.getIntPtrConstant(0, dl
));
2455 SDValue Tmp1
= DAG
.getNode(ISD::SINT_TO_FP
, dl
, DestVT
, Op0
);
2457 SDValue SignSet
= DAG
.getSetCC(dl
, getSetCCResultType(SrcVT
), Op0
,
2458 DAG
.getConstant(0, dl
, SrcVT
), ISD::SETLT
);
2459 SDValue Zero
= DAG
.getIntPtrConstant(0, dl
),
2460 Four
= DAG
.getIntPtrConstant(4, dl
);
2461 SDValue CstOffset
= DAG
.getSelect(dl
, Zero
.getValueType(),
2462 SignSet
, Four
, Zero
);
2464 // If the sign bit of the integer is set, the large number will be treated
2465 // as a negative number. To counteract this, the dynamic code adds an
2466 // offset depending on the data type.
2468 switch (SrcVT
.getSimpleVT().SimpleTy
) {
2469 default: llvm_unreachable("Unsupported integer type!");
2470 case MVT::i8
: FF
= 0x43800000ULL
; break; // 2^8 (as a float)
2471 case MVT::i16
: FF
= 0x47800000ULL
; break; // 2^16 (as a float)
2472 case MVT::i32
: FF
= 0x4F800000ULL
; break; // 2^32 (as a float)
2473 case MVT::i64
: FF
= 0x5F800000ULL
; break; // 2^64 (as a float)
2475 if (DAG
.getDataLayout().isLittleEndian())
2477 Constant
*FudgeFactor
= ConstantInt::get(
2478 Type::getInt64Ty(*DAG
.getContext()), FF
);
2481 DAG
.getConstantPool(FudgeFactor
, TLI
.getPointerTy(DAG
.getDataLayout()));
2482 unsigned Alignment
= cast
<ConstantPoolSDNode
>(CPIdx
)->getAlignment();
2483 CPIdx
= DAG
.getNode(ISD::ADD
, dl
, CPIdx
.getValueType(), CPIdx
, CstOffset
);
2484 Alignment
= std::min(Alignment
, 4u);
2486 if (DestVT
== MVT::f32
)
2487 FudgeInReg
= DAG
.getLoad(
2488 MVT::f32
, dl
, DAG
.getEntryNode(), CPIdx
,
2489 MachinePointerInfo::getConstantPool(DAG
.getMachineFunction()),
2492 SDValue Load
= DAG
.getExtLoad(
2493 ISD::EXTLOAD
, dl
, DestVT
, DAG
.getEntryNode(), CPIdx
,
2494 MachinePointerInfo::getConstantPool(DAG
.getMachineFunction()), MVT::f32
,
2496 HandleSDNode
Handle(Load
);
2497 LegalizeOp(Load
.getNode());
2498 FudgeInReg
= Handle
.getValue();
2501 return DAG
.getNode(ISD::FADD
, dl
, DestVT
, Tmp1
, FudgeInReg
);
2504 /// This function is responsible for legalizing a
2505 /// *INT_TO_FP operation of the specified operand when the target requests that
2506 /// we promote it. At this point, we know that the result and operand types are
2507 /// legal for the target, and that there is a legal UINT_TO_FP or SINT_TO_FP
2508 /// operation that takes a larger input.
2509 SDValue
SelectionDAGLegalize::PromoteLegalINT_TO_FP(SDValue LegalOp
, EVT DestVT
,
2512 // First step, figure out the appropriate *INT_TO_FP operation to use.
2513 EVT NewInTy
= LegalOp
.getValueType();
2515 unsigned OpToUse
= 0;
2517 // Scan for the appropriate larger type to use.
2519 NewInTy
= (MVT::SimpleValueType
)(NewInTy
.getSimpleVT().SimpleTy
+1);
2520 assert(NewInTy
.isInteger() && "Ran out of possibilities!");
2522 // If the target supports SINT_TO_FP of this type, use it.
2523 if (TLI
.isOperationLegalOrCustom(ISD::SINT_TO_FP
, NewInTy
)) {
2524 OpToUse
= ISD::SINT_TO_FP
;
2527 if (isSigned
) continue;
2529 // If the target supports UINT_TO_FP of this type, use it.
2530 if (TLI
.isOperationLegalOrCustom(ISD::UINT_TO_FP
, NewInTy
)) {
2531 OpToUse
= ISD::UINT_TO_FP
;
2535 // Otherwise, try a larger type.
2538 // Okay, we found the operation and type to use. Zero extend our input to the
2539 // desired type then run the operation on it.
2540 return DAG
.getNode(OpToUse
, dl
, DestVT
,
2541 DAG
.getNode(isSigned
? ISD::SIGN_EXTEND
: ISD::ZERO_EXTEND
,
2542 dl
, NewInTy
, LegalOp
));
2545 /// This function is responsible for legalizing a
2546 /// FP_TO_*INT operation of the specified operand when the target requests that
2547 /// we promote it. At this point, we know that the result and operand types are
2548 /// legal for the target, and that there is a legal FP_TO_UINT or FP_TO_SINT
2549 /// operation that returns a larger result.
2550 SDValue
SelectionDAGLegalize::PromoteLegalFP_TO_INT(SDValue LegalOp
, EVT DestVT
,
2553 // First step, figure out the appropriate FP_TO*INT operation to use.
2554 EVT NewOutTy
= DestVT
;
2556 unsigned OpToUse
= 0;
2558 // Scan for the appropriate larger type to use.
2560 NewOutTy
= (MVT::SimpleValueType
)(NewOutTy
.getSimpleVT().SimpleTy
+1);
2561 assert(NewOutTy
.isInteger() && "Ran out of possibilities!");
2563 // A larger signed type can hold all unsigned values of the requested type,
2564 // so using FP_TO_SINT is valid
2565 if (TLI
.isOperationLegalOrCustom(ISD::FP_TO_SINT
, NewOutTy
)) {
2566 OpToUse
= ISD::FP_TO_SINT
;
2570 // However, if the value may be < 0.0, we *must* use some FP_TO_SINT.
2571 if (!isSigned
&& TLI
.isOperationLegalOrCustom(ISD::FP_TO_UINT
, NewOutTy
)) {
2572 OpToUse
= ISD::FP_TO_UINT
;
2576 // Otherwise, try a larger type.
2579 // Okay, we found the operation and type to use.
2580 SDValue Operation
= DAG
.getNode(OpToUse
, dl
, NewOutTy
, LegalOp
);
2582 // Truncate the result of the extended FP_TO_*INT operation to the desired
2584 return DAG
.getNode(ISD::TRUNCATE
, dl
, DestVT
, Operation
);
2587 /// Legalize a BITREVERSE scalar/vector operation as a series of mask + shifts.
2588 SDValue
SelectionDAGLegalize::ExpandBITREVERSE(SDValue Op
, const SDLoc
&dl
) {
2589 EVT VT
= Op
.getValueType();
2590 EVT SHVT
= TLI
.getShiftAmountTy(VT
, DAG
.getDataLayout());
2591 unsigned Sz
= VT
.getScalarSizeInBits();
2593 SDValue Tmp
, Tmp2
, Tmp3
;
2595 // If we can, perform BSWAP first and then the mask+swap the i4, then i2
2596 // and finally the i1 pairs.
2597 // TODO: We can easily support i4/i2 legal types if any target ever does.
2598 if (Sz
>= 8 && isPowerOf2_32(Sz
)) {
2599 // Create the masks - repeating the pattern every byte.
2600 APInt
MaskHi4(Sz
, 0), MaskHi2(Sz
, 0), MaskHi1(Sz
, 0);
2601 APInt
MaskLo4(Sz
, 0), MaskLo2(Sz
, 0), MaskLo1(Sz
, 0);
2602 for (unsigned J
= 0; J
!= Sz
; J
+= 8) {
2603 MaskHi4
= MaskHi4
| (0xF0ull
<< J
);
2604 MaskLo4
= MaskLo4
| (0x0Full
<< J
);
2605 MaskHi2
= MaskHi2
| (0xCCull
<< J
);
2606 MaskLo2
= MaskLo2
| (0x33ull
<< J
);
2607 MaskHi1
= MaskHi1
| (0xAAull
<< J
);
2608 MaskLo1
= MaskLo1
| (0x55ull
<< J
);
2611 // BSWAP if the type is wider than a single byte.
2612 Tmp
= (Sz
> 8 ? DAG
.getNode(ISD::BSWAP
, dl
, VT
, Op
) : Op
);
2614 // swap i4: ((V & 0xF0) >> 4) | ((V & 0x0F) << 4)
2615 Tmp2
= DAG
.getNode(ISD::AND
, dl
, VT
, Tmp
, DAG
.getConstant(MaskHi4
, dl
, VT
));
2616 Tmp3
= DAG
.getNode(ISD::AND
, dl
, VT
, Tmp
, DAG
.getConstant(MaskLo4
, dl
, VT
));
2617 Tmp2
= DAG
.getNode(ISD::SRL
, dl
, VT
, Tmp2
, DAG
.getConstant(4, dl
, VT
));
2618 Tmp3
= DAG
.getNode(ISD::SHL
, dl
, VT
, Tmp3
, DAG
.getConstant(4, dl
, VT
));
2619 Tmp
= DAG
.getNode(ISD::OR
, dl
, VT
, Tmp2
, Tmp3
);
2621 // swap i2: ((V & 0xCC) >> 2) | ((V & 0x33) << 2)
2622 Tmp2
= DAG
.getNode(ISD::AND
, dl
, VT
, Tmp
, DAG
.getConstant(MaskHi2
, dl
, VT
));
2623 Tmp3
= DAG
.getNode(ISD::AND
, dl
, VT
, Tmp
, DAG
.getConstant(MaskLo2
, dl
, VT
));
2624 Tmp2
= DAG
.getNode(ISD::SRL
, dl
, VT
, Tmp2
, DAG
.getConstant(2, dl
, VT
));
2625 Tmp3
= DAG
.getNode(ISD::SHL
, dl
, VT
, Tmp3
, DAG
.getConstant(2, dl
, VT
));
2626 Tmp
= DAG
.getNode(ISD::OR
, dl
, VT
, Tmp2
, Tmp3
);
2628 // swap i1: ((V & 0xAA) >> 1) | ((V & 0x55) << 1)
2629 Tmp2
= DAG
.getNode(ISD::AND
, dl
, VT
, Tmp
, DAG
.getConstant(MaskHi1
, dl
, VT
));
2630 Tmp3
= DAG
.getNode(ISD::AND
, dl
, VT
, Tmp
, DAG
.getConstant(MaskLo1
, dl
, VT
));
2631 Tmp2
= DAG
.getNode(ISD::SRL
, dl
, VT
, Tmp2
, DAG
.getConstant(1, dl
, VT
));
2632 Tmp3
= DAG
.getNode(ISD::SHL
, dl
, VT
, Tmp3
, DAG
.getConstant(1, dl
, VT
));
2633 Tmp
= DAG
.getNode(ISD::OR
, dl
, VT
, Tmp2
, Tmp3
);
2637 Tmp
= DAG
.getConstant(0, dl
, VT
);
2638 for (unsigned I
= 0, J
= Sz
-1; I
< Sz
; ++I
, --J
) {
2641 DAG
.getNode(ISD::SHL
, dl
, VT
, Op
, DAG
.getConstant(J
- I
, dl
, SHVT
));
2644 DAG
.getNode(ISD::SRL
, dl
, VT
, Op
, DAG
.getConstant(I
- J
, dl
, SHVT
));
2648 Tmp2
= DAG
.getNode(ISD::AND
, dl
, VT
, Tmp2
, DAG
.getConstant(Shift
, dl
, VT
));
2649 Tmp
= DAG
.getNode(ISD::OR
, dl
, VT
, Tmp
, Tmp2
);
2655 /// Open code the operations for BSWAP of the specified operation.
2656 SDValue
SelectionDAGLegalize::ExpandBSWAP(SDValue Op
, const SDLoc
&dl
) {
2657 EVT VT
= Op
.getValueType();
2658 EVT SHVT
= TLI
.getShiftAmountTy(VT
, DAG
.getDataLayout());
2659 SDValue Tmp1
, Tmp2
, Tmp3
, Tmp4
, Tmp5
, Tmp6
, Tmp7
, Tmp8
;
2660 switch (VT
.getSimpleVT().getScalarType().SimpleTy
) {
2661 default: llvm_unreachable("Unhandled Expand type in BSWAP!");
2663 Tmp2
= DAG
.getNode(ISD::SHL
, dl
, VT
, Op
, DAG
.getConstant(8, dl
, SHVT
));
2664 Tmp1
= DAG
.getNode(ISD::SRL
, dl
, VT
, Op
, DAG
.getConstant(8, dl
, SHVT
));
2665 return DAG
.getNode(ISD::OR
, dl
, VT
, Tmp1
, Tmp2
);
2667 Tmp4
= DAG
.getNode(ISD::SHL
, dl
, VT
, Op
, DAG
.getConstant(24, dl
, SHVT
));
2668 Tmp3
= DAG
.getNode(ISD::SHL
, dl
, VT
, Op
, DAG
.getConstant(8, dl
, SHVT
));
2669 Tmp2
= DAG
.getNode(ISD::SRL
, dl
, VT
, Op
, DAG
.getConstant(8, dl
, SHVT
));
2670 Tmp1
= DAG
.getNode(ISD::SRL
, dl
, VT
, Op
, DAG
.getConstant(24, dl
, SHVT
));
2671 Tmp3
= DAG
.getNode(ISD::AND
, dl
, VT
, Tmp3
,
2672 DAG
.getConstant(0xFF0000, dl
, VT
));
2673 Tmp2
= DAG
.getNode(ISD::AND
, dl
, VT
, Tmp2
, DAG
.getConstant(0xFF00, dl
, VT
));
2674 Tmp4
= DAG
.getNode(ISD::OR
, dl
, VT
, Tmp4
, Tmp3
);
2675 Tmp2
= DAG
.getNode(ISD::OR
, dl
, VT
, Tmp2
, Tmp1
);
2676 return DAG
.getNode(ISD::OR
, dl
, VT
, Tmp4
, Tmp2
);
2678 Tmp8
= DAG
.getNode(ISD::SHL
, dl
, VT
, Op
, DAG
.getConstant(56, dl
, SHVT
));
2679 Tmp7
= DAG
.getNode(ISD::SHL
, dl
, VT
, Op
, DAG
.getConstant(40, dl
, SHVT
));
2680 Tmp6
= DAG
.getNode(ISD::SHL
, dl
, VT
, Op
, DAG
.getConstant(24, dl
, SHVT
));
2681 Tmp5
= DAG
.getNode(ISD::SHL
, dl
, VT
, Op
, DAG
.getConstant(8, dl
, SHVT
));
2682 Tmp4
= DAG
.getNode(ISD::SRL
, dl
, VT
, Op
, DAG
.getConstant(8, dl
, SHVT
));
2683 Tmp3
= DAG
.getNode(ISD::SRL
, dl
, VT
, Op
, DAG
.getConstant(24, dl
, SHVT
));
2684 Tmp2
= DAG
.getNode(ISD::SRL
, dl
, VT
, Op
, DAG
.getConstant(40, dl
, SHVT
));
2685 Tmp1
= DAG
.getNode(ISD::SRL
, dl
, VT
, Op
, DAG
.getConstant(56, dl
, SHVT
));
2686 Tmp7
= DAG
.getNode(ISD::AND
, dl
, VT
, Tmp7
,
2687 DAG
.getConstant(255ULL<<48, dl
, VT
));
2688 Tmp6
= DAG
.getNode(ISD::AND
, dl
, VT
, Tmp6
,
2689 DAG
.getConstant(255ULL<<40, dl
, VT
));
2690 Tmp5
= DAG
.getNode(ISD::AND
, dl
, VT
, Tmp5
,
2691 DAG
.getConstant(255ULL<<32, dl
, VT
));
2692 Tmp4
= DAG
.getNode(ISD::AND
, dl
, VT
, Tmp4
,
2693 DAG
.getConstant(255ULL<<24, dl
, VT
));
2694 Tmp3
= DAG
.getNode(ISD::AND
, dl
, VT
, Tmp3
,
2695 DAG
.getConstant(255ULL<<16, dl
, VT
));
2696 Tmp2
= DAG
.getNode(ISD::AND
, dl
, VT
, Tmp2
,
2697 DAG
.getConstant(255ULL<<8 , dl
, VT
));
2698 Tmp8
= DAG
.getNode(ISD::OR
, dl
, VT
, Tmp8
, Tmp7
);
2699 Tmp6
= DAG
.getNode(ISD::OR
, dl
, VT
, Tmp6
, Tmp5
);
2700 Tmp4
= DAG
.getNode(ISD::OR
, dl
, VT
, Tmp4
, Tmp3
);
2701 Tmp2
= DAG
.getNode(ISD::OR
, dl
, VT
, Tmp2
, Tmp1
);
2702 Tmp8
= DAG
.getNode(ISD::OR
, dl
, VT
, Tmp8
, Tmp6
);
2703 Tmp4
= DAG
.getNode(ISD::OR
, dl
, VT
, Tmp4
, Tmp2
);
2704 return DAG
.getNode(ISD::OR
, dl
, VT
, Tmp8
, Tmp4
);
2708 /// Expand the specified bitcount instruction into operations.
2709 SDValue
SelectionDAGLegalize::ExpandBitCount(unsigned Opc
, SDValue Op
,
2712 default: llvm_unreachable("Cannot expand this yet!");
2714 EVT VT
= Op
.getValueType();
2715 EVT ShVT
= TLI
.getShiftAmountTy(VT
, DAG
.getDataLayout());
2716 unsigned Len
= VT
.getSizeInBits();
2718 assert(VT
.isInteger() && Len
<= 128 && Len
% 8 == 0 &&
2719 "CTPOP not implemented for this type.");
2721 // This is the "best" algorithm from
2722 // http://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetParallel
2724 SDValue Mask55
= DAG
.getConstant(APInt::getSplat(Len
, APInt(8, 0x55)),
2726 SDValue Mask33
= DAG
.getConstant(APInt::getSplat(Len
, APInt(8, 0x33)),
2728 SDValue Mask0F
= DAG
.getConstant(APInt::getSplat(Len
, APInt(8, 0x0F)),
2730 SDValue Mask01
= DAG
.getConstant(APInt::getSplat(Len
, APInt(8, 0x01)),
2733 // v = v - ((v >> 1) & 0x55555555...)
2734 Op
= DAG
.getNode(ISD::SUB
, dl
, VT
, Op
,
2735 DAG
.getNode(ISD::AND
, dl
, VT
,
2736 DAG
.getNode(ISD::SRL
, dl
, VT
, Op
,
2737 DAG
.getConstant(1, dl
, ShVT
)),
2739 // v = (v & 0x33333333...) + ((v >> 2) & 0x33333333...)
2740 Op
= DAG
.getNode(ISD::ADD
, dl
, VT
,
2741 DAG
.getNode(ISD::AND
, dl
, VT
, Op
, Mask33
),
2742 DAG
.getNode(ISD::AND
, dl
, VT
,
2743 DAG
.getNode(ISD::SRL
, dl
, VT
, Op
,
2744 DAG
.getConstant(2, dl
, ShVT
)),
2746 // v = (v + (v >> 4)) & 0x0F0F0F0F...
2747 Op
= DAG
.getNode(ISD::AND
, dl
, VT
,
2748 DAG
.getNode(ISD::ADD
, dl
, VT
, Op
,
2749 DAG
.getNode(ISD::SRL
, dl
, VT
, Op
,
2750 DAG
.getConstant(4, dl
, ShVT
))),
2752 // v = (v * 0x01010101...) >> (Len - 8)
2753 Op
= DAG
.getNode(ISD::SRL
, dl
, VT
,
2754 DAG
.getNode(ISD::MUL
, dl
, VT
, Op
, Mask01
),
2755 DAG
.getConstant(Len
- 8, dl
, ShVT
));
2759 case ISD::CTLZ_ZERO_UNDEF
:
2760 // This trivially expands to CTLZ.
2761 return DAG
.getNode(ISD::CTLZ
, dl
, Op
.getValueType(), Op
);
2763 EVT VT
= Op
.getValueType();
2764 unsigned Len
= VT
.getSizeInBits();
2766 if (TLI
.isOperationLegalOrCustom(ISD::CTLZ_ZERO_UNDEF
, VT
)) {
2767 EVT SetCCVT
= getSetCCResultType(VT
);
2768 SDValue CTLZ
= DAG
.getNode(ISD::CTLZ_ZERO_UNDEF
, dl
, VT
, Op
);
2769 SDValue Zero
= DAG
.getConstant(0, dl
, VT
);
2770 SDValue SrcIsZero
= DAG
.getSetCC(dl
, SetCCVT
, Op
, Zero
, ISD::SETEQ
);
2771 return DAG
.getNode(ISD::SELECT
, dl
, VT
, SrcIsZero
,
2772 DAG
.getConstant(Len
, dl
, VT
), CTLZ
);
2775 // for now, we do this:
2776 // x = x | (x >> 1);
2777 // x = x | (x >> 2);
2779 // x = x | (x >>16);
2780 // x = x | (x >>32); // for 64-bit input
2781 // return popcount(~x);
2783 // Ref: "Hacker's Delight" by Henry Warren
2784 EVT ShVT
= TLI
.getShiftAmountTy(VT
, DAG
.getDataLayout());
2785 for (unsigned i
= 0; (1U << i
) <= (Len
/ 2); ++i
) {
2786 SDValue Tmp3
= DAG
.getConstant(1ULL << i
, dl
, ShVT
);
2787 Op
= DAG
.getNode(ISD::OR
, dl
, VT
, Op
,
2788 DAG
.getNode(ISD::SRL
, dl
, VT
, Op
, Tmp3
));
2790 Op
= DAG
.getNOT(dl
, Op
, VT
);
2791 return DAG
.getNode(ISD::CTPOP
, dl
, VT
, Op
);
2793 case ISD::CTTZ_ZERO_UNDEF
:
2794 // This trivially expands to CTTZ.
2795 return DAG
.getNode(ISD::CTTZ
, dl
, Op
.getValueType(), Op
);
2797 EVT VT
= Op
.getValueType();
2798 unsigned Len
= VT
.getSizeInBits();
2800 if (TLI
.isOperationLegalOrCustom(ISD::CTTZ_ZERO_UNDEF
, VT
)) {
2801 EVT SetCCVT
= getSetCCResultType(VT
);
2802 SDValue CTTZ
= DAG
.getNode(ISD::CTTZ_ZERO_UNDEF
, dl
, VT
, Op
);
2803 SDValue Zero
= DAG
.getConstant(0, dl
, VT
);
2804 SDValue SrcIsZero
= DAG
.getSetCC(dl
, SetCCVT
, Op
, Zero
, ISD::SETEQ
);
2805 return DAG
.getNode(ISD::SELECT
, dl
, VT
, SrcIsZero
,
2806 DAG
.getConstant(Len
, dl
, VT
), CTTZ
);
2809 // for now, we use: { return popcount(~x & (x - 1)); }
2810 // unless the target has ctlz but not ctpop, in which case we use:
2811 // { return 32 - nlz(~x & (x-1)); }
2812 // Ref: "Hacker's Delight" by Henry Warren
2813 SDValue Tmp3
= DAG
.getNode(ISD::AND
, dl
, VT
,
2814 DAG
.getNOT(dl
, Op
, VT
),
2815 DAG
.getNode(ISD::SUB
, dl
, VT
, Op
,
2816 DAG
.getConstant(1, dl
, VT
)));
2817 // If ISD::CTLZ is legal and CTPOP isn't, then do that instead.
2818 if (!TLI
.isOperationLegalOrCustom(ISD::CTPOP
, VT
) &&
2819 TLI
.isOperationLegalOrCustom(ISD::CTLZ
, VT
))
2820 return DAG
.getNode(ISD::SUB
, dl
, VT
,
2821 DAG
.getConstant(VT
.getSizeInBits(), dl
, VT
),
2822 DAG
.getNode(ISD::CTLZ
, dl
, VT
, Tmp3
));
2823 return DAG
.getNode(ISD::CTPOP
, dl
, VT
, Tmp3
);
2828 bool SelectionDAGLegalize::ExpandNode(SDNode
*Node
) {
2829 LLVM_DEBUG(dbgs() << "Trying to expand node\n");
2830 SmallVector
<SDValue
, 8> Results
;
2832 SDValue Tmp1
, Tmp2
, Tmp3
, Tmp4
;
2834 switch (Node
->getOpcode()) {
2837 case ISD::CTLZ_ZERO_UNDEF
:
2839 case ISD::CTTZ_ZERO_UNDEF
:
2840 Tmp1
= ExpandBitCount(Node
->getOpcode(), Node
->getOperand(0), dl
);
2841 Results
.push_back(Tmp1
);
2843 case ISD::BITREVERSE
:
2844 Results
.push_back(ExpandBITREVERSE(Node
->getOperand(0), dl
));
2847 Results
.push_back(ExpandBSWAP(Node
->getOperand(0), dl
));
2849 case ISD::FRAMEADDR
:
2850 case ISD::RETURNADDR
:
2851 case ISD::FRAME_TO_ARGS_OFFSET
:
2852 Results
.push_back(DAG
.getConstant(0, dl
, Node
->getValueType(0)));
2854 case ISD::EH_DWARF_CFA
: {
2855 SDValue CfaArg
= DAG
.getSExtOrTrunc(Node
->getOperand(0), dl
,
2856 TLI
.getPointerTy(DAG
.getDataLayout()));
2857 SDValue Offset
= DAG
.getNode(ISD::ADD
, dl
,
2858 CfaArg
.getValueType(),
2859 DAG
.getNode(ISD::FRAME_TO_ARGS_OFFSET
, dl
,
2860 CfaArg
.getValueType()),
2862 SDValue FA
= DAG
.getNode(
2863 ISD::FRAMEADDR
, dl
, TLI
.getPointerTy(DAG
.getDataLayout()),
2864 DAG
.getConstant(0, dl
, TLI
.getPointerTy(DAG
.getDataLayout())));
2865 Results
.push_back(DAG
.getNode(ISD::ADD
, dl
, FA
.getValueType(),
2869 case ISD::FLT_ROUNDS_
:
2870 Results
.push_back(DAG
.getConstant(1, dl
, Node
->getValueType(0)));
2872 case ISD::EH_RETURN
:
2876 case ISD::EH_SJLJ_LONGJMP
:
2877 // If the target didn't expand these, there's nothing to do, so just
2878 // preserve the chain and be done.
2879 Results
.push_back(Node
->getOperand(0));
2881 case ISD::READCYCLECOUNTER
:
2882 // If the target didn't expand this, just return 'zero' and preserve the
2884 Results
.append(Node
->getNumValues() - 1,
2885 DAG
.getConstant(0, dl
, Node
->getValueType(0)));
2886 Results
.push_back(Node
->getOperand(0));
2888 case ISD::EH_SJLJ_SETJMP
:
2889 // If the target didn't expand this, just return 'zero' and preserve the
2891 Results
.push_back(DAG
.getConstant(0, dl
, MVT::i32
));
2892 Results
.push_back(Node
->getOperand(0));
2894 case ISD::ATOMIC_LOAD
: {
2895 // There is no libcall for atomic load; fake it with ATOMIC_CMP_SWAP.
2896 SDValue Zero
= DAG
.getConstant(0, dl
, Node
->getValueType(0));
2897 SDVTList VTs
= DAG
.getVTList(Node
->getValueType(0), MVT::Other
);
2898 SDValue Swap
= DAG
.getAtomicCmpSwap(
2899 ISD::ATOMIC_CMP_SWAP
, dl
, cast
<AtomicSDNode
>(Node
)->getMemoryVT(), VTs
,
2900 Node
->getOperand(0), Node
->getOperand(1), Zero
, Zero
,
2901 cast
<AtomicSDNode
>(Node
)->getMemOperand());
2902 Results
.push_back(Swap
.getValue(0));
2903 Results
.push_back(Swap
.getValue(1));
2906 case ISD::ATOMIC_STORE
: {
2907 // There is no libcall for atomic store; fake it with ATOMIC_SWAP.
2908 SDValue Swap
= DAG
.getAtomic(ISD::ATOMIC_SWAP
, dl
,
2909 cast
<AtomicSDNode
>(Node
)->getMemoryVT(),
2910 Node
->getOperand(0),
2911 Node
->getOperand(1), Node
->getOperand(2),
2912 cast
<AtomicSDNode
>(Node
)->getMemOperand());
2913 Results
.push_back(Swap
.getValue(1));
2916 case ISD::ATOMIC_CMP_SWAP_WITH_SUCCESS
: {
2917 // Expanding an ATOMIC_CMP_SWAP_WITH_SUCCESS produces an ATOMIC_CMP_SWAP and
2918 // splits out the success value as a comparison. Expanding the resulting
2919 // ATOMIC_CMP_SWAP will produce a libcall.
2920 SDVTList VTs
= DAG
.getVTList(Node
->getValueType(0), MVT::Other
);
2921 SDValue Res
= DAG
.getAtomicCmpSwap(
2922 ISD::ATOMIC_CMP_SWAP
, dl
, cast
<AtomicSDNode
>(Node
)->getMemoryVT(), VTs
,
2923 Node
->getOperand(0), Node
->getOperand(1), Node
->getOperand(2),
2924 Node
->getOperand(3), cast
<MemSDNode
>(Node
)->getMemOperand());
2926 SDValue ExtRes
= Res
;
2928 SDValue RHS
= Node
->getOperand(1);
2930 EVT AtomicType
= cast
<AtomicSDNode
>(Node
)->getMemoryVT();
2931 EVT OuterType
= Node
->getValueType(0);
2932 switch (TLI
.getExtendForAtomicOps()) {
2933 case ISD::SIGN_EXTEND
:
2934 LHS
= DAG
.getNode(ISD::AssertSext
, dl
, OuterType
, Res
,
2935 DAG
.getValueType(AtomicType
));
2936 RHS
= DAG
.getNode(ISD::SIGN_EXTEND_INREG
, dl
, OuterType
,
2937 Node
->getOperand(2), DAG
.getValueType(AtomicType
));
2940 case ISD::ZERO_EXTEND
:
2941 LHS
= DAG
.getNode(ISD::AssertZext
, dl
, OuterType
, Res
,
2942 DAG
.getValueType(AtomicType
));
2943 RHS
= DAG
.getZeroExtendInReg(Node
->getOperand(2), dl
, AtomicType
);
2946 case ISD::ANY_EXTEND
:
2947 LHS
= DAG
.getZeroExtendInReg(Res
, dl
, AtomicType
);
2948 RHS
= DAG
.getZeroExtendInReg(Node
->getOperand(2), dl
, AtomicType
);
2951 llvm_unreachable("Invalid atomic op extension");
2955 DAG
.getSetCC(dl
, Node
->getValueType(1), LHS
, RHS
, ISD::SETEQ
);
2957 Results
.push_back(ExtRes
.getValue(0));
2958 Results
.push_back(Success
);
2959 Results
.push_back(Res
.getValue(1));
2962 case ISD::DYNAMIC_STACKALLOC
:
2963 ExpandDYNAMIC_STACKALLOC(Node
, Results
);
2965 case ISD::MERGE_VALUES
:
2966 for (unsigned i
= 0; i
< Node
->getNumValues(); i
++)
2967 Results
.push_back(Node
->getOperand(i
));
2970 EVT VT
= Node
->getValueType(0);
2972 Results
.push_back(DAG
.getConstant(0, dl
, VT
));
2974 assert(VT
.isFloatingPoint() && "Unknown value type!");
2975 Results
.push_back(DAG
.getConstantFP(0, dl
, VT
));
2981 Tmp1
= EmitStackConvert(Node
->getOperand(0), Node
->getValueType(0),
2982 Node
->getValueType(0), dl
);
2983 Results
.push_back(Tmp1
);
2985 case ISD::FP_EXTEND
:
2986 Tmp1
= EmitStackConvert(Node
->getOperand(0),
2987 Node
->getOperand(0).getValueType(),
2988 Node
->getValueType(0), dl
);
2989 Results
.push_back(Tmp1
);
2991 case ISD::SIGN_EXTEND_INREG
: {
2992 EVT ExtraVT
= cast
<VTSDNode
>(Node
->getOperand(1))->getVT();
2993 EVT VT
= Node
->getValueType(0);
2995 // An in-register sign-extend of a boolean is a negation:
2996 // 'true' (1) sign-extended is -1.
2997 // 'false' (0) sign-extended is 0.
2998 // However, we must mask the high bits of the source operand because the
2999 // SIGN_EXTEND_INREG does not guarantee that the high bits are already zero.
3001 // TODO: Do this for vectors too?
3002 if (ExtraVT
.getSizeInBits() == 1) {
3003 SDValue One
= DAG
.getConstant(1, dl
, VT
);
3004 SDValue And
= DAG
.getNode(ISD::AND
, dl
, VT
, Node
->getOperand(0), One
);
3005 SDValue Zero
= DAG
.getConstant(0, dl
, VT
);
3006 SDValue Neg
= DAG
.getNode(ISD::SUB
, dl
, VT
, Zero
, And
);
3007 Results
.push_back(Neg
);
3011 // NOTE: we could fall back on load/store here too for targets without
3012 // SRA. However, it is doubtful that any exist.
3013 EVT ShiftAmountTy
= TLI
.getShiftAmountTy(VT
, DAG
.getDataLayout());
3014 unsigned BitsDiff
= VT
.getScalarSizeInBits() -
3015 ExtraVT
.getScalarSizeInBits();
3016 SDValue ShiftCst
= DAG
.getConstant(BitsDiff
, dl
, ShiftAmountTy
);
3017 Tmp1
= DAG
.getNode(ISD::SHL
, dl
, Node
->getValueType(0),
3018 Node
->getOperand(0), ShiftCst
);
3019 Tmp1
= DAG
.getNode(ISD::SRA
, dl
, Node
->getValueType(0), Tmp1
, ShiftCst
);
3020 Results
.push_back(Tmp1
);
3023 case ISD::FP_ROUND_INREG
: {
3024 // The only way we can lower this is to turn it into a TRUNCSTORE,
3025 // EXTLOAD pair, targeting a temporary location (a stack slot).
3027 // NOTE: there is a choice here between constantly creating new stack
3028 // slots and always reusing the same one. We currently always create
3029 // new ones, as reuse may inhibit scheduling.
3030 EVT ExtraVT
= cast
<VTSDNode
>(Node
->getOperand(1))->getVT();
3031 Tmp1
= EmitStackConvert(Node
->getOperand(0), ExtraVT
,
3032 Node
->getValueType(0), dl
);
3033 Results
.push_back(Tmp1
);
3036 case ISD::SINT_TO_FP
:
3037 case ISD::UINT_TO_FP
:
3038 Tmp1
= ExpandLegalINT_TO_FP(Node
->getOpcode() == ISD::SINT_TO_FP
,
3039 Node
->getOperand(0), Node
->getValueType(0), dl
);
3040 Results
.push_back(Tmp1
);
3042 case ISD::FP_TO_SINT
:
3043 if (TLI
.expandFP_TO_SINT(Node
, Tmp1
, DAG
))
3044 Results
.push_back(Tmp1
);
3046 case ISD::FP_TO_UINT
: {
3047 SDValue True
, False
;
3048 EVT VT
= Node
->getOperand(0).getValueType();
3049 EVT NVT
= Node
->getValueType(0);
3050 APFloat
apf(DAG
.EVTToAPFloatSemantics(VT
),
3051 APInt::getNullValue(VT
.getSizeInBits()));
3052 APInt x
= APInt::getSignMask(NVT
.getSizeInBits());
3053 (void)apf
.convertFromAPInt(x
, false, APFloat::rmNearestTiesToEven
);
3054 Tmp1
= DAG
.getConstantFP(apf
, dl
, VT
);
3055 Tmp2
= DAG
.getSetCC(dl
, getSetCCResultType(VT
),
3056 Node
->getOperand(0),
3058 True
= DAG
.getNode(ISD::FP_TO_SINT
, dl
, NVT
, Node
->getOperand(0));
3059 // TODO: Should any fast-math-flags be set for the FSUB?
3060 False
= DAG
.getNode(ISD::FP_TO_SINT
, dl
, NVT
,
3061 DAG
.getNode(ISD::FSUB
, dl
, VT
,
3062 Node
->getOperand(0), Tmp1
));
3063 False
= DAG
.getNode(ISD::XOR
, dl
, NVT
, False
,
3064 DAG
.getConstant(x
, dl
, NVT
));
3065 Tmp1
= DAG
.getSelect(dl
, NVT
, Tmp2
, True
, False
);
3066 Results
.push_back(Tmp1
);
3070 Results
.push_back(DAG
.expandVAArg(Node
));
3071 Results
.push_back(Results
[0].getValue(1));
3074 Results
.push_back(DAG
.expandVACopy(Node
));
3076 case ISD::EXTRACT_VECTOR_ELT
:
3077 if (Node
->getOperand(0).getValueType().getVectorNumElements() == 1)
3078 // This must be an access of the only element. Return it.
3079 Tmp1
= DAG
.getNode(ISD::BITCAST
, dl
, Node
->getValueType(0),
3080 Node
->getOperand(0));
3082 Tmp1
= ExpandExtractFromVectorThroughStack(SDValue(Node
, 0));
3083 Results
.push_back(Tmp1
);
3085 case ISD::EXTRACT_SUBVECTOR
:
3086 Results
.push_back(ExpandExtractFromVectorThroughStack(SDValue(Node
, 0)));
3088 case ISD::INSERT_SUBVECTOR
:
3089 Results
.push_back(ExpandInsertToVectorThroughStack(SDValue(Node
, 0)));
3091 case ISD::CONCAT_VECTORS
:
3092 Results
.push_back(ExpandVectorBuildThroughStack(Node
));
3094 case ISD::SCALAR_TO_VECTOR
:
3095 Results
.push_back(ExpandSCALAR_TO_VECTOR(Node
));
3097 case ISD::INSERT_VECTOR_ELT
:
3098 Results
.push_back(ExpandINSERT_VECTOR_ELT(Node
->getOperand(0),
3099 Node
->getOperand(1),
3100 Node
->getOperand(2), dl
));
3102 case ISD::VECTOR_SHUFFLE
: {
3103 SmallVector
<int, 32> NewMask
;
3104 ArrayRef
<int> Mask
= cast
<ShuffleVectorSDNode
>(Node
)->getMask();
3106 EVT VT
= Node
->getValueType(0);
3107 EVT EltVT
= VT
.getVectorElementType();
3108 SDValue Op0
= Node
->getOperand(0);
3109 SDValue Op1
= Node
->getOperand(1);
3110 if (!TLI
.isTypeLegal(EltVT
)) {
3111 EVT NewEltVT
= TLI
.getTypeToTransformTo(*DAG
.getContext(), EltVT
);
3113 // BUILD_VECTOR operands are allowed to be wider than the element type.
3114 // But if NewEltVT is smaller that EltVT the BUILD_VECTOR does not accept
3116 if (NewEltVT
.bitsLT(EltVT
)) {
3117 // Convert shuffle node.
3118 // If original node was v4i64 and the new EltVT is i32,
3119 // cast operands to v8i32 and re-build the mask.
3121 // Calculate new VT, the size of the new VT should be equal to original.
3123 EVT::getVectorVT(*DAG
.getContext(), NewEltVT
,
3124 VT
.getSizeInBits() / NewEltVT
.getSizeInBits());
3125 assert(NewVT
.bitsEq(VT
));
3127 // cast operands to new VT
3128 Op0
= DAG
.getNode(ISD::BITCAST
, dl
, NewVT
, Op0
);
3129 Op1
= DAG
.getNode(ISD::BITCAST
, dl
, NewVT
, Op1
);
3131 // Convert the shuffle mask
3132 unsigned int factor
=
3133 NewVT
.getVectorNumElements()/VT
.getVectorNumElements();
3135 // EltVT gets smaller
3138 for (unsigned i
= 0; i
< VT
.getVectorNumElements(); ++i
) {
3140 for (unsigned fi
= 0; fi
< factor
; ++fi
)
3141 NewMask
.push_back(Mask
[i
]);
3144 for (unsigned fi
= 0; fi
< factor
; ++fi
)
3145 NewMask
.push_back(Mask
[i
]*factor
+fi
);
3153 unsigned NumElems
= VT
.getVectorNumElements();
3154 SmallVector
<SDValue
, 16> Ops
;
3155 for (unsigned i
= 0; i
!= NumElems
; ++i
) {
3157 Ops
.push_back(DAG
.getUNDEF(EltVT
));
3160 unsigned Idx
= Mask
[i
];
3162 Ops
.push_back(DAG
.getNode(
3163 ISD::EXTRACT_VECTOR_ELT
, dl
, EltVT
, Op0
,
3164 DAG
.getConstant(Idx
, dl
, TLI
.getVectorIdxTy(DAG
.getDataLayout()))));
3166 Ops
.push_back(DAG
.getNode(
3167 ISD::EXTRACT_VECTOR_ELT
, dl
, EltVT
, Op1
,
3168 DAG
.getConstant(Idx
- NumElems
, dl
,
3169 TLI
.getVectorIdxTy(DAG
.getDataLayout()))));
3172 Tmp1
= DAG
.getBuildVector(VT
, dl
, Ops
);
3173 // We may have changed the BUILD_VECTOR type. Cast it back to the Node type.
3174 Tmp1
= DAG
.getNode(ISD::BITCAST
, dl
, Node
->getValueType(0), Tmp1
);
3175 Results
.push_back(Tmp1
);
3178 case ISD::EXTRACT_ELEMENT
: {
3179 EVT OpTy
= Node
->getOperand(0).getValueType();
3180 if (cast
<ConstantSDNode
>(Node
->getOperand(1))->getZExtValue()) {
3182 Tmp1
= DAG
.getNode(ISD::SRL
, dl
, OpTy
, Node
->getOperand(0),
3183 DAG
.getConstant(OpTy
.getSizeInBits() / 2, dl
,
3184 TLI
.getShiftAmountTy(
3185 Node
->getOperand(0).getValueType(),
3186 DAG
.getDataLayout())));
3187 Tmp1
= DAG
.getNode(ISD::TRUNCATE
, dl
, Node
->getValueType(0), Tmp1
);
3190 Tmp1
= DAG
.getNode(ISD::TRUNCATE
, dl
, Node
->getValueType(0),
3191 Node
->getOperand(0));
3193 Results
.push_back(Tmp1
);
3196 case ISD::STACKSAVE
:
3197 // Expand to CopyFromReg if the target set
3198 // StackPointerRegisterToSaveRestore.
3199 if (unsigned SP
= TLI
.getStackPointerRegisterToSaveRestore()) {
3200 Results
.push_back(DAG
.getCopyFromReg(Node
->getOperand(0), dl
, SP
,
3201 Node
->getValueType(0)));
3202 Results
.push_back(Results
[0].getValue(1));
3204 Results
.push_back(DAG
.getUNDEF(Node
->getValueType(0)));
3205 Results
.push_back(Node
->getOperand(0));
3208 case ISD::STACKRESTORE
:
3209 // Expand to CopyToReg if the target set
3210 // StackPointerRegisterToSaveRestore.
3211 if (unsigned SP
= TLI
.getStackPointerRegisterToSaveRestore()) {
3212 Results
.push_back(DAG
.getCopyToReg(Node
->getOperand(0), dl
, SP
,
3213 Node
->getOperand(1)));
3215 Results
.push_back(Node
->getOperand(0));
3218 case ISD::GET_DYNAMIC_AREA_OFFSET
:
3219 Results
.push_back(DAG
.getConstant(0, dl
, Node
->getValueType(0)));
3220 Results
.push_back(Results
[0].getValue(0));
3222 case ISD::FCOPYSIGN
:
3223 Results
.push_back(ExpandFCOPYSIGN(Node
));
3226 // Expand Y = FNEG(X) -> Y = SUB -0.0, X
3227 Tmp1
= DAG
.getConstantFP(-0.0, dl
, Node
->getValueType(0));
3228 // TODO: If FNEG has fast-math-flags, propagate them to the FSUB.
3229 Tmp1
= DAG
.getNode(ISD::FSUB
, dl
, Node
->getValueType(0), Tmp1
,
3230 Node
->getOperand(0));
3231 Results
.push_back(Tmp1
);
3234 Results
.push_back(ExpandFABS(Node
));
3240 // Expand Y = MAX(A, B) -> Y = (A > B) ? A : B
3242 switch (Node
->getOpcode()) {
3243 default: llvm_unreachable("How did we get here?");
3244 case ISD::SMAX
: Pred
= ISD::SETGT
; break;
3245 case ISD::SMIN
: Pred
= ISD::SETLT
; break;
3246 case ISD::UMAX
: Pred
= ISD::SETUGT
; break;
3247 case ISD::UMIN
: Pred
= ISD::SETULT
; break;
3249 Tmp1
= Node
->getOperand(0);
3250 Tmp2
= Node
->getOperand(1);
3251 Tmp1
= DAG
.getSelectCC(dl
, Tmp1
, Tmp2
, Tmp1
, Tmp2
, Pred
);
3252 Results
.push_back(Tmp1
);
3258 EVT VT
= Node
->getValueType(0);
3259 // Turn fsin / fcos into ISD::FSINCOS node if there are a pair of fsin /
3260 // fcos which share the same operand and both are used.
3261 if ((TLI
.isOperationLegalOrCustom(ISD::FSINCOS
, VT
) ||
3262 isSinCosLibcallAvailable(Node
, TLI
))
3263 && useSinCos(Node
)) {
3264 SDVTList VTs
= DAG
.getVTList(VT
, VT
);
3265 Tmp1
= DAG
.getNode(ISD::FSINCOS
, dl
, VTs
, Node
->getOperand(0));
3266 if (Node
->getOpcode() == ISD::FCOS
)
3267 Tmp1
= Tmp1
.getValue(1);
3268 Results
.push_back(Tmp1
);
3273 llvm_unreachable("Illegal fmad should never be formed");
3275 case ISD::FP16_TO_FP
:
3276 if (Node
->getValueType(0) != MVT::f32
) {
3277 // We can extend to types bigger than f32 in two steps without changing
3278 // the result. Since "f16 -> f32" is much more commonly available, give
3279 // CodeGen the option of emitting that before resorting to a libcall.
3281 DAG
.getNode(ISD::FP16_TO_FP
, dl
, MVT::f32
, Node
->getOperand(0));
3283 DAG
.getNode(ISD::FP_EXTEND
, dl
, Node
->getValueType(0), Res
));
3286 case ISD::FP_TO_FP16
:
3287 LLVM_DEBUG(dbgs() << "Legalizing FP_TO_FP16\n");
3288 if (!TLI
.useSoftFloat() && TM
.Options
.UnsafeFPMath
) {
3289 SDValue Op
= Node
->getOperand(0);
3290 MVT SVT
= Op
.getSimpleValueType();
3291 if ((SVT
== MVT::f64
|| SVT
== MVT::f80
) &&
3292 TLI
.isOperationLegalOrCustom(ISD::FP_TO_FP16
, MVT::f32
)) {
3293 // Under fastmath, we can expand this node into a fround followed by
3294 // a float-half conversion.
3295 SDValue FloatVal
= DAG
.getNode(ISD::FP_ROUND
, dl
, MVT::f32
, Op
,
3296 DAG
.getIntPtrConstant(0, dl
));
3298 DAG
.getNode(ISD::FP_TO_FP16
, dl
, Node
->getValueType(0), FloatVal
));
3302 case ISD::ConstantFP
: {
3303 ConstantFPSDNode
*CFP
= cast
<ConstantFPSDNode
>(Node
);
3304 // Check to see if this FP immediate is already legal.
3305 // If this is a legal constant, turn it into a TargetConstantFP node.
3306 if (!TLI
.isFPImmLegal(CFP
->getValueAPF(), Node
->getValueType(0)))
3307 Results
.push_back(ExpandConstantFP(CFP
, true));
3310 case ISD::Constant
: {
3311 ConstantSDNode
*CP
= cast
<ConstantSDNode
>(Node
);
3312 Results
.push_back(ExpandConstant(CP
));
3316 EVT VT
= Node
->getValueType(0);
3317 if (TLI
.isOperationLegalOrCustom(ISD::FADD
, VT
) &&
3318 TLI
.isOperationLegalOrCustom(ISD::FNEG
, VT
)) {
3319 const SDNodeFlags Flags
= Node
->getFlags();
3320 Tmp1
= DAG
.getNode(ISD::FNEG
, dl
, VT
, Node
->getOperand(1));
3321 Tmp1
= DAG
.getNode(ISD::FADD
, dl
, VT
, Node
->getOperand(0), Tmp1
, Flags
);
3322 Results
.push_back(Tmp1
);
3327 EVT VT
= Node
->getValueType(0);
3328 assert(TLI
.isOperationLegalOrCustom(ISD::ADD
, VT
) &&
3329 TLI
.isOperationLegalOrCustom(ISD::XOR
, VT
) &&
3330 "Don't know how to expand this subtraction!");
3331 Tmp1
= DAG
.getNode(ISD::XOR
, dl
, VT
, Node
->getOperand(1),
3332 DAG
.getConstant(APInt::getAllOnesValue(VT
.getSizeInBits()), dl
,
3334 Tmp1
= DAG
.getNode(ISD::ADD
, dl
, VT
, Tmp1
, DAG
.getConstant(1, dl
, VT
));
3335 Results
.push_back(DAG
.getNode(ISD::ADD
, dl
, VT
, Node
->getOperand(0), Tmp1
));
3340 EVT VT
= Node
->getValueType(0);
3341 bool isSigned
= Node
->getOpcode() == ISD::SREM
;
3342 unsigned DivOpc
= isSigned
? ISD::SDIV
: ISD::UDIV
;
3343 unsigned DivRemOpc
= isSigned
? ISD::SDIVREM
: ISD::UDIVREM
;
3344 Tmp2
= Node
->getOperand(0);
3345 Tmp3
= Node
->getOperand(1);
3346 if (TLI
.isOperationLegalOrCustom(DivRemOpc
, VT
)) {
3347 SDVTList VTs
= DAG
.getVTList(VT
, VT
);
3348 Tmp1
= DAG
.getNode(DivRemOpc
, dl
, VTs
, Tmp2
, Tmp3
).getValue(1);
3349 Results
.push_back(Tmp1
);
3350 } else if (TLI
.isOperationLegalOrCustom(DivOpc
, VT
)) {
3352 Tmp1
= DAG
.getNode(DivOpc
, dl
, VT
, Tmp2
, Tmp3
);
3353 Tmp1
= DAG
.getNode(ISD::MUL
, dl
, VT
, Tmp1
, Tmp3
);
3354 Tmp1
= DAG
.getNode(ISD::SUB
, dl
, VT
, Tmp2
, Tmp1
);
3355 Results
.push_back(Tmp1
);
3361 bool isSigned
= Node
->getOpcode() == ISD::SDIV
;
3362 unsigned DivRemOpc
= isSigned
? ISD::SDIVREM
: ISD::UDIVREM
;
3363 EVT VT
= Node
->getValueType(0);
3364 if (TLI
.isOperationLegalOrCustom(DivRemOpc
, VT
)) {
3365 SDVTList VTs
= DAG
.getVTList(VT
, VT
);
3366 Tmp1
= DAG
.getNode(DivRemOpc
, dl
, VTs
, Node
->getOperand(0),
3367 Node
->getOperand(1));
3368 Results
.push_back(Tmp1
);
3374 unsigned ExpandOpcode
=
3375 Node
->getOpcode() == ISD::MULHU
? ISD::UMUL_LOHI
: ISD::SMUL_LOHI
;
3376 EVT VT
= Node
->getValueType(0);
3377 SDVTList VTs
= DAG
.getVTList(VT
, VT
);
3379 Tmp1
= DAG
.getNode(ExpandOpcode
, dl
, VTs
, Node
->getOperand(0),
3380 Node
->getOperand(1));
3381 Results
.push_back(Tmp1
.getValue(1));
3384 case ISD::UMUL_LOHI
:
3385 case ISD::SMUL_LOHI
: {
3386 SDValue LHS
= Node
->getOperand(0);
3387 SDValue RHS
= Node
->getOperand(1);
3388 MVT VT
= LHS
.getSimpleValueType();
3389 unsigned MULHOpcode
=
3390 Node
->getOpcode() == ISD::UMUL_LOHI
? ISD::MULHU
: ISD::MULHS
;
3392 if (TLI
.isOperationLegalOrCustom(MULHOpcode
, VT
)) {
3393 Results
.push_back(DAG
.getNode(ISD::MUL
, dl
, VT
, LHS
, RHS
));
3394 Results
.push_back(DAG
.getNode(MULHOpcode
, dl
, VT
, LHS
, RHS
));
3398 SmallVector
<SDValue
, 4> Halves
;
3399 EVT HalfType
= EVT(VT
).getHalfSizedIntegerVT(*DAG
.getContext());
3400 assert(TLI
.isTypeLegal(HalfType
));
3401 if (TLI
.expandMUL_LOHI(Node
->getOpcode(), VT
, Node
, LHS
, RHS
, Halves
,
3403 TargetLowering::MulExpansionKind::Always
)) {
3404 for (unsigned i
= 0; i
< 2; ++i
) {
3405 SDValue Lo
= DAG
.getNode(ISD::ZERO_EXTEND
, dl
, VT
, Halves
[2 * i
]);
3406 SDValue Hi
= DAG
.getNode(ISD::ANY_EXTEND
, dl
, VT
, Halves
[2 * i
+ 1]);
3407 SDValue Shift
= DAG
.getConstant(
3408 HalfType
.getScalarSizeInBits(), dl
,
3409 TLI
.getShiftAmountTy(HalfType
, DAG
.getDataLayout()));
3410 Hi
= DAG
.getNode(ISD::SHL
, dl
, VT
, Hi
, Shift
);
3411 Results
.push_back(DAG
.getNode(ISD::OR
, dl
, VT
, Lo
, Hi
));
3418 EVT VT
= Node
->getValueType(0);
3419 SDVTList VTs
= DAG
.getVTList(VT
, VT
);
3420 // See if multiply or divide can be lowered using two-result operations.
3421 // We just need the low half of the multiply; try both the signed
3422 // and unsigned forms. If the target supports both SMUL_LOHI and
3423 // UMUL_LOHI, form a preference by checking which forms of plain
3424 // MULH it supports.
3425 bool HasSMUL_LOHI
= TLI
.isOperationLegalOrCustom(ISD::SMUL_LOHI
, VT
);
3426 bool HasUMUL_LOHI
= TLI
.isOperationLegalOrCustom(ISD::UMUL_LOHI
, VT
);
3427 bool HasMULHS
= TLI
.isOperationLegalOrCustom(ISD::MULHS
, VT
);
3428 bool HasMULHU
= TLI
.isOperationLegalOrCustom(ISD::MULHU
, VT
);
3429 unsigned OpToUse
= 0;
3430 if (HasSMUL_LOHI
&& !HasMULHS
) {
3431 OpToUse
= ISD::SMUL_LOHI
;
3432 } else if (HasUMUL_LOHI
&& !HasMULHU
) {
3433 OpToUse
= ISD::UMUL_LOHI
;
3434 } else if (HasSMUL_LOHI
) {
3435 OpToUse
= ISD::SMUL_LOHI
;
3436 } else if (HasUMUL_LOHI
) {
3437 OpToUse
= ISD::UMUL_LOHI
;
3440 Results
.push_back(DAG
.getNode(OpToUse
, dl
, VTs
, Node
->getOperand(0),
3441 Node
->getOperand(1)));
3446 EVT HalfType
= VT
.getHalfSizedIntegerVT(*DAG
.getContext());
3447 if (TLI
.isOperationLegalOrCustom(ISD::ZERO_EXTEND
, VT
) &&
3448 TLI
.isOperationLegalOrCustom(ISD::ANY_EXTEND
, VT
) &&
3449 TLI
.isOperationLegalOrCustom(ISD::SHL
, VT
) &&
3450 TLI
.isOperationLegalOrCustom(ISD::OR
, VT
) &&
3451 TLI
.expandMUL(Node
, Lo
, Hi
, HalfType
, DAG
,
3452 TargetLowering::MulExpansionKind::OnlyLegalOrCustom
)) {
3453 Lo
= DAG
.getNode(ISD::ZERO_EXTEND
, dl
, VT
, Lo
);
3454 Hi
= DAG
.getNode(ISD::ANY_EXTEND
, dl
, VT
, Hi
);
3456 DAG
.getConstant(HalfType
.getSizeInBits(), dl
,
3457 TLI
.getShiftAmountTy(HalfType
, DAG
.getDataLayout()));
3458 Hi
= DAG
.getNode(ISD::SHL
, dl
, VT
, Hi
, Shift
);
3459 Results
.push_back(DAG
.getNode(ISD::OR
, dl
, VT
, Lo
, Hi
));
3465 SDValue LHS
= Node
->getOperand(0);
3466 SDValue RHS
= Node
->getOperand(1);
3467 SDValue Sum
= DAG
.getNode(Node
->getOpcode() == ISD::SADDO
?
3468 ISD::ADD
: ISD::SUB
, dl
, LHS
.getValueType(),
3470 Results
.push_back(Sum
);
3471 EVT ResultType
= Node
->getValueType(1);
3472 EVT OType
= getSetCCResultType(Node
->getValueType(0));
3474 SDValue Zero
= DAG
.getConstant(0, dl
, LHS
.getValueType());
3476 // LHSSign -> LHS >= 0
3477 // RHSSign -> RHS >= 0
3478 // SumSign -> Sum >= 0
3481 // Overflow -> (LHSSign == RHSSign) && (LHSSign != SumSign)
3483 // Overflow -> (LHSSign != RHSSign) && (LHSSign != SumSign)
3484 SDValue LHSSign
= DAG
.getSetCC(dl
, OType
, LHS
, Zero
, ISD::SETGE
);
3485 SDValue RHSSign
= DAG
.getSetCC(dl
, OType
, RHS
, Zero
, ISD::SETGE
);
3486 SDValue SignsMatch
= DAG
.getSetCC(dl
, OType
, LHSSign
, RHSSign
,
3487 Node
->getOpcode() == ISD::SADDO
?
3488 ISD::SETEQ
: ISD::SETNE
);
3490 SDValue SumSign
= DAG
.getSetCC(dl
, OType
, Sum
, Zero
, ISD::SETGE
);
3491 SDValue SumSignNE
= DAG
.getSetCC(dl
, OType
, LHSSign
, SumSign
, ISD::SETNE
);
3493 SDValue Cmp
= DAG
.getNode(ISD::AND
, dl
, OType
, SignsMatch
, SumSignNE
);
3494 Results
.push_back(DAG
.getBoolExtOrTrunc(Cmp
, dl
, ResultType
, ResultType
));
3499 SDValue LHS
= Node
->getOperand(0);
3500 SDValue RHS
= Node
->getOperand(1);
3501 bool IsAdd
= Node
->getOpcode() == ISD::UADDO
;
3502 // If ADD/SUBCARRY is legal, use that instead.
3503 unsigned OpcCarry
= IsAdd
? ISD::ADDCARRY
: ISD::SUBCARRY
;
3504 if (TLI
.isOperationLegalOrCustom(OpcCarry
, Node
->getValueType(0))) {
3505 SDValue CarryIn
= DAG
.getConstant(0, dl
, Node
->getValueType(1));
3506 SDValue NodeCarry
= DAG
.getNode(OpcCarry
, dl
, Node
->getVTList(),
3507 { LHS
, RHS
, CarryIn
});
3508 Results
.push_back(SDValue(NodeCarry
.getNode(), 0));
3509 Results
.push_back(SDValue(NodeCarry
.getNode(), 1));
3513 SDValue Sum
= DAG
.getNode(IsAdd
? ISD::ADD
: ISD::SUB
, dl
,
3514 LHS
.getValueType(), LHS
, RHS
);
3515 Results
.push_back(Sum
);
3517 EVT ResultType
= Node
->getValueType(1);
3518 EVT SetCCType
= getSetCCResultType(Node
->getValueType(0));
3519 ISD::CondCode CC
= IsAdd
? ISD::SETULT
: ISD::SETUGT
;
3520 SDValue SetCC
= DAG
.getSetCC(dl
, SetCCType
, Sum
, LHS
, CC
);
3522 Results
.push_back(DAG
.getBoolExtOrTrunc(SetCC
, dl
, ResultType
, ResultType
));
3527 EVT VT
= Node
->getValueType(0);
3528 EVT WideVT
= EVT::getIntegerVT(*DAG
.getContext(), VT
.getSizeInBits() * 2);
3529 SDValue LHS
= Node
->getOperand(0);
3530 SDValue RHS
= Node
->getOperand(1);
3533 static const unsigned Ops
[2][3] =
3534 { { ISD::MULHU
, ISD::UMUL_LOHI
, ISD::ZERO_EXTEND
},
3535 { ISD::MULHS
, ISD::SMUL_LOHI
, ISD::SIGN_EXTEND
}};
3536 bool isSigned
= Node
->getOpcode() == ISD::SMULO
;
3537 if (TLI
.isOperationLegalOrCustom(Ops
[isSigned
][0], VT
)) {
3538 BottomHalf
= DAG
.getNode(ISD::MUL
, dl
, VT
, LHS
, RHS
);
3539 TopHalf
= DAG
.getNode(Ops
[isSigned
][0], dl
, VT
, LHS
, RHS
);
3540 } else if (TLI
.isOperationLegalOrCustom(Ops
[isSigned
][1], VT
)) {
3541 BottomHalf
= DAG
.getNode(Ops
[isSigned
][1], dl
, DAG
.getVTList(VT
, VT
), LHS
,
3543 TopHalf
= BottomHalf
.getValue(1);
3544 } else if (TLI
.isTypeLegal(WideVT
)) {
3545 LHS
= DAG
.getNode(Ops
[isSigned
][2], dl
, WideVT
, LHS
);
3546 RHS
= DAG
.getNode(Ops
[isSigned
][2], dl
, WideVT
, RHS
);
3547 Tmp1
= DAG
.getNode(ISD::MUL
, dl
, WideVT
, LHS
, RHS
);
3548 BottomHalf
= DAG
.getNode(ISD::EXTRACT_ELEMENT
, dl
, VT
, Tmp1
,
3549 DAG
.getIntPtrConstant(0, dl
));
3550 TopHalf
= DAG
.getNode(ISD::EXTRACT_ELEMENT
, dl
, VT
, Tmp1
,
3551 DAG
.getIntPtrConstant(1, dl
));
3553 // We can fall back to a libcall with an illegal type for the MUL if we
3554 // have a libcall big enough.
3555 // Also, we can fall back to a division in some cases, but that's a big
3556 // performance hit in the general case.
3557 RTLIB::Libcall LC
= RTLIB::UNKNOWN_LIBCALL
;
3558 if (WideVT
== MVT::i16
)
3559 LC
= RTLIB::MUL_I16
;
3560 else if (WideVT
== MVT::i32
)
3561 LC
= RTLIB::MUL_I32
;
3562 else if (WideVT
== MVT::i64
)
3563 LC
= RTLIB::MUL_I64
;
3564 else if (WideVT
== MVT::i128
)
3565 LC
= RTLIB::MUL_I128
;
3566 assert(LC
!= RTLIB::UNKNOWN_LIBCALL
&& "Cannot expand this operation!");
3571 // The high part is obtained by SRA'ing all but one of the bits of low
3573 unsigned LoSize
= VT
.getSizeInBits();
3575 DAG
.getNode(ISD::SRA
, dl
, VT
, LHS
,
3576 DAG
.getConstant(LoSize
- 1, dl
,
3577 TLI
.getPointerTy(DAG
.getDataLayout())));
3579 DAG
.getNode(ISD::SRA
, dl
, VT
, RHS
,
3580 DAG
.getConstant(LoSize
- 1, dl
,
3581 TLI
.getPointerTy(DAG
.getDataLayout())));
3583 HiLHS
= DAG
.getConstant(0, dl
, VT
);
3584 HiRHS
= DAG
.getConstant(0, dl
, VT
);
3587 // Here we're passing the 2 arguments explicitly as 4 arguments that are
3588 // pre-lowered to the correct types. This all depends upon WideVT not
3589 // being a legal type for the architecture and thus has to be split to
3592 if(DAG
.getDataLayout().isLittleEndian()) {
3593 // Halves of WideVT are packed into registers in different order
3594 // depending on platform endianness. This is usually handled by
3595 // the C calling convention, but we can't defer to it in
3597 SDValue Args
[] = { LHS
, HiLHS
, RHS
, HiRHS
};
3598 Ret
= ExpandLibCall(LC
, WideVT
, Args
, 4, isSigned
, dl
);
3600 SDValue Args
[] = { HiLHS
, LHS
, HiRHS
, RHS
};
3601 Ret
= ExpandLibCall(LC
, WideVT
, Args
, 4, isSigned
, dl
);
3603 assert(Ret
.getOpcode() == ISD::MERGE_VALUES
&&
3604 "Ret value is a collection of constituent nodes holding result.");
3605 BottomHalf
= Ret
.getOperand(0);
3606 TopHalf
= Ret
.getOperand(1);
3610 Tmp1
= DAG
.getConstant(
3611 VT
.getSizeInBits() - 1, dl
,
3612 TLI
.getShiftAmountTy(BottomHalf
.getValueType(), DAG
.getDataLayout()));
3613 Tmp1
= DAG
.getNode(ISD::SRA
, dl
, VT
, BottomHalf
, Tmp1
);
3614 TopHalf
= DAG
.getSetCC(dl
, getSetCCResultType(VT
), TopHalf
, Tmp1
,
3617 TopHalf
= DAG
.getSetCC(dl
, getSetCCResultType(VT
), TopHalf
,
3618 DAG
.getConstant(0, dl
, VT
), ISD::SETNE
);
3621 // Truncate the result if SetCC returns a larger type than needed.
3622 EVT RType
= Node
->getValueType(1);
3623 if (RType
.getSizeInBits() < TopHalf
.getValueSizeInBits())
3624 TopHalf
= DAG
.getNode(ISD::TRUNCATE
, dl
, RType
, TopHalf
);
3626 assert(RType
.getSizeInBits() == TopHalf
.getValueSizeInBits() &&
3627 "Unexpected result type for S/UMULO legalization");
3629 Results
.push_back(BottomHalf
);
3630 Results
.push_back(TopHalf
);
3633 case ISD::BUILD_PAIR
: {
3634 EVT PairTy
= Node
->getValueType(0);
3635 Tmp1
= DAG
.getNode(ISD::ZERO_EXTEND
, dl
, PairTy
, Node
->getOperand(0));
3636 Tmp2
= DAG
.getNode(ISD::ANY_EXTEND
, dl
, PairTy
, Node
->getOperand(1));
3638 ISD::SHL
, dl
, PairTy
, Tmp2
,
3639 DAG
.getConstant(PairTy
.getSizeInBits() / 2, dl
,
3640 TLI
.getShiftAmountTy(PairTy
, DAG
.getDataLayout())));
3641 Results
.push_back(DAG
.getNode(ISD::OR
, dl
, PairTy
, Tmp1
, Tmp2
));
3645 Tmp1
= Node
->getOperand(0);
3646 Tmp2
= Node
->getOperand(1);
3647 Tmp3
= Node
->getOperand(2);
3648 if (Tmp1
.getOpcode() == ISD::SETCC
) {
3649 Tmp1
= DAG
.getSelectCC(dl
, Tmp1
.getOperand(0), Tmp1
.getOperand(1),
3651 cast
<CondCodeSDNode
>(Tmp1
.getOperand(2))->get());
3653 Tmp1
= DAG
.getSelectCC(dl
, Tmp1
,
3654 DAG
.getConstant(0, dl
, Tmp1
.getValueType()),
3655 Tmp2
, Tmp3
, ISD::SETNE
);
3657 Results
.push_back(Tmp1
);
3660 SDValue Chain
= Node
->getOperand(0);
3661 SDValue Table
= Node
->getOperand(1);
3662 SDValue Index
= Node
->getOperand(2);
3664 const DataLayout
&TD
= DAG
.getDataLayout();
3665 EVT PTy
= TLI
.getPointerTy(TD
);
3667 unsigned EntrySize
=
3668 DAG
.getMachineFunction().getJumpTableInfo()->getEntrySize(TD
);
3670 // For power-of-two jumptable entry sizes convert multiplication to a shift.
3671 // This transformation needs to be done here since otherwise the MIPS
3672 // backend will end up emitting a three instruction multiply sequence
3673 // instead of a single shift and MSP430 will call a runtime function.
3674 if (llvm::isPowerOf2_32(EntrySize
))
3675 Index
= DAG
.getNode(
3676 ISD::SHL
, dl
, Index
.getValueType(), Index
,
3677 DAG
.getConstant(llvm::Log2_32(EntrySize
), dl
, Index
.getValueType()));
3679 Index
= DAG
.getNode(ISD::MUL
, dl
, Index
.getValueType(), Index
,
3680 DAG
.getConstant(EntrySize
, dl
, Index
.getValueType()));
3681 SDValue Addr
= DAG
.getNode(ISD::ADD
, dl
, Index
.getValueType(),
3684 EVT MemVT
= EVT::getIntegerVT(*DAG
.getContext(), EntrySize
* 8);
3685 SDValue LD
= DAG
.getExtLoad(
3686 ISD::SEXTLOAD
, dl
, PTy
, Chain
, Addr
,
3687 MachinePointerInfo::getJumpTable(DAG
.getMachineFunction()), MemVT
);
3689 if (TLI
.isJumpTableRelative()) {
3690 // For PIC, the sequence is:
3691 // BRIND(load(Jumptable + index) + RelocBase)
3692 // RelocBase can be JumpTable, GOT or some sort of global base.
3693 Addr
= DAG
.getNode(ISD::ADD
, dl
, PTy
, Addr
,
3694 TLI
.getPICJumpTableRelocBase(Table
, DAG
));
3697 Tmp1
= TLI
.expandIndirectJTBranch(dl
, LD
.getValue(1), Addr
, DAG
);
3698 Results
.push_back(Tmp1
);
3702 // Expand brcond's setcc into its constituent parts and create a BR_CC
3704 Tmp1
= Node
->getOperand(0);
3705 Tmp2
= Node
->getOperand(1);
3706 if (Tmp2
.getOpcode() == ISD::SETCC
) {
3707 Tmp1
= DAG
.getNode(ISD::BR_CC
, dl
, MVT::Other
,
3708 Tmp1
, Tmp2
.getOperand(2),
3709 Tmp2
.getOperand(0), Tmp2
.getOperand(1),
3710 Node
->getOperand(2));
3712 // We test only the i1 bit. Skip the AND if UNDEF or another AND.
3713 if (Tmp2
.isUndef() ||
3714 (Tmp2
.getOpcode() == ISD::AND
&&
3715 isa
<ConstantSDNode
>(Tmp2
.getOperand(1)) &&
3716 cast
<ConstantSDNode
>(Tmp2
.getOperand(1))->getZExtValue() == 1))
3719 Tmp3
= DAG
.getNode(ISD::AND
, dl
, Tmp2
.getValueType(), Tmp2
,
3720 DAG
.getConstant(1, dl
, Tmp2
.getValueType()));
3721 Tmp1
= DAG
.getNode(ISD::BR_CC
, dl
, MVT::Other
, Tmp1
,
3722 DAG
.getCondCode(ISD::SETNE
), Tmp3
,
3723 DAG
.getConstant(0, dl
, Tmp3
.getValueType()),
3724 Node
->getOperand(2));
3726 Results
.push_back(Tmp1
);
3729 Tmp1
= Node
->getOperand(0);
3730 Tmp2
= Node
->getOperand(1);
3731 Tmp3
= Node
->getOperand(2);
3732 bool Legalized
= LegalizeSetCCCondCode(Node
->getValueType(0), Tmp1
, Tmp2
,
3733 Tmp3
, NeedInvert
, dl
);
3736 // If we expanded the SETCC by swapping LHS and RHS, or by inverting the
3737 // condition code, create a new SETCC node.
3739 Tmp1
= DAG
.getNode(ISD::SETCC
, dl
, Node
->getValueType(0),
3742 // If we expanded the SETCC by inverting the condition code, then wrap
3743 // the existing SETCC in a NOT to restore the intended condition.
3745 Tmp1
= DAG
.getLogicalNOT(dl
, Tmp1
, Tmp1
->getValueType(0));
3747 Results
.push_back(Tmp1
);
3751 // Otherwise, SETCC for the given comparison type must be completely
3752 // illegal; expand it into a SELECT_CC.
3753 EVT VT
= Node
->getValueType(0);
3755 switch (TLI
.getBooleanContents(Tmp1
.getValueType())) {
3756 case TargetLowering::ZeroOrOneBooleanContent
:
3757 case TargetLowering::UndefinedBooleanContent
:
3760 case TargetLowering::ZeroOrNegativeOneBooleanContent
:
3764 Tmp1
= DAG
.getNode(ISD::SELECT_CC
, dl
, VT
, Tmp1
, Tmp2
,
3765 DAG
.getConstant(TrueValue
, dl
, VT
),
3766 DAG
.getConstant(0, dl
, VT
),
3768 Results
.push_back(Tmp1
);
3771 case ISD::SELECT_CC
: {
3772 Tmp1
= Node
->getOperand(0); // LHS
3773 Tmp2
= Node
->getOperand(1); // RHS
3774 Tmp3
= Node
->getOperand(2); // True
3775 Tmp4
= Node
->getOperand(3); // False
3776 EVT VT
= Node
->getValueType(0);
3777 SDValue CC
= Node
->getOperand(4);
3778 ISD::CondCode CCOp
= cast
<CondCodeSDNode
>(CC
)->get();
3780 if (TLI
.isCondCodeLegalOrCustom(CCOp
, Tmp1
.getSimpleValueType())) {
3781 // If the condition code is legal, then we need to expand this
3782 // node using SETCC and SELECT.
3783 EVT CmpVT
= Tmp1
.getValueType();
3784 assert(!TLI
.isOperationExpand(ISD::SELECT
, VT
) &&
3785 "Cannot expand ISD::SELECT_CC when ISD::SELECT also needs to be "
3788 TLI
.getSetCCResultType(DAG
.getDataLayout(), *DAG
.getContext(), CmpVT
);
3789 SDValue Cond
= DAG
.getNode(ISD::SETCC
, dl
, CCVT
, Tmp1
, Tmp2
, CC
);
3790 Results
.push_back(DAG
.getSelect(dl
, VT
, Cond
, Tmp3
, Tmp4
));
3794 // SELECT_CC is legal, so the condition code must not be.
3795 bool Legalized
= false;
3796 // Try to legalize by inverting the condition. This is for targets that
3797 // might support an ordered version of a condition, but not the unordered
3798 // version (or vice versa).
3799 ISD::CondCode InvCC
= ISD::getSetCCInverse(CCOp
,
3800 Tmp1
.getValueType().isInteger());
3801 if (TLI
.isCondCodeLegalOrCustom(InvCC
, Tmp1
.getSimpleValueType())) {
3802 // Use the new condition code and swap true and false
3804 Tmp1
= DAG
.getSelectCC(dl
, Tmp1
, Tmp2
, Tmp4
, Tmp3
, InvCC
);
3806 // If The inverse is not legal, then try to swap the arguments using
3807 // the inverse condition code.
3808 ISD::CondCode SwapInvCC
= ISD::getSetCCSwappedOperands(InvCC
);
3809 if (TLI
.isCondCodeLegalOrCustom(SwapInvCC
, Tmp1
.getSimpleValueType())) {
3810 // The swapped inverse condition is legal, so swap true and false,
3813 Tmp1
= DAG
.getSelectCC(dl
, Tmp2
, Tmp1
, Tmp4
, Tmp3
, SwapInvCC
);
3818 Legalized
= LegalizeSetCCCondCode(
3819 getSetCCResultType(Tmp1
.getValueType()), Tmp1
, Tmp2
, CC
, NeedInvert
,
3822 assert(Legalized
&& "Can't legalize SELECT_CC with legal condition!");
3824 // If we expanded the SETCC by inverting the condition code, then swap
3825 // the True/False operands to match.
3827 std::swap(Tmp3
, Tmp4
);
3829 // If we expanded the SETCC by swapping LHS and RHS, or by inverting the
3830 // condition code, create a new SELECT_CC node.
3832 Tmp1
= DAG
.getNode(ISD::SELECT_CC
, dl
, Node
->getValueType(0),
3833 Tmp1
, Tmp2
, Tmp3
, Tmp4
, CC
);
3835 Tmp2
= DAG
.getConstant(0, dl
, Tmp1
.getValueType());
3836 CC
= DAG
.getCondCode(ISD::SETNE
);
3837 Tmp1
= DAG
.getNode(ISD::SELECT_CC
, dl
, Node
->getValueType(0), Tmp1
,
3838 Tmp2
, Tmp3
, Tmp4
, CC
);
3841 Results
.push_back(Tmp1
);
3845 Tmp1
= Node
->getOperand(0); // Chain
3846 Tmp2
= Node
->getOperand(2); // LHS
3847 Tmp3
= Node
->getOperand(3); // RHS
3848 Tmp4
= Node
->getOperand(1); // CC
3850 bool Legalized
= LegalizeSetCCCondCode(getSetCCResultType(
3851 Tmp2
.getValueType()), Tmp2
, Tmp3
, Tmp4
, NeedInvert
, dl
);
3853 assert(Legalized
&& "Can't legalize BR_CC with legal condition!");
3855 // If we expanded the SETCC by inverting the condition code, then wrap
3856 // the existing SETCC in a NOT to restore the intended condition.
3858 Tmp4
= DAG
.getNOT(dl
, Tmp4
, Tmp4
->getValueType(0));
3860 // If we expanded the SETCC by swapping LHS and RHS, create a new BR_CC
3862 if (Tmp4
.getNode()) {
3863 Tmp1
= DAG
.getNode(ISD::BR_CC
, dl
, Node
->getValueType(0), Tmp1
,
3864 Tmp4
, Tmp2
, Tmp3
, Node
->getOperand(4));
3866 Tmp3
= DAG
.getConstant(0, dl
, Tmp2
.getValueType());
3867 Tmp4
= DAG
.getCondCode(ISD::SETNE
);
3868 Tmp1
= DAG
.getNode(ISD::BR_CC
, dl
, Node
->getValueType(0), Tmp1
, Tmp4
,
3869 Tmp2
, Tmp3
, Node
->getOperand(4));
3871 Results
.push_back(Tmp1
);
3874 case ISD::BUILD_VECTOR
:
3875 Results
.push_back(ExpandBUILD_VECTOR(Node
));
3880 // Scalarize vector SRA/SRL/SHL.
3881 EVT VT
= Node
->getValueType(0);
3882 assert(VT
.isVector() && "Unable to legalize non-vector shift");
3883 assert(TLI
.isTypeLegal(VT
.getScalarType())&& "Element type must be legal");
3884 unsigned NumElem
= VT
.getVectorNumElements();
3886 SmallVector
<SDValue
, 8> Scalars
;
3887 for (unsigned Idx
= 0; Idx
< NumElem
; Idx
++) {
3888 SDValue Ex
= DAG
.getNode(
3889 ISD::EXTRACT_VECTOR_ELT
, dl
, VT
.getScalarType(), Node
->getOperand(0),
3890 DAG
.getConstant(Idx
, dl
, TLI
.getVectorIdxTy(DAG
.getDataLayout())));
3891 SDValue Sh
= DAG
.getNode(
3892 ISD::EXTRACT_VECTOR_ELT
, dl
, VT
.getScalarType(), Node
->getOperand(1),
3893 DAG
.getConstant(Idx
, dl
, TLI
.getVectorIdxTy(DAG
.getDataLayout())));
3894 Scalars
.push_back(DAG
.getNode(Node
->getOpcode(), dl
,
3895 VT
.getScalarType(), Ex
, Sh
));
3898 SDValue Result
= DAG
.getBuildVector(Node
->getValueType(0), dl
, Scalars
);
3899 ReplaceNode(SDValue(Node
, 0), Result
);
3904 bool IsLeft
= Node
->getOpcode() == ISD::ROTL
;
3905 SDValue Op0
= Node
->getOperand(0), Op1
= Node
->getOperand(1);
3906 EVT ResVT
= Node
->getValueType(0);
3907 EVT OpVT
= Op0
.getValueType();
3908 assert(OpVT
== ResVT
&&
3909 "The result and the operand types of rotate should match");
3910 EVT ShVT
= Op1
.getValueType();
3911 SDValue Width
= DAG
.getConstant(OpVT
.getScalarSizeInBits(), dl
, ShVT
);
3913 // If a rotate in the other direction is legal, use it.
3914 unsigned RevRot
= IsLeft
? ISD::ROTR
: ISD::ROTL
;
3915 if (TLI
.isOperationLegal(RevRot
, ResVT
)) {
3916 SDValue Sub
= DAG
.getNode(ISD::SUB
, dl
, ShVT
, Width
, Op1
);
3917 Results
.push_back(DAG
.getNode(RevRot
, dl
, ResVT
, Op0
, Sub
));
3922 // (rotl x, c) -> (or (shl x, (and c, w-1)), (srl x, (and w-c, w-1)))
3923 // (rotr x, c) -> (or (srl x, (and c, w-1)), (shl x, (and w-c, w-1)))
3925 assert(isPowerOf2_32(OpVT
.getScalarSizeInBits()) &&
3926 "Expecting the type bitwidth to be a power of 2");
3927 unsigned ShOpc
= IsLeft
? ISD::SHL
: ISD::SRL
;
3928 unsigned HsOpc
= IsLeft
? ISD::SRL
: ISD::SHL
;
3929 SDValue Width1
= DAG
.getNode(ISD::SUB
, dl
, ShVT
,
3930 Width
, DAG
.getConstant(1, dl
, ShVT
));
3931 SDValue NegOp1
= DAG
.getNode(ISD::SUB
, dl
, ShVT
, Width
, Op1
);
3932 SDValue And0
= DAG
.getNode(ISD::AND
, dl
, ShVT
, Op1
, Width1
);
3933 SDValue And1
= DAG
.getNode(ISD::AND
, dl
, ShVT
, NegOp1
, Width1
);
3935 SDValue Or
= DAG
.getNode(ISD::OR
, dl
, ResVT
,
3936 DAG
.getNode(ShOpc
, dl
, ResVT
, Op0
, And0
),
3937 DAG
.getNode(HsOpc
, dl
, ResVT
, Op0
, And1
));
3938 Results
.push_back(Or
);
3942 case ISD::GLOBAL_OFFSET_TABLE
:
3943 case ISD::GlobalAddress
:
3944 case ISD::GlobalTLSAddress
:
3945 case ISD::ExternalSymbol
:
3946 case ISD::ConstantPool
:
3947 case ISD::JumpTable
:
3948 case ISD::INTRINSIC_W_CHAIN
:
3949 case ISD::INTRINSIC_WO_CHAIN
:
3950 case ISD::INTRINSIC_VOID
:
3951 // FIXME: Custom lowering for these operations shouldn't return null!
3955 // Replace the original node with the legalized result.
3956 if (Results
.empty()) {
3957 LLVM_DEBUG(dbgs() << "Cannot expand node\n");
3961 LLVM_DEBUG(dbgs() << "Successfully expanded node\n");
3962 ReplaceNode(Node
, Results
.data());
3966 void SelectionDAGLegalize::ConvertNodeToLibcall(SDNode
*Node
) {
3967 LLVM_DEBUG(dbgs() << "Trying to convert node to libcall\n");
3968 SmallVector
<SDValue
, 8> Results
;
3970 // FIXME: Check flags on the node to see if we can use a finite call.
3971 bool CanUseFiniteLibCall
= TM
.Options
.NoInfsFPMath
&& TM
.Options
.NoNaNsFPMath
;
3972 unsigned Opc
= Node
->getOpcode();
3974 case ISD::ATOMIC_FENCE
: {
3975 // If the target didn't lower this, lower it to '__sync_synchronize()' call
3976 // FIXME: handle "fence singlethread" more efficiently.
3977 TargetLowering::ArgListTy Args
;
3979 TargetLowering::CallLoweringInfo
CLI(DAG
);
3981 .setChain(Node
->getOperand(0))
3983 CallingConv::C
, Type::getVoidTy(*DAG
.getContext()),
3984 DAG
.getExternalSymbol("__sync_synchronize",
3985 TLI
.getPointerTy(DAG
.getDataLayout())),
3988 std::pair
<SDValue
, SDValue
> CallResult
= TLI
.LowerCallTo(CLI
);
3990 Results
.push_back(CallResult
.second
);
3993 // By default, atomic intrinsics are marked Legal and lowered. Targets
3994 // which don't support them directly, however, may want libcalls, in which
3995 // case they mark them Expand, and we get here.
3996 case ISD::ATOMIC_SWAP
:
3997 case ISD::ATOMIC_LOAD_ADD
:
3998 case ISD::ATOMIC_LOAD_SUB
:
3999 case ISD::ATOMIC_LOAD_AND
:
4000 case ISD::ATOMIC_LOAD_CLR
:
4001 case ISD::ATOMIC_LOAD_OR
:
4002 case ISD::ATOMIC_LOAD_XOR
:
4003 case ISD::ATOMIC_LOAD_NAND
:
4004 case ISD::ATOMIC_LOAD_MIN
:
4005 case ISD::ATOMIC_LOAD_MAX
:
4006 case ISD::ATOMIC_LOAD_UMIN
:
4007 case ISD::ATOMIC_LOAD_UMAX
:
4008 case ISD::ATOMIC_CMP_SWAP
: {
4009 MVT VT
= cast
<AtomicSDNode
>(Node
)->getMemoryVT().getSimpleVT();
4010 RTLIB::Libcall LC
= RTLIB::getSYNC(Opc
, VT
);
4011 assert(LC
!= RTLIB::UNKNOWN_LIBCALL
&& "Unexpected atomic op or value type!");
4013 std::pair
<SDValue
, SDValue
> Tmp
= ExpandChainLibCall(LC
, Node
, false);
4014 Results
.push_back(Tmp
.first
);
4015 Results
.push_back(Tmp
.second
);
4019 // If this operation is not supported, lower it to 'abort()' call
4020 TargetLowering::ArgListTy Args
;
4021 TargetLowering::CallLoweringInfo
CLI(DAG
);
4023 .setChain(Node
->getOperand(0))
4024 .setLibCallee(CallingConv::C
, Type::getVoidTy(*DAG
.getContext()),
4025 DAG
.getExternalSymbol(
4026 "abort", TLI
.getPointerTy(DAG
.getDataLayout())),
4028 std::pair
<SDValue
, SDValue
> CallResult
= TLI
.LowerCallTo(CLI
);
4030 Results
.push_back(CallResult
.second
);
4034 Results
.push_back(ExpandFPLibCall(Node
, RTLIB::FMIN_F32
, RTLIB::FMIN_F64
,
4035 RTLIB::FMIN_F80
, RTLIB::FMIN_F128
,
4036 RTLIB::FMIN_PPCF128
));
4039 Results
.push_back(ExpandFPLibCall(Node
, RTLIB::FMAX_F32
, RTLIB::FMAX_F64
,
4040 RTLIB::FMAX_F80
, RTLIB::FMAX_F128
,
4041 RTLIB::FMAX_PPCF128
));
4044 case ISD::STRICT_FSQRT
:
4045 Results
.push_back(ExpandFPLibCall(Node
, RTLIB::SQRT_F32
, RTLIB::SQRT_F64
,
4046 RTLIB::SQRT_F80
, RTLIB::SQRT_F128
,
4047 RTLIB::SQRT_PPCF128
));
4050 Results
.push_back(ExpandFPLibCall(Node
, RTLIB::CBRT_F32
, RTLIB::CBRT_F64
,
4051 RTLIB::CBRT_F80
, RTLIB::CBRT_F128
,
4052 RTLIB::CBRT_PPCF128
));
4055 case ISD::STRICT_FSIN
:
4056 Results
.push_back(ExpandFPLibCall(Node
, RTLIB::SIN_F32
, RTLIB::SIN_F64
,
4057 RTLIB::SIN_F80
, RTLIB::SIN_F128
,
4058 RTLIB::SIN_PPCF128
));
4061 case ISD::STRICT_FCOS
:
4062 Results
.push_back(ExpandFPLibCall(Node
, RTLIB::COS_F32
, RTLIB::COS_F64
,
4063 RTLIB::COS_F80
, RTLIB::COS_F128
,
4064 RTLIB::COS_PPCF128
));
4067 // Expand into sincos libcall.
4068 ExpandSinCosLibCall(Node
, Results
);
4071 case ISD::STRICT_FLOG
:
4072 if (CanUseFiniteLibCall
&& DAG
.getLibInfo().has(LibFunc_log_finite
))
4073 Results
.push_back(ExpandFPLibCall(Node
, RTLIB::LOG_FINITE_F32
,
4074 RTLIB::LOG_FINITE_F64
,
4075 RTLIB::LOG_FINITE_F80
,
4076 RTLIB::LOG_FINITE_F128
,
4077 RTLIB::LOG_FINITE_PPCF128
));
4079 Results
.push_back(ExpandFPLibCall(Node
, RTLIB::LOG_F32
, RTLIB::LOG_F64
,
4080 RTLIB::LOG_F80
, RTLIB::LOG_F128
,
4081 RTLIB::LOG_PPCF128
));
4084 case ISD::STRICT_FLOG2
:
4085 if (CanUseFiniteLibCall
&& DAG
.getLibInfo().has(LibFunc_log2_finite
))
4086 Results
.push_back(ExpandFPLibCall(Node
, RTLIB::LOG2_FINITE_F32
,
4087 RTLIB::LOG2_FINITE_F64
,
4088 RTLIB::LOG2_FINITE_F80
,
4089 RTLIB::LOG2_FINITE_F128
,
4090 RTLIB::LOG2_FINITE_PPCF128
));
4092 Results
.push_back(ExpandFPLibCall(Node
, RTLIB::LOG2_F32
, RTLIB::LOG2_F64
,
4093 RTLIB::LOG2_F80
, RTLIB::LOG2_F128
,
4094 RTLIB::LOG2_PPCF128
));
4097 case ISD::STRICT_FLOG10
:
4098 if (CanUseFiniteLibCall
&& DAG
.getLibInfo().has(LibFunc_log10_finite
))
4099 Results
.push_back(ExpandFPLibCall(Node
, RTLIB::LOG10_FINITE_F32
,
4100 RTLIB::LOG10_FINITE_F64
,
4101 RTLIB::LOG10_FINITE_F80
,
4102 RTLIB::LOG10_FINITE_F128
,
4103 RTLIB::LOG10_FINITE_PPCF128
));
4105 Results
.push_back(ExpandFPLibCall(Node
, RTLIB::LOG10_F32
, RTLIB::LOG10_F64
,
4106 RTLIB::LOG10_F80
, RTLIB::LOG10_F128
,
4107 RTLIB::LOG10_PPCF128
));
4110 case ISD::STRICT_FEXP
:
4111 if (CanUseFiniteLibCall
&& DAG
.getLibInfo().has(LibFunc_exp_finite
))
4112 Results
.push_back(ExpandFPLibCall(Node
, RTLIB::EXP_FINITE_F32
,
4113 RTLIB::EXP_FINITE_F64
,
4114 RTLIB::EXP_FINITE_F80
,
4115 RTLIB::EXP_FINITE_F128
,
4116 RTLIB::EXP_FINITE_PPCF128
));
4118 Results
.push_back(ExpandFPLibCall(Node
, RTLIB::EXP_F32
, RTLIB::EXP_F64
,
4119 RTLIB::EXP_F80
, RTLIB::EXP_F128
,
4120 RTLIB::EXP_PPCF128
));
4123 case ISD::STRICT_FEXP2
:
4124 if (CanUseFiniteLibCall
&& DAG
.getLibInfo().has(LibFunc_exp2_finite
))
4125 Results
.push_back(ExpandFPLibCall(Node
, RTLIB::EXP2_FINITE_F32
,
4126 RTLIB::EXP2_FINITE_F64
,
4127 RTLIB::EXP2_FINITE_F80
,
4128 RTLIB::EXP2_FINITE_F128
,
4129 RTLIB::EXP2_FINITE_PPCF128
));
4131 Results
.push_back(ExpandFPLibCall(Node
, RTLIB::EXP2_F32
, RTLIB::EXP2_F64
,
4132 RTLIB::EXP2_F80
, RTLIB::EXP2_F128
,
4133 RTLIB::EXP2_PPCF128
));
4136 Results
.push_back(ExpandFPLibCall(Node
, RTLIB::TRUNC_F32
, RTLIB::TRUNC_F64
,
4137 RTLIB::TRUNC_F80
, RTLIB::TRUNC_F128
,
4138 RTLIB::TRUNC_PPCF128
));
4141 Results
.push_back(ExpandFPLibCall(Node
, RTLIB::FLOOR_F32
, RTLIB::FLOOR_F64
,
4142 RTLIB::FLOOR_F80
, RTLIB::FLOOR_F128
,
4143 RTLIB::FLOOR_PPCF128
));
4146 Results
.push_back(ExpandFPLibCall(Node
, RTLIB::CEIL_F32
, RTLIB::CEIL_F64
,
4147 RTLIB::CEIL_F80
, RTLIB::CEIL_F128
,
4148 RTLIB::CEIL_PPCF128
));
4151 case ISD::STRICT_FRINT
:
4152 Results
.push_back(ExpandFPLibCall(Node
, RTLIB::RINT_F32
, RTLIB::RINT_F64
,
4153 RTLIB::RINT_F80
, RTLIB::RINT_F128
,
4154 RTLIB::RINT_PPCF128
));
4156 case ISD::FNEARBYINT
:
4157 case ISD::STRICT_FNEARBYINT
:
4158 Results
.push_back(ExpandFPLibCall(Node
, RTLIB::NEARBYINT_F32
,
4159 RTLIB::NEARBYINT_F64
,
4160 RTLIB::NEARBYINT_F80
,
4161 RTLIB::NEARBYINT_F128
,
4162 RTLIB::NEARBYINT_PPCF128
));
4165 Results
.push_back(ExpandFPLibCall(Node
, RTLIB::ROUND_F32
,
4169 RTLIB::ROUND_PPCF128
));
4172 case ISD::STRICT_FPOWI
:
4173 Results
.push_back(ExpandFPLibCall(Node
, RTLIB::POWI_F32
, RTLIB::POWI_F64
,
4174 RTLIB::POWI_F80
, RTLIB::POWI_F128
,
4175 RTLIB::POWI_PPCF128
));
4178 case ISD::STRICT_FPOW
:
4179 if (CanUseFiniteLibCall
&& DAG
.getLibInfo().has(LibFunc_pow_finite
))
4180 Results
.push_back(ExpandFPLibCall(Node
, RTLIB::POW_FINITE_F32
,
4181 RTLIB::POW_FINITE_F64
,
4182 RTLIB::POW_FINITE_F80
,
4183 RTLIB::POW_FINITE_F128
,
4184 RTLIB::POW_FINITE_PPCF128
));
4186 Results
.push_back(ExpandFPLibCall(Node
, RTLIB::POW_F32
, RTLIB::POW_F64
,
4187 RTLIB::POW_F80
, RTLIB::POW_F128
,
4188 RTLIB::POW_PPCF128
));
4191 Results
.push_back(ExpandFPLibCall(Node
, RTLIB::DIV_F32
, RTLIB::DIV_F64
,
4192 RTLIB::DIV_F80
, RTLIB::DIV_F128
,
4193 RTLIB::DIV_PPCF128
));
4196 case ISD::STRICT_FREM
:
4197 Results
.push_back(ExpandFPLibCall(Node
, RTLIB::REM_F32
, RTLIB::REM_F64
,
4198 RTLIB::REM_F80
, RTLIB::REM_F128
,
4199 RTLIB::REM_PPCF128
));
4202 case ISD::STRICT_FMA
:
4203 Results
.push_back(ExpandFPLibCall(Node
, RTLIB::FMA_F32
, RTLIB::FMA_F64
,
4204 RTLIB::FMA_F80
, RTLIB::FMA_F128
,
4205 RTLIB::FMA_PPCF128
));
4208 Results
.push_back(ExpandFPLibCall(Node
, RTLIB::ADD_F32
, RTLIB::ADD_F64
,
4209 RTLIB::ADD_F80
, RTLIB::ADD_F128
,
4210 RTLIB::ADD_PPCF128
));
4213 Results
.push_back(ExpandFPLibCall(Node
, RTLIB::MUL_F32
, RTLIB::MUL_F64
,
4214 RTLIB::MUL_F80
, RTLIB::MUL_F128
,
4215 RTLIB::MUL_PPCF128
));
4217 case ISD::FP16_TO_FP
:
4218 if (Node
->getValueType(0) == MVT::f32
) {
4219 Results
.push_back(ExpandLibCall(RTLIB::FPEXT_F16_F32
, Node
, false));
4222 case ISD::FP_TO_FP16
: {
4224 RTLIB::getFPROUND(Node
->getOperand(0).getValueType(), MVT::f16
);
4225 assert(LC
!= RTLIB::UNKNOWN_LIBCALL
&& "Unable to expand fp_to_fp16");
4226 Results
.push_back(ExpandLibCall(LC
, Node
, false));
4230 Results
.push_back(ExpandFPLibCall(Node
, RTLIB::SUB_F32
, RTLIB::SUB_F64
,
4231 RTLIB::SUB_F80
, RTLIB::SUB_F128
,
4232 RTLIB::SUB_PPCF128
));
4235 Results
.push_back(ExpandIntLibCall(Node
, true,
4237 RTLIB::SREM_I16
, RTLIB::SREM_I32
,
4238 RTLIB::SREM_I64
, RTLIB::SREM_I128
));
4241 Results
.push_back(ExpandIntLibCall(Node
, false,
4243 RTLIB::UREM_I16
, RTLIB::UREM_I32
,
4244 RTLIB::UREM_I64
, RTLIB::UREM_I128
));
4247 Results
.push_back(ExpandIntLibCall(Node
, true,
4249 RTLIB::SDIV_I16
, RTLIB::SDIV_I32
,
4250 RTLIB::SDIV_I64
, RTLIB::SDIV_I128
));
4253 Results
.push_back(ExpandIntLibCall(Node
, false,
4255 RTLIB::UDIV_I16
, RTLIB::UDIV_I32
,
4256 RTLIB::UDIV_I64
, RTLIB::UDIV_I128
));
4260 // Expand into divrem libcall
4261 ExpandDivRemLibCall(Node
, Results
);
4264 Results
.push_back(ExpandIntLibCall(Node
, false,
4266 RTLIB::MUL_I16
, RTLIB::MUL_I32
,
4267 RTLIB::MUL_I64
, RTLIB::MUL_I128
));
4269 case ISD::CTLZ_ZERO_UNDEF
:
4270 switch (Node
->getSimpleValueType(0).SimpleTy
) {
4272 llvm_unreachable("LibCall explicitly requested, but not available");
4274 Results
.push_back(ExpandLibCall(RTLIB::CTLZ_I32
, Node
, false));
4277 Results
.push_back(ExpandLibCall(RTLIB::CTLZ_I64
, Node
, false));
4280 Results
.push_back(ExpandLibCall(RTLIB::CTLZ_I128
, Node
, false));
4286 // Replace the original node with the legalized result.
4287 if (!Results
.empty()) {
4288 LLVM_DEBUG(dbgs() << "Successfully converted node to libcall\n");
4289 ReplaceNode(Node
, Results
.data());
4291 LLVM_DEBUG(dbgs() << "Could not convert node to libcall\n");
4294 // Determine the vector type to use in place of an original scalar element when
4295 // promoting equally sized vectors.
4296 static MVT
getPromotedVectorElementType(const TargetLowering
&TLI
,
4297 MVT EltVT
, MVT NewEltVT
) {
4298 unsigned OldEltsPerNewElt
= EltVT
.getSizeInBits() / NewEltVT
.getSizeInBits();
4299 MVT MidVT
= MVT::getVectorVT(NewEltVT
, OldEltsPerNewElt
);
4300 assert(TLI
.isTypeLegal(MidVT
) && "unexpected");
4304 void SelectionDAGLegalize::PromoteNode(SDNode
*Node
) {
4305 LLVM_DEBUG(dbgs() << "Trying to promote node\n");
4306 SmallVector
<SDValue
, 8> Results
;
4307 MVT OVT
= Node
->getSimpleValueType(0);
4308 if (Node
->getOpcode() == ISD::UINT_TO_FP
||
4309 Node
->getOpcode() == ISD::SINT_TO_FP
||
4310 Node
->getOpcode() == ISD::SETCC
||
4311 Node
->getOpcode() == ISD::EXTRACT_VECTOR_ELT
||
4312 Node
->getOpcode() == ISD::INSERT_VECTOR_ELT
) {
4313 OVT
= Node
->getOperand(0).getSimpleValueType();
4315 if (Node
->getOpcode() == ISD::BR_CC
)
4316 OVT
= Node
->getOperand(2).getSimpleValueType();
4317 MVT NVT
= TLI
.getTypeToPromoteTo(Node
->getOpcode(), OVT
);
4319 SDValue Tmp1
, Tmp2
, Tmp3
;
4320 switch (Node
->getOpcode()) {
4322 case ISD::CTTZ_ZERO_UNDEF
:
4324 case ISD::CTLZ_ZERO_UNDEF
:
4326 // Zero extend the argument.
4327 Tmp1
= DAG
.getNode(ISD::ZERO_EXTEND
, dl
, NVT
, Node
->getOperand(0));
4328 if (Node
->getOpcode() == ISD::CTTZ
) {
4329 // The count is the same in the promoted type except if the original
4330 // value was zero. This can be handled by setting the bit just off
4331 // the top of the original type.
4332 auto TopBit
= APInt::getOneBitSet(NVT
.getSizeInBits(),
4333 OVT
.getSizeInBits());
4334 Tmp1
= DAG
.getNode(ISD::OR
, dl
, NVT
, Tmp1
,
4335 DAG
.getConstant(TopBit
, dl
, NVT
));
4337 // Perform the larger operation. For CTPOP and CTTZ_ZERO_UNDEF, this is
4338 // already the correct result.
4339 Tmp1
= DAG
.getNode(Node
->getOpcode(), dl
, NVT
, Tmp1
);
4340 if (Node
->getOpcode() == ISD::CTLZ
||
4341 Node
->getOpcode() == ISD::CTLZ_ZERO_UNDEF
) {
4342 // Tmp1 = Tmp1 - (sizeinbits(NVT) - sizeinbits(Old VT))
4343 Tmp1
= DAG
.getNode(ISD::SUB
, dl
, NVT
, Tmp1
,
4344 DAG
.getConstant(NVT
.getSizeInBits() -
4345 OVT
.getSizeInBits(), dl
, NVT
));
4347 Results
.push_back(DAG
.getNode(ISD::TRUNCATE
, dl
, OVT
, Tmp1
));
4349 case ISD::BITREVERSE
:
4351 unsigned DiffBits
= NVT
.getSizeInBits() - OVT
.getSizeInBits();
4352 Tmp1
= DAG
.getNode(ISD::ZERO_EXTEND
, dl
, NVT
, Node
->getOperand(0));
4353 Tmp1
= DAG
.getNode(Node
->getOpcode(), dl
, NVT
, Tmp1
);
4355 ISD::SRL
, dl
, NVT
, Tmp1
,
4356 DAG
.getConstant(DiffBits
, dl
,
4357 TLI
.getShiftAmountTy(NVT
, DAG
.getDataLayout())));
4359 Results
.push_back(DAG
.getNode(ISD::TRUNCATE
, dl
, OVT
, Tmp1
));
4362 case ISD::FP_TO_UINT
:
4363 case ISD::FP_TO_SINT
:
4364 Tmp1
= PromoteLegalFP_TO_INT(Node
->getOperand(0), Node
->getValueType(0),
4365 Node
->getOpcode() == ISD::FP_TO_SINT
, dl
);
4366 Results
.push_back(Tmp1
);
4368 case ISD::UINT_TO_FP
:
4369 case ISD::SINT_TO_FP
:
4370 Tmp1
= PromoteLegalINT_TO_FP(Node
->getOperand(0), Node
->getValueType(0),
4371 Node
->getOpcode() == ISD::SINT_TO_FP
, dl
);
4372 Results
.push_back(Tmp1
);
4375 SDValue Chain
= Node
->getOperand(0); // Get the chain.
4376 SDValue Ptr
= Node
->getOperand(1); // Get the pointer.
4379 if (OVT
.isVector()) {
4380 TruncOp
= ISD::BITCAST
;
4382 assert(OVT
.isInteger()
4383 && "VAARG promotion is supported only for vectors or integer types");
4384 TruncOp
= ISD::TRUNCATE
;
4387 // Perform the larger operation, then convert back
4388 Tmp1
= DAG
.getVAArg(NVT
, dl
, Chain
, Ptr
, Node
->getOperand(2),
4389 Node
->getConstantOperandVal(3));
4390 Chain
= Tmp1
.getValue(1);
4392 Tmp2
= DAG
.getNode(TruncOp
, dl
, OVT
, Tmp1
);
4394 // Modified the chain result - switch anything that used the old chain to
4396 DAG
.ReplaceAllUsesOfValueWith(SDValue(Node
, 0), Tmp2
);
4397 DAG
.ReplaceAllUsesOfValueWith(SDValue(Node
, 1), Chain
);
4399 UpdatedNodes
->insert(Tmp2
.getNode());
4400 UpdatedNodes
->insert(Chain
.getNode());
4413 unsigned ExtOp
, TruncOp
;
4414 if (OVT
.isVector()) {
4415 ExtOp
= ISD::BITCAST
;
4416 TruncOp
= ISD::BITCAST
;
4418 assert(OVT
.isInteger() && "Cannot promote logic operation");
4420 switch (Node
->getOpcode()) {
4422 ExtOp
= ISD::ANY_EXTEND
;
4426 ExtOp
= ISD::SIGN_EXTEND
;
4430 ExtOp
= ISD::ZERO_EXTEND
;
4433 TruncOp
= ISD::TRUNCATE
;
4435 // Promote each of the values to the new type.
4436 Tmp1
= DAG
.getNode(ExtOp
, dl
, NVT
, Node
->getOperand(0));
4437 Tmp2
= DAG
.getNode(ExtOp
, dl
, NVT
, Node
->getOperand(1));
4438 // Perform the larger operation, then convert back
4439 Tmp1
= DAG
.getNode(Node
->getOpcode(), dl
, NVT
, Tmp1
, Tmp2
);
4440 Results
.push_back(DAG
.getNode(TruncOp
, dl
, OVT
, Tmp1
));
4443 case ISD::UMUL_LOHI
:
4444 case ISD::SMUL_LOHI
: {
4445 // Promote to a multiply in a wider integer type.
4446 unsigned ExtOp
= Node
->getOpcode() == ISD::UMUL_LOHI
? ISD::ZERO_EXTEND
4448 Tmp1
= DAG
.getNode(ExtOp
, dl
, NVT
, Node
->getOperand(0));
4449 Tmp2
= DAG
.getNode(ExtOp
, dl
, NVT
, Node
->getOperand(1));
4450 Tmp1
= DAG
.getNode(ISD::MUL
, dl
, NVT
, Tmp1
, Tmp2
);
4452 auto &DL
= DAG
.getDataLayout();
4453 unsigned OriginalSize
= OVT
.getScalarSizeInBits();
4455 ISD::SRL
, dl
, NVT
, Tmp1
,
4456 DAG
.getConstant(OriginalSize
, dl
, TLI
.getScalarShiftAmountTy(DL
, NVT
)));
4457 Results
.push_back(DAG
.getNode(ISD::TRUNCATE
, dl
, OVT
, Tmp1
));
4458 Results
.push_back(DAG
.getNode(ISD::TRUNCATE
, dl
, OVT
, Tmp2
));
4462 unsigned ExtOp
, TruncOp
;
4463 if (Node
->getValueType(0).isVector() ||
4464 Node
->getValueType(0).getSizeInBits() == NVT
.getSizeInBits()) {
4465 ExtOp
= ISD::BITCAST
;
4466 TruncOp
= ISD::BITCAST
;
4467 } else if (Node
->getValueType(0).isInteger()) {
4468 ExtOp
= ISD::ANY_EXTEND
;
4469 TruncOp
= ISD::TRUNCATE
;
4471 ExtOp
= ISD::FP_EXTEND
;
4472 TruncOp
= ISD::FP_ROUND
;
4474 Tmp1
= Node
->getOperand(0);
4475 // Promote each of the values to the new type.
4476 Tmp2
= DAG
.getNode(ExtOp
, dl
, NVT
, Node
->getOperand(1));
4477 Tmp3
= DAG
.getNode(ExtOp
, dl
, NVT
, Node
->getOperand(2));
4478 // Perform the larger operation, then round down.
4479 Tmp1
= DAG
.getSelect(dl
, NVT
, Tmp1
, Tmp2
, Tmp3
);
4480 if (TruncOp
!= ISD::FP_ROUND
)
4481 Tmp1
= DAG
.getNode(TruncOp
, dl
, Node
->getValueType(0), Tmp1
);
4483 Tmp1
= DAG
.getNode(TruncOp
, dl
, Node
->getValueType(0), Tmp1
,
4484 DAG
.getIntPtrConstant(0, dl
));
4485 Results
.push_back(Tmp1
);
4488 case ISD::VECTOR_SHUFFLE
: {
4489 ArrayRef
<int> Mask
= cast
<ShuffleVectorSDNode
>(Node
)->getMask();
4491 // Cast the two input vectors.
4492 Tmp1
= DAG
.getNode(ISD::BITCAST
, dl
, NVT
, Node
->getOperand(0));
4493 Tmp2
= DAG
.getNode(ISD::BITCAST
, dl
, NVT
, Node
->getOperand(1));
4495 // Convert the shuffle mask to the right # elements.
4496 Tmp1
= ShuffleWithNarrowerEltType(NVT
, OVT
, dl
, Tmp1
, Tmp2
, Mask
);
4497 Tmp1
= DAG
.getNode(ISD::BITCAST
, dl
, OVT
, Tmp1
);
4498 Results
.push_back(Tmp1
);
4502 unsigned ExtOp
= ISD::FP_EXTEND
;
4503 if (NVT
.isInteger()) {
4504 ISD::CondCode CCCode
=
4505 cast
<CondCodeSDNode
>(Node
->getOperand(2))->get();
4506 ExtOp
= isSignedIntSetCC(CCCode
) ? ISD::SIGN_EXTEND
: ISD::ZERO_EXTEND
;
4508 Tmp1
= DAG
.getNode(ExtOp
, dl
, NVT
, Node
->getOperand(0));
4509 Tmp2
= DAG
.getNode(ExtOp
, dl
, NVT
, Node
->getOperand(1));
4510 Results
.push_back(DAG
.getNode(ISD::SETCC
, dl
, Node
->getValueType(0),
4511 Tmp1
, Tmp2
, Node
->getOperand(2)));
4515 unsigned ExtOp
= ISD::FP_EXTEND
;
4516 if (NVT
.isInteger()) {
4517 ISD::CondCode CCCode
=
4518 cast
<CondCodeSDNode
>(Node
->getOperand(1))->get();
4519 ExtOp
= isSignedIntSetCC(CCCode
) ? ISD::SIGN_EXTEND
: ISD::ZERO_EXTEND
;
4521 Tmp1
= DAG
.getNode(ExtOp
, dl
, NVT
, Node
->getOperand(2));
4522 Tmp2
= DAG
.getNode(ExtOp
, dl
, NVT
, Node
->getOperand(3));
4523 Results
.push_back(DAG
.getNode(ISD::BR_CC
, dl
, Node
->getValueType(0),
4524 Node
->getOperand(0), Node
->getOperand(1),
4525 Tmp1
, Tmp2
, Node
->getOperand(4)));
4536 Tmp1
= DAG
.getNode(ISD::FP_EXTEND
, dl
, NVT
, Node
->getOperand(0));
4537 Tmp2
= DAG
.getNode(ISD::FP_EXTEND
, dl
, NVT
, Node
->getOperand(1));
4538 Tmp3
= DAG
.getNode(Node
->getOpcode(), dl
, NVT
, Tmp1
, Tmp2
,
4540 Results
.push_back(DAG
.getNode(ISD::FP_ROUND
, dl
, OVT
,
4541 Tmp3
, DAG
.getIntPtrConstant(0, dl
)));
4544 Tmp1
= DAG
.getNode(ISD::FP_EXTEND
, dl
, NVT
, Node
->getOperand(0));
4545 Tmp2
= DAG
.getNode(ISD::FP_EXTEND
, dl
, NVT
, Node
->getOperand(1));
4546 Tmp3
= DAG
.getNode(ISD::FP_EXTEND
, dl
, NVT
, Node
->getOperand(2));
4548 DAG
.getNode(ISD::FP_ROUND
, dl
, OVT
,
4549 DAG
.getNode(Node
->getOpcode(), dl
, NVT
, Tmp1
, Tmp2
, Tmp3
),
4550 DAG
.getIntPtrConstant(0, dl
)));
4552 case ISD::FCOPYSIGN
:
4554 Tmp1
= DAG
.getNode(ISD::FP_EXTEND
, dl
, NVT
, Node
->getOperand(0));
4555 Tmp2
= Node
->getOperand(1);
4556 Tmp3
= DAG
.getNode(Node
->getOpcode(), dl
, NVT
, Tmp1
, Tmp2
);
4558 // fcopysign doesn't change anything but the sign bit, so
4559 // (fp_round (fcopysign (fpext a), b))
4561 // (fp_round (fpext a))
4562 // which is a no-op. Mark it as a TRUNCating FP_ROUND.
4563 const bool isTrunc
= (Node
->getOpcode() == ISD::FCOPYSIGN
);
4564 Results
.push_back(DAG
.getNode(ISD::FP_ROUND
, dl
, OVT
,
4565 Tmp3
, DAG
.getIntPtrConstant(isTrunc
, dl
)));
4571 case ISD::FNEARBYINT
:
4584 Tmp1
= DAG
.getNode(ISD::FP_EXTEND
, dl
, NVT
, Node
->getOperand(0));
4585 Tmp2
= DAG
.getNode(Node
->getOpcode(), dl
, NVT
, Tmp1
);
4586 Results
.push_back(DAG
.getNode(ISD::FP_ROUND
, dl
, OVT
,
4587 Tmp2
, DAG
.getIntPtrConstant(0, dl
)));
4589 case ISD::BUILD_VECTOR
: {
4590 MVT EltVT
= OVT
.getVectorElementType();
4591 MVT NewEltVT
= NVT
.getVectorElementType();
4593 // Handle bitcasts to a different vector type with the same total bit size
4595 // e.g. v2i64 = build_vector i64:x, i64:y => v4i32
4597 // v4i32 = concat_vectors (v2i32 (bitcast i64:x)), (v2i32 (bitcast i64:y))
4599 assert(NVT
.isVector() && OVT
.getSizeInBits() == NVT
.getSizeInBits() &&
4600 "Invalid promote type for build_vector");
4601 assert(NewEltVT
.bitsLT(EltVT
) && "not handled");
4603 MVT MidVT
= getPromotedVectorElementType(TLI
, EltVT
, NewEltVT
);
4605 SmallVector
<SDValue
, 8> NewOps
;
4606 for (unsigned I
= 0, E
= Node
->getNumOperands(); I
!= E
; ++I
) {
4607 SDValue Op
= Node
->getOperand(I
);
4608 NewOps
.push_back(DAG
.getNode(ISD::BITCAST
, SDLoc(Op
), MidVT
, Op
));
4612 SDValue Concat
= DAG
.getNode(ISD::CONCAT_VECTORS
, SL
, NVT
, NewOps
);
4613 SDValue CvtVec
= DAG
.getNode(ISD::BITCAST
, SL
, OVT
, Concat
);
4614 Results
.push_back(CvtVec
);
4617 case ISD::EXTRACT_VECTOR_ELT
: {
4618 MVT EltVT
= OVT
.getVectorElementType();
4619 MVT NewEltVT
= NVT
.getVectorElementType();
4621 // Handle bitcasts to a different vector type with the same total bit size.
4623 // e.g. v2i64 = extract_vector_elt x:v2i64, y:i32
4625 // v4i32:castx = bitcast x:v2i64
4628 // (v2i32 build_vector (i32 (extract_vector_elt castx, (2 * y))),
4629 // (i32 (extract_vector_elt castx, (2 * y + 1)))
4632 assert(NVT
.isVector() && OVT
.getSizeInBits() == NVT
.getSizeInBits() &&
4633 "Invalid promote type for extract_vector_elt");
4634 assert(NewEltVT
.bitsLT(EltVT
) && "not handled");
4636 MVT MidVT
= getPromotedVectorElementType(TLI
, EltVT
, NewEltVT
);
4637 unsigned NewEltsPerOldElt
= MidVT
.getVectorNumElements();
4639 SDValue Idx
= Node
->getOperand(1);
4640 EVT IdxVT
= Idx
.getValueType();
4642 SDValue Factor
= DAG
.getConstant(NewEltsPerOldElt
, SL
, IdxVT
);
4643 SDValue NewBaseIdx
= DAG
.getNode(ISD::MUL
, SL
, IdxVT
, Idx
, Factor
);
4645 SDValue CastVec
= DAG
.getNode(ISD::BITCAST
, SL
, NVT
, Node
->getOperand(0));
4647 SmallVector
<SDValue
, 8> NewOps
;
4648 for (unsigned I
= 0; I
< NewEltsPerOldElt
; ++I
) {
4649 SDValue IdxOffset
= DAG
.getConstant(I
, SL
, IdxVT
);
4650 SDValue TmpIdx
= DAG
.getNode(ISD::ADD
, SL
, IdxVT
, NewBaseIdx
, IdxOffset
);
4652 SDValue Elt
= DAG
.getNode(ISD::EXTRACT_VECTOR_ELT
, SL
, NewEltVT
,
4654 NewOps
.push_back(Elt
);
4657 SDValue NewVec
= DAG
.getBuildVector(MidVT
, SL
, NewOps
);
4658 Results
.push_back(DAG
.getNode(ISD::BITCAST
, SL
, EltVT
, NewVec
));
4661 case ISD::INSERT_VECTOR_ELT
: {
4662 MVT EltVT
= OVT
.getVectorElementType();
4663 MVT NewEltVT
= NVT
.getVectorElementType();
4665 // Handle bitcasts to a different vector type with the same total bit size
4667 // e.g. v2i64 = insert_vector_elt x:v2i64, y:i64, z:i32
4669 // v4i32:castx = bitcast x:v2i64
4670 // v2i32:casty = bitcast y:i64
4673 // (v4i32 insert_vector_elt
4674 // (v4i32 insert_vector_elt v4i32:castx,
4675 // (extract_vector_elt casty, 0), 2 * z),
4676 // (extract_vector_elt casty, 1), (2 * z + 1))
4678 assert(NVT
.isVector() && OVT
.getSizeInBits() == NVT
.getSizeInBits() &&
4679 "Invalid promote type for insert_vector_elt");
4680 assert(NewEltVT
.bitsLT(EltVT
) && "not handled");
4682 MVT MidVT
= getPromotedVectorElementType(TLI
, EltVT
, NewEltVT
);
4683 unsigned NewEltsPerOldElt
= MidVT
.getVectorNumElements();
4685 SDValue Val
= Node
->getOperand(1);
4686 SDValue Idx
= Node
->getOperand(2);
4687 EVT IdxVT
= Idx
.getValueType();
4690 SDValue Factor
= DAG
.getConstant(NewEltsPerOldElt
, SDLoc(), IdxVT
);
4691 SDValue NewBaseIdx
= DAG
.getNode(ISD::MUL
, SL
, IdxVT
, Idx
, Factor
);
4693 SDValue CastVec
= DAG
.getNode(ISD::BITCAST
, SL
, NVT
, Node
->getOperand(0));
4694 SDValue CastVal
= DAG
.getNode(ISD::BITCAST
, SL
, MidVT
, Val
);
4696 SDValue NewVec
= CastVec
;
4697 for (unsigned I
= 0; I
< NewEltsPerOldElt
; ++I
) {
4698 SDValue IdxOffset
= DAG
.getConstant(I
, SL
, IdxVT
);
4699 SDValue InEltIdx
= DAG
.getNode(ISD::ADD
, SL
, IdxVT
, NewBaseIdx
, IdxOffset
);
4701 SDValue Elt
= DAG
.getNode(ISD::EXTRACT_VECTOR_ELT
, SL
, NewEltVT
,
4702 CastVal
, IdxOffset
);
4704 NewVec
= DAG
.getNode(ISD::INSERT_VECTOR_ELT
, SL
, NVT
,
4705 NewVec
, Elt
, InEltIdx
);
4708 Results
.push_back(DAG
.getNode(ISD::BITCAST
, SL
, OVT
, NewVec
));
4711 case ISD::SCALAR_TO_VECTOR
: {
4712 MVT EltVT
= OVT
.getVectorElementType();
4713 MVT NewEltVT
= NVT
.getVectorElementType();
4715 // Handle bitcasts to different vector type with the same total bit size.
4717 // e.g. v2i64 = scalar_to_vector x:i64
4719 // concat_vectors (v2i32 bitcast x:i64), (v2i32 undef)
4722 MVT MidVT
= getPromotedVectorElementType(TLI
, EltVT
, NewEltVT
);
4723 SDValue Val
= Node
->getOperand(0);
4726 SDValue CastVal
= DAG
.getNode(ISD::BITCAST
, SL
, MidVT
, Val
);
4727 SDValue Undef
= DAG
.getUNDEF(MidVT
);
4729 SmallVector
<SDValue
, 8> NewElts
;
4730 NewElts
.push_back(CastVal
);
4731 for (unsigned I
= 1, NElts
= OVT
.getVectorNumElements(); I
!= NElts
; ++I
)
4732 NewElts
.push_back(Undef
);
4734 SDValue Concat
= DAG
.getNode(ISD::CONCAT_VECTORS
, SL
, NVT
, NewElts
);
4735 SDValue CvtVec
= DAG
.getNode(ISD::BITCAST
, SL
, OVT
, Concat
);
4736 Results
.push_back(CvtVec
);
4741 // Replace the original node with the legalized result.
4742 if (!Results
.empty()) {
4743 LLVM_DEBUG(dbgs() << "Successfully promoted node\n");
4744 ReplaceNode(Node
, Results
.data());
4746 LLVM_DEBUG(dbgs() << "Could not promote node\n");
4749 /// This is the entry point for the file.
4750 void SelectionDAG::Legalize() {
4751 AssignTopologicalOrder();
4753 SmallPtrSet
<SDNode
*, 16> LegalizedNodes
;
4754 // Use a delete listener to remove nodes which were deleted during
4755 // legalization from LegalizeNodes. This is needed to handle the situation
4756 // where a new node is allocated by the object pool to the same address of a
4757 // previously deleted node.
4758 DAGNodeDeletedListener
DeleteListener(
4760 [&LegalizedNodes
](SDNode
*N
, SDNode
*E
) { LegalizedNodes
.erase(N
); });
4762 SelectionDAGLegalize
Legalizer(*this, LegalizedNodes
);
4764 // Visit all the nodes. We start in topological order, so that we see
4765 // nodes with their original operands intact. Legalization can produce
4766 // new nodes which may themselves need to be legalized. Iterate until all
4767 // nodes have been legalized.
4769 bool AnyLegalized
= false;
4770 for (auto NI
= allnodes_end(); NI
!= allnodes_begin();) {
4774 if (N
->use_empty() && N
!= getRoot().getNode()) {
4780 if (LegalizedNodes
.insert(N
).second
) {
4781 AnyLegalized
= true;
4782 Legalizer
.LegalizeOp(N
);
4784 if (N
->use_empty() && N
!= getRoot().getNode()) {
4795 // Remove dead nodes now.
4799 bool SelectionDAG::LegalizeOp(SDNode
*N
,
4800 SmallSetVector
<SDNode
*, 16> &UpdatedNodes
) {
4801 SmallPtrSet
<SDNode
*, 16> LegalizedNodes
;
4802 SelectionDAGLegalize
Legalizer(*this, LegalizedNodes
, &UpdatedNodes
);
4804 // Directly insert the node in question, and legalize it. This will recurse
4805 // as needed through operands.
4806 LegalizedNodes
.insert(N
);
4807 Legalizer
.LegalizeOp(N
);
4809 return LegalizedNodes
.count(N
);