LLVM 24.0.0git
TargetLowering.cpp
Go to the documentation of this file.
1//===-- TargetLowering.cpp - Implement the TargetLowering class -----------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This implements the TargetLowering class.
10//
11//===----------------------------------------------------------------------===//
12
14#include "llvm/ADT/STLExtras.h"
27#include "llvm/IR/DataLayout.h"
30#include "llvm/IR/LLVMContext.h"
31#include "llvm/MC/MCAsmInfo.h"
32#include "llvm/MC/MCExpr.h"
38#include <cctype>
39#include <deque>
40using namespace llvm;
41using namespace llvm::SDPatternMatch;
42
43/// NOTE: The TargetMachine owns TLOF.
47
48// Define the virtual destructor out-of-line for build efficiency.
50
51const char *TargetLowering::getTargetNodeName(unsigned Opcode) const {
52 return nullptr;
53}
54
58
59/// Check whether a given call node is in tail position within its function. If
60/// so, it sets Chain to the input chain of the tail call.
62 SDValue &Chain) const {
64
65 // First, check if tail calls have been disabled in this function.
66 if (F.getFnAttribute("disable-tail-calls").getValueAsBool())
67 return false;
68
69 // Conservatively require the attributes of the call to match those of
70 // the return. Ignore following attributes because they don't affect the
71 // call sequence.
72 AttrBuilder CallerAttrs(F.getContext(), F.getAttributes().getRetAttrs());
73 for (const auto &Attr : {Attribute::Alignment, Attribute::Dereferenceable,
74 Attribute::DereferenceableOrNull, Attribute::NoAlias,
75 Attribute::NonNull, Attribute::NoUndef,
76 Attribute::Range, Attribute::NoFPClass})
77 CallerAttrs.removeAttribute(Attr);
78
79 if (CallerAttrs.hasAttributes())
80 return false;
81
82 // It's not safe to eliminate the sign / zero extension of the return value.
83 if (CallerAttrs.contains(Attribute::ZExt) ||
84 CallerAttrs.contains(Attribute::SExt))
85 return false;
86
87 // Check if the only use is a function return node.
88 return isUsedByReturnOnly(Node, Chain);
89}
90
92 const uint32_t *CallerPreservedMask,
93 const SmallVectorImpl<CCValAssign> &ArgLocs,
94 const SmallVectorImpl<SDValue> &OutVals) const {
95 for (unsigned I = 0, E = ArgLocs.size(); I != E; ++I) {
96 const CCValAssign &ArgLoc = ArgLocs[I];
97 if (!ArgLoc.isRegLoc())
98 continue;
99 MCRegister Reg = ArgLoc.getLocReg();
100 // Only look at callee saved registers.
101 if (MachineOperand::clobbersPhysReg(CallerPreservedMask, Reg))
102 continue;
103 // Check that we pass the value used for the caller.
104 // (We look for a CopyFromReg reading a virtual register that is used
105 // for the function live-in value of register Reg)
106 SDValue Value = OutVals[I];
107 if (Value->getOpcode() == ISD::AssertZext)
108 Value = Value.getOperand(0);
109 if (Value->getOpcode() != ISD::CopyFromReg)
110 return false;
111 Register ArgReg = cast<RegisterSDNode>(Value->getOperand(1))->getReg();
112 if (MRI.getLiveInPhysReg(ArgReg) != Reg)
113 return false;
114 }
115 return true;
116}
117
118/// Set CallLoweringInfo attribute flags based on a call instruction
119/// and called function attributes.
121 unsigned ArgIdx) {
122 IsSExt = Call->paramHasAttr(ArgIdx, Attribute::SExt);
123 IsZExt = Call->paramHasAttr(ArgIdx, Attribute::ZExt);
124 IsNoExt = Call->paramHasAttr(ArgIdx, Attribute::NoExt);
125 IsInReg = Call->paramHasAttr(ArgIdx, Attribute::InReg);
126 IsSRet = Call->paramHasAttr(ArgIdx, Attribute::StructRet);
127 IsNest = Call->paramHasAttr(ArgIdx, Attribute::Nest);
128 IsByVal = Call->paramHasAttr(ArgIdx, Attribute::ByVal);
129 IsPreallocated = Call->paramHasAttr(ArgIdx, Attribute::Preallocated);
130 IsInAlloca = Call->paramHasAttr(ArgIdx, Attribute::InAlloca);
131 IsReturned = Call->paramHasAttr(ArgIdx, Attribute::Returned);
132 IsSwiftSelf = Call->paramHasAttr(ArgIdx, Attribute::SwiftSelf);
133 IsSwiftAsync = Call->paramHasAttr(ArgIdx, Attribute::SwiftAsync);
134 IsSwiftError = Call->paramHasAttr(ArgIdx, Attribute::SwiftError);
135 Alignment = Call->getParamStackAlign(ArgIdx);
136 IndirectType = nullptr;
138 "multiple ABI attributes?");
139 if (IsByVal) {
140 IndirectType = Call->getParamByValType(ArgIdx);
141 if (!Alignment)
142 Alignment = Call->getParamAlign(ArgIdx);
143 }
144 if (IsPreallocated)
145 IndirectType = Call->getParamPreallocatedType(ArgIdx);
146 if (IsInAlloca)
147 IndirectType = Call->getParamInAllocaType(ArgIdx);
148 if (IsSRet)
149 IndirectType = Call->getParamStructRetType(ArgIdx);
150}
151
152/// Generate a libcall taking the given operands as arguments and returning a
153/// result of type RetVT.
154std::pair<SDValue, SDValue>
155TargetLowering::makeLibCall(SelectionDAG &DAG, RTLIB::LibcallImpl LibcallImpl,
157 MakeLibCallOptions CallOptions, const SDLoc &dl,
158 SDValue InChain) const {
159 if (LibcallImpl == RTLIB::Unsupported)
160 reportFatalInternalError("unsupported library call operation");
161
162 if (!InChain)
163 InChain = DAG.getEntryNode();
164
166 Args.reserve(Ops.size());
167
168 ArrayRef<Type *> OpsTypeOverrides = CallOptions.OpsTypeOverrides;
169 for (unsigned i = 0; i < Ops.size(); ++i) {
170 SDValue NewOp = Ops[i];
171 Type *Ty = i < OpsTypeOverrides.size() && OpsTypeOverrides[i]
172 ? OpsTypeOverrides[i]
173 : NewOp.getValueType().getTypeForEVT(*DAG.getContext());
174 TargetLowering::ArgListEntry Entry(NewOp, Ty);
175 if (CallOptions.IsSoften)
176 Entry.OrigTy =
177 CallOptions.OpsVTBeforeSoften[i].getTypeForEVT(*DAG.getContext());
178
179 Entry.IsSExt =
180 shouldSignExtendTypeInLibCall(Entry.Ty, CallOptions.IsSigned);
181 Entry.IsZExt = !Entry.IsSExt;
182
183 if (CallOptions.IsSoften &&
185 Entry.IsSExt = Entry.IsZExt = false;
186 }
187 Args.push_back(Entry);
188 }
189
190 SDValue Callee =
191 DAG.getExternalSymbol(LibcallImpl, getPointerTy(DAG.getDataLayout()));
192
193 Type *RetTy = RetVT.getTypeForEVT(*DAG.getContext());
194 Type *OrigRetTy = RetTy;
196 bool signExtend = shouldSignExtendTypeInLibCall(RetTy, CallOptions.IsSigned);
197 bool zeroExtend = !signExtend;
198
199 if (CallOptions.IsSoften) {
200 OrigRetTy = CallOptions.RetVTBeforeSoften.getTypeForEVT(*DAG.getContext());
202 signExtend = zeroExtend = false;
203 }
204
205 CLI.setDebugLoc(dl)
206 .setChain(InChain)
207 .setLibCallee(getLibcallImplCallingConv(LibcallImpl), RetTy, OrigRetTy,
208 Callee, std::move(Args))
209 .setNoReturn(CallOptions.DoesNotReturn)
212 .setSExtResult(signExtend)
213 .setZExtResult(zeroExtend);
214 return LowerCallTo(CLI);
215}
216
218 LLVMContext &Context, std::vector<EVT> &MemOps, unsigned Limit,
219 const MemOp &Op, unsigned DstAS, unsigned SrcAS,
220 const AttributeList &FuncAttributes, EVT *LargestVT) const {
221 EVT VT = getOptimalMemOpType(Context, Op, FuncAttributes);
222
223 if (VT == MVT::Other) {
224 // Use the largest integer type whose alignment constraints are satisfied.
225 VT = MVT::LAST_INTEGER_VALUETYPE;
226 if (Op.isFixedDstAlign()) {
227 bool LoadsFromSrc = Op.isMemcpyOrMemmove() && !Op.isMemcpyStrSrc();
228 while (VT != MVT::i8) {
229 unsigned VTSize = VT.getSizeInBits() / 8;
230 bool DstOk =
231 Op.getDstAlign() >= VTSize ||
232 allowsMisalignedMemoryAccesses(VT, DstAS, Op.getDstAlign());
233 bool SrcOk =
234 !LoadsFromSrc || Op.getSrcAlign() >= VTSize ||
235 allowsMisalignedMemoryAccesses(VT, SrcAS, Op.getSrcAlign());
236 if (DstOk && SrcOk)
237 break;
239 }
240 }
241 assert(VT.isInteger());
242
243 // Find the largest legal integer type.
244 MVT LVT = MVT::LAST_INTEGER_VALUETYPE;
245 while (!isTypeLegal(LVT))
246 LVT = (MVT::SimpleValueType)(LVT.SimpleTy - 1);
247 assert(LVT.isInteger());
248
249 // If the type we've chosen is larger than the largest legal integer type
250 // then use the largest legal type.
251 if (VT.bitsGT(LVT))
252 VT = LVT;
253 }
254
255 unsigned NumMemOps = 0;
256 uint64_t Size = Op.size();
257 while (Size) {
258 unsigned VTSize = VT.getSizeInBits() / 8;
259 while (VTSize > Size) {
260 // For now, only use non-vector load / store's for the left-over pieces.
261 EVT NewVT = VT;
262 unsigned NewVTSize;
263
264 bool Found = false;
265 if (VT.isVector() || VT.isFloatingPoint()) {
266 NewVT = (VT.getSizeInBits() > 64) ? MVT::i64 : MVT::i32;
269 Found = true;
270 else if (NewVT == MVT::i64 &&
272 isSafeMemOpType(MVT::f64)) {
273 // i64 is usually not legal on 32-bit targets, but f64 may be.
274 NewVT = MVT::f64;
275 Found = true;
276 }
277 }
278
279 if (!Found) {
280 do {
281 NewVT = (MVT::SimpleValueType)(NewVT.getSimpleVT().SimpleTy - 1);
282 if (NewVT == MVT::i8)
283 break;
284 } while (!isSafeMemOpType(NewVT.getSimpleVT()));
285 }
286 NewVTSize = NewVT.getSizeInBits() / 8;
287
288 // If the new VT cannot cover all of the remaining bits, then consider
289 // issuing a (or a pair of) unaligned and overlapping load / store.
290 unsigned Fast;
291 if (NumMemOps && !Op.isVolatile() && NewVTSize < Size &&
293 VT, DstAS, Op.isFixedDstAlign() ? Op.getDstAlign() : Align(1),
295 Fast)
296 VTSize = Size;
297 else {
298 VT = NewVT;
299 VTSize = NewVTSize;
300 }
301 }
302
303 if (++NumMemOps > Limit)
304 return false;
305
306 MemOps.push_back(VT);
307 Size -= VTSize;
308 }
309
310 return true;
311}
312
313/// Soften the operands of a comparison. This code is shared among BR_CC,
314/// SELECT_CC, and SETCC handlers.
316 SDValue &NewLHS, SDValue &NewRHS,
317 ISD::CondCode &CCCode,
318 const SDLoc &dl, const SDValue OldLHS,
319 const SDValue OldRHS) const {
320 SDValue Chain;
321 return softenSetCCOperands(DAG, VT, NewLHS, NewRHS, CCCode, dl, OldLHS,
322 OldRHS, Chain);
323}
324
325/// Select the libcall and the condition code to test its result against 0 for
326/// an ordered floating-point compare. \p BoolLC is the boolean helper (result
327/// is 0/1). \p TriStateLC is the per-predicate three-way helper and \p
328/// GenericLC the generic single-symbol three-way helper (both return -1/0/1,
329/// tested against 0 with \p TriStateCC). The boolean form is preferred, then
330/// the per-predicate three-way, then the generic three-way.
331static std::pair<RTLIB::Libcall, ISD::CondCode>
332selectFPCmpLibcall(const LibcallLoweringInfo &Libcalls, RTLIB::Libcall BoolLC,
333 RTLIB::Libcall TriStateLC, RTLIB::Libcall GenericLC,
334 ISD::CondCode TriStateCC) {
335 if (Libcalls.getLibcallImpl(BoolLC) != RTLIB::Unsupported)
336 return {BoolLC, ISD::SETNE};
337 if (Libcalls.getLibcallImpl(TriStateLC) != RTLIB::Unsupported)
338 return {TriStateLC, TriStateCC};
339 return {GenericLC, TriStateCC};
340}
341
343 SDValue &NewLHS, SDValue &NewRHS,
344 ISD::CondCode &CCCode,
345 const SDLoc &dl, const SDValue OldLHS,
346 const SDValue OldRHS,
347 SDValue &Chain,
348 bool IsSignaling) const {
349 // FIXME: Currently we cannot really respect all IEEE predicates due to libgcc
350 // not supporting it. We can update this code when libgcc provides such
351 // functions.
352
353 assert((VT == MVT::f32 || VT == MVT::f64 || VT == MVT::f128 || VT == MVT::ppcf128)
354 && "Unsupported setcc type!");
355
356 // Expand into one or more soft-fp libcall(s).
357 RTLIB::Libcall LC1 = RTLIB::UNKNOWN_LIBCALL, LC2 = RTLIB::UNKNOWN_LIBCALL;
359 bool ShouldInvertCC = false;
360
361 // Expand a compare libcall family name (e.g. OEQ, FCMP3_PRED_OEQ) to the
362 // RTLIB::Libcall for VT.
363#define FP_CMP_LIBCALL(BASE) \
364 RTLIB::getFPLibCall(VT, RTLIB::BASE##_F32, RTLIB::BASE##_F64, \
365 RTLIB::UNKNOWN_LIBCALL, RTLIB::BASE##_F128, \
366 RTLIB::BASE##_PPCF128)
367
368 switch (CCCode) {
369 case ISD::SETEQ:
370 case ISD::SETOEQ:
371 std::tie(LC1, CC1) = selectFPCmpLibcall(
372 DAG.getLibcalls(), FP_CMP_LIBCALL(OEQ), FP_CMP_LIBCALL(FCMP3_PRED_OEQ),
373 FP_CMP_LIBCALL(FCMP3), ISD::SETEQ);
374 break;
375 case ISD::SETNE:
376 case ISD::SETUNE:
377 std::tie(LC1, CC1) = selectFPCmpLibcall(
378 DAG.getLibcalls(), FP_CMP_LIBCALL(UNE), FP_CMP_LIBCALL(FCMP3_PRED_UNE),
379 FP_CMP_LIBCALL(FCMP3), ISD::SETNE);
380 // Some ABIs (e.g. AEABI) provide neither a not-equal nor a three-way
381 // compare; obtain not-equal (UNE = !OEQ) by inverting ordered-equal.
382 if (DAG.getLibcalls().getLibcallImpl(LC1) == RTLIB::Unsupported) {
383 std::tie(LC1, CC1) = selectFPCmpLibcall(
384 DAG.getLibcalls(), FP_CMP_LIBCALL(OEQ),
385 FP_CMP_LIBCALL(FCMP3_PRED_OEQ), FP_CMP_LIBCALL(FCMP3), ISD::SETEQ);
386 ShouldInvertCC = true;
387 }
388 break;
389 case ISD::SETGE:
390 case ISD::SETOGE:
391 std::tie(LC1, CC1) = selectFPCmpLibcall(
392 DAG.getLibcalls(), FP_CMP_LIBCALL(OGE), FP_CMP_LIBCALL(FCMP3_PRED_OGE),
393 FP_CMP_LIBCALL(FCMP3), ISD::SETGE);
394 break;
395 case ISD::SETLT:
396 case ISD::SETOLT:
397 std::tie(LC1, CC1) = selectFPCmpLibcall(
398 DAG.getLibcalls(), FP_CMP_LIBCALL(OLT), FP_CMP_LIBCALL(FCMP3_PRED_OLT),
399 FP_CMP_LIBCALL(FCMP3), ISD::SETLT);
400 break;
401 case ISD::SETLE:
402 case ISD::SETOLE:
403 std::tie(LC1, CC1) = selectFPCmpLibcall(
404 DAG.getLibcalls(), FP_CMP_LIBCALL(OLE), FP_CMP_LIBCALL(FCMP3_PRED_OLE),
405 FP_CMP_LIBCALL(FCMP3), ISD::SETLE);
406 break;
407 case ISD::SETGT:
408 case ISD::SETOGT:
409 std::tie(LC1, CC1) = selectFPCmpLibcall(
410 DAG.getLibcalls(), FP_CMP_LIBCALL(OGT), FP_CMP_LIBCALL(FCMP3_PRED_OGT),
411 FP_CMP_LIBCALL(FCMP3), ISD::SETGT);
412 break;
413 case ISD::SETO:
414 ShouldInvertCC = true;
415 [[fallthrough]];
416 case ISD::SETUO:
417 // Unordered is a boolean everywhere (__unordXf2 returns 0/1).
418 LC1 = FP_CMP_LIBCALL(UO);
419 CC1 = ISD::SETNE;
420 break;
421 case ISD::SETONE:
422 // SETONE = O && UNE
423 ShouldInvertCC = true;
424 [[fallthrough]];
425 case ISD::SETUEQ:
426 LC1 = FP_CMP_LIBCALL(UO);
427 CC1 = ISD::SETNE;
428 std::tie(LC2, CC2) = selectFPCmpLibcall(
429 DAG.getLibcalls(), FP_CMP_LIBCALL(OEQ), FP_CMP_LIBCALL(FCMP3_PRED_OEQ),
430 FP_CMP_LIBCALL(FCMP3), ISD::SETEQ);
431 break;
432 default:
433 // Invert CC for unordered comparisons, handled by the ordered inverse.
434 ShouldInvertCC = true;
435 switch (CCCode) {
436 case ISD::SETULT:
437 std::tie(LC1, CC1) = selectFPCmpLibcall(
438 DAG.getLibcalls(), FP_CMP_LIBCALL(OGE),
439 FP_CMP_LIBCALL(FCMP3_PRED_OGE), FP_CMP_LIBCALL(FCMP3), ISD::SETGE);
440 break;
441 case ISD::SETULE:
442 std::tie(LC1, CC1) = selectFPCmpLibcall(
443 DAG.getLibcalls(), FP_CMP_LIBCALL(OGT),
444 FP_CMP_LIBCALL(FCMP3_PRED_OGT), FP_CMP_LIBCALL(FCMP3), ISD::SETGT);
445 break;
446 case ISD::SETUGT:
447 std::tie(LC1, CC1) = selectFPCmpLibcall(
448 DAG.getLibcalls(), FP_CMP_LIBCALL(OLE),
449 FP_CMP_LIBCALL(FCMP3_PRED_OLE), FP_CMP_LIBCALL(FCMP3), ISD::SETLE);
450 break;
451 case ISD::SETUGE:
452 std::tie(LC1, CC1) = selectFPCmpLibcall(
453 DAG.getLibcalls(), FP_CMP_LIBCALL(OLT),
454 FP_CMP_LIBCALL(FCMP3_PRED_OLT), FP_CMP_LIBCALL(FCMP3), ISD::SETLT);
455 break;
456 default:
457 llvm_unreachable("Do not know how to soften this setcc!");
458 }
459 }
460
461#undef FP_CMP_LIBCALL
462
463 // Use the target specific return value for comparison lib calls.
465 SDValue Ops[2] = {NewLHS, NewRHS};
467 EVT OpsVT[2] = { OldLHS.getValueType(),
468 OldRHS.getValueType() };
469 CallOptions.setTypeListBeforeSoften(OpsVT, RetVT);
470 auto Call = makeLibCall(DAG, LC1, RetVT, Ops, CallOptions, dl, Chain);
471 NewLHS = Call.first;
472 NewRHS = DAG.getConstant(0, dl, RetVT);
473
474 if (DAG.getLibcalls().getLibcallImpl(LC1) == RTLIB::Unsupported) {
476 "no libcall available to soften floating-point compare");
477 }
478
479 CCCode = CC1;
480 if (ShouldInvertCC) {
481 assert(RetVT.isInteger());
482 CCCode = getSetCCInverse(CCCode, RetVT);
483 }
484
485 if (LC2 == RTLIB::UNKNOWN_LIBCALL) {
486 // Update Chain.
487 Chain = Call.second;
488 } else {
489 if (DAG.getLibcalls().getLibcallImpl(LC2) == RTLIB::Unsupported) {
491 "no libcall available to soften floating-point compare");
492 }
493
494 assert(CCCode == (ShouldInvertCC ? ISD::SETEQ : ISD::SETNE) &&
495 "unordered call should be simple boolean");
496
497 EVT SetCCVT =
498 getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), RetVT);
500 NewLHS = DAG.getNode(ISD::AssertZext, dl, RetVT, Call.first,
501 DAG.getValueType(MVT::i1));
502 }
503
504 SDValue Tmp = DAG.getSetCC(dl, SetCCVT, NewLHS, NewRHS, CCCode);
505 auto Call2 = makeLibCall(DAG, LC2, RetVT, Ops, CallOptions, dl, Chain);
506 CCCode = CC2;
507 if (ShouldInvertCC)
508 CCCode = getSetCCInverse(CCCode, RetVT);
509 NewLHS = DAG.getSetCC(dl, SetCCVT, Call2.first, NewRHS, CCCode);
510 if (Chain)
511 Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Call.second,
512 Call2.second);
513 NewLHS = DAG.getNode(ShouldInvertCC ? ISD::AND : ISD::OR, dl,
514 Tmp.getValueType(), Tmp, NewLHS);
515 NewRHS = SDValue();
516 }
517}
518
519/// Return the entry encoding for a jump table in the current function. The
520/// returned value is a member of the MachineJumpTableInfo::JTEntryKind enum.
522 // In non-pic modes, just use the address of a block.
525
526 // Otherwise, use a label difference.
528}
529
534
535/// This returns the relocation base for the given PIC jumptable, the same as
536/// getPICJumpTableRelocBase, but as an MCExpr.
537const MCExpr *
539 unsigned JTI,MCContext &Ctx) const{
540 // The normal PIC reloc base is the label at the start of the jump table.
541 return MCSymbolRefExpr::create(MF->getJTISymbol(JTI, Ctx), Ctx);
542}
543
545 SDValue Addr, int JTI,
546 SelectionDAG &DAG) const {
547 SDValue Chain = Value;
548 // Jump table debug info is only needed if CodeView is enabled.
550 Chain = DAG.getJumpTableDebugInfo(JTI, Chain, dl);
551 }
552 return DAG.getNode(ISD::BRIND, dl, MVT::Other, Chain, Addr);
553}
554
555bool
557 const TargetMachine &TM = getTargetMachine();
558 const GlobalValue *GV = GA->getGlobal();
559
560 // If the address is not even local to this DSO we will have to load it from
561 // a got and then add the offset.
562 if (!TM.shouldAssumeDSOLocal(GV))
563 return false;
564
565 // If the code is position independent we will have to add a base register.
567 return false;
568
569 // Otherwise we can do it.
570 return true;
571}
572
573//===----------------------------------------------------------------------===//
574// Optimization Methods
575//===----------------------------------------------------------------------===//
576
577/// If the specified instruction has a constant integer operand and there are
578/// bits set in that constant that are not demanded, then clear those bits and
579/// return true.
581 const APInt &DemandedBits,
582 const APInt &DemandedElts,
583 TargetLoweringOpt &TLO) const {
584 SDLoc DL(Op);
585 unsigned Opcode = Op.getOpcode();
586
587 // Early-out if we've ended up calling an undemanded node, leave this to
588 // constant folding.
589 if (DemandedBits.isZero() || DemandedElts.isZero())
590 return false;
591
592 // Do target-specific constant optimization.
593 if (targetShrinkDemandedConstant(Op, DemandedBits, DemandedElts, TLO))
594 return TLO.New.getNode();
595
596 // FIXME: ISD::SELECT, ISD::SELECT_CC
597 switch (Opcode) {
598 default:
599 break;
600 case ISD::XOR:
601 case ISD::AND:
602 case ISD::OR: {
603 auto *Op1C = dyn_cast<ConstantSDNode>(Op.getOperand(1));
604 if (!Op1C || Op1C->isOpaque())
605 return false;
606
607 // If this is a 'not' op, don't touch it because that's a canonical form.
608 const APInt &C = Op1C->getAPIntValue();
609 if (Opcode == ISD::XOR && DemandedBits.isSubsetOf(C))
610 return false;
611
612 if (!C.isSubsetOf(DemandedBits)) {
613 EVT VT = Op.getValueType();
614 SDValue NewC = TLO.DAG.getConstant(DemandedBits & C, DL, VT);
615 SDValue NewOp = TLO.DAG.getNode(Opcode, DL, VT, Op.getOperand(0), NewC,
616 Op->getFlags());
617 return TLO.CombineTo(Op, NewOp);
618 }
619
620 break;
621 }
622 }
623
624 return false;
625}
626
628 const APInt &DemandedBits,
629 TargetLoweringOpt &TLO) const {
630 EVT VT = Op.getValueType();
631 APInt DemandedElts = VT.isVector()
633 : APInt(1, 1);
634 return ShrinkDemandedConstant(Op, DemandedBits, DemandedElts, TLO);
635}
636
637/// Convert x+y to (VT)((SmallVT)x+(SmallVT)y) if the casts are free.
638/// This uses isTruncateFree/isZExtFree and ANY_EXTEND for the widening cast,
639/// but it could be generalized for targets with other types of implicit
640/// widening casts.
642 const APInt &DemandedBits,
643 TargetLoweringOpt &TLO) const {
644 assert(Op.getNumOperands() == 2 &&
645 "ShrinkDemandedOp only supports binary operators!");
646 assert(Op.getNode()->getNumValues() == 1 &&
647 "ShrinkDemandedOp only supports nodes with one result!");
648
649 EVT VT = Op.getValueType();
650 SelectionDAG &DAG = TLO.DAG;
651 SDLoc dl(Op);
652
653 // Early return, as this function cannot handle vector types.
654 if (VT.isVector())
655 return false;
656
657 assert(Op.getOperand(0).getValueType().getScalarSizeInBits() == BitWidth &&
658 Op.getOperand(1).getValueType().getScalarSizeInBits() == BitWidth &&
659 "ShrinkDemandedOp only supports operands that have the same size!");
660
661 // Don't do this if the node has another user, which may require the
662 // full value.
663 if (!Op.getNode()->hasOneUse())
664 return false;
665
666 // Search for the smallest integer type with free casts to and from
667 // Op's type. For expedience, just check power-of-2 integer types.
668 unsigned DemandedSize = DemandedBits.getActiveBits();
669 for (unsigned SmallVTBits = llvm::bit_ceil(DemandedSize);
670 SmallVTBits < BitWidth; SmallVTBits = NextPowerOf2(SmallVTBits)) {
671 EVT SmallVT = EVT::getIntegerVT(*DAG.getContext(), SmallVTBits);
672 if (isTruncateFree(Op, SmallVT) && isZExtFree(SmallVT, VT)) {
673 // We found a type with free casts.
674
675 // If the operation has the 'disjoint' flag, then the
676 // operands on the new node are also disjoint.
677 SDNodeFlags Flags(Op->getFlags().hasDisjoint() ? SDNodeFlags::Disjoint
679 unsigned Opcode = Op.getOpcode();
680 if (Opcode == ISD::PTRADD) {
681 // It isn't a ptradd anymore if it doesn't operate on the entire
682 // pointer.
683 Opcode = ISD::ADD;
684 }
685 SDValue X = DAG.getNode(
686 Opcode, dl, SmallVT,
687 DAG.getNode(ISD::TRUNCATE, dl, SmallVT, Op.getOperand(0)),
688 DAG.getNode(ISD::TRUNCATE, dl, SmallVT, Op.getOperand(1)), Flags);
689 assert(DemandedSize <= SmallVTBits && "Narrowed below demanded bits?");
690 SDValue Z = DAG.getNode(ISD::ANY_EXTEND, dl, VT, X);
691 return TLO.CombineTo(Op, Z);
692 }
693 }
694 return false;
695}
696
698 DAGCombinerInfo &DCI) const {
699 SelectionDAG &DAG = DCI.DAG;
700 TargetLoweringOpt TLO(DAG, !DCI.isBeforeLegalize(),
701 !DCI.isBeforeLegalizeOps());
703
704 bool Simplified = SimplifyDemandedBits(Op, DemandedBits, Known, TLO);
705 if (Simplified) {
706 DCI.AddToWorklist(Op.getNode());
708 }
709 return Simplified;
710}
711
713 const APInt &DemandedElts,
714 DAGCombinerInfo &DCI) const {
715 SelectionDAG &DAG = DCI.DAG;
716 TargetLoweringOpt TLO(DAG, !DCI.isBeforeLegalize(),
717 !DCI.isBeforeLegalizeOps());
719
720 bool Simplified =
721 SimplifyDemandedBits(Op, DemandedBits, DemandedElts, Known, TLO);
722 if (Simplified) {
723 DCI.AddToWorklist(Op.getNode());
725 }
726 return Simplified;
727}
728
732 unsigned Depth,
733 bool AssumeSingleUse) const {
734 EVT VT = Op.getValueType();
735
736 // Since the number of lanes in a scalable vector is unknown at compile time,
737 // we track one bit which is implicitly broadcast to all lanes. This means
738 // that all lanes in a scalable vector are considered demanded.
739 APInt DemandedElts = VT.isFixedLengthVector()
741 : APInt(1, 1);
742 return SimplifyDemandedBits(Op, DemandedBits, DemandedElts, Known, TLO, Depth,
743 AssumeSingleUse);
744}
745
746// TODO: Under what circumstances can we create nodes? Constant folding?
748 SDValue Op, const APInt &DemandedBits, const APInt &DemandedElts,
749 SelectionDAG &DAG, unsigned Depth) const {
750 EVT VT = Op.getValueType();
751
752 // Limit search depth.
754 return SDValue();
755
756 // Ignore UNDEFs.
757 if (Op.isUndef())
758 return SDValue();
759
760 // Not demanding any bits/elts from Op.
761 if (DemandedBits == 0 || DemandedElts == 0)
762 return DAG.getUNDEF(VT);
763
764 bool IsLE = DAG.getDataLayout().isLittleEndian();
765 unsigned NumElts = DemandedElts.getBitWidth();
766 unsigned BitWidth = DemandedBits.getBitWidth();
767 KnownBits LHSKnown, RHSKnown;
768 switch (Op.getOpcode()) {
769 case ISD::BITCAST: {
770 if (VT.isScalableVector())
771 return SDValue();
772
773 SDValue Src = peekThroughBitcasts(Op.getOperand(0));
774 EVT SrcVT = Src.getValueType();
775 EVT DstVT = Op.getValueType();
776 if (SrcVT == DstVT)
777 return Src;
778
779 unsigned NumSrcEltBits = SrcVT.getScalarSizeInBits();
780 unsigned NumDstEltBits = DstVT.getScalarSizeInBits();
781 if (NumSrcEltBits == NumDstEltBits)
783 Src, DemandedBits, DemandedElts, DAG, Depth + 1))
784 return DAG.getBitcast(DstVT, V);
785
786 if (SrcVT.isVector() && (NumDstEltBits % NumSrcEltBits) == 0) {
787 unsigned Scale = NumDstEltBits / NumSrcEltBits;
788 unsigned NumSrcElts = SrcVT.getVectorNumElements();
789 APInt DemandedSrcBits = APInt::getZero(NumSrcEltBits);
790 for (unsigned i = 0; i != Scale; ++i) {
791 unsigned EltOffset = IsLE ? i : (Scale - 1 - i);
792 unsigned BitOffset = EltOffset * NumSrcEltBits;
793 DemandedSrcBits |= DemandedBits.extractBits(NumSrcEltBits, BitOffset);
794 }
795 // Recursive calls below may turn not demanded elements into poison, so we
796 // need to demand all smaller source elements that maps to a demanded
797 // destination element.
798 APInt DemandedSrcElts = APIntOps::ScaleBitMask(DemandedElts, NumSrcElts);
799
801 Src, DemandedSrcBits, DemandedSrcElts, DAG, Depth + 1))
802 return DAG.getBitcast(DstVT, V);
803 }
804
805 // TODO - bigendian once we have test coverage.
806 if (IsLE && (NumSrcEltBits % NumDstEltBits) == 0) {
807 unsigned Scale = NumSrcEltBits / NumDstEltBits;
808 unsigned NumSrcElts = SrcVT.isVector() ? SrcVT.getVectorNumElements() : 1;
809 APInt DemandedSrcBits = APInt::getZero(NumSrcEltBits);
810 APInt DemandedSrcElts = APInt::getZero(NumSrcElts);
811 for (unsigned i = 0; i != NumElts; ++i)
812 if (DemandedElts[i]) {
813 unsigned Offset = (i % Scale) * NumDstEltBits;
814 DemandedSrcBits.insertBits(DemandedBits, Offset);
815 DemandedSrcElts.setBit(i / Scale);
816 }
817
819 Src, DemandedSrcBits, DemandedSrcElts, DAG, Depth + 1))
820 return DAG.getBitcast(DstVT, V);
821 }
822
823 break;
824 }
825 case ISD::AND: {
826 LHSKnown = DAG.computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
827 RHSKnown = DAG.computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
828
829 // If all of the demanded bits are known 1 on one side, return the other.
830 // These bits cannot contribute to the result of the 'and' in this
831 // context.
832 if (DemandedBits.isSubsetOf(LHSKnown.Zero | RHSKnown.One))
833 return Op.getOperand(0);
834 if (DemandedBits.isSubsetOf(RHSKnown.Zero | LHSKnown.One))
835 return Op.getOperand(1);
836 break;
837 }
838 case ISD::OR: {
839 LHSKnown = DAG.computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
840 RHSKnown = DAG.computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
841
842 // If all of the demanded bits are known zero on one side, return the
843 // other. These bits cannot contribute to the result of the 'or' in this
844 // context.
845 if (DemandedBits.isSubsetOf(LHSKnown.One | RHSKnown.Zero))
846 return Op.getOperand(0);
847 if (DemandedBits.isSubsetOf(RHSKnown.One | LHSKnown.Zero))
848 return Op.getOperand(1);
849 break;
850 }
851 case ISD::XOR: {
852 LHSKnown = DAG.computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
853 RHSKnown = DAG.computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
854
855 // If all of the demanded bits are known zero on one side, return the
856 // other.
857 if (DemandedBits.isSubsetOf(RHSKnown.Zero))
858 return Op.getOperand(0);
859 if (DemandedBits.isSubsetOf(LHSKnown.Zero))
860 return Op.getOperand(1);
861 break;
862 }
863 case ISD::ADD:
864 case ISD::MUL:
865 case ISD::SMIN:
866 case ISD::SMAX:
867 case ISD::UMIN:
868 case ISD::UMAX: {
869 if (DAG.isIdentityElement(Op.getOpcode(), Op->getFlags(), Op.getOperand(1),
870 DemandedElts, 1, Depth + 1))
871 return Op.getOperand(0);
872
873 if (DAG.isIdentityElement(Op.getOpcode(), Op->getFlags(), Op.getOperand(0),
874 DemandedElts, 0, Depth + 1))
875 return Op.getOperand(1);
876 break;
877 }
878 case ISD::SHL: {
879 // If we are only demanding sign bits then we can use the shift source
880 // directly.
881 if (std::optional<unsigned> MaxSA =
882 DAG.getValidMaximumShiftAmount(Op, DemandedElts, Depth + 1)) {
883 SDValue Op0 = Op.getOperand(0);
884 unsigned ShAmt = *MaxSA;
885 unsigned NumSignBits =
886 DAG.ComputeNumSignBits(Op0, DemandedElts, Depth + 1);
887 unsigned UpperDemandedBits = BitWidth - DemandedBits.countr_zero();
888 if (NumSignBits > ShAmt && (NumSignBits - ShAmt) >= (UpperDemandedBits))
889 return Op0;
890 }
891 break;
892 }
893 case ISD::SRL: {
894 // If we are only demanding sign bits then we can use the shift source
895 // directly.
896 if (std::optional<unsigned> MaxSA =
897 DAG.getValidMaximumShiftAmount(Op, DemandedElts, Depth + 1)) {
898 SDValue Op0 = Op.getOperand(0);
899 unsigned ShAmt = *MaxSA;
900 // Must already be signbits in DemandedBits bounds, and can't demand any
901 // shifted in zeroes.
902 if (DemandedBits.countl_zero() >= ShAmt) {
903 unsigned NumSignBits =
904 DAG.ComputeNumSignBits(Op0, DemandedElts, Depth + 1);
905 if (DemandedBits.countr_zero() >= (BitWidth - NumSignBits))
906 return Op0;
907 }
908 }
909 break;
910 }
911 case ISD::SETCC: {
912 SDValue Op0 = Op.getOperand(0);
913 SDValue Op1 = Op.getOperand(1);
914 ISD::CondCode CC = cast<CondCodeSDNode>(Op.getOperand(2))->get();
915 // If (1) we only need the sign-bit, (2) the setcc operands are the same
916 // width as the setcc result, and (3) the result of a setcc conforms to 0 or
917 // -1, we may be able to bypass the setcc.
918 if (DemandedBits.isSignMask() &&
922 // If we're testing X < 0, then this compare isn't needed - just use X!
923 // FIXME: We're limiting to integer types here, but this should also work
924 // if we don't care about FP signed-zero. The use of SETLT with FP means
925 // that we don't care about NaNs.
926 if (CC == ISD::SETLT && Op1.getValueType().isInteger() &&
928 return Op0;
929 }
930 break;
931 }
933 // If none of the extended bits are demanded, eliminate the sextinreg.
934 SDValue Op0 = Op.getOperand(0);
935 EVT ExVT = cast<VTSDNode>(Op.getOperand(1))->getVT();
936 unsigned ExBits = ExVT.getScalarSizeInBits();
937 if (DemandedBits.getActiveBits() <= ExBits &&
939 return Op0;
940 // If the input is already sign extended, just drop the extension.
941 unsigned NumSignBits = DAG.ComputeNumSignBits(Op0, DemandedElts, Depth + 1);
942 if (NumSignBits >= (BitWidth - ExBits + 1))
943 return Op0;
944 break;
945 }
949 if (VT.isScalableVector())
950 return SDValue();
951
952 // If we only want the lowest element and none of extended bits, then we can
953 // return the bitcasted source vector.
954 SDValue Src = Op.getOperand(0);
955 EVT SrcVT = Src.getValueType();
956 EVT DstVT = Op.getValueType();
957 if (IsLE && DemandedElts == 1 &&
958 DstVT.getSizeInBits() == SrcVT.getSizeInBits() &&
959 DemandedBits.getActiveBits() <= SrcVT.getScalarSizeInBits()) {
960 return DAG.getBitcast(DstVT, Src);
961 }
962 break;
963 }
965 if (VT.isScalableVector())
966 return SDValue();
967
968 // If we don't demand the inserted element, return the base vector.
969 SDValue Vec = Op.getOperand(0);
970 auto *CIdx = dyn_cast<ConstantSDNode>(Op.getOperand(2));
971 EVT VecVT = Vec.getValueType();
972 if (CIdx && CIdx->getAPIntValue().ult(VecVT.getVectorNumElements()) &&
973 !DemandedElts[CIdx->getZExtValue()])
974 return Vec;
975 break;
976 }
978 if (VT.isScalableVector())
979 return SDValue();
980
981 SDValue Vec = Op.getOperand(0);
982 SDValue Sub = Op.getOperand(1);
983 uint64_t Idx = Op.getConstantOperandVal(2);
984 unsigned NumSubElts = Sub.getValueType().getVectorNumElements();
985 APInt DemandedSubElts = DemandedElts.extractBits(NumSubElts, Idx);
986 // If we don't demand the inserted subvector, return the base vector.
987 if (DemandedSubElts == 0)
988 return Vec;
989 break;
990 }
991 case ISD::VECTOR_SHUFFLE: {
993 ArrayRef<int> ShuffleMask = cast<ShuffleVectorSDNode>(Op)->getMask();
994
995 // If all the demanded elts are from one operand and are inline,
996 // then we can use the operand directly.
997 bool AllUndef = true, IdentityLHS = true, IdentityRHS = true;
998 for (unsigned i = 0; i != NumElts; ++i) {
999 int M = ShuffleMask[i];
1000 if (M < 0 || !DemandedElts[i])
1001 continue;
1002 AllUndef = false;
1003 IdentityLHS &= (M == (int)i);
1004 IdentityRHS &= ((M - NumElts) == i);
1005 }
1006
1007 if (AllUndef)
1008 return DAG.getUNDEF(Op.getValueType());
1009 if (IdentityLHS)
1010 return Op.getOperand(0);
1011 if (IdentityRHS)
1012 return Op.getOperand(1);
1013 break;
1014 }
1015 default:
1016 // TODO: Probably okay to remove after audit; here to reduce change size
1017 // in initial enablement patch for scalable vectors
1018 if (VT.isScalableVector())
1019 return SDValue();
1020
1021 if (Op.getOpcode() >= ISD::BUILTIN_OP_END)
1023 Op, DemandedBits, DemandedElts, DAG, Depth))
1024 return V;
1025 break;
1026 }
1027 return SDValue();
1028}
1029
1032 unsigned Depth) const {
1033 EVT VT = Op.getValueType();
1034 // Since the number of lanes in a scalable vector is unknown at compile time,
1035 // we track one bit which is implicitly broadcast to all lanes. This means
1036 // that all lanes in a scalable vector are considered demanded.
1037 APInt DemandedElts = VT.isFixedLengthVector()
1039 : APInt(1, 1);
1040 return SimplifyMultipleUseDemandedBits(Op, DemandedBits, DemandedElts, DAG,
1041 Depth);
1042}
1043
1045 SDValue Op, const APInt &DemandedElts, SelectionDAG &DAG,
1046 unsigned Depth) const {
1047 APInt DemandedBits = APInt::getAllOnes(Op.getScalarValueSizeInBits());
1048 return SimplifyMultipleUseDemandedBits(Op, DemandedBits, DemandedElts, DAG,
1049 Depth);
1050}
1051
1052// Attempt to form ext(avgfloor(A, B)) from shr(add(ext(A), ext(B)), 1).
1053// or to form ext(avgceil(A, B)) from shr(add(ext(A), ext(B), 1), 1).
1056 const TargetLowering &TLI,
1057 const APInt &DemandedBits,
1058 const APInt &DemandedElts, unsigned Depth) {
1059 assert((Op.getOpcode() == ISD::SRL || Op.getOpcode() == ISD::SRA) &&
1060 "SRL or SRA node is required here!");
1061 // Is the right shift using an immediate value of 1?
1062 ConstantSDNode *N1C = isConstOrConstSplat(Op.getOperand(1), DemandedElts);
1063 if (!N1C || !N1C->isOne())
1064 return SDValue();
1065
1066 // We are looking for an avgfloor
1067 // add(ext, ext)
1068 // or one of these as a avgceil
1069 // add(add(ext, ext), 1)
1070 // add(add(ext, 1), ext)
1071 // add(ext, add(ext, 1))
1072 SDValue Add = Op.getOperand(0);
1073 if (Add.getOpcode() != ISD::ADD)
1074 return SDValue();
1075
1076 SDValue ExtOpA = Add.getOperand(0);
1077 SDValue ExtOpB = Add.getOperand(1);
1078 SDValue Add2;
1079 auto MatchOperands = [&](SDValue Op1, SDValue Op2, SDValue Op3, SDValue A) {
1080 ConstantSDNode *ConstOp;
1081 if ((ConstOp = isConstOrConstSplat(Op2, DemandedElts)) &&
1082 ConstOp->isOne()) {
1083 ExtOpA = Op1;
1084 ExtOpB = Op3;
1085 Add2 = A;
1086 return true;
1087 }
1088 if ((ConstOp = isConstOrConstSplat(Op3, DemandedElts)) &&
1089 ConstOp->isOne()) {
1090 ExtOpA = Op1;
1091 ExtOpB = Op2;
1092 Add2 = A;
1093 return true;
1094 }
1095 return false;
1096 };
1097 bool IsCeil =
1098 (ExtOpA.getOpcode() == ISD::ADD &&
1099 MatchOperands(ExtOpA.getOperand(0), ExtOpA.getOperand(1), ExtOpB, ExtOpA)) ||
1100 (ExtOpB.getOpcode() == ISD::ADD &&
1101 MatchOperands(ExtOpB.getOperand(0), ExtOpB.getOperand(1), ExtOpA, ExtOpB));
1102
1103 // If the shift is signed (sra):
1104 // - Needs >= 2 sign bit for both operands.
1105 // - Needs >= 2 zero bits.
1106 // If the shift is unsigned (srl):
1107 // - Needs >= 1 zero bit for both operands.
1108 // - Needs 1 demanded bit zero and >= 2 sign bits.
1109 SelectionDAG &DAG = TLO.DAG;
1110 unsigned ShiftOpc = Op.getOpcode();
1111 bool IsSigned = false;
1112 unsigned KnownBits;
1113 unsigned NumSignedA = DAG.ComputeNumSignBits(ExtOpA, DemandedElts, Depth);
1114 unsigned NumSignedB = DAG.ComputeNumSignBits(ExtOpB, DemandedElts, Depth);
1115 unsigned NumSigned = std::min(NumSignedA, NumSignedB) - 1;
1116 unsigned NumZeroA =
1117 DAG.computeKnownBits(ExtOpA, DemandedElts, Depth).countMinLeadingZeros();
1118 unsigned NumZeroB =
1119 DAG.computeKnownBits(ExtOpB, DemandedElts, Depth).countMinLeadingZeros();
1120 unsigned NumZero = std::min(NumZeroA, NumZeroB);
1121
1122 switch (ShiftOpc) {
1123 default:
1124 llvm_unreachable("Unexpected ShiftOpc in combineShiftToAVG");
1125 case ISD::SRA: {
1126 if (NumZero >= 2 && NumSigned < NumZero) {
1127 IsSigned = false;
1128 KnownBits = NumZero;
1129 break;
1130 }
1131 if (NumSigned >= 1) {
1132 IsSigned = true;
1133 KnownBits = NumSigned;
1134 break;
1135 }
1136 return SDValue();
1137 }
1138 case ISD::SRL: {
1139 if (NumZero >= 1 && NumSigned < NumZero) {
1140 IsSigned = false;
1141 KnownBits = NumZero;
1142 break;
1143 }
1144 if (NumSigned >= 1 && DemandedBits.isSignBitClear()) {
1145 IsSigned = true;
1146 KnownBits = NumSigned;
1147 break;
1148 }
1149 return SDValue();
1150 }
1151 }
1152
1153 unsigned AVGOpc = IsCeil ? (IsSigned ? ISD::AVGCEILS : ISD::AVGCEILU)
1154 : (IsSigned ? ISD::AVGFLOORS : ISD::AVGFLOORU);
1155
1156 // Find the smallest power-2 type that is legal for this vector size and
1157 // operation, given the original type size and the number of known sign/zero
1158 // bits.
1159 EVT VT = Op.getValueType();
1160 unsigned MinWidth =
1161 std::max<unsigned>(VT.getScalarSizeInBits() - KnownBits, 8);
1162 EVT NVT = EVT::getIntegerVT(*DAG.getContext(), llvm::bit_ceil(MinWidth));
1164 return SDValue();
1165 if (VT.isVector())
1166 NVT = EVT::getVectorVT(*DAG.getContext(), NVT, VT.getVectorElementCount());
1167 if (TLO.LegalTypes() && !TLI.isOperationLegal(AVGOpc, NVT)) {
1168 // If we could not transform, and (both) adds are nuw/nsw, we can use the
1169 // larger type size to do the transform.
1170 if (TLO.LegalOperations() && !TLI.isOperationLegal(AVGOpc, VT))
1171 return SDValue();
1172 if (DAG.willNotOverflowAdd(IsSigned, Add.getOperand(0),
1173 Add.getOperand(1)) &&
1174 (!Add2 || DAG.willNotOverflowAdd(IsSigned, Add2.getOperand(0),
1175 Add2.getOperand(1))))
1176 NVT = VT;
1177 else
1178 return SDValue();
1179 }
1180
1181 // Don't create a AVGFLOOR node with a scalar constant unless its legal as
1182 // this is likely to stop other folds (reassociation, value tracking etc.)
1183 if (!IsCeil && !TLI.isOperationLegal(AVGOpc, NVT) &&
1184 (isa<ConstantSDNode>(ExtOpA) || isa<ConstantSDNode>(ExtOpB)))
1185 return SDValue();
1186
1187 SDLoc DL(Op);
1188 SDValue ResultAVG =
1189 DAG.getNode(AVGOpc, DL, NVT, DAG.getExtOrTrunc(IsSigned, ExtOpA, DL, NVT),
1190 DAG.getExtOrTrunc(IsSigned, ExtOpB, DL, NVT));
1191 return DAG.getExtOrTrunc(IsSigned, ResultAVG, DL, VT);
1192}
1193
1194/// Look at Op. At this point, we know that only the OriginalDemandedBits of the
1195/// result of Op are ever used downstream. If we can use this information to
1196/// simplify Op, create a new simplified DAG node and return true, returning the
1197/// original and new nodes in Old and New. Otherwise, analyze the expression and
1198/// return a mask of Known bits for the expression (used to simplify the
1199/// caller). The Known bits may only be accurate for those bits in the
1200/// OriginalDemandedBits and OriginalDemandedElts.
1202 SDValue Op, const APInt &OriginalDemandedBits,
1203 const APInt &OriginalDemandedElts, KnownBits &Known, TargetLoweringOpt &TLO,
1204 unsigned Depth, bool AssumeSingleUse) const {
1205 unsigned BitWidth = OriginalDemandedBits.getBitWidth();
1206 assert(Op.getScalarValueSizeInBits() == BitWidth &&
1207 "Mask size mismatches value type size!");
1208
1209 // Don't know anything.
1211
1212 EVT VT = Op.getValueType();
1213 bool IsLE = TLO.DAG.getDataLayout().isLittleEndian();
1214 unsigned NumElts = OriginalDemandedElts.getBitWidth();
1215 assert((!VT.isFixedLengthVector() || NumElts == VT.getVectorNumElements()) &&
1216 "Unexpected vector size");
1217
1218 APInt DemandedBits = OriginalDemandedBits;
1219 APInt DemandedElts = OriginalDemandedElts;
1220 SDLoc dl(Op);
1221
1222 // Undef operand.
1223 if (Op.isUndef())
1224 return false;
1225
1226 // We can't simplify target constants.
1227 if (Op.getOpcode() == ISD::TargetConstant)
1228 return false;
1229
1230 if (Op.getOpcode() == ISD::Constant) {
1231 // We know all of the bits for a constant!
1232 Known = KnownBits::makeConstant(Op->getAsAPIntVal());
1233 return false;
1234 }
1235
1236 if (Op.getOpcode() == ISD::ConstantFP) {
1237 // We know all of the bits for a floating point constant!
1239 cast<ConstantFPSDNode>(Op)->getValueAPF().bitcastToAPInt());
1240 return false;
1241 }
1242
1243 // Other users may use these bits.
1244 bool HasMultiUse = false;
1245 if (!AssumeSingleUse && !Op.getNode()->hasOneUse()) {
1247 // Limit search depth.
1248 return false;
1249 }
1250 // Allow multiple uses, just set the DemandedBits/Elts to all bits.
1252 DemandedElts = APInt::getAllOnes(NumElts);
1253 HasMultiUse = true;
1254 } else if (OriginalDemandedBits == 0 || OriginalDemandedElts == 0) {
1255 // Not demanding any bits/elts from Op.
1256 return TLO.CombineTo(Op, TLO.DAG.getUNDEF(VT));
1257 } else if (Depth >= SelectionDAG::MaxRecursionDepth) {
1258 // Limit search depth.
1259 return false;
1260 }
1261
1262 KnownBits Known2;
1263 switch (Op.getOpcode()) {
1264 case ISD::SCALAR_TO_VECTOR: {
1265 if (VT.isScalableVector())
1266 return false;
1267 if (!DemandedElts[0])
1268 return TLO.CombineTo(Op, TLO.DAG.getUNDEF(VT));
1269
1270 KnownBits SrcKnown;
1271 SDValue Src = Op.getOperand(0);
1272 unsigned SrcBitWidth = Src.getScalarValueSizeInBits();
1273 APInt SrcDemandedBits = DemandedBits.zext(SrcBitWidth);
1274 if (SimplifyDemandedBits(Src, SrcDemandedBits, SrcKnown, TLO, Depth + 1))
1275 return true;
1276
1277 // Upper elements are undef, so only get the knownbits if we just demand
1278 // the bottom element.
1279 if (DemandedElts == 1)
1280 Known = SrcKnown.anyextOrTrunc(BitWidth);
1281 break;
1282 }
1283 case ISD::BUILD_VECTOR:
1284 // Collect the known bits that are shared by every demanded element.
1285 // TODO: Call SimplifyDemandedBits for non-constant demanded elements.
1286 Known = TLO.DAG.computeKnownBits(Op, DemandedElts, Depth);
1287 return false; // Don't fall through, will infinitely loop.
1288 case ISD::SPLAT_VECTOR: {
1289 SDValue Scl = Op.getOperand(0);
1290 APInt DemandedSclBits = DemandedBits.zextOrTrunc(Scl.getValueSizeInBits());
1291 KnownBits KnownScl;
1292 if (SimplifyDemandedBits(Scl, DemandedSclBits, KnownScl, TLO, Depth + 1))
1293 return true;
1294
1295 // Implicitly truncate the bits to match the official semantics of
1296 // SPLAT_VECTOR.
1297 Known = KnownScl.trunc(BitWidth);
1298 break;
1299 }
1300 case ISD::FREEZE: {
1301 SDValue N0 = Op.getOperand(0);
1303 N0, DemandedElts, UndefPoisonKind::UndefOrPoison, Depth + 1))
1304 return TLO.CombineTo(Op, N0);
1305 break;
1306 }
1307 case ISD::LOAD: {
1308 auto *LD = cast<LoadSDNode>(Op);
1309 if (getTargetConstantFromLoad(LD)) {
1310 Known = TLO.DAG.computeKnownBits(Op, DemandedElts, Depth);
1311 return false; // Don't fall through, will infinitely loop.
1312 }
1313 if (ISD::isZEXTLoad(Op.getNode()) && Op.getResNo() == 0) {
1314 // If this is a ZEXTLoad and we are looking at the loaded value.
1315 EVT MemVT = LD->getMemoryVT();
1316 unsigned MemBits = MemVT.getScalarSizeInBits();
1317 Known.Zero.setBitsFrom(MemBits);
1318 return false; // Don't fall through, will infinitely loop.
1319 }
1320 break;
1321 }
1323 if (VT.isScalableVector())
1324 return false;
1325 SDValue Vec = Op.getOperand(0);
1326 SDValue Scl = Op.getOperand(1);
1327 auto *CIdx = dyn_cast<ConstantSDNode>(Op.getOperand(2));
1328 EVT VecVT = Vec.getValueType();
1329
1330 // If index isn't constant, assume we need all vector elements AND the
1331 // inserted element.
1332 APInt DemandedVecElts(DemandedElts);
1333 if (CIdx && CIdx->getAPIntValue().ult(VecVT.getVectorNumElements())) {
1334 unsigned Idx = CIdx->getZExtValue();
1335 DemandedVecElts.clearBit(Idx);
1336
1337 // Inserted element is not required.
1338 if (!DemandedElts[Idx])
1339 return TLO.CombineTo(Op, Vec);
1340 }
1341
1342 KnownBits KnownScl;
1343 unsigned NumSclBits = Scl.getScalarValueSizeInBits();
1344 APInt DemandedSclBits = DemandedBits.zextOrTrunc(NumSclBits);
1345 if (SimplifyDemandedBits(Scl, DemandedSclBits, KnownScl, TLO, Depth + 1))
1346 return true;
1347
1348 Known = KnownScl.anyextOrTrunc(BitWidth);
1349
1350 KnownBits KnownVec;
1351 if (SimplifyDemandedBits(Vec, DemandedBits, DemandedVecElts, KnownVec, TLO,
1352 Depth + 1))
1353 return true;
1354
1355 if (!!DemandedVecElts)
1356 Known = Known.intersectWith(KnownVec);
1357
1358 return false;
1359 }
1360 case ISD::INSERT_SUBVECTOR: {
1361 if (VT.isScalableVector())
1362 return false;
1363 // Demand any elements from the subvector and the remainder from the src its
1364 // inserted into.
1365 SDValue Src = Op.getOperand(0);
1366 SDValue Sub = Op.getOperand(1);
1367 uint64_t Idx = Op.getConstantOperandVal(2);
1368 unsigned NumSubElts = Sub.getValueType().getVectorNumElements();
1369 APInt DemandedSubElts = DemandedElts.extractBits(NumSubElts, Idx);
1370 APInt DemandedSrcElts = DemandedElts;
1371 DemandedSrcElts.clearBits(Idx, Idx + NumSubElts);
1372
1373 KnownBits KnownSub, KnownSrc;
1374 if (SimplifyDemandedBits(Sub, DemandedBits, DemandedSubElts, KnownSub, TLO,
1375 Depth + 1))
1376 return true;
1377 if (SimplifyDemandedBits(Src, DemandedBits, DemandedSrcElts, KnownSrc, TLO,
1378 Depth + 1))
1379 return true;
1380
1381 Known.setAllConflict();
1382 if (!!DemandedSubElts)
1383 Known = Known.intersectWith(KnownSub);
1384 if (!!DemandedSrcElts)
1385 Known = Known.intersectWith(KnownSrc);
1386
1387 // Attempt to avoid multi-use src if we don't need anything from it.
1388 if (!DemandedBits.isAllOnes() || !DemandedSubElts.isAllOnes() ||
1389 !DemandedSrcElts.isAllOnes()) {
1391 Sub, DemandedBits, DemandedSubElts, TLO.DAG, Depth + 1);
1393 Src, DemandedBits, DemandedSrcElts, TLO.DAG, Depth + 1);
1394 if (NewSub || NewSrc) {
1395 NewSub = NewSub ? NewSub : Sub;
1396 NewSrc = NewSrc ? NewSrc : Src;
1397 SDValue NewOp = TLO.DAG.getNode(Op.getOpcode(), dl, VT, NewSrc, NewSub,
1398 Op.getOperand(2));
1399 return TLO.CombineTo(Op, NewOp);
1400 }
1401 }
1402 break;
1403 }
1405 if (VT.isScalableVector())
1406 return false;
1407 // Offset the demanded elts by the subvector index.
1408 SDValue Src = Op.getOperand(0);
1409 if (Src.getValueType().isScalableVector())
1410 break;
1411 uint64_t Idx = Op.getConstantOperandVal(1);
1412 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
1413 APInt DemandedSrcElts = DemandedElts.zext(NumSrcElts).shl(Idx);
1414
1415 if (SimplifyDemandedBits(Src, DemandedBits, DemandedSrcElts, Known, TLO,
1416 Depth + 1))
1417 return true;
1418
1419 // Attempt to avoid multi-use src if we don't need anything from it.
1420 if (!DemandedBits.isAllOnes() || !DemandedSrcElts.isAllOnes()) {
1422 Src, DemandedBits, DemandedSrcElts, TLO.DAG, Depth + 1);
1423 if (DemandedSrc) {
1424 SDValue NewOp = TLO.DAG.getNode(Op.getOpcode(), dl, VT, DemandedSrc,
1425 Op.getOperand(1));
1426 return TLO.CombineTo(Op, NewOp);
1427 }
1428 }
1429 break;
1430 }
1431 case ISD::CONCAT_VECTORS: {
1432 if (VT.isScalableVector())
1433 return false;
1434 Known.setAllConflict();
1435 EVT SubVT = Op.getOperand(0).getValueType();
1436 unsigned NumSubVecs = Op.getNumOperands();
1437 unsigned NumSubElts = SubVT.getVectorNumElements();
1438 for (unsigned i = 0; i != NumSubVecs; ++i) {
1439 APInt DemandedSubElts =
1440 DemandedElts.extractBits(NumSubElts, i * NumSubElts);
1441 if (SimplifyDemandedBits(Op.getOperand(i), DemandedBits, DemandedSubElts,
1442 Known2, TLO, Depth + 1))
1443 return true;
1444 // Known bits are shared by every demanded subvector element.
1445 if (!!DemandedSubElts)
1446 Known = Known.intersectWith(Known2);
1447 }
1448 break;
1449 }
1450 case ISD::VECTOR_SHUFFLE: {
1451 assert(!VT.isScalableVector());
1452 ArrayRef<int> ShuffleMask = cast<ShuffleVectorSDNode>(Op)->getMask();
1453
1454 // Collect demanded elements from shuffle operands..
1455 APInt DemandedLHS, DemandedRHS;
1456 if (!getShuffleDemandedElts(NumElts, ShuffleMask, DemandedElts, DemandedLHS,
1457 DemandedRHS))
1458 break;
1459
1460 if (!!DemandedLHS || !!DemandedRHS) {
1461 SDValue Op0 = Op.getOperand(0);
1462 SDValue Op1 = Op.getOperand(1);
1463
1464 Known.setAllConflict();
1465 if (!!DemandedLHS) {
1466 if (SimplifyDemandedBits(Op0, DemandedBits, DemandedLHS, Known2, TLO,
1467 Depth + 1))
1468 return true;
1469 Known = Known.intersectWith(Known2);
1470 }
1471 if (!!DemandedRHS) {
1472 if (SimplifyDemandedBits(Op1, DemandedBits, DemandedRHS, Known2, TLO,
1473 Depth + 1))
1474 return true;
1475 Known = Known.intersectWith(Known2);
1476 }
1477
1478 // Attempt to avoid multi-use ops if we don't need anything from them.
1480 Op0, DemandedBits, DemandedLHS, TLO.DAG, Depth + 1);
1482 Op1, DemandedBits, DemandedRHS, TLO.DAG, Depth + 1);
1483 if (DemandedOp0 || DemandedOp1) {
1484 Op0 = DemandedOp0 ? DemandedOp0 : Op0;
1485 Op1 = DemandedOp1 ? DemandedOp1 : Op1;
1486 SDValue NewOp = TLO.DAG.getVectorShuffle(VT, dl, Op0, Op1, ShuffleMask);
1487 return TLO.CombineTo(Op, NewOp);
1488 }
1489 }
1490 break;
1491 }
1492 case ISD::AND: {
1493 SDValue Op0 = Op.getOperand(0);
1494 SDValue Op1 = Op.getOperand(1);
1495
1496 // If the RHS is a constant, check to see if the LHS would be zero without
1497 // using the bits from the RHS. Below, we use knowledge about the RHS to
1498 // simplify the LHS, here we're using information from the LHS to simplify
1499 // the RHS.
1500 if (ConstantSDNode *RHSC = isConstOrConstSplat(Op1, DemandedElts)) {
1501 // Do not increment Depth here; that can cause an infinite loop.
1502 KnownBits LHSKnown = TLO.DAG.computeKnownBits(Op0, DemandedElts, Depth);
1503 // If the LHS already has zeros where RHSC does, this 'and' is dead.
1504 if ((LHSKnown.Zero & DemandedBits) ==
1505 (~RHSC->getAPIntValue() & DemandedBits))
1506 return TLO.CombineTo(Op, Op0);
1507
1508 // If any of the set bits in the RHS are known zero on the LHS, shrink
1509 // the constant.
1510 if (ShrinkDemandedConstant(Op, ~LHSKnown.Zero & DemandedBits,
1511 DemandedElts, TLO))
1512 return true;
1513
1514 // Bitwise-not (xor X, -1) is a special case: we don't usually shrink its
1515 // constant, but if this 'and' is only clearing bits that were just set by
1516 // the xor, then this 'and' can be eliminated by shrinking the mask of
1517 // the xor. For example, for a 32-bit X:
1518 // and (xor (srl X, 31), -1), 1 --> xor (srl X, 31), 1
1519 if (isBitwiseNot(Op0) && Op0.hasOneUse() &&
1520 LHSKnown.One == ~RHSC->getAPIntValue()) {
1521 SDValue Xor = TLO.DAG.getNode(ISD::XOR, dl, VT, Op0.getOperand(0), Op1);
1522 return TLO.CombineTo(Op, Xor);
1523 }
1524 }
1525
1526 // (X +/- Y) & Y --> ~X & Y when Y is a power of 2 (or zero).
1527 SDValue X, Y;
1528 if (sd_match(Op,
1529 m_And(m_Value(Y),
1531 m_Sub(m_Value(X), m_Deferred(Y)))))) &&
1532 TLO.DAG.isKnownToBeAPowerOfTwo(Y, DemandedElts, /*OrZero=*/true)) {
1533 return TLO.CombineTo(
1534 Op, TLO.DAG.getNode(ISD::AND, dl, VT, TLO.DAG.getNOT(dl, X, VT), Y));
1535 }
1536
1537 // AND(INSERT_SUBVECTOR(C,X,I),M) -> INSERT_SUBVECTOR(AND(C,M),X,I)
1538 // iff 'C' is Undef/Constant and AND(X,M) == X (for DemandedBits).
1539 if (Op0.getOpcode() == ISD::INSERT_SUBVECTOR && !VT.isScalableVector() &&
1540 (Op0.getOperand(0).isUndef() ||
1542 Op0->hasOneUse()) {
1543 unsigned NumSubElts =
1545 unsigned SubIdx = Op0.getConstantOperandVal(2);
1546 APInt DemandedSub =
1547 APInt::getBitsSet(NumElts, SubIdx, SubIdx + NumSubElts);
1548 KnownBits KnownSubMask =
1549 TLO.DAG.computeKnownBits(Op1, DemandedSub & DemandedElts, Depth + 1);
1550 if (DemandedBits.isSubsetOf(KnownSubMask.One)) {
1551 SDValue NewAnd =
1552 TLO.DAG.getNode(ISD::AND, dl, VT, Op0.getOperand(0), Op1);
1553 SDValue NewInsert =
1554 TLO.DAG.getNode(ISD::INSERT_SUBVECTOR, dl, VT, NewAnd,
1555 Op0.getOperand(1), Op0.getOperand(2));
1556 return TLO.CombineTo(Op, NewInsert);
1557 }
1558 }
1559
1560 if (SimplifyDemandedBits(Op1, DemandedBits, DemandedElts, Known, TLO,
1561 Depth + 1))
1562 return true;
1563 if (SimplifyDemandedBits(Op0, ~Known.Zero & DemandedBits, DemandedElts,
1564 Known2, TLO, Depth + 1))
1565 return true;
1566
1567 // If all of the demanded bits are known one on one side, return the other.
1568 // These bits cannot contribute to the result of the 'and'.
1569 if (DemandedBits.isSubsetOf(Known2.Zero | Known.One))
1570 return TLO.CombineTo(Op, Op0);
1571 if (DemandedBits.isSubsetOf(Known.Zero | Known2.One))
1572 return TLO.CombineTo(Op, Op1);
1573 // If all of the demanded bits in the inputs are known zeros, return zero.
1574 if (DemandedBits.isSubsetOf(Known.Zero | Known2.Zero))
1575 return TLO.CombineTo(Op, TLO.DAG.getConstant(0, dl, VT));
1576 // If the RHS is a constant, see if we can simplify it.
1577 if (ShrinkDemandedConstant(Op, ~Known2.Zero & DemandedBits, DemandedElts,
1578 TLO))
1579 return true;
1580 // If the operation can be done in a smaller type, do so.
1582 return true;
1583
1584 // Attempt to avoid multi-use ops if we don't need anything from them.
1585 if (!DemandedBits.isAllOnes() || !DemandedElts.isAllOnes()) {
1587 Op0, DemandedBits, DemandedElts, TLO.DAG, Depth + 1);
1589 Op1, DemandedBits, DemandedElts, TLO.DAG, Depth + 1);
1590 if (DemandedOp0 || DemandedOp1) {
1591 Op0 = DemandedOp0 ? DemandedOp0 : Op0;
1592 Op1 = DemandedOp1 ? DemandedOp1 : Op1;
1593 SDValue NewOp = TLO.DAG.getNode(Op.getOpcode(), dl, VT, Op0, Op1);
1594 return TLO.CombineTo(Op, NewOp);
1595 }
1596 }
1597
1598 Known &= Known2;
1599 break;
1600 }
1601 case ISD::OR: {
1602 SDValue Op0 = Op.getOperand(0);
1603 SDValue Op1 = Op.getOperand(1);
1604 if (SimplifyDemandedBits(Op1, DemandedBits, DemandedElts, Known, TLO,
1605 Depth + 1)) {
1606 Op->dropFlags(SDNodeFlags::Disjoint);
1607 return true;
1608 }
1609
1610 if (SimplifyDemandedBits(Op0, ~Known.One & DemandedBits, DemandedElts,
1611 Known2, TLO, Depth + 1)) {
1612 Op->dropFlags(SDNodeFlags::Disjoint);
1613 return true;
1614 }
1615
1616 // If all of the demanded bits are known zero on one side, return the other.
1617 // These bits cannot contribute to the result of the 'or'.
1618 if (DemandedBits.isSubsetOf(Known2.One | Known.Zero))
1619 return TLO.CombineTo(Op, Op0);
1620 if (DemandedBits.isSubsetOf(Known.One | Known2.Zero))
1621 return TLO.CombineTo(Op, Op1);
1622 // If the RHS is a constant, see if we can simplify it.
1623 if (ShrinkDemandedConstant(Op, DemandedBits, DemandedElts, TLO))
1624 return true;
1625 // If the operation can be done in a smaller type, do so.
1627 return true;
1628
1629 // Attempt to avoid multi-use ops if we don't need anything from them.
1630 if (!DemandedBits.isAllOnes() || !DemandedElts.isAllOnes()) {
1632 Op0, DemandedBits, DemandedElts, TLO.DAG, Depth + 1);
1634 Op1, DemandedBits, DemandedElts, TLO.DAG, Depth + 1);
1635 if (DemandedOp0 || DemandedOp1) {
1636 Op0 = DemandedOp0 ? DemandedOp0 : Op0;
1637 Op1 = DemandedOp1 ? DemandedOp1 : Op1;
1638 SDValue NewOp = TLO.DAG.getNode(Op.getOpcode(), dl, VT, Op0, Op1);
1639 return TLO.CombineTo(Op, NewOp);
1640 }
1641 }
1642
1643 // (or (and X, C1), (and (or X, Y), C2)) -> (or (and X, C1|C2), (and Y, C2))
1644 // TODO: Use SimplifyMultipleUseDemandedBits to peek through masks.
1645 SDValue X, Y, C1, C2;
1648 m_Value(C2)))))) {
1649 if (SDValue C12 =
1650 TLO.DAG.FoldConstantArithmetic(ISD::OR, dl, VT, {C1, C2})) {
1651 SDValue MaskX = TLO.DAG.getNode(ISD::AND, dl, VT, X, C12);
1652 SDValue MaskY = TLO.DAG.getNode(ISD::AND, dl, VT, Y, C2);
1653 return TLO.CombineTo(Op,
1654 TLO.DAG.getNode(ISD::OR, dl, VT, MaskX, MaskY));
1655 }
1656 }
1657
1658 Known |= Known2;
1659 break;
1660 }
1661 case ISD::XOR: {
1662 SDValue Op0 = Op.getOperand(0);
1663 SDValue Op1 = Op.getOperand(1);
1664
1665 if (SimplifyDemandedBits(Op1, DemandedBits, DemandedElts, Known, TLO,
1666 Depth + 1))
1667 return true;
1668 if (SimplifyDemandedBits(Op0, DemandedBits, DemandedElts, Known2, TLO,
1669 Depth + 1))
1670 return true;
1671
1672 // If all of the demanded bits are known zero on one side, return the other.
1673 // These bits cannot contribute to the result of the 'xor'.
1674 if (DemandedBits.isSubsetOf(Known.Zero))
1675 return TLO.CombineTo(Op, Op0);
1676 if (DemandedBits.isSubsetOf(Known2.Zero))
1677 return TLO.CombineTo(Op, Op1);
1678 // If the operation can be done in a smaller type, do so.
1680 return true;
1681
1682 // If all of the unknown bits are known to be zero on one side or the other
1683 // turn this into an *inclusive* or.
1684 // e.g. (A & C1)^(B & C2) -> (A & C1)|(B & C2) iff C1&C2 == 0
1685 if (DemandedBits.isSubsetOf(Known.Zero | Known2.Zero))
1686 return TLO.CombineTo(Op, TLO.DAG.getNode(ISD::OR, dl, VT, Op0, Op1));
1687
1688 ConstantSDNode *C = isConstOrConstSplat(Op1, DemandedElts);
1689 if (C) {
1690 // If one side is a constant, and all of the set bits in the constant are
1691 // also known set on the other side, turn this into an AND, as we know
1692 // the bits will be cleared.
1693 // e.g. (X | C1) ^ C2 --> (X | C1) & ~C2 iff (C1&C2) == C2
1694 // NB: it is okay if more bits are known than are requested
1695 if (C->getAPIntValue() == Known2.One) {
1696 SDValue ANDC =
1697 TLO.DAG.getConstant(~C->getAPIntValue() & DemandedBits, dl, VT);
1698 return TLO.CombineTo(Op, TLO.DAG.getNode(ISD::AND, dl, VT, Op0, ANDC));
1699 }
1700
1701 // If the RHS is a constant, see if we can change it. Don't alter a -1
1702 // constant because that's a 'not' op, and that is better for combining
1703 // and codegen.
1704 if (!C->isAllOnes() && DemandedBits.isSubsetOf(C->getAPIntValue())) {
1705 // We're flipping all demanded bits. Flip the undemanded bits too.
1706 SDValue New = TLO.DAG.getNOT(dl, Op0, VT);
1707 return TLO.CombineTo(Op, New);
1708 }
1709
1710 unsigned Op0Opcode = Op0.getOpcode();
1711 if ((Op0Opcode == ISD::SRL || Op0Opcode == ISD::SHL) && Op0.hasOneUse()) {
1712 if (ConstantSDNode *ShiftC =
1713 isConstOrConstSplat(Op0.getOperand(1), DemandedElts)) {
1714 // Don't crash on an oversized shift. We can not guarantee that a
1715 // bogus shift has been simplified to undef.
1716 if (ShiftC->getAPIntValue().ult(BitWidth)) {
1717 uint64_t ShiftAmt = ShiftC->getZExtValue();
1719 Ones = Op0Opcode == ISD::SHL ? Ones.shl(ShiftAmt)
1720 : Ones.lshr(ShiftAmt);
1721 if ((DemandedBits & C->getAPIntValue()) == (DemandedBits & Ones) &&
1723 // If the xor constant is a demanded mask, do a 'not' before the
1724 // shift:
1725 // xor (X << ShiftC), XorC --> (not X) << ShiftC
1726 // xor (X >> ShiftC), XorC --> (not X) >> ShiftC
1727 SDValue Not = TLO.DAG.getNOT(dl, Op0.getOperand(0), VT);
1728 return TLO.CombineTo(Op, TLO.DAG.getNode(Op0Opcode, dl, VT, Not,
1729 Op0.getOperand(1)));
1730 }
1731 }
1732 }
1733 }
1734 }
1735
1736 // If we can't turn this into a 'not', try to shrink the constant.
1737 if (!C || !C->isAllOnes())
1738 if (ShrinkDemandedConstant(Op, DemandedBits, DemandedElts, TLO))
1739 return true;
1740
1741 // Attempt to avoid multi-use ops if we don't need anything from them.
1742 if (!DemandedBits.isAllOnes() || !DemandedElts.isAllOnes()) {
1744 Op0, DemandedBits, DemandedElts, TLO.DAG, Depth + 1);
1746 Op1, DemandedBits, DemandedElts, TLO.DAG, Depth + 1);
1747 if (DemandedOp0 || DemandedOp1) {
1748 Op0 = DemandedOp0 ? DemandedOp0 : Op0;
1749 Op1 = DemandedOp1 ? DemandedOp1 : Op1;
1750 SDValue NewOp = TLO.DAG.getNode(Op.getOpcode(), dl, VT, Op0, Op1);
1751 return TLO.CombineTo(Op, NewOp);
1752 }
1753 }
1754
1755 Known ^= Known2;
1756 break;
1757 }
1758 case ISD::SELECT:
1759 if (SimplifyDemandedBits(Op.getOperand(2), DemandedBits, DemandedElts,
1760 Known, TLO, Depth + 1))
1761 return true;
1762 if (SimplifyDemandedBits(Op.getOperand(1), DemandedBits, DemandedElts,
1763 Known2, TLO, Depth + 1))
1764 return true;
1765
1766 // If the operands are constants, see if we can simplify them.
1767 if (ShrinkDemandedConstant(Op, DemandedBits, DemandedElts, TLO))
1768 return true;
1769
1770 // Only known if known in both the LHS and RHS.
1771 Known = Known.intersectWith(Known2);
1772 break;
1773 case ISD::VSELECT:
1774 if (SimplifyDemandedBits(Op.getOperand(2), DemandedBits, DemandedElts,
1775 Known, TLO, Depth + 1))
1776 return true;
1777 if (SimplifyDemandedBits(Op.getOperand(1), DemandedBits, DemandedElts,
1778 Known2, TLO, Depth + 1))
1779 return true;
1780
1781 // Only known if known in both the LHS and RHS.
1782 Known = Known.intersectWith(Known2);
1783 break;
1784 case ISD::SELECT_CC:
1785 if (SimplifyDemandedBits(Op.getOperand(3), DemandedBits, DemandedElts,
1786 Known, TLO, Depth + 1))
1787 return true;
1788 if (SimplifyDemandedBits(Op.getOperand(2), DemandedBits, DemandedElts,
1789 Known2, TLO, Depth + 1))
1790 return true;
1791
1792 // If the operands are constants, see if we can simplify them.
1793 if (ShrinkDemandedConstant(Op, DemandedBits, DemandedElts, TLO))
1794 return true;
1795
1796 // Only known if known in both the LHS and RHS.
1797 Known = Known.intersectWith(Known2);
1798 break;
1799 case ISD::SETCC: {
1800 SDValue Op0 = Op.getOperand(0);
1801 SDValue Op1 = Op.getOperand(1);
1802 ISD::CondCode CC = cast<CondCodeSDNode>(Op.getOperand(2))->get();
1803 // If we're testing X < 0, X >= 0, X <= -1 or X > -1
1804 // (X is of integer type) then we only need the sign mask of the previous
1805 // result
1806 if (Op1.getValueType().isInteger() &&
1807 (((CC == ISD::SETLT || CC == ISD::SETGE) && isNullOrNullSplat(Op1)) ||
1808 ((CC == ISD::SETLE || CC == ISD::SETGT) &&
1809 isAllOnesOrAllOnesSplat(Op1)))) {
1810 KnownBits KnownOp0;
1813 DemandedElts, KnownOp0, TLO, Depth + 1))
1814 return true;
1815 // If (1) we only need the sign-bit, (2) the setcc operands are the same
1816 // width as the setcc result, and (3) the result of a setcc conforms to 0
1817 // or -1, we may be able to bypass the setcc.
1818 if (DemandedBits.isSignMask() &&
1822 // If we remove a >= 0 or > -1 (for integers), we need to introduce a
1823 // NOT Operation
1824 if (CC == ISD::SETGE || CC == ISD::SETGT) {
1825 SDLoc DL(Op);
1826 EVT VT = Op0.getValueType();
1827 SDValue NotOp0 = TLO.DAG.getNOT(DL, Op0, VT);
1828 return TLO.CombineTo(Op, NotOp0);
1829 }
1830 return TLO.CombineTo(Op, Op0);
1831 }
1832 }
1833 if (getBooleanContents(Op0.getValueType()) ==
1835 BitWidth > 1)
1836 Known.Zero.setBitsFrom(1);
1837 break;
1838 }
1839 case ISD::SHL: {
1840 SDValue Op0 = Op.getOperand(0);
1841 SDValue Op1 = Op.getOperand(1);
1842 EVT ShiftVT = Op1.getValueType();
1843
1844 if (std::optional<unsigned> KnownSA =
1845 TLO.DAG.getValidShiftAmount(Op, DemandedElts, Depth + 1)) {
1846 unsigned ShAmt = *KnownSA;
1847 if (ShAmt == 0)
1848 return TLO.CombineTo(Op, Op0);
1849
1850 // If this is ((X >>u C1) << ShAmt), see if we can simplify this into a
1851 // single shift. We can do this if the bottom bits (which are shifted
1852 // out) are never demanded.
1853 // TODO - support non-uniform vector amounts.
1854 if (Op0.getOpcode() == ISD::SRL) {
1855 if (!DemandedBits.intersects(APInt::getLowBitsSet(BitWidth, ShAmt))) {
1856 if (std::optional<unsigned> InnerSA =
1857 TLO.DAG.getValidShiftAmount(Op0, DemandedElts, Depth + 2)) {
1858 unsigned C1 = *InnerSA;
1859 unsigned Opc = ISD::SHL;
1860 int Diff = ShAmt - C1;
1861 if (Diff < 0) {
1862 Diff = -Diff;
1863 Opc = ISD::SRL;
1864 }
1865 SDValue NewSA = TLO.DAG.getConstant(Diff, dl, ShiftVT);
1866 return TLO.CombineTo(
1867 Op, TLO.DAG.getNode(Opc, dl, VT, Op0.getOperand(0), NewSA));
1868 }
1869 }
1870 }
1871
1872 // Convert (shl (anyext x, c)) to (anyext (shl x, c)) if the high bits
1873 // are not demanded. This will likely allow the anyext to be folded away.
1874 // TODO - support non-uniform vector amounts.
1875 if (Op0.getOpcode() == ISD::ANY_EXTEND) {
1876 SDValue InnerOp = Op0.getOperand(0);
1877 EVT InnerVT = InnerOp.getValueType();
1878 unsigned InnerBits = InnerVT.getScalarSizeInBits();
1879 if (ShAmt < InnerBits && DemandedBits.getActiveBits() <= InnerBits &&
1880 isTypeDesirableForOp(ISD::SHL, InnerVT)) {
1881 SDValue NarrowShl = TLO.DAG.getNode(
1882 ISD::SHL, dl, InnerVT, InnerOp,
1883 TLO.DAG.getShiftAmountConstant(ShAmt, InnerVT, dl));
1884 return TLO.CombineTo(
1885 Op, TLO.DAG.getNode(ISD::ANY_EXTEND, dl, VT, NarrowShl));
1886 }
1887
1888 // Repeat the SHL optimization above in cases where an extension
1889 // intervenes: (shl (anyext (shr x, c1)), c2) to
1890 // (shl (anyext x), c2-c1). This requires that the bottom c1 bits
1891 // aren't demanded (as above) and that the shifted upper c1 bits of
1892 // x aren't demanded.
1893 // TODO - support non-uniform vector amounts.
1894 if (InnerOp.getOpcode() == ISD::SRL && Op0.hasOneUse() &&
1895 InnerOp.hasOneUse()) {
1896 if (std::optional<unsigned> SA2 = TLO.DAG.getValidShiftAmount(
1897 InnerOp, DemandedElts, Depth + 2)) {
1898 unsigned InnerShAmt = *SA2;
1899 if (InnerShAmt < ShAmt && InnerShAmt < InnerBits &&
1900 DemandedBits.getActiveBits() <=
1901 (InnerBits - InnerShAmt + ShAmt) &&
1902 DemandedBits.countr_zero() >= ShAmt) {
1903 SDValue NewSA =
1904 TLO.DAG.getConstant(ShAmt - InnerShAmt, dl, ShiftVT);
1905 SDValue NewExt = TLO.DAG.getNode(ISD::ANY_EXTEND, dl, VT,
1906 InnerOp.getOperand(0));
1907 return TLO.CombineTo(
1908 Op, TLO.DAG.getNode(ISD::SHL, dl, VT, NewExt, NewSA));
1909 }
1910 }
1911 }
1912 }
1913
1914 APInt InDemandedMask = DemandedBits.lshr(ShAmt);
1915 if (SimplifyDemandedBits(Op0, InDemandedMask, DemandedElts, Known, TLO,
1916 Depth + 1)) {
1917 // Disable the nsw and nuw flags. We can no longer guarantee that we
1918 // won't wrap after simplification.
1919 Op->dropFlags(SDNodeFlags::NoWrap);
1920 return true;
1921 }
1922 Known <<= ShAmt;
1923 // low bits known zero.
1924 Known.Zero.setLowBits(ShAmt);
1925
1926 // Attempt to avoid multi-use ops if we don't need anything from them.
1927 if (!InDemandedMask.isAllOnes() || !DemandedElts.isAllOnes()) {
1929 Op0, InDemandedMask, DemandedElts, TLO.DAG, Depth + 1);
1930 if (DemandedOp0) {
1931 SDValue NewOp = TLO.DAG.getNode(ISD::SHL, dl, VT, DemandedOp0, Op1);
1932 return TLO.CombineTo(Op, NewOp);
1933 }
1934 }
1935
1936 // TODO: Can we merge this fold with the one below?
1937 // Try shrinking the operation as long as the shift amount will still be
1938 // in range.
1939 if (ShAmt < DemandedBits.getActiveBits() && !VT.isVector() &&
1940 Op.getNode()->hasOneUse()) {
1941 // Search for the smallest integer type with free casts to and from
1942 // Op's type. For expedience, just check power-of-2 integer types.
1943 unsigned DemandedSize = DemandedBits.getActiveBits();
1944 for (unsigned SmallVTBits = llvm::bit_ceil(DemandedSize);
1945 SmallVTBits < BitWidth; SmallVTBits = NextPowerOf2(SmallVTBits)) {
1946 EVT SmallVT = EVT::getIntegerVT(*TLO.DAG.getContext(), SmallVTBits);
1947 if (isNarrowingProfitable(Op.getNode(), VT, SmallVT) &&
1948 isTypeDesirableForOp(ISD::SHL, SmallVT) &&
1949 isTruncateFree(VT, SmallVT) && isZExtFree(SmallVT, VT) &&
1950 (!TLO.LegalOperations() || isOperationLegal(ISD::SHL, SmallVT))) {
1951 assert(DemandedSize <= SmallVTBits &&
1952 "Narrowed below demanded bits?");
1953 // We found a type with free casts.
1954 SDValue NarrowShl = TLO.DAG.getNode(
1955 ISD::SHL, dl, SmallVT,
1956 TLO.DAG.getNode(ISD::TRUNCATE, dl, SmallVT, Op.getOperand(0)),
1957 TLO.DAG.getShiftAmountConstant(ShAmt, SmallVT, dl));
1958 return TLO.CombineTo(
1959 Op, TLO.DAG.getNode(ISD::ANY_EXTEND, dl, VT, NarrowShl));
1960 }
1961 }
1962 }
1963
1964 // Narrow shift to lower half - similar to ShrinkDemandedOp.
1965 // (shl i64:x, K) -> (i64 zero_extend (shl (i32 (trunc i64:x)), K))
1966 // Only do this if we demand the upper half so the knownbits are correct.
1967 unsigned HalfWidth = BitWidth / 2;
1968 if ((BitWidth % 2) == 0 && !VT.isVector() && ShAmt < HalfWidth &&
1969 DemandedBits.countLeadingOnes() >= HalfWidth) {
1970 EVT HalfVT = EVT::getIntegerVT(*TLO.DAG.getContext(), HalfWidth);
1971 if (isNarrowingProfitable(Op.getNode(), VT, HalfVT) &&
1972 isTypeDesirableForOp(ISD::SHL, HalfVT) &&
1973 isTruncateFree(VT, HalfVT) && isZExtFree(HalfVT, VT) &&
1974 (!TLO.LegalOperations() || isOperationLegal(ISD::SHL, HalfVT))) {
1975 // If we're demanding the upper bits at all, we must ensure
1976 // that the upper bits of the shift result are known to be zero,
1977 // which is equivalent to the narrow shift being NUW.
1978 if (bool IsNUW = (Known.countMinLeadingZeros() >= HalfWidth)) {
1979 bool IsNSW = Known.countMinSignBits() > HalfWidth;
1980 SDNodeFlags Flags;
1981 Flags.setNoSignedWrap(IsNSW);
1982 Flags.setNoUnsignedWrap(IsNUW);
1983 SDValue NewOp = TLO.DAG.getNode(ISD::TRUNCATE, dl, HalfVT, Op0);
1984 SDValue NewShiftAmt =
1985 TLO.DAG.getShiftAmountConstant(ShAmt, HalfVT, dl);
1986 SDValue NewShift = TLO.DAG.getNode(ISD::SHL, dl, HalfVT, NewOp,
1987 NewShiftAmt, Flags);
1988 SDValue NewExt =
1989 TLO.DAG.getNode(ISD::ZERO_EXTEND, dl, VT, NewShift);
1990 return TLO.CombineTo(Op, NewExt);
1991 }
1992 }
1993 }
1994 } else {
1995 // This is a variable shift, so we can't shift the demand mask by a known
1996 // amount. But if we are not demanding high bits, then we are not
1997 // demanding those bits from the pre-shifted operand either.
1998 if (unsigned CTLZ = DemandedBits.countl_zero()) {
1999 APInt DemandedFromOp(APInt::getLowBitsSet(BitWidth, BitWidth - CTLZ));
2000 if (SimplifyDemandedBits(Op0, DemandedFromOp, DemandedElts, Known, TLO,
2001 Depth + 1)) {
2002 // Disable the nsw and nuw flags. We can no longer guarantee that we
2003 // won't wrap after simplification.
2004 Op->dropFlags(SDNodeFlags::NoWrap);
2005 return true;
2006 }
2007 Known.resetAll();
2008 }
2009 }
2010
2011 // If we are only demanding sign bits then we can use the shift source
2012 // directly.
2013 if (std::optional<unsigned> MaxSA =
2014 TLO.DAG.getValidMaximumShiftAmount(Op, DemandedElts, Depth + 1)) {
2015 unsigned ShAmt = *MaxSA;
2016 unsigned NumSignBits =
2017 TLO.DAG.ComputeNumSignBits(Op0, DemandedElts, Depth + 1);
2018 unsigned UpperDemandedBits = BitWidth - DemandedBits.countr_zero();
2019 if (NumSignBits > ShAmt && (NumSignBits - ShAmt) >= (UpperDemandedBits))
2020 return TLO.CombineTo(Op, Op0);
2021 }
2022 break;
2023 }
2024 case ISD::SRL: {
2025 SDValue Op0 = Op.getOperand(0);
2026 SDValue Op1 = Op.getOperand(1);
2027 EVT ShiftVT = Op1.getValueType();
2028
2029 if (std::optional<unsigned> KnownSA =
2030 TLO.DAG.getValidShiftAmount(Op, DemandedElts, Depth + 1)) {
2031 unsigned ShAmt = *KnownSA;
2032 if (ShAmt == 0)
2033 return TLO.CombineTo(Op, Op0);
2034
2035 // If this is ((X << C1) >>u ShAmt), see if we can simplify this into a
2036 // single shift. We can do this if the top bits (which are shifted out)
2037 // are never demanded.
2038 // TODO - support non-uniform vector amounts.
2039 if (Op0.getOpcode() == ISD::SHL) {
2040 if (!DemandedBits.intersects(APInt::getHighBitsSet(BitWidth, ShAmt))) {
2041 if (std::optional<unsigned> InnerSA =
2042 TLO.DAG.getValidShiftAmount(Op0, DemandedElts, Depth + 2)) {
2043 unsigned C1 = *InnerSA;
2044 unsigned Opc = ISD::SRL;
2045 int Diff = ShAmt - C1;
2046 if (Diff < 0) {
2047 Diff = -Diff;
2048 Opc = ISD::SHL;
2049 }
2050 SDValue NewSA = TLO.DAG.getConstant(Diff, dl, ShiftVT);
2051 return TLO.CombineTo(
2052 Op, TLO.DAG.getNode(Opc, dl, VT, Op0.getOperand(0), NewSA));
2053 }
2054 }
2055 }
2056
2057 // If this is (srl (sra X, C1), ShAmt), see if we can combine this into a
2058 // single sra. We can do this if the top bits are never demanded.
2059 if (Op0.getOpcode() == ISD::SRA && Op0.hasOneUse()) {
2060 if (!DemandedBits.intersects(APInt::getHighBitsSet(BitWidth, ShAmt))) {
2061 if (std::optional<unsigned> InnerSA =
2062 TLO.DAG.getValidShiftAmount(Op0, DemandedElts, Depth + 2)) {
2063 unsigned C1 = *InnerSA;
2064 // Clamp the combined shift amount if it exceeds the bit width.
2065 unsigned Combined = std::min(C1 + ShAmt, BitWidth - 1);
2066 SDValue NewSA = TLO.DAG.getConstant(Combined, dl, ShiftVT);
2067 return TLO.CombineTo(Op, TLO.DAG.getNode(ISD::SRA, dl, VT,
2068 Op0.getOperand(0), NewSA));
2069 }
2070 }
2071 }
2072
2073 APInt InDemandedMask = (DemandedBits << ShAmt);
2074
2075 // If the shift is exact, then it does demand the low bits (and knows that
2076 // they are zero).
2077 if (Op->getFlags().hasExact())
2078 InDemandedMask.setLowBits(ShAmt);
2079
2080 // Narrow shift to lower half - similar to ShrinkDemandedOp.
2081 // (srl i64:x, K) -> (i64 zero_extend (srl (i32 (trunc i64:x)), K))
2082 if ((BitWidth % 2) == 0 && !VT.isVector()) {
2084 EVT HalfVT = EVT::getIntegerVT(*TLO.DAG.getContext(), BitWidth / 2);
2085 if (isNarrowingProfitable(Op.getNode(), VT, HalfVT) &&
2086 isTypeDesirableForOp(ISD::SRL, HalfVT) &&
2087 isTruncateFree(VT, HalfVT) && isZExtFree(HalfVT, VT) &&
2088 (!TLO.LegalOperations() || isOperationLegal(ISD::SRL, HalfVT)) &&
2089 ((InDemandedMask.countLeadingZeros() >= (BitWidth / 2)) ||
2090 TLO.DAG.MaskedValueIsZero(Op0, HiBits))) {
2091 SDValue NewOp = TLO.DAG.getNode(ISD::TRUNCATE, dl, HalfVT, Op0);
2092 SDValue NewShiftAmt =
2093 TLO.DAG.getShiftAmountConstant(ShAmt, HalfVT, dl);
2094 SDValue NewShift =
2095 TLO.DAG.getNode(ISD::SRL, dl, HalfVT, NewOp, NewShiftAmt);
2096 return TLO.CombineTo(
2097 Op, TLO.DAG.getNode(ISD::ZERO_EXTEND, dl, VT, NewShift));
2098 }
2099 }
2100
2101 // Compute the new bits that are at the top now.
2102 if (SimplifyDemandedBits(Op0, InDemandedMask, DemandedElts, Known, TLO,
2103 Depth + 1))
2104 return true;
2105 Known >>= ShAmt;
2106 // High bits known zero.
2107 Known.Zero.setHighBits(ShAmt);
2108
2109 // Attempt to avoid multi-use ops if we don't need anything from them.
2110 if (!InDemandedMask.isAllOnes() || !DemandedElts.isAllOnes()) {
2112 Op0, InDemandedMask, DemandedElts, TLO.DAG, Depth + 1);
2113 if (DemandedOp0) {
2114 SDValue NewOp = TLO.DAG.getNode(ISD::SRL, dl, VT, DemandedOp0, Op1);
2115 return TLO.CombineTo(Op, NewOp);
2116 }
2117 }
2118 } else {
2119 // Use generic knownbits computation as it has support for non-uniform
2120 // shift amounts.
2121 Known = TLO.DAG.computeKnownBits(Op, DemandedElts, Depth);
2122 }
2123
2124 // If we are only demanding sign bits then we can use the shift source
2125 // directly.
2126 if (std::optional<unsigned> MaxSA =
2127 TLO.DAG.getValidMaximumShiftAmount(Op, DemandedElts, Depth + 1)) {
2128 unsigned ShAmt = *MaxSA;
2129 // Must already be signbits in DemandedBits bounds, and can't demand any
2130 // shifted in zeroes.
2131 if (DemandedBits.countl_zero() >= ShAmt) {
2132 unsigned NumSignBits =
2133 TLO.DAG.ComputeNumSignBits(Op0, DemandedElts, Depth + 1);
2134 if (DemandedBits.countr_zero() >= (BitWidth - NumSignBits))
2135 return TLO.CombineTo(Op, Op0);
2136 }
2137 }
2138
2139 // Try to match AVG patterns (after shift simplification).
2140 if (SDValue AVG = combineShiftToAVG(Op, TLO, *this, DemandedBits,
2141 DemandedElts, Depth + 1))
2142 return TLO.CombineTo(Op, AVG);
2143
2144 break;
2145 }
2146 case ISD::SRA: {
2147 SDValue Op0 = Op.getOperand(0);
2148 SDValue Op1 = Op.getOperand(1);
2149 EVT ShiftVT = Op1.getValueType();
2150
2151 // If we only want bits that already match the signbit then we don't need
2152 // to shift.
2153 unsigned NumHiDemandedBits = BitWidth - DemandedBits.countr_zero();
2154 if (TLO.DAG.ComputeNumSignBits(Op0, DemandedElts, Depth + 1) >=
2155 NumHiDemandedBits)
2156 return TLO.CombineTo(Op, Op0);
2157
2158 // If this is an arithmetic shift right and only the low-bit is set, we can
2159 // always convert this into a logical shr, even if the shift amount is
2160 // variable. The low bit of the shift cannot be an input sign bit unless
2161 // the shift amount is >= the size of the datatype, which is undefined.
2162 if (DemandedBits.isOne())
2163 return TLO.CombineTo(Op, TLO.DAG.getNode(ISD::SRL, dl, VT, Op0, Op1));
2164
2165 if (std::optional<unsigned> KnownSA =
2166 TLO.DAG.getValidShiftAmount(Op, DemandedElts, Depth + 1)) {
2167 unsigned ShAmt = *KnownSA;
2168 if (ShAmt == 0)
2169 return TLO.CombineTo(Op, Op0);
2170
2171 // fold (sra (shl x, c1), c1) -> sext_inreg for some c1 and target
2172 // supports sext_inreg.
2173 if (Op0.getOpcode() == ISD::SHL) {
2174 if (std::optional<unsigned> InnerSA =
2175 TLO.DAG.getValidShiftAmount(Op0, DemandedElts, Depth + 2)) {
2176 unsigned LowBits = BitWidth - ShAmt;
2177 EVT ExtVT = VT.changeElementType(
2178 *TLO.DAG.getContext(),
2179 EVT::getIntegerVT(*TLO.DAG.getContext(), LowBits));
2180
2181 if (*InnerSA == ShAmt) {
2182 if (!TLO.LegalOperations() ||
2184 return TLO.CombineTo(
2185 Op, TLO.DAG.getNode(ISD::SIGN_EXTEND_INREG, dl, VT,
2186 Op0.getOperand(0),
2187 TLO.DAG.getValueType(ExtVT)));
2188
2189 // Even if we can't convert to sext_inreg, we might be able to
2190 // remove this shift pair if the input is already sign extended.
2191 unsigned NumSignBits =
2192 TLO.DAG.ComputeNumSignBits(Op0.getOperand(0), DemandedElts);
2193 if (NumSignBits > ShAmt)
2194 return TLO.CombineTo(Op, Op0.getOperand(0));
2195 }
2196 }
2197 }
2198
2199 APInt InDemandedMask = (DemandedBits << ShAmt);
2200
2201 // If the shift is exact, then it does demand the low bits (and knows that
2202 // they are zero).
2203 if (Op->getFlags().hasExact())
2204 InDemandedMask.setLowBits(ShAmt);
2205
2206 // If any of the demanded bits are produced by the sign extension, we also
2207 // demand the input sign bit.
2208 if (DemandedBits.countl_zero() < ShAmt)
2209 InDemandedMask.setSignBit();
2210
2211 if (SimplifyDemandedBits(Op0, InDemandedMask, DemandedElts, Known, TLO,
2212 Depth + 1))
2213 return true;
2214 Known >>= ShAmt;
2215
2216 // If the input sign bit is known to be zero, or if none of the top bits
2217 // are demanded, turn this into an unsigned shift right.
2218 if (Known.Zero[BitWidth - ShAmt - 1] ||
2219 DemandedBits.countl_zero() >= ShAmt) {
2220 SDNodeFlags Flags;
2221 Flags.setExact(Op->getFlags().hasExact());
2222 return TLO.CombineTo(
2223 Op, TLO.DAG.getNode(ISD::SRL, dl, VT, Op0, Op1, Flags));
2224 }
2225
2226 int Log2 = DemandedBits.exactLogBase2();
2227 if (Log2 >= 0) {
2228 // The bit must come from the sign.
2229 SDValue NewSA = TLO.DAG.getConstant(BitWidth - 1 - Log2, dl, ShiftVT);
2230 return TLO.CombineTo(Op, TLO.DAG.getNode(ISD::SRL, dl, VT, Op0, NewSA));
2231 }
2232
2233 if (Known.One[BitWidth - ShAmt - 1])
2234 // New bits are known one.
2235 Known.One.setHighBits(ShAmt);
2236
2237 // Attempt to avoid multi-use ops if we don't need anything from them.
2238 if (!InDemandedMask.isAllOnes() || !DemandedElts.isAllOnes()) {
2240 Op0, InDemandedMask, DemandedElts, TLO.DAG, Depth + 1);
2241 if (DemandedOp0) {
2242 SDValue NewOp = TLO.DAG.getNode(ISD::SRA, dl, VT, DemandedOp0, Op1);
2243 return TLO.CombineTo(Op, NewOp);
2244 }
2245 }
2246 }
2247
2248 // Try to match AVG patterns (after shift simplification).
2249 if (SDValue AVG = combineShiftToAVG(Op, TLO, *this, DemandedBits,
2250 DemandedElts, Depth + 1))
2251 return TLO.CombineTo(Op, AVG);
2252
2253 break;
2254 }
2255 case ISD::FSHL:
2256 case ISD::FSHR: {
2257 SDValue Op0 = Op.getOperand(0);
2258 SDValue Op1 = Op.getOperand(1);
2259 SDValue Op2 = Op.getOperand(2);
2260 bool IsFSHL = (Op.getOpcode() == ISD::FSHL);
2261
2262 if (ConstantSDNode *SA = isConstOrConstSplat(Op2, DemandedElts)) {
2263 unsigned Amt = SA->getAPIntValue().urem(BitWidth);
2264
2265 // For fshl, 0-shift returns the 1st arg.
2266 // For fshr, 0-shift returns the 2nd arg.
2267 if (Amt == 0) {
2268 if (SimplifyDemandedBits(IsFSHL ? Op0 : Op1, DemandedBits, DemandedElts,
2269 Known, TLO, Depth + 1))
2270 return true;
2271 break;
2272 }
2273
2274 // fshl: (Op0 << Amt) | (Op1 >> (BW - Amt))
2275 // fshr: (Op0 << (BW - Amt)) | (Op1 >> Amt)
2276 APInt Demanded0 = DemandedBits.lshr(IsFSHL ? Amt : (BitWidth - Amt));
2277 APInt Demanded1 = DemandedBits << (IsFSHL ? (BitWidth - Amt) : Amt);
2278 if (SimplifyDemandedBits(Op0, Demanded0, DemandedElts, Known2, TLO,
2279 Depth + 1))
2280 return true;
2281 if (SimplifyDemandedBits(Op1, Demanded1, DemandedElts, Known, TLO,
2282 Depth + 1))
2283 return true;
2284
2285 Known2 <<= (IsFSHL ? Amt : (BitWidth - Amt));
2286 Known >>= (IsFSHL ? (BitWidth - Amt) : Amt);
2287 Known = Known.unionWith(Known2);
2288
2289 // Attempt to avoid multi-use ops if we don't need anything from them.
2290 if (!Demanded0.isAllOnes() || !Demanded1.isAllOnes() ||
2291 !DemandedElts.isAllOnes()) {
2293 Op0, Demanded0, DemandedElts, TLO.DAG, Depth + 1);
2295 Op1, Demanded1, DemandedElts, TLO.DAG, Depth + 1);
2296 if (DemandedOp0 || DemandedOp1) {
2297 DemandedOp0 = DemandedOp0 ? DemandedOp0 : Op0;
2298 DemandedOp1 = DemandedOp1 ? DemandedOp1 : Op1;
2299 SDValue NewOp = TLO.DAG.getNode(Op.getOpcode(), dl, VT, DemandedOp0,
2300 DemandedOp1, Op2);
2301 return TLO.CombineTo(Op, NewOp);
2302 }
2303 }
2304 }
2305
2306 if (isPowerOf2_32(BitWidth)) {
2307 // Fold FSHR(Op0,Op1,Op2) -> SRL(Op1,Op2)
2308 // iff we're guaranteed not to use Op0.
2309 // TODO: Add FSHL equivalent?
2310 if (!IsFSHL && !DemandedBits.isAllOnes() &&
2311 (!TLO.LegalOperations() || isOperationLegal(ISD::SRL, VT))) {
2312 KnownBits KnownAmt =
2313 TLO.DAG.computeKnownBits(Op2, DemandedElts, Depth + 1);
2314 unsigned MaxShiftAmt =
2315 KnownAmt.getMaxValue().getLimitedValue(BitWidth - 1);
2316 // Check we don't demand any shifted bits outside Op1.
2317 if (DemandedBits.countl_zero() >= MaxShiftAmt) {
2318 EVT AmtVT = Op2.getValueType();
2319 SDValue NewAmt =
2320 TLO.DAG.getNode(ISD::AND, dl, AmtVT, Op2,
2321 TLO.DAG.getConstant(BitWidth - 1, dl, AmtVT));
2322 SDValue NewOp = TLO.DAG.getNode(ISD::SRL, dl, VT, Op1, NewAmt);
2323 return TLO.CombineTo(Op, NewOp);
2324 }
2325 }
2326
2327 // For pow-2 bitwidths we only demand the bottom modulo amt bits.
2328 APInt DemandedAmtBits(Op2.getScalarValueSizeInBits(), BitWidth - 1);
2329 if (SimplifyDemandedBits(Op2, DemandedAmtBits, DemandedElts, Known2, TLO,
2330 Depth + 1))
2331 return true;
2332 }
2333 break;
2334 }
2335 case ISD::ROTL:
2336 case ISD::ROTR: {
2337 SDValue Op0 = Op.getOperand(0);
2338 SDValue Op1 = Op.getOperand(1);
2339 bool IsROTL = (Op.getOpcode() == ISD::ROTL);
2340
2341 // If we're rotating an 0/-1 value, then it stays an 0/-1 value.
2342 if (BitWidth == TLO.DAG.ComputeNumSignBits(Op0, DemandedElts, Depth + 1))
2343 return TLO.CombineTo(Op, Op0);
2344
2345 if (ConstantSDNode *SA = isConstOrConstSplat(Op1, DemandedElts)) {
2346 unsigned Amt = SA->getAPIntValue().urem(BitWidth);
2347 unsigned RevAmt = BitWidth - Amt;
2348
2349 // rotl: (Op0 << Amt) | (Op0 >> (BW - Amt))
2350 // rotr: (Op0 << (BW - Amt)) | (Op0 >> Amt)
2351 APInt Demanded0 = DemandedBits.rotr(IsROTL ? Amt : RevAmt);
2352 if (SimplifyDemandedBits(Op0, Demanded0, DemandedElts, Known2, TLO,
2353 Depth + 1))
2354 return true;
2355
2356 // rot*(x, 0) --> x
2357 if (Amt == 0)
2358 return TLO.CombineTo(Op, Op0);
2359
2360 // See if we don't demand either half of the rotated bits.
2361 if ((!TLO.LegalOperations() || isOperationLegal(ISD::SHL, VT)) &&
2362 DemandedBits.countr_zero() >= (IsROTL ? Amt : RevAmt)) {
2363 Op1 = TLO.DAG.getConstant(IsROTL ? Amt : RevAmt, dl, Op1.getValueType());
2364 return TLO.CombineTo(Op, TLO.DAG.getNode(ISD::SHL, dl, VT, Op0, Op1));
2365 }
2366 if ((!TLO.LegalOperations() || isOperationLegal(ISD::SRL, VT)) &&
2367 DemandedBits.countl_zero() >= (IsROTL ? RevAmt : Amt)) {
2368 Op1 = TLO.DAG.getConstant(IsROTL ? RevAmt : Amt, dl, Op1.getValueType());
2369 return TLO.CombineTo(Op, TLO.DAG.getNode(ISD::SRL, dl, VT, Op0, Op1));
2370 }
2371 }
2372
2373 // For pow-2 bitwidths we only demand the bottom modulo amt bits.
2374 if (isPowerOf2_32(BitWidth)) {
2375 APInt DemandedAmtBits(Op1.getScalarValueSizeInBits(), BitWidth - 1);
2376 if (SimplifyDemandedBits(Op1, DemandedAmtBits, DemandedElts, Known2, TLO,
2377 Depth + 1))
2378 return true;
2379 }
2380 break;
2381 }
2382 case ISD::SMIN:
2383 case ISD::SMAX:
2384 case ISD::UMIN:
2385 case ISD::UMAX: {
2386 unsigned Opc = Op.getOpcode();
2387 SDValue Op0 = Op.getOperand(0);
2388 SDValue Op1 = Op.getOperand(1);
2389
2390 // If we're only demanding signbits, then we can simplify to OR/AND node.
2391 unsigned BitOp =
2392 (Opc == ISD::SMIN || Opc == ISD::UMAX) ? ISD::OR : ISD::AND;
2393 unsigned NumSignBits =
2394 std::min(TLO.DAG.ComputeNumSignBits(Op0, DemandedElts, Depth + 1),
2395 TLO.DAG.ComputeNumSignBits(Op1, DemandedElts, Depth + 1));
2396 unsigned NumDemandedUpperBits = BitWidth - DemandedBits.countr_zero();
2397 if (NumSignBits >= NumDemandedUpperBits)
2398 return TLO.CombineTo(Op, TLO.DAG.getNode(BitOp, SDLoc(Op), VT, Op0, Op1));
2399
2400 // Check if one arg is always less/greater than (or equal) to the other arg.
2401 KnownBits Known0 = TLO.DAG.computeKnownBits(Op0, DemandedElts, Depth + 1);
2402 KnownBits Known1 = TLO.DAG.computeKnownBits(Op1, DemandedElts, Depth + 1);
2403 switch (Opc) {
2404 case ISD::SMIN:
2405 if (std::optional<bool> IsSLE = KnownBits::sle(Known0, Known1))
2406 return TLO.CombineTo(Op, *IsSLE ? Op0 : Op1);
2407 if (std::optional<bool> IsSLT = KnownBits::slt(Known0, Known1))
2408 return TLO.CombineTo(Op, *IsSLT ? Op0 : Op1);
2409 Known = KnownBits::smin(Known0, Known1);
2410 break;
2411 case ISD::SMAX:
2412 if (std::optional<bool> IsSGE = KnownBits::sge(Known0, Known1))
2413 return TLO.CombineTo(Op, *IsSGE ? Op0 : Op1);
2414 if (std::optional<bool> IsSGT = KnownBits::sgt(Known0, Known1))
2415 return TLO.CombineTo(Op, *IsSGT ? Op0 : Op1);
2416 Known = KnownBits::smax(Known0, Known1);
2417 break;
2418 case ISD::UMIN:
2419 if (std::optional<bool> IsULE = KnownBits::ule(Known0, Known1))
2420 return TLO.CombineTo(Op, *IsULE ? Op0 : Op1);
2421 if (std::optional<bool> IsULT = KnownBits::ult(Known0, Known1))
2422 return TLO.CombineTo(Op, *IsULT ? Op0 : Op1);
2423 Known = KnownBits::umin(Known0, Known1);
2424 break;
2425 case ISD::UMAX:
2426 if (std::optional<bool> IsUGE = KnownBits::uge(Known0, Known1))
2427 return TLO.CombineTo(Op, *IsUGE ? Op0 : Op1);
2428 if (std::optional<bool> IsUGT = KnownBits::ugt(Known0, Known1))
2429 return TLO.CombineTo(Op, *IsUGT ? Op0 : Op1);
2430 Known = KnownBits::umax(Known0, Known1);
2431 break;
2432 }
2433 break;
2434 }
2435 case ISD::BITREVERSE: {
2436 SDValue Src = Op.getOperand(0);
2437 APInt DemandedSrcBits = DemandedBits.reverseBits();
2438 if (SimplifyDemandedBits(Src, DemandedSrcBits, DemandedElts, Known2, TLO,
2439 Depth + 1))
2440 return true;
2441 Known = Known2.reverseBits();
2442 break;
2443 }
2444 case ISD::BSWAP: {
2445 SDValue Src = Op.getOperand(0);
2446
2447 // If the only bits demanded come from one byte of the bswap result,
2448 // just shift the input byte into position to eliminate the bswap.
2449 unsigned NLZ = DemandedBits.countl_zero();
2450 unsigned NTZ = DemandedBits.countr_zero();
2451
2452 // Round NTZ down to the next byte. If we have 11 trailing zeros, then
2453 // we need all the bits down to bit 8. Likewise, round NLZ. If we
2454 // have 14 leading zeros, round to 8.
2455 NLZ = alignDown(NLZ, 8);
2456 NTZ = alignDown(NTZ, 8);
2457 // If we need exactly one byte, we can do this transformation.
2458 if (BitWidth - NLZ - NTZ == 8) {
2459 // Replace this with either a left or right shift to get the byte into
2460 // the right place.
2461 unsigned ShiftOpcode = NLZ > NTZ ? ISD::SRL : ISD::SHL;
2462 if (!TLO.LegalOperations() || isOperationLegal(ShiftOpcode, VT)) {
2463 unsigned ShiftAmount = NLZ > NTZ ? NLZ - NTZ : NTZ - NLZ;
2464 SDValue ShAmt = TLO.DAG.getShiftAmountConstant(ShiftAmount, VT, dl);
2465 SDValue NewOp = TLO.DAG.getNode(ShiftOpcode, dl, VT, Src, ShAmt);
2466 return TLO.CombineTo(Op, NewOp);
2467 }
2468 }
2469
2470 APInt DemandedSrcBits = DemandedBits.byteSwap();
2471 if (SimplifyDemandedBits(Src, DemandedSrcBits, DemandedElts, Known2, TLO,
2472 Depth + 1))
2473 return true;
2474 Known = Known2.byteSwap();
2475 break;
2476 }
2477 case ISD::CTPOP: {
2478 // If only 1 bit is demanded, replace with PARITY as long as we're before
2479 // op legalization.
2480 // FIXME: Limit to scalars for now.
2481 if (DemandedBits.isOne() && !TLO.LegalOps && !VT.isVector())
2482 return TLO.CombineTo(Op, TLO.DAG.getNode(ISD::PARITY, dl, VT,
2483 Op.getOperand(0)));
2484
2485 Known = TLO.DAG.computeKnownBits(Op, DemandedElts, Depth);
2486 break;
2487 }
2488 case ISD::PDEP: {
2489 SDValue Op0 = Op.getOperand(0);
2490 SDValue Op1 = Op.getOperand(1);
2491
2492 unsigned DemandedBitsLZ = DemandedBits.countl_zero();
2493 APInt LoMask = APInt::getLowBitsSet(BitWidth, BitWidth - DemandedBitsLZ);
2494
2495 // If the demanded bits has leading zeroes, we don't demand those from the
2496 // mask.
2497 if (SimplifyDemandedBits(Op1, LoMask, Known, TLO, Depth + 1))
2498 return true;
2499
2500 // The number of possible 1s in the mask determines the number of LSBs of
2501 // operand 0 used. Undemanded bits from the mask don't matter so filter
2502 // them before counting.
2503 KnownBits Known2;
2504 uint64_t Count = (~Known.Zero & LoMask).popcount();
2505 APInt DemandedMask(APInt::getLowBitsSet(BitWidth, Count));
2506 if (SimplifyDemandedBits(Op0, DemandedMask, Known2, TLO, Depth + 1))
2507 return true;
2508
2509 // Zeroes are retained from the mask, but not ones.
2510 Known.One.clearAllBits();
2511 // The result will have at least as many trailing zeros as the non-mask
2512 // operand since bits can only map to the same or higher bit position.
2513 Known.Zero.setLowBits(Known2.countMinTrailingZeros());
2514 break;
2515 }
2517 SDValue Op0 = Op.getOperand(0);
2518 EVT ExVT = cast<VTSDNode>(Op.getOperand(1))->getVT();
2519 unsigned ExVTBits = ExVT.getScalarSizeInBits();
2520
2521 // If we only care about the highest bit, don't bother shifting right.
2522 if (DemandedBits.isSignMask()) {
2523 unsigned MinSignedBits =
2524 TLO.DAG.ComputeMaxSignificantBits(Op0, DemandedElts, Depth + 1);
2525 bool AlreadySignExtended = ExVTBits >= MinSignedBits;
2526 // However if the input is already sign extended we expect the sign
2527 // extension to be dropped altogether later and do not simplify.
2528 if (!AlreadySignExtended) {
2529 // Compute the correct shift amount type, which must be getShiftAmountTy
2530 // for scalar types after legalization.
2531 SDValue ShiftAmt =
2532 TLO.DAG.getShiftAmountConstant(BitWidth - ExVTBits, VT, dl);
2533 return TLO.CombineTo(Op,
2534 TLO.DAG.getNode(ISD::SHL, dl, VT, Op0, ShiftAmt));
2535 }
2536 }
2537
2538 // If none of the extended bits are demanded, eliminate the sextinreg.
2539 if (DemandedBits.getActiveBits() <= ExVTBits)
2540 return TLO.CombineTo(Op, Op0);
2541
2542 APInt InputDemandedBits = DemandedBits.getLoBits(ExVTBits);
2543
2544 // Since the sign extended bits are demanded, we know that the sign
2545 // bit is demanded.
2546 InputDemandedBits.setBit(ExVTBits - 1);
2547
2548 if (SimplifyDemandedBits(Op0, InputDemandedBits, DemandedElts, Known, TLO,
2549 Depth + 1))
2550 return true;
2551
2552 // If the sign bit of the input is known set or clear, then we know the
2553 // top bits of the result.
2554
2555 // If the input sign bit is known zero, convert this into a zero extension.
2556 if (Known.Zero[ExVTBits - 1])
2557 return TLO.CombineTo(Op, TLO.DAG.getZeroExtendInReg(Op0, dl, ExVT));
2558
2559 APInt Mask = APInt::getLowBitsSet(BitWidth, ExVTBits);
2560 if (Known.One[ExVTBits - 1]) { // Input sign bit known set
2561 Known.One.setBitsFrom(ExVTBits);
2562 Known.Zero &= Mask;
2563 } else { // Input sign bit unknown
2564 Known.Zero &= Mask;
2565 Known.One &= Mask;
2566 }
2567 break;
2568 }
2569 case ISD::BUILD_PAIR: {
2570 EVT HalfVT = Op.getOperand(0).getValueType();
2571 unsigned HalfBitWidth = HalfVT.getScalarSizeInBits();
2572
2573 APInt MaskLo = DemandedBits.getLoBits(HalfBitWidth).trunc(HalfBitWidth);
2574 APInt MaskHi = DemandedBits.getHiBits(HalfBitWidth).trunc(HalfBitWidth);
2575
2576 KnownBits KnownLo, KnownHi;
2577
2578 if (SimplifyDemandedBits(Op.getOperand(0), MaskLo, KnownLo, TLO, Depth + 1))
2579 return true;
2580
2581 if (SimplifyDemandedBits(Op.getOperand(1), MaskHi, KnownHi, TLO, Depth + 1))
2582 return true;
2583
2584 Known = KnownHi.concat(KnownLo);
2585 break;
2586 }
2588 if (VT.isScalableVector())
2589 return false;
2590 [[fallthrough]];
2591 case ISD::ZERO_EXTEND: {
2592 SDValue Src = Op.getOperand(0);
2593 EVT SrcVT = Src.getValueType();
2594 unsigned InBits = SrcVT.getScalarSizeInBits();
2595 unsigned InElts = SrcVT.isFixedLengthVector() ? SrcVT.getVectorNumElements() : 1;
2596 bool IsVecInReg = Op.getOpcode() == ISD::ZERO_EXTEND_VECTOR_INREG;
2597
2598 // If none of the top bits are demanded, convert this into an any_extend.
2599 if (DemandedBits.getActiveBits() <= InBits) {
2600 // If we only need the non-extended bits of the bottom element
2601 // then we can just bitcast to the result.
2602 if (IsLE && IsVecInReg && DemandedElts == 1 &&
2603 VT.getSizeInBits() == SrcVT.getSizeInBits())
2604 return TLO.CombineTo(Op, TLO.DAG.getBitcast(VT, Src));
2605
2606 unsigned Opc =
2608 if (!TLO.LegalOperations() || isOperationLegal(Opc, VT))
2609 return TLO.CombineTo(Op, TLO.DAG.getNode(Opc, dl, VT, Src));
2610 }
2611
2612 APInt InDemandedBits = DemandedBits.trunc(InBits);
2613 APInt InDemandedElts = DemandedElts.zext(InElts);
2614 if (SimplifyDemandedBits(Src, InDemandedBits, InDemandedElts, Known, TLO,
2615 Depth + 1)) {
2616 Op->dropFlags(SDNodeFlags::NonNeg);
2617 return true;
2618 }
2619 assert(Known.getBitWidth() == InBits && "Src width has changed?");
2620 Known = Known.zext(BitWidth);
2621
2622 // Attempt to avoid multi-use ops if we don't need anything from them.
2624 Src, InDemandedBits, InDemandedElts, TLO.DAG, Depth + 1))
2625 return TLO.CombineTo(Op, TLO.DAG.getNode(Op.getOpcode(), dl, VT, NewSrc));
2626 break;
2627 }
2629 if (VT.isScalableVector())
2630 return false;
2631 [[fallthrough]];
2632 case ISD::SIGN_EXTEND: {
2633 SDValue Src = Op.getOperand(0);
2634 EVT SrcVT = Src.getValueType();
2635 unsigned InBits = SrcVT.getScalarSizeInBits();
2636 unsigned InElts = SrcVT.isFixedLengthVector() ? SrcVT.getVectorNumElements() : 1;
2637 bool IsVecInReg = Op.getOpcode() == ISD::SIGN_EXTEND_VECTOR_INREG;
2638
2639 APInt InDemandedElts = DemandedElts.zext(InElts);
2640 APInt InDemandedBits = DemandedBits.trunc(InBits);
2641
2642 // Since some of the sign extended bits are demanded, we know that the sign
2643 // bit is demanded.
2644 InDemandedBits.setBit(InBits - 1);
2645
2646 // If none of the top bits are demanded, convert this into an any_extend.
2647 if (DemandedBits.getActiveBits() <= InBits) {
2648 // If we only need the non-extended bits of the bottom element
2649 // then we can just bitcast to the result.
2650 if (IsLE && IsVecInReg && DemandedElts == 1 &&
2651 VT.getSizeInBits() == SrcVT.getSizeInBits())
2652 return TLO.CombineTo(Op, TLO.DAG.getBitcast(VT, Src));
2653
2654 // Don't lose an all signbits 0/-1 splat on targets with 0/-1 booleans.
2656 TLO.DAG.ComputeNumSignBits(Src, InDemandedElts, Depth + 1) !=
2657 InBits) {
2658 unsigned Opc =
2660 if (!TLO.LegalOperations() || isOperationLegal(Opc, VT))
2661 return TLO.CombineTo(Op, TLO.DAG.getNode(Opc, dl, VT, Src));
2662 }
2663 }
2664
2665 if (SimplifyDemandedBits(Src, InDemandedBits, InDemandedElts, Known, TLO,
2666 Depth + 1))
2667 return true;
2668 assert(Known.getBitWidth() == InBits && "Src width has changed?");
2669
2670 // If the sign bit is known one, the top bits match.
2671 Known = Known.sext(BitWidth);
2672
2673 // If the sign bit is known zero, convert this to a zero extend.
2674 if (Known.isNonNegative()) {
2675 unsigned Opc =
2677 if (!TLO.LegalOperations() || isOperationLegal(Opc, VT)) {
2678 SDNodeFlags Flags;
2679 if (!IsVecInReg)
2680 Flags |= SDNodeFlags::NonNeg;
2681 return TLO.CombineTo(Op, TLO.DAG.getNode(Opc, dl, VT, Src, Flags));
2682 }
2683 }
2684
2685 // Attempt to avoid multi-use ops if we don't need anything from them.
2687 Src, InDemandedBits, InDemandedElts, TLO.DAG, Depth + 1))
2688 return TLO.CombineTo(Op, TLO.DAG.getNode(Op.getOpcode(), dl, VT, NewSrc));
2689 break;
2690 }
2692 if (VT.isScalableVector())
2693 return false;
2694 [[fallthrough]];
2695 case ISD::ANY_EXTEND: {
2696 SDValue Src = Op.getOperand(0);
2697 EVT SrcVT = Src.getValueType();
2698 unsigned InBits = SrcVT.getScalarSizeInBits();
2699 unsigned InElts = SrcVT.isFixedLengthVector() ? SrcVT.getVectorNumElements() : 1;
2700 bool IsVecInReg = Op.getOpcode() == ISD::ANY_EXTEND_VECTOR_INREG;
2701
2702 // If we only need the bottom element then we can just bitcast.
2703 // TODO: Handle ANY_EXTEND?
2704 if (IsLE && IsVecInReg && DemandedElts == 1 &&
2705 VT.getSizeInBits() == SrcVT.getSizeInBits())
2706 return TLO.CombineTo(Op, TLO.DAG.getBitcast(VT, Src));
2707
2708 APInt InDemandedBits = DemandedBits.trunc(InBits);
2709 APInt InDemandedElts = DemandedElts.zext(InElts);
2710 if (SimplifyDemandedBits(Src, InDemandedBits, InDemandedElts, Known, TLO,
2711 Depth + 1))
2712 return true;
2713 assert(Known.getBitWidth() == InBits && "Src width has changed?");
2714 Known = Known.anyext(BitWidth);
2715
2716 // Attempt to avoid multi-use ops if we don't need anything from them.
2718 Src, InDemandedBits, InDemandedElts, TLO.DAG, Depth + 1))
2719 return TLO.CombineTo(Op, TLO.DAG.getNode(Op.getOpcode(), dl, VT, NewSrc));
2720 break;
2721 }
2722 case ISD::TRUNCATE: {
2723 SDValue Src = Op.getOperand(0);
2724
2725 // Simplify the input, using demanded bit information, and compute the known
2726 // zero/one bits live out.
2727 unsigned OperandBitWidth = Src.getScalarValueSizeInBits();
2728 APInt TruncMask = DemandedBits.zext(OperandBitWidth);
2729 if (SimplifyDemandedBits(Src, TruncMask, DemandedElts, Known, TLO,
2730 Depth + 1)) {
2731 // Disable the nsw and nuw flags. We can no longer guarantee that we
2732 // won't wrap after simplification.
2733 Op->dropFlags(SDNodeFlags::NoWrap);
2734 return true;
2735 }
2736 Known = Known.trunc(BitWidth);
2737
2738 // Attempt to avoid multi-use ops if we don't need anything from them.
2740 Src, TruncMask, DemandedElts, TLO.DAG, Depth + 1))
2741 return TLO.CombineTo(Op, TLO.DAG.getNode(ISD::TRUNCATE, dl, VT, NewSrc));
2742
2743 // If the input is only used by this truncate, see if we can shrink it based
2744 // on the known demanded bits.
2745 switch (Src.getOpcode()) {
2746 default:
2747 break;
2748 case ISD::SRL:
2749 // Shrink SRL by a constant if none of the high bits shifted in are
2750 // demanded.
2751 if (TLO.LegalTypes() && !isTypeDesirableForOp(ISD::SRL, VT))
2752 // Do not turn (vt1 truncate (vt2 srl)) into (vt1 srl) if vt1 is
2753 // undesirable.
2754 break;
2755
2756 if (Src.getNode()->hasOneUse()) {
2757 if (isTruncateFree(Src, VT) &&
2758 !isTruncateFree(Src.getValueType(), VT)) {
2759 // If truncate is only free at trunc(srl), do not turn it into
2760 // srl(trunc). The check is done by first check the truncate is free
2761 // at Src's opcode(srl), then check the truncate is not done by
2762 // referencing sub-register. In test, if both trunc(srl) and
2763 // srl(trunc)'s trunc are free, srl(trunc) performs better. If only
2764 // trunc(srl)'s trunc is free, trunc(srl) is better.
2765 break;
2766 }
2767
2768 std::optional<unsigned> ShAmtC =
2769 TLO.DAG.getValidShiftAmount(Src, DemandedElts, Depth + 2);
2770 if (!ShAmtC || *ShAmtC >= BitWidth)
2771 break;
2772 unsigned ShVal = *ShAmtC;
2773
2774 APInt HighBits =
2775 APInt::getHighBitsSet(OperandBitWidth, OperandBitWidth - BitWidth);
2776 HighBits.lshrInPlace(ShVal);
2777 HighBits = HighBits.trunc(BitWidth);
2778 if (!(HighBits & DemandedBits)) {
2779 // None of the shifted in bits are needed. Add a truncate of the
2780 // shift input, then shift it.
2781 SDValue NewShAmt = TLO.DAG.getShiftAmountConstant(ShVal, VT, dl);
2782 SDValue NewTrunc =
2783 TLO.DAG.getNode(ISD::TRUNCATE, dl, VT, Src.getOperand(0));
2784 return TLO.CombineTo(
2785 Op, TLO.DAG.getNode(ISD::SRL, dl, VT, NewTrunc, NewShAmt));
2786 }
2787 }
2788 break;
2789 }
2790
2791 break;
2792 }
2793 case ISD::AssertZext: {
2794 // AssertZext demands all of the high bits, plus any of the low bits
2795 // demanded by its users.
2796 EVT ZVT = cast<VTSDNode>(Op.getOperand(1))->getVT();
2798 if (SimplifyDemandedBits(Op.getOperand(0), ~InMask | DemandedBits, Known,
2799 TLO, Depth + 1))
2800 return true;
2801
2802 Known.Zero |= ~InMask;
2803 Known.One &= (~Known.Zero);
2804 break;
2805 }
2807 SDValue Src = Op.getOperand(0);
2808 SDValue Idx = Op.getOperand(1);
2809 ElementCount SrcEltCnt = Src.getValueType().getVectorElementCount();
2810 unsigned EltBitWidth = Src.getScalarValueSizeInBits();
2811
2812 if (SrcEltCnt.isScalable())
2813 return false;
2814
2815 // Demand the bits from every vector element without a constant index.
2816 unsigned NumSrcElts = SrcEltCnt.getFixedValue();
2817 APInt DemandedSrcElts = APInt::getAllOnes(NumSrcElts);
2818 if (auto *CIdx = dyn_cast<ConstantSDNode>(Idx))
2819 if (CIdx->getAPIntValue().ult(NumSrcElts))
2820 DemandedSrcElts = APInt::getOneBitSet(NumSrcElts, CIdx->getZExtValue());
2821
2822 // If BitWidth > EltBitWidth the value is anyext:ed. So we do not know
2823 // anything about the extended bits.
2824 APInt DemandedSrcBits = DemandedBits;
2825 if (BitWidth > EltBitWidth)
2826 DemandedSrcBits = DemandedSrcBits.trunc(EltBitWidth);
2827
2828 if (SimplifyDemandedBits(Src, DemandedSrcBits, DemandedSrcElts, Known2, TLO,
2829 Depth + 1))
2830 return true;
2831
2832 // Attempt to avoid multi-use ops if we don't need anything from them.
2833 if (!DemandedSrcBits.isAllOnes() || !DemandedSrcElts.isAllOnes()) {
2834 if (SDValue DemandedSrc = SimplifyMultipleUseDemandedBits(
2835 Src, DemandedSrcBits, DemandedSrcElts, TLO.DAG, Depth + 1)) {
2836 SDValue NewOp =
2837 TLO.DAG.getNode(Op.getOpcode(), dl, VT, DemandedSrc, Idx);
2838 return TLO.CombineTo(Op, NewOp);
2839 }
2840 }
2841
2842 Known = Known2;
2843 if (BitWidth > EltBitWidth)
2844 Known = Known.anyext(BitWidth);
2845 break;
2846 }
2847 case ISD::BITCAST: {
2848 if (VT.isScalableVector())
2849 return false;
2850 SDValue Src = Op.getOperand(0);
2851 EVT SrcVT = Src.getValueType();
2852 unsigned NumSrcEltBits = SrcVT.getScalarSizeInBits();
2853
2854 // If this is an FP->Int bitcast and if the sign bit is the only
2855 // thing demanded, turn this into a FGETSIGN.
2856 if (!TLO.LegalOperations() && !VT.isVector() && !SrcVT.isVector() &&
2857 DemandedBits == APInt::getSignMask(Op.getValueSizeInBits()) &&
2858 SrcVT.isFloatingPoint()) {
2860 // Make a FGETSIGN + SHL to move the sign bit into the appropriate
2861 // place. We expect the SHL to be eliminated by other optimizations.
2862 SDValue Sign = TLO.DAG.getNode(ISD::FGETSIGN, dl, VT, Src);
2863 unsigned ShVal = Op.getValueSizeInBits() - 1;
2864 SDValue ShAmt = TLO.DAG.getShiftAmountConstant(ShVal, VT, dl);
2865 return TLO.CombineTo(Op,
2866 TLO.DAG.getNode(ISD::SHL, dl, VT, Sign, ShAmt));
2867 }
2868 }
2869
2870 // Bitcast from a vector using SimplifyDemanded Bits/VectorElts.
2871 // Demand the elt/bit if any of the original elts/bits are demanded.
2872 if (SrcVT.isVector() && (BitWidth % NumSrcEltBits) == 0) {
2873 unsigned Scale = BitWidth / NumSrcEltBits;
2874 unsigned NumSrcElts = SrcVT.getVectorNumElements();
2875 APInt DemandedSrcBits = APInt::getZero(NumSrcEltBits);
2876 for (unsigned i = 0; i != Scale; ++i) {
2877 unsigned EltOffset = IsLE ? i : (Scale - 1 - i);
2878 unsigned BitOffset = EltOffset * NumSrcEltBits;
2879 DemandedSrcBits |= DemandedBits.extractBits(NumSrcEltBits, BitOffset);
2880 }
2881 // Recursive calls below may turn not demanded elements into poison, so we
2882 // need to demand all smaller source elements that maps to a demanded
2883 // destination element.
2884 APInt DemandedSrcElts = APIntOps::ScaleBitMask(DemandedElts, NumSrcElts);
2885
2886 APInt KnownSrcUndef, KnownSrcZero;
2887 if (SimplifyDemandedVectorElts(Src, DemandedSrcElts, KnownSrcUndef,
2888 KnownSrcZero, TLO, Depth + 1))
2889 return true;
2890
2891 KnownBits KnownSrcBits;
2892 if (SimplifyDemandedBits(Src, DemandedSrcBits, DemandedSrcElts,
2893 KnownSrcBits, TLO, Depth + 1))
2894 return true;
2895 } else if (IsLE && (NumSrcEltBits % BitWidth) == 0) {
2896 // TODO - bigendian once we have test coverage.
2897 unsigned Scale = NumSrcEltBits / BitWidth;
2898 unsigned NumSrcElts = SrcVT.isVector() ? SrcVT.getVectorNumElements() : 1;
2899 APInt DemandedSrcBits = APInt::getZero(NumSrcEltBits);
2900 APInt DemandedSrcElts = APInt::getZero(NumSrcElts);
2901 for (unsigned i = 0; i != NumElts; ++i)
2902 if (DemandedElts[i]) {
2903 unsigned Offset = (i % Scale) * BitWidth;
2904 DemandedSrcBits.insertBits(DemandedBits, Offset);
2905 DemandedSrcElts.setBit(i / Scale);
2906 }
2907
2908 if (SrcVT.isVector()) {
2909 APInt KnownSrcUndef, KnownSrcZero;
2910 if (SimplifyDemandedVectorElts(Src, DemandedSrcElts, KnownSrcUndef,
2911 KnownSrcZero, TLO, Depth + 1))
2912 return true;
2913 }
2914
2915 KnownBits KnownSrcBits;
2916 if (SimplifyDemandedBits(Src, DemandedSrcBits, DemandedSrcElts,
2917 KnownSrcBits, TLO, Depth + 1))
2918 return true;
2919
2920 // Attempt to avoid multi-use ops if we don't need anything from them.
2921 if (!DemandedSrcBits.isAllOnes() || !DemandedSrcElts.isAllOnes()) {
2922 if (SDValue DemandedSrc = SimplifyMultipleUseDemandedBits(
2923 Src, DemandedSrcBits, DemandedSrcElts, TLO.DAG, Depth + 1)) {
2924 SDValue NewOp = TLO.DAG.getBitcast(VT, DemandedSrc);
2925 return TLO.CombineTo(Op, NewOp);
2926 }
2927 }
2928 }
2929
2930 // If this is a bitcast, let computeKnownBits handle it. Only do this on a
2931 // recursive call where Known may be useful to the caller.
2932 if (Depth > 0) {
2933 Known = TLO.DAG.computeKnownBits(Op, DemandedElts, Depth);
2934 return false;
2935 }
2936 break;
2937 }
2938 case ISD::MUL:
2939 if (DemandedBits.isPowerOf2()) {
2940 // The LSB of X*Y is set only if (X & 1) == 1 and (Y & 1) == 1.
2941 // If we demand exactly one bit N and we have "X * (C' << N)" where C' is
2942 // odd (has LSB set), then the left-shifted low bit of X is the answer.
2943 unsigned CTZ = DemandedBits.countr_zero();
2944 ConstantSDNode *C = isConstOrConstSplat(Op.getOperand(1), DemandedElts);
2945 if (C && C->getAPIntValue().countr_zero() == CTZ) {
2946 SDValue AmtC = TLO.DAG.getShiftAmountConstant(CTZ, VT, dl);
2947 SDValue Shl = TLO.DAG.getNode(ISD::SHL, dl, VT, Op.getOperand(0), AmtC);
2948 return TLO.CombineTo(Op, Shl);
2949 }
2950 }
2951 // For a squared value "X * X", the bottom 2 bits are 0 and X[0] because:
2952 // X * X is odd iff X is odd.
2953 // 'Quadratic Reciprocity': X * X -> 0 for bit[1]
2954 if (Op.getOperand(0) == Op.getOperand(1) && DemandedBits.ult(4)) {
2955 SDValue One = TLO.DAG.getConstant(1, dl, VT);
2956 SDValue And1 = TLO.DAG.getNode(ISD::AND, dl, VT, Op.getOperand(0), One);
2957 return TLO.CombineTo(Op, And1);
2958 }
2959 [[fallthrough]];
2960 case ISD::PTRADD:
2961 if (Op.getOperand(0).getValueType() != Op.getOperand(1).getValueType())
2962 break;
2963 // PTRADD behaves like ADD if pointers are represented as integers.
2964 [[fallthrough]];
2965 case ISD::ADD:
2966 case ISD::SUB: {
2967 // Add, Sub, and Mul don't demand any bits in positions beyond that
2968 // of the highest bit demanded of them.
2969 SDValue Op0 = Op.getOperand(0), Op1 = Op.getOperand(1);
2970 SDNodeFlags Flags = Op.getNode()->getFlags();
2971 unsigned DemandedBitsLZ = DemandedBits.countl_zero();
2972 APInt LoMask = APInt::getLowBitsSet(BitWidth, BitWidth - DemandedBitsLZ);
2973 KnownBits KnownOp0, KnownOp1;
2974 auto GetDemandedBitsLHSMask = [&](APInt Demanded,
2975 const KnownBits &KnownRHS) {
2976 if (Op.getOpcode() == ISD::MUL)
2977 Demanded.clearHighBits(KnownRHS.countMinTrailingZeros());
2978 return Demanded;
2979 };
2980 if (SimplifyDemandedBits(Op1, LoMask, DemandedElts, KnownOp1, TLO,
2981 Depth + 1) ||
2982 SimplifyDemandedBits(Op0, GetDemandedBitsLHSMask(LoMask, KnownOp1),
2983 DemandedElts, KnownOp0, TLO, Depth + 1) ||
2984 // See if the operation should be performed at a smaller bit width.
2986 // Disable the nsw and nuw flags. We can no longer guarantee that we
2987 // won't wrap after simplification.
2988 Op->dropFlags(SDNodeFlags::NoWrap);
2989 return true;
2990 }
2991
2992 // neg x with only low bit demanded is simply x.
2993 if (Op.getOpcode() == ISD::SUB && DemandedBits.isOne() &&
2994 isNullConstant(Op0))
2995 return TLO.CombineTo(Op, Op1);
2996
2997 // Attempt to avoid multi-use ops if we don't need anything from them.
2998 if (!LoMask.isAllOnes() || !DemandedElts.isAllOnes()) {
3000 Op0, LoMask, DemandedElts, TLO.DAG, Depth + 1);
3002 Op1, LoMask, DemandedElts, TLO.DAG, Depth + 1);
3003 if (DemandedOp0 || DemandedOp1) {
3004 Op0 = DemandedOp0 ? DemandedOp0 : Op0;
3005 Op1 = DemandedOp1 ? DemandedOp1 : Op1;
3006 SDValue NewOp = TLO.DAG.getNode(Op.getOpcode(), dl, VT, Op0, Op1,
3007 Flags & ~SDNodeFlags::NoWrap);
3008 return TLO.CombineTo(Op, NewOp);
3009 }
3010 }
3011
3012 // If we have a constant operand, we may be able to turn it into -1 if we
3013 // do not demand the high bits. This can make the constant smaller to
3014 // encode, allow more general folding, or match specialized instruction
3015 // patterns (eg, 'blsr' on x86). Don't bother changing 1 to -1 because that
3016 // is probably not useful (and could be detrimental).
3018 APInt HighMask = APInt::getHighBitsSet(BitWidth, DemandedBitsLZ);
3019 if (C && !C->isAllOnes() && !C->isOne() &&
3020 (C->getAPIntValue() | HighMask).isAllOnes()) {
3021 SDValue Neg1 = TLO.DAG.getAllOnesConstant(dl, VT);
3022 // Disable the nsw and nuw flags. We can no longer guarantee that we
3023 // won't wrap after simplification.
3024 SDValue NewOp = TLO.DAG.getNode(Op.getOpcode(), dl, VT, Op0, Neg1,
3025 Flags & ~SDNodeFlags::NoWrap);
3026 return TLO.CombineTo(Op, NewOp);
3027 }
3028
3029 // Match a multiply with a disguised negated-power-of-2 and convert to a
3030 // an equivalent shift-left amount.
3031 // Example: (X * MulC) + Op1 --> Op1 - (X << log2(-MulC))
3032 auto getShiftLeftAmt = [&HighMask](SDValue Mul) -> unsigned {
3033 if (Mul.getOpcode() != ISD::MUL || !Mul.hasOneUse())
3034 return 0;
3035
3036 // Don't touch opaque constants. Also, ignore zero and power-of-2
3037 // multiplies. Those will get folded later.
3038 ConstantSDNode *MulC = isConstOrConstSplat(Mul.getOperand(1));
3039 if (MulC && !MulC->isOpaque() && !MulC->isZero() &&
3040 !MulC->getAPIntValue().isPowerOf2()) {
3041 APInt UnmaskedC = MulC->getAPIntValue() | HighMask;
3042 if (UnmaskedC.isNegatedPowerOf2())
3043 return (-UnmaskedC).logBase2();
3044 }
3045 return 0;
3046 };
3047
3048 auto foldMul = [&](ISD::NodeType NT, SDValue X, SDValue Y,
3049 unsigned ShlAmt) {
3050 SDValue ShlAmtC = TLO.DAG.getShiftAmountConstant(ShlAmt, VT, dl);
3051 SDValue Shl = TLO.DAG.getNode(ISD::SHL, dl, VT, X, ShlAmtC);
3052 SDValue Res = TLO.DAG.getNode(NT, dl, VT, Y, Shl);
3053 return TLO.CombineTo(Op, Res);
3054 };
3055
3057 if (Op.getOpcode() == ISD::ADD) {
3058 // (X * MulC) + Op1 --> Op1 - (X << log2(-MulC))
3059 if (unsigned ShAmt = getShiftLeftAmt(Op0))
3060 return foldMul(ISD::SUB, Op0.getOperand(0), Op1, ShAmt);
3061 // Op0 + (X * MulC) --> Op0 - (X << log2(-MulC))
3062 if (unsigned ShAmt = getShiftLeftAmt(Op1))
3063 return foldMul(ISD::SUB, Op1.getOperand(0), Op0, ShAmt);
3064 }
3065 if (Op.getOpcode() == ISD::SUB) {
3066 // Op0 - (X * MulC) --> Op0 + (X << log2(-MulC))
3067 if (unsigned ShAmt = getShiftLeftAmt(Op1))
3068 return foldMul(ISD::ADD, Op1.getOperand(0), Op0, ShAmt);
3069 }
3070 }
3071
3072 if (Op.getOpcode() == ISD::MUL) {
3073 Known = KnownBits::mul(KnownOp0, KnownOp1);
3074 } else { // Op.getOpcode() is either ISD::ADD, ISD::PTRADD, or ISD::SUB.
3076 Op.getOpcode() != ISD::SUB, Flags.hasNoSignedWrap(),
3077 Flags.hasNoUnsignedWrap(), KnownOp0, KnownOp1);
3078 }
3079 break;
3080 }
3081 case ISD::FABS: {
3082 SDValue Op0 = Op.getOperand(0);
3083 APInt SignMask = APInt::getSignMask(BitWidth);
3084
3085 if (!DemandedBits.intersects(SignMask))
3086 return TLO.CombineTo(Op, Op0);
3087
3088 if (SimplifyDemandedBits(Op0, DemandedBits, DemandedElts, Known, TLO,
3089 Depth + 1))
3090 return true;
3091
3092 if (Known.isNonNegative())
3093 return TLO.CombineTo(Op, Op0);
3094 if (Known.isNegative())
3095 return TLO.CombineTo(
3096 Op, TLO.DAG.getNode(ISD::FNEG, dl, VT, Op0, Op->getFlags()));
3097
3098 Known.Zero |= SignMask;
3099 Known.One &= ~SignMask;
3100
3101 break;
3102 }
3103 case ISD::FCOPYSIGN: {
3104 SDValue Op0 = Op.getOperand(0);
3105 SDValue Op1 = Op.getOperand(1);
3106
3107 unsigned BitWidth0 = Op0.getScalarValueSizeInBits();
3108 unsigned BitWidth1 = Op1.getScalarValueSizeInBits();
3109 APInt SignMask0 = APInt::getSignMask(BitWidth0);
3110 APInt SignMask1 = APInt::getSignMask(BitWidth1);
3111
3112 if (!DemandedBits.intersects(SignMask0))
3113 return TLO.CombineTo(Op, Op0);
3114
3115 if (SimplifyDemandedBits(Op0, ~SignMask0 & DemandedBits, DemandedElts,
3116 Known, TLO, Depth + 1) ||
3117 SimplifyDemandedBits(Op1, SignMask1, DemandedElts, Known2, TLO,
3118 Depth + 1))
3119 return true;
3120
3121 if (Known2.isNonNegative())
3122 return TLO.CombineTo(
3123 Op, TLO.DAG.getNode(ISD::FABS, dl, VT, Op0, Op->getFlags()));
3124
3125 if (Known2.isNegative())
3126 return TLO.CombineTo(
3127 Op, TLO.DAG.getNode(ISD::FNEG, dl, VT,
3128 TLO.DAG.getNode(ISD::FABS, SDLoc(Op0), VT, Op0)));
3129
3130 Known.Zero &= ~SignMask0;
3131 Known.One &= ~SignMask0;
3132 break;
3133 }
3134 case ISD::FNEG: {
3135 SDValue Op0 = Op.getOperand(0);
3136 APInt SignMask = APInt::getSignMask(BitWidth);
3137
3138 if (!DemandedBits.intersects(SignMask))
3139 return TLO.CombineTo(Op, Op0);
3140
3141 if (SimplifyDemandedBits(Op0, DemandedBits, DemandedElts, Known, TLO,
3142 Depth + 1))
3143 return true;
3144
3145 if (!Known.isSignUnknown()) {
3146 Known.Zero ^= SignMask;
3147 Known.One ^= SignMask;
3148 }
3149
3150 break;
3151 }
3152 default:
3153 // We also ask the target about intrinsics (which could be specific to it).
3154 if (Op.getOpcode() >= ISD::BUILTIN_OP_END ||
3155 Op.getOpcode() == ISD::INTRINSIC_WO_CHAIN) {
3156 // TODO: Probably okay to remove after audit; here to reduce change size
3157 // in initial enablement patch for scalable vectors
3158 if (Op.getValueType().isScalableVector())
3159 break;
3161 Known, TLO, Depth))
3162 return true;
3163 break;
3164 }
3165
3166 // Just use computeKnownBits to compute output bits.
3167 Known = TLO.DAG.computeKnownBits(Op, DemandedElts, Depth);
3168 break;
3169 }
3170
3171 // If we know the value of all of the demanded bits, return this as a
3172 // constant.
3174 DemandedBits.isSubsetOf(Known.Zero | Known.One)) {
3175 // Avoid folding to a constant if any OpaqueConstant is involved.
3176 if (llvm::any_of(Op->ops(), [](SDValue V) {
3177 auto *C = dyn_cast<ConstantSDNode>(V);
3178 return C && C->isOpaque();
3179 }))
3180 return false;
3181 if (VT.isInteger())
3182 return TLO.CombineTo(Op, TLO.DAG.getConstant(Known.One, dl, VT));
3183 if (VT.isFloatingPoint())
3184 return TLO.CombineTo(
3186 dl, VT));
3187 }
3188
3189 // A multi use 'all demanded elts' simplify failed to find any knownbits.
3190 // Try again just for the original demanded elts.
3191 // Ensure we do this AFTER constant folding above.
3192 if (HasMultiUse && Known.isUnknown() && !OriginalDemandedElts.isAllOnes())
3193 Known = TLO.DAG.computeKnownBits(Op, OriginalDemandedElts, Depth);
3194
3195 return false;
3196}
3197
3199 const APInt &DemandedElts,
3200 DAGCombinerInfo &DCI) const {
3201 SelectionDAG &DAG = DCI.DAG;
3202 TargetLoweringOpt TLO(DAG, !DCI.isBeforeLegalize(),
3203 !DCI.isBeforeLegalizeOps());
3204
3205 APInt KnownUndef, KnownZero;
3206 bool Simplified =
3207 SimplifyDemandedVectorElts(Op, DemandedElts, KnownUndef, KnownZero, TLO);
3208 if (Simplified) {
3209 DCI.AddToWorklist(Op.getNode());
3210 DCI.CommitTargetLoweringOpt(TLO);
3211 }
3212
3213 return Simplified;
3214}
3215
3216/// Given a vector binary operation and known undefined elements for each input
3217/// operand, compute whether each element of the output is undefined.
3219 const APInt &UndefOp0,
3220 const APInt &UndefOp1) {
3221 EVT VT = BO.getValueType();
3223 "Vector binop only");
3224
3225 EVT EltVT = VT.getVectorElementType();
3226 unsigned NumElts = VT.isFixedLengthVector() ? VT.getVectorNumElements() : 1;
3227 assert(UndefOp0.getBitWidth() == NumElts &&
3228 UndefOp1.getBitWidth() == NumElts && "Bad type for undef analysis");
3229
3230 auto getUndefOrConstantElt = [&](SDValue V, unsigned Index,
3231 const APInt &UndefVals) {
3232 if (UndefVals[Index])
3233 return DAG.getUNDEF(EltVT);
3234
3235 if (auto *BV = dyn_cast<BuildVectorSDNode>(V)) {
3236 // Try hard to make sure that the getNode() call is not creating temporary
3237 // nodes. Ignore opaque integers because they do not constant fold.
3238 SDValue Elt = BV->getOperand(Index);
3239 auto *C = dyn_cast<ConstantSDNode>(Elt);
3240 if (isa<ConstantFPSDNode>(Elt) || Elt.isUndef() || (C && !C->isOpaque()))
3241 return Elt;
3242 }
3243
3244 return SDValue();
3245 };
3246
3247 APInt KnownUndef = APInt::getZero(NumElts);
3248 for (unsigned i = 0; i != NumElts; ++i) {
3249 // If both inputs for this element are either constant or undef and match
3250 // the element type, compute the constant/undef result for this element of
3251 // the vector.
3252 // TODO: Ideally we would use FoldConstantArithmetic() here, but that does
3253 // not handle FP constants. The code within getNode() should be refactored
3254 // to avoid the danger of creating a bogus temporary node here.
3255 SDValue C0 = getUndefOrConstantElt(BO.getOperand(0), i, UndefOp0);
3256 SDValue C1 = getUndefOrConstantElt(BO.getOperand(1), i, UndefOp1);
3257 if (C0 && C1 && C0.getValueType() == EltVT && C1.getValueType() == EltVT)
3258 if (DAG.getNode(BO.getOpcode(), SDLoc(BO), EltVT, C0, C1).isUndef())
3259 KnownUndef.setBit(i);
3260 }
3261 return KnownUndef;
3262}
3263
3265 SDValue Op, const APInt &OriginalDemandedElts, APInt &KnownUndef,
3266 APInt &KnownZero, TargetLoweringOpt &TLO, unsigned Depth,
3267 bool AssumeSingleUse) const {
3268 EVT VT = Op.getValueType();
3269 unsigned Opcode = Op.getOpcode();
3270 APInt DemandedElts = OriginalDemandedElts;
3271 unsigned NumElts = DemandedElts.getBitWidth();
3272 assert(VT.isVector() && "Expected vector op");
3273
3274 KnownUndef = KnownZero = APInt::getZero(NumElts);
3275
3277 return false;
3278
3279 // TODO: For now we assume we know nothing about scalable vectors.
3280 if (VT.isScalableVector())
3281 return false;
3282
3283 assert(VT.getVectorNumElements() == NumElts &&
3284 "Mask size mismatches value type element count!");
3285
3286 // Undef operand.
3287 if (Op.isUndef()) {
3288 KnownUndef.setAllBits();
3289 return false;
3290 }
3291
3292 // If Op has other users, assume that all elements are needed.
3293 if (!AssumeSingleUse && !Op.getNode()->hasOneUse())
3294 DemandedElts.setAllBits();
3295
3296 // Not demanding any elements from Op.
3297 if (DemandedElts == 0) {
3298 KnownUndef.setAllBits();
3299 return TLO.CombineTo(Op, TLO.DAG.getUNDEF(VT));
3300 }
3301
3302 // Limit search depth.
3304 return false;
3305
3306 SDLoc DL(Op);
3307 unsigned EltSizeInBits = VT.getScalarSizeInBits();
3308 bool IsLE = TLO.DAG.getDataLayout().isLittleEndian();
3309
3310 auto TryShrinkBinOp = [&](SDValue Op0, SDValue Op1) {
3311 unsigned ShrunkSize = getPreferredShrunkVectorSizeInBits(Op, DemandedElts);
3312 if (!ShrunkSize)
3313 return false;
3314
3315 assert(ShrunkSize % EltSizeInBits == 0 &&
3316 "Shrunk size not a multiple of element size");
3317 assert(ShrunkSize < VT.getSizeInBits() &&
3318 "Shrunk size must be < original vector size");
3319 assert(ShrunkSize >= EltSizeInBits * DemandedElts.getActiveBits() &&
3320 "Shrunk size must be >= demanded size");
3321
3322 EVT ShrunkVT = VT.changeVectorElementCount(
3323 *TLO.DAG.getContext(),
3324 ElementCount::getFixed(ShrunkSize / EltSizeInBits));
3325 Op0 = TLO.DAG.getExtractSubvector(DL, ShrunkVT, Op0, 0);
3326 Op1 = TLO.DAG.getExtractSubvector(DL, ShrunkVT, Op1, 0);
3327 SDValue NewOp =
3328 TLO.DAG.getNode(Opcode, DL, ShrunkVT, Op0, Op1, Op->getFlags());
3329 return TLO.CombineTo(
3330 Op, TLO.DAG.getInsertSubvector(DL, TLO.DAG.getUNDEF(VT), NewOp, 0));
3331 };
3332
3333 // Helper for demanding the specified elements and all the bits of both binary
3334 // operands.
3335 auto SimplifyDemandedVectorEltsBinOp = [&](SDValue Op0, SDValue Op1) {
3336 SDValue NewOp0 = SimplifyMultipleUseDemandedVectorElts(Op0, DemandedElts,
3337 TLO.DAG, Depth + 1);
3338 SDValue NewOp1 = SimplifyMultipleUseDemandedVectorElts(Op1, DemandedElts,
3339 TLO.DAG, Depth + 1);
3340 if (NewOp0 || NewOp1) {
3341 SDValue NewOp =
3342 TLO.DAG.getNode(Opcode, SDLoc(Op), VT, NewOp0 ? NewOp0 : Op0,
3343 NewOp1 ? NewOp1 : Op1, Op->getFlags());
3344 return TLO.CombineTo(Op, NewOp);
3345 }
3346
3347 if (TryShrinkBinOp(Op0, Op1))
3348 return true;
3349
3350 return false;
3351 };
3352
3353 switch (Opcode) {
3354 case ISD::SCALAR_TO_VECTOR: {
3355 if (!DemandedElts[0]) {
3356 KnownUndef.setAllBits();
3357 return TLO.CombineTo(Op, TLO.DAG.getUNDEF(VT));
3358 }
3359 KnownUndef.setHighBits(NumElts - 1);
3360 break;
3361 }
3362 case ISD::BITCAST: {
3363 SDValue Src = Op.getOperand(0);
3364 EVT SrcVT = Src.getValueType();
3365
3366 if (!SrcVT.isVector()) {
3367 // TODO - bigendian once we have test coverage.
3368 if (IsLE) {
3369 APInt DemandedSrcBits = APInt::getZero(SrcVT.getSizeInBits());
3370 unsigned EltSize = VT.getScalarSizeInBits();
3371 for (unsigned I = 0; I != NumElts; ++I) {
3372 if (DemandedElts[I]) {
3373 unsigned Offset = I * EltSize;
3374 DemandedSrcBits.setBits(Offset, Offset + EltSize);
3375 }
3376 }
3378 if (SimplifyDemandedBits(Src, DemandedSrcBits, Known, TLO, Depth + 1))
3379 return true;
3380 }
3381 break;
3382 }
3383
3384 // Fast handling of 'identity' bitcasts.
3385 unsigned NumSrcElts = SrcVT.getVectorNumElements();
3386 if (NumSrcElts == NumElts)
3387 return SimplifyDemandedVectorElts(Src, DemandedElts, KnownUndef,
3388 KnownZero, TLO, Depth + 1);
3389
3390 APInt SrcDemandedElts, SrcZero, SrcUndef;
3391
3392 // Bitcast from 'large element' src vector to 'small element' vector, we
3393 // must demand a source element if any DemandedElt maps to it.
3394 if ((NumElts % NumSrcElts) == 0) {
3395 unsigned Scale = NumElts / NumSrcElts;
3396 SrcDemandedElts = APIntOps::ScaleBitMask(DemandedElts, NumSrcElts);
3397 if (SimplifyDemandedVectorElts(Src, SrcDemandedElts, SrcUndef, SrcZero,
3398 TLO, Depth + 1))
3399 return true;
3400
3401 // Try calling SimplifyDemandedBits, converting demanded elts to the bits
3402 // of the large element.
3403 // TODO - bigendian once we have test coverage.
3404 if (IsLE) {
3405 unsigned SrcEltSizeInBits = SrcVT.getScalarSizeInBits();
3406 APInt SrcDemandedBits = APInt::getZero(SrcEltSizeInBits);
3407 for (unsigned i = 0; i != NumElts; ++i)
3408 if (DemandedElts[i]) {
3409 unsigned Ofs = (i % Scale) * EltSizeInBits;
3410 SrcDemandedBits.setBits(Ofs, Ofs + EltSizeInBits);
3411 }
3412
3414 if (SimplifyDemandedBits(Src, SrcDemandedBits, SrcDemandedElts, Known,
3415 TLO, Depth + 1))
3416 return true;
3417
3418 // The bitcast has split each wide element into a number of
3419 // narrow subelements. We have just computed the Known bits
3420 // for wide elements. See if element splitting results in
3421 // some subelements being zero. Only for demanded elements!
3422 for (unsigned SubElt = 0; SubElt != Scale; ++SubElt) {
3423 if (!Known.Zero.extractBits(EltSizeInBits, SubElt * EltSizeInBits)
3424 .isAllOnes())
3425 continue;
3426 for (unsigned SrcElt = 0; SrcElt != NumSrcElts; ++SrcElt) {
3427 unsigned Elt = Scale * SrcElt + SubElt;
3428 // A wholly-undef source lane is reported as undef below; don't also
3429 // flag it as zero, keeping the undef and zero sets disjoint.
3430 if (DemandedElts[Elt] && !SrcUndef[SrcElt])
3431 KnownZero.setBit(Elt);
3432 }
3433 }
3434 }
3435
3436 // If the src element is zero/undef then all the output elements will be -
3437 // only demanded elements are guaranteed to be correct.
3438 for (unsigned i = 0; i != NumSrcElts; ++i) {
3439 if (SrcDemandedElts[i]) {
3440 if (SrcZero[i])
3441 KnownZero.setBits(i * Scale, (i + 1) * Scale);
3442 if (SrcUndef[i])
3443 KnownUndef.setBits(i * Scale, (i + 1) * Scale);
3444 }
3445 }
3446 }
3447
3448 // Bitcast from 'small element' src vector to 'large element' vector, we
3449 // demand all smaller source elements covered by the larger demanded element
3450 // of this vector.
3451 if ((NumSrcElts % NumElts) == 0) {
3452 unsigned Scale = NumSrcElts / NumElts;
3453 SrcDemandedElts = APIntOps::ScaleBitMask(DemandedElts, NumSrcElts);
3454 if (SimplifyDemandedVectorElts(Src, SrcDemandedElts, SrcUndef, SrcZero,
3455 TLO, Depth + 1))
3456 return true;
3457
3458 // If all the src elements covering an output element are zero/undef, then
3459 // the output element will be as well, assuming it was demanded.
3460 for (unsigned i = 0; i != NumElts; ++i) {
3461 if (DemandedElts[i]) {
3462 if (SrcZero.extractBits(Scale, i * Scale).isAllOnes())
3463 KnownZero.setBit(i);
3464 if (SrcUndef.extractBits(Scale, i * Scale).isAllOnes())
3465 KnownUndef.setBit(i);
3466 }
3467 }
3468 }
3469 break;
3470 }
3471 case ISD::FREEZE: {
3472 SDValue N0 = Op.getOperand(0);
3474 N0, DemandedElts, UndefPoisonKind::UndefOrPoison, Depth + 1))
3475 return TLO.CombineTo(Op, N0);
3476
3477 // TODO: Replace this with the general fold from DAGCombiner::visitFREEZE
3478 // freeze(op(x, ...)) -> op(freeze(x), ...).
3479 if (N0.getOpcode() == ISD::SCALAR_TO_VECTOR && DemandedElts == 1)
3480 return TLO.CombineTo(
3482 TLO.DAG.getFreeze(N0.getOperand(0))));
3483 break;
3484 }
3485 case ISD::BUILD_VECTOR: {
3486 // Check all elements and simplify any unused elements with UNDEF.
3487 if (!DemandedElts.isAllOnes()) {
3488 // Don't simplify BROADCASTS.
3489 if (llvm::any_of(Op->op_values(),
3490 [&](SDValue Elt) { return Op.getOperand(0) != Elt; })) {
3492 bool Updated = false;
3493 for (unsigned i = 0; i != NumElts; ++i) {
3494 if (!DemandedElts[i] && !Ops[i].isUndef()) {
3495 Ops[i] = TLO.DAG.getUNDEF(Ops[0].getValueType());
3496 KnownUndef.setBit(i);
3497 Updated = true;
3498 }
3499 }
3500 if (Updated)
3501 return TLO.CombineTo(Op, TLO.DAG.getBuildVector(VT, DL, Ops));
3502 }
3503 }
3504 for (unsigned i = 0; i != NumElts; ++i) {
3505 SDValue SrcOp = Op.getOperand(i);
3506 if (SrcOp.isUndef()) {
3507 KnownUndef.setBit(i);
3508 } else if (EltSizeInBits == SrcOp.getScalarValueSizeInBits() &&
3510 KnownZero.setBit(i);
3511 }
3512 }
3513 break;
3514 }
3515 case ISD::CONCAT_VECTORS: {
3516 EVT SubVT = Op.getOperand(0).getValueType();
3517 unsigned NumSubVecs = Op.getNumOperands();
3518 unsigned NumSubElts = SubVT.getVectorNumElements();
3519 for (unsigned i = 0; i != NumSubVecs; ++i) {
3520 SDValue SubOp = Op.getOperand(i);
3521 APInt SubElts = DemandedElts.extractBits(NumSubElts, i * NumSubElts);
3522 APInt SubUndef, SubZero;
3523 if (SimplifyDemandedVectorElts(SubOp, SubElts, SubUndef, SubZero, TLO,
3524 Depth + 1))
3525 return true;
3526 KnownUndef.insertBits(SubUndef, i * NumSubElts);
3527 KnownZero.insertBits(SubZero, i * NumSubElts);
3528 }
3529
3530 // Attempt to avoid multi-use ops if we don't need anything from them.
3531 if (!DemandedElts.isAllOnes()) {
3532 bool FoundNewSub = false;
3533 SmallVector<SDValue, 2> DemandedSubOps;
3534 for (unsigned i = 0; i != NumSubVecs; ++i) {
3535 SDValue SubOp = Op.getOperand(i);
3536 APInt SubElts = DemandedElts.extractBits(NumSubElts, i * NumSubElts);
3538 SubOp, SubElts, TLO.DAG, Depth + 1);
3539 DemandedSubOps.push_back(NewSubOp ? NewSubOp : SubOp);
3540 FoundNewSub = NewSubOp ? true : FoundNewSub;
3541 }
3542 if (FoundNewSub) {
3543 SDValue NewOp =
3544 TLO.DAG.getNode(Op.getOpcode(), SDLoc(Op), VT, DemandedSubOps);
3545 return TLO.CombineTo(Op, NewOp);
3546 }
3547 }
3548 break;
3549 }
3550 case ISD::INSERT_SUBVECTOR: {
3551 // Demand any elements from the subvector and the remainder from the src it
3552 // is inserted into.
3553 SDValue Src = Op.getOperand(0);
3554 SDValue Sub = Op.getOperand(1);
3555 uint64_t Idx = Op.getConstantOperandVal(2);
3556 unsigned NumSubElts = Sub.getValueType().getVectorNumElements();
3557 APInt DemandedSubElts = DemandedElts.extractBits(NumSubElts, Idx);
3558 APInt DemandedSrcElts = DemandedElts;
3559 DemandedSrcElts.clearBits(Idx, Idx + NumSubElts);
3560
3561 // If none of the sub operand elements are demanded, bypass the insert.
3562 if (!DemandedSubElts)
3563 return TLO.CombineTo(Op, Src);
3564
3565 APInt SubUndef, SubZero;
3566 if (SimplifyDemandedVectorElts(Sub, DemandedSubElts, SubUndef, SubZero, TLO,
3567 Depth + 1))
3568 return true;
3569
3570 // If none of the src operand elements are demanded, replace it with undef.
3571 if (!DemandedSrcElts && !Src.isUndef())
3572 return TLO.CombineTo(Op, TLO.DAG.getNode(ISD::INSERT_SUBVECTOR, DL, VT,
3573 TLO.DAG.getUNDEF(VT), Sub,
3574 Op.getOperand(2)));
3575
3576 if (SimplifyDemandedVectorElts(Src, DemandedSrcElts, KnownUndef, KnownZero,
3577 TLO, Depth + 1))
3578 return true;
3579 KnownUndef.insertBits(SubUndef, Idx);
3580 KnownZero.insertBits(SubZero, Idx);
3581
3582 // Attempt to avoid multi-use ops if we don't need anything from them.
3583 if (!DemandedSrcElts.isAllOnes() || !DemandedSubElts.isAllOnes()) {
3585 Src, DemandedSrcElts, TLO.DAG, Depth + 1);
3587 Sub, DemandedSubElts, TLO.DAG, Depth + 1);
3588 if (NewSrc || NewSub) {
3589 NewSrc = NewSrc ? NewSrc : Src;
3590 NewSub = NewSub ? NewSub : Sub;
3591 SDValue NewOp = TLO.DAG.getNode(Op.getOpcode(), SDLoc(Op), VT, NewSrc,
3592 NewSub, Op.getOperand(2));
3593 return TLO.CombineTo(Op, NewOp);
3594 }
3595 }
3596 break;
3597 }
3599 // Offset the demanded elts by the subvector index.
3600 SDValue Src = Op.getOperand(0);
3601 if (Src.getValueType().isScalableVector())
3602 break;
3603 uint64_t Idx = Op.getConstantOperandVal(1);
3604 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
3605 APInt DemandedSrcElts = DemandedElts.zext(NumSrcElts).shl(Idx);
3606
3607 APInt SrcUndef, SrcZero;
3608 if (SimplifyDemandedVectorElts(Src, DemandedSrcElts, SrcUndef, SrcZero, TLO,
3609 Depth + 1))
3610 return true;
3611 KnownUndef = SrcUndef.extractBits(NumElts, Idx);
3612 KnownZero = SrcZero.extractBits(NumElts, Idx);
3613
3614 // Attempt to avoid multi-use ops if we don't need anything from them.
3615 SDValue NewSrc = SimplifyMultipleUseDemandedVectorElts(Src, DemandedSrcElts,
3616 TLO.DAG, Depth + 1);
3617 if (NewSrc) {
3618 SDValue NewOp = TLO.DAG.getNode(Op.getOpcode(), SDLoc(Op), VT, NewSrc,
3619 Op.getOperand(1));
3620 return TLO.CombineTo(Op, NewOp);
3621 }
3622 break;
3623 }
3625 SDValue Vec = Op.getOperand(0);
3626 SDValue Scl = Op.getOperand(1);
3627 auto *CIdx = dyn_cast<ConstantSDNode>(Op.getOperand(2));
3628
3629 // For a legal, constant insertion index, if we don't need this insertion
3630 // then strip it, else remove it from the demanded elts.
3631 if (CIdx && CIdx->getAPIntValue().ult(NumElts)) {
3632 unsigned Idx = CIdx->getZExtValue();
3633 if (!DemandedElts[Idx])
3634 return TLO.CombineTo(Op, Vec);
3635
3636 APInt DemandedVecElts(DemandedElts);
3637 DemandedVecElts.clearBit(Idx);
3638 if (SimplifyDemandedVectorElts(Vec, DemandedVecElts, KnownUndef,
3639 KnownZero, TLO, Depth + 1))
3640 return true;
3641
3642 KnownUndef.setBitVal(Idx, Scl.isUndef());
3643
3644 KnownZero.setBitVal(Idx, isNullConstant(Scl) || isNullFPConstant(Scl));
3645 break;
3646 }
3647
3648 APInt VecUndef, VecZero;
3649 if (SimplifyDemandedVectorElts(Vec, DemandedElts, VecUndef, VecZero, TLO,
3650 Depth + 1))
3651 return true;
3652 // Without knowing the insertion index we can't set KnownUndef/KnownZero.
3653 break;
3654 }
3655 case ISD::VSELECT: {
3656 SDValue Sel = Op.getOperand(0);
3657 SDValue LHS = Op.getOperand(1);
3658 SDValue RHS = Op.getOperand(2);
3659
3660 // Try to transform the select condition based on the current demanded
3661 // elements.
3662 APInt UndefSel, ZeroSel;
3663 if (SimplifyDemandedVectorElts(Sel, DemandedElts, UndefSel, ZeroSel, TLO,
3664 Depth + 1))
3665 return true;
3666
3667 // See if we can simplify either vselect operand.
3668 APInt DemandedLHS(DemandedElts);
3669 APInt DemandedRHS(DemandedElts);
3670 APInt UndefLHS, ZeroLHS;
3671 APInt UndefRHS, ZeroRHS;
3672 if (SimplifyDemandedVectorElts(LHS, DemandedLHS, UndefLHS, ZeroLHS, TLO,
3673 Depth + 1))
3674 return true;
3675 if (SimplifyDemandedVectorElts(RHS, DemandedRHS, UndefRHS, ZeroRHS, TLO,
3676 Depth + 1))
3677 return true;
3678
3679 KnownUndef = UndefLHS & UndefRHS;
3680 KnownZero = ZeroLHS & ZeroRHS;
3681
3682 // If we know that the selected element is always zero, we don't need the
3683 // select value element.
3684 APInt DemandedSel = DemandedElts & ~KnownZero;
3685 if (DemandedSel != DemandedElts)
3686 if (SimplifyDemandedVectorElts(Sel, DemandedSel, UndefSel, ZeroSel, TLO,
3687 Depth + 1))
3688 return true;
3689
3690 break;
3691 }
3692 case ISD::VECTOR_SHUFFLE: {
3693 SDValue LHS = Op.getOperand(0);
3694 SDValue RHS = Op.getOperand(1);
3695 ArrayRef<int> ShuffleMask = cast<ShuffleVectorSDNode>(Op)->getMask();
3696
3697 // Collect demanded elements from shuffle operands..
3698 APInt DemandedLHS(NumElts, 0);
3699 APInt DemandedRHS(NumElts, 0);
3700 for (unsigned i = 0; i != NumElts; ++i) {
3701 int M = ShuffleMask[i];
3702 if (M < 0 || !DemandedElts[i])
3703 continue;
3704 assert(0 <= M && M < (int)(2 * NumElts) && "Shuffle index out of range");
3705 if (M < (int)NumElts)
3706 DemandedLHS.setBit(M);
3707 else
3708 DemandedRHS.setBit(M - NumElts);
3709 }
3710
3711 // If either side isn't demanded, replace it by UNDEF. We handle this
3712 // explicitly here to also simplify in case of multiple uses (on the
3713 // contrary to the SimplifyDemandedVectorElts calls below).
3714 bool FoldLHS = !DemandedLHS && !LHS.isUndef();
3715 bool FoldRHS = !DemandedRHS && !RHS.isUndef();
3716 if (FoldLHS || FoldRHS) {
3717 LHS = FoldLHS ? TLO.DAG.getUNDEF(LHS.getValueType()) : LHS;
3718 RHS = FoldRHS ? TLO.DAG.getUNDEF(RHS.getValueType()) : RHS;
3719 SDValue NewOp =
3720 TLO.DAG.getVectorShuffle(VT, SDLoc(Op), LHS, RHS, ShuffleMask);
3721 return TLO.CombineTo(Op, NewOp);
3722 }
3723
3724 // See if we can simplify either shuffle operand.
3725 APInt UndefLHS, ZeroLHS;
3726 APInt UndefRHS, ZeroRHS;
3727 if (SimplifyDemandedVectorElts(LHS, DemandedLHS, UndefLHS, ZeroLHS, TLO,
3728 Depth + 1))
3729 return true;
3730 if (SimplifyDemandedVectorElts(RHS, DemandedRHS, UndefRHS, ZeroRHS, TLO,
3731 Depth + 1))
3732 return true;
3733
3734 // Simplify mask using undef elements from LHS/RHS.
3735 bool Updated = false;
3736 bool IdentityLHS = true, IdentityRHS = true;
3737 SmallVector<int, 32> NewMask(ShuffleMask);
3738 for (unsigned i = 0; i != NumElts; ++i) {
3739 int &M = NewMask[i];
3740 if (M < 0)
3741 continue;
3742 if (!DemandedElts[i] || (M < (int)NumElts && UndefLHS[M]) ||
3743 (M >= (int)NumElts && UndefRHS[M - NumElts])) {
3744 Updated = true;
3745 M = -1;
3746 }
3747 IdentityLHS &= (M < 0) || (M == (int)i);
3748 IdentityRHS &= (M < 0) || ((M - NumElts) == i);
3749 }
3750
3751 // Update legal shuffle masks based on demanded elements if it won't reduce
3752 // to Identity which can cause premature removal of the shuffle mask.
3753 if (Updated && !IdentityLHS && !IdentityRHS && !TLO.LegalOps) {
3754 SDValue LegalShuffle =
3755 buildLegalVectorShuffle(VT, DL, LHS, RHS, NewMask, TLO.DAG);
3756 if (LegalShuffle)
3757 return TLO.CombineTo(Op, LegalShuffle);
3758 }
3759
3760 // Propagate undef/zero elements from LHS/RHS.
3761 for (unsigned i = 0; i != NumElts; ++i) {
3762 int M = ShuffleMask[i];
3763 if (M < 0) {
3764 KnownUndef.setBit(i);
3765 } else if (M < (int)NumElts) {
3766 if (UndefLHS[M])
3767 KnownUndef.setBit(i);
3768 if (ZeroLHS[M])
3769 KnownZero.setBit(i);
3770 } else {
3771 if (UndefRHS[M - NumElts])
3772 KnownUndef.setBit(i);
3773 if (ZeroRHS[M - NumElts])
3774 KnownZero.setBit(i);
3775 }
3776 }
3777 break;
3778 }
3782 APInt SrcUndef, SrcZero;
3783 SDValue Src = Op.getOperand(0);
3784 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
3785 APInt DemandedSrcElts = DemandedElts.zext(NumSrcElts);
3786 if (SimplifyDemandedVectorElts(Src, DemandedSrcElts, SrcUndef, SrcZero, TLO,
3787 Depth + 1))
3788 return true;
3789 KnownZero = SrcZero.zextOrTrunc(NumElts);
3790 KnownUndef = SrcUndef.zextOrTrunc(NumElts);
3791
3792 if (IsLE && Op.getOpcode() == ISD::ANY_EXTEND_VECTOR_INREG &&
3793 Op.getValueSizeInBits() == Src.getValueSizeInBits() &&
3794 DemandedSrcElts == 1) {
3795 // aext - if we just need the bottom element then we can bitcast.
3796 return TLO.CombineTo(Op, TLO.DAG.getBitcast(VT, Src));
3797 }
3798
3799 if (Op.getOpcode() == ISD::ZERO_EXTEND_VECTOR_INREG) {
3800 // zext(undef) upper bits are guaranteed to be zero.
3801 if (DemandedElts.isSubsetOf(KnownUndef))
3802 return TLO.CombineTo(Op, TLO.DAG.getConstant(0, SDLoc(Op), VT));
3803 KnownUndef.clearAllBits();
3804
3805 // zext - if we just need the bottom element then we can mask:
3806 // zext(and(x,c)) -> and(x,c') iff the zext is the only user of the and.
3807 if (IsLE && DemandedSrcElts == 1 && Src.getOpcode() == ISD::AND &&
3808 Op->isOnlyUserOf(Src.getNode()) &&
3809 Op.getValueSizeInBits() == Src.getValueSizeInBits()) {
3810 SDLoc DL(Op);
3811 EVT SrcVT = Src.getValueType();
3812 EVT SrcSVT = SrcVT.getScalarType();
3813
3814 // If we're after type legalization and SrcSVT is not legal, use the
3815 // promoted type for creating constants to avoid creating nodes with
3816 // illegal types.
3817 if (TLO.LegalTypes())
3818 SrcSVT = getLegalTypeToTransformTo(*TLO.DAG.getContext(), SrcSVT);
3819
3820 SmallVector<SDValue> MaskElts;
3821 MaskElts.push_back(TLO.DAG.getAllOnesConstant(DL, SrcSVT));
3822 MaskElts.append(NumSrcElts - 1, TLO.DAG.getConstant(0, DL, SrcSVT));
3823 SDValue Mask = TLO.DAG.getBuildVector(SrcVT, DL, MaskElts);
3824 if (SDValue Fold = TLO.DAG.FoldConstantArithmetic(
3825 ISD::AND, DL, SrcVT, {Src.getOperand(1), Mask})) {
3826 Fold = TLO.DAG.getNode(ISD::AND, DL, SrcVT, Src.getOperand(0), Fold);
3827 return TLO.CombineTo(Op, TLO.DAG.getBitcast(VT, Fold));
3828 }
3829 }
3830 }
3831 break;
3832 }
3833
3834 // TODO: There are more binop opcodes that could be handled here - MIN,
3835 // MAX, saturated math, etc.
3836 case ISD::ADD: {
3837 SDValue Op0 = Op.getOperand(0);
3838 SDValue Op1 = Op.getOperand(1);
3839 if (Op0 == Op1 && Op->isOnlyUserOf(Op0.getNode())) {
3840 APInt UndefLHS, ZeroLHS;
3841 if (SimplifyDemandedVectorElts(Op0, DemandedElts, UndefLHS, ZeroLHS, TLO,
3842 Depth + 1, /*AssumeSingleUse*/ true))
3843 return true;
3844 }
3845 [[fallthrough]];
3846 }
3847 case ISD::AVGCEILS:
3848 case ISD::AVGCEILU:
3849 case ISD::AVGFLOORS:
3850 case ISD::AVGFLOORU:
3851 case ISD::OR:
3852 case ISD::XOR:
3853 case ISD::SUB:
3854 case ISD::FADD:
3855 case ISD::FSUB:
3856 case ISD::FMUL:
3857 case ISD::FDIV:
3858 case ISD::FREM:
3859 case ISD::PSEUDO_FMIN:
3860 case ISD::PSEUDO_FMAX: {
3861 SDValue Op0 = Op.getOperand(0);
3862 SDValue Op1 = Op.getOperand(1);
3863
3864 APInt UndefRHS, ZeroRHS;
3865 if (SimplifyDemandedVectorElts(Op1, DemandedElts, UndefRHS, ZeroRHS, TLO,
3866 Depth + 1))
3867 return true;
3868 APInt UndefLHS, ZeroLHS;
3869 if (SimplifyDemandedVectorElts(Op0, DemandedElts, UndefLHS, ZeroLHS, TLO,
3870 Depth + 1))
3871 return true;
3872
3873 KnownZero = ZeroLHS & ZeroRHS;
3874 KnownUndef = getKnownUndefForVectorBinop(Op, TLO.DAG, UndefLHS, UndefRHS);
3875
3876 // Attempt to avoid multi-use ops if we don't need anything from them.
3877 // TODO - use KnownUndef to relax the demandedelts?
3878 if (!DemandedElts.isAllOnes())
3879 if (SimplifyDemandedVectorEltsBinOp(Op0, Op1))
3880 return true;
3881 break;
3882 }
3883 case ISD::SHL:
3884 case ISD::SRL:
3885 case ISD::SRA:
3886 case ISD::ROTL:
3887 case ISD::ROTR: {
3888 SDValue Op0 = Op.getOperand(0);
3889 SDValue Op1 = Op.getOperand(1);
3890
3891 APInt UndefRHS, ZeroRHS;
3892 if (SimplifyDemandedVectorElts(Op1, DemandedElts, UndefRHS, ZeroRHS, TLO,
3893 Depth + 1))
3894 return true;
3895 APInt UndefLHS, ZeroLHS;
3896 if (SimplifyDemandedVectorElts(Op0, DemandedElts, UndefLHS, ZeroLHS, TLO,
3897 Depth + 1))
3898 return true;
3899
3900 KnownZero = ZeroLHS;
3901 KnownUndef = UndefLHS & UndefRHS; // TODO: use getKnownUndefForVectorBinop?
3902
3903 // Attempt to avoid multi-use ops if we don't need anything from them.
3904 // TODO - use KnownUndef to relax the demandedelts?
3905 if (!DemandedElts.isAllOnes())
3906 if (SimplifyDemandedVectorEltsBinOp(Op0, Op1))
3907 return true;
3908 break;
3909 }
3910 case ISD::MUL:
3911 case ISD::MULHU:
3912 case ISD::MULHS:
3913 case ISD::AND: {
3914 SDValue Op0 = Op.getOperand(0);
3915 SDValue Op1 = Op.getOperand(1);
3916
3917 APInt SrcUndef, SrcZero;
3918 if (SimplifyDemandedVectorElts(Op1, DemandedElts, SrcUndef, SrcZero, TLO,
3919 Depth + 1))
3920 return true;
3921 // FIXME: If we know that a demanded element was zero in Op1 we don't need
3922 // to demand it in Op0 - its guaranteed to be zero. There is however a
3923 // restriction, as we must not make any of the originally demanded elements
3924 // more poisonous. We could reduce amount of elements demanded, but then we
3925 // also need a to inform SimplifyDemandedVectorElts that some elements must
3926 // not be made more poisonous.
3927 if (SimplifyDemandedVectorElts(Op0, DemandedElts, KnownUndef, KnownZero,
3928 TLO, Depth + 1))
3929 return true;
3930
3931 KnownUndef &= DemandedElts;
3932 KnownZero &= DemandedElts;
3933
3934 // If every element pair has a zero/undef/poison then just fold to zero.
3935 // fold (and x, undef/poison) -> 0 / (and x, 0) -> 0
3936 // fold (mul x, undef/poison) -> 0 / (mul x, 0) -> 0
3937 if (DemandedElts.isSubsetOf(SrcZero | KnownZero | SrcUndef | KnownUndef))
3938 return TLO.CombineTo(Op, TLO.DAG.getConstant(0, SDLoc(Op), VT));
3939
3940 // If either side has a zero element, then the result element is zero, even
3941 // if the other is an UNDEF.
3942 // TODO: Extend getKnownUndefForVectorBinop to also deal with known zeros
3943 // and then handle 'and' nodes with the rest of the binop opcodes.
3944 KnownZero |= SrcZero;
3945 KnownUndef &= SrcUndef;
3946 KnownUndef &= ~KnownZero;
3947
3948 // Attempt to avoid multi-use ops if we don't need anything from them.
3949 if (!DemandedElts.isAllOnes())
3950 if (SimplifyDemandedVectorEltsBinOp(Op0, Op1))
3951 return true;
3952 break;
3953 }
3954 case ISD::TRUNCATE:
3955 case ISD::SIGN_EXTEND:
3956 case ISD::ZERO_EXTEND:
3957 if (SimplifyDemandedVectorElts(Op.getOperand(0), DemandedElts, KnownUndef,
3958 KnownZero, TLO, Depth + 1))
3959 return true;
3960
3961 if (!DemandedElts.isAllOnes())
3963 Op.getOperand(0), DemandedElts, TLO.DAG, Depth + 1))
3964 return TLO.CombineTo(Op, TLO.DAG.getNode(Opcode, SDLoc(Op), VT, NewOp));
3965
3966 if (Op.getOpcode() == ISD::ZERO_EXTEND) {
3967 // zext(undef) upper bits are guaranteed to be zero.
3968 if (DemandedElts.isSubsetOf(KnownUndef))
3969 return TLO.CombineTo(Op, TLO.DAG.getConstant(0, SDLoc(Op), VT));
3970 KnownUndef.clearAllBits();
3971 }
3972 break;
3973 case ISD::SINT_TO_FP:
3974 case ISD::UINT_TO_FP:
3975 case ISD::FP_TO_SINT:
3976 case ISD::FP_TO_UINT:
3977 if (SimplifyDemandedVectorElts(Op.getOperand(0), DemandedElts, KnownUndef,
3978 KnownZero, TLO, Depth + 1))
3979 return true;
3980 // Don't fall through to generic undef -> undef handling.
3981 return false;
3982 default: {
3983 if (Op.getOpcode() >= ISD::BUILTIN_OP_END) {
3984 if (SimplifyDemandedVectorEltsForTargetNode(Op, DemandedElts, KnownUndef,
3985 KnownZero, TLO, Depth))
3986 return true;
3987 } else {
3989 APInt DemandedBits = APInt::getAllOnes(EltSizeInBits);
3990 if (SimplifyDemandedBits(Op, DemandedBits, OriginalDemandedElts, Known,
3991 TLO, Depth, AssumeSingleUse))
3992 return true;
3993 }
3994 break;
3995 }
3996 }
3997
3998 assert((KnownUndef & KnownZero) == 0 && "Elements flagged as undef AND zero");
3999
4000 // Constant fold all undef cases.
4001 // TODO: Handle zero cases as well.
4002 if (DemandedElts.isSubsetOf(KnownUndef))
4003 return TLO.CombineTo(Op, TLO.DAG.getUNDEF(VT));
4004
4005 return false;
4006}
4007
4008/// Determine which of the bits specified in Mask are known to be either zero or
4009/// one and return them in the Known.
4012 const APInt &DemandedElts,
4013 const SelectionDAG &DAG,
4014 unsigned Depth) const {
4015 assert((Op.getOpcode() >= ISD::BUILTIN_OP_END ||
4016 Op.getOpcode() == ISD::INTRINSIC_WO_CHAIN ||
4017 Op.getOpcode() == ISD::INTRINSIC_W_CHAIN ||
4018 Op.getOpcode() == ISD::INTRINSIC_VOID) &&
4019 "Should use MaskedValueIsZero if you don't know whether Op"
4020 " is a target node!");
4021 Known.resetAll();
4022}
4023
4026 const APInt &DemandedElts, const MachineRegisterInfo &MRI,
4027 unsigned Depth) const {
4028 Known.resetAll();
4029}
4030
4033 const APInt &DemandedElts, const MachineRegisterInfo &MRI,
4034 unsigned Depth) const {
4035 Known.resetAll();
4036}
4037
4039 KnownBits &Known, const MachineFunction &, Align Alignment) const {
4040 // The low bits are known zero if the pointer is aligned.
4041 Known.Zero.setLowBits(Log2(Alignment));
4042}
4043
4045 SelectionDAG &DAG,
4046 const SDLoc &DL,
4047 Align Alignment) const {
4048 // Materialize leading-zero stack object pointer facts as AssertZext.
4049 // Alignment-derived low zero bits are not represented on the returned DAG
4050 // value here.
4051 EVT PtrVT = Ptr.getValueType();
4052
4053 unsigned RegSize = PtrVT.getScalarSizeInBits();
4056 Alignment);
4057
4058 unsigned NumZeroBits = Known.countMinLeadingZeros();
4059 if (!NumZeroBits)
4060 return Ptr;
4061
4062 EVT FromVT = EVT::getIntegerVT(*DAG.getContext(), RegSize - NumZeroBits);
4063 return DAG.getNode(ISD::AssertZext, DL, PtrVT, Ptr, DAG.getValueType(FromVT));
4064}
4065
4071
4072/// This method can be implemented by targets that want to expose additional
4073/// information about sign bits to the DAG Combiner.
4075 const APInt &,
4076 const SelectionDAG &,
4077 unsigned Depth) const {
4078 assert((Op.getOpcode() >= ISD::BUILTIN_OP_END ||
4079 Op.getOpcode() == ISD::INTRINSIC_WO_CHAIN ||
4080 Op.getOpcode() == ISD::INTRINSIC_W_CHAIN ||
4081 Op.getOpcode() == ISD::INTRINSIC_VOID) &&
4082 "Should use ComputeNumSignBits if you don't know whether Op"
4083 " is a target node!");
4084 return 1;
4085}
4086
4088 GISelValueTracking &Analysis, Register R, const APInt &DemandedElts,
4089 const MachineRegisterInfo &MRI, unsigned Depth) const {
4090 return 1;
4091}
4092
4094 SDValue Op, const APInt &DemandedElts, APInt &KnownUndef, APInt &KnownZero,
4095 TargetLoweringOpt &TLO, unsigned Depth) const {
4096 assert((Op.getOpcode() >= ISD::BUILTIN_OP_END ||
4097 Op.getOpcode() == ISD::INTRINSIC_WO_CHAIN ||
4098 Op.getOpcode() == ISD::INTRINSIC_W_CHAIN ||
4099 Op.getOpcode() == ISD::INTRINSIC_VOID) &&
4100 "Should use SimplifyDemandedVectorElts if you don't know whether Op"
4101 " is a target node!");
4102 return false;
4103}
4104
4106 SDValue Op, const APInt &DemandedBits, const APInt &DemandedElts,
4107 KnownBits &Known, TargetLoweringOpt &TLO, unsigned Depth) const {
4108 assert((Op.getOpcode() >= ISD::BUILTIN_OP_END ||
4109 Op.getOpcode() == ISD::INTRINSIC_WO_CHAIN ||
4110 Op.getOpcode() == ISD::INTRINSIC_W_CHAIN ||
4111 Op.getOpcode() == ISD::INTRINSIC_VOID) &&
4112 "Should use SimplifyDemandedBits if you don't know whether Op"
4113 " is a target node!");
4114 computeKnownBitsForTargetNode(Op, Known, DemandedElts, TLO.DAG, Depth);
4115 return false;
4116}
4117
4119 SDValue Op, const APInt &DemandedBits, const APInt &DemandedElts,
4120 SelectionDAG &DAG, unsigned Depth) const {
4121 assert(
4122 (Op.getOpcode() >= ISD::BUILTIN_OP_END ||
4123 Op.getOpcode() == ISD::INTRINSIC_WO_CHAIN ||
4124 Op.getOpcode() == ISD::INTRINSIC_W_CHAIN ||
4125 Op.getOpcode() == ISD::INTRINSIC_VOID) &&
4126 "Should use SimplifyMultipleUseDemandedBits if you don't know whether Op"
4127 " is a target node!");
4128 return SDValue();
4129}
4130
4131SDValue
4134 SelectionDAG &DAG) const {
4135 bool LegalMask = isShuffleMaskLegal(Mask, VT);
4136 if (!LegalMask) {
4137 std::swap(N0, N1);
4139 LegalMask = isShuffleMaskLegal(Mask, VT);
4140 }
4141
4142 if (!LegalMask)
4143 return SDValue();
4144
4145 return DAG.getVectorShuffle(VT, DL, N0, N1, Mask);
4146}
4147
4149 return nullptr;
4150}
4151
4153 SDValue Op, const APInt &DemandedElts, const SelectionDAG &DAG,
4154 UndefPoisonKind Kind, unsigned Depth) const {
4155 assert(
4156 (Op.getOpcode() >= ISD::BUILTIN_OP_END ||
4157 Op.getOpcode() == ISD::INTRINSIC_WO_CHAIN ||
4158 Op.getOpcode() == ISD::INTRINSIC_W_CHAIN ||
4159 Op.getOpcode() == ISD::INTRINSIC_VOID) &&
4160 "Should use isGuaranteedNotToBeUndefOrPoison if you don't know whether Op"
4161 " is a target node!");
4162
4163 // If Op can't create undef/poison and none of its operands are undef/poison
4164 // then Op is never undef/poison.
4165 return !canCreateUndefOrPoisonForTargetNode(Op, DemandedElts, DAG, Kind,
4166 /*ConsiderFlags*/ true, Depth) &&
4167 all_of(Op->ops(), [&](SDValue V) {
4168 return DAG.isGuaranteedNotToBeUndefOrPoison(V, Kind, Depth + 1);
4169 });
4170}
4171
4173 SDValue Op, const APInt &DemandedElts, const SelectionDAG &DAG,
4174 UndefPoisonKind Kind, bool ConsiderFlags, unsigned Depth) const {
4175 assert((Op.getOpcode() >= ISD::BUILTIN_OP_END ||
4176 Op.getOpcode() == ISD::INTRINSIC_WO_CHAIN ||
4177 Op.getOpcode() == ISD::INTRINSIC_W_CHAIN ||
4178 Op.getOpcode() == ISD::INTRINSIC_VOID) &&
4179 "Should use canCreateUndefOrPoison if you don't know whether Op"
4180 " is a target node!");
4181 // Be conservative and return true.
4182 return true;
4183}
4184
4187 const APInt &DemandedElts,
4188 const SelectionDAG &DAG,
4189 unsigned Depth) const {
4190 assert((Op.getOpcode() >= ISD::BUILTIN_OP_END ||
4191 Op.getOpcode() == ISD::INTRINSIC_WO_CHAIN ||
4192 Op.getOpcode() == ISD::INTRINSIC_W_CHAIN ||
4193 Op.getOpcode() == ISD::INTRINSIC_VOID) &&
4194 "Should use computeKnownFPClass if you don't know whether Op"
4195 " is a target node!");
4196}
4197
4199 const APInt &DemandedElts,
4200 const SelectionDAG &DAG,
4201 bool SNaN,
4202 unsigned Depth) const {
4203 assert((Op.getOpcode() >= ISD::BUILTIN_OP_END ||
4204 Op.getOpcode() == ISD::INTRINSIC_WO_CHAIN ||
4205 Op.getOpcode() == ISD::INTRINSIC_W_CHAIN ||
4206 Op.getOpcode() == ISD::INTRINSIC_VOID) &&
4207 "Should use isKnownNeverNaN if you don't know whether Op"
4208 " is a target node!");
4209 return false;
4210}
4211
4213 const APInt &DemandedElts,
4214 APInt &UndefElts,
4215 const SelectionDAG &DAG,
4216 unsigned Depth) const {
4217 assert((Op.getOpcode() >= ISD::BUILTIN_OP_END ||
4218 Op.getOpcode() == ISD::INTRINSIC_WO_CHAIN ||
4219 Op.getOpcode() == ISD::INTRINSIC_W_CHAIN ||
4220 Op.getOpcode() == ISD::INTRINSIC_VOID) &&
4221 "Should use isSplatValue if you don't know whether Op"
4222 " is a target node!");
4223 return false;
4224}
4225
4226// FIXME: Ideally, this would use ISD::isConstantSplatVector(), but that must
4227// work with truncating build vectors and vectors with elements of less than
4228// 8 bits.
4230 if (!N)
4231 return false;
4232
4233 unsigned EltWidth;
4234 APInt CVal;
4235 if (ConstantSDNode *CN = isConstOrConstSplat(N, /*AllowUndefs=*/false,
4236 /*AllowTruncation=*/true)) {
4237 CVal = CN->getAPIntValue();
4238 EltWidth = N.getValueType().getScalarSizeInBits();
4239 } else
4240 return false;
4241
4242 // If this is a truncating splat, truncate the splat value.
4243 // Otherwise, we may fail to match the expected values below.
4244 if (EltWidth < CVal.getBitWidth())
4245 CVal = CVal.trunc(EltWidth);
4246
4247 switch (getBooleanContents(N.getValueType())) {
4249 return CVal[0];
4251 return CVal.isOne();
4253 return CVal.isAllOnes();
4254 }
4255
4256 llvm_unreachable("Invalid boolean contents");
4257}
4258
4260 if (!N)
4261 return false;
4262
4264 if (!CN) {
4266 if (!BV)
4267 return false;
4268
4269 // Only interested in constant splats, we don't care about undef
4270 // elements in identifying boolean constants and getConstantSplatNode
4271 // returns NULL if all ops are undef;
4272 CN = BV->getConstantSplatNode();
4273 if (!CN)
4274 return false;
4275 }
4276
4277 if (getBooleanContents(N->getValueType(0)) == UndefinedBooleanContent)
4278 return !CN->getAPIntValue()[0];
4279
4280 return CN->isZero();
4281}
4282
4284 bool SExt) const {
4285 if (VT == MVT::i1)
4286 return N->isOne();
4287
4289 switch (Cnt) {
4291 // An extended value of 1 is always true, unless its original type is i1,
4292 // in which case it will be sign extended to -1.
4293 return (N->isOne() && !SExt) || (SExt && (N->getValueType(0) != MVT::i1));
4296 return N->isAllOnes() && SExt;
4297 }
4298 llvm_unreachable("Unexpected enumeration.");
4299}
4300
4301/// This helper function of SimplifySetCC tries to optimize the comparison when
4302/// either operand of the SetCC node is a bitwise-and instruction.
4303SDValue TargetLowering::foldSetCCWithAnd(EVT VT, SDValue N0, SDValue N1,
4304 ISD::CondCode Cond, const SDLoc &DL,
4305 DAGCombinerInfo &DCI) const {
4306 if (N1.getOpcode() == ISD::AND && N0.getOpcode() != ISD::AND)
4307 std::swap(N0, N1);
4308
4309 SelectionDAG &DAG = DCI.DAG;
4310 EVT OpVT = N0.getValueType();
4311 if (N0.getOpcode() != ISD::AND || !OpVT.isInteger() ||
4312 (Cond != ISD::SETEQ && Cond != ISD::SETNE))
4313 return SDValue();
4314
4315 // (X & Y) != 0 --> zextOrTrunc(X & Y)
4316 // iff everything but LSB is known zero:
4317 if (Cond == ISD::SETNE && isNullConstant(N1) &&
4320 unsigned NumEltBits = OpVT.getScalarSizeInBits();
4321 APInt UpperBits = APInt::getHighBitsSet(NumEltBits, NumEltBits - 1);
4322 if (DAG.MaskedValueIsZero(N0, UpperBits))
4323 return DAG.getBoolExtOrTrunc(N0, DL, VT, OpVT);
4324 }
4325
4326 // Try to eliminate a power-of-2 mask constant by converting to a signbit
4327 // test in a narrow type that we can truncate to with no cost. Examples:
4328 // (i32 X & 32768) == 0 --> (trunc X to i16) >= 0
4329 // (i32 X & 32768) != 0 --> (trunc X to i16) < 0
4330 // TODO: This conservatively checks for type legality on the source and
4331 // destination types. That may inhibit optimizations, but it also
4332 // allows setcc->shift transforms that may be more beneficial.
4333 auto *AndC = dyn_cast<ConstantSDNode>(N0.getOperand(1));
4334 if (AndC && isNullConstant(N1) && AndC->getAPIntValue().isPowerOf2() &&
4335 isTypeLegal(OpVT) && N0.hasOneUse()) {
4336 EVT NarrowVT = EVT::getIntegerVT(*DAG.getContext(),
4337 AndC->getAPIntValue().getActiveBits());
4338 if (isTruncateFree(OpVT, NarrowVT) && isTypeLegal(NarrowVT)) {
4339 SDValue Trunc = DAG.getZExtOrTrunc(N0.getOperand(0), DL, NarrowVT);
4340 SDValue Zero = DAG.getConstant(0, DL, NarrowVT);
4341 return DAG.getSetCC(DL, VT, Trunc, Zero,
4343 }
4344 }
4345
4346 // Match these patterns in any of their permutations:
4347 // (X & Y) == Y
4348 // (X & Y) != Y
4349 SDValue X, Y;
4350 if (N0.getOperand(0) == N1) {
4351 X = N0.getOperand(1);
4352 Y = N0.getOperand(0);
4353 } else if (N0.getOperand(1) == N1) {
4354 X = N0.getOperand(0);
4355 Y = N0.getOperand(1);
4356 } else {
4357 return SDValue();
4358 }
4359
4360 // TODO: We should invert (X & Y) eq/ne 0 -> (X & Y) ne/eq Y if
4361 // `isXAndYEqZeroPreferableToXAndYEqY` is false. This is a bit difficult as
4362 // its liable to create and infinite loop.
4363 SDValue Zero = DAG.getConstant(0, DL, OpVT);
4364 if (isXAndYEqZeroPreferableToXAndYEqY(Cond, OpVT) &&
4366 // Simplify X & Y == Y to X & Y != 0 if Y has exactly one bit set.
4367 // Note that where Y is variable and is known to have at most one bit set
4368 // (for example, if it is Z & 1) we cannot do this; the expressions are not
4369 // equivalent when Y == 0.
4370 assert(OpVT.isInteger());
4372 if (DCI.isBeforeLegalizeOps() ||
4374 return DAG.getSetCC(DL, VT, N0, Zero, Cond);
4375 } else if (N0.hasOneUse() && hasAndNotCompare(Y)) {
4376 // If the target supports an 'and-not' or 'and-complement' logic operation,
4377 // try to use that to make a comparison operation more efficient.
4378 // But don't do this transform if the mask is a single bit because there are
4379 // more efficient ways to deal with that case (for example, 'bt' on x86 or
4380 // 'rlwinm' on PPC).
4381
4382 // Bail out if the compare operand that we want to turn into a zero is
4383 // already a zero (otherwise, infinite loop).
4384 if (isNullConstant(Y))
4385 return SDValue();
4386
4387 // Transform this into: ~X & Y == 0.
4388 SDValue NotX = DAG.getNOT(SDLoc(X), X, OpVT);
4389 SDValue NewAnd = DAG.getNode(ISD::AND, SDLoc(N0), OpVT, NotX, Y);
4390 return DAG.getSetCC(DL, VT, NewAnd, Zero, Cond);
4391 }
4392
4393 return SDValue();
4394}
4395
4396/// This helper function of SimplifySetCC tries to optimize the comparison when
4397/// either operand of the SetCC node is a bitwise-or instruction.
4398/// For now, this just transforms (X | Y) ==/!= Y into X & ~Y ==/!= 0.
4399SDValue TargetLowering::foldSetCCWithOr(EVT VT, SDValue N0, SDValue N1,
4400 ISD::CondCode Cond, const SDLoc &DL,
4401 DAGCombinerInfo &DCI) const {
4402 if (N1.getOpcode() == ISD::OR && N0.getOpcode() != ISD::OR)
4403 std::swap(N0, N1);
4404
4405 SelectionDAG &DAG = DCI.DAG;
4406 EVT OpVT = N0.getValueType();
4407 if (!N0.hasOneUse() || !OpVT.isInteger() ||
4408 (Cond != ISD::SETEQ && Cond != ISD::SETNE))
4409 return SDValue();
4410
4411 // (X | Y) == Y
4412 // (X | Y) != Y
4413 SDValue X;
4414 if (sd_match(N0, m_Or(m_Value(X), m_Specific(N1))) && hasAndNotCompare(X)) {
4415 // If the target supports an 'and-not' or 'and-complement' logic operation,
4416 // try to use that to make a comparison operation more efficient.
4417
4418 // Bail out if the compare operand that we want to turn into a zero is
4419 // already a zero (otherwise, infinite loop).
4420 if (isNullConstant(N1))
4421 return SDValue();
4422
4423 // Transform this into: X & ~Y ==/!= 0.
4424 SDValue NotY = DAG.getNOT(SDLoc(N1), N1, OpVT);
4425 SDValue NewAnd = DAG.getNode(ISD::AND, SDLoc(N0), OpVT, X, NotY);
4426 return DAG.getSetCC(DL, VT, NewAnd, DAG.getConstant(0, DL, OpVT), Cond);
4427 }
4428
4429 return SDValue();
4430}
4431
4432/// There are multiple IR patterns that could be checking whether certain
4433/// truncation of a signed number would be lossy or not. The pattern which is
4434/// best at IR level, may not lower optimally. Thus, we want to unfold it.
4435/// We are looking for the following pattern: (KeptBits is a constant)
4436/// (add %x, (1 << (KeptBits-1))) srccond (1 << KeptBits)
4437/// KeptBits won't be bitwidth(x), that will be constant-folded to true/false.
4438/// KeptBits also can't be 1, that would have been folded to %x dstcond 0
4439/// We will unfold it into the natural trunc+sext pattern:
4440/// ((%x << C) a>> C) dstcond %x
4441/// Where C = bitwidth(x) - KeptBits and C u< bitwidth(x)
4442SDValue TargetLowering::optimizeSetCCOfSignedTruncationCheck(
4443 EVT SCCVT, SDValue N0, SDValue N1, ISD::CondCode Cond, DAGCombinerInfo &DCI,
4444 const SDLoc &DL) const {
4445 // We must be comparing with a constant.
4446 ConstantSDNode *C1;
4447 if (!(C1 = dyn_cast<ConstantSDNode>(N1)))
4448 return SDValue();
4449
4450 // N0 should be: add %x, (1 << (KeptBits-1))
4451 if (N0->getOpcode() != ISD::ADD)
4452 return SDValue();
4453
4454 // And we must be 'add'ing a constant.
4455 ConstantSDNode *C01;
4456 if (!(C01 = dyn_cast<ConstantSDNode>(N0->getOperand(1))))
4457 return SDValue();
4458
4459 SDValue X = N0->getOperand(0);
4460 EVT XVT = X.getValueType();
4461
4462 // Validate constants ...
4463
4464 APInt I1 = C1->getAPIntValue();
4465
4466 ISD::CondCode NewCond;
4467 if (Cond == ISD::CondCode::SETULT) {
4468 NewCond = ISD::CondCode::SETEQ;
4469 } else if (Cond == ISD::CondCode::SETULE) {
4470 NewCond = ISD::CondCode::SETEQ;
4471 // But need to 'canonicalize' the constant.
4472 I1 += 1;
4473 } else if (Cond == ISD::CondCode::SETUGT) {
4474 NewCond = ISD::CondCode::SETNE;
4475 // But need to 'canonicalize' the constant.
4476 I1 += 1;
4477 } else if (Cond == ISD::CondCode::SETUGE) {
4478 NewCond = ISD::CondCode::SETNE;
4479 } else
4480 return SDValue();
4481
4482 APInt I01 = C01->getAPIntValue();
4483
4484 auto checkConstants = [&I1, &I01]() -> bool {
4485 // Both of them must be power-of-two, and the constant from setcc is bigger.
4486 return I1.ugt(I01) && I1.isPowerOf2() && I01.isPowerOf2();
4487 };
4488
4489 if (checkConstants()) {
4490 // Great, e.g. got icmp ult i16 (add i16 %x, 128), 256
4491 } else {
4492 // What if we invert constants? (and the target predicate)
4493 I1.negate();
4494 I01.negate();
4495 assert(XVT.isInteger());
4496 NewCond = getSetCCInverse(NewCond, XVT);
4497 if (!checkConstants())
4498 return SDValue();
4499 // Great, e.g. got icmp uge i16 (add i16 %x, -128), -256
4500 }
4501
4502 // They are power-of-two, so which bit is set?
4503 const unsigned KeptBits = I1.logBase2();
4504 const unsigned KeptBitsMinusOne = I01.logBase2();
4505
4506 // Magic!
4507 if (KeptBits != (KeptBitsMinusOne + 1))
4508 return SDValue();
4509 assert(KeptBits > 0 && KeptBits < XVT.getSizeInBits() && "unreachable");
4510
4511 // We don't want to do this in every single case.
4512 SelectionDAG &DAG = DCI.DAG;
4513 if (!shouldTransformSignedTruncationCheck(XVT, KeptBits))
4514 return SDValue();
4515
4516 // Unfold into: sext_inreg(%x) cond %x
4517 // Where 'cond' will be either 'eq' or 'ne'.
4518 SDValue SExtInReg = DAG.getNode(
4520 DAG.getValueType(EVT::getIntegerVT(*DAG.getContext(), KeptBits)));
4521 return DAG.getSetCC(DL, SCCVT, SExtInReg, X, NewCond);
4522}
4523
4524// (X & (C l>>/<< Y)) ==/!= 0 --> ((X <</l>> Y) & C) ==/!= 0
4525SDValue TargetLowering::optimizeSetCCByHoistingAndByConstFromLogicalShift(
4526 EVT SCCVT, SDValue N0, SDValue N1C, ISD::CondCode Cond,
4527 DAGCombinerInfo &DCI, const SDLoc &DL) const {
4529 "Should be a comparison with 0.");
4530 assert((Cond == ISD::SETEQ || Cond == ISD::SETNE) &&
4531 "Valid only for [in]equality comparisons.");
4532
4533 unsigned NewShiftOpcode;
4534 SDValue X, C, Y;
4535
4536 SelectionDAG &DAG = DCI.DAG;
4537
4538 // Look for '(C l>>/<< Y)'.
4539 auto Match = [&NewShiftOpcode, &X, &C, &Y, &DAG, this](SDValue V) {
4540 // The shift should be one-use.
4541 if (!V.hasOneUse())
4542 return false;
4543 unsigned OldShiftOpcode = V.getOpcode();
4544 switch (OldShiftOpcode) {
4545 case ISD::SHL:
4546 NewShiftOpcode = ISD::SRL;
4547 break;
4548 case ISD::SRL:
4549 NewShiftOpcode = ISD::SHL;
4550 break;
4551 default:
4552 return false; // must be a logical shift.
4553 }
4554 // We should be shifting a constant.
4555 // FIXME: best to use isConstantOrConstantVector().
4556 C = V.getOperand(0);
4557 ConstantSDNode *CC =
4558 isConstOrConstSplat(C, /*AllowUndefs=*/true, /*AllowTruncation=*/true);
4559 if (!CC)
4560 return false;
4561 Y = V.getOperand(1);
4562
4563 ConstantSDNode *XC =
4564 isConstOrConstSplat(X, /*AllowUndefs=*/true, /*AllowTruncation=*/true);
4566 X, XC, CC, Y, OldShiftOpcode, NewShiftOpcode, DAG);
4567 };
4568
4569 // LHS of comparison should be an one-use 'and'.
4570 if (N0.getOpcode() != ISD::AND || !N0.hasOneUse())
4571 return SDValue();
4572
4573 X = N0.getOperand(0);
4574 SDValue Mask = N0.getOperand(1);
4575
4576 // 'and' is commutative!
4577 if (!Match(Mask)) {
4578 std::swap(X, Mask);
4579 if (!Match(Mask))
4580 return SDValue();
4581 }
4582
4583 EVT VT = X.getValueType();
4584
4585 // Produce:
4586 // ((X 'OppositeShiftOpcode' Y) & C) Cond 0
4587 SDValue T0 = DAG.getNode(NewShiftOpcode, DL, VT, X, Y);
4588 SDValue T1 = DAG.getNode(ISD::AND, DL, VT, T0, C);
4589 SDValue T2 = DAG.getSetCC(DL, SCCVT, T1, N1C, Cond);
4590 return T2;
4591}
4592
4593/// Try to fold an equality comparison with a {add/sub/xor} binary operation as
4594/// the 1st operand (N0). Callers are expected to swap the N0/N1 parameters to
4595/// handle the commuted versions of these patterns.
4596SDValue TargetLowering::foldSetCCWithBinOp(EVT VT, SDValue N0, SDValue N1,
4597 ISD::CondCode Cond, const SDLoc &DL,
4598 DAGCombinerInfo &DCI) const {
4599 unsigned BOpcode = N0.getOpcode();
4600 assert((BOpcode == ISD::ADD || BOpcode == ISD::SUB || BOpcode == ISD::XOR) &&
4601 "Unexpected binop");
4602 assert((Cond == ISD::SETEQ || Cond == ISD::SETNE) && "Unexpected condcode");
4603
4604 // (X + Y) == X --> Y == 0
4605 // (X - Y) == X --> Y == 0
4606 // (X ^ Y) == X --> Y == 0
4607 SelectionDAG &DAG = DCI.DAG;
4608 EVT OpVT = N0.getValueType();
4609 SDValue X = N0.getOperand(0);
4610 SDValue Y = N0.getOperand(1);
4611 if (X == N1)
4612 return DAG.getSetCC(DL, VT, Y, DAG.getConstant(0, DL, OpVT), Cond);
4613
4614 if (Y != N1)
4615 return SDValue();
4616
4617 // (X + Y) == Y --> X == 0
4618 // (X ^ Y) == Y --> X == 0
4619 if (BOpcode == ISD::ADD || BOpcode == ISD::XOR)
4620 return DAG.getSetCC(DL, VT, X, DAG.getConstant(0, DL, OpVT), Cond);
4621
4622 // The shift would not be valid if the operands are boolean (i1).
4623 if (!N0.hasOneUse() || OpVT.getScalarSizeInBits() == 1)
4624 return SDValue();
4625
4626 // (X - Y) == Y --> X == Y << 1
4627 SDValue One = DAG.getShiftAmountConstant(1, OpVT, DL);
4628 SDValue YShl1 = DAG.getNode(ISD::SHL, DL, N1.getValueType(), Y, One);
4629 if (!DCI.isCalledByLegalizer())
4630 DCI.AddToWorklist(YShl1.getNode());
4631 return DAG.getSetCC(DL, VT, X, YShl1, Cond);
4632}
4633
4635 SDValue N0, const APInt &C1,
4636 ISD::CondCode Cond, const SDLoc &dl,
4637 SelectionDAG &DAG) {
4638 // Look through truncs that don't change the value of a ctpop.
4639 // FIXME: Add vector support? Need to be careful with setcc result type below.
4640 SDValue CTPOP = N0;
4641 if (N0.getOpcode() == ISD::TRUNCATE && N0.hasOneUse() && !VT.isVector() &&
4643 CTPOP = N0.getOperand(0);
4644
4645 if (CTPOP.getOpcode() != ISD::CTPOP || !CTPOP.hasOneUse())
4646 return SDValue();
4647
4648 EVT CTVT = CTPOP.getValueType();
4649 SDValue CTOp = CTPOP.getOperand(0);
4650
4651 // Expand a power-of-2-or-zero comparison based on ctpop:
4652 // (ctpop x) u< 2 -> (x & x-1) == 0
4653 // (ctpop x) u> 1 -> (x & x-1) != 0
4654 if (Cond == ISD::SETULT || Cond == ISD::SETUGT) {
4655 // Keep the CTPOP if it is a cheap vector op.
4656 if (CTVT.isVector() && TLI.isCtpopFast(CTVT))
4657 return SDValue();
4658
4659 unsigned CostLimit = TLI.getCustomCtpopCost(CTVT, Cond);
4660 if (C1.ugt(CostLimit + (Cond == ISD::SETULT)))
4661 return SDValue();
4662 if (C1 == 0 && (Cond == ISD::SETULT))
4663 return SDValue(); // This is handled elsewhere.
4664
4665 unsigned Passes = C1.getLimitedValue() - (Cond == ISD::SETULT);
4666
4667 SDValue NegOne = DAG.getAllOnesConstant(dl, CTVT);
4668 SDValue Result = CTOp;
4669 for (unsigned i = 0; i < Passes; i++) {
4670 SDValue Add = DAG.getNode(ISD::ADD, dl, CTVT, Result, NegOne);
4671 Result = DAG.getNode(ISD::AND, dl, CTVT, Result, Add);
4672 }
4674 return DAG.getSetCC(dl, VT, Result, DAG.getConstant(0, dl, CTVT), CC);
4675 }
4676
4677 // Expand a power-of-2 comparison based on ctpop
4678 if ((Cond == ISD::SETEQ || Cond == ISD::SETNE) && C1 == 1) {
4679 // Keep the CTPOP if it is cheap.
4680 if (TLI.isCtpopFast(CTVT))
4681 return SDValue();
4682
4683 SDValue Zero = DAG.getConstant(0, dl, CTVT);
4684 SDValue NegOne = DAG.getAllOnesConstant(dl, CTVT);
4685 assert(CTVT.isInteger());
4686 SDValue Add = DAG.getNode(ISD::ADD, dl, CTVT, CTOp, NegOne);
4687
4688 // Its not uncommon for known-never-zero X to exist in (ctpop X) eq/ne 1, so
4689 // check before emitting a potentially unnecessary op.
4690 if (DAG.isKnownNeverZero(CTOp)) {
4691 // (ctpop x) == 1 --> (x & x-1) == 0
4692 // (ctpop x) != 1 --> (x & x-1) != 0
4693 SDValue And = DAG.getNode(ISD::AND, dl, CTVT, CTOp, Add);
4694 SDValue RHS = DAG.getSetCC(dl, VT, And, Zero, Cond);
4695 return RHS;
4696 }
4697
4698 // (ctpop x) == 1 --> (x ^ x-1) > x-1
4699 // (ctpop x) != 1 --> (x ^ x-1) <= x-1
4700 SDValue Xor = DAG.getNode(ISD::XOR, dl, CTVT, CTOp, Add);
4702 return DAG.getSetCC(dl, VT, Xor, Add, CmpCond);
4703 }
4704
4705 return SDValue();
4706}
4707
4709 ISD::CondCode Cond, const SDLoc &dl,
4710 SelectionDAG &DAG) {
4711 if (Cond != ISD::SETEQ && Cond != ISD::SETNE)
4712 return SDValue();
4713
4714 auto *C1 = isConstOrConstSplat(N1, /* AllowUndefs */ true);
4715 if (!C1 || !(C1->isZero() || C1->isAllOnes()))
4716 return SDValue();
4717
4718 auto getRotateSource = [](SDValue X) {
4719 if (X.getOpcode() == ISD::ROTL || X.getOpcode() == ISD::ROTR)
4720 return X.getOperand(0);
4721 return SDValue();
4722 };
4723
4724 // Peek through a rotated value compared against 0 or -1:
4725 // (rot X, Y) == 0/-1 --> X == 0/-1
4726 // (rot X, Y) != 0/-1 --> X != 0/-1
4727 if (SDValue R = getRotateSource(N0))
4728 return DAG.getSetCC(dl, VT, R, N1, Cond);
4729
4730 // Peek through an 'or' of a rotated value compared against 0:
4731 // or (rot X, Y), Z ==/!= 0 --> (or X, Z) ==/!= 0
4732 // or Z, (rot X, Y) ==/!= 0 --> (or X, Z) ==/!= 0
4733 //
4734 // TODO: Add the 'and' with -1 sibling.
4735 // TODO: Recurse through a series of 'or' ops to find the rotate.
4736 EVT OpVT = N0.getValueType();
4737 if (N0.hasOneUse() && N0.getOpcode() == ISD::OR && C1->isZero()) {
4738 if (SDValue R = getRotateSource(N0.getOperand(0))) {
4739 SDValue NewOr = DAG.getNode(ISD::OR, dl, OpVT, R, N0.getOperand(1));
4740 return DAG.getSetCC(dl, VT, NewOr, N1, Cond);
4741 }
4742 if (SDValue R = getRotateSource(N0.getOperand(1))) {
4743 SDValue NewOr = DAG.getNode(ISD::OR, dl, OpVT, R, N0.getOperand(0));
4744 return DAG.getSetCC(dl, VT, NewOr, N1, Cond);
4745 }
4746 }
4747
4748 return SDValue();
4749}
4750
4752 ISD::CondCode Cond, const SDLoc &dl,
4753 SelectionDAG &DAG) {
4754 // If we are testing for all-bits-clear, we might be able to do that with
4755 // less shifting since bit-order does not matter.
4756 if (Cond != ISD::SETEQ && Cond != ISD::SETNE)
4757 return SDValue();
4758
4759 auto *C1 = isConstOrConstSplat(N1, /* AllowUndefs */ true);
4760 if (!C1 || !C1->isZero())
4761 return SDValue();
4762
4763 if (!N0.hasOneUse() ||
4764 (N0.getOpcode() != ISD::FSHL && N0.getOpcode() != ISD::FSHR))
4765 return SDValue();
4766
4767 unsigned BitWidth = N0.getScalarValueSizeInBits();
4768 auto *ShAmtC = isConstOrConstSplat(N0.getOperand(2));
4769 if (!ShAmtC)
4770 return SDValue();
4771
4772 uint64_t ShAmt = ShAmtC->getAPIntValue().urem(BitWidth);
4773 if (ShAmt == 0)
4774 return SDValue();
4775
4776 // Canonicalize fshr as fshl to reduce pattern-matching.
4777 if (N0.getOpcode() == ISD::FSHR)
4778 ShAmt = BitWidth - ShAmt;
4779
4780 // Match an 'or' with a specific operand 'Other' in either commuted variant.
4781 SDValue X, Y;
4782 auto matchOr = [&X, &Y](SDValue Or, SDValue Other) {
4783 if (Or.getOpcode() != ISD::OR || !Or.hasOneUse())
4784 return false;
4785 if (Or.getOperand(0) == Other) {
4786 X = Or.getOperand(0);
4787 Y = Or.getOperand(1);
4788 return true;
4789 }
4790 if (Or.getOperand(1) == Other) {
4791 X = Or.getOperand(1);
4792 Y = Or.getOperand(0);
4793 return true;
4794 }
4795 return false;
4796 };
4797
4798 EVT OpVT = N0.getValueType();
4799 EVT ShAmtVT = N0.getOperand(2).getValueType();
4800 SDValue F0 = N0.getOperand(0);
4801 SDValue F1 = N0.getOperand(1);
4802 if (matchOr(F0, F1)) {
4803 // fshl (or X, Y), X, C ==/!= 0 --> or (shl Y, C), X ==/!= 0
4804 SDValue NewShAmt = DAG.getConstant(ShAmt, dl, ShAmtVT);
4805 SDValue Shift = DAG.getNode(ISD::SHL, dl, OpVT, Y, NewShAmt);
4806 SDValue NewOr = DAG.getNode(ISD::OR, dl, OpVT, Shift, X);
4807 return DAG.getSetCC(dl, VT, NewOr, N1, Cond);
4808 }
4809 if (matchOr(F1, F0)) {
4810 // fshl X, (or X, Y), C ==/!= 0 --> or (srl Y, BW-C), X ==/!= 0
4811 SDValue NewShAmt = DAG.getConstant(BitWidth - ShAmt, dl, ShAmtVT);
4812 SDValue Shift = DAG.getNode(ISD::SRL, dl, OpVT, Y, NewShAmt);
4813 SDValue NewOr = DAG.getNode(ISD::OR, dl, OpVT, Shift, X);
4814 return DAG.getSetCC(dl, VT, NewOr, N1, Cond);
4815 }
4816
4817 return SDValue();
4818}
4819
4820/// Try to simplify a setcc built with the specified operands and cc. If it is
4821/// unable to simplify it, return a null SDValue.
4823 ISD::CondCode Cond, bool foldBooleans,
4824 DAGCombinerInfo &DCI,
4825 const SDLoc &dl) const {
4826 SelectionDAG &DAG = DCI.DAG;
4827 const DataLayout &Layout = DAG.getDataLayout();
4828 EVT OpVT = N0.getValueType();
4829 AttributeList Attr = DAG.getMachineFunction().getFunction().getAttributes();
4830
4831 // Constant fold or commute setcc.
4832 if (SDValue Fold = DAG.FoldSetCC(VT, N0, N1, Cond, dl))
4833 return Fold;
4834
4835 bool N0ConstOrSplat =
4836 isConstOrConstSplat(N0, /*AllowUndefs*/ false, /*AllowTruncate*/ true);
4837 bool N1ConstOrSplat =
4838 isConstOrConstSplat(N1, /*AllowUndefs*/ false, /*AllowTruncate*/ true);
4839
4840 // Canonicalize toward having the constant on the RHS.
4841 // TODO: Handle non-splat vector constants. All undef causes trouble.
4842 // FIXME: We can't yet fold constant scalable vector splats, so avoid an
4843 // infinite loop here when we encounter one.
4845 if (N0ConstOrSplat && !N1ConstOrSplat &&
4846 (DCI.isBeforeLegalizeOps() ||
4847 isCondCodeLegal(SwappedCC, N0.getSimpleValueType())))
4848 return DAG.getSetCC(dl, VT, N1, N0, SwappedCC);
4849
4850 // If we have a subtract with the same 2 non-constant operands as this setcc
4851 // -- but in reverse order -- then try to commute the operands of this setcc
4852 // to match. A matching pair of setcc (cmp) and sub may be combined into 1
4853 // instruction on some targets.
4854 if (!N0ConstOrSplat && !N1ConstOrSplat &&
4855 (DCI.isBeforeLegalizeOps() ||
4856 isCondCodeLegal(SwappedCC, N0.getSimpleValueType())) &&
4857 DAG.doesNodeExist(ISD::SUB, DAG.getVTList(OpVT), {N1, N0}) &&
4858 !DAG.doesNodeExist(ISD::SUB, DAG.getVTList(OpVT), {N0, N1}))
4859 return DAG.getSetCC(dl, VT, N1, N0, SwappedCC);
4860
4861 if (SDValue V = foldSetCCWithRotate(VT, N0, N1, Cond, dl, DAG))
4862 return V;
4863
4864 if (SDValue V = foldSetCCWithFunnelShift(VT, N0, N1, Cond, dl, DAG))
4865 return V;
4866
4867 if (auto *N1C = isConstOrConstSplat(N1)) {
4868 const APInt &C1 = N1C->getAPIntValue();
4869
4870 // Optimize some CTPOP cases.
4871 if (SDValue V = simplifySetCCWithCTPOP(*this, VT, N0, C1, Cond, dl, DAG))
4872 return V;
4873
4874 // For equality to 0 of a no-wrap multiply, decompose and test each op:
4875 // X * Y == 0 --> (X == 0) || (Y == 0)
4876 // X * Y != 0 --> (X != 0) && (Y != 0)
4877 // TODO: This bails out if minsize is set, but if the target doesn't have a
4878 // single instruction multiply for this type, it would likely be
4879 // smaller to decompose.
4880 if (C1.isZero() && (Cond == ISD::SETEQ || Cond == ISD::SETNE) &&
4881 N0.getOpcode() == ISD::MUL && N0.hasOneUse() &&
4882 (N0->getFlags().hasNoUnsignedWrap() ||
4883 N0->getFlags().hasNoSignedWrap()) &&
4884 !Attr.hasFnAttr(Attribute::MinSize)) {
4885 SDValue IsXZero = DAG.getSetCC(dl, VT, N0.getOperand(0), N1, Cond);
4886 SDValue IsYZero = DAG.getSetCC(dl, VT, N0.getOperand(1), N1, Cond);
4887 unsigned LogicOp = Cond == ISD::SETEQ ? ISD::OR : ISD::AND;
4888 return DAG.getNode(LogicOp, dl, VT, IsXZero, IsYZero);
4889 }
4890
4891 // If the LHS is '(srl (ctlz x), 5)', the RHS is 0/1, and this is an
4892 // equality comparison, then we're just comparing whether X itself is
4893 // zero.
4894 if (N0.getOpcode() == ISD::SRL && (C1.isZero() || C1.isOne()) &&
4895 N0.getOperand(0).getOpcode() == ISD::CTLZ &&
4897 if (ConstantSDNode *ShAmt = isConstOrConstSplat(N0.getOperand(1))) {
4898 if ((Cond == ISD::SETEQ || Cond == ISD::SETNE) &&
4899 ShAmt->getAPIntValue() == Log2_32(N0.getScalarValueSizeInBits())) {
4900 if ((C1 == 0) == (Cond == ISD::SETEQ)) {
4901 // (srl (ctlz x), 5) == 0 -> X != 0
4902 // (srl (ctlz x), 5) != 1 -> X != 0
4903 Cond = ISD::SETNE;
4904 } else {
4905 // (srl (ctlz x), 5) != 0 -> X == 0
4906 // (srl (ctlz x), 5) == 1 -> X == 0
4907 Cond = ISD::SETEQ;
4908 }
4909 SDValue Zero = DAG.getConstant(0, dl, N0.getValueType());
4910 return DAG.getSetCC(dl, VT, N0.getOperand(0).getOperand(0), Zero,
4911 Cond);
4912 }
4913 }
4914 }
4915 }
4916
4917 // setcc X, 0, setlt --> X (when X is all sign bits)
4918 // setcc X, 0, setne --> X (when X is all sign bits)
4919 //
4920 // When we know that X has 0 or -1 in each element (or scalar), this
4921 // comparison will produce X. This is only true when boolean contents are
4922 // represented via 0s and -1s.
4923 if (VT == OpVT &&
4924 // Check that the result of setcc is 0 and -1.
4926 // Match only for checks X < 0 and X != 0
4927 (Cond == ISD::SETLT || Cond == ISD::SETNE) && isNullOrNullSplat(N1) &&
4928 // The identity holds iff we know all sign bits for all lanes.
4930 return N0;
4931
4932 // FIXME: Support vectors.
4933 if (auto *N1C = dyn_cast<ConstantSDNode>(N1.getNode())) {
4934 const APInt &C1 = N1C->getAPIntValue();
4935
4936 // (zext x) == C --> x == (trunc C)
4937 // (sext x) == C --> x == (trunc C)
4938 if ((Cond == ISD::SETEQ || Cond == ISD::SETNE) &&
4939 DCI.isBeforeLegalize() && N0->hasOneUse()) {
4940 unsigned MinBits = N0.getValueSizeInBits();
4941 SDValue PreExt;
4942 bool Signed = false;
4943 if (N0->getOpcode() == ISD::ZERO_EXTEND) {
4944 // ZExt
4945 MinBits = N0->getOperand(0).getValueSizeInBits();
4946 PreExt = N0->getOperand(0);
4947 } else if (N0->getOpcode() == ISD::AND) {
4948 // DAGCombine turns costly ZExts into ANDs
4949 if (auto *C = dyn_cast<ConstantSDNode>(N0->getOperand(1)))
4950 if ((C->getAPIntValue()+1).isPowerOf2()) {
4951 MinBits = C->getAPIntValue().countr_one();
4952 PreExt = N0->getOperand(0);
4953 }
4954 } else if (N0->getOpcode() == ISD::SIGN_EXTEND) {
4955 // SExt
4956 MinBits = N0->getOperand(0).getValueSizeInBits();
4957 PreExt = N0->getOperand(0);
4958 Signed = true;
4959 } else if (auto *LN0 = dyn_cast<LoadSDNode>(N0)) {
4960 // ZEXTLOAD / SEXTLOAD
4961 if (LN0->getExtensionType() == ISD::ZEXTLOAD) {
4962 MinBits = LN0->getMemoryVT().getSizeInBits();
4963 PreExt = N0;
4964 } else if (LN0->getExtensionType() == ISD::SEXTLOAD) {
4965 Signed = true;
4966 MinBits = LN0->getMemoryVT().getSizeInBits();
4967 PreExt = N0;
4968 }
4969 }
4970
4971 // Figure out how many bits we need to preserve this constant.
4972 unsigned ReqdBits = Signed ? C1.getSignificantBits() : C1.getActiveBits();
4973
4974 // Make sure we're not losing bits from the constant.
4975 if (MinBits > 0 &&
4976 MinBits < C1.getBitWidth() &&
4977 MinBits >= ReqdBits) {
4978 EVT MinVT = EVT::getIntegerVT(*DAG.getContext(), MinBits);
4979 if (isTypeDesirableForOp(ISD::SETCC, MinVT)) {
4980 // Will get folded away.
4981 SDValue Trunc = DAG.getNode(ISD::TRUNCATE, dl, MinVT, PreExt);
4982 if (MinBits == 1 && C1 == 1)
4983 // Invert the condition.
4984 return DAG.getSetCC(dl, VT, Trunc, DAG.getConstant(0, dl, MVT::i1),
4986 SDValue C = DAG.getConstant(C1.trunc(MinBits), dl, MinVT);
4987 return DAG.getSetCC(dl, VT, Trunc, C, Cond);
4988 }
4989
4990 // If truncating the setcc operands is not desirable, we can still
4991 // simplify the expression in some cases:
4992 // setcc ([sz]ext (setcc x, y, cc)), 0, setne) -> setcc (x, y, cc)
4993 // setcc ([sz]ext (setcc x, y, cc)), 0, seteq) -> setcc (x, y, inv(cc))
4994 // setcc (zext (setcc x, y, cc)), 1, setne) -> setcc (x, y, inv(cc))
4995 // setcc (zext (setcc x, y, cc)), 1, seteq) -> setcc (x, y, cc)
4996 // setcc (sext (setcc x, y, cc)), -1, setne) -> setcc (x, y, inv(cc))
4997 // setcc (sext (setcc x, y, cc)), -1, seteq) -> setcc (x, y, cc)
4998 SDValue TopSetCC = N0->getOperand(0);
4999 unsigned N0Opc = N0->getOpcode();
5000 bool SExt = (N0Opc == ISD::SIGN_EXTEND);
5001 if (TopSetCC.getValueType() == MVT::i1 && VT == MVT::i1 &&
5002 TopSetCC.getOpcode() == ISD::SETCC &&
5003 (N0Opc == ISD::ZERO_EXTEND || N0Opc == ISD::SIGN_EXTEND) &&
5004 (isConstFalseVal(N1) ||
5005 isExtendedTrueVal(N1C, N0->getValueType(0), SExt))) {
5006
5007 bool Inverse = (N1C->isZero() && Cond == ISD::SETEQ) ||
5008 (!N1C->isZero() && Cond == ISD::SETNE);
5009
5010 if (!Inverse)
5011 return TopSetCC;
5012
5014 cast<CondCodeSDNode>(TopSetCC.getOperand(2))->get(),
5015 TopSetCC.getOperand(0).getValueType());
5016 return DAG.getSetCC(dl, VT, TopSetCC.getOperand(0),
5017 TopSetCC.getOperand(1),
5018 InvCond);
5019 }
5020 }
5021 }
5022
5023 // If the LHS is '(and load, const)', the RHS is 0, the test is for
5024 // equality or unsigned, and all 1 bits of the const are in the same
5025 // partial word, see if we can shorten the load.
5026 if (DCI.isBeforeLegalize() &&
5028 N0.getOpcode() == ISD::AND && C1 == 0 &&
5029 N0.getNode()->hasOneUse() &&
5030 isa<LoadSDNode>(N0.getOperand(0)) &&
5031 N0.getOperand(0).getNode()->hasOneUse() &&
5033 auto *Lod = cast<LoadSDNode>(N0.getOperand(0));
5034 APInt bestMask;
5035 unsigned bestWidth = 0, bestOffset = 0;
5036 if (Lod->isSimple() && Lod->isUnindexed() &&
5037 (Lod->getMemoryVT().isByteSized() ||
5038 isPaddedAtMostSignificantBitsWhenStored(Lod->getMemoryVT()))) {
5039 unsigned memWidth = Lod->getMemoryVT().getStoreSizeInBits();
5040 unsigned origWidth = N0.getValueSizeInBits();
5041 unsigned maskWidth = origWidth;
5042 // We can narrow (e.g.) 16-bit extending loads on 32-bit target to
5043 // 8 bits, but have to be careful...
5044 if (Lod->getExtensionType() != ISD::NON_EXTLOAD)
5045 origWidth = Lod->getMemoryVT().getSizeInBits();
5046 const APInt &Mask = N0.getConstantOperandAPInt(1);
5047 // Only consider power-of-2 widths (and at least one byte) as candiates
5048 // for the narrowed load.
5049 for (unsigned width = 8; width < origWidth; width *= 2) {
5050 EVT newVT = EVT::getIntegerVT(*DAG.getContext(), width);
5051 APInt newMask = APInt::getLowBitsSet(maskWidth, width);
5052 // Avoid accessing any padding here for now (we could use memWidth
5053 // instead of origWidth here otherwise).
5054 unsigned maxOffset = origWidth - width;
5055 for (unsigned offset = 0; offset <= maxOffset; offset += 8) {
5056 if (Mask.isSubsetOf(newMask)) {
5057 unsigned ptrOffset =
5058 Layout.isLittleEndian() ? offset : memWidth - width - offset;
5059 unsigned IsFast = 0;
5060 assert((ptrOffset % 8) == 0 && "Non-Bytealigned pointer offset");
5061 Align NewAlign = commonAlignment(Lod->getAlign(), ptrOffset / 8);
5063 ptrOffset / 8) &&
5065 *DAG.getContext(), Layout, newVT, Lod->getAddressSpace(),
5066 NewAlign, Lod->getMemOperand()->getFlags(), &IsFast) &&
5067 IsFast) {
5068 bestOffset = ptrOffset / 8;
5069 bestMask = Mask.lshr(offset);
5070 bestWidth = width;
5071 break;
5072 }
5073 }
5074 newMask <<= 8;
5075 }
5076 if (bestWidth)
5077 break;
5078 }
5079 }
5080 if (bestWidth) {
5081 EVT newVT = EVT::getIntegerVT(*DAG.getContext(), bestWidth);
5082 SDValue Ptr = Lod->getBasePtr();
5083 if (bestOffset != 0)
5084 Ptr = DAG.getObjectPtrOffset(dl, Ptr, TypeSize::getFixed(bestOffset));
5085 SDValue NewLoad =
5086 DAG.getLoad(newVT, dl, Lod->getChain(), Ptr,
5087 Lod->getPointerInfo().getWithOffset(bestOffset),
5088 Lod->getBaseAlign());
5089 SDValue And =
5090 DAG.getNode(ISD::AND, dl, newVT, NewLoad,
5091 DAG.getConstant(bestMask.trunc(bestWidth), dl, newVT));
5092 return DAG.getSetCC(dl, VT, And, DAG.getConstant(0LL, dl, newVT), Cond);
5093 }
5094 }
5095
5096 // If the LHS is a ZERO_EXTEND, perform the comparison on the input.
5097 if (N0.getOpcode() == ISD::ZERO_EXTEND) {
5098 unsigned InSize = N0.getOperand(0).getValueSizeInBits();
5099
5100 // If the comparison constant has bits in the upper part, the
5101 // zero-extended value could never match.
5103 C1.getBitWidth() - InSize))) {
5104 switch (Cond) {
5105 case ISD::SETUGT:
5106 case ISD::SETUGE:
5107 case ISD::SETEQ:
5108 return DAG.getConstant(0, dl, VT);
5109 case ISD::SETULT:
5110 case ISD::SETULE:
5111 case ISD::SETNE:
5112 return DAG.getConstant(1, dl, VT);
5113 case ISD::SETGT:
5114 case ISD::SETGE:
5115 // True if the sign bit of C1 is set.
5116 return DAG.getConstant(C1.isNegative(), dl, VT);
5117 case ISD::SETLT:
5118 case ISD::SETLE:
5119 // True if the sign bit of C1 isn't set.
5120 return DAG.getConstant(C1.isNonNegative(), dl, VT);
5121 default:
5122 break;
5123 }
5124 }
5125
5126 // Otherwise, we can perform the comparison with the low bits.
5127 switch (Cond) {
5128 case ISD::SETEQ:
5129 case ISD::SETNE:
5130 case ISD::SETUGT:
5131 case ISD::SETUGE:
5132 case ISD::SETULT:
5133 case ISD::SETULE: {
5134 EVT newVT = N0.getOperand(0).getValueType();
5135 // FIXME: Should use isNarrowingProfitable.
5136 if (DCI.isBeforeLegalizeOps() ||
5137 (isOperationLegal(ISD::SETCC, newVT) &&
5138 isCondCodeLegal(Cond, newVT.getSimpleVT()) &&
5140 EVT NewSetCCVT = getSetCCResultType(Layout, *DAG.getContext(), newVT);
5141 SDValue NewConst = DAG.getConstant(C1.trunc(InSize), dl, newVT);
5142
5143 SDValue NewSetCC = DAG.getSetCC(dl, NewSetCCVT, N0.getOperand(0),
5144 NewConst, Cond);
5145 return DAG.getBoolExtOrTrunc(NewSetCC, dl, VT, N0.getValueType());
5146 }
5147 break;
5148 }
5149 default:
5150 break; // todo, be more careful with signed comparisons
5151 }
5152 } else if (N0.getOpcode() == ISD::SIGN_EXTEND_INREG &&
5153 (Cond == ISD::SETEQ || Cond == ISD::SETNE) &&
5155 OpVT)) {
5156 EVT ExtSrcTy = cast<VTSDNode>(N0.getOperand(1))->getVT();
5157 unsigned ExtSrcTyBits = ExtSrcTy.getSizeInBits();
5158 EVT ExtDstTy = N0.getValueType();
5159 unsigned ExtDstTyBits = ExtDstTy.getSizeInBits();
5160
5161 // If the constant doesn't fit into the number of bits for the source of
5162 // the sign extension, it is impossible for both sides to be equal.
5163 if (C1.getSignificantBits() > ExtSrcTyBits)
5164 return DAG.getBoolConstant(Cond == ISD::SETNE, dl, VT, OpVT);
5165
5166 assert(ExtDstTy == N0.getOperand(0).getValueType() &&
5167 ExtDstTy != ExtSrcTy && "Unexpected types!");
5168 APInt Imm = APInt::getLowBitsSet(ExtDstTyBits, ExtSrcTyBits);
5169 SDValue ZextOp = DAG.getNode(ISD::AND, dl, ExtDstTy, N0.getOperand(0),
5170 DAG.getConstant(Imm, dl, ExtDstTy));
5171 if (!DCI.isCalledByLegalizer())
5172 DCI.AddToWorklist(ZextOp.getNode());
5173 // Otherwise, make this a use of a zext.
5174 return DAG.getSetCC(dl, VT, ZextOp,
5175 DAG.getConstant(C1 & Imm, dl, ExtDstTy), Cond);
5176 } else if ((N1C->isZero() || N1C->isOne()) &&
5177 (Cond == ISD::SETEQ || Cond == ISD::SETNE)) {
5178 // SETCC (X), [0|1], [EQ|NE] -> X if X is known 0/1. i1 types are
5179 // excluded as they are handled below whilst checking for foldBooleans.
5180 if ((N0.getOpcode() == ISD::SETCC || VT.getScalarType() != MVT::i1) &&
5181 isTypeLegal(VT) && VT.bitsLE(N0.getValueType()) &&
5182 (N0.getValueType() == MVT::i1 ||
5186 bool TrueWhenTrue = (Cond == ISD::SETEQ) ^ (!N1C->isOne());
5187 if (TrueWhenTrue)
5188 return DAG.getNode(ISD::TRUNCATE, dl, VT, N0);
5189 // Invert the condition.
5190 if (N0.getOpcode() == ISD::SETCC) {
5193 if (DCI.isBeforeLegalizeOps() ||
5195 return DAG.getSetCC(dl, VT, N0.getOperand(0), N0.getOperand(1), CC);
5196 }
5197 }
5198
5199 if ((N0.getOpcode() == ISD::XOR ||
5200 (N0.getOpcode() == ISD::AND &&
5201 N0.getOperand(0).getOpcode() == ISD::XOR &&
5202 N0.getOperand(1) == N0.getOperand(0).getOperand(1))) &&
5203 isOneConstant(N0.getOperand(1))) {
5204 // If this is (X^1) == 0/1, swap the RHS and eliminate the xor. We
5205 // can only do this if the top bits are known zero.
5206 unsigned BitWidth = N0.getValueSizeInBits();
5207 if (DAG.MaskedValueIsZero(N0,
5209 BitWidth-1))) {
5210 // Okay, get the un-inverted input value.
5211 SDValue Val;
5212 if (N0.getOpcode() == ISD::XOR) {
5213 Val = N0.getOperand(0);
5214 } else {
5215 assert(N0.getOpcode() == ISD::AND &&
5216 N0.getOperand(0).getOpcode() == ISD::XOR);
5217 // ((X^1)&1)^1 -> X & 1
5218 Val = DAG.getNode(ISD::AND, dl, N0.getValueType(),
5219 N0.getOperand(0).getOperand(0),
5220 N0.getOperand(1));
5221 }
5222
5223 return DAG.getSetCC(dl, VT, Val, N1,
5225 }
5226 } else if (N1C->isOne()) {
5227 SDValue Op0 = N0;
5228 if (Op0.getOpcode() == ISD::TRUNCATE)
5229 Op0 = Op0.getOperand(0);
5230
5231 if ((Op0.getOpcode() == ISD::XOR) &&
5232 Op0.getOperand(0).getOpcode() == ISD::SETCC &&
5233 Op0.getOperand(1).getOpcode() == ISD::SETCC) {
5234 SDValue XorLHS = Op0.getOperand(0);
5235 SDValue XorRHS = Op0.getOperand(1);
5236 // Ensure that the input setccs return an i1 type or 0/1 value.
5237 if (Op0.getValueType() == MVT::i1 ||
5242 // (xor (setcc), (setcc)) == / != 1 -> (setcc) != / == (setcc)
5244 return DAG.getSetCC(dl, VT, XorLHS, XorRHS, Cond);
5245 }
5246 }
5247 if (Op0.getOpcode() == ISD::AND && isOneConstant(Op0.getOperand(1))) {
5248 // If this is (X&1) == / != 1, normalize it to (X&1) != / == 0.
5249 if (Op0.getValueType().bitsGT(VT))
5250 Op0 = DAG.getNode(ISD::AND, dl, VT,
5251 DAG.getNode(ISD::TRUNCATE, dl, VT, Op0.getOperand(0)),
5252 DAG.getConstant(1, dl, VT));
5253 else if (Op0.getValueType().bitsLT(VT))
5254 Op0 = DAG.getNode(ISD::AND, dl, VT,
5255 DAG.getNode(ISD::ANY_EXTEND, dl, VT, Op0.getOperand(0)),
5256 DAG.getConstant(1, dl, VT));
5257
5258 return DAG.getSetCC(dl, VT, Op0,
5259 DAG.getConstant(0, dl, Op0.getValueType()),
5261 }
5262 if (Op0.getOpcode() == ISD::AssertZext &&
5263 cast<VTSDNode>(Op0.getOperand(1))->getVT() == MVT::i1)
5264 return DAG.getSetCC(dl, VT, Op0,
5265 DAG.getConstant(0, dl, Op0.getValueType()),
5267 }
5268 }
5269
5270 // Given:
5271 // icmp eq/ne (urem %x, %y), 0
5272 // Iff %x has 0 or 1 bits set, and %y has at least 2 bits set, omit 'urem':
5273 // icmp eq/ne %x, 0
5274 if (N0.getOpcode() == ISD::UREM && N1C->isZero() &&
5275 (Cond == ISD::SETEQ || Cond == ISD::SETNE)) {
5276 KnownBits XKnown = DAG.computeKnownBits(N0.getOperand(0));
5277 KnownBits YKnown = DAG.computeKnownBits(N0.getOperand(1));
5278 if (XKnown.countMaxPopulation() == 1 && YKnown.countMinPopulation() >= 2)
5279 return DAG.getSetCC(dl, VT, N0.getOperand(0), N1, Cond);
5280 }
5281
5282 // Fold set_cc seteq (ashr X, BW-1), -1 -> set_cc setlt X, 0
5283 // and set_cc setne (ashr X, BW-1), -1 -> set_cc setge X, 0
5284 if ((Cond == ISD::SETEQ || Cond == ISD::SETNE) &&
5286 N0.getConstantOperandAPInt(1) == OpVT.getScalarSizeInBits() - 1 &&
5287 N1C->isAllOnes()) {
5288 return DAG.getSetCC(dl, VT, N0.getOperand(0),
5289 DAG.getConstant(0, dl, OpVT),
5291 }
5292
5293 // fold (setcc (trunc x) c) -> (setcc x c)
5294 if (N0.getOpcode() == ISD::TRUNCATE &&
5296 (N0->getFlags().hasNoSignedWrap() &&
5299 EVT NewVT = N0.getOperand(0).getValueType();
5300 SDValue NewConst = DAG.getConstant(
5302 ? C1.sext(NewVT.getSizeInBits())
5303 : C1.zext(NewVT.getSizeInBits()),
5304 dl, NewVT);
5305 return DAG.getSetCC(dl, VT, N0.getOperand(0), NewConst, Cond);
5306 }
5307
5308 if (SDValue V =
5309 optimizeSetCCOfSignedTruncationCheck(VT, N0, N1, Cond, DCI, dl))
5310 return V;
5311 }
5312
5313 // These simplifications apply to splat vectors as well.
5314 // TODO: Handle more splat vector cases.
5315 if (auto *N1C = isConstOrConstSplat(N1)) {
5316 const APInt &C1 = N1C->getAPIntValue();
5317
5318 APInt MinVal, MaxVal;
5319 unsigned OperandBitSize = N1C->getValueType(0).getScalarSizeInBits();
5321 MinVal = APInt::getSignedMinValue(OperandBitSize);
5322 MaxVal = APInt::getSignedMaxValue(OperandBitSize);
5323 } else {
5324 MinVal = APInt::getMinValue(OperandBitSize);
5325 MaxVal = APInt::getMaxValue(OperandBitSize);
5326 }
5327
5328 // Canonicalize GE/LE comparisons to use GT/LT comparisons.
5329 if (Cond == ISD::SETGE || Cond == ISD::SETUGE) {
5330 // X >= MIN --> true
5331 if (C1 == MinVal)
5332 return DAG.getBoolConstant(true, dl, VT, OpVT);
5333
5334 if (!VT.isVector()) { // TODO: Support this for vectors.
5335 // X >= C0 --> X > (C0 - 1)
5336 APInt C = C1 - 1;
5338 if ((DCI.isBeforeLegalizeOps() ||
5339 isCondCodeLegal(NewCC, OpVT.getSimpleVT())) &&
5340 (!N1C->isOpaque() || (C.getBitWidth() <= 64 &&
5341 isLegalICmpImmediate(C.getSExtValue())))) {
5342 return DAG.getSetCC(dl, VT, N0,
5343 DAG.getConstant(C, dl, N1.getValueType()),
5344 NewCC);
5345 }
5346 }
5347 }
5348
5349 if (Cond == ISD::SETLE || Cond == ISD::SETULE) {
5350 // X <= MAX --> true
5351 if (C1 == MaxVal)
5352 return DAG.getBoolConstant(true, dl, VT, OpVT);
5353
5354 // X <= C0 --> X < (C0 + 1)
5355 if (!VT.isVector()) { // TODO: Support this for vectors.
5356 APInt C = C1 + 1;
5358 if ((DCI.isBeforeLegalizeOps() ||
5359 isCondCodeLegal(NewCC, OpVT.getSimpleVT())) &&
5360 (!N1C->isOpaque() || (C.getBitWidth() <= 64 &&
5361 isLegalICmpImmediate(C.getSExtValue())))) {
5362 return DAG.getSetCC(dl, VT, N0,
5363 DAG.getConstant(C, dl, N1.getValueType()),
5364 NewCC);
5365 }
5366 }
5367 }
5368
5369 if (Cond == ISD::SETLT || Cond == ISD::SETULT) {
5370 if (C1 == MinVal)
5371 return DAG.getBoolConstant(false, dl, VT, OpVT); // X < MIN --> false
5372
5373 // TODO: Support this for vectors after legalize ops.
5374 if (!VT.isVector() || DCI.isBeforeLegalizeOps()) {
5375 // Canonicalize setlt X, Max --> setne X, Max
5376 if (C1 == MaxVal)
5377 return DAG.getSetCC(dl, VT, N0, N1, ISD::SETNE);
5378
5379 // If we have setult X, 1, turn it into seteq X, 0
5380 if (C1 == MinVal+1)
5381 return DAG.getSetCC(dl, VT, N0,
5382 DAG.getConstant(MinVal, dl, N0.getValueType()),
5383 ISD::SETEQ);
5384 }
5385 }
5386
5387 if (Cond == ISD::SETGT || Cond == ISD::SETUGT) {
5388 if (C1 == MaxVal)
5389 return DAG.getBoolConstant(false, dl, VT, OpVT); // X > MAX --> false
5390
5391 // TODO: Support this for vectors after legalize ops.
5392 if (!VT.isVector() || DCI.isBeforeLegalizeOps()) {
5393 // Canonicalize setgt X, Min --> setne X, Min
5394 if (C1 == MinVal)
5395 return DAG.getSetCC(dl, VT, N0, N1, ISD::SETNE);
5396
5397 // If we have setugt X, Max-1, turn it into seteq X, Max
5398 if (C1 == MaxVal-1)
5399 return DAG.getSetCC(dl, VT, N0,
5400 DAG.getConstant(MaxVal, dl, N0.getValueType()),
5401 ISD::SETEQ);
5402 }
5403 }
5404
5405 if (Cond == ISD::SETEQ || Cond == ISD::SETNE) {
5406 // (X & (C l>>/<< Y)) ==/!= 0 --> ((X <</l>> Y) & C) ==/!= 0
5407 if (C1.isZero())
5408 if (SDValue CC = optimizeSetCCByHoistingAndByConstFromLogicalShift(
5409 VT, N0, N1, Cond, DCI, dl))
5410 return CC;
5411
5412 // For all/any comparisons, replace or(x,shl(y,bw/2)) with and/or(x,y).
5413 // For example, when high 32-bits of i64 X are known clear:
5414 // all bits clear: (X | (Y<<32)) == 0 --> (X | Y) == 0
5415 // all bits set: (X | (Y<<32)) == -1 --> (X & Y) == -1
5416 bool CmpZero = N1C->isZero();
5417 bool CmpNegOne = N1C->isAllOnes();
5418 if ((CmpZero || CmpNegOne) && N0.hasOneUse()) {
5419 // Match or(lo,shl(hi,bw/2)) pattern.
5420 auto IsConcat = [&](SDValue V, SDValue &Lo, SDValue &Hi) {
5421 unsigned EltBits = V.getScalarValueSizeInBits();
5422 if (V.getOpcode() != ISD::OR || (EltBits % 2) != 0)
5423 return false;
5424 SDValue LHS = V.getOperand(0);
5425 SDValue RHS = V.getOperand(1);
5426 APInt HiBits = APInt::getHighBitsSet(EltBits, EltBits / 2);
5427 // Unshifted element must have zero upperbits.
5428 if (RHS.getOpcode() == ISD::SHL &&
5429 isa<ConstantSDNode>(RHS.getOperand(1)) &&
5430 RHS.getConstantOperandAPInt(1) == (EltBits / 2) &&
5431 DAG.MaskedValueIsZero(LHS, HiBits)) {
5432 Lo = LHS;
5433 Hi = RHS.getOperand(0);
5434 return true;
5435 }
5436 if (LHS.getOpcode() == ISD::SHL &&
5437 isa<ConstantSDNode>(LHS.getOperand(1)) &&
5438 LHS.getConstantOperandAPInt(1) == (EltBits / 2) &&
5439 DAG.MaskedValueIsZero(RHS, HiBits)) {
5440 Lo = RHS;
5441 Hi = LHS.getOperand(0);
5442 return true;
5443 }
5444 return false;
5445 };
5446
5447 auto MergeConcat = [&](SDValue Lo, SDValue Hi) {
5448 unsigned EltBits = N0.getScalarValueSizeInBits();
5449 unsigned HalfBits = EltBits / 2;
5450 APInt HiBits = APInt::getHighBitsSet(EltBits, HalfBits);
5451 SDValue LoBits = DAG.getConstant(~HiBits, dl, OpVT);
5452 SDValue HiMask = DAG.getNode(ISD::AND, dl, OpVT, Hi, LoBits);
5453 SDValue NewN0 =
5454 DAG.getNode(CmpZero ? ISD::OR : ISD::AND, dl, OpVT, Lo, HiMask);
5455 SDValue NewN1 = CmpZero ? DAG.getConstant(0, dl, OpVT) : LoBits;
5456 return DAG.getSetCC(dl, VT, NewN0, NewN1, Cond);
5457 };
5458
5459 SDValue Lo, Hi;
5460 if (IsConcat(N0, Lo, Hi))
5461 return MergeConcat(Lo, Hi);
5462
5463 if (N0.getOpcode() == ISD::AND || N0.getOpcode() == ISD::OR) {
5464 SDValue Lo0, Lo1, Hi0, Hi1;
5465 if (IsConcat(N0.getOperand(0), Lo0, Hi0) &&
5466 IsConcat(N0.getOperand(1), Lo1, Hi1)) {
5467 return MergeConcat(DAG.getNode(N0.getOpcode(), dl, OpVT, Lo0, Lo1),
5468 DAG.getNode(N0.getOpcode(), dl, OpVT, Hi0, Hi1));
5469 }
5470 }
5471 }
5472 }
5473
5474 // If we have "setcc X, C0", check to see if we can shrink the immediate
5475 // by changing cc.
5476 // TODO: Support this for vectors after legalize ops.
5477 if (!VT.isVector() || DCI.isBeforeLegalizeOps()) {
5478 // SETUGT X, SINTMAX -> SETLT X, 0
5479 // SETUGE X, SINTMIN -> SETLT X, 0
5480 if ((Cond == ISD::SETUGT && C1.isMaxSignedValue()) ||
5481 (Cond == ISD::SETUGE && C1.isMinSignedValue()))
5482 return DAG.getSetCC(dl, VT, N0,
5483 DAG.getConstant(0, dl, N1.getValueType()),
5484 ISD::SETLT);
5485
5486 // SETULT X, SINTMIN -> SETGT X, -1
5487 // SETULE X, SINTMAX -> SETGT X, -1
5488 if ((Cond == ISD::SETULT && C1.isMinSignedValue()) ||
5489 (Cond == ISD::SETULE && C1.isMaxSignedValue()))
5490 return DAG.getSetCC(dl, VT, N0,
5491 DAG.getAllOnesConstant(dl, N1.getValueType()),
5492 ISD::SETGT);
5493 }
5494 }
5495
5496 // Back to non-vector simplifications.
5497 // TODO: Can we do these for vector splats?
5498 if (auto *N1C = dyn_cast<ConstantSDNode>(N1.getNode())) {
5499 const APInt &C1 = N1C->getAPIntValue();
5500 EVT ShValTy = N0.getValueType();
5501
5502 // Fold bit comparisons when we can. This will result in an
5503 // incorrect value when boolean false is negative one, unless
5504 // the bitsize is 1 in which case the false value is the same
5505 // in practice regardless of the representation.
5506 if ((VT.getSizeInBits() == 1 ||
5508 (Cond == ISD::SETEQ || Cond == ISD::SETNE) &&
5509 (VT == ShValTy || (isTypeLegal(VT) && VT.bitsLE(ShValTy))) &&
5510 N0.getOpcode() == ISD::AND) {
5511 if (auto *AndRHS = dyn_cast<ConstantSDNode>(N0.getOperand(1))) {
5512 if (Cond == ISD::SETNE && C1 == 0) {// (X & 8) != 0 --> (X & 8) >> 3
5513 // Perform the xform if the AND RHS is a single bit.
5514 unsigned ShCt = AndRHS->getAPIntValue().logBase2();
5515 if (AndRHS->getAPIntValue().isPowerOf2() &&
5516 !shouldAvoidTransformToShift(ShValTy, ShCt)) {
5517 return DAG.getNode(
5518 ISD::TRUNCATE, dl, VT,
5519 DAG.getNode(ISD::SRL, dl, ShValTy, N0,
5520 DAG.getShiftAmountConstant(ShCt, ShValTy, dl)));
5521 }
5522 } else if (Cond == ISD::SETEQ && C1 == AndRHS->getAPIntValue()) {
5523 // (X & 8) == 8 --> (X & 8) >> 3
5524 // Perform the xform if C1 is a single bit.
5525 unsigned ShCt = C1.logBase2();
5526 if (C1.isPowerOf2() && !shouldAvoidTransformToShift(ShValTy, ShCt)) {
5527 return DAG.getNode(
5528 ISD::TRUNCATE, dl, VT,
5529 DAG.getNode(ISD::SRL, dl, ShValTy, N0,
5530 DAG.getShiftAmountConstant(ShCt, ShValTy, dl)));
5531 }
5532 }
5533 }
5534 }
5535
5536 if (C1.getSignificantBits() <= 64 &&
5538 // (X & -256) == 256 -> (X >> 8) == 1
5539 if ((Cond == ISD::SETEQ || Cond == ISD::SETNE) &&
5540 N0.getOpcode() == ISD::AND && N0.hasOneUse()) {
5541 if (auto *AndRHS = dyn_cast<ConstantSDNode>(N0.getOperand(1))) {
5542 const APInt &AndRHSC = AndRHS->getAPIntValue();
5543 if (AndRHSC.isNegatedPowerOf2() && C1.isSubsetOf(AndRHSC)) {
5544 unsigned ShiftBits = AndRHSC.countr_zero();
5545 if (!shouldAvoidTransformToShift(ShValTy, ShiftBits)) {
5546 // If using an unsigned shift doesn't yield a legal compare
5547 // immediate, try using sra instead.
5548 APInt NewC = C1.lshr(ShiftBits);
5549 if (NewC.getSignificantBits() <= 64 &&
5551 APInt SignedC = C1.ashr(ShiftBits);
5552 if (SignedC.getSignificantBits() <= 64 &&
5554 SDValue Shift = DAG.getNode(
5555 ISD::SRA, dl, ShValTy, N0.getOperand(0),
5556 DAG.getShiftAmountConstant(ShiftBits, ShValTy, dl));
5557 SDValue CmpRHS = DAG.getConstant(SignedC, dl, ShValTy);
5558 return DAG.getSetCC(dl, VT, Shift, CmpRHS, Cond);
5559 }
5560 }
5561 SDValue Shift = DAG.getNode(
5562 ISD::SRL, dl, ShValTy, N0.getOperand(0),
5563 DAG.getShiftAmountConstant(ShiftBits, ShValTy, dl));
5564 SDValue CmpRHS = DAG.getConstant(NewC, dl, ShValTy);
5565 return DAG.getSetCC(dl, VT, Shift, CmpRHS, Cond);
5566 }
5567 }
5568 }
5569 } else if (Cond == ISD::SETULT || Cond == ISD::SETUGE ||
5570 Cond == ISD::SETULE || Cond == ISD::SETUGT) {
5571 bool AdjOne = (Cond == ISD::SETULE || Cond == ISD::SETUGT);
5572 // X < 0x100000000 -> (X >> 32) < 1
5573 // X >= 0x100000000 -> (X >> 32) >= 1
5574 // X <= 0x0ffffffff -> (X >> 32) < 1
5575 // X > 0x0ffffffff -> (X >> 32) >= 1
5576 unsigned ShiftBits;
5577 APInt NewC = C1;
5578 ISD::CondCode NewCond = Cond;
5579 if (AdjOne) {
5580 ShiftBits = C1.countr_one();
5581 NewC = NewC + 1;
5582 NewCond = (Cond == ISD::SETULE) ? ISD::SETULT : ISD::SETUGE;
5583 } else {
5584 ShiftBits = C1.countr_zero();
5585 }
5586 APInt RangeWidth = NewC;
5587 NewC.lshrInPlace(ShiftBits);
5588 if (ShiftBits && NewC.getSignificantBits() <= 64 &&
5590 !shouldAvoidTransformToShift(ShValTy, ShiftBits)) {
5591 // If this is an offset range check, try to move the offset after the
5592 // shift to avoid preserving the pre-shift add with a mask.
5593 if (N0.getOpcode() == ISD::ADD && N0.hasOneUse()) {
5594 if (auto *AddC = isConstOrConstSplat(N0.getOperand(1))) {
5595 const APInt &AddVal = AddC->getAPIntValue();
5596 if (AddVal.countr_zero() >= ShiftBits) {
5597 APInt RangeLower = -AddVal;
5598 bool Overflow;
5599 (void)RangeLower.uadd_ov(RangeWidth, Overflow);
5600 if (!RangeWidth.isZero() && !Overflow) {
5601 SDValue Shift = DAG.getNode(
5602 ISD::SRL, dl, ShValTy, N0.getOperand(0),
5603 DAG.getShiftAmountConstant(ShiftBits, ShValTy, dl));
5604 APInt Offset = -RangeLower.lshr(ShiftBits);
5605 SDValue ShiftedAdd =
5606 DAG.getNode(ISD::ADD, dl, ShValTy, Shift,
5607 DAG.getConstant(Offset, dl, ShValTy));
5608 SDValue CmpRHS = DAG.getConstant(NewC, dl, ShValTy);
5609 return DAG.getSetCC(dl, VT, ShiftedAdd, CmpRHS, NewCond);
5610 }
5611 }
5612 }
5613 }
5614 SDValue Shift =
5615 DAG.getNode(ISD::SRL, dl, ShValTy, N0,
5616 DAG.getShiftAmountConstant(ShiftBits, ShValTy, dl));
5617 SDValue CmpRHS = DAG.getConstant(NewC, dl, ShValTy);
5618 return DAG.getSetCC(dl, VT, Shift, CmpRHS, NewCond);
5619 }
5620 }
5621 }
5622 }
5623
5625 auto *CFP = cast<ConstantFPSDNode>(N1);
5626 assert(!CFP->getValueAPF().isNaN() && "Unexpected NaN value");
5627
5628 // Otherwise, we know the RHS is not a NaN. Simplify the node to drop the
5629 // constant if knowing that the operand is non-nan is enough. We prefer to
5630 // have SETO(x,x) instead of SETO(x, 0.0) because this avoids having to
5631 // materialize 0.0.
5632 if (Cond == ISD::SETO || Cond == ISD::SETUO)
5633 return DAG.getSetCC(dl, VT, N0, N0, Cond);
5634
5635 // setcc (fneg x), C -> setcc swap(pred) x, -C
5636 if (N0.getOpcode() == ISD::FNEG) {
5638 if (DCI.isBeforeLegalizeOps() ||
5639 isCondCodeLegal(SwapCond, N0.getSimpleValueType())) {
5640 SDValue NegN1 = DAG.getNode(ISD::FNEG, dl, N0.getValueType(), N1);
5641 return DAG.getSetCC(dl, VT, N0.getOperand(0), NegN1, SwapCond);
5642 }
5643 }
5644
5645 // setueq/setoeq X, (fabs Inf) -> is_fpclass X, fcInf
5647 !isFPImmLegal(CFP->getValueAPF(), CFP->getValueType(0))) {
5648 bool IsFabs = N0.getOpcode() == ISD::FABS;
5649 SDValue Op = IsFabs ? N0.getOperand(0) : N0;
5650 if ((Cond == ISD::SETOEQ || Cond == ISD::SETUEQ) && CFP->isInfinity()) {
5651 FPClassTest Flag = CFP->isNegative() ? (IsFabs ? fcNone : fcNegInf)
5652 : (IsFabs ? fcInf : fcPosInf);
5653 if (Cond == ISD::SETUEQ)
5654 Flag |= fcNan;
5655 return DAG.getNode(ISD::IS_FPCLASS, dl, VT, Op,
5656 DAG.getTargetConstant(Flag, dl, MVT::i32));
5657 }
5658 }
5659
5660 // If the condition is not legal, see if we can find an equivalent one
5661 // which is legal.
5663 // If the comparison was an awkward floating-point == or != and one of
5664 // the comparison operands is infinity or negative infinity, convert the
5665 // condition to a less-awkward <= or >=.
5666 if (CFP->getValueAPF().isInfinity()) {
5667 bool IsNegInf = CFP->getValueAPF().isNegative();
5669 switch (Cond) {
5670 case ISD::SETOEQ: NewCond = IsNegInf ? ISD::SETOLE : ISD::SETOGE; break;
5671 case ISD::SETUEQ: NewCond = IsNegInf ? ISD::SETULE : ISD::SETUGE; break;
5672 case ISD::SETUNE: NewCond = IsNegInf ? ISD::SETUGT : ISD::SETULT; break;
5673 case ISD::SETONE: NewCond = IsNegInf ? ISD::SETOGT : ISD::SETOLT; break;
5674 default: break;
5675 }
5676 if (NewCond != ISD::SETCC_INVALID &&
5677 isCondCodeLegal(NewCond, N0.getSimpleValueType()))
5678 return DAG.getSetCC(dl, VT, N0, N1, NewCond);
5679 }
5680 }
5681 }
5682
5683 if (N0 == N1) {
5684 // The sext(setcc()) => setcc() optimization relies on the appropriate
5685 // constant being emitted.
5686 assert(!N0.getValueType().isInteger() &&
5687 "Integer types should be handled by FoldSetCC");
5688
5689 bool EqTrue = ISD::isTrueWhenEqual(Cond);
5690 unsigned UOF = ISD::getUnorderedFlavor(Cond);
5691 if (UOF == 2) // FP operators that are undefined on NaNs.
5692 return DAG.getBoolConstant(EqTrue, dl, VT, OpVT);
5693 if (UOF == unsigned(EqTrue))
5694 return DAG.getBoolConstant(EqTrue, dl, VT, OpVT);
5695 // Otherwise, we can't fold it. However, we can simplify it to SETUO/SETO
5696 // if it is not already.
5697 ISD::CondCode NewCond = UOF == 0 ? ISD::SETO : ISD::SETUO;
5698 if (NewCond != Cond &&
5699 (DCI.isBeforeLegalizeOps() ||
5700 isCondCodeLegal(NewCond, N0.getSimpleValueType())))
5701 return DAG.getSetCC(dl, VT, N0, N1, NewCond);
5702 }
5703
5704 // ~X > ~Y --> Y > X
5705 // ~X < ~Y --> Y < X
5706 // ~X < C --> X > ~C
5707 // ~X > C --> X < ~C
5708 if ((isSignedIntSetCC(Cond) || isUnsignedIntSetCC(Cond)) &&
5709 N0.getValueType().isInteger()) {
5710 if (isBitwiseNot(N0)) {
5711 if (isBitwiseNot(N1))
5712 return DAG.getSetCC(dl, VT, N1.getOperand(0), N0.getOperand(0), Cond);
5713
5716 SDValue Not = DAG.getNOT(dl, N1, OpVT);
5717 return DAG.getSetCC(dl, VT, Not, N0.getOperand(0), Cond);
5718 }
5719 }
5720 }
5721
5722 if ((Cond == ISD::SETEQ || Cond == ISD::SETNE) &&
5723 N0.getValueType().isInteger()) {
5724 if (N0.getOpcode() == ISD::ADD || N0.getOpcode() == ISD::SUB ||
5725 N0.getOpcode() == ISD::XOR) {
5726 // Simplify (X+Y) == (X+Z) --> Y == Z
5727 if (N0.getOpcode() == N1.getOpcode()) {
5728 if (N0.getOperand(0) == N1.getOperand(0))
5729 return DAG.getSetCC(dl, VT, N0.getOperand(1), N1.getOperand(1), Cond);
5730 if (N0.getOperand(1) == N1.getOperand(1))
5731 return DAG.getSetCC(dl, VT, N0.getOperand(0), N1.getOperand(0), Cond);
5732 if (isCommutativeBinOp(N0.getOpcode())) {
5733 // If X op Y == Y op X, try other combinations.
5734 if (N0.getOperand(0) == N1.getOperand(1))
5735 return DAG.getSetCC(dl, VT, N0.getOperand(1), N1.getOperand(0),
5736 Cond);
5737 if (N0.getOperand(1) == N1.getOperand(0))
5738 return DAG.getSetCC(dl, VT, N0.getOperand(0), N1.getOperand(1),
5739 Cond);
5740 }
5741 }
5742
5743 // If RHS is a legal immediate value for a compare instruction, we need
5744 // to be careful about increasing register pressure needlessly.
5745 bool LegalRHSImm = false;
5746
5747 if (auto *RHSC = dyn_cast<ConstantSDNode>(N1)) {
5748 if (auto *LHSR = dyn_cast<ConstantSDNode>(N0.getOperand(1))) {
5749 // Turn (X+C1) == C2 --> X == C2-C1
5750 if (N0.getOpcode() == ISD::ADD && N0.getNode()->hasOneUse())
5751 return DAG.getSetCC(
5752 dl, VT, N0.getOperand(0),
5753 DAG.getConstant(RHSC->getAPIntValue() - LHSR->getAPIntValue(),
5754 dl, N0.getValueType()),
5755 Cond);
5756
5757 // Turn (X^C1) == C2 --> X == C1^C2
5758 if (N0.getOpcode() == ISD::XOR && N0.getNode()->hasOneUse())
5759 return DAG.getSetCC(
5760 dl, VT, N0.getOperand(0),
5761 DAG.getConstant(LHSR->getAPIntValue() ^ RHSC->getAPIntValue(),
5762 dl, N0.getValueType()),
5763 Cond);
5764 }
5765
5766 // Turn (C1-X) == C2 --> X == C1-C2
5767 if (auto *SUBC = dyn_cast<ConstantSDNode>(N0.getOperand(0)))
5768 if (N0.getOpcode() == ISD::SUB && N0.getNode()->hasOneUse())
5769 return DAG.getSetCC(
5770 dl, VT, N0.getOperand(1),
5771 DAG.getConstant(SUBC->getAPIntValue() - RHSC->getAPIntValue(),
5772 dl, N0.getValueType()),
5773 Cond);
5774
5775 // Could RHSC fold directly into a compare?
5776 if (RHSC->getValueType(0).getSizeInBits() <= 64)
5777 LegalRHSImm = isLegalICmpImmediate(RHSC->getSExtValue());
5778 }
5779
5780 // (X+Y) == X --> Y == 0 and similar folds.
5781 // Don't do this if X is an immediate that can fold into a cmp
5782 // instruction and X+Y has other uses. It could be an induction variable
5783 // chain, and the transform would increase register pressure.
5784 if (!LegalRHSImm || N0.hasOneUse())
5785 if (SDValue V = foldSetCCWithBinOp(VT, N0, N1, Cond, dl, DCI))
5786 return V;
5787 }
5788
5789 if (N1.getOpcode() == ISD::ADD || N1.getOpcode() == ISD::SUB ||
5790 N1.getOpcode() == ISD::XOR)
5791 if (SDValue V = foldSetCCWithBinOp(VT, N1, N0, Cond, dl, DCI))
5792 return V;
5793
5794 if (SDValue V = foldSetCCWithAnd(VT, N0, N1, Cond, dl, DCI))
5795 return V;
5796
5797 if (SDValue V = foldSetCCWithOr(VT, N0, N1, Cond, dl, DCI))
5798 return V;
5799 }
5800
5801 // Fold remainder of division by a constant.
5802 if ((N0.getOpcode() == ISD::UREM || N0.getOpcode() == ISD::SREM) &&
5803 N0.hasOneUse() && (Cond == ISD::SETEQ || Cond == ISD::SETNE)) {
5804 // When division is cheap or optimizing for minimum size,
5805 // fall through to DIVREM creation by skipping this fold.
5806 if (!isIntDivCheap(VT, Attr) && !Attr.hasFnAttr(Attribute::MinSize)) {
5807 if (N0.getOpcode() == ISD::UREM) {
5808 if (SDValue Folded = buildUREMEqFold(VT, N0, N1, Cond, DCI, dl))
5809 return Folded;
5810 } else if (N0.getOpcode() == ISD::SREM) {
5811 if (SDValue Folded = buildSREMEqFold(VT, N0, N1, Cond, DCI, dl))
5812 return Folded;
5813 }
5814 }
5815 }
5816
5817 // Fold away ALL boolean setcc's.
5818 if (N0.getValueType().getScalarType() == MVT::i1 && foldBooleans) {
5819 SDValue Temp;
5820 switch (Cond) {
5821 default: llvm_unreachable("Unknown integer setcc!");
5822 case ISD::SETEQ: // X == Y -> ~(X^Y)
5823 Temp = DAG.getNode(ISD::XOR, dl, OpVT, N0, N1);
5824 N0 = DAG.getNOT(dl, Temp, OpVT);
5825 if (!DCI.isCalledByLegalizer())
5826 DCI.AddToWorklist(Temp.getNode());
5827 break;
5828 case ISD::SETNE: // X != Y --> (X^Y)
5829 N0 = DAG.getNode(ISD::XOR, dl, OpVT, N0, N1);
5830 break;
5831 case ISD::SETGT: // X >s Y --> X == 0 & Y == 1 --> ~X & Y
5832 case ISD::SETULT: // X <u Y --> X == 0 & Y == 1 --> ~X & Y
5833 Temp = DAG.getNOT(dl, N0, OpVT);
5834 N0 = DAG.getNode(ISD::AND, dl, OpVT, N1, Temp);
5835 if (!DCI.isCalledByLegalizer())
5836 DCI.AddToWorklist(Temp.getNode());
5837 break;
5838 case ISD::SETLT: // X <s Y --> X == 1 & Y == 0 --> ~Y & X
5839 case ISD::SETUGT: // X >u Y --> X == 1 & Y == 0 --> ~Y & X
5840 Temp = DAG.getNOT(dl, N1, OpVT);
5841 N0 = DAG.getNode(ISD::AND, dl, OpVT, N0, Temp);
5842 if (!DCI.isCalledByLegalizer())
5843 DCI.AddToWorklist(Temp.getNode());
5844 break;
5845 case ISD::SETULE: // X <=u Y --> X == 0 | Y == 1 --> ~X | Y
5846 case ISD::SETGE: // X >=s Y --> X == 0 | Y == 1 --> ~X | Y
5847 Temp = DAG.getNOT(dl, N0, OpVT);
5848 N0 = DAG.getNode(ISD::OR, dl, OpVT, N1, Temp);
5849 if (!DCI.isCalledByLegalizer())
5850 DCI.AddToWorklist(Temp.getNode());
5851 break;
5852 case ISD::SETUGE: // X >=u Y --> X == 1 | Y == 0 --> ~Y | X
5853 case ISD::SETLE: // X <=s Y --> X == 1 | Y == 0 --> ~Y | X
5854 Temp = DAG.getNOT(dl, N1, OpVT);
5855 N0 = DAG.getNode(ISD::OR, dl, OpVT, N0, Temp);
5856 break;
5857 }
5858 if (VT.getScalarType() != MVT::i1) {
5859 if (!DCI.isCalledByLegalizer())
5860 DCI.AddToWorklist(N0.getNode());
5861 // FIXME: If running after legalize, we probably can't do this.
5863 N0 = DAG.getNode(ExtendCode, dl, VT, N0);
5864 }
5865 return N0;
5866 }
5867
5868 // Fold (setcc (trunc x) (trunc y)) -> (setcc x y)
5869 if (N0.getOpcode() == ISD::TRUNCATE && N1.getOpcode() == ISD::TRUNCATE &&
5870 N0.getOperand(0).getValueType() == N1.getOperand(0).getValueType() &&
5872 N1->getFlags().hasNoUnsignedWrap()) ||
5874 N1->getFlags().hasNoSignedWrap())) &&
5876 return DAG.getSetCC(dl, VT, N0.getOperand(0), N1.getOperand(0), Cond);
5877 }
5878
5879 // Fold (setcc (sub nsw a, b), zero, s??) -> (setcc a, b, s??)
5880 // TODO: Remove that .isVector() check
5881 if (VT.isVector() && isZeroOrZeroSplat(N1) && N0.getOpcode() == ISD::SUB &&
5883 return DAG.getSetCC(dl, VT, N0.getOperand(0), N0.getOperand(1), Cond);
5884 }
5885
5886 // Could not fold it.
5887 return SDValue();
5888}
5889
5890/// Returns true (and the GlobalValue and the offset) if the node is a
5891/// GlobalAddress + offset.
5893 int64_t &Offset) const {
5894
5895 SDNode *N = unwrapAddress(SDValue(WN, 0)).getNode();
5896
5897 if (auto *GASD = dyn_cast<GlobalAddressSDNode>(N)) {
5898 GA = GASD->getGlobal();
5899 Offset += GASD->getOffset();
5900 return true;
5901 }
5902
5903 if (N->isAnyAdd()) {
5904 SDValue N1 = N->getOperand(0);
5905 SDValue N2 = N->getOperand(1);
5906 if (isGAPlusOffset(N1.getNode(), GA, Offset)) {
5907 if (auto *V = dyn_cast<ConstantSDNode>(N2)) {
5908 Offset += V->getSExtValue();
5909 return true;
5910 }
5911 } else if (isGAPlusOffset(N2.getNode(), GA, Offset)) {
5912 if (auto *V = dyn_cast<ConstantSDNode>(N1)) {
5913 Offset += V->getSExtValue();
5914 return true;
5915 }
5916 }
5917 }
5918
5919 return false;
5920}
5921
5923 DAGCombinerInfo &DCI) const {
5924 // Default implementation: no optimization.
5925 return SDValue();
5926}
5927
5928//===----------------------------------------------------------------------===//
5929// Inline Assembler Implementation Methods
5930//===----------------------------------------------------------------------===//
5931
5934 unsigned S = Constraint.size();
5935
5936 if (S == 1) {
5937 switch (Constraint[0]) {
5938 default: break;
5939 case 'r':
5940 return C_RegisterClass;
5941 case 'm': // memory
5942 case 'o': // offsetable
5943 case 'V': // not offsetable
5944 return C_Memory;
5945 case 'p': // Address.
5946 return C_Address;
5947 case 'n': // Simple Integer
5948 case 'E': // Floating Point Constant
5949 case 'F': // Floating Point Constant
5950 return C_Immediate;
5951 case 'i': // Simple Integer or Relocatable Constant
5952 case 's': // Relocatable Constant
5953 case 'X': // Allow ANY value.
5954 case 'I': // Target registers.
5955 case 'J':
5956 case 'K':
5957 case 'L':
5958 case 'M':
5959 case 'N':
5960 case 'O':
5961 case 'P':
5962 case '<':
5963 case '>':
5964 return C_Other;
5965 }
5966 }
5967
5968 if (S > 1 && Constraint[0] == '{' && Constraint[S - 1] == '}') {
5969 if (S == 8 && Constraint.substr(1, 6) == "memory") // "{memory}"
5970 return C_Memory;
5971 return C_Register;
5972 }
5973 return C_Unknown;
5974}
5975
5976/// Try to replace an X constraint, which matches anything, with another that
5977/// has more specific requirements based on the type of the corresponding
5978/// operand.
5979const char *TargetLowering::LowerXConstraint(EVT ConstraintVT) const {
5980 if (ConstraintVT.isInteger())
5981 return "r";
5982 if (ConstraintVT.isFloatingPoint())
5983 return "f"; // works for many targets
5984 return nullptr;
5985}
5986
5988 SDValue &Chain, SDValue &Glue, const SDLoc &DL,
5989 const AsmOperandInfo &OpInfo, SelectionDAG &DAG) const {
5990 return SDValue();
5991}
5992
5993/// Lower the specified operand into the Ops vector.
5994/// If it is invalid, don't add anything to Ops.
5996 StringRef Constraint,
5997 std::vector<SDValue> &Ops,
5998 SelectionDAG &DAG) const {
5999
6000 if (Constraint.size() > 1)
6001 return;
6002
6003 char ConstraintLetter = Constraint[0];
6004 switch (ConstraintLetter) {
6005 default: break;
6006 case 'X': // Allows any operand
6007 case 'i': // Simple Integer or Relocatable Constant
6008 case 'n': // Simple Integer
6009 case 's': { // Relocatable Constant
6010
6012 uint64_t Offset = 0;
6013
6014 // Match (GA) or (C) or (GA+C) or (GA-C) or ((GA+C)+C) or (((GA+C)+C)+C),
6015 // etc., since getelementpointer is variadic. We can't use
6016 // SelectionDAG::FoldSymbolOffset because it expects the GA to be accessible
6017 // while in this case the GA may be furthest from the root node which is
6018 // likely an ISD::ADD.
6019 while (true) {
6020 if ((C = dyn_cast<ConstantSDNode>(Op)) && ConstraintLetter != 's') {
6021 // gcc prints these as sign extended. Sign extend value to 64 bits
6022 // now; without this it would get ZExt'd later in
6023 // ScheduleDAGSDNodes::EmitNode, which is very generic.
6024 bool IsBool = C->getConstantIntValue()->getBitWidth() == 1;
6025 BooleanContent BCont = getBooleanContents(MVT::i64);
6026 ISD::NodeType ExtOpc =
6027 IsBool ? getExtendForContent(BCont) : ISD::SIGN_EXTEND;
6028 int64_t ExtVal =
6029 ExtOpc == ISD::ZERO_EXTEND ? C->getZExtValue() : C->getSExtValue();
6030 Ops.push_back(
6031 DAG.getTargetConstant(Offset + ExtVal, SDLoc(C), MVT::i64));
6032 return;
6033 }
6034 if (ConstraintLetter != 'n') {
6035 if (const auto *GA = dyn_cast<GlobalAddressSDNode>(Op)) {
6036 Ops.push_back(DAG.getTargetGlobalAddress(GA->getGlobal(), SDLoc(Op),
6037 GA->getValueType(0),
6038 Offset + GA->getOffset()));
6039 return;
6040 }
6041 if (const auto *BA = dyn_cast<BlockAddressSDNode>(Op)) {
6042 Ops.push_back(DAG.getTargetBlockAddress(
6043 BA->getBlockAddress(), BA->getValueType(0),
6044 Offset + BA->getOffset(), BA->getTargetFlags()));
6045 return;
6046 }
6048 Ops.push_back(Op);
6049 return;
6050 }
6051 }
6052 const unsigned OpCode = Op.getOpcode();
6053 if (OpCode == ISD::ADD || OpCode == ISD::SUB) {
6054 if ((C = dyn_cast<ConstantSDNode>(Op.getOperand(0))))
6055 Op = Op.getOperand(1);
6056 // Subtraction is not commutative.
6057 else if (OpCode == ISD::ADD &&
6058 (C = dyn_cast<ConstantSDNode>(Op.getOperand(1))))
6059 Op = Op.getOperand(0);
6060 else
6061 return;
6062 Offset += (OpCode == ISD::ADD ? 1 : -1) * C->getSExtValue();
6063 continue;
6064 }
6065 return;
6066 }
6067 break;
6068 }
6069 }
6070}
6071
6075
6076std::pair<unsigned, const TargetRegisterClass *>
6078 StringRef Constraint,
6079 MVT VT) const {
6080 if (!Constraint.starts_with("{"))
6081 return std::make_pair(0u, static_cast<TargetRegisterClass *>(nullptr));
6082 assert(*(Constraint.end() - 1) == '}' && "Not a brace enclosed constraint?");
6083
6084 // Remove the braces from around the name.
6085 StringRef RegName(Constraint.data() + 1, Constraint.size() - 2);
6086
6087 std::pair<unsigned, const TargetRegisterClass *> R =
6088 std::make_pair(0u, static_cast<const TargetRegisterClass *>(nullptr));
6089
6090 // Figure out which register class contains this reg.
6091 for (const TargetRegisterClass &RC : RI->regclasses()) {
6092 // If none of the value types for this register class are valid, we
6093 // can't use it. For example, 64-bit reg classes on 32-bit targets.
6094 if (!isLegalRC(*RI, RC))
6095 continue;
6096
6097 for (const MCPhysReg &PR : RC) {
6098 if (RegName.equals_insensitive(RI->getRegAsmName(PR))) {
6099 std::pair<unsigned, const TargetRegisterClass *> S =
6100 std::make_pair(PR, &RC);
6101
6102 // If this register class has the requested value type, return it,
6103 // otherwise keep searching and return the first class found
6104 // if no other is found which explicitly has the requested type.
6105 if (RI->isTypeLegalForClass(RC, VT))
6106 return S;
6107 if (!R.second)
6108 R = S;
6109 }
6110 }
6111 }
6112
6113 return R;
6114}
6115
6116//===----------------------------------------------------------------------===//
6117// Constraint Selection.
6118
6119/// Return true of this is an input operand that is a matching constraint like
6120/// "4".
6122 assert(!ConstraintCode.empty() && "No known constraint!");
6123 return isdigit(static_cast<unsigned char>(ConstraintCode[0]));
6124}
6125
6126/// If this is an input matching constraint, this method returns the output
6127/// operand it matches.
6129 assert(!ConstraintCode.empty() && "No known constraint!");
6130 return atoi(ConstraintCode.c_str());
6131}
6132
6133/// Split up the constraint string from the inline assembly value into the
6134/// specific constraints and their prefixes, and also tie in the associated
6135/// operand values.
6136/// If this returns an empty vector, and if the constraint string itself
6137/// isn't empty, there was an error parsing.
6140 const TargetRegisterInfo *TRI,
6141 const CallBase &Call) const {
6142 /// Information about all of the constraints.
6143 AsmOperandInfoVector ConstraintOperands;
6144 const InlineAsm *IA = cast<InlineAsm>(Call.getCalledOperand());
6145 unsigned maCount = 0; // Largest number of multiple alternative constraints.
6146
6147 // Do a prepass over the constraints, canonicalizing them, and building up the
6148 // ConstraintOperands list.
6149 unsigned ArgNo = 0; // ArgNo - The argument of the CallInst.
6150 unsigned ResNo = 0; // ResNo - The result number of the next output.
6151 unsigned LabelNo = 0; // LabelNo - CallBr indirect dest number.
6152
6153 for (InlineAsm::ConstraintInfo &CI : IA->ParseConstraints()) {
6154 ConstraintOperands.emplace_back(std::move(CI));
6155 AsmOperandInfo &OpInfo = ConstraintOperands.back();
6156
6157 // Update multiple alternative constraint count.
6158 if (OpInfo.multipleAlternatives.size() > maCount)
6159 maCount = OpInfo.multipleAlternatives.size();
6160
6161 OpInfo.ConstraintVT = MVT::Other;
6162
6163 // Compute the value type for each operand.
6164 switch (OpInfo.Type) {
6165 case InlineAsm::isOutput: {
6166 // Indirect outputs just consume an argument.
6167 if (OpInfo.isIndirect) {
6168 OpInfo.CallOperandVal = Call.getArgOperand(ArgNo);
6169 break;
6170 }
6171
6172 // The return value of the call is this value. As such, there is no
6173 // corresponding argument.
6174 assert(!Call.getType()->isVoidTy() && "Bad inline asm!");
6175 EVT VT;
6176 if (auto *STy = dyn_cast<StructType>(Call.getType())) {
6177 VT = getAsmOperandValueType(DL, STy->getElementType(ResNo));
6178 } else {
6179 assert(ResNo == 0 && "Asm only has one result!");
6180 VT = getAsmOperandValueType(DL, Call.getType());
6181 }
6182 OpInfo.ConstraintVT = VT.isSimple() ? VT.getSimpleVT() : MVT::Other;
6183 ++ResNo;
6184 break;
6185 }
6186 case InlineAsm::isInput:
6187 OpInfo.CallOperandVal = Call.getArgOperand(ArgNo);
6188 break;
6189 case InlineAsm::isLabel:
6190 OpInfo.CallOperandVal = cast<CallBrInst>(&Call)->getIndirectDest(LabelNo);
6191 ++LabelNo;
6192 continue;
6194 // Nothing to do.
6195 break;
6196 }
6197
6198 if (OpInfo.CallOperandVal) {
6199 llvm::Type *OpTy = OpInfo.CallOperandVal->getType();
6200 if (OpInfo.isIndirect) {
6201 OpTy = Call.getParamElementType(ArgNo);
6202 assert(OpTy && "Indirect operand must have elementtype attribute");
6203 }
6204
6205 // Look for vector wrapped in a struct. e.g. { <16 x i8> }.
6207 if (STy->getNumElements() == 1)
6208 OpTy = STy->getElementType(0);
6209
6210 // If OpTy is not a single value, it may be a struct/union that we
6211 // can tile with integers.
6212 if (!OpTy->isSingleValueType() && OpTy->isSized()) {
6213 unsigned BitSize = DL.getTypeSizeInBits(OpTy);
6214 switch (BitSize) {
6215 default: break;
6216 case 1:
6217 case 8:
6218 case 16:
6219 case 32:
6220 case 64:
6221 case 128:
6222 OpTy = IntegerType::get(OpTy->getContext(), BitSize);
6223 break;
6224 }
6225 }
6226
6227 EVT VT = getAsmOperandValueType(DL, OpTy, true);
6228 OpInfo.ConstraintVT = VT.isSimple() ? VT.getSimpleVT() : MVT::Other;
6229 ArgNo++;
6230 }
6231 }
6232
6233 // If we have multiple alternative constraints, select the best alternative.
6234 if (!ConstraintOperands.empty()) {
6235 if (maCount) {
6236 unsigned bestMAIndex = 0;
6237 int bestWeight = -1;
6238 // weight: -1 = invalid match, and 0 = so-so match to 5 = good match.
6239 int weight = -1;
6240 unsigned maIndex;
6241 // Compute the sums of the weights for each alternative, keeping track
6242 // of the best (highest weight) one so far.
6243 for (maIndex = 0; maIndex < maCount; ++maIndex) {
6244 int weightSum = 0;
6245 for (unsigned cIndex = 0, eIndex = ConstraintOperands.size();
6246 cIndex != eIndex; ++cIndex) {
6247 AsmOperandInfo &OpInfo = ConstraintOperands[cIndex];
6248 if (OpInfo.Type == InlineAsm::isClobber)
6249 continue;
6250
6251 // If this is an output operand with a matching input operand,
6252 // look up the matching input. If their types mismatch, e.g. one
6253 // is an integer, the other is floating point, or their sizes are
6254 // different, flag it as an maCantMatch.
6255 if (OpInfo.hasMatchingInput()) {
6256 AsmOperandInfo &Input = ConstraintOperands[OpInfo.MatchingInput];
6257 if (OpInfo.ConstraintVT != Input.ConstraintVT) {
6258 if ((OpInfo.ConstraintVT.isInteger() !=
6259 Input.ConstraintVT.isInteger()) ||
6260 (OpInfo.ConstraintVT.getSizeInBits() !=
6261 Input.ConstraintVT.getSizeInBits())) {
6262 weightSum = -1; // Can't match.
6263 break;
6264 }
6265 }
6266 }
6267 weight = getMultipleConstraintMatchWeight(OpInfo, maIndex);
6268 if (weight == -1) {
6269 weightSum = -1;
6270 break;
6271 }
6272 weightSum += weight;
6273 }
6274 // Update best.
6275 if (weightSum > bestWeight) {
6276 bestWeight = weightSum;
6277 bestMAIndex = maIndex;
6278 }
6279 }
6280
6281 // Now select chosen alternative in each constraint.
6282 for (AsmOperandInfo &cInfo : ConstraintOperands)
6283 if (cInfo.Type != InlineAsm::isClobber)
6284 cInfo.selectAlternative(bestMAIndex);
6285 }
6286 }
6287
6288 // Check and hook up tied operands, choose constraint code to use.
6289 for (unsigned cIndex = 0, eIndex = ConstraintOperands.size();
6290 cIndex != eIndex; ++cIndex) {
6291 AsmOperandInfo &OpInfo = ConstraintOperands[cIndex];
6292
6293 // If this is an output operand with a matching input operand, look up the
6294 // matching input. If their types mismatch, e.g. one is an integer, the
6295 // other is floating point, or their sizes are different, flag it as an
6296 // error.
6297 if (OpInfo.hasMatchingInput()) {
6298 AsmOperandInfo &Input = ConstraintOperands[OpInfo.MatchingInput];
6299
6300 if (OpInfo.ConstraintVT != Input.ConstraintVT) {
6301 std::pair<unsigned, const TargetRegisterClass *> MatchRC =
6302 getRegForInlineAsmConstraint(TRI, OpInfo.ConstraintCode,
6303 OpInfo.ConstraintVT);
6304 std::pair<unsigned, const TargetRegisterClass *> InputRC =
6305 getRegForInlineAsmConstraint(TRI, Input.ConstraintCode,
6306 Input.ConstraintVT);
6307 const bool OutOpIsIntOrFP = OpInfo.ConstraintVT.isInteger() ||
6308 OpInfo.ConstraintVT.isFloatingPoint();
6309 const bool InOpIsIntOrFP = Input.ConstraintVT.isInteger() ||
6310 Input.ConstraintVT.isFloatingPoint();
6311 if ((OutOpIsIntOrFP != InOpIsIntOrFP) ||
6312 (MatchRC.second != InputRC.second)) {
6313 report_fatal_error("Unsupported asm: input constraint"
6314 " with a matching output constraint of"
6315 " incompatible type!");
6316 }
6317 }
6318 }
6319 }
6320
6321 return ConstraintOperands;
6322}
6323
6324/// Return a number indicating our preference for chosing a type of constraint
6325/// over another, for the purpose of sorting them. Immediates are almost always
6326/// preferrable (when they can be emitted). A higher return value means a
6327/// stronger preference for one constraint type relative to another.
6328/// FIXME: We should prefer registers over memory but doing so may lead to
6329/// unrecoverable register exhaustion later.
6330/// https://github.com/llvm/llvm-project/issues/20571
6332 switch (CT) {
6335 return 4;
6338 return 3;
6340 return 2;
6342 return 1;
6344 return 0;
6345 }
6346 llvm_unreachable("Invalid constraint type");
6347}
6348
6349/// Examine constraint type and operand type and determine a weight value.
6350/// This object must already have been set up with the operand type
6351/// and the current alternative constraint selected.
6354 AsmOperandInfo &info, int maIndex) const {
6356 if (maIndex >= (int)info.multipleAlternatives.size())
6357 rCodes = &info.Codes;
6358 else
6359 rCodes = &info.multipleAlternatives[maIndex].Codes;
6360 ConstraintWeight BestWeight = CW_Invalid;
6361
6362 // Loop over the options, keeping track of the most general one.
6363 for (const std::string &rCode : *rCodes) {
6364 ConstraintWeight weight =
6365 getSingleConstraintMatchWeight(info, rCode.c_str());
6366 if (weight > BestWeight)
6367 BestWeight = weight;
6368 }
6369
6370 return BestWeight;
6371}
6372
6373/// Examine constraint type and operand type and determine a weight value.
6374/// This object must already have been set up with the operand type
6375/// and the current alternative constraint selected.
6378 AsmOperandInfo &info, const char *constraint) const {
6380 Value *CallOperandVal = info.CallOperandVal;
6381 // If we don't have a value, we can't do a match,
6382 // but allow it at the lowest weight.
6383 if (!CallOperandVal)
6384 return CW_Default;
6385 // Look at the constraint type.
6386 switch (*constraint) {
6387 case 'i': // immediate integer.
6388 case 'n': // immediate integer with a known value.
6389 if (isa<ConstantInt>(CallOperandVal))
6390 weight = CW_Constant;
6391 break;
6392 case 's': // non-explicit intregal immediate.
6393 if (isa<GlobalValue>(CallOperandVal))
6394 weight = CW_Constant;
6395 break;
6396 case 'E': // immediate float if host format.
6397 case 'F': // immediate float.
6398 if (isa<ConstantFP>(CallOperandVal))
6399 weight = CW_Constant;
6400 break;
6401 case '<': // memory operand with autodecrement.
6402 case '>': // memory operand with autoincrement.
6403 case 'm': // memory operand.
6404 case 'o': // offsettable memory operand
6405 case 'V': // non-offsettable memory operand
6406 weight = CW_Memory;
6407 break;
6408 case 'r': // general register.
6409 case 'g': // general register, memory operand or immediate integer.
6410 // note: Clang converts "g" to "imr".
6411 if (CallOperandVal->getType()->isIntegerTy())
6412 weight = CW_Register;
6413 break;
6414 case 'X': // any operand.
6415 default:
6416 weight = CW_Default;
6417 break;
6418 }
6419 return weight;
6420}
6421
6422/// If there are multiple different constraints that we could pick for this
6423/// operand (e.g. "imr") try to pick the 'best' one.
6424/// This is somewhat tricky: constraints (TargetLowering::ConstraintType) fall
6425/// into seven classes:
6426/// Register -> one specific register
6427/// RegisterClass -> a group of regs
6428/// Memory -> memory
6429/// Address -> a symbolic memory reference
6430/// Immediate -> immediate values
6431/// Other -> magic values (such as "Flag Output Operands")
6432/// Unknown -> something we don't recognize yet and can't handle
6433/// Ideally, we would pick the most specific constraint possible: if we have
6434/// something that fits into a register, we would pick it. The problem here
6435/// is that if we have something that could either be in a register or in
6436/// memory that use of the register could cause selection of *other*
6437/// operands to fail: they might only succeed if we pick memory. Because of
6438/// this the heuristic we use is:
6439///
6440/// 1) If there is an 'other' constraint, and if the operand is valid for
6441/// that constraint, use it. This makes us take advantage of 'i'
6442/// constraints when available.
6443/// 2) Otherwise, pick the most general constraint present. This prefers
6444/// 'm' over 'r', for example.
6445///
6447 TargetLowering::AsmOperandInfo &OpInfo) const {
6448 ConstraintGroup Ret;
6449
6450 Ret.reserve(OpInfo.Codes.size());
6451 for (StringRef Code : OpInfo.Codes) {
6453
6454 // Indirect 'other' or 'immediate' constraints are not allowed.
6455 if (OpInfo.isIndirect && !(CType == TargetLowering::C_Memory ||
6456 CType == TargetLowering::C_Register ||
6458 continue;
6459
6460 // Things with matching constraints can only be registers, per gcc
6461 // documentation. This mainly affects "g" constraints.
6462 if (CType == TargetLowering::C_Memory && OpInfo.hasMatchingInput())
6463 continue;
6464
6465 Ret.emplace_back(Code, CType);
6466 }
6467
6469 return getConstraintPiority(a.second) > getConstraintPiority(b.second);
6470 });
6471
6472 return Ret;
6473}
6474
6475/// If we have an immediate, see if we can lower it. Return true if we can,
6476/// false otherwise.
6478 SDValue Op, SelectionDAG *DAG,
6479 const TargetLowering &TLI) {
6480
6481 assert((P.second == TargetLowering::C_Other ||
6482 P.second == TargetLowering::C_Immediate) &&
6483 "need immediate or other");
6484
6485 if (!Op.getNode())
6486 return false;
6487
6488 std::vector<SDValue> ResultOps;
6489 TLI.LowerAsmOperandForConstraint(Op, P.first, ResultOps, *DAG);
6490 return !ResultOps.empty();
6491}
6492
6493/// Determines the constraint code and constraint type to use for the specific
6494/// AsmOperandInfo, setting OpInfo.ConstraintCode and OpInfo.ConstraintType.
6496 SDValue Op,
6497 SelectionDAG *DAG) const {
6498 assert(!OpInfo.Codes.empty() && "Must have at least one constraint");
6499
6500 // Single-letter constraints ('r') are very common.
6501 if (OpInfo.Codes.size() == 1) {
6502 OpInfo.ConstraintCode = OpInfo.Codes[0];
6503 OpInfo.ConstraintType = getConstraintType(OpInfo.ConstraintCode);
6504 } else {
6506 if (G.empty())
6507 return;
6508
6509 unsigned BestIdx = 0;
6510 for (const unsigned E = G.size();
6511 BestIdx < E && (G[BestIdx].second == TargetLowering::C_Other ||
6512 G[BestIdx].second == TargetLowering::C_Immediate);
6513 ++BestIdx) {
6514 if (lowerImmediateIfPossible(G[BestIdx], Op, DAG, *this))
6515 break;
6516 // If we're out of constraints, just pick the first one.
6517 if (BestIdx + 1 == E) {
6518 BestIdx = 0;
6519 break;
6520 }
6521 }
6522
6523 OpInfo.ConstraintCode = G[BestIdx].first;
6524 OpInfo.ConstraintType = G[BestIdx].second;
6525 }
6526
6527 // 'X' matches anything.
6528 if (OpInfo.ConstraintCode == "X" && OpInfo.CallOperandVal) {
6529 // Constants are handled elsewhere. For Functions, the type here is the
6530 // type of the result, which is not what we want to look at; leave them
6531 // alone.
6532 Value *v = OpInfo.CallOperandVal;
6533 if (isa<ConstantInt>(v) || isa<Function>(v)) {
6534 return;
6535 }
6536
6537 if (isa<BasicBlock>(v) || isa<BlockAddress>(v)) {
6538 OpInfo.ConstraintCode = "i";
6539 return;
6540 }
6541
6542 // Otherwise, try to resolve it to something we know about by looking at
6543 // the actual operand type.
6544 if (const char *Repl = LowerXConstraint(OpInfo.ConstraintVT)) {
6545 OpInfo.ConstraintCode = Repl;
6546 OpInfo.ConstraintType = getConstraintType(OpInfo.ConstraintCode);
6547 }
6548 }
6549}
6550
6551/// Given an exact SDIV by a constant, create a multiplication
6552/// with the multiplicative inverse of the constant.
6553/// Ref: "Hacker's Delight" by Henry Warren, 2nd Edition, p. 242
6555 const SDLoc &dl, SelectionDAG &DAG,
6556 SmallVectorImpl<SDNode *> &Created) {
6557 SDValue Op0 = N->getOperand(0);
6558 SDValue Op1 = N->getOperand(1);
6559 EVT VT = N->getValueType(0);
6560 EVT ShVT = TLI.getShiftAmountTy(VT, DAG.getDataLayout());
6561 EVT ShSVT = ShVT.getScalarType();
6562
6563 bool UseSRA = false;
6564 SmallVector<SDValue, 16> Shifts, Factors;
6565
6566 auto BuildSDIVPattern = [&](ConstantSDNode *C) {
6567 if (C->isZero())
6568 return false;
6569
6570 EVT CT = C->getValueType(0);
6571 APInt Divisor = C->getAPIntValue();
6572 unsigned Shift = Divisor.countr_zero();
6573 if (Shift) {
6574 Divisor.ashrInPlace(Shift);
6575 UseSRA = true;
6576 }
6577 APInt Factor = Divisor.multiplicativeInverse();
6578 Shifts.push_back(DAG.getConstant(Shift, dl, ShSVT));
6579 Factors.push_back(DAG.getConstant(Factor, dl, CT));
6580 return true;
6581 };
6582
6583 // Collect all magic values from the build vector.
6584 if (!ISD::matchUnaryPredicate(Op1, BuildSDIVPattern))
6585 return SDValue();
6586
6587 SDValue Shift, Factor;
6588 if (Op1.getOpcode() == ISD::BUILD_VECTOR) {
6589 Shift = DAG.getBuildVector(ShVT, dl, Shifts);
6590 Factor = DAG.getBuildVector(VT, dl, Factors);
6591 } else if (Op1.getOpcode() == ISD::SPLAT_VECTOR) {
6592 assert(Shifts.size() == 1 && Factors.size() == 1 &&
6593 "Expected matchUnaryPredicate to return one element for scalable "
6594 "vectors");
6595 Shift = DAG.getSplatVector(ShVT, dl, Shifts[0]);
6596 Factor = DAG.getSplatVector(VT, dl, Factors[0]);
6597 } else {
6598 assert(isa<ConstantSDNode>(Op1) && "Expected a constant");
6599 Shift = Shifts[0];
6600 Factor = Factors[0];
6601 }
6602
6603 SDValue Res = Op0;
6604 if (UseSRA) {
6605 Res = DAG.getNode(ISD::SRA, dl, VT, Res, Shift, SDNodeFlags::Exact);
6606 Created.push_back(Res.getNode());
6607 }
6608
6609 return DAG.getNode(ISD::MUL, dl, VT, Res, Factor);
6610}
6611
6612/// Given an exact UDIV by a constant, create a multiplication
6613/// with the multiplicative inverse of the constant.
6614/// Ref: "Hacker's Delight" by Henry Warren, 2nd Edition, p. 242
6616 const SDLoc &dl, SelectionDAG &DAG,
6617 SmallVectorImpl<SDNode *> &Created) {
6618 EVT VT = N->getValueType(0);
6619 EVT ShVT = TLI.getShiftAmountTy(VT, DAG.getDataLayout());
6620 EVT ShSVT = ShVT.getScalarType();
6621
6622 bool UseSRL = false;
6623 SmallVector<SDValue, 16> Shifts, Factors;
6624
6625 auto BuildUDIVPattern = [&](ConstantSDNode *C) {
6626 if (C->isZero())
6627 return false;
6628
6629 EVT CT = C->getValueType(0);
6630 APInt Divisor = C->getAPIntValue();
6631 unsigned Shift = Divisor.countr_zero();
6632 if (Shift) {
6633 Divisor.lshrInPlace(Shift);
6634 UseSRL = true;
6635 }
6636 // Calculate the multiplicative inverse modulo BW.
6637 APInt Factor = Divisor.multiplicativeInverse();
6638 Shifts.push_back(DAG.getConstant(Shift, dl, ShSVT));
6639 Factors.push_back(DAG.getConstant(Factor, dl, CT));
6640 return true;
6641 };
6642
6643 SDValue Op1 = N->getOperand(1);
6644
6645 // Collect all magic values from the build vector.
6646 if (!ISD::matchUnaryPredicate(Op1, BuildUDIVPattern))
6647 return SDValue();
6648
6649 SDValue Shift, Factor;
6650 if (Op1.getOpcode() == ISD::BUILD_VECTOR) {
6651 Shift = DAG.getBuildVector(ShVT, dl, Shifts);
6652 Factor = DAG.getBuildVector(VT, dl, Factors);
6653 } else if (Op1.getOpcode() == ISD::SPLAT_VECTOR) {
6654 assert(Shifts.size() == 1 && Factors.size() == 1 &&
6655 "Expected matchUnaryPredicate to return one element for scalable "
6656 "vectors");
6657 Shift = DAG.getSplatVector(ShVT, dl, Shifts[0]);
6658 Factor = DAG.getSplatVector(VT, dl, Factors[0]);
6659 } else {
6660 assert(isa<ConstantSDNode>(Op1) && "Expected a constant");
6661 Shift = Shifts[0];
6662 Factor = Factors[0];
6663 }
6664
6665 SDValue Res = N->getOperand(0);
6666 if (UseSRL) {
6667 Res = DAG.getNode(ISD::SRL, dl, VT, Res, Shift, SDNodeFlags::Exact);
6668 Created.push_back(Res.getNode());
6669 }
6670
6671 return DAG.getNode(ISD::MUL, dl, VT, Res, Factor);
6672}
6673
6675 SelectionDAG &DAG,
6676 SmallVectorImpl<SDNode *> &Created) const {
6677 AttributeList Attr = DAG.getMachineFunction().getFunction().getAttributes();
6678 if (isIntDivCheap(N->getValueType(0), Attr))
6679 return SDValue(N, 0); // Lower SDIV as SDIV
6680 return SDValue();
6681}
6682
6683SDValue
6685 SelectionDAG &DAG,
6686 SmallVectorImpl<SDNode *> &Created) const {
6687 AttributeList Attr = DAG.getMachineFunction().getFunction().getAttributes();
6688 if (isIntDivCheap(N->getValueType(0), Attr))
6689 return SDValue(N, 0); // Lower SREM as SREM
6690 return SDValue();
6691}
6692
6693/// Build sdiv by power-of-2 with conditional move instructions
6694/// Ref: "Hacker's Delight" by Henry Warren 10-1
6695/// If conditional move/branch is preferred, we lower sdiv x, +/-2**k into:
6696/// bgez x, label
6697/// add x, x, 2**k-1
6698/// label:
6699/// sra res, x, k
6700/// neg res, res (when the divisor is negative)
6702 SDNode *N, const APInt &Divisor, SelectionDAG &DAG,
6703 SmallVectorImpl<SDNode *> &Created) const {
6704 unsigned Lg2 = Divisor.countr_zero();
6705 EVT VT = N->getValueType(0);
6706
6707 SDLoc DL(N);
6708 SDValue N0 = N->getOperand(0);
6709 SDValue Zero = DAG.getConstant(0, DL, VT);
6710 APInt Lg2Mask = APInt::getLowBitsSet(VT.getSizeInBits(), Lg2);
6711 SDValue Pow2MinusOne = DAG.getConstant(Lg2Mask, DL, VT);
6712
6713 // If N0 is negative, we need to add (Pow2 - 1) to it before shifting right.
6714 EVT CCVT = getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
6715 SDValue Cmp = DAG.getSetCC(DL, CCVT, N0, Zero, ISD::SETLT);
6716 SDValue Add = DAG.getNode(ISD::ADD, DL, VT, N0, Pow2MinusOne);
6717 SDValue CMov = DAG.getNode(ISD::SELECT, DL, VT, Cmp, Add, N0);
6718
6719 Created.push_back(Cmp.getNode());
6720 Created.push_back(Add.getNode());
6721 Created.push_back(CMov.getNode());
6722
6723 // Divide by pow2.
6724 SDValue SRA = DAG.getNode(ISD::SRA, DL, VT, CMov,
6725 DAG.getShiftAmountConstant(Lg2, VT, DL));
6726
6727 // If we're dividing by a positive value, we're done. Otherwise, we must
6728 // negate the result.
6729 if (Divisor.isNonNegative())
6730 return SRA;
6731
6732 Created.push_back(SRA.getNode());
6733 return DAG.getNode(ISD::SUB, DL, VT, Zero, SRA);
6734}
6735
6736/// Given an ISD::SDIV node expressing a divide by constant,
6737/// return a DAG expression to select that will generate the same value by
6738/// multiplying by a magic number.
6739/// Ref: "Hacker's Delight" or "The PowerPC Compiler Writer's Guide".
6741 bool IsAfterLegalization,
6742 bool IsAfterLegalTypes,
6743 SmallVectorImpl<SDNode *> &Created) const {
6744 SDLoc dl(N);
6745
6746 // If the sdiv has an 'exact' bit we can use a simpler lowering.
6747 if (N->getFlags().hasExact())
6748 return BuildExactSDIV(*this, N, dl, DAG, Created);
6749
6750 EVT VT = N->getValueType(0);
6751 EVT SVT = VT.getScalarType();
6752 EVT ShVT = getShiftAmountTy(VT, DAG.getDataLayout());
6753 EVT ShSVT = ShVT.getScalarType();
6754 unsigned EltBits = VT.getScalarSizeInBits();
6755 EVT MulVT;
6756
6757 // Check to see if we can do this.
6758 // FIXME: We should be more aggressive here.
6759 EVT QueryVT = VT;
6760 if (VT.isVector()) {
6761 // If the vector type will be legalized to a vector type with the same
6762 // element type, allow the transform before type legalization if MULHS or
6763 // SMUL_LOHI are supported.
6764 QueryVT = getLegalTypeToTransformTo(*DAG.getContext(), VT);
6765 if (!QueryVT.isVector() ||
6767 return SDValue();
6768 } else if (!isTypeLegal(VT)) {
6769 // Limit this to simple scalars for now.
6770 if (!VT.isSimple())
6771 return SDValue();
6772
6773 // If this type will be promoted to a large enough type with a legal
6774 // multiply operation, we can go ahead and do this transform.
6776 return SDValue();
6777
6778 MulVT = getTypeToTransformTo(*DAG.getContext(), VT);
6779 if (MulVT.getSizeInBits() < (2 * EltBits) ||
6780 !isOperationLegal(ISD::MUL, MulVT))
6781 return SDValue();
6782 }
6783
6784 bool HasMULHS =
6785 isOperationLegalOrCustom(ISD::MULHS, QueryVT, IsAfterLegalization);
6786 bool HasSMUL_LOHI =
6787 isOperationLegalOrCustom(ISD::SMUL_LOHI, QueryVT, IsAfterLegalization);
6788
6789 if (isTypeLegal(VT) && !HasMULHS && !HasSMUL_LOHI && MulVT == EVT()) {
6790 // If type twice as wide legal, widen and use a mul plus a shift.
6791 EVT WideVT = VT.widenIntegerElementType(*DAG.getContext());
6792 // Some targets like AMDGPU try to go from SDIV to SDIVREM which is then
6793 // custom lowered. This is very expensive so avoid it at all costs for
6794 // constant divisors.
6795 if ((!IsAfterLegalTypes && isOperationExpand(ISD::SDIV, VT) &&
6798 MulVT = WideVT;
6799 }
6800
6801 if (!HasMULHS && !HasSMUL_LOHI && MulVT == EVT())
6802 return SDValue();
6803
6804 // If we're after type legalization and SVT is not legal, use the
6805 // promoted type for creating constants to avoid creating nodes with
6806 // illegal types.
6807 if (IsAfterLegalTypes && VT.isVector()) {
6808 SVT = getTypeToTransformTo(*DAG.getContext(), SVT);
6809 if (SVT.bitsLT(VT.getScalarType()))
6810 return SDValue();
6811 ShSVT = getTypeToTransformTo(*DAG.getContext(), ShSVT);
6812 if (ShSVT.bitsLT(ShVT.getScalarType()))
6813 return SDValue();
6814 }
6815 const unsigned SVTBits = SVT.getSizeInBits();
6816
6817 SmallVector<SDValue, 16> MagicFactors, Factors, Shifts, ShiftMasks;
6818
6819 auto BuildSDIVPattern = [&](ConstantSDNode *C) {
6820 if (C->isZero())
6821 return false;
6822 // Truncate the divisor to the target scalar type in case it was promoted
6823 // during type legalization.
6824 APInt Divisor = C->getAPIntValue().trunc(EltBits);
6826 int NumeratorFactor = 0;
6827 int ShiftMask = -1;
6828
6829 if (Divisor.isOne() || Divisor.isAllOnes()) {
6830 // If d is +1/-1, we just multiply the numerator by +1/-1.
6831 NumeratorFactor = Divisor.getSExtValue();
6832 magics.Magic = 0;
6833 magics.ShiftAmount = 0;
6834 ShiftMask = 0;
6835 } else if (Divisor.isStrictlyPositive() && magics.Magic.isNegative()) {
6836 // If d > 0 and m < 0, add the numerator.
6837 NumeratorFactor = 1;
6838 } else if (Divisor.isNegative() && magics.Magic.isStrictlyPositive()) {
6839 // If d < 0 and m > 0, subtract the numerator.
6840 NumeratorFactor = -1;
6841 }
6842
6843 MagicFactors.push_back(
6844 DAG.getConstant(magics.Magic.zext(SVTBits), dl, SVT));
6845 Factors.push_back(DAG.getSignedConstant(NumeratorFactor, dl, SVT));
6846 Shifts.push_back(DAG.getConstant(magics.ShiftAmount, dl, ShSVT));
6847 ShiftMasks.push_back(DAG.getSignedConstant(ShiftMask, dl, SVT));
6848 return true;
6849 };
6850
6851 SDValue N0 = N->getOperand(0);
6852 SDValue N1 = N->getOperand(1);
6853
6854 // Collect the shifts / magic values from each element.
6855 if (!ISD::matchUnaryPredicate(N1, BuildSDIVPattern, /*AllowUndefs=*/false,
6856 /*AllowTruncation=*/true))
6857 return SDValue();
6858
6859 SDValue MagicFactor, Factor, Shift, ShiftMask;
6860 if (N1.getOpcode() == ISD::BUILD_VECTOR) {
6861 MagicFactor = DAG.getBuildVector(VT, dl, MagicFactors);
6862 Factor = DAG.getBuildVector(VT, dl, Factors);
6863 Shift = DAG.getBuildVector(ShVT, dl, Shifts);
6864 ShiftMask = DAG.getBuildVector(VT, dl, ShiftMasks);
6865 } else if (N1.getOpcode() == ISD::SPLAT_VECTOR) {
6866 assert(MagicFactors.size() == 1 && Factors.size() == 1 &&
6867 Shifts.size() == 1 && ShiftMasks.size() == 1 &&
6868 "Expected matchUnaryPredicate to return one element for scalable "
6869 "vectors");
6870 MagicFactor = DAG.getSplatVector(VT, dl, MagicFactors[0]);
6871 Factor = DAG.getSplatVector(VT, dl, Factors[0]);
6872 Shift = DAG.getSplatVector(ShVT, dl, Shifts[0]);
6873 ShiftMask = DAG.getSplatVector(VT, dl, ShiftMasks[0]);
6874 } else {
6875 assert(isa<ConstantSDNode>(N1) && "Expected a constant");
6876 MagicFactor = MagicFactors[0];
6877 Factor = Factors[0];
6878 Shift = Shifts[0];
6879 ShiftMask = ShiftMasks[0];
6880 }
6881
6882 // Multiply the numerator (operand 0) by the magic value.
6883 auto GetMULHS = [&](SDValue X, SDValue Y) {
6884 if (HasMULHS)
6885 return DAG.getNode(ISD::MULHS, dl, VT, X, Y);
6886 if (HasSMUL_LOHI) {
6887 SDValue LoHi =
6888 DAG.getNode(ISD::SMUL_LOHI, dl, DAG.getVTList(VT, VT), X, Y);
6889 return LoHi.getValue(1);
6890 }
6891
6892 X = DAG.getNode(ISD::SIGN_EXTEND, dl, MulVT, X);
6893 Y = DAG.getNode(ISD::SIGN_EXTEND, dl, MulVT, Y);
6894 Y = DAG.getNode(ISD::MUL, dl, MulVT, X, Y);
6895 Y = DAG.getNode(ISD::SRL, dl, MulVT, Y,
6896 DAG.getShiftAmountConstant(EltBits, MulVT, dl));
6897 return DAG.getNode(ISD::TRUNCATE, dl, VT, Y);
6898 };
6899
6900 SDValue Q = GetMULHS(N0, MagicFactor);
6901 if (!Q)
6902 return SDValue();
6903
6904 Created.push_back(Q.getNode());
6905
6906 // (Optionally) Add/subtract the numerator using Factor.
6907 Factor = DAG.getNode(ISD::MUL, dl, VT, N0, Factor);
6908 Created.push_back(Factor.getNode());
6909 Q = DAG.getNode(ISD::ADD, dl, VT, Q, Factor);
6910 Created.push_back(Q.getNode());
6911
6912 // Shift right algebraic by shift value.
6913 Q = DAG.getNode(ISD::SRA, dl, VT, Q, Shift);
6914 Created.push_back(Q.getNode());
6915
6916 // Extract the sign bit, mask it and add it to the quotient.
6917 SDValue SignShift = DAG.getConstant(EltBits - 1, dl, ShVT);
6918 SDValue T = DAG.getNode(ISD::SRL, dl, VT, Q, SignShift);
6919 Created.push_back(T.getNode());
6920 T = DAG.getNode(ISD::AND, dl, VT, T, ShiftMask);
6921 Created.push_back(T.getNode());
6922 return DAG.getNode(ISD::ADD, dl, VT, Q, T);
6923}
6924
6925/// Given an ISD::UDIV node expressing a divide by constant,
6926/// return a DAG expression to select that will generate the same value by
6927/// multiplying by a magic number.
6928/// Ref: "Hacker's Delight" or "The PowerPC Compiler Writer's Guide".
6930 bool IsAfterLegalization,
6931 bool IsAfterLegalTypes,
6932 SmallVectorImpl<SDNode *> &Created) const {
6933 SDLoc dl(N);
6934
6935 // If the udiv has an 'exact' bit we can use a simpler lowering.
6936 if (N->getFlags().hasExact())
6937 return BuildExactUDIV(*this, N, dl, DAG, Created);
6938
6939 EVT VT = N->getValueType(0);
6940 EVT SVT = VT.getScalarType();
6941 EVT ShVT = getShiftAmountTy(VT, DAG.getDataLayout());
6942 EVT ShSVT = ShVT.getScalarType();
6943 unsigned EltBits = VT.getScalarSizeInBits();
6944 EVT MulVT;
6945
6946 // Check to see if we can do this.
6947 // FIXME: We should be more aggressive here.
6948 EVT QueryVT = VT;
6949 if (VT.isVector()) {
6950 // If the vector type will be legalized to a vector type with the same
6951 // element type, allow the transform before type legalization if MULHU or
6952 // UMUL_LOHI are supported.
6953 QueryVT = getLegalTypeToTransformTo(*DAG.getContext(), VT);
6954 if (!QueryVT.isVector() ||
6956 return SDValue();
6957 } else if (!isTypeLegal(VT)) {
6958 // Limit this to simple scalars for now.
6959 if (!VT.isSimple())
6960 return SDValue();
6961
6962 // If this type will be promoted to a large enough type with a legal
6963 // multiply operation, we can go ahead and do this transform.
6965 return SDValue();
6966
6967 MulVT = getTypeToTransformTo(*DAG.getContext(), VT);
6968 if (MulVT.getSizeInBits() < (2 * EltBits) ||
6969 !isOperationLegal(ISD::MUL, MulVT))
6970 return SDValue();
6971 }
6972
6973 bool HasMULHU =
6974 isOperationLegalOrCustom(ISD::MULHU, QueryVT, IsAfterLegalization);
6975 bool HasUMUL_LOHI =
6976 isOperationLegalOrCustom(ISD::UMUL_LOHI, QueryVT, IsAfterLegalization);
6977
6978 if (isTypeLegal(VT) && !HasMULHU && !HasUMUL_LOHI && MulVT == EVT()) {
6979 // If type twice as wide legal, widen and use a mul plus a shift.
6980 EVT WideVT = VT.widenIntegerElementType(*DAG.getContext());
6981 // Some targets like AMDGPU try to go from UDIV to UDIVREM which is then
6982 // custom lowered. This is very expensive so avoid it at all costs for
6983 // constant divisors.
6984 if ((!IsAfterLegalTypes && isOperationExpand(ISD::UDIV, VT) &&
6987 MulVT = WideVT;
6988 }
6989
6990 if (!HasMULHU && !HasUMUL_LOHI && MulVT == EVT())
6991 return SDValue();
6992
6993 SDValue N0 = N->getOperand(0);
6994 SDValue N1 = N->getOperand(1);
6995
6996 // Try to use leading zeros of the dividend to reduce the multiplier and
6997 // avoid expensive fixups.
6998 unsigned KnownLeadingZeros = DAG.computeKnownBits(N0).countMinLeadingZeros();
6999
7000 // If we're after type legalization and SVT is not legal, use the
7001 // promoted type for creating constants to avoid creating nodes with
7002 // illegal types.
7003 if (IsAfterLegalTypes && VT.isVector()) {
7004 SVT = getTypeToTransformTo(*DAG.getContext(), SVT);
7005 if (SVT.bitsLT(VT.getScalarType()))
7006 return SDValue();
7007 ShSVT = getTypeToTransformTo(*DAG.getContext(), ShSVT);
7008 if (ShSVT.bitsLT(ShVT.getScalarType()))
7009 return SDValue();
7010 }
7011 const unsigned SVTBits = SVT.getSizeInBits();
7012
7013 // Allow i32 to be widened to i64 for uncooperative divisors if i64 MULHU or
7014 // UMUL_LOHI is supported.
7015 const EVT WideSVT = MVT::i64;
7016 const bool HasWideMULHU =
7017 VT == MVT::i32 &&
7018 isOperationLegalOrCustom(ISD::MULHU, WideSVT, IsAfterLegalization);
7019 const bool HasWideUMUL_LOHI =
7020 VT == MVT::i32 &&
7021 isOperationLegalOrCustom(ISD::UMUL_LOHI, WideSVT, IsAfterLegalization);
7022 const bool AllowWiden = (HasWideMULHU || HasWideUMUL_LOHI);
7023
7024 // For even divisors with a 33-bit magic number, the widened high-multiply
7025 // path is only worthwhile over the even-divisor rewrite on targets that
7026 // zero-extend i32 to i64 for free (e.g. x86-64 and AArch64). Elsewhere (e.g.
7027 // RISC-V) keep the even-divisor rewrite, which avoids the explicit extension.
7028 const bool AllowEvenToWiden = AllowWiden && isZExtFree(VT, WideSVT);
7029
7030 bool UseNPQ = false, UsePreShift = false, UsePostShift = false;
7031 bool UseWiden = false;
7032 SmallVector<SDValue, 16> PreShifts, PostShifts, MagicFactors, NPQFactors;
7033
7034 auto BuildUDIVPattern = [&](ConstantSDNode *C) {
7035 if (C->isZero())
7036 return false;
7037 // Truncate the divisor to the target scalar type in case it was promoted
7038 // during type legalization.
7039 APInt Divisor = C->getAPIntValue().trunc(EltBits);
7040
7041 SDValue PreShift, MagicFactor, NPQFactor, PostShift;
7042
7043 // Magic algorithm doesn't work for division by 1. We need to emit a select
7044 // at the end.
7045 if (Divisor.isOne()) {
7046 PreShift = PostShift = DAG.getUNDEF(ShSVT);
7047 MagicFactor = NPQFactor = DAG.getUNDEF(SVT);
7048 } else {
7051 Divisor, std::min(KnownLeadingZeros, Divisor.countl_zero()),
7052 /*AllowEvenDivisorOptimization=*/!AllowEvenToWiden,
7053 /*AllowWidenOptimization=*/AllowWiden);
7054
7055 if (magics.Widen) {
7056 UseWiden = true;
7057 MagicFactor = DAG.getConstant(magics.Magic, dl, WideSVT);
7058 } else {
7059 MagicFactor = DAG.getConstant(magics.Magic.zext(SVTBits), dl, SVT);
7060 }
7061
7062 assert(magics.PreShift < Divisor.getBitWidth() &&
7063 "We shouldn't generate an undefined shift!");
7064 assert(magics.PostShift < Divisor.getBitWidth() &&
7065 "We shouldn't generate an undefined shift!");
7066 assert((!magics.IsAdd || magics.PreShift == 0) &&
7067 "Unexpected pre-shift");
7068 PreShift = DAG.getConstant(magics.PreShift, dl, ShSVT);
7069 PostShift = DAG.getConstant(magics.PostShift, dl, ShSVT);
7070 NPQFactor = DAG.getConstant(
7071 magics.IsAdd ? APInt::getOneBitSet(SVTBits, EltBits - 1)
7072 : APInt::getZero(SVTBits),
7073 dl, SVT);
7074 UseNPQ |= magics.IsAdd;
7075 UsePreShift |= magics.PreShift != 0;
7076 UsePostShift |= magics.PostShift != 0;
7077 }
7078
7079 PreShifts.push_back(PreShift);
7080 MagicFactors.push_back(MagicFactor);
7081 NPQFactors.push_back(NPQFactor);
7082 PostShifts.push_back(PostShift);
7083 return true;
7084 };
7085
7086 // Collect the shifts/magic values from each element.
7087 if (!ISD::matchUnaryPredicate(N1, BuildUDIVPattern, /*AllowUndefs=*/false,
7088 /*AllowTruncation=*/true))
7089 return SDValue();
7090
7091 SDValue PreShift, PostShift, MagicFactor, NPQFactor;
7092 if (N1.getOpcode() == ISD::BUILD_VECTOR) {
7093 PreShift = DAG.getBuildVector(ShVT, dl, PreShifts);
7094 MagicFactor = DAG.getBuildVector(VT, dl, MagicFactors);
7095 NPQFactor = DAG.getBuildVector(VT, dl, NPQFactors);
7096 PostShift = DAG.getBuildVector(ShVT, dl, PostShifts);
7097 } else if (N1.getOpcode() == ISD::SPLAT_VECTOR) {
7098 assert(PreShifts.size() == 1 && MagicFactors.size() == 1 &&
7099 NPQFactors.size() == 1 && PostShifts.size() == 1 &&
7100 "Expected matchUnaryPredicate to return one for scalable vectors");
7101 PreShift = DAG.getSplatVector(ShVT, dl, PreShifts[0]);
7102 MagicFactor = DAG.getSplatVector(VT, dl, MagicFactors[0]);
7103 NPQFactor = DAG.getSplatVector(VT, dl, NPQFactors[0]);
7104 PostShift = DAG.getSplatVector(ShVT, dl, PostShifts[0]);
7105 } else {
7106 assert(isa<ConstantSDNode>(N1) && "Expected a constant");
7107 PreShift = PreShifts[0];
7108 MagicFactor = MagicFactors[0];
7109 PostShift = PostShifts[0];
7110 }
7111
7112 if (UseWiden) {
7113 // Compute: (WideSVT(x) * MagicFactor) >> WideSVTBits.
7114 SDValue WideN0 = DAG.getNode(ISD::ZERO_EXTEND, dl, WideSVT, N0);
7115
7116 // Perform WideSVTxWideSVT -> 2*WideSVT multiplication and extract high
7117 // WideSVT bits
7118 SDValue High;
7119 if (HasWideMULHU) {
7120 High = DAG.getNode(ISD::MULHU, dl, WideSVT, WideN0, MagicFactor);
7121 } else {
7122 assert(HasWideUMUL_LOHI);
7123 SDValue LoHi =
7124 DAG.getNode(ISD::UMUL_LOHI, dl, DAG.getVTList(WideSVT, WideSVT),
7125 WideN0, MagicFactor);
7126 High = LoHi.getValue(1);
7127 }
7128
7129 Created.push_back(High.getNode());
7130 return DAG.getNode(ISD::TRUNCATE, dl, VT, High);
7131 }
7132
7133 SDValue Q = N0;
7134 if (UsePreShift) {
7135 Q = DAG.getNode(ISD::SRL, dl, VT, Q, PreShift);
7136 Created.push_back(Q.getNode());
7137 }
7138
7139 auto GetMULHU = [&](SDValue X, SDValue Y) {
7140 if (HasMULHU)
7141 return DAG.getNode(ISD::MULHU, dl, VT, X, Y);
7142 if (HasUMUL_LOHI) {
7143 SDValue LoHi =
7144 DAG.getNode(ISD::UMUL_LOHI, dl, DAG.getVTList(VT, VT), X, Y);
7145 return LoHi.getValue(1);
7146 }
7147
7148 X = DAG.getNode(ISD::ZERO_EXTEND, dl, MulVT, X);
7149 Y = DAG.getNode(ISD::ZERO_EXTEND, dl, MulVT, Y);
7150 Y = DAG.getNode(ISD::MUL, dl, MulVT, X, Y);
7151 Y = DAG.getNode(ISD::SRL, dl, MulVT, Y,
7152 DAG.getShiftAmountConstant(EltBits, MulVT, dl));
7153 return DAG.getNode(ISD::TRUNCATE, dl, VT, Y);
7154 };
7155
7156 // Multiply the numerator (operand 0) by the magic value.
7157 Q = GetMULHU(Q, MagicFactor);
7158 if (!Q)
7159 return SDValue();
7160
7161 Created.push_back(Q.getNode());
7162
7163 if (UseNPQ) {
7164 SDValue NPQ = DAG.getNode(ISD::SUB, dl, VT, N0, Q);
7165 Created.push_back(NPQ.getNode());
7166
7167 // For vectors we might have a mix of non-NPQ/NPQ paths, so use
7168 // MULHU to act as a SRL-by-1 for NPQ, else multiply by zero.
7169 if (VT.isVector())
7170 NPQ = GetMULHU(NPQ, NPQFactor);
7171 else
7172 NPQ = DAG.getNode(ISD::SRL, dl, VT, NPQ, DAG.getConstant(1, dl, ShVT));
7173
7174 Created.push_back(NPQ.getNode());
7175
7176 Q = DAG.getNode(ISD::ADD, dl, VT, NPQ, Q);
7177 Created.push_back(Q.getNode());
7178 }
7179
7180 if (UsePostShift) {
7181 Q = DAG.getNode(ISD::SRL, dl, VT, Q, PostShift);
7182 Created.push_back(Q.getNode());
7183 }
7184
7185 EVT SetCCVT = getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
7186
7187 SDValue One = DAG.getConstant(1, dl, VT);
7188 SDValue IsOne = DAG.getSetCC(dl, SetCCVT, N1, One, ISD::SETEQ);
7189 return DAG.getSelect(dl, VT, IsOne, N0, Q);
7190}
7191
7192/// If all values in Values that *don't* match the predicate are same 'splat'
7193/// value, then replace all values with that splat value.
7194/// Else, if AlternativeReplacement was provided, then replace all values that
7195/// do match predicate with AlternativeReplacement value.
7196static void
7198 std::function<bool(SDValue)> Predicate,
7199 SDValue AlternativeReplacement = SDValue()) {
7200 SDValue Replacement;
7201 // Is there a value for which the Predicate does *NOT* match? What is it?
7202 auto SplatValue = llvm::find_if_not(Values, Predicate);
7203 if (SplatValue != Values.end()) {
7204 // Does Values consist only of SplatValue's and values matching Predicate?
7205 if (llvm::all_of(Values, [Predicate, SplatValue](SDValue Value) {
7206 return Value == *SplatValue || Predicate(Value);
7207 })) // Then we shall replace values matching predicate with SplatValue.
7208 Replacement = *SplatValue;
7209 }
7210 if (!Replacement) {
7211 // Oops, we did not find the "baseline" splat value.
7212 if (!AlternativeReplacement)
7213 return; // Nothing to do.
7214 // Let's replace with provided value then.
7215 Replacement = AlternativeReplacement;
7216 }
7217 std::replace_if(Values.begin(), Values.end(), Predicate, Replacement);
7218}
7219
7220/// Given an ISD::UREM used only by an ISD::SETEQ or ISD::SETNE
7221/// where the divisor and comparison target are constants,
7222/// return a DAG expression that will generate the same comparison result
7223/// using only multiplications, additions and shifts/rotations.
7224/// Ref: "Hacker's Delight" 10-17.
7225SDValue TargetLowering::buildUREMEqFold(EVT SETCCVT, SDValue REMNode,
7226 SDValue CompTargetNode,
7228 DAGCombinerInfo &DCI,
7229 const SDLoc &DL) const {
7231 if (SDValue Folded = prepareUREMEqFold(SETCCVT, REMNode, CompTargetNode, Cond,
7232 DCI, DL, Built)) {
7233 for (SDNode *N : Built)
7234 DCI.AddToWorklist(N);
7235 return Folded;
7236 }
7237
7238 return SDValue();
7239}
7240
7241SDValue
7242TargetLowering::prepareUREMEqFold(EVT SETCCVT, SDValue REMNode,
7243 SDValue CompTargetNode, ISD::CondCode Cond,
7244 DAGCombinerInfo &DCI, const SDLoc &DL,
7245 SmallVectorImpl<SDNode *> &Created) const {
7246 // fold (seteq/ne (urem N, D), C) ->
7247 // (setule/ugt (rotr (mul (sub N, C), P), K), Q)
7248 // - D must be constant, with D = D0 * 2^K where D0 is odd
7249 // - P is the multiplicative inverse of D0 modulo 2^W
7250 // - Q = floor(((2^W) - 1) / D)
7251 // where W is the width of the common type of N and D.
7252 assert((Cond == ISD::SETEQ || Cond == ISD::SETNE) &&
7253 "Only applicable for (in)equality comparisons.");
7254
7255 SelectionDAG &DAG = DCI.DAG;
7256
7257 EVT VT = REMNode.getValueType();
7258 EVT SVT = VT.getScalarType();
7259 EVT ShVT = getShiftAmountTy(VT, DAG.getDataLayout());
7260 EVT ShSVT = ShVT.getScalarType();
7261
7262 // If MUL is unavailable, we cannot proceed in any case.
7263 if (!DCI.isBeforeLegalizeOps() && !isOperationLegalOrCustom(ISD::MUL, VT))
7264 return SDValue();
7265
7266 bool ComparingWithAllZeros = true;
7267 bool AllComparisonsWithNonZerosAreTautological = true;
7268 bool HadTautologicalLanes = false;
7269 bool AllLanesAreTautological = true;
7270 bool HadEvenDivisor = false;
7271 bool AllDivisorsArePowerOfTwo = true;
7272 bool HadTautologicalInvertedLanes = false;
7273 SmallVector<SDValue, 16> PAmts, KAmts, QAmts;
7274
7275 auto BuildUREMPattern = [&](ConstantSDNode *CDiv, ConstantSDNode *CCmp) {
7276 // Division by 0 is UB. Leave it to be constant-folded elsewhere.
7277 if (CDiv->isZero())
7278 return false;
7279
7280 const APInt &D = CDiv->getAPIntValue();
7281 const APInt &Cmp = CCmp->getAPIntValue();
7282
7283 ComparingWithAllZeros &= Cmp.isZero();
7284
7285 // x u% C1` is *always* less than C1. So given `x u% C1 == C2`,
7286 // if C2 is not less than C1, the comparison is always false.
7287 // But we will only be able to produce the comparison that will give the
7288 // opposive tautological answer. So this lane would need to be fixed up.
7289 bool TautologicalInvertedLane = D.ule(Cmp);
7290 HadTautologicalInvertedLanes |= TautologicalInvertedLane;
7291
7292 // If all lanes are tautological (either all divisors are ones, or divisor
7293 // is not greater than the constant we are comparing with),
7294 // we will prefer to avoid the fold.
7295 bool TautologicalLane = D.isOne() || TautologicalInvertedLane;
7296 HadTautologicalLanes |= TautologicalLane;
7297 AllLanesAreTautological &= TautologicalLane;
7298
7299 // If we are comparing with non-zero, we need'll need to subtract said
7300 // comparison value from the LHS. But there is no point in doing that if
7301 // every lane where we are comparing with non-zero is tautological..
7302 if (!Cmp.isZero())
7303 AllComparisonsWithNonZerosAreTautological &= TautologicalLane;
7304
7305 // Decompose D into D0 * 2^K
7306 unsigned K = D.countr_zero();
7307 assert((!D.isOne() || (K == 0)) && "For divisor '1' we won't rotate.");
7308 APInt D0 = D.lshr(K);
7309
7310 // D is even if it has trailing zeros.
7311 HadEvenDivisor |= (K != 0);
7312 // D is a power-of-two if D0 is one.
7313 // If all divisors are power-of-two, we will prefer to avoid the fold.
7314 AllDivisorsArePowerOfTwo &= D0.isOne();
7315
7316 // P = inv(D0, 2^W)
7317 // 2^W requires W + 1 bits, so we have to extend and then truncate.
7318 unsigned W = D.getBitWidth();
7319 APInt P = D0.multiplicativeInverse();
7320 assert((D0 * P).isOne() && "Multiplicative inverse basic check failed.");
7321
7322 // Q = floor((2^W - 1) u/ D)
7323 // R = ((2^W - 1) u% D)
7324 APInt Q, R;
7326
7327 // If we are comparing with zero, then that comparison constant is okay,
7328 // else it may need to be one less than that.
7329 if (Cmp.ugt(R))
7330 Q -= 1;
7331
7333 "We are expecting that K is always less than all-ones for ShSVT");
7334
7335 // If the lane is tautological the result can be constant-folded.
7336 if (TautologicalLane) {
7337 // Set P and K amount to a bogus values so we can try to splat them.
7338 P = 0;
7339 KAmts.push_back(DAG.getAllOnesConstant(DL, ShSVT));
7340 // And ensure that comparison constant is tautological,
7341 // it will always compare true/false.
7342 Q.setAllBits();
7343 } else {
7344 KAmts.push_back(DAG.getConstant(K, DL, ShSVT));
7345 }
7346
7347 PAmts.push_back(DAG.getConstant(P, DL, SVT));
7348 QAmts.push_back(DAG.getConstant(Q, DL, SVT));
7349 return true;
7350 };
7351
7352 SDValue N = REMNode.getOperand(0);
7353 SDValue D = REMNode.getOperand(1);
7354
7355 // Collect the values from each element.
7356 if (!ISD::matchBinaryPredicate(D, CompTargetNode, BuildUREMPattern))
7357 return SDValue();
7358
7359 // If all lanes are tautological, the result can be constant-folded.
7360 if (AllLanesAreTautological)
7361 return SDValue();
7362
7363 // If this is a urem by a powers-of-two, avoid the fold since it can be
7364 // best implemented as a bit test.
7365 if (AllDivisorsArePowerOfTwo)
7366 return SDValue();
7367
7368 SDValue PVal, KVal, QVal;
7369 if (D.getOpcode() == ISD::BUILD_VECTOR) {
7370 if (HadTautologicalLanes) {
7371 // Try to turn PAmts into a splat, since we don't care about the values
7372 // that are currently '0'. If we can't, just keep '0'`s.
7374 // Try to turn KAmts into a splat, since we don't care about the values
7375 // that are currently '-1'. If we can't, change them to '0'`s.
7377 DAG.getConstant(0, DL, ShSVT));
7378 }
7379
7380 PVal = DAG.getBuildVector(VT, DL, PAmts);
7381 KVal = DAG.getBuildVector(ShVT, DL, KAmts);
7382 QVal = DAG.getBuildVector(VT, DL, QAmts);
7383 } else if (D.getOpcode() == ISD::SPLAT_VECTOR) {
7384 assert(PAmts.size() == 1 && KAmts.size() == 1 && QAmts.size() == 1 &&
7385 "Expected matchBinaryPredicate to return one element for "
7386 "SPLAT_VECTORs");
7387 PVal = DAG.getSplatVector(VT, DL, PAmts[0]);
7388 KVal = DAG.getSplatVector(ShVT, DL, KAmts[0]);
7389 QVal = DAG.getSplatVector(VT, DL, QAmts[0]);
7390 } else {
7391 PVal = PAmts[0];
7392 KVal = KAmts[0];
7393 QVal = QAmts[0];
7394 }
7395
7396 if (!ComparingWithAllZeros && !AllComparisonsWithNonZerosAreTautological) {
7397 if (!DCI.isBeforeLegalizeOps() && !isOperationLegalOrCustom(ISD::SUB, VT))
7398 return SDValue(); // FIXME: Could/should use `ISD::ADD`?
7399 assert(CompTargetNode.getValueType() == N.getValueType() &&
7400 "Expecting that the types on LHS and RHS of comparisons match.");
7401 N = DAG.getNode(ISD::SUB, DL, VT, N, CompTargetNode);
7402 }
7403
7404 // (mul N, P)
7405 SDValue Op0 = DAG.getNode(ISD::MUL, DL, VT, N, PVal);
7406 Created.push_back(Op0.getNode());
7407
7408 // Rotate right only if any divisor was even. We avoid rotates for all-odd
7409 // divisors as a performance improvement, since rotating by 0 is a no-op.
7410 if (HadEvenDivisor) {
7411 // We need ROTR to do this.
7412 if (!DCI.isBeforeLegalizeOps() && !isOperationLegalOrCustom(ISD::ROTR, VT))
7413 return SDValue();
7414 // UREM: (rotr (mul N, P), K)
7415 Op0 = DAG.getNode(ISD::ROTR, DL, VT, Op0, KVal);
7416 Created.push_back(Op0.getNode());
7417 }
7418
7419 // UREM: (setule/setugt (rotr (mul N, P), K), Q)
7420 SDValue NewCC =
7421 DAG.getSetCC(DL, SETCCVT, Op0, QVal,
7423 if (!HadTautologicalInvertedLanes)
7424 return NewCC;
7425
7426 // If any lanes previously compared always-false, the NewCC will give
7427 // always-true result for them, so we need to fixup those lanes.
7428 // Or the other way around for inequality predicate.
7429 assert(VT.isVector() && "Can/should only get here for vectors.");
7430 Created.push_back(NewCC.getNode());
7431
7432 // x u% C1` is *always* less than C1. So given `x u% C1 == C2`,
7433 // if C2 is not less than C1, the comparison is always false.
7434 // But we have produced the comparison that will give the
7435 // opposive tautological answer. So these lanes would need to be fixed up.
7436 SDValue TautologicalInvertedChannels =
7437 DAG.getSetCC(DL, SETCCVT, D, CompTargetNode, ISD::SETULE);
7438 Created.push_back(TautologicalInvertedChannels.getNode());
7439
7440 // NOTE: we avoid letting illegal types through even if we're before legalize
7441 // ops – legalization has a hard time producing good code for this.
7442 if (isOperationLegalOrCustom(ISD::VSELECT, SETCCVT)) {
7443 // If we have a vector select, let's replace the comparison results in the
7444 // affected lanes with the correct tautological result.
7445 SDValue Replacement = DAG.getBoolConstant(Cond == ISD::SETEQ ? false : true,
7446 DL, SETCCVT, SETCCVT);
7447 return DAG.getNode(ISD::VSELECT, DL, SETCCVT, TautologicalInvertedChannels,
7448 Replacement, NewCC);
7449 }
7450
7451 // Else, we can just invert the comparison result in the appropriate lanes.
7452 //
7453 // NOTE: see the note above VSELECT above.
7454 if (isOperationLegalOrCustom(ISD::XOR, SETCCVT))
7455 return DAG.getNode(ISD::XOR, DL, SETCCVT, NewCC,
7456 TautologicalInvertedChannels);
7457
7458 return SDValue(); // Don't know how to lower.
7459}
7460
7461/// Given an ISD::SREM used only by an ISD::SETEQ or ISD::SETNE
7462/// where the divisor is constant and the comparison target is zero,
7463/// return a DAG expression that will generate the same comparison result
7464/// using only multiplications, additions and shifts/rotations.
7465/// Ref: "Hacker's Delight" 10-17.
7466SDValue TargetLowering::buildSREMEqFold(EVT SETCCVT, SDValue REMNode,
7467 SDValue CompTargetNode,
7469 DAGCombinerInfo &DCI,
7470 const SDLoc &DL) const {
7472 if (SDValue Folded = prepareSREMEqFold(SETCCVT, REMNode, CompTargetNode, Cond,
7473 DCI, DL, Built)) {
7474 assert(Built.size() <= 7 && "Max size prediction failed.");
7475 for (SDNode *N : Built)
7476 DCI.AddToWorklist(N);
7477 return Folded;
7478 }
7479
7480 return SDValue();
7481}
7482
7483SDValue
7484TargetLowering::prepareSREMEqFold(EVT SETCCVT, SDValue REMNode,
7485 SDValue CompTargetNode, ISD::CondCode Cond,
7486 DAGCombinerInfo &DCI, const SDLoc &DL,
7487 SmallVectorImpl<SDNode *> &Created) const {
7488 // Derived from Hacker's Delight, 2nd Edition, by Hank Warren. Section 10-17.
7489 // Fold:
7490 // (seteq/ne (srem N, D), 0)
7491 // To:
7492 // (setule/ugt (rotr (add (mul N, P), A), K), Q)
7493 //
7494 // - D must be constant, with D = D0 * 2^K where D0 is odd
7495 // - P is the multiplicative inverse of D0 modulo 2^W
7496 // - A = bitwiseand(floor((2^(W - 1) - 1) / D0), (-(2^k)))
7497 // - Q = floor((2 * A) / (2^K))
7498 // where W is the width of the common type of N and D.
7499 //
7500 // When D is a power of two (and thus D0 is 1), the normal
7501 // formula for A and Q don't apply, because the derivation
7502 // depends on D not dividing 2^(W-1), and thus theorem ZRS
7503 // does not apply. This specifically fails when N = INT_MIN.
7504 //
7505 // Instead, for power-of-two D, we use:
7506 // - A = 0
7507 // | -> No offset needed. We're effectively treating it the same as urem.
7508 // - Q = 2^(W-K) - 1
7509 // |-> Test that the top K bits are zero after rotation
7510 assert((Cond == ISD::SETEQ || Cond == ISD::SETNE) &&
7511 "Only applicable for (in)equality comparisons.");
7512
7513 SelectionDAG &DAG = DCI.DAG;
7514
7515 EVT VT = REMNode.getValueType();
7516 EVT SVT = VT.getScalarType();
7517 EVT ShVT = getShiftAmountTy(VT, DAG.getDataLayout());
7518 EVT ShSVT = ShVT.getScalarType();
7519
7520 // If we are after ops legalization, and MUL is unavailable, we can not
7521 // proceed.
7522 if (!DCI.isBeforeLegalizeOps() && !isOperationLegalOrCustom(ISD::MUL, VT))
7523 return SDValue();
7524
7525 // TODO: Could support comparing with non-zero too.
7526 ConstantSDNode *CompTarget = isConstOrConstSplat(CompTargetNode);
7527 if (!CompTarget || !CompTarget->isZero())
7528 return SDValue();
7529
7530 bool HadOneDivisor = false;
7531 bool AllDivisorsAreOnes = true;
7532 bool HadEvenDivisor = false;
7533 bool AllDivisorsArePowerOfTwo = true;
7534 SmallVector<SDValue, 16> PAmts, AAmts, KAmts, QAmts;
7535
7536 auto BuildSREMPattern = [&](ConstantSDNode *C) {
7537 // Division by 0 is UB. Leave it to be constant-folded elsewhere.
7538 if (C->isZero())
7539 return false;
7540
7541 // FIXME: we don't fold `rem %X, -C` to `rem %X, C` in DAGCombine.
7542
7543 // WARNING: this fold is only valid for positive divisors!
7544 // `rem %X, -C` is equivalent to `rem %X, C`
7545 APInt D = C->getAPIntValue().abs();
7546
7547 // If all divisors are ones, we will prefer to avoid the fold.
7548 HadOneDivisor |= D.isOne();
7549 AllDivisorsAreOnes &= D.isOne();
7550
7551 // Decompose D into D0 * 2^K
7552 unsigned K = D.countr_zero();
7553 assert((!D.isOne() || (K == 0)) && "For divisor '1' we won't rotate.");
7554 APInt D0 = D.lshr(K);
7555
7556 // D is even if it has trailing zeros.
7557 HadEvenDivisor |= (K != 0);
7558
7559 // D is a power-of-two if D0 is one. This includes INT_MIN.
7560 // If all divisors are power-of-two, we will prefer to avoid the fold.
7561 AllDivisorsArePowerOfTwo &= D0.isOne();
7562
7563 // P = inv(D0, 2^W)
7564 // 2^W requires W + 1 bits, so we have to extend and then truncate.
7565 unsigned W = D.getBitWidth();
7566 APInt P = D0.multiplicativeInverse();
7567 assert((D0 * P).isOne() && "Multiplicative inverse basic check failed.");
7568
7569 // A = floor((2^(W - 1) - 1) / D0) & -2^K
7570 APInt A = APInt::getSignedMaxValue(W).udiv(D0);
7571 A.clearLowBits(K);
7572
7573 // Q = floor((2 * A) / (2^K))
7574 APInt Q = (2 * A).udiv(APInt::getOneBitSet(W, K));
7575
7577 "We are expecting that A is always less than all-ones for SVT");
7579 "We are expecting that K is always less than all-ones for ShSVT");
7580
7581 // If D was a power of two, apply the alternate constant derivation.
7582 if (D0.isOne()) {
7583 // A = 0
7584 A = APInt(W, 0);
7585 // - Q = 2^(W-K) - 1
7586 Q = APInt::getLowBitsSet(W, W - K);
7587 }
7588
7589 // If the divisor is 1 the result can be constant-folded.
7590 if (D.isOne()) {
7591 // Set P, A and K to a bogus values so we can try to splat them.
7592 P = 0;
7593 A.setAllBits();
7594 KAmts.push_back(DAG.getAllOnesConstant(DL, ShSVT));
7595
7596 // x ?% 1 == 0 <--> true <--> x u<= -1
7597 Q.setAllBits();
7598 } else {
7599 KAmts.push_back(DAG.getConstant(K, DL, ShSVT));
7600 }
7601
7602 PAmts.push_back(DAG.getConstant(P, DL, SVT));
7603 AAmts.push_back(DAG.getConstant(A, DL, SVT));
7604 QAmts.push_back(DAG.getConstant(Q, DL, SVT));
7605 return true;
7606 };
7607
7608 SDValue N = REMNode.getOperand(0);
7609 SDValue D = REMNode.getOperand(1);
7610
7611 // Collect the values from each element.
7612 if (!ISD::matchUnaryPredicate(D, BuildSREMPattern))
7613 return SDValue();
7614
7615 // If this is a srem by a one, avoid the fold since it can be constant-folded.
7616 if (AllDivisorsAreOnes)
7617 return SDValue();
7618
7619 // If this is a srem by a powers-of-two (including INT_MIN), avoid the fold
7620 // since it can be best implemented as a bit test.
7621 if (AllDivisorsArePowerOfTwo)
7622 return SDValue();
7623
7624 SDValue PVal, AVal, KVal, QVal;
7625 if (D.getOpcode() == ISD::BUILD_VECTOR) {
7626 if (HadOneDivisor) {
7627 // Try to turn PAmts into a splat, since we don't care about the values
7628 // that are currently '0'. If we can't, just keep '0'`s.
7630 // Try to turn AAmts into a splat, since we don't care about the
7631 // values that are currently '-1'. If we can't, change them to '0'`s.
7633 DAG.getConstant(0, DL, SVT));
7634 // Try to turn KAmts into a splat, since we don't care about the values
7635 // that are currently '-1'. If we can't, change them to '0'`s.
7637 DAG.getConstant(0, DL, ShSVT));
7638 }
7639
7640 PVal = DAG.getBuildVector(VT, DL, PAmts);
7641 AVal = DAG.getBuildVector(VT, DL, AAmts);
7642 KVal = DAG.getBuildVector(ShVT, DL, KAmts);
7643 QVal = DAG.getBuildVector(VT, DL, QAmts);
7644 } else if (D.getOpcode() == ISD::SPLAT_VECTOR) {
7645 assert(PAmts.size() == 1 && AAmts.size() == 1 && KAmts.size() == 1 &&
7646 QAmts.size() == 1 &&
7647 "Expected matchUnaryPredicate to return one element for scalable "
7648 "vectors");
7649 PVal = DAG.getSplatVector(VT, DL, PAmts[0]);
7650 AVal = DAG.getSplatVector(VT, DL, AAmts[0]);
7651 KVal = DAG.getSplatVector(ShVT, DL, KAmts[0]);
7652 QVal = DAG.getSplatVector(VT, DL, QAmts[0]);
7653 } else {
7654 assert(isa<ConstantSDNode>(D) && "Expected a constant");
7655 PVal = PAmts[0];
7656 AVal = AAmts[0];
7657 KVal = KAmts[0];
7658 QVal = QAmts[0];
7659 }
7660
7661 // (mul N, P)
7662 SDValue Op0 = DAG.getNode(ISD::MUL, DL, VT, N, PVal);
7663 Created.push_back(Op0.getNode());
7664
7665 // We need ADD to do this.
7666 if (!DCI.isBeforeLegalizeOps() && !isOperationLegalOrCustom(ISD::ADD, VT))
7667 return SDValue();
7668
7669 // (add (mul N, P), A)
7670 Op0 = DAG.getNode(ISD::ADD, DL, VT, Op0, AVal);
7671 Created.push_back(Op0.getNode());
7672
7673 // Rotate right only if any divisor was even. We avoid rotates for all-odd
7674 // divisors as a performance improvement, since rotating by 0 is a no-op.
7675 if (HadEvenDivisor) {
7676 // We need ROTR to do this.
7677 if (!DCI.isBeforeLegalizeOps() && !isOperationLegalOrCustom(ISD::ROTR, VT))
7678 return SDValue();
7679 // SREM: (rotr (add (mul N, P), A), K)
7680 Op0 = DAG.getNode(ISD::ROTR, DL, VT, Op0, KVal);
7681 Created.push_back(Op0.getNode());
7682 }
7683
7684 // SREM: (setule/setugt (rotr (add (mul N, P), A), K), Q)
7685 return DAG.getSetCC(DL, SETCCVT, Op0, QVal,
7687}
7688
7690 const DenormalMode &Mode,
7691 SDNodeFlags Flags) const {
7692 SDLoc DL(Op);
7693 EVT VT = Op.getValueType();
7694 EVT CCVT = getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
7695 SDValue FPZero = DAG.getConstantFP(0.0, DL, VT);
7696
7697 // This is specifically a check for the handling of denormal inputs, not the
7698 // result.
7699 if (Mode.Input == DenormalMode::PreserveSign ||
7700 Mode.Input == DenormalMode::PositiveZero) {
7701 // Test = X == 0.0
7702 return DAG.getSetCC(DL, CCVT, Op, FPZero, ISD::SETEQ, /*Chain=*/{},
7703 /*Signaling=*/false, Flags);
7704 }
7705
7706 // Testing it with denormal inputs to avoid wrong estimate.
7707 //
7708 // Test = fabs(X) < SmallestNormal
7709 const fltSemantics &FltSem = VT.getFltSemantics();
7710 APFloat SmallestNorm = APFloat::getSmallestNormalized(FltSem);
7711 SDValue NormC = DAG.getConstantFP(SmallestNorm, DL, VT);
7712 SDValue Fabs = DAG.getNode(ISD::FABS, DL, VT, Op, Flags);
7713 return DAG.getSetCC(DL, CCVT, Fabs, NormC, ISD::SETLT, /*Chain=*/{},
7714 /*Signaling=*/false, Flags);
7715}
7716
7718 bool LegalOps, bool OptForSize,
7720 unsigned Depth) const {
7721 // fneg is removable even if it has multiple uses.
7722 if (Op.getOpcode() == ISD::FNEG) {
7724 return Op.getOperand(0);
7725 }
7726
7727 // Don't recurse exponentially.
7729 return SDValue();
7730
7731 // Pre-increment recursion depth for use in recursive calls.
7732 ++Depth;
7733 const SDNodeFlags Flags = Op->getFlags();
7734 EVT VT = Op.getValueType();
7735 unsigned Opcode = Op.getOpcode();
7736
7737 // Don't allow anything with multiple uses unless we know it is free.
7738 if (!Op.hasOneUse() && Opcode != ISD::ConstantFP) {
7739 bool IsFreeExtend = Opcode == ISD::FP_EXTEND &&
7740 isFPExtFree(VT, Op.getOperand(0).getValueType());
7741 if (!IsFreeExtend)
7742 return SDValue();
7743 }
7744
7745 auto RemoveDeadNode = [&](SDValue N) {
7746 if (N && N.getNode()->use_empty())
7747 DAG.RemoveDeadNode(N.getNode());
7748 };
7749
7750 SDLoc DL(Op);
7751
7752 // Because getNegatedExpression can delete nodes we need a handle to keep
7753 // temporary nodes alive in case the recursion manages to create an identical
7754 // node.
7755 std::list<HandleSDNode> Handles;
7756
7757 switch (Opcode) {
7758 case ISD::ConstantFP: {
7759 // Don't invert constant FP values after legalization unless the target says
7760 // the negated constant is legal.
7761 bool IsOpLegal =
7763 isFPImmLegal(neg(cast<ConstantFPSDNode>(Op)->getValueAPF()), VT,
7764 OptForSize);
7765
7766 if (LegalOps && !IsOpLegal)
7767 break;
7768
7769 APFloat V = cast<ConstantFPSDNode>(Op)->getValueAPF();
7770 V.changeSign();
7771 SDValue CFP = DAG.getConstantFP(V, DL, VT);
7772
7773 // If we already have the use of the negated floating constant, it is free
7774 // to negate it even it has multiple uses.
7775 if (!Op.hasOneUse() && CFP.use_empty())
7776 break;
7778 return CFP;
7779 }
7780 case ISD::SPLAT_VECTOR: {
7781 // fold splat_vector(fneg(X)) -> splat_vector(-X)
7782 SDValue X = Op.getOperand(0);
7784 break;
7785
7786 SDValue NegX = getCheaperNegatedExpression(X, DAG, LegalOps, OptForSize);
7787 if (!NegX)
7788 break;
7790 return DAG.getNode(ISD::SPLAT_VECTOR, DL, VT, NegX);
7791 }
7792 case ISD::BUILD_VECTOR: {
7793 // Only permit BUILD_VECTOR of constants.
7794 if (llvm::any_of(Op->op_values(), [&](SDValue N) {
7795 return !N.isUndef() && !isa<ConstantFPSDNode>(N);
7796 }))
7797 break;
7798
7799 bool IsOpLegal =
7802 llvm::all_of(Op->op_values(), [&](SDValue N) {
7803 return N.isUndef() ||
7804 isFPImmLegal(neg(cast<ConstantFPSDNode>(N)->getValueAPF()), VT,
7805 OptForSize);
7806 });
7807
7808 if (LegalOps && !IsOpLegal)
7809 break;
7810
7812 for (SDValue C : Op->op_values()) {
7813 if (C.isUndef()) {
7814 Ops.push_back(C);
7815 continue;
7816 }
7817 APFloat V = cast<ConstantFPSDNode>(C)->getValueAPF();
7818 V.changeSign();
7819 Ops.push_back(DAG.getConstantFP(V, DL, C.getValueType()));
7820 }
7822 return DAG.getBuildVector(VT, DL, Ops);
7823 }
7824 case ISD::FADD: {
7825 if (!Flags.hasNoSignedZeros())
7826 break;
7827
7828 // After operation legalization, it might not be legal to create new FSUBs.
7829 if (LegalOps && !isOperationLegalOrCustom(ISD::FSUB, VT))
7830 break;
7831 SDValue X = Op.getOperand(0), Y = Op.getOperand(1);
7832
7833 // fold (fneg (fadd X, Y)) -> (fsub (fneg X), Y)
7835 SDValue NegX =
7836 getNegatedExpression(X, DAG, LegalOps, OptForSize, CostX, Depth);
7837 // Prevent this node from being deleted by the next call.
7838 if (NegX)
7839 Handles.emplace_back(NegX);
7840
7841 // fold (fneg (fadd X, Y)) -> (fsub (fneg Y), X)
7843 SDValue NegY =
7844 getNegatedExpression(Y, DAG, LegalOps, OptForSize, CostY, Depth);
7845
7846 // We're done with the handles.
7847 Handles.clear();
7848
7849 // Negate the X if its cost is less or equal than Y.
7850 if (NegX && (CostX <= CostY)) {
7851 Cost = CostX;
7852 SDValue N = DAG.getNode(ISD::FSUB, DL, VT, NegX, Y, Flags);
7853 if (NegY != N)
7854 RemoveDeadNode(NegY);
7855 return N;
7856 }
7857
7858 // Negate the Y if it is not expensive.
7859 if (NegY) {
7860 Cost = CostY;
7861 SDValue N = DAG.getNode(ISD::FSUB, DL, VT, NegY, X, Flags);
7862 if (NegX != N)
7863 RemoveDeadNode(NegX);
7864 return N;
7865 }
7866 break;
7867 }
7868 case ISD::FSUB: {
7869 // We can't turn -(A-B) into B-A when we honor signed zeros.
7870 if (!Flags.hasNoSignedZeros())
7871 break;
7872
7873 SDValue X = Op.getOperand(0), Y = Op.getOperand(1);
7874 // fold (fneg (fsub 0, Y)) -> Y
7875 if (ConstantFPSDNode *C = isConstOrConstSplatFP(X, /*AllowUndefs*/ true))
7876 if (C->isZero()) {
7878 return Y;
7879 }
7880
7881 // fold (fneg (fsub X, Y)) -> (fsub Y, X)
7883 return DAG.getNode(ISD::FSUB, DL, VT, Y, X, Flags);
7884 }
7885 case ISD::FMUL:
7886 case ISD::FDIV: {
7887 SDValue X = Op.getOperand(0), Y = Op.getOperand(1);
7888
7889 // fold (fneg (fmul X, Y)) -> (fmul (fneg X), Y)
7891 SDValue NegX =
7892 getNegatedExpression(X, DAG, LegalOps, OptForSize, CostX, Depth);
7893 // Prevent this node from being deleted by the next call.
7894 if (NegX)
7895 Handles.emplace_back(NegX);
7896
7897 // fold (fneg (fmul X, Y)) -> (fmul X, (fneg Y))
7899 SDValue NegY =
7900 getNegatedExpression(Y, DAG, LegalOps, OptForSize, CostY, Depth);
7901
7902 // We're done with the handles.
7903 Handles.clear();
7904
7905 // Negate the X if its cost is less or equal than Y.
7906 if (NegX && (CostX <= CostY)) {
7907 Cost = CostX;
7908 SDValue N = DAG.getNode(Opcode, DL, VT, NegX, Y, Flags);
7909 if (NegY != N)
7910 RemoveDeadNode(NegY);
7911 return N;
7912 }
7913
7914 // Ignore X * 2.0 because that is expected to be canonicalized to X + X.
7915 if (auto *C = isConstOrConstSplatFP(Op.getOperand(1)))
7916 if (C->isExactlyValue(2.0) && Op.getOpcode() == ISD::FMUL)
7917 break;
7918
7919 // Negate the Y if it is not expensive.
7920 if (NegY) {
7921 Cost = CostY;
7922 SDValue N = DAG.getNode(Opcode, DL, VT, X, NegY, Flags);
7923 if (NegX != N)
7924 RemoveDeadNode(NegX);
7925 return N;
7926 }
7927 break;
7928 }
7929 case ISD::FMA:
7930 case ISD::FMULADD:
7931 case ISD::FMAD: {
7932 if (!Flags.hasNoSignedZeros())
7933 break;
7934
7935 SDValue X = Op.getOperand(0), Y = Op.getOperand(1), Z = Op.getOperand(2);
7937 SDValue NegZ =
7938 getNegatedExpression(Z, DAG, LegalOps, OptForSize, CostZ, Depth);
7939 // Give up if fail to negate the Z.
7940 if (!NegZ)
7941 break;
7942
7943 // Prevent this node from being deleted by the next two calls.
7944 Handles.emplace_back(NegZ);
7945
7946 // fold (fneg (fma X, Y, Z)) -> (fma (fneg X), Y, (fneg Z))
7948 SDValue NegX =
7949 getNegatedExpression(X, DAG, LegalOps, OptForSize, CostX, Depth);
7950 // Prevent this node from being deleted by the next call.
7951 if (NegX)
7952 Handles.emplace_back(NegX);
7953
7954 // fold (fneg (fma X, Y, Z)) -> (fma X, (fneg Y), (fneg Z))
7956 SDValue NegY =
7957 getNegatedExpression(Y, DAG, LegalOps, OptForSize, CostY, Depth);
7958
7959 // We're done with the handles.
7960 Handles.clear();
7961
7962 // Negate the X if its cost is less or equal than Y.
7963 if (NegX && (CostX <= CostY)) {
7964 Cost = std::min(CostX, CostZ);
7965 SDValue N = DAG.getNode(Opcode, DL, VT, NegX, Y, NegZ, Flags);
7966 if (NegY != N)
7967 RemoveDeadNode(NegY);
7968 return N;
7969 }
7970
7971 // Negate the Y if it is not expensive.
7972 if (NegY) {
7973 Cost = std::min(CostY, CostZ);
7974 SDValue N = DAG.getNode(Opcode, DL, VT, X, NegY, NegZ, Flags);
7975 if (NegX != N)
7976 RemoveDeadNode(NegX);
7977 return N;
7978 }
7979 break;
7980 }
7981
7982 case ISD::FP_EXTEND:
7983 case ISD::FSIN:
7984 if (SDValue NegV = getNegatedExpression(Op.getOperand(0), DAG, LegalOps,
7985 OptForSize, Cost, Depth))
7986 return DAG.getNode(Opcode, DL, VT, NegV);
7987 break;
7988 case ISD::FP_ROUND:
7989 if (SDValue NegV = getNegatedExpression(Op.getOperand(0), DAG, LegalOps,
7990 OptForSize, Cost, Depth))
7991 return DAG.getNode(ISD::FP_ROUND, DL, VT, NegV, Op.getOperand(1));
7992 break;
7993 case ISD::SELECT:
7994 case ISD::VSELECT: {
7995 // fold (fneg (select C, LHS, RHS)) -> (select C, (fneg LHS), (fneg RHS))
7996 // iff at least one cost is cheaper and the other is neutral/cheaper
7997 SDValue LHS = Op.getOperand(1);
7999 SDValue NegLHS =
8000 getNegatedExpression(LHS, DAG, LegalOps, OptForSize, CostLHS, Depth);
8001 if (!NegLHS || CostLHS > NegatibleCost::Neutral) {
8002 RemoveDeadNode(NegLHS);
8003 break;
8004 }
8005
8006 // Prevent this node from being deleted by the next call.
8007 Handles.emplace_back(NegLHS);
8008
8009 SDValue RHS = Op.getOperand(2);
8011 SDValue NegRHS =
8012 getNegatedExpression(RHS, DAG, LegalOps, OptForSize, CostRHS, Depth);
8013
8014 // We're done with the handles.
8015 Handles.clear();
8016
8017 if (!NegRHS || CostRHS > NegatibleCost::Neutral ||
8018 (CostLHS != NegatibleCost::Cheaper &&
8019 CostRHS != NegatibleCost::Cheaper)) {
8020 RemoveDeadNode(NegLHS);
8021 RemoveDeadNode(NegRHS);
8022 break;
8023 }
8024
8025 Cost = std::min(CostLHS, CostRHS);
8026 return DAG.getSelect(DL, VT, Op.getOperand(0), NegLHS, NegRHS);
8027 }
8028 }
8029
8030 return SDValue();
8031}
8032
8033//===----------------------------------------------------------------------===//
8034// Legalization Utilities
8035//===----------------------------------------------------------------------===//
8036
8037bool TargetLowering::expandMUL_LOHI(unsigned Opcode, EVT VT, const SDLoc &dl,
8038 SDValue LHS, SDValue RHS,
8040 EVT HiLoVT, SelectionDAG &DAG,
8041 MulExpansionKind Kind, SDValue LL,
8042 SDValue LH, SDValue RL, SDValue RH) const {
8043 assert(Opcode == ISD::MUL || Opcode == ISD::UMUL_LOHI ||
8044 Opcode == ISD::SMUL_LOHI);
8045
8046 bool HasMULHS = (Kind == MulExpansionKind::Always) ||
8048 bool HasMULHU = (Kind == MulExpansionKind::Always) ||
8050 bool HasSMUL_LOHI = (Kind == MulExpansionKind::Always) ||
8052 bool HasUMUL_LOHI = (Kind == MulExpansionKind::Always) ||
8054
8055 if (!HasMULHU && !HasMULHS && !HasUMUL_LOHI && !HasSMUL_LOHI)
8056 return false;
8057
8058 unsigned OuterBitSize = VT.getScalarSizeInBits();
8059 unsigned InnerBitSize = HiLoVT.getScalarSizeInBits();
8060
8061 // LL, LH, RL, and RH must be either all NULL or all set to a value.
8062 assert((LL.getNode() && LH.getNode() && RL.getNode() && RH.getNode()) ||
8063 (!LL.getNode() && !LH.getNode() && !RL.getNode() && !RH.getNode()));
8064
8065 auto MakeMUL_LOHI = [&](SDValue L, SDValue R, SDValue &Lo, SDValue &Hi,
8066 bool Signed) -> bool {
8067 if ((Signed && HasSMUL_LOHI) || (!Signed && HasUMUL_LOHI)) {
8068 SDVTList VTs = DAG.getVTList(HiLoVT, HiLoVT);
8069 Lo = DAG.getNode(Signed ? ISD::SMUL_LOHI : ISD::UMUL_LOHI, dl, VTs, L, R);
8070 Hi = Lo.getValue(1);
8071 return true;
8072 }
8073 if ((Signed && HasMULHS) || (!Signed && HasMULHU)) {
8074 Lo = DAG.getNode(ISD::MUL, dl, HiLoVT, L, R);
8075 Hi = DAG.getNode(Signed ? ISD::MULHS : ISD::MULHU, dl, HiLoVT, L, R);
8076 return true;
8077 }
8078 return false;
8079 };
8080
8081 SDValue Lo, Hi;
8082
8083 if (!LL.getNode() && !RL.getNode() &&
8085 LL = DAG.getNode(ISD::TRUNCATE, dl, HiLoVT, LHS);
8086 RL = DAG.getNode(ISD::TRUNCATE, dl, HiLoVT, RHS);
8087 }
8088
8089 if (!LL.getNode())
8090 return false;
8091
8092 APInt HighMask = APInt::getHighBitsSet(OuterBitSize, InnerBitSize);
8093 if (DAG.MaskedValueIsZero(LHS, HighMask) &&
8094 DAG.MaskedValueIsZero(RHS, HighMask)) {
8095 // The inputs are both zero-extended.
8096 if (MakeMUL_LOHI(LL, RL, Lo, Hi, false)) {
8097 Result.push_back(Lo);
8098 Result.push_back(Hi);
8099 if (Opcode != ISD::MUL) {
8100 SDValue Zero = DAG.getConstant(0, dl, HiLoVT);
8101 Result.push_back(Zero);
8102 Result.push_back(Zero);
8103 }
8104 return true;
8105 }
8106 }
8107
8108 if (!VT.isVector() && Opcode == ISD::MUL &&
8109 DAG.ComputeMaxSignificantBits(LHS) <= InnerBitSize &&
8110 DAG.ComputeMaxSignificantBits(RHS) <= InnerBitSize) {
8111 // The input values are both sign-extended.
8112 // TODO non-MUL case?
8113 if (MakeMUL_LOHI(LL, RL, Lo, Hi, true)) {
8114 Result.push_back(Lo);
8115 Result.push_back(Hi);
8116 return true;
8117 }
8118 }
8119
8120 unsigned ShiftAmount = OuterBitSize - InnerBitSize;
8121 SDValue Shift = DAG.getShiftAmountConstant(ShiftAmount, VT, dl);
8122
8123 if (!LH.getNode() && !RH.getNode() &&
8126 LH = DAG.getNode(ISD::SRL, dl, VT, LHS, Shift);
8127 LH = DAG.getNode(ISD::TRUNCATE, dl, HiLoVT, LH);
8128 RH = DAG.getNode(ISD::SRL, dl, VT, RHS, Shift);
8129 RH = DAG.getNode(ISD::TRUNCATE, dl, HiLoVT, RH);
8130 }
8131
8132 if (!LH.getNode())
8133 return false;
8134
8135 if (!MakeMUL_LOHI(LL, RL, Lo, Hi, false))
8136 return false;
8137
8138 Result.push_back(Lo);
8139
8140 if (Opcode == ISD::MUL) {
8141 RH = DAG.getNode(ISD::MUL, dl, HiLoVT, LL, RH);
8142 LH = DAG.getNode(ISD::MUL, dl, HiLoVT, LH, RL);
8143 Hi = DAG.getNode(ISD::ADD, dl, HiLoVT, Hi, RH);
8144 Hi = DAG.getNode(ISD::ADD, dl, HiLoVT, Hi, LH);
8145 Result.push_back(Hi);
8146 return true;
8147 }
8148
8149 // Compute the full width result.
8150 auto Merge = [&](SDValue Lo, SDValue Hi) -> SDValue {
8151 Lo = DAG.getNode(ISD::ZERO_EXTEND, dl, VT, Lo);
8152 Hi = DAG.getNode(ISD::ZERO_EXTEND, dl, VT, Hi);
8153 Hi = DAG.getNode(ISD::SHL, dl, VT, Hi, Shift);
8154 return DAG.getNode(ISD::OR, dl, VT, Lo, Hi);
8155 };
8156
8157 SDValue Next = DAG.getNode(ISD::ZERO_EXTEND, dl, VT, Hi);
8158 if (!MakeMUL_LOHI(LL, RH, Lo, Hi, false))
8159 return false;
8160
8161 // This is effectively the add part of a multiply-add of half-sized operands,
8162 // so it cannot overflow.
8163 Next = DAG.getNode(ISD::ADD, dl, VT, Next, Merge(Lo, Hi));
8164
8165 if (!MakeMUL_LOHI(LH, RL, Lo, Hi, false))
8166 return false;
8167
8168 SDValue Zero = DAG.getConstant(0, dl, HiLoVT);
8169 EVT BoolType = getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
8170
8171 bool UseGlue = (isOperationLegalOrCustom(ISD::ADDC, VT) &&
8173 if (UseGlue)
8174 Next = DAG.getNode(ISD::ADDC, dl, DAG.getVTList(VT, MVT::Glue), Next,
8175 Merge(Lo, Hi));
8176 else
8177 Next = DAG.getNode(ISD::UADDO_CARRY, dl, DAG.getVTList(VT, BoolType), Next,
8178 Merge(Lo, Hi), DAG.getConstant(0, dl, BoolType));
8179
8180 SDValue Carry = Next.getValue(1);
8181 Result.push_back(DAG.getNode(ISD::TRUNCATE, dl, HiLoVT, Next));
8182 Next = DAG.getNode(ISD::SRL, dl, VT, Next, Shift);
8183
8184 if (!MakeMUL_LOHI(LH, RH, Lo, Hi, Opcode == ISD::SMUL_LOHI))
8185 return false;
8186
8187 if (UseGlue)
8188 Hi = DAG.getNode(ISD::ADDE, dl, DAG.getVTList(HiLoVT, MVT::Glue), Hi, Zero,
8189 Carry);
8190 else
8191 Hi = DAG.getNode(ISD::UADDO_CARRY, dl, DAG.getVTList(HiLoVT, BoolType), Hi,
8192 Zero, Carry);
8193
8194 Next = DAG.getNode(ISD::ADD, dl, VT, Next, Merge(Lo, Hi));
8195
8196 if (Opcode == ISD::SMUL_LOHI) {
8197 SDValue NextSub = DAG.getNode(ISD::SUB, dl, VT, Next,
8198 DAG.getNode(ISD::ZERO_EXTEND, dl, VT, RL));
8199 Next = DAG.getSelectCC(dl, LH, Zero, NextSub, Next, ISD::SETLT);
8200
8201 NextSub = DAG.getNode(ISD::SUB, dl, VT, Next,
8202 DAG.getNode(ISD::ZERO_EXTEND, dl, VT, LL));
8203 Next = DAG.getSelectCC(dl, RH, Zero, NextSub, Next, ISD::SETLT);
8204 }
8205
8206 Result.push_back(DAG.getNode(ISD::TRUNCATE, dl, HiLoVT, Next));
8207 Next = DAG.getNode(ISD::SRL, dl, VT, Next, Shift);
8208 Result.push_back(DAG.getNode(ISD::TRUNCATE, dl, HiLoVT, Next));
8209 return true;
8210}
8211
8213 SelectionDAG &DAG, MulExpansionKind Kind,
8214 SDValue LL, SDValue LH, SDValue RL,
8215 SDValue RH) const {
8217 bool Ok = expandMUL_LOHI(N->getOpcode(), N->getValueType(0), SDLoc(N),
8218 N->getOperand(0), N->getOperand(1), Result, HiLoVT,
8219 DAG, Kind, LL, LH, RL, RH);
8220 if (Ok) {
8221 assert(Result.size() == 2);
8222 Lo = Result[0];
8223 Hi = Result[1];
8224 }
8225 return Ok;
8226}
8227
8228// Optimize unsigned division or remainder by constants for types twice as large
8229// as a legal VT.
8230//
8231// If (1 << (BitWidth / 2)) % Constant == 1, then the remainder
8232// can be computed
8233// as:
8234// Sum = __builtin_uadd_overflow(Lo, High, &Sum);
8235// Remainder = Sum % Constant;
8236//
8237// If (1 << (BitWidth / 2)) % Constant != 1, we can search for a smaller value
8238// W such that W != (BitWidth / 2) and (1 << W) % Constant == 1. We can break
8239// High:Low into 3 chunks of W bits and compute remainder as
8240// Sum = Chunk0 + Chunk1 + Chunk2;
8241// Remainder = Sum % Constant;
8242//
8243// This is based on "Remainder by Summing Digits" from Hacker's Delight.
8244//
8245// For division, we can compute the remainder using the algorithm described
8246// above, subtract it from the dividend to get an exact multiple of Constant.
8247// Then multiply that exact multiply by the multiplicative inverse modulo
8248// (1 << (BitWidth / 2)) to get the quotient.
8249
8250// If Constant is even, we can shift right the dividend and the divisor by the
8251// number of trailing zeros in Constant before applying the remainder algorithm.
8252// If we're after the quotient, we can subtract this value from the shifted
8253// dividend and multiply by the multiplicative inverse of the shifted divisor.
8254// If we want the remainder, we shift the value left by the number of trailing
8255// zeros and add the bits that were shifted out of the dividend.
8256bool TargetLowering::expandUDIVREMByConstantViaUREMDecomposition(
8257 SDNode *N, APInt Divisor, SmallVectorImpl<SDValue> &Result, EVT HiLoVT,
8258 SelectionDAG &DAG, SDValue LL, SDValue LH) const {
8259 unsigned Opcode = N->getOpcode();
8260 EVT VT = N->getValueType(0);
8261
8262 unsigned BitWidth = Divisor.getBitWidth();
8263 unsigned HBitWidth = BitWidth / 2;
8265 HiLoVT.getScalarSizeInBits() == HBitWidth && "Unexpected VTs");
8266
8267 // If the divisor is even, shift it until it becomes odd.
8268 unsigned TrailingZeros = 0;
8269 if (!Divisor[0]) {
8270 TrailingZeros = Divisor.countr_zero();
8271 Divisor.lshrInPlace(TrailingZeros);
8272 }
8273
8274 // After removing trailing zeros, the divisor needs to be less than
8275 // (1 << HBitWidth).
8276 APInt HalfMaxPlus1 = APInt::getOneBitSet(BitWidth, HBitWidth);
8277 if (Divisor.uge(HalfMaxPlus1))
8278 return false;
8279
8280 // Look for the largest chunk width W such that (1 << W) % Divisor == 1 or
8281 // (1 << W) % Divisor == -1.
8282 unsigned BestChunkWidth = 0, AltChunkWidth = 0;
8283 for (unsigned I = HBitWidth, E = HBitWidth / 2; I > E; --I) {
8284 // Skip HBitWidth-1, it doesn't have enough bits for carries.
8285 if (I == HBitWidth - 1)
8286 continue;
8287
8288 APInt Mod = APInt::getOneBitSet(Divisor.getBitWidth(), I).urem(Divisor);
8289
8290 if (Mod.isOne()) {
8291 BestChunkWidth = I;
8292 break;
8293 }
8294
8295 // We have an alternate strategy for Remainder == Divisor - 1.
8296 // FIXME: Support HBitWidth.
8297 if (I != HBitWidth && Mod == Divisor - 1)
8298 AltChunkWidth = I;
8299 }
8300
8301 bool Alternate = false;
8302 if (!BestChunkWidth) {
8303 if (!AltChunkWidth)
8304 return false;
8305 Alternate = true;
8306 BestChunkWidth = AltChunkWidth;
8307 }
8308
8309 SDLoc dl(N);
8310
8311 assert(!LL == !LH && "Expected both input halves or no input halves!");
8312 if (!LL)
8313 std::tie(LL, LH) = DAG.SplitScalar(N->getOperand(0), dl, HiLoVT, HiLoVT);
8314
8315 bool HasFSHR = isOperationLegal(ISD::FSHR, HiLoVT);
8316
8317 auto GetFSHR = [&](SDValue Lo, SDValue Hi, unsigned ShiftAmt) {
8318 assert(ShiftAmt > 0 && ShiftAmt < HBitWidth);
8319 if (HasFSHR)
8320 return DAG.getNode(ISD::FSHR, dl, HiLoVT, Hi, Lo,
8321 DAG.getShiftAmountConstant(ShiftAmt, HiLoVT, dl));
8322 return DAG.getNode(
8323 ISD::OR, dl, HiLoVT,
8324 DAG.getNode(ISD::SRL, dl, HiLoVT, Lo,
8325 DAG.getShiftAmountConstant(ShiftAmt, HiLoVT, dl)),
8326 DAG.getNode(
8327 ISD::SHL, dl, HiLoVT, Hi,
8328 DAG.getShiftAmountConstant(HBitWidth - ShiftAmt, HiLoVT, dl)));
8329 };
8330
8331 // Helper to perform a right shift on a 128-bit value split into two halves.
8332 // Handles shifts >= HBitWidth by moving Hi to Lo and shifting Hi.
8333 auto ShiftRight = [&](SDValue &Lo, SDValue &Hi, unsigned ShiftAmt) {
8334 if (ShiftAmt == 0)
8335 return;
8336 if (ShiftAmt < HBitWidth) {
8337 Lo = GetFSHR(Lo, Hi, ShiftAmt);
8338 Hi = DAG.getNode(ISD::SRL, dl, HiLoVT, Hi,
8339 DAG.getShiftAmountConstant(ShiftAmt, HiLoVT, dl));
8340 } else if (ShiftAmt == HBitWidth) {
8341 Lo = Hi;
8342 Hi = DAG.getConstant(0, dl, HiLoVT);
8343 } else {
8344 Lo = DAG.getNode(
8345 ISD::SRL, dl, HiLoVT, Hi,
8346 DAG.getShiftAmountConstant(ShiftAmt - HBitWidth, HiLoVT, dl));
8347 Hi = DAG.getConstant(0, dl, HiLoVT);
8348 }
8349 };
8350
8351 // Shift the input by the number of TrailingZeros in the divisor. The
8352 // shifted out bits will be added to the remainder later.
8353 SDValue PartialRemL, PartialRemH;
8354 if (TrailingZeros && Opcode != ISD::UDIV) {
8355 // Save the shifted off bits if we need the remainder.
8356 if (TrailingZeros < HBitWidth) {
8357 APInt Mask = APInt::getLowBitsSet(HBitWidth, TrailingZeros);
8358 PartialRemL = DAG.getNode(ISD::AND, dl, HiLoVT, LL,
8359 DAG.getConstant(Mask, dl, HiLoVT));
8360 } else if (TrailingZeros == HBitWidth) {
8361 // All of LL is part of the remainder.
8362 PartialRemL = LL;
8363 } else {
8364 // TrailingZeros > HBitWidth: LL and part of LH are the remainder.
8365 PartialRemL = LL;
8366 APInt Mask = APInt::getLowBitsSet(HBitWidth, TrailingZeros - HBitWidth);
8367 PartialRemH = DAG.getNode(ISD::AND, dl, HiLoVT, LH,
8368 DAG.getConstant(Mask, dl, HiLoVT));
8369 }
8370 }
8371
8372 SDValue Sum;
8373 // If BestChunkWidth is HBitWidth add low and high half. If there is a carry
8374 // out, add that to the final sum.
8375 if (BestChunkWidth == HBitWidth) {
8376 assert(!Alternate);
8377 // Shift LH:LL right if there were trailing zeros in the divisor.
8378 ShiftRight(LL, LH, TrailingZeros);
8379
8380 // Use uaddo_carry if we can, otherwise use a compare to detect overflow.
8381 EVT SetCCType =
8382 getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), HiLoVT);
8384 SDVTList VTList = DAG.getVTList(HiLoVT, SetCCType);
8385 Sum = DAG.getNode(ISD::UADDO, dl, VTList, LL, LH);
8386 Sum = DAG.getNode(ISD::UADDO_CARRY, dl, VTList, Sum,
8387 DAG.getConstant(0, dl, HiLoVT), Sum.getValue(1));
8388 } else {
8389 Sum = DAG.getNode(ISD::ADD, dl, HiLoVT, LL, LH);
8390 SDValue Carry = DAG.getSetCC(dl, SetCCType, Sum, LL, ISD::SETULT);
8391 // If the boolean for the target is 0 or 1, we can add the setcc result
8392 // directly.
8393 if (getBooleanContents(HiLoVT) ==
8395 Carry = DAG.getZExtOrTrunc(Carry, dl, HiLoVT);
8396 else
8397 Carry = DAG.getSelect(dl, HiLoVT, Carry, DAG.getConstant(1, dl, HiLoVT),
8398 DAG.getConstant(0, dl, HiLoVT));
8399 Sum = DAG.getNode(ISD::ADD, dl, HiLoVT, Sum, Carry);
8400 }
8401 } else {
8402 // Otherwise split into multple chunks and add them together. We chose
8403 // BestChunkWidth so that the sum will not overflow.
8404 SDValue Mask = DAG.getConstant(
8405 APInt::getLowBitsSet(HBitWidth, BestChunkWidth), dl, HiLoVT);
8406
8407 for (unsigned I = 0; I < BitWidth - TrailingZeros; I += BestChunkWidth) {
8408 // If there were trailing zeros in the divisor, increase the shift amount.
8409 unsigned Shift = I + TrailingZeros;
8410 SDValue Chunk;
8411 if (Shift == 0)
8412 Chunk = LL;
8413 else if (Shift >= HBitWidth)
8414 Chunk = DAG.getNode(
8415 ISD::SRL, dl, HiLoVT, LH,
8416 DAG.getShiftAmountConstant(Shift - HBitWidth, HiLoVT, dl));
8417 else
8418 Chunk = GetFSHR(LL, LH, Shift);
8419 // If we're on the last chunk, we don't need an AND.
8420 if (I + BestChunkWidth < BitWidth - TrailingZeros)
8421 Chunk = DAG.getNode(ISD::AND, dl, HiLoVT, Chunk, Mask);
8422 if (!Sum) {
8423 Sum = Chunk;
8424 } else {
8425 // For Alternate, we need to subtract odd chunks.
8426 unsigned ChunkNum = I / BestChunkWidth;
8427 unsigned Opc = (Alternate && (ChunkNum % 2) != 0) ? ISD::SUB : ISD::ADD;
8428 Sum = DAG.getNode(Opc, dl, HiLoVT, Sum, Chunk);
8429 }
8430 }
8431
8432 // For Alternate, the sum may be negative, but we need a positive sum. We
8433 // can increase it by a multiple of the divisor to make it positive. For 3
8434 // chunks the largest negative value is -(2^BestChunkWidth - 1). For 4
8435 // chunks, it's 2*-(2^BestChunkWidth - 1). We know that 2^BestChunkWidth + 1
8436 // is a multiple of the divisor. Add that 1 or 2 times to make the sum
8437 // positive.
8438 if (Alternate) {
8439 unsigned NumChunks = divideCeil(BitWidth - TrailingZeros, BestChunkWidth);
8440 assert(NumChunks <= 4);
8441
8442 APInt Adjust = APInt::getOneBitSet(HBitWidth, BestChunkWidth);
8443 Adjust.setBit(0);
8444 // If there are 4 chunks, we need to adjust twice.
8445 if (NumChunks == 4)
8446 Adjust <<= 1;
8447 Sum = DAG.getNode(ISD::ADD, dl, HiLoVT, Sum,
8448 DAG.getConstant(Adjust, dl, HiLoVT));
8449 }
8450 }
8451
8452 // Perform a HiLoVT urem on the Sum using truncated divisor.
8453 SDValue RemL =
8454 DAG.getNode(ISD::UREM, dl, HiLoVT, Sum,
8455 DAG.getConstant(Divisor.trunc(HBitWidth), dl, HiLoVT));
8456 SDValue RemH = DAG.getConstant(0, dl, HiLoVT);
8457
8458 if (Opcode != ISD::UREM) {
8459 // If we didn't shift LH/LR earlier, do it now.
8460 if (BestChunkWidth != HBitWidth)
8461 ShiftRight(LL, LH, TrailingZeros);
8462
8463 // Subtract the remainder from the shifted dividend.
8464 SDValue Dividend = DAG.getNode(ISD::BUILD_PAIR, dl, VT, LL, LH);
8465 SDValue Rem = DAG.getNode(ISD::BUILD_PAIR, dl, VT, RemL, RemH);
8466
8467 Dividend = DAG.getNode(ISD::SUB, dl, VT, Dividend, Rem);
8468
8469 // Multiply by the multiplicative inverse of the divisor modulo
8470 // (1 << BitWidth).
8471 APInt MulFactor = Divisor.multiplicativeInverse();
8472
8473 SDValue Quotient = DAG.getNode(ISD::MUL, dl, VT, Dividend,
8474 DAG.getConstant(MulFactor, dl, VT));
8475
8476 // Split the quotient into low and high parts.
8477 SDValue QuotL, QuotH;
8478 std::tie(QuotL, QuotH) = DAG.SplitScalar(Quotient, dl, HiLoVT, HiLoVT);
8479 Result.push_back(QuotL);
8480 Result.push_back(QuotH);
8481 }
8482
8483 if (Opcode != ISD::UDIV) {
8484 // If we shifted the input, shift the remainder left and add the bits we
8485 // shifted off the input.
8486 if (TrailingZeros) {
8487 if (TrailingZeros < HBitWidth) {
8488 // Shift RemH:RemL left by TrailingZeros.
8489 // RemH gets the high bits shifted out of RemL.
8490 RemH = DAG.getNode(
8491 ISD::SRL, dl, HiLoVT, RemL,
8492 DAG.getShiftAmountConstant(HBitWidth - TrailingZeros, HiLoVT, dl));
8493 RemL =
8494 DAG.getNode(ISD::SHL, dl, HiLoVT, RemL,
8495 DAG.getShiftAmountConstant(TrailingZeros, HiLoVT, dl));
8496 // OR in the partial remainder.
8497 RemL = DAG.getNode(ISD::OR, dl, HiLoVT, RemL, PartialRemL,
8499 } else if (TrailingZeros == HBitWidth) {
8500 // Shift left by exactly HBitWidth: RemH becomes RemL, RemL becomes
8501 // PartialRemL.
8502 RemH = RemL;
8503 RemL = PartialRemL;
8504 } else {
8505 // Shift left by more than HBitWidth.
8506 RemH = DAG.getNode(
8507 ISD::SHL, dl, HiLoVT, RemL,
8508 DAG.getShiftAmountConstant(TrailingZeros - HBitWidth, HiLoVT, dl));
8509 RemH = DAG.getNode(ISD::OR, dl, HiLoVT, RemH, PartialRemH,
8511 RemL = PartialRemL;
8512 }
8513 }
8514 Result.push_back(RemL);
8515 Result.push_back(RemH);
8516 }
8517
8518 return true;
8519}
8520
8521bool TargetLowering::expandUDIVREMByConstantViaUMulHiMagic(
8522 SDNode *N, const APInt &Divisor, SmallVectorImpl<SDValue> &Result,
8523 EVT HiLoVT, SelectionDAG &DAG, SDValue LL, SDValue LH) const {
8524
8525 SDValue N0 = N->getOperand(0);
8526 EVT VT = N0->getValueType(0);
8527 SDLoc DL{N};
8528
8529 assert(!Divisor.isOne() && "Magic algorithm does not work for division by 1");
8530
8531 // This helper creates a MUL_LOHI of the pair (LL, LH) by a constant.
8532 auto MakeMUL_LOHIByConst = [&](unsigned Opc, SDValue LL, SDValue LH,
8533 const APInt &Const,
8534 SmallVectorImpl<SDValue> &Result) {
8535 SDValue LHS = DAG.getNode(ISD::BUILD_PAIR, DL, VT, LL, LH);
8536 SDValue RHS = DAG.getConstant(Const, DL, VT);
8537 auto [RL, RH] = DAG.SplitScalar(RHS, DL, HiLoVT, HiLoVT);
8538 return expandMUL_LOHI(Opc, VT, DL, LHS, RHS, Result, HiLoVT, DAG,
8540 LL, LH, RL, RH);
8541 };
8542
8543 // This helper creates an ADD/SUB of the pairs (LL, LH) and (RL, RH).
8544 auto MakeAddSubLong = [&](unsigned Opc, SDValue LL, SDValue LH, SDValue RL,
8545 SDValue RH) {
8546 SDValue AddSubNode =
8548 DAG.getVTList(HiLoVT, MVT::i1), LL, RL);
8549 SDValue OutL = AddSubNode.getValue(0);
8550 SDValue Overflow = AddSubNode.getValue(1);
8551 SDValue AddSubWithOverflow =
8553 DAG.getVTList(HiLoVT, MVT::i1), LH, RH, Overflow);
8554 SDValue OutH = AddSubWithOverflow.getValue(0);
8555 return std::make_pair(OutL, OutH);
8556 };
8557
8558 // This helper creates a SRL of the pair (LL, LH) by Shift.
8559 auto MakeSRLLong = [&](SDValue LL, SDValue LH, unsigned Shift) {
8560 unsigned HBitWidth = HiLoVT.getScalarSizeInBits();
8561 if (Shift < HBitWidth) {
8562 SDValue ShAmt = DAG.getShiftAmountConstant(Shift, HiLoVT, DL);
8563 SDValue ResL = DAG.getNode(ISD::FSHR, DL, HiLoVT, LH, LL, ShAmt);
8564 SDValue ResH = DAG.getNode(ISD::SRL, DL, HiLoVT, LH, ShAmt);
8565 return std::make_pair(ResL, ResH);
8566 }
8567 SDValue Zero = DAG.getConstant(0, DL, HiLoVT);
8568 if (Shift == HBitWidth)
8569 return std::make_pair(LH, Zero);
8570 assert(Shift - HBitWidth < HBitWidth &&
8571 "We shouldn't generate an undefined shift");
8572 SDValue ShAmt = DAG.getShiftAmountConstant(Shift - HBitWidth, HiLoVT, DL);
8573 return std::make_pair(DAG.getNode(ISD::SRL, DL, HiLoVT, LH, ShAmt), Zero);
8574 };
8575
8576 // Knowledge of leading zeros may help to reduce the multiplier.
8577 unsigned KnownLeadingZeros = DAG.computeKnownBits(N0).countMinLeadingZeros();
8578
8579 UnsignedDivisionByConstantInfo Magics = UnsignedDivisionByConstantInfo::get(
8580 Divisor, std::min(KnownLeadingZeros, Divisor.countl_zero()));
8581
8582 assert(!LL == !LH && "Expected both input halves or no input halves!");
8583 if (!LL)
8584 std::tie(LL, LH) = DAG.SplitScalar(N0, DL, HiLoVT, HiLoVT);
8585 SDValue QL = LL;
8586 SDValue QH = LH;
8587 if (Magics.PreShift != 0)
8588 std::tie(QL, QH) = MakeSRLLong(QL, QH, Magics.PreShift);
8589
8590 SmallVector<SDValue, 4> UMulResult;
8591 if (!MakeMUL_LOHIByConst(ISD::UMUL_LOHI, QL, QH, Magics.Magic, UMulResult))
8592 return false;
8593
8594 QL = UMulResult[2];
8595 QH = UMulResult[3];
8596
8597 if (Magics.IsAdd) {
8598 auto [NPQL, NPQH] = MakeAddSubLong(ISD::SUB, LL, LH, QL, QH);
8599 std::tie(NPQL, NPQH) = MakeSRLLong(NPQL, NPQH, 1);
8600 std::tie(QL, QH) = MakeAddSubLong(ISD::ADD, NPQL, NPQH, QL, QH);
8601 }
8602
8603 if (Magics.PostShift != 0)
8604 std::tie(QL, QH) = MakeSRLLong(QL, QH, Magics.PostShift);
8605
8606 unsigned Opcode = N->getOpcode();
8607 if (Opcode != ISD::UREM) {
8608 Result.push_back(QL);
8609 Result.push_back(QH);
8610 }
8611
8612 if (Opcode != ISD::UDIV) {
8613 SmallVector<SDValue, 2> MulResult;
8614 if (!MakeMUL_LOHIByConst(ISD::MUL, QL, QH, Divisor, MulResult))
8615 return false;
8616
8617 assert(MulResult.size() == 2);
8618
8619 auto [RemL, RemH] =
8620 MakeAddSubLong(ISD::SUB, LL, LH, MulResult[0], MulResult[1]);
8621
8622 Result.push_back(RemL);
8623 Result.push_back(RemH);
8624 }
8625
8626 return true;
8627}
8628
8631 EVT HiLoVT, SelectionDAG &DAG,
8632 SDValue LL, SDValue LH) const {
8633 unsigned Opcode = N->getOpcode();
8634
8635 // TODO: Support signed division/remainder.
8636 if (Opcode == ISD::SREM || Opcode == ISD::SDIV || Opcode == ISD::SDIVREM)
8637 return false;
8638 assert(
8639 (Opcode == ISD::UREM || Opcode == ISD::UDIV || Opcode == ISD::UDIVREM) &&
8640 "Unexpected opcode");
8641
8642 auto *CN = dyn_cast<ConstantSDNode>(N->getOperand(1));
8643 if (!CN)
8644 return false;
8645
8646 APInt Divisor = CN->getAPIntValue();
8647
8648 // The generated half-width UREM is normally optimized using high multiply.
8649 // If the wide UREM libcall is unavailable, a legal or custom half-width
8650 // UDIVREM can lower it instead.
8651 bool CanDecomposeUREMWithoutMulHi =
8652 Opcode == ISD::UREM &&
8653 getLibcallImpl(RTLIB::getUREM(N->getValueType(0))) ==
8654 RTLIB::Unsupported &&
8656 if (!CanDecomposeUREMWithoutMulHi &&
8659 return false;
8660
8661 // Prefer the smaller libcall when one is available.
8662 if (DAG.shouldOptForSize() && !CanDecomposeUREMWithoutMulHi)
8663 return false;
8664
8665 // Early out for 0 or 1 divisors.
8666 if (Divisor.ule(1))
8667 return false;
8668
8669 if (expandUDIVREMByConstantViaUREMDecomposition(N, Divisor, Result, HiLoVT,
8670 DAG, LL, LH))
8671 return true;
8672
8673 if (expandUDIVREMByConstantViaUMulHiMagic(N, Divisor, Result, HiLoVT, DAG, LL,
8674 LH))
8675 return true;
8676
8677 return false;
8678}
8679
8680// Check that (every element of) Z is undef or not an exact multiple of BW.
8681static bool isNonZeroModBitWidthOrUndef(SDValue Z, unsigned BW) {
8683 Z,
8684 [=](ConstantSDNode *C) { return !C || C->getAPIntValue().urem(BW) != 0; },
8685 /*AllowUndefs=*/true, /*AllowTruncation=*/true);
8686}
8687
8689 SelectionDAG &DAG) const {
8690 EVT VT = Node->getValueType(0);
8691
8692 if (VT.isVector() && (!isOperationLegalOrCustom(ISD::SHL, VT) ||
8696 return SDValue();
8697
8698 SDValue X = Node->getOperand(0);
8699 SDValue Y = Node->getOperand(1);
8700 SDValue Z = Node->getOperand(2);
8701
8702 unsigned BW = VT.getScalarSizeInBits();
8703 bool IsFSHL = Node->getOpcode() == ISD::FSHL;
8704 SDLoc DL(SDValue(Node, 0));
8705
8706 EVT ShVT = Z.getValueType();
8707
8708 // If a funnel shift in the other direction is more supported, use it.
8709 unsigned RevOpcode = IsFSHL ? ISD::FSHR : ISD::FSHL;
8710 if (!isOperationLegalOrCustom(Node->getOpcode(), VT) &&
8711 isOperationLegalOrCustom(RevOpcode, VT) && isPowerOf2_32(BW)) {
8712 if (isNonZeroModBitWidthOrUndef(Z, BW)) {
8713 // fshl X, Y, Z -> fshr X, Y, -Z
8714 // fshr X, Y, Z -> fshl X, Y, -Z
8715 Z = DAG.getNegative(Z, DL, ShVT);
8716 } else {
8717 // fshl X, Y, Z -> fshr (srl X, 1), (fshr X, Y, 1), ~Z
8718 // fshr X, Y, Z -> fshl (fshl X, Y, 1), (shl Y, 1), ~Z
8719 SDValue One = DAG.getConstant(1, DL, ShVT);
8720 if (IsFSHL) {
8721 Y = DAG.getNode(RevOpcode, DL, VT, X, Y, One);
8722 X = DAG.getNode(ISD::SRL, DL, VT, X, One);
8723 } else {
8724 X = DAG.getNode(RevOpcode, DL, VT, X, Y, One);
8725 Y = DAG.getNode(ISD::SHL, DL, VT, Y, One);
8726 }
8727 Z = DAG.getNOT(DL, Z, ShVT);
8728 }
8729 return DAG.getNode(RevOpcode, DL, VT, X, Y, Z);
8730 }
8731
8732 SDValue ShX, ShY;
8733 SDValue ShAmt, InvShAmt;
8734 if (isNonZeroModBitWidthOrUndef(Z, BW)) {
8735 // fshl: X << C | Y >> (BW - C)
8736 // fshr: X << (BW - C) | Y >> C
8737 // where C = Z % BW is not zero
8738 SDValue BitWidthC = DAG.getConstant(BW, DL, ShVT);
8739 ShAmt = DAG.getNode(ISD::UREM, DL, ShVT, Z, BitWidthC);
8740 InvShAmt = DAG.getNode(ISD::SUB, DL, ShVT, BitWidthC, ShAmt);
8741 ShX = DAG.getNode(ISD::SHL, DL, VT, X, IsFSHL ? ShAmt : InvShAmt);
8742 ShY = DAG.getNode(ISD::SRL, DL, VT, Y, IsFSHL ? InvShAmt : ShAmt);
8743 } else {
8744 // fshl: X << (Z % BW) | Y >> 1 >> (BW - 1 - (Z % BW))
8745 // fshr: X << 1 << (BW - 1 - (Z % BW)) | Y >> (Z % BW)
8746 SDValue Mask = DAG.getConstant(BW - 1, DL, ShVT);
8747 if (isPowerOf2_32(BW)) {
8748 // Z % BW -> Z & (BW - 1)
8749 ShAmt = DAG.getNode(ISD::AND, DL, ShVT, Z, Mask);
8750 // (BW - 1) - (Z % BW) -> ~Z & (BW - 1)
8751 InvShAmt = DAG.getNode(ISD::AND, DL, ShVT, DAG.getNOT(DL, Z, ShVT), Mask);
8752 } else {
8753 SDValue BitWidthC = DAG.getConstant(BW, DL, ShVT);
8754 ShAmt = DAG.getNode(ISD::UREM, DL, ShVT, Z, BitWidthC);
8755 InvShAmt = DAG.getNode(ISD::SUB, DL, ShVT, Mask, ShAmt);
8756 }
8757
8758 SDValue One = DAG.getConstant(1, DL, ShVT);
8759 if (IsFSHL) {
8760 ShX = DAG.getNode(ISD::SHL, DL, VT, X, ShAmt);
8761 SDValue ShY1 = DAG.getNode(ISD::SRL, DL, VT, Y, One);
8762 ShY = DAG.getNode(ISD::SRL, DL, VT, ShY1, InvShAmt);
8763 } else {
8764 SDValue ShX1 = DAG.getNode(ISD::SHL, DL, VT, X, One);
8765 ShX = DAG.getNode(ISD::SHL, DL, VT, ShX1, InvShAmt);
8766 ShY = DAG.getNode(ISD::SRL, DL, VT, Y, ShAmt);
8767 }
8768 }
8769 return DAG.getNode(ISD::OR, DL, VT, ShX, ShY);
8770}
8771
8772// TODO: Merge with expandFunnelShift.
8774 SelectionDAG &DAG) const {
8775 EVT VT = Node->getValueType(0);
8776 unsigned EltSizeInBits = VT.getScalarSizeInBits();
8777 bool IsLeft = Node->getOpcode() == ISD::ROTL;
8778 SDValue Op0 = Node->getOperand(0);
8779 SDValue Op1 = Node->getOperand(1);
8780 SDLoc DL(SDValue(Node, 0));
8781
8782 EVT ShVT = Op1.getValueType();
8783 SDValue Zero = DAG.getConstant(0, DL, ShVT);
8784
8785 // If a rotate in the other direction is more supported, use it.
8786 unsigned RevRot = IsLeft ? ISD::ROTR : ISD::ROTL;
8787 if (!isOperationLegalOrCustom(Node->getOpcode(), VT) &&
8788 isOperationLegalOrCustom(RevRot, VT) && isPowerOf2_32(EltSizeInBits)) {
8789 SDValue Sub = DAG.getNode(ISD::SUB, DL, ShVT, Zero, Op1);
8790 return DAG.getNode(RevRot, DL, VT, Op0, Sub);
8791 }
8792
8793 if (!AllowVectorOps && VT.isVector() &&
8799 return SDValue();
8800
8801 unsigned ShOpc = IsLeft ? ISD::SHL : ISD::SRL;
8802 unsigned HsOpc = IsLeft ? ISD::SRL : ISD::SHL;
8803 SDValue BitWidthMinusOneC = DAG.getConstant(EltSizeInBits - 1, DL, ShVT);
8804 SDValue ShVal;
8805 SDValue HsVal;
8806 if (isPowerOf2_32(EltSizeInBits)) {
8807 // (rotl x, c) -> x << (c & (w - 1)) | x >> (-c & (w - 1))
8808 // (rotr x, c) -> x >> (c & (w - 1)) | x << (-c & (w - 1))
8809 SDValue NegOp1 = DAG.getNode(ISD::SUB, DL, ShVT, Zero, Op1);
8810 SDValue ShAmt = DAG.getNode(ISD::AND, DL, ShVT, Op1, BitWidthMinusOneC);
8811 ShVal = DAG.getNode(ShOpc, DL, VT, Op0, ShAmt);
8812 SDValue HsAmt = DAG.getNode(ISD::AND, DL, ShVT, NegOp1, BitWidthMinusOneC);
8813 HsVal = DAG.getNode(HsOpc, DL, VT, Op0, HsAmt);
8814 } else {
8815 // (rotl x, c) -> x << (c % w) | x >> 1 >> (w - 1 - (c % w))
8816 // (rotr x, c) -> x >> (c % w) | x << 1 << (w - 1 - (c % w))
8817 SDValue BitWidthC = DAG.getConstant(EltSizeInBits, DL, ShVT);
8818 SDValue ShAmt = DAG.getNode(ISD::UREM, DL, ShVT, Op1, BitWidthC);
8819 ShVal = DAG.getNode(ShOpc, DL, VT, Op0, ShAmt);
8820 SDValue HsAmt = DAG.getNode(ISD::SUB, DL, ShVT, BitWidthMinusOneC, ShAmt);
8821 SDValue One = DAG.getConstant(1, DL, ShVT);
8822 HsVal =
8823 DAG.getNode(HsOpc, DL, VT, DAG.getNode(HsOpc, DL, VT, Op0, One), HsAmt);
8824 }
8825 return DAG.getNode(ISD::OR, DL, VT, ShVal, HsVal);
8826}
8827
8828/// Check if CLMUL on VT can eventually reach a type with legal CLMUL through
8829/// a chain of halving decompositions (halving element width) and/or vector
8830/// widening (doubling element count). This guides expansion strategy selection:
8831/// if true, the halving/widening path produces better code than bit-by-bit.
8832///
8833/// HalveDepth tracks halving steps only (each creates ~4x more operations).
8834/// Widening steps are cheap (O(1) pad/extract) and don't count.
8835/// Limiting halvings to 2 prevents exponential blowup:
8836/// 1 halving: ~4 sub-CLMULs (good, e.g. v8i16 -> v8i8)
8837/// 2 halvings: ~16 sub-CLMULs (acceptable, e.g. v4i32 -> v4i16 -> v8i8)
8838/// 3 halvings: ~64 sub-CLMULs (worse than bit-by-bit expansion)
8840 EVT VT, unsigned HalveDepth = 0,
8841 unsigned TotalDepth = 0) {
8842 if (HalveDepth > 2 || TotalDepth > 8 || !VT.isFixedLengthVector())
8843 return false;
8845 return true;
8846 if (!TLI.isTypeLegal(VT))
8847 return false;
8848
8849 unsigned BW = VT.getScalarSizeInBits();
8850
8851 // Halve: halve element width, same element count.
8852 // This is the expensive step -- each halving creates ~4x more operations.
8853 if (BW % 2 == 0) {
8854 EVT HalfEltVT = EVT::getIntegerVT(Ctx, BW / 2);
8855 EVT HalfVT = VT.changeVectorElementType(Ctx, HalfEltVT);
8856 if (TLI.isTypeLegal(HalfVT) &&
8857 canNarrowCLMULToLegal(TLI, Ctx, HalfVT, HalveDepth + 1, TotalDepth + 1))
8858 return true;
8859 }
8860
8861 // Widen: double element count (fixed-width vectors only).
8862 // This is cheap -- just INSERT_SUBVECTOR + EXTRACT_SUBVECTOR.
8863 EVT WideVT = VT.getDoubleNumVectorElementsVT(Ctx);
8864 if (TLI.isTypeLegal(WideVT) &&
8865 canNarrowCLMULToLegal(TLI, Ctx, WideVT, HalveDepth, TotalDepth + 1))
8866 return true;
8867
8868 return false;
8869}
8870
8872 SDLoc DL(Node);
8873 EVT VT = Node->getValueType(0);
8874 SDValue X = Node->getOperand(0);
8875 SDValue Y = Node->getOperand(1);
8876 unsigned BW = VT.getScalarSizeInBits();
8877 unsigned Opcode = Node->getOpcode();
8878 LLVMContext &Ctx = *DAG.getContext();
8879
8880 switch (Opcode) {
8881 case ISD::CLMUL: {
8882 // For vector types, try decomposition strategies that leverage legal
8883 // CLMUL on narrower or wider element types, avoiding the expensive
8884 // bit-by-bit expansion.
8885 if (VT.isVector()) {
8886 // Strategy 1: Halving decomposition to half-element-width CLMUL.
8887 // Applies ExpandIntRes_CLMUL's identity element-wise:
8888 // CLMUL(X, Y) = (Hi << HalfBW) | Lo
8889 // where:
8890 // Lo = CLMUL(XLo, YLo)
8891 // Hi = CLMULH(XLo, YLo) ^ CLMUL(XLo, YHi) ^ CLMUL(XHi, YLo)
8892 unsigned HalfBW = BW / 2;
8893 if (BW % 2 == 0) {
8894 EVT HalfEltVT = EVT::getIntegerVT(Ctx, HalfBW);
8895 EVT HalfVT =
8896 EVT::getVectorVT(Ctx, HalfEltVT, VT.getVectorElementCount());
8897 if (isTypeLegal(HalfVT) && canNarrowCLMULToLegal(*this, Ctx, HalfVT,
8898 /*HalveDepth=*/1)) {
8899 SDValue ShAmt = DAG.getShiftAmountConstant(HalfBW, VT, DL);
8900
8901 // Extract low and high halves of each element.
8902 SDValue XLo = DAG.getNode(ISD::TRUNCATE, DL, HalfVT, X);
8903 SDValue XHi = DAG.getNode(ISD::TRUNCATE, DL, HalfVT,
8904 DAG.getNode(ISD::SRL, DL, VT, X, ShAmt));
8905 SDValue YLo = DAG.getNode(ISD::TRUNCATE, DL, HalfVT, Y);
8906 SDValue YHi = DAG.getNode(ISD::TRUNCATE, DL, HalfVT,
8907 DAG.getNode(ISD::SRL, DL, VT, Y, ShAmt));
8908
8909 // Lo = CLMUL(XLo, YLo)
8910 SDValue Lo = DAG.getNode(ISD::CLMUL, DL, HalfVT, XLo, YLo);
8911
8912 // Hi = CLMULH(XLo, YLo) ^ CLMUL(XLo, YHi) ^ CLMUL(XHi, YLo)
8913 SDValue LoH = DAG.getNode(ISD::CLMULH, DL, HalfVT, XLo, YLo);
8914 SDValue Cross1 = DAG.getNode(ISD::CLMUL, DL, HalfVT, XLo, YHi);
8915 SDValue Cross2 = DAG.getNode(ISD::CLMUL, DL, HalfVT, XHi, YLo);
8916 SDValue Cross = DAG.getNode(ISD::XOR, DL, HalfVT, Cross1, Cross2);
8917 SDValue Hi = DAG.getNode(ISD::XOR, DL, HalfVT, LoH, Cross);
8918
8919 // Reassemble: Result = ZExt(Lo) | (AnyExt(Hi) << HalfBW)
8920 SDValue LoExt = DAG.getNode(ISD::ZERO_EXTEND, DL, VT, Lo);
8921 SDValue HiExt = DAG.getNode(ISD::ANY_EXTEND, DL, VT, Hi);
8922 SDValue HiShifted = DAG.getNode(ISD::SHL, DL, VT, HiExt, ShAmt);
8923 return DAG.getNode(ISD::OR, DL, VT, LoExt, HiShifted);
8924 }
8925 }
8926
8927 // Strategy 2: Promote to double-element-width CLMUL.
8928 // CLMUL(X, Y) = Trunc(CLMUL(AnyExt(X), AnyExt(Y)))
8929 {
8930 EVT ExtVT = VT.widenIntegerElementType(Ctx);
8931 if (isTypeLegal(ExtVT) && isOperationLegalOrCustom(ISD::CLMUL, ExtVT)) {
8932 // If CLMUL on ExtVT is Custom (not Legal), the target may
8933 // scalarize it, costing O(NumElements) scalar ops. The bit-by-bit
8934 // fallback costs O(BW) vectorized iterations. Only widen when
8935 // element count is small enough that scalarization is cheaper.
8936 unsigned NumElts = VT.getVectorMinNumElements();
8937 if (isOperationLegal(ISD::CLMUL, ExtVT) || NumElts < BW) {
8938 SDValue XExt = DAG.getNode(ISD::ANY_EXTEND, DL, ExtVT, X);
8939 SDValue YExt = DAG.getNode(ISD::ANY_EXTEND, DL, ExtVT, Y);
8940 SDValue Mul = DAG.getNode(ISD::CLMUL, DL, ExtVT, XExt, YExt);
8941 return DAG.getNode(ISD::TRUNCATE, DL, VT, Mul);
8942 }
8943 }
8944 }
8945
8946 // Strategy 3: Widen element count (pad with undef, do CLMUL on wider
8947 // vector, extract lower result). CLMUL is element-wise, so upper
8948 // (undef) lanes don't affect the lower results.
8949 // e.g. v4i16 => pad to v8i16 => halve to v8i8 PMUL => extract v4i16.
8950 if (auto EC = VT.getVectorElementCount(); EC.isFixed()) {
8951 EVT WideVT = EVT::getVectorVT(Ctx, VT.getVectorElementType(), EC * 2);
8952 if (isTypeLegal(WideVT) && canNarrowCLMULToLegal(*this, Ctx, WideVT)) {
8953 SDValue Undef = DAG.getUNDEF(WideVT);
8954 SDValue XWide = DAG.getNode(ISD::INSERT_SUBVECTOR, DL, WideVT, Undef,
8955 X, DAG.getVectorIdxConstant(0, DL));
8956 SDValue YWide = DAG.getNode(ISD::INSERT_SUBVECTOR, DL, WideVT, Undef,
8957 Y, DAG.getVectorIdxConstant(0, DL));
8958 SDValue WideRes = DAG.getNode(ISD::CLMUL, DL, WideVT, XWide, YWide);
8959 return DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, VT, WideRes,
8960 DAG.getVectorIdxConstant(0, DL));
8961 }
8962 }
8963 }
8964
8965 // Special case: clmul(X, Y) where Y is a known constant (splat) that forms
8966 // a contiguous block of trailing ones whose length N is a power of two
8967 // (e.g. i8 0xFF, i8 0x0F, ...) or equal to the operand width. In this
8968 // special case, clmul(X, Y) is equivalent to a "parallel prefix XOR" or
8969 // "bitwise parity" operation on X.
8970 //
8971 // Note: This special currently dose NOT apply when the mask is neither a
8972 // power of two nor equal to the operand width because the loop inside
8973 // behaves as if the mask was bit-ceiled, and "undoing" the XOR with parts
8974 // of that CLMUL is a recursive problem (e.g. CLMUL with a 20-bit mask
8975 // requires correction XOR with CLMUL with 12-bit mask).
8976 if (auto *C = isConstOrConstSplat(Y, /*AllowUndefs=*/true)) {
8977 const APInt &YVal = C->getAPIntValue();
8978 unsigned N = YVal.countr_one();
8979 if (YVal.isAllOnes() || (YVal.isMask() && isPowerOf2_32(N))) {
8980 SDValue R = X;
8981 for (unsigned I = 1; I < N; I <<= 1) {
8982 SDValue ShAmt = DAG.getShiftAmountConstant(I, VT, DL);
8983 SDValue Shifted = DAG.getNode(ISD::SHL, DL, VT, R, ShAmt);
8984 R = DAG.getNode(ISD::XOR, DL, VT, R, Shifted);
8985 }
8986 return R;
8987 }
8988 }
8989
8990 // NOTE: If you change this expansion, please update the cost model
8991 // calculation in BasicTTIImpl::getTypeBasedIntrinsicInstrCost for
8992 // Intrinsic::clmul.
8993
8994 // Strategy 4: multiplication with holes.
8995 //
8996 // Uses "holes" (sequences of zeroes) to avoid carry spilling. When carries
8997 // do occur, they wind up in a "hole" and are subsequently masked out of the
8998 // result.
8999 //
9000 // A hole of 3 bits is optimal for 32-bit and 64-bit inputs. 128-bit
9001 // integers need a larger hole, and for smaller integers the fallback below
9002 // is more efficient.
9003 //
9004 // Based on bmul64 in bearssl and bmul in the rust polyval crate.
9005 if (BW >= 32 && BW <= 64 &&
9007
9008 // Set every fourth bit of each nibble, equivalent to 0b00010001...0001.
9009 APInt MaskVal = APInt::getSplat(BW, APInt(4, 0b0001));
9010
9011 // Create versions of X and Y that keep only the I-th bit of
9012 // each nibble.
9013 SDValue M[4], Xp[4], Yp[4];
9014 for (unsigned I = 0; I < 4; ++I) {
9015 M[I] = DAG.getConstant(MaskVal.shl(I), DL, VT);
9016 Xp[I] = DAG.getNode(ISD::AND, DL, VT, X, M[I]);
9017 Yp[I] = DAG.getNode(ISD::AND, DL, VT, Y, M[I]);
9018 }
9019
9020 // Codegens these expressions (16 multiplications):
9021 //
9022 // z0 = (x0 * y0) ^ (x1 * y3) ^ (x2 * y2) ^ (x3 * y1);
9023 // z1 = (x0 * y1) ^ (x1 * y0) ^ (x2 * y3) ^ (x3 * y2);
9024 // z2 = (x0 * y2) ^ (x1 * y1) ^ (x2 * y0) ^ (x3 * y3);
9025 // z3 = (x0 * y3) ^ (x1 * y2) ^ (x2 * y1) ^ (x3 * y0);
9026 SDValue Res = DAG.getConstant(0, DL, VT);
9027 for (unsigned I = 0; I < 4; ++I) {
9028 SDValue Zi = DAG.getConstant(0, DL, VT);
9029 for (unsigned J = 0; J < 4; ++J) {
9030 unsigned K = (I + 4 - J) % 4;
9031 SDValue P = DAG.getNode(ISD::MUL, DL, VT, Xp[J], Yp[K]);
9032 Zi = DAG.getNode(ISD::XOR, DL, VT, Zi, P);
9033 }
9034
9035 // Keep only the bits belonging to this iteration, and bitwise or it all
9036 // together.
9037 Zi = DAG.getNode(ISD::AND, DL, VT, Zi, M[I]);
9038 Res = DAG.getNode(ISD::OR, DL, VT, Res, Zi, SDNodeFlags::Disjoint);
9039 }
9040 return Res;
9041 }
9042
9043 // Strategy 5: the naive fallback.
9044 EVT SetCCVT = getSetCCResultType(DAG.getDataLayout(), Ctx, VT);
9045
9046 SDValue Res = DAG.getConstant(0, DL, VT);
9047 for (unsigned I = 0; I < BW; ++I) {
9048 SDValue ShiftAmt = DAG.getShiftAmountConstant(I, VT, DL);
9049 SDValue Mask = DAG.getConstant(APInt::getOneBitSet(BW, I), DL, VT);
9050 SDValue YMasked = DAG.getNode(ISD::AND, DL, VT, Y, Mask);
9051
9052 // For targets with a fast bit test instruction (e.g., x86 BT) or without
9053 // multiply, use a shift-based expansion to avoid expensive MUL
9054 // instructions.
9055 SDValue Part;
9056 if (!hasBitTest(Y, ShiftAmt) &&
9059 Part = DAG.getNode(ISD::MUL, DL, VT, X, YMasked);
9060 } else {
9061 // Canonical bit test: (Y & (1 << I)) != 0
9062 SDValue Zero = DAG.getConstant(0, DL, VT);
9063 SDValue Cond = DAG.getSetCC(DL, SetCCVT, YMasked, Zero, ISD::SETEQ);
9064 SDValue XShifted = DAG.getNode(ISD::SHL, DL, VT, X, ShiftAmt);
9065 Part = DAG.getSelect(DL, VT, Cond, Zero, XShifted);
9066 }
9067 Res = DAG.getNode(ISD::XOR, DL, VT, Res, Part);
9068 }
9069 return Res;
9070 }
9071 case ISD::CLMULR:
9072 // If we have CLMUL/CLMULH, merge the shifted results to form CLMULR.
9075 SDValue Lo = DAG.getNode(ISD::CLMUL, DL, VT, X, Y);
9076 SDValue Hi = DAG.getNode(ISD::CLMULH, DL, VT, X, Y);
9077 Lo = DAG.getNode(ISD::SRL, DL, VT, Lo,
9078 DAG.getShiftAmountConstant(BW - 1, VT, DL));
9079 Hi = DAG.getNode(ISD::SHL, DL, VT, Hi,
9080 DAG.getShiftAmountConstant(1, VT, DL));
9081 return DAG.getNode(ISD::OR, DL, VT, Lo, Hi);
9082 }
9083 [[fallthrough]];
9084 case ISD::CLMULH: {
9085 EVT ExtVT = VT.widenIntegerElementType(Ctx);
9086 // Use bitreverse-based lowering (CLMULR/H = rev(CLMUL(rev,rev)) >> S)
9087 // when any of these hold:
9088 // (a) ZERO_EXTEND to ExtVT or SRL on ExtVT isn't legal.
9089 // (b) CLMUL is legal on VT but not on ExtVT (e.g. v8i8 on AArch64).
9090 // (c) CLMUL on ExtVT isn't legal, but CLMUL on VT can be efficiently
9091 // expanded via halving/widening to reach legal CLMUL. The bitreverse
9092 // path creates CLMUL(VT) which will be expanded efficiently. The
9093 // promote path would create CLMUL(ExtVT) => halving => CLMULH(VT),
9094 // causing a cycle.
9095 // Note: when CLMUL is legal on ExtVT, the zext => CLMUL(ExtVT) => shift
9096 // => trunc path is preferred over the bitreverse path, as it avoids the
9097 // cost of 3 bitreverse operations.
9102 canNarrowCLMULToLegal(*this, Ctx, VT)))) {
9103 SDValue XRev = DAG.getNode(ISD::BITREVERSE, DL, VT, X);
9104 SDValue YRev = DAG.getNode(ISD::BITREVERSE, DL, VT, Y);
9105 SDValue ClMul = DAG.getNode(ISD::CLMUL, DL, VT, XRev, YRev);
9106 SDValue Res = DAG.getNode(ISD::BITREVERSE, DL, VT, ClMul);
9107 if (Opcode == ISD::CLMULH)
9108 Res = DAG.getNode(ISD::SRL, DL, VT, Res,
9109 DAG.getShiftAmountConstant(1, VT, DL));
9110 return Res;
9111 }
9112 SDValue XExt = DAG.getNode(ISD::ZERO_EXTEND, DL, ExtVT, X);
9113 SDValue YExt = DAG.getNode(ISD::ZERO_EXTEND, DL, ExtVT, Y);
9114 SDValue ClMul = DAG.getNode(ISD::CLMUL, DL, ExtVT, XExt, YExt);
9115 unsigned ShAmt = Opcode == ISD::CLMULR ? BW - 1 : BW;
9116 SDValue HiBits = DAG.getNode(ISD::SRL, DL, ExtVT, ClMul,
9117 DAG.getShiftAmountConstant(ShAmt, ExtVT, DL));
9118 return DAG.getNode(ISD::TRUNCATE, DL, VT, HiBits);
9119 }
9120 }
9121 llvm_unreachable("Expected CLMUL, CLMULR, or CLMULH");
9122}
9123
9125 SDLoc DL(Node);
9126 EVT VT = Node->getValueType(0);
9127 SDValue Val = Node->getOperand(0);
9128 SDValue Msk = Node->getOperand(1);
9129 unsigned BW = VT.getScalarSizeInBits();
9130
9131 // Just scalarize if scalar PEXT is legal
9133 return DAG.UnrollVectorOp(Node);
9134
9135 // Hacker's Delight §7-4: Compress, or Generalized Extract
9136 SDValue X = DAG.getNode(ISD::AND, DL, VT, Val, Msk);
9137 SDValue M = Msk;
9138 SDValue One = DAG.getShiftAmountConstant(1, VT, DL);
9139 SDValue Mk = DAG.getNode(ISD::SHL, DL, VT, DAG.getNOT(DL, M, VT), One);
9140
9141 // Repeatedly compute which bits would shift to the right by an odd amount,
9142 // shift all such bits in parallel using a mask, and double the shift amount.
9143 for (unsigned I = 1; I < BW; I *= 2) {
9144 // This expands the "parallel prefix" operation to clmul(Mk, ~0).
9145 SDValue Mp =
9146 DAG.getNode(ISD::CLMUL, DL, VT, Mk, DAG.getAllOnesConstant(DL, VT));
9147 SDValue Mv = DAG.getNode(ISD::AND, DL, VT, Mp, M);
9148 SDValue ShiftI = DAG.getShiftAmountConstant(I, VT, DL);
9149 SDValue MvS = DAG.getNode(ISD::SRL, DL, VT, Mv, ShiftI);
9150 M = DAG.getNode(ISD::OR, DL, VT, DAG.getNode(ISD::XOR, DL, VT, M, Mv), MvS,
9152 SDValue T = DAG.getNode(ISD::AND, DL, VT, X, Mv);
9153 SDValue TS = DAG.getNode(ISD::SRL, DL, VT, T, ShiftI);
9154 X = DAG.getNode(ISD::OR, DL, VT, DAG.getNode(ISD::XOR, DL, VT, X, T), TS,
9156 if (I * 2 < BW)
9157 Mk = DAG.getNode(ISD::AND, DL, VT, Mk, DAG.getNOT(DL, Mp, VT));
9158 }
9159
9160 return X;
9161}
9162
9164 SDLoc DL(Node);
9165 EVT VT = Node->getValueType(0);
9166 SDValue Val = Node->getOperand(0);
9167 SDValue Msk = Node->getOperand(1);
9168 unsigned BW = VT.getScalarSizeInBits();
9169
9170 // Just scalarize if scalar PDEP is legal
9172 return DAG.UnrollVectorOp(Node);
9173
9174 // Hacker's Delight §7-5: Expand, or Generalized Insert.
9175 unsigned LogBW = Log2_32_Ceil(BW);
9176 SmallVector<SDValue, 8> MvArray(LogBW);
9177 SDValue One = DAG.getShiftAmountConstant(1, VT, DL);
9178 SDValue Mc = Msk;
9179 SDValue Mk = DAG.getNode(ISD::SHL, DL, VT, DAG.getNOT(DL, Msk, VT), One);
9180
9181 // First pass: compute move masks for each power of two that a bit moves by.
9182 for (unsigned S = 0; S < LogBW; ++S) {
9183 unsigned ShiftS = 1u << S;
9184 // This expands the "parallel prefix" operation to clmul(Mk, ~0).
9185 SDValue Mp =
9186 DAG.getNode(ISD::CLMUL, DL, VT, Mk, DAG.getAllOnesConstant(DL, VT));
9187 SDValue Mv = DAG.getNode(ISD::AND, DL, VT, Mp, Mc);
9188 MvArray[S] = Mv;
9189 if (S + 1 < LogBW) {
9190 SDValue McXorMv = DAG.getNode(ISD::XOR, DL, VT, Mc, Mv);
9191 SDValue MvShifted = DAG.getNode(
9192 ISD::SRL, DL, VT, Mv, DAG.getShiftAmountConstant(ShiftS, VT, DL));
9193 Mc = DAG.getNode(ISD::OR, DL, VT, McXorMv, MvShifted,
9195 Mk = DAG.getNode(ISD::AND, DL, VT, Mk, DAG.getNOT(DL, Mp, VT));
9196 }
9197 }
9198
9199 // Second pass: move bits by 32, 16, 8, 4, 2, 1, using masks, in parallel.
9200 // Each pass handles half the shift amount of the previous pass.
9201 SDValue X = Val;
9202 for (int S = (int)LogBW - 1; S >= 0; --S) {
9203 SDValue ShiftSv = DAG.getShiftAmountConstant(1ull << S, VT, DL);
9204 SDValue T = DAG.getNode(ISD::SHL, DL, VT, X, ShiftSv);
9205 SDValue UnshiftedBits =
9206 DAG.getNode(ISD::AND, DL, VT, X, DAG.getNOT(DL, MvArray[S], VT));
9207 SDValue ShiftedBits = DAG.getNode(ISD::AND, DL, VT, T, MvArray[S]);
9208 X = DAG.getNode(ISD::OR, DL, VT, UnshiftedBits, ShiftedBits,
9210 }
9211
9212 return DAG.getNode(ISD::AND, DL, VT, X, Msk);
9213}
9214
9216 SelectionDAG &DAG) const {
9217 assert(Node->getNumOperands() == 3 && "Not a double-shift!");
9218 EVT VT = Node->getValueType(0);
9219 unsigned VTBits = VT.getScalarSizeInBits();
9220 assert(isPowerOf2_32(VTBits) && "Power-of-two integer type expected");
9221
9222 bool IsSHL = Node->getOpcode() == ISD::SHL_PARTS;
9223 bool IsSRA = Node->getOpcode() == ISD::SRA_PARTS;
9224 SDValue ShOpLo = Node->getOperand(0);
9225 SDValue ShOpHi = Node->getOperand(1);
9226 SDValue ShAmt = Node->getOperand(2);
9227 EVT ShAmtVT = ShAmt.getValueType();
9228 EVT ShAmtCCVT =
9229 getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), ShAmtVT);
9230 SDLoc dl(Node);
9231
9232 // ISD::FSHL and ISD::FSHR have defined overflow behavior but ISD::SHL and
9233 // ISD::SRA/L nodes haven't. Insert an AND to be safe, it's usually optimized
9234 // away during isel.
9235 SDValue SafeShAmt = DAG.getNode(ISD::AND, dl, ShAmtVT, ShAmt,
9236 DAG.getConstant(VTBits - 1, dl, ShAmtVT));
9237 SDValue Tmp1 = IsSRA ? DAG.getNode(ISD::SRA, dl, VT, ShOpHi,
9238 DAG.getConstant(VTBits - 1, dl, ShAmtVT))
9239 : DAG.getConstant(0, dl, VT);
9240
9241 SDValue Tmp2, Tmp3;
9242 if (IsSHL) {
9243 Tmp2 = DAG.getNode(ISD::FSHL, dl, VT, ShOpHi, ShOpLo, ShAmt);
9244 Tmp3 = DAG.getNode(ISD::SHL, dl, VT, ShOpLo, SafeShAmt);
9245 } else {
9246 Tmp2 = DAG.getNode(ISD::FSHR, dl, VT, ShOpHi, ShOpLo, ShAmt);
9247 Tmp3 = DAG.getNode(IsSRA ? ISD::SRA : ISD::SRL, dl, VT, ShOpHi, SafeShAmt);
9248 }
9249
9250 // If the shift amount is larger or equal than the width of a part we don't
9251 // use the result from the FSHL/FSHR. Insert a test and select the appropriate
9252 // values for large shift amounts.
9253 SDValue AndNode = DAG.getNode(ISD::AND, dl, ShAmtVT, ShAmt,
9254 DAG.getConstant(VTBits, dl, ShAmtVT));
9255 SDValue Cond = DAG.getSetCC(dl, ShAmtCCVT, AndNode,
9256 DAG.getConstant(0, dl, ShAmtVT), ISD::SETNE);
9257
9258 if (IsSHL) {
9259 Hi = DAG.getNode(ISD::SELECT, dl, VT, Cond, Tmp3, Tmp2);
9260 Lo = DAG.getNode(ISD::SELECT, dl, VT, Cond, Tmp1, Tmp3);
9261 } else {
9262 Lo = DAG.getNode(ISD::SELECT, dl, VT, Cond, Tmp3, Tmp2);
9263 Hi = DAG.getNode(ISD::SELECT, dl, VT, Cond, Tmp1, Tmp3);
9264 }
9265}
9266
9268 SelectionDAG &DAG) const {
9269 // This implements llvm.canonicalize.f* by multiplication with 1.0, as
9270 // suggested in
9271 // https://llvm.org/docs/LangRef.html#llvm-canonicalize-intrinsic.
9272 // It uses strict_fp operations even outside a strict_fp context in order
9273 // to guarantee that the canonicalization is not optimized away by later
9274 // passes. The result chain introduced by that is intentionally ignored
9275 // since no ordering requirement is intended here.
9276 EVT VT = Node->getValueType(0);
9277 SDLoc DL(Node);
9278 SDNodeFlags Flags = Node->getFlags();
9279 Flags.setNoFPExcept(true);
9280 SDValue One = DAG.getConstantFP(1.0, DL, VT);
9281 SDValue Mul =
9282 DAG.getNode(ISD::STRICT_FMUL, DL, {VT, MVT::Other},
9283 {DAG.getEntryNode(), Node->getOperand(0), One}, Flags);
9284 return Mul;
9285}
9286
9288 SelectionDAG &DAG) const {
9289 // Expand conversion from a native IEEE float type to an arbitrary FP format
9290 // returning the result as an integer using bit manipulation.
9291 EVT ResVT = Node->getValueType(0);
9292 SDLoc dl(Node);
9293
9294 SDValue FloatVal = Node->getOperand(0);
9295 const uint64_t SemEnum = Node->getConstantOperandVal(1);
9296 const auto Sem = static_cast<APFloatBase::Semantics>(SemEnum);
9297 const auto RoundMode =
9298 static_cast<RoundingMode>(Node->getConstantOperandVal(2));
9299 const bool Saturate = Node->getConstantOperandVal(3) != 0;
9300
9301 // Supported destination formats.
9302 switch (Sem) {
9309 break;
9310 default:
9311 DAG.getContext()->emitError("CONVERT_TO_ARBITRARY_FP: not implemented "
9312 "destination format (semantics enum " +
9313 Twine(SemEnum) + ")");
9314 return SDValue();
9315 }
9316
9317 // Supported rounding modes.
9318 switch (RoundMode) {
9324 break;
9325 default:
9326 DAG.getContext()->emitError(
9327 "CONVERT_TO_ARBITRARY_FP: unsupported rounding mode (enum " +
9328 Twine(static_cast<int>(RoundMode)) + ")");
9329 return SDValue();
9330 }
9331
9332 // Destination format parameters.
9333 const fltSemantics &DstSem = APFloatBase::EnumToSemantics(Sem);
9334 const unsigned DstBits = APFloat::getSizeInBits(DstSem);
9335 const unsigned DstPrecision = APFloat::semanticsPrecision(DstSem);
9336 const unsigned DstMant = DstPrecision - 1;
9337 // Unsigned formats spend no bit on the sign.
9338 const bool DstHasSign = APFloat::semanticsHasSignedRepr(DstSem);
9339 const unsigned DstExpBits = DstBits - (DstHasSign ? 1 : 0) - DstMant;
9340 const int DstBias = 1 - APFloat::semanticsMinExponent(DstSem);
9341 const unsigned DstExpMax = (1U << DstExpBits) - 1;
9342 const uint64_t DstMantMask = (DstMant > 0) ? ((1ULL << DstMant) - 1) : 0;
9343 const fltNonfiniteBehavior DstNFBehavior = DstSem.nonFiniteBehavior;
9344 const fltNanEncoding DstNanEnc = DstSem.nanEncoding;
9345
9346 // Compute the maximum normal exponent for the destination format.
9347 const unsigned DstExpMaxNormal =
9348 DstNFBehavior == fltNonfiniteBehavior::IEEE754 ? DstExpMax - 1
9349 : DstExpMax;
9350
9351 // For NanOnly formats the max exponent field for finite values
9352 // is DstExpMax, but the encoding with exp = DstExpMax and
9353 // mant = all-ones is NaN. So DstExpMaxNormal = DstExpMax, but max
9354 // mantissa at that exponent is DstMantMask - 1 (if NanEnc == AllOnes) to
9355 // avoid the NaN encoding.
9356 uint64_t DstMaxMantAtMaxExp = DstMantMask;
9357 if (DstNFBehavior == fltNonfiniteBehavior::NanOnly &&
9358 DstNanEnc == fltNanEncoding::AllOnes)
9359 DstMaxMantAtMaxExp = DstMantMask - 1;
9360
9361 // Source format parameters.
9362 EVT SrcVT = FloatVal.getValueType();
9363 const fltSemantics &SrcSem = SrcVT.getScalarType().getFltSemantics();
9364 const unsigned SrcBits = APFloat::getSizeInBits(SrcSem);
9365 const unsigned SrcPrecision = APFloat::semanticsPrecision(SrcSem);
9366 const unsigned SrcMant = SrcPrecision - 1;
9367 const uint64_t SrcMantMask = (1ULL << SrcMant) - 1;
9368
9369 // Work in the source integer type. Match the destination shape so the
9370 // expansion stays vector when ResVT is a vector.
9371 EVT IntScalarVT = EVT::getIntegerVT(*DAG.getContext(), SrcBits);
9372 EVT IntVT = ResVT.changeElementType(*DAG.getContext(), IntScalarVT);
9373 EVT SetCCVT =
9374 getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), IntVT);
9375 EVT FPSetCCVT =
9376 getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), SrcVT);
9377
9378 SDValue Zero = DAG.getConstant(0, dl, IntVT);
9379 SDValue One = DAG.getConstant(1, dl, IntVT);
9380
9381 // Bitcast source float to integer to extract the sign bit.
9382 SDValue Src = DAG.getNode(ISD::BITCAST, dl, IntVT, FloatVal);
9383 SDValue SignBit =
9384 DAG.getNode(ISD::SRL, dl, IntVT, Src,
9385 DAG.getShiftAmountConstant(SrcBits - 1, IntVT, dl));
9386
9387 // Classify the input.
9388 SDValue FPZero = DAG.getConstantFP(0.0, dl, SrcVT);
9389 SDValue FPInf = DAG.getConstantFP(APFloat::getInf(SrcSem), dl, SrcVT);
9390 SDValue AbsVal = DAG.getNode(ISD::FABS, dl, SrcVT, FloatVal);
9391 SDValue IsNaN = DAG.getSetCC(dl, FPSetCCVT, FloatVal, FPZero, ISD::SETUO);
9392 SDValue IsInf = DAG.getSetCC(dl, FPSetCCVT, AbsVal, FPInf, ISD::SETOEQ);
9393 SDValue IsZero = DAG.getSetCC(dl, FPSetCCVT, FloatVal, FPZero, ISD::SETOEQ);
9394
9395 // Split into a normalized fraction and unbiased exponent. FFREXP normalizes
9396 // source denormals automatically. The result is unspecified for Inf/NaN, but
9397 // those inputs are detected above and override the final result.
9398 EVT FrexpExpScalarVT =
9400 EVT FrexpExpVT = SrcVT.changeElementType(*DAG.getContext(), FrexpExpScalarVT);
9401 SDValue Frexp =
9402 DAG.getNode(ISD::FFREXP, dl, DAG.getVTList(SrcVT, FrexpExpVT), FloatVal);
9403 SDValue FrexpFrac = Frexp.getValue(0);
9404 SDValue FrexpExp = Frexp.getValue(1);
9405
9406 SDValue FrexpFracInt = DAG.getNode(ISD::BITCAST, dl, IntVT, FrexpFrac);
9407 SDValue EffSrcMant = DAG.getNode(ISD::AND, dl, IntVT, FrexpFracInt,
9408 DAG.getConstant(SrcMantMask, dl, IntVT));
9409
9410 SDValue FrexpExpExt = DAG.getSExtOrTrunc(FrexpExp, dl, IntVT);
9411 SDValue NewExp = DAG.getNode(ISD::ADD, dl, IntVT, FrexpExpExt,
9412 DAG.getConstant(DstBias - 1, dl, IntVT));
9413
9414 // Compute rounding increment given the round bit, sticky bits, and LSB
9415 // of the truncated mantissa.
9416 auto ComputeRoundUp = [&](SDValue RoundBit, SDValue StickyBits,
9417 SDValue LSB) -> SDValue {
9418 switch (RoundMode) {
9420 // Round up if round_bit && (sticky || lsb)
9421 SDValue StickyOrLSB = DAG.getNode(ISD::OR, dl, IntVT, StickyBits, LSB);
9422 return DAG.getNode(ISD::AND, dl, IntVT, RoundBit, StickyOrLSB);
9423 }
9425 return Zero;
9427 // Round up if positive and any truncated bits are set.
9428 SDValue AnyTruncBits =
9429 DAG.getNode(ISD::OR, dl, IntVT, RoundBit, StickyBits);
9430 SDValue HasTruncBits =
9431 DAG.getSetCC(dl, SetCCVT, AnyTruncBits, Zero, ISD::SETNE);
9432 SDValue IsPositive = DAG.getSetCC(dl, SetCCVT, SignBit, Zero, ISD::SETEQ);
9433 SDValue DoRound =
9434 DAG.getNode(ISD::AND, dl, SetCCVT, HasTruncBits, IsPositive);
9435 return DAG.getNode(ISD::ZERO_EXTEND, dl, IntVT, DoRound);
9436 }
9438 // Round up if negative and any truncated bits are set (to -Inf).
9439 SDValue AnyTruncBits =
9440 DAG.getNode(ISD::OR, dl, IntVT, RoundBit, StickyBits);
9441 SDValue HasTruncBits =
9442 DAG.getSetCC(dl, SetCCVT, AnyTruncBits, Zero, ISD::SETNE);
9443 SDValue IsNegative = DAG.getSetCC(dl, SetCCVT, SignBit, Zero, ISD::SETNE);
9444 SDValue DoRound =
9445 DAG.getNode(ISD::AND, dl, SetCCVT, HasTruncBits, IsNegative);
9446 return DAG.getNode(ISD::ZERO_EXTEND, dl, IntVT, DoRound);
9447 }
9449 return RoundBit;
9450 default:
9451 llvm_unreachable("unsupported rounding mode");
9452 }
9453 };
9454
9455 // Round mantissa from SrcMant bits to DstMant bits.
9456 SDValue TruncMant;
9457 SDValue RoundUp;
9458 if (SrcMant > DstMant) {
9459 const unsigned Shift = SrcMant - DstMant;
9460 SDValue ShiftConst = DAG.getShiftAmountConstant(Shift, IntVT, dl);
9461 TruncMant = DAG.getNode(ISD::SRL, dl, IntVT, EffSrcMant, ShiftConst);
9462
9463 // Check bit at position Shift - 1 aka the round bit.
9464 SDValue RoundBit;
9465 if (Shift >= 1) {
9466 SDValue RoundBitShift = DAG.getShiftAmountConstant(Shift - 1, IntVT, dl);
9467 SDValue ShiftedMant =
9468 DAG.getNode(ISD::SRL, dl, IntVT, EffSrcMant, RoundBitShift);
9469 RoundBit = DAG.getNode(ISD::AND, dl, IntVT, ShiftedMant, One);
9470 } else {
9471 RoundBit = Zero;
9472 }
9473
9474 // OR of all bits below the round bit to get sticky bits.
9475 SDValue StickyBits;
9476 if (Shift >= 2) {
9477 uint64_t StickyMask = maskTrailingOnes<uint64_t>(Shift - 1);
9478 StickyBits = DAG.getNode(ISD::AND, dl, IntVT, EffSrcMant,
9479 DAG.getConstant(StickyMask, dl, IntVT));
9480 StickyBits = DAG.getSetCC(dl, SetCCVT, StickyBits, Zero, ISD::SETNE);
9481 StickyBits = DAG.getNode(ISD::ZERO_EXTEND, dl, IntVT, StickyBits);
9482 } else {
9483 StickyBits = Zero;
9484 }
9485
9486 // LSB of truncated mantissa.
9487 SDValue LSB = DAG.getNode(ISD::AND, dl, IntVT, TruncMant, One);
9488
9489 RoundUp = ComputeRoundUp(RoundBit, StickyBits, LSB);
9490 } else {
9491 // If DstMant >= SrcMant, then no rounding needed, just shift left.
9492 SDValue MantShift =
9493 DAG.getShiftAmountConstant(DstMant - SrcMant, IntVT, dl);
9494 TruncMant = DAG.getNode(ISD::SHL, dl, IntVT, EffSrcMant, MantShift);
9495 RoundUp = Zero;
9496 }
9497
9498 // Apply rounding.
9499 SDValue RoundedMant = DAG.getNode(ISD::ADD, dl, IntVT, TruncMant, RoundUp);
9500
9501 // Handle mantissa overflow from rounding.
9502 // If rounded_mant > DstMantMask, carry into exponent.
9503 SDValue MantOverflow =
9504 DAG.getSetCC(dl, SetCCVT, RoundedMant,
9505 DAG.getConstant(DstMantMask, dl, IntVT), ISD::SETGT);
9506 // On overflow: mant = 0, exp += 1.
9507 SDValue AdjMant = DAG.getSelect(dl, IntVT, MantOverflow, Zero, RoundedMant);
9508 SDValue AdjExp =
9509 DAG.getNode(ISD::ADD, dl, IntVT, NewExp,
9510 DAG.getNode(ISD::ZERO_EXTEND, dl, IntVT, MantOverflow));
9511
9512 // Precompute sign shifted to MSB of destination. Unsigned formats have no
9513 // sign bit to merge in.
9514 SDValue SignShifted =
9515 DstHasSign
9516 ? DAG.getNode(ISD::SHL, dl, IntVT, SignBit,
9517 DAG.getShiftAmountConstant(DstBits - 1, IntVT, dl))
9518 : Zero;
9519
9520 // Destination denormal conversion (when new_exp <= 0).
9521 // Shift the mantissa right by 1 - new_exp additional bits and set the
9522 // exponent field to 0.
9523 SDValue ExpIsNeg = DAG.getSetCC(dl, SetCCVT, AdjExp,
9524 DAG.getConstant(1, dl, IntVT), ISD::SETLT);
9525
9526 SDValue DenormResult;
9527 {
9528 // denorm_shift = 1 - NewExp.
9529 SDValue DenormShift = DAG.getNode(ISD::SUB, dl, IntVT, One, NewExp);
9530
9531 // full_src_mant = (1 << SrcMant) | EffSrcMant.
9532 SDValue ImplicitOne =
9533 DAG.getNode(ISD::SHL, dl, IntVT, One,
9534 DAG.getShiftAmountConstant(SrcMant, IntVT, dl));
9535 SDValue FullSrcMant =
9536 DAG.getNode(ISD::OR, dl, IntVT, EffSrcMant, ImplicitOne);
9537
9538 // Total right shift = DenormShift + (SrcMant - DstMant).
9539 int64_t MantDelta = static_cast<int64_t>(SrcMant) - DstMant;
9540 SDValue TotalShift =
9541 DAG.getNode(ISD::ADD, dl, IntVT, DenormShift,
9542 DAG.getSignedConstant(MantDelta, dl, IntVT));
9543
9544 // Clamp total shift to avoid UB, then truncate denorm mantissa.
9545 EVT ShiftVT = getShiftAmountTy(IntVT, DAG.getDataLayout());
9546 SDValue MaxShift = DAG.getConstant(SrcBits - 1, dl, IntVT);
9547 SDValue ClampedShift =
9548 DAG.getNode(ISD::UMIN, dl, IntVT, TotalShift, MaxShift);
9549 SDValue DenormTruncMant =
9550 DAG.getNode(ISD::SRL, dl, IntVT, FullSrcMant,
9551 DAG.getZExtOrTrunc(ClampedShift, dl, ShiftVT));
9552
9553 // Rounding for denorm path.
9554 SDValue DenormRoundUp;
9555 {
9556 // Round bit is at position TotalShift - 1 of FullSrcMant.
9557 // Clamp to at least 1 so the subtraction doesn't underflow and create
9558 // shift nodes with invalid shift amounts.
9559 SDValue SafeShift = DAG.getNode(ISD::UMAX, dl, IntVT, ClampedShift, One);
9560 SDValue RoundBitPos = DAG.getNode(ISD::SUB, dl, IntVT, SafeShift, One);
9561 SDValue RoundBitPosAmt = DAG.getZExtOrTrunc(RoundBitPos, dl, ShiftVT);
9562 SDValue DenormRoundBit = DAG.getNode(
9563 ISD::AND, dl, IntVT,
9564 DAG.getNode(ISD::SRL, dl, IntVT, FullSrcMant, RoundBitPosAmt), One);
9565
9566 // Sticky: all bits below round bit.
9567 // sticky_mask = (1 << RoundBitPos) - 1
9568 SDValue StickyMask = DAG.getNode(
9569 ISD::SUB, dl, IntVT,
9570 DAG.getNode(ISD::SHL, dl, IntVT, One, RoundBitPosAmt), One);
9571 SDValue DenormStickyBits =
9572 DAG.getNode(ISD::AND, dl, IntVT, FullSrcMant, StickyMask);
9573 SDValue HasSticky = DAG.getNode(
9574 ISD::ZERO_EXTEND, dl, IntVT,
9575 DAG.getSetCC(dl, SetCCVT, DenormStickyBits, Zero, ISD::SETNE));
9576
9577 SDValue DenormLSB =
9578 DAG.getNode(ISD::AND, dl, IntVT, DenormTruncMant, One);
9579
9580 DenormRoundUp = ComputeRoundUp(DenormRoundBit, HasSticky, DenormLSB);
9581
9582 // Only apply rounding if TotalShift >= 1 (i.e., there are bits to round).
9583 SDValue ShiftGEOne =
9584 DAG.getSetCC(dl, SetCCVT, ClampedShift, One, ISD::SETUGE);
9585 DenormRoundUp = DAG.getSelect(dl, IntVT, ShiftGEOne, DenormRoundUp, Zero);
9586 }
9587
9588 SDValue DenormRoundedMant =
9589 DAG.getNode(ISD::ADD, dl, IntVT, DenormTruncMant, DenormRoundUp);
9590
9591 // If rounding caused overflow into the normal range, then we get the
9592 // smallest normal number.
9593 SDValue DenormMantOF =
9594 DAG.getSetCC(dl, SetCCVT, DenormRoundedMant,
9595 DAG.getConstant(DstMantMask, dl, IntVT), ISD::SETGT);
9596 SDValue DenormFinalMant =
9597 DAG.getSelect(dl, IntVT, DenormMantOF, Zero, DenormRoundedMant);
9598 SDValue DenormFinalExp = DAG.getSelect(dl, IntVT, DenormMantOF, One, Zero);
9599
9600 // Assemble: sign | (exp << DstMant) | mant
9601 SDValue DenormExpShifted =
9602 DAG.getNode(ISD::SHL, dl, IntVT, DenormFinalExp,
9603 DAG.getShiftAmountConstant(DstMant, IntVT, dl));
9604 DenormResult = DAG.getNode(
9605 ISD::OR, dl, IntVT,
9606 DAG.getNode(ISD::OR, dl, IntVT, SignShifted, DenormExpShifted),
9607 DenormFinalMant);
9608 }
9609
9610 // Exponent overflow detection.
9611 SDValue ExpOF =
9612 DAG.getSetCC(dl, SetCCVT, AdjExp,
9613 DAG.getConstant(DstExpMaxNormal, dl, IntVT), ISD::SETGT);
9614
9615 // Also check if AdjExp == DstExpMaxNormal and mantissa overflow into
9616 // a value that exceeds the max allowed mantissa at that exponent.
9617 SDValue ExpAtMax =
9618 DAG.getSetCC(dl, SetCCVT, AdjExp,
9619 DAG.getConstant(DstExpMaxNormal, dl, IntVT), ISD::SETEQ);
9620 SDValue MantExceedsMax =
9621 DAG.getSetCC(dl, SetCCVT, AdjMant,
9622 DAG.getConstant(DstMaxMantAtMaxExp, dl, IntVT), ISD::SETGT);
9623 SDValue ExpMantOF =
9624 DAG.getNode(ISD::AND, dl, SetCCVT, ExpAtMax, MantExceedsMax);
9625 SDValue IsOverflow = DAG.getNode(ISD::OR, dl, SetCCVT, ExpOF, ExpMantOF);
9626
9627 // Build overflow result.
9629
9630 if (Saturate) {
9631 // Clamp to max finite value:
9632 // sign | (DstExpMaxNormal << DstMant) | DstMaxMantAtMaxExp
9633 uint64_t MaxFinite =
9634 ((uint64_t)DstExpMaxNormal << DstMant) | DstMaxMantAtMaxExp;
9635 OverflowResult = DAG.getNode(ISD::OR, dl, IntVT, SignShifted,
9636 DAG.getConstant(MaxFinite, dl, IntVT));
9637 } else if (DstNFBehavior == fltNonfiniteBehavior::IEEE754) {
9638 // Produce infinity.
9639 uint64_t InfBits = (uint64_t)DstExpMax << DstMant;
9640 OverflowResult = DAG.getNode(ISD::OR, dl, IntVT, SignShifted,
9641 DAG.getConstant(InfBits, dl, IntVT));
9642 } else {
9643 // Emit poison if no Inf in format and not saturating.
9644 OverflowResult = DAG.getPOISON(IntVT);
9645 }
9646
9647 // Assemble normal result: sign | (AdjExp << DstMant) | AdjMant
9648 SDValue NormExpShifted =
9649 DAG.getNode(ISD::SHL, dl, IntVT, AdjExp,
9650 DAG.getShiftAmountConstant(DstMant, IntVT, dl));
9651 SDValue NormResult = DAG.getNode(
9652 ISD::OR, dl, IntVT,
9653 DAG.getNode(ISD::OR, dl, IntVT, SignShifted, NormExpShifted), AdjMant);
9654
9655 // Build special-value results.
9656 SDValue NaNResult;
9657 if (DstNFBehavior == fltNonfiniteBehavior::IEEE754) {
9658 // Produce canonical NaN.
9659 const uint64_t QNaNBit = (DstMant > 0) ? (1ULL << (DstMant - 1)) : 0;
9660 NaNResult =
9661 DAG.getConstant(((uint64_t)DstExpMax << DstMant) | QNaNBit, dl, IntVT);
9662 } else if (DstNFBehavior == fltNonfiniteBehavior::NanOnly &&
9663 DstNanEnc == fltNanEncoding::AllOnes) {
9664 // E4M3FN-style: NaN is exp=all-ones, mant=all-ones.
9665 NaNResult = DAG.getConstant(((uint64_t)DstExpMax << DstMant) | DstMantMask,
9666 dl, IntVT);
9667 } else {
9668 // NaN -> poison for finite only values.
9669 NaNResult = DAG.getPOISON(IntVT);
9670 }
9671
9672 // Inf handling.
9673 SDValue InfResult;
9674 if (DstNFBehavior == fltNonfiniteBehavior::IEEE754) {
9675 // Produce signed infinity.
9676 uint64_t InfBits = (uint64_t)DstExpMax << DstMant;
9677 InfResult = DAG.getNode(ISD::OR, dl, IntVT, SignShifted,
9678 DAG.getConstant(InfBits, dl, IntVT));
9679 } else if (Saturate) {
9680 // Inf saturates to max finite.
9681 uint64_t MaxFinite =
9682 ((uint64_t)DstExpMaxNormal << DstMant) | DstMaxMantAtMaxExp;
9683 InfResult = DAG.getNode(ISD::OR, dl, IntVT, SignShifted,
9684 DAG.getConstant(MaxFinite, dl, IntVT));
9685 } else {
9686 // No Inf and not saturating -> poison.
9687 InfResult = DAG.getPOISON(IntVT);
9688 }
9689
9690 SDValue ZeroResult = SignShifted;
9691
9692 // Final selection in an order: NaN takes priority, then Inf, then Zero.
9693 SDValue FiniteResult =
9694 DAG.getSelect(dl, IntVT, ExpIsNeg, DenormResult, NormResult);
9695 FiniteResult =
9696 DAG.getSelect(dl, IntVT, IsOverflow, OverflowResult, FiniteResult);
9697
9698 SDValue Result = FiniteResult;
9699 Result = DAG.getSelect(dl, IntVT, IsZero, ZeroResult, Result);
9700 Result = DAG.getSelect(dl, IntVT, IsInf, InfResult, Result);
9701
9702 // Negative values are unrepresentable in an unsigned format: clamp to zero
9703 // when saturating, poison otherwise so no select is needed. -0.0 is handled
9704 // by IsZero above. Run before the NaN case so a negative NaN still yields
9705 // NaN.
9706 if (!DstHasSign && Saturate) {
9707 SDValue IsNegative =
9708 DAG.getSetCC(dl, FPSetCCVT, FloatVal, FPZero, ISD::SETOLT);
9709 Result = DAG.getSelect(dl, IntVT, IsNegative, Zero, Result);
9710 }
9711
9712 Result = DAG.getSelect(dl, IntVT, IsNaN, NaNResult, Result);
9713
9714 // Truncate to destination integer type.
9715 return DAG.getZExtOrTrunc(Result, dl, ResVT);
9716}
9717
9718SDValue
9720 SelectionDAG &DAG) const {
9721 SDLoc dl(Node);
9722 EVT DstVT = Node->getValueType(0);
9723 EVT DstScalarVT = DstVT.getScalarType();
9724
9725 SDValue IntVal = Node->getOperand(0);
9726 const uint64_t SemEnum = Node->getConstantOperandVal(1);
9727 const auto Sem = static_cast<APFloatBase::Semantics>(SemEnum);
9728
9729 // Supported source formats.
9730 switch (Sem) {
9737 break;
9738 default:
9739 DAG.getContext()->emitError("CONVERT_FROM_ARBITRARY_FP: not implemented "
9740 "source format (semantics enum " +
9741 Twine(SemEnum) + ")");
9742 return SDValue();
9743 }
9744
9745 const fltSemantics &SrcSem = APFloatBase::EnumToSemantics(Sem);
9746 const unsigned SrcBits = APFloat::getSizeInBits(SrcSem);
9747 const unsigned SrcPrecision = APFloat::semanticsPrecision(SrcSem);
9748 const unsigned SrcMant = SrcPrecision - 1;
9749 // Unsigned formats spend no bit on the sign.
9750 const bool SrcHasSign = APFloat::semanticsHasSignedRepr(SrcSem);
9751 const unsigned SrcExp = SrcBits - (SrcHasSign ? 1 : 0) - SrcMant;
9752 const int SrcBias = 1 - APFloat::semanticsMinExponent(SrcSem);
9753 const fltNonfiniteBehavior NFBehavior = SrcSem.nonFiniteBehavior;
9754
9755 // Destination format parameters.
9756 const fltSemantics &DstSem = DstScalarVT.getFltSemantics();
9757 const unsigned DstBits = APFloat::getSizeInBits(DstSem);
9758 const unsigned DstMant = APFloat::semanticsPrecision(DstSem) - 1;
9759 const unsigned DstExpBits = DstBits - DstMant - 1;
9760 const int DstMinExp = APFloat::semanticsMinExponent(DstSem);
9761 const int DstBias = 1 - DstMinExp;
9762 const uint64_t DstExpAllOnes = (1ULL << DstExpBits) - 1;
9763
9764 // Work in an integer type matching the destination float width.
9765 EVT IntScalarVT = EVT::getIntegerVT(*DAG.getContext(), DstBits);
9766 EVT IntVT = IntScalarVT;
9767 if (DstVT.isVector()) {
9768 IntVT = EVT::getVectorVT(*DAG.getContext(), IntScalarVT,
9769 DstVT.getVectorElementCount());
9770 } else if (!isTypeLegal(IntScalarVT)) {
9771 // Avoid generating illegal type as there is no other places that'll
9772 // legalize it. Vector types don't have this problem because they
9773 // are subject to LegalizeVectorOps and another type legalization phase
9774 // will follow.
9775 if (getTypeAction(*DAG.getContext(), IntScalarVT) != TypePromoteInteger) {
9776 // We only know how to handle situations where the legal type is wider.
9777 DAG.getContext()->emitError(
9778 "CONVERT_FROM_ARBITRARY_FP: the requested integer value type for its "
9779 "legalization is not supported");
9780 return SDValue();
9781 }
9782 IntVT = getTypeToTransformTo(*DAG.getContext(), IntScalarVT);
9783 }
9784
9785 SDValue Src = DAG.getZExtOrTrunc(IntVal, dl, IntVT);
9786
9787 EVT SetCCVT =
9788 getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), IntVT);
9789
9790 SDValue Zero = DAG.getConstant(0, dl, IntVT);
9791 SDValue One = DAG.getConstant(1, dl, IntVT);
9792
9793 // Extract bit fields.
9794 const uint64_t MantMask = (SrcMant > 0) ? ((1ULL << SrcMant) - 1) : 0;
9795 const uint64_t ExpMask = (1ULL << SrcExp) - 1;
9796
9797 SDValue MantField = DAG.getNode(ISD::AND, dl, IntVT, Src,
9798 DAG.getConstant(MantMask, dl, IntVT));
9799
9800 SDValue ExpField =
9801 DAG.getNode(ISD::AND, dl, IntVT,
9802 DAG.getNode(ISD::SRL, dl, IntVT, Src,
9803 DAG.getShiftAmountConstant(SrcMant, IntVT, dl)),
9804 DAG.getConstant(ExpMask, dl, IntVT));
9805
9806 // An unsigned source has no sign bit; bit SrcBits - 1 is part of the
9807 // exponent.
9808 SDValue SignShifted =
9809 SrcHasSign
9810 ? DAG.getNode(
9811 ISD::SHL, dl, IntVT,
9812 DAG.getNode(ISD::SRL, dl, IntVT, Src,
9813 DAG.getShiftAmountConstant(SrcBits - 1, IntVT, dl)),
9814 DAG.getShiftAmountConstant(DstBits - 1, IntVT, dl))
9815 : Zero;
9816
9817 // Classify the input.
9818 SDValue ExpAllOnes = DAG.getConstant(ExpMask, dl, IntVT);
9819 SDValue IsExpAllOnes =
9820 DAG.getSetCC(dl, SetCCVT, ExpField, ExpAllOnes, ISD::SETEQ);
9821 SDValue IsExpZero = DAG.getSetCC(dl, SetCCVT, ExpField, Zero, ISD::SETEQ);
9822 SDValue IsMantZero = DAG.getSetCC(dl, SetCCVT, MantField, Zero, ISD::SETEQ);
9823 SDValue IsMantNonZero =
9824 DAG.getSetCC(dl, SetCCVT, MantField, Zero, ISD::SETNE);
9825
9826 SDValue IsNaN;
9827 if (NFBehavior == fltNonfiniteBehavior::FiniteOnly) {
9828 IsNaN = DAG.getBoolConstant(false, dl, SetCCVT, IntVT);
9829 } else if (NFBehavior == fltNonfiniteBehavior::IEEE754) {
9830 IsNaN = DAG.getNode(ISD::AND, dl, SetCCVT, IsExpAllOnes, IsMantNonZero);
9831 } else {
9833 SDValue MantAllOnes = DAG.getConstant(MantMask, dl, IntVT);
9834 SDValue IsMantAllOnes =
9835 DAG.getSetCC(dl, SetCCVT, MantField, MantAllOnes, ISD::SETEQ);
9836 IsNaN = DAG.getNode(ISD::AND, dl, SetCCVT, IsExpAllOnes, IsMantAllOnes);
9837 }
9838
9839 SDValue IsInf;
9840 if (NFBehavior == fltNonfiniteBehavior::IEEE754)
9841 IsInf = DAG.getNode(ISD::AND, dl, SetCCVT, IsExpAllOnes, IsMantZero);
9842 else
9843 IsInf = DAG.getBoolConstant(false, dl, SetCCVT, IntVT);
9844
9845 SDValue IsZero = DAG.getNode(ISD::AND, dl, SetCCVT, IsExpZero, IsMantZero);
9846 SDValue IsDenorm =
9847 DAG.getNode(ISD::AND, dl, SetCCVT, IsExpZero, IsMantNonZero);
9848
9849 // Normal value conversion.
9850 const int BiasAdjust = DstBias - SrcBias;
9851 SDValue NormDstExp = DAG.getNode(
9852 ISD::ADD, dl, IntVT, ExpField,
9853 DAG.getConstant(APInt(IntVT.getScalarSizeInBits(), BiasAdjust, true), dl,
9854 IntVT));
9855
9856 SDValue NormDstMant;
9857 if (DstMant > SrcMant) {
9858 SDValue NormDstMantShift =
9859 DAG.getShiftAmountConstant(DstMant - SrcMant, IntVT, dl);
9860 NormDstMant = DAG.getNode(ISD::SHL, dl, IntVT, MantField, NormDstMantShift);
9861 } else {
9862 NormDstMant = MantField;
9863 }
9864
9865 SDValue DstMantShift = DAG.getShiftAmountConstant(DstMant, IntVT, dl);
9866 SDValue NormExpShifted =
9867 DAG.getNode(ISD::SHL, dl, IntVT, NormDstExp, DstMantShift);
9868 SDValue NormResult =
9869 DAG.getNode(ISD::OR, dl, IntVT,
9870 DAG.getNode(ISD::OR, dl, IntVT, SignShifted, NormExpShifted),
9871 NormDstMant);
9872
9873 // Denormal value conversion.
9874 SDValue DenormResult;
9875 {
9876 const unsigned IntVTBits = IntVT.getScalarSizeInBits();
9877 SDValue LeadingZeros =
9878 DAG.getNode(ISD::CTLZ_ZERO_POISON, dl, IntVT, MantField);
9879
9880 const int DenormExpConst =
9881 (int)IntVTBits + DstBias - SrcBias - (int)SrcMant;
9882 SDValue DenormDstExp = DAG.getNode(
9883 ISD::SUB, dl, IntVT,
9884 DAG.getConstant(APInt(IntVTBits, DenormExpConst, true), dl, IntVT),
9885 LeadingZeros);
9886
9887 SDValue MantMSB =
9888 DAG.getNode(ISD::SUB, dl, IntVT,
9889 DAG.getConstant(IntVTBits - 1, dl, IntVT), LeadingZeros);
9890
9891 SDValue LeadingOne = DAG.getNode(ISD::SHL, dl, IntVT, One, MantMSB);
9892 SDValue Frac = DAG.getNode(ISD::XOR, dl, IntVT, MantField, LeadingOne);
9893
9894 const unsigned ShiftSub = IntVTBits - 1 - DstMant;
9895 SDValue ShiftAmount = DAG.getNode(ISD::SUB, dl, IntVT, LeadingZeros,
9896 DAG.getConstant(ShiftSub, dl, IntVT));
9897
9898 SDValue DenormDstMant = DAG.getNode(ISD::SHL, dl, IntVT, Frac, ShiftAmount);
9899
9900 SDValue DenormExpShifted =
9901 DAG.getNode(ISD::SHL, dl, IntVT, DenormDstExp, DstMantShift);
9902 DenormResult = DAG.getNode(
9903 ISD::OR, dl, IntVT,
9904 DAG.getNode(ISD::OR, dl, IntVT, SignShifted, DenormExpShifted),
9905 DenormDstMant);
9906 }
9907
9908 SDValue FiniteResult =
9909 DAG.getSelect(dl, IntVT, IsDenorm, DenormResult, NormResult);
9910
9911 const uint64_t QNaNBit = (DstMant > 0) ? (1ULL << (DstMant - 1)) : 0;
9912 SDValue NaNResult =
9913 DAG.getConstant((DstExpAllOnes << DstMant) | QNaNBit, dl, IntVT);
9914
9915 SDValue InfResult =
9916 DAG.getNode(ISD::OR, dl, IntVT, SignShifted,
9917 DAG.getConstant(DstExpAllOnes << DstMant, dl, IntVT));
9918
9919 SDValue ZeroResult = SignShifted;
9920
9921 SDValue Result = FiniteResult;
9922 Result = DAG.getSelect(dl, IntVT, IsZero, ZeroResult, Result);
9923 Result = DAG.getSelect(dl, IntVT, IsInf, InfResult, Result);
9924 Result = DAG.getSelect(dl, IntVT, IsNaN, NaNResult, Result);
9925
9926 if (!DstVT.bitsEq(IntVT)) {
9927 // Store to stack before loading it back.
9928 assert(!IntVT.isVector() && IntVT.bitsGT(DstVT));
9929 // IntScalarVT is the original type that has the same width as DstVT.
9930 Align Alignment = DAG.getReducedAlign(IntScalarVT, /*UseABI=*/false);
9931 SDValue StackPtr =
9932 DAG.CreateStackTemporary(IntScalarVT.getStoreSize(), Alignment);
9933 auto FrameIndex = cast<FrameIndexSDNode>(StackPtr.getNode())->getIndex();
9935 MachinePointerInfo PtrInfo =
9936 MachinePointerInfo::getFixedStack(MF, FrameIndex);
9937 SDValue Store = DAG.getTruncStore(DAG.getEntryNode(), dl, Result, StackPtr,
9938 PtrInfo, IntScalarVT, Alignment);
9939
9940 SDValue Load = DAG.getLoad(DstVT, dl, Store, StackPtr, PtrInfo, Alignment);
9941 return DAG.getMergeValues({Load, Load.getValue(1)}, dl);
9942 }
9943
9944 return DAG.getNode(ISD::BITCAST, dl, DstVT, Result);
9945}
9946
9948 SelectionDAG &DAG) const {
9949 unsigned OpNo = Node->isStrictFPOpcode() ? 1 : 0;
9950 SDValue Src = Node->getOperand(OpNo);
9951 EVT SrcVT = Src.getValueType();
9952 EVT DstVT = Node->getValueType(0);
9953 SDLoc dl(SDValue(Node, 0));
9954
9955 // FIXME: Only f32 to i64 conversions are supported.
9956 if (SrcVT != MVT::f32 || DstVT != MVT::i64)
9957 return false;
9958
9959 if (Node->isStrictFPOpcode())
9960 // When a NaN is converted to an integer a trap is allowed. We can't
9961 // use this expansion here because it would eliminate that trap. Other
9962 // traps are also allowed and cannot be eliminated. See
9963 // IEEE 754-2008 sec 5.8.
9964 return false;
9965
9966 // Expand f32 -> i64 conversion
9967 // This algorithm comes from compiler-rt's implementation of fixsfdi:
9968 // https://github.com/llvm/llvm-project/blob/main/compiler-rt/lib/builtins/fixsfdi.c
9969 unsigned SrcEltBits = SrcVT.getScalarSizeInBits();
9970 EVT IntVT = SrcVT.changeTypeToInteger();
9971 EVT IntShVT = getShiftAmountTy(IntVT, DAG.getDataLayout());
9972
9973 SDValue ExponentMask = DAG.getConstant(0x7F800000, dl, IntVT);
9974 SDValue ExponentLoBit = DAG.getConstant(23, dl, IntVT);
9975 SDValue Bias = DAG.getConstant(127, dl, IntVT);
9976 SDValue SignMask = DAG.getConstant(APInt::getSignMask(SrcEltBits), dl, IntVT);
9977 SDValue SignLowBit = DAG.getConstant(SrcEltBits - 1, dl, IntVT);
9978 SDValue MantissaMask = DAG.getConstant(0x007FFFFF, dl, IntVT);
9979
9980 SDValue Bits = DAG.getNode(ISD::BITCAST, dl, IntVT, Src);
9981
9982 SDValue ExponentBits = DAG.getNode(
9983 ISD::SRL, dl, IntVT, DAG.getNode(ISD::AND, dl, IntVT, Bits, ExponentMask),
9984 DAG.getZExtOrTrunc(ExponentLoBit, dl, IntShVT));
9985 SDValue Exponent = DAG.getNode(ISD::SUB, dl, IntVT, ExponentBits, Bias);
9986
9987 SDValue Sign = DAG.getNode(ISD::SRA, dl, IntVT,
9988 DAG.getNode(ISD::AND, dl, IntVT, Bits, SignMask),
9989 DAG.getZExtOrTrunc(SignLowBit, dl, IntShVT));
9990 Sign = DAG.getSExtOrTrunc(Sign, dl, DstVT);
9991
9992 SDValue R = DAG.getNode(ISD::OR, dl, IntVT,
9993 DAG.getNode(ISD::AND, dl, IntVT, Bits, MantissaMask),
9994 DAG.getConstant(0x00800000, dl, IntVT));
9995
9996 R = DAG.getZExtOrTrunc(R, dl, DstVT);
9997
9998 R = DAG.getSelectCC(
9999 dl, Exponent, ExponentLoBit,
10000 DAG.getNode(ISD::SHL, dl, DstVT, R,
10001 DAG.getZExtOrTrunc(
10002 DAG.getNode(ISD::SUB, dl, IntVT, Exponent, ExponentLoBit),
10003 dl, IntShVT)),
10004 DAG.getNode(ISD::SRL, dl, DstVT, R,
10005 DAG.getZExtOrTrunc(
10006 DAG.getNode(ISD::SUB, dl, IntVT, ExponentLoBit, Exponent),
10007 dl, IntShVT)),
10008 ISD::SETGT);
10009
10010 SDValue Ret = DAG.getNode(ISD::SUB, dl, DstVT,
10011 DAG.getNode(ISD::XOR, dl, DstVT, R, Sign), Sign);
10012
10013 Result = DAG.getSelectCC(dl, Exponent, DAG.getConstant(0, dl, IntVT),
10014 DAG.getConstant(0, dl, DstVT), Ret, ISD::SETLT);
10015 return true;
10016}
10017
10019 SDValue &Chain,
10020 SelectionDAG &DAG) const {
10021 SDLoc dl(SDValue(Node, 0));
10022 unsigned OpNo = Node->isStrictFPOpcode() ? 1 : 0;
10023 SDValue Src = Node->getOperand(OpNo);
10024
10025 EVT SrcVT = Src.getValueType();
10026 EVT DstVT = Node->getValueType(0);
10027 EVT SetCCVT =
10028 getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), SrcVT);
10029 EVT DstSetCCVT =
10030 getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), DstVT);
10031
10032 // Only expand vector types if we have the appropriate vector bit operations.
10033 unsigned SIntOpcode = Node->isStrictFPOpcode() ? ISD::STRICT_FP_TO_SINT :
10035 if (DstVT.isVector() && (!isOperationLegalOrCustom(SIntOpcode, DstVT) ||
10037 return false;
10038
10039 // If the maximum float value is smaller then the signed integer range,
10040 // the destination signmask can't be represented by the float, so we can
10041 // just use FP_TO_SINT directly.
10042 const fltSemantics &APFSem = SrcVT.getFltSemantics();
10043 APFloat APF(APFSem, APInt::getZero(SrcVT.getScalarSizeInBits()));
10044 APInt SignMask = APInt::getSignMask(DstVT.getScalarSizeInBits());
10046 APF.convertFromAPInt(SignMask, false, APFloat::rmNearestTiesToEven)) {
10047 if (Node->isStrictFPOpcode()) {
10048 Result = DAG.getNode(ISD::STRICT_FP_TO_SINT, dl, { DstVT, MVT::Other },
10049 { Node->getOperand(0), Src });
10050 Chain = Result.getValue(1);
10051 } else
10052 Result = DAG.getNode(ISD::FP_TO_SINT, dl, DstVT, Src);
10053 return true;
10054 }
10055
10056 // Don't expand it if there isn't cheap fsub instruction.
10058 Node->isStrictFPOpcode() ? ISD::STRICT_FSUB : ISD::FSUB, SrcVT))
10059 return false;
10060
10061 SDValue Cst = DAG.getConstantFP(APF, dl, SrcVT);
10062 SDValue Sel;
10063
10064 if (Node->isStrictFPOpcode()) {
10065 Sel = DAG.getSetCC(dl, SetCCVT, Src, Cst, ISD::SETLT,
10066 Node->getOperand(0), /*IsSignaling*/ true);
10067 Chain = Sel.getValue(1);
10068 } else {
10069 Sel = DAG.getSetCC(dl, SetCCVT, Src, Cst, ISD::SETLT);
10070 }
10071
10072 bool Strict = Node->isStrictFPOpcode() ||
10073 shouldUseStrictFP_TO_INT(SrcVT, DstVT, /*IsSigned*/ false);
10074
10075 if (Strict) {
10076 // Expand based on maximum range of FP_TO_SINT, if the value exceeds the
10077 // signmask then offset (the result of which should be fully representable).
10078 // Sel = Src < 0x8000000000000000
10079 // FltOfs = select Sel, 0, 0x8000000000000000
10080 // IntOfs = select Sel, 0, 0x8000000000000000
10081 // Result = fp_to_sint(Src - FltOfs) ^ IntOfs
10082
10083 // TODO: Should any fast-math-flags be set for the FSUB?
10084 SDValue FltOfs = DAG.getSelect(dl, SrcVT, Sel,
10085 DAG.getConstantFP(0.0, dl, SrcVT), Cst);
10086 Sel = DAG.getBoolExtOrTrunc(Sel, dl, DstSetCCVT, DstVT);
10087 SDValue IntOfs = DAG.getSelect(dl, DstVT, Sel,
10088 DAG.getConstant(0, dl, DstVT),
10089 DAG.getConstant(SignMask, dl, DstVT));
10090 SDValue SInt;
10091 if (Node->isStrictFPOpcode()) {
10092 SDValue Val = DAG.getNode(ISD::STRICT_FSUB, dl, { SrcVT, MVT::Other },
10093 { Chain, Src, FltOfs });
10094 SInt = DAG.getNode(ISD::STRICT_FP_TO_SINT, dl, { DstVT, MVT::Other },
10095 { Val.getValue(1), Val });
10096 Chain = SInt.getValue(1);
10097 } else {
10098 SDValue Val = DAG.getNode(ISD::FSUB, dl, SrcVT, Src, FltOfs);
10099 SInt = DAG.getNode(ISD::FP_TO_SINT, dl, DstVT, Val);
10100 }
10101 Result = DAG.getNode(ISD::XOR, dl, DstVT, SInt, IntOfs);
10102 } else {
10103 // Expand based on maximum range of FP_TO_SINT:
10104 // True = fp_to_sint(Src)
10105 // False = 0x8000000000000000 + fp_to_sint(Src - 0x8000000000000000)
10106 // Result = select (Src < 0x8000000000000000), True, False
10107
10108 SDValue True = DAG.getNode(ISD::FP_TO_SINT, dl, DstVT, Src);
10109 // TODO: Should any fast-math-flags be set for the FSUB?
10110 SDValue False = DAG.getNode(ISD::FP_TO_SINT, dl, DstVT,
10111 DAG.getNode(ISD::FSUB, dl, SrcVT, Src, Cst));
10112 False = DAG.getNode(ISD::XOR, dl, DstVT, False,
10113 DAG.getConstant(SignMask, dl, DstVT));
10114 Sel = DAG.getBoolExtOrTrunc(Sel, dl, DstSetCCVT, DstVT);
10115 Result = DAG.getSelect(dl, DstVT, Sel, True, False);
10116 }
10117 return true;
10118}
10119
10121 SDValue &Chain, SelectionDAG &DAG) const {
10122 // This transform is not correct for converting 0 when rounding mode is set
10123 // to round toward negative infinity which will produce -0.0. So disable
10124 // under strictfp.
10125 if (Node->isStrictFPOpcode())
10126 return false;
10127
10128 SDValue Src = Node->getOperand(0);
10129 EVT SrcVT = Src.getValueType();
10130 EVT DstVT = Node->getValueType(0);
10131
10132 // If the input is known to be non-negative and SINT_TO_FP is legal then use
10133 // it.
10134 if (Node->getFlags().hasNonNeg() &&
10136 Result =
10137 DAG.getNode(ISD::SINT_TO_FP, SDLoc(Node), DstVT, Node->getOperand(0));
10138 return true;
10139 }
10140
10141 if (SrcVT.getScalarType() != MVT::i64 || DstVT.getScalarType() != MVT::f64)
10142 return false;
10143
10144 // Only expand vector types if we have the appropriate vector bit
10145 // operations.
10146 if (SrcVT.isVector() && (!isOperationLegalOrCustom(ISD::SRL, SrcVT) ||
10151 return false;
10152
10153 SDLoc dl(SDValue(Node, 0));
10154
10155 // Implementation of unsigned i64 to f64 following the algorithm in
10156 // __floatundidf in compiler_rt. This implementation performs rounding
10157 // correctly in all rounding modes with the exception of converting 0
10158 // when rounding toward negative infinity. In that case the fsub will
10159 // produce -0.0. This will be added to +0.0 and produce -0.0 which is
10160 // incorrect.
10161 SDValue TwoP52 = DAG.getConstant(UINT64_C(0x4330000000000000), dl, SrcVT);
10162 SDValue TwoP84PlusTwoP52 = DAG.getConstantFP(
10163 llvm::bit_cast<double>(UINT64_C(0x4530000000100000)), dl, DstVT);
10164 SDValue TwoP84 = DAG.getConstant(UINT64_C(0x4530000000000000), dl, SrcVT);
10165 SDValue LoMask = DAG.getConstant(UINT64_C(0x00000000FFFFFFFF), dl, SrcVT);
10166 SDValue HiShift = DAG.getShiftAmountConstant(32, SrcVT, dl);
10167
10168 SDValue Lo = DAG.getNode(ISD::AND, dl, SrcVT, Src, LoMask);
10169 SDValue Hi = DAG.getNode(ISD::SRL, dl, SrcVT, Src, HiShift);
10170 SDValue LoOr = DAG.getNode(ISD::OR, dl, SrcVT, Lo, TwoP52);
10171 SDValue HiOr = DAG.getNode(ISD::OR, dl, SrcVT, Hi, TwoP84);
10172 SDValue LoFlt = DAG.getBitcast(DstVT, LoOr);
10173 SDValue HiFlt = DAG.getBitcast(DstVT, HiOr);
10174 SDValue HiSub = DAG.getNode(ISD::FSUB, dl, DstVT, HiFlt, TwoP84PlusTwoP52);
10175 Result = DAG.getNode(ISD::FADD, dl, DstVT, LoFlt, HiSub);
10176 return true;
10177}
10178
10179SDValue
10181 SelectionDAG &DAG) const {
10182 unsigned Opcode = Node->getOpcode();
10183 assert((Opcode == ISD::FMINNUM || Opcode == ISD::FMAXNUM ||
10184 Opcode == ISD::STRICT_FMINNUM || Opcode == ISD::STRICT_FMAXNUM) &&
10185 "Wrong opcode");
10186
10187 if (Node->getFlags().hasNoNaNs()) {
10188 ISD::CondCode Pred = Opcode == ISD::FMINNUM ? ISD::SETLT : ISD::SETGT;
10189 EVT VT = Node->getValueType(0);
10190 if ((!isCondCodeLegal(Pred, VT.getSimpleVT()) ||
10192 VT.isVector())
10193 return SDValue();
10194 SDValue Op1 = Node->getOperand(0);
10195 SDValue Op2 = Node->getOperand(1);
10196 return DAG.getSelectCC(SDLoc(Node), Op1, Op2, Op1, Op2, Pred,
10197 Node->getFlags());
10198 }
10199
10200 return SDValue();
10201}
10202
10204 SelectionDAG &DAG) const {
10205 if (SDValue Expanded = expandVectorNaryOpBySplitting(Node, DAG))
10206 return Expanded;
10207
10208 EVT VT = Node->getValueType(0);
10209 if (VT.isScalableVector())
10211 "Expanding fminnum/fmaxnum for scalable vectors is undefined.");
10212
10213 SDLoc dl(Node);
10214 unsigned NewOp =
10216
10217 if (isOperationLegalOrCustom(NewOp, VT)) {
10218 SDValue Quiet0 = Node->getOperand(0);
10219 SDValue Quiet1 = Node->getOperand(1);
10220
10221 if (!Node->getFlags().hasNoNaNs()) {
10222 // Insert canonicalizes if it's possible we need to quiet to get correct
10223 // sNaN behavior.
10224 if (!DAG.isKnownNeverSNaN(Quiet0)) {
10225 Quiet0 = DAG.getNode(ISD::FCANONICALIZE, dl, VT, Quiet0,
10226 Node->getFlags());
10227 }
10228 if (!DAG.isKnownNeverSNaN(Quiet1)) {
10229 Quiet1 = DAG.getNode(ISD::FCANONICALIZE, dl, VT, Quiet1,
10230 Node->getFlags());
10231 }
10232 }
10233
10234 return DAG.getNode(NewOp, dl, VT, Quiet0, Quiet1, Node->getFlags());
10235 }
10236
10237 // If the target has FMINIMUM/FMAXIMUM but not FMINNUM/FMAXNUM use that
10238 // instead if there are no NaNs.
10239 if (Node->getFlags().hasNoNaNs() ||
10240 (DAG.isKnownNeverNaN(Node->getOperand(0)) &&
10241 DAG.isKnownNeverNaN(Node->getOperand(1)))) {
10242 unsigned IEEE2018Op =
10243 Node->getOpcode() == ISD::FMINNUM ? ISD::FMINIMUM : ISD::FMAXIMUM;
10244 if (isOperationLegalOrCustom(IEEE2018Op, VT))
10245 return DAG.getNode(IEEE2018Op, dl, VT, Node->getOperand(0),
10246 Node->getOperand(1), Node->getFlags());
10247 }
10248
10250 return SelCC;
10251
10252 return SDValue();
10253}
10254
10256 const TargetLowering &TLI,
10257 const SDLoc &DL, SDValue Val,
10258 FPClassTest FPClass) {
10259 EVT VT = Val.getValueType();
10260 EVT CCVT = TLI.getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
10261 EVT IntVT = VT.changeTypeToInteger();
10262 EVT FloatVT = VT.changeElementType(*DAG.getContext(), MVT::f32);
10263 SDValue TestZero = DAG.getTargetConstant(FPClass, DL, MVT::i32);
10264 if (!TLI.isTypeLegal(IntVT) &&
10266 Val = DAG.getNode(ISD::FP_ROUND, DL, FloatVT, Val,
10267 DAG.getIntPtrConstant(0, DL, /*isTarget=*/true));
10268 return DAG.getNode(ISD::IS_FPCLASS, DL, CCVT, Val, TestZero);
10269}
10270
10272 SelectionDAG &DAG) const {
10273 if (SDValue Expanded = expandVectorNaryOpBySplitting(N, DAG))
10274 return Expanded;
10275
10276 SDLoc DL(N);
10277 SDValue LHS = N->getOperand(0);
10278 SDValue RHS = N->getOperand(1);
10279 unsigned Opc = N->getOpcode();
10280 EVT VT = N->getValueType(0);
10281 EVT CCVT = getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
10282 bool IsMax = Opc == ISD::FMAXIMUM;
10283 SDNodeFlags Flags = N->getFlags();
10284
10285 // First, implement comparison not propagating NaN. If no native fmin or fmax
10286 // available, use plain select with setcc instead.
10288 unsigned CompOpcIeee = IsMax ? ISD::FMAXNUM_IEEE : ISD::FMINNUM_IEEE;
10289 unsigned CompOpc = IsMax ? ISD::FMAXNUM : ISD::FMINNUM;
10290
10291 // FIXME: We should probably define fminnum/fmaxnum variants with correct
10292 // signed zero behavior.
10293 bool MinMaxMustRespectOrderedZero = false;
10294
10295 if (isOperationLegalOrCustom(CompOpcIeee, VT)) {
10296 MinMax = DAG.getNode(CompOpcIeee, DL, VT, LHS, RHS, Flags);
10297 MinMaxMustRespectOrderedZero = true;
10298 } else if (isOperationLegalOrCustom(CompOpc, VT)) {
10299 MinMax = DAG.getNode(CompOpc, DL, VT, LHS, RHS, Flags);
10300 } else {
10302 return DAG.UnrollVectorOp(N);
10303
10304 // NaN (if exists) will be propagated later, so orderness doesn't matter.
10305 SDValue Compare =
10306 DAG.getSetCC(DL, CCVT, LHS, RHS, IsMax ? ISD::SETOGT : ISD::SETOLT);
10307 MinMax = DAG.getSelect(DL, VT, Compare, LHS, RHS, Flags);
10308 }
10309
10310 // Propagate any NaN of both operands
10311 if (!N->getFlags().hasNoNaNs() &&
10312 (!DAG.isKnownNeverNaN(RHS) || !DAG.isKnownNeverNaN(LHS))) {
10313 ConstantFP *FPNaN = ConstantFP::get(*DAG.getContext(),
10315 MinMax = DAG.getSelect(DL, VT, DAG.getSetCC(DL, CCVT, LHS, RHS, ISD::SETUO),
10316 DAG.getConstantFP(*FPNaN, DL, VT), MinMax, Flags);
10317 }
10318
10319 // fminimum/fmaximum requires -0.0 less than +0.0
10320 if (!MinMaxMustRespectOrderedZero && !N->getFlags().hasNoSignedZeros() &&
10321 !DAG.isKnownNeverLogicalZero(RHS) && !DAG.isKnownNeverLogicalZero(LHS)) {
10322 SDValue IsEqual = DAG.getSetCC(DL, CCVT, LHS, RHS, ISD::SETOEQ);
10324 DAG, *this, DL, LHS, IsMax ? fcPosZero : fcNegZero);
10325 SDValue RetZero = DAG.getSelect(DL, VT, IsSpecificZero, LHS, RHS, Flags);
10326 MinMax = DAG.getSelect(DL, VT, IsEqual, RetZero, MinMax, Flags);
10327 }
10328
10329 return MinMax;
10330}
10331
10333 SelectionDAG &DAG) const {
10334 SDLoc DL(Node);
10335 SDValue LHS = Node->getOperand(0);
10336 SDValue RHS = Node->getOperand(1);
10337 unsigned Opc = Node->getOpcode();
10338 EVT VT = Node->getValueType(0);
10339 EVT CCVT = getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
10340 bool IsMax = Opc == ISD::FMAXIMUMNUM;
10341 SDNodeFlags Flags = Node->getFlags();
10342
10343 unsigned NewOp =
10345
10346 if (isOperationLegalOrCustom(NewOp, VT)) {
10347 if (!Flags.hasNoNaNs()) {
10348 // Insert canonicalizes if it's possible we need to quiet to get correct
10349 // sNaN behavior.
10350 if (!DAG.isKnownNeverSNaN(LHS)) {
10351 LHS = DAG.getNode(ISD::FCANONICALIZE, DL, VT, LHS, Flags);
10352 }
10353 if (!DAG.isKnownNeverSNaN(RHS)) {
10354 RHS = DAG.getNode(ISD::FCANONICALIZE, DL, VT, RHS, Flags);
10355 }
10356 }
10357
10358 return DAG.getNode(NewOp, DL, VT, LHS, RHS, Flags);
10359 }
10360
10361 // We can use FMINIMUM/FMAXIMUM if there is no NaN, since it has
10362 // same behaviors for all of other cases: +0.0 vs -0.0 included.
10363 if (Flags.hasNoNaNs() ||
10364 (DAG.isKnownNeverNaN(LHS) && DAG.isKnownNeverNaN(RHS))) {
10365 unsigned IEEE2019Op =
10367 if (isOperationLegalOrCustom(IEEE2019Op, VT))
10368 return DAG.getNode(IEEE2019Op, DL, VT, LHS, RHS, Flags);
10369 }
10370
10371 // FMINNUM/FMAXMUM returns qNaN if either operand is sNaN, and it may return
10372 // either one for +0.0 vs -0.0.
10373 if ((Flags.hasNoNaNs() ||
10374 (DAG.isKnownNeverSNaN(LHS) && DAG.isKnownNeverSNaN(RHS))) &&
10375 (Flags.hasNoSignedZeros() || DAG.isKnownNeverLogicalZero(LHS) ||
10376 DAG.isKnownNeverLogicalZero(RHS))) {
10377 unsigned IEEE2008Op = Opc == ISD::FMINIMUMNUM ? ISD::FMINNUM : ISD::FMAXNUM;
10378 if (isOperationLegalOrCustom(IEEE2008Op, VT))
10379 return DAG.getNode(IEEE2008Op, DL, VT, LHS, RHS, Flags);
10380 }
10381
10382 if (VT.isVector() &&
10385 return DAG.UnrollVectorOp(Node);
10386
10387 // If only one operand is NaN, override it with another operand.
10388 if (!Flags.hasNoNaNs() && !DAG.isKnownNeverNaN(LHS)) {
10389 LHS = DAG.getSelectCC(DL, LHS, LHS, RHS, LHS, ISD::SETUO);
10390 }
10391 if (!Flags.hasNoNaNs() && !DAG.isKnownNeverNaN(RHS)) {
10392 RHS = DAG.getSelectCC(DL, RHS, RHS, LHS, RHS, ISD::SETUO);
10393 }
10394
10395 // Always prefer RHS if equal.
10396 SDValue MinMax =
10397 DAG.getSelectCC(DL, LHS, RHS, LHS, RHS, IsMax ? ISD::SETGT : ISD::SETLT);
10398
10399 // TODO: We need quiet sNaN if strictfp.
10400
10401 // Fixup signed zero behavior.
10402 if (Flags.hasNoSignedZeros() || DAG.isKnownNeverLogicalZero(LHS) ||
10403 DAG.isKnownNeverLogicalZero(RHS)) {
10404 return MinMax;
10405 }
10406 SDValue IsZero = DAG.getSetCC(DL, CCVT, MinMax,
10407 DAG.getConstantFP(0.0, DL, VT), ISD::SETEQ);
10409 DAG, *this, DL, LHS, IsMax ? fcPosZero : fcNegZero);
10410 // It's OK to select from LHS and MinMax, with only one ISD::IS_FPCLASS, as
10411 // we preferred RHS when generate MinMax, if the operands are equal.
10412 SDValue RetZero = DAG.getSelect(DL, VT, IsSpecificZero, LHS, MinMax, Flags);
10413 return DAG.getSelect(DL, VT, IsZero, RetZero, MinMax, Flags);
10414}
10415
10416/// Returns a true value if if this FPClassTest can be performed with an ordered
10417/// fcmp to 0, and a false value if it's an unordered fcmp to 0. Returns
10418/// std::nullopt if it cannot be performed as a compare with 0.
10419static std::optional<bool> isFCmpEqualZero(FPClassTest Test,
10420 const fltSemantics &Semantics,
10421 const MachineFunction &MF) {
10422 FPClassTest OrderedMask = Test & ~fcNan;
10423 FPClassTest NanTest = Test & fcNan;
10424 bool IsOrdered = NanTest == fcNone;
10425 bool IsUnordered = NanTest == fcNan;
10426
10427 // Skip cases that are testing for only a qnan or snan.
10428 if (!IsOrdered && !IsUnordered)
10429 return std::nullopt;
10430
10431 if (OrderedMask == fcZero &&
10432 MF.getDenormalMode(Semantics).Input == DenormalMode::IEEE)
10433 return IsOrdered;
10434 if (OrderedMask == (fcZero | fcSubnormal) &&
10435 MF.getDenormalMode(Semantics).inputsAreZero())
10436 return IsOrdered;
10437 return std::nullopt;
10438}
10439
10441 const FPClassTest OrigTestMask,
10442 SDNodeFlags Flags, const SDLoc &DL,
10443 SelectionDAG &DAG) const {
10444 EVT OperandVT = Op.getValueType();
10445 assert(OperandVT.isFloatingPoint());
10446 FPClassTest Test = OrigTestMask;
10447
10448 // Degenerated cases.
10449 if (Test == fcNone)
10450 return DAG.getBoolConstant(false, DL, ResultVT, OperandVT);
10451 if (Test == fcAllFlags)
10452 return DAG.getBoolConstant(true, DL, ResultVT, OperandVT);
10453
10454 // PPC double double is a pair of doubles, of which the higher part determines
10455 // the value class.
10456 if (OperandVT == MVT::ppcf128) {
10457 Op = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::f64, Op,
10458 DAG.getConstant(1, DL, MVT::i32));
10459 OperandVT = MVT::f64;
10460 }
10461
10462 // Floating-point type properties.
10463 EVT ScalarFloatVT = OperandVT.getScalarType();
10464 const Type *FloatTy = ScalarFloatVT.getTypeForEVT(*DAG.getContext());
10465 const llvm::fltSemantics &Semantics = FloatTy->getFltSemantics();
10466 bool IsF80 = (ScalarFloatVT == MVT::f80);
10467
10468 // Some checks can be implemented using float comparisons, if floating point
10469 // exceptions are ignored.
10470 if (Flags.hasNoFPExcept() &&
10472 FPClassTest FPTestMask = Test;
10473 bool IsInvertedFP = false;
10474
10475 if (FPClassTest InvertedFPCheck =
10476 invertFPClassTestIfSimpler(FPTestMask, true)) {
10477 FPTestMask = InvertedFPCheck;
10478 IsInvertedFP = true;
10479 }
10480
10481 ISD::CondCode OrderedCmpOpcode = IsInvertedFP ? ISD::SETUNE : ISD::SETOEQ;
10482 ISD::CondCode UnorderedCmpOpcode = IsInvertedFP ? ISD::SETONE : ISD::SETUEQ;
10483
10484 // See if we can fold an | fcNan into an unordered compare.
10485 FPClassTest OrderedFPTestMask = FPTestMask & ~fcNan;
10486
10487 // Can't fold the ordered check if we're only testing for snan or qnan
10488 // individually.
10489 if ((FPTestMask & fcNan) != fcNan)
10490 OrderedFPTestMask = FPTestMask;
10491
10492 const bool IsOrdered = FPTestMask == OrderedFPTestMask;
10493
10494 if (std::optional<bool> IsCmp0 =
10495 isFCmpEqualZero(FPTestMask, Semantics, DAG.getMachineFunction());
10496 IsCmp0 && (isCondCodeLegalOrCustom(
10497 *IsCmp0 ? OrderedCmpOpcode : UnorderedCmpOpcode,
10498 OperandVT.getScalarType().getSimpleVT()))) {
10499
10500 // If denormals could be implicitly treated as 0, this is not equivalent
10501 // to a compare with 0 since it will also be true for denormals.
10502 return DAG.getSetCC(DL, ResultVT, Op,
10503 DAG.getConstantFP(0.0, DL, OperandVT),
10504 *IsCmp0 ? OrderedCmpOpcode : UnorderedCmpOpcode);
10505 }
10506
10507 if (FPTestMask == fcNan &&
10509 OperandVT.getScalarType().getSimpleVT()))
10510 return DAG.getSetCC(DL, ResultVT, Op, Op,
10511 IsInvertedFP ? ISD::SETO : ISD::SETUO);
10512
10513 bool IsOrderedInf = FPTestMask == fcInf;
10514 if ((FPTestMask == fcInf || FPTestMask == (fcInf | fcNan)) &&
10515 isCondCodeLegalOrCustom(IsOrderedInf ? OrderedCmpOpcode
10516 : UnorderedCmpOpcode,
10517 OperandVT.getScalarType().getSimpleVT()) &&
10520 (OperandVT.isVector() &&
10522 // isinf(x) --> fabs(x) == inf
10523 SDValue Abs = DAG.getNode(ISD::FABS, DL, OperandVT, Op);
10524 SDValue Inf =
10525 DAG.getConstantFP(APFloat::getInf(Semantics), DL, OperandVT);
10526 return DAG.getSetCC(DL, ResultVT, Abs, Inf,
10527 IsOrderedInf ? OrderedCmpOpcode : UnorderedCmpOpcode);
10528 }
10529
10530 if ((OrderedFPTestMask == fcPosInf || OrderedFPTestMask == fcNegInf) &&
10531 isCondCodeLegalOrCustom(IsOrdered ? OrderedCmpOpcode
10532 : UnorderedCmpOpcode,
10533 OperandVT.getSimpleVT())) {
10534 // isposinf(x) --> x == inf
10535 // isneginf(x) --> x == -inf
10536 // isposinf(x) || nan --> x u== inf
10537 // isneginf(x) || nan --> x u== -inf
10538
10539 SDValue Inf = DAG.getConstantFP(
10540 APFloat::getInf(Semantics, OrderedFPTestMask == fcNegInf), DL,
10541 OperandVT);
10542 return DAG.getSetCC(DL, ResultVT, Op, Inf,
10543 IsOrdered ? OrderedCmpOpcode : UnorderedCmpOpcode);
10544 }
10545
10546 if (OrderedFPTestMask == (fcSubnormal | fcZero) && !IsOrdered) {
10547 // TODO: Could handle ordered case, but it produces worse code for
10548 // x86. Maybe handle ordered if fabs is free?
10549
10550 ISD::CondCode OrderedOp = IsInvertedFP ? ISD::SETUGE : ISD::SETOLT;
10551 ISD::CondCode UnorderedOp = IsInvertedFP ? ISD::SETOGE : ISD::SETULT;
10552
10553 if (isCondCodeLegalOrCustom(IsOrdered ? OrderedOp : UnorderedOp,
10554 OperandVT.getScalarType().getSimpleVT())) {
10555 // (issubnormal(x) || iszero(x)) --> fabs(x) < smallest_normal
10556
10557 // TODO: Maybe only makes sense if fabs is free. Integer test of
10558 // exponent bits seems better for x86.
10559 SDValue Abs = DAG.getNode(ISD::FABS, DL, OperandVT, Op);
10560 SDValue SmallestNormal = DAG.getConstantFP(
10561 APFloat::getSmallestNormalized(Semantics), DL, OperandVT);
10562 return DAG.getSetCC(DL, ResultVT, Abs, SmallestNormal,
10563 IsOrdered ? OrderedOp : UnorderedOp);
10564 }
10565 }
10566
10567 if (FPTestMask == fcNormal) {
10568 // TODO: Handle unordered
10569 ISD::CondCode IsFiniteOp = IsInvertedFP ? ISD::SETUGE : ISD::SETOLT;
10570 ISD::CondCode IsNormalOp = IsInvertedFP ? ISD::SETOLT : ISD::SETUGE;
10571
10572 if (isCondCodeLegalOrCustom(IsFiniteOp,
10573 OperandVT.getScalarType().getSimpleVT()) &&
10574 isCondCodeLegalOrCustom(IsNormalOp,
10575 OperandVT.getScalarType().getSimpleVT()) &&
10576 isFAbsFree(OperandVT)) {
10577 // isnormal(x) --> fabs(x) < infinity && !(fabs(x) < smallest_normal)
10578 SDValue Inf =
10579 DAG.getConstantFP(APFloat::getInf(Semantics), DL, OperandVT);
10580 SDValue SmallestNormal = DAG.getConstantFP(
10581 APFloat::getSmallestNormalized(Semantics), DL, OperandVT);
10582
10583 SDValue Abs = DAG.getNode(ISD::FABS, DL, OperandVT, Op);
10584 SDValue IsFinite = DAG.getSetCC(DL, ResultVT, Abs, Inf, IsFiniteOp);
10585 SDValue IsNormal =
10586 DAG.getSetCC(DL, ResultVT, Abs, SmallestNormal, IsNormalOp);
10587 unsigned LogicOp = IsInvertedFP ? ISD::OR : ISD::AND;
10588 return DAG.getNode(LogicOp, DL, ResultVT, IsFinite, IsNormal);
10589 }
10590 }
10591 }
10592
10593 // Some checks may be represented as inversion of simpler check, for example
10594 // "inf|normal|subnormal|zero" => !"nan".
10595 bool IsInverted = false;
10596
10597 if (FPClassTest InvertedCheck = invertFPClassTestIfSimpler(Test, false)) {
10598 Test = InvertedCheck;
10599 IsInverted = true;
10600 }
10601
10602 // In the general case use integer operations.
10603 unsigned BitSize = OperandVT.getScalarSizeInBits();
10604 EVT IntVT = OperandVT.changeElementType(
10605 *DAG.getContext(), EVT::getIntegerVT(*DAG.getContext(), BitSize));
10606 SDValue OpAsInt = DAG.getBitcast(IntVT, Op);
10607
10608 // Various masks.
10609 APInt SignBit = APInt::getSignMask(BitSize);
10610 APInt ValueMask = APInt::getSignedMaxValue(BitSize); // All bits but sign.
10611 APInt Inf = APFloat::getInf(Semantics).bitcastToAPInt(); // Exp and int bit.
10612 const unsigned ExplicitIntBitInF80 = 63;
10613 APInt ExpMask = Inf;
10614 if (IsF80)
10615 ExpMask.clearBit(ExplicitIntBitInF80);
10616 APInt AllOneMantissa = APFloat::getLargest(Semantics).bitcastToAPInt() & ~Inf;
10617 APInt QNaNBitMask =
10618 APInt::getOneBitSet(BitSize, AllOneMantissa.getActiveBits() - 1);
10619 APInt InversionMask = APInt::getAllOnes(ResultVT.getScalarSizeInBits());
10620
10621 SDValue ValueMaskV = DAG.getConstant(ValueMask, DL, IntVT);
10622 SDValue SignBitV = DAG.getConstant(SignBit, DL, IntVT);
10623 SDValue ExpMaskV = DAG.getConstant(ExpMask, DL, IntVT);
10624 SDValue ZeroV = DAG.getConstant(0, DL, IntVT);
10625 SDValue InfV = DAG.getConstant(Inf, DL, IntVT);
10626 SDValue ResultInversionMask = DAG.getConstant(InversionMask, DL, ResultVT);
10627
10628 SDValue Res;
10629 const auto appendResult = [&](SDValue PartialRes) {
10630 if (PartialRes) {
10631 if (Res)
10632 Res = DAG.getNode(ISD::OR, DL, ResultVT, Res, PartialRes);
10633 else
10634 Res = PartialRes;
10635 }
10636 };
10637
10638 SDValue IntBitIsSetV; // Explicit integer bit in f80 mantissa is set.
10639 const auto getIntBitIsSet = [&]() -> SDValue {
10640 if (!IntBitIsSetV) {
10641 APInt IntBitMask(BitSize, 0);
10642 IntBitMask.setBit(ExplicitIntBitInF80);
10643 SDValue IntBitMaskV = DAG.getConstant(IntBitMask, DL, IntVT);
10644 SDValue IntBitV = DAG.getNode(ISD::AND, DL, IntVT, OpAsInt, IntBitMaskV);
10645 IntBitIsSetV = DAG.getSetCC(DL, ResultVT, IntBitV, ZeroV, ISD::SETNE);
10646 }
10647 return IntBitIsSetV;
10648 };
10649
10650 // Split the value into sign bit and absolute value.
10651 SDValue AbsV = DAG.getNode(ISD::AND, DL, IntVT, OpAsInt, ValueMaskV);
10652 SDValue SignV = DAG.getSetCC(DL, ResultVT, OpAsInt,
10653 DAG.getConstant(0, DL, IntVT), ISD::SETLT);
10654
10655 // Tests that involve more than one class should be processed first.
10656 SDValue PartialRes;
10657
10658 if (IsF80)
10659 ; // Detect finite numbers of f80 by checking individual classes because
10660 // they have different settings of the explicit integer bit.
10661 else if ((Test & fcFinite) == fcFinite) {
10662 // finite(V) ==> (a << 1) < (inf << 1)
10663 //
10664 // See https://github.com/llvm/llvm-project/issues/169270, this is slightly
10665 // shorter than the `finite(V) ==> abs(V) < exp_mask` formula used before.
10666
10668 "finite check requires IEEE-like FP");
10669
10670 SDValue One = DAG.getShiftAmountConstant(1, IntVT, DL);
10671 SDValue TwiceOp = DAG.getNode(ISD::SHL, DL, IntVT, OpAsInt, One);
10672 SDValue TwiceInf = DAG.getNode(ISD::SHL, DL, IntVT, ExpMaskV, One);
10673
10674 PartialRes = DAG.getSetCC(DL, ResultVT, TwiceOp, TwiceInf, ISD::SETULT);
10675 Test &= ~fcFinite;
10676 } else if ((Test & fcFinite) == fcPosFinite) {
10677 // finite(V) && V > 0 ==> V < exp_mask
10678 PartialRes = DAG.getSetCC(DL, ResultVT, OpAsInt, ExpMaskV, ISD::SETULT);
10679 Test &= ~fcPosFinite;
10680 } else if ((Test & fcFinite) == fcNegFinite) {
10681 // finite(V) && V < 0 ==> abs(V) < exp_mask && signbit == 1
10682 PartialRes = DAG.getSetCC(DL, ResultVT, AbsV, ExpMaskV, ISD::SETLT);
10683 PartialRes = DAG.getNode(ISD::AND, DL, ResultVT, PartialRes, SignV);
10684 Test &= ~fcNegFinite;
10685 }
10686 appendResult(PartialRes);
10687
10688 if (FPClassTest PartialCheck = Test & (fcZero | fcSubnormal)) {
10689 // fcZero | fcSubnormal => test all exponent bits are 0
10690 // TODO: Handle sign bit specific cases
10691 if (PartialCheck == (fcZero | fcSubnormal)) {
10692 SDValue ExpBits = DAG.getNode(ISD::AND, DL, IntVT, OpAsInt, ExpMaskV);
10693 SDValue ExpIsZero =
10694 DAG.getSetCC(DL, ResultVT, ExpBits, ZeroV, ISD::SETEQ);
10695 appendResult(ExpIsZero);
10696 Test &= ~PartialCheck & fcAllFlags;
10697 }
10698 }
10699
10700 // Check for individual classes.
10701
10702 if (unsigned PartialCheck = Test & fcZero) {
10703 if (PartialCheck == fcPosZero)
10704 PartialRes = DAG.getSetCC(DL, ResultVT, OpAsInt, ZeroV, ISD::SETEQ);
10705 else if (PartialCheck == fcZero)
10706 PartialRes = DAG.getSetCC(DL, ResultVT, AbsV, ZeroV, ISD::SETEQ);
10707 else // ISD::fcNegZero
10708 PartialRes = DAG.getSetCC(DL, ResultVT, OpAsInt, SignBitV, ISD::SETEQ);
10709 appendResult(PartialRes);
10710 }
10711
10712 if (unsigned PartialCheck = Test & fcSubnormal) {
10713 // issubnormal(V) ==> unsigned(abs(V) - 1) < (all mantissa bits set)
10714 // issubnormal(V) && V>0 ==> unsigned(V - 1) < (all mantissa bits set)
10715 SDValue V = (PartialCheck == fcPosSubnormal) ? OpAsInt : AbsV;
10716 SDValue MantissaV = DAG.getConstant(AllOneMantissa, DL, IntVT);
10717 SDValue VMinusOneV =
10718 DAG.getNode(ISD::SUB, DL, IntVT, V, DAG.getConstant(1, DL, IntVT));
10719 PartialRes = DAG.getSetCC(DL, ResultVT, VMinusOneV, MantissaV, ISD::SETULT);
10720 if (PartialCheck == fcNegSubnormal)
10721 PartialRes = DAG.getNode(ISD::AND, DL, ResultVT, PartialRes, SignV);
10722 appendResult(PartialRes);
10723 }
10724
10725 if (unsigned PartialCheck = Test & fcInf) {
10726 if (PartialCheck == fcPosInf)
10727 PartialRes = DAG.getSetCC(DL, ResultVT, OpAsInt, InfV, ISD::SETEQ);
10728 else if (PartialCheck == fcInf)
10729 PartialRes = DAG.getSetCC(DL, ResultVT, AbsV, InfV, ISD::SETEQ);
10730 else { // ISD::fcNegInf
10731 APInt NegInf = APFloat::getInf(Semantics, true).bitcastToAPInt();
10732 SDValue NegInfV = DAG.getConstant(NegInf, DL, IntVT);
10733 PartialRes = DAG.getSetCC(DL, ResultVT, OpAsInt, NegInfV, ISD::SETEQ);
10734 }
10735 appendResult(PartialRes);
10736 }
10737
10738 if (unsigned PartialCheck = Test & fcNan) {
10739 APInt InfWithQnanBit = Inf | QNaNBitMask;
10740 SDValue InfWithQnanBitV = DAG.getConstant(InfWithQnanBit, DL, IntVT);
10741 if (PartialCheck == fcNan) {
10742 // isnan(V) ==> abs(V) > int(inf)
10743 PartialRes = DAG.getSetCC(DL, ResultVT, AbsV, InfV, ISD::SETGT);
10744 if (IsF80) {
10745 // Recognize unsupported values as NaNs for compatibility with glibc.
10746 // In them (exp(V)==0) == int_bit.
10747 SDValue ExpBits = DAG.getNode(ISD::AND, DL, IntVT, AbsV, ExpMaskV);
10748 SDValue ExpIsZero =
10749 DAG.getSetCC(DL, ResultVT, ExpBits, ZeroV, ISD::SETEQ);
10750 SDValue IsPseudo =
10751 DAG.getSetCC(DL, ResultVT, getIntBitIsSet(), ExpIsZero, ISD::SETEQ);
10752 PartialRes = DAG.getNode(ISD::OR, DL, ResultVT, PartialRes, IsPseudo);
10753 }
10754 } else if (PartialCheck == fcQNan) {
10755 // isquiet(V) ==> abs(V) >= (unsigned(Inf) | quiet_bit)
10756 PartialRes =
10757 DAG.getSetCC(DL, ResultVT, AbsV, InfWithQnanBitV, ISD::SETGE);
10758 } else { // ISD::fcSNan
10759 // issignaling(V) ==> abs(V) > unsigned(Inf) &&
10760 // abs(V) < (unsigned(Inf) | quiet_bit)
10761 SDValue IsNan = DAG.getSetCC(DL, ResultVT, AbsV, InfV, ISD::SETGT);
10762 SDValue IsNotQnan =
10763 DAG.getSetCC(DL, ResultVT, AbsV, InfWithQnanBitV, ISD::SETLT);
10764 PartialRes = DAG.getNode(ISD::AND, DL, ResultVT, IsNan, IsNotQnan);
10765 }
10766 appendResult(PartialRes);
10767 }
10768
10769 if (unsigned PartialCheck = Test & fcNormal) {
10770 // isnormal(V) ==> (0 < exp < max_exp) ==> (unsigned(exp-1) < (max_exp-1))
10771 APInt ExpLSB = ExpMask & ~(ExpMask.shl(1));
10772 SDValue ExpLSBV = DAG.getConstant(ExpLSB, DL, IntVT);
10773 SDValue ExpMinus1 = DAG.getNode(ISD::SUB, DL, IntVT, AbsV, ExpLSBV);
10774 APInt ExpLimit = ExpMask - ExpLSB;
10775 SDValue ExpLimitV = DAG.getConstant(ExpLimit, DL, IntVT);
10776 PartialRes = DAG.getSetCC(DL, ResultVT, ExpMinus1, ExpLimitV, ISD::SETULT);
10777 if (PartialCheck == fcNegNormal)
10778 PartialRes = DAG.getNode(ISD::AND, DL, ResultVT, PartialRes, SignV);
10779 else if (PartialCheck == fcPosNormal) {
10780 SDValue PosSignV =
10781 DAG.getNode(ISD::XOR, DL, ResultVT, SignV, ResultInversionMask);
10782 PartialRes = DAG.getNode(ISD::AND, DL, ResultVT, PartialRes, PosSignV);
10783 }
10784 if (IsF80)
10785 PartialRes =
10786 DAG.getNode(ISD::AND, DL, ResultVT, PartialRes, getIntBitIsSet());
10787 appendResult(PartialRes);
10788 }
10789
10790 if (!Res)
10791 return DAG.getConstant(IsInverted, DL, ResultVT);
10792 if (IsInverted)
10793 Res = DAG.getNode(ISD::XOR, DL, ResultVT, Res, ResultInversionMask);
10794 return Res;
10795}
10796
10797// Only expand vector types if we have the appropriate vector bit operations.
10798static bool canExpandVectorCTPOP(const TargetLowering &TLI, EVT VT) {
10799 assert(VT.isVector() && "Expected vector type");
10800 unsigned Len = VT.getScalarSizeInBits();
10801 return TLI.isOperationLegalOrCustom(ISD::ADD, VT) &&
10804 (Len == 8 || TLI.isOperationLegalOrCustom(ISD::MUL, VT)) &&
10806}
10807
10809 SDLoc dl(Node);
10810 EVT VT = Node->getValueType(0);
10811 EVT ShVT = getShiftAmountTy(VT, DAG.getDataLayout());
10812 SDValue Op = Node->getOperand(0);
10813 unsigned Len = VT.getScalarSizeInBits();
10814 assert(VT.isInteger() && "CTPOP not implemented for this type.");
10815
10816 // TODO: Add support for irregular type lengths.
10817 if (!(Len <= 128 && Len % 8 == 0))
10818 return SDValue();
10819
10820 // Only expand vector types if we have the appropriate vector bit operations.
10821 if (VT.isVector() && !canExpandVectorCTPOP(*this, VT))
10822 return SDValue();
10823
10824 // This is the "best" algorithm from
10825 // http://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetParallel
10826 SDValue Mask55 =
10827 DAG.getConstant(APInt::getSplat(Len, APInt(8, 0x55)), dl, VT);
10828 SDValue Mask33 =
10829 DAG.getConstant(APInt::getSplat(Len, APInt(8, 0x33)), dl, VT);
10830 SDValue Mask0F =
10831 DAG.getConstant(APInt::getSplat(Len, APInt(8, 0x0F)), dl, VT);
10832
10833 // v = v - ((v >> 1) & 0x55555555...)
10834 Op = DAG.getNode(ISD::SUB, dl, VT, Op,
10835 DAG.getNode(ISD::AND, dl, VT,
10836 DAG.getNode(ISD::SRL, dl, VT, Op,
10837 DAG.getConstant(1, dl, ShVT)),
10838 Mask55));
10839 // v = (v & 0x33333333...) + ((v >> 2) & 0x33333333...)
10840 Op = DAG.getNode(ISD::ADD, dl, VT, DAG.getNode(ISD::AND, dl, VT, Op, Mask33),
10841 DAG.getNode(ISD::AND, dl, VT,
10842 DAG.getNode(ISD::SRL, dl, VT, Op,
10843 DAG.getConstant(2, dl, ShVT)),
10844 Mask33));
10845 // v = (v + (v >> 4)) & 0x0F0F0F0F...
10846 Op = DAG.getNode(ISD::AND, dl, VT,
10847 DAG.getNode(ISD::ADD, dl, VT, Op,
10848 DAG.getNode(ISD::SRL, dl, VT, Op,
10849 DAG.getConstant(4, dl, ShVT))),
10850 Mask0F);
10851
10852 if (Len <= 8)
10853 return Op;
10854
10855 // Avoid the multiply if we only have 2 bytes to add.
10856 // TODO: Only doing this for scalars because vectors weren't as obviously
10857 // improved.
10858 if (Len == 16 && !VT.isVector()) {
10859 // v = (v + (v >> 8)) & 0x00FF;
10860 return DAG.getNode(ISD::AND, dl, VT,
10861 DAG.getNode(ISD::ADD, dl, VT, Op,
10862 DAG.getNode(ISD::SRL, dl, VT, Op,
10863 DAG.getConstant(8, dl, ShVT))),
10864 DAG.getConstant(0xFF, dl, VT));
10865 }
10866
10867 // v = (v * 0x01010101...) >> (Len - 8)
10868 SDValue V;
10871 SDValue Mask01 =
10872 DAG.getConstant(APInt::getSplat(Len, APInt(8, 0x01)), dl, VT);
10873 V = DAG.getNode(ISD::MUL, dl, VT, Op, Mask01);
10874 } else {
10875 V = Op;
10876 for (unsigned Shift = 8; Shift < Len; Shift *= 2) {
10877 SDValue ShiftC = DAG.getShiftAmountConstant(Shift, VT, dl);
10878 V = DAG.getNode(ISD::ADD, dl, VT, V,
10879 DAG.getNode(ISD::SHL, dl, VT, V, ShiftC));
10880 }
10881 }
10882 return DAG.getNode(ISD::SRL, dl, VT, V, DAG.getConstant(Len - 8, dl, ShVT));
10883}
10884
10886 SDLoc dl(Node);
10887 EVT VT = Node->getValueType(0);
10888 EVT ShVT = getShiftAmountTy(VT, DAG.getDataLayout());
10889 SDValue Op = Node->getOperand(0);
10890 unsigned NumBitsPerElt = VT.getScalarSizeInBits();
10891
10892 // If the non-ZERO_POISON version is supported we can use that instead.
10893 if (Node->getOpcode() == ISD::CTLZ_ZERO_POISON &&
10895 return DAG.getNode(ISD::CTLZ, dl, VT, Op);
10896
10897 // If the ZERO_POISON version is supported use that and handle the zero case.
10899 EVT SetCCVT =
10900 getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
10901 SDValue CTLZ = DAG.getNode(ISD::CTLZ_ZERO_POISON, dl, VT, Op);
10902 SDValue Zero = DAG.getConstant(0, dl, VT);
10903 SDValue SrcIsZero = DAG.getSetCC(dl, SetCCVT, Op, Zero, ISD::SETEQ);
10904 return DAG.getSelect(dl, VT, SrcIsZero,
10905 DAG.getConstant(NumBitsPerElt, dl, VT), CTLZ);
10906 }
10907
10908 // Only expand vector types if we have the appropriate vector bit operations.
10909 // This includes the operations needed to expand CTPOP if it isn't supported.
10910 if (VT.isVector() && (!isPowerOf2_32(NumBitsPerElt) ||
10912 !canExpandVectorCTPOP(*this, VT)) ||
10915 return SDValue();
10916
10917 // for now, we do this:
10918 // x = x | (x >> 1);
10919 // x = x | (x >> 2);
10920 // ...
10921 // x = x | (x >>16);
10922 // x = x | (x >>32); // for 64-bit input
10923 // return popcount(~x);
10924 //
10925 // Ref: "Hacker's Delight" by Henry Warren
10926 for (unsigned i = 0; (1U << i) < NumBitsPerElt; ++i) {
10927 SDValue Tmp = DAG.getConstant(1ULL << i, dl, ShVT);
10928 Op = DAG.getNode(ISD::OR, dl, VT, Op,
10929 DAG.getNode(ISD::SRL, dl, VT, Op, Tmp));
10930 }
10931 Op = DAG.getNOT(dl, Op, VT);
10932 return DAG.getNode(ISD::CTPOP, dl, VT, Op);
10933}
10934
10936 SDLoc dl(Node);
10937 EVT VT = Node->getValueType(0);
10938 SDValue Op = DAG.getFreeze(Node->getOperand(0));
10939 unsigned NumBitsPerElt = VT.getScalarSizeInBits();
10940
10941 // CTLS(x) = CTLZ(OR(SHL(XOR(x, SRA(x, BW-1)), 1), 1))
10942 // This transforms the sign bits into leading zeros that can be counted.
10943 SDValue ShiftAmt = DAG.getShiftAmountConstant(NumBitsPerElt - 1, VT, dl);
10944 SDValue SignBit = DAG.getNode(ISD::SRA, dl, VT, Op, ShiftAmt);
10945 SDValue Xor = DAG.getNode(ISD::XOR, dl, VT, Op, SignBit);
10946 SDValue Shl =
10947 DAG.getNode(ISD::SHL, dl, VT, Xor, DAG.getShiftAmountConstant(1, VT, dl));
10948 SDValue Or = DAG.getNode(ISD::OR, dl, VT, Shl, DAG.getConstant(1, dl, VT));
10949 return DAG.getNode(ISD::CTLZ_ZERO_POISON, dl, VT, Or);
10950}
10951
10953 const SDLoc &DL, EVT VT, SDValue Op,
10954 unsigned BitWidth) const {
10955 if (BitWidth != 32 && BitWidth != 64)
10956 return SDValue();
10957
10958 const DataLayout &TD = DAG.getDataLayout();
10960 return SDValue();
10961
10962 APInt DeBruijn = BitWidth == 32 ? APInt(32, 0x077CB531U)
10963 : APInt(64, 0x0218A392CD3D5DBFULL);
10964 MachinePointerInfo PtrInfo =
10966 unsigned ShiftAmt = BitWidth - Log2_32(BitWidth);
10967 SDValue Neg = DAG.getNode(ISD::SUB, DL, VT, DAG.getConstant(0, DL, VT), Op);
10968 SDValue Lookup = DAG.getNode(
10969 ISD::SRL, DL, VT,
10970 DAG.getNode(ISD::MUL, DL, VT, DAG.getNode(ISD::AND, DL, VT, Op, Neg),
10971 DAG.getConstant(DeBruijn, DL, VT)),
10972 DAG.getShiftAmountConstant(ShiftAmt, VT, DL));
10974
10976 for (unsigned i = 0; i < BitWidth; i++) {
10977 APInt Shl = DeBruijn.shl(i);
10978 APInt Lshr = Shl.lshr(ShiftAmt);
10979 Table[Lshr.getZExtValue()] = i;
10980 }
10981
10982 // Create a ConstantArray in Constant Pool
10983 auto *CA = ConstantDataArray::get(*DAG.getContext(), Table);
10984 SDValue CPIdx = DAG.getConstantPool(CA, getPointerTy(TD),
10985 TD.getPrefTypeAlign(CA->getType()));
10986 SDValue ExtLoad = DAG.getExtLoad(ISD::ZEXTLOAD, DL, VT, DAG.getEntryNode(),
10987 DAG.getMemBasePlusOffset(CPIdx, Lookup, DL),
10988 PtrInfo, MVT::i8);
10989 if (Node->getOpcode() == ISD::CTTZ_ZERO_POISON)
10990 return ExtLoad;
10991
10992 EVT SetCCVT =
10993 getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
10994 SDValue Zero = DAG.getConstant(0, DL, VT);
10995 SDValue SrcIsZero = DAG.getSetCC(DL, SetCCVT, Op, Zero, ISD::SETEQ);
10996 return DAG.getSelect(DL, VT, SrcIsZero,
10997 DAG.getConstant(BitWidth, DL, VT), ExtLoad);
10998}
10999
11001 SDLoc dl(Node);
11002 EVT VT = Node->getValueType(0);
11003 SDValue Op = Node->getOperand(0);
11004 unsigned NumBitsPerElt = VT.getScalarSizeInBits();
11005
11006 // If the non-ZERO_POISON version is supported we can use that instead.
11007 if (Node->getOpcode() == ISD::CTTZ_ZERO_POISON &&
11009 return DAG.getNode(ISD::CTTZ, dl, VT, Op);
11010
11011 // If the ZERO_POISON version is supported use that and handle the zero case.
11013 EVT SetCCVT =
11014 getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
11015 SDValue CTTZ = DAG.getNode(ISD::CTTZ_ZERO_POISON, dl, VT, Op);
11016 SDValue Zero = DAG.getConstant(0, dl, VT);
11017 SDValue SrcIsZero = DAG.getSetCC(dl, SetCCVT, Op, Zero, ISD::SETEQ);
11018 return DAG.getSelect(dl, VT, SrcIsZero,
11019 DAG.getConstant(NumBitsPerElt, dl, VT), CTTZ);
11020 }
11021
11022 // Only expand vector types if we have the appropriate vector bit operations.
11023 // This includes the operations needed to expand CTPOP if it isn't supported.
11024 if (VT.isVector() && (!isPowerOf2_32(NumBitsPerElt) ||
11027 !canExpandVectorCTPOP(*this, VT)) ||
11031 return SDValue();
11032
11033 // Emit Table Lookup if ISD::CTPOP used in the fallback path below is going
11034 // to be expanded or converted to a libcall.
11037 if (SDValue V = CTTZTableLookup(Node, DAG, dl, VT, Op, NumBitsPerElt))
11038 return V;
11039
11040 bool UseCTLZ =
11042
11043 // When only ctlz is available and the operand is nonzero we can use:
11044 // { return nlz(x & -x) ^ 31; }
11045 // which is more efficient than:
11046 // { return 32 - nlz(~x & (x - 1)); }.
11047 if (UseCTLZ && Node->getOpcode() == ISD::CTTZ_ZERO_POISON) {
11048 SDValue LowestBit =
11049 DAG.getNode(ISD::AND, dl, VT, Op, DAG.getNegative(Op, dl, VT));
11050 return DAG.getNode(ISD::XOR, dl, VT,
11051 DAG.getNode(ISD::CTLZ_ZERO_POISON, dl, VT, LowestBit),
11052 DAG.getConstant(NumBitsPerElt - 1, dl, VT));
11053 }
11054
11055 // If ctpop is available, we use:
11056 // { return popcount(~x & (x-1)); }
11057 // If the target has ctlz but not ctpop, we use:
11058 // { return 32 - nlz(~x & (x-1)); }
11059 // Ref: "Hacker's Delight" by Henry Warren
11060 SDValue Tmp = DAG.getNode(
11061 ISD::AND, dl, VT, DAG.getNOT(dl, Op, VT),
11062 DAG.getNode(ISD::SUB, dl, VT, Op, DAG.getConstant(1, dl, VT)));
11063
11064 if (UseCTLZ)
11065 return DAG.getNode(ISD::SUB, dl, VT, DAG.getConstant(NumBitsPerElt, dl, VT),
11066 DAG.getNode(ISD::CTLZ, dl, VT, Tmp));
11067
11068 return DAG.getNode(ISD::CTPOP, dl, VT, Tmp);
11069}
11070
11072 SelectionDAG &DAG) const {
11073 // %cond = to_bool_vec %source
11074 // %splat = splat /*val=*/VL
11075 // %tz = step_vector
11076 // %v = select %cond, /*true=*/tz, /*false=*/%splat
11077 // %r = vp.reduce.umin %v
11078 SDLoc DL(N);
11079 SDValue Source = N->getOperand(0);
11080 SDValue Mask = N->getOperand(1);
11081 SDValue EVL = N->getOperand(2);
11082 EVT SrcVT = Source.getValueType();
11083 EVT ResVT = N->getValueType(0);
11084 EVT ResVecVT =
11085 EVT::getVectorVT(*DAG.getContext(), ResVT, SrcVT.getVectorElementCount());
11086
11087 // Convert to boolean vector.
11088 if (SrcVT.getScalarType() != MVT::i1) {
11089 SDValue AllZero = DAG.getConstant(0, DL, SrcVT);
11090 SrcVT = EVT::getVectorVT(*DAG.getContext(), MVT::i1,
11091 SrcVT.getVectorElementCount());
11092 Source = DAG.getSetCC(DL, SrcVT, Source, AllZero, ISD::SETNE);
11093 }
11094
11095 SDValue ExtEVL = DAG.getZExtOrTrunc(EVL, DL, ResVT);
11096 SDValue Splat = DAG.getSplat(ResVecVT, DL, ExtEVL);
11097 SDValue StepVec = DAG.getStepVector(DL, ResVecVT);
11098 SDValue Select = DAG.getSelect(DL, ResVecVT, Source, StepVec, Splat);
11099 return DAG.getNode(ISD::VP_REDUCE_UMIN, DL, ResVT, ExtEVL, Select, Mask, EVL);
11100}
11101
11102/// Returns a type-legalized version of \p Mask as the first item in the
11103/// pair. The second item contains a type-legalized step vector that's
11104/// guaranteed to fit the number of elements in \p Mask.
11105/// If the stepvector would require splitting, returns an empty SDValue
11106/// as the second item to signal that the operation should be split instead.
11107static std::pair<SDValue, SDValue>
11109 SelectionDAG &DAG) {
11110 EVT MaskVT = Mask.getValueType();
11111 EVT BoolVT = MaskVT.getScalarType();
11112
11113 // Find a suitable type for a stepvector.
11114 // If zero is poison, we can assume the upper limit of the result is VF-1.
11115 ConstantRange VScaleRange(1, /*isFullSet=*/true); // Fixed length default.
11116 if (MaskVT.isScalableVector())
11117 VScaleRange = getVScaleRange(&DAG.getMachineFunction().getFunction(), 64);
11118 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
11119 uint64_t EltWidth = TLI.getBitWidthForCttzElements(
11120 EVT(TLI.getVectorIdxTy(DAG.getDataLayout())),
11121 MaskVT.getVectorElementCount(), ZeroIsPoison, &VScaleRange);
11122 // If the step vector element type is smaller than the mask element type,
11123 // use the mask type directly to avoid widening issues.
11124 EltWidth = std::max(EltWidth, BoolVT.getFixedSizeInBits());
11125 EVT StepVT = MVT::getIntegerVT(EltWidth);
11126 EVT StepVecVT = MaskVT.changeVectorElementType(*DAG.getContext(), StepVT);
11127
11128 // If promotion or widening is required to make the type legal, do it here.
11129 // Promotion of integers within LegalizeVectorOps is looking for types of
11130 // the same size but with a smaller number of larger elements, not the usual
11131 // larger size with the same number of larger elements.
11133 TLI.getTypeAction(*DAG.getContext(), StepVecVT);
11134 SDValue StepVec;
11135 if (TypeAction == TargetLowering::TypePromoteInteger) {
11136 StepVecVT = TLI.getTypeToTransformTo(*DAG.getContext(), StepVecVT);
11137 StepVec = DAG.getStepVector(DL, StepVecVT);
11138 } else if (TypeAction == TargetLowering::TypeWidenVector) {
11139 // For widening, the element count changes. Create a step vector with only
11140 // the original elements valid and zeros for padding. Also widen the mask.
11141 EVT WideVecVT = TLI.getTypeToTransformTo(*DAG.getContext(), StepVecVT);
11142 unsigned WideNumElts = WideVecVT.getVectorNumElements();
11143
11144 // Build widened step vector: <0, 1, ..., OrigNumElts-1, poison, poison, ..>
11145 SDValue OrigStepVec = DAG.getStepVector(DL, StepVecVT);
11146 SDValue UndefStep = DAG.getPOISON(WideVecVT);
11147 StepVec = DAG.getInsertSubvector(DL, UndefStep, OrigStepVec, 0);
11148
11149 // Widen mask: pad with zeros.
11150 EVT WideMaskVT = EVT::getVectorVT(*DAG.getContext(), BoolVT, WideNumElts);
11151 SDValue ZeroMask = DAG.getConstant(0, DL, WideMaskVT);
11152 Mask = DAG.getInsertSubvector(DL, ZeroMask, Mask, 0);
11153 } else if (TypeAction == TargetLowering::TypeSplitVector) {
11154 // The stepvector type would require splitting. Signal to the caller
11155 // that the operation should be split instead of expanded.
11156 return {Mask, SDValue()};
11157 } else {
11158 StepVec = DAG.getStepVector(DL, StepVecVT);
11159 }
11160
11161 return {Mask, StepVec};
11162}
11163
11165 SelectionDAG &DAG) const {
11166 SDLoc DL(N);
11167 auto [Mask, StepVec] = getLegalMaskAndStepVector(
11168 N->getOperand(0), /*ZeroIsPoison=*/true, DL, DAG);
11169
11170 // If StepVec is empty, the stepvector would require splitting.
11171 // Split the operation instead and let it be recursively legalized.
11172 if (!StepVec) {
11173 EVT MaskVT = N->getOperand(0).getValueType();
11174 EVT ResVT = N->getValueType(0);
11175
11176 // Split the mask
11177 auto [LoVT, HiVT] = DAG.GetSplitDestVTs(MaskVT);
11178 auto [MaskLo, MaskHi] = DAG.SplitVector(N->getOperand(0), DL);
11179
11180 // Create split VECTOR_FIND_LAST_ACTIVE operations
11181 SDValue LoResult =
11182 DAG.getNode(ISD::VECTOR_FIND_LAST_ACTIVE, DL, ResVT, MaskLo);
11183 SDValue HiResult =
11184 DAG.getNode(ISD::VECTOR_FIND_LAST_ACTIVE, DL, ResVT, MaskHi);
11185
11186 // Check if any lane is active in the high mask.
11187 SDValue AnyHiActive = DAG.getNode(ISD::VECREDUCE_OR, DL, MVT::i1, MaskHi);
11189 AnyHiActive, DL,
11190 getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), MVT::i1),
11191 MVT::i1);
11192
11193 // Adjust HiResult by adding the number of elements in Lo
11194 SDValue LoNumElts =
11195 DAG.getElementCount(DL, ResVT, LoVT.getVectorElementCount());
11196 SDValue AdjustedHiResult =
11197 DAG.getNode(ISD::ADD, DL, ResVT, HiResult, LoNumElts);
11198
11199 // Return: AnyHiActive ? AdjustedHiResult : LoResult;
11200 return DAG.getNode(ISD::SELECT, DL, ResVT, Cond, AdjustedHiResult,
11201 LoResult);
11202 }
11203
11204 EVT StepVecVT = StepVec.getValueType();
11205 EVT StepVT = StepVec.getValueType().getVectorElementType();
11206
11207 // Zero out lanes with inactive elements, then find the highest remaining
11208 // value from the stepvector.
11209 SDValue Zeroes = DAG.getConstant(0, DL, StepVecVT);
11210 SDValue ActiveElts = DAG.getSelect(DL, StepVecVT, Mask, StepVec, Zeroes);
11211 SDValue HighestIdx = DAG.getNode(ISD::VECREDUCE_UMAX, DL, StepVT, ActiveElts);
11212 return DAG.getZExtOrTrunc(HighestIdx, DL, N->getValueType(0));
11213}
11214
11216 SelectionDAG &DAG) const {
11217 SDLoc DL(N);
11218 EVT VT = N->getValueType(0);
11219 SDValue SourceValue = N->getOperand(0);
11220 SDValue SinkValue = N->getOperand(1);
11221 SDValue EltSizeInBytes = N->getOperand(2);
11222
11223 // Note: The lane offset is scalable if the mask is scalable.
11224 ElementCount LaneOffsetEC =
11225 ElementCount::get(N->getConstantOperandVal(3), VT.isScalableVT());
11226
11227 EVT AddrVT = SourceValue->getValueType(0);
11228 bool IsReadAfterWrite = N->getOpcode() == ISD::LOOP_DEPENDENCE_RAW_MASK;
11229
11230 EVT CmpVT =
11231 getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), AddrVT);
11232
11233 // Unsigned compare: Source >= Sink.
11234 SDValue SourceAheadOfOrEqualToSink =
11235 DAG.getSetCC(DL, CmpVT, SourceValue, SinkValue, ISD::SETUGE);
11236
11237 // Take the difference between the pointers and divided by the element size,
11238 // to see how many lanes separate them.
11239 SDValue Diff = DAG.getNode(ISD::SUB, DL, AddrVT, SinkValue, SourceValue);
11240
11241 // RAW_MASK: Diff = Source >= Sink ? (Source - Sink) : (Sink - Source)
11242 if (IsReadAfterWrite)
11243 Diff = DAG.getSelect(DL, AddrVT, SourceAheadOfOrEqualToSink,
11244 DAG.getNegative(Diff, DL, AddrVT), Diff);
11245
11246 Diff = DAG.getNode(ISD::SDIV, DL, AddrVT, Diff, EltSizeInBytes);
11247
11248 // The pointers do not alias if:
11249 // - Source >= Sink (WAR_MASK)
11250 // - Source == Sink (RAW_MASK)
11251 SDValue NoAlias = SourceAheadOfOrEqualToSink;
11252 if (IsReadAfterWrite)
11253 NoAlias = DAG.getSetCC(DL, CmpVT, SourceValue, SinkValue, ISD::SETEQ);
11254
11255 // The pointers do not alias if:
11256 // Lane + LaneOffset < Diff (WAR/RAW_MASK)
11257 SDValue LaneOffset = DAG.getElementCount(DL, AddrVT, LaneOffsetEC);
11258 SDValue MaskN = DAG.getSelect(
11259 DL, AddrVT, NoAlias,
11261 AddrVT),
11262 Diff);
11263
11264 return DAG.getNode(ISD::GET_ACTIVE_LANE_MASK, DL, VT, LaneOffset, MaskN);
11265}
11266
11268 bool IsNegative) const {
11269 SDLoc dl(N);
11270 EVT VT = N->getValueType(0);
11271 SDValue Op = N->getOperand(0);
11272
11273 // If expanding ABS_MIN_POISON, fall back to ABS if the target supports it.
11274 if (N->getOpcode() == ISD::ABS_MIN_POISON &&
11276 SDValue AbsVal = DAG.getNode(ISD::ABS, dl, VT, Op);
11277 if (IsNegative)
11278 return DAG.getNegative(AbsVal, dl, VT);
11279 return AbsVal;
11280 }
11281
11282 // abs(x) -> smax(x,sub(0,x))
11283 if (!IsNegative && isOperationLegal(ISD::SUB, VT) &&
11285 SDValue Zero = DAG.getConstant(0, dl, VT);
11286 Op = DAG.getFreeze(Op);
11287 return DAG.getNode(ISD::SMAX, dl, VT, Op,
11288 DAG.getNode(ISD::SUB, dl, VT, Zero, Op));
11289 }
11290
11291 // abs(x) -> umin(x,sub(0,x))
11292 if (!IsNegative && isOperationLegal(ISD::SUB, VT) &&
11294 SDValue Zero = DAG.getConstant(0, dl, VT);
11295 Op = DAG.getFreeze(Op);
11296 return DAG.getNode(ISD::UMIN, dl, VT, Op,
11297 DAG.getNode(ISD::SUB, dl, VT, Zero, Op));
11298 }
11299
11300 // 0 - abs(x) -> smin(x, sub(0,x))
11301 if (IsNegative && isOperationLegal(ISD::SUB, VT) &&
11303 SDValue Zero = DAG.getConstant(0, dl, VT);
11304 Op = DAG.getFreeze(Op);
11305 return DAG.getNode(ISD::SMIN, dl, VT, Op,
11306 DAG.getNode(ISD::SUB, dl, VT, Zero, Op));
11307 }
11308
11309 // Only expand vector types if we have the appropriate vector operations.
11310 if (VT.isVector() &&
11312 (!IsNegative && !isOperationLegalOrCustom(ISD::ADD, VT)) ||
11313 (IsNegative && !isOperationLegalOrCustom(ISD::SUB, VT)) ||
11315 return SDValue();
11316
11317 Op = DAG.getFreeze(Op);
11318 SDValue Shift = DAG.getNode(
11319 ISD::SRA, dl, VT, Op,
11320 DAG.getShiftAmountConstant(VT.getScalarSizeInBits() - 1, VT, dl));
11321 SDValue Xor = DAG.getNode(ISD::XOR, dl, VT, Op, Shift);
11322
11323 // abs(x) -> Y = sra (X, size(X)-1); sub (xor (X, Y), Y)
11324 if (!IsNegative)
11325 return DAG.getNode(ISD::SUB, dl, VT, Xor, Shift);
11326
11327 // 0 - abs(x) -> Y = sra (X, size(X)-1); sub (Y, xor (X, Y))
11328 return DAG.getNode(ISD::SUB, dl, VT, Shift, Xor);
11329}
11330
11332 SDLoc dl(N);
11333 EVT VT = N->getValueType(0);
11334 SDValue LHS = N->getOperand(0);
11335 SDValue RHS = N->getOperand(1);
11336 bool IsSigned = N->getOpcode() == ISD::ABDS;
11337
11338 // abds(lhs, rhs) -> sub(smax(lhs,rhs), smin(lhs,rhs))
11339 // abdu(lhs, rhs) -> sub(umax(lhs,rhs), umin(lhs,rhs))
11340 unsigned MaxOpc = IsSigned ? ISD::SMAX : ISD::UMAX;
11341 unsigned MinOpc = IsSigned ? ISD::SMIN : ISD::UMIN;
11342 if (isOperationLegal(MaxOpc, VT) && isOperationLegal(MinOpc, VT)) {
11343 LHS = DAG.getFreeze(LHS);
11344 RHS = DAG.getFreeze(RHS);
11345 SDValue Max = DAG.getNode(MaxOpc, dl, VT, LHS, RHS);
11346 SDValue Min = DAG.getNode(MinOpc, dl, VT, LHS, RHS);
11347 return DAG.getNode(ISD::SUB, dl, VT, Max, Min);
11348 }
11349
11350 // abdu(lhs, rhs) -> or(usubsat(lhs,rhs), usubsat(rhs,lhs))
11351 if (!IsSigned && isOperationLegal(ISD::USUBSAT, VT)) {
11352 LHS = DAG.getFreeze(LHS);
11353 RHS = DAG.getFreeze(RHS);
11354 return DAG.getNode(ISD::OR, dl, VT,
11355 DAG.getNode(ISD::USUBSAT, dl, VT, LHS, RHS),
11356 DAG.getNode(ISD::USUBSAT, dl, VT, RHS, LHS));
11357 }
11358
11359 // If the subtract doesn't overflow then just use abs(sub())
11360 bool IsNonNegative = DAG.SignBitIsZero(LHS) && DAG.SignBitIsZero(RHS);
11361
11362 if (DAG.willNotOverflowSub(IsSigned || IsNonNegative, LHS, RHS))
11363 return DAG.getNode(ISD::ABS, dl, VT,
11364 DAG.getNode(ISD::SUB, dl, VT, LHS, RHS));
11365
11366 if (DAG.willNotOverflowSub(IsSigned || IsNonNegative, RHS, LHS))
11367 return DAG.getNode(ISD::ABS, dl, VT,
11368 DAG.getNode(ISD::SUB, dl, VT, RHS, LHS));
11369
11370 EVT CCVT = getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
11372 LHS = DAG.getFreeze(LHS);
11373 RHS = DAG.getFreeze(RHS);
11374 SDValue Cmp = DAG.getSetCC(dl, CCVT, LHS, RHS, CC);
11375
11376 // Branchless expansion iff cmp result is allbits:
11377 // abds(lhs, rhs) -> sub(sgt(lhs, rhs), xor(sgt(lhs, rhs), sub(lhs, rhs)))
11378 // abdu(lhs, rhs) -> sub(ugt(lhs, rhs), xor(ugt(lhs, rhs), sub(lhs, rhs)))
11379 if (CCVT == VT && getBooleanContents(VT) == ZeroOrNegativeOneBooleanContent) {
11380 SDValue Diff = DAG.getNode(ISD::SUB, dl, VT, LHS, RHS);
11381 SDValue Xor = DAG.getNode(ISD::XOR, dl, VT, Diff, Cmp);
11382 return DAG.getNode(ISD::SUB, dl, VT, Cmp, Xor);
11383 }
11384
11385 // Similar to the branchless expansion, if we don't prefer selects, use the
11386 // (sign-extended) usubo overflow flag if the (scalar) type is illegal as this
11387 // is more likely to legalize cleanly: abdu(lhs, rhs) -> sub(xor(sub(lhs,
11388 // rhs), uof(lhs, rhs)), uof(lhs, rhs))
11389 if (!IsSigned && VT.isScalarInteger() && !isTypeLegal(VT) &&
11391 SDValue USubO =
11392 DAG.getNode(ISD::USUBO, dl, DAG.getVTList(VT, MVT::i1), {LHS, RHS});
11393 SDValue Cmp = DAG.getNode(ISD::SIGN_EXTEND, dl, VT, USubO.getValue(1));
11394 SDValue Xor = DAG.getNode(ISD::XOR, dl, VT, USubO.getValue(0), Cmp);
11395 return DAG.getNode(ISD::SUB, dl, VT, Xor, Cmp);
11396 }
11397
11398 // FIXME: Should really try to split the vector in case it's legal on a
11399 // subvector.
11401 return DAG.UnrollVectorOp(N);
11402
11403 // abds(lhs, rhs) -> select(sgt(lhs,rhs), sub(lhs,rhs), sub(rhs,lhs))
11404 // abdu(lhs, rhs) -> select(ugt(lhs,rhs), sub(lhs,rhs), sub(rhs,lhs))
11405 return DAG.getSelect(dl, VT, Cmp, DAG.getNode(ISD::SUB, dl, VT, LHS, RHS),
11406 DAG.getNode(ISD::SUB, dl, VT, RHS, LHS));
11407}
11408
11410 SDLoc dl(N);
11411 EVT VT = N->getValueType(0);
11412 SDValue LHS = N->getOperand(0);
11413 SDValue RHS = N->getOperand(1);
11414
11415 unsigned Opc = N->getOpcode();
11416 bool IsFloor = Opc == ISD::AVGFLOORS || Opc == ISD::AVGFLOORU;
11417 bool IsSigned = Opc == ISD::AVGCEILS || Opc == ISD::AVGFLOORS;
11418 unsigned SumOpc = IsFloor ? ISD::ADD : ISD::SUB;
11419 unsigned SignOpc = IsFloor ? ISD::AND : ISD::OR;
11420 unsigned ShiftOpc = IsSigned ? ISD::SRA : ISD::SRL;
11421 unsigned ExtOpc = IsSigned ? ISD::SIGN_EXTEND : ISD::ZERO_EXTEND;
11423 Opc == ISD::AVGFLOORU || Opc == ISD::AVGCEILU) &&
11424 "Unknown AVG node");
11425
11426 // If the operands are already extended, we can add+shift.
11427 bool IsExt =
11428 (IsSigned && DAG.ComputeNumSignBits(LHS) >= 2 &&
11429 DAG.ComputeNumSignBits(RHS) >= 2) ||
11430 (!IsSigned && DAG.computeKnownBits(LHS).countMinLeadingZeros() >= 1 &&
11431 DAG.computeKnownBits(RHS).countMinLeadingZeros() >= 1);
11432 if (IsExt) {
11433 SDValue Sum = DAG.getNode(ISD::ADD, dl, VT, LHS, RHS);
11434 if (!IsFloor)
11435 Sum = DAG.getNode(ISD::ADD, dl, VT, Sum, DAG.getConstant(1, dl, VT));
11436 return DAG.getNode(ShiftOpc, dl, VT, Sum,
11437 DAG.getShiftAmountConstant(1, VT, dl));
11438 }
11439
11440 // For scalars, see if we can efficiently extend/truncate to use add+shift.
11441 if (VT.isScalarInteger()) {
11442 EVT ExtVT = VT.widenIntegerElementType(*DAG.getContext());
11443 if (isTypeLegal(ExtVT) && isTruncateFree(ExtVT, VT)) {
11444 LHS = DAG.getNode(ExtOpc, dl, ExtVT, LHS);
11445 RHS = DAG.getNode(ExtOpc, dl, ExtVT, RHS);
11446 SDValue Avg = DAG.getNode(ISD::ADD, dl, ExtVT, LHS, RHS);
11447 if (!IsFloor)
11448 Avg = DAG.getNode(ISD::ADD, dl, ExtVT, Avg,
11449 DAG.getConstant(1, dl, ExtVT));
11450 // Just use SRL as we will be truncating away the extended sign bits.
11451 Avg = DAG.getNode(ISD::SRL, dl, ExtVT, Avg,
11452 DAG.getShiftAmountConstant(1, ExtVT, dl));
11453 return DAG.getNode(ISD::TRUNCATE, dl, VT, Avg);
11454 }
11455 }
11456
11457 // avgflooru(lhs, rhs) -> or(lshr(add(lhs, rhs),1),shl(overflow, typesize-1))
11458 if (Opc == ISD::AVGFLOORU && VT.isScalarInteger() && !isTypeLegal(VT) &&
11461 SDValue UAddWithOverflow =
11462 DAG.getNode(ISD::UADDO, dl, DAG.getVTList(VT, MVT::i1), {RHS, LHS});
11463
11464 SDValue Sum = UAddWithOverflow.getValue(0);
11465 SDValue Overflow = UAddWithOverflow.getValue(1);
11466
11467 // Right shift the sum by 1
11468 SDValue LShrVal = DAG.getNode(ISD::SRL, dl, VT, Sum,
11469 DAG.getShiftAmountConstant(1, VT, dl));
11470
11471 SDValue ZeroExtOverflow = DAG.getNode(ISD::ANY_EXTEND, dl, VT, Overflow);
11472 SDValue OverflowShl = DAG.getNode(
11473 ISD::SHL, dl, VT, ZeroExtOverflow,
11474 DAG.getShiftAmountConstant(VT.getScalarSizeInBits() - 1, VT, dl));
11475
11476 return DAG.getNode(ISD::OR, dl, VT, LShrVal, OverflowShl);
11477 }
11478
11479 // avgceils(lhs, rhs) -> sub(or(lhs,rhs),ashr(xor(lhs,rhs),1))
11480 // avgceilu(lhs, rhs) -> sub(or(lhs,rhs),lshr(xor(lhs,rhs),1))
11481 // avgfloors(lhs, rhs) -> add(and(lhs,rhs),ashr(xor(lhs,rhs),1))
11482 // avgflooru(lhs, rhs) -> add(and(lhs,rhs),lshr(xor(lhs,rhs),1))
11483 LHS = DAG.getFreeze(LHS);
11484 RHS = DAG.getFreeze(RHS);
11485 SDValue Sign = DAG.getNode(SignOpc, dl, VT, LHS, RHS);
11486 SDValue Xor = DAG.getNode(ISD::XOR, dl, VT, LHS, RHS);
11487 SDValue Shift =
11488 DAG.getNode(ShiftOpc, dl, VT, Xor, DAG.getShiftAmountConstant(1, VT, dl));
11489 return DAG.getNode(SumOpc, dl, VT, Sign, Shift);
11490}
11491
11493 SDLoc dl(N);
11494 EVT VT = N->getValueType(0);
11495 SDValue Op = N->getOperand(0);
11496
11497 if (!VT.isSimple())
11498 return SDValue();
11499
11500 EVT SHVT = getShiftAmountTy(VT, DAG.getDataLayout());
11501 SDValue Tmp1, Tmp2, Tmp3, Tmp4, Tmp5, Tmp6, Tmp7, Tmp8;
11502 switch (VT.getSimpleVT().getScalarType().SimpleTy) {
11503 default:
11504 return SDValue();
11505 case MVT::i16:
11506 // Use a rotate by 8. This can be further expanded if necessary.
11507 return DAG.getNode(ISD::ROTL, dl, VT, Op, DAG.getConstant(8, dl, SHVT));
11508 case MVT::i32:
11509 // This is meant for ARM specifically, which has ROTR but no ROTL.
11510 // t = x ^ rotr(x, 16)
11511 // t = bic(t, 0x00ff0000)
11512 // t = lshr(t, 8)
11513 // x = t ^ rotr(x, 8)
11515 SDValue Rotr16 =
11516 DAG.getNode(ISD::ROTR, dl, VT, Op, DAG.getConstant(16, dl, SHVT));
11517 SDValue Tmp = DAG.getNode(ISD::XOR, dl, VT, Op, Rotr16);
11518 Tmp = DAG.getNode(ISD::AND, dl, VT, Tmp,
11519 DAG.getConstant(0xFF00FFFF, dl, VT));
11520 Tmp = DAG.getNode(ISD::SRL, dl, VT, Tmp, DAG.getConstant(8, dl, SHVT));
11521 SDValue Rotr8 =
11522 DAG.getNode(ISD::ROTR, dl, VT, Op, DAG.getConstant(8, dl, SHVT));
11523 return DAG.getNode(ISD::XOR, dl, VT, Tmp, Rotr8);
11524 }
11525 Tmp4 = DAG.getNode(ISD::SHL, dl, VT, Op, DAG.getConstant(24, dl, SHVT));
11526 Tmp3 = DAG.getNode(ISD::AND, dl, VT, Op,
11527 DAG.getConstant(0xFF00, dl, VT));
11528 Tmp3 = DAG.getNode(ISD::SHL, dl, VT, Tmp3, DAG.getConstant(8, dl, SHVT));
11529 Tmp2 = DAG.getNode(ISD::SRL, dl, VT, Op, DAG.getConstant(8, dl, SHVT));
11530 Tmp2 = DAG.getNode(ISD::AND, dl, VT, Tmp2, DAG.getConstant(0xFF00, dl, VT));
11531 Tmp1 = DAG.getNode(ISD::SRL, dl, VT, Op, DAG.getConstant(24, dl, SHVT));
11532 Tmp4 = DAG.getNode(ISD::OR, dl, VT, Tmp4, Tmp3);
11533 Tmp2 = DAG.getNode(ISD::OR, dl, VT, Tmp2, Tmp1);
11534 return DAG.getNode(ISD::OR, dl, VT, Tmp4, Tmp2);
11535 case MVT::i64:
11536 Tmp8 = DAG.getNode(ISD::SHL, dl, VT, Op, DAG.getConstant(56, dl, SHVT));
11537 Tmp7 = DAG.getNode(ISD::AND, dl, VT, Op,
11538 DAG.getConstant(255ULL<<8, dl, VT));
11539 Tmp7 = DAG.getNode(ISD::SHL, dl, VT, Tmp7, DAG.getConstant(40, dl, SHVT));
11540 Tmp6 = DAG.getNode(ISD::AND, dl, VT, Op,
11541 DAG.getConstant(255ULL<<16, dl, VT));
11542 Tmp6 = DAG.getNode(ISD::SHL, dl, VT, Tmp6, DAG.getConstant(24, dl, SHVT));
11543 Tmp5 = DAG.getNode(ISD::AND, dl, VT, Op,
11544 DAG.getConstant(255ULL<<24, dl, VT));
11545 Tmp5 = DAG.getNode(ISD::SHL, dl, VT, Tmp5, DAG.getConstant(8, dl, SHVT));
11546 Tmp4 = DAG.getNode(ISD::SRL, dl, VT, Op, DAG.getConstant(8, dl, SHVT));
11547 Tmp4 = DAG.getNode(ISD::AND, dl, VT, Tmp4,
11548 DAG.getConstant(255ULL<<24, dl, VT));
11549 Tmp3 = DAG.getNode(ISD::SRL, dl, VT, Op, DAG.getConstant(24, dl, SHVT));
11550 Tmp3 = DAG.getNode(ISD::AND, dl, VT, Tmp3,
11551 DAG.getConstant(255ULL<<16, dl, VT));
11552 Tmp2 = DAG.getNode(ISD::SRL, dl, VT, Op, DAG.getConstant(40, dl, SHVT));
11553 Tmp2 = DAG.getNode(ISD::AND, dl, VT, Tmp2,
11554 DAG.getConstant(255ULL<<8, dl, VT));
11555 Tmp1 = DAG.getNode(ISD::SRL, dl, VT, Op, DAG.getConstant(56, dl, SHVT));
11556 Tmp8 = DAG.getNode(ISD::OR, dl, VT, Tmp8, Tmp7);
11557 Tmp6 = DAG.getNode(ISD::OR, dl, VT, Tmp6, Tmp5);
11558 Tmp4 = DAG.getNode(ISD::OR, dl, VT, Tmp4, Tmp3);
11559 Tmp2 = DAG.getNode(ISD::OR, dl, VT, Tmp2, Tmp1);
11560 Tmp8 = DAG.getNode(ISD::OR, dl, VT, Tmp8, Tmp6);
11561 Tmp4 = DAG.getNode(ISD::OR, dl, VT, Tmp4, Tmp2);
11562 return DAG.getNode(ISD::OR, dl, VT, Tmp8, Tmp4);
11563 }
11564}
11565
11567 SDLoc dl(N);
11568 EVT VT = N->getValueType(0);
11569 SDValue Op = N->getOperand(0);
11570 EVT SHVT = getShiftAmountTy(VT, DAG.getDataLayout());
11571 unsigned Sz = VT.getScalarSizeInBits();
11572
11573 SDValue Tmp, Tmp2, Tmp3;
11574
11575 // If we can, perform BSWAP first and then the mask+swap the i4, then i2
11576 // and finally the i1 pairs.
11577 // TODO: We can easily support i4/i2 legal types if any target ever does.
11578 if (Sz >= 8 && isPowerOf2_32(Sz)) {
11579 // Create the masks - repeating the pattern every byte.
11580 APInt Mask4 = APInt::getSplat(Sz, APInt(8, 0x0F));
11581 APInt Mask2 = APInt::getSplat(Sz, APInt(8, 0x33));
11582 APInt Mask1 = APInt::getSplat(Sz, APInt(8, 0x55));
11583
11584 // BSWAP if the type is wider than a single byte.
11585 Tmp = (Sz > 8 ? DAG.getNode(ISD::BSWAP, dl, VT, Op) : Op);
11586
11587 // swap i4: ((V >> 4) & 0x0F) | ((V & 0x0F) << 4)
11588 Tmp2 = DAG.getNode(ISD::SRL, dl, VT, Tmp, DAG.getConstant(4, dl, SHVT));
11589 Tmp2 = DAG.getNode(ISD::AND, dl, VT, Tmp2, DAG.getConstant(Mask4, dl, VT));
11590 Tmp3 = DAG.getNode(ISD::AND, dl, VT, Tmp, DAG.getConstant(Mask4, dl, VT));
11591 Tmp3 = DAG.getNode(ISD::SHL, dl, VT, Tmp3, DAG.getConstant(4, dl, SHVT));
11592 Tmp = DAG.getNode(ISD::OR, dl, VT, Tmp2, Tmp3);
11593
11594 // swap i2: ((V >> 2) & 0x33) | ((V & 0x33) << 2)
11595 Tmp2 = DAG.getNode(ISD::SRL, dl, VT, Tmp, DAG.getConstant(2, dl, SHVT));
11596 Tmp2 = DAG.getNode(ISD::AND, dl, VT, Tmp2, DAG.getConstant(Mask2, dl, VT));
11597 Tmp3 = DAG.getNode(ISD::AND, dl, VT, Tmp, DAG.getConstant(Mask2, dl, VT));
11598 Tmp3 = DAG.getNode(ISD::SHL, dl, VT, Tmp3, DAG.getConstant(2, dl, SHVT));
11599 Tmp = DAG.getNode(ISD::OR, dl, VT, Tmp2, Tmp3);
11600
11601 // swap i1: ((V >> 1) & 0x55) | ((V & 0x55) << 1)
11602 Tmp2 = DAG.getNode(ISD::SRL, dl, VT, Tmp, DAG.getConstant(1, dl, SHVT));
11603 Tmp2 = DAG.getNode(ISD::AND, dl, VT, Tmp2, DAG.getConstant(Mask1, dl, VT));
11604 Tmp3 = DAG.getNode(ISD::AND, dl, VT, Tmp, DAG.getConstant(Mask1, dl, VT));
11605 Tmp3 = DAG.getNode(ISD::SHL, dl, VT, Tmp3, DAG.getConstant(1, dl, SHVT));
11606 Tmp = DAG.getNode(ISD::OR, dl, VT, Tmp2, Tmp3);
11607 return Tmp;
11608 }
11609
11610 Tmp = DAG.getConstant(0, dl, VT);
11611 for (unsigned I = 0, J = Sz-1; I < Sz; ++I, --J) {
11612 if (I < J)
11613 Tmp2 =
11614 DAG.getNode(ISD::SHL, dl, VT, Op, DAG.getConstant(J - I, dl, SHVT));
11615 else
11616 Tmp2 =
11617 DAG.getNode(ISD::SRL, dl, VT, Op, DAG.getConstant(I - J, dl, SHVT));
11618
11619 APInt Shift = APInt::getOneBitSet(Sz, J);
11620 Tmp2 = DAG.getNode(ISD::AND, dl, VT, Tmp2, DAG.getConstant(Shift, dl, VT));
11621 Tmp = DAG.getNode(ISD::OR, dl, VT, Tmp, Tmp2);
11622 }
11623
11624 return Tmp;
11625}
11626
11627std::pair<SDValue, SDValue>
11629 SelectionDAG &DAG) const {
11630 SDLoc SL(LD);
11631 SDValue Chain = LD->getChain();
11632 SDValue BasePTR = LD->getBasePtr();
11633 EVT SrcVT = LD->getMemoryVT();
11634 EVT DstVT = LD->getValueType(0);
11635 ISD::LoadExtType ExtType = LD->getExtensionType();
11636
11637 if (SrcVT.isScalableVector())
11638 report_fatal_error("Cannot scalarize scalable vector loads");
11639
11640 unsigned NumElem = SrcVT.getVectorNumElements();
11641
11642 EVT SrcEltVT = SrcVT.getScalarType();
11643 EVT DstEltVT = DstVT.getScalarType();
11644
11645 // A vector must always be stored in memory as-is, i.e. without any padding
11646 // between the elements, since various code depend on it, e.g. in the
11647 // handling of a bitcast of a vector type to int, which may be done with a
11648 // vector store followed by an integer load. A vector that does not have
11649 // elements that are byte-sized must therefore be stored as an integer
11650 // built out of the extracted vector elements.
11651 if (!SrcEltVT.isByteSized()) {
11652 unsigned NumLoadBits = SrcVT.getStoreSizeInBits();
11653 EVT LoadVT = EVT::getIntegerVT(*DAG.getContext(), NumLoadBits);
11654
11655 unsigned NumSrcBits = SrcVT.getSizeInBits();
11656 EVT SrcIntVT = EVT::getIntegerVT(*DAG.getContext(), NumSrcBits);
11657
11658 unsigned SrcEltBits = SrcEltVT.getSizeInBits();
11659 SDValue SrcEltBitMask = DAG.getConstant(
11660 APInt::getLowBitsSet(NumLoadBits, SrcEltBits), SL, LoadVT);
11661
11662 // Load the whole vector and avoid masking off the top bits as it makes
11663 // the codegen worse.
11664 SDValue Load =
11665 DAG.getExtLoad(ISD::EXTLOAD, SL, LoadVT, Chain, BasePTR,
11666 LD->getPointerInfo(), SrcIntVT, LD->getBaseAlign(),
11667 LD->getMemOperand()->getFlags(), LD->getAAInfo());
11668
11670 for (unsigned Idx = 0; Idx < NumElem; ++Idx) {
11671 unsigned ShiftIntoIdx =
11672 (DAG.getDataLayout().isBigEndian() ? (NumElem - 1) - Idx : Idx);
11673 SDValue ShiftAmount = DAG.getShiftAmountConstant(
11674 ShiftIntoIdx * SrcEltVT.getSizeInBits(), LoadVT, SL);
11675 SDValue ShiftedElt = DAG.getNode(ISD::SRL, SL, LoadVT, Load, ShiftAmount);
11676 SDValue Elt =
11677 DAG.getNode(ISD::AND, SL, LoadVT, ShiftedElt, SrcEltBitMask);
11678 SDValue Scalar = DAG.getNode(ISD::TRUNCATE, SL, SrcEltVT, Elt);
11679
11680 if (ExtType != ISD::NON_EXTLOAD) {
11681 unsigned ExtendOp = ISD::getExtForLoadExtType(false, ExtType);
11682 Scalar = DAG.getNode(ExtendOp, SL, DstEltVT, Scalar);
11683 }
11684
11685 Vals.push_back(Scalar);
11686 }
11687
11688 SDValue Value = DAG.getBuildVector(DstVT, SL, Vals);
11689 return std::make_pair(Value, Load.getValue(1));
11690 }
11691
11692 unsigned Stride = SrcEltVT.getSizeInBits() / 8;
11693 assert(SrcEltVT.isByteSized());
11694
11696 SmallVector<SDValue, 8> LoadChains;
11697
11698 for (unsigned Idx = 0; Idx < NumElem; ++Idx) {
11699 SDValue ScalarLoad = DAG.getExtLoad(
11700 ExtType, SL, DstEltVT, Chain, BasePTR,
11701 LD->getPointerInfo().getWithOffset(Idx * Stride), SrcEltVT,
11702 LD->getBaseAlign(), LD->getMemOperand()->getFlags(), LD->getAAInfo());
11703
11704 BasePTR = DAG.getObjectPtrOffset(SL, BasePTR, TypeSize::getFixed(Stride));
11705
11706 Vals.push_back(ScalarLoad.getValue(0));
11707 LoadChains.push_back(ScalarLoad.getValue(1));
11708 }
11709
11710 SDValue NewChain = DAG.getNode(ISD::TokenFactor, SL, MVT::Other, LoadChains);
11711 SDValue Value = DAG.getBuildVector(DstVT, SL, Vals);
11712
11713 return std::make_pair(Value, NewChain);
11714}
11715
11717 SelectionDAG &DAG) const {
11718 SDLoc SL(ST);
11719
11720 SDValue Chain = ST->getChain();
11721 SDValue BasePtr = ST->getBasePtr();
11722 SDValue Value = ST->getValue();
11723 EVT StVT = ST->getMemoryVT();
11724
11725 if (StVT.isScalableVector())
11726 report_fatal_error("Cannot scalarize scalable vector stores");
11727
11728 // The type of the data we want to save
11729 EVT RegVT = Value.getValueType();
11730 EVT RegSclVT = RegVT.getScalarType();
11731
11732 // The type of data as saved in memory.
11733 EVT MemSclVT = StVT.getScalarType();
11734
11735 unsigned NumElem = StVT.getVectorNumElements();
11736
11737 // A vector must always be stored in memory as-is, i.e. without any padding
11738 // between the elements, since various code depend on it, e.g. in the
11739 // handling of a bitcast of a vector type to int, which may be done with a
11740 // vector store followed by an integer load. A vector that does not have
11741 // elements that are byte-sized must therefore be stored as an integer
11742 // built out of the extracted vector elements.
11743 if (!MemSclVT.isByteSized()) {
11744 unsigned NumBits = StVT.getSizeInBits();
11745 EVT IntVT = EVT::getIntegerVT(*DAG.getContext(), NumBits);
11746
11747 SDValue CurrVal = DAG.getConstant(0, SL, IntVT);
11748
11749 for (unsigned Idx = 0; Idx < NumElem; ++Idx) {
11750 SDValue Elt = DAG.getExtractVectorElt(SL, RegSclVT, Value, Idx);
11751 SDValue Trunc = DAG.getNode(ISD::TRUNCATE, SL, MemSclVT, Elt);
11752 SDValue ExtElt = DAG.getNode(ISD::ZERO_EXTEND, SL, IntVT, Trunc);
11753 unsigned ShiftIntoIdx =
11754 (DAG.getDataLayout().isBigEndian() ? (NumElem - 1) - Idx : Idx);
11755 SDValue ShiftAmount =
11756 DAG.getConstant(ShiftIntoIdx * MemSclVT.getSizeInBits(), SL, IntVT);
11757 SDValue ShiftedElt =
11758 DAG.getNode(ISD::SHL, SL, IntVT, ExtElt, ShiftAmount);
11759 CurrVal = DAG.getNode(ISD::OR, SL, IntVT, CurrVal, ShiftedElt);
11760 }
11761
11762 return DAG.getStore(Chain, SL, CurrVal, BasePtr, ST->getPointerInfo(),
11763 ST->getBaseAlign(), ST->getMemOperand()->getFlags(),
11764 ST->getAAInfo());
11765 }
11766
11767 // Store Stride in bytes
11768 unsigned Stride = MemSclVT.getSizeInBits() / 8;
11769 assert(Stride && "Zero stride!");
11770 // Extract each of the elements from the original vector and save them into
11771 // memory individually.
11773 for (unsigned Idx = 0; Idx < NumElem; ++Idx) {
11774 SDValue Elt = DAG.getExtractVectorElt(SL, RegSclVT, Value, Idx);
11775
11776 SDValue Ptr =
11777 DAG.getObjectPtrOffset(SL, BasePtr, TypeSize::getFixed(Idx * Stride));
11778
11779 // This scalar TruncStore may be illegal, but we legalize it later.
11781 Chain, SL, Elt, Ptr, ST->getPointerInfo().getWithOffset(Idx * Stride),
11782 MemSclVT, ST->getBaseAlign(), ST->getMemOperand()->getFlags(),
11783 ST->getAAInfo());
11784
11785 Stores.push_back(Store);
11786 }
11787
11788 return DAG.getNode(ISD::TokenFactor, SL, MVT::Other, Stores);
11789}
11790
11791std::pair<SDValue, SDValue>
11793 assert(LD->getAddressingMode() == ISD::UNINDEXED &&
11794 "unaligned indexed loads not implemented!");
11795 SDValue Chain = LD->getChain();
11796 SDValue Ptr = LD->getBasePtr();
11797 EVT VT = LD->getValueType(0);
11798 EVT LoadedVT = LD->getMemoryVT();
11799 SDLoc dl(LD);
11800 auto &MF = DAG.getMachineFunction();
11801
11802 if (VT.isFloatingPoint() || VT.isVector()) {
11803 EVT intVT = EVT::getIntegerVT(*DAG.getContext(), LoadedVT.getSizeInBits());
11804 if (isTypeLegal(intVT) && isTypeLegal(LoadedVT)) {
11805 if (!isOperationLegalOrCustom(ISD::LOAD, intVT) &&
11806 LoadedVT.isVector()) {
11807 // Scalarize the load and let the individual components be handled.
11808 return scalarizeVectorLoad(LD, DAG);
11809 }
11810
11811 // Expand to a (misaligned) integer load of the same size,
11812 // then bitconvert to floating point or vector.
11813 SDValue newLoad = DAG.getLoad(intVT, dl, Chain, Ptr,
11814 LD->getMemOperand());
11815 SDValue Result = DAG.getNode(ISD::BITCAST, dl, LoadedVT, newLoad);
11816 if (LoadedVT != VT)
11817 Result = DAG.getNode(VT.isFloatingPoint() ? ISD::FP_EXTEND :
11818 ISD::ANY_EXTEND, dl, VT, Result);
11819
11820 return std::make_pair(Result, newLoad.getValue(1));
11821 }
11822
11823 // Copy the value to a (aligned) stack slot using (unaligned) integer
11824 // loads and stores, then do a (aligned) load from the stack slot.
11825 MVT RegVT = getRegisterType(*DAG.getContext(), intVT);
11826 unsigned LoadedBytes = LoadedVT.getStoreSize();
11827 unsigned RegBytes = RegVT.getSizeInBits() / 8;
11828 unsigned NumRegs = (LoadedBytes + RegBytes - 1) / RegBytes;
11829
11830 // Make sure the stack slot is also aligned for the register type.
11831 SDValue StackBase = DAG.CreateStackTemporary(LoadedVT, RegVT);
11832 auto FrameIndex = cast<FrameIndexSDNode>(StackBase.getNode())->getIndex();
11834 SDValue StackPtr = StackBase;
11835 unsigned Offset = 0;
11836
11837 EVT PtrVT = Ptr.getValueType();
11838 EVT StackPtrVT = StackPtr.getValueType();
11839
11840 SDValue PtrIncrement = DAG.getConstant(RegBytes, dl, PtrVT);
11841 SDValue StackPtrIncrement = DAG.getConstant(RegBytes, dl, StackPtrVT);
11842
11843 // Do all but one copies using the full register width.
11844 for (unsigned i = 1; i < NumRegs; i++) {
11845 // Load one integer register's worth from the original location.
11846 SDValue Load = DAG.getLoad(
11847 RegVT, dl, Chain, Ptr, LD->getPointerInfo().getWithOffset(Offset),
11848 LD->getBaseAlign(), LD->getMemOperand()->getFlags(), LD->getAAInfo());
11849 // Follow the load with a store to the stack slot. Remember the store.
11850 Stores.push_back(DAG.getStore(
11851 Load.getValue(1), dl, Load, StackPtr,
11852 MachinePointerInfo::getFixedStack(MF, FrameIndex, Offset)));
11853 // Increment the pointers.
11854 Offset += RegBytes;
11855
11856 Ptr = DAG.getObjectPtrOffset(dl, Ptr, PtrIncrement);
11857 StackPtr = DAG.getObjectPtrOffset(dl, StackPtr, StackPtrIncrement);
11858 }
11859
11860 // The last copy may be partial. Do an extending load.
11861 EVT MemVT = EVT::getIntegerVT(*DAG.getContext(),
11862 8 * (LoadedBytes - Offset));
11863 SDValue Load = DAG.getExtLoad(
11864 ISD::EXTLOAD, dl, RegVT, Chain, Ptr,
11865 LD->getPointerInfo().getWithOffset(Offset), MemVT, LD->getBaseAlign(),
11866 LD->getMemOperand()->getFlags(), LD->getAAInfo());
11867 // Follow the load with a store to the stack slot. Remember the store.
11868 // On big-endian machines this requires a truncating store to ensure
11869 // that the bits end up in the right place.
11870 Stores.push_back(DAG.getTruncStore(
11871 Load.getValue(1), dl, Load, StackPtr,
11872 MachinePointerInfo::getFixedStack(MF, FrameIndex, Offset), MemVT));
11873
11874 // The order of the stores doesn't matter - say it with a TokenFactor.
11875 SDValue TF = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Stores);
11876
11877 // Finally, perform the original load only redirected to the stack slot.
11878 Load = DAG.getExtLoad(LD->getExtensionType(), dl, VT, TF, StackBase,
11879 MachinePointerInfo::getFixedStack(MF, FrameIndex, 0),
11880 LoadedVT);
11881
11882 // Callers expect a MERGE_VALUES node.
11883 return std::make_pair(Load, TF);
11884 }
11885
11886 assert(LoadedVT.isInteger() && !LoadedVT.isVector() &&
11887 "Unaligned load of unsupported type.");
11888
11889 // Compute the new VT that is half the size of the old one. This is an
11890 // integer MVT.
11891 unsigned NumBits = LoadedVT.getSizeInBits();
11892 EVT NewLoadedVT;
11893 NewLoadedVT = EVT::getIntegerVT(*DAG.getContext(), NumBits/2);
11894 NumBits >>= 1;
11895
11896 Align Alignment = LD->getBaseAlign();
11897 unsigned IncrementSize = NumBits / 8;
11898 ISD::LoadExtType HiExtType = LD->getExtensionType();
11899
11900 // If the original load is NON_EXTLOAD, the hi part load must be ZEXTLOAD.
11901 if (HiExtType == ISD::NON_EXTLOAD)
11902 HiExtType = ISD::ZEXTLOAD;
11903
11904 // Load the value in two parts
11905 SDValue Lo, Hi;
11906 if (DAG.getDataLayout().isLittleEndian()) {
11907 Lo = DAG.getExtLoad(ISD::ZEXTLOAD, dl, VT, Chain, Ptr, LD->getPointerInfo(),
11908 NewLoadedVT, Alignment, LD->getMemOperand()->getFlags(),
11909 LD->getAAInfo());
11910
11911 Ptr = DAG.getObjectPtrOffset(dl, Ptr, TypeSize::getFixed(IncrementSize));
11912 Hi = DAG.getExtLoad(HiExtType, dl, VT, Chain, Ptr,
11913 LD->getPointerInfo().getWithOffset(IncrementSize),
11914 NewLoadedVT, Alignment, LD->getMemOperand()->getFlags(),
11915 LD->getAAInfo());
11916 } else {
11917 Hi = DAG.getExtLoad(HiExtType, dl, VT, Chain, Ptr, LD->getPointerInfo(),
11918 NewLoadedVT, Alignment, LD->getMemOperand()->getFlags(),
11919 LD->getAAInfo());
11920
11921 Ptr = DAG.getObjectPtrOffset(dl, Ptr, TypeSize::getFixed(IncrementSize));
11922 Lo = DAG.getExtLoad(ISD::ZEXTLOAD, dl, VT, Chain, Ptr,
11923 LD->getPointerInfo().getWithOffset(IncrementSize),
11924 NewLoadedVT, Alignment, LD->getMemOperand()->getFlags(),
11925 LD->getAAInfo());
11926 }
11927
11928 // aggregate the two parts
11929 SDValue ShiftAmount = DAG.getShiftAmountConstant(NumBits, VT, dl);
11930 SDValue Result = DAG.getNode(ISD::SHL, dl, VT, Hi, ShiftAmount);
11931 Result = DAG.getNode(ISD::OR, dl, VT, Result, Lo);
11932
11933 SDValue TF = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Lo.getValue(1),
11934 Hi.getValue(1));
11935
11936 return std::make_pair(Result, TF);
11937}
11938
11940 SelectionDAG &DAG) const {
11941 assert(ST->getAddressingMode() == ISD::UNINDEXED &&
11942 "unaligned indexed stores not implemented!");
11943 SDValue Chain = ST->getChain();
11944 SDValue Ptr = ST->getBasePtr();
11945 SDValue Val = ST->getValue();
11946 EVT VT = Val.getValueType();
11947 Align Alignment = ST->getBaseAlign();
11948 auto &MF = DAG.getMachineFunction();
11949 EVT StoreMemVT = ST->getMemoryVT();
11950
11951 SDLoc dl(ST);
11952 if (StoreMemVT.isFloatingPoint() || StoreMemVT.isVector()) {
11953 EVT intVT = EVT::getIntegerVT(*DAG.getContext(), VT.getSizeInBits());
11954 if (isTypeLegal(intVT)) {
11955 if (!isOperationLegalOrCustom(ISD::STORE, intVT) &&
11956 StoreMemVT.isVector()) {
11957 // Scalarize the store and let the individual components be handled.
11958 SDValue Result = scalarizeVectorStore(ST, DAG);
11959 return Result;
11960 }
11961 // Expand to a bitconvert of the value to the integer type of the
11962 // same size, then a (misaligned) int store.
11963 // FIXME: Does not handle truncating floating point stores!
11964 SDValue Result = DAG.getNode(ISD::BITCAST, dl, intVT, Val);
11965 Result = DAG.getStore(Chain, dl, Result, Ptr, ST->getPointerInfo(),
11966 Alignment, ST->getMemOperand()->getFlags());
11967 return Result;
11968 }
11969 // Do a (aligned) store to a stack slot, then copy from the stack slot
11970 // to the final destination using (unaligned) integer loads and stores.
11971 MVT RegVT = getRegisterType(
11972 *DAG.getContext(),
11973 EVT::getIntegerVT(*DAG.getContext(), StoreMemVT.getSizeInBits()));
11974 EVT PtrVT = Ptr.getValueType();
11975 unsigned StoredBytes = StoreMemVT.getStoreSize();
11976 unsigned RegBytes = RegVT.getSizeInBits() / 8;
11977 unsigned NumRegs = (StoredBytes + RegBytes - 1) / RegBytes;
11978
11979 // Make sure the stack slot is also aligned for the register type.
11980 SDValue StackPtr = DAG.CreateStackTemporary(StoreMemVT, RegVT);
11981 auto FrameIndex = cast<FrameIndexSDNode>(StackPtr.getNode())->getIndex();
11982
11983 // Perform the original store, only redirected to the stack slot.
11985 Chain, dl, Val, StackPtr,
11986 MachinePointerInfo::getFixedStack(MF, FrameIndex, 0), StoreMemVT);
11987
11988 EVT StackPtrVT = StackPtr.getValueType();
11989
11990 SDValue PtrIncrement = DAG.getConstant(RegBytes, dl, PtrVT);
11991 SDValue StackPtrIncrement = DAG.getConstant(RegBytes, dl, StackPtrVT);
11993 unsigned Offset = 0;
11994
11995 // Do all but one copies using the full register width.
11996 for (unsigned i = 1; i < NumRegs; i++) {
11997 // Load one integer register's worth from the stack slot.
11998 SDValue Load = DAG.getLoad(
11999 RegVT, dl, Store, StackPtr,
12000 MachinePointerInfo::getFixedStack(MF, FrameIndex, Offset));
12001 // Store it to the final location. Remember the store.
12002 Stores.push_back(DAG.getStore(Load.getValue(1), dl, Load, Ptr,
12003 ST->getPointerInfo().getWithOffset(Offset),
12004 ST->getBaseAlign(),
12005 ST->getMemOperand()->getFlags()));
12006 // Increment the pointers.
12007 Offset += RegBytes;
12008 StackPtr = DAG.getObjectPtrOffset(dl, StackPtr, StackPtrIncrement);
12009 Ptr = DAG.getObjectPtrOffset(dl, Ptr, PtrIncrement);
12010 }
12011
12012 // The last store may be partial. Do a truncating store. On big-endian
12013 // machines this requires an extending load from the stack slot to ensure
12014 // that the bits are in the right place.
12015 EVT LoadMemVT =
12016 EVT::getIntegerVT(*DAG.getContext(), 8 * (StoredBytes - Offset));
12017
12018 // Load from the stack slot.
12019 SDValue Load = DAG.getExtLoad(
12020 ISD::EXTLOAD, dl, RegVT, Store, StackPtr,
12021 MachinePointerInfo::getFixedStack(MF, FrameIndex, Offset), LoadMemVT);
12022
12023 Stores.push_back(DAG.getTruncStore(
12024 Load.getValue(1), dl, Load, Ptr,
12025 ST->getPointerInfo().getWithOffset(Offset), LoadMemVT,
12026 ST->getBaseAlign(), ST->getMemOperand()->getFlags(), ST->getAAInfo()));
12027 // The order of the stores doesn't matter - say it with a TokenFactor.
12028 SDValue Result = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Stores);
12029 return Result;
12030 }
12031
12032 assert(StoreMemVT.isInteger() && !StoreMemVT.isVector() &&
12033 "Unaligned store of unknown type.");
12034 // Get the half-size VT
12035 EVT NewStoredVT = StoreMemVT.getHalfSizedIntegerVT(*DAG.getContext());
12036 unsigned NumBits = NewStoredVT.getFixedSizeInBits();
12037 unsigned IncrementSize = NumBits / 8;
12038
12039 // Divide the stored value in two parts.
12040 SDValue ShiftAmount =
12041 DAG.getShiftAmountConstant(NumBits, Val.getValueType(), dl);
12042 SDValue Lo = Val;
12043 // If Val is a constant, replace the upper bits with 0. The SRL will constant
12044 // fold and not use the upper bits. A smaller constant may be easier to
12045 // materialize.
12046 if (auto *C = dyn_cast<ConstantSDNode>(Lo); C && !C->isOpaque())
12047 Lo = DAG.getNode(
12048 ISD::AND, dl, VT, Lo,
12049 DAG.getConstant(APInt::getLowBitsSet(VT.getSizeInBits(), NumBits), dl,
12050 VT));
12051 SDValue Hi = DAG.getNode(ISD::SRL, dl, VT, Val, ShiftAmount);
12052
12053 // Store the two parts
12054 SDValue Store1, Store2;
12055 Store1 = DAG.getTruncStore(Chain, dl,
12056 DAG.getDataLayout().isLittleEndian() ? Lo : Hi,
12057 Ptr, ST->getPointerInfo(), NewStoredVT, Alignment,
12058 ST->getMemOperand()->getFlags());
12059
12060 Ptr = DAG.getObjectPtrOffset(dl, Ptr, TypeSize::getFixed(IncrementSize));
12061 Store2 = DAG.getTruncStore(
12062 Chain, dl, DAG.getDataLayout().isLittleEndian() ? Hi : Lo, Ptr,
12063 ST->getPointerInfo().getWithOffset(IncrementSize), NewStoredVT, Alignment,
12064 ST->getMemOperand()->getFlags(), ST->getAAInfo());
12065
12066 SDValue Result =
12067 DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Store1, Store2);
12068 return Result;
12069}
12070
12071SDValue
12073 const SDLoc &DL, EVT DataVT,
12074 SelectionDAG &DAG,
12075 bool IsCompressedMemory) const {
12077 EVT AddrVT = Addr.getValueType();
12078 EVT MaskVT = Mask.getValueType();
12079 assert(DataVT.getVectorElementCount() == MaskVT.getVectorElementCount() &&
12080 "Incompatible types of Data and Mask");
12081 if (IsCompressedMemory) {
12082 // Incrementing the pointer according to number of '1's in the mask.
12083 if (DataVT.isScalableVector()) {
12084 EVT MaskExtVT = MaskVT.changeElementType(*DAG.getContext(), MVT::i32);
12085 SDValue MaskExt = DAG.getNode(ISD::ZERO_EXTEND, DL, MaskExtVT, Mask);
12086 Increment = DAG.getNode(ISD::VECREDUCE_ADD, DL, MVT::i32, MaskExt);
12087 } else {
12088 EVT MaskIntVT =
12089 EVT::getIntegerVT(*DAG.getContext(), MaskVT.getSizeInBits());
12090 SDValue MaskInIntReg = DAG.getBitcast(MaskIntVT, Mask);
12091 if (MaskIntVT.getSizeInBits() < 32) {
12092 MaskInIntReg =
12093 DAG.getNode(ISD::ZERO_EXTEND, DL, MVT::i32, MaskInIntReg);
12094 MaskIntVT = MVT::i32;
12095 }
12096 Increment = DAG.getNode(ISD::CTPOP, DL, MaskIntVT, MaskInIntReg);
12097 }
12098 // Scale is an element size in bytes.
12099 SDValue Scale = DAG.getConstant(DataVT.getScalarSizeInBits() / 8, DL,
12100 AddrVT);
12101 Increment = DAG.getZExtOrTrunc(Increment, DL, AddrVT);
12102 Increment = DAG.getNode(ISD::MUL, DL, AddrVT, Increment, Scale);
12103 } else
12104 Increment = DAG.getTypeSize(DL, AddrVT, DataVT.getStoreSize());
12105
12106 return DAG.getNode(ISD::ADD, DL, AddrVT, Addr, Increment);
12107}
12108
12110 EVT VecVT, const SDLoc &dl,
12111 ElementCount SubEC) {
12112 assert(!(SubEC.isScalable() && VecVT.isFixedLengthVector()) &&
12113 "Cannot index a scalable vector within a fixed-width vector");
12114
12115 unsigned NElts = VecVT.getVectorMinNumElements();
12116 unsigned NumSubElts = SubEC.getKnownMinValue();
12117 EVT IdxVT = Idx.getValueType();
12118
12119 if (VecVT.isScalableVector() && !SubEC.isScalable()) {
12120 // If this is a constant index and we know the value plus the number of the
12121 // elements in the subvector minus one is less than the minimum number of
12122 // elements then it's safe to return Idx.
12123 if (auto *IdxCst = dyn_cast<ConstantSDNode>(Idx))
12124 if (IdxCst->getZExtValue() + (NumSubElts - 1) < NElts)
12125 return Idx;
12126 SDValue VS =
12127 DAG.getVScale(dl, IdxVT, APInt(IdxVT.getFixedSizeInBits(), NElts));
12128 unsigned SubOpcode = NumSubElts <= NElts ? ISD::SUB : ISD::USUBSAT;
12129 SDValue Sub = DAG.getNode(SubOpcode, dl, IdxVT, VS,
12130 DAG.getConstant(NumSubElts, dl, IdxVT));
12131 return DAG.getNode(ISD::UMIN, dl, IdxVT, Idx, Sub);
12132 }
12133 if (isPowerOf2_32(NElts) && NumSubElts == 1) {
12135 return DAG.getNode(ISD::AND, dl, IdxVT, Idx,
12136 DAG.getConstant(Imm, dl, IdxVT));
12137 }
12138 unsigned MaxIndex = NumSubElts < NElts ? NElts - NumSubElts : 0;
12139 return DAG.getNode(ISD::UMIN, dl, IdxVT, Idx,
12140 DAG.getConstant(MaxIndex, dl, IdxVT));
12141}
12142
12143SDValue
12145 EVT VecVT, SDValue Index,
12146 const SDNodeFlags PtrArithFlags) const {
12148 DAG, VecPtr, VecVT,
12150 Index, PtrArithFlags);
12151}
12152
12153SDValue
12155 EVT VecVT, EVT SubVecVT, SDValue Index,
12156 const SDNodeFlags PtrArithFlags) const {
12157 SDLoc dl(Index);
12158 // Make sure the index type is big enough to compute in.
12159 Index = DAG.getZExtOrTrunc(Index, dl, VecPtr.getValueType());
12160
12161 EVT EltVT = VecVT.getVectorElementType();
12162
12163 // Calculate the element offset and add it to the pointer.
12164 unsigned EltSize = EltVT.getFixedSizeInBits() / 8; // FIXME: should be ABI size.
12165 assert(EltSize * 8 == EltVT.getFixedSizeInBits() &&
12166 "Converting bits to bytes lost precision");
12167 assert(SubVecVT.getVectorElementType() == EltVT &&
12168 "Sub-vector must be a vector with matching element type");
12169 Index = clampDynamicVectorIndex(DAG, Index, VecVT, dl,
12170 SubVecVT.getVectorElementCount());
12171
12172 EVT IdxVT = Index.getValueType();
12173 if (SubVecVT.isScalableVector())
12174 Index =
12175 DAG.getNode(ISD::MUL, dl, IdxVT, Index,
12176 DAG.getVScale(dl, IdxVT, APInt(IdxVT.getSizeInBits(), 1)));
12177
12178 Index = DAG.getNode(ISD::MUL, dl, IdxVT, Index,
12179 DAG.getConstant(EltSize, dl, IdxVT));
12180 return DAG.getMemBasePlusOffset(VecPtr, Index, dl, PtrArithFlags);
12181}
12182
12183//===----------------------------------------------------------------------===//
12184// Implementation of Emulated TLS Model
12185//===----------------------------------------------------------------------===//
12186
12188 SelectionDAG &DAG) const {
12189 // Access to address of TLS varialbe xyz is lowered to a function call:
12190 // __emutls_get_address( address of global variable named "__emutls_v.xyz" )
12191 EVT PtrVT = getPointerTy(DAG.getDataLayout());
12192 PointerType *VoidPtrType = PointerType::get(*DAG.getContext(), 0);
12193 SDLoc dl(GA);
12194
12195 ArgListTy Args;
12196 const GlobalValue *GV =
12198 SmallString<32> NameString("__emutls_v.");
12199 NameString += GV->getName();
12200 StringRef EmuTlsVarName(NameString);
12201 const GlobalVariable *EmuTlsVar =
12202 GV->getParent()->getNamedGlobal(EmuTlsVarName);
12203 assert(EmuTlsVar && "Cannot find EmuTlsVar ");
12204 Args.emplace_back(DAG.getGlobalAddress(EmuTlsVar, dl, PtrVT), VoidPtrType);
12205
12206 SDValue EmuTlsGetAddr = DAG.getExternalSymbol("__emutls_get_address", PtrVT);
12207
12209 CLI.setDebugLoc(dl).setChain(DAG.getEntryNode());
12210 CLI.setLibCallee(CallingConv::C, VoidPtrType, EmuTlsGetAddr, std::move(Args));
12211 std::pair<SDValue, SDValue> CallResult = LowerCallTo(CLI);
12212
12213 // TLSADDR will be codegen'ed as call. Inform MFI that function has calls.
12214 // At last for X86 targets, maybe good for other targets too?
12216 MFI.setAdjustsStack(true); // Is this only for X86 target?
12217 MFI.setHasCalls(true);
12218
12219 assert((GA->getOffset() == 0) &&
12220 "Emulated TLS must have zero offset in GlobalAddressSDNode");
12221 return CallResult.first;
12222}
12223
12225 SelectionDAG &DAG) const {
12226 assert((Op->getOpcode() == ISD::SETCC) && "Input has to be a SETCC node.");
12227 if (!isCtlzFast())
12228 return SDValue();
12229 ISD::CondCode CC = cast<CondCodeSDNode>(Op.getOperand(2))->get();
12230 SDLoc dl(Op);
12231 if (isNullConstant(Op.getOperand(1)) && CC == ISD::SETEQ) {
12232 EVT VT = Op.getOperand(0).getValueType();
12233 SDValue Zext = Op.getOperand(0);
12234 if (VT.bitsLT(MVT::i32)) {
12235 VT = MVT::i32;
12236 Zext = DAG.getNode(ISD::ZERO_EXTEND, dl, VT, Op.getOperand(0));
12237 }
12238 unsigned Log2b = Log2_32(VT.getSizeInBits());
12239 SDValue Clz = DAG.getNode(ISD::CTLZ, dl, VT, Zext);
12240 SDValue Scc = DAG.getNode(ISD::SRL, dl, VT, Clz,
12241 DAG.getConstant(Log2b, dl, MVT::i32));
12242 return DAG.getNode(ISD::TRUNCATE, dl, MVT::i32, Scc);
12243 }
12244 return SDValue();
12245}
12246
12248 SDValue Op0 = Node->getOperand(0);
12249 SDValue Op1 = Node->getOperand(1);
12250 EVT VT = Op0.getValueType();
12251 EVT BoolVT = getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
12252 unsigned Opcode = Node->getOpcode();
12253 SDLoc DL(Node);
12254
12255 // If both sign bits are zero, flip UMIN/UMAX <-> SMIN/SMAX if legal.
12256 unsigned AltOpcode = ISD::getOppositeSignednessMinMaxOpcode(Opcode);
12257 if (isOperationLegal(AltOpcode, VT) && DAG.SignBitIsZero(Op0) &&
12258 DAG.SignBitIsZero(Op1))
12259 return DAG.getNode(AltOpcode, DL, VT, Op0, Op1);
12260
12261 // umax(x,1) --> sub(x,cmpeq(x,0)) iff cmp result is allbits
12262 if (Opcode == ISD::UMAX && llvm::isOneOrOneSplat(Op1, true) && BoolVT == VT &&
12264 Op0 = DAG.getFreeze(Op0);
12265 SDValue Zero = DAG.getConstant(0, DL, VT);
12266 return DAG.getNode(ISD::SUB, DL, VT, Op0,
12267 DAG.getSetCC(DL, VT, Op0, Zero, ISD::SETEQ));
12268 }
12269
12270 // umin(x,y) -> sub(x,usubsat(x,y))
12271 // TODO: Missing freeze(Op0)?
12272 if (Opcode == ISD::UMIN && isOperationLegal(ISD::SUB, VT) &&
12274 return DAG.getNode(ISD::SUB, DL, VT, Op0,
12275 DAG.getNode(ISD::USUBSAT, DL, VT, Op0, Op1));
12276 }
12277
12278 // umax(x,y) -> add(x,usubsat(y,x))
12279 // TODO: Missing freeze(Op0)?
12280 if (Opcode == ISD::UMAX && isOperationLegal(ISD::ADD, VT) &&
12282 return DAG.getNode(ISD::ADD, DL, VT, Op0,
12283 DAG.getNode(ISD::USUBSAT, DL, VT, Op1, Op0));
12284 }
12285
12286 // FIXME: Should really try to split the vector in case it's legal on a
12287 // subvector.
12289 return DAG.UnrollVectorOp(Node);
12290
12291 // Attempt to find an existing SETCC node that we can reuse.
12292 // TODO: Do we need a generic doesSETCCNodeExist?
12293 // TODO: Missing freeze(Op0)/freeze(Op1)?
12294 auto buildMinMax = [&](ISD::CondCode PrefCC, ISD::CondCode AltCC,
12295 ISD::CondCode PrefCommuteCC,
12296 ISD::CondCode AltCommuteCC) {
12297 SDVTList BoolVTList = DAG.getVTList(BoolVT);
12298 for (ISD::CondCode CC : {PrefCC, AltCC}) {
12299 if (DAG.doesNodeExist(ISD::SETCC, BoolVTList,
12300 {Op0, Op1, DAG.getCondCode(CC)})) {
12301 SDValue Cond = DAG.getSetCC(DL, BoolVT, Op0, Op1, CC);
12302 return DAG.getSelect(DL, VT, Cond, Op0, Op1);
12303 }
12304 }
12305 for (ISD::CondCode CC : {PrefCommuteCC, AltCommuteCC}) {
12306 if (DAG.doesNodeExist(ISD::SETCC, BoolVTList,
12307 {Op0, Op1, DAG.getCondCode(CC)})) {
12308 SDValue Cond = DAG.getSetCC(DL, BoolVT, Op0, Op1, CC);
12309 return DAG.getSelect(DL, VT, Cond, Op1, Op0);
12310 }
12311 }
12312 SDValue Cond = DAG.getSetCC(DL, BoolVT, Op0, Op1, PrefCC);
12313 return DAG.getSelect(DL, VT, Cond, Op0, Op1);
12314 };
12315
12316 // Expand Y = MAX(A, B) -> Y = (A > B) ? A : B
12317 // -> Y = (A < B) ? B : A
12318 // -> Y = (A >= B) ? A : B
12319 // -> Y = (A <= B) ? B : A
12320 switch (Opcode) {
12321 case ISD::SMAX:
12322 return buildMinMax(ISD::SETGT, ISD::SETGE, ISD::SETLT, ISD::SETLE);
12323 case ISD::SMIN:
12324 return buildMinMax(ISD::SETLT, ISD::SETLE, ISD::SETGT, ISD::SETGE);
12325 case ISD::UMAX:
12326 return buildMinMax(ISD::SETUGT, ISD::SETUGE, ISD::SETULT, ISD::SETULE);
12327 case ISD::UMIN:
12328 return buildMinMax(ISD::SETULT, ISD::SETULE, ISD::SETUGT, ISD::SETUGE);
12329 }
12330
12331 llvm_unreachable("How did we get here?");
12332}
12333
12335 unsigned Opcode = Node->getOpcode();
12336 SDValue LHS = Node->getOperand(0);
12337 SDValue RHS = Node->getOperand(1);
12338 EVT VT = LHS.getValueType();
12339 SDLoc dl(Node);
12340
12341 assert(VT == RHS.getValueType() && "Expected operands to be the same type");
12342 assert(VT.isInteger() && "Expected operands to be integers");
12343
12344 // usub.sat(a, b) -> umax(a, b) - b
12345 if (Opcode == ISD::USUBSAT && isOperationLegal(ISD::UMAX, VT)) {
12346 SDValue Max = DAG.getNode(ISD::UMAX, dl, VT, LHS, RHS);
12347 return DAG.getNode(ISD::SUB, dl, VT, Max, RHS);
12348 }
12349
12350 // usub.sat(a, 1) -> sub(a, zext(a != 0))
12351 // Prefer this on targets without legal/cost-effective overflow-carry nodes.
12352 if (Opcode == ISD::USUBSAT && isOneOrOneSplat(RHS) &&
12354 LHS = DAG.getFreeze(LHS);
12355 SDValue Zero = DAG.getConstant(0, dl, VT);
12356 EVT BoolVT = getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
12357 SDValue IsNonZero = DAG.getSetCC(dl, BoolVT, LHS, Zero, ISD::SETNE);
12358 SDValue Subtrahend = DAG.getBoolExtOrTrunc(IsNonZero, dl, VT, BoolVT);
12359 Subtrahend =
12360 DAG.getNode(ISD::AND, dl, VT, Subtrahend, DAG.getConstant(1, dl, VT));
12361 return DAG.getNode(ISD::SUB, dl, VT, LHS, Subtrahend);
12362 }
12363
12364 // uadd.sat(a, b) -> umin(a, ~b) + b
12365 if (Opcode == ISD::UADDSAT && isOperationLegal(ISD::UMIN, VT)) {
12366 SDValue InvRHS = DAG.getNOT(dl, RHS, VT);
12367 SDValue Min = DAG.getNode(ISD::UMIN, dl, VT, LHS, InvRHS);
12368 return DAG.getNode(ISD::ADD, dl, VT, Min, RHS);
12369 }
12370
12371 unsigned OverflowOp;
12372 switch (Opcode) {
12373 case ISD::SADDSAT:
12374 OverflowOp = ISD::SADDO;
12375 break;
12376 case ISD::UADDSAT:
12377 OverflowOp = ISD::UADDO;
12378 break;
12379 case ISD::SSUBSAT:
12380 OverflowOp = ISD::SSUBO;
12381 break;
12382 case ISD::USUBSAT:
12383 OverflowOp = ISD::USUBO;
12384 break;
12385 default:
12386 llvm_unreachable("Expected method to receive signed or unsigned saturation "
12387 "addition or subtraction node.");
12388 }
12389
12390 // FIXME: Should really try to split the vector in case it's legal on a
12391 // subvector.
12393 return DAG.UnrollVectorOp(Node);
12394
12395 unsigned BitWidth = LHS.getScalarValueSizeInBits();
12396 EVT BoolVT = getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
12397 SDValue Result = DAG.getNode(OverflowOp, dl, DAG.getVTList(VT, BoolVT), LHS, RHS);
12398 SDValue SumDiff = Result.getValue(0);
12399 SDValue Overflow = Result.getValue(1);
12400 SDValue Zero = DAG.getConstant(0, dl, VT);
12401 SDValue AllOnes = DAG.getAllOnesConstant(dl, VT);
12402
12403 if (Opcode == ISD::UADDSAT) {
12405 // (LHS + RHS) | OverflowMask
12406 SDValue OverflowMask = DAG.getSExtOrTrunc(Overflow, dl, VT);
12407 return DAG.getNode(ISD::OR, dl, VT, SumDiff, OverflowMask);
12408 }
12409 // Overflow ? 0xffff.... : (LHS + RHS)
12410 return DAG.getSelect(dl, VT, Overflow, AllOnes, SumDiff);
12411 }
12412
12413 if (Opcode == ISD::USUBSAT) {
12415 // (LHS - RHS) & ~OverflowMask
12416 SDValue OverflowMask = DAG.getSExtOrTrunc(Overflow, dl, VT);
12417 SDValue Not = DAG.getNOT(dl, OverflowMask, VT);
12418 return DAG.getNode(ISD::AND, dl, VT, SumDiff, Not);
12419 }
12420 // Overflow ? 0 : (LHS - RHS)
12421 return DAG.getSelect(dl, VT, Overflow, Zero, SumDiff);
12422 }
12423
12424 assert((Opcode == ISD::SADDSAT || Opcode == ISD::SSUBSAT) &&
12425 "Expected signed saturating add/sub opcode");
12426
12427 const APInt MinVal = APInt::getSignedMinValue(BitWidth);
12428 const APInt MaxVal = APInt::getSignedMaxValue(BitWidth);
12429
12430 KnownBits KnownLHS = DAG.computeKnownBits(LHS);
12431 KnownBits KnownRHS = DAG.computeKnownBits(RHS);
12432
12433 // If either of the operand signs are known, then they are guaranteed to
12434 // only saturate in one direction. If non-negative they will saturate
12435 // towards SIGNED_MAX, if negative they will saturate towards SIGNED_MIN.
12436 //
12437 // In the case of ISD::SSUBSAT, 'x - y' is equivalent to 'x + (-y)', so the
12438 // sign of 'y' has to be flipped.
12439
12440 bool LHSIsNonNegative = KnownLHS.isNonNegative();
12441 bool RHSIsNonNegative =
12442 Opcode == ISD::SADDSAT ? KnownRHS.isNonNegative() : KnownRHS.isNegative();
12443 if (LHSIsNonNegative || RHSIsNonNegative) {
12444 SDValue SatMax = DAG.getConstant(MaxVal, dl, VT);
12445 return DAG.getSelect(dl, VT, Overflow, SatMax, SumDiff);
12446 }
12447
12448 bool LHSIsNegative = KnownLHS.isNegative();
12449 bool RHSIsNegative =
12450 Opcode == ISD::SADDSAT ? KnownRHS.isNegative() : KnownRHS.isNonNegative();
12451 if (LHSIsNegative || RHSIsNegative) {
12452 SDValue SatMin = DAG.getConstant(MinVal, dl, VT);
12453 return DAG.getSelect(dl, VT, Overflow, SatMin, SumDiff);
12454 }
12455
12456 // Overflow ? (SumDiff >> BW) ^ MinVal : SumDiff
12457 SDValue SatMin = DAG.getConstant(MinVal, dl, VT);
12458 SDValue Shift = DAG.getNode(ISD::SRA, dl, VT, SumDiff,
12459 DAG.getConstant(BitWidth - 1, dl, VT));
12460 Result = DAG.getNode(ISD::XOR, dl, VT, Shift, SatMin);
12461 return DAG.getSelect(dl, VT, Overflow, Result, SumDiff);
12462}
12463
12465 unsigned Opcode = Node->getOpcode();
12466 SDValue LHS = Node->getOperand(0);
12467 SDValue RHS = Node->getOperand(1);
12468 EVT VT = LHS.getValueType();
12469 EVT ResVT = Node->getValueType(0);
12470 EVT BoolVT = getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
12471 SDLoc dl(Node);
12472
12473 auto LTPredicate = (Opcode == ISD::UCMP ? ISD::SETULT : ISD::SETLT);
12474 auto GTPredicate = (Opcode == ISD::UCMP ? ISD::SETUGT : ISD::SETGT);
12475 SDValue IsLT = DAG.getSetCC(dl, BoolVT, LHS, RHS, LTPredicate);
12476 SDValue IsGT = DAG.getSetCC(dl, BoolVT, LHS, RHS, GTPredicate);
12477
12478 // We can't perform arithmetic on i1 values. Extending them would
12479 // probably result in worse codegen, so let's just use two selects instead.
12480 // Some targets are also just better off using selects rather than subtraction
12481 // because one of the conditions can be merged with one of the selects.
12482 // And finally, if we don't know the contents of high bits of a boolean value
12483 // we can't perform any arithmetic either.
12485 BoolVT.getScalarSizeInBits() == 1 ||
12487 SDValue SelectZeroOrOne =
12488 DAG.getSelect(dl, ResVT, IsGT, DAG.getConstant(1, dl, ResVT),
12489 DAG.getConstant(0, dl, ResVT));
12490 return DAG.getSelect(dl, ResVT, IsLT, DAG.getAllOnesConstant(dl, ResVT),
12491 SelectZeroOrOne);
12492 }
12493
12495 std::swap(IsGT, IsLT);
12496 return DAG.getSExtOrTrunc(DAG.getNode(ISD::SUB, dl, BoolVT, IsGT, IsLT), dl,
12497 ResVT);
12498}
12499
12501 unsigned Opcode = Node->getOpcode();
12502 bool IsSigned = Opcode == ISD::SSHLSAT;
12503 SDValue LHS = Node->getOperand(0);
12504 SDValue RHS = Node->getOperand(1);
12505 EVT VT = LHS.getValueType();
12506 SDLoc dl(Node);
12507
12508 assert((Node->getOpcode() == ISD::SSHLSAT ||
12509 Node->getOpcode() == ISD::USHLSAT) &&
12510 "Expected a SHLSAT opcode");
12511 assert(VT.isInteger() && "Expected operands to be integers");
12512
12514 return DAG.UnrollVectorOp(Node);
12515
12516 // If LHS != (LHS << RHS) >> RHS, we have overflow and must saturate.
12517
12518 unsigned BW = VT.getScalarSizeInBits();
12519 EVT BoolVT = getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
12520 SDValue Result = DAG.getNode(ISD::SHL, dl, VT, LHS, RHS);
12521 SDValue Orig =
12522 DAG.getNode(IsSigned ? ISD::SRA : ISD::SRL, dl, VT, Result, RHS);
12523
12524 SDValue SatVal;
12525 if (IsSigned) {
12526 SDValue SatMin = DAG.getConstant(APInt::getSignedMinValue(BW), dl, VT);
12527 SDValue SatMax = DAG.getConstant(APInt::getSignedMaxValue(BW), dl, VT);
12528 SDValue Cond =
12529 DAG.getSetCC(dl, BoolVT, LHS, DAG.getConstant(0, dl, VT), ISD::SETLT);
12530 SatVal = DAG.getSelect(dl, VT, Cond, SatMin, SatMax);
12531 } else {
12532 SatVal = DAG.getConstant(APInt::getMaxValue(BW), dl, VT);
12533 }
12534 SDValue Cond = DAG.getSetCC(dl, BoolVT, LHS, Orig, ISD::SETNE);
12535 return DAG.getSelect(dl, VT, Cond, SatVal, Result);
12536}
12537
12539 bool Signed, SDValue &Lo, SDValue &Hi,
12540 SDValue LHS, SDValue RHS,
12541 SDValue HiLHS, SDValue HiRHS) const {
12542 EVT VT = LHS.getValueType();
12543 assert(RHS.getValueType() == VT && "Mismatching operand types");
12544
12545 assert((HiLHS && HiRHS) || (!HiLHS && !HiRHS));
12546 assert((!Signed || !HiLHS) &&
12547 "Signed flag should only be set when HiLHS and RiRHS are null");
12548
12549 // We'll expand the multiplication by brute force because we have no other
12550 // options. This is a trivially-generalized version of the code from
12551 // Hacker's Delight (itself derived from Knuth's Algorithm M from section
12552 // 4.3.1). If Signed is set, we can use arithmetic right shifts to propagate
12553 // sign bits while calculating the Hi half.
12554 unsigned Bits = VT.getScalarSizeInBits();
12555 unsigned HalfBits = Bits / 2;
12556 SDValue Mask = DAG.getConstant(APInt::getLowBitsSet(Bits, HalfBits), dl, VT);
12557 SDValue LL = DAG.getNode(ISD::AND, dl, VT, LHS, Mask);
12558 SDValue RL = DAG.getNode(ISD::AND, dl, VT, RHS, Mask);
12559
12560 SDValue T = DAG.getNode(ISD::MUL, dl, VT, LL, RL);
12561 SDValue TL = DAG.getNode(ISD::AND, dl, VT, T, Mask);
12562
12563 SDValue Shift = DAG.getShiftAmountConstant(HalfBits, VT, dl);
12564 // This is always an unsigned shift.
12565 SDValue TH = DAG.getNode(ISD::SRL, dl, VT, T, Shift);
12566
12567 unsigned ShiftOpc = Signed ? ISD::SRA : ISD::SRL;
12568 SDValue LH = DAG.getNode(ShiftOpc, dl, VT, LHS, Shift);
12569 SDValue RH = DAG.getNode(ShiftOpc, dl, VT, RHS, Shift);
12570
12571 SDValue U =
12572 DAG.getNode(ISD::ADD, dl, VT, DAG.getNode(ISD::MUL, dl, VT, LH, RL), TH);
12573 SDValue UL = DAG.getNode(ISD::AND, dl, VT, U, Mask);
12574 SDValue UH = DAG.getNode(ShiftOpc, dl, VT, U, Shift);
12575
12576 SDValue V =
12577 DAG.getNode(ISD::ADD, dl, VT, DAG.getNode(ISD::MUL, dl, VT, LL, RH), UL);
12578 SDValue VH = DAG.getNode(ShiftOpc, dl, VT, V, Shift);
12579
12580 Lo = DAG.getNode(ISD::ADD, dl, VT, TL,
12581 DAG.getNode(ISD::SHL, dl, VT, V, Shift));
12582
12583 Hi = DAG.getNode(ISD::ADD, dl, VT, DAG.getNode(ISD::MUL, dl, VT, LH, RH),
12584 DAG.getNode(ISD::ADD, dl, VT, UH, VH));
12585
12586 // If HiLHS and HiRHS are set, multiply them by the opposite low part and add
12587 // the products to Hi.
12588 if (HiLHS) {
12589 SDValue RHLL = DAG.getNode(ISD::MUL, dl, VT, HiRHS, LHS);
12590 SDValue RLLH = DAG.getNode(ISD::MUL, dl, VT, RHS, HiLHS);
12591 Hi = DAG.getNode(ISD::ADD, dl, VT, Hi,
12592 DAG.getNode(ISD::ADD, dl, VT, RHLL, RLLH));
12593 }
12594}
12595
12597 bool Signed, const SDValue LHS,
12598 const SDValue RHS, SDValue &Lo,
12599 SDValue &Hi) const {
12600 EVT VT = LHS.getValueType();
12601 assert(RHS.getValueType() == VT && "Mismatching operand types");
12602 EVT WideVT = VT.widenIntegerElementType(*DAG.getContext());
12603 // We can fall back to a libcall with an illegal type for the MUL if we
12604 // have a libcall big enough.
12605 RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL;
12606 if (WideVT == MVT::i16)
12607 LC = RTLIB::MUL_I16;
12608 else if (WideVT == MVT::i32)
12609 LC = RTLIB::MUL_I32;
12610 else if (WideVT == MVT::i64)
12611 LC = RTLIB::MUL_I64;
12612 else if (WideVT == MVT::i128)
12613 LC = RTLIB::MUL_I128;
12614
12615 RTLIB::LibcallImpl LibcallImpl = getLibcallImpl(LC);
12616 if (LibcallImpl == RTLIB::Unsupported) {
12617 forceExpandMultiply(DAG, dl, Signed, Lo, Hi, LHS, RHS);
12618 return;
12619 }
12620
12621 SDValue HiLHS, HiRHS;
12622 if (Signed) {
12623 // The high part is obtained by SRA'ing all but one of the bits of low
12624 // part.
12625 unsigned LoSize = VT.getFixedSizeInBits();
12626 SDValue Shift = DAG.getShiftAmountConstant(LoSize - 1, VT, dl);
12627 HiLHS = DAG.getNode(ISD::SRA, dl, VT, LHS, Shift);
12628 HiRHS = DAG.getNode(ISD::SRA, dl, VT, RHS, Shift);
12629 } else {
12630 HiLHS = DAG.getConstant(0, dl, VT);
12631 HiRHS = DAG.getConstant(0, dl, VT);
12632 }
12633
12634 // Attempt a libcall.
12635 SDValue Ret;
12637 CallOptions.setIsSigned(Signed);
12638 CallOptions.setIsPostTypeLegalization(true);
12640 // Halves of WideVT are packed into registers in different order
12641 // depending on platform endianness. This is usually handled by
12642 // the C calling convention, but we can't defer to it in
12643 // the legalizer.
12644 SDValue Args[] = {LHS, HiLHS, RHS, HiRHS};
12645 Ret = makeLibCall(DAG, LC, WideVT, Args, CallOptions, dl).first;
12646 } else {
12647 SDValue Args[] = {HiLHS, LHS, HiRHS, RHS};
12648 Ret = makeLibCall(DAG, LC, WideVT, Args, CallOptions, dl).first;
12649 }
12651 "Ret value is a collection of constituent nodes holding result.");
12652 if (DAG.getDataLayout().isLittleEndian()) {
12653 // Same as above.
12654 Lo = Ret.getOperand(0);
12655 Hi = Ret.getOperand(1);
12656 } else {
12657 Lo = Ret.getOperand(1);
12658 Hi = Ret.getOperand(0);
12659 }
12660}
12661
12662SDValue
12664 assert((Node->getOpcode() == ISD::SMULFIX ||
12665 Node->getOpcode() == ISD::UMULFIX ||
12666 Node->getOpcode() == ISD::SMULFIXSAT ||
12667 Node->getOpcode() == ISD::UMULFIXSAT) &&
12668 "Expected a fixed point multiplication opcode");
12669
12670 SDLoc dl(Node);
12671 SDValue LHS = Node->getOperand(0);
12672 SDValue RHS = Node->getOperand(1);
12673 EVT VT = LHS.getValueType();
12674 unsigned Scale = Node->getConstantOperandVal(2);
12675 bool Saturating = (Node->getOpcode() == ISD::SMULFIXSAT ||
12676 Node->getOpcode() == ISD::UMULFIXSAT);
12677 bool Signed = (Node->getOpcode() == ISD::SMULFIX ||
12678 Node->getOpcode() == ISD::SMULFIXSAT);
12679 EVT BoolVT = getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
12680 unsigned VTSize = VT.getScalarSizeInBits();
12681
12682 if (!Scale) {
12683 // [us]mul.fix(a, b, 0) -> mul(a, b)
12684 if (!Saturating) {
12686 return DAG.getNode(ISD::MUL, dl, VT, LHS, RHS);
12687 } else if (Signed && isOperationLegalOrCustom(ISD::SMULO, VT)) {
12688 SDValue Result =
12689 DAG.getNode(ISD::SMULO, dl, DAG.getVTList(VT, BoolVT), LHS, RHS);
12690 SDValue Product = Result.getValue(0);
12691 SDValue Overflow = Result.getValue(1);
12692 SDValue Zero = DAG.getConstant(0, dl, VT);
12693
12694 APInt MinVal = APInt::getSignedMinValue(VTSize);
12695 APInt MaxVal = APInt::getSignedMaxValue(VTSize);
12696 SDValue SatMin = DAG.getConstant(MinVal, dl, VT);
12697 SDValue SatMax = DAG.getConstant(MaxVal, dl, VT);
12698 // Xor the inputs, if resulting sign bit is 0 the product will be
12699 // positive, else negative.
12700 SDValue Xor = DAG.getNode(ISD::XOR, dl, VT, LHS, RHS);
12701 SDValue ProdNeg = DAG.getSetCC(dl, BoolVT, Xor, Zero, ISD::SETLT);
12702 Result = DAG.getSelect(dl, VT, ProdNeg, SatMin, SatMax);
12703 return DAG.getSelect(dl, VT, Overflow, Result, Product);
12704 } else if (!Signed && isOperationLegalOrCustom(ISD::UMULO, VT)) {
12705 SDValue Result =
12706 DAG.getNode(ISD::UMULO, dl, DAG.getVTList(VT, BoolVT), LHS, RHS);
12707 SDValue Product = Result.getValue(0);
12708 SDValue Overflow = Result.getValue(1);
12709
12710 APInt MaxVal = APInt::getMaxValue(VTSize);
12711 SDValue SatMax = DAG.getConstant(MaxVal, dl, VT);
12712 return DAG.getSelect(dl, VT, Overflow, SatMax, Product);
12713 }
12714 }
12715
12716 assert(((Signed && Scale < VTSize) || (!Signed && Scale <= VTSize)) &&
12717 "Expected scale to be less than the number of bits if signed or at "
12718 "most the number of bits if unsigned.");
12719 assert(LHS.getValueType() == RHS.getValueType() &&
12720 "Expected both operands to be the same type");
12721
12722 // Select the saturated value when Cond0 <CC> Cond1, keeping it vectorized:
12723 // SELECT_CC is scalarized for vector types, so build SETCC + VSELECT there.
12724 auto getSaturatingSelect = [&](SDValue Cond0, SDValue Cond1, SDValue Sat,
12725 SDValue Val, ISD::CondCode CC) {
12726 if (VT.isVector())
12727 return DAG.getSelect(dl, VT, DAG.getSetCC(dl, BoolVT, Cond0, Cond1, CC),
12728 Sat, Val);
12729 return DAG.getSelectCC(dl, Cond0, Cond1, Sat, Val, CC);
12730 };
12731
12732 // Get the upper and lower bits of the result.
12733 SDValue Lo, Hi;
12734 unsigned LoHiOp = Signed ? ISD::SMUL_LOHI : ISD::UMUL_LOHI;
12735 unsigned HiOp = Signed ? ISD::MULHS : ISD::MULHU;
12736 EVT WideVT = VT.widenIntegerElementType(*DAG.getContext());
12737 if (isOperationLegalOrCustom(LoHiOp, VT)) {
12738 SDValue Result = DAG.getNode(LoHiOp, dl, DAG.getVTList(VT, VT), LHS, RHS);
12739 Lo = Result.getValue(0);
12740 Hi = Result.getValue(1);
12741 } else if (isOperationLegalOrCustom(HiOp, VT)) {
12742 Lo = DAG.getNode(ISD::MUL, dl, VT, LHS, RHS);
12743 Hi = DAG.getNode(HiOp, dl, VT, LHS, RHS);
12744 } else if (isOperationLegalOrCustom(ISD::MUL, WideVT)) {
12745 // Try for a multiplication using a wider type.
12746 unsigned Ext = Signed ? ISD::SIGN_EXTEND : ISD::ZERO_EXTEND;
12747 SDValue LHSExt = DAG.getNode(Ext, dl, WideVT, LHS);
12748 SDValue RHSExt = DAG.getNode(Ext, dl, WideVT, RHS);
12749 SDValue Res = DAG.getNode(ISD::MUL, dl, WideVT, LHSExt, RHSExt);
12750 Lo = DAG.getNode(ISD::TRUNCATE, dl, VT, Res);
12751 SDValue Shifted =
12752 DAG.getNode(ISD::SRA, dl, WideVT, Res,
12753 DAG.getShiftAmountConstant(VTSize, WideVT, dl));
12754 Hi = DAG.getNode(ISD::TRUNCATE, dl, VT, Shifted);
12755 } else if (VT.isVector()) {
12756 return SDValue();
12757 } else {
12758 forceExpandWideMUL(DAG, dl, Signed, LHS, RHS, Lo, Hi);
12759 }
12760
12761 if (Scale == VTSize)
12762 // Result is just the top half since we'd be shifting by the width of the
12763 // operand. Overflow impossible so this works for both UMULFIX and
12764 // UMULFIXSAT.
12765 return Hi;
12766
12767 // The result will need to be shifted right by the scale since both operands
12768 // are scaled. The result is given to us in 2 halves, so we only want part of
12769 // both in the result.
12770 SDValue Result = DAG.getNode(ISD::FSHR, dl, VT, Hi, Lo,
12771 DAG.getShiftAmountConstant(Scale, VT, dl));
12772 if (!Saturating)
12773 return Result;
12774
12775 if (!Signed) {
12776 // Unsigned overflow happened if the upper (VTSize - Scale) bits (of the
12777 // widened multiplication) aren't all zeroes.
12778
12779 // Saturate to max if ((Hi >> Scale) != 0),
12780 // which is the same as if (Hi > ((1 << Scale) - 1))
12781 APInt MaxVal = APInt::getMaxValue(VTSize);
12782 SDValue LowMask =
12783 DAG.getConstant(APInt::getLowBitsSet(VTSize, Scale), dl, VT);
12784 return getSaturatingSelect(Hi, LowMask, DAG.getConstant(MaxVal, dl, VT),
12785 Result, ISD::SETUGT);
12786 }
12787
12788 // Signed overflow happened if the upper (VTSize - Scale + 1) bits (of the
12789 // widened multiplication) aren't all ones or all zeroes.
12790
12791 SDValue SatMin = DAG.getConstant(APInt::getSignedMinValue(VTSize), dl, VT);
12792 SDValue SatMax = DAG.getConstant(APInt::getSignedMaxValue(VTSize), dl, VT);
12793
12794 if (Scale == 0) {
12795 SDValue Sign = DAG.getNode(ISD::SRA, dl, VT, Lo,
12796 DAG.getShiftAmountConstant(VTSize - 1, VT, dl));
12797 SDValue Overflow = DAG.getSetCC(dl, BoolVT, Hi, Sign, ISD::SETNE);
12798 // Saturated to SatMin if wide product is negative, and SatMax if wide
12799 // product is positive ...
12800 SDValue Zero = DAG.getConstant(0, dl, VT);
12801 SDValue ResultIfOverflow =
12802 getSaturatingSelect(Hi, Zero, SatMin, SatMax, ISD::SETLT);
12803 // ... but only if we overflowed.
12804 return DAG.getSelect(dl, VT, Overflow, ResultIfOverflow, Result);
12805 }
12806
12807 // We handled Scale==0 above so all the bits to examine is in Hi.
12808
12809 // Saturate to max if ((Hi >> (Scale - 1)) > 0),
12810 // which is the same as if (Hi > (1 << (Scale - 1)) - 1)
12811 SDValue LowMask =
12812 DAG.getConstant(APInt::getLowBitsSet(VTSize, Scale - 1), dl, VT);
12813 // Saturate to min if (Hi >> (Scale - 1)) < -1),
12814 // which is the same as if (HI < (-1 << (Scale - 1))
12815 SDValue HighMask = DAG.getConstant(
12816 APInt::getHighBitsSet(VTSize, VTSize - Scale + 1), dl, VT);
12817 Result = getSaturatingSelect(Hi, LowMask, SatMax, Result, ISD::SETGT);
12818 Result = getSaturatingSelect(Hi, HighMask, SatMin, Result, ISD::SETLT);
12819 return Result;
12820}
12821
12822SDValue
12824 SDValue LHS, SDValue RHS,
12825 unsigned Scale, SelectionDAG &DAG) const {
12826 assert((Opcode == ISD::SDIVFIX || Opcode == ISD::SDIVFIXSAT ||
12827 Opcode == ISD::UDIVFIX || Opcode == ISD::UDIVFIXSAT) &&
12828 "Expected a fixed point division opcode");
12829
12830 EVT VT = LHS.getValueType();
12831 bool Signed = Opcode == ISD::SDIVFIX || Opcode == ISD::SDIVFIXSAT;
12832 bool Saturating = Opcode == ISD::SDIVFIXSAT || Opcode == ISD::UDIVFIXSAT;
12833 EVT BoolVT = getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
12834
12835 // If there is enough room in the type to upscale the LHS or downscale the
12836 // RHS before the division, we can perform it in this type without having to
12837 // resize. For signed operations, the LHS headroom is the number of
12838 // redundant sign bits, and for unsigned ones it is the number of zeroes.
12839 // The headroom for the RHS is the number of trailing zeroes.
12840 unsigned LHSLead = Signed ? DAG.ComputeNumSignBits(LHS) - 1
12842 unsigned RHSTrail = DAG.computeKnownBits(RHS).countMinTrailingZeros();
12843
12844 // For signed saturating operations, we need to be able to detect true integer
12845 // division overflow; that is, when you have MIN / -EPS. However, this
12846 // is undefined behavior and if we emit divisions that could take such
12847 // values it may cause undesired behavior (arithmetic exceptions on x86, for
12848 // example).
12849 // Avoid this by requiring an extra bit so that we never get this case.
12850 // FIXME: This is a bit unfortunate as it means that for an 8-bit 7-scale
12851 // signed saturating division, we need to emit a whopping 32-bit division.
12852 if (LHSLead + RHSTrail < Scale + (unsigned)(Saturating && Signed))
12853 return SDValue();
12854
12855 unsigned LHSShift = std::min(LHSLead, Scale);
12856 unsigned RHSShift = Scale - LHSShift;
12857
12858 // At this point, we know that if we shift the LHS up by LHSShift and the
12859 // RHS down by RHSShift, we can emit a regular division with a final scaling
12860 // factor of Scale.
12861
12862 if (LHSShift)
12863 LHS = DAG.getNode(ISD::SHL, dl, VT, LHS,
12864 DAG.getShiftAmountConstant(LHSShift, VT, dl));
12865 if (RHSShift)
12866 RHS = DAG.getNode(Signed ? ISD::SRA : ISD::SRL, dl, VT, RHS,
12867 DAG.getShiftAmountConstant(RHSShift, VT, dl));
12868
12869 SDValue Quot;
12870 if (Signed) {
12871 // For signed operations, if the resulting quotient is negative and the
12872 // remainder is nonzero, subtract 1 from the quotient to round towards
12873 // negative infinity.
12874 SDValue Rem;
12875 // FIXME: Ideally we would always produce an SDIVREM here, but if the
12876 // type isn't legal, SDIVREM cannot be expanded. There is no reason why
12877 // we couldn't just form a libcall, but the type legalizer doesn't do it.
12878 if (isTypeLegal(VT) &&
12880 Quot = DAG.getNode(ISD::SDIVREM, dl,
12881 DAG.getVTList(VT, VT),
12882 LHS, RHS);
12883 Rem = Quot.getValue(1);
12884 Quot = Quot.getValue(0);
12885 } else {
12886 Quot = DAG.getNode(ISD::SDIV, dl, VT,
12887 LHS, RHS);
12888 Rem = DAG.getNode(ISD::SREM, dl, VT,
12889 LHS, RHS);
12890 }
12891 SDValue Zero = DAG.getConstant(0, dl, VT);
12892 SDValue RemNonZero = DAG.getSetCC(dl, BoolVT, Rem, Zero, ISD::SETNE);
12893 SDValue LHSNeg = DAG.getSetCC(dl, BoolVT, LHS, Zero, ISD::SETLT);
12894 SDValue RHSNeg = DAG.getSetCC(dl, BoolVT, RHS, Zero, ISD::SETLT);
12895 SDValue QuotNeg = DAG.getNode(ISD::XOR, dl, BoolVT, LHSNeg, RHSNeg);
12896 SDValue Sub1 = DAG.getNode(ISD::SUB, dl, VT, Quot,
12897 DAG.getConstant(1, dl, VT));
12898 Quot = DAG.getSelect(dl, VT,
12899 DAG.getNode(ISD::AND, dl, BoolVT, RemNonZero, QuotNeg),
12900 Sub1, Quot);
12901 } else
12902 Quot = DAG.getNode(ISD::UDIV, dl, VT,
12903 LHS, RHS);
12904
12905 return Quot;
12906}
12907
12909 SDNode *Node, SDValue &Result, SDValue &Overflow, SelectionDAG &DAG) const {
12910 SDLoc dl(Node);
12911 SDValue LHS = Node->getOperand(0);
12912 SDValue RHS = Node->getOperand(1);
12913 bool IsAdd = Node->getOpcode() == ISD::UADDO;
12914
12915 // If UADDO_CARRY/SUBO_CARRY is legal, use that instead.
12916 unsigned OpcCarry = IsAdd ? ISD::UADDO_CARRY : ISD::USUBO_CARRY;
12917 if (isOperationLegalOrCustom(OpcCarry, Node->getValueType(0))) {
12918 SDValue CarryIn = DAG.getConstant(0, dl, Node->getValueType(1));
12919 SDValue NodeCarry = DAG.getNode(OpcCarry, dl, Node->getVTList(),
12920 { LHS, RHS, CarryIn });
12921 Result = SDValue(NodeCarry.getNode(), 0);
12922 Overflow = SDValue(NodeCarry.getNode(), 1);
12923 return;
12924 }
12925
12926 Result = DAG.getNode(IsAdd ? ISD::ADD : ISD::SUB, dl,
12927 LHS.getValueType(), LHS, RHS);
12928
12929 EVT ResultType = Node->getValueType(1);
12930 EVT SetCCType = getSetCCResultType(
12931 DAG.getDataLayout(), *DAG.getContext(), Node->getValueType(0));
12932 SDValue SetCC;
12933 if (IsAdd && isOneConstant(RHS)) {
12934 // Special case: uaddo X, 1 overflowed if X+1 is 0. This potential reduces
12935 // the live range of X. We assume comparing with 0 is cheap.
12936 // The general case (X + C) < C is not necessarily beneficial. Although we
12937 // reduce the live range of X, we may introduce the materialization of
12938 // constant C.
12939 SetCC =
12940 DAG.getSetCC(dl, SetCCType, Result,
12941 DAG.getConstant(0, dl, Node->getValueType(0)), ISD::SETEQ);
12942 } else if (IsAdd && isAllOnesConstant(RHS)) {
12943 // Special case: uaddo X, -1 overflows if X != 0.
12944 SetCC =
12945 DAG.getSetCC(dl, SetCCType, LHS,
12946 DAG.getConstant(0, dl, Node->getValueType(0)), ISD::SETNE);
12947 } else {
12948 ISD::CondCode CC = IsAdd ? ISD::SETULT : ISD::SETUGT;
12949 SetCC = DAG.getSetCC(dl, SetCCType, Result, LHS, CC);
12950 }
12951 Overflow = DAG.getBoolExtOrTrunc(SetCC, dl, ResultType, ResultType);
12952}
12953
12955 SDNode *Node, SDValue &Result, SDValue &Overflow, SelectionDAG &DAG) const {
12956 SDLoc dl(Node);
12957 SDValue LHS = Node->getOperand(0);
12958 SDValue RHS = Node->getOperand(1);
12959 bool IsAdd = Node->getOpcode() == ISD::SADDO;
12960
12961 Result = DAG.getNode(IsAdd ? ISD::ADD : ISD::SUB, dl,
12962 LHS.getValueType(), LHS, RHS);
12963
12964 EVT ResultType = Node->getValueType(1);
12965 EVT OType = getSetCCResultType(
12966 DAG.getDataLayout(), *DAG.getContext(), Node->getValueType(0));
12967
12968 // If SADDSAT/SSUBSAT is legal, compare results to detect overflow.
12969 unsigned OpcSat = IsAdd ? ISD::SADDSAT : ISD::SSUBSAT;
12970 if (isOperationLegal(OpcSat, LHS.getValueType())) {
12971 SDValue Sat = DAG.getNode(OpcSat, dl, LHS.getValueType(), LHS, RHS);
12972 SDValue SetCC = DAG.getSetCC(dl, OType, Result, Sat, ISD::SETNE);
12973 Overflow = DAG.getBoolExtOrTrunc(SetCC, dl, ResultType, ResultType);
12974 return;
12975 }
12976
12977 SDValue Zero = DAG.getConstant(0, dl, LHS.getValueType());
12978
12979 if (IsAdd) {
12980 // For an addition, the result should be less than one of the operands (LHS)
12981 // if and only if the other operand (RHS) is negative, otherwise there will
12982 // be overflow.
12983 SDValue ResultLowerThanLHS =
12984 DAG.getSetCC(dl, OType, Result, LHS, ISD::SETLT);
12985 SDValue RHSNegative = DAG.getSetCC(dl, OType, RHS, Zero, ISD::SETLT);
12986 Overflow = DAG.getBoolExtOrTrunc(
12987 DAG.getNode(ISD::XOR, dl, OType, RHSNegative, ResultLowerThanLHS), dl,
12988 ResultType, ResultType);
12989 } else {
12990 // For subtraction, overflow occurs when the signed comparison of operands
12991 // doesn't match the sign of the result.
12992 SDValue LHSLessThanRHS = DAG.getSetCC(dl, OType, LHS, RHS, ISD::SETLT);
12993 SDValue ResultNegative = DAG.getSetCC(dl, OType, Result, Zero, ISD::SETLT);
12994 Overflow = DAG.getBoolExtOrTrunc(
12995 DAG.getNode(ISD::XOR, dl, OType, LHSLessThanRHS, ResultNegative), dl,
12996 ResultType, ResultType);
12997 }
12998}
12999
13001 SDValue &Overflow, SelectionDAG &DAG) const {
13002 SDLoc dl(Node);
13003 EVT VT = Node->getValueType(0);
13004 EVT SetCCVT = getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
13005 SDValue LHS = Node->getOperand(0);
13006 SDValue RHS = Node->getOperand(1);
13007 bool isSigned = Node->getOpcode() == ISD::SMULO;
13008
13009 // For power-of-two multiplications we can use a simpler shift expansion.
13010 if (ConstantSDNode *RHSC = isConstOrConstSplat(RHS)) {
13011 const APInt &C = RHSC->getAPIntValue();
13012 // mulo(X, 1 << S) -> { X << S, (X << S) >> S != X }
13013 if (C.isPowerOf2()) {
13014 // smulo(x, signed_min) is same as umulo(x, signed_min).
13015 bool UseArithShift = isSigned && !C.isMinSignedValue();
13016 SDValue ShiftAmt = DAG.getShiftAmountConstant(C.logBase2(), VT, dl);
13017 Result = DAG.getNode(ISD::SHL, dl, VT, LHS, ShiftAmt);
13018 Overflow = DAG.getSetCC(dl, SetCCVT,
13019 DAG.getNode(UseArithShift ? ISD::SRA : ISD::SRL,
13020 dl, VT, Result, ShiftAmt),
13021 LHS, ISD::SETNE);
13022 return true;
13023 }
13024 }
13025
13026 SDValue BottomHalf;
13027 SDValue TopHalf;
13028 EVT WideVT = VT.widenIntegerElementType(*DAG.getContext());
13029
13030 static const unsigned Ops[2][3] =
13033 if (isOperationLegalOrCustom(Ops[isSigned][0], VT)) {
13034 BottomHalf = DAG.getNode(Ops[isSigned][0], dl, DAG.getVTList(VT, VT), LHS,
13035 RHS);
13036 TopHalf = BottomHalf.getValue(1);
13037 } else if (isOperationLegalOrCustom(Ops[isSigned][1], VT)) {
13038 BottomHalf = DAG.getNode(ISD::MUL, dl, VT, LHS, RHS);
13039 TopHalf = DAG.getNode(Ops[isSigned][1], dl, VT, LHS, RHS);
13040 } else if (isTypeLegal(WideVT)) {
13041 LHS = DAG.getNode(Ops[isSigned][2], dl, WideVT, LHS);
13042 RHS = DAG.getNode(Ops[isSigned][2], dl, WideVT, RHS);
13043 SDValue Mul = DAG.getNode(ISD::MUL, dl, WideVT, LHS, RHS);
13044 BottomHalf = DAG.getNode(ISD::TRUNCATE, dl, VT, Mul);
13045 SDValue ShiftAmt =
13046 DAG.getShiftAmountConstant(VT.getScalarSizeInBits(), WideVT, dl);
13047 TopHalf = DAG.getNode(ISD::TRUNCATE, dl, VT,
13048 DAG.getNode(ISD::SRL, dl, WideVT, Mul, ShiftAmt));
13049 } else {
13050 if (VT.isVector())
13051 return false;
13052
13053 forceExpandWideMUL(DAG, dl, isSigned, LHS, RHS, BottomHalf, TopHalf);
13054 }
13055
13056 Result = BottomHalf;
13057 if (isSigned) {
13058 SDValue ShiftAmt = DAG.getShiftAmountConstant(
13059 VT.getScalarSizeInBits() - 1, BottomHalf.getValueType(), dl);
13060 SDValue Sign = DAG.getNode(ISD::SRA, dl, VT, BottomHalf, ShiftAmt);
13061 Overflow = DAG.getSetCC(dl, SetCCVT, TopHalf, Sign, ISD::SETNE);
13062 } else {
13063 Overflow = DAG.getSetCC(dl, SetCCVT, TopHalf,
13064 DAG.getConstant(0, dl, VT), ISD::SETNE);
13065 }
13066
13067 // Truncate the result if SetCC returns a larger type than needed.
13068 EVT RType = Node->getValueType(1);
13069 if (RType.bitsLT(Overflow.getValueType()))
13070 Overflow = DAG.getNode(ISD::TRUNCATE, dl, RType, Overflow);
13071
13072 assert(RType.getSizeInBits() == Overflow.getValueSizeInBits() &&
13073 "Unexpected result type for S/UMULO legalization");
13074 return true;
13075}
13076
13078 SDLoc dl(Node);
13079 ISD::NodeType BaseOpcode = ISD::getVecReduceBaseOpcode(Node->getOpcode());
13080 SDValue Op = Node->getOperand(0);
13081 SDNodeFlags Flags = Node->getFlags();
13082 EVT VT = Op.getValueType();
13083
13084 // Try to use a shuffle reduction for power of two vectors.
13085 if (VT.isPow2VectorType()) {
13086 // See if the reduction opcode is safe to use with widened types.
13087 bool WidenSrc = false;
13088 switch (Node->getOpcode()) {
13091 case ISD::VECREDUCE_ADD:
13092 case ISD::VECREDUCE_MUL:
13093 case ISD::VECREDUCE_AND:
13094 case ISD::VECREDUCE_OR:
13095 case ISD::VECREDUCE_XOR:
13100 WidenSrc = VT.isFixedLengthVector();
13101 break;
13102 }
13103
13105 EVT HalfVT = VT.getHalfNumVectorElementsVT(*DAG.getContext());
13106 if (!isOperationLegalOrCustom(BaseOpcode, HalfVT)) {
13107 if (WidenSrc && Op.getOpcode() != ISD::BUILD_VECTOR) {
13108 // Attempt to widen the source vectors to a legal op.
13109 EVT WideVT = getTypeToTransformTo(*DAG.getContext(), HalfVT);
13110 if (WideVT.isVector() &&
13111 WideVT.getScalarType() == HalfVT.getScalarType() &&
13112 WideVT.getVectorNumElements() >= HalfVT.getVectorNumElements() &&
13113 isOperationLegalOrCustom(BaseOpcode, WideVT)) {
13114 SDValue Lo, Hi;
13115 std::tie(Lo, Hi) = DAG.SplitVector(Op, dl);
13116 Lo = DAG.getInsertSubvector(dl, DAG.getPOISON(WideVT), Lo, 0);
13117 Hi = DAG.getInsertSubvector(dl, DAG.getPOISON(WideVT), Hi, 0);
13118 Op = DAG.getNode(BaseOpcode, dl, WideVT, Lo, Hi, Flags);
13119 Op = DAG.getExtractSubvector(dl, HalfVT, Op, 0);
13120 VT = HalfVT;
13121 continue;
13122 }
13123 }
13124 break;
13125 }
13126
13127 SDValue Lo, Hi;
13128 std::tie(Lo, Hi) = DAG.SplitVector(Op, dl);
13129 Op = DAG.getNode(BaseOpcode, dl, HalfVT, Lo, Hi, Flags);
13130 VT = HalfVT;
13131
13132 // Stop if splitting is enough to make the reduction legal.
13133 if (isOperationLegalOrCustom(Node->getOpcode(), HalfVT))
13134 return DAG.getNode(Node->getOpcode(), dl, Node->getValueType(0), Op,
13135 Flags);
13136 }
13137 }
13138
13139 if (VT.isScalableVector())
13141 "Expanding reductions for scalable vectors is undefined.");
13142
13143 EVT EltVT = VT.getVectorElementType();
13144 unsigned NumElts = VT.getVectorNumElements();
13145
13147 DAG.ExtractVectorElements(Op, Ops, 0, NumElts);
13148
13149 SDValue Res = Ops[0];
13150 for (unsigned i = 1; i < NumElts; i++)
13151 Res = DAG.getNode(BaseOpcode, dl, EltVT, Res, Ops[i], Flags);
13152
13153 // Result type may be wider than element type.
13154 if (EltVT != Node->getValueType(0))
13155 Res = DAG.getNode(ISD::ANY_EXTEND, dl, Node->getValueType(0), Res);
13156 return Res;
13157}
13158
13160 SDLoc dl(Node);
13161 SDValue AccOp = Node->getOperand(0);
13162 SDValue VecOp = Node->getOperand(1);
13163 SDNodeFlags Flags = Node->getFlags();
13164
13165 EVT VT = VecOp.getValueType();
13166 EVT EltVT = VT.getVectorElementType();
13167
13168 if (VT.isScalableVector())
13170 "Expanding reductions for scalable vectors is undefined.");
13171
13172 unsigned NumElts = VT.getVectorNumElements();
13173
13175 DAG.ExtractVectorElements(VecOp, Ops, 0, NumElts);
13176
13177 unsigned BaseOpcode = ISD::getVecReduceBaseOpcode(Node->getOpcode());
13178
13179 SDValue Res = AccOp;
13180 for (unsigned i = 0; i < NumElts; i++)
13181 Res = DAG.getNode(BaseOpcode, dl, EltVT, Res, Ops[i], Flags);
13182
13183 return Res;
13184}
13185
13187 SelectionDAG &DAG) const {
13188 EVT VT = Node->getValueType(0);
13189 SDLoc dl(Node);
13190 bool isSigned = Node->getOpcode() == ISD::SREM;
13191 unsigned DivOpc = isSigned ? ISD::SDIV : ISD::UDIV;
13192 unsigned DivRemOpc = isSigned ? ISD::SDIVREM : ISD::UDIVREM;
13193 SDValue Dividend = Node->getOperand(0);
13194 SDValue Divisor = Node->getOperand(1);
13195 if (isOperationLegalOrCustom(DivRemOpc, VT)) {
13196 SDVTList VTs = DAG.getVTList(VT, VT);
13197 Result = DAG.getNode(DivRemOpc, dl, VTs, Dividend, Divisor).getValue(1);
13198 return true;
13199 }
13200 if (isOperationLegalOrCustom(DivOpc, VT)) {
13201 // X % Y -> X-X/Y*Y
13202 SDValue Divide = DAG.getNode(DivOpc, dl, VT, Dividend, Divisor);
13203 SDValue Mul = DAG.getNode(ISD::MUL, dl, VT, Divide, Divisor);
13204 Result = DAG.getNode(ISD::SUB, dl, VT, Dividend, Mul);
13205 return true;
13206 }
13207 return false;
13208}
13209
13211 SelectionDAG &DAG) const {
13212 bool IsSigned = Node->getOpcode() == ISD::FP_TO_SINT_SAT;
13213 SDLoc dl(SDValue(Node, 0));
13214 SDValue Src = Node->getOperand(0);
13215
13216 // DstVT is the result type, while SatVT is the size to which we saturate
13217 EVT SrcVT = Src.getValueType();
13218 EVT DstVT = Node->getValueType(0);
13219
13220 EVT SatVT = cast<VTSDNode>(Node->getOperand(1))->getVT();
13221 unsigned SatWidth = SatVT.getScalarSizeInBits();
13222 unsigned DstWidth = DstVT.getScalarSizeInBits();
13223 assert(SatWidth <= DstWidth &&
13224 "Expected saturation width smaller than result width");
13225
13226 // Determine minimum and maximum integer values and their corresponding
13227 // floating-point values.
13228 APInt MinInt, MaxInt;
13229 if (IsSigned) {
13230 MinInt = APInt::getSignedMinValue(SatWidth).sext(DstWidth);
13231 MaxInt = APInt::getSignedMaxValue(SatWidth).sext(DstWidth);
13232 } else {
13233 MinInt = APInt::getMinValue(SatWidth).zext(DstWidth);
13234 MaxInt = APInt::getMaxValue(SatWidth).zext(DstWidth);
13235 }
13236
13237 // We cannot risk emitting FP_TO_XINT nodes with a source VT of [b]f16, as
13238 // libcall emission cannot handle this. Large result types will fail.
13239 if (SrcVT == MVT::f16 || SrcVT == MVT::bf16) {
13240 Src = DAG.getNode(ISD::FP_EXTEND, dl, MVT::f32, Src);
13241 SrcVT = Src.getValueType();
13242 }
13243
13244 const fltSemantics &Sem = SrcVT.getFltSemantics();
13245 APFloat MinFloat(Sem);
13246 APFloat MaxFloat(Sem);
13247
13248 APFloat::opStatus MinStatus =
13249 MinFloat.convertFromAPInt(MinInt, IsSigned, APFloat::rmTowardZero);
13250 APFloat::opStatus MaxStatus =
13251 MaxFloat.convertFromAPInt(MaxInt, IsSigned, APFloat::rmTowardZero);
13252 bool AreExactFloatBounds = !(MinStatus & APFloat::opStatus::opInexact) &&
13253 !(MaxStatus & APFloat::opStatus::opInexact);
13254
13255 SDValue MinFloatNode = DAG.getConstantFP(MinFloat, dl, SrcVT);
13256 SDValue MaxFloatNode = DAG.getConstantFP(MaxFloat, dl, SrcVT);
13257
13258 // If the integer bounds are exactly representable as floats and min/max are
13259 // legal, emit a min+max+fptoi sequence. Otherwise we have to use a sequence
13260 // of comparisons and selects.
13261 auto EmitMinMax = [&](unsigned MinOpcode, unsigned MaxOpcode,
13262 bool MayPropagateNaN) {
13263 bool MinMaxLegal = isOperationLegalOrCustom(MinOpcode, SrcVT) &&
13264 isOperationLegalOrCustom(MaxOpcode, SrcVT);
13265 if (!MinMaxLegal)
13266 return SDValue();
13267
13268 SDValue Clamped = Src;
13269
13270 // Clamp Src by MinFloat from below. If !MayPropagateNaN and Src is NaN
13271 // then the result is MinFloat.
13272 Clamped = DAG.getNode(MaxOpcode, dl, SrcVT, Clamped, MinFloatNode);
13273 // Clamp by MaxFloat from above. If !MayPropagateNaN then NaN cannot occur.
13274 Clamped = DAG.getNode(MinOpcode, dl, SrcVT, Clamped, MaxFloatNode);
13275 // Convert clamped value to integer.
13276 SDValue FpToInt = DAG.getNode(IsSigned ? ISD::FP_TO_SINT : ISD::FP_TO_UINT,
13277 dl, DstVT, Clamped);
13278
13279 // If !MayPropagateNan and the conversion is unsigned case we're done,
13280 // because we mapped NaN to MinFloat, which will cast to zero.
13281 if (!MayPropagateNaN && !IsSigned)
13282 return FpToInt;
13283
13284 // Otherwise, select 0 if Src is NaN.
13285 SDValue ZeroInt = DAG.getConstant(0, dl, DstVT);
13286 EVT SetCCVT =
13287 getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), SrcVT);
13288 SDValue IsNan = DAG.getSetCC(dl, SetCCVT, Src, Src, ISD::CondCode::SETUO);
13289 return DAG.getSelect(dl, DstVT, IsNan, ZeroInt, FpToInt);
13290 };
13291 if (AreExactFloatBounds) {
13292 if (SDValue Res = EmitMinMax(ISD::FMINIMUMNUM, ISD::FMAXIMUMNUM,
13293 /*MayPropagateNaN=*/false))
13294 return Res;
13295 // These may propagate NaN for sNaN operands.
13296 if (SDValue Res =
13297 EmitMinMax(ISD::FMINNUM, ISD::FMAXNUM, /*MayPropagateNaN=*/true))
13298 return Res;
13299 // These always propagate NaN.
13300 if (SDValue Res =
13301 EmitMinMax(ISD::FMINIMUM, ISD::FMAXIMUM, /*MayPropagateNaN=*/true))
13302 return Res;
13303 }
13304
13305 SDValue MinIntNode = DAG.getConstant(MinInt, dl, DstVT);
13306 SDValue MaxIntNode = DAG.getConstant(MaxInt, dl, DstVT);
13307
13308 // Result of direct conversion. The assumption here is that the operation is
13309 // non-trapping and it's fine to apply it to an out-of-range value if we
13310 // select it away later.
13311 SDValue FpToInt =
13312 DAG.getNode(IsSigned ? ISD::FP_TO_SINT : ISD::FP_TO_UINT, dl, DstVT, Src);
13313
13314 SDValue Select = FpToInt;
13315
13316 EVT SetCCVT =
13317 getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), SrcVT);
13318
13319 // If Src ULT MinFloat, select MinInt. In particular, this also selects
13320 // MinInt if Src is NaN.
13321 SDValue ULT = DAG.getSetCC(dl, SetCCVT, Src, MinFloatNode, ISD::SETULT);
13322 Select = DAG.getSelect(dl, DstVT, ULT, MinIntNode, Select);
13323 // If Src OGT MaxFloat, select MaxInt.
13324 SDValue OGT = DAG.getSetCC(dl, SetCCVT, Src, MaxFloatNode, ISD::SETOGT);
13325 Select = DAG.getSelect(dl, DstVT, OGT, MaxIntNode, Select);
13326
13327 // In the unsigned case we are done, because we mapped NaN to MinInt, which
13328 // is already zero.
13329 if (!IsSigned)
13330 return Select;
13331
13332 // Otherwise, select 0 if Src is NaN.
13333 SDValue ZeroInt = DAG.getConstant(0, dl, DstVT);
13334 SDValue IsNan = DAG.getSetCC(dl, SetCCVT, Src, Src, ISD::CondCode::SETUO);
13335 return DAG.getSelect(dl, DstVT, IsNan, ZeroInt, Select);
13336}
13337
13339 const SDLoc &dl,
13340 SelectionDAG &DAG) const {
13341 EVT OperandVT = Op.getValueType();
13342 if (OperandVT.getScalarType() == ResultVT.getScalarType())
13343 return Op;
13344 EVT ResultIntVT = ResultVT.changeTypeToInteger();
13345 // We are rounding binary64/binary128 -> binary32 -> bfloat16. This
13346 // can induce double-rounding which may alter the results. We can
13347 // correct for this using a trick explained in: Boldo, Sylvie, and
13348 // Guillaume Melquiond. "When double rounding is odd." 17th IMACS
13349 // World Congress. 2005.
13350 SDValue Narrow = DAG.getFPExtendOrRound(Op, dl, ResultVT);
13351 SDValue NarrowAsWide = DAG.getFPExtendOrRound(Narrow, dl, OperandVT);
13352
13353 // We can keep the narrow value as-is if narrowing was exact (no
13354 // rounding error), the wide value was NaN (the narrow value is also
13355 // NaN and should be preserved) or if we rounded to the odd value.
13356 SDValue NarrowBits = DAG.getNode(ISD::BITCAST, dl, ResultIntVT, Narrow);
13357 SDValue One = DAG.getConstant(1, dl, ResultIntVT);
13358 SDValue NegativeOne = DAG.getAllOnesConstant(dl, ResultIntVT);
13359 SDValue And = DAG.getNode(ISD::AND, dl, ResultIntVT, NarrowBits, One);
13360 EVT ResultIntVTCCVT = getSetCCResultType(
13361 DAG.getDataLayout(), *DAG.getContext(), And.getValueType());
13362 SDValue Zero = DAG.getConstant(0, dl, ResultIntVT);
13363 // The result is already odd so we don't need to do anything.
13364 SDValue AlreadyOdd = DAG.getSetCC(dl, ResultIntVTCCVT, And, Zero, ISD::SETNE);
13365
13366 EVT WideSetCCVT = getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(),
13367 Op.getValueType());
13368 // We keep results which are exact, odd or NaN.
13369 SDValue KeepNarrow =
13370 DAG.getSetCC(dl, WideSetCCVT, Op, NarrowAsWide, ISD::SETUEQ);
13371 KeepNarrow = DAG.getNode(ISD::OR, dl, WideSetCCVT, KeepNarrow, AlreadyOdd);
13372 // We morally performed a round-down if AbsNarrow is smaller than
13373 // AbsWide.
13374 SDValue AbsWide = DAG.getNode(ISD::FABS, dl, OperandVT, Op);
13375 SDValue AbsNarrowAsWide = DAG.getNode(ISD::FABS, dl, OperandVT, NarrowAsWide);
13376 SDValue NarrowIsRd =
13377 DAG.getSetCC(dl, WideSetCCVT, AbsWide, AbsNarrowAsWide, ISD::SETOGT);
13378 // If the narrow value is odd or exact, pick it.
13379 // Otherwise, narrow is even and corresponds to either the rounded-up
13380 // or rounded-down value. If narrow is the rounded-down value, we want
13381 // the rounded-up value as it will be odd.
13382 SDValue Adjust = DAG.getSelect(dl, ResultIntVT, NarrowIsRd, One, NegativeOne);
13383 SDValue Adjusted = DAG.getNode(ISD::ADD, dl, ResultIntVT, NarrowBits, Adjust);
13384 Op = DAG.getSelect(dl, ResultIntVT, KeepNarrow, NarrowBits, Adjusted);
13385 return DAG.getNode(ISD::BITCAST, dl, ResultVT, Op);
13386}
13387
13389 assert(Node->getOpcode() == ISD::FP_ROUND && "Unexpected opcode!");
13390 SDValue Op = Node->getOperand(0);
13391 EVT VT = Node->getValueType(0);
13392 SDLoc dl(Node);
13393 if (VT.getScalarType() == MVT::bf16) {
13394 if (Node->getConstantOperandVal(1) == 1) {
13395 return DAG.getNode(ISD::FP_TO_BF16, dl, VT, Node->getOperand(0));
13396 }
13397 EVT OperandVT = Op.getValueType();
13398 SDValue IsNaN = DAG.getSetCC(
13399 dl,
13400 getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), OperandVT),
13401 Op, Op, ISD::SETUO);
13402
13403 // We are rounding binary64/binary128 -> binary32 -> bfloat16. This
13404 // can induce double-rounding which may alter the results. We can
13405 // correct for this using a trick explained in: Boldo, Sylvie, and
13406 // Guillaume Melquiond. "When double rounding is odd." 17th IMACS
13407 // World Congress. 2005.
13408 EVT F32 = VT.changeElementType(*DAG.getContext(), MVT::f32);
13409 EVT I32 = F32.changeTypeToInteger();
13410 Op = expandRoundInexactToOdd(F32, Op, dl, DAG);
13411 Op = DAG.getNode(ISD::BITCAST, dl, I32, Op);
13412
13413 // Conversions should set NaN's quiet bit. This also prevents NaNs from
13414 // turning into infinities.
13415 SDValue NaN =
13416 DAG.getNode(ISD::OR, dl, I32, Op, DAG.getConstant(0x400000, dl, I32));
13417
13418 // Factor in the contribution of the low 16 bits.
13419 SDValue One = DAG.getConstant(1, dl, I32);
13420 SDValue Lsb = DAG.getNode(ISD::SRL, dl, I32, Op,
13421 DAG.getShiftAmountConstant(16, I32, dl));
13422 Lsb = DAG.getNode(ISD::AND, dl, I32, Lsb, One);
13423 SDValue RoundingBias =
13424 DAG.getNode(ISD::ADD, dl, I32, Lsb, DAG.getConstant(0x7fff, dl, I32));
13425 SDValue Add = DAG.getNode(ISD::ADD, dl, I32, Op, RoundingBias);
13426
13427 // Don't round if we had a NaN, we don't want to turn 0x7fffffff into
13428 // 0x80000000.
13429 Op = DAG.getSelect(dl, I32, IsNaN, NaN, Add);
13430
13431 // Now that we have rounded, shift the bits into position.
13432 Op = DAG.getNode(ISD::SRL, dl, I32, Op,
13433 DAG.getShiftAmountConstant(16, I32, dl));
13434 EVT I16 = I32.changeElementType(*DAG.getContext(), MVT::i16);
13435 Op = DAG.getNode(ISD::TRUNCATE, dl, I16, Op);
13436 return DAG.getNode(ISD::BITCAST, dl, VT, Op);
13437 }
13438 return SDValue();
13439}
13440
13442 SelectionDAG &DAG) const {
13443 assert((Node->getOpcode() == ISD::VECTOR_SPLICE_LEFT ||
13444 Node->getOpcode() == ISD::VECTOR_SPLICE_RIGHT) &&
13445 "Unexpected opcode!");
13446 assert((Node->getValueType(0).isScalableVector() ||
13447 !isa<ConstantSDNode>(Node->getOperand(2))) &&
13448 "Fixed length vector types with constant offsets expected to use "
13449 "SHUFFLE_VECTOR!");
13450
13451 EVT VT = Node->getValueType(0);
13452 SDValue V1 = Node->getOperand(0);
13453 SDValue V2 = Node->getOperand(1);
13454 SDValue Offset = Node->getOperand(2);
13455 SDLoc DL(Node);
13456
13457 // Expand through memory thusly:
13458 // Alloca CONCAT_VECTORS_TYPES(V1, V2) Ptr
13459 // Store V1, Ptr
13460 // Store V2, Ptr + sizeof(V1)
13461 // if (VECTOR_SPLICE_LEFT)
13462 // Ptr = Ptr + (Offset * sizeof(VT.Elt))
13463 // else
13464 // Ptr = Ptr + sizeof(V1) - (Offset * size(VT.Elt))
13465 // Res = Load Ptr
13466
13467 Align Alignment = DAG.getReducedAlign(VT, /*UseABI=*/false);
13468
13470 VT.getVectorElementCount() * 2);
13471 SDValue StackPtr = DAG.CreateStackTemporary(MemVT.getStoreSize(), Alignment);
13472 EVT PtrVT = StackPtr.getValueType();
13473 auto &MF = DAG.getMachineFunction();
13474 auto FrameIndex = cast<FrameIndexSDNode>(StackPtr.getNode())->getIndex();
13475 auto PtrInfo = MachinePointerInfo::getFixedStack(MF, FrameIndex);
13476
13477 // Store the lo part of CONCAT_VECTORS(V1, V2)
13478 SDValue StoreV1 =
13479 DAG.getStore(DAG.getEntryNode(), DL, V1, StackPtr, PtrInfo, Alignment);
13480 // Store the hi part of CONCAT_VECTORS(V1, V2)
13481 SDValue VTBytes = DAG.getTypeSize(DL, PtrVT, VT.getStoreSize());
13482 SDValue StackPtr2 = DAG.getNode(ISD::ADD, DL, PtrVT, StackPtr, VTBytes);
13483 SDValue StoreV2 =
13484 DAG.getStore(StoreV1, DL, V2, StackPtr2, PtrInfo, Alignment);
13485
13486 // NOTE: TrailingBytes must be clamped so as not to read outside of V1:V2.
13487 SDValue EltByteSize =
13488 DAG.getTypeSize(DL, PtrVT, VT.getVectorElementType().getStoreSize());
13489 Offset = DAG.getZExtOrTrunc(Offset, DL, PtrVT);
13490 SDValue TrailingBytes = DAG.getNode(ISD::MUL, DL, PtrVT, Offset, EltByteSize);
13491
13492 TrailingBytes = DAG.getNode(ISD::UMIN, DL, PtrVT, TrailingBytes, VTBytes);
13493
13494 if (Node->getOpcode() == ISD::VECTOR_SPLICE_LEFT)
13495 StackPtr = DAG.getMemBasePlusOffset(StackPtr, TrailingBytes, DL);
13496 else
13497 StackPtr = DAG.getNode(ISD::SUB, DL, PtrVT, StackPtr2, TrailingBytes);
13498
13499 // Load the spliced result
13500 return DAG.getLoad(VT, DL, StoreV2, StackPtr,
13502}
13503
13505 SelectionDAG &DAG) const {
13506 SDLoc DL(Node);
13507 SDValue Vec = Node->getOperand(0);
13508 SDValue Mask = Node->getOperand(1);
13509 SDValue Passthru = Node->getOperand(2);
13510
13511 EVT VecVT = Vec.getValueType();
13512 EVT ScalarVT = VecVT.getScalarType();
13513 EVT MaskVT = Mask.getValueType();
13514 EVT MaskScalarVT = MaskVT.getScalarType();
13515
13516 // Needs to be handled by targets that have scalable vector types.
13517 if (VecVT.isScalableVector())
13518 report_fatal_error("Cannot expand masked_compress for scalable vectors.");
13519
13520 Align Alignment = DAG.getReducedAlign(VecVT, /*UseABI=*/false);
13521 SDValue StackPtr = DAG.CreateStackTemporary(VecVT.getStoreSize(), Alignment);
13522 int FI = cast<FrameIndexSDNode>(StackPtr.getNode())->getIndex();
13523 MachinePointerInfo PtrInfo =
13525
13526 MVT PositionVT = getVectorIdxTy(DAG.getDataLayout());
13527 SDValue Chain = DAG.getEntryNode();
13528 SDValue OutPos = DAG.getConstant(0, DL, PositionVT);
13529
13530 bool HasPassthru = !Passthru.isUndef();
13531
13532 // If we have a passthru vector, store it on the stack, overwrite the matching
13533 // positions and then re-write the last element that was potentially
13534 // overwritten even though mask[i] = false.
13535 if (HasPassthru)
13536 Chain = DAG.getStore(Chain, DL, Passthru, StackPtr, PtrInfo, Alignment);
13537
13538 SDValue LastWriteVal;
13539 APInt PassthruSplatVal;
13540 bool IsSplatPassthru =
13541 ISD::isConstantSplatVector(Passthru.getNode(), PassthruSplatVal);
13542
13543 if (IsSplatPassthru) {
13544 // As we do not know which position we wrote to last, we cannot simply
13545 // access that index from the passthru vector. So we first check if passthru
13546 // is a splat vector, to use any element ...
13547 LastWriteVal = DAG.getConstant(PassthruSplatVal, DL, ScalarVT);
13548 } else if (HasPassthru) {
13549 // ... if it is not a splat vector, we need to get the passthru value at
13550 // position = popcount(mask) and re-load it from the stack before it is
13551 // overwritten in the loop below.
13552 EVT PopcountVT = ScalarVT.changeTypeToInteger();
13553 SDValue Popcount = DAG.getNode(
13555 MaskVT.changeVectorElementType(*DAG.getContext(), MVT::i1), Mask);
13556 Popcount = DAG.getNode(
13558 MaskVT.changeVectorElementType(*DAG.getContext(), PopcountVT),
13559 Popcount);
13560 Popcount = DAG.getNode(ISD::VECREDUCE_ADD, DL, PopcountVT, Popcount);
13561 SDValue LastElmtPtr =
13562 getVectorElementPointer(DAG, StackPtr, VecVT, Popcount);
13563 LastWriteVal = DAG.getLoad(
13564 ScalarVT, DL, Chain, LastElmtPtr,
13566 Chain = LastWriteVal.getValue(1);
13567 }
13568
13569 unsigned NumElms = VecVT.getVectorNumElements();
13570 for (unsigned I = 0; I < NumElms; I++) {
13571 SDValue ValI = DAG.getExtractVectorElt(DL, ScalarVT, Vec, I);
13572 SDValue OutPtr = getVectorElementPointer(DAG, StackPtr, VecVT, OutPos);
13573 Chain = DAG.getStore(
13574 Chain, DL, ValI, OutPtr,
13576
13577 // Get the mask value and add it to the current output position. This
13578 // either increments by 1 if MaskI is true or adds 0 otherwise.
13579 // Freeze in case we have poison/undef mask entries.
13580 SDValue MaskI = DAG.getExtractVectorElt(DL, MaskScalarVT, Mask, I);
13581 MaskI = DAG.getFreeze(MaskI);
13582 MaskI = DAG.getNode(ISD::TRUNCATE, DL, MVT::i1, MaskI);
13583 MaskI = DAG.getNode(ISD::ZERO_EXTEND, DL, PositionVT, MaskI);
13584 OutPos = DAG.getNode(ISD::ADD, DL, PositionVT, OutPos, MaskI);
13585
13586 if (HasPassthru && I == NumElms - 1) {
13587 SDValue EndOfVector =
13588 DAG.getConstant(VecVT.getVectorNumElements() - 1, DL, PositionVT);
13589 SDValue AllLanesSelected =
13590 DAG.getSetCC(DL, MVT::i1, OutPos, EndOfVector, ISD::CondCode::SETUGT);
13591 OutPos = DAG.getNode(ISD::UMIN, DL, PositionVT, OutPos, EndOfVector);
13592 OutPtr = getVectorElementPointer(DAG, StackPtr, VecVT, OutPos);
13593
13594 // Re-write the last ValI if all lanes were selected. Otherwise,
13595 // overwrite the last write it with the passthru value.
13596 LastWriteVal = DAG.getSelect(DL, ScalarVT, AllLanesSelected, ValI,
13597 LastWriteVal, SDNodeFlags::Unpredictable);
13598 Chain = DAG.getStore(
13599 Chain, DL, LastWriteVal, OutPtr,
13601 }
13602 }
13603
13604 return DAG.getLoad(VecVT, DL, Chain, StackPtr, PtrInfo, Alignment);
13605}
13606
13608 SDLoc DL(Node);
13609 EVT VT = Node->getValueType(0);
13610 SDValue Op = Node->getOperand(0);
13611 ElementCount EC = Op.getValueType().getVectorElementCount();
13612
13613 bool ZeroIsPoison = Node->getOpcode() == ISD::CTTZ_ELTS_ZERO_POISON;
13614 auto [Mask, StepVec] = getLegalMaskAndStepVector(Op, ZeroIsPoison, DL, DAG);
13615
13616 // No legal step vector: split mask in half and recombine results.
13617 // LoNumElts uses the non-poison CTTZ_ELTS so its result is well-defined
13618 // (== LoNumElts when no active lane), allowing the SETNE comparison.
13619 // Result: (ResLo != LoNumElts) ? ResLo : (LoNumElts + ResHi)
13620 if (!StepVec) {
13621 EVT ResVT = Node->getValueType(0);
13622 auto [MaskLo, MaskHi] = DAG.SplitVector(Op, DL);
13623 SDValue LoNumElts = DAG.getElementCount(
13624 DL, ResVT, MaskLo.getValueType().getVectorElementCount());
13625 SDValue ResLo = DAG.getNode(ISD::CTTZ_ELTS, DL, ResVT, MaskLo);
13626 SDValue ResHi = DAG.getNode(Node->getOpcode(), DL, ResVT, MaskHi);
13627 SDValue ResLoNotNumElts = DAG.getSetCC(
13628 DL, getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), ResVT),
13629 ResLo, LoNumElts, ISD::SETNE);
13630 // Per LangRef, ResVT must be wide enough to hold the total element count,
13631 // so the sum cannot wrap as an unsigned add. NSW is not guaranteed since
13632 // the count is only required to fit unsigned.
13633 SDValue Sum = DAG.getNode(ISD::ADD, DL, ResVT, LoNumElts, ResHi,
13635 return DAG.getSelect(DL, ResVT, ResLoNotNumElts, ResLo, Sum);
13636 }
13637
13638 EVT StepVecVT = StepVec.getValueType();
13639 EVT StepVT = StepVecVT.getVectorElementType();
13640
13641 // Promote the scalar result type early to avoid redundant zexts.
13643 StepVT = getTypeToTransformTo(*DAG.getContext(), StepVT);
13644
13645 SDValue VL = DAG.getElementCount(DL, StepVT, EC);
13646 SDValue SplatVL = DAG.getSplat(StepVecVT, DL, VL);
13647 StepVec = DAG.getNode(ISD::SUB, DL, StepVecVT, SplatVL, StepVec);
13648 SDValue Zeroes = DAG.getConstant(0, DL, StepVecVT);
13649 SDValue Select = DAG.getSelect(DL, StepVecVT, Mask, StepVec, Zeroes);
13651 StepVecVT.getVectorElementType(), Select);
13652 SDValue Sub = DAG.getNode(ISD::SUB, DL, StepVT, VL,
13653 DAG.getZExtOrTrunc(Max, DL, StepVT));
13654
13655 return DAG.getZExtOrTrunc(Sub, DL, VT);
13656}
13657
13659 SDLoc DL(N);
13660 SDValue Source = N->getOperand(0);
13661 SDValue Needle = N->getOperand(1);
13662 SDValue Mask = N->getOperand(2);
13663 EVT SourceVT = Source.getValueType();
13664 EVT NeedleVT = Needle.getValueType();
13665 EVT ResVT = N->getValueType(0);
13666 EVT CmpVT =
13667 getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), SourceVT);
13668
13669 assert(NeedleVT.isFixedLengthVector() && "Needle must be a fixed vector");
13670
13671 SDValue Ret = DAG.getConstant(0, DL, CmpVT);
13672 EVT NeedleEltVT = NeedleVT.getVectorElementType();
13673 for (unsigned I = 0, E = NeedleVT.getVectorNumElements(); I != E; ++I) {
13674 SDValue Splat;
13675 if (NeedleVT == SourceVT) {
13676 // Prefer a shuffle over scalar extracts + splat for fixed vectors.
13677 Splat = DAG.getVectorShuffle(
13678 SourceVT, DL, Needle, DAG.getUNDEF(SourceVT),
13680 } else {
13681 SDValue NeedleElt = DAG.getExtractVectorElt(DL, NeedleEltVT, Needle, I);
13682 Splat = DAG.getNode(ISD::SPLAT_VECTOR, DL, SourceVT, NeedleElt);
13683 }
13684 SDValue Cmp = DAG.getSetCC(DL, CmpVT, Source, Splat, ISD::SETEQ);
13685 Ret = DAG.getNode(ISD::OR, DL, CmpVT, Ret, Cmp);
13686 }
13687
13688 EVT UseVT = ResVT;
13689 // If the result is immediately truncated, only extend to that type (to avoid
13690 // unnecessary sign/zero extends).
13691 if (N->hasOneUse() && N->user_begin()->getOpcode() == ISD::TRUNCATE)
13692 UseVT = N->user_begin()->getValueType(0);
13693
13694 Mask = DAG.getBoolExtOrTrunc(Mask, DL, UseVT, Mask.getValueType());
13695 Ret = DAG.getBoolExtOrTrunc(Ret, DL, UseVT, Ret.getValueType());
13696
13697 Ret = DAG.getNode(ISD::AND, DL, UseVT, Ret, Mask);
13698 if (UseVT != ResVT)
13699 Ret = DAG.getNode(ISD::ANY_EXTEND, DL, ResVT, Ret);
13700 return Ret;
13701}
13702
13704 SelectionDAG &DAG) const {
13705 SDLoc DL(N);
13706 SDValue Acc = N->getOperand(0);
13707 SDValue MulLHS = N->getOperand(1);
13708 SDValue MulRHS = N->getOperand(2);
13709 EVT AccVT = Acc.getValueType();
13710 EVT MulOpVT = MulLHS.getValueType();
13711
13712 EVT ExtMulOpVT =
13714 MulOpVT.getVectorElementCount());
13715
13716 unsigned ExtOpcLHS, ExtOpcRHS;
13717 switch (N->getOpcode()) {
13718 default:
13719 llvm_unreachable("Unexpected opcode");
13721 ExtOpcLHS = ExtOpcRHS = ISD::ZERO_EXTEND;
13722 break;
13724 ExtOpcLHS = ExtOpcRHS = ISD::SIGN_EXTEND;
13725 break;
13727 ExtOpcLHS = ISD::SIGN_EXTEND;
13728 ExtOpcRHS = ISD::ZERO_EXTEND;
13729 break;
13731 ExtOpcLHS = ExtOpcRHS = ISD::FP_EXTEND;
13732 break;
13733 }
13734
13735 // A wide partial reduction is built from a ladder of narrower ones, a rung
13736 // at a time, each halving the element count and doubling the width.
13737 unsigned Opc = N->getOpcode();
13738 ElementCount MulEC = MulOpVT.getVectorElementCount();
13739 ElementCount AccEC = AccVT.getVectorElementCount();
13740 unsigned CountRatio =
13741 MulEC.hasKnownScalarFactor(AccEC) ? MulEC.getKnownScalarFactor(AccEC) : 0;
13742 unsigned WidthRatio =
13743 AccVT.getScalarSizeInBits() / MulOpVT.getScalarSizeInBits();
13744 if (Opc != ISD::PARTIAL_REDUCE_FMLA && CountRatio > 2 && WidthRatio >= 2) {
13745 LLVMContext &Ctx = *DAG.getContext();
13746 EVT ProdVT = MulOpVT.widenIntegerVectorElementType(Ctx);
13747
13748 // A pure reduction peels one rung and re-enters.
13749 if (llvm::isOneOrOneSplat(MulRHS)) {
13750 EVT RungVT = ProdVT.getHalfNumVectorElementsVT(Ctx);
13751 return DAG.getNode(Opc, DL, AccVT, Acc,
13752 DAG.getNode(Opc, DL, RungVT,
13753 DAG.getConstant(0, DL, RungVT), MulLHS,
13754 MulRHS),
13755 DAG.getConstant(1, DL, RungVT));
13756 }
13757
13758 // A multiply widens the products by one rung, which legalizes back into a
13759 // widening multiply per half, and the ladder re-enters as a plain sum.
13760 SDValue Prod = DAG.getNode(ISD::MUL, DL, ProdVT,
13761 DAG.getNode(ExtOpcLHS, DL, ProdVT, MulLHS),
13762 DAG.getNode(ExtOpcRHS, DL, ProdVT, MulRHS));
13763 auto [Lo, Hi] = DAG.SplitVector(Prod, DL);
13764 SDValue One = DAG.getConstant(1, DL, Lo.getValueType());
13765
13766 // The halves meet at the narrowest rung, so the accumulator is added once.
13767 EVT MidVT = Lo.getValueType()
13768 .widenIntegerVectorElementType(Ctx)
13769 .getHalfNumVectorElementsVT(Ctx);
13771 return DAG.getNode(Opc, DL, AccVT,
13772 DAG.getNode(Opc, DL, AccVT, Acc, Lo, One), Hi, One);
13773 SDValue Mid =
13774 DAG.getNode(Opc, DL, MidVT, DAG.getConstant(0, DL, MidVT), Lo, One);
13775 Mid = DAG.getNode(Opc, DL, MidVT, Mid, Hi, One);
13776 return DAG.getNode(Opc, DL, AccVT, Acc, Mid, DAG.getConstant(1, DL, MidVT));
13777 }
13778
13779 if (ExtMulOpVT != MulOpVT) {
13780 MulLHS = DAG.getNode(ExtOpcLHS, DL, ExtMulOpVT, MulLHS);
13781 MulRHS = DAG.getNode(ExtOpcRHS, DL, ExtMulOpVT, MulRHS);
13782 }
13783 SDValue Input = MulLHS;
13784 if (N->getOpcode() == ISD::PARTIAL_REDUCE_FMLA) {
13785 if (!llvm::isOneOrOneSplatFP(MulRHS))
13786 Input = DAG.getNode(ISD::FMUL, DL, ExtMulOpVT, MulLHS, MulRHS);
13787 } else if (!llvm::isOneOrOneSplat(MulRHS)) {
13788 Input = DAG.getNode(ISD::MUL, DL, ExtMulOpVT, MulLHS, MulRHS);
13789 }
13790
13791 unsigned Stride = AccVT.getVectorMinNumElements();
13792 unsigned ScaleFactor = MulOpVT.getVectorMinNumElements() / Stride;
13793
13794 // Collect all of the subvectors
13795 std::deque<SDValue> Subvectors = {Acc};
13796 for (unsigned I = 0; I < ScaleFactor; I++)
13797 Subvectors.push_back(DAG.getExtractSubvector(DL, AccVT, Input, I * Stride));
13798
13799 unsigned FlatNode =
13800 N->getOpcode() == ISD::PARTIAL_REDUCE_FMLA ? ISD::FADD : ISD::ADD;
13801
13802 // Flatten the subvector tree
13803 while (Subvectors.size() > 1) {
13804 Subvectors.push_back(
13805 DAG.getNode(FlatNode, DL, AccVT, {Subvectors[0], Subvectors[1]}));
13806 Subvectors.pop_front();
13807 Subvectors.pop_front();
13808 }
13809
13810 assert(Subvectors.size() == 1 &&
13811 "There should only be one subvector after tree flattening");
13812
13813 return Subvectors[0];
13814}
13815
13816/// Given a store node \p StoreNode, return true if it is safe to fold that node
13817/// into \p FPNode, which expands to a library call with output pointers.
13819 SDNode *FPNode) {
13821 SmallVector<const SDNode *, 8> DeferredNodes;
13823
13824 // Skip FPNode use by StoreNode (that's the use we want to fold into FPNode).
13825 for (SDValue Op : StoreNode->ops())
13826 if (Op.getNode() != FPNode)
13827 Worklist.push_back(Op.getNode());
13828
13830 while (!Worklist.empty()) {
13831 const SDNode *Node = Worklist.pop_back_val();
13832 auto [_, Inserted] = Visited.insert(Node);
13833 if (!Inserted)
13834 continue;
13835
13836 if (MaxSteps > 0 && Visited.size() >= MaxSteps)
13837 return false;
13838
13839 // Reached the FPNode (would result in a cycle).
13840 // OR Reached CALLSEQ_START (would result in nested call sequences).
13841 if (Node == FPNode || Node->getOpcode() == ISD::CALLSEQ_START)
13842 return false;
13843
13844 if (Node->getOpcode() == ISD::CALLSEQ_END) {
13845 // Defer looking into call sequences (so we can check we're outside one).
13846 // We still need to look through these for the predecessor check.
13847 DeferredNodes.push_back(Node);
13848 continue;
13849 }
13850
13851 for (SDValue Op : Node->ops())
13852 Worklist.push_back(Op.getNode());
13853 }
13854
13855 // True if we're outside a call sequence and don't have the FPNode as a
13856 // predecessor. No cycles or nested call sequences possible.
13857 return !SDNode::hasPredecessorHelper(FPNode, Visited, DeferredNodes,
13858 MaxSteps);
13859}
13860
13862 SelectionDAG &DAG, RTLIB::Libcall LC, SDNode *Node,
13864 std::optional<unsigned> CallRetResNo) const {
13865 if (LC == RTLIB::UNKNOWN_LIBCALL)
13866 return false;
13867
13868 RTLIB::LibcallImpl LibcallImpl = getLibcallImpl(LC);
13869 if (LibcallImpl == RTLIB::Unsupported)
13870 return false;
13871
13872 LLVMContext &Ctx = *DAG.getContext();
13873 EVT VT = Node->getValueType(0);
13874 unsigned NumResults = Node->getNumValues();
13875
13876 // Find users of the node that store the results (and share input chains). The
13877 // destination pointers can be used instead of creating stack allocations.
13878 SDValue StoresInChain;
13879 SmallVector<StoreSDNode *, 2> ResultStores(NumResults);
13880 for (SDNode *User : Node->users()) {
13882 continue;
13883 auto *ST = cast<StoreSDNode>(User);
13884 SDValue StoreValue = ST->getValue();
13885 unsigned ResNo = StoreValue.getResNo();
13886 // Ensure the store corresponds to an output pointer.
13887 if (CallRetResNo == ResNo)
13888 continue;
13889 // Ensure the store to the default address space and not atomic or volatile.
13890 if (!ST->isSimple() || ST->getAddressSpace() != 0)
13891 continue;
13892 // Ensure all store chains are the same (so they don't alias).
13893 if (StoresInChain && ST->getChain() != StoresInChain)
13894 continue;
13895 // Ensure the store is properly aligned.
13896 Type *StoreType = StoreValue.getValueType().getTypeForEVT(Ctx);
13897 if (ST->getAlign() <
13898 DAG.getDataLayout().getABITypeAlign(StoreType->getScalarType()))
13899 continue;
13900 // Avoid:
13901 // 1. Creating cyclic dependencies.
13902 // 2. Expanding the node to a call within a call sequence.
13904 continue;
13905 ResultStores[ResNo] = ST;
13906 StoresInChain = ST->getChain();
13907 }
13908
13909 ArgListTy Args;
13910
13911 // Pass the arguments.
13912 for (const SDValue &Op : Node->op_values()) {
13913 EVT ArgVT = Op.getValueType();
13914 Type *ArgTy = ArgVT.getTypeForEVT(Ctx);
13915 Args.emplace_back(Op, ArgTy);
13916 }
13917
13918 // Pass the output pointers.
13919 SmallVector<SDValue, 2> ResultPtrs(NumResults);
13921 for (auto [ResNo, ST] : llvm::enumerate(ResultStores)) {
13922 if (ResNo == CallRetResNo)
13923 continue;
13924 EVT ResVT = Node->getValueType(ResNo);
13925 SDValue ResultPtr = ST ? ST->getBasePtr() : DAG.CreateStackTemporary(ResVT);
13926 ResultPtrs[ResNo] = ResultPtr;
13927 Args.emplace_back(ResultPtr, PointerTy);
13928 }
13929
13930 SDLoc DL(Node);
13931
13933 // Pass the vector mask (if required).
13934 EVT MaskVT = getSetCCResultType(DAG.getDataLayout(), Ctx, VT);
13935 SDValue Mask = DAG.getBoolConstant(true, DL, MaskVT, VT);
13936 Args.emplace_back(Mask, MaskVT.getTypeForEVT(Ctx));
13937 }
13938
13939 Type *RetType = CallRetResNo.has_value()
13940 ? Node->getValueType(*CallRetResNo).getTypeForEVT(Ctx)
13941 : Type::getVoidTy(Ctx);
13942 SDValue InChain = StoresInChain ? StoresInChain : DAG.getEntryNode();
13943 SDValue Callee =
13944 DAG.getExternalSymbol(LibcallImpl, getPointerTy(DAG.getDataLayout()));
13946 CLI.setDebugLoc(DL).setChain(InChain).setLibCallee(
13947 getLibcallImplCallingConv(LibcallImpl), RetType, Callee, std::move(Args));
13948
13949 auto [Call, CallChain] = LowerCallTo(CLI);
13950
13951 for (auto [ResNo, ResultPtr] : llvm::enumerate(ResultPtrs)) {
13952 if (ResNo == CallRetResNo) {
13953 Results.push_back(Call);
13954 continue;
13955 }
13956 MachinePointerInfo PtrInfo;
13957 SDValue LoadResult = DAG.getLoad(Node->getValueType(ResNo), DL, CallChain,
13958 ResultPtr, PtrInfo);
13959 SDValue OutChain = LoadResult.getValue(1);
13960
13961 if (StoreSDNode *ST = ResultStores[ResNo]) {
13962 // Replace store with the library call.
13963 DAG.ReplaceAllUsesOfValueWith(SDValue(ST, 0), OutChain);
13964 PtrInfo = ST->getPointerInfo();
13965 } else {
13967 DAG.getMachineFunction(),
13968 cast<FrameIndexSDNode>(ResultPtr)->getIndex());
13969 }
13970
13971 Results.push_back(LoadResult);
13972 }
13973
13974 return true;
13975}
13976
13978 SDValue &LHS, SDValue &RHS,
13979 SDValue &CC, bool &NeedInvert,
13980 const SDLoc &dl, SDValue &Chain,
13981 bool IsSignaling) const {
13982 MVT OpVT = LHS.getSimpleValueType();
13983 ISD::CondCode CCCode = cast<CondCodeSDNode>(CC)->get();
13984 NeedInvert = false;
13985 switch (getCondCodeAction(CCCode, OpVT)) {
13986 default:
13987 llvm_unreachable("Unknown condition code action!");
13989 // Nothing to do.
13990 break;
13993 if (isCondCodeLegalOrCustom(InvCC, OpVT)) {
13994 std::swap(LHS, RHS);
13995 CC = DAG.getCondCode(InvCC);
13996 return true;
13997 }
13998 // Swapping operands didn't work. Try inverting the condition.
13999 bool NeedSwap = false;
14000 InvCC = getSetCCInverse(CCCode, OpVT);
14001 if (!isCondCodeLegalOrCustom(InvCC, OpVT)) {
14002 // If inverting the condition is not enough, try swapping operands
14003 // on top of it.
14004 InvCC = ISD::getSetCCSwappedOperands(InvCC);
14005 NeedSwap = true;
14006 }
14007 if (isCondCodeLegalOrCustom(InvCC, OpVT)) {
14008 CC = DAG.getCondCode(InvCC);
14009 NeedInvert = true;
14010 if (NeedSwap)
14011 std::swap(LHS, RHS);
14012 return true;
14013 }
14014
14015 // Special case: expand i1 comparisons using logical operations.
14016 if (OpVT == MVT::i1) {
14017 SDValue Ret;
14018 switch (CCCode) {
14019 default:
14020 llvm_unreachable("Unknown integer setcc!");
14021 case ISD::SETEQ: // X == Y --> ~(X ^ Y)
14022 Ret = DAG.getNOT(dl, DAG.getNode(ISD::XOR, dl, MVT::i1, LHS, RHS),
14023 MVT::i1);
14024 break;
14025 case ISD::SETNE: // X != Y --> (X ^ Y)
14026 Ret = DAG.getNode(ISD::XOR, dl, MVT::i1, LHS, RHS);
14027 break;
14028 case ISD::SETGT: // X >s Y --> X == 0 & Y == 1 --> ~X & Y
14029 case ISD::SETULT: // X <u Y --> X == 0 & Y == 1 --> ~X & Y
14030 Ret = DAG.getNode(ISD::AND, dl, MVT::i1, RHS,
14031 DAG.getNOT(dl, LHS, MVT::i1));
14032 break;
14033 case ISD::SETLT: // X <s Y --> X == 1 & Y == 0 --> ~Y & X
14034 case ISD::SETUGT: // X >u Y --> X == 1 & Y == 0 --> ~Y & X
14035 Ret = DAG.getNode(ISD::AND, dl, MVT::i1, LHS,
14036 DAG.getNOT(dl, RHS, MVT::i1));
14037 break;
14038 case ISD::SETULE: // X <=u Y --> X == 0 | Y == 1 --> ~X | Y
14039 case ISD::SETGE: // X >=s Y --> X == 0 | Y == 1 --> ~X | Y
14040 Ret = DAG.getNode(ISD::OR, dl, MVT::i1, RHS,
14041 DAG.getNOT(dl, LHS, MVT::i1));
14042 break;
14043 case ISD::SETUGE: // X >=u Y --> X == 1 | Y == 0 --> ~Y | X
14044 case ISD::SETLE: // X <=s Y --> X == 1 | Y == 0 --> ~Y | X
14045 Ret = DAG.getNode(ISD::OR, dl, MVT::i1, LHS,
14046 DAG.getNOT(dl, RHS, MVT::i1));
14047 break;
14048 }
14049
14050 LHS = DAG.getZExtOrTrunc(Ret, dl, VT);
14051 RHS = SDValue();
14052 CC = SDValue();
14053 return true;
14054 }
14055
14057 unsigned Opc = 0;
14058 switch (CCCode) {
14059 default:
14060 llvm_unreachable("Don't know how to expand this condition!");
14061 case ISD::SETUO:
14062 if (isCondCodeLegal(ISD::SETUNE, OpVT)) {
14063 CC1 = ISD::SETUNE;
14064 CC2 = ISD::SETUNE;
14065 Opc = ISD::OR;
14066 break;
14067 }
14069 "If SETUE is expanded, SETOEQ or SETUNE must be legal!");
14070 NeedInvert = true;
14071 [[fallthrough]];
14072 case ISD::SETO:
14074 "If SETO is expanded, SETOEQ must be legal!");
14075 CC1 = ISD::SETOEQ;
14076 CC2 = ISD::SETOEQ;
14077 Opc = ISD::AND;
14078 break;
14079 case ISD::SETONE:
14080 case ISD::SETUEQ:
14081 // If the SETUO or SETO CC isn't legal, we might be able to use
14082 // SETOGT || SETOLT, inverting the result for SETUEQ. We only need one
14083 // of SETOGT/SETOLT to be legal, the other can be emulated by swapping
14084 // the operands.
14085 CC2 = ((unsigned)CCCode & 0x8U) ? ISD::SETUO : ISD::SETO;
14086 if (!isCondCodeLegal(CC2, OpVT) && (isCondCodeLegal(ISD::SETOGT, OpVT) ||
14087 isCondCodeLegal(ISD::SETOLT, OpVT))) {
14088 CC1 = ISD::SETOGT;
14089 CC2 = ISD::SETOLT;
14090 Opc = ISD::OR;
14091 NeedInvert = ((unsigned)CCCode & 0x8U);
14092 break;
14093 }
14094 [[fallthrough]];
14095 case ISD::SETOEQ:
14096 case ISD::SETOGT:
14097 case ISD::SETOGE:
14098 case ISD::SETOLT:
14099 case ISD::SETOLE:
14100 case ISD::SETUNE:
14101 case ISD::SETUGT:
14102 case ISD::SETUGE:
14103 case ISD::SETULT:
14104 case ISD::SETULE:
14105 // If we are floating point, assign and break, otherwise fall through.
14106 if (!OpVT.isInteger()) {
14107 // We can use the 4th bit to tell if we are the unordered
14108 // or ordered version of the opcode.
14109 CC2 = ((unsigned)CCCode & 0x8U) ? ISD::SETUO : ISD::SETO;
14110 Opc = ((unsigned)CCCode & 0x8U) ? ISD::OR : ISD::AND;
14111 CC1 = (ISD::CondCode)(((int)CCCode & 0x7) | 0x10);
14112 break;
14113 }
14114 // Fallthrough if we are unsigned integer.
14115 [[fallthrough]];
14116 case ISD::SETLE:
14117 case ISD::SETGT:
14118 case ISD::SETGE:
14119 case ISD::SETLT:
14120 case ISD::SETNE:
14121 case ISD::SETEQ:
14122 // If all combinations of inverting the condition and swapping operands
14123 // didn't work then we have no means to expand the condition.
14124 llvm_unreachable("Don't know how to expand this condition!");
14125 }
14126
14127 SDValue SetCC1, SetCC2;
14128 if (CCCode != ISD::SETO && CCCode != ISD::SETUO) {
14129 // If we aren't the ordered or unorder operation,
14130 // then the pattern is (LHS CC1 RHS) Opc (LHS CC2 RHS).
14131 SetCC1 = DAG.getSetCC(dl, VT, LHS, RHS, CC1, Chain, IsSignaling);
14132 SetCC2 = DAG.getSetCC(dl, VT, LHS, RHS, CC2, Chain, IsSignaling);
14133 } else {
14134 // Otherwise, the pattern is (LHS CC1 LHS) Opc (RHS CC2 RHS)
14135 SetCC1 = DAG.getSetCC(dl, VT, LHS, LHS, CC1, Chain, IsSignaling);
14136 SetCC2 = DAG.getSetCC(dl, VT, RHS, RHS, CC2, Chain, IsSignaling);
14137 }
14138 if (Chain)
14139 Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, SetCC1.getValue(1),
14140 SetCC2.getValue(1));
14141 LHS = DAG.getNode(Opc, dl, VT, SetCC1, SetCC2);
14142 RHS = SDValue();
14143 CC = SDValue();
14144 return true;
14145 }
14146 }
14147 return false;
14148}
14149
14151 SelectionDAG &DAG) const {
14152 EVT VT = Node->getValueType(0);
14153 // Despite its documentation, GetSplitDestVTs will assert if VT cannot be
14154 // split into two equal parts.
14155 if (!VT.isVector() || !VT.getVectorElementCount().isKnownMultipleOf(2))
14156 return SDValue();
14157
14158 // Restrict expansion to cases where both parts can be concatenated.
14159 auto [LoVT, HiVT] = DAG.GetSplitDestVTs(VT);
14160 if (LoVT != HiVT || !isTypeLegal(LoVT))
14161 return SDValue();
14162
14163 SDLoc DL(Node);
14164 unsigned Opcode = Node->getOpcode();
14165
14166 // Don't expand if the result is likely to be unrolled anyway.
14167 if (!isOperationLegalOrCustomOrPromote(Opcode, LoVT))
14168 return SDValue();
14169
14170 SmallVector<SDValue, 4> LoOps, HiOps;
14171 for (const SDValue &V : Node->op_values()) {
14172 if (!V.getValueType().isVector()) {
14173 // Scalar operands pass through to both halves unchanged.
14174 LoOps.push_back(V);
14175 HiOps.push_back(V);
14176 continue;
14177 }
14178 auto [Lo, Hi] = DAG.SplitVector(V, DL, LoVT, HiVT);
14179 LoOps.push_back(Lo);
14180 HiOps.push_back(Hi);
14181 }
14182
14183 SDValue SplitOpLo = DAG.getNode(Opcode, DL, LoVT, LoOps, Node->getFlags());
14184 SDValue SplitOpHi = DAG.getNode(Opcode, DL, HiVT, HiOps, Node->getFlags());
14185 return DAG.getNode(ISD::CONCAT_VECTORS, DL, VT, SplitOpLo, SplitOpHi);
14186}
14187
14189 const SDLoc &DL,
14190 EVT InVecVT, SDValue EltNo,
14191 LoadSDNode *OriginalLoad,
14192 SelectionDAG &DAG) const {
14193 assert(OriginalLoad->isSimple());
14194
14195 EVT VecEltVT = InVecVT.getVectorElementType();
14196
14197 // If the vector element type is not a multiple of a byte then we are unable
14198 // to correctly compute an address to load only the extracted element as a
14199 // scalar.
14200 if (!VecEltVT.isByteSized())
14201 return SDValue();
14202
14203 ISD::LoadExtType ExtTy =
14204 ResultVT.bitsGT(VecEltVT) ? ISD::EXTLOAD : ISD::NON_EXTLOAD;
14205 if (!isOperationLegalOrCustom(ISD::LOAD, VecEltVT))
14206 return SDValue();
14207
14208 std::optional<unsigned> ByteOffset;
14209 Align Alignment = OriginalLoad->getAlign();
14211 if (auto *ConstEltNo = dyn_cast<ConstantSDNode>(EltNo)) {
14212 int Elt = ConstEltNo->getZExtValue();
14213 ByteOffset = VecEltVT.getSizeInBits() * Elt / 8;
14214 MPI = OriginalLoad->getPointerInfo().getWithOffset(*ByteOffset);
14215 Alignment = commonAlignment(Alignment, *ByteOffset);
14216 } else {
14217 // Discard the pointer info except the address space because the memory
14218 // operand can't represent this new access since the offset is variable.
14219 MPI = MachinePointerInfo(OriginalLoad->getPointerInfo().getAddrSpace());
14220 Alignment = commonAlignment(Alignment, VecEltVT.getSizeInBits() / 8);
14221 }
14222
14223 if (!shouldReduceLoadWidth(OriginalLoad, ExtTy, VecEltVT, ByteOffset))
14224 return SDValue();
14225
14226 unsigned IsFast = 0;
14227 if (!allowsMemoryAccess(*DAG.getContext(), DAG.getDataLayout(), VecEltVT,
14228 OriginalLoad->getAddressSpace(), Alignment,
14229 OriginalLoad->getMemOperand()->getFlags(), &IsFast) ||
14230 !IsFast)
14231 return SDValue();
14232
14233 // The original DAG loaded the entire vector from memory, so arithmetic
14234 // within it must be inbounds.
14236 DAG, OriginalLoad->getBasePtr(), InVecVT, EltNo);
14237
14238 // We are replacing a vector load with a scalar load. The new load must have
14239 // identical memory op ordering to the original.
14240 SDValue Load;
14241 if (ResultVT.bitsGT(VecEltVT)) {
14242 // If the result type of vextract is wider than the load, then issue an
14243 // extending load instead.
14244 ISD::LoadExtType ExtType =
14245 isLoadLegal(ResultVT, VecEltVT, Alignment,
14246 OriginalLoad->getAddressSpace(), ISD::ZEXTLOAD, false)
14248 : ISD::EXTLOAD;
14249 Load = DAG.getExtLoad(ExtType, DL, ResultVT, OriginalLoad->getChain(),
14250 NewPtr, MPI, VecEltVT, Alignment,
14251 OriginalLoad->getMemOperand()->getFlags(),
14252 OriginalLoad->getAAInfo());
14253 DAG.makeEquivalentMemoryOrdering(OriginalLoad, Load);
14254 } else {
14255 // The result type is narrower or the same width as the vector element
14256 Load = DAG.getLoad(VecEltVT, DL, OriginalLoad->getChain(), NewPtr, MPI,
14257 Alignment, OriginalLoad->getMemOperand()->getFlags(),
14258 OriginalLoad->getAAInfo());
14259 DAG.makeEquivalentMemoryOrdering(OriginalLoad, Load);
14260 if (ResultVT.bitsLT(VecEltVT))
14261 Load = DAG.getNode(ISD::TRUNCATE, DL, ResultVT, Load);
14262 else
14263 Load = DAG.getBitcast(ResultVT, Load);
14264 }
14265
14266 return Load;
14267}
14268
14269// Set type id for call site info and metadata 'call_target'.
14270// We are filtering for:
14271// a) The call-graph-section use case that wants to know about indirect
14272// calls, or
14273// b) We want to annotate indirect calls.
14275 const CallBase *CB, MachineFunction &MF,
14276 MachineFunction::CallSiteInfo &CSInfo) const {
14277 if (CB && CB->isIndirectCall() &&
14280 CSInfo = MachineFunction::CallSiteInfo(*CB);
14281}
return SDValue()
unsigned RegSize
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
unsigned Imm
unsigned uint64_t
constexpr LLT F32
AMDGPU Register Bank Select
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
Function Alias Analysis Results
#define X(NUM, ENUM, NAME)
Definition ELF.h:857
block Block Frequency Analysis
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static std::optional< bool > isBigEndian(const SmallDenseMap< int64_t, int64_t, 8 > &MemOffset2Idx, int64_t LowestIdx)
Given a map from byte offsets in memory to indices in a load/store, determine if that map corresponds...
static bool isSigned(unsigned Opcode)
#define _
static bool ShrinkDemandedConstant(Instruction *I, unsigned OpNo, const APInt &Demanded)
Check to see if the specified operand of the specified instruction is a constant integer.
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
#define RegName(no)
lazy value info
static bool isNonZeroModBitWidthOrUndef(const MachineRegisterInfo &MRI, Register Reg, unsigned BW)
static bool isZero(Value *V, const DataLayout &DL, DominatorTree *DT, AssumptionCache *AC)
Definition Lint.cpp:539
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
#define G(x, y, z)
Definition MD5.cpp:55
static bool isUndef(const MachineInstr &MI)
Register const TargetRegisterInfo * TRI
#define T
#define T1
uint64_t High
#define P(N)
Function const char * Passes
if(auto Err=PB.parsePassPipeline(MPM, Passes)) return wrap(std MPM run * Mod
R600 Clause Merge
const SmallVectorImpl< MachineOperand > & Cond
Contains matchers for matching SelectionDAG nodes and values.
This file contains some templates that are useful if you are working with the STL at all.
static cl::opt< unsigned > MaxSteps("has-predecessor-max-steps", cl::Hidden, cl::init(8192), cl::desc("DAG combiner limit number of steps when searching DAG " "for predecessor nodes"))
static TableGen::Emitter::Opt Y("gen-skeleton-entry", EmitSkeleton, "Generate example skeleton entry")
static std::pair< SDValue, SDValue > getLegalMaskAndStepVector(SDValue Mask, bool ZeroIsPoison, SDLoc DL, SelectionDAG &DAG)
Returns a type-legalized version of Mask as the first item in the pair.
static SDValue foldSetCCWithFunnelShift(EVT VT, SDValue N0, SDValue N1, ISD::CondCode Cond, const SDLoc &dl, SelectionDAG &DAG)
static bool lowerImmediateIfPossible(TargetLowering::ConstraintPair &P, SDValue Op, SelectionDAG *DAG, const TargetLowering &TLI)
If we have an immediate, see if we can lower it.
#define FP_CMP_LIBCALL(BASE)
static APInt getKnownUndefForVectorBinop(SDValue BO, SelectionDAG &DAG, const APInt &UndefOp0, const APInt &UndefOp1)
Given a vector binary operation and known undefined elements for each input operand,...
static SDValue BuildExactUDIV(const TargetLowering &TLI, SDNode *N, const SDLoc &dl, SelectionDAG &DAG, SmallVectorImpl< SDNode * > &Created)
Given an exact UDIV by a constant, create a multiplication with the multiplicative inverse of the con...
static std::pair< RTLIB::Libcall, ISD::CondCode > selectFPCmpLibcall(const LibcallLoweringInfo &Libcalls, RTLIB::Libcall BoolLC, RTLIB::Libcall TriStateLC, RTLIB::Libcall GenericLC, ISD::CondCode TriStateCC)
Select the libcall and the condition code to test its result against 0 for an ordered floating-point ...
static SDValue isSpecificZeroAfterMaybeRounding(SelectionDAG &DAG, const TargetLowering &TLI, const SDLoc &DL, SDValue Val, FPClassTest FPClass)
static bool canNarrowCLMULToLegal(const TargetLowering &TLI, LLVMContext &Ctx, EVT VT, unsigned HalveDepth=0, unsigned TotalDepth=0)
Check if CLMUL on VT can eventually reach a type with legal CLMUL through a chain of halving decompos...
static SDValue clampDynamicVectorIndex(SelectionDAG &DAG, SDValue Idx, EVT VecVT, const SDLoc &dl, ElementCount SubEC)
static unsigned getConstraintPiority(TargetLowering::ConstraintType CT)
Return a number indicating our preference for chosing a type of constraint over another,...
static std::optional< bool > isFCmpEqualZero(FPClassTest Test, const fltSemantics &Semantics, const MachineFunction &MF)
Returns a true value if if this FPClassTest can be performed with an ordered fcmp to 0,...
static bool canFoldStoreIntoLibCallOutputPointers(StoreSDNode *StoreNode, SDNode *FPNode)
Given a store node StoreNode, return true if it is safe to fold that node into FPNode,...
static void turnVectorIntoSplatVector(MutableArrayRef< SDValue > Values, std::function< bool(SDValue)> Predicate, SDValue AlternativeReplacement=SDValue())
If all values in Values that don't match the predicate are same 'splat' value, then replace all value...
static bool canExpandVectorCTPOP(const TargetLowering &TLI, EVT VT)
static SDValue foldSetCCWithRotate(EVT VT, SDValue N0, SDValue N1, ISD::CondCode Cond, const SDLoc &dl, SelectionDAG &DAG)
static SDValue BuildExactSDIV(const TargetLowering &TLI, SDNode *N, const SDLoc &dl, SelectionDAG &DAG, SmallVectorImpl< SDNode * > &Created)
Given an exact SDIV by a constant, create a multiplication with the multiplicative inverse of the con...
static SDValue simplifySetCCWithCTPOP(const TargetLowering &TLI, EVT VT, SDValue N0, const APInt &C1, ISD::CondCode Cond, const SDLoc &dl, SelectionDAG &DAG)
static SDValue combineShiftToAVG(SDValue Op, TargetLowering::TargetLoweringOpt &TLO, const TargetLowering &TLI, const APInt &DemandedBits, const APInt &DemandedElts, unsigned Depth)
This file describes how to lower LLVM code to machine code.
static int Lookup(ArrayRef< TableEntry > Table, unsigned Opcode)
static SDValue scalarizeVectorStore(StoreSDNode *Store, MVT StoreVT, SelectionDAG &DAG)
Scalarize a vector store, bitcasting to TargetVT to determine the scalar type.
Value * RHS
Value * LHS
The Input class is used to parse a yaml document into in-memory structs and vectors.
static LLVM_ABI const llvm::fltSemantics & EnumToSemantics(Semantics S)
Definition APFloat.cpp:134
static constexpr roundingMode rmTowardZero
Definition APFloat.h:365
static LLVM_ABI ExponentType semanticsMinExponent(const fltSemantics &)
Definition APFloat.cpp:326
static LLVM_ABI bool semanticsHasSignedRepr(const fltSemantics &)
Definition APFloat.cpp:347
static LLVM_ABI unsigned getSizeInBits(const fltSemantics &Sem)
Returns the size of the floating point number (in bits) in the given semantics.
Definition APFloat.cpp:382
static constexpr roundingMode rmNearestTiesToEven
Definition APFloat.h:361
static LLVM_ABI unsigned int semanticsPrecision(const fltSemantics &)
Definition APFloat.cpp:318
static LLVM_ABI bool isIEEELikeFP(const fltSemantics &)
Definition APFloat.cpp:359
opStatus
IEEE-754R 7: Default exception handling.
Definition APFloat.h:377
opStatus convertFromAPInt(const APInt &Input, bool IsSigned, roundingMode RM)
Definition APFloat.h:1451
static APFloat getSmallestNormalized(const fltSemantics &Sem, bool Negative=false)
Returns the smallest (by magnitude) normalized finite number in the given semantics.
Definition APFloat.h:1262
APInt bitcastToAPInt() const
Definition APFloat.h:1475
static APFloat getLargest(const fltSemantics &Sem, bool Negative=false)
Returns the largest finite number in the given semantics.
Definition APFloat.h:1242
static APFloat getInf(const fltSemantics &Sem, bool Negative=false)
Factory for Positive and Negative Infinity.
Definition APFloat.h:1202
void changeSign()
Definition APFloat.h:1401
static APFloat getNaN(const fltSemantics &Sem, bool Negative=false, uint64_t payload=0)
Factory for NaN values.
Definition APFloat.h:1213
Class for arbitrary precision integers.
Definition APInt.h:78
LLVM_ABI APInt udiv(const APInt &RHS) const
Unsigned division operation.
Definition APInt.cpp:1602
static APInt getAllOnes(unsigned numBits)
Return an APInt of a specified width with all bits set.
Definition APInt.h:231
static LLVM_ABI void udivrem(const APInt &LHS, const APInt &RHS, APInt &Quotient, APInt &Remainder)
Dual division/remainder interface.
Definition APInt.cpp:1796
void clearBit(unsigned BitPosition)
Set a given bit to 0.
Definition APInt.h:1427
bool isNegatedPowerOf2() const
Check if this APInt's negated value is a power of two greater than zero.
Definition APInt.h:446
LLVM_ABI APInt zext(unsigned width) const
Zero extend to a new width.
Definition APInt.cpp:1057
static APInt getSignMask(unsigned BitWidth)
Get the SignMask for a specific bit width.
Definition APInt.h:226
bool isMinSignedValue() const
Determine if this is the smallest signed value.
Definition APInt.h:420
uint64_t getZExtValue() const
Get zero extended value.
Definition APInt.h:1561
void setHighBits(unsigned hiBits)
Set the top hiBits bits.
Definition APInt.h:1412
LLVM_ABI APInt zextOrTrunc(unsigned width) const
Zero extend or truncate to width.
Definition APInt.cpp:1078
unsigned getActiveBits() const
Compute the number of active bits in the value.
Definition APInt.h:1533
LLVM_ABI APInt trunc(unsigned width) const
Truncate to new width.
Definition APInt.cpp:970
static APInt getMaxValue(unsigned numBits)
Gets maximum unsigned value of APInt for specific bit width.
Definition APInt.h:203
void setBit(unsigned BitPosition)
Set the given bit to 1 whose position is given as "bitPosition".
Definition APInt.h:1351
bool isAllOnes() const
Determine if all bits are set. This is true for zero-width values.
Definition APInt.h:368
bool ugt(const APInt &RHS) const
Unsigned greater than comparison.
Definition APInt.h:1187
static APInt getBitsSet(unsigned numBits, unsigned loBit, unsigned hiBit)
Get a value with a block of bits set.
Definition APInt.h:255
bool isZero() const
Determine if this value is zero, i.e. all bits are clear.
Definition APInt.h:377
LLVM_ABI APInt urem(const APInt &RHS) const
Unsigned remainder operation.
Definition APInt.cpp:1695
void setSignBit()
Set the sign bit to 1.
Definition APInt.h:1361
unsigned getBitWidth() const
Return the number of bits in the APInt.
Definition APInt.h:1509
static APInt getSignedMaxValue(unsigned numBits)
Gets maximum signed value of APInt for a specific bit width.
Definition APInt.h:206
static APInt getMinValue(unsigned numBits)
Gets minimum unsigned value of APInt for a specific bit width.
Definition APInt.h:213
bool isNegative() const
Determine sign of this APInt.
Definition APInt.h:326
bool intersects(const APInt &RHS) const
This operation tests if there are any pairs of corresponding bits between this APInt and RHS that are...
Definition APInt.h:1254
void clearAllBits()
Set every bit to 0.
Definition APInt.h:1417
void ashrInPlace(unsigned ShiftAmt)
Arithmetic right-shift this APInt by ShiftAmt in place.
Definition APInt.h:837
LLVM_ABI APInt uadd_ov(const APInt &RHS, bool &Overflow) const
Definition APInt.cpp:1973
void negate()
Negate this APInt in place.
Definition APInt.h:1489
unsigned countr_zero() const
Count the number of trailing zero bits.
Definition APInt.h:1660
unsigned countl_zero() const
The APInt version of std::countl_zero.
Definition APInt.h:1619
static LLVM_ABI APInt getSplat(unsigned NewLen, const APInt &V)
Return a value containing V broadcasted over NewLen bits.
Definition APInt.cpp:648
static APInt getSignedMinValue(unsigned numBits)
Gets minimum signed value of APInt for a specific bit width.
Definition APInt.h:216
unsigned getSignificantBits() const
Get the minimum bit size for this signed APInt.
Definition APInt.h:1552
unsigned countLeadingZeros() const
Definition APInt.h:1627
bool isStrictlyPositive() const
Determine if this APInt Value is positive.
Definition APInt.h:353
LLVM_ABI void insertBits(const APInt &SubBits, unsigned bitPosition)
Insert the bits from a smaller APInt starting at bitPosition.
Definition APInt.cpp:393
void clearLowBits(unsigned loBits)
Set bottom loBits bits to 0.
Definition APInt.h:1456
unsigned logBase2() const
Definition APInt.h:1782
uint64_t getLimitedValue(uint64_t Limit=UINT64_MAX) const
If this value is smaller than the specified limit, return it, otherwise return the limit value.
Definition APInt.h:472
APInt ashr(unsigned ShiftAmt) const
Arithmetic right-shift function.
Definition APInt.h:830
void setAllBits()
Set every bit to 1.
Definition APInt.h:1340
LLVM_ABI APInt multiplicativeInverse() const
Definition APInt.cpp:1303
bool isMask(unsigned numBits) const
Definition APInt.h:485
bool isMaxSignedValue() const
Determine if this is the largest signed value.
Definition APInt.h:402
bool isNonNegative() const
Determine if this APInt Value is non-negative (>= 0)
Definition APInt.h:331
bool ule(const APInt &RHS) const
Unsigned less or equal comparison.
Definition APInt.h:1155
LLVM_ABI APInt sext(unsigned width) const
Sign extend to a new width.
Definition APInt.cpp:1030
void setBits(unsigned loBit, unsigned hiBit)
Set the bits from loBit (inclusive) to hiBit (exclusive) to 1.
Definition APInt.h:1388
APInt shl(unsigned shiftAmt) const
Left-shift function.
Definition APInt.h:876
bool isSubsetOf(const APInt &RHS) const
This operation checks that all bits set in this APInt are also set in RHS.
Definition APInt.h:1262
bool isPowerOf2() const
Check if this APInt's value is a power of two greater than zero.
Definition APInt.h:437
static APInt getLowBitsSet(unsigned numBits, unsigned loBitsSet)
Constructs an APInt value that has the bottom loBitsSet bits set.
Definition APInt.h:303
void clearBits(unsigned LoBit, unsigned HiBit)
Clear the bits from LoBit (inclusive) to HiBit (exclusive) to 0.
Definition APInt.h:1438
static APInt getHighBitsSet(unsigned numBits, unsigned hiBitsSet)
Constructs an APInt value that has the top hiBitsSet bits set.
Definition APInt.h:293
static APInt getZero(unsigned numBits)
Get the '0' value for the specified bit-width.
Definition APInt.h:197
void setLowBits(unsigned loBits)
Set the bottom loBits bits.
Definition APInt.h:1409
LLVM_ABI APInt extractBits(unsigned numBits, unsigned bitPosition) const
Return an APInt with the extracted bits [bitPosition,bitPosition+numBits).
Definition APInt.cpp:478
bool isOne() const
Determine if this is a value of 1.
Definition APInt.h:386
static APInt getBitsSetFrom(unsigned numBits, unsigned loBit)
Constructs an APInt value that has a contiguous range of bits set.
Definition APInt.h:283
static APInt getOneBitSet(unsigned numBits, unsigned BitNo)
Return an APInt with exactly one bit set in the result.
Definition APInt.h:236
void clearHighBits(unsigned hiBits)
Set top hiBits bits to 0.
Definition APInt.h:1463
int64_t getSExtValue() const
Get sign extended value.
Definition APInt.h:1583
void lshrInPlace(unsigned ShiftAmt)
Logical right-shift this APInt by ShiftAmt in place.
Definition APInt.h:861
APInt lshr(unsigned shiftAmt) const
Logical right-shift function.
Definition APInt.h:854
unsigned countr_one() const
Count the number of trailing one bits.
Definition APInt.h:1677
bool uge(const APInt &RHS) const
Unsigned greater or equal comparison.
Definition APInt.h:1226
void setBitVal(unsigned BitPosition, bool BitValue)
Set a given bit to a given value.
Definition APInt.h:1364
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
size_t size() const
Get the array size.
Definition ArrayRef.h:141
A "pseudo-class" with methods for operating on BUILD_VECTORs.
LLVM_ABI ConstantSDNode * getConstantSplatNode(const APInt &DemandedElts, BitVector *UndefElements=nullptr) const
Returns the demanded splatted constant or null if this is not a constant splat.
CCValAssign - Represent assignment of one arg/retval to a location.
Register getLocReg() const
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
LLVM_ABI bool isIndirectCall() const
Return true if the callsite is an indirect call.
This class represents a function call, abstracting a target machine's calling convention.
static Constant * get(LLVMContext &Context, ArrayRef< ElementTy > Elts)
get() constructor - Return a constant with array type with an element count and element type matching...
Definition Constants.h:878
ConstantFP - Floating Point Values [float, double].
Definition Constants.h:420
This class represents a range of values.
const APInt & getAPIntValue() const
This is an important base class in LLVM.
Definition Constant.h:43
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
bool isLittleEndian() const
Layout endianness...
Definition DataLayout.h:217
LLVM_ABI Align getABITypeAlign(Type *Ty) const
Returns the minimum ABI-required alignment for the specified type.
LLVM_ABI Align getPrefTypeAlign(Type *Ty) const
Returns the preferred stack/global alignment for the specified type.
static constexpr ElementCount getFixed(ScalarTy MinVal)
Definition TypeSize.h:305
static constexpr ElementCount get(ScalarTy MinVal, bool Scalable)
Definition TypeSize.h:311
AttributeList getAttributes() const
Return the attribute list for this Function.
Definition Function.h:329
const GlobalValue * getGlobal() const
Module * getParent()
Get the module that this global value is contained inside of...
std::vector< std::string > ConstraintCodeVector
Definition InlineAsm.h:104
static LLVM_ABI IntegerType * get(LLVMContext &C, unsigned NumBits)
This static method is the primary way of constructing an IntegerType.
Definition Type.cpp:348
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:68
LLVM_ABI void emitError(const Instruction *I, const Twine &ErrorStr)
emitError - Emit an error message to the currently installed error handler with optional location inf...
Tracks which library functions to use for a particular subtarget or function.
RTLIB::LibcallImpl getLibcallImpl(RTLIB::Libcall Call) const
Return the lowering's selection of implementation call for Call.
This class is used to represent ISD::LOAD nodes.
const SDValue & getBasePtr() const
Context object for machine code objects.
Definition MCContext.h:83
Base class for the full range of assembler expressions which are needed for parsing.
Definition MCExpr.h:34
iterator_range< regclass_iterator > regclasses() const
Wrapper class representing physical registers. Should be passed by value.
Definition MCRegister.h:41
static const MCSymbolRefExpr * create(const MCSymbol *Symbol, MCContext &Ctx, SMLoc Loc=SMLoc())
Definition MCExpr.h:213
Machine Value Type.
SimpleValueType SimpleTy
bool isInteger() const
Return true if this is an integer or a vector integer type.
TypeSize getSizeInBits() const
Returns the size of the specified MVT in bits.
static MVT getIntegerVT(unsigned BitWidth)
MVT getScalarType() const
If this is a vector, return the element type, otherwise return this.
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted.
MachineFrameInfo & getFrameInfo()
getFrameInfo - Return the frame info object for the current function.
DenormalMode getDenormalMode(const fltSemantics &FPType) const
Returns the denormal handling type for the default rounding mode of the function.
MCSymbol * getJTISymbol(unsigned JTI, MCContext &Ctx, bool isLinkerPrivate=false) const
getJTISymbol - Return the MCSymbol for the specified non-empty jump table.
Function & getFunction()
Return the LLVM function that this machine code represents.
const TargetMachine & getTarget() const
getTarget - Return the target machine this machine code is compiled with
@ EK_LabelDifference32
EK_LabelDifference32 - Each entry is the address of the block minus the address of the jump table.
@ EK_BlockAddress
EK_BlockAddress - Each entry is a plain address of block, e.g.: .word LBB123.
Flags getFlags() const
Return the raw flags of the source value,.
static bool clobbersPhysReg(const uint32_t *RegMask, MCRegister PhysReg)
clobbersPhysReg - Returns true if this RegMask clobbers PhysReg.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
LLVM_ABI MCRegister getLiveInPhysReg(Register VReg) const
getLiveInPhysReg - If VReg is a live-in virtual register, return the corresponding live-in physical r...
unsigned getAddressSpace() const
Return the address space for the associated pointer.
Align getAlign() const
AAMDNodes getAAInfo() const
Returns the AA info that describes the dereference.
bool isSimple() const
Returns true if the memory operation is neither atomic or volatile.
MachineMemOperand * getMemOperand() const
Return the unique MachineMemOperand object describing the memory reference performed by operation.
const MachinePointerInfo & getPointerInfo() const
const SDValue & getChain() const
const GlobalVariable * getNamedGlobal(StringRef Name) const
Return the global variable in the module with the specified name, of arbitrary type.
Definition Module.h:526
Represent a mutable reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:294
Class to represent pointers.
static PointerType * getUnqual(LLVMContext &C)
This constructs an opaque pointer to an object in the default address space (address space zero).
static LLVM_ABI PointerType * get(LLVMContext &C, unsigned AddressSpace)
This constructs an opaque pointer to an object in a numbered address space.
Definition Type.cpp:911
Wrapper class representing virtual and physical registers.
Definition Register.h:20
Wrapper class for IR location info (IR ordering and DebugLoc) to be passed into SDNode creation funct...
Represents one node in the SelectionDAG.
ArrayRef< SDUse > ops() const
unsigned getOpcode() const
Return the SelectionDAG opcode value for this node.
bool hasOneUse() const
Return true if there is exactly one use of this node.
SDNodeFlags getFlags() const
static bool hasPredecessorHelper(const SDNode *N, SmallPtrSetImpl< const SDNode * > &Visited, SmallVectorImpl< const SDNode * > &Worklist, unsigned int MaxSteps=0, bool TopologicalPrune=false)
Returns true if N is a predecessor of any node in Worklist.
const SDValue & getOperand(unsigned Num) const
EVT getValueType(unsigned ResNo) const
Return the type of a specified result.
Unlike LLVM values, Selection DAG nodes may return multiple values as the result of a computation.
bool isUndef() const
SDNode * getNode() const
get the SDNode which holds the desired result
bool hasOneUse() const
Return true if there is exactly one node using value ResNo of Node, in exactly one operand.
SDValue getValue(unsigned R) const
EVT getValueType() const
Return the ValueType of the referenced return value.
TypeSize getValueSizeInBits() const
Returns the size of the value in bits.
const SDValue & getOperand(unsigned i) const
bool use_empty() const
Return true if there are no nodes using value ResNo of Node.
const APInt & getConstantOperandAPInt(unsigned i) const
uint64_t getScalarValueSizeInBits() const
unsigned getResNo() const
get the index which selects a specific result in the SDNode
uint64_t getConstantOperandVal(unsigned i) const
MVT getSimpleValueType() const
Return the simple ValueType of the referenced return value.
unsigned getOpcode() const
This is used to represent a portion of an LLVM function in a low-level Data Dependence DAG representa...
LLVM_ABI SDValue getElementCount(const SDLoc &DL, EVT VT, ElementCount EC)
bool willNotOverflowAdd(bool IsSigned, SDValue N0, SDValue N1) const
Determine if the result of the addition of 2 nodes can never overflow.
LLVM_ABI Align getReducedAlign(EVT VT, bool UseABI)
In most cases this function returns the ABI alignment for a given type, except for illegal vector typ...
LLVM_ABI bool isKnownNeverLogicalZero(SDValue Op, const APInt &DemandedElts, unsigned Depth=0) const
Test whether the given floating point SDValue (or all elements of it, if it is a vector) is known to ...
SDValue getTargetGlobalAddress(const GlobalValue *GV, const SDLoc &DL, EVT VT, int64_t offset=0, unsigned TargetFlags=0)
SDValue getExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT, unsigned Opcode)
Convert Op, which must be of integer type, to the integer type VT, by either any/sign/zero-extending ...
SDValue getExtractVectorElt(const SDLoc &DL, EVT VT, SDValue Vec, unsigned Idx)
Extract element at Idx from Vec.
LLVM_ABI unsigned ComputeMaxSignificantBits(SDValue Op, unsigned Depth=0) const
Get the upper bound on bit size for this Value Op as a signed integer.
LLVM_ABI SDValue FoldSetCC(EVT VT, SDValue N1, SDValue N2, ISD::CondCode Cond, const SDLoc &dl, SDNodeFlags Flags={})
Constant fold a setcc to true or false.
bool isKnownNeverSNaN(SDValue Op, const APInt &DemandedElts, unsigned Depth=0) const
LLVM_ABI SDValue getMergeValues(ArrayRef< SDValue > Ops, const SDLoc &dl)
Create a MERGE_VALUES node from the given operands.
LLVM_ABI SDVTList getVTList(EVT VT)
Return an SDVTList that represents the list of values specified.
LLVM_ABI SDValue getShiftAmountConstant(uint64_t Val, EVT VT, const SDLoc &DL)
LLVM_ABI SDValue getAllOnesConstant(const SDLoc &DL, EVT VT, bool IsTarget=false, bool IsOpaque=false)
LLVM_ABI void ExtractVectorElements(SDValue Op, SmallVectorImpl< SDValue > &Args, unsigned Start=0, unsigned Count=0, EVT EltVT=EVT())
Append the extracted elements from Start to Count out of the vector Op in Args.
LLVM_ABI SDValue getFreeze(SDValue V)
Return a freeze using the SDLoc of the value operand.
LLVM_ABI SDValue getConstantPool(const Constant *C, EVT VT, MaybeAlign Align=std::nullopt, int Offs=0, bool isT=false, unsigned TargetFlags=0)
LLVM_ABI SDValue makeEquivalentMemoryOrdering(SDValue OldChain, SDValue NewMemOpChain)
If an existing load has uses of its chain, create a token factor node with that chain and the new mem...
LLVM_ABI bool isConstantIntBuildVectorOrConstantInt(SDValue N, bool AllowOpaques=true) const
Test whether the given value is a constant int or similar node.
LLVM_ABI SDValue getJumpTableDebugInfo(int JTI, SDValue Chain, const SDLoc &DL)
LLVM_ABI std::optional< unsigned > getValidMaximumShiftAmount(SDValue V, const APInt &DemandedElts, unsigned Depth=0) const
If a SHL/SRA/SRL node V has shift amounts that are all less than the element bit-width of the shift n...
LLVM_ABI SDValue UnrollVectorOp(SDNode *N, unsigned ResNE=0)
Utility function used by legalize and lowering to "unroll" a vector operation by splitting out the sc...
LLVM_ABI SDValue getVScale(const SDLoc &DL, EVT VT, APInt MulImm)
Return a node that represents the runtime scaling 'MulImm * RuntimeVL'.
LLVM_ABI SDValue getConstantFP(double Val, const SDLoc &DL, EVT VT, bool isTarget=false)
Create a ConstantFPSDNode wrapping a constant value.
static LLVM_ABI unsigned getHasPredecessorMaxSteps()
SDValue getExtractSubvector(const SDLoc &DL, EVT VT, SDValue Vec, unsigned Idx)
Return the VT typed sub-vector of Vec at Idx.
SDValue getInsertSubvector(const SDLoc &DL, SDValue Vec, SDValue SubVec, unsigned Idx)
Insert SubVec at the Idx element of Vec.
LLVM_ABI SDValue getStepVector(const SDLoc &DL, EVT ResVT, const APInt &StepVal)
Returns a vector of type ResVT whose elements contain the linear sequence <0, Step,...
SDValue getSetCC(const SDLoc &DL, EVT VT, SDValue LHS, SDValue RHS, ISD::CondCode Cond, SDValue Chain=SDValue(), bool IsSignaling=false, SDNodeFlags Flags={})
Helper function to make it easier to build SetCC's if you just have an ISD::CondCode instead of an SD...
bool willNotOverflowSub(bool IsSigned, SDValue N0, SDValue N1) const
Determine if the result of the sub of 2 nodes can never overflow.
LLVM_ABI bool shouldOptForSize() const
LLVM_ABI SDValue getNOT(const SDLoc &DL, SDValue Val, EVT VT)
Create a bitwise NOT operation as (XOR Val, -1).
const TargetLowering & getTargetLoweringInfo() const
static constexpr unsigned MaxRecursionDepth
LLVM_ABI std::pair< EVT, EVT > GetSplitDestVTs(const EVT &VT) const
Compute the VTs needed for the low/hi parts of a type which is split (or expanded) into two not neces...
SDValue getUNDEF(EVT VT)
Return an UNDEF node. UNDEF does not have a useful SDLoc.
SDValue getBuildVector(EVT VT, const SDLoc &DL, ArrayRef< SDValue > Ops)
Return an ISD::BUILD_VECTOR node.
LLVM_ABI SDValue getTruncStore(SDValue Chain, const SDLoc &dl, SDValue Val, SDValue Ptr, SDValue Offset, MachinePointerInfo PtrInfo, EVT SVT, Align Alignment, MachineMemOperand::Flags MMOFlags=MachineMemOperand::MONone, const MMOMetadata &Metadata=MMOMetadata())
LLVM_ABI SDValue getBitcast(EVT VT, SDValue V)
Return a bitcast using the SDLoc of the value operand, and casting to the provided type.
SDValue getSelect(const SDLoc &DL, EVT VT, SDValue Cond, SDValue LHS, SDValue RHS, SDNodeFlags Flags=SDNodeFlags())
Helper function to make it easier to build Select's if you just have operands and don't want to check...
LLVM_ABI SDValue getNegative(SDValue Val, const SDLoc &DL, EVT VT)
Create negative operation as (SUB 0, Val).
LLVM_ABI std::optional< unsigned > getValidShiftAmount(SDValue V, const APInt &DemandedElts, unsigned Depth=0) const
If a SHL/SRA/SRL node V has a uniform shift amount that is less than the element bit-width of the shi...
LLVM_ABI SDValue getZeroExtendInReg(SDValue Op, const SDLoc &DL, EVT VT)
Return the expression required to zero extend the Op value assuming it was the smaller SrcTy value.
const DataLayout & getDataLayout() const
LLVM_ABI SDValue getStore(SDValue Chain, const SDLoc &dl, SDValue Val, SDValue Ptr, MachinePointerInfo PtrInfo, Align Alignment, MachineMemOperand::Flags MMOFlags=MachineMemOperand::MONone, const MMOMetadata &Metadata=MMOMetadata())
Helper function to build ISD::STORE nodes.
LLVM_ABI bool doesNodeExist(unsigned Opcode, SDVTList VTList, ArrayRef< SDValue > Ops)
Check if a node exists without modifying its flags.
LLVM_ABI SDValue getConstant(uint64_t Val, const SDLoc &DL, EVT VT, bool isTarget=false, bool isOpaque=false)
Create a ConstantSDNode wrapping a constant value.
LLVM_ABI SDValue getMemBasePlusOffset(SDValue Base, TypeSize Offset, const SDLoc &DL, const SDNodeFlags Flags=SDNodeFlags())
Returns sum of the base pointer and offset.
LLVM_ABI SDValue getGlobalAddress(const GlobalValue *GV, const SDLoc &DL, EVT VT, int64_t offset=0, bool isTargetGA=false, unsigned TargetFlags=0)
LLVM_ABI SDValue getTypeSize(const SDLoc &DL, EVT VT, TypeSize TS)
LLVM_ABI SDValue getExtLoad(ISD::LoadExtType ExtType, const SDLoc &dl, EVT VT, SDValue Chain, SDValue Ptr, MachinePointerInfo PtrInfo, EVT MemVT, MaybeAlign Alignment=MaybeAlign(), MachineMemOperand::Flags MMOFlags=MachineMemOperand::MONone, const MMOMetadata &Metadata=MMOMetadata())
LLVM_ABI std::pair< SDValue, SDValue > SplitVector(const SDValue &N, const SDLoc &DL, const EVT &LoVT, const EVT &HiVT)
Split the vector with EXTRACT_SUBVECTOR using the provided VTs and return the low/high part.
LLVM_ABI SDValue getSignedConstant(int64_t Val, const SDLoc &DL, EVT VT, bool isTarget=false, bool isOpaque=false)
SDValue getSplatVector(EVT VT, const SDLoc &DL, SDValue Op)
LLVM_ABI bool SignBitIsZero(SDValue Op, unsigned Depth=0) const
Return true if the sign bit of Op is known to be zero.
LLVM_ABI void RemoveDeadNode(SDNode *N)
Remove the specified node from the system.
SDValue getSelectCC(const SDLoc &DL, SDValue LHS, SDValue RHS, SDValue True, SDValue False, ISD::CondCode Cond, SDNodeFlags Flags=SDNodeFlags())
Helper function to make it easier to build SelectCC's if you just have an ISD::CondCode instead of an...
LLVM_ABI SDValue getSExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of integer type, to the integer type VT, by either sign-extending or trunca...
LLVM_ABI SDValue getLoad(EVT VT, const SDLoc &dl, SDValue Chain, SDValue Ptr, MachinePointerInfo PtrInfo, MaybeAlign Alignment=MaybeAlign(), MachineMemOperand::Flags MMOFlags=MachineMemOperand::MONone, const MMOMetadata &Metadata=MMOMetadata())
Loads are not normal binary operators: their result type is not determined by their operands,...
LLVM_ABI bool isIdentityElement(unsigned Opc, SDNodeFlags Flags, SDValue V, unsigned OperandNo, unsigned Depth=0) const
Returns true if V is an identity element of Opc with Flags.
LLVM_ABI bool isGuaranteedNotToBeUndefOrPoison(SDValue Op, UndefPoisonKind Kind=UndefPoisonKind::UndefOrPoison, unsigned Depth=0) const
Return true if this function can prove that Op is never poison and, Kind can be used to track poison ...
LLVM_ABI bool isKnownNeverZero(SDValue Op, unsigned Depth=0) const
Test whether the given SDValue is known to contain non-zero value(s).
LLVM_ABI SDValue FoldConstantArithmetic(unsigned Opcode, const SDLoc &DL, EVT VT, ArrayRef< SDValue > Ops, SDNodeFlags Flags=SDNodeFlags())
LLVM_ABI SDValue getBoolExtOrTrunc(SDValue Op, const SDLoc &SL, EVT VT, EVT OpVT)
Convert Op, which must be of integer type, to the integer type VT, by using an extension appropriate ...
LLVM_ABI SDValue getExternalSymbol(const char *Sym, EVT VT)
const TargetMachine & getTarget() const
const LibcallLoweringInfo & getLibcalls() const
LLVM_ABI SDValue getIntPtrConstant(uint64_t Val, const SDLoc &DL, bool isTarget=false)
LLVM_ABI SDValue getValueType(EVT)
LLVM_ABI SDValue getNode(unsigned Opcode, const SDLoc &DL, EVT VT, ArrayRef< SDUse > Ops)
Gets or creates the specified node.
LLVM_ABI SDValue getFPExtendOrRound(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of float type, to the float type VT, by either extending or rounding (by tr...
LLVM_ABI bool isKnownNeverNaN(SDValue Op, const APInt &DemandedElts, bool SNaN=false, unsigned Depth=0) const
Test whether the given SDValue (or all elements of it, if it is a vector) is known to never be NaN in...
SDValue getTargetConstant(uint64_t Val, const SDLoc &DL, EVT VT, bool isOpaque=false)
LLVM_ABI unsigned ComputeNumSignBits(SDValue Op, unsigned Depth=0) const
Return the number of times the sign bit of the register is replicated into the other bits.
LLVM_ABI SDValue getBoolConstant(bool V, const SDLoc &DL, EVT VT, EVT OpVT)
Create a true or false constant of type VT using the target's BooleanContent for type OpVT.
SDValue getTargetBlockAddress(const BlockAddress *BA, EVT VT, int64_t Offset=0, unsigned TargetFlags=0)
LLVM_ABI SDValue getVectorIdxConstant(uint64_t Val, const SDLoc &DL, bool isTarget=false)
LLVM_ABI void ReplaceAllUsesOfValueWith(SDValue From, SDValue To)
Replace any uses of From with To, leaving uses of other values produced by From.getNode() alone.
MachineFunction & getMachineFunction() const
SDValue getPOISON(EVT VT)
Return a POISON node. POISON does not have a useful SDLoc.
LLVM_ABI KnownBits computeKnownBits(SDValue Op, unsigned Depth=0) const
Determine which bits of Op are known to be either zero or one and return them in Known.
LLVM_ABI SDValue getZExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of integer type, to the integer type VT, by either zero-extending or trunca...
LLVM_ABI SDValue getCondCode(ISD::CondCode Cond)
LLVM_ABI bool MaskedValueIsZero(SDValue Op, const APInt &Mask, unsigned Depth=0) const
Return true if 'Op & Mask' is known to be zero.
SDValue getObjectPtrOffset(const SDLoc &SL, SDValue Ptr, TypeSize Offset)
Create an add instruction with appropriate flags when used for addressing some offset of an object.
LLVMContext * getContext() const
LLVM_ABI bool isKnownToBeAPowerOfTwo(SDValue Val, bool OrZero=false, unsigned Depth=0) const
Test if the given value is known to have exactly one bit set.
LLVM_ABI SDValue CreateStackTemporary(TypeSize Bytes, Align Alignment)
Create a stack temporary based on the size in bytes and the alignment.
SDValue getEntryNode() const
Return the token chain corresponding to the entry of the function.
SDValue getSplat(EVT VT, const SDLoc &DL, SDValue Op)
Returns a node representing a splat of one value into all lanes of the provided vector type.
LLVM_ABI std::pair< SDValue, SDValue > SplitScalar(const SDValue &N, const SDLoc &DL, const EVT &LoVT, const EVT &HiVT)
Split the scalar node with EXTRACT_ELEMENT using the provided VTs and return the low/high part.
LLVM_ABI SDValue getVectorShuffle(EVT VT, const SDLoc &dl, SDValue N1, SDValue N2, ArrayRef< int > Mask)
Return an ISD::VECTOR_SHUFFLE node.
static void commuteMask(MutableArrayRef< int > Mask)
Change values in a shuffle permute mask assuming the two vector operands have swapped position.
size_type size() const
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
Definition SmallString.h:26
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
reference emplace_back(ArgTypes &&... Args)
void reserve(size_type N)
void append(ItTy in_start, ItTy in_end)
Add the specified range to the end of the SmallVector.
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
This class is used to represent ISD::STORE nodes.
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
constexpr StringRef substr(size_t Start, size_t N=npos) const
Return a reference to the substring from [Start, Start + N).
Definition StringRef.h:597
bool starts_with(StringRef Prefix) const
Check if this string starts with the given Prefix.
Definition StringRef.h:258
constexpr size_t size() const
Get the string size.
Definition StringRef.h:144
constexpr const char * data() const
Get a pointer to the start of the string (which may not be null terminated).
Definition StringRef.h:138
iterator end() const
Definition StringRef.h:116
Class to represent struct types.
LLVM_ABI void setAttributes(const CallBase *Call, unsigned ArgIdx)
Set CallLoweringInfo attribute flags based on a call instruction and called function attributes.
bool isOperationExpand(unsigned Op, EVT VT) const
Return true if the specified operation is illegal on this target or unlikely to be made legal with cu...
unsigned getBitWidthForCttzElements(EVT RetVT, ElementCount EC, bool ZeroIsPoison, const ConstantRange *VScaleRange) const
Return the minimum number of bits required to hold the maximum possible number of trailing zero vecto...
virtual bool isShuffleMaskLegal(ArrayRef< int >, EVT) const
Targets can use this to indicate that they only support some VECTOR_SHUFFLE operations,...
virtual bool shouldRemoveRedundantExtend(SDValue Op) const
Return true (the default) if it is profitable to remove a sext_inreg(x) where the sext is redundant,...
virtual bool shouldReduceLoadWidth(SDNode *Load, ISD::LoadExtType ExtTy, EVT NewVT, std::optional< unsigned > ByteOffset=std::nullopt) const
Return true if it is profitable to reduce a load to a smaller type.
EVT getValueType(const DataLayout &DL, Type *Ty, bool AllowUnknown=false) const
Return the EVT corresponding to this LLVM type.
virtual bool preferSelectsOverBooleanArithmetic(EVT VT) const
Should we prefer selects to doing arithmetic on boolean types.
virtual bool isLegalICmpImmediate(int64_t) const
Return true if the specified immediate is legal icmp immediate, that is the target has icmp instructi...
virtual MVT::SimpleValueType getCmpLibcallReturnType() const
Return the ValueType for comparison libcalls.
virtual bool isSExtCheaperThanZExt(EVT FromTy, EVT ToTy) const
Return true if sign-extension from FromTy to ToTy is cheaper than zero-extension.
MVT getVectorIdxTy(const DataLayout &DL) const
Returns the type to be used for the index operand of: ISD::INSERT_VECTOR_ELT, ISD::EXTRACT_VECTOR_ELT...
virtual bool isSafeMemOpType(MVT) const
Returns true if it's safe to use load / store of the specified type to expand memcpy / memset inline.
const TargetMachine & getTargetMachine() const
virtual bool isCtpopFast(EVT VT) const
Return true if ctpop instruction is fast.
virtual bool isZExtFree(Type *FromTy, Type *ToTy) const
Return true if any actual instruction that defines a value of type FromTy implicitly zero-extends the...
bool isPaddedAtMostSignificantBitsWhenStored(EVT VT) const
Indicates if any padding is guaranteed to go at the most significant bits when storing the type to me...
LegalizeTypeAction
This enum indicates whether a types are legal for a target, and if not, what action should be used to...
virtual bool hasBitTest(SDValue X, SDValue Y) const
Return true if the target has a bit-test instruction: (X & (1 << Y)) ==/!= 0 This knowledge can be us...
MVT getRegisterType(LLVMContext &Context, EVT VT) const
Return the type of registers that this ValueType will eventually require.
EVT getLegalTypeToTransformTo(LLVMContext &Context, EVT VT) const
Perform getTypeToTransformTo repeatedly until a legal type is obtained.
LegalizeAction getCondCodeAction(ISD::CondCode CC, MVT VT) const
Return how the condition code should be treated: either it is legal, needs to be expanded to some oth...
CallingConv::ID getLibcallImplCallingConv(RTLIB::LibcallImpl Call) const
Get the CallingConv that should be used for the specified libcall implementation.
virtual bool isCommutativeBinOp(unsigned Opcode) const
Returns true if the opcode is a commutative binary operation.
virtual bool isFPImmLegal(const APFloat &, EVT, bool ForCodeSize=false) const
Returns true if the target can instruction select the specified FP immediate natively.
virtual bool shouldTransformSignedTruncationCheck(EVT XVT, unsigned KeptBits) const
Should we tranform the IR-optimal check for whether given truncation down into KeptBits would be trun...
bool isLegalRC(const TargetRegisterInfo &TRI, const TargetRegisterClass &RC) const
Return true if the value types that can be represented by the specified register class are all legal.
virtual bool allowsMisalignedMemoryAccesses(EVT, unsigned AddrSpace=0, Align Alignment=Align(1), MachineMemOperand::Flags Flags=MachineMemOperand::MONone, unsigned *=nullptr) const
Determine if the target supports unaligned memory accesses.
bool isOperationCustom(unsigned Op, EVT VT) const
Return true if the operation uses custom lowering, regardless of whether the type is legal or not.
EVT getShiftAmountTy(EVT LHSTy, const DataLayout &DL) const
Returns the type for the shift amount of a shift opcode.
virtual bool shouldExtendTypeInLibCall(EVT Type) const
Returns true if arguments should be extended in lib calls.
virtual bool isTruncateFree(Type *FromTy, Type *ToTy) const
Return true if it's free to truncate a value of type FromTy to type ToTy.
virtual bool shouldAvoidTransformToShift(EVT VT, unsigned Amount) const
Return true if creating a shift of the type by the given amount is not profitable.
virtual bool isFPExtFree(EVT DestVT, EVT SrcVT) const
Return true if an fpext operation is free (for instance, because single-precision floating-point numb...
virtual EVT getSetCCResultType(const DataLayout &DL, LLVMContext &Context, EVT VT) const
Return the ValueType of the result of SETCC operations.
virtual EVT getTypeToTransformTo(LLVMContext &Context, EVT VT) const
For types supported by the target, this is an identity function.
BooleanContent getBooleanContents(bool isVec, bool isFloat) const
For targets without i1 registers, this gives the nature of the high-bits of boolean values held in ty...
bool isCondCodeLegal(ISD::CondCode CC, MVT VT) const
Return true if the specified condition code is legal for a comparison of the specified types on this ...
bool isTypeLegal(EVT VT) const
Return true if the target has native support for the specified value type.
virtual MVT getPointerTy(const DataLayout &DL, uint32_t AS=0) const
Return the pointer type for the given address space, defaults to the pointer type from the data layou...
bool isOperationLegal(unsigned Op, EVT VT) const
Return true if the specified operation is legal on this target.
TargetLoweringBase(const TargetMachine &TM, const TargetSubtargetInfo &STI)
NOTE: The TargetMachine owns TLOF.
virtual unsigned getCustomCtpopCost(EVT VT, ISD::CondCode Cond) const
Return the maximum number of "x & (x - 1)" operations that can be done instead of deferring to a cust...
virtual bool shouldProduceAndByConstByHoistingConstFromShiftsLHSOfAnd(SDValue X, ConstantSDNode *XC, ConstantSDNode *CC, SDValue Y, unsigned OldShiftOpcode, unsigned NewShiftOpcode, SelectionDAG &DAG) const
Given the pattern (X & (C l>>/<< Y)) ==/!= 0 return true if it should be transformed into: ((X <</l>>...
BooleanContent
Enum that describes how the target represents true/false values.
virtual bool isIntDivCheap(EVT VT, AttributeList Attr) const
Return true if integer divide is usually cheaper than a sequence of several shifts,...
bool isOperationLegalOrCustom(unsigned Op, EVT VT, bool LegalOnly=false) const
Return true if the specified operation is legal on this target or can be made legal with custom lower...
virtual bool allowsMemoryAccess(LLVMContext &Context, const DataLayout &DL, EVT VT, unsigned AddrSpace=0, Align Alignment=Align(1), MachineMemOperand::Flags Flags=MachineMemOperand::MONone, unsigned *Fast=nullptr) const
Return true if the target supports a memory access of this type for the given address space and align...
virtual bool hasAndNotCompare(SDValue Y) const
Return true if the target should transform: (X & Y) == Y ---> (~X & Y) == 0 (X & Y) !...
virtual bool isNarrowingProfitable(SDNode *N, EVT SrcVT, EVT DestVT) const
Return true if it's profitable to narrow operations of type SrcVT to DestVT.
virtual bool isBinOp(unsigned Opcode) const
Return true if the node is a math/logic binary operator.
RTLIB::LibcallImpl getLibcallImpl(RTLIB::Libcall Call) const
Get the libcall impl routine name for the specified libcall.
virtual bool isCtlzFast() const
Return true if ctlz instruction is fast.
virtual bool shouldUseStrictFP_TO_INT(EVT FpVT, EVT IntVT, bool IsSigned) const
Return true if it is more correct/profitable to use strict FP_TO_INT conversion operations - canonica...
NegatibleCost
Enum that specifies when a float negation is beneficial.
LegalizeTypeAction getTypeAction(LLVMContext &Context, EVT VT) const
Return how we should legalize values of this type, either it is already legal (return 'Legal') or we ...
virtual bool shouldSignExtendTypeInLibCall(Type *Ty, bool IsSigned) const
Returns true if arguments should be sign-extended in lib calls.
std::vector< ArgListEntry > ArgListTy
virtual EVT getOptimalMemOpType(LLVMContext &Context, const MemOp &Op, const AttributeList &) const
Returns the target specific optimal type for load and store operations as a result of memset,...
virtual EVT getAsmOperandValueType(const DataLayout &DL, Type *Ty, bool AllowUnknown=false) const
bool isCondCodeLegalOrCustom(ISD::CondCode CC, MVT VT) const
Return true if the specified condition code is legal or custom for a comparison of the specified type...
bool isLoadLegal(EVT ValVT, EVT MemVT, Align Alignment, unsigned AddrSpace, unsigned ExtType, bool Atomic) const
Return true if the specified load with extension is legal on this target.
virtual bool isFAbsFree(EVT VT) const
Return true if an fabs operation is free to the point where it is never worthwhile to replace it with...
LegalizeAction getOperationAction(unsigned Op, EVT VT) const
Return how this operation should be treated: either it is legal, needs to be promoted to a larger siz...
bool isOperationLegalOrCustomOrPromote(unsigned Op, EVT VT, bool LegalOnly=false) const
Return true if the specified operation is legal on this target or can be made legal with custom lower...
MulExpansionKind
Enum that specifies when a multiplication should be expanded.
static ISD::NodeType getExtendForContent(BooleanContent Content)
This class defines information used to lower LLVM code to legal SelectionDAG operators that the targe...
SDValue expandAddSubSat(SDNode *Node, SelectionDAG &DAG) const
Method for building the DAG expansion of ISD::[US][ADD|SUB]SAT.
SDValue buildSDIVPow2WithCMov(SDNode *N, const APInt &Divisor, SelectionDAG &DAG, SmallVectorImpl< SDNode * > &Created) const
Build sdiv by power-of-2 with conditional move instructions Ref: "Hacker's Delight" by Henry Warren 1...
virtual ConstraintWeight getMultipleConstraintMatchWeight(AsmOperandInfo &info, int maIndex) const
Examine constraint type and operand type and determine a weight value.
bool expandMultipleResultFPLibCall(SelectionDAG &DAG, RTLIB::Libcall LC, SDNode *Node, SmallVectorImpl< SDValue > &Results, std::optional< unsigned > CallRetResNo={}) const
Expands a node with multiple results to an FP or vector libcall.
bool expandMULO(SDNode *Node, SDValue &Result, SDValue &Overflow, SelectionDAG &DAG) const
Method for building the DAG expansion of ISD::[US]MULO.
bool expandMUL(SDNode *N, SDValue &Lo, SDValue &Hi, EVT HiLoVT, SelectionDAG &DAG, MulExpansionKind Kind, SDValue LL=SDValue(), SDValue LH=SDValue(), SDValue RL=SDValue(), SDValue RH=SDValue()) const
Expand a MUL into two nodes.
SmallVector< ConstraintPair > ConstraintGroup
virtual const MCExpr * getPICJumpTableRelocBaseExpr(const MachineFunction *MF, unsigned JTI, MCContext &Ctx) const
This returns the relocation base for the given PIC jumptable, the same as getPICJumpTableRelocBase,...
virtual Align computeKnownAlignForTargetInstr(GISelValueTracking &Analysis, Register R, const MachineRegisterInfo &MRI, unsigned Depth=0) const
Determine the known alignment for the pointer value R.
bool SimplifyDemandedVectorElts(SDValue Op, const APInt &DemandedEltMask, APInt &KnownUndef, APInt &KnownZero, TargetLoweringOpt &TLO, unsigned Depth=0, bool AssumeSingleUse=false) const
Look at Vector Op.
virtual bool isUsedByReturnOnly(SDNode *, SDValue &) const
Return true if result of the specified node is used by a return node only.
bool LegalizeSetCCCondCode(SelectionDAG &DAG, EVT VT, SDValue &LHS, SDValue &RHS, SDValue &CC, bool &NeedInvert, const SDLoc &dl, SDValue &Chain, bool IsSignaling=false) const
Legalize a SETCC with given LHS and RHS and condition code CC on the current target.
SDValue scalarizeVectorStore(StoreSDNode *ST, SelectionDAG &DAG) const
virtual unsigned getPreferredShrunkVectorSizeInBits(SDValue Op, const APInt &DemandedElts) const
If only low elements of a vector are demanded, shrink the operation to the returned size in bits by c...
virtual unsigned ComputeNumSignBitsForTargetNode(SDValue Op, const APInt &DemandedElts, const SelectionDAG &DAG, unsigned Depth=0) const
This method can be implemented by targets that want to expose additional information about sign bits ...
SDValue lowerCmpEqZeroToCtlzSrl(SDValue Op, SelectionDAG &DAG) const
void softenSetCCOperands(SelectionDAG &DAG, EVT VT, SDValue &NewLHS, SDValue &NewRHS, ISD::CondCode &CCCode, const SDLoc &DL, const SDValue OldLHS, const SDValue OldRHS) const
Soften the operands of a comparison.
void forceExpandWideMUL(SelectionDAG &DAG, const SDLoc &dl, bool Signed, const SDValue LHS, const SDValue RHS, SDValue &Lo, SDValue &Hi) const
Calculate full product of LHS and RHS either via a libcall or through brute force expansion of the mu...
SDValue expandVecReduceSeq(SDNode *Node, SelectionDAG &DAG) const
Expand a VECREDUCE_SEQ_* into an explicit ordered calculation.
SDValue expandFCANONICALIZE(SDNode *Node, SelectionDAG &DAG) const
Expand FCANONICALIZE to FMUL with 1.
SDValue expandCTLZ(SDNode *N, SelectionDAG &DAG) const
Expand CTLZ/CTLZ_ZERO_POISON nodes.
SDValue expandBITREVERSE(SDNode *N, SelectionDAG &DAG) const
Expand BITREVERSE nodes.
SDValue expandCTTZ(SDNode *N, SelectionDAG &DAG) const
Expand CTTZ/CTTZ_ZERO_POISON nodes.
virtual SDValue expandIndirectJTBranch(const SDLoc &dl, SDValue Value, SDValue Addr, int JTI, SelectionDAG &DAG) const
Expands target specific indirect branch for the case of JumpTable expansion.
SDValue expandABD(SDNode *N, SelectionDAG &DAG) const
Expand ABDS/ABDU nodes.
virtual bool targetShrinkDemandedConstant(SDValue Op, const APInt &DemandedBits, const APInt &DemandedElts, TargetLoweringOpt &TLO) const
std::vector< AsmOperandInfo > AsmOperandInfoVector
SDValue expandCLMUL(SDNode *N, SelectionDAG &DAG) const
Expand carryless multiply.
SDValue expandShlSat(SDNode *Node, SelectionDAG &DAG) const
Method for building the DAG expansion of ISD::[US]SHLSAT.
SDValue expandIS_FPCLASS(EVT ResultVT, SDValue Op, FPClassTest Test, SDNodeFlags Flags, const SDLoc &DL, SelectionDAG &DAG) const
Expand check for floating point class.
virtual bool isTargetCanonicalConstantNode(SDValue Op) const
Returns true if the given Opc is considered a canonical constant for the target, which should not be ...
SDValue expandFP_TO_INT_SAT(SDNode *N, SelectionDAG &DAG) const
Expand FP_TO_[US]INT_SAT into FP_TO_[US]INT and selects or min/max.
SDValue expandCttzElts(SDNode *Node, SelectionDAG &DAG) const
Expand a CTTZ_ELTS or CTTZ_ELTS_ZERO_POISON by calculating (VL - i) for each active lane (i),...
SDValue getCheaperNegatedExpression(SDValue Op, SelectionDAG &DAG, bool LegalOps, bool OptForSize, unsigned Depth=0) const
This is the helper function to return the newly negated expression only when the cost is cheaper.
virtual unsigned computeNumSignBitsForTargetInstr(GISelValueTracking &Analysis, Register R, const APInt &DemandedElts, const MachineRegisterInfo &MRI, unsigned Depth=0) const
This method can be implemented by targets that want to expose additional information about sign bits ...
SDValue SimplifyMultipleUseDemandedBits(SDValue Op, const APInt &DemandedBits, const APInt &DemandedElts, SelectionDAG &DAG, unsigned Depth=0) const
More limited version of SimplifyDemandedBits that can be used to "lookthrough" ops that don't contrib...
SDValue expandUnalignedStore(StoreSDNode *ST, SelectionDAG &DAG) const
Expands an unaligned store to 2 half-size stores for integer values, and possibly more for vectors.
SDValue SimplifyMultipleUseDemandedVectorElts(SDValue Op, const APInt &DemandedElts, SelectionDAG &DAG, unsigned Depth=0) const
Helper wrapper around SimplifyMultipleUseDemandedBits, demanding all bits from only some vector eleme...
virtual ConstraintType getConstraintType(StringRef Constraint) const
Given a constraint, return the type of constraint it is for this target.
virtual bool findOptimalMemOpLowering(LLVMContext &Context, std::vector< EVT > &MemOps, unsigned Limit, const MemOp &Op, unsigned DstAS, unsigned SrcAS, const AttributeList &FuncAttributes, EVT *LargestVT=nullptr) const
Determines the optimal series of memory ops to replace the memset / memcpy.
virtual SDValue unwrapAddress(SDValue N) const
void expandSADDSUBO(SDNode *Node, SDValue &Result, SDValue &Overflow, SelectionDAG &DAG) const
Method for building the DAG expansion of ISD::S(ADD|SUB)O.
SDValue expandABS(SDNode *N, SelectionDAG &DAG, bool IsNegative=false) const
Expand ABS nodes.
SDValue expandVecReduce(SDNode *Node, SelectionDAG &DAG) const
Expand a VECREDUCE_* into an explicit calculation.
bool ShrinkDemandedConstant(SDValue Op, const APInt &DemandedBits, const APInt &DemandedElts, TargetLoweringOpt &TLO) const
Check to see if the specified operand of the specified instruction is a constant integer.
virtual bool isGuaranteedNotToBeUndefOrPoisonForTargetNode(SDValue Op, const APInt &DemandedElts, const SelectionDAG &DAG, UndefPoisonKind Kind, unsigned Depth) const
Return true if this function can prove that Op is never poison and, Kind can be used to track poison ...
SDValue expandVPCTTZElements(SDNode *N, SelectionDAG &DAG) const
Expand VP_CTTZ_ELTS/VP_CTTZ_ELTS_ZERO_POISON nodes.
SDValue BuildSDIV(SDNode *N, SelectionDAG &DAG, bool IsAfterLegalization, bool IsAfterLegalTypes, SmallVectorImpl< SDNode * > &Created) const
Given an ISD::SDIV node expressing a divide by constant, return a DAG expression to select that will ...
virtual const char * getTargetNodeName(unsigned Opcode) const
This method returns the name of a target specific DAG node.
bool expandFP_TO_UINT(SDNode *N, SDValue &Result, SDValue &Chain, SelectionDAG &DAG) const
Expand float to UINT conversion.
bool parametersInCSRMatch(const MachineRegisterInfo &MRI, const uint32_t *CallerPreservedMask, const SmallVectorImpl< CCValAssign > &ArgLocs, const SmallVectorImpl< SDValue > &OutVals) const
Check whether parameters to a call that are passed in callee saved registers are the same as from the...
virtual bool SimplifyDemandedVectorEltsForTargetNode(SDValue Op, const APInt &DemandedElts, APInt &KnownUndef, APInt &KnownZero, TargetLoweringOpt &TLO, unsigned Depth=0) const
Attempt to simplify any target nodes based on the demanded vector elements, returning true on success...
bool expandREM(SDNode *Node, SDValue &Result, SelectionDAG &DAG) const
Expand an SREM or UREM using SDIV/UDIV or SDIVREM/UDIVREM, if legal.
std::pair< SDValue, SDValue > expandUnalignedLoad(LoadSDNode *LD, SelectionDAG &DAG) const
Expands an unaligned load to 2 half-size loads for an integer, and possibly more for vectors.
SDValue expandFMINIMUMNUM_FMAXIMUMNUM(SDNode *N, SelectionDAG &DAG) const
Expand fminimumnum/fmaximumnum into multiple comparison with selects.
void forceExpandMultiply(SelectionDAG &DAG, const SDLoc &dl, bool Signed, SDValue &Lo, SDValue &Hi, SDValue LHS, SDValue RHS, SDValue HiLHS=SDValue(), SDValue HiRHS=SDValue()) const
Calculate the product twice the width of LHS and RHS.
virtual SDValue LowerToTLSEmulatedModel(const GlobalAddressSDNode *GA, SelectionDAG &DAG) const
Lower TLS global address SDNode for target independent emulated TLS model.
virtual bool isTypeDesirableForOp(unsigned, EVT VT) const
Return true if the target has native support for the specified value type and it is 'desirable' to us...
SDValue expandVectorSplice(SDNode *Node, SelectionDAG &DAG) const
Method for building the DAG expansion of ISD::VECTOR_SPLICE.
SDValue getVectorSubVecPointer(SelectionDAG &DAG, SDValue VecPtr, EVT VecVT, EVT SubVecVT, SDValue Index, const SDNodeFlags PtrArithFlags=SDNodeFlags()) const
Get a pointer to a sub-vector of type SubVecVT at index Idx located in memory for a vector of type Ve...
SDValue expandLoopDependenceMask(SDNode *N, SelectionDAG &DAG) const
Expand LOOP_DEPENDENCE_MASK nodes.
virtual const char * LowerXConstraint(EVT ConstraintVT) const
Try to replace an X constraint, which matches anything, with another that has more specific requireme...
SDValue expandCTPOP(SDNode *N, SelectionDAG &DAG) const
Expand CTPOP nodes.
virtual void computeKnownBitsForTargetInstr(GISelValueTracking &Analysis, Register R, KnownBits &Known, const APInt &DemandedElts, const MachineRegisterInfo &MRI, unsigned Depth=0) const
Determine which of the bits specified in Mask are known to be either zero or one and return them in t...
SDValue BuildUDIV(SDNode *N, SelectionDAG &DAG, bool IsAfterLegalization, bool IsAfterLegalTypes, SmallVectorImpl< SDNode * > &Created) const
Given an ISD::UDIV node expressing a divide by constant, return a DAG expression to select that will ...
SDValue expandVectorNaryOpBySplitting(SDNode *Node, SelectionDAG &DAG) const
~TargetLowering() override
std::pair< SDValue, SDValue > LowerCallTo(CallLoweringInfo &CLI) const
This function lowers an abstract call to a function into an actual call.
SDValue expandBSWAP(SDNode *N, SelectionDAG &DAG) const
Expand BSWAP nodes.
SDValue expandFMINIMUM_FMAXIMUM(SDNode *N, SelectionDAG &DAG) const
Expand fminimum/fmaximum into multiple comparison with selects.
SDValue CTTZTableLookup(SDNode *N, SelectionDAG &DAG, const SDLoc &DL, EVT VT, SDValue Op, unsigned NumBitsPerElt) const
Expand CTTZ via Table Lookup.
bool expandDIVREMByConstant(SDNode *N, SmallVectorImpl< SDValue > &Result, EVT HiLoVT, SelectionDAG &DAG, SDValue LL=SDValue(), SDValue LH=SDValue()) const
Attempt to expand an n-bit div/rem/divrem by constant using an n/2-bit algorithm.
virtual void computeKnownBitsForTargetNode(const SDValue Op, KnownBits &Known, const APInt &DemandedElts, const SelectionDAG &DAG, unsigned Depth=0) const
Determine which of the bits specified in Mask are known to be either zero or one and return them in t...
bool isPositionIndependent() const
std::pair< StringRef, TargetLowering::ConstraintType > ConstraintPair
virtual SDValue getNegatedExpression(SDValue Op, SelectionDAG &DAG, bool LegalOps, bool OptForSize, NegatibleCost &Cost, unsigned Depth=0) const
Return the newly negated expression if the cost is not expensive and set the cost in Cost to indicate...
virtual ConstraintWeight getSingleConstraintMatchWeight(AsmOperandInfo &info, const char *constraint) const
Examine constraint string and operand type and determine a weight value.
ConstraintGroup getConstraintPreferences(AsmOperandInfo &OpInfo) const
Given an OpInfo with list of constraints codes as strings, return a sorted Vector of pairs of constra...
bool expandFP_TO_SINT(SDNode *N, SDValue &Result, SelectionDAG &DAG) const
Expand float(f32) to SINT(i64) conversion.
virtual SDValue SimplifyMultipleUseDemandedBitsForTargetNode(SDValue Op, const APInt &DemandedBits, const APInt &DemandedElts, SelectionDAG &DAG, unsigned Depth) const
More limited version of SimplifyDemandedBits that can be used to "lookthrough" ops that don't contrib...
virtual SDValue LowerAsmOutputForConstraint(SDValue &Chain, SDValue &Glue, const SDLoc &DL, const AsmOperandInfo &OpInfo, SelectionDAG &DAG) const
SDValue buildLegalVectorShuffle(EVT VT, const SDLoc &DL, SDValue N0, SDValue N1, MutableArrayRef< int > Mask, SelectionDAG &DAG) const
Tries to build a legal vector shuffle using the provided parameters or equivalent variations.
virtual void computeKnownBitsForStackObjectPointer(KnownBits &Known, const MachineFunction &MF, Align Alignment) const
Determine known bits of a pointer to a known valid stack object.
virtual SDValue getPICJumpTableRelocBase(SDValue Table, SelectionDAG &DAG) const
Returns relocation base for the given PIC jumptable.
std::pair< SDValue, SDValue > scalarizeVectorLoad(LoadSDNode *LD, SelectionDAG &DAG) const
Turn load of vector type into a load of the individual elements.
virtual std::pair< unsigned, const TargetRegisterClass * > getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI, StringRef Constraint, MVT VT) const
Given a physical register constraint (e.g.
bool SimplifyDemandedBits(SDValue Op, const APInt &DemandedBits, const APInt &DemandedElts, KnownBits &Known, TargetLoweringOpt &TLO, unsigned Depth=0, bool AssumeSingleUse=false) const
Look at Op.
virtual bool SimplifyDemandedBitsForTargetNode(SDValue Op, const APInt &DemandedBits, const APInt &DemandedElts, KnownBits &Known, TargetLoweringOpt &TLO, unsigned Depth=0) const
Attempt to simplify any target nodes based on the demanded bits/elts, returning true on success.
virtual bool isDesirableToCommuteXorWithShift(const SDNode *N) const
Return true if it is profitable to combine an XOR of a logical shift to create a logical shift of NOT...
TargetLowering(const TargetLowering &)=delete
virtual bool shouldSimplifyDemandedVectorElts(SDValue Op, const TargetLoweringOpt &TLO) const
Return true if the target supports simplifying demanded vector elements by converting them to undefs.
bool isConstFalseVal(SDValue N) const
Return if the N is a constant or constant vector equal to the false value from getBooleanContents().
SDValue IncrementMemoryAddress(SDValue Addr, SDValue Mask, const SDLoc &DL, EVT DataVT, SelectionDAG &DAG, bool IsCompressedMemory) const
Increments memory address Addr according to the type of the value DataVT that should be stored.
SDValue expandVectorMatch(SDNode *N, SelectionDAG &DAG) const
Expand VECTOR_MATCH nodes.
bool isInTailCallPosition(SelectionDAG &DAG, SDNode *Node, SDValue &Chain) const
Check whether a given call node is in tail position within its function.
SDValue expandCONVERT_TO_ARBITRARY_FP(SDNode *Node, SelectionDAG &DAG) const
Expand CONVERT_TO_ARBITRARY_FP using bit manipulation.
virtual AsmOperandInfoVector ParseConstraints(const DataLayout &DL, const TargetRegisterInfo *TRI, const CallBase &Call) const
Split up the constraint string from the inline assembly value into the specific constraints and their...
virtual bool isSplatValueForTargetNode(SDValue Op, const APInt &DemandedElts, APInt &UndefElts, const SelectionDAG &DAG, unsigned Depth=0) const
Return true if vector Op has the same value across all DemandedElts, indicating any elements which ma...
SDValue expandRoundInexactToOdd(EVT ResultVT, SDValue Op, const SDLoc &DL, SelectionDAG &DAG) const
Truncate Op to ResultVT.
virtual bool shouldSplitFunctionArgumentsAsLittleEndian(const DataLayout &DL) const
For most targets, an LLVM type must be broken down into multiple smaller types.
SDValue SimplifySetCC(EVT VT, SDValue N0, SDValue N1, ISD::CondCode Cond, bool foldBooleans, DAGCombinerInfo &DCI, const SDLoc &dl) const
Try to simplify a setcc built with the specified operands and cc.
SDValue expandFunnelShift(SDNode *N, SelectionDAG &DAG) const
Expand funnel shift.
virtual bool isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const
Return true if folding a constant offset with the given GlobalAddress is legal.
bool isExtendedTrueVal(const ConstantSDNode *N, EVT VT, bool SExt) const
Return if N is a True value when extended to VT.
bool ShrinkDemandedOp(SDValue Op, unsigned BitWidth, const APInt &DemandedBits, TargetLoweringOpt &TLO) const
Convert x+y to (VT)((SmallVT)x+(SmallVT)y) if the casts are free.
bool isConstTrueVal(SDValue N) const
Return if the N is a constant or constant vector equal to the true value from getBooleanContents().
SDValue expandFixedPointDiv(unsigned Opcode, const SDLoc &dl, SDValue LHS, SDValue RHS, unsigned Scale, SelectionDAG &DAG) const
Method for building the DAG expansion of ISD::[US]DIVFIX[SAT].
SDValue expandPEXT(SDNode *N, SelectionDAG &DAG) const
Expand parallel bit extract (compress).
virtual void ComputeConstraintToUse(AsmOperandInfo &OpInfo, SDValue Op, SelectionDAG *DAG=nullptr) const
Determines the constraint code and constraint type to use for the specific AsmOperandInfo,...
virtual void CollectTargetIntrinsicOperands(const CallInst &I, SmallVectorImpl< SDValue > &Ops, SelectionDAG &DAG) const
virtual bool canCreateUndefOrPoisonForTargetNode(SDValue Op, const APInt &DemandedElts, const SelectionDAG &DAG, UndefPoisonKind Kind, bool ConsiderFlags, unsigned Depth) const
Return true if Op can create undef or poison from non-undef & non-poison operands.
SDValue expandVECTOR_COMPRESS(SDNode *Node, SelectionDAG &DAG) const
Expand a vector VECTOR_COMPRESS into a sequence of extract element, store temporarily,...
virtual const Constant * getTargetConstantFromLoad(LoadSDNode *LD) const
This method returns the constant pool value that will be loaded by LD.
SDValue expandFP_ROUND(SDNode *Node, SelectionDAG &DAG) const
Expand round(fp) to fp conversion.
SDValue createSelectForFMINNUM_FMAXNUM(SDNode *Node, SelectionDAG &DAG) const
Try to convert the fminnum/fmaxnum to a compare/select sequence.
SDValue expandCONVERT_FROM_ARBITRARY_FP(SDNode *Node, SelectionDAG &DAG) const
Expand CONVERT_FROM_ARBITRARY_FP using bit manipulation.
SDValue expandROT(SDNode *N, bool AllowVectorOps, SelectionDAG &DAG) const
Expand rotations.
SDValue annotateStackObjectPointer(SDValue Ptr, SelectionDAG &DAG, const SDLoc &DL, Align Alignment) const
Annotate a stack object pointer with known-bits assertions.
virtual void LowerAsmOperandForConstraint(SDValue Op, StringRef Constraint, std::vector< SDValue > &Ops, SelectionDAG &DAG) const
Lower the specified operand into the Ops vector.
virtual SDValue getSqrtInputTest(SDValue Operand, SelectionDAG &DAG, const DenormalMode &Mode, SDNodeFlags Flags={}) const
Return a target-dependent comparison result if the input operand is suitable for use with a square ro...
SDValue getVectorElementPointer(SelectionDAG &DAG, SDValue VecPtr, EVT VecVT, SDValue Index, const SDNodeFlags PtrArithFlags=SDNodeFlags()) const
Get a pointer to vector element Idx located in memory for a vector of type VecVT starting at a base a...
SDValue expandFMINNUM_FMAXNUM(SDNode *N, SelectionDAG &DAG) const
Expand fminnum/fmaxnum into fminnum_ieee/fmaxnum_ieee with quieted inputs.
virtual bool isGAPlusOffset(SDNode *N, const GlobalValue *&GA, int64_t &Offset) const
Returns true (and the GlobalValue and the offset) if the node is a GlobalAddress + offset.
virtual void computeKnownFPClassForTargetNode(const SDValue Op, KnownFPClass &Known, const APInt &DemandedElts, const SelectionDAG &DAG, unsigned Depth=0) const
Determine floating-point class information for a target node.
virtual unsigned getJumpTableEncoding() const
Return the entry encoding for a jump table in the current function.
virtual void computeKnownFPClassForTargetInstr(GISelValueTracking &Analysis, Register R, KnownFPClass &Known, const APInt &DemandedElts, const MachineRegisterInfo &MRI, unsigned Depth=0) const
std::pair< SDValue, SDValue > makeLibCall(SelectionDAG &DAG, RTLIB::LibcallImpl LibcallImpl, EVT RetVT, ArrayRef< SDValue > Ops, MakeLibCallOptions CallOptions, const SDLoc &dl, SDValue Chain=SDValue()) const
Returns a pair of (return value, chain).
SDValue expandCMP(SDNode *Node, SelectionDAG &DAG) const
Method for building the DAG expansion of ISD::[US]CMP.
void expandShiftParts(SDNode *N, SDValue &Lo, SDValue &Hi, SelectionDAG &DAG) const
Expand shift-by-parts.
virtual bool isKnownNeverNaNForTargetNode(SDValue Op, const APInt &DemandedElts, const SelectionDAG &DAG, bool SNaN=false, unsigned Depth=0) const
If SNaN is false,.
virtual SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const
This method will be invoked for all target nodes and for any target-independent nodes that the target...
SDValue expandFixedPointMul(SDNode *Node, SelectionDAG &DAG) const
Method for building the DAG expansion of ISD::[U|S]MULFIX[SAT].
SDValue getInboundsVectorElementPointer(SelectionDAG &DAG, SDValue VecPtr, EVT VecVT, SDValue Index) const
Get a pointer to vector element Idx located in memory for a vector of type VecVT starting at a base a...
SDValue expandIntMINMAX(SDNode *Node, SelectionDAG &DAG) const
Method for building the DAG expansion of ISD::[US][MIN|MAX].
SDValue expandVectorFindLastActive(SDNode *N, SelectionDAG &DAG) const
Expand VECTOR_FIND_LAST_ACTIVE nodes.
SDValue expandPartialReduceMLA(SDNode *Node, SelectionDAG &DAG) const
Expands PARTIAL_REDUCE_S/UMLA nodes to a series of simpler operations, consisting of zext/sext,...
void expandUADDSUBO(SDNode *Node, SDValue &Result, SDValue &Overflow, SelectionDAG &DAG) const
Method for building the DAG expansion of ISD::U(ADD|SUB)O.
SDValue expandPDEP(SDNode *N, SelectionDAG &DAG) const
Expand parallel bit deposit (expand).
virtual SDValue BuildSDIVPow2(SDNode *N, const APInt &Divisor, SelectionDAG &DAG, SmallVectorImpl< SDNode * > &Created) const
Targets may override this function to provide custom SDIV lowering for power-of-2 denominators.
SDValue scalarizeExtractedVectorLoad(EVT ResultVT, const SDLoc &DL, EVT InVecVT, SDValue EltNo, LoadSDNode *OriginalLoad, SelectionDAG &DAG) const
Replace an extraction of a load with a narrowed load.
virtual SDValue BuildSREMPow2(SDNode *N, const APInt &Divisor, SelectionDAG &DAG, SmallVectorImpl< SDNode * > &Created) const
Targets may override this function to provide custom SREM lowering for power-of-2 denominators.
bool expandUINT_TO_FP(SDNode *N, SDValue &Result, SDValue &Chain, SelectionDAG &DAG) const
Expand UINT(i64) to double(f64) conversion.
bool expandMUL_LOHI(unsigned Opcode, EVT VT, const SDLoc &dl, SDValue LHS, SDValue RHS, SmallVectorImpl< SDValue > &Result, EVT HiLoVT, SelectionDAG &DAG, MulExpansionKind Kind, SDValue LL=SDValue(), SDValue LH=SDValue(), SDValue RL=SDValue(), SDValue RH=SDValue()) const
Expand a MUL or [US]MUL_LOHI of n-bit values into two or four nodes, respectively,...
SDValue expandAVG(SDNode *N, SelectionDAG &DAG) const
Expand vector/scalar AVGCEILS/AVGCEILU/AVGFLOORS/AVGFLOORU nodes.
SDValue expandCTLS(SDNode *N, SelectionDAG &DAG) const
Expand CTLS (count leading sign bits) nodes.
void setTypeIdForCallsiteInfo(const CallBase *CB, MachineFunction &MF, MachineFunction::CallSiteInfo &CSInfo) const
Primary interface to the complete machine description for the target machine.
bool isPositionIndependent() const
const Triple & getTargetTriple() const
TargetOptions Options
unsigned EmitCallSiteInfo
The flag enables call site info production.
unsigned EmitCallGraphSection
Emit section containing call graph metadata.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
virtual StringRef getRegAsmName(MCRegister Reg) const
Return the assembly name for Reg.
bool isTypeLegalForClass(const TargetRegisterClass &RC, MVT T) const
Return true if the given TargetRegisterClass has the ValueType T.
TargetSubtargetInfo - Generic base class for all target subtargets.
bool isOSBinFormatCOFF() const
Tests whether the OS uses the COFF binary format.
Definition Triple.h:868
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition Twine.h:82
static constexpr TypeSize getFixed(ScalarTy ExactSize)
Definition TypeSize.h:339
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:46
static LLVM_ABI IntegerType * getInt32Ty(LLVMContext &C)
Definition Type.cpp:309
static LLVM_ABI Type * getVoidTy(LLVMContext &C)
Definition Type.cpp:282
Type * getScalarType() const
If this is a vector type, return the element type, otherwise return 'this'.
Definition Type.h:368
bool isIntegerTy() const
True if this is an instance of IntegerType.
Definition Type.h:257
LLVM_ABI const fltSemantics & getFltSemantics() const
Definition Type.cpp:106
LLVM Value Representation.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:255
LLVM_ABI const Value * stripPointerCastsAndAliases() const
Strip off pointer casts, all-zero GEPs, address space casts, and aliases.
Definition Value.cpp:717
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
Definition Value.cpp:319
constexpr bool isKnownMultipleOf(ScalarTy RHS) const
This function tells the caller whether the element count is known at compile time to be a multiple of...
Definition TypeSize.h:180
constexpr bool hasKnownScalarFactor(const FixedOrScalableQuantity &RHS) const
Returns true if there exists a value X where RHS*X will result in a value whose quantity matches our ...
Definition TypeSize.h:265
constexpr ScalarTy getFixedValue() const
Definition TypeSize.h:200
static constexpr bool isKnownLE(const FixedOrScalableQuantity &LHS, const FixedOrScalableQuantity &RHS)
Definition TypeSize.h:230
constexpr ScalarTy getKnownScalarFactor(const FixedOrScalableQuantity &RHS) const
Returns a value X where RHS*X will result in a value whose quantity matches our own.
Definition TypeSize.h:273
constexpr bool isScalable() const
Returns whether the quantity is scaled by a runtime quantity (vscale).
Definition TypeSize.h:168
constexpr ScalarTy getKnownMinValue() const
Returns the minimum value this quantity can represent.
Definition TypeSize.h:165
CallInst * Call
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
LLVM_ABI APInt ScaleBitMask(const APInt &A, unsigned NewBitWidth, bool MatchAllBits=false)
Splat/Merge neighboring bits to widen/narrow the bitmask represented by.
Definition APInt.cpp:3043
constexpr std::underlying_type_t< E > Mask()
Get a bitmask with 1s in all places up to the high-order bit of E's largest value.
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
NodeType
ISD::NodeType enum - This enum defines the target-independent operators for a SelectionDAG.
Definition ISDOpcodes.h:41
@ SETCC
SetCC operator - This evaluates to a true value iff the condition is true.
Definition ISDOpcodes.h:829
@ MERGE_VALUES
MERGE_VALUES - This node takes multiple discrete operands and returns them all as its individual resu...
Definition ISDOpcodes.h:261
@ PTRADD
PTRADD represents pointer arithmetic semantics, for targets that opt in using shouldPreservePtrArith(...
@ PARTIAL_REDUCE_SMLA
PARTIAL_REDUCE_[U|S]MLA(Accumulator, Input1, Input2) The partial reduction nodes sign or zero extend ...
@ LOOP_DEPENDENCE_RAW_MASK
@ FGETSIGN
INT = FGETSIGN(FP) - Return the sign bit of the specified floating point value as an integer 0/1 valu...
Definition ISDOpcodes.h:540
@ SMUL_LOHI
SMUL_LOHI/UMUL_LOHI - Multiply two integers of type iN, producing a signed/unsigned value of type i[2...
Definition ISDOpcodes.h:275
@ INSERT_SUBVECTOR
INSERT_SUBVECTOR(VECTOR1, VECTOR2, IDX) - Returns a vector with VECTOR2 inserted into VECTOR1.
Definition ISDOpcodes.h:602
@ BSWAP
Byte Swap and Counting operators.
Definition ISDOpcodes.h:789
@ SMULFIX
RESULT = [US]MULFIX(LHS, RHS, SCALE) - Perform fixed point multiplication on 2 integers with the same...
Definition ISDOpcodes.h:394
@ ADDC
Carry-setting nodes for multiple precision addition and subtraction.
Definition ISDOpcodes.h:294
@ FMAD
FMAD - Perform a * b + c, while getting the same result as the separately rounded operations.
Definition ISDOpcodes.h:524
@ ADD
Simple integer binary arithmetic operators.
Definition ISDOpcodes.h:264
@ LOAD
LOAD and STORE have token chains as their first operand, then the same operands as an LLVM load/store...
@ SMULFIXSAT
Same as the corresponding unsaturated fixed point instructions, but the result is clamped between the...
Definition ISDOpcodes.h:400
@ ANY_EXTEND
ANY_EXTEND - Used for integer types. The high bits are undefined.
Definition ISDOpcodes.h:863
@ CTTZ_ELTS
Returns the number of number of trailing (least significant) zero elements in a vector.
@ FMA
FMA - Perform a * b + c with no intermediate rounding step.
Definition ISDOpcodes.h:520
@ VECTOR_FIND_LAST_ACTIVE
Finds the index of the last active mask element Operands: Mask.
@ PSEUDO_FMIN
PSEUDO_FMIN is strictly equivalent to op0 olt op1 ?
@ INTRINSIC_VOID
OUTCHAIN = INTRINSIC_VOID(INCHAIN, INTRINSICID, arg1, arg2, ...) This node represents a target intrin...
Definition ISDOpcodes.h:220
@ SINT_TO_FP
[SU]INT_TO_FP - These operators convert integers (whose interpreted sign depends on the first letter)...
Definition ISDOpcodes.h:890
@ CONCAT_VECTORS
CONCAT_VECTORS(VECTOR0, VECTOR1, ...) - Given a number of values of vector type with the same length ...
Definition ISDOpcodes.h:586
@ FADD
Simple binary floating point operators.
Definition ISDOpcodes.h:417
@ ABS
ABS - Determine the unsigned absolute value of a signed integer value of the same bitwidth.
Definition ISDOpcodes.h:749
@ SIGN_EXTEND_VECTOR_INREG
SIGN_EXTEND_VECTOR_INREG(Vector) - This operator represents an in-register sign-extension of the low ...
Definition ISDOpcodes.h:920
@ SDIVREM
SDIVREM/UDIVREM - Divide two integers and produce both a quotient and remainder result.
Definition ISDOpcodes.h:280
@ FMULADD
FMULADD - Performs a * b + c, with, or without, intermediate rounding.
Definition ISDOpcodes.h:530
@ BITCAST
BITCAST - This operator converts between integer, vector and FP values, as if the value was stored to...
@ BUILD_PAIR
BUILD_PAIR - This is the opposite of EXTRACT_ELEMENT in some ways.
Definition ISDOpcodes.h:254
@ CLMUL
Carry-less multiplication operations.
Definition ISDOpcodes.h:780
@ SDIVFIX
RESULT = [US]DIVFIX(LHS, RHS, SCALE) - Perform fixed point division on 2 integers with the same width...
Definition ISDOpcodes.h:407
@ BUILTIN_OP_END
BUILTIN_OP_END - This must be the last enum value in this list.
@ CTLZ_ZERO_POISON
Definition ISDOpcodes.h:798
@ PARTIAL_REDUCE_UMLA
@ SIGN_EXTEND
Conversion operators.
Definition ISDOpcodes.h:854
@ AVGCEILS
AVGCEILS/AVGCEILU - Rounding averaging add - Add two integers using an integer of type i[N+2],...
Definition ISDOpcodes.h:717
@ SCALAR_TO_VECTOR
SCALAR_TO_VECTOR(VAL) - This represents the operation of loading a scalar value into element 0 of the...
Definition ISDOpcodes.h:667
@ VECREDUCE_FADD
These reductions have relaxed evaluation order semantics, and have a single vector operand.
@ PARTIAL_REDUCE_FMLA
@ FNEG
Perform various unary floating-point operations inspired by libm.
@ SSUBO
Same for subtraction.
Definition ISDOpcodes.h:352
@ BRIND
BRIND - Indirect branch.
@ FCANONICALIZE
Returns platform specific canonical encoding of a floating point number.
Definition ISDOpcodes.h:543
@ IS_FPCLASS
Performs a check of floating point class property, defined by IEEE-754.
Definition ISDOpcodes.h:550
@ SSUBSAT
RESULT = [US]SUBSAT(LHS, RHS) - Perform saturation subtraction on 2 integers with the same bit width ...
Definition ISDOpcodes.h:374
@ SELECT
Select(COND, TRUEVAL, FALSEVAL).
Definition ISDOpcodes.h:806
@ EXTRACT_ELEMENT
EXTRACT_ELEMENT - This is used to get the lower or upper (determined by a Constant,...
Definition ISDOpcodes.h:247
@ SPLAT_VECTOR
SPLAT_VECTOR(VAL) - Returns a vector with the scalar value VAL duplicated in all lanes.
Definition ISDOpcodes.h:674
@ GET_ACTIVE_LANE_MASK
GET_ACTIVE_LANE_MASK - this corrosponds to the llvm.get.active.lane.mask intrinsic.
@ CopyFromReg
CopyFromReg - This node indicates that the input value is a virtual or physical register that is defi...
Definition ISDOpcodes.h:230
@ SADDO
RESULT, BOOL = [SU]ADDO(LHS, RHS) - Overflow-aware nodes for addition.
Definition ISDOpcodes.h:348
@ VECREDUCE_ADD
Integer reductions may have a result type larger than the vector element type.
@ MULHU
MULHU/MULHS - Multiply high - Multiply two integers of type iN, producing an unsigned/signed value of...
Definition ISDOpcodes.h:706
@ SHL
Shift and rotation operations.
Definition ISDOpcodes.h:771
@ VECTOR_SHUFFLE
VECTOR_SHUFFLE(VEC1, VEC2) - Returns a vector, of the same type as VEC1/VEC2.
Definition ISDOpcodes.h:651
@ EXTRACT_SUBVECTOR
EXTRACT_SUBVECTOR(VECTOR, IDX) - Returns a subvector from VECTOR.
Definition ISDOpcodes.h:616
@ FMINNUM_IEEE
FMINNUM_IEEE/FMAXNUM_IEEE - Perform floating-point minimumNumber or maximumNumber on two values,...
@ EXTRACT_VECTOR_ELT
EXTRACT_VECTOR_ELT(VECTOR, IDX) - Returns a single element from VECTOR identified by the (potentially...
Definition ISDOpcodes.h:578
@ ZERO_EXTEND
ZERO_EXTEND - Used for integer types, zeroing the new bits.
Definition ISDOpcodes.h:860
@ SELECT_CC
Select with condition operator - This selects between a true value and a false value (ops #2 and #3) ...
Definition ISDOpcodes.h:821
@ FMINNUM
FMINNUM/FMAXNUM - Perform floating-point minimum maximum on two values, following IEEE-754 definition...
@ SSHLSAT
RESULT = [US]SHLSAT(LHS, RHS) - Perform saturation left shift.
Definition ISDOpcodes.h:386
@ SMULO
Same for multiplication.
Definition ISDOpcodes.h:356
@ VECTOR_SPLICE_LEFT
VECTOR_SPLICE_LEFT(VEC1, VEC2, OFFSET) - Shifts CONCAT_VECTORS(VEC1, VEC2) left by OFFSET elements an...
Definition ISDOpcodes.h:655
@ ANY_EXTEND_VECTOR_INREG
ANY_EXTEND_VECTOR_INREG(Vector) - This operator represents an in-register any-extension of the low la...
Definition ISDOpcodes.h:909
@ SIGN_EXTEND_INREG
SIGN_EXTEND_INREG - This operator atomically performs a SHL/SRA pair to sign extend a small value in ...
Definition ISDOpcodes.h:898
@ SMIN
[US]{MIN/MAX} - Binary minimum or maximum of signed or unsigned integers.
Definition ISDOpcodes.h:729
@ SDIVFIXSAT
Same as the corresponding unsaturated fixed point instructions, but the result is clamped between the...
Definition ISDOpcodes.h:413
@ FP_EXTEND
X = FP_EXTEND(Y) - Extend a smaller FP type into a larger FP type.
Definition ISDOpcodes.h:988
@ VSELECT
Select with a vector condition (op #0) and two vector operands (ops #1 and #2), returning a vector re...
Definition ISDOpcodes.h:815
@ UADDO_CARRY
Carry-using nodes for multiple precision addition and subtraction.
Definition ISDOpcodes.h:328
@ PEXT
Parallel bit extract (compress) and parallel bit deposit (expand).
Definition ISDOpcodes.h:785
@ STRICT_FP_TO_SINT
STRICT_FP_TO_[US]INT - Convert a floating point value to a signed or unsigned integer.
Definition ISDOpcodes.h:479
@ FMINIMUM
FMINIMUM/FMAXIMUM - NaN-propagating minimum/maximum that also treat -0.0 as less than 0....
@ FP_TO_SINT
FP_TO_[US]INT - Convert a floating point value to a signed or unsigned integer.
Definition ISDOpcodes.h:936
@ TargetConstant
TargetConstant* - Like Constant*, but the DAG does not do any folding, simplification,...
Definition ISDOpcodes.h:179
@ AND
Bitwise operators - logical and, logical or, logical xor.
Definition ISDOpcodes.h:741
@ INTRINSIC_WO_CHAIN
RESULT = INTRINSIC_WO_CHAIN(INTRINSICID, arg1, arg2, ...) This node represents a target intrinsic fun...
Definition ISDOpcodes.h:205
@ AVGFLOORS
AVGFLOORS/AVGFLOORU - Averaging add - Add two integers using an integer of type i[N+1],...
Definition ISDOpcodes.h:712
@ VECTOR_SPLICE_RIGHT
VECTOR_SPLICE_RIGHT(VEC1, VEC2, OFFSET) - Shifts CONCAT_VECTORS(VEC1,VEC2) right by OFFSET elements a...
Definition ISDOpcodes.h:659
@ ADDE
Carry-using nodes for multiple precision addition and subtraction.
Definition ISDOpcodes.h:304
@ FREEZE
FREEZE - FREEZE(VAL) returns an arbitrary value if VAL is UNDEF (or is evaluated to UNDEF),...
Definition ISDOpcodes.h:241
@ INSERT_VECTOR_ELT
INSERT_VECTOR_ELT(VECTOR, VAL, IDX) - Returns VECTOR with the element at IDX replaced with VAL.
Definition ISDOpcodes.h:567
@ TokenFactor
TokenFactor - This node takes multiple tokens as input and produces a single token result.
Definition ISDOpcodes.h:53
@ CTTZ_ZERO_POISON
Bit counting operators with a poisoned result for zero inputs.
Definition ISDOpcodes.h:797
@ FFREXP
FFREXP - frexp, extract fractional and exponent component of a floating-point value.
@ FP_ROUND
X = FP_ROUND(Y, TRUNC) - Rounding 'Y' from a larger floating point type down to the precision of the ...
Definition ISDOpcodes.h:969
@ ZERO_EXTEND_VECTOR_INREG
ZERO_EXTEND_VECTOR_INREG(Vector) - This operator represents an in-register zero-extension of the low ...
Definition ISDOpcodes.h:931
@ FP_TO_SINT_SAT
FP_TO_[US]INT_SAT - Convert floating point value in operand 0 to a signed or unsigned scalar integer ...
Definition ISDOpcodes.h:955
@ TRUNCATE
TRUNCATE - Completely drop the high bits.
Definition ISDOpcodes.h:866
@ SHL_PARTS
SHL_PARTS/SRA_PARTS/SRL_PARTS - These operators are used for expanded integer shift operations.
Definition ISDOpcodes.h:843
@ FCOPYSIGN
FCOPYSIGN(X, Y) - Return the value of X with the sign of Y.
Definition ISDOpcodes.h:536
@ PARTIAL_REDUCE_SUMLA
@ SADDSAT
RESULT = [US]ADDSAT(LHS, RHS) - Perform saturation addition on 2 integers with the same bit width (W)...
Definition ISDOpcodes.h:365
@ CALLSEQ_START
CALLSEQ_START/CALLSEQ_END - These operators mark the beginning and end of a call sequence,...
@ CTTZ_ELTS_ZERO_POISON
@ FMINIMUMNUM
FMINIMUMNUM/FMAXIMUMNUM - minimumnum/maximumnum that is same with FMINNUM_IEEE and FMAXNUM_IEEE besid...
@ ABDS
ABDS/ABDU - Absolute difference - Return the absolute difference between two numbers interpreted as s...
Definition ISDOpcodes.h:724
@ INTRINSIC_W_CHAIN
RESULT,OUTCHAIN = INTRINSIC_W_CHAIN(INCHAIN, INTRINSICID, arg1, ...) This node represents a target in...
Definition ISDOpcodes.h:213
@ ABS_MIN_POISON
ABS with a poison result for INT_MIN.
Definition ISDOpcodes.h:753
@ BUILD_VECTOR
BUILD_VECTOR(ELT0, ELT1, ELT2, ELT3,...) - Return a fixed-width vector with the specified,...
Definition ISDOpcodes.h:558
LLVM_ABI NodeType getOppositeSignednessMinMaxOpcode(unsigned MinMaxOpc)
Given a MinMaxOpc of ISD::(U|S)MIN or ISD::(U|S)MAX, returns the corresponding opcode with the opposi...
LLVM_ABI bool isBuildVectorOfConstantSDNodes(const SDNode *N)
Return true if the specified node is a BUILD_VECTOR node of all ConstantSDNode or undef.
LLVM_ABI NodeType getExtForLoadExtType(bool IsFP, LoadExtType)
bool isNormalStore(const SDNode *N)
Returns true if the specified node is a non-truncating and unindexed store.
bool isZEXTLoad(const SDNode *N)
Returns true if the specified node is a ZEXTLOAD.
LLVM_ABI CondCode getSetCCInverse(CondCode Operation, EVT Type)
Return the operation corresponding to !(X op Y), where 'op' is a valid SetCC operation.
bool isTrueWhenEqual(CondCode Cond)
Return true if the specified condition returns true if the two operands to the condition are equal.
unsigned getUnorderedFlavor(CondCode Cond)
This function returns 0 if the condition is always false if an operand is a NaN, 1 if the condition i...
LLVM_ABI bool matchBinaryPredicate(SDValue LHS, SDValue RHS, const APInt &DemandedElts, std::function< bool(ConstantSDNode *, ConstantSDNode *)> Match, bool AllowUndefs=false, bool AllowTypeMismatch=false)
Attempt to match a binary predicate against a pair of scalar/splat constants or every element of a pa...
LLVM_ABI CondCode getSetCCSwappedOperands(CondCode Operation)
Return the operation corresponding to (Y op X) when given the operation for (X op Y).
LLVM_ABI bool isBuildVectorAllZeros(const SDNode *N)
Return true if the specified node is a BUILD_VECTOR where all of the elements are 0 or undef.
bool isSignedIntSetCC(CondCode Code)
Return true if this is a setcc instruction that performs a signed comparison when used with integer o...
LLVM_ABI bool isConstantSplatVector(const SDNode *N, APInt &SplatValue)
Node predicates.
CondCode
ISD::CondCode enum - These are ordered carefully to make the bitfields below work out,...
LLVM_ABI NodeType getVecReduceBaseOpcode(unsigned VecReduceOpcode)
Get underlying scalar opcode for VECREDUCE opcode.
LoadExtType
LoadExtType enum - This enum defines the three variants of LOADEXT (load with extension).
bool isUnsignedIntSetCC(CondCode Code)
Return true if this is a setcc instruction that performs an unsigned comparison when used with intege...
bool matchUnaryPredicate(SDValue Op, const APInt &DemandedElts, std::function< bool(ConstantSDNode *)> Match, bool AllowUndefs=false, bool AllowTruncation=false)
Hook for matching ConstantSDNode predicate.
BinaryOp_match< LHS, RHS, Instruction::And > m_And(const LHS &L, const RHS &R)
BinaryOp_match< LHS, RHS, Instruction::Add > m_Add(const LHS &L, const RHS &R)
match_deferred< Value > m_Deferred(Value *const &V)
Like m_Specific(), but works if the specific value to match is determined as part of the same match()...
specificval_ty m_Specific(const Value *V)
Match if we have a specific specified value.
auto m_Value()
Match an arbitrary value and ignore it.
BinaryOp_match< LHS, RHS, Instruction::Or > m_Or(const LHS &L, const RHS &R)
BinaryOp_match< LHS, RHS, Instruction::Sub > m_Sub(const LHS &L, const RHS &R)
LLVM_ABI Libcall getUREM(EVT VT)
Or< Preds... > m_AnyOf(const Preds &...preds)
bool sd_match(SDNode *N, const SelectionDAG *DAG, Pattern &&P)
NUses_match< 1, Value_match > m_OneUse()
This is an optimization pass for GlobalISel generic memory operations.
unsigned Log2_32_Ceil(uint32_t Value)
Return the ceil log base 2 of the specified value, 32 if the value is zero.
Definition MathExtras.h:339
@ Offset
Definition DWP.cpp:577
void stable_sort(R &&Range)
Definition STLExtras.h:2116
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1739
InstructionCost Cost
LLVM_ABI bool isNullConstant(SDValue V)
Returns true if V is a constant integer zero.
RelativeUniformCounterPtr Values
Definition InstrProf.h:91
LLVM_ABI bool isAllOnesOrAllOnesSplat(const MachineInstr &MI, const MachineRegisterInfo &MRI, bool AllowUndefs=false)
Return true if the value is a constant -1 integer or a splatted vector of a constant -1 integer (with...
Definition Utils.cpp:1557
@ Known
Known to have no common set bits.
@ Undef
Value of the register doesn't matter.
LLVM_ABI SDValue peekThroughBitcasts(SDValue V)
Return the non-bitcasted source operand of V if it exists.
auto enumerate(FirstRange &&First, RestRanges &&...Rest)
Given two or more input ranges, returns a new range whose values are tuples (A, B,...
Definition STLExtras.h:2554
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
LLVM_ABI FPClassTest invertFPClassTestIfSimpler(FPClassTest Test, bool UseFCmp)
Evaluates if the specified FP class test is better performed as the inverse (i.e.
@ Load
The value being inserted comes from a load (InsertElement only).
@ Store
The extracted value is stored (ExtractElement only).
LLVM_ABI bool isOneOrOneSplatFP(SDValue V, bool AllowUndefs=false)
Return true if the value is a constant floating-point value, or a splatted vector of a constant float...
constexpr T alignDown(U Value, V Align, W Skew=0)
Returns the largest unsigned integer less than or equal to Value and is Skew mod Align.
Definition MathExtras.h:541
void * PointerTy
LLVM_ABI bool isNullOrNullSplat(const MachineInstr &MI, const MachineRegisterInfo &MRI, bool AllowUndefs=false)
Return true if the value is a constant 0 integer or a splatted vector of a constant 0 integer (with n...
Definition Utils.cpp:1539
T bit_ceil(T Value)
Returns the smallest integral power of two no smaller than Value if Value is nonzero.
Definition bit.h:362
LLVM_ABI void reportFatalInternalError(Error Err)
Report a fatal error that indicates a bug in LLVM.
Definition Error.cpp:173
constexpr int popcount(T Value) noexcept
Count the number of set bits in a value.
Definition bit.h:156
LLVM_ABI ConstantFPSDNode * isConstOrConstSplatFP(SDValue N, bool AllowUndefs=false)
Returns the SDNode if it is a constant splat BuildVector or constant float.
constexpr bool has_single_bit(T Value) noexcept
Definition bit.h:149
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1746
LLVM_ABI bool getShuffleDemandedElts(int SrcWidth, ArrayRef< int > Mask, const APInt &DemandedElts, APInt &DemandedLHS, APInt &DemandedRHS, bool AllowUndefElts=false)
Transform a shuffle mask's output demanded element mask into demanded element masks for the 2 operand...
unsigned Log2_32(uint32_t Value)
Return the floor log base 2 of the specified value, -1 if the value is zero.
Definition MathExtras.h:326
LLVM_ABI bool isBitwiseNot(SDValue V, bool AllowUndefs=false)
Returns true if V is a bitwise not operation.
constexpr bool isPowerOf2_32(uint32_t Value)
Return true if the argument is a power of two > 0.
Definition MathExtras.h:280
FPClassTest
Floating-point class tests, supported by 'is_fpclass' intrinsic.
auto find_if_not(R &&Range, UnaryPredicate P)
Definition STLExtras.h:1777
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
Definition Error.cpp:163
LLVM_ABI ConstantRange getVScaleRange(const Function *F, unsigned BitWidth)
Determine the possible constant range of vscale with the given bit width, based on the vscale_range f...
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
Definition Casting.h:547
LLVM_ABI bool isOneOrOneSplat(SDValue V, bool AllowUndefs=false)
Return true if the value is a constant 1 integer or a splatted vector of a constant 1 integer (with n...
@ Mod
The access may modify the value stored in memory.
Definition ModRef.h:34
constexpr T divideCeil(U Numerator, V Denominator)
Returns the integer ceil(Numerator / Denominator).
Definition MathExtras.h:389
@ Other
Any other memory.
Definition ModRef.h:68
To bit_cast(const From &from) noexcept
Definition bit.h:90
@ Mul
Product of integers.
@ Xor
Bitwise or logical XOR of integers.
@ Sub
Subtraction of integers.
@ Add
Sum of integers.
uint16_t MCPhysReg
An unsigned integer type large enough to represent all physical registers, but not necessarily virtua...
Definition MCRegister.h:21
@ Fast
Assign the register banks as fast as possible (default).
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Count
Definition InstrProf.h:145
fltNonfiniteBehavior
Definition APFloat.h:977
DWARFExpression::Operation Op
RoundingMode
Rounding mode.
@ TowardZero
roundTowardZero.
@ NearestTiesToEven
roundTiesToEven.
@ TowardPositive
roundTowardPositive.
@ NearestTiesToAway
roundTiesToAway.
@ TowardNegative
roundTowardNegative.
LLVM_ABI ConstantSDNode * isConstOrConstSplat(SDValue N, bool AllowUndefs=false, bool AllowTruncation=false)
Returns the SDNode if it is a constant splat BuildVector or constant int.
constexpr unsigned BitWidth
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
LLVM_ABI bool isZeroOrZeroSplat(SDValue N, bool AllowUndefs=false)
Return true if the value is a constant 0 integer or a splatted vector of a constant 0 integer (with n...
LLVM_ABI bool isOneConstant(SDValue V)
Returns true if V is a constant integer one.
UndefPoisonKind
Enumeration to track whether we are interested in Undef, Poison, or both.
Definition UndefPoison.h:20
Align commonAlignment(Align A, uint64_t Offset)
Returns the alignment that satisfies both alignments.
Definition Alignment.h:201
LLVM_ABI bool isNullFPConstant(SDValue V)
Returns true if V is an FP constant with a value of positive zero.
APFloat neg(APFloat X)
Returns the negated value of the argument.
Definition APFloat.h:1727
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Next
Definition InstrProf.h:147
unsigned Log2(Align A)
Returns the log2 of the alignment.
Definition Alignment.h:197
constexpr T maskTrailingOnes(unsigned N)
Create a bitmask with the N right-most bits set to 1, and all other bits set to 0.
Definition MathExtras.h:78
@ Increment
Incrementally increasing token ID.
Definition AllocToken.h:26
fltNanEncoding
Definition APFloat.h:1001
LLVM_ABI bool isAllOnesConstant(SDValue V)
Returns true if V is an integer constant with all bits set.
constexpr uint64_t NextPowerOf2(uint64_t A)
Returns the next power of two (in 64-bits) that is strictly greater than A.
Definition MathExtras.h:368
MCRegisterClass TargetRegisterClass
Definition FastISel.h:58
LLVM_ABI void reportFatalUsageError(Error Err)
Report a fatal error that does not indicate a bug in LLVM.
Definition Error.cpp:177
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Definition BitVector.h:880
#define N
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39
Represent subnormal handling kind for floating point instruction inputs and outputs.
DenormalModeKind Input
Denormal treatment kind for floating point instruction inputs in the default floating-point environme...
@ PreserveSign
The sign of a flushed-to-zero number is preserved in the sign of 0.
@ PositiveZero
Denormals are flushed to positive zero.
@ IEEE
IEEE-754 denormal numbers preserved.
constexpr bool inputsAreZero() const
Return true if input denormals must be implicitly treated as 0.
Extended Value Type.
Definition ValueTypes.h:35
TypeSize getStoreSize() const
Return the number of bytes overwritten by a store of the specified value type.
Definition ValueTypes.h:418
bool isSimple() const
Test if the given EVT is simple (as opposed to being extended).
Definition ValueTypes.h:145
static EVT getVectorVT(LLVMContext &Context, EVT VT, unsigned NumElements, bool IsScalable=false)
Returns the EVT that represents a vector NumElements in length, where each element is of type VT.
Definition ValueTypes.h:70
EVT changeTypeToInteger() const
Return the type converted to an equivalently sized integer or vector with integer element type.
Definition ValueTypes.h:129
bool bitsGT(EVT VT) const
Return true if this has more bits than VT.
Definition ValueTypes.h:307
bool bitsLT(EVT VT) const
Return true if this has less bits than VT.
Definition ValueTypes.h:323
bool isFloatingPoint() const
Return true if this is a FP or a vector FP type.
Definition ValueTypes.h:155
ElementCount getVectorElementCount() const
Definition ValueTypes.h:373
EVT getDoubleNumVectorElementsVT(LLVMContext &Context) const
Definition ValueTypes.h:494
TypeSize getSizeInBits() const
Return the size of the specified value type in bits.
Definition ValueTypes.h:396
bool isByteSized() const
Return true if the bit size is a multiple of 8.
Definition ValueTypes.h:266
unsigned getVectorMinNumElements() const
Given a vector type, return the minimum number of elements it contains.
Definition ValueTypes.h:382
uint64_t getScalarSizeInBits() const
Definition ValueTypes.h:408
EVT getHalfSizedIntegerVT(LLVMContext &Context) const
Finds the smallest simple value type that is greater than or equal to half the width of this EVT.
Definition ValueTypes.h:453
bool isPow2VectorType() const
Returns true if the given vector is a power of 2.
Definition ValueTypes.h:501
TypeSize getStoreSizeInBits() const
Return the number of bits overwritten by a store of the specified value type.
Definition ValueTypes.h:435
EVT changeVectorElementType(LLVMContext &Context, EVT EltVT) const
Return a VT for a vector type whose attributes match ourselves with the exception of the element type...
Definition ValueTypes.h:98
MVT getSimpleVT() const
Return the SimpleValueType held in the specified simple EVT.
Definition ValueTypes.h:339
static EVT getIntegerVT(LLVMContext &Context, unsigned BitWidth)
Returns the EVT that represents an integer with the given number of bits.
Definition ValueTypes.h:61
uint64_t getFixedSizeInBits() const
Return the size of the specified fixed width value type in bits.
Definition ValueTypes.h:404
EVT widenIntegerVectorElementType(LLVMContext &Context) const
Return a VT for an integer vector type with the size of the elements doubled.
Definition ValueTypes.h:475
EVT changeVectorElementCount(LLVMContext &Context, ElementCount EC) const
Return a VT for a vector type whose attributes match ourselves with the exception of the element coun...
Definition ValueTypes.h:109
bool isScalableVT() const
Return true if the type is a scalable type.
Definition ValueTypes.h:210
bool isFixedLengthVector() const
Definition ValueTypes.h:199
bool isVector() const
Return true if this is a vector value type.
Definition ValueTypes.h:176
EVT getScalarType() const
If this is a vector type, return the element type, otherwise return this.
Definition ValueTypes.h:346
bool bitsEq(EVT VT) const
Return true if this has the same number of bits as VT.
Definition ValueTypes.h:279
LLVM_ABI Type * getTypeForEVT(LLVMContext &Context) const
This method returns an LLVM type corresponding to the specified EVT.
EVT widenIntegerElementType(LLVMContext &Context) const
Return a VT for an integer element type with doubled bit width.
Definition ValueTypes.h:467
bool isScalableVector() const
Return true if this is a vector type where the runtime length is machine dependent.
Definition ValueTypes.h:187
EVT getVectorElementType() const
Given a vector type, return the type of each element.
Definition ValueTypes.h:351
EVT changeElementType(LLVMContext &Context, EVT EltVT) const
Return a VT for a type whose attributes match ourselves with the exception of the element type that i...
Definition ValueTypes.h:121
bool isScalarInteger() const
Return true if this is an integer, but not a vector.
Definition ValueTypes.h:165
LLVM_ABI const fltSemantics & getFltSemantics() const
Returns an APFloat semantics tag appropriate for the value type.
unsigned getVectorNumElements() const
Given a vector type, return the number of elements it contains.
Definition ValueTypes.h:359
bool bitsLE(EVT VT) const
Return true if this has no more bits than VT.
Definition ValueTypes.h:331
EVT getHalfNumVectorElementsVT(LLVMContext &Context) const
Definition ValueTypes.h:484
bool isInteger() const
Return true if this is an integer or a vector integer type.
Definition ValueTypes.h:160
static KnownBits makeConstant(const APInt &C)
Create known bits from a known constant.
Definition KnownBits.h:315
KnownBits anyextOrTrunc(unsigned BitWidth) const
Return known bits for an "any" extension or truncation of the value we're tracking.
Definition KnownBits.h:190
static LLVM_ABI KnownBits smax(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for smax(LHS, RHS).
bool isNonNegative() const
Returns true if this value is known to be non-negative.
Definition KnownBits.h:106
unsigned countMinTrailingZeros() const
Returns the minimum number of trailing zero bits.
Definition KnownBits.h:256
KnownBits trunc(unsigned BitWidth) const
Return known bits for a truncation of the value we're tracking.
Definition KnownBits.h:165
KnownBits byteSwap() const
Definition KnownBits.h:559
static LLVM_ABI std::optional< bool > sge(const KnownBits &LHS, const KnownBits &RHS)
Determine if these known bits always give the same ICMP_SGE result.
unsigned countMaxPopulation() const
Returns the maximum number of bits that could be one.
Definition KnownBits.h:303
KnownBits reverseBits() const
Definition KnownBits.h:563
KnownBits concat(const KnownBits &Lo) const
Concatenate the bits from Lo onto the bottom of *this.
Definition KnownBits.h:247
static LLVM_ABI KnownBits umax(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for umax(LHS, RHS).
unsigned countMinLeadingZeros() const
Returns the minimum number of leading zero bits.
Definition KnownBits.h:262
APInt getMaxValue() const
Return the maximal unsigned value possible given these KnownBits.
Definition KnownBits.h:146
static LLVM_ABI KnownBits smin(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for smin(LHS, RHS).
static LLVM_ABI std::optional< bool > ugt(const KnownBits &LHS, const KnownBits &RHS)
Determine if these known bits always give the same ICMP_UGT result.
static LLVM_ABI std::optional< bool > slt(const KnownBits &LHS, const KnownBits &RHS)
Determine if these known bits always give the same ICMP_SLT result.
static LLVM_ABI KnownBits computeForAddSub(bool Add, bool NSW, bool NUW, const KnownBits &LHS, const KnownBits &RHS)
Compute known bits resulting from adding LHS and RHS.
Definition KnownBits.cpp:61
static LLVM_ABI std::optional< bool > ult(const KnownBits &LHS, const KnownBits &RHS)
Determine if these known bits always give the same ICMP_ULT result.
static LLVM_ABI std::optional< bool > ule(const KnownBits &LHS, const KnownBits &RHS)
Determine if these known bits always give the same ICMP_ULE result.
bool isNegative() const
Returns true if this value is known to be negative.
Definition KnownBits.h:103
static LLVM_ABI KnownBits mul(const KnownBits &LHS, const KnownBits &RHS, bool NoUndefSelfMultiply=false)
Compute known bits resulting from multiplying LHS and RHS.
static LLVM_ABI std::optional< bool > sle(const KnownBits &LHS, const KnownBits &RHS)
Determine if these known bits always give the same ICMP_SLE result.
static LLVM_ABI std::optional< bool > sgt(const KnownBits &LHS, const KnownBits &RHS)
Determine if these known bits always give the same ICMP_SGT result.
unsigned countMinPopulation() const
Returns the number of bits known to be one.
Definition KnownBits.h:300
static LLVM_ABI std::optional< bool > uge(const KnownBits &LHS, const KnownBits &RHS)
Determine if these known bits always give the same ICMP_UGE result.
static LLVM_ABI KnownBits umin(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for umin(LHS, RHS).
Matching combinators.
This class contains a discriminated union of information about pointers in memory operands,...
LLVM_ABI unsigned getAddrSpace() const
Return the LLVM IR address space number that this pointer points into.
static LLVM_ABI MachinePointerInfo getConstantPool(MachineFunction &MF)
Return a MachinePointerInfo record that refers to the constant pool.
MachinePointerInfo getWithOffset(int64_t O) const
static LLVM_ABI MachinePointerInfo getUnknownStack(MachineFunction &MF)
Stack memory without other information.
static LLVM_ABI MachinePointerInfo getFixedStack(MachineFunction &MF, int FI, int64_t Offset=0)
Return a MachinePointerInfo record that refers to the specified FrameIndex.
static LLVM_ABI bool hasVectorMaskArgument(RTLIB::LibcallImpl Impl)
Returns true if the function has a vector mask argument, which is assumed to be the last argument.
These are IR-level optimization flags that may be propagated to SDNodes.
bool hasNoUnsignedWrap() const
bool hasNoSignedWrap() const
void setNoSignedWrap(bool b)
This represents a list of ValueType's that has been intern'd by a SelectionDAG.
Magic data for optimising signed division by a constant.
static LLVM_ABI SignedDivisionByConstantInfo get(const APInt &D)
Calculate the magic numbers required to implement a signed integer division by a constant as a sequen...
This contains information for each constraint that we are lowering.
std::string ConstraintCode
This contains the actual string for the code, like "m".
LLVM_ABI unsigned getMatchedOperand() const
If this is an input matching constraint, this method returns the output operand it matches.
LLVM_ABI bool isMatchingInputConstraint() const
Return true of this is an input operand that is a matching constraint like "4".
This structure contains all information that is necessary for lowering calls.
CallLoweringInfo & setIsPostTypeLegalization(bool Value=true)
CallLoweringInfo & setLibCallee(CallingConv::ID CC, Type *ResultType, SDValue Target, ArgListTy &&ArgsList)
CallLoweringInfo & setDiscardResult(bool Value=true)
CallLoweringInfo & setZExtResult(bool Value=true)
CallLoweringInfo & setDebugLoc(const SDLoc &dl)
CallLoweringInfo & setSExtResult(bool Value=true)
CallLoweringInfo & setNoReturn(bool Value=true)
CallLoweringInfo & setChain(SDValue InChain)
LLVM_ABI void AddToWorklist(SDNode *N)
LLVM_ABI void CommitTargetLoweringOpt(const TargetLoweringOpt &TLO)
This structure is used to pass arguments to makeLibCall function.
MakeLibCallOptions & setIsPostTypeLegalization(bool Value=true)
MakeLibCallOptions & setTypeListBeforeSoften(ArrayRef< EVT > OpsVT, EVT RetVT)
MakeLibCallOptions & setIsSigned(bool Value=true)
A convenience struct that encapsulates a DAG, and two SDValues for returning information from TargetL...
Magic data for optimising unsigned division by a constant.
static LLVM_ABI UnsignedDivisionByConstantInfo get(const APInt &D, unsigned LeadingZeros=0, bool AllowEvenDivisorOptimization=true, bool AllowWidenOptimization=false)
Calculate the magic numbers required to implement an unsigned integer division by a constant as a seq...
fltNonfiniteBehavior nonFiniteBehavior
Definition APFloat.h:1039
fltNanEncoding nanEncoding
Definition APFloat.h:1041