16 #ifndef LLVM_LIB_CODEGEN_SELECTIONDAG_LEGALIZETYPES_H
17 #define LLVM_LIB_CODEGEN_SELECTIONDAG_LEGALIZETYPES_H
71 bool isTypeLegal(EVT VT)
const {
75 EVT getSetCCResultType(EVT VT)
const {
76 return TLI.getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
80 bool IgnoreNodeResults(SDNode *
N)
const {
86 SmallDenseMap<SDValue, SDValue, 8> PromotedIntegers;
90 SmallDenseMap<SDValue, std::pair<SDValue, SDValue>, 8> ExpandedIntegers;
94 SmallDenseMap<SDValue, SDValue, 8> SoftenedFloats;
99 SmallDenseMap<SDValue, SDValue, 8> PromotedFloats;
103 SmallDenseMap<SDValue, std::pair<SDValue, SDValue>, 8> ExpandedFloats;
107 SmallDenseMap<SDValue, SDValue, 8> ScalarizedVectors;
111 SmallDenseMap<SDValue, std::pair<SDValue, SDValue>, 8> SplitVectors;
115 SmallDenseMap<SDValue, SDValue, 8> WidenedVectors;
119 SmallDenseMap<SDValue, SDValue, 8> ReplacedValues;
124 SmallVector<SDNode*, 128> Worklist;
128 : TLI(dag.getTargetLoweringInfo()), DAG(dag),
129 ValueTypeActions(TLI.getValueTypeActions()) {
131 "Too many value types for ValueTypeActions to hold!");
142 for (
unsigned i = 0, e = Old->
getNumValues(); i != e; ++i)
150 void AnalyzeNewValue(
SDValue &Val);
151 void ExpungeNode(
SDNode *N);
152 void PerformExpensiveChecks();
159 bool CustomLowerNode(
SDNode *N,
EVT VT,
bool LegalizeResult);
160 bool CustomWidenLowerNode(
SDNode *N,
EVT VT);
172 SDNode *Node,
bool isSigned);
173 std::pair<SDValue, SDValue> ExpandAtomic(
SDNode *Node);
195 SDValue &PromotedOp = PromotedIntegers[Op];
196 RemapValue(PromotedOp);
197 assert(PromotedOp.
getNode() &&
"Operand wasn't promoted?");
200 void SetPromotedInteger(SDValue Op, SDValue Result);
204 SDValue SExtPromotedInteger(SDValue Op) {
205 EVT OldVT = Op.getValueType();
207 Op = GetPromotedInteger(Op);
209 DAG.getValueType(OldVT));
214 SDValue ZExtPromotedInteger(SDValue Op) {
215 EVT OldVT = Op.getValueType();
217 Op = GetPromotedInteger(Op);
218 return DAG.getZeroExtendInReg(Op, dl, OldVT.getScalarType());
222 void PromoteIntegerResult(SDNode *N,
unsigned ResNo);
223 SDValue PromoteIntRes_MERGE_VALUES(SDNode *N,
unsigned ResNo);
224 SDValue PromoteIntRes_AssertSext(SDNode *N);
225 SDValue PromoteIntRes_AssertZext(SDNode *N);
226 SDValue PromoteIntRes_Atomic0(AtomicSDNode *N);
227 SDValue PromoteIntRes_Atomic1(AtomicSDNode *N);
228 SDValue PromoteIntRes_AtomicCmpSwap(AtomicSDNode *N,
unsigned ResNo);
229 SDValue PromoteIntRes_EXTRACT_SUBVECTOR(SDNode *N);
230 SDValue PromoteIntRes_VECTOR_SHUFFLE(SDNode *N);
231 SDValue PromoteIntRes_BUILD_VECTOR(SDNode *N);
232 SDValue PromoteIntRes_SCALAR_TO_VECTOR(SDNode *N);
233 SDValue PromoteIntRes_INSERT_VECTOR_ELT(SDNode *N);
234 SDValue PromoteIntRes_CONCAT_VECTORS(SDNode *N);
235 SDValue PromoteIntRes_BITCAST(SDNode *N);
236 SDValue PromoteIntRes_BSWAP(SDNode *N);
237 SDValue PromoteIntRes_BUILD_PAIR(SDNode *N);
238 SDValue PromoteIntRes_Constant(SDNode *N);
239 SDValue PromoteIntRes_CONVERT_RNDSAT(SDNode *N);
240 SDValue PromoteIntRes_CTLZ(SDNode *N);
241 SDValue PromoteIntRes_CTPOP(SDNode *N);
242 SDValue PromoteIntRes_CTTZ(SDNode *N);
243 SDValue PromoteIntRes_EXTRACT_VECTOR_ELT(SDNode *N);
244 SDValue PromoteIntRes_FP_TO_XINT(SDNode *N);
245 SDValue PromoteIntRes_FP_TO_FP16(SDNode *N);
246 SDValue PromoteIntRes_INT_EXTEND(SDNode *N);
247 SDValue PromoteIntRes_LOAD(LoadSDNode *N);
248 SDValue PromoteIntRes_MLOAD(MaskedLoadSDNode *N);
249 SDValue PromoteIntRes_Overflow(SDNode *N);
250 SDValue PromoteIntRes_SADDSUBO(SDNode *N,
unsigned ResNo);
251 SDValue PromoteIntRes_SDIV(SDNode *N);
252 SDValue PromoteIntRes_SELECT(SDNode *N);
253 SDValue PromoteIntRes_VSELECT(SDNode *N);
254 SDValue PromoteIntRes_SELECT_CC(SDNode *N);
255 SDValue PromoteIntRes_SETCC(SDNode *N);
256 SDValue PromoteIntRes_SHL(SDNode *N);
257 SDValue PromoteIntRes_SimpleIntBinOp(SDNode *N);
258 SDValue PromoteIntRes_SIGN_EXTEND_INREG(SDNode *N);
259 SDValue PromoteIntRes_SRA(SDNode *N);
260 SDValue PromoteIntRes_SRL(SDNode *N);
261 SDValue PromoteIntRes_TRUNCATE(SDNode *N);
262 SDValue PromoteIntRes_UADDSUBO(SDNode *N,
unsigned ResNo);
263 SDValue PromoteIntRes_UDIV(SDNode *N);
264 SDValue PromoteIntRes_UNDEF(SDNode *N);
265 SDValue PromoteIntRes_VAARG(SDNode *N);
266 SDValue PromoteIntRes_XMULO(SDNode *N,
unsigned ResNo);
269 bool PromoteIntegerOperand(SDNode *N,
unsigned OperandNo);
270 SDValue PromoteIntOp_ANY_EXTEND(SDNode *N);
271 SDValue PromoteIntOp_ATOMIC_STORE(AtomicSDNode *N);
272 SDValue PromoteIntOp_BITCAST(SDNode *N);
273 SDValue PromoteIntOp_BUILD_PAIR(SDNode *N);
274 SDValue PromoteIntOp_BR_CC(SDNode *N,
unsigned OpNo);
275 SDValue PromoteIntOp_BRCOND(SDNode *N,
unsigned OpNo);
276 SDValue PromoteIntOp_BUILD_VECTOR(SDNode *N);
277 SDValue PromoteIntOp_CONVERT_RNDSAT(SDNode *N);
278 SDValue PromoteIntOp_INSERT_VECTOR_ELT(SDNode *N,
unsigned OpNo);
279 SDValue PromoteIntOp_EXTRACT_ELEMENT(SDNode *N);
280 SDValue PromoteIntOp_EXTRACT_VECTOR_ELT(SDNode *N);
281 SDValue PromoteIntOp_EXTRACT_SUBVECTOR(SDNode *N);
282 SDValue PromoteIntOp_CONCAT_VECTORS(SDNode *N);
283 SDValue PromoteIntOp_SCALAR_TO_VECTOR(SDNode *N);
284 SDValue PromoteIntOp_SELECT(SDNode *N,
unsigned OpNo);
285 SDValue PromoteIntOp_SELECT_CC(SDNode *N,
unsigned OpNo);
286 SDValue PromoteIntOp_SETCC(SDNode *N,
unsigned OpNo);
287 SDValue PromoteIntOp_VSETCC(SDNode *N,
unsigned OpNo);
288 SDValue PromoteIntOp_Shift(SDNode *N);
289 SDValue PromoteIntOp_SIGN_EXTEND(SDNode *N);
290 SDValue PromoteIntOp_SINT_TO_FP(SDNode *N);
291 SDValue PromoteIntOp_STORE(StoreSDNode *N,
unsigned OpNo);
292 SDValue PromoteIntOp_TRUNCATE(SDNode *N);
293 SDValue PromoteIntOp_UINT_TO_FP(SDNode *N);
294 SDValue PromoteIntOp_ZERO_EXTEND(SDNode *N);
295 SDValue PromoteIntOp_MSTORE(MaskedStoreSDNode *N,
unsigned OpNo);
296 SDValue PromoteIntOp_MLOAD(MaskedLoadSDNode *N,
unsigned OpNo);
310 void GetExpandedInteger(SDValue Op, SDValue &
Lo, SDValue &
Hi);
311 void SetExpandedInteger(SDValue Op, SDValue
Lo, SDValue
Hi);
314 void ExpandIntegerResult(SDNode *N,
unsigned ResNo);
315 void ExpandIntRes_MERGE_VALUES (SDNode *N,
unsigned ResNo,
316 SDValue &
Lo, SDValue &
Hi);
317 void ExpandIntRes_ANY_EXTEND (SDNode *N, SDValue &
Lo, SDValue &
Hi);
318 void ExpandIntRes_AssertSext (SDNode *N, SDValue &
Lo, SDValue &
Hi);
319 void ExpandIntRes_AssertZext (SDNode *N, SDValue &
Lo, SDValue &
Hi);
320 void ExpandIntRes_Constant (SDNode *N, SDValue &
Lo, SDValue &
Hi);
321 void ExpandIntRes_CTLZ (SDNode *N, SDValue &
Lo, SDValue &
Hi);
322 void ExpandIntRes_CTPOP (SDNode *N, SDValue &
Lo, SDValue &
Hi);
323 void ExpandIntRes_CTTZ (SDNode *N, SDValue &
Lo, SDValue &
Hi);
324 void ExpandIntRes_LOAD (LoadSDNode *N, SDValue &
Lo, SDValue &
Hi);
325 void ExpandIntRes_SIGN_EXTEND (SDNode *N, SDValue &
Lo, SDValue &
Hi);
326 void ExpandIntRes_SIGN_EXTEND_INREG (SDNode *N, SDValue &
Lo, SDValue &
Hi);
327 void ExpandIntRes_TRUNCATE (SDNode *N, SDValue &
Lo, SDValue &
Hi);
328 void ExpandIntRes_ZERO_EXTEND (SDNode *N, SDValue &
Lo, SDValue &
Hi);
329 void ExpandIntRes_FP_TO_SINT (SDNode *N, SDValue &
Lo, SDValue &
Hi);
330 void ExpandIntRes_FP_TO_UINT (SDNode *N, SDValue &
Lo, SDValue &
Hi);
332 void ExpandIntRes_Logical (SDNode *N, SDValue &
Lo, SDValue &
Hi);
333 void ExpandIntRes_ADDSUB (SDNode *N, SDValue &
Lo, SDValue &
Hi);
334 void ExpandIntRes_ADDSUBC (SDNode *N, SDValue &
Lo, SDValue &
Hi);
335 void ExpandIntRes_ADDSUBE (SDNode *N, SDValue &
Lo, SDValue &
Hi);
336 void ExpandIntRes_BSWAP (SDNode *N, SDValue &
Lo, SDValue &
Hi);
337 void ExpandIntRes_MUL (SDNode *N, SDValue &
Lo, SDValue &
Hi);
338 void ExpandIntRes_SDIV (SDNode *N, SDValue &
Lo, SDValue &
Hi);
339 void ExpandIntRes_SREM (SDNode *N, SDValue &
Lo, SDValue &
Hi);
340 void ExpandIntRes_UDIV (SDNode *N, SDValue &
Lo, SDValue &
Hi);
341 void ExpandIntRes_UREM (SDNode *N, SDValue &
Lo, SDValue &
Hi);
342 void ExpandIntRes_Shift (SDNode *N, SDValue &
Lo, SDValue &
Hi);
344 void ExpandIntRes_SADDSUBO (SDNode *N, SDValue &
Lo, SDValue &
Hi);
345 void ExpandIntRes_UADDSUBO (SDNode *N, SDValue &
Lo, SDValue &
Hi);
346 void ExpandIntRes_XMULO (SDNode *N, SDValue &
Lo, SDValue &
Hi);
348 void ExpandIntRes_ATOMIC_LOAD (SDNode *N, SDValue &
Lo, SDValue &
Hi);
350 void ExpandShiftByConstant(SDNode *N,
const APInt &Amt,
351 SDValue &
Lo, SDValue &
Hi);
352 bool ExpandShiftWithKnownAmountBit(SDNode *N, SDValue &
Lo, SDValue &
Hi);
353 bool ExpandShiftWithUnknownAmountBit(SDNode *N, SDValue &
Lo, SDValue &
Hi);
356 bool ExpandIntegerOperand(SDNode *N,
unsigned OperandNo);
357 SDValue ExpandIntOp_BITCAST(SDNode *N);
358 SDValue ExpandIntOp_BR_CC(SDNode *N);
359 SDValue ExpandIntOp_BUILD_VECTOR(SDNode *N);
360 SDValue ExpandIntOp_EXTRACT_ELEMENT(SDNode *N);
361 SDValue ExpandIntOp_SELECT_CC(SDNode *N);
362 SDValue ExpandIntOp_SETCC(SDNode *N);
363 SDValue ExpandIntOp_Shift(SDNode *N);
364 SDValue ExpandIntOp_SINT_TO_FP(SDNode *N);
365 SDValue ExpandIntOp_STORE(StoreSDNode *N,
unsigned OpNo);
366 SDValue ExpandIntOp_TRUNCATE(SDNode *N);
367 SDValue ExpandIntOp_UINT_TO_FP(SDNode *N);
368 SDValue ExpandIntOp_RETURNADDR(SDNode *N);
369 SDValue ExpandIntOp_ATOMIC_STORE(SDNode *N);
371 void IntegerExpandSetCCOperands(SDValue &NewLHS, SDValue &NewRHS,
383 SDValue GetSoftenedFloat(SDValue Op) {
384 SDValue &SoftenedOp = SoftenedFloats[Op];
385 RemapValue(SoftenedOp);
386 assert(SoftenedOp.getNode() &&
"Operand wasn't converted to integer?");
389 void SetSoftenedFloat(SDValue Op, SDValue Result);
392 void SoftenFloatResult(SDNode *N,
unsigned OpNo);
393 SDValue SoftenFloatRes_MERGE_VALUES(SDNode *N,
unsigned ResNo);
394 SDValue SoftenFloatRes_BITCAST(SDNode *N);
395 SDValue SoftenFloatRes_BUILD_PAIR(SDNode *N);
396 SDValue SoftenFloatRes_ConstantFP(ConstantFPSDNode *N);
397 SDValue SoftenFloatRes_EXTRACT_VECTOR_ELT(SDNode *N);
398 SDValue SoftenFloatRes_FABS(SDNode *N);
399 SDValue SoftenFloatRes_FMINNUM(SDNode *N);
400 SDValue SoftenFloatRes_FMAXNUM(SDNode *N);
401 SDValue SoftenFloatRes_FADD(SDNode *N);
402 SDValue SoftenFloatRes_FCEIL(SDNode *N);
403 SDValue SoftenFloatRes_FCOPYSIGN(SDNode *N);
404 SDValue SoftenFloatRes_FCOS(SDNode *N);
405 SDValue SoftenFloatRes_FDIV(SDNode *N);
406 SDValue SoftenFloatRes_FEXP(SDNode *N);
407 SDValue SoftenFloatRes_FEXP2(SDNode *N);
408 SDValue SoftenFloatRes_FFLOOR(SDNode *N);
409 SDValue SoftenFloatRes_FLOG(SDNode *N);
410 SDValue SoftenFloatRes_FLOG2(SDNode *N);
411 SDValue SoftenFloatRes_FLOG10(SDNode *N);
412 SDValue SoftenFloatRes_FMA(SDNode *N);
413 SDValue SoftenFloatRes_FMUL(SDNode *N);
414 SDValue SoftenFloatRes_FNEARBYINT(SDNode *N);
415 SDValue SoftenFloatRes_FNEG(SDNode *N);
416 SDValue SoftenFloatRes_FP_EXTEND(SDNode *N);
417 SDValue SoftenFloatRes_FP16_TO_FP(SDNode *N);
418 SDValue SoftenFloatRes_FP_ROUND(SDNode *N);
419 SDValue SoftenFloatRes_FPOW(SDNode *N);
420 SDValue SoftenFloatRes_FPOWI(SDNode *N);
421 SDValue SoftenFloatRes_FREM(SDNode *N);
422 SDValue SoftenFloatRes_FRINT(SDNode *N);
423 SDValue SoftenFloatRes_FROUND(SDNode *N);
424 SDValue SoftenFloatRes_FSIN(SDNode *N);
425 SDValue SoftenFloatRes_FSQRT(SDNode *N);
426 SDValue SoftenFloatRes_FSUB(SDNode *N);
427 SDValue SoftenFloatRes_FTRUNC(SDNode *N);
428 SDValue SoftenFloatRes_LOAD(SDNode *N);
429 SDValue SoftenFloatRes_SELECT(SDNode *N);
430 SDValue SoftenFloatRes_SELECT_CC(SDNode *N);
431 SDValue SoftenFloatRes_UNDEF(SDNode *N);
432 SDValue SoftenFloatRes_VAARG(SDNode *N);
433 SDValue SoftenFloatRes_XINT_TO_FP(SDNode *N);
436 bool SoftenFloatOperand(SDNode *N,
unsigned OpNo);
437 SDValue SoftenFloatOp_BITCAST(SDNode *N);
438 SDValue SoftenFloatOp_BR_CC(SDNode *N);
439 SDValue SoftenFloatOp_FP_EXTEND(SDNode *N);
440 SDValue SoftenFloatOp_FP_ROUND(SDNode *N);
441 SDValue SoftenFloatOp_FP_TO_SINT(SDNode *N);
442 SDValue SoftenFloatOp_FP_TO_UINT(SDNode *N);
443 SDValue SoftenFloatOp_SELECT_CC(SDNode *N);
444 SDValue SoftenFloatOp_SETCC(SDNode *N);
445 SDValue SoftenFloatOp_STORE(SDNode *N,
unsigned OpNo);
457 void GetExpandedFloat(SDValue Op, SDValue &
Lo, SDValue &
Hi);
458 void SetExpandedFloat(SDValue Op, SDValue
Lo, SDValue
Hi);
461 void ExpandFloatResult(SDNode *N,
unsigned ResNo);
462 void ExpandFloatRes_ConstantFP(SDNode *N, SDValue &
Lo, SDValue &
Hi);
463 void ExpandFloatRes_FABS (SDNode *N, SDValue &
Lo, SDValue &
Hi);
464 void ExpandFloatRes_FMINNUM (SDNode *N, SDValue &
Lo, SDValue &
Hi);
465 void ExpandFloatRes_FMAXNUM (SDNode *N, SDValue &
Lo, SDValue &
Hi);
466 void ExpandFloatRes_FADD (SDNode *N, SDValue &
Lo, SDValue &
Hi);
467 void ExpandFloatRes_FCEIL (SDNode *N, SDValue &
Lo, SDValue &
Hi);
468 void ExpandFloatRes_FCOPYSIGN (SDNode *N, SDValue &
Lo, SDValue &
Hi);
469 void ExpandFloatRes_FCOS (SDNode *N, SDValue &
Lo, SDValue &
Hi);
470 void ExpandFloatRes_FDIV (SDNode *N, SDValue &
Lo, SDValue &
Hi);
471 void ExpandFloatRes_FEXP (SDNode *N, SDValue &
Lo, SDValue &
Hi);
472 void ExpandFloatRes_FEXP2 (SDNode *N, SDValue &
Lo, SDValue &
Hi);
473 void ExpandFloatRes_FFLOOR (SDNode *N, SDValue &
Lo, SDValue &
Hi);
474 void ExpandFloatRes_FLOG (SDNode *N, SDValue &
Lo, SDValue &
Hi);
475 void ExpandFloatRes_FLOG2 (SDNode *N, SDValue &
Lo, SDValue &
Hi);
476 void ExpandFloatRes_FLOG10 (SDNode *N, SDValue &
Lo, SDValue &
Hi);
477 void ExpandFloatRes_FMA (SDNode *N, SDValue &
Lo, SDValue &
Hi);
478 void ExpandFloatRes_FMUL (SDNode *N, SDValue &
Lo, SDValue &
Hi);
479 void ExpandFloatRes_FNEARBYINT(SDNode *N, SDValue &
Lo, SDValue &
Hi);
480 void ExpandFloatRes_FNEG (SDNode *N, SDValue &
Lo, SDValue &
Hi);
481 void ExpandFloatRes_FP_EXTEND (SDNode *N, SDValue &
Lo, SDValue &
Hi);
482 void ExpandFloatRes_FPOW (SDNode *N, SDValue &
Lo, SDValue &
Hi);
483 void ExpandFloatRes_FPOWI (SDNode *N, SDValue &
Lo, SDValue &
Hi);
484 void ExpandFloatRes_FREM (SDNode *N, SDValue &
Lo, SDValue &
Hi);
485 void ExpandFloatRes_FRINT (SDNode *N, SDValue &
Lo, SDValue &
Hi);
486 void ExpandFloatRes_FROUND (SDNode *N, SDValue &
Lo, SDValue &
Hi);
487 void ExpandFloatRes_FSIN (SDNode *N, SDValue &
Lo, SDValue &
Hi);
488 void ExpandFloatRes_FSQRT (SDNode *N, SDValue &
Lo, SDValue &
Hi);
489 void ExpandFloatRes_FSUB (SDNode *N, SDValue &
Lo, SDValue &
Hi);
490 void ExpandFloatRes_FTRUNC (SDNode *N, SDValue &
Lo, SDValue &
Hi);
491 void ExpandFloatRes_LOAD (SDNode *N, SDValue &
Lo, SDValue &
Hi);
492 void ExpandFloatRes_XINT_TO_FP(SDNode *N, SDValue &
Lo, SDValue &
Hi);
495 bool ExpandFloatOperand(SDNode *N,
unsigned OperandNo);
496 SDValue ExpandFloatOp_BR_CC(SDNode *N);
497 SDValue ExpandFloatOp_FCOPYSIGN(SDNode *N);
498 SDValue ExpandFloatOp_FP_ROUND(SDNode *N);
499 SDValue ExpandFloatOp_FP_TO_SINT(SDNode *N);
500 SDValue ExpandFloatOp_FP_TO_UINT(SDNode *N);
501 SDValue ExpandFloatOp_SELECT_CC(SDNode *N);
502 SDValue ExpandFloatOp_SETCC(SDNode *N);
503 SDValue ExpandFloatOp_STORE(SDNode *N,
unsigned OpNo);
505 void FloatExpandSetCCOperands(SDValue &NewLHS, SDValue &NewRHS,
513 SDValue GetPromotedFloat(SDValue Op) {
514 SDValue &PromotedOp = PromotedFloats[Op];
515 RemapValue(PromotedOp);
516 assert(PromotedOp.getNode() &&
"Operand wasn't promoted?");
519 void SetPromotedFloat(SDValue Op, SDValue Result);
521 void PromoteFloatResult(SDNode *N,
unsigned ResNo);
522 SDValue PromoteFloatRes_BITCAST(SDNode *N);
523 SDValue PromoteFloatRes_BinOp(SDNode *N);
524 SDValue PromoteFloatRes_ConstantFP(SDNode *N);
525 SDValue PromoteFloatRes_EXTRACT_VECTOR_ELT(SDNode *N);
526 SDValue PromoteFloatRes_FCOPYSIGN(SDNode *N);
527 SDValue PromoteFloatRes_FMAD(SDNode *N);
528 SDValue PromoteFloatRes_FPOWI(SDNode *N);
529 SDValue PromoteFloatRes_FP_ROUND(SDNode *N);
530 SDValue PromoteFloatRes_LOAD(SDNode *N);
531 SDValue PromoteFloatRes_SELECT(SDNode *N);
532 SDValue PromoteFloatRes_SELECT_CC(SDNode *N);
533 SDValue PromoteFloatRes_UnaryOp(SDNode *N);
534 SDValue PromoteFloatRes_UNDEF(SDNode *N);
535 SDValue PromoteFloatRes_XINT_TO_FP(SDNode *N);
537 bool PromoteFloatOperand(SDNode *N,
unsigned ResNo);
538 SDValue PromoteFloatOp_BITCAST(SDNode *N,
unsigned OpNo);
539 SDValue PromoteFloatOp_FCOPYSIGN(SDNode *N,
unsigned OpNo);
540 SDValue PromoteFloatOp_FP_EXTEND(SDNode *N,
unsigned OpNo);
541 SDValue PromoteFloatOp_FP_TO_XINT(SDNode *N,
unsigned OpNo);
542 SDValue PromoteFloatOp_STORE(SDNode *N,
unsigned OpNo);
543 SDValue PromoteFloatOp_SELECT_CC(SDNode *N,
unsigned OpNo);
544 SDValue PromoteFloatOp_SETCC(SDNode *N,
unsigned OpNo);
553 SDValue GetScalarizedVector(SDValue Op) {
554 SDValue &ScalarizedOp = ScalarizedVectors[Op];
555 RemapValue(ScalarizedOp);
556 assert(ScalarizedOp.getNode() &&
"Operand wasn't scalarized?");
559 void SetScalarizedVector(SDValue Op, SDValue Result);
562 void ScalarizeVectorResult(SDNode *N,
unsigned OpNo);
563 SDValue ScalarizeVecRes_MERGE_VALUES(SDNode *N,
unsigned ResNo);
564 SDValue ScalarizeVecRes_BinOp(SDNode *N);
565 SDValue ScalarizeVecRes_TernaryOp(SDNode *N);
566 SDValue ScalarizeVecRes_UnaryOp(SDNode *N);
567 SDValue ScalarizeVecRes_InregOp(SDNode *N);
569 SDValue ScalarizeVecRes_BITCAST(SDNode *N);
570 SDValue ScalarizeVecRes_BUILD_VECTOR(SDNode *N);
571 SDValue ScalarizeVecRes_CONVERT_RNDSAT(SDNode *N);
572 SDValue ScalarizeVecRes_EXTRACT_SUBVECTOR(SDNode *N);
573 SDValue ScalarizeVecRes_FP_ROUND(SDNode *N);
574 SDValue ScalarizeVecRes_FPOWI(SDNode *N);
575 SDValue ScalarizeVecRes_INSERT_VECTOR_ELT(SDNode *N);
576 SDValue ScalarizeVecRes_LOAD(LoadSDNode *N);
577 SDValue ScalarizeVecRes_SCALAR_TO_VECTOR(SDNode *N);
578 SDValue ScalarizeVecRes_SIGN_EXTEND_INREG(SDNode *N);
579 SDValue ScalarizeVecRes_VSELECT(SDNode *N);
580 SDValue ScalarizeVecRes_SELECT(SDNode *N);
581 SDValue ScalarizeVecRes_SELECT_CC(SDNode *N);
582 SDValue ScalarizeVecRes_SETCC(SDNode *N);
583 SDValue ScalarizeVecRes_UNDEF(SDNode *N);
584 SDValue ScalarizeVecRes_VECTOR_SHUFFLE(SDNode *N);
585 SDValue ScalarizeVecRes_VSETCC(SDNode *N);
588 bool ScalarizeVectorOperand(SDNode *N,
unsigned OpNo);
589 SDValue ScalarizeVecOp_BITCAST(SDNode *N);
590 SDValue ScalarizeVecOp_UnaryOp(SDNode *N);
591 SDValue ScalarizeVecOp_CONCAT_VECTORS(SDNode *N);
592 SDValue ScalarizeVecOp_EXTRACT_VECTOR_ELT(SDNode *N);
593 SDValue ScalarizeVecOp_VSELECT(SDNode *N);
594 SDValue ScalarizeVecOp_STORE(StoreSDNode *N,
unsigned OpNo);
595 SDValue ScalarizeVecOp_FP_ROUND(SDNode *N,
unsigned OpNo);
608 void GetSplitVector(SDValue Op, SDValue &
Lo, SDValue &
Hi);
609 void SetSplitVector(SDValue Op, SDValue
Lo, SDValue
Hi);
612 void SplitVectorResult(SDNode *N,
unsigned OpNo);
613 void SplitVecRes_BinOp(SDNode *N, SDValue &
Lo, SDValue &
Hi);
614 void SplitVecRes_TernaryOp(SDNode *N, SDValue &
Lo, SDValue &
Hi);
615 void SplitVecRes_UnaryOp(SDNode *N, SDValue &
Lo, SDValue &
Hi);
616 void SplitVecRes_ExtendOp(SDNode *N, SDValue &
Lo, SDValue &
Hi);
617 void SplitVecRes_InregOp(SDNode *N, SDValue &
Lo, SDValue &
Hi);
619 void SplitVecRes_BITCAST(SDNode *N, SDValue &
Lo, SDValue &
Hi);
620 void SplitVecRes_BUILD_PAIR(SDNode *N, SDValue &
Lo, SDValue &
Hi);
621 void SplitVecRes_BUILD_VECTOR(SDNode *N, SDValue &
Lo, SDValue &
Hi);
622 void SplitVecRes_CONCAT_VECTORS(SDNode *N, SDValue &
Lo, SDValue &
Hi);
623 void SplitVecRes_EXTRACT_SUBVECTOR(SDNode *N, SDValue &
Lo, SDValue &
Hi);
624 void SplitVecRes_INSERT_SUBVECTOR(SDNode *N, SDValue &
Lo, SDValue &
Hi);
625 void SplitVecRes_FPOWI(SDNode *N, SDValue &
Lo, SDValue &
Hi);
626 void SplitVecRes_INSERT_VECTOR_ELT(SDNode *N, SDValue &
Lo, SDValue &
Hi);
627 void SplitVecRes_LOAD(LoadSDNode *N, SDValue &
Lo, SDValue &
Hi);
628 void SplitVecRes_MLOAD(MaskedLoadSDNode *N, SDValue &
Lo, SDValue &
Hi);
629 void SplitVecRes_MGATHER(MaskedGatherSDNode *N, SDValue &
Lo, SDValue &
Hi);
630 void SplitVecRes_SCALAR_TO_VECTOR(SDNode *N, SDValue &
Lo, SDValue &
Hi);
631 void SplitVecRes_SIGN_EXTEND_INREG(SDNode *N, SDValue &
Lo, SDValue &
Hi);
632 void SplitVecRes_SETCC(SDNode *N, SDValue &
Lo, SDValue &
Hi);
633 void SplitVecRes_UNDEF(SDNode *N, SDValue &
Lo, SDValue &
Hi);
634 void SplitVecRes_VECTOR_SHUFFLE(ShuffleVectorSDNode *N, SDValue &
Lo,
638 bool SplitVectorOperand(SDNode *N,
unsigned OpNo);
639 SDValue SplitVecOp_VSELECT(SDNode *N,
unsigned OpNo);
640 SDValue SplitVecOp_UnaryOp(SDNode *N);
641 SDValue SplitVecOp_TruncateHelper(SDNode *N);
643 SDValue SplitVecOp_BITCAST(SDNode *N);
644 SDValue SplitVecOp_EXTRACT_SUBVECTOR(SDNode *N);
645 SDValue SplitVecOp_EXTRACT_VECTOR_ELT(SDNode *N);
646 SDValue SplitVecOp_STORE(StoreSDNode *N,
unsigned OpNo);
647 SDValue SplitVecOp_MSTORE(MaskedStoreSDNode *N,
unsigned OpNo);
648 SDValue SplitVecOp_MSCATTER(MaskedScatterSDNode *N,
unsigned OpNo);
649 SDValue SplitVecOp_MGATHER(MaskedGatherSDNode *N,
unsigned OpNo);
650 SDValue SplitVecOp_CONCAT_VECTORS(SDNode *N);
651 SDValue SplitVecOp_VSETCC(SDNode *N);
652 SDValue SplitVecOp_FP_ROUND(SDNode *N);
664 SDValue GetWidenedVector(SDValue Op) {
665 SDValue &WidenedOp = WidenedVectors[Op];
666 RemapValue(WidenedOp);
667 assert(WidenedOp.getNode() &&
"Operand wasn't widened?");
670 void SetWidenedVector(SDValue Op, SDValue Result);
673 void WidenVectorResult(SDNode *N,
unsigned ResNo);
674 SDValue WidenVecRes_MERGE_VALUES(SDNode* N,
unsigned ResNo);
675 SDValue WidenVecRes_BITCAST(SDNode* N);
676 SDValue WidenVecRes_BUILD_VECTOR(SDNode* N);
677 SDValue WidenVecRes_CONCAT_VECTORS(SDNode* N);
678 SDValue WidenVecRes_CONVERT_RNDSAT(SDNode* N);
679 SDValue WidenVecRes_EXTRACT_SUBVECTOR(SDNode* N);
680 SDValue WidenVecRes_INSERT_VECTOR_ELT(SDNode* N);
681 SDValue WidenVecRes_LOAD(SDNode* N);
682 SDValue WidenVecRes_MLOAD(MaskedLoadSDNode* N);
683 SDValue WidenVecRes_SCALAR_TO_VECTOR(SDNode* N);
684 SDValue WidenVecRes_SIGN_EXTEND_INREG(SDNode* N);
685 SDValue WidenVecRes_SELECT(SDNode* N);
686 SDValue WidenVecRes_SELECT_CC(SDNode* N);
687 SDValue WidenVecRes_SETCC(SDNode* N);
688 SDValue WidenVecRes_UNDEF(SDNode *N);
689 SDValue WidenVecRes_VECTOR_SHUFFLE(ShuffleVectorSDNode *N);
690 SDValue WidenVecRes_VSETCC(SDNode* N);
692 SDValue WidenVecRes_Ternary(SDNode *N);
693 SDValue WidenVecRes_Binary(SDNode *N);
694 SDValue WidenVecRes_BinaryCanTrap(SDNode *N);
695 SDValue WidenVecRes_Convert(SDNode *N);
696 SDValue WidenVecRes_POWI(SDNode *N);
697 SDValue WidenVecRes_Shift(SDNode *N);
698 SDValue WidenVecRes_Unary(SDNode *N);
699 SDValue WidenVecRes_InregOp(SDNode *N);
702 bool WidenVectorOperand(SDNode *N,
unsigned OpNo);
703 SDValue WidenVecOp_BITCAST(SDNode *N);
704 SDValue WidenVecOp_CONCAT_VECTORS(SDNode *N);
705 SDValue WidenVecOp_EXTEND(SDNode *N);
706 SDValue WidenVecOp_EXTRACT_VECTOR_ELT(SDNode *N);
707 SDValue WidenVecOp_EXTRACT_SUBVECTOR(SDNode *N);
708 SDValue WidenVecOp_STORE(SDNode* N);
709 SDValue WidenVecOp_MSTORE(SDNode* N,
unsigned OpNo);
710 SDValue WidenVecOp_SETCC(SDNode* N);
712 SDValue WidenVecOp_Convert(SDNode *N);
722 SDValue GenWidenVectorLoads(SmallVectorImpl<SDValue> &LdChain,
730 SDValue GenWidenVectorExtLoads(SmallVectorImpl<SDValue> &LdChain,
737 void GenWidenVectorStores(SmallVectorImpl<SDValue> &StChain, StoreSDNode *
ST);
743 void GenWidenVectorTruncStores(SmallVectorImpl<SDValue> &StChain,
748 SDValue ModifyToType(SDValue InOp, EVT WidenVT);
759 void GetSplitOp(SDValue Op, SDValue &
Lo, SDValue &
Hi) {
760 if (Op.getValueType().isVector())
761 GetSplitVector(Op, Lo, Hi);
762 else if (Op.getValueType().isInteger())
763 GetExpandedInteger(Op, Lo, Hi);
765 GetExpandedFloat(Op, Lo, Hi);
770 void GetPairElements(SDValue Pair, SDValue &Lo, SDValue &Hi);
773 void SplitRes_MERGE_VALUES(SDNode *N,
unsigned ResNo,
774 SDValue &Lo, SDValue &Hi);
775 void SplitRes_SELECT (SDNode *N, SDValue &Lo, SDValue &Hi);
776 void SplitRes_SELECT_CC (SDNode *N, SDValue &Lo, SDValue &Hi);
777 void SplitRes_UNDEF (SDNode *N, SDValue &Lo, SDValue &Hi);
788 void GetExpandedOp(SDValue Op, SDValue &Lo, SDValue &Hi) {
789 if (Op.getValueType().isInteger())
790 GetExpandedInteger(Op, Lo, Hi);
792 GetExpandedFloat(Op, Lo, Hi);
798 void IntegerToVector(SDValue Op,
unsigned NumElements,
799 SmallVectorImpl<SDValue> &Ops, EVT EltVT);
802 void ExpandRes_MERGE_VALUES (SDNode *N,
unsigned ResNo,
803 SDValue &Lo, SDValue &Hi);
804 void ExpandRes_BITCAST (SDNode *N, SDValue &Lo, SDValue &Hi);
805 void ExpandRes_BUILD_PAIR (SDNode *N, SDValue &Lo, SDValue &Hi);
806 void ExpandRes_EXTRACT_ELEMENT (SDNode *N, SDValue &Lo, SDValue &Hi);
807 void ExpandRes_EXTRACT_VECTOR_ELT(SDNode *N, SDValue &Lo, SDValue &Hi);
808 void ExpandRes_NormalLoad (SDNode *N, SDValue &Lo, SDValue &Hi);
809 void ExpandRes_VAARG (SDNode *N, SDValue &Lo, SDValue &Hi);
812 SDValue ExpandOp_BITCAST (SDNode *N);
813 SDValue ExpandOp_BUILD_VECTOR (SDNode *N);
814 SDValue ExpandOp_EXTRACT_ELEMENT (SDNode *N);
815 SDValue ExpandOp_INSERT_VECTOR_ELT(SDNode *N);
816 SDValue ExpandOp_SCALAR_TO_VECTOR (SDNode *N);
817 SDValue ExpandOp_NormalStore (SDNode *N,
unsigned OpNo);
Libcall
RTLIB::Libcall enum - This enum defines all of the runtime library calls the backend can emit...
DAGTypeLegalizer - This takes an arbitrary SelectionDAG as input and hacks on it until only value typ...
LegalizeTypeAction
This enum indicates whether a types are legal for a target, and if not, what action should be used to...
This class defines information used to lower LLVM code to legal SelectionDAG operators that the targe...
unsigned getNumValues() const
Return the number of values defined/returned by this operator.
CondCode
ISD::CondCode enum - These are ordered carefully to make the bitfields below work out...
TargetConstant* - Like Constant*, but the DAG does not do any folding, simplification, or lowering of the constant.
SDNode * getNode() const
get the SDNode which holds the desired result
LoadExtType
LoadExtType enum - This enum defines the three variants of LOADEXT (load with extension).
#define LLVM_LIBRARY_VISIBILITY
LLVM_LIBRARY_VISIBILITY - If a class marked with this attribute is linked into a shared library...
EVT - Extended Value Type.
LegalizeTypeAction getTypeAction(MVT VT) const
SelectionDAG & getDAG() const
void NoteDeletion(SDNode *Old, SDNode *New)
This is used to represent a portion of an LLVM function in a low-level Data Dependence DAG representa...
Represents one node in the SelectionDAG.
SIGN_EXTEND_INREG - This operator atomically performs a SHL/SRA pair to sign extend a small value in ...
Unlike LLVM values, Selection DAG nodes may return multiple values as the result of a computation...
This file describes how to lower LLVM code to machine code.
DAGTypeLegalizer(SelectionDAG &dag)