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 EVT VT = Node->getValueType(0);
8690 SDValue ShX, ShY;
8691 SDValue ShAmt, InvShAmt;
8692 SDValue X = Node->getOperand(0);
8693 SDValue Y = Node->getOperand(1);
8694 SDValue Z = Node->getOperand(2);
8695 SDValue Mask = Node->getOperand(3);
8696 SDValue VL = Node->getOperand(4);
8697
8698 unsigned BW = VT.getScalarSizeInBits();
8699 bool IsFSHL = Node->getOpcode() == ISD::VP_FSHL;
8700 SDLoc DL(SDValue(Node, 0));
8701
8702 EVT ShVT = Z.getValueType();
8703 if (isNonZeroModBitWidthOrUndef(Z, BW)) {
8704 // fshl: X << C | Y >> (BW - C)
8705 // fshr: X << (BW - C) | Y >> C
8706 // where C = Z % BW is not zero
8707 SDValue BitWidthC = DAG.getConstant(BW, DL, ShVT);
8708 ShAmt = DAG.getNode(ISD::VP_UREM, DL, ShVT, Z, BitWidthC, Mask, VL);
8709 InvShAmt = DAG.getNode(ISD::VP_SUB, DL, ShVT, BitWidthC, ShAmt, Mask, VL);
8710 ShX = DAG.getNode(ISD::VP_SHL, DL, VT, X, IsFSHL ? ShAmt : InvShAmt, Mask,
8711 VL);
8712 ShY = DAG.getNode(ISD::VP_SRL, DL, VT, Y, IsFSHL ? InvShAmt : ShAmt, Mask,
8713 VL);
8714 } else {
8715 // fshl: X << (Z % BW) | Y >> 1 >> (BW - 1 - (Z % BW))
8716 // fshr: X << 1 << (BW - 1 - (Z % BW)) | Y >> (Z % BW)
8717 SDValue BitMask = DAG.getConstant(BW - 1, DL, ShVT);
8718 if (isPowerOf2_32(BW)) {
8719 // Z % BW -> Z & (BW - 1)
8720 ShAmt = DAG.getNode(ISD::VP_AND, DL, ShVT, Z, BitMask, Mask, VL);
8721 // (BW - 1) - (Z % BW) -> ~Z & (BW - 1)
8722 SDValue NotZ = DAG.getNode(ISD::VP_XOR, DL, ShVT, Z,
8723 DAG.getAllOnesConstant(DL, ShVT), Mask, VL);
8724 InvShAmt = DAG.getNode(ISD::VP_AND, DL, ShVT, NotZ, BitMask, Mask, VL);
8725 } else {
8726 SDValue BitWidthC = DAG.getConstant(BW, DL, ShVT);
8727 ShAmt = DAG.getNode(ISD::VP_UREM, DL, ShVT, Z, BitWidthC, Mask, VL);
8728 InvShAmt = DAG.getNode(ISD::VP_SUB, DL, ShVT, BitMask, ShAmt, Mask, VL);
8729 }
8730
8731 SDValue One = DAG.getConstant(1, DL, ShVT);
8732 if (IsFSHL) {
8733 ShX = DAG.getNode(ISD::VP_SHL, DL, VT, X, ShAmt, Mask, VL);
8734 SDValue ShY1 = DAG.getNode(ISD::VP_SRL, DL, VT, Y, One, Mask, VL);
8735 ShY = DAG.getNode(ISD::VP_SRL, DL, VT, ShY1, InvShAmt, Mask, VL);
8736 } else {
8737 SDValue ShX1 = DAG.getNode(ISD::VP_SHL, DL, VT, X, One, Mask, VL);
8738 ShX = DAG.getNode(ISD::VP_SHL, DL, VT, ShX1, InvShAmt, Mask, VL);
8739 ShY = DAG.getNode(ISD::VP_SRL, DL, VT, Y, ShAmt, Mask, VL);
8740 }
8741 }
8742 return DAG.getNode(ISD::VP_OR, DL, VT, ShX, ShY, Mask, VL);
8743}
8744
8746 SelectionDAG &DAG) const {
8747 if (Node->isVPOpcode())
8748 return expandVPFunnelShift(Node, DAG);
8749
8750 EVT VT = Node->getValueType(0);
8751
8752 if (VT.isVector() && (!isOperationLegalOrCustom(ISD::SHL, VT) ||
8756 return SDValue();
8757
8758 SDValue X = Node->getOperand(0);
8759 SDValue Y = Node->getOperand(1);
8760 SDValue Z = Node->getOperand(2);
8761
8762 unsigned BW = VT.getScalarSizeInBits();
8763 bool IsFSHL = Node->getOpcode() == ISD::FSHL;
8764 SDLoc DL(SDValue(Node, 0));
8765
8766 EVT ShVT = Z.getValueType();
8767
8768 // If a funnel shift in the other direction is more supported, use it.
8769 unsigned RevOpcode = IsFSHL ? ISD::FSHR : ISD::FSHL;
8770 if (!isOperationLegalOrCustom(Node->getOpcode(), VT) &&
8771 isOperationLegalOrCustom(RevOpcode, VT) && isPowerOf2_32(BW)) {
8772 if (isNonZeroModBitWidthOrUndef(Z, BW)) {
8773 // fshl X, Y, Z -> fshr X, Y, -Z
8774 // fshr X, Y, Z -> fshl X, Y, -Z
8775 Z = DAG.getNegative(Z, DL, ShVT);
8776 } else {
8777 // fshl X, Y, Z -> fshr (srl X, 1), (fshr X, Y, 1), ~Z
8778 // fshr X, Y, Z -> fshl (fshl X, Y, 1), (shl Y, 1), ~Z
8779 SDValue One = DAG.getConstant(1, DL, ShVT);
8780 if (IsFSHL) {
8781 Y = DAG.getNode(RevOpcode, DL, VT, X, Y, One);
8782 X = DAG.getNode(ISD::SRL, DL, VT, X, One);
8783 } else {
8784 X = DAG.getNode(RevOpcode, DL, VT, X, Y, One);
8785 Y = DAG.getNode(ISD::SHL, DL, VT, Y, One);
8786 }
8787 Z = DAG.getNOT(DL, Z, ShVT);
8788 }
8789 return DAG.getNode(RevOpcode, DL, VT, X, Y, Z);
8790 }
8791
8792 SDValue ShX, ShY;
8793 SDValue ShAmt, InvShAmt;
8794 if (isNonZeroModBitWidthOrUndef(Z, BW)) {
8795 // fshl: X << C | Y >> (BW - C)
8796 // fshr: X << (BW - C) | Y >> C
8797 // where C = Z % BW is not zero
8798 SDValue BitWidthC = DAG.getConstant(BW, DL, ShVT);
8799 ShAmt = DAG.getNode(ISD::UREM, DL, ShVT, Z, BitWidthC);
8800 InvShAmt = DAG.getNode(ISD::SUB, DL, ShVT, BitWidthC, ShAmt);
8801 ShX = DAG.getNode(ISD::SHL, DL, VT, X, IsFSHL ? ShAmt : InvShAmt);
8802 ShY = DAG.getNode(ISD::SRL, DL, VT, Y, IsFSHL ? InvShAmt : ShAmt);
8803 } else {
8804 // fshl: X << (Z % BW) | Y >> 1 >> (BW - 1 - (Z % BW))
8805 // fshr: X << 1 << (BW - 1 - (Z % BW)) | Y >> (Z % BW)
8806 SDValue Mask = DAG.getConstant(BW - 1, DL, ShVT);
8807 if (isPowerOf2_32(BW)) {
8808 // Z % BW -> Z & (BW - 1)
8809 ShAmt = DAG.getNode(ISD::AND, DL, ShVT, Z, Mask);
8810 // (BW - 1) - (Z % BW) -> ~Z & (BW - 1)
8811 InvShAmt = DAG.getNode(ISD::AND, DL, ShVT, DAG.getNOT(DL, Z, ShVT), Mask);
8812 } else {
8813 SDValue BitWidthC = DAG.getConstant(BW, DL, ShVT);
8814 ShAmt = DAG.getNode(ISD::UREM, DL, ShVT, Z, BitWidthC);
8815 InvShAmt = DAG.getNode(ISD::SUB, DL, ShVT, Mask, ShAmt);
8816 }
8817
8818 SDValue One = DAG.getConstant(1, DL, ShVT);
8819 if (IsFSHL) {
8820 ShX = DAG.getNode(ISD::SHL, DL, VT, X, ShAmt);
8821 SDValue ShY1 = DAG.getNode(ISD::SRL, DL, VT, Y, One);
8822 ShY = DAG.getNode(ISD::SRL, DL, VT, ShY1, InvShAmt);
8823 } else {
8824 SDValue ShX1 = DAG.getNode(ISD::SHL, DL, VT, X, One);
8825 ShX = DAG.getNode(ISD::SHL, DL, VT, ShX1, InvShAmt);
8826 ShY = DAG.getNode(ISD::SRL, DL, VT, Y, ShAmt);
8827 }
8828 }
8829 return DAG.getNode(ISD::OR, DL, VT, ShX, ShY);
8830}
8831
8832// TODO: Merge with expandFunnelShift.
8834 SelectionDAG &DAG) const {
8835 EVT VT = Node->getValueType(0);
8836 unsigned EltSizeInBits = VT.getScalarSizeInBits();
8837 bool IsLeft = Node->getOpcode() == ISD::ROTL;
8838 SDValue Op0 = Node->getOperand(0);
8839 SDValue Op1 = Node->getOperand(1);
8840 SDLoc DL(SDValue(Node, 0));
8841
8842 EVT ShVT = Op1.getValueType();
8843 SDValue Zero = DAG.getConstant(0, DL, ShVT);
8844
8845 // If a rotate in the other direction is more supported, use it.
8846 unsigned RevRot = IsLeft ? ISD::ROTR : ISD::ROTL;
8847 if (!isOperationLegalOrCustom(Node->getOpcode(), VT) &&
8848 isOperationLegalOrCustom(RevRot, VT) && isPowerOf2_32(EltSizeInBits)) {
8849 SDValue Sub = DAG.getNode(ISD::SUB, DL, ShVT, Zero, Op1);
8850 return DAG.getNode(RevRot, DL, VT, Op0, Sub);
8851 }
8852
8853 if (!AllowVectorOps && VT.isVector() &&
8859 return SDValue();
8860
8861 unsigned ShOpc = IsLeft ? ISD::SHL : ISD::SRL;
8862 unsigned HsOpc = IsLeft ? ISD::SRL : ISD::SHL;
8863 SDValue BitWidthMinusOneC = DAG.getConstant(EltSizeInBits - 1, DL, ShVT);
8864 SDValue ShVal;
8865 SDValue HsVal;
8866 if (isPowerOf2_32(EltSizeInBits)) {
8867 // (rotl x, c) -> x << (c & (w - 1)) | x >> (-c & (w - 1))
8868 // (rotr x, c) -> x >> (c & (w - 1)) | x << (-c & (w - 1))
8869 SDValue NegOp1 = DAG.getNode(ISD::SUB, DL, ShVT, Zero, Op1);
8870 SDValue ShAmt = DAG.getNode(ISD::AND, DL, ShVT, Op1, BitWidthMinusOneC);
8871 ShVal = DAG.getNode(ShOpc, DL, VT, Op0, ShAmt);
8872 SDValue HsAmt = DAG.getNode(ISD::AND, DL, ShVT, NegOp1, BitWidthMinusOneC);
8873 HsVal = DAG.getNode(HsOpc, DL, VT, Op0, HsAmt);
8874 } else {
8875 // (rotl x, c) -> x << (c % w) | x >> 1 >> (w - 1 - (c % w))
8876 // (rotr x, c) -> x >> (c % w) | x << 1 << (w - 1 - (c % w))
8877 SDValue BitWidthC = DAG.getConstant(EltSizeInBits, DL, ShVT);
8878 SDValue ShAmt = DAG.getNode(ISD::UREM, DL, ShVT, Op1, BitWidthC);
8879 ShVal = DAG.getNode(ShOpc, DL, VT, Op0, ShAmt);
8880 SDValue HsAmt = DAG.getNode(ISD::SUB, DL, ShVT, BitWidthMinusOneC, ShAmt);
8881 SDValue One = DAG.getConstant(1, DL, ShVT);
8882 HsVal =
8883 DAG.getNode(HsOpc, DL, VT, DAG.getNode(HsOpc, DL, VT, Op0, One), HsAmt);
8884 }
8885 return DAG.getNode(ISD::OR, DL, VT, ShVal, HsVal);
8886}
8887
8888/// Check if CLMUL on VT can eventually reach a type with legal CLMUL through
8889/// a chain of halving decompositions (halving element width) and/or vector
8890/// widening (doubling element count). This guides expansion strategy selection:
8891/// if true, the halving/widening path produces better code than bit-by-bit.
8892///
8893/// HalveDepth tracks halving steps only (each creates ~4x more operations).
8894/// Widening steps are cheap (O(1) pad/extract) and don't count.
8895/// Limiting halvings to 2 prevents exponential blowup:
8896/// 1 halving: ~4 sub-CLMULs (good, e.g. v8i16 -> v8i8)
8897/// 2 halvings: ~16 sub-CLMULs (acceptable, e.g. v4i32 -> v4i16 -> v8i8)
8898/// 3 halvings: ~64 sub-CLMULs (worse than bit-by-bit expansion)
8900 EVT VT, unsigned HalveDepth = 0,
8901 unsigned TotalDepth = 0) {
8902 if (HalveDepth > 2 || TotalDepth > 8 || !VT.isFixedLengthVector())
8903 return false;
8905 return true;
8906 if (!TLI.isTypeLegal(VT))
8907 return false;
8908
8909 unsigned BW = VT.getScalarSizeInBits();
8910
8911 // Halve: halve element width, same element count.
8912 // This is the expensive step -- each halving creates ~4x more operations.
8913 if (BW % 2 == 0) {
8914 EVT HalfEltVT = EVT::getIntegerVT(Ctx, BW / 2);
8915 EVT HalfVT = VT.changeVectorElementType(Ctx, HalfEltVT);
8916 if (TLI.isTypeLegal(HalfVT) &&
8917 canNarrowCLMULToLegal(TLI, Ctx, HalfVT, HalveDepth + 1, TotalDepth + 1))
8918 return true;
8919 }
8920
8921 // Widen: double element count (fixed-width vectors only).
8922 // This is cheap -- just INSERT_SUBVECTOR + EXTRACT_SUBVECTOR.
8923 EVT WideVT = VT.getDoubleNumVectorElementsVT(Ctx);
8924 if (TLI.isTypeLegal(WideVT) &&
8925 canNarrowCLMULToLegal(TLI, Ctx, WideVT, HalveDepth, TotalDepth + 1))
8926 return true;
8927
8928 return false;
8929}
8930
8932 SDLoc DL(Node);
8933 EVT VT = Node->getValueType(0);
8934 SDValue X = Node->getOperand(0);
8935 SDValue Y = Node->getOperand(1);
8936 unsigned BW = VT.getScalarSizeInBits();
8937 unsigned Opcode = Node->getOpcode();
8938 LLVMContext &Ctx = *DAG.getContext();
8939
8940 switch (Opcode) {
8941 case ISD::CLMUL: {
8942 // For vector types, try decomposition strategies that leverage legal
8943 // CLMUL on narrower or wider element types, avoiding the expensive
8944 // bit-by-bit expansion.
8945 if (VT.isVector()) {
8946 // Strategy 1: Halving decomposition to half-element-width CLMUL.
8947 // Applies ExpandIntRes_CLMUL's identity element-wise:
8948 // CLMUL(X, Y) = (Hi << HalfBW) | Lo
8949 // where:
8950 // Lo = CLMUL(XLo, YLo)
8951 // Hi = CLMULH(XLo, YLo) ^ CLMUL(XLo, YHi) ^ CLMUL(XHi, YLo)
8952 unsigned HalfBW = BW / 2;
8953 if (BW % 2 == 0) {
8954 EVT HalfEltVT = EVT::getIntegerVT(Ctx, HalfBW);
8955 EVT HalfVT =
8956 EVT::getVectorVT(Ctx, HalfEltVT, VT.getVectorElementCount());
8957 if (isTypeLegal(HalfVT) && canNarrowCLMULToLegal(*this, Ctx, HalfVT,
8958 /*HalveDepth=*/1)) {
8959 SDValue ShAmt = DAG.getShiftAmountConstant(HalfBW, VT, DL);
8960
8961 // Extract low and high halves of each element.
8962 SDValue XLo = DAG.getNode(ISD::TRUNCATE, DL, HalfVT, X);
8963 SDValue XHi = DAG.getNode(ISD::TRUNCATE, DL, HalfVT,
8964 DAG.getNode(ISD::SRL, DL, VT, X, ShAmt));
8965 SDValue YLo = DAG.getNode(ISD::TRUNCATE, DL, HalfVT, Y);
8966 SDValue YHi = DAG.getNode(ISD::TRUNCATE, DL, HalfVT,
8967 DAG.getNode(ISD::SRL, DL, VT, Y, ShAmt));
8968
8969 // Lo = CLMUL(XLo, YLo)
8970 SDValue Lo = DAG.getNode(ISD::CLMUL, DL, HalfVT, XLo, YLo);
8971
8972 // Hi = CLMULH(XLo, YLo) ^ CLMUL(XLo, YHi) ^ CLMUL(XHi, YLo)
8973 SDValue LoH = DAG.getNode(ISD::CLMULH, DL, HalfVT, XLo, YLo);
8974 SDValue Cross1 = DAG.getNode(ISD::CLMUL, DL, HalfVT, XLo, YHi);
8975 SDValue Cross2 = DAG.getNode(ISD::CLMUL, DL, HalfVT, XHi, YLo);
8976 SDValue Cross = DAG.getNode(ISD::XOR, DL, HalfVT, Cross1, Cross2);
8977 SDValue Hi = DAG.getNode(ISD::XOR, DL, HalfVT, LoH, Cross);
8978
8979 // Reassemble: Result = ZExt(Lo) | (AnyExt(Hi) << HalfBW)
8980 SDValue LoExt = DAG.getNode(ISD::ZERO_EXTEND, DL, VT, Lo);
8981 SDValue HiExt = DAG.getNode(ISD::ANY_EXTEND, DL, VT, Hi);
8982 SDValue HiShifted = DAG.getNode(ISD::SHL, DL, VT, HiExt, ShAmt);
8983 return DAG.getNode(ISD::OR, DL, VT, LoExt, HiShifted);
8984 }
8985 }
8986
8987 // Strategy 2: Promote to double-element-width CLMUL.
8988 // CLMUL(X, Y) = Trunc(CLMUL(AnyExt(X), AnyExt(Y)))
8989 {
8990 EVT ExtVT = VT.widenIntegerElementType(Ctx);
8991 if (isTypeLegal(ExtVT) && isOperationLegalOrCustom(ISD::CLMUL, ExtVT)) {
8992 // If CLMUL on ExtVT is Custom (not Legal), the target may
8993 // scalarize it, costing O(NumElements) scalar ops. The bit-by-bit
8994 // fallback costs O(BW) vectorized iterations. Only widen when
8995 // element count is small enough that scalarization is cheaper.
8996 unsigned NumElts = VT.getVectorMinNumElements();
8997 if (isOperationLegal(ISD::CLMUL, ExtVT) || NumElts < BW) {
8998 SDValue XExt = DAG.getNode(ISD::ANY_EXTEND, DL, ExtVT, X);
8999 SDValue YExt = DAG.getNode(ISD::ANY_EXTEND, DL, ExtVT, Y);
9000 SDValue Mul = DAG.getNode(ISD::CLMUL, DL, ExtVT, XExt, YExt);
9001 return DAG.getNode(ISD::TRUNCATE, DL, VT, Mul);
9002 }
9003 }
9004 }
9005
9006 // Strategy 3: Widen element count (pad with undef, do CLMUL on wider
9007 // vector, extract lower result). CLMUL is element-wise, so upper
9008 // (undef) lanes don't affect the lower results.
9009 // e.g. v4i16 => pad to v8i16 => halve to v8i8 PMUL => extract v4i16.
9010 if (auto EC = VT.getVectorElementCount(); EC.isFixed()) {
9011 EVT WideVT = EVT::getVectorVT(Ctx, VT.getVectorElementType(), EC * 2);
9012 if (isTypeLegal(WideVT) && canNarrowCLMULToLegal(*this, Ctx, WideVT)) {
9013 SDValue Undef = DAG.getUNDEF(WideVT);
9014 SDValue XWide = DAG.getNode(ISD::INSERT_SUBVECTOR, DL, WideVT, Undef,
9015 X, DAG.getVectorIdxConstant(0, DL));
9016 SDValue YWide = DAG.getNode(ISD::INSERT_SUBVECTOR, DL, WideVT, Undef,
9017 Y, DAG.getVectorIdxConstant(0, DL));
9018 SDValue WideRes = DAG.getNode(ISD::CLMUL, DL, WideVT, XWide, YWide);
9019 return DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, VT, WideRes,
9020 DAG.getVectorIdxConstant(0, DL));
9021 }
9022 }
9023 }
9024
9025 // Special case: clmul(X, ~0) is equivalent to a "parallel prefix XOR" or
9026 // "bitwise parity" operation.
9028 SDValue R = X;
9029 for (unsigned I = 1; I < BW; I <<= 1) {
9030 SDValue ShAmt = DAG.getShiftAmountConstant(I, VT, DL);
9031 SDValue Shifted = DAG.getNode(ISD::SHL, DL, VT, R, ShAmt);
9032 R = DAG.getNode(ISD::XOR, DL, VT, R, Shifted);
9033 }
9034 return R;
9035 }
9036
9037 // NOTE: If you change this expansion, please update the cost model
9038 // calculation in BasicTTIImpl::getTypeBasedIntrinsicInstrCost for
9039 // Intrinsic::clmul.
9040
9041 // Strategy 4: multiplication with holes.
9042 //
9043 // Uses "holes" (sequences of zeroes) to avoid carry spilling. When carries
9044 // do occur, they wind up in a "hole" and are subsequently masked out of the
9045 // result.
9046 //
9047 // A hole of 3 bits is optimal for 32-bit and 64-bit inputs. 128-bit
9048 // integers need a larger hole, and for smaller integers the fallback below
9049 // is more efficient.
9050 //
9051 // Based on bmul64 in bearssl and bmul in the rust polyval crate.
9052 if (BW >= 32 && BW <= 64 &&
9054
9055 // Set every fourth bit of each nibble, equivalent to 0b00010001...0001.
9056 APInt MaskVal = APInt::getSplat(BW, APInt(4, 0b0001));
9057
9058 // Create versions of X and Y that keep only the I-th bit of
9059 // each nibble.
9060 SDValue M[4], Xp[4], Yp[4];
9061 for (unsigned I = 0; I < 4; ++I) {
9062 M[I] = DAG.getConstant(MaskVal.shl(I), DL, VT);
9063 Xp[I] = DAG.getNode(ISD::AND, DL, VT, X, M[I]);
9064 Yp[I] = DAG.getNode(ISD::AND, DL, VT, Y, M[I]);
9065 }
9066
9067 // Codegens these expressions (16 multiplications):
9068 //
9069 // z0 = (x0 * y0) ^ (x1 * y3) ^ (x2 * y2) ^ (x3 * y1);
9070 // z1 = (x0 * y1) ^ (x1 * y0) ^ (x2 * y3) ^ (x3 * y2);
9071 // z2 = (x0 * y2) ^ (x1 * y1) ^ (x2 * y0) ^ (x3 * y3);
9072 // z3 = (x0 * y3) ^ (x1 * y2) ^ (x2 * y1) ^ (x3 * y0);
9073 SDValue Res = DAG.getConstant(0, DL, VT);
9074 for (unsigned I = 0; I < 4; ++I) {
9075 SDValue Zi = DAG.getConstant(0, DL, VT);
9076 for (unsigned J = 0; J < 4; ++J) {
9077 unsigned K = (I + 4 - J) % 4;
9078 SDValue P = DAG.getNode(ISD::MUL, DL, VT, Xp[J], Yp[K]);
9079 Zi = DAG.getNode(ISD::XOR, DL, VT, Zi, P);
9080 }
9081
9082 // Keep only the bits belonging to this iteration, and bitwise or it all
9083 // together.
9084 Zi = DAG.getNode(ISD::AND, DL, VT, Zi, M[I]);
9085 Res = DAG.getNode(ISD::OR, DL, VT, Res, Zi, SDNodeFlags::Disjoint);
9086 }
9087 return Res;
9088 }
9089
9090 // Strategy 5: the naive fallback.
9091 EVT SetCCVT = getSetCCResultType(DAG.getDataLayout(), Ctx, VT);
9092
9093 SDValue Res = DAG.getConstant(0, DL, VT);
9094 for (unsigned I = 0; I < BW; ++I) {
9095 SDValue ShiftAmt = DAG.getShiftAmountConstant(I, VT, DL);
9096 SDValue Mask = DAG.getConstant(APInt::getOneBitSet(BW, I), DL, VT);
9097 SDValue YMasked = DAG.getNode(ISD::AND, DL, VT, Y, Mask);
9098
9099 // For targets with a fast bit test instruction (e.g., x86 BT) or without
9100 // multiply, use a shift-based expansion to avoid expensive MUL
9101 // instructions.
9102 SDValue Part;
9103 if (!hasBitTest(Y, ShiftAmt) &&
9106 Part = DAG.getNode(ISD::MUL, DL, VT, X, YMasked);
9107 } else {
9108 // Canonical bit test: (Y & (1 << I)) != 0
9109 SDValue Zero = DAG.getConstant(0, DL, VT);
9110 SDValue Cond = DAG.getSetCC(DL, SetCCVT, YMasked, Zero, ISD::SETEQ);
9111 SDValue XShifted = DAG.getNode(ISD::SHL, DL, VT, X, ShiftAmt);
9112 Part = DAG.getSelect(DL, VT, Cond, Zero, XShifted);
9113 }
9114 Res = DAG.getNode(ISD::XOR, DL, VT, Res, Part);
9115 }
9116 return Res;
9117 }
9118 case ISD::CLMULR:
9119 // If we have CLMUL/CLMULH, merge the shifted results to form CLMULR.
9122 SDValue Lo = DAG.getNode(ISD::CLMUL, DL, VT, X, Y);
9123 SDValue Hi = DAG.getNode(ISD::CLMULH, DL, VT, X, Y);
9124 Lo = DAG.getNode(ISD::SRL, DL, VT, Lo,
9125 DAG.getShiftAmountConstant(BW - 1, VT, DL));
9126 Hi = DAG.getNode(ISD::SHL, DL, VT, Hi,
9127 DAG.getShiftAmountConstant(1, VT, DL));
9128 return DAG.getNode(ISD::OR, DL, VT, Lo, Hi);
9129 }
9130 [[fallthrough]];
9131 case ISD::CLMULH: {
9132 EVT ExtVT = VT.widenIntegerElementType(Ctx);
9133 // Use bitreverse-based lowering (CLMULR/H = rev(CLMUL(rev,rev)) >> S)
9134 // when any of these hold:
9135 // (a) ZERO_EXTEND to ExtVT or SRL on ExtVT isn't legal.
9136 // (b) CLMUL is legal on VT but not on ExtVT (e.g. v8i8 on AArch64).
9137 // (c) CLMUL on ExtVT isn't legal, but CLMUL on VT can be efficiently
9138 // expanded via halving/widening to reach legal CLMUL. The bitreverse
9139 // path creates CLMUL(VT) which will be expanded efficiently. The
9140 // promote path would create CLMUL(ExtVT) => halving => CLMULH(VT),
9141 // causing a cycle.
9142 // Note: when CLMUL is legal on ExtVT, the zext => CLMUL(ExtVT) => shift
9143 // => trunc path is preferred over the bitreverse path, as it avoids the
9144 // cost of 3 bitreverse operations.
9149 canNarrowCLMULToLegal(*this, Ctx, VT)))) {
9150 SDValue XRev = DAG.getNode(ISD::BITREVERSE, DL, VT, X);
9151 SDValue YRev = DAG.getNode(ISD::BITREVERSE, DL, VT, Y);
9152 SDValue ClMul = DAG.getNode(ISD::CLMUL, DL, VT, XRev, YRev);
9153 SDValue Res = DAG.getNode(ISD::BITREVERSE, DL, VT, ClMul);
9154 if (Opcode == ISD::CLMULH)
9155 Res = DAG.getNode(ISD::SRL, DL, VT, Res,
9156 DAG.getShiftAmountConstant(1, VT, DL));
9157 return Res;
9158 }
9159 SDValue XExt = DAG.getNode(ISD::ZERO_EXTEND, DL, ExtVT, X);
9160 SDValue YExt = DAG.getNode(ISD::ZERO_EXTEND, DL, ExtVT, Y);
9161 SDValue ClMul = DAG.getNode(ISD::CLMUL, DL, ExtVT, XExt, YExt);
9162 unsigned ShAmt = Opcode == ISD::CLMULR ? BW - 1 : BW;
9163 SDValue HiBits = DAG.getNode(ISD::SRL, DL, ExtVT, ClMul,
9164 DAG.getShiftAmountConstant(ShAmt, ExtVT, DL));
9165 return DAG.getNode(ISD::TRUNCATE, DL, VT, HiBits);
9166 }
9167 }
9168 llvm_unreachable("Expected CLMUL, CLMULR, or CLMULH");
9169}
9170
9172 SDLoc DL(Node);
9173 EVT VT = Node->getValueType(0);
9174 SDValue Val = Node->getOperand(0);
9175 SDValue Msk = Node->getOperand(1);
9176 unsigned BW = VT.getScalarSizeInBits();
9177
9178 // Just scalarize if scalar PEXT is legal
9180 return DAG.UnrollVectorOp(Node);
9181
9182 // Hacker's Delight §7-4: Compress, or Generalized Extract
9183 SDValue X = DAG.getNode(ISD::AND, DL, VT, Val, Msk);
9184 SDValue M = Msk;
9185 SDValue One = DAG.getShiftAmountConstant(1, VT, DL);
9186 SDValue Mk = DAG.getNode(ISD::SHL, DL, VT, DAG.getNOT(DL, M, VT), One);
9187
9188 // Repeatedly compute which bits would shift to the right by an odd amount,
9189 // shift all such bits in parallel using a mask, and double the shift amount.
9190 for (unsigned I = 1; I < BW; I *= 2) {
9191 // This expands the "parallel prefix" operation to clmul(Mk, ~0).
9192 SDValue Mp =
9193 DAG.getNode(ISD::CLMUL, DL, VT, Mk, DAG.getAllOnesConstant(DL, VT));
9194 SDValue Mv = DAG.getNode(ISD::AND, DL, VT, Mp, M);
9195 SDValue ShiftI = DAG.getShiftAmountConstant(I, VT, DL);
9196 SDValue MvS = DAG.getNode(ISD::SRL, DL, VT, Mv, ShiftI);
9197 M = DAG.getNode(ISD::OR, DL, VT, DAG.getNode(ISD::XOR, DL, VT, M, Mv), MvS,
9199 SDValue T = DAG.getNode(ISD::AND, DL, VT, X, Mv);
9200 SDValue TS = DAG.getNode(ISD::SRL, DL, VT, T, ShiftI);
9201 X = DAG.getNode(ISD::OR, DL, VT, DAG.getNode(ISD::XOR, DL, VT, X, T), TS,
9203 if (I * 2 < BW)
9204 Mk = DAG.getNode(ISD::AND, DL, VT, Mk, DAG.getNOT(DL, Mp, VT));
9205 }
9206
9207 return X;
9208}
9209
9211 SDLoc DL(Node);
9212 EVT VT = Node->getValueType(0);
9213 SDValue Val = Node->getOperand(0);
9214 SDValue Msk = Node->getOperand(1);
9215 unsigned BW = VT.getScalarSizeInBits();
9216
9217 // Just scalarize if scalar PDEP is legal
9219 return DAG.UnrollVectorOp(Node);
9220
9221 // Hacker's Delight §7-5: Expand, or Generalized Insert.
9222 unsigned LogBW = Log2_32_Ceil(BW);
9223 SmallVector<SDValue, 8> MvArray(LogBW);
9224 SDValue One = DAG.getShiftAmountConstant(1, VT, DL);
9225 SDValue Mc = Msk;
9226 SDValue Mk = DAG.getNode(ISD::SHL, DL, VT, DAG.getNOT(DL, Msk, VT), One);
9227
9228 // First pass: compute move masks for each power of two that a bit moves by.
9229 for (unsigned S = 0; S < LogBW; ++S) {
9230 unsigned ShiftS = 1u << S;
9231 // This expands the "parallel prefix" operation to clmul(Mk, ~0).
9232 SDValue Mp =
9233 DAG.getNode(ISD::CLMUL, DL, VT, Mk, DAG.getAllOnesConstant(DL, VT));
9234 SDValue Mv = DAG.getNode(ISD::AND, DL, VT, Mp, Mc);
9235 MvArray[S] = Mv;
9236 if (S + 1 < LogBW) {
9237 SDValue McXorMv = DAG.getNode(ISD::XOR, DL, VT, Mc, Mv);
9238 SDValue MvShifted = DAG.getNode(
9239 ISD::SRL, DL, VT, Mv, DAG.getShiftAmountConstant(ShiftS, VT, DL));
9240 Mc = DAG.getNode(ISD::OR, DL, VT, McXorMv, MvShifted,
9242 Mk = DAG.getNode(ISD::AND, DL, VT, Mk, DAG.getNOT(DL, Mp, VT));
9243 }
9244 }
9245
9246 // Second pass: move bits by 32, 16, 8, 4, 2, 1, using masks, in parallel.
9247 // Each pass handles half the shift amount of the previous pass.
9248 SDValue X = Val;
9249 for (int S = (int)LogBW - 1; S >= 0; --S) {
9250 SDValue ShiftSv = DAG.getShiftAmountConstant(1ull << S, VT, DL);
9251 SDValue T = DAG.getNode(ISD::SHL, DL, VT, X, ShiftSv);
9252 SDValue UnshiftedBits =
9253 DAG.getNode(ISD::AND, DL, VT, X, DAG.getNOT(DL, MvArray[S], VT));
9254 SDValue ShiftedBits = DAG.getNode(ISD::AND, DL, VT, T, MvArray[S]);
9255 X = DAG.getNode(ISD::OR, DL, VT, UnshiftedBits, ShiftedBits,
9257 }
9258
9259 return DAG.getNode(ISD::AND, DL, VT, X, Msk);
9260}
9261
9263 SelectionDAG &DAG) const {
9264 assert(Node->getNumOperands() == 3 && "Not a double-shift!");
9265 EVT VT = Node->getValueType(0);
9266 unsigned VTBits = VT.getScalarSizeInBits();
9267 assert(isPowerOf2_32(VTBits) && "Power-of-two integer type expected");
9268
9269 bool IsSHL = Node->getOpcode() == ISD::SHL_PARTS;
9270 bool IsSRA = Node->getOpcode() == ISD::SRA_PARTS;
9271 SDValue ShOpLo = Node->getOperand(0);
9272 SDValue ShOpHi = Node->getOperand(1);
9273 SDValue ShAmt = Node->getOperand(2);
9274 EVT ShAmtVT = ShAmt.getValueType();
9275 EVT ShAmtCCVT =
9276 getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), ShAmtVT);
9277 SDLoc dl(Node);
9278
9279 // ISD::FSHL and ISD::FSHR have defined overflow behavior but ISD::SHL and
9280 // ISD::SRA/L nodes haven't. Insert an AND to be safe, it's usually optimized
9281 // away during isel.
9282 SDValue SafeShAmt = DAG.getNode(ISD::AND, dl, ShAmtVT, ShAmt,
9283 DAG.getConstant(VTBits - 1, dl, ShAmtVT));
9284 SDValue Tmp1 = IsSRA ? DAG.getNode(ISD::SRA, dl, VT, ShOpHi,
9285 DAG.getConstant(VTBits - 1, dl, ShAmtVT))
9286 : DAG.getConstant(0, dl, VT);
9287
9288 SDValue Tmp2, Tmp3;
9289 if (IsSHL) {
9290 Tmp2 = DAG.getNode(ISD::FSHL, dl, VT, ShOpHi, ShOpLo, ShAmt);
9291 Tmp3 = DAG.getNode(ISD::SHL, dl, VT, ShOpLo, SafeShAmt);
9292 } else {
9293 Tmp2 = DAG.getNode(ISD::FSHR, dl, VT, ShOpHi, ShOpLo, ShAmt);
9294 Tmp3 = DAG.getNode(IsSRA ? ISD::SRA : ISD::SRL, dl, VT, ShOpHi, SafeShAmt);
9295 }
9296
9297 // If the shift amount is larger or equal than the width of a part we don't
9298 // use the result from the FSHL/FSHR. Insert a test and select the appropriate
9299 // values for large shift amounts.
9300 SDValue AndNode = DAG.getNode(ISD::AND, dl, ShAmtVT, ShAmt,
9301 DAG.getConstant(VTBits, dl, ShAmtVT));
9302 SDValue Cond = DAG.getSetCC(dl, ShAmtCCVT, AndNode,
9303 DAG.getConstant(0, dl, ShAmtVT), ISD::SETNE);
9304
9305 if (IsSHL) {
9306 Hi = DAG.getNode(ISD::SELECT, dl, VT, Cond, Tmp3, Tmp2);
9307 Lo = DAG.getNode(ISD::SELECT, dl, VT, Cond, Tmp1, Tmp3);
9308 } else {
9309 Lo = DAG.getNode(ISD::SELECT, dl, VT, Cond, Tmp3, Tmp2);
9310 Hi = DAG.getNode(ISD::SELECT, dl, VT, Cond, Tmp1, Tmp3);
9311 }
9312}
9313
9315 SelectionDAG &DAG) const {
9316 // This implements llvm.canonicalize.f* by multiplication with 1.0, as
9317 // suggested in
9318 // https://llvm.org/docs/LangRef.html#llvm-canonicalize-intrinsic.
9319 // It uses strict_fp operations even outside a strict_fp context in order
9320 // to guarantee that the canonicalization is not optimized away by later
9321 // passes. The result chain introduced by that is intentionally ignored
9322 // since no ordering requirement is intended here.
9323 EVT VT = Node->getValueType(0);
9324 SDLoc DL(Node);
9325 SDNodeFlags Flags = Node->getFlags();
9326 Flags.setNoFPExcept(true);
9327 SDValue One = DAG.getConstantFP(1.0, DL, VT);
9328 SDValue Mul =
9329 DAG.getNode(ISD::STRICT_FMUL, DL, {VT, MVT::Other},
9330 {DAG.getEntryNode(), Node->getOperand(0), One}, Flags);
9331 return Mul;
9332}
9333
9335 SelectionDAG &DAG) const {
9336 // Expand conversion from a native IEEE float type to an arbitrary FP format
9337 // returning the result as an integer using bit manipulation.
9338 EVT ResVT = Node->getValueType(0);
9339 SDLoc dl(Node);
9340
9341 SDValue FloatVal = Node->getOperand(0);
9342 const uint64_t SemEnum = Node->getConstantOperandVal(1);
9343 const auto Sem = static_cast<APFloatBase::Semantics>(SemEnum);
9344 const auto RoundMode =
9345 static_cast<RoundingMode>(Node->getConstantOperandVal(2));
9346 const bool Saturate = Node->getConstantOperandVal(3) != 0;
9347
9348 // Supported destination formats.
9349 switch (Sem) {
9355 break;
9356 default:
9357 DAG.getContext()->emitError("CONVERT_TO_ARBITRARY_FP: not implemented "
9358 "destination format (semantics enum " +
9359 Twine(SemEnum) + ")");
9360 return SDValue();
9361 }
9362
9363 // Supported rounding modes.
9364 switch (RoundMode) {
9370 break;
9371 default:
9372 DAG.getContext()->emitError(
9373 "CONVERT_TO_ARBITRARY_FP: unsupported rounding mode (enum " +
9374 Twine(static_cast<int>(RoundMode)) + ")");
9375 return SDValue();
9376 }
9377
9378 // Destination format parameters.
9379 const fltSemantics &DstSem = APFloatBase::EnumToSemantics(Sem);
9380 const unsigned DstBits = APFloat::getSizeInBits(DstSem);
9381 const unsigned DstPrecision = APFloat::semanticsPrecision(DstSem);
9382 const unsigned DstMant = DstPrecision - 1;
9383 const unsigned DstExpBits = DstBits - DstMant - 1;
9384 const int DstBias = 1 - APFloat::semanticsMinExponent(DstSem);
9385 const unsigned DstExpMax = (1U << DstExpBits) - 1;
9386 const uint64_t DstMantMask = (DstMant > 0) ? ((1ULL << DstMant) - 1) : 0;
9387 const fltNonfiniteBehavior DstNFBehavior = DstSem.nonFiniteBehavior;
9388 const fltNanEncoding DstNanEnc = DstSem.nanEncoding;
9389
9390 // Compute the maximum normal exponent for the destination format.
9391 const unsigned DstExpMaxNormal =
9392 DstNFBehavior == fltNonfiniteBehavior::IEEE754 ? DstExpMax - 1
9393 : DstExpMax;
9394
9395 // For NanOnly formats the max exponent field for finite values
9396 // is DstExpMax, but the encoding with exp = DstExpMax and
9397 // mant = all-ones is NaN. So DstExpMaxNormal = DstExpMax, but max
9398 // mantissa at that exponent is DstMantMask - 1 (if NanEnc == AllOnes) to
9399 // avoid the NaN encoding.
9400 uint64_t DstMaxMantAtMaxExp = DstMantMask;
9401 if (DstNFBehavior == fltNonfiniteBehavior::NanOnly &&
9402 DstNanEnc == fltNanEncoding::AllOnes)
9403 DstMaxMantAtMaxExp = DstMantMask - 1;
9404
9405 // Source format parameters.
9406 EVT SrcVT = FloatVal.getValueType();
9407 const fltSemantics &SrcSem = SrcVT.getScalarType().getFltSemantics();
9408 const unsigned SrcBits = APFloat::getSizeInBits(SrcSem);
9409 const unsigned SrcPrecision = APFloat::semanticsPrecision(SrcSem);
9410 const unsigned SrcMant = SrcPrecision - 1;
9411 const uint64_t SrcMantMask = (1ULL << SrcMant) - 1;
9412
9413 // Work in the source integer type. Match the destination shape so the
9414 // expansion stays vector when ResVT is a vector.
9415 EVT IntScalarVT = EVT::getIntegerVT(*DAG.getContext(), SrcBits);
9416 EVT IntVT = ResVT.changeElementType(*DAG.getContext(), IntScalarVT);
9417 EVT SetCCVT =
9418 getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), IntVT);
9419 EVT FPSetCCVT =
9420 getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), SrcVT);
9421
9422 SDValue Zero = DAG.getConstant(0, dl, IntVT);
9423 SDValue One = DAG.getConstant(1, dl, IntVT);
9424
9425 // Bitcast source float to integer to extract the sign bit.
9426 SDValue Src = DAG.getNode(ISD::BITCAST, dl, IntVT, FloatVal);
9427 SDValue SignBit =
9428 DAG.getNode(ISD::SRL, dl, IntVT, Src,
9429 DAG.getShiftAmountConstant(SrcBits - 1, IntVT, dl));
9430
9431 // Classify the input.
9432 SDValue FPZero = DAG.getConstantFP(0.0, dl, SrcVT);
9433 SDValue FPInf = DAG.getConstantFP(APFloat::getInf(SrcSem), dl, SrcVT);
9434 SDValue AbsVal = DAG.getNode(ISD::FABS, dl, SrcVT, FloatVal);
9435 SDValue IsNaN = DAG.getSetCC(dl, FPSetCCVT, FloatVal, FPZero, ISD::SETUO);
9436 SDValue IsInf = DAG.getSetCC(dl, FPSetCCVT, AbsVal, FPInf, ISD::SETOEQ);
9437 SDValue IsZero = DAG.getSetCC(dl, FPSetCCVT, FloatVal, FPZero, ISD::SETOEQ);
9438
9439 // Split into a normalized fraction and unbiased exponent. FFREXP normalizes
9440 // source denormals automatically. The result is unspecified for Inf/NaN, but
9441 // those inputs are detected above and override the final result.
9442 EVT FrexpExpScalarVT =
9444 EVT FrexpExpVT = SrcVT.changeElementType(*DAG.getContext(), FrexpExpScalarVT);
9445 SDValue Frexp =
9446 DAG.getNode(ISD::FFREXP, dl, DAG.getVTList(SrcVT, FrexpExpVT), FloatVal);
9447 SDValue FrexpFrac = Frexp.getValue(0);
9448 SDValue FrexpExp = Frexp.getValue(1);
9449
9450 SDValue FrexpFracInt = DAG.getNode(ISD::BITCAST, dl, IntVT, FrexpFrac);
9451 SDValue EffSrcMant = DAG.getNode(ISD::AND, dl, IntVT, FrexpFracInt,
9452 DAG.getConstant(SrcMantMask, dl, IntVT));
9453
9454 SDValue FrexpExpExt = DAG.getSExtOrTrunc(FrexpExp, dl, IntVT);
9455 SDValue NewExp = DAG.getNode(ISD::ADD, dl, IntVT, FrexpExpExt,
9456 DAG.getConstant(DstBias - 1, dl, IntVT));
9457
9458 // Compute rounding increment given the round bit, sticky bits, and LSB
9459 // of the truncated mantissa.
9460 auto ComputeRoundUp = [&](SDValue RoundBit, SDValue StickyBits,
9461 SDValue LSB) -> SDValue {
9462 switch (RoundMode) {
9464 // Round up if round_bit && (sticky || lsb)
9465 SDValue StickyOrLSB = DAG.getNode(ISD::OR, dl, IntVT, StickyBits, LSB);
9466 return DAG.getNode(ISD::AND, dl, IntVT, RoundBit, StickyOrLSB);
9467 }
9469 return Zero;
9471 // Round up if positive and any truncated bits are set.
9472 SDValue AnyTruncBits =
9473 DAG.getNode(ISD::OR, dl, IntVT, RoundBit, StickyBits);
9474 SDValue HasTruncBits =
9475 DAG.getSetCC(dl, SetCCVT, AnyTruncBits, Zero, ISD::SETNE);
9476 SDValue IsPositive = DAG.getSetCC(dl, SetCCVT, SignBit, Zero, ISD::SETEQ);
9477 SDValue DoRound =
9478 DAG.getNode(ISD::AND, dl, SetCCVT, HasTruncBits, IsPositive);
9479 return DAG.getNode(ISD::ZERO_EXTEND, dl, IntVT, DoRound);
9480 }
9482 // Round up if negative and any truncated bits are set (to -Inf).
9483 SDValue AnyTruncBits =
9484 DAG.getNode(ISD::OR, dl, IntVT, RoundBit, StickyBits);
9485 SDValue HasTruncBits =
9486 DAG.getSetCC(dl, SetCCVT, AnyTruncBits, Zero, ISD::SETNE);
9487 SDValue IsNegative = DAG.getSetCC(dl, SetCCVT, SignBit, Zero, ISD::SETNE);
9488 SDValue DoRound =
9489 DAG.getNode(ISD::AND, dl, SetCCVT, HasTruncBits, IsNegative);
9490 return DAG.getNode(ISD::ZERO_EXTEND, dl, IntVT, DoRound);
9491 }
9493 return RoundBit;
9494 default:
9495 llvm_unreachable("unsupported rounding mode");
9496 }
9497 };
9498
9499 // Round mantissa from SrcMant bits to DstMant bits.
9500 SDValue TruncMant;
9501 SDValue RoundUp;
9502 if (SrcMant > DstMant) {
9503 const unsigned Shift = SrcMant - DstMant;
9504 SDValue ShiftConst = DAG.getShiftAmountConstant(Shift, IntVT, dl);
9505 TruncMant = DAG.getNode(ISD::SRL, dl, IntVT, EffSrcMant, ShiftConst);
9506
9507 // Check bit at position Shift - 1 aka the round bit.
9508 SDValue RoundBit;
9509 if (Shift >= 1) {
9510 SDValue RoundBitShift = DAG.getShiftAmountConstant(Shift - 1, IntVT, dl);
9511 SDValue ShiftedMant =
9512 DAG.getNode(ISD::SRL, dl, IntVT, EffSrcMant, RoundBitShift);
9513 RoundBit = DAG.getNode(ISD::AND, dl, IntVT, ShiftedMant, One);
9514 } else {
9515 RoundBit = Zero;
9516 }
9517
9518 // OR of all bits below the round bit to get sticky bits.
9519 SDValue StickyBits;
9520 if (Shift >= 2) {
9521 uint64_t StickyMask = maskTrailingOnes<uint64_t>(Shift - 1);
9522 StickyBits = DAG.getNode(ISD::AND, dl, IntVT, EffSrcMant,
9523 DAG.getConstant(StickyMask, dl, IntVT));
9524 StickyBits = DAG.getSetCC(dl, SetCCVT, StickyBits, Zero, ISD::SETNE);
9525 StickyBits = DAG.getNode(ISD::ZERO_EXTEND, dl, IntVT, StickyBits);
9526 } else {
9527 StickyBits = Zero;
9528 }
9529
9530 // LSB of truncated mantissa.
9531 SDValue LSB = DAG.getNode(ISD::AND, dl, IntVT, TruncMant, One);
9532
9533 RoundUp = ComputeRoundUp(RoundBit, StickyBits, LSB);
9534 } else {
9535 // If DstMant >= SrcMant, then no rounding needed, just shift left.
9536 SDValue MantShift =
9537 DAG.getShiftAmountConstant(DstMant - SrcMant, IntVT, dl);
9538 TruncMant = DAG.getNode(ISD::SHL, dl, IntVT, EffSrcMant, MantShift);
9539 RoundUp = Zero;
9540 }
9541
9542 // Apply rounding.
9543 SDValue RoundedMant = DAG.getNode(ISD::ADD, dl, IntVT, TruncMant, RoundUp);
9544
9545 // Handle mantissa overflow from rounding.
9546 // If rounded_mant > DstMantMask, carry into exponent.
9547 SDValue MantOverflow =
9548 DAG.getSetCC(dl, SetCCVT, RoundedMant,
9549 DAG.getConstant(DstMantMask, dl, IntVT), ISD::SETGT);
9550 // On overflow: mant = 0, exp += 1.
9551 SDValue AdjMant = DAG.getSelect(dl, IntVT, MantOverflow, Zero, RoundedMant);
9552 SDValue AdjExp =
9553 DAG.getNode(ISD::ADD, dl, IntVT, NewExp,
9554 DAG.getNode(ISD::ZERO_EXTEND, dl, IntVT, MantOverflow));
9555
9556 // Precompute sign shifted to MSB of destination.
9557 SDValue SignShifted =
9558 DAG.getNode(ISD::SHL, dl, IntVT, SignBit,
9559 DAG.getShiftAmountConstant(DstBits - 1, IntVT, dl));
9560
9561 // Destination denormal conversion (when new_exp <= 0).
9562 // Shift the mantissa right by 1 - new_exp additional bits and set the
9563 // exponent field to 0.
9564 SDValue ExpIsNeg = DAG.getSetCC(dl, SetCCVT, AdjExp,
9565 DAG.getConstant(1, dl, IntVT), ISD::SETLT);
9566
9567 SDValue DenormResult;
9568 {
9569 // denorm_shift = 1 - NewExp.
9570 SDValue DenormShift = DAG.getNode(ISD::SUB, dl, IntVT, One, NewExp);
9571
9572 // full_src_mant = (1 << SrcMant) | EffSrcMant.
9573 SDValue ImplicitOne =
9574 DAG.getNode(ISD::SHL, dl, IntVT, One,
9575 DAG.getShiftAmountConstant(SrcMant, IntVT, dl));
9576 SDValue FullSrcMant =
9577 DAG.getNode(ISD::OR, dl, IntVT, EffSrcMant, ImplicitOne);
9578
9579 // Total right shift = DenormShift + (SrcMant - DstMant).
9580 int64_t MantDelta = static_cast<int64_t>(SrcMant) - DstMant;
9581 SDValue TotalShift =
9582 DAG.getNode(ISD::ADD, dl, IntVT, DenormShift,
9583 DAG.getSignedConstant(MantDelta, dl, IntVT));
9584
9585 // Clamp total shift to avoid UB, then truncate denorm mantissa.
9586 EVT ShiftVT = getShiftAmountTy(IntVT, DAG.getDataLayout());
9587 SDValue MaxShift = DAG.getConstant(SrcBits - 1, dl, IntVT);
9588 SDValue ClampedShift =
9589 DAG.getNode(ISD::UMIN, dl, IntVT, TotalShift, MaxShift);
9590 SDValue DenormTruncMant =
9591 DAG.getNode(ISD::SRL, dl, IntVT, FullSrcMant,
9592 DAG.getZExtOrTrunc(ClampedShift, dl, ShiftVT));
9593
9594 // Rounding for denorm path.
9595 SDValue DenormRoundUp;
9596 {
9597 // Round bit is at position TotalShift - 1 of FullSrcMant.
9598 // Clamp to at least 1 so the subtraction doesn't underflow and create
9599 // shift nodes with invalid shift amounts.
9600 SDValue SafeShift = DAG.getNode(ISD::UMAX, dl, IntVT, ClampedShift, One);
9601 SDValue RoundBitPos = DAG.getNode(ISD::SUB, dl, IntVT, SafeShift, One);
9602 SDValue RoundBitPosAmt = DAG.getZExtOrTrunc(RoundBitPos, dl, ShiftVT);
9603 SDValue DenormRoundBit = DAG.getNode(
9604 ISD::AND, dl, IntVT,
9605 DAG.getNode(ISD::SRL, dl, IntVT, FullSrcMant, RoundBitPosAmt), One);
9606
9607 // Sticky: all bits below round bit.
9608 // sticky_mask = (1 << RoundBitPos) - 1
9609 SDValue StickyMask = DAG.getNode(
9610 ISD::SUB, dl, IntVT,
9611 DAG.getNode(ISD::SHL, dl, IntVT, One, RoundBitPosAmt), One);
9612 SDValue DenormStickyBits =
9613 DAG.getNode(ISD::AND, dl, IntVT, FullSrcMant, StickyMask);
9614 SDValue HasSticky = DAG.getNode(
9615 ISD::ZERO_EXTEND, dl, IntVT,
9616 DAG.getSetCC(dl, SetCCVT, DenormStickyBits, Zero, ISD::SETNE));
9617
9618 SDValue DenormLSB =
9619 DAG.getNode(ISD::AND, dl, IntVT, DenormTruncMant, One);
9620
9621 DenormRoundUp = ComputeRoundUp(DenormRoundBit, HasSticky, DenormLSB);
9622
9623 // Only apply rounding if TotalShift >= 1 (i.e., there are bits to round).
9624 SDValue ShiftGEOne =
9625 DAG.getSetCC(dl, SetCCVT, ClampedShift, One, ISD::SETUGE);
9626 DenormRoundUp = DAG.getSelect(dl, IntVT, ShiftGEOne, DenormRoundUp, Zero);
9627 }
9628
9629 SDValue DenormRoundedMant =
9630 DAG.getNode(ISD::ADD, dl, IntVT, DenormTruncMant, DenormRoundUp);
9631
9632 // If rounding caused overflow into the normal range, then we get the
9633 // smallest normal number.
9634 SDValue DenormMantOF =
9635 DAG.getSetCC(dl, SetCCVT, DenormRoundedMant,
9636 DAG.getConstant(DstMantMask, dl, IntVT), ISD::SETGT);
9637 SDValue DenormFinalMant =
9638 DAG.getSelect(dl, IntVT, DenormMantOF, Zero, DenormRoundedMant);
9639 SDValue DenormFinalExp = DAG.getSelect(dl, IntVT, DenormMantOF, One, Zero);
9640
9641 // Assemble: sign | (exp << DstMant) | mant
9642 SDValue DenormExpShifted =
9643 DAG.getNode(ISD::SHL, dl, IntVT, DenormFinalExp,
9644 DAG.getShiftAmountConstant(DstMant, IntVT, dl));
9645 DenormResult = DAG.getNode(
9646 ISD::OR, dl, IntVT,
9647 DAG.getNode(ISD::OR, dl, IntVT, SignShifted, DenormExpShifted),
9648 DenormFinalMant);
9649 }
9650
9651 // Exponent overflow detection.
9652 SDValue ExpOF =
9653 DAG.getSetCC(dl, SetCCVT, AdjExp,
9654 DAG.getConstant(DstExpMaxNormal, dl, IntVT), ISD::SETGT);
9655
9656 // Also check if AdjExp == DstExpMaxNormal and mantissa overflow into
9657 // a value that exceeds the max allowed mantissa at that exponent.
9658 SDValue ExpAtMax =
9659 DAG.getSetCC(dl, SetCCVT, AdjExp,
9660 DAG.getConstant(DstExpMaxNormal, dl, IntVT), ISD::SETEQ);
9661 SDValue MantExceedsMax =
9662 DAG.getSetCC(dl, SetCCVT, AdjMant,
9663 DAG.getConstant(DstMaxMantAtMaxExp, dl, IntVT), ISD::SETGT);
9664 SDValue ExpMantOF =
9665 DAG.getNode(ISD::AND, dl, SetCCVT, ExpAtMax, MantExceedsMax);
9666 SDValue IsOverflow = DAG.getNode(ISD::OR, dl, SetCCVT, ExpOF, ExpMantOF);
9667
9668 // Build overflow result.
9670
9671 if (Saturate) {
9672 // Clamp to max finite value:
9673 // sign | (DstExpMaxNormal << DstMant) | DstMaxMantAtMaxExp
9674 uint64_t MaxFinite =
9675 ((uint64_t)DstExpMaxNormal << DstMant) | DstMaxMantAtMaxExp;
9676 OverflowResult = DAG.getNode(ISD::OR, dl, IntVT, SignShifted,
9677 DAG.getConstant(MaxFinite, dl, IntVT));
9678 } else if (DstNFBehavior == fltNonfiniteBehavior::IEEE754) {
9679 // Produce infinity.
9680 uint64_t InfBits = (uint64_t)DstExpMax << DstMant;
9681 OverflowResult = DAG.getNode(ISD::OR, dl, IntVT, SignShifted,
9682 DAG.getConstant(InfBits, dl, IntVT));
9683 } else {
9684 // Emit poison if no Inf in format and not saturating.
9685 OverflowResult = DAG.getPOISON(IntVT);
9686 }
9687
9688 // Assemble normal result: sign | (AdjExp << DstMant) | AdjMant
9689 SDValue NormExpShifted =
9690 DAG.getNode(ISD::SHL, dl, IntVT, AdjExp,
9691 DAG.getShiftAmountConstant(DstMant, IntVT, dl));
9692 SDValue NormResult = DAG.getNode(
9693 ISD::OR, dl, IntVT,
9694 DAG.getNode(ISD::OR, dl, IntVT, SignShifted, NormExpShifted), AdjMant);
9695
9696 // Build special-value results.
9697 SDValue NaNResult;
9698 if (DstNFBehavior == fltNonfiniteBehavior::IEEE754) {
9699 // Produce canonical NaN.
9700 const uint64_t QNaNBit = (DstMant > 0) ? (1ULL << (DstMant - 1)) : 0;
9701 NaNResult =
9702 DAG.getConstant(((uint64_t)DstExpMax << DstMant) | QNaNBit, dl, IntVT);
9703 } else if (DstNFBehavior == fltNonfiniteBehavior::NanOnly &&
9704 DstNanEnc == fltNanEncoding::AllOnes) {
9705 // E4M3FN-style: NaN is exp=all-ones, mant=all-ones.
9706 NaNResult = DAG.getConstant(((uint64_t)DstExpMax << DstMant) | DstMantMask,
9707 dl, IntVT);
9708 } else {
9709 // NaN -> poison for finite only values.
9710 NaNResult = DAG.getPOISON(IntVT);
9711 }
9712
9713 // Inf handling.
9714 SDValue InfResult;
9715 if (DstNFBehavior == fltNonfiniteBehavior::IEEE754) {
9716 // Produce signed infinity.
9717 uint64_t InfBits = (uint64_t)DstExpMax << DstMant;
9718 InfResult = DAG.getNode(ISD::OR, dl, IntVT, SignShifted,
9719 DAG.getConstant(InfBits, dl, IntVT));
9720 } else if (Saturate) {
9721 // Inf saturates to max finite.
9722 uint64_t MaxFinite =
9723 ((uint64_t)DstExpMaxNormal << DstMant) | DstMaxMantAtMaxExp;
9724 InfResult = DAG.getNode(ISD::OR, dl, IntVT, SignShifted,
9725 DAG.getConstant(MaxFinite, dl, IntVT));
9726 } else {
9727 // No Inf and not saturating -> poison.
9728 InfResult = DAG.getPOISON(IntVT);
9729 }
9730
9731 SDValue ZeroResult = SignShifted;
9732
9733 // Final selection in an order: NaN takes priority, then Inf, then Zero.
9734 SDValue FiniteResult =
9735 DAG.getSelect(dl, IntVT, ExpIsNeg, DenormResult, NormResult);
9736 FiniteResult =
9737 DAG.getSelect(dl, IntVT, IsOverflow, OverflowResult, FiniteResult);
9738
9739 SDValue Result = FiniteResult;
9740 Result = DAG.getSelect(dl, IntVT, IsZero, ZeroResult, Result);
9741 Result = DAG.getSelect(dl, IntVT, IsInf, InfResult, Result);
9742 Result = DAG.getSelect(dl, IntVT, IsNaN, NaNResult, Result);
9743
9744 // Truncate to destination integer type.
9745 return DAG.getZExtOrTrunc(Result, dl, ResVT);
9746}
9747
9748SDValue
9750 SelectionDAG &DAG) const {
9751 SDLoc dl(Node);
9752 EVT DstVT = Node->getValueType(0);
9753 EVT DstScalarVT = DstVT.getScalarType();
9754
9755 SDValue IntVal = Node->getOperand(0);
9756 const uint64_t SemEnum = Node->getConstantOperandVal(1);
9757 const auto Sem = static_cast<APFloatBase::Semantics>(SemEnum);
9758
9759 // Supported source formats.
9760 switch (Sem) {
9766 break;
9767 default:
9768 DAG.getContext()->emitError("CONVERT_FROM_ARBITRARY_FP: not implemented "
9769 "source format (semantics enum " +
9770 Twine(SemEnum) + ")");
9771 return SDValue();
9772 }
9773
9774 const fltSemantics &SrcSem = APFloatBase::EnumToSemantics(Sem);
9775 const unsigned SrcBits = APFloat::getSizeInBits(SrcSem);
9776 const unsigned SrcPrecision = APFloat::semanticsPrecision(SrcSem);
9777 const unsigned SrcMant = SrcPrecision - 1;
9778 const unsigned SrcExp = SrcBits - SrcMant - 1;
9779 const int SrcBias = 1 - APFloat::semanticsMinExponent(SrcSem);
9780 const fltNonfiniteBehavior NFBehavior = SrcSem.nonFiniteBehavior;
9781
9782 // Destination format parameters.
9783 const fltSemantics &DstSem = DstScalarVT.getFltSemantics();
9784 const unsigned DstBits = APFloat::getSizeInBits(DstSem);
9785 const unsigned DstMant = APFloat::semanticsPrecision(DstSem) - 1;
9786 const unsigned DstExpBits = DstBits - DstMant - 1;
9787 const int DstMinExp = APFloat::semanticsMinExponent(DstSem);
9788 const int DstBias = 1 - DstMinExp;
9789 const uint64_t DstExpAllOnes = (1ULL << DstExpBits) - 1;
9790
9791 // Work in an integer type matching the destination float width.
9792 EVT IntScalarVT = EVT::getIntegerVT(*DAG.getContext(), DstBits);
9793 EVT IntVT = DstVT.isVector()
9794 ? EVT::getVectorVT(*DAG.getContext(), IntScalarVT,
9795 DstVT.getVectorElementCount())
9796 : IntScalarVT;
9797
9798 SDValue Src = DAG.getZExtOrTrunc(IntVal, dl, IntVT);
9799
9800 EVT SetCCVT =
9801 getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), IntVT);
9802
9803 SDValue Zero = DAG.getConstant(0, dl, IntVT);
9804 SDValue One = DAG.getConstant(1, dl, IntVT);
9805
9806 // Extract bit fields.
9807 const uint64_t MantMask = (SrcMant > 0) ? ((1ULL << SrcMant) - 1) : 0;
9808 const uint64_t ExpMask = (1ULL << SrcExp) - 1;
9809
9810 SDValue MantField = DAG.getNode(ISD::AND, dl, IntVT, Src,
9811 DAG.getConstant(MantMask, dl, IntVT));
9812
9813 SDValue ExpField =
9814 DAG.getNode(ISD::AND, dl, IntVT,
9815 DAG.getNode(ISD::SRL, dl, IntVT, Src,
9816 DAG.getShiftAmountConstant(SrcMant, IntVT, dl)),
9817 DAG.getConstant(ExpMask, dl, IntVT));
9818
9819 SDValue SignBit =
9820 DAG.getNode(ISD::SRL, dl, IntVT, Src,
9821 DAG.getShiftAmountConstant(SrcBits - 1, IntVT, dl));
9822
9823 SDValue SignShifted =
9824 DAG.getNode(ISD::SHL, dl, IntVT, SignBit,
9825 DAG.getShiftAmountConstant(DstBits - 1, IntVT, dl));
9826
9827 // Classify the input.
9828 SDValue ExpAllOnes = DAG.getConstant(ExpMask, dl, IntVT);
9829 SDValue IsExpAllOnes =
9830 DAG.getSetCC(dl, SetCCVT, ExpField, ExpAllOnes, ISD::SETEQ);
9831 SDValue IsExpZero = DAG.getSetCC(dl, SetCCVT, ExpField, Zero, ISD::SETEQ);
9832 SDValue IsMantZero = DAG.getSetCC(dl, SetCCVT, MantField, Zero, ISD::SETEQ);
9833 SDValue IsMantNonZero =
9834 DAG.getSetCC(dl, SetCCVT, MantField, Zero, ISD::SETNE);
9835
9836 SDValue IsNaN;
9837 if (NFBehavior == fltNonfiniteBehavior::FiniteOnly) {
9838 IsNaN = DAG.getBoolConstant(false, dl, SetCCVT, IntVT);
9839 } else if (NFBehavior == fltNonfiniteBehavior::IEEE754) {
9840 IsNaN = DAG.getNode(ISD::AND, dl, SetCCVT, IsExpAllOnes, IsMantNonZero);
9841 } else {
9843 SDValue MantAllOnes = DAG.getConstant(MantMask, dl, IntVT);
9844 SDValue IsMantAllOnes =
9845 DAG.getSetCC(dl, SetCCVT, MantField, MantAllOnes, ISD::SETEQ);
9846 IsNaN = DAG.getNode(ISD::AND, dl, SetCCVT, IsExpAllOnes, IsMantAllOnes);
9847 }
9848
9849 SDValue IsInf;
9850 if (NFBehavior == fltNonfiniteBehavior::IEEE754)
9851 IsInf = DAG.getNode(ISD::AND, dl, SetCCVT, IsExpAllOnes, IsMantZero);
9852 else
9853 IsInf = DAG.getBoolConstant(false, dl, SetCCVT, IntVT);
9854
9855 SDValue IsZero = DAG.getNode(ISD::AND, dl, SetCCVT, IsExpZero, IsMantZero);
9856 SDValue IsDenorm =
9857 DAG.getNode(ISD::AND, dl, SetCCVT, IsExpZero, IsMantNonZero);
9858
9859 // Normal value conversion.
9860 const int BiasAdjust = DstBias - SrcBias;
9861 SDValue NormDstExp =
9862 DAG.getNode(ISD::ADD, dl, IntVT, ExpField,
9863 DAG.getConstant(APInt(DstBits, BiasAdjust, true), dl, IntVT));
9864
9865 SDValue NormDstMant;
9866 if (DstMant > SrcMant) {
9867 SDValue NormDstMantShift =
9868 DAG.getShiftAmountConstant(DstMant - SrcMant, IntVT, dl);
9869 NormDstMant = DAG.getNode(ISD::SHL, dl, IntVT, MantField, NormDstMantShift);
9870 } else {
9871 NormDstMant = MantField;
9872 }
9873
9874 SDValue DstMantShift = DAG.getShiftAmountConstant(DstMant, IntVT, dl);
9875 SDValue NormExpShifted =
9876 DAG.getNode(ISD::SHL, dl, IntVT, NormDstExp, DstMantShift);
9877 SDValue NormResult =
9878 DAG.getNode(ISD::OR, dl, IntVT,
9879 DAG.getNode(ISD::OR, dl, IntVT, SignShifted, NormExpShifted),
9880 NormDstMant);
9881
9882 // Denormal value conversion.
9883 SDValue DenormResult;
9884 {
9885 const unsigned IntVTBits = DstBits;
9886 SDValue LeadingZeros =
9887 DAG.getNode(ISD::CTLZ_ZERO_POISON, dl, IntVT, MantField);
9888
9889 const int DenormExpConst =
9890 (int)IntVTBits + DstBias - SrcBias - (int)SrcMant;
9891 SDValue DenormDstExp = DAG.getNode(
9892 ISD::SUB, dl, IntVT,
9893 DAG.getConstant(APInt(DstBits, DenormExpConst, true), dl, IntVT),
9894 LeadingZeros);
9895
9896 SDValue MantMSB =
9897 DAG.getNode(ISD::SUB, dl, IntVT,
9898 DAG.getConstant(IntVTBits - 1, dl, IntVT), LeadingZeros);
9899
9900 SDValue LeadingOne = DAG.getNode(ISD::SHL, dl, IntVT, One, MantMSB);
9901 SDValue Frac = DAG.getNode(ISD::XOR, dl, IntVT, MantField, LeadingOne);
9902
9903 const unsigned ShiftSub = IntVTBits - 1 - DstMant;
9904 SDValue ShiftAmount = DAG.getNode(ISD::SUB, dl, IntVT, LeadingZeros,
9905 DAG.getConstant(ShiftSub, dl, IntVT));
9906
9907 SDValue DenormDstMant = DAG.getNode(ISD::SHL, dl, IntVT, Frac, ShiftAmount);
9908
9909 SDValue DenormExpShifted =
9910 DAG.getNode(ISD::SHL, dl, IntVT, DenormDstExp, DstMantShift);
9911 DenormResult = DAG.getNode(
9912 ISD::OR, dl, IntVT,
9913 DAG.getNode(ISD::OR, dl, IntVT, SignShifted, DenormExpShifted),
9914 DenormDstMant);
9915 }
9916
9917 SDValue FiniteResult =
9918 DAG.getSelect(dl, IntVT, IsDenorm, DenormResult, NormResult);
9919
9920 const uint64_t QNaNBit = (DstMant > 0) ? (1ULL << (DstMant - 1)) : 0;
9921 SDValue NaNResult =
9922 DAG.getConstant((DstExpAllOnes << DstMant) | QNaNBit, dl, IntVT);
9923
9924 SDValue InfResult =
9925 DAG.getNode(ISD::OR, dl, IntVT, SignShifted,
9926 DAG.getConstant(DstExpAllOnes << DstMant, dl, IntVT));
9927
9928 SDValue ZeroResult = SignShifted;
9929
9930 SDValue Result = FiniteResult;
9931 Result = DAG.getSelect(dl, IntVT, IsZero, ZeroResult, Result);
9932 Result = DAG.getSelect(dl, IntVT, IsInf, InfResult, Result);
9933 Result = DAG.getSelect(dl, IntVT, IsNaN, NaNResult, Result);
9934
9935 return DAG.getNode(ISD::BITCAST, dl, DstVT, Result);
9936}
9937
9939 SelectionDAG &DAG) const {
9940 unsigned OpNo = Node->isStrictFPOpcode() ? 1 : 0;
9941 SDValue Src = Node->getOperand(OpNo);
9942 EVT SrcVT = Src.getValueType();
9943 EVT DstVT = Node->getValueType(0);
9944 SDLoc dl(SDValue(Node, 0));
9945
9946 // FIXME: Only f32 to i64 conversions are supported.
9947 if (SrcVT != MVT::f32 || DstVT != MVT::i64)
9948 return false;
9949
9950 if (Node->isStrictFPOpcode())
9951 // When a NaN is converted to an integer a trap is allowed. We can't
9952 // use this expansion here because it would eliminate that trap. Other
9953 // traps are also allowed and cannot be eliminated. See
9954 // IEEE 754-2008 sec 5.8.
9955 return false;
9956
9957 // Expand f32 -> i64 conversion
9958 // This algorithm comes from compiler-rt's implementation of fixsfdi:
9959 // https://github.com/llvm/llvm-project/blob/main/compiler-rt/lib/builtins/fixsfdi.c
9960 unsigned SrcEltBits = SrcVT.getScalarSizeInBits();
9961 EVT IntVT = SrcVT.changeTypeToInteger();
9962 EVT IntShVT = getShiftAmountTy(IntVT, DAG.getDataLayout());
9963
9964 SDValue ExponentMask = DAG.getConstant(0x7F800000, dl, IntVT);
9965 SDValue ExponentLoBit = DAG.getConstant(23, dl, IntVT);
9966 SDValue Bias = DAG.getConstant(127, dl, IntVT);
9967 SDValue SignMask = DAG.getConstant(APInt::getSignMask(SrcEltBits), dl, IntVT);
9968 SDValue SignLowBit = DAG.getConstant(SrcEltBits - 1, dl, IntVT);
9969 SDValue MantissaMask = DAG.getConstant(0x007FFFFF, dl, IntVT);
9970
9971 SDValue Bits = DAG.getNode(ISD::BITCAST, dl, IntVT, Src);
9972
9973 SDValue ExponentBits = DAG.getNode(
9974 ISD::SRL, dl, IntVT, DAG.getNode(ISD::AND, dl, IntVT, Bits, ExponentMask),
9975 DAG.getZExtOrTrunc(ExponentLoBit, dl, IntShVT));
9976 SDValue Exponent = DAG.getNode(ISD::SUB, dl, IntVT, ExponentBits, Bias);
9977
9978 SDValue Sign = DAG.getNode(ISD::SRA, dl, IntVT,
9979 DAG.getNode(ISD::AND, dl, IntVT, Bits, SignMask),
9980 DAG.getZExtOrTrunc(SignLowBit, dl, IntShVT));
9981 Sign = DAG.getSExtOrTrunc(Sign, dl, DstVT);
9982
9983 SDValue R = DAG.getNode(ISD::OR, dl, IntVT,
9984 DAG.getNode(ISD::AND, dl, IntVT, Bits, MantissaMask),
9985 DAG.getConstant(0x00800000, dl, IntVT));
9986
9987 R = DAG.getZExtOrTrunc(R, dl, DstVT);
9988
9989 R = DAG.getSelectCC(
9990 dl, Exponent, ExponentLoBit,
9991 DAG.getNode(ISD::SHL, dl, DstVT, R,
9992 DAG.getZExtOrTrunc(
9993 DAG.getNode(ISD::SUB, dl, IntVT, Exponent, ExponentLoBit),
9994 dl, IntShVT)),
9995 DAG.getNode(ISD::SRL, dl, DstVT, R,
9996 DAG.getZExtOrTrunc(
9997 DAG.getNode(ISD::SUB, dl, IntVT, ExponentLoBit, Exponent),
9998 dl, IntShVT)),
9999 ISD::SETGT);
10000
10001 SDValue Ret = DAG.getNode(ISD::SUB, dl, DstVT,
10002 DAG.getNode(ISD::XOR, dl, DstVT, R, Sign), Sign);
10003
10004 Result = DAG.getSelectCC(dl, Exponent, DAG.getConstant(0, dl, IntVT),
10005 DAG.getConstant(0, dl, DstVT), Ret, ISD::SETLT);
10006 return true;
10007}
10008
10010 SDValue &Chain,
10011 SelectionDAG &DAG) const {
10012 SDLoc dl(SDValue(Node, 0));
10013 unsigned OpNo = Node->isStrictFPOpcode() ? 1 : 0;
10014 SDValue Src = Node->getOperand(OpNo);
10015
10016 EVT SrcVT = Src.getValueType();
10017 EVT DstVT = Node->getValueType(0);
10018 EVT SetCCVT =
10019 getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), SrcVT);
10020 EVT DstSetCCVT =
10021 getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), DstVT);
10022
10023 // Only expand vector types if we have the appropriate vector bit operations.
10024 unsigned SIntOpcode = Node->isStrictFPOpcode() ? ISD::STRICT_FP_TO_SINT :
10026 if (DstVT.isVector() && (!isOperationLegalOrCustom(SIntOpcode, DstVT) ||
10028 return false;
10029
10030 // If the maximum float value is smaller then the signed integer range,
10031 // the destination signmask can't be represented by the float, so we can
10032 // just use FP_TO_SINT directly.
10033 const fltSemantics &APFSem = SrcVT.getFltSemantics();
10034 APFloat APF(APFSem, APInt::getZero(SrcVT.getScalarSizeInBits()));
10035 APInt SignMask = APInt::getSignMask(DstVT.getScalarSizeInBits());
10037 APF.convertFromAPInt(SignMask, false, APFloat::rmNearestTiesToEven)) {
10038 if (Node->isStrictFPOpcode()) {
10039 Result = DAG.getNode(ISD::STRICT_FP_TO_SINT, dl, { DstVT, MVT::Other },
10040 { Node->getOperand(0), Src });
10041 Chain = Result.getValue(1);
10042 } else
10043 Result = DAG.getNode(ISD::FP_TO_SINT, dl, DstVT, Src);
10044 return true;
10045 }
10046
10047 // Don't expand it if there isn't cheap fsub instruction.
10049 Node->isStrictFPOpcode() ? ISD::STRICT_FSUB : ISD::FSUB, SrcVT))
10050 return false;
10051
10052 SDValue Cst = DAG.getConstantFP(APF, dl, SrcVT);
10053 SDValue Sel;
10054
10055 if (Node->isStrictFPOpcode()) {
10056 Sel = DAG.getSetCC(dl, SetCCVT, Src, Cst, ISD::SETLT,
10057 Node->getOperand(0), /*IsSignaling*/ true);
10058 Chain = Sel.getValue(1);
10059 } else {
10060 Sel = DAG.getSetCC(dl, SetCCVT, Src, Cst, ISD::SETLT);
10061 }
10062
10063 bool Strict = Node->isStrictFPOpcode() ||
10064 shouldUseStrictFP_TO_INT(SrcVT, DstVT, /*IsSigned*/ false);
10065
10066 if (Strict) {
10067 // Expand based on maximum range of FP_TO_SINT, if the value exceeds the
10068 // signmask then offset (the result of which should be fully representable).
10069 // Sel = Src < 0x8000000000000000
10070 // FltOfs = select Sel, 0, 0x8000000000000000
10071 // IntOfs = select Sel, 0, 0x8000000000000000
10072 // Result = fp_to_sint(Src - FltOfs) ^ IntOfs
10073
10074 // TODO: Should any fast-math-flags be set for the FSUB?
10075 SDValue FltOfs = DAG.getSelect(dl, SrcVT, Sel,
10076 DAG.getConstantFP(0.0, dl, SrcVT), Cst);
10077 Sel = DAG.getBoolExtOrTrunc(Sel, dl, DstSetCCVT, DstVT);
10078 SDValue IntOfs = DAG.getSelect(dl, DstVT, Sel,
10079 DAG.getConstant(0, dl, DstVT),
10080 DAG.getConstant(SignMask, dl, DstVT));
10081 SDValue SInt;
10082 if (Node->isStrictFPOpcode()) {
10083 SDValue Val = DAG.getNode(ISD::STRICT_FSUB, dl, { SrcVT, MVT::Other },
10084 { Chain, Src, FltOfs });
10085 SInt = DAG.getNode(ISD::STRICT_FP_TO_SINT, dl, { DstVT, MVT::Other },
10086 { Val.getValue(1), Val });
10087 Chain = SInt.getValue(1);
10088 } else {
10089 SDValue Val = DAG.getNode(ISD::FSUB, dl, SrcVT, Src, FltOfs);
10090 SInt = DAG.getNode(ISD::FP_TO_SINT, dl, DstVT, Val);
10091 }
10092 Result = DAG.getNode(ISD::XOR, dl, DstVT, SInt, IntOfs);
10093 } else {
10094 // Expand based on maximum range of FP_TO_SINT:
10095 // True = fp_to_sint(Src)
10096 // False = 0x8000000000000000 + fp_to_sint(Src - 0x8000000000000000)
10097 // Result = select (Src < 0x8000000000000000), True, False
10098
10099 SDValue True = DAG.getNode(ISD::FP_TO_SINT, dl, DstVT, Src);
10100 // TODO: Should any fast-math-flags be set for the FSUB?
10101 SDValue False = DAG.getNode(ISD::FP_TO_SINT, dl, DstVT,
10102 DAG.getNode(ISD::FSUB, dl, SrcVT, Src, Cst));
10103 False = DAG.getNode(ISD::XOR, dl, DstVT, False,
10104 DAG.getConstant(SignMask, dl, DstVT));
10105 Sel = DAG.getBoolExtOrTrunc(Sel, dl, DstSetCCVT, DstVT);
10106 Result = DAG.getSelect(dl, DstVT, Sel, True, False);
10107 }
10108 return true;
10109}
10110
10112 SDValue &Chain, SelectionDAG &DAG) const {
10113 // This transform is not correct for converting 0 when rounding mode is set
10114 // to round toward negative infinity which will produce -0.0. So disable
10115 // under strictfp.
10116 if (Node->isStrictFPOpcode())
10117 return false;
10118
10119 SDValue Src = Node->getOperand(0);
10120 EVT SrcVT = Src.getValueType();
10121 EVT DstVT = Node->getValueType(0);
10122
10123 // If the input is known to be non-negative and SINT_TO_FP is legal then use
10124 // it.
10125 if (Node->getFlags().hasNonNeg() &&
10127 Result =
10128 DAG.getNode(ISD::SINT_TO_FP, SDLoc(Node), DstVT, Node->getOperand(0));
10129 return true;
10130 }
10131
10132 if (SrcVT.getScalarType() != MVT::i64 || DstVT.getScalarType() != MVT::f64)
10133 return false;
10134
10135 // Only expand vector types if we have the appropriate vector bit
10136 // operations.
10137 if (SrcVT.isVector() && (!isOperationLegalOrCustom(ISD::SRL, SrcVT) ||
10142 return false;
10143
10144 SDLoc dl(SDValue(Node, 0));
10145
10146 // Implementation of unsigned i64 to f64 following the algorithm in
10147 // __floatundidf in compiler_rt. This implementation performs rounding
10148 // correctly in all rounding modes with the exception of converting 0
10149 // when rounding toward negative infinity. In that case the fsub will
10150 // produce -0.0. This will be added to +0.0 and produce -0.0 which is
10151 // incorrect.
10152 SDValue TwoP52 = DAG.getConstant(UINT64_C(0x4330000000000000), dl, SrcVT);
10153 SDValue TwoP84PlusTwoP52 = DAG.getConstantFP(
10154 llvm::bit_cast<double>(UINT64_C(0x4530000000100000)), dl, DstVT);
10155 SDValue TwoP84 = DAG.getConstant(UINT64_C(0x4530000000000000), dl, SrcVT);
10156 SDValue LoMask = DAG.getConstant(UINT64_C(0x00000000FFFFFFFF), dl, SrcVT);
10157 SDValue HiShift = DAG.getShiftAmountConstant(32, SrcVT, dl);
10158
10159 SDValue Lo = DAG.getNode(ISD::AND, dl, SrcVT, Src, LoMask);
10160 SDValue Hi = DAG.getNode(ISD::SRL, dl, SrcVT, Src, HiShift);
10161 SDValue LoOr = DAG.getNode(ISD::OR, dl, SrcVT, Lo, TwoP52);
10162 SDValue HiOr = DAG.getNode(ISD::OR, dl, SrcVT, Hi, TwoP84);
10163 SDValue LoFlt = DAG.getBitcast(DstVT, LoOr);
10164 SDValue HiFlt = DAG.getBitcast(DstVT, HiOr);
10165 SDValue HiSub = DAG.getNode(ISD::FSUB, dl, DstVT, HiFlt, TwoP84PlusTwoP52);
10166 Result = DAG.getNode(ISD::FADD, dl, DstVT, LoFlt, HiSub);
10167 return true;
10168}
10169
10170SDValue
10172 SelectionDAG &DAG) const {
10173 unsigned Opcode = Node->getOpcode();
10174 assert((Opcode == ISD::FMINNUM || Opcode == ISD::FMAXNUM ||
10175 Opcode == ISD::STRICT_FMINNUM || Opcode == ISD::STRICT_FMAXNUM) &&
10176 "Wrong opcode");
10177
10178 if (Node->getFlags().hasNoNaNs()) {
10179 ISD::CondCode Pred = Opcode == ISD::FMINNUM ? ISD::SETLT : ISD::SETGT;
10180 EVT VT = Node->getValueType(0);
10181 if ((!isCondCodeLegal(Pred, VT.getSimpleVT()) ||
10183 VT.isVector())
10184 return SDValue();
10185 SDValue Op1 = Node->getOperand(0);
10186 SDValue Op2 = Node->getOperand(1);
10187 return DAG.getSelectCC(SDLoc(Node), Op1, Op2, Op1, Op2, Pred,
10188 Node->getFlags());
10189 }
10190
10191 return SDValue();
10192}
10193
10195 SelectionDAG &DAG) const {
10196 if (SDValue Expanded = expandVectorNaryOpBySplitting(Node, DAG))
10197 return Expanded;
10198
10199 EVT VT = Node->getValueType(0);
10200 if (VT.isScalableVector())
10202 "Expanding fminnum/fmaxnum for scalable vectors is undefined.");
10203
10204 SDLoc dl(Node);
10205 unsigned NewOp =
10207
10208 if (isOperationLegalOrCustom(NewOp, VT)) {
10209 SDValue Quiet0 = Node->getOperand(0);
10210 SDValue Quiet1 = Node->getOperand(1);
10211
10212 if (!Node->getFlags().hasNoNaNs()) {
10213 // Insert canonicalizes if it's possible we need to quiet to get correct
10214 // sNaN behavior.
10215 if (!DAG.isKnownNeverSNaN(Quiet0)) {
10216 Quiet0 = DAG.getNode(ISD::FCANONICALIZE, dl, VT, Quiet0,
10217 Node->getFlags());
10218 }
10219 if (!DAG.isKnownNeverSNaN(Quiet1)) {
10220 Quiet1 = DAG.getNode(ISD::FCANONICALIZE, dl, VT, Quiet1,
10221 Node->getFlags());
10222 }
10223 }
10224
10225 return DAG.getNode(NewOp, dl, VT, Quiet0, Quiet1, Node->getFlags());
10226 }
10227
10228 // If the target has FMINIMUM/FMAXIMUM but not FMINNUM/FMAXNUM use that
10229 // instead if there are no NaNs.
10230 if (Node->getFlags().hasNoNaNs() ||
10231 (DAG.isKnownNeverNaN(Node->getOperand(0)) &&
10232 DAG.isKnownNeverNaN(Node->getOperand(1)))) {
10233 unsigned IEEE2018Op =
10234 Node->getOpcode() == ISD::FMINNUM ? ISD::FMINIMUM : ISD::FMAXIMUM;
10235 if (isOperationLegalOrCustom(IEEE2018Op, VT))
10236 return DAG.getNode(IEEE2018Op, dl, VT, Node->getOperand(0),
10237 Node->getOperand(1), Node->getFlags());
10238 }
10239
10241 return SelCC;
10242
10243 return SDValue();
10244}
10245
10247 const TargetLowering &TLI,
10248 const SDLoc &DL, SDValue Val,
10249 FPClassTest FPClass) {
10250 EVT VT = Val.getValueType();
10251 EVT CCVT = TLI.getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
10252 EVT IntVT = VT.changeTypeToInteger();
10253 EVT FloatVT = VT.changeElementType(*DAG.getContext(), MVT::f32);
10254 SDValue TestZero = DAG.getTargetConstant(FPClass, DL, MVT::i32);
10255 if (!TLI.isTypeLegal(IntVT) &&
10257 Val = DAG.getNode(ISD::FP_ROUND, DL, FloatVT, Val,
10258 DAG.getIntPtrConstant(0, DL, /*isTarget=*/true));
10259 return DAG.getNode(ISD::IS_FPCLASS, DL, CCVT, Val, TestZero);
10260}
10261
10263 SelectionDAG &DAG) const {
10264 if (SDValue Expanded = expandVectorNaryOpBySplitting(N, DAG))
10265 return Expanded;
10266
10267 SDLoc DL(N);
10268 SDValue LHS = N->getOperand(0);
10269 SDValue RHS = N->getOperand(1);
10270 unsigned Opc = N->getOpcode();
10271 EVT VT = N->getValueType(0);
10272 EVT CCVT = getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
10273 bool IsMax = Opc == ISD::FMAXIMUM;
10274 SDNodeFlags Flags = N->getFlags();
10275
10276 // First, implement comparison not propagating NaN. If no native fmin or fmax
10277 // available, use plain select with setcc instead.
10279 unsigned CompOpcIeee = IsMax ? ISD::FMAXNUM_IEEE : ISD::FMINNUM_IEEE;
10280 unsigned CompOpc = IsMax ? ISD::FMAXNUM : ISD::FMINNUM;
10281
10282 // FIXME: We should probably define fminnum/fmaxnum variants with correct
10283 // signed zero behavior.
10284 bool MinMaxMustRespectOrderedZero = false;
10285
10286 if (isOperationLegalOrCustom(CompOpcIeee, VT)) {
10287 MinMax = DAG.getNode(CompOpcIeee, DL, VT, LHS, RHS, Flags);
10288 MinMaxMustRespectOrderedZero = true;
10289 } else if (isOperationLegalOrCustom(CompOpc, VT)) {
10290 MinMax = DAG.getNode(CompOpc, DL, VT, LHS, RHS, Flags);
10291 } else {
10293 return DAG.UnrollVectorOp(N);
10294
10295 // NaN (if exists) will be propagated later, so orderness doesn't matter.
10296 SDValue Compare =
10297 DAG.getSetCC(DL, CCVT, LHS, RHS, IsMax ? ISD::SETOGT : ISD::SETOLT);
10298 MinMax = DAG.getSelect(DL, VT, Compare, LHS, RHS, Flags);
10299 }
10300
10301 // Propagate any NaN of both operands
10302 if (!N->getFlags().hasNoNaNs() &&
10303 (!DAG.isKnownNeverNaN(RHS) || !DAG.isKnownNeverNaN(LHS))) {
10304 ConstantFP *FPNaN = ConstantFP::get(*DAG.getContext(),
10306 MinMax = DAG.getSelect(DL, VT, DAG.getSetCC(DL, CCVT, LHS, RHS, ISD::SETUO),
10307 DAG.getConstantFP(*FPNaN, DL, VT), MinMax, Flags);
10308 }
10309
10310 // fminimum/fmaximum requires -0.0 less than +0.0
10311 if (!MinMaxMustRespectOrderedZero && !N->getFlags().hasNoSignedZeros() &&
10312 !DAG.isKnownNeverLogicalZero(RHS) && !DAG.isKnownNeverLogicalZero(LHS)) {
10313 SDValue IsEqual = DAG.getSetCC(DL, CCVT, LHS, RHS, ISD::SETOEQ);
10315 DAG, *this, DL, LHS, IsMax ? fcPosZero : fcNegZero);
10316 SDValue RetZero = DAG.getSelect(DL, VT, IsSpecificZero, LHS, RHS, Flags);
10317 MinMax = DAG.getSelect(DL, VT, IsEqual, RetZero, MinMax, Flags);
10318 }
10319
10320 return MinMax;
10321}
10322
10324 SelectionDAG &DAG) const {
10325 SDLoc DL(Node);
10326 SDValue LHS = Node->getOperand(0);
10327 SDValue RHS = Node->getOperand(1);
10328 unsigned Opc = Node->getOpcode();
10329 EVT VT = Node->getValueType(0);
10330 EVT CCVT = getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
10331 bool IsMax = Opc == ISD::FMAXIMUMNUM;
10332 SDNodeFlags Flags = Node->getFlags();
10333
10334 unsigned NewOp =
10336
10337 if (isOperationLegalOrCustom(NewOp, VT)) {
10338 if (!Flags.hasNoNaNs()) {
10339 // Insert canonicalizes if it's possible we need to quiet to get correct
10340 // sNaN behavior.
10341 if (!DAG.isKnownNeverSNaN(LHS)) {
10342 LHS = DAG.getNode(ISD::FCANONICALIZE, DL, VT, LHS, Flags);
10343 }
10344 if (!DAG.isKnownNeverSNaN(RHS)) {
10345 RHS = DAG.getNode(ISD::FCANONICALIZE, DL, VT, RHS, Flags);
10346 }
10347 }
10348
10349 return DAG.getNode(NewOp, DL, VT, LHS, RHS, Flags);
10350 }
10351
10352 // We can use FMINIMUM/FMAXIMUM if there is no NaN, since it has
10353 // same behaviors for all of other cases: +0.0 vs -0.0 included.
10354 if (Flags.hasNoNaNs() ||
10355 (DAG.isKnownNeverNaN(LHS) && DAG.isKnownNeverNaN(RHS))) {
10356 unsigned IEEE2019Op =
10358 if (isOperationLegalOrCustom(IEEE2019Op, VT))
10359 return DAG.getNode(IEEE2019Op, DL, VT, LHS, RHS, Flags);
10360 }
10361
10362 // FMINNUM/FMAXMUM returns qNaN if either operand is sNaN, and it may return
10363 // either one for +0.0 vs -0.0.
10364 if ((Flags.hasNoNaNs() ||
10365 (DAG.isKnownNeverSNaN(LHS) && DAG.isKnownNeverSNaN(RHS))) &&
10366 (Flags.hasNoSignedZeros() || DAG.isKnownNeverLogicalZero(LHS) ||
10367 DAG.isKnownNeverLogicalZero(RHS))) {
10368 unsigned IEEE2008Op = Opc == ISD::FMINIMUMNUM ? ISD::FMINNUM : ISD::FMAXNUM;
10369 if (isOperationLegalOrCustom(IEEE2008Op, VT))
10370 return DAG.getNode(IEEE2008Op, DL, VT, LHS, RHS, Flags);
10371 }
10372
10373 if (VT.isVector() &&
10376 return DAG.UnrollVectorOp(Node);
10377
10378 // If only one operand is NaN, override it with another operand.
10379 if (!Flags.hasNoNaNs() && !DAG.isKnownNeverNaN(LHS)) {
10380 LHS = DAG.getSelectCC(DL, LHS, LHS, RHS, LHS, ISD::SETUO);
10381 }
10382 if (!Flags.hasNoNaNs() && !DAG.isKnownNeverNaN(RHS)) {
10383 RHS = DAG.getSelectCC(DL, RHS, RHS, LHS, RHS, ISD::SETUO);
10384 }
10385
10386 // Always prefer RHS if equal.
10387 SDValue MinMax =
10388 DAG.getSelectCC(DL, LHS, RHS, LHS, RHS, IsMax ? ISD::SETGT : ISD::SETLT);
10389
10390 // TODO: We need quiet sNaN if strictfp.
10391
10392 // Fixup signed zero behavior.
10393 if (Flags.hasNoSignedZeros() || DAG.isKnownNeverLogicalZero(LHS) ||
10394 DAG.isKnownNeverLogicalZero(RHS)) {
10395 return MinMax;
10396 }
10397 SDValue IsZero = DAG.getSetCC(DL, CCVT, MinMax,
10398 DAG.getConstantFP(0.0, DL, VT), ISD::SETEQ);
10400 DAG, *this, DL, LHS, IsMax ? fcPosZero : fcNegZero);
10401 // It's OK to select from LHS and MinMax, with only one ISD::IS_FPCLASS, as
10402 // we preferred RHS when generate MinMax, if the operands are equal.
10403 SDValue RetZero = DAG.getSelect(DL, VT, IsSpecificZero, LHS, MinMax, Flags);
10404 return DAG.getSelect(DL, VT, IsZero, RetZero, MinMax, Flags);
10405}
10406
10407/// Returns a true value if if this FPClassTest can be performed with an ordered
10408/// fcmp to 0, and a false value if it's an unordered fcmp to 0. Returns
10409/// std::nullopt if it cannot be performed as a compare with 0.
10410static std::optional<bool> isFCmpEqualZero(FPClassTest Test,
10411 const fltSemantics &Semantics,
10412 const MachineFunction &MF) {
10413 FPClassTest OrderedMask = Test & ~fcNan;
10414 FPClassTest NanTest = Test & fcNan;
10415 bool IsOrdered = NanTest == fcNone;
10416 bool IsUnordered = NanTest == fcNan;
10417
10418 // Skip cases that are testing for only a qnan or snan.
10419 if (!IsOrdered && !IsUnordered)
10420 return std::nullopt;
10421
10422 if (OrderedMask == fcZero &&
10423 MF.getDenormalMode(Semantics).Input == DenormalMode::IEEE)
10424 return IsOrdered;
10425 if (OrderedMask == (fcZero | fcSubnormal) &&
10426 MF.getDenormalMode(Semantics).inputsAreZero())
10427 return IsOrdered;
10428 return std::nullopt;
10429}
10430
10432 const FPClassTest OrigTestMask,
10433 SDNodeFlags Flags, const SDLoc &DL,
10434 SelectionDAG &DAG) const {
10435 EVT OperandVT = Op.getValueType();
10436 assert(OperandVT.isFloatingPoint());
10437 FPClassTest Test = OrigTestMask;
10438
10439 // Degenerated cases.
10440 if (Test == fcNone)
10441 return DAG.getBoolConstant(false, DL, ResultVT, OperandVT);
10442 if (Test == fcAllFlags)
10443 return DAG.getBoolConstant(true, DL, ResultVT, OperandVT);
10444
10445 // PPC double double is a pair of doubles, of which the higher part determines
10446 // the value class.
10447 if (OperandVT == MVT::ppcf128) {
10448 Op = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::f64, Op,
10449 DAG.getConstant(1, DL, MVT::i32));
10450 OperandVT = MVT::f64;
10451 }
10452
10453 // Floating-point type properties.
10454 EVT ScalarFloatVT = OperandVT.getScalarType();
10455 const Type *FloatTy = ScalarFloatVT.getTypeForEVT(*DAG.getContext());
10456 const llvm::fltSemantics &Semantics = FloatTy->getFltSemantics();
10457 bool IsF80 = (ScalarFloatVT == MVT::f80);
10458
10459 // Some checks can be implemented using float comparisons, if floating point
10460 // exceptions are ignored.
10461 if (Flags.hasNoFPExcept() &&
10463 FPClassTest FPTestMask = Test;
10464 bool IsInvertedFP = false;
10465
10466 if (FPClassTest InvertedFPCheck =
10467 invertFPClassTestIfSimpler(FPTestMask, true)) {
10468 FPTestMask = InvertedFPCheck;
10469 IsInvertedFP = true;
10470 }
10471
10472 ISD::CondCode OrderedCmpOpcode = IsInvertedFP ? ISD::SETUNE : ISD::SETOEQ;
10473 ISD::CondCode UnorderedCmpOpcode = IsInvertedFP ? ISD::SETONE : ISD::SETUEQ;
10474
10475 // See if we can fold an | fcNan into an unordered compare.
10476 FPClassTest OrderedFPTestMask = FPTestMask & ~fcNan;
10477
10478 // Can't fold the ordered check if we're only testing for snan or qnan
10479 // individually.
10480 if ((FPTestMask & fcNan) != fcNan)
10481 OrderedFPTestMask = FPTestMask;
10482
10483 const bool IsOrdered = FPTestMask == OrderedFPTestMask;
10484
10485 if (std::optional<bool> IsCmp0 =
10486 isFCmpEqualZero(FPTestMask, Semantics, DAG.getMachineFunction());
10487 IsCmp0 && (isCondCodeLegalOrCustom(
10488 *IsCmp0 ? OrderedCmpOpcode : UnorderedCmpOpcode,
10489 OperandVT.getScalarType().getSimpleVT()))) {
10490
10491 // If denormals could be implicitly treated as 0, this is not equivalent
10492 // to a compare with 0 since it will also be true for denormals.
10493 return DAG.getSetCC(DL, ResultVT, Op,
10494 DAG.getConstantFP(0.0, DL, OperandVT),
10495 *IsCmp0 ? OrderedCmpOpcode : UnorderedCmpOpcode);
10496 }
10497
10498 if (FPTestMask == fcNan &&
10500 OperandVT.getScalarType().getSimpleVT()))
10501 return DAG.getSetCC(DL, ResultVT, Op, Op,
10502 IsInvertedFP ? ISD::SETO : ISD::SETUO);
10503
10504 bool IsOrderedInf = FPTestMask == fcInf;
10505 if ((FPTestMask == fcInf || FPTestMask == (fcInf | fcNan)) &&
10506 isCondCodeLegalOrCustom(IsOrderedInf ? OrderedCmpOpcode
10507 : UnorderedCmpOpcode,
10508 OperandVT.getScalarType().getSimpleVT()) &&
10511 (OperandVT.isVector() &&
10513 // isinf(x) --> fabs(x) == inf
10514 SDValue Abs = DAG.getNode(ISD::FABS, DL, OperandVT, Op);
10515 SDValue Inf =
10516 DAG.getConstantFP(APFloat::getInf(Semantics), DL, OperandVT);
10517 return DAG.getSetCC(DL, ResultVT, Abs, Inf,
10518 IsOrderedInf ? OrderedCmpOpcode : UnorderedCmpOpcode);
10519 }
10520
10521 if ((OrderedFPTestMask == fcPosInf || OrderedFPTestMask == fcNegInf) &&
10522 isCondCodeLegalOrCustom(IsOrdered ? OrderedCmpOpcode
10523 : UnorderedCmpOpcode,
10524 OperandVT.getSimpleVT())) {
10525 // isposinf(x) --> x == inf
10526 // isneginf(x) --> x == -inf
10527 // isposinf(x) || nan --> x u== inf
10528 // isneginf(x) || nan --> x u== -inf
10529
10530 SDValue Inf = DAG.getConstantFP(
10531 APFloat::getInf(Semantics, OrderedFPTestMask == fcNegInf), DL,
10532 OperandVT);
10533 return DAG.getSetCC(DL, ResultVT, Op, Inf,
10534 IsOrdered ? OrderedCmpOpcode : UnorderedCmpOpcode);
10535 }
10536
10537 if (OrderedFPTestMask == (fcSubnormal | fcZero) && !IsOrdered) {
10538 // TODO: Could handle ordered case, but it produces worse code for
10539 // x86. Maybe handle ordered if fabs is free?
10540
10541 ISD::CondCode OrderedOp = IsInvertedFP ? ISD::SETUGE : ISD::SETOLT;
10542 ISD::CondCode UnorderedOp = IsInvertedFP ? ISD::SETOGE : ISD::SETULT;
10543
10544 if (isCondCodeLegalOrCustom(IsOrdered ? OrderedOp : UnorderedOp,
10545 OperandVT.getScalarType().getSimpleVT())) {
10546 // (issubnormal(x) || iszero(x)) --> fabs(x) < smallest_normal
10547
10548 // TODO: Maybe only makes sense if fabs is free. Integer test of
10549 // exponent bits seems better for x86.
10550 SDValue Abs = DAG.getNode(ISD::FABS, DL, OperandVT, Op);
10551 SDValue SmallestNormal = DAG.getConstantFP(
10552 APFloat::getSmallestNormalized(Semantics), DL, OperandVT);
10553 return DAG.getSetCC(DL, ResultVT, Abs, SmallestNormal,
10554 IsOrdered ? OrderedOp : UnorderedOp);
10555 }
10556 }
10557
10558 if (FPTestMask == fcNormal) {
10559 // TODO: Handle unordered
10560 ISD::CondCode IsFiniteOp = IsInvertedFP ? ISD::SETUGE : ISD::SETOLT;
10561 ISD::CondCode IsNormalOp = IsInvertedFP ? ISD::SETOLT : ISD::SETUGE;
10562
10563 if (isCondCodeLegalOrCustom(IsFiniteOp,
10564 OperandVT.getScalarType().getSimpleVT()) &&
10565 isCondCodeLegalOrCustom(IsNormalOp,
10566 OperandVT.getScalarType().getSimpleVT()) &&
10567 isFAbsFree(OperandVT)) {
10568 // isnormal(x) --> fabs(x) < infinity && !(fabs(x) < smallest_normal)
10569 SDValue Inf =
10570 DAG.getConstantFP(APFloat::getInf(Semantics), DL, OperandVT);
10571 SDValue SmallestNormal = DAG.getConstantFP(
10572 APFloat::getSmallestNormalized(Semantics), DL, OperandVT);
10573
10574 SDValue Abs = DAG.getNode(ISD::FABS, DL, OperandVT, Op);
10575 SDValue IsFinite = DAG.getSetCC(DL, ResultVT, Abs, Inf, IsFiniteOp);
10576 SDValue IsNormal =
10577 DAG.getSetCC(DL, ResultVT, Abs, SmallestNormal, IsNormalOp);
10578 unsigned LogicOp = IsInvertedFP ? ISD::OR : ISD::AND;
10579 return DAG.getNode(LogicOp, DL, ResultVT, IsFinite, IsNormal);
10580 }
10581 }
10582 }
10583
10584 // Some checks may be represented as inversion of simpler check, for example
10585 // "inf|normal|subnormal|zero" => !"nan".
10586 bool IsInverted = false;
10587
10588 if (FPClassTest InvertedCheck = invertFPClassTestIfSimpler(Test, false)) {
10589 Test = InvertedCheck;
10590 IsInverted = true;
10591 }
10592
10593 // In the general case use integer operations.
10594 unsigned BitSize = OperandVT.getScalarSizeInBits();
10595 EVT IntVT = OperandVT.changeElementType(
10596 *DAG.getContext(), EVT::getIntegerVT(*DAG.getContext(), BitSize));
10597 SDValue OpAsInt = DAG.getBitcast(IntVT, Op);
10598
10599 // Various masks.
10600 APInt SignBit = APInt::getSignMask(BitSize);
10601 APInt ValueMask = APInt::getSignedMaxValue(BitSize); // All bits but sign.
10602 APInt Inf = APFloat::getInf(Semantics).bitcastToAPInt(); // Exp and int bit.
10603 const unsigned ExplicitIntBitInF80 = 63;
10604 APInt ExpMask = Inf;
10605 if (IsF80)
10606 ExpMask.clearBit(ExplicitIntBitInF80);
10607 APInt AllOneMantissa = APFloat::getLargest(Semantics).bitcastToAPInt() & ~Inf;
10608 APInt QNaNBitMask =
10609 APInt::getOneBitSet(BitSize, AllOneMantissa.getActiveBits() - 1);
10610 APInt InversionMask = APInt::getAllOnes(ResultVT.getScalarSizeInBits());
10611
10612 SDValue ValueMaskV = DAG.getConstant(ValueMask, DL, IntVT);
10613 SDValue SignBitV = DAG.getConstant(SignBit, DL, IntVT);
10614 SDValue ExpMaskV = DAG.getConstant(ExpMask, DL, IntVT);
10615 SDValue ZeroV = DAG.getConstant(0, DL, IntVT);
10616 SDValue InfV = DAG.getConstant(Inf, DL, IntVT);
10617 SDValue ResultInversionMask = DAG.getConstant(InversionMask, DL, ResultVT);
10618
10619 SDValue Res;
10620 const auto appendResult = [&](SDValue PartialRes) {
10621 if (PartialRes) {
10622 if (Res)
10623 Res = DAG.getNode(ISD::OR, DL, ResultVT, Res, PartialRes);
10624 else
10625 Res = PartialRes;
10626 }
10627 };
10628
10629 SDValue IntBitIsSetV; // Explicit integer bit in f80 mantissa is set.
10630 const auto getIntBitIsSet = [&]() -> SDValue {
10631 if (!IntBitIsSetV) {
10632 APInt IntBitMask(BitSize, 0);
10633 IntBitMask.setBit(ExplicitIntBitInF80);
10634 SDValue IntBitMaskV = DAG.getConstant(IntBitMask, DL, IntVT);
10635 SDValue IntBitV = DAG.getNode(ISD::AND, DL, IntVT, OpAsInt, IntBitMaskV);
10636 IntBitIsSetV = DAG.getSetCC(DL, ResultVT, IntBitV, ZeroV, ISD::SETNE);
10637 }
10638 return IntBitIsSetV;
10639 };
10640
10641 // Split the value into sign bit and absolute value.
10642 SDValue AbsV = DAG.getNode(ISD::AND, DL, IntVT, OpAsInt, ValueMaskV);
10643 SDValue SignV = DAG.getSetCC(DL, ResultVT, OpAsInt,
10644 DAG.getConstant(0, DL, IntVT), ISD::SETLT);
10645
10646 // Tests that involve more than one class should be processed first.
10647 SDValue PartialRes;
10648
10649 if (IsF80)
10650 ; // Detect finite numbers of f80 by checking individual classes because
10651 // they have different settings of the explicit integer bit.
10652 else if ((Test & fcFinite) == fcFinite) {
10653 // finite(V) ==> (a << 1) < (inf << 1)
10654 //
10655 // See https://github.com/llvm/llvm-project/issues/169270, this is slightly
10656 // shorter than the `finite(V) ==> abs(V) < exp_mask` formula used before.
10657
10659 "finite check requires IEEE-like FP");
10660
10661 SDValue One = DAG.getShiftAmountConstant(1, IntVT, DL);
10662 SDValue TwiceOp = DAG.getNode(ISD::SHL, DL, IntVT, OpAsInt, One);
10663 SDValue TwiceInf = DAG.getNode(ISD::SHL, DL, IntVT, ExpMaskV, One);
10664
10665 PartialRes = DAG.getSetCC(DL, ResultVT, TwiceOp, TwiceInf, ISD::SETULT);
10666 Test &= ~fcFinite;
10667 } else if ((Test & fcFinite) == fcPosFinite) {
10668 // finite(V) && V > 0 ==> V < exp_mask
10669 PartialRes = DAG.getSetCC(DL, ResultVT, OpAsInt, ExpMaskV, ISD::SETULT);
10670 Test &= ~fcPosFinite;
10671 } else if ((Test & fcFinite) == fcNegFinite) {
10672 // finite(V) && V < 0 ==> abs(V) < exp_mask && signbit == 1
10673 PartialRes = DAG.getSetCC(DL, ResultVT, AbsV, ExpMaskV, ISD::SETLT);
10674 PartialRes = DAG.getNode(ISD::AND, DL, ResultVT, PartialRes, SignV);
10675 Test &= ~fcNegFinite;
10676 }
10677 appendResult(PartialRes);
10678
10679 if (FPClassTest PartialCheck = Test & (fcZero | fcSubnormal)) {
10680 // fcZero | fcSubnormal => test all exponent bits are 0
10681 // TODO: Handle sign bit specific cases
10682 if (PartialCheck == (fcZero | fcSubnormal)) {
10683 SDValue ExpBits = DAG.getNode(ISD::AND, DL, IntVT, OpAsInt, ExpMaskV);
10684 SDValue ExpIsZero =
10685 DAG.getSetCC(DL, ResultVT, ExpBits, ZeroV, ISD::SETEQ);
10686 appendResult(ExpIsZero);
10687 Test &= ~PartialCheck & fcAllFlags;
10688 }
10689 }
10690
10691 // Check for individual classes.
10692
10693 if (unsigned PartialCheck = Test & fcZero) {
10694 if (PartialCheck == fcPosZero)
10695 PartialRes = DAG.getSetCC(DL, ResultVT, OpAsInt, ZeroV, ISD::SETEQ);
10696 else if (PartialCheck == fcZero)
10697 PartialRes = DAG.getSetCC(DL, ResultVT, AbsV, ZeroV, ISD::SETEQ);
10698 else // ISD::fcNegZero
10699 PartialRes = DAG.getSetCC(DL, ResultVT, OpAsInt, SignBitV, ISD::SETEQ);
10700 appendResult(PartialRes);
10701 }
10702
10703 if (unsigned PartialCheck = Test & fcSubnormal) {
10704 // issubnormal(V) ==> unsigned(abs(V) - 1) < (all mantissa bits set)
10705 // issubnormal(V) && V>0 ==> unsigned(V - 1) < (all mantissa bits set)
10706 SDValue V = (PartialCheck == fcPosSubnormal) ? OpAsInt : AbsV;
10707 SDValue MantissaV = DAG.getConstant(AllOneMantissa, DL, IntVT);
10708 SDValue VMinusOneV =
10709 DAG.getNode(ISD::SUB, DL, IntVT, V, DAG.getConstant(1, DL, IntVT));
10710 PartialRes = DAG.getSetCC(DL, ResultVT, VMinusOneV, MantissaV, ISD::SETULT);
10711 if (PartialCheck == fcNegSubnormal)
10712 PartialRes = DAG.getNode(ISD::AND, DL, ResultVT, PartialRes, SignV);
10713 appendResult(PartialRes);
10714 }
10715
10716 if (unsigned PartialCheck = Test & fcInf) {
10717 if (PartialCheck == fcPosInf)
10718 PartialRes = DAG.getSetCC(DL, ResultVT, OpAsInt, InfV, ISD::SETEQ);
10719 else if (PartialCheck == fcInf)
10720 PartialRes = DAG.getSetCC(DL, ResultVT, AbsV, InfV, ISD::SETEQ);
10721 else { // ISD::fcNegInf
10722 APInt NegInf = APFloat::getInf(Semantics, true).bitcastToAPInt();
10723 SDValue NegInfV = DAG.getConstant(NegInf, DL, IntVT);
10724 PartialRes = DAG.getSetCC(DL, ResultVT, OpAsInt, NegInfV, ISD::SETEQ);
10725 }
10726 appendResult(PartialRes);
10727 }
10728
10729 if (unsigned PartialCheck = Test & fcNan) {
10730 APInt InfWithQnanBit = Inf | QNaNBitMask;
10731 SDValue InfWithQnanBitV = DAG.getConstant(InfWithQnanBit, DL, IntVT);
10732 if (PartialCheck == fcNan) {
10733 // isnan(V) ==> abs(V) > int(inf)
10734 PartialRes = DAG.getSetCC(DL, ResultVT, AbsV, InfV, ISD::SETGT);
10735 if (IsF80) {
10736 // Recognize unsupported values as NaNs for compatibility with glibc.
10737 // In them (exp(V)==0) == int_bit.
10738 SDValue ExpBits = DAG.getNode(ISD::AND, DL, IntVT, AbsV, ExpMaskV);
10739 SDValue ExpIsZero =
10740 DAG.getSetCC(DL, ResultVT, ExpBits, ZeroV, ISD::SETEQ);
10741 SDValue IsPseudo =
10742 DAG.getSetCC(DL, ResultVT, getIntBitIsSet(), ExpIsZero, ISD::SETEQ);
10743 PartialRes = DAG.getNode(ISD::OR, DL, ResultVT, PartialRes, IsPseudo);
10744 }
10745 } else if (PartialCheck == fcQNan) {
10746 // isquiet(V) ==> abs(V) >= (unsigned(Inf) | quiet_bit)
10747 PartialRes =
10748 DAG.getSetCC(DL, ResultVT, AbsV, InfWithQnanBitV, ISD::SETGE);
10749 } else { // ISD::fcSNan
10750 // issignaling(V) ==> abs(V) > unsigned(Inf) &&
10751 // abs(V) < (unsigned(Inf) | quiet_bit)
10752 SDValue IsNan = DAG.getSetCC(DL, ResultVT, AbsV, InfV, ISD::SETGT);
10753 SDValue IsNotQnan =
10754 DAG.getSetCC(DL, ResultVT, AbsV, InfWithQnanBitV, ISD::SETLT);
10755 PartialRes = DAG.getNode(ISD::AND, DL, ResultVT, IsNan, IsNotQnan);
10756 }
10757 appendResult(PartialRes);
10758 }
10759
10760 if (unsigned PartialCheck = Test & fcNormal) {
10761 // isnormal(V) ==> (0 < exp < max_exp) ==> (unsigned(exp-1) < (max_exp-1))
10762 APInt ExpLSB = ExpMask & ~(ExpMask.shl(1));
10763 SDValue ExpLSBV = DAG.getConstant(ExpLSB, DL, IntVT);
10764 SDValue ExpMinus1 = DAG.getNode(ISD::SUB, DL, IntVT, AbsV, ExpLSBV);
10765 APInt ExpLimit = ExpMask - ExpLSB;
10766 SDValue ExpLimitV = DAG.getConstant(ExpLimit, DL, IntVT);
10767 PartialRes = DAG.getSetCC(DL, ResultVT, ExpMinus1, ExpLimitV, ISD::SETULT);
10768 if (PartialCheck == fcNegNormal)
10769 PartialRes = DAG.getNode(ISD::AND, DL, ResultVT, PartialRes, SignV);
10770 else if (PartialCheck == fcPosNormal) {
10771 SDValue PosSignV =
10772 DAG.getNode(ISD::XOR, DL, ResultVT, SignV, ResultInversionMask);
10773 PartialRes = DAG.getNode(ISD::AND, DL, ResultVT, PartialRes, PosSignV);
10774 }
10775 if (IsF80)
10776 PartialRes =
10777 DAG.getNode(ISD::AND, DL, ResultVT, PartialRes, getIntBitIsSet());
10778 appendResult(PartialRes);
10779 }
10780
10781 if (!Res)
10782 return DAG.getConstant(IsInverted, DL, ResultVT);
10783 if (IsInverted)
10784 Res = DAG.getNode(ISD::XOR, DL, ResultVT, Res, ResultInversionMask);
10785 return Res;
10786}
10787
10788// Only expand vector types if we have the appropriate vector bit operations.
10789static bool canExpandVectorCTPOP(const TargetLowering &TLI, EVT VT) {
10790 assert(VT.isVector() && "Expected vector type");
10791 unsigned Len = VT.getScalarSizeInBits();
10792 return TLI.isOperationLegalOrCustom(ISD::ADD, VT) &&
10795 (Len == 8 || TLI.isOperationLegalOrCustom(ISD::MUL, VT)) &&
10797}
10798
10800 SDLoc dl(Node);
10801 EVT VT = Node->getValueType(0);
10802 EVT ShVT = getShiftAmountTy(VT, DAG.getDataLayout());
10803 SDValue Op = Node->getOperand(0);
10804 unsigned Len = VT.getScalarSizeInBits();
10805 assert(VT.isInteger() && "CTPOP not implemented for this type.");
10806
10807 // TODO: Add support for irregular type lengths.
10808 if (!(Len <= 128 && Len % 8 == 0))
10809 return SDValue();
10810
10811 // Only expand vector types if we have the appropriate vector bit operations.
10812 if (VT.isVector() && !canExpandVectorCTPOP(*this, VT))
10813 return SDValue();
10814
10815 // This is the "best" algorithm from
10816 // http://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetParallel
10817 SDValue Mask55 =
10818 DAG.getConstant(APInt::getSplat(Len, APInt(8, 0x55)), dl, VT);
10819 SDValue Mask33 =
10820 DAG.getConstant(APInt::getSplat(Len, APInt(8, 0x33)), dl, VT);
10821 SDValue Mask0F =
10822 DAG.getConstant(APInt::getSplat(Len, APInt(8, 0x0F)), dl, VT);
10823
10824 // v = v - ((v >> 1) & 0x55555555...)
10825 Op = DAG.getNode(ISD::SUB, dl, VT, Op,
10826 DAG.getNode(ISD::AND, dl, VT,
10827 DAG.getNode(ISD::SRL, dl, VT, Op,
10828 DAG.getConstant(1, dl, ShVT)),
10829 Mask55));
10830 // v = (v & 0x33333333...) + ((v >> 2) & 0x33333333...)
10831 Op = DAG.getNode(ISD::ADD, dl, VT, DAG.getNode(ISD::AND, dl, VT, Op, Mask33),
10832 DAG.getNode(ISD::AND, dl, VT,
10833 DAG.getNode(ISD::SRL, dl, VT, Op,
10834 DAG.getConstant(2, dl, ShVT)),
10835 Mask33));
10836 // v = (v + (v >> 4)) & 0x0F0F0F0F...
10837 Op = DAG.getNode(ISD::AND, dl, VT,
10838 DAG.getNode(ISD::ADD, dl, VT, Op,
10839 DAG.getNode(ISD::SRL, dl, VT, Op,
10840 DAG.getConstant(4, dl, ShVT))),
10841 Mask0F);
10842
10843 if (Len <= 8)
10844 return Op;
10845
10846 // Avoid the multiply if we only have 2 bytes to add.
10847 // TODO: Only doing this for scalars because vectors weren't as obviously
10848 // improved.
10849 if (Len == 16 && !VT.isVector()) {
10850 // v = (v + (v >> 8)) & 0x00FF;
10851 return DAG.getNode(ISD::AND, dl, VT,
10852 DAG.getNode(ISD::ADD, dl, VT, Op,
10853 DAG.getNode(ISD::SRL, dl, VT, Op,
10854 DAG.getConstant(8, dl, ShVT))),
10855 DAG.getConstant(0xFF, dl, VT));
10856 }
10857
10858 // v = (v * 0x01010101...) >> (Len - 8)
10859 SDValue V;
10862 SDValue Mask01 =
10863 DAG.getConstant(APInt::getSplat(Len, APInt(8, 0x01)), dl, VT);
10864 V = DAG.getNode(ISD::MUL, dl, VT, Op, Mask01);
10865 } else {
10866 V = Op;
10867 for (unsigned Shift = 8; Shift < Len; Shift *= 2) {
10868 SDValue ShiftC = DAG.getShiftAmountConstant(Shift, VT, dl);
10869 V = DAG.getNode(ISD::ADD, dl, VT, V,
10870 DAG.getNode(ISD::SHL, dl, VT, V, ShiftC));
10871 }
10872 }
10873 return DAG.getNode(ISD::SRL, dl, VT, V, DAG.getConstant(Len - 8, dl, ShVT));
10874}
10875
10877 SDLoc dl(Node);
10878 EVT VT = Node->getValueType(0);
10879 EVT ShVT = getShiftAmountTy(VT, DAG.getDataLayout());
10880 SDValue Op = Node->getOperand(0);
10881 SDValue Mask = Node->getOperand(1);
10882 SDValue VL = Node->getOperand(2);
10883 unsigned Len = VT.getScalarSizeInBits();
10884 assert(VT.isInteger() && "VP_CTPOP not implemented for this type.");
10885
10886 // TODO: Add support for irregular type lengths.
10887 if (!(Len <= 128 && Len % 8 == 0))
10888 return SDValue();
10889
10890 // This is same algorithm of expandCTPOP from
10891 // http://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetParallel
10892 SDValue Mask55 =
10893 DAG.getConstant(APInt::getSplat(Len, APInt(8, 0x55)), dl, VT);
10894 SDValue Mask33 =
10895 DAG.getConstant(APInt::getSplat(Len, APInt(8, 0x33)), dl, VT);
10896 SDValue Mask0F =
10897 DAG.getConstant(APInt::getSplat(Len, APInt(8, 0x0F)), dl, VT);
10898
10899 SDValue Tmp1, Tmp2, Tmp3, Tmp4, Tmp5;
10900
10901 // v = v - ((v >> 1) & 0x55555555...)
10902 Tmp1 = DAG.getNode(ISD::VP_AND, dl, VT,
10903 DAG.getNode(ISD::VP_SRL, dl, VT, Op,
10904 DAG.getConstant(1, dl, ShVT), Mask, VL),
10905 Mask55, Mask, VL);
10906 Op = DAG.getNode(ISD::VP_SUB, dl, VT, Op, Tmp1, Mask, VL);
10907
10908 // v = (v & 0x33333333...) + ((v >> 2) & 0x33333333...)
10909 Tmp2 = DAG.getNode(ISD::VP_AND, dl, VT, Op, Mask33, Mask, VL);
10910 Tmp3 = DAG.getNode(ISD::VP_AND, dl, VT,
10911 DAG.getNode(ISD::VP_SRL, dl, VT, Op,
10912 DAG.getConstant(2, dl, ShVT), Mask, VL),
10913 Mask33, Mask, VL);
10914 Op = DAG.getNode(ISD::VP_ADD, dl, VT, Tmp2, Tmp3, Mask, VL);
10915
10916 // v = (v + (v >> 4)) & 0x0F0F0F0F...
10917 Tmp4 = DAG.getNode(ISD::VP_SRL, dl, VT, Op, DAG.getConstant(4, dl, ShVT),
10918 Mask, VL),
10919 Tmp5 = DAG.getNode(ISD::VP_ADD, dl, VT, Op, Tmp4, Mask, VL);
10920 Op = DAG.getNode(ISD::VP_AND, dl, VT, Tmp5, Mask0F, Mask, VL);
10921
10922 if (Len <= 8)
10923 return Op;
10924
10925 // v = (v * 0x01010101...) >> (Len - 8)
10926 SDValue V;
10928 ISD::VP_MUL, getTypeToTransformTo(*DAG.getContext(), VT))) {
10929 SDValue Mask01 =
10930 DAG.getConstant(APInt::getSplat(Len, APInt(8, 0x01)), dl, VT);
10931 V = DAG.getNode(ISD::VP_MUL, dl, VT, Op, Mask01, Mask, VL);
10932 } else {
10933 V = Op;
10934 for (unsigned Shift = 8; Shift < Len; Shift *= 2) {
10935 SDValue ShiftC = DAG.getShiftAmountConstant(Shift, VT, dl);
10936 V = DAG.getNode(ISD::VP_ADD, dl, VT, V,
10937 DAG.getNode(ISD::VP_SHL, dl, VT, V, ShiftC, Mask, VL),
10938 Mask, VL);
10939 }
10940 }
10941 return DAG.getNode(ISD::VP_SRL, dl, VT, V, DAG.getConstant(Len - 8, dl, ShVT),
10942 Mask, VL);
10943}
10944
10946 SDLoc dl(Node);
10947 EVT VT = Node->getValueType(0);
10948 EVT ShVT = getShiftAmountTy(VT, DAG.getDataLayout());
10949 SDValue Op = Node->getOperand(0);
10950 unsigned NumBitsPerElt = VT.getScalarSizeInBits();
10951
10952 // If the non-ZERO_POISON version is supported we can use that instead.
10953 if (Node->getOpcode() == ISD::CTLZ_ZERO_POISON &&
10955 return DAG.getNode(ISD::CTLZ, dl, VT, Op);
10956
10957 // If the ZERO_POISON version is supported use that and handle the zero case.
10959 EVT SetCCVT =
10960 getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
10961 SDValue CTLZ = DAG.getNode(ISD::CTLZ_ZERO_POISON, dl, VT, Op);
10962 SDValue Zero = DAG.getConstant(0, dl, VT);
10963 SDValue SrcIsZero = DAG.getSetCC(dl, SetCCVT, Op, Zero, ISD::SETEQ);
10964 return DAG.getSelect(dl, VT, SrcIsZero,
10965 DAG.getConstant(NumBitsPerElt, dl, VT), CTLZ);
10966 }
10967
10968 // Only expand vector types if we have the appropriate vector bit operations.
10969 // This includes the operations needed to expand CTPOP if it isn't supported.
10970 if (VT.isVector() && (!isPowerOf2_32(NumBitsPerElt) ||
10972 !canExpandVectorCTPOP(*this, VT)) ||
10975 return SDValue();
10976
10977 // for now, we do this:
10978 // x = x | (x >> 1);
10979 // x = x | (x >> 2);
10980 // ...
10981 // x = x | (x >>16);
10982 // x = x | (x >>32); // for 64-bit input
10983 // return popcount(~x);
10984 //
10985 // Ref: "Hacker's Delight" by Henry Warren
10986 for (unsigned i = 0; (1U << i) < NumBitsPerElt; ++i) {
10987 SDValue Tmp = DAG.getConstant(1ULL << i, dl, ShVT);
10988 Op = DAG.getNode(ISD::OR, dl, VT, Op,
10989 DAG.getNode(ISD::SRL, dl, VT, Op, Tmp));
10990 }
10991 Op = DAG.getNOT(dl, Op, VT);
10992 return DAG.getNode(ISD::CTPOP, dl, VT, Op);
10993}
10994
10996 SDLoc dl(Node);
10997 EVT VT = Node->getValueType(0);
10998 EVT ShVT = getShiftAmountTy(VT, DAG.getDataLayout());
10999 SDValue Op = Node->getOperand(0);
11000 SDValue Mask = Node->getOperand(1);
11001 SDValue VL = Node->getOperand(2);
11002 unsigned NumBitsPerElt = VT.getScalarSizeInBits();
11003
11004 // do this:
11005 // x = x | (x >> 1);
11006 // x = x | (x >> 2);
11007 // ...
11008 // x = x | (x >>16);
11009 // x = x | (x >>32); // for 64-bit input
11010 // return popcount(~x);
11011 for (unsigned i = 0; (1U << i) < NumBitsPerElt; ++i) {
11012 SDValue Tmp = DAG.getConstant(1ULL << i, dl, ShVT);
11013 Op = DAG.getNode(ISD::VP_OR, dl, VT, Op,
11014 DAG.getNode(ISD::VP_SRL, dl, VT, Op, Tmp, Mask, VL), Mask,
11015 VL);
11016 }
11017 Op = DAG.getNode(ISD::VP_XOR, dl, VT, Op, DAG.getAllOnesConstant(dl, VT),
11018 Mask, VL);
11019 return DAG.getNode(ISD::VP_CTPOP, dl, VT, Op, Mask, VL);
11020}
11021
11023 SDLoc dl(Node);
11024 EVT VT = Node->getValueType(0);
11025 SDValue Op = DAG.getFreeze(Node->getOperand(0));
11026 unsigned NumBitsPerElt = VT.getScalarSizeInBits();
11027
11028 // CTLS(x) = CTLZ(OR(SHL(XOR(x, SRA(x, BW-1)), 1), 1))
11029 // This transforms the sign bits into leading zeros that can be counted.
11030 SDValue ShiftAmt = DAG.getShiftAmountConstant(NumBitsPerElt - 1, VT, dl);
11031 SDValue SignBit = DAG.getNode(ISD::SRA, dl, VT, Op, ShiftAmt);
11032 SDValue Xor = DAG.getNode(ISD::XOR, dl, VT, Op, SignBit);
11033 SDValue Shl =
11034 DAG.getNode(ISD::SHL, dl, VT, Xor, DAG.getShiftAmountConstant(1, VT, dl));
11035 SDValue Or = DAG.getNode(ISD::OR, dl, VT, Shl, DAG.getConstant(1, dl, VT));
11036 return DAG.getNode(ISD::CTLZ_ZERO_POISON, dl, VT, Or);
11037}
11038
11040 const SDLoc &DL, EVT VT, SDValue Op,
11041 unsigned BitWidth) const {
11042 if (BitWidth != 32 && BitWidth != 64)
11043 return SDValue();
11044
11045 const DataLayout &TD = DAG.getDataLayout();
11047 return SDValue();
11048
11049 APInt DeBruijn = BitWidth == 32 ? APInt(32, 0x077CB531U)
11050 : APInt(64, 0x0218A392CD3D5DBFULL);
11051 MachinePointerInfo PtrInfo =
11053 unsigned ShiftAmt = BitWidth - Log2_32(BitWidth);
11054 SDValue Neg = DAG.getNode(ISD::SUB, DL, VT, DAG.getConstant(0, DL, VT), Op);
11055 SDValue Lookup = DAG.getNode(
11056 ISD::SRL, DL, VT,
11057 DAG.getNode(ISD::MUL, DL, VT, DAG.getNode(ISD::AND, DL, VT, Op, Neg),
11058 DAG.getConstant(DeBruijn, DL, VT)),
11059 DAG.getShiftAmountConstant(ShiftAmt, VT, DL));
11061
11063 for (unsigned i = 0; i < BitWidth; i++) {
11064 APInt Shl = DeBruijn.shl(i);
11065 APInt Lshr = Shl.lshr(ShiftAmt);
11066 Table[Lshr.getZExtValue()] = i;
11067 }
11068
11069 // Create a ConstantArray in Constant Pool
11070 auto *CA = ConstantDataArray::get(*DAG.getContext(), Table);
11071 SDValue CPIdx = DAG.getConstantPool(CA, getPointerTy(TD),
11072 TD.getPrefTypeAlign(CA->getType()));
11073 SDValue ExtLoad = DAG.getExtLoad(ISD::ZEXTLOAD, DL, VT, DAG.getEntryNode(),
11074 DAG.getMemBasePlusOffset(CPIdx, Lookup, DL),
11075 PtrInfo, MVT::i8);
11076 if (Node->getOpcode() == ISD::CTTZ_ZERO_POISON)
11077 return ExtLoad;
11078
11079 EVT SetCCVT =
11080 getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
11081 SDValue Zero = DAG.getConstant(0, DL, VT);
11082 SDValue SrcIsZero = DAG.getSetCC(DL, SetCCVT, Op, Zero, ISD::SETEQ);
11083 return DAG.getSelect(DL, VT, SrcIsZero,
11084 DAG.getConstant(BitWidth, DL, VT), ExtLoad);
11085}
11086
11088 SDLoc dl(Node);
11089 EVT VT = Node->getValueType(0);
11090 SDValue Op = Node->getOperand(0);
11091 unsigned NumBitsPerElt = VT.getScalarSizeInBits();
11092
11093 // If the non-ZERO_POISON version is supported we can use that instead.
11094 if (Node->getOpcode() == ISD::CTTZ_ZERO_POISON &&
11096 return DAG.getNode(ISD::CTTZ, dl, VT, Op);
11097
11098 // If the ZERO_POISON version is supported use that and handle the zero case.
11100 EVT SetCCVT =
11101 getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
11102 SDValue CTTZ = DAG.getNode(ISD::CTTZ_ZERO_POISON, dl, VT, Op);
11103 SDValue Zero = DAG.getConstant(0, dl, VT);
11104 SDValue SrcIsZero = DAG.getSetCC(dl, SetCCVT, Op, Zero, ISD::SETEQ);
11105 return DAG.getSelect(dl, VT, SrcIsZero,
11106 DAG.getConstant(NumBitsPerElt, dl, VT), CTTZ);
11107 }
11108
11109 // Only expand vector types if we have the appropriate vector bit operations.
11110 // This includes the operations needed to expand CTPOP if it isn't supported.
11111 if (VT.isVector() && (!isPowerOf2_32(NumBitsPerElt) ||
11114 !canExpandVectorCTPOP(*this, VT)) ||
11118 return SDValue();
11119
11120 // Emit Table Lookup if ISD::CTPOP used in the fallback path below is going
11121 // to be expanded or converted to a libcall.
11124 if (SDValue V = CTTZTableLookup(Node, DAG, dl, VT, Op, NumBitsPerElt))
11125 return V;
11126
11127 // for now, we use: { return popcount(~x & (x - 1)); }
11128 // unless the target has ctlz but not ctpop, in which case we use:
11129 // { return 32 - nlz(~x & (x-1)); }
11130 // Ref: "Hacker's Delight" by Henry Warren
11131 SDValue Tmp = DAG.getNode(
11132 ISD::AND, dl, VT, DAG.getNOT(dl, Op, VT),
11133 DAG.getNode(ISD::SUB, dl, VT, Op, DAG.getConstant(1, dl, VT)));
11134
11135 // If ISD::CTLZ is legal and CTPOP isn't, then do that instead.
11137 return DAG.getNode(ISD::SUB, dl, VT, DAG.getConstant(NumBitsPerElt, dl, VT),
11138 DAG.getNode(ISD::CTLZ, dl, VT, Tmp));
11139 }
11140
11141 return DAG.getNode(ISD::CTPOP, dl, VT, Tmp);
11142}
11143
11145 SDValue Op = Node->getOperand(0);
11146 SDValue Mask = Node->getOperand(1);
11147 SDValue VL = Node->getOperand(2);
11148 SDLoc dl(Node);
11149 EVT VT = Node->getValueType(0);
11150
11151 // Same as the vector part of expandCTTZ, use: popcount(~x & (x - 1))
11152 SDValue Not = DAG.getNode(ISD::VP_XOR, dl, VT, Op,
11153 DAG.getAllOnesConstant(dl, VT), Mask, VL);
11154 SDValue MinusOne = DAG.getNode(ISD::VP_SUB, dl, VT, Op,
11155 DAG.getConstant(1, dl, VT), Mask, VL);
11156 SDValue Tmp = DAG.getNode(ISD::VP_AND, dl, VT, Not, MinusOne, Mask, VL);
11157 return DAG.getNode(ISD::VP_CTPOP, dl, VT, Tmp, Mask, VL);
11158}
11159
11161 SelectionDAG &DAG) const {
11162 // %cond = to_bool_vec %source
11163 // %splat = splat /*val=*/VL
11164 // %tz = step_vector
11165 // %v = vp.select %cond, /*true=*/tz, /*false=*/%splat
11166 // %r = vp.reduce.umin %v
11167 SDLoc DL(N);
11168 SDValue Source = N->getOperand(0);
11169 SDValue Mask = N->getOperand(1);
11170 SDValue EVL = N->getOperand(2);
11171 EVT SrcVT = Source.getValueType();
11172 EVT ResVT = N->getValueType(0);
11173 EVT ResVecVT =
11174 EVT::getVectorVT(*DAG.getContext(), ResVT, SrcVT.getVectorElementCount());
11175
11176 // Convert to boolean vector.
11177 if (SrcVT.getScalarType() != MVT::i1) {
11178 SDValue AllZero = DAG.getConstant(0, DL, SrcVT);
11179 SrcVT = EVT::getVectorVT(*DAG.getContext(), MVT::i1,
11180 SrcVT.getVectorElementCount());
11181 Source = DAG.getNode(ISD::VP_SETCC, DL, SrcVT, Source, AllZero,
11182 DAG.getCondCode(ISD::SETNE), Mask, EVL);
11183 }
11184
11185 SDValue ExtEVL = DAG.getZExtOrTrunc(EVL, DL, ResVT);
11186 SDValue Splat = DAG.getSplat(ResVecVT, DL, ExtEVL);
11187 SDValue StepVec = DAG.getStepVector(DL, ResVecVT);
11188 SDValue Select =
11189 DAG.getNode(ISD::VP_SELECT, DL, ResVecVT, Source, StepVec, Splat, EVL);
11190 return DAG.getNode(ISD::VP_REDUCE_UMIN, DL, ResVT, ExtEVL, Select, Mask, EVL);
11191}
11192
11193/// Returns a type-legalized version of \p Mask as the first item in the
11194/// pair. The second item contains a type-legalized step vector that's
11195/// guaranteed to fit the number of elements in \p Mask.
11196/// If the stepvector would require splitting, returns an empty SDValue
11197/// as the second item to signal that the operation should be split instead.
11198static std::pair<SDValue, SDValue>
11200 SelectionDAG &DAG) {
11201 EVT MaskVT = Mask.getValueType();
11202 EVT BoolVT = MaskVT.getScalarType();
11203
11204 // Find a suitable type for a stepvector.
11205 // If zero is poison, we can assume the upper limit of the result is VF-1.
11206 ConstantRange VScaleRange(1, /*isFullSet=*/true); // Fixed length default.
11207 if (MaskVT.isScalableVector())
11208 VScaleRange = getVScaleRange(&DAG.getMachineFunction().getFunction(), 64);
11209 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
11210 uint64_t EltWidth = TLI.getBitWidthForCttzElements(
11211 EVT(TLI.getVectorIdxTy(DAG.getDataLayout())),
11212 MaskVT.getVectorElementCount(), ZeroIsPoison, &VScaleRange);
11213 // If the step vector element type is smaller than the mask element type,
11214 // use the mask type directly to avoid widening issues.
11215 EltWidth = std::max(EltWidth, BoolVT.getFixedSizeInBits());
11216 EVT StepVT = MVT::getIntegerVT(EltWidth);
11217 EVT StepVecVT = MaskVT.changeVectorElementType(*DAG.getContext(), StepVT);
11218
11219 // If promotion or widening is required to make the type legal, do it here.
11220 // Promotion of integers within LegalizeVectorOps is looking for types of
11221 // the same size but with a smaller number of larger elements, not the usual
11222 // larger size with the same number of larger elements.
11224 TLI.getTypeAction(*DAG.getContext(), StepVecVT);
11225 SDValue StepVec;
11226 if (TypeAction == TargetLowering::TypePromoteInteger) {
11227 StepVecVT = TLI.getTypeToTransformTo(*DAG.getContext(), StepVecVT);
11228 StepVec = DAG.getStepVector(DL, StepVecVT);
11229 } else if (TypeAction == TargetLowering::TypeWidenVector) {
11230 // For widening, the element count changes. Create a step vector with only
11231 // the original elements valid and zeros for padding. Also widen the mask.
11232 EVT WideVecVT = TLI.getTypeToTransformTo(*DAG.getContext(), StepVecVT);
11233 unsigned WideNumElts = WideVecVT.getVectorNumElements();
11234
11235 // Build widened step vector: <0, 1, ..., OrigNumElts-1, poison, poison, ..>
11236 SDValue OrigStepVec = DAG.getStepVector(DL, StepVecVT);
11237 SDValue UndefStep = DAG.getPOISON(WideVecVT);
11238 StepVec = DAG.getInsertSubvector(DL, UndefStep, OrigStepVec, 0);
11239
11240 // Widen mask: pad with zeros.
11241 EVT WideMaskVT = EVT::getVectorVT(*DAG.getContext(), BoolVT, WideNumElts);
11242 SDValue ZeroMask = DAG.getConstant(0, DL, WideMaskVT);
11243 Mask = DAG.getInsertSubvector(DL, ZeroMask, Mask, 0);
11244 } else if (TypeAction == TargetLowering::TypeSplitVector) {
11245 // The stepvector type would require splitting. Signal to the caller
11246 // that the operation should be split instead of expanded.
11247 return {Mask, SDValue()};
11248 } else {
11249 StepVec = DAG.getStepVector(DL, StepVecVT);
11250 }
11251
11252 return {Mask, StepVec};
11253}
11254
11256 SelectionDAG &DAG) const {
11257 SDLoc DL(N);
11258 auto [Mask, StepVec] = getLegalMaskAndStepVector(
11259 N->getOperand(0), /*ZeroIsPoison=*/true, DL, DAG);
11260
11261 // If StepVec is empty, the stepvector would require splitting.
11262 // Split the operation instead and let it be recursively legalized.
11263 if (!StepVec) {
11264 EVT MaskVT = N->getOperand(0).getValueType();
11265 EVT ResVT = N->getValueType(0);
11266
11267 // Split the mask
11268 auto [LoVT, HiVT] = DAG.GetSplitDestVTs(MaskVT);
11269 auto [MaskLo, MaskHi] = DAG.SplitVector(N->getOperand(0), DL);
11270
11271 // Create split VECTOR_FIND_LAST_ACTIVE operations
11272 SDValue LoResult =
11273 DAG.getNode(ISD::VECTOR_FIND_LAST_ACTIVE, DL, ResVT, MaskLo);
11274 SDValue HiResult =
11275 DAG.getNode(ISD::VECTOR_FIND_LAST_ACTIVE, DL, ResVT, MaskHi);
11276
11277 // Check if any lane is active in the high mask.
11278 SDValue AnyHiActive = DAG.getNode(ISD::VECREDUCE_OR, DL, MVT::i1, MaskHi);
11280 AnyHiActive, DL,
11281 getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), MVT::i1),
11282 MVT::i1);
11283
11284 // Adjust HiResult by adding the number of elements in Lo
11285 SDValue LoNumElts =
11286 DAG.getElementCount(DL, ResVT, LoVT.getVectorElementCount());
11287 SDValue AdjustedHiResult =
11288 DAG.getNode(ISD::ADD, DL, ResVT, HiResult, LoNumElts);
11289
11290 // Return: AnyHiActive ? AdjustedHiResult : LoResult;
11291 return DAG.getNode(ISD::SELECT, DL, ResVT, Cond, AdjustedHiResult,
11292 LoResult);
11293 }
11294
11295 EVT StepVecVT = StepVec.getValueType();
11296 EVT StepVT = StepVec.getValueType().getVectorElementType();
11297
11298 // Zero out lanes with inactive elements, then find the highest remaining
11299 // value from the stepvector.
11300 SDValue Zeroes = DAG.getConstant(0, DL, StepVecVT);
11301 SDValue ActiveElts = DAG.getSelect(DL, StepVecVT, Mask, StepVec, Zeroes);
11302 SDValue HighestIdx = DAG.getNode(ISD::VECREDUCE_UMAX, DL, StepVT, ActiveElts);
11303 return DAG.getZExtOrTrunc(HighestIdx, DL, N->getValueType(0));
11304}
11305
11307 SelectionDAG &DAG) const {
11308 SDLoc DL(N);
11309 EVT VT = N->getValueType(0);
11310 SDValue SourceValue = N->getOperand(0);
11311 SDValue SinkValue = N->getOperand(1);
11312 SDValue EltSizeInBytes = N->getOperand(2);
11313
11314 // Note: The lane offset is scalable if the mask is scalable.
11315 ElementCount LaneOffsetEC =
11316 ElementCount::get(N->getConstantOperandVal(3), VT.isScalableVT());
11317
11318 EVT AddrVT = SourceValue->getValueType(0);
11319 bool IsReadAfterWrite = N->getOpcode() == ISD::LOOP_DEPENDENCE_RAW_MASK;
11320
11321 EVT CmpVT =
11322 getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), AddrVT);
11323
11324 // Unsigned compare: Source >= Sink.
11325 SDValue SourceAheadOfOrEqualToSink =
11326 DAG.getSetCC(DL, CmpVT, SourceValue, SinkValue, ISD::SETUGE);
11327
11328 // Take the difference between the pointers and divided by the element size,
11329 // to see how many lanes separate them.
11330 SDValue Diff = DAG.getNode(ISD::SUB, DL, AddrVT, SinkValue, SourceValue);
11331
11332 // RAW_MASK: Diff = Source >= Sink ? (Source - Sink) : (Sink - Source)
11333 if (IsReadAfterWrite)
11334 Diff = DAG.getSelect(DL, AddrVT, SourceAheadOfOrEqualToSink,
11335 DAG.getNegative(Diff, DL, AddrVT), Diff);
11336
11337 Diff = DAG.getNode(ISD::SDIV, DL, AddrVT, Diff, EltSizeInBytes);
11338
11339 // The pointers do not alias if:
11340 // - Source >= Sink (WAR_MASK)
11341 // - Source == Sink (RAW_MASK)
11342 SDValue NoAlias = SourceAheadOfOrEqualToSink;
11343 if (IsReadAfterWrite)
11344 NoAlias = DAG.getSetCC(DL, CmpVT, SourceValue, SinkValue, ISD::SETEQ);
11345
11346 // The pointers do not alias if:
11347 // Lane + LaneOffset < Diff (WAR/RAW_MASK)
11348 SDValue LaneOffset = DAG.getElementCount(DL, AddrVT, LaneOffsetEC);
11349 SDValue MaskN = DAG.getSelect(
11350 DL, AddrVT, NoAlias,
11352 AddrVT),
11353 Diff);
11354
11355 return DAG.getNode(ISD::GET_ACTIVE_LANE_MASK, DL, VT, LaneOffset, MaskN);
11356}
11357
11359 bool IsNegative) const {
11360 SDLoc dl(N);
11361 EVT VT = N->getValueType(0);
11362 SDValue Op = N->getOperand(0);
11363
11364 // If expanding ABS_MIN_POISON, fall back to ABS if the target supports it.
11365 if (N->getOpcode() == ISD::ABS_MIN_POISON &&
11367 SDValue AbsVal = DAG.getNode(ISD::ABS, dl, VT, Op);
11368 if (IsNegative)
11369 return DAG.getNegative(AbsVal, dl, VT);
11370 return AbsVal;
11371 }
11372
11373 // abs(x) -> smax(x,sub(0,x))
11374 if (!IsNegative && isOperationLegal(ISD::SUB, VT) &&
11376 SDValue Zero = DAG.getConstant(0, dl, VT);
11377 Op = DAG.getFreeze(Op);
11378 return DAG.getNode(ISD::SMAX, dl, VT, Op,
11379 DAG.getNode(ISD::SUB, dl, VT, Zero, Op));
11380 }
11381
11382 // abs(x) -> umin(x,sub(0,x))
11383 if (!IsNegative && isOperationLegal(ISD::SUB, VT) &&
11385 SDValue Zero = DAG.getConstant(0, dl, VT);
11386 Op = DAG.getFreeze(Op);
11387 return DAG.getNode(ISD::UMIN, dl, VT, Op,
11388 DAG.getNode(ISD::SUB, dl, VT, Zero, Op));
11389 }
11390
11391 // 0 - abs(x) -> smin(x, sub(0,x))
11392 if (IsNegative && isOperationLegal(ISD::SUB, VT) &&
11394 SDValue Zero = DAG.getConstant(0, dl, VT);
11395 Op = DAG.getFreeze(Op);
11396 return DAG.getNode(ISD::SMIN, dl, VT, Op,
11397 DAG.getNode(ISD::SUB, dl, VT, Zero, Op));
11398 }
11399
11400 // Only expand vector types if we have the appropriate vector operations.
11401 if (VT.isVector() &&
11403 (!IsNegative && !isOperationLegalOrCustom(ISD::ADD, VT)) ||
11404 (IsNegative && !isOperationLegalOrCustom(ISD::SUB, VT)) ||
11406 return SDValue();
11407
11408 Op = DAG.getFreeze(Op);
11409 SDValue Shift = DAG.getNode(
11410 ISD::SRA, dl, VT, Op,
11411 DAG.getShiftAmountConstant(VT.getScalarSizeInBits() - 1, VT, dl));
11412 SDValue Xor = DAG.getNode(ISD::XOR, dl, VT, Op, Shift);
11413
11414 // abs(x) -> Y = sra (X, size(X)-1); sub (xor (X, Y), Y)
11415 if (!IsNegative)
11416 return DAG.getNode(ISD::SUB, dl, VT, Xor, Shift);
11417
11418 // 0 - abs(x) -> Y = sra (X, size(X)-1); sub (Y, xor (X, Y))
11419 return DAG.getNode(ISD::SUB, dl, VT, Shift, Xor);
11420}
11421
11423 SDLoc dl(N);
11424 EVT VT = N->getValueType(0);
11425 SDValue LHS = N->getOperand(0);
11426 SDValue RHS = N->getOperand(1);
11427 bool IsSigned = N->getOpcode() == ISD::ABDS;
11428
11429 // abds(lhs, rhs) -> sub(smax(lhs,rhs), smin(lhs,rhs))
11430 // abdu(lhs, rhs) -> sub(umax(lhs,rhs), umin(lhs,rhs))
11431 unsigned MaxOpc = IsSigned ? ISD::SMAX : ISD::UMAX;
11432 unsigned MinOpc = IsSigned ? ISD::SMIN : ISD::UMIN;
11433 if (isOperationLegal(MaxOpc, VT) && isOperationLegal(MinOpc, VT)) {
11434 LHS = DAG.getFreeze(LHS);
11435 RHS = DAG.getFreeze(RHS);
11436 SDValue Max = DAG.getNode(MaxOpc, dl, VT, LHS, RHS);
11437 SDValue Min = DAG.getNode(MinOpc, dl, VT, LHS, RHS);
11438 return DAG.getNode(ISD::SUB, dl, VT, Max, Min);
11439 }
11440
11441 // abdu(lhs, rhs) -> or(usubsat(lhs,rhs), usubsat(rhs,lhs))
11442 if (!IsSigned && isOperationLegal(ISD::USUBSAT, VT)) {
11443 LHS = DAG.getFreeze(LHS);
11444 RHS = DAG.getFreeze(RHS);
11445 return DAG.getNode(ISD::OR, dl, VT,
11446 DAG.getNode(ISD::USUBSAT, dl, VT, LHS, RHS),
11447 DAG.getNode(ISD::USUBSAT, dl, VT, RHS, LHS));
11448 }
11449
11450 // If the subtract doesn't overflow then just use abs(sub())
11451 bool IsNonNegative = DAG.SignBitIsZero(LHS) && DAG.SignBitIsZero(RHS);
11452
11453 if (DAG.willNotOverflowSub(IsSigned || IsNonNegative, LHS, RHS))
11454 return DAG.getNode(ISD::ABS, dl, VT,
11455 DAG.getNode(ISD::SUB, dl, VT, LHS, RHS));
11456
11457 if (DAG.willNotOverflowSub(IsSigned || IsNonNegative, RHS, LHS))
11458 return DAG.getNode(ISD::ABS, dl, VT,
11459 DAG.getNode(ISD::SUB, dl, VT, RHS, LHS));
11460
11461 EVT CCVT = getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
11463 LHS = DAG.getFreeze(LHS);
11464 RHS = DAG.getFreeze(RHS);
11465 SDValue Cmp = DAG.getSetCC(dl, CCVT, LHS, RHS, CC);
11466
11467 // Branchless expansion iff cmp result is allbits:
11468 // abds(lhs, rhs) -> sub(sgt(lhs, rhs), xor(sgt(lhs, rhs), sub(lhs, rhs)))
11469 // abdu(lhs, rhs) -> sub(ugt(lhs, rhs), xor(ugt(lhs, rhs), sub(lhs, rhs)))
11470 if (CCVT == VT && getBooleanContents(VT) == ZeroOrNegativeOneBooleanContent) {
11471 SDValue Diff = DAG.getNode(ISD::SUB, dl, VT, LHS, RHS);
11472 SDValue Xor = DAG.getNode(ISD::XOR, dl, VT, Diff, Cmp);
11473 return DAG.getNode(ISD::SUB, dl, VT, Cmp, Xor);
11474 }
11475
11476 // Similar to the branchless expansion, if we don't prefer selects, use the
11477 // (sign-extended) usubo overflow flag if the (scalar) type is illegal as this
11478 // is more likely to legalize cleanly: abdu(lhs, rhs) -> sub(xor(sub(lhs,
11479 // rhs), uof(lhs, rhs)), uof(lhs, rhs))
11480 if (!IsSigned && VT.isScalarInteger() && !isTypeLegal(VT) &&
11482 SDValue USubO =
11483 DAG.getNode(ISD::USUBO, dl, DAG.getVTList(VT, MVT::i1), {LHS, RHS});
11484 SDValue Cmp = DAG.getNode(ISD::SIGN_EXTEND, dl, VT, USubO.getValue(1));
11485 SDValue Xor = DAG.getNode(ISD::XOR, dl, VT, USubO.getValue(0), Cmp);
11486 return DAG.getNode(ISD::SUB, dl, VT, Xor, Cmp);
11487 }
11488
11489 // FIXME: Should really try to split the vector in case it's legal on a
11490 // subvector.
11492 return DAG.UnrollVectorOp(N);
11493
11494 // abds(lhs, rhs) -> select(sgt(lhs,rhs), sub(lhs,rhs), sub(rhs,lhs))
11495 // abdu(lhs, rhs) -> select(ugt(lhs,rhs), sub(lhs,rhs), sub(rhs,lhs))
11496 return DAG.getSelect(dl, VT, Cmp, DAG.getNode(ISD::SUB, dl, VT, LHS, RHS),
11497 DAG.getNode(ISD::SUB, dl, VT, RHS, LHS));
11498}
11499
11501 SDLoc dl(N);
11502 EVT VT = N->getValueType(0);
11503 SDValue LHS = N->getOperand(0);
11504 SDValue RHS = N->getOperand(1);
11505
11506 unsigned Opc = N->getOpcode();
11507 bool IsFloor = Opc == ISD::AVGFLOORS || Opc == ISD::AVGFLOORU;
11508 bool IsSigned = Opc == ISD::AVGCEILS || Opc == ISD::AVGFLOORS;
11509 unsigned SumOpc = IsFloor ? ISD::ADD : ISD::SUB;
11510 unsigned SignOpc = IsFloor ? ISD::AND : ISD::OR;
11511 unsigned ShiftOpc = IsSigned ? ISD::SRA : ISD::SRL;
11512 unsigned ExtOpc = IsSigned ? ISD::SIGN_EXTEND : ISD::ZERO_EXTEND;
11514 Opc == ISD::AVGFLOORU || Opc == ISD::AVGCEILU) &&
11515 "Unknown AVG node");
11516
11517 // If the operands are already extended, we can add+shift.
11518 bool IsExt =
11519 (IsSigned && DAG.ComputeNumSignBits(LHS) >= 2 &&
11520 DAG.ComputeNumSignBits(RHS) >= 2) ||
11521 (!IsSigned && DAG.computeKnownBits(LHS).countMinLeadingZeros() >= 1 &&
11522 DAG.computeKnownBits(RHS).countMinLeadingZeros() >= 1);
11523 if (IsExt) {
11524 SDValue Sum = DAG.getNode(ISD::ADD, dl, VT, LHS, RHS);
11525 if (!IsFloor)
11526 Sum = DAG.getNode(ISD::ADD, dl, VT, Sum, DAG.getConstant(1, dl, VT));
11527 return DAG.getNode(ShiftOpc, dl, VT, Sum,
11528 DAG.getShiftAmountConstant(1, VT, dl));
11529 }
11530
11531 // For scalars, see if we can efficiently extend/truncate to use add+shift.
11532 if (VT.isScalarInteger()) {
11533 EVT ExtVT = VT.widenIntegerElementType(*DAG.getContext());
11534 if (isTypeLegal(ExtVT) && isTruncateFree(ExtVT, VT)) {
11535 LHS = DAG.getNode(ExtOpc, dl, ExtVT, LHS);
11536 RHS = DAG.getNode(ExtOpc, dl, ExtVT, RHS);
11537 SDValue Avg = DAG.getNode(ISD::ADD, dl, ExtVT, LHS, RHS);
11538 if (!IsFloor)
11539 Avg = DAG.getNode(ISD::ADD, dl, ExtVT, Avg,
11540 DAG.getConstant(1, dl, ExtVT));
11541 // Just use SRL as we will be truncating away the extended sign bits.
11542 Avg = DAG.getNode(ISD::SRL, dl, ExtVT, Avg,
11543 DAG.getShiftAmountConstant(1, ExtVT, dl));
11544 return DAG.getNode(ISD::TRUNCATE, dl, VT, Avg);
11545 }
11546 }
11547
11548 // avgflooru(lhs, rhs) -> or(lshr(add(lhs, rhs),1),shl(overflow, typesize-1))
11549 if (Opc == ISD::AVGFLOORU && VT.isScalarInteger() && !isTypeLegal(VT) &&
11552 SDValue UAddWithOverflow =
11553 DAG.getNode(ISD::UADDO, dl, DAG.getVTList(VT, MVT::i1), {RHS, LHS});
11554
11555 SDValue Sum = UAddWithOverflow.getValue(0);
11556 SDValue Overflow = UAddWithOverflow.getValue(1);
11557
11558 // Right shift the sum by 1
11559 SDValue LShrVal = DAG.getNode(ISD::SRL, dl, VT, Sum,
11560 DAG.getShiftAmountConstant(1, VT, dl));
11561
11562 SDValue ZeroExtOverflow = DAG.getNode(ISD::ANY_EXTEND, dl, VT, Overflow);
11563 SDValue OverflowShl = DAG.getNode(
11564 ISD::SHL, dl, VT, ZeroExtOverflow,
11565 DAG.getShiftAmountConstant(VT.getScalarSizeInBits() - 1, VT, dl));
11566
11567 return DAG.getNode(ISD::OR, dl, VT, LShrVal, OverflowShl);
11568 }
11569
11570 // avgceils(lhs, rhs) -> sub(or(lhs,rhs),ashr(xor(lhs,rhs),1))
11571 // avgceilu(lhs, rhs) -> sub(or(lhs,rhs),lshr(xor(lhs,rhs),1))
11572 // avgfloors(lhs, rhs) -> add(and(lhs,rhs),ashr(xor(lhs,rhs),1))
11573 // avgflooru(lhs, rhs) -> add(and(lhs,rhs),lshr(xor(lhs,rhs),1))
11574 LHS = DAG.getFreeze(LHS);
11575 RHS = DAG.getFreeze(RHS);
11576 SDValue Sign = DAG.getNode(SignOpc, dl, VT, LHS, RHS);
11577 SDValue Xor = DAG.getNode(ISD::XOR, dl, VT, LHS, RHS);
11578 SDValue Shift =
11579 DAG.getNode(ShiftOpc, dl, VT, Xor, DAG.getShiftAmountConstant(1, VT, dl));
11580 return DAG.getNode(SumOpc, dl, VT, Sign, Shift);
11581}
11582
11584 SDLoc dl(N);
11585 EVT VT = N->getValueType(0);
11586 SDValue Op = N->getOperand(0);
11587
11588 if (!VT.isSimple())
11589 return SDValue();
11590
11591 EVT SHVT = getShiftAmountTy(VT, DAG.getDataLayout());
11592 SDValue Tmp1, Tmp2, Tmp3, Tmp4, Tmp5, Tmp6, Tmp7, Tmp8;
11593 switch (VT.getSimpleVT().getScalarType().SimpleTy) {
11594 default:
11595 return SDValue();
11596 case MVT::i16:
11597 // Use a rotate by 8. This can be further expanded if necessary.
11598 return DAG.getNode(ISD::ROTL, dl, VT, Op, DAG.getConstant(8, dl, SHVT));
11599 case MVT::i32:
11600 // This is meant for ARM specifically, which has ROTR but no ROTL.
11601 // t = x ^ rotr(x, 16)
11602 // t = bic(t, 0x00ff0000)
11603 // t = lshr(t, 8)
11604 // x = t ^ rotr(x, 8)
11606 SDValue Rotr16 =
11607 DAG.getNode(ISD::ROTR, dl, VT, Op, DAG.getConstant(16, dl, SHVT));
11608 SDValue Tmp = DAG.getNode(ISD::XOR, dl, VT, Op, Rotr16);
11609 Tmp = DAG.getNode(ISD::AND, dl, VT, Tmp,
11610 DAG.getConstant(0xFF00FFFF, dl, VT));
11611 Tmp = DAG.getNode(ISD::SRL, dl, VT, Tmp, DAG.getConstant(8, dl, SHVT));
11612 SDValue Rotr8 =
11613 DAG.getNode(ISD::ROTR, dl, VT, Op, DAG.getConstant(8, dl, SHVT));
11614 return DAG.getNode(ISD::XOR, dl, VT, Tmp, Rotr8);
11615 }
11616 Tmp4 = DAG.getNode(ISD::SHL, dl, VT, Op, DAG.getConstant(24, dl, SHVT));
11617 Tmp3 = DAG.getNode(ISD::AND, dl, VT, Op,
11618 DAG.getConstant(0xFF00, dl, VT));
11619 Tmp3 = DAG.getNode(ISD::SHL, dl, VT, Tmp3, DAG.getConstant(8, dl, SHVT));
11620 Tmp2 = DAG.getNode(ISD::SRL, dl, VT, Op, DAG.getConstant(8, dl, SHVT));
11621 Tmp2 = DAG.getNode(ISD::AND, dl, VT, Tmp2, DAG.getConstant(0xFF00, dl, VT));
11622 Tmp1 = DAG.getNode(ISD::SRL, dl, VT, Op, DAG.getConstant(24, dl, SHVT));
11623 Tmp4 = DAG.getNode(ISD::OR, dl, VT, Tmp4, Tmp3);
11624 Tmp2 = DAG.getNode(ISD::OR, dl, VT, Tmp2, Tmp1);
11625 return DAG.getNode(ISD::OR, dl, VT, Tmp4, Tmp2);
11626 case MVT::i64:
11627 Tmp8 = DAG.getNode(ISD::SHL, dl, VT, Op, DAG.getConstant(56, dl, SHVT));
11628 Tmp7 = DAG.getNode(ISD::AND, dl, VT, Op,
11629 DAG.getConstant(255ULL<<8, dl, VT));
11630 Tmp7 = DAG.getNode(ISD::SHL, dl, VT, Tmp7, DAG.getConstant(40, dl, SHVT));
11631 Tmp6 = DAG.getNode(ISD::AND, dl, VT, Op,
11632 DAG.getConstant(255ULL<<16, dl, VT));
11633 Tmp6 = DAG.getNode(ISD::SHL, dl, VT, Tmp6, DAG.getConstant(24, dl, SHVT));
11634 Tmp5 = DAG.getNode(ISD::AND, dl, VT, Op,
11635 DAG.getConstant(255ULL<<24, dl, VT));
11636 Tmp5 = DAG.getNode(ISD::SHL, dl, VT, Tmp5, DAG.getConstant(8, dl, SHVT));
11637 Tmp4 = DAG.getNode(ISD::SRL, dl, VT, Op, DAG.getConstant(8, dl, SHVT));
11638 Tmp4 = DAG.getNode(ISD::AND, dl, VT, Tmp4,
11639 DAG.getConstant(255ULL<<24, dl, VT));
11640 Tmp3 = DAG.getNode(ISD::SRL, dl, VT, Op, DAG.getConstant(24, dl, SHVT));
11641 Tmp3 = DAG.getNode(ISD::AND, dl, VT, Tmp3,
11642 DAG.getConstant(255ULL<<16, dl, VT));
11643 Tmp2 = DAG.getNode(ISD::SRL, dl, VT, Op, DAG.getConstant(40, dl, SHVT));
11644 Tmp2 = DAG.getNode(ISD::AND, dl, VT, Tmp2,
11645 DAG.getConstant(255ULL<<8, dl, VT));
11646 Tmp1 = DAG.getNode(ISD::SRL, dl, VT, Op, DAG.getConstant(56, dl, SHVT));
11647 Tmp8 = DAG.getNode(ISD::OR, dl, VT, Tmp8, Tmp7);
11648 Tmp6 = DAG.getNode(ISD::OR, dl, VT, Tmp6, Tmp5);
11649 Tmp4 = DAG.getNode(ISD::OR, dl, VT, Tmp4, Tmp3);
11650 Tmp2 = DAG.getNode(ISD::OR, dl, VT, Tmp2, Tmp1);
11651 Tmp8 = DAG.getNode(ISD::OR, dl, VT, Tmp8, Tmp6);
11652 Tmp4 = DAG.getNode(ISD::OR, dl, VT, Tmp4, Tmp2);
11653 return DAG.getNode(ISD::OR, dl, VT, Tmp8, Tmp4);
11654 }
11655}
11656
11658 SDLoc dl(N);
11659 EVT VT = N->getValueType(0);
11660 SDValue Op = N->getOperand(0);
11661 SDValue Mask = N->getOperand(1);
11662 SDValue EVL = N->getOperand(2);
11663
11664 if (!VT.isSimple())
11665 return SDValue();
11666
11667 EVT SHVT = getShiftAmountTy(VT, DAG.getDataLayout());
11668 SDValue Tmp1, Tmp2, Tmp3, Tmp4, Tmp5, Tmp6, Tmp7, Tmp8;
11669 switch (VT.getSimpleVT().getScalarType().SimpleTy) {
11670 default:
11671 return SDValue();
11672 case MVT::i16:
11673 Tmp1 = DAG.getNode(ISD::VP_SHL, dl, VT, Op, DAG.getConstant(8, dl, SHVT),
11674 Mask, EVL);
11675 Tmp2 = DAG.getNode(ISD::VP_SRL, dl, VT, Op, DAG.getConstant(8, dl, SHVT),
11676 Mask, EVL);
11677 return DAG.getNode(ISD::VP_OR, dl, VT, Tmp1, Tmp2, Mask, EVL);
11678 case MVT::i32:
11679 Tmp4 = DAG.getNode(ISD::VP_SHL, dl, VT, Op, DAG.getConstant(24, dl, SHVT),
11680 Mask, EVL);
11681 Tmp3 = DAG.getNode(ISD::VP_AND, dl, VT, Op, DAG.getConstant(0xFF00, dl, VT),
11682 Mask, EVL);
11683 Tmp3 = DAG.getNode(ISD::VP_SHL, dl, VT, Tmp3, DAG.getConstant(8, dl, SHVT),
11684 Mask, EVL);
11685 Tmp2 = DAG.getNode(ISD::VP_SRL, dl, VT, Op, DAG.getConstant(8, dl, SHVT),
11686 Mask, EVL);
11687 Tmp2 = DAG.getNode(ISD::VP_AND, dl, VT, Tmp2,
11688 DAG.getConstant(0xFF00, dl, VT), Mask, EVL);
11689 Tmp1 = DAG.getNode(ISD::VP_SRL, dl, VT, Op, DAG.getConstant(24, dl, SHVT),
11690 Mask, EVL);
11691 Tmp4 = DAG.getNode(ISD::VP_OR, dl, VT, Tmp4, Tmp3, Mask, EVL);
11692 Tmp2 = DAG.getNode(ISD::VP_OR, dl, VT, Tmp2, Tmp1, Mask, EVL);
11693 return DAG.getNode(ISD::VP_OR, dl, VT, Tmp4, Tmp2, Mask, EVL);
11694 case MVT::i64:
11695 Tmp8 = DAG.getNode(ISD::VP_SHL, dl, VT, Op, DAG.getConstant(56, dl, SHVT),
11696 Mask, EVL);
11697 Tmp7 = DAG.getNode(ISD::VP_AND, dl, VT, Op,
11698 DAG.getConstant(255ULL << 8, dl, VT), Mask, EVL);
11699 Tmp7 = DAG.getNode(ISD::VP_SHL, dl, VT, Tmp7, DAG.getConstant(40, dl, SHVT),
11700 Mask, EVL);
11701 Tmp6 = DAG.getNode(ISD::VP_AND, dl, VT, Op,
11702 DAG.getConstant(255ULL << 16, dl, VT), Mask, EVL);
11703 Tmp6 = DAG.getNode(ISD::VP_SHL, dl, VT, Tmp6, DAG.getConstant(24, dl, SHVT),
11704 Mask, EVL);
11705 Tmp5 = DAG.getNode(ISD::VP_AND, dl, VT, Op,
11706 DAG.getConstant(255ULL << 24, dl, VT), Mask, EVL);
11707 Tmp5 = DAG.getNode(ISD::VP_SHL, dl, VT, Tmp5, DAG.getConstant(8, dl, SHVT),
11708 Mask, EVL);
11709 Tmp4 = DAG.getNode(ISD::VP_SRL, dl, VT, Op, DAG.getConstant(8, dl, SHVT),
11710 Mask, EVL);
11711 Tmp4 = DAG.getNode(ISD::VP_AND, dl, VT, Tmp4,
11712 DAG.getConstant(255ULL << 24, dl, VT), Mask, EVL);
11713 Tmp3 = DAG.getNode(ISD::VP_SRL, dl, VT, Op, DAG.getConstant(24, dl, SHVT),
11714 Mask, EVL);
11715 Tmp3 = DAG.getNode(ISD::VP_AND, dl, VT, Tmp3,
11716 DAG.getConstant(255ULL << 16, dl, VT), Mask, EVL);
11717 Tmp2 = DAG.getNode(ISD::VP_SRL, dl, VT, Op, DAG.getConstant(40, dl, SHVT),
11718 Mask, EVL);
11719 Tmp2 = DAG.getNode(ISD::VP_AND, dl, VT, Tmp2,
11720 DAG.getConstant(255ULL << 8, dl, VT), Mask, EVL);
11721 Tmp1 = DAG.getNode(ISD::VP_SRL, dl, VT, Op, DAG.getConstant(56, dl, SHVT),
11722 Mask, EVL);
11723 Tmp8 = DAG.getNode(ISD::VP_OR, dl, VT, Tmp8, Tmp7, Mask, EVL);
11724 Tmp6 = DAG.getNode(ISD::VP_OR, dl, VT, Tmp6, Tmp5, Mask, EVL);
11725 Tmp4 = DAG.getNode(ISD::VP_OR, dl, VT, Tmp4, Tmp3, Mask, EVL);
11726 Tmp2 = DAG.getNode(ISD::VP_OR, dl, VT, Tmp2, Tmp1, Mask, EVL);
11727 Tmp8 = DAG.getNode(ISD::VP_OR, dl, VT, Tmp8, Tmp6, Mask, EVL);
11728 Tmp4 = DAG.getNode(ISD::VP_OR, dl, VT, Tmp4, Tmp2, Mask, EVL);
11729 return DAG.getNode(ISD::VP_OR, dl, VT, Tmp8, Tmp4, Mask, EVL);
11730 }
11731}
11732
11734 SDLoc dl(N);
11735 EVT VT = N->getValueType(0);
11736 SDValue Op = N->getOperand(0);
11737 EVT SHVT = getShiftAmountTy(VT, DAG.getDataLayout());
11738 unsigned Sz = VT.getScalarSizeInBits();
11739
11740 SDValue Tmp, Tmp2, Tmp3;
11741
11742 // If we can, perform BSWAP first and then the mask+swap the i4, then i2
11743 // and finally the i1 pairs.
11744 // TODO: We can easily support i4/i2 legal types if any target ever does.
11745 if (Sz >= 8 && isPowerOf2_32(Sz)) {
11746 // Create the masks - repeating the pattern every byte.
11747 APInt Mask4 = APInt::getSplat(Sz, APInt(8, 0x0F));
11748 APInt Mask2 = APInt::getSplat(Sz, APInt(8, 0x33));
11749 APInt Mask1 = APInt::getSplat(Sz, APInt(8, 0x55));
11750
11751 // BSWAP if the type is wider than a single byte.
11752 Tmp = (Sz > 8 ? DAG.getNode(ISD::BSWAP, dl, VT, Op) : Op);
11753
11754 // swap i4: ((V >> 4) & 0x0F) | ((V & 0x0F) << 4)
11755 Tmp2 = DAG.getNode(ISD::SRL, dl, VT, Tmp, DAG.getConstant(4, dl, SHVT));
11756 Tmp2 = DAG.getNode(ISD::AND, dl, VT, Tmp2, DAG.getConstant(Mask4, dl, VT));
11757 Tmp3 = DAG.getNode(ISD::AND, dl, VT, Tmp, DAG.getConstant(Mask4, dl, VT));
11758 Tmp3 = DAG.getNode(ISD::SHL, dl, VT, Tmp3, DAG.getConstant(4, dl, SHVT));
11759 Tmp = DAG.getNode(ISD::OR, dl, VT, Tmp2, Tmp3);
11760
11761 // swap i2: ((V >> 2) & 0x33) | ((V & 0x33) << 2)
11762 Tmp2 = DAG.getNode(ISD::SRL, dl, VT, Tmp, DAG.getConstant(2, dl, SHVT));
11763 Tmp2 = DAG.getNode(ISD::AND, dl, VT, Tmp2, DAG.getConstant(Mask2, dl, VT));
11764 Tmp3 = DAG.getNode(ISD::AND, dl, VT, Tmp, DAG.getConstant(Mask2, dl, VT));
11765 Tmp3 = DAG.getNode(ISD::SHL, dl, VT, Tmp3, DAG.getConstant(2, dl, SHVT));
11766 Tmp = DAG.getNode(ISD::OR, dl, VT, Tmp2, Tmp3);
11767
11768 // swap i1: ((V >> 1) & 0x55) | ((V & 0x55) << 1)
11769 Tmp2 = DAG.getNode(ISD::SRL, dl, VT, Tmp, DAG.getConstant(1, dl, SHVT));
11770 Tmp2 = DAG.getNode(ISD::AND, dl, VT, Tmp2, DAG.getConstant(Mask1, dl, VT));
11771 Tmp3 = DAG.getNode(ISD::AND, dl, VT, Tmp, DAG.getConstant(Mask1, dl, VT));
11772 Tmp3 = DAG.getNode(ISD::SHL, dl, VT, Tmp3, DAG.getConstant(1, dl, SHVT));
11773 Tmp = DAG.getNode(ISD::OR, dl, VT, Tmp2, Tmp3);
11774 return Tmp;
11775 }
11776
11777 Tmp = DAG.getConstant(0, dl, VT);
11778 for (unsigned I = 0, J = Sz-1; I < Sz; ++I, --J) {
11779 if (I < J)
11780 Tmp2 =
11781 DAG.getNode(ISD::SHL, dl, VT, Op, DAG.getConstant(J - I, dl, SHVT));
11782 else
11783 Tmp2 =
11784 DAG.getNode(ISD::SRL, dl, VT, Op, DAG.getConstant(I - J, dl, SHVT));
11785
11786 APInt Shift = APInt::getOneBitSet(Sz, J);
11787 Tmp2 = DAG.getNode(ISD::AND, dl, VT, Tmp2, DAG.getConstant(Shift, dl, VT));
11788 Tmp = DAG.getNode(ISD::OR, dl, VT, Tmp, Tmp2);
11789 }
11790
11791 return Tmp;
11792}
11793
11795 assert(N->getOpcode() == ISD::VP_BITREVERSE);
11796
11797 SDLoc dl(N);
11798 EVT VT = N->getValueType(0);
11799 SDValue Op = N->getOperand(0);
11800 SDValue Mask = N->getOperand(1);
11801 SDValue EVL = N->getOperand(2);
11802 EVT SHVT = getShiftAmountTy(VT, DAG.getDataLayout());
11803 unsigned Sz = VT.getScalarSizeInBits();
11804
11805 SDValue Tmp, Tmp2, Tmp3;
11806
11807 // If we can, perform BSWAP first and then the mask+swap the i4, then i2
11808 // and finally the i1 pairs.
11809 // TODO: We can easily support i4/i2 legal types if any target ever does.
11810 if (Sz >= 8 && isPowerOf2_32(Sz)) {
11811 // Create the masks - repeating the pattern every byte.
11812 APInt Mask4 = APInt::getSplat(Sz, APInt(8, 0x0F));
11813 APInt Mask2 = APInt::getSplat(Sz, APInt(8, 0x33));
11814 APInt Mask1 = APInt::getSplat(Sz, APInt(8, 0x55));
11815
11816 // BSWAP if the type is wider than a single byte.
11817 Tmp = (Sz > 8 ? DAG.getNode(ISD::VP_BSWAP, dl, VT, Op, Mask, EVL) : Op);
11818
11819 // swap i4: ((V >> 4) & 0x0F) | ((V & 0x0F) << 4)
11820 Tmp2 = DAG.getNode(ISD::VP_SRL, dl, VT, Tmp, DAG.getConstant(4, dl, SHVT),
11821 Mask, EVL);
11822 Tmp2 = DAG.getNode(ISD::VP_AND, dl, VT, Tmp2,
11823 DAG.getConstant(Mask4, dl, VT), Mask, EVL);
11824 Tmp3 = DAG.getNode(ISD::VP_AND, dl, VT, Tmp, DAG.getConstant(Mask4, dl, VT),
11825 Mask, EVL);
11826 Tmp3 = DAG.getNode(ISD::VP_SHL, dl, VT, Tmp3, DAG.getConstant(4, dl, SHVT),
11827 Mask, EVL);
11828 Tmp = DAG.getNode(ISD::VP_OR, dl, VT, Tmp2, Tmp3, Mask, EVL);
11829
11830 // swap i2: ((V >> 2) & 0x33) | ((V & 0x33) << 2)
11831 Tmp2 = DAG.getNode(ISD::VP_SRL, dl, VT, Tmp, DAG.getConstant(2, dl, SHVT),
11832 Mask, EVL);
11833 Tmp2 = DAG.getNode(ISD::VP_AND, dl, VT, Tmp2,
11834 DAG.getConstant(Mask2, dl, VT), Mask, EVL);
11835 Tmp3 = DAG.getNode(ISD::VP_AND, dl, VT, Tmp, DAG.getConstant(Mask2, dl, VT),
11836 Mask, EVL);
11837 Tmp3 = DAG.getNode(ISD::VP_SHL, dl, VT, Tmp3, DAG.getConstant(2, dl, SHVT),
11838 Mask, EVL);
11839 Tmp = DAG.getNode(ISD::VP_OR, dl, VT, Tmp2, Tmp3, Mask, EVL);
11840
11841 // swap i1: ((V >> 1) & 0x55) | ((V & 0x55) << 1)
11842 Tmp2 = DAG.getNode(ISD::VP_SRL, dl, VT, Tmp, DAG.getConstant(1, dl, SHVT),
11843 Mask, EVL);
11844 Tmp2 = DAG.getNode(ISD::VP_AND, dl, VT, Tmp2,
11845 DAG.getConstant(Mask1, dl, VT), Mask, EVL);
11846 Tmp3 = DAG.getNode(ISD::VP_AND, dl, VT, Tmp, DAG.getConstant(Mask1, dl, VT),
11847 Mask, EVL);
11848 Tmp3 = DAG.getNode(ISD::VP_SHL, dl, VT, Tmp3, DAG.getConstant(1, dl, SHVT),
11849 Mask, EVL);
11850 Tmp = DAG.getNode(ISD::VP_OR, dl, VT, Tmp2, Tmp3, Mask, EVL);
11851 return Tmp;
11852 }
11853 return SDValue();
11854}
11855
11856std::pair<SDValue, SDValue>
11858 SelectionDAG &DAG) const {
11859 SDLoc SL(LD);
11860 SDValue Chain = LD->getChain();
11861 SDValue BasePTR = LD->getBasePtr();
11862 EVT SrcVT = LD->getMemoryVT();
11863 EVT DstVT = LD->getValueType(0);
11864 ISD::LoadExtType ExtType = LD->getExtensionType();
11865
11866 if (SrcVT.isScalableVector())
11867 report_fatal_error("Cannot scalarize scalable vector loads");
11868
11869 unsigned NumElem = SrcVT.getVectorNumElements();
11870
11871 EVT SrcEltVT = SrcVT.getScalarType();
11872 EVT DstEltVT = DstVT.getScalarType();
11873
11874 // A vector must always be stored in memory as-is, i.e. without any padding
11875 // between the elements, since various code depend on it, e.g. in the
11876 // handling of a bitcast of a vector type to int, which may be done with a
11877 // vector store followed by an integer load. A vector that does not have
11878 // elements that are byte-sized must therefore be stored as an integer
11879 // built out of the extracted vector elements.
11880 if (!SrcEltVT.isByteSized()) {
11881 unsigned NumLoadBits = SrcVT.getStoreSizeInBits();
11882 EVT LoadVT = EVT::getIntegerVT(*DAG.getContext(), NumLoadBits);
11883
11884 unsigned NumSrcBits = SrcVT.getSizeInBits();
11885 EVT SrcIntVT = EVT::getIntegerVT(*DAG.getContext(), NumSrcBits);
11886
11887 unsigned SrcEltBits = SrcEltVT.getSizeInBits();
11888 SDValue SrcEltBitMask = DAG.getConstant(
11889 APInt::getLowBitsSet(NumLoadBits, SrcEltBits), SL, LoadVT);
11890
11891 // Load the whole vector and avoid masking off the top bits as it makes
11892 // the codegen worse.
11893 SDValue Load =
11894 DAG.getExtLoad(ISD::EXTLOAD, SL, LoadVT, Chain, BasePTR,
11895 LD->getPointerInfo(), SrcIntVT, LD->getBaseAlign(),
11896 LD->getMemOperand()->getFlags(), LD->getAAInfo());
11897
11899 for (unsigned Idx = 0; Idx < NumElem; ++Idx) {
11900 unsigned ShiftIntoIdx =
11901 (DAG.getDataLayout().isBigEndian() ? (NumElem - 1) - Idx : Idx);
11902 SDValue ShiftAmount = DAG.getShiftAmountConstant(
11903 ShiftIntoIdx * SrcEltVT.getSizeInBits(), LoadVT, SL);
11904 SDValue ShiftedElt = DAG.getNode(ISD::SRL, SL, LoadVT, Load, ShiftAmount);
11905 SDValue Elt =
11906 DAG.getNode(ISD::AND, SL, LoadVT, ShiftedElt, SrcEltBitMask);
11907 SDValue Scalar = DAG.getNode(ISD::TRUNCATE, SL, SrcEltVT, Elt);
11908
11909 if (ExtType != ISD::NON_EXTLOAD) {
11910 unsigned ExtendOp = ISD::getExtForLoadExtType(false, ExtType);
11911 Scalar = DAG.getNode(ExtendOp, SL, DstEltVT, Scalar);
11912 }
11913
11914 Vals.push_back(Scalar);
11915 }
11916
11917 SDValue Value = DAG.getBuildVector(DstVT, SL, Vals);
11918 return std::make_pair(Value, Load.getValue(1));
11919 }
11920
11921 unsigned Stride = SrcEltVT.getSizeInBits() / 8;
11922 assert(SrcEltVT.isByteSized());
11923
11925 SmallVector<SDValue, 8> LoadChains;
11926
11927 for (unsigned Idx = 0; Idx < NumElem; ++Idx) {
11928 SDValue ScalarLoad = DAG.getExtLoad(
11929 ExtType, SL, DstEltVT, Chain, BasePTR,
11930 LD->getPointerInfo().getWithOffset(Idx * Stride), SrcEltVT,
11931 LD->getBaseAlign(), LD->getMemOperand()->getFlags(), LD->getAAInfo());
11932
11933 BasePTR = DAG.getObjectPtrOffset(SL, BasePTR, TypeSize::getFixed(Stride));
11934
11935 Vals.push_back(ScalarLoad.getValue(0));
11936 LoadChains.push_back(ScalarLoad.getValue(1));
11937 }
11938
11939 SDValue NewChain = DAG.getNode(ISD::TokenFactor, SL, MVT::Other, LoadChains);
11940 SDValue Value = DAG.getBuildVector(DstVT, SL, Vals);
11941
11942 return std::make_pair(Value, NewChain);
11943}
11944
11946 SelectionDAG &DAG) const {
11947 SDLoc SL(ST);
11948
11949 SDValue Chain = ST->getChain();
11950 SDValue BasePtr = ST->getBasePtr();
11951 SDValue Value = ST->getValue();
11952 EVT StVT = ST->getMemoryVT();
11953
11954 if (StVT.isScalableVector())
11955 report_fatal_error("Cannot scalarize scalable vector stores");
11956
11957 // The type of the data we want to save
11958 EVT RegVT = Value.getValueType();
11959 EVT RegSclVT = RegVT.getScalarType();
11960
11961 // The type of data as saved in memory.
11962 EVT MemSclVT = StVT.getScalarType();
11963
11964 unsigned NumElem = StVT.getVectorNumElements();
11965
11966 // A vector must always be stored in memory as-is, i.e. without any padding
11967 // between the elements, since various code depend on it, e.g. in the
11968 // handling of a bitcast of a vector type to int, which may be done with a
11969 // vector store followed by an integer load. A vector that does not have
11970 // elements that are byte-sized must therefore be stored as an integer
11971 // built out of the extracted vector elements.
11972 if (!MemSclVT.isByteSized()) {
11973 unsigned NumBits = StVT.getSizeInBits();
11974 EVT IntVT = EVT::getIntegerVT(*DAG.getContext(), NumBits);
11975
11976 SDValue CurrVal = DAG.getConstant(0, SL, IntVT);
11977
11978 for (unsigned Idx = 0; Idx < NumElem; ++Idx) {
11979 SDValue Elt = DAG.getExtractVectorElt(SL, RegSclVT, Value, Idx);
11980 SDValue Trunc = DAG.getNode(ISD::TRUNCATE, SL, MemSclVT, Elt);
11981 SDValue ExtElt = DAG.getNode(ISD::ZERO_EXTEND, SL, IntVT, Trunc);
11982 unsigned ShiftIntoIdx =
11983 (DAG.getDataLayout().isBigEndian() ? (NumElem - 1) - Idx : Idx);
11984 SDValue ShiftAmount =
11985 DAG.getConstant(ShiftIntoIdx * MemSclVT.getSizeInBits(), SL, IntVT);
11986 SDValue ShiftedElt =
11987 DAG.getNode(ISD::SHL, SL, IntVT, ExtElt, ShiftAmount);
11988 CurrVal = DAG.getNode(ISD::OR, SL, IntVT, CurrVal, ShiftedElt);
11989 }
11990
11991 return DAG.getStore(Chain, SL, CurrVal, BasePtr, ST->getPointerInfo(),
11992 ST->getBaseAlign(), ST->getMemOperand()->getFlags(),
11993 ST->getAAInfo());
11994 }
11995
11996 // Store Stride in bytes
11997 unsigned Stride = MemSclVT.getSizeInBits() / 8;
11998 assert(Stride && "Zero stride!");
11999 // Extract each of the elements from the original vector and save them into
12000 // memory individually.
12002 for (unsigned Idx = 0; Idx < NumElem; ++Idx) {
12003 SDValue Elt = DAG.getExtractVectorElt(SL, RegSclVT, Value, Idx);
12004
12005 SDValue Ptr =
12006 DAG.getObjectPtrOffset(SL, BasePtr, TypeSize::getFixed(Idx * Stride));
12007
12008 // This scalar TruncStore may be illegal, but we legalize it later.
12010 Chain, SL, Elt, Ptr, ST->getPointerInfo().getWithOffset(Idx * Stride),
12011 MemSclVT, ST->getBaseAlign(), ST->getMemOperand()->getFlags(),
12012 ST->getAAInfo());
12013
12014 Stores.push_back(Store);
12015 }
12016
12017 return DAG.getNode(ISD::TokenFactor, SL, MVT::Other, Stores);
12018}
12019
12020std::pair<SDValue, SDValue>
12022 assert(LD->getAddressingMode() == ISD::UNINDEXED &&
12023 "unaligned indexed loads not implemented!");
12024 SDValue Chain = LD->getChain();
12025 SDValue Ptr = LD->getBasePtr();
12026 EVT VT = LD->getValueType(0);
12027 EVT LoadedVT = LD->getMemoryVT();
12028 SDLoc dl(LD);
12029 auto &MF = DAG.getMachineFunction();
12030
12031 if (VT.isFloatingPoint() || VT.isVector()) {
12032 EVT intVT = EVT::getIntegerVT(*DAG.getContext(), LoadedVT.getSizeInBits());
12033 if (isTypeLegal(intVT) && isTypeLegal(LoadedVT)) {
12034 if (!isOperationLegalOrCustom(ISD::LOAD, intVT) &&
12035 LoadedVT.isVector()) {
12036 // Scalarize the load and let the individual components be handled.
12037 return scalarizeVectorLoad(LD, DAG);
12038 }
12039
12040 // Expand to a (misaligned) integer load of the same size,
12041 // then bitconvert to floating point or vector.
12042 SDValue newLoad = DAG.getLoad(intVT, dl, Chain, Ptr,
12043 LD->getMemOperand());
12044 SDValue Result = DAG.getNode(ISD::BITCAST, dl, LoadedVT, newLoad);
12045 if (LoadedVT != VT)
12046 Result = DAG.getNode(VT.isFloatingPoint() ? ISD::FP_EXTEND :
12047 ISD::ANY_EXTEND, dl, VT, Result);
12048
12049 return std::make_pair(Result, newLoad.getValue(1));
12050 }
12051
12052 // Copy the value to a (aligned) stack slot using (unaligned) integer
12053 // loads and stores, then do a (aligned) load from the stack slot.
12054 MVT RegVT = getRegisterType(*DAG.getContext(), intVT);
12055 unsigned LoadedBytes = LoadedVT.getStoreSize();
12056 unsigned RegBytes = RegVT.getSizeInBits() / 8;
12057 unsigned NumRegs = (LoadedBytes + RegBytes - 1) / RegBytes;
12058
12059 // Make sure the stack slot is also aligned for the register type.
12060 SDValue StackBase = DAG.CreateStackTemporary(LoadedVT, RegVT);
12061 auto FrameIndex = cast<FrameIndexSDNode>(StackBase.getNode())->getIndex();
12063 SDValue StackPtr = StackBase;
12064 unsigned Offset = 0;
12065
12066 EVT PtrVT = Ptr.getValueType();
12067 EVT StackPtrVT = StackPtr.getValueType();
12068
12069 SDValue PtrIncrement = DAG.getConstant(RegBytes, dl, PtrVT);
12070 SDValue StackPtrIncrement = DAG.getConstant(RegBytes, dl, StackPtrVT);
12071
12072 // Do all but one copies using the full register width.
12073 for (unsigned i = 1; i < NumRegs; i++) {
12074 // Load one integer register's worth from the original location.
12075 SDValue Load = DAG.getLoad(
12076 RegVT, dl, Chain, Ptr, LD->getPointerInfo().getWithOffset(Offset),
12077 LD->getBaseAlign(), LD->getMemOperand()->getFlags(), LD->getAAInfo());
12078 // Follow the load with a store to the stack slot. Remember the store.
12079 Stores.push_back(DAG.getStore(
12080 Load.getValue(1), dl, Load, StackPtr,
12081 MachinePointerInfo::getFixedStack(MF, FrameIndex, Offset)));
12082 // Increment the pointers.
12083 Offset += RegBytes;
12084
12085 Ptr = DAG.getObjectPtrOffset(dl, Ptr, PtrIncrement);
12086 StackPtr = DAG.getObjectPtrOffset(dl, StackPtr, StackPtrIncrement);
12087 }
12088
12089 // The last copy may be partial. Do an extending load.
12090 EVT MemVT = EVT::getIntegerVT(*DAG.getContext(),
12091 8 * (LoadedBytes - Offset));
12092 SDValue Load = DAG.getExtLoad(
12093 ISD::EXTLOAD, dl, RegVT, Chain, Ptr,
12094 LD->getPointerInfo().getWithOffset(Offset), MemVT, LD->getBaseAlign(),
12095 LD->getMemOperand()->getFlags(), LD->getAAInfo());
12096 // Follow the load with a store to the stack slot. Remember the store.
12097 // On big-endian machines this requires a truncating store to ensure
12098 // that the bits end up in the right place.
12099 Stores.push_back(DAG.getTruncStore(
12100 Load.getValue(1), dl, Load, StackPtr,
12101 MachinePointerInfo::getFixedStack(MF, FrameIndex, Offset), MemVT));
12102
12103 // The order of the stores doesn't matter - say it with a TokenFactor.
12104 SDValue TF = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Stores);
12105
12106 // Finally, perform the original load only redirected to the stack slot.
12107 Load = DAG.getExtLoad(LD->getExtensionType(), dl, VT, TF, StackBase,
12108 MachinePointerInfo::getFixedStack(MF, FrameIndex, 0),
12109 LoadedVT);
12110
12111 // Callers expect a MERGE_VALUES node.
12112 return std::make_pair(Load, TF);
12113 }
12114
12115 assert(LoadedVT.isInteger() && !LoadedVT.isVector() &&
12116 "Unaligned load of unsupported type.");
12117
12118 // Compute the new VT that is half the size of the old one. This is an
12119 // integer MVT.
12120 unsigned NumBits = LoadedVT.getSizeInBits();
12121 EVT NewLoadedVT;
12122 NewLoadedVT = EVT::getIntegerVT(*DAG.getContext(), NumBits/2);
12123 NumBits >>= 1;
12124
12125 Align Alignment = LD->getBaseAlign();
12126 unsigned IncrementSize = NumBits / 8;
12127 ISD::LoadExtType HiExtType = LD->getExtensionType();
12128
12129 // If the original load is NON_EXTLOAD, the hi part load must be ZEXTLOAD.
12130 if (HiExtType == ISD::NON_EXTLOAD)
12131 HiExtType = ISD::ZEXTLOAD;
12132
12133 // Load the value in two parts
12134 SDValue Lo, Hi;
12135 if (DAG.getDataLayout().isLittleEndian()) {
12136 Lo = DAG.getExtLoad(ISD::ZEXTLOAD, dl, VT, Chain, Ptr, LD->getPointerInfo(),
12137 NewLoadedVT, Alignment, LD->getMemOperand()->getFlags(),
12138 LD->getAAInfo());
12139
12140 Ptr = DAG.getObjectPtrOffset(dl, Ptr, TypeSize::getFixed(IncrementSize));
12141 Hi = DAG.getExtLoad(HiExtType, dl, VT, Chain, Ptr,
12142 LD->getPointerInfo().getWithOffset(IncrementSize),
12143 NewLoadedVT, Alignment, LD->getMemOperand()->getFlags(),
12144 LD->getAAInfo());
12145 } else {
12146 Hi = DAG.getExtLoad(HiExtType, dl, VT, Chain, Ptr, LD->getPointerInfo(),
12147 NewLoadedVT, Alignment, LD->getMemOperand()->getFlags(),
12148 LD->getAAInfo());
12149
12150 Ptr = DAG.getObjectPtrOffset(dl, Ptr, TypeSize::getFixed(IncrementSize));
12151 Lo = DAG.getExtLoad(ISD::ZEXTLOAD, dl, VT, Chain, Ptr,
12152 LD->getPointerInfo().getWithOffset(IncrementSize),
12153 NewLoadedVT, Alignment, LD->getMemOperand()->getFlags(),
12154 LD->getAAInfo());
12155 }
12156
12157 // aggregate the two parts
12158 SDValue ShiftAmount = DAG.getShiftAmountConstant(NumBits, VT, dl);
12159 SDValue Result = DAG.getNode(ISD::SHL, dl, VT, Hi, ShiftAmount);
12160 Result = DAG.getNode(ISD::OR, dl, VT, Result, Lo);
12161
12162 SDValue TF = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Lo.getValue(1),
12163 Hi.getValue(1));
12164
12165 return std::make_pair(Result, TF);
12166}
12167
12169 SelectionDAG &DAG) const {
12170 assert(ST->getAddressingMode() == ISD::UNINDEXED &&
12171 "unaligned indexed stores not implemented!");
12172 SDValue Chain = ST->getChain();
12173 SDValue Ptr = ST->getBasePtr();
12174 SDValue Val = ST->getValue();
12175 EVT VT = Val.getValueType();
12176 Align Alignment = ST->getBaseAlign();
12177 auto &MF = DAG.getMachineFunction();
12178 EVT StoreMemVT = ST->getMemoryVT();
12179
12180 SDLoc dl(ST);
12181 if (StoreMemVT.isFloatingPoint() || StoreMemVT.isVector()) {
12182 EVT intVT = EVT::getIntegerVT(*DAG.getContext(), VT.getSizeInBits());
12183 if (isTypeLegal(intVT)) {
12184 if (!isOperationLegalOrCustom(ISD::STORE, intVT) &&
12185 StoreMemVT.isVector()) {
12186 // Scalarize the store and let the individual components be handled.
12187 SDValue Result = scalarizeVectorStore(ST, DAG);
12188 return Result;
12189 }
12190 // Expand to a bitconvert of the value to the integer type of the
12191 // same size, then a (misaligned) int store.
12192 // FIXME: Does not handle truncating floating point stores!
12193 SDValue Result = DAG.getNode(ISD::BITCAST, dl, intVT, Val);
12194 Result = DAG.getStore(Chain, dl, Result, Ptr, ST->getPointerInfo(),
12195 Alignment, ST->getMemOperand()->getFlags());
12196 return Result;
12197 }
12198 // Do a (aligned) store to a stack slot, then copy from the stack slot
12199 // to the final destination using (unaligned) integer loads and stores.
12200 MVT RegVT = getRegisterType(
12201 *DAG.getContext(),
12202 EVT::getIntegerVT(*DAG.getContext(), StoreMemVT.getSizeInBits()));
12203 EVT PtrVT = Ptr.getValueType();
12204 unsigned StoredBytes = StoreMemVT.getStoreSize();
12205 unsigned RegBytes = RegVT.getSizeInBits() / 8;
12206 unsigned NumRegs = (StoredBytes + RegBytes - 1) / RegBytes;
12207
12208 // Make sure the stack slot is also aligned for the register type.
12209 SDValue StackPtr = DAG.CreateStackTemporary(StoreMemVT, RegVT);
12210 auto FrameIndex = cast<FrameIndexSDNode>(StackPtr.getNode())->getIndex();
12211
12212 // Perform the original store, only redirected to the stack slot.
12214 Chain, dl, Val, StackPtr,
12215 MachinePointerInfo::getFixedStack(MF, FrameIndex, 0), StoreMemVT);
12216
12217 EVT StackPtrVT = StackPtr.getValueType();
12218
12219 SDValue PtrIncrement = DAG.getConstant(RegBytes, dl, PtrVT);
12220 SDValue StackPtrIncrement = DAG.getConstant(RegBytes, dl, StackPtrVT);
12222 unsigned Offset = 0;
12223
12224 // Do all but one copies using the full register width.
12225 for (unsigned i = 1; i < NumRegs; i++) {
12226 // Load one integer register's worth from the stack slot.
12227 SDValue Load = DAG.getLoad(
12228 RegVT, dl, Store, StackPtr,
12229 MachinePointerInfo::getFixedStack(MF, FrameIndex, Offset));
12230 // Store it to the final location. Remember the store.
12231 Stores.push_back(DAG.getStore(Load.getValue(1), dl, Load, Ptr,
12232 ST->getPointerInfo().getWithOffset(Offset),
12233 ST->getBaseAlign(),
12234 ST->getMemOperand()->getFlags()));
12235 // Increment the pointers.
12236 Offset += RegBytes;
12237 StackPtr = DAG.getObjectPtrOffset(dl, StackPtr, StackPtrIncrement);
12238 Ptr = DAG.getObjectPtrOffset(dl, Ptr, PtrIncrement);
12239 }
12240
12241 // The last store may be partial. Do a truncating store. On big-endian
12242 // machines this requires an extending load from the stack slot to ensure
12243 // that the bits are in the right place.
12244 EVT LoadMemVT =
12245 EVT::getIntegerVT(*DAG.getContext(), 8 * (StoredBytes - Offset));
12246
12247 // Load from the stack slot.
12248 SDValue Load = DAG.getExtLoad(
12249 ISD::EXTLOAD, dl, RegVT, Store, StackPtr,
12250 MachinePointerInfo::getFixedStack(MF, FrameIndex, Offset), LoadMemVT);
12251
12252 Stores.push_back(DAG.getTruncStore(
12253 Load.getValue(1), dl, Load, Ptr,
12254 ST->getPointerInfo().getWithOffset(Offset), LoadMemVT,
12255 ST->getBaseAlign(), ST->getMemOperand()->getFlags(), ST->getAAInfo()));
12256 // The order of the stores doesn't matter - say it with a TokenFactor.
12257 SDValue Result = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Stores);
12258 return Result;
12259 }
12260
12261 assert(StoreMemVT.isInteger() && !StoreMemVT.isVector() &&
12262 "Unaligned store of unknown type.");
12263 // Get the half-size VT
12264 EVT NewStoredVT = StoreMemVT.getHalfSizedIntegerVT(*DAG.getContext());
12265 unsigned NumBits = NewStoredVT.getFixedSizeInBits();
12266 unsigned IncrementSize = NumBits / 8;
12267
12268 // Divide the stored value in two parts.
12269 SDValue ShiftAmount =
12270 DAG.getShiftAmountConstant(NumBits, Val.getValueType(), dl);
12271 SDValue Lo = Val;
12272 // If Val is a constant, replace the upper bits with 0. The SRL will constant
12273 // fold and not use the upper bits. A smaller constant may be easier to
12274 // materialize.
12275 if (auto *C = dyn_cast<ConstantSDNode>(Lo); C && !C->isOpaque())
12276 Lo = DAG.getNode(
12277 ISD::AND, dl, VT, Lo,
12278 DAG.getConstant(APInt::getLowBitsSet(VT.getSizeInBits(), NumBits), dl,
12279 VT));
12280 SDValue Hi = DAG.getNode(ISD::SRL, dl, VT, Val, ShiftAmount);
12281
12282 // Store the two parts
12283 SDValue Store1, Store2;
12284 Store1 = DAG.getTruncStore(Chain, dl,
12285 DAG.getDataLayout().isLittleEndian() ? Lo : Hi,
12286 Ptr, ST->getPointerInfo(), NewStoredVT, Alignment,
12287 ST->getMemOperand()->getFlags());
12288
12289 Ptr = DAG.getObjectPtrOffset(dl, Ptr, TypeSize::getFixed(IncrementSize));
12290 Store2 = DAG.getTruncStore(
12291 Chain, dl, DAG.getDataLayout().isLittleEndian() ? Hi : Lo, Ptr,
12292 ST->getPointerInfo().getWithOffset(IncrementSize), NewStoredVT, Alignment,
12293 ST->getMemOperand()->getFlags(), ST->getAAInfo());
12294
12295 SDValue Result =
12296 DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Store1, Store2);
12297 return Result;
12298}
12299
12300SDValue
12302 const SDLoc &DL, EVT DataVT,
12303 SelectionDAG &DAG,
12304 bool IsCompressedMemory) const {
12306 EVT AddrVT = Addr.getValueType();
12307 EVT MaskVT = Mask.getValueType();
12308 assert(DataVT.getVectorElementCount() == MaskVT.getVectorElementCount() &&
12309 "Incompatible types of Data and Mask");
12310 if (IsCompressedMemory) {
12311 // Incrementing the pointer according to number of '1's in the mask.
12312 if (DataVT.isScalableVector()) {
12313 EVT MaskExtVT = MaskVT.changeElementType(*DAG.getContext(), MVT::i32);
12314 SDValue MaskExt = DAG.getNode(ISD::ZERO_EXTEND, DL, MaskExtVT, Mask);
12315 Increment = DAG.getNode(ISD::VECREDUCE_ADD, DL, MVT::i32, MaskExt);
12316 } else {
12317 EVT MaskIntVT =
12318 EVT::getIntegerVT(*DAG.getContext(), MaskVT.getSizeInBits());
12319 SDValue MaskInIntReg = DAG.getBitcast(MaskIntVT, Mask);
12320 if (MaskIntVT.getSizeInBits() < 32) {
12321 MaskInIntReg =
12322 DAG.getNode(ISD::ZERO_EXTEND, DL, MVT::i32, MaskInIntReg);
12323 MaskIntVT = MVT::i32;
12324 }
12325 Increment = DAG.getNode(ISD::CTPOP, DL, MaskIntVT, MaskInIntReg);
12326 }
12327 // Scale is an element size in bytes.
12328 SDValue Scale = DAG.getConstant(DataVT.getScalarSizeInBits() / 8, DL,
12329 AddrVT);
12330 Increment = DAG.getZExtOrTrunc(Increment, DL, AddrVT);
12331 Increment = DAG.getNode(ISD::MUL, DL, AddrVT, Increment, Scale);
12332 } else
12333 Increment = DAG.getTypeSize(DL, AddrVT, DataVT.getStoreSize());
12334
12335 return DAG.getNode(ISD::ADD, DL, AddrVT, Addr, Increment);
12336}
12337
12339 EVT VecVT, const SDLoc &dl,
12340 ElementCount SubEC) {
12341 assert(!(SubEC.isScalable() && VecVT.isFixedLengthVector()) &&
12342 "Cannot index a scalable vector within a fixed-width vector");
12343
12344 unsigned NElts = VecVT.getVectorMinNumElements();
12345 unsigned NumSubElts = SubEC.getKnownMinValue();
12346 EVT IdxVT = Idx.getValueType();
12347
12348 if (VecVT.isScalableVector() && !SubEC.isScalable()) {
12349 // If this is a constant index and we know the value plus the number of the
12350 // elements in the subvector minus one is less than the minimum number of
12351 // elements then it's safe to return Idx.
12352 if (auto *IdxCst = dyn_cast<ConstantSDNode>(Idx))
12353 if (IdxCst->getZExtValue() + (NumSubElts - 1) < NElts)
12354 return Idx;
12355 SDValue VS =
12356 DAG.getVScale(dl, IdxVT, APInt(IdxVT.getFixedSizeInBits(), NElts));
12357 unsigned SubOpcode = NumSubElts <= NElts ? ISD::SUB : ISD::USUBSAT;
12358 SDValue Sub = DAG.getNode(SubOpcode, dl, IdxVT, VS,
12359 DAG.getConstant(NumSubElts, dl, IdxVT));
12360 return DAG.getNode(ISD::UMIN, dl, IdxVT, Idx, Sub);
12361 }
12362 if (isPowerOf2_32(NElts) && NumSubElts == 1) {
12363 APInt Imm = APInt::getLowBitsSet(IdxVT.getSizeInBits(), Log2_32(NElts));
12364 return DAG.getNode(ISD::AND, dl, IdxVT, Idx,
12365 DAG.getConstant(Imm, dl, IdxVT));
12366 }
12367 unsigned MaxIndex = NumSubElts < NElts ? NElts - NumSubElts : 0;
12368 return DAG.getNode(ISD::UMIN, dl, IdxVT, Idx,
12369 DAG.getConstant(MaxIndex, dl, IdxVT));
12370}
12371
12372SDValue
12374 EVT VecVT, SDValue Index,
12375 const SDNodeFlags PtrArithFlags) const {
12377 DAG, VecPtr, VecVT,
12379 Index, PtrArithFlags);
12380}
12381
12382SDValue
12384 EVT VecVT, EVT SubVecVT, SDValue Index,
12385 const SDNodeFlags PtrArithFlags) const {
12386 SDLoc dl(Index);
12387 // Make sure the index type is big enough to compute in.
12388 Index = DAG.getZExtOrTrunc(Index, dl, VecPtr.getValueType());
12389
12390 EVT EltVT = VecVT.getVectorElementType();
12391
12392 // Calculate the element offset and add it to the pointer.
12393 unsigned EltSize = EltVT.getFixedSizeInBits() / 8; // FIXME: should be ABI size.
12394 assert(EltSize * 8 == EltVT.getFixedSizeInBits() &&
12395 "Converting bits to bytes lost precision");
12396 assert(SubVecVT.getVectorElementType() == EltVT &&
12397 "Sub-vector must be a vector with matching element type");
12398 Index = clampDynamicVectorIndex(DAG, Index, VecVT, dl,
12399 SubVecVT.getVectorElementCount());
12400
12401 EVT IdxVT = Index.getValueType();
12402 if (SubVecVT.isScalableVector())
12403 Index =
12404 DAG.getNode(ISD::MUL, dl, IdxVT, Index,
12405 DAG.getVScale(dl, IdxVT, APInt(IdxVT.getSizeInBits(), 1)));
12406
12407 Index = DAG.getNode(ISD::MUL, dl, IdxVT, Index,
12408 DAG.getConstant(EltSize, dl, IdxVT));
12409 return DAG.getMemBasePlusOffset(VecPtr, Index, dl, PtrArithFlags);
12410}
12411
12412//===----------------------------------------------------------------------===//
12413// Implementation of Emulated TLS Model
12414//===----------------------------------------------------------------------===//
12415
12417 SelectionDAG &DAG) const {
12418 // Access to address of TLS varialbe xyz is lowered to a function call:
12419 // __emutls_get_address( address of global variable named "__emutls_v.xyz" )
12420 EVT PtrVT = getPointerTy(DAG.getDataLayout());
12421 PointerType *VoidPtrType = PointerType::get(*DAG.getContext(), 0);
12422 SDLoc dl(GA);
12423
12424 ArgListTy Args;
12425 const GlobalValue *GV =
12427 SmallString<32> NameString("__emutls_v.");
12428 NameString += GV->getName();
12429 StringRef EmuTlsVarName(NameString);
12430 const GlobalVariable *EmuTlsVar =
12431 GV->getParent()->getNamedGlobal(EmuTlsVarName);
12432 assert(EmuTlsVar && "Cannot find EmuTlsVar ");
12433 Args.emplace_back(DAG.getGlobalAddress(EmuTlsVar, dl, PtrVT), VoidPtrType);
12434
12435 SDValue EmuTlsGetAddr = DAG.getExternalSymbol("__emutls_get_address", PtrVT);
12436
12438 CLI.setDebugLoc(dl).setChain(DAG.getEntryNode());
12439 CLI.setLibCallee(CallingConv::C, VoidPtrType, EmuTlsGetAddr, std::move(Args));
12440 std::pair<SDValue, SDValue> CallResult = LowerCallTo(CLI);
12441
12442 // TLSADDR will be codegen'ed as call. Inform MFI that function has calls.
12443 // At last for X86 targets, maybe good for other targets too?
12445 MFI.setAdjustsStack(true); // Is this only for X86 target?
12446 MFI.setHasCalls(true);
12447
12448 assert((GA->getOffset() == 0) &&
12449 "Emulated TLS must have zero offset in GlobalAddressSDNode");
12450 return CallResult.first;
12451}
12452
12454 SelectionDAG &DAG) const {
12455 assert((Op->getOpcode() == ISD::SETCC) && "Input has to be a SETCC node.");
12456 if (!isCtlzFast())
12457 return SDValue();
12458 ISD::CondCode CC = cast<CondCodeSDNode>(Op.getOperand(2))->get();
12459 SDLoc dl(Op);
12460 if (isNullConstant(Op.getOperand(1)) && CC == ISD::SETEQ) {
12461 EVT VT = Op.getOperand(0).getValueType();
12462 SDValue Zext = Op.getOperand(0);
12463 if (VT.bitsLT(MVT::i32)) {
12464 VT = MVT::i32;
12465 Zext = DAG.getNode(ISD::ZERO_EXTEND, dl, VT, Op.getOperand(0));
12466 }
12467 unsigned Log2b = Log2_32(VT.getSizeInBits());
12468 SDValue Clz = DAG.getNode(ISD::CTLZ, dl, VT, Zext);
12469 SDValue Scc = DAG.getNode(ISD::SRL, dl, VT, Clz,
12470 DAG.getConstant(Log2b, dl, MVT::i32));
12471 return DAG.getNode(ISD::TRUNCATE, dl, MVT::i32, Scc);
12472 }
12473 return SDValue();
12474}
12475
12477 SDValue Op0 = Node->getOperand(0);
12478 SDValue Op1 = Node->getOperand(1);
12479 EVT VT = Op0.getValueType();
12480 EVT BoolVT = getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
12481 unsigned Opcode = Node->getOpcode();
12482 SDLoc DL(Node);
12483
12484 // If both sign bits are zero, flip UMIN/UMAX <-> SMIN/SMAX if legal.
12485 unsigned AltOpcode = ISD::getOppositeSignednessMinMaxOpcode(Opcode);
12486 if (isOperationLegal(AltOpcode, VT) && DAG.SignBitIsZero(Op0) &&
12487 DAG.SignBitIsZero(Op1))
12488 return DAG.getNode(AltOpcode, DL, VT, Op0, Op1);
12489
12490 // umax(x,1) --> sub(x,cmpeq(x,0)) iff cmp result is allbits
12491 if (Opcode == ISD::UMAX && llvm::isOneOrOneSplat(Op1, true) && BoolVT == VT &&
12493 Op0 = DAG.getFreeze(Op0);
12494 SDValue Zero = DAG.getConstant(0, DL, VT);
12495 return DAG.getNode(ISD::SUB, DL, VT, Op0,
12496 DAG.getSetCC(DL, VT, Op0, Zero, ISD::SETEQ));
12497 }
12498
12499 // umin(x,y) -> sub(x,usubsat(x,y))
12500 // TODO: Missing freeze(Op0)?
12501 if (Opcode == ISD::UMIN && isOperationLegal(ISD::SUB, VT) &&
12503 return DAG.getNode(ISD::SUB, DL, VT, Op0,
12504 DAG.getNode(ISD::USUBSAT, DL, VT, Op0, Op1));
12505 }
12506
12507 // umax(x,y) -> add(x,usubsat(y,x))
12508 // TODO: Missing freeze(Op0)?
12509 if (Opcode == ISD::UMAX && isOperationLegal(ISD::ADD, VT) &&
12511 return DAG.getNode(ISD::ADD, DL, VT, Op0,
12512 DAG.getNode(ISD::USUBSAT, DL, VT, Op1, Op0));
12513 }
12514
12515 // FIXME: Should really try to split the vector in case it's legal on a
12516 // subvector.
12518 return DAG.UnrollVectorOp(Node);
12519
12520 // Attempt to find an existing SETCC node that we can reuse.
12521 // TODO: Do we need a generic doesSETCCNodeExist?
12522 // TODO: Missing freeze(Op0)/freeze(Op1)?
12523 auto buildMinMax = [&](ISD::CondCode PrefCC, ISD::CondCode AltCC,
12524 ISD::CondCode PrefCommuteCC,
12525 ISD::CondCode AltCommuteCC) {
12526 SDVTList BoolVTList = DAG.getVTList(BoolVT);
12527 for (ISD::CondCode CC : {PrefCC, AltCC}) {
12528 if (DAG.doesNodeExist(ISD::SETCC, BoolVTList,
12529 {Op0, Op1, DAG.getCondCode(CC)})) {
12530 SDValue Cond = DAG.getSetCC(DL, BoolVT, Op0, Op1, CC);
12531 return DAG.getSelect(DL, VT, Cond, Op0, Op1);
12532 }
12533 }
12534 for (ISD::CondCode CC : {PrefCommuteCC, AltCommuteCC}) {
12535 if (DAG.doesNodeExist(ISD::SETCC, BoolVTList,
12536 {Op0, Op1, DAG.getCondCode(CC)})) {
12537 SDValue Cond = DAG.getSetCC(DL, BoolVT, Op0, Op1, CC);
12538 return DAG.getSelect(DL, VT, Cond, Op1, Op0);
12539 }
12540 }
12541 SDValue Cond = DAG.getSetCC(DL, BoolVT, Op0, Op1, PrefCC);
12542 return DAG.getSelect(DL, VT, Cond, Op0, Op1);
12543 };
12544
12545 // Expand Y = MAX(A, B) -> Y = (A > B) ? A : B
12546 // -> Y = (A < B) ? B : A
12547 // -> Y = (A >= B) ? A : B
12548 // -> Y = (A <= B) ? B : A
12549 switch (Opcode) {
12550 case ISD::SMAX:
12551 return buildMinMax(ISD::SETGT, ISD::SETGE, ISD::SETLT, ISD::SETLE);
12552 case ISD::SMIN:
12553 return buildMinMax(ISD::SETLT, ISD::SETLE, ISD::SETGT, ISD::SETGE);
12554 case ISD::UMAX:
12555 return buildMinMax(ISD::SETUGT, ISD::SETUGE, ISD::SETULT, ISD::SETULE);
12556 case ISD::UMIN:
12557 return buildMinMax(ISD::SETULT, ISD::SETULE, ISD::SETUGT, ISD::SETUGE);
12558 }
12559
12560 llvm_unreachable("How did we get here?");
12561}
12562
12564 unsigned Opcode = Node->getOpcode();
12565 SDValue LHS = Node->getOperand(0);
12566 SDValue RHS = Node->getOperand(1);
12567 EVT VT = LHS.getValueType();
12568 SDLoc dl(Node);
12569
12570 assert(VT == RHS.getValueType() && "Expected operands to be the same type");
12571 assert(VT.isInteger() && "Expected operands to be integers");
12572
12573 // usub.sat(a, b) -> umax(a, b) - b
12574 if (Opcode == ISD::USUBSAT && isOperationLegal(ISD::UMAX, VT)) {
12575 SDValue Max = DAG.getNode(ISD::UMAX, dl, VT, LHS, RHS);
12576 return DAG.getNode(ISD::SUB, dl, VT, Max, RHS);
12577 }
12578
12579 // usub.sat(a, 1) -> sub(a, zext(a != 0))
12580 // Prefer this on targets without legal/cost-effective overflow-carry nodes.
12581 if (Opcode == ISD::USUBSAT && isOneOrOneSplat(RHS) &&
12583 LHS = DAG.getFreeze(LHS);
12584 SDValue Zero = DAG.getConstant(0, dl, VT);
12585 EVT BoolVT = getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
12586 SDValue IsNonZero = DAG.getSetCC(dl, BoolVT, LHS, Zero, ISD::SETNE);
12587 SDValue Subtrahend = DAG.getBoolExtOrTrunc(IsNonZero, dl, VT, BoolVT);
12588 Subtrahend =
12589 DAG.getNode(ISD::AND, dl, VT, Subtrahend, DAG.getConstant(1, dl, VT));
12590 return DAG.getNode(ISD::SUB, dl, VT, LHS, Subtrahend);
12591 }
12592
12593 // uadd.sat(a, b) -> umin(a, ~b) + b
12594 if (Opcode == ISD::UADDSAT && isOperationLegal(ISD::UMIN, VT)) {
12595 SDValue InvRHS = DAG.getNOT(dl, RHS, VT);
12596 SDValue Min = DAG.getNode(ISD::UMIN, dl, VT, LHS, InvRHS);
12597 return DAG.getNode(ISD::ADD, dl, VT, Min, RHS);
12598 }
12599
12600 unsigned OverflowOp;
12601 switch (Opcode) {
12602 case ISD::SADDSAT:
12603 OverflowOp = ISD::SADDO;
12604 break;
12605 case ISD::UADDSAT:
12606 OverflowOp = ISD::UADDO;
12607 break;
12608 case ISD::SSUBSAT:
12609 OverflowOp = ISD::SSUBO;
12610 break;
12611 case ISD::USUBSAT:
12612 OverflowOp = ISD::USUBO;
12613 break;
12614 default:
12615 llvm_unreachable("Expected method to receive signed or unsigned saturation "
12616 "addition or subtraction node.");
12617 }
12618
12619 // FIXME: Should really try to split the vector in case it's legal on a
12620 // subvector.
12622 return DAG.UnrollVectorOp(Node);
12623
12624 unsigned BitWidth = LHS.getScalarValueSizeInBits();
12625 EVT BoolVT = getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
12626 SDValue Result = DAG.getNode(OverflowOp, dl, DAG.getVTList(VT, BoolVT), LHS, RHS);
12627 SDValue SumDiff = Result.getValue(0);
12628 SDValue Overflow = Result.getValue(1);
12629 SDValue Zero = DAG.getConstant(0, dl, VT);
12630 SDValue AllOnes = DAG.getAllOnesConstant(dl, VT);
12631
12632 if (Opcode == ISD::UADDSAT) {
12634 // (LHS + RHS) | OverflowMask
12635 SDValue OverflowMask = DAG.getSExtOrTrunc(Overflow, dl, VT);
12636 return DAG.getNode(ISD::OR, dl, VT, SumDiff, OverflowMask);
12637 }
12638 // Overflow ? 0xffff.... : (LHS + RHS)
12639 return DAG.getSelect(dl, VT, Overflow, AllOnes, SumDiff);
12640 }
12641
12642 if (Opcode == ISD::USUBSAT) {
12644 // (LHS - RHS) & ~OverflowMask
12645 SDValue OverflowMask = DAG.getSExtOrTrunc(Overflow, dl, VT);
12646 SDValue Not = DAG.getNOT(dl, OverflowMask, VT);
12647 return DAG.getNode(ISD::AND, dl, VT, SumDiff, Not);
12648 }
12649 // Overflow ? 0 : (LHS - RHS)
12650 return DAG.getSelect(dl, VT, Overflow, Zero, SumDiff);
12651 }
12652
12653 assert((Opcode == ISD::SADDSAT || Opcode == ISD::SSUBSAT) &&
12654 "Expected signed saturating add/sub opcode");
12655
12656 const APInt MinVal = APInt::getSignedMinValue(BitWidth);
12657 const APInt MaxVal = APInt::getSignedMaxValue(BitWidth);
12658
12659 KnownBits KnownLHS = DAG.computeKnownBits(LHS);
12660 KnownBits KnownRHS = DAG.computeKnownBits(RHS);
12661
12662 // If either of the operand signs are known, then they are guaranteed to
12663 // only saturate in one direction. If non-negative they will saturate
12664 // towards SIGNED_MAX, if negative they will saturate towards SIGNED_MIN.
12665 //
12666 // In the case of ISD::SSUBSAT, 'x - y' is equivalent to 'x + (-y)', so the
12667 // sign of 'y' has to be flipped.
12668
12669 bool LHSIsNonNegative = KnownLHS.isNonNegative();
12670 bool RHSIsNonNegative =
12671 Opcode == ISD::SADDSAT ? KnownRHS.isNonNegative() : KnownRHS.isNegative();
12672 if (LHSIsNonNegative || RHSIsNonNegative) {
12673 SDValue SatMax = DAG.getConstant(MaxVal, dl, VT);
12674 return DAG.getSelect(dl, VT, Overflow, SatMax, SumDiff);
12675 }
12676
12677 bool LHSIsNegative = KnownLHS.isNegative();
12678 bool RHSIsNegative =
12679 Opcode == ISD::SADDSAT ? KnownRHS.isNegative() : KnownRHS.isNonNegative();
12680 if (LHSIsNegative || RHSIsNegative) {
12681 SDValue SatMin = DAG.getConstant(MinVal, dl, VT);
12682 return DAG.getSelect(dl, VT, Overflow, SatMin, SumDiff);
12683 }
12684
12685 // Overflow ? (SumDiff >> BW) ^ MinVal : SumDiff
12686 SDValue SatMin = DAG.getConstant(MinVal, dl, VT);
12687 SDValue Shift = DAG.getNode(ISD::SRA, dl, VT, SumDiff,
12688 DAG.getConstant(BitWidth - 1, dl, VT));
12689 Result = DAG.getNode(ISD::XOR, dl, VT, Shift, SatMin);
12690 return DAG.getSelect(dl, VT, Overflow, Result, SumDiff);
12691}
12692
12694 unsigned Opcode = Node->getOpcode();
12695 SDValue LHS = Node->getOperand(0);
12696 SDValue RHS = Node->getOperand(1);
12697 EVT VT = LHS.getValueType();
12698 EVT ResVT = Node->getValueType(0);
12699 EVT BoolVT = getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
12700 SDLoc dl(Node);
12701
12702 auto LTPredicate = (Opcode == ISD::UCMP ? ISD::SETULT : ISD::SETLT);
12703 auto GTPredicate = (Opcode == ISD::UCMP ? ISD::SETUGT : ISD::SETGT);
12704 SDValue IsLT = DAG.getSetCC(dl, BoolVT, LHS, RHS, LTPredicate);
12705 SDValue IsGT = DAG.getSetCC(dl, BoolVT, LHS, RHS, GTPredicate);
12706
12707 // We can't perform arithmetic on i1 values. Extending them would
12708 // probably result in worse codegen, so let's just use two selects instead.
12709 // Some targets are also just better off using selects rather than subtraction
12710 // because one of the conditions can be merged with one of the selects.
12711 // And finally, if we don't know the contents of high bits of a boolean value
12712 // we can't perform any arithmetic either.
12714 BoolVT.getScalarSizeInBits() == 1 ||
12716 SDValue SelectZeroOrOne =
12717 DAG.getSelect(dl, ResVT, IsGT, DAG.getConstant(1, dl, ResVT),
12718 DAG.getConstant(0, dl, ResVT));
12719 return DAG.getSelect(dl, ResVT, IsLT, DAG.getAllOnesConstant(dl, ResVT),
12720 SelectZeroOrOne);
12721 }
12722
12724 std::swap(IsGT, IsLT);
12725 return DAG.getSExtOrTrunc(DAG.getNode(ISD::SUB, dl, BoolVT, IsGT, IsLT), dl,
12726 ResVT);
12727}
12728
12730 unsigned Opcode = Node->getOpcode();
12731 bool IsSigned = Opcode == ISD::SSHLSAT;
12732 SDValue LHS = Node->getOperand(0);
12733 SDValue RHS = Node->getOperand(1);
12734 EVT VT = LHS.getValueType();
12735 SDLoc dl(Node);
12736
12737 assert((Node->getOpcode() == ISD::SSHLSAT ||
12738 Node->getOpcode() == ISD::USHLSAT) &&
12739 "Expected a SHLSAT opcode");
12740 assert(VT.isInteger() && "Expected operands to be integers");
12741
12743 return DAG.UnrollVectorOp(Node);
12744
12745 // If LHS != (LHS << RHS) >> RHS, we have overflow and must saturate.
12746
12747 unsigned BW = VT.getScalarSizeInBits();
12748 EVT BoolVT = getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
12749 SDValue Result = DAG.getNode(ISD::SHL, dl, VT, LHS, RHS);
12750 SDValue Orig =
12751 DAG.getNode(IsSigned ? ISD::SRA : ISD::SRL, dl, VT, Result, RHS);
12752
12753 SDValue SatVal;
12754 if (IsSigned) {
12755 SDValue SatMin = DAG.getConstant(APInt::getSignedMinValue(BW), dl, VT);
12756 SDValue SatMax = DAG.getConstant(APInt::getSignedMaxValue(BW), dl, VT);
12757 SDValue Cond =
12758 DAG.getSetCC(dl, BoolVT, LHS, DAG.getConstant(0, dl, VT), ISD::SETLT);
12759 SatVal = DAG.getSelect(dl, VT, Cond, SatMin, SatMax);
12760 } else {
12761 SatVal = DAG.getConstant(APInt::getMaxValue(BW), dl, VT);
12762 }
12763 SDValue Cond = DAG.getSetCC(dl, BoolVT, LHS, Orig, ISD::SETNE);
12764 return DAG.getSelect(dl, VT, Cond, SatVal, Result);
12765}
12766
12768 bool Signed, SDValue &Lo, SDValue &Hi,
12769 SDValue LHS, SDValue RHS,
12770 SDValue HiLHS, SDValue HiRHS) const {
12771 EVT VT = LHS.getValueType();
12772 assert(RHS.getValueType() == VT && "Mismatching operand types");
12773
12774 assert((HiLHS && HiRHS) || (!HiLHS && !HiRHS));
12775 assert((!Signed || !HiLHS) &&
12776 "Signed flag should only be set when HiLHS and RiRHS are null");
12777
12778 // We'll expand the multiplication by brute force because we have no other
12779 // options. This is a trivially-generalized version of the code from
12780 // Hacker's Delight (itself derived from Knuth's Algorithm M from section
12781 // 4.3.1). If Signed is set, we can use arithmetic right shifts to propagate
12782 // sign bits while calculating the Hi half.
12783 unsigned Bits = VT.getScalarSizeInBits();
12784 unsigned HalfBits = Bits / 2;
12785 SDValue Mask = DAG.getConstant(APInt::getLowBitsSet(Bits, HalfBits), dl, VT);
12786 SDValue LL = DAG.getNode(ISD::AND, dl, VT, LHS, Mask);
12787 SDValue RL = DAG.getNode(ISD::AND, dl, VT, RHS, Mask);
12788
12789 SDValue T = DAG.getNode(ISD::MUL, dl, VT, LL, RL);
12790 SDValue TL = DAG.getNode(ISD::AND, dl, VT, T, Mask);
12791
12792 SDValue Shift = DAG.getShiftAmountConstant(HalfBits, VT, dl);
12793 // This is always an unsigned shift.
12794 SDValue TH = DAG.getNode(ISD::SRL, dl, VT, T, Shift);
12795
12796 unsigned ShiftOpc = Signed ? ISD::SRA : ISD::SRL;
12797 SDValue LH = DAG.getNode(ShiftOpc, dl, VT, LHS, Shift);
12798 SDValue RH = DAG.getNode(ShiftOpc, dl, VT, RHS, Shift);
12799
12800 SDValue U =
12801 DAG.getNode(ISD::ADD, dl, VT, DAG.getNode(ISD::MUL, dl, VT, LH, RL), TH);
12802 SDValue UL = DAG.getNode(ISD::AND, dl, VT, U, Mask);
12803 SDValue UH = DAG.getNode(ShiftOpc, dl, VT, U, Shift);
12804
12805 SDValue V =
12806 DAG.getNode(ISD::ADD, dl, VT, DAG.getNode(ISD::MUL, dl, VT, LL, RH), UL);
12807 SDValue VH = DAG.getNode(ShiftOpc, dl, VT, V, Shift);
12808
12809 Lo = DAG.getNode(ISD::ADD, dl, VT, TL,
12810 DAG.getNode(ISD::SHL, dl, VT, V, Shift));
12811
12812 Hi = DAG.getNode(ISD::ADD, dl, VT, DAG.getNode(ISD::MUL, dl, VT, LH, RH),
12813 DAG.getNode(ISD::ADD, dl, VT, UH, VH));
12814
12815 // If HiLHS and HiRHS are set, multiply them by the opposite low part and add
12816 // the products to Hi.
12817 if (HiLHS) {
12818 SDValue RHLL = DAG.getNode(ISD::MUL, dl, VT, HiRHS, LHS);
12819 SDValue RLLH = DAG.getNode(ISD::MUL, dl, VT, RHS, HiLHS);
12820 Hi = DAG.getNode(ISD::ADD, dl, VT, Hi,
12821 DAG.getNode(ISD::ADD, dl, VT, RHLL, RLLH));
12822 }
12823}
12824
12826 bool Signed, const SDValue LHS,
12827 const SDValue RHS, SDValue &Lo,
12828 SDValue &Hi) const {
12829 EVT VT = LHS.getValueType();
12830 assert(RHS.getValueType() == VT && "Mismatching operand types");
12831 EVT WideVT = VT.widenIntegerElementType(*DAG.getContext());
12832 // We can fall back to a libcall with an illegal type for the MUL if we
12833 // have a libcall big enough.
12834 RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL;
12835 if (WideVT == MVT::i16)
12836 LC = RTLIB::MUL_I16;
12837 else if (WideVT == MVT::i32)
12838 LC = RTLIB::MUL_I32;
12839 else if (WideVT == MVT::i64)
12840 LC = RTLIB::MUL_I64;
12841 else if (WideVT == MVT::i128)
12842 LC = RTLIB::MUL_I128;
12843
12844 RTLIB::LibcallImpl LibcallImpl = getLibcallImpl(LC);
12845 if (LibcallImpl == RTLIB::Unsupported) {
12846 forceExpandMultiply(DAG, dl, Signed, Lo, Hi, LHS, RHS);
12847 return;
12848 }
12849
12850 SDValue HiLHS, HiRHS;
12851 if (Signed) {
12852 // The high part is obtained by SRA'ing all but one of the bits of low
12853 // part.
12854 unsigned LoSize = VT.getFixedSizeInBits();
12855 SDValue Shift = DAG.getShiftAmountConstant(LoSize - 1, VT, dl);
12856 HiLHS = DAG.getNode(ISD::SRA, dl, VT, LHS, Shift);
12857 HiRHS = DAG.getNode(ISD::SRA, dl, VT, RHS, Shift);
12858 } else {
12859 HiLHS = DAG.getConstant(0, dl, VT);
12860 HiRHS = DAG.getConstant(0, dl, VT);
12861 }
12862
12863 // Attempt a libcall.
12864 SDValue Ret;
12866 CallOptions.setIsSigned(Signed);
12867 CallOptions.setIsPostTypeLegalization(true);
12869 // Halves of WideVT are packed into registers in different order
12870 // depending on platform endianness. This is usually handled by
12871 // the C calling convention, but we can't defer to it in
12872 // the legalizer.
12873 SDValue Args[] = {LHS, HiLHS, RHS, HiRHS};
12874 Ret = makeLibCall(DAG, LC, WideVT, Args, CallOptions, dl).first;
12875 } else {
12876 SDValue Args[] = {HiLHS, LHS, HiRHS, RHS};
12877 Ret = makeLibCall(DAG, LC, WideVT, Args, CallOptions, dl).first;
12878 }
12880 "Ret value is a collection of constituent nodes holding result.");
12881 if (DAG.getDataLayout().isLittleEndian()) {
12882 // Same as above.
12883 Lo = Ret.getOperand(0);
12884 Hi = Ret.getOperand(1);
12885 } else {
12886 Lo = Ret.getOperand(1);
12887 Hi = Ret.getOperand(0);
12888 }
12889}
12890
12891SDValue
12893 assert((Node->getOpcode() == ISD::SMULFIX ||
12894 Node->getOpcode() == ISD::UMULFIX ||
12895 Node->getOpcode() == ISD::SMULFIXSAT ||
12896 Node->getOpcode() == ISD::UMULFIXSAT) &&
12897 "Expected a fixed point multiplication opcode");
12898
12899 SDLoc dl(Node);
12900 SDValue LHS = Node->getOperand(0);
12901 SDValue RHS = Node->getOperand(1);
12902 EVT VT = LHS.getValueType();
12903 unsigned Scale = Node->getConstantOperandVal(2);
12904 bool Saturating = (Node->getOpcode() == ISD::SMULFIXSAT ||
12905 Node->getOpcode() == ISD::UMULFIXSAT);
12906 bool Signed = (Node->getOpcode() == ISD::SMULFIX ||
12907 Node->getOpcode() == ISD::SMULFIXSAT);
12908 EVT BoolVT = getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
12909 unsigned VTSize = VT.getScalarSizeInBits();
12910
12911 if (!Scale) {
12912 // [us]mul.fix(a, b, 0) -> mul(a, b)
12913 if (!Saturating) {
12915 return DAG.getNode(ISD::MUL, dl, VT, LHS, RHS);
12916 } else if (Signed && isOperationLegalOrCustom(ISD::SMULO, VT)) {
12917 SDValue Result =
12918 DAG.getNode(ISD::SMULO, dl, DAG.getVTList(VT, BoolVT), LHS, RHS);
12919 SDValue Product = Result.getValue(0);
12920 SDValue Overflow = Result.getValue(1);
12921 SDValue Zero = DAG.getConstant(0, dl, VT);
12922
12923 APInt MinVal = APInt::getSignedMinValue(VTSize);
12924 APInt MaxVal = APInt::getSignedMaxValue(VTSize);
12925 SDValue SatMin = DAG.getConstant(MinVal, dl, VT);
12926 SDValue SatMax = DAG.getConstant(MaxVal, dl, VT);
12927 // Xor the inputs, if resulting sign bit is 0 the product will be
12928 // positive, else negative.
12929 SDValue Xor = DAG.getNode(ISD::XOR, dl, VT, LHS, RHS);
12930 SDValue ProdNeg = DAG.getSetCC(dl, BoolVT, Xor, Zero, ISD::SETLT);
12931 Result = DAG.getSelect(dl, VT, ProdNeg, SatMin, SatMax);
12932 return DAG.getSelect(dl, VT, Overflow, Result, Product);
12933 } else if (!Signed && isOperationLegalOrCustom(ISD::UMULO, VT)) {
12934 SDValue Result =
12935 DAG.getNode(ISD::UMULO, dl, DAG.getVTList(VT, BoolVT), LHS, RHS);
12936 SDValue Product = Result.getValue(0);
12937 SDValue Overflow = Result.getValue(1);
12938
12939 APInt MaxVal = APInt::getMaxValue(VTSize);
12940 SDValue SatMax = DAG.getConstant(MaxVal, dl, VT);
12941 return DAG.getSelect(dl, VT, Overflow, SatMax, Product);
12942 }
12943 }
12944
12945 assert(((Signed && Scale < VTSize) || (!Signed && Scale <= VTSize)) &&
12946 "Expected scale to be less than the number of bits if signed or at "
12947 "most the number of bits if unsigned.");
12948 assert(LHS.getValueType() == RHS.getValueType() &&
12949 "Expected both operands to be the same type");
12950
12951 // Select the saturated value when Cond0 <CC> Cond1, keeping it vectorized:
12952 // SELECT_CC is scalarized for vector types, so build SETCC + VSELECT there.
12953 auto getSaturatingSelect = [&](SDValue Cond0, SDValue Cond1, SDValue Sat,
12954 SDValue Val, ISD::CondCode CC) {
12955 if (VT.isVector())
12956 return DAG.getSelect(dl, VT, DAG.getSetCC(dl, BoolVT, Cond0, Cond1, CC),
12957 Sat, Val);
12958 return DAG.getSelectCC(dl, Cond0, Cond1, Sat, Val, CC);
12959 };
12960
12961 // Get the upper and lower bits of the result.
12962 SDValue Lo, Hi;
12963 unsigned LoHiOp = Signed ? ISD::SMUL_LOHI : ISD::UMUL_LOHI;
12964 unsigned HiOp = Signed ? ISD::MULHS : ISD::MULHU;
12965 EVT WideVT = VT.widenIntegerElementType(*DAG.getContext());
12966 if (isOperationLegalOrCustom(LoHiOp, VT)) {
12967 SDValue Result = DAG.getNode(LoHiOp, dl, DAG.getVTList(VT, VT), LHS, RHS);
12968 Lo = Result.getValue(0);
12969 Hi = Result.getValue(1);
12970 } else if (isOperationLegalOrCustom(HiOp, VT)) {
12971 Lo = DAG.getNode(ISD::MUL, dl, VT, LHS, RHS);
12972 Hi = DAG.getNode(HiOp, dl, VT, LHS, RHS);
12973 } else if (isOperationLegalOrCustom(ISD::MUL, WideVT)) {
12974 // Try for a multiplication using a wider type.
12975 unsigned Ext = Signed ? ISD::SIGN_EXTEND : ISD::ZERO_EXTEND;
12976 SDValue LHSExt = DAG.getNode(Ext, dl, WideVT, LHS);
12977 SDValue RHSExt = DAG.getNode(Ext, dl, WideVT, RHS);
12978 SDValue Res = DAG.getNode(ISD::MUL, dl, WideVT, LHSExt, RHSExt);
12979 Lo = DAG.getNode(ISD::TRUNCATE, dl, VT, Res);
12980 SDValue Shifted =
12981 DAG.getNode(ISD::SRA, dl, WideVT, Res,
12982 DAG.getShiftAmountConstant(VTSize, WideVT, dl));
12983 Hi = DAG.getNode(ISD::TRUNCATE, dl, VT, Shifted);
12984 } else if (VT.isVector()) {
12985 return SDValue();
12986 } else {
12987 forceExpandWideMUL(DAG, dl, Signed, LHS, RHS, Lo, Hi);
12988 }
12989
12990 if (Scale == VTSize)
12991 // Result is just the top half since we'd be shifting by the width of the
12992 // operand. Overflow impossible so this works for both UMULFIX and
12993 // UMULFIXSAT.
12994 return Hi;
12995
12996 // The result will need to be shifted right by the scale since both operands
12997 // are scaled. The result is given to us in 2 halves, so we only want part of
12998 // both in the result.
12999 SDValue Result = DAG.getNode(ISD::FSHR, dl, VT, Hi, Lo,
13000 DAG.getShiftAmountConstant(Scale, VT, dl));
13001 if (!Saturating)
13002 return Result;
13003
13004 if (!Signed) {
13005 // Unsigned overflow happened if the upper (VTSize - Scale) bits (of the
13006 // widened multiplication) aren't all zeroes.
13007
13008 // Saturate to max if ((Hi >> Scale) != 0),
13009 // which is the same as if (Hi > ((1 << Scale) - 1))
13010 APInt MaxVal = APInt::getMaxValue(VTSize);
13011 SDValue LowMask =
13012 DAG.getConstant(APInt::getLowBitsSet(VTSize, Scale), dl, VT);
13013 return getSaturatingSelect(Hi, LowMask, DAG.getConstant(MaxVal, dl, VT),
13014 Result, ISD::SETUGT);
13015 }
13016
13017 // Signed overflow happened if the upper (VTSize - Scale + 1) bits (of the
13018 // widened multiplication) aren't all ones or all zeroes.
13019
13020 SDValue SatMin = DAG.getConstant(APInt::getSignedMinValue(VTSize), dl, VT);
13021 SDValue SatMax = DAG.getConstant(APInt::getSignedMaxValue(VTSize), dl, VT);
13022
13023 if (Scale == 0) {
13024 SDValue Sign = DAG.getNode(ISD::SRA, dl, VT, Lo,
13025 DAG.getShiftAmountConstant(VTSize - 1, VT, dl));
13026 SDValue Overflow = DAG.getSetCC(dl, BoolVT, Hi, Sign, ISD::SETNE);
13027 // Saturated to SatMin if wide product is negative, and SatMax if wide
13028 // product is positive ...
13029 SDValue Zero = DAG.getConstant(0, dl, VT);
13030 SDValue ResultIfOverflow =
13031 getSaturatingSelect(Hi, Zero, SatMin, SatMax, ISD::SETLT);
13032 // ... but only if we overflowed.
13033 return DAG.getSelect(dl, VT, Overflow, ResultIfOverflow, Result);
13034 }
13035
13036 // We handled Scale==0 above so all the bits to examine is in Hi.
13037
13038 // Saturate to max if ((Hi >> (Scale - 1)) > 0),
13039 // which is the same as if (Hi > (1 << (Scale - 1)) - 1)
13040 SDValue LowMask =
13041 DAG.getConstant(APInt::getLowBitsSet(VTSize, Scale - 1), dl, VT);
13042 // Saturate to min if (Hi >> (Scale - 1)) < -1),
13043 // which is the same as if (HI < (-1 << (Scale - 1))
13044 SDValue HighMask = DAG.getConstant(
13045 APInt::getHighBitsSet(VTSize, VTSize - Scale + 1), dl, VT);
13046 Result = getSaturatingSelect(Hi, LowMask, SatMax, Result, ISD::SETGT);
13047 Result = getSaturatingSelect(Hi, HighMask, SatMin, Result, ISD::SETLT);
13048 return Result;
13049}
13050
13051SDValue
13053 SDValue LHS, SDValue RHS,
13054 unsigned Scale, SelectionDAG &DAG) const {
13055 assert((Opcode == ISD::SDIVFIX || Opcode == ISD::SDIVFIXSAT ||
13056 Opcode == ISD::UDIVFIX || Opcode == ISD::UDIVFIXSAT) &&
13057 "Expected a fixed point division opcode");
13058
13059 EVT VT = LHS.getValueType();
13060 bool Signed = Opcode == ISD::SDIVFIX || Opcode == ISD::SDIVFIXSAT;
13061 bool Saturating = Opcode == ISD::SDIVFIXSAT || Opcode == ISD::UDIVFIXSAT;
13062 EVT BoolVT = getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
13063
13064 // If there is enough room in the type to upscale the LHS or downscale the
13065 // RHS before the division, we can perform it in this type without having to
13066 // resize. For signed operations, the LHS headroom is the number of
13067 // redundant sign bits, and for unsigned ones it is the number of zeroes.
13068 // The headroom for the RHS is the number of trailing zeroes.
13069 unsigned LHSLead = Signed ? DAG.ComputeNumSignBits(LHS) - 1
13071 unsigned RHSTrail = DAG.computeKnownBits(RHS).countMinTrailingZeros();
13072
13073 // For signed saturating operations, we need to be able to detect true integer
13074 // division overflow; that is, when you have MIN / -EPS. However, this
13075 // is undefined behavior and if we emit divisions that could take such
13076 // values it may cause undesired behavior (arithmetic exceptions on x86, for
13077 // example).
13078 // Avoid this by requiring an extra bit so that we never get this case.
13079 // FIXME: This is a bit unfortunate as it means that for an 8-bit 7-scale
13080 // signed saturating division, we need to emit a whopping 32-bit division.
13081 if (LHSLead + RHSTrail < Scale + (unsigned)(Saturating && Signed))
13082 return SDValue();
13083
13084 unsigned LHSShift = std::min(LHSLead, Scale);
13085 unsigned RHSShift = Scale - LHSShift;
13086
13087 // At this point, we know that if we shift the LHS up by LHSShift and the
13088 // RHS down by RHSShift, we can emit a regular division with a final scaling
13089 // factor of Scale.
13090
13091 if (LHSShift)
13092 LHS = DAG.getNode(ISD::SHL, dl, VT, LHS,
13093 DAG.getShiftAmountConstant(LHSShift, VT, dl));
13094 if (RHSShift)
13095 RHS = DAG.getNode(Signed ? ISD::SRA : ISD::SRL, dl, VT, RHS,
13096 DAG.getShiftAmountConstant(RHSShift, VT, dl));
13097
13098 SDValue Quot;
13099 if (Signed) {
13100 // For signed operations, if the resulting quotient is negative and the
13101 // remainder is nonzero, subtract 1 from the quotient to round towards
13102 // negative infinity.
13103 SDValue Rem;
13104 // FIXME: Ideally we would always produce an SDIVREM here, but if the
13105 // type isn't legal, SDIVREM cannot be expanded. There is no reason why
13106 // we couldn't just form a libcall, but the type legalizer doesn't do it.
13107 if (isTypeLegal(VT) &&
13109 Quot = DAG.getNode(ISD::SDIVREM, dl,
13110 DAG.getVTList(VT, VT),
13111 LHS, RHS);
13112 Rem = Quot.getValue(1);
13113 Quot = Quot.getValue(0);
13114 } else {
13115 Quot = DAG.getNode(ISD::SDIV, dl, VT,
13116 LHS, RHS);
13117 Rem = DAG.getNode(ISD::SREM, dl, VT,
13118 LHS, RHS);
13119 }
13120 SDValue Zero = DAG.getConstant(0, dl, VT);
13121 SDValue RemNonZero = DAG.getSetCC(dl, BoolVT, Rem, Zero, ISD::SETNE);
13122 SDValue LHSNeg = DAG.getSetCC(dl, BoolVT, LHS, Zero, ISD::SETLT);
13123 SDValue RHSNeg = DAG.getSetCC(dl, BoolVT, RHS, Zero, ISD::SETLT);
13124 SDValue QuotNeg = DAG.getNode(ISD::XOR, dl, BoolVT, LHSNeg, RHSNeg);
13125 SDValue Sub1 = DAG.getNode(ISD::SUB, dl, VT, Quot,
13126 DAG.getConstant(1, dl, VT));
13127 Quot = DAG.getSelect(dl, VT,
13128 DAG.getNode(ISD::AND, dl, BoolVT, RemNonZero, QuotNeg),
13129 Sub1, Quot);
13130 } else
13131 Quot = DAG.getNode(ISD::UDIV, dl, VT,
13132 LHS, RHS);
13133
13134 return Quot;
13135}
13136
13138 SDNode *Node, SDValue &Result, SDValue &Overflow, SelectionDAG &DAG) const {
13139 SDLoc dl(Node);
13140 SDValue LHS = Node->getOperand(0);
13141 SDValue RHS = Node->getOperand(1);
13142 bool IsAdd = Node->getOpcode() == ISD::UADDO;
13143
13144 // If UADDO_CARRY/SUBO_CARRY is legal, use that instead.
13145 unsigned OpcCarry = IsAdd ? ISD::UADDO_CARRY : ISD::USUBO_CARRY;
13146 if (isOperationLegalOrCustom(OpcCarry, Node->getValueType(0))) {
13147 SDValue CarryIn = DAG.getConstant(0, dl, Node->getValueType(1));
13148 SDValue NodeCarry = DAG.getNode(OpcCarry, dl, Node->getVTList(),
13149 { LHS, RHS, CarryIn });
13150 Result = SDValue(NodeCarry.getNode(), 0);
13151 Overflow = SDValue(NodeCarry.getNode(), 1);
13152 return;
13153 }
13154
13155 Result = DAG.getNode(IsAdd ? ISD::ADD : ISD::SUB, dl,
13156 LHS.getValueType(), LHS, RHS);
13157
13158 EVT ResultType = Node->getValueType(1);
13159 EVT SetCCType = getSetCCResultType(
13160 DAG.getDataLayout(), *DAG.getContext(), Node->getValueType(0));
13161 SDValue SetCC;
13162 if (IsAdd && isOneConstant(RHS)) {
13163 // Special case: uaddo X, 1 overflowed if X+1 is 0. This potential reduces
13164 // the live range of X. We assume comparing with 0 is cheap.
13165 // The general case (X + C) < C is not necessarily beneficial. Although we
13166 // reduce the live range of X, we may introduce the materialization of
13167 // constant C.
13168 SetCC =
13169 DAG.getSetCC(dl, SetCCType, Result,
13170 DAG.getConstant(0, dl, Node->getValueType(0)), ISD::SETEQ);
13171 } else if (IsAdd && isAllOnesConstant(RHS)) {
13172 // Special case: uaddo X, -1 overflows if X != 0.
13173 SetCC =
13174 DAG.getSetCC(dl, SetCCType, LHS,
13175 DAG.getConstant(0, dl, Node->getValueType(0)), ISD::SETNE);
13176 } else {
13177 ISD::CondCode CC = IsAdd ? ISD::SETULT : ISD::SETUGT;
13178 SetCC = DAG.getSetCC(dl, SetCCType, Result, LHS, CC);
13179 }
13180 Overflow = DAG.getBoolExtOrTrunc(SetCC, dl, ResultType, ResultType);
13181}
13182
13184 SDNode *Node, SDValue &Result, SDValue &Overflow, SelectionDAG &DAG) const {
13185 SDLoc dl(Node);
13186 SDValue LHS = Node->getOperand(0);
13187 SDValue RHS = Node->getOperand(1);
13188 bool IsAdd = Node->getOpcode() == ISD::SADDO;
13189
13190 Result = DAG.getNode(IsAdd ? ISD::ADD : ISD::SUB, dl,
13191 LHS.getValueType(), LHS, RHS);
13192
13193 EVT ResultType = Node->getValueType(1);
13194 EVT OType = getSetCCResultType(
13195 DAG.getDataLayout(), *DAG.getContext(), Node->getValueType(0));
13196
13197 // If SADDSAT/SSUBSAT is legal, compare results to detect overflow.
13198 unsigned OpcSat = IsAdd ? ISD::SADDSAT : ISD::SSUBSAT;
13199 if (isOperationLegal(OpcSat, LHS.getValueType())) {
13200 SDValue Sat = DAG.getNode(OpcSat, dl, LHS.getValueType(), LHS, RHS);
13201 SDValue SetCC = DAG.getSetCC(dl, OType, Result, Sat, ISD::SETNE);
13202 Overflow = DAG.getBoolExtOrTrunc(SetCC, dl, ResultType, ResultType);
13203 return;
13204 }
13205
13206 SDValue Zero = DAG.getConstant(0, dl, LHS.getValueType());
13207
13208 if (IsAdd) {
13209 // For an addition, the result should be less than one of the operands (LHS)
13210 // if and only if the other operand (RHS) is negative, otherwise there will
13211 // be overflow.
13212 SDValue ResultLowerThanLHS =
13213 DAG.getSetCC(dl, OType, Result, LHS, ISD::SETLT);
13214 SDValue RHSNegative = DAG.getSetCC(dl, OType, RHS, Zero, ISD::SETLT);
13215 Overflow = DAG.getBoolExtOrTrunc(
13216 DAG.getNode(ISD::XOR, dl, OType, RHSNegative, ResultLowerThanLHS), dl,
13217 ResultType, ResultType);
13218 } else {
13219 // For subtraction, overflow occurs when the signed comparison of operands
13220 // doesn't match the sign of the result.
13221 SDValue LHSLessThanRHS = DAG.getSetCC(dl, OType, LHS, RHS, ISD::SETLT);
13222 SDValue ResultNegative = DAG.getSetCC(dl, OType, Result, Zero, ISD::SETLT);
13223 Overflow = DAG.getBoolExtOrTrunc(
13224 DAG.getNode(ISD::XOR, dl, OType, LHSLessThanRHS, ResultNegative), dl,
13225 ResultType, ResultType);
13226 }
13227}
13228
13230 SDValue &Overflow, SelectionDAG &DAG) const {
13231 SDLoc dl(Node);
13232 EVT VT = Node->getValueType(0);
13233 EVT SetCCVT = getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
13234 SDValue LHS = Node->getOperand(0);
13235 SDValue RHS = Node->getOperand(1);
13236 bool isSigned = Node->getOpcode() == ISD::SMULO;
13237
13238 // For power-of-two multiplications we can use a simpler shift expansion.
13239 if (ConstantSDNode *RHSC = isConstOrConstSplat(RHS)) {
13240 const APInt &C = RHSC->getAPIntValue();
13241 // mulo(X, 1 << S) -> { X << S, (X << S) >> S != X }
13242 if (C.isPowerOf2()) {
13243 // smulo(x, signed_min) is same as umulo(x, signed_min).
13244 bool UseArithShift = isSigned && !C.isMinSignedValue();
13245 SDValue ShiftAmt = DAG.getShiftAmountConstant(C.logBase2(), VT, dl);
13246 Result = DAG.getNode(ISD::SHL, dl, VT, LHS, ShiftAmt);
13247 Overflow = DAG.getSetCC(dl, SetCCVT,
13248 DAG.getNode(UseArithShift ? ISD::SRA : ISD::SRL,
13249 dl, VT, Result, ShiftAmt),
13250 LHS, ISD::SETNE);
13251 return true;
13252 }
13253 }
13254
13255 SDValue BottomHalf;
13256 SDValue TopHalf;
13257 EVT WideVT = VT.widenIntegerElementType(*DAG.getContext());
13258
13259 static const unsigned Ops[2][3] =
13262 if (isOperationLegalOrCustom(Ops[isSigned][0], VT)) {
13263 BottomHalf = DAG.getNode(Ops[isSigned][0], dl, DAG.getVTList(VT, VT), LHS,
13264 RHS);
13265 TopHalf = BottomHalf.getValue(1);
13266 } else if (isOperationLegalOrCustom(Ops[isSigned][1], VT)) {
13267 BottomHalf = DAG.getNode(ISD::MUL, dl, VT, LHS, RHS);
13268 TopHalf = DAG.getNode(Ops[isSigned][1], dl, VT, LHS, RHS);
13269 } else if (isTypeLegal(WideVT)) {
13270 LHS = DAG.getNode(Ops[isSigned][2], dl, WideVT, LHS);
13271 RHS = DAG.getNode(Ops[isSigned][2], dl, WideVT, RHS);
13272 SDValue Mul = DAG.getNode(ISD::MUL, dl, WideVT, LHS, RHS);
13273 BottomHalf = DAG.getNode(ISD::TRUNCATE, dl, VT, Mul);
13274 SDValue ShiftAmt =
13275 DAG.getShiftAmountConstant(VT.getScalarSizeInBits(), WideVT, dl);
13276 TopHalf = DAG.getNode(ISD::TRUNCATE, dl, VT,
13277 DAG.getNode(ISD::SRL, dl, WideVT, Mul, ShiftAmt));
13278 } else {
13279 if (VT.isVector())
13280 return false;
13281
13282 forceExpandWideMUL(DAG, dl, isSigned, LHS, RHS, BottomHalf, TopHalf);
13283 }
13284
13285 Result = BottomHalf;
13286 if (isSigned) {
13287 SDValue ShiftAmt = DAG.getShiftAmountConstant(
13288 VT.getScalarSizeInBits() - 1, BottomHalf.getValueType(), dl);
13289 SDValue Sign = DAG.getNode(ISD::SRA, dl, VT, BottomHalf, ShiftAmt);
13290 Overflow = DAG.getSetCC(dl, SetCCVT, TopHalf, Sign, ISD::SETNE);
13291 } else {
13292 Overflow = DAG.getSetCC(dl, SetCCVT, TopHalf,
13293 DAG.getConstant(0, dl, VT), ISD::SETNE);
13294 }
13295
13296 // Truncate the result if SetCC returns a larger type than needed.
13297 EVT RType = Node->getValueType(1);
13298 if (RType.bitsLT(Overflow.getValueType()))
13299 Overflow = DAG.getNode(ISD::TRUNCATE, dl, RType, Overflow);
13300
13301 assert(RType.getSizeInBits() == Overflow.getValueSizeInBits() &&
13302 "Unexpected result type for S/UMULO legalization");
13303 return true;
13304}
13305
13307 SDLoc dl(Node);
13308 ISD::NodeType BaseOpcode = ISD::getVecReduceBaseOpcode(Node->getOpcode());
13309 SDValue Op = Node->getOperand(0);
13310 SDNodeFlags Flags = Node->getFlags();
13311 EVT VT = Op.getValueType();
13312
13313 // Try to use a shuffle reduction for power of two vectors.
13314 if (VT.isPow2VectorType()) {
13315 // See if the reduction opcode is safe to use with widened types.
13316 bool WidenSrc = false;
13317 switch (Node->getOpcode()) {
13320 case ISD::VECREDUCE_ADD:
13321 case ISD::VECREDUCE_MUL:
13322 case ISD::VECREDUCE_AND:
13323 case ISD::VECREDUCE_OR:
13324 case ISD::VECREDUCE_XOR:
13329 WidenSrc = VT.isFixedLengthVector();
13330 break;
13331 }
13332
13334 EVT HalfVT = VT.getHalfNumVectorElementsVT(*DAG.getContext());
13335 if (!isOperationLegalOrCustom(BaseOpcode, HalfVT)) {
13336 if (WidenSrc && Op.getOpcode() != ISD::BUILD_VECTOR) {
13337 // Attempt to widen the source vectors to a legal op.
13338 EVT WideVT = getTypeToTransformTo(*DAG.getContext(), HalfVT);
13339 if (WideVT.isVector() &&
13340 WideVT.getScalarType() == HalfVT.getScalarType() &&
13341 WideVT.getVectorNumElements() >= HalfVT.getVectorNumElements() &&
13342 isOperationLegalOrCustom(BaseOpcode, WideVT)) {
13343 SDValue Lo, Hi;
13344 std::tie(Lo, Hi) = DAG.SplitVector(Op, dl);
13345 Lo = DAG.getInsertSubvector(dl, DAG.getPOISON(WideVT), Lo, 0);
13346 Hi = DAG.getInsertSubvector(dl, DAG.getPOISON(WideVT), Hi, 0);
13347 Op = DAG.getNode(BaseOpcode, dl, WideVT, Lo, Hi, Flags);
13348 Op = DAG.getExtractSubvector(dl, HalfVT, Op, 0);
13349 VT = HalfVT;
13350 continue;
13351 }
13352 }
13353 break;
13354 }
13355
13356 SDValue Lo, Hi;
13357 std::tie(Lo, Hi) = DAG.SplitVector(Op, dl);
13358 Op = DAG.getNode(BaseOpcode, dl, HalfVT, Lo, Hi, Flags);
13359 VT = HalfVT;
13360
13361 // Stop if splitting is enough to make the reduction legal.
13362 if (isOperationLegalOrCustom(Node->getOpcode(), HalfVT))
13363 return DAG.getNode(Node->getOpcode(), dl, Node->getValueType(0), Op,
13364 Flags);
13365 }
13366 }
13367
13368 if (VT.isScalableVector())
13370 "Expanding reductions for scalable vectors is undefined.");
13371
13372 EVT EltVT = VT.getVectorElementType();
13373 unsigned NumElts = VT.getVectorNumElements();
13374
13376 DAG.ExtractVectorElements(Op, Ops, 0, NumElts);
13377
13378 SDValue Res = Ops[0];
13379 for (unsigned i = 1; i < NumElts; i++)
13380 Res = DAG.getNode(BaseOpcode, dl, EltVT, Res, Ops[i], Flags);
13381
13382 // Result type may be wider than element type.
13383 if (EltVT != Node->getValueType(0))
13384 Res = DAG.getNode(ISD::ANY_EXTEND, dl, Node->getValueType(0), Res);
13385 return Res;
13386}
13387
13389 SDLoc dl(Node);
13390 SDValue AccOp = Node->getOperand(0);
13391 SDValue VecOp = Node->getOperand(1);
13392 SDNodeFlags Flags = Node->getFlags();
13393
13394 EVT VT = VecOp.getValueType();
13395 EVT EltVT = VT.getVectorElementType();
13396
13397 if (VT.isScalableVector())
13399 "Expanding reductions for scalable vectors is undefined.");
13400
13401 unsigned NumElts = VT.getVectorNumElements();
13402
13404 DAG.ExtractVectorElements(VecOp, Ops, 0, NumElts);
13405
13406 unsigned BaseOpcode = ISD::getVecReduceBaseOpcode(Node->getOpcode());
13407
13408 SDValue Res = AccOp;
13409 for (unsigned i = 0; i < NumElts; i++)
13410 Res = DAG.getNode(BaseOpcode, dl, EltVT, Res, Ops[i], Flags);
13411
13412 return Res;
13413}
13414
13416 SelectionDAG &DAG) const {
13417 EVT VT = Node->getValueType(0);
13418 SDLoc dl(Node);
13419 bool isSigned = Node->getOpcode() == ISD::SREM;
13420 unsigned DivOpc = isSigned ? ISD::SDIV : ISD::UDIV;
13421 unsigned DivRemOpc = isSigned ? ISD::SDIVREM : ISD::UDIVREM;
13422 SDValue Dividend = Node->getOperand(0);
13423 SDValue Divisor = Node->getOperand(1);
13424 if (isOperationLegalOrCustom(DivRemOpc, VT)) {
13425 SDVTList VTs = DAG.getVTList(VT, VT);
13426 Result = DAG.getNode(DivRemOpc, dl, VTs, Dividend, Divisor).getValue(1);
13427 return true;
13428 }
13429 if (isOperationLegalOrCustom(DivOpc, VT)) {
13430 // X % Y -> X-X/Y*Y
13431 SDValue Divide = DAG.getNode(DivOpc, dl, VT, Dividend, Divisor);
13432 SDValue Mul = DAG.getNode(ISD::MUL, dl, VT, Divide, Divisor);
13433 Result = DAG.getNode(ISD::SUB, dl, VT, Dividend, Mul);
13434 return true;
13435 }
13436 return false;
13437}
13438
13440 SelectionDAG &DAG) const {
13441 bool IsSigned = Node->getOpcode() == ISD::FP_TO_SINT_SAT;
13442 SDLoc dl(SDValue(Node, 0));
13443 SDValue Src = Node->getOperand(0);
13444
13445 // DstVT is the result type, while SatVT is the size to which we saturate
13446 EVT SrcVT = Src.getValueType();
13447 EVT DstVT = Node->getValueType(0);
13448
13449 EVT SatVT = cast<VTSDNode>(Node->getOperand(1))->getVT();
13450 unsigned SatWidth = SatVT.getScalarSizeInBits();
13451 unsigned DstWidth = DstVT.getScalarSizeInBits();
13452 assert(SatWidth <= DstWidth &&
13453 "Expected saturation width smaller than result width");
13454
13455 // Determine minimum and maximum integer values and their corresponding
13456 // floating-point values.
13457 APInt MinInt, MaxInt;
13458 if (IsSigned) {
13459 MinInt = APInt::getSignedMinValue(SatWidth).sext(DstWidth);
13460 MaxInt = APInt::getSignedMaxValue(SatWidth).sext(DstWidth);
13461 } else {
13462 MinInt = APInt::getMinValue(SatWidth).zext(DstWidth);
13463 MaxInt = APInt::getMaxValue(SatWidth).zext(DstWidth);
13464 }
13465
13466 // We cannot risk emitting FP_TO_XINT nodes with a source VT of [b]f16, as
13467 // libcall emission cannot handle this. Large result types will fail.
13468 if (SrcVT == MVT::f16 || SrcVT == MVT::bf16) {
13469 Src = DAG.getNode(ISD::FP_EXTEND, dl, MVT::f32, Src);
13470 SrcVT = Src.getValueType();
13471 }
13472
13473 const fltSemantics &Sem = SrcVT.getFltSemantics();
13474 APFloat MinFloat(Sem);
13475 APFloat MaxFloat(Sem);
13476
13477 APFloat::opStatus MinStatus =
13478 MinFloat.convertFromAPInt(MinInt, IsSigned, APFloat::rmTowardZero);
13479 APFloat::opStatus MaxStatus =
13480 MaxFloat.convertFromAPInt(MaxInt, IsSigned, APFloat::rmTowardZero);
13481 bool AreExactFloatBounds = !(MinStatus & APFloat::opStatus::opInexact) &&
13482 !(MaxStatus & APFloat::opStatus::opInexact);
13483
13484 SDValue MinFloatNode = DAG.getConstantFP(MinFloat, dl, SrcVT);
13485 SDValue MaxFloatNode = DAG.getConstantFP(MaxFloat, dl, SrcVT);
13486
13487 // If the integer bounds are exactly representable as floats and min/max are
13488 // legal, emit a min+max+fptoi sequence. Otherwise we have to use a sequence
13489 // of comparisons and selects.
13490 auto EmitMinMax = [&](unsigned MinOpcode, unsigned MaxOpcode,
13491 bool MayPropagateNaN) {
13492 bool MinMaxLegal = isOperationLegalOrCustom(MinOpcode, SrcVT) &&
13493 isOperationLegalOrCustom(MaxOpcode, SrcVT);
13494 if (!MinMaxLegal)
13495 return SDValue();
13496
13497 SDValue Clamped = Src;
13498
13499 // Clamp Src by MinFloat from below. If !MayPropagateNaN and Src is NaN
13500 // then the result is MinFloat.
13501 Clamped = DAG.getNode(MaxOpcode, dl, SrcVT, Clamped, MinFloatNode);
13502 // Clamp by MaxFloat from above. If !MayPropagateNaN then NaN cannot occur.
13503 Clamped = DAG.getNode(MinOpcode, dl, SrcVT, Clamped, MaxFloatNode);
13504 // Convert clamped value to integer.
13505 SDValue FpToInt = DAG.getNode(IsSigned ? ISD::FP_TO_SINT : ISD::FP_TO_UINT,
13506 dl, DstVT, Clamped);
13507
13508 // If !MayPropagateNan and the conversion is unsigned case we're done,
13509 // because we mapped NaN to MinFloat, which will cast to zero.
13510 if (!MayPropagateNaN && !IsSigned)
13511 return FpToInt;
13512
13513 // Otherwise, select 0 if Src is NaN.
13514 SDValue ZeroInt = DAG.getConstant(0, dl, DstVT);
13515 EVT SetCCVT =
13516 getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), SrcVT);
13517 SDValue IsNan = DAG.getSetCC(dl, SetCCVT, Src, Src, ISD::CondCode::SETUO);
13518 return DAG.getSelect(dl, DstVT, IsNan, ZeroInt, FpToInt);
13519 };
13520 if (AreExactFloatBounds) {
13521 if (SDValue Res = EmitMinMax(ISD::FMINIMUMNUM, ISD::FMAXIMUMNUM,
13522 /*MayPropagateNaN=*/false))
13523 return Res;
13524 // These may propagate NaN for sNaN operands.
13525 if (SDValue Res =
13526 EmitMinMax(ISD::FMINNUM, ISD::FMAXNUM, /*MayPropagateNaN=*/true))
13527 return Res;
13528 // These always propagate NaN.
13529 if (SDValue Res =
13530 EmitMinMax(ISD::FMINIMUM, ISD::FMAXIMUM, /*MayPropagateNaN=*/true))
13531 return Res;
13532 }
13533
13534 SDValue MinIntNode = DAG.getConstant(MinInt, dl, DstVT);
13535 SDValue MaxIntNode = DAG.getConstant(MaxInt, dl, DstVT);
13536
13537 // Result of direct conversion. The assumption here is that the operation is
13538 // non-trapping and it's fine to apply it to an out-of-range value if we
13539 // select it away later.
13540 SDValue FpToInt =
13541 DAG.getNode(IsSigned ? ISD::FP_TO_SINT : ISD::FP_TO_UINT, dl, DstVT, Src);
13542
13543 SDValue Select = FpToInt;
13544
13545 EVT SetCCVT =
13546 getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), SrcVT);
13547
13548 // If Src ULT MinFloat, select MinInt. In particular, this also selects
13549 // MinInt if Src is NaN.
13550 SDValue ULT = DAG.getSetCC(dl, SetCCVT, Src, MinFloatNode, ISD::SETULT);
13551 Select = DAG.getSelect(dl, DstVT, ULT, MinIntNode, Select);
13552 // If Src OGT MaxFloat, select MaxInt.
13553 SDValue OGT = DAG.getSetCC(dl, SetCCVT, Src, MaxFloatNode, ISD::SETOGT);
13554 Select = DAG.getSelect(dl, DstVT, OGT, MaxIntNode, Select);
13555
13556 // In the unsigned case we are done, because we mapped NaN to MinInt, which
13557 // is already zero.
13558 if (!IsSigned)
13559 return Select;
13560
13561 // Otherwise, select 0 if Src is NaN.
13562 SDValue ZeroInt = DAG.getConstant(0, dl, DstVT);
13563 SDValue IsNan = DAG.getSetCC(dl, SetCCVT, Src, Src, ISD::CondCode::SETUO);
13564 return DAG.getSelect(dl, DstVT, IsNan, ZeroInt, Select);
13565}
13566
13568 const SDLoc &dl,
13569 SelectionDAG &DAG) const {
13570 EVT OperandVT = Op.getValueType();
13571 if (OperandVT.getScalarType() == ResultVT.getScalarType())
13572 return Op;
13573 EVT ResultIntVT = ResultVT.changeTypeToInteger();
13574 // We are rounding binary64/binary128 -> binary32 -> bfloat16. This
13575 // can induce double-rounding which may alter the results. We can
13576 // correct for this using a trick explained in: Boldo, Sylvie, and
13577 // Guillaume Melquiond. "When double rounding is odd." 17th IMACS
13578 // World Congress. 2005.
13579 SDValue Narrow = DAG.getFPExtendOrRound(Op, dl, ResultVT);
13580 SDValue NarrowAsWide = DAG.getFPExtendOrRound(Narrow, dl, OperandVT);
13581
13582 // We can keep the narrow value as-is if narrowing was exact (no
13583 // rounding error), the wide value was NaN (the narrow value is also
13584 // NaN and should be preserved) or if we rounded to the odd value.
13585 SDValue NarrowBits = DAG.getNode(ISD::BITCAST, dl, ResultIntVT, Narrow);
13586 SDValue One = DAG.getConstant(1, dl, ResultIntVT);
13587 SDValue NegativeOne = DAG.getAllOnesConstant(dl, ResultIntVT);
13588 SDValue And = DAG.getNode(ISD::AND, dl, ResultIntVT, NarrowBits, One);
13589 EVT ResultIntVTCCVT = getSetCCResultType(
13590 DAG.getDataLayout(), *DAG.getContext(), And.getValueType());
13591 SDValue Zero = DAG.getConstant(0, dl, ResultIntVT);
13592 // The result is already odd so we don't need to do anything.
13593 SDValue AlreadyOdd = DAG.getSetCC(dl, ResultIntVTCCVT, And, Zero, ISD::SETNE);
13594
13595 EVT WideSetCCVT = getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(),
13596 Op.getValueType());
13597 // We keep results which are exact, odd or NaN.
13598 SDValue KeepNarrow =
13599 DAG.getSetCC(dl, WideSetCCVT, Op, NarrowAsWide, ISD::SETUEQ);
13600 KeepNarrow = DAG.getNode(ISD::OR, dl, WideSetCCVT, KeepNarrow, AlreadyOdd);
13601 // We morally performed a round-down if AbsNarrow is smaller than
13602 // AbsWide.
13603 SDValue AbsWide = DAG.getNode(ISD::FABS, dl, OperandVT, Op);
13604 SDValue AbsNarrowAsWide = DAG.getNode(ISD::FABS, dl, OperandVT, NarrowAsWide);
13605 SDValue NarrowIsRd =
13606 DAG.getSetCC(dl, WideSetCCVT, AbsWide, AbsNarrowAsWide, ISD::SETOGT);
13607 // If the narrow value is odd or exact, pick it.
13608 // Otherwise, narrow is even and corresponds to either the rounded-up
13609 // or rounded-down value. If narrow is the rounded-down value, we want
13610 // the rounded-up value as it will be odd.
13611 SDValue Adjust = DAG.getSelect(dl, ResultIntVT, NarrowIsRd, One, NegativeOne);
13612 SDValue Adjusted = DAG.getNode(ISD::ADD, dl, ResultIntVT, NarrowBits, Adjust);
13613 Op = DAG.getSelect(dl, ResultIntVT, KeepNarrow, NarrowBits, Adjusted);
13614 return DAG.getNode(ISD::BITCAST, dl, ResultVT, Op);
13615}
13616
13618 assert(Node->getOpcode() == ISD::FP_ROUND && "Unexpected opcode!");
13619 SDValue Op = Node->getOperand(0);
13620 EVT VT = Node->getValueType(0);
13621 SDLoc dl(Node);
13622 if (VT.getScalarType() == MVT::bf16) {
13623 if (Node->getConstantOperandVal(1) == 1) {
13624 return DAG.getNode(ISD::FP_TO_BF16, dl, VT, Node->getOperand(0));
13625 }
13626 EVT OperandVT = Op.getValueType();
13627 SDValue IsNaN = DAG.getSetCC(
13628 dl,
13629 getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), OperandVT),
13630 Op, Op, ISD::SETUO);
13631
13632 // We are rounding binary64/binary128 -> binary32 -> bfloat16. This
13633 // can induce double-rounding which may alter the results. We can
13634 // correct for this using a trick explained in: Boldo, Sylvie, and
13635 // Guillaume Melquiond. "When double rounding is odd." 17th IMACS
13636 // World Congress. 2005.
13637 EVT F32 = VT.changeElementType(*DAG.getContext(), MVT::f32);
13638 EVT I32 = F32.changeTypeToInteger();
13639 Op = expandRoundInexactToOdd(F32, Op, dl, DAG);
13640 Op = DAG.getNode(ISD::BITCAST, dl, I32, Op);
13641
13642 // Conversions should set NaN's quiet bit. This also prevents NaNs from
13643 // turning into infinities.
13644 SDValue NaN =
13645 DAG.getNode(ISD::OR, dl, I32, Op, DAG.getConstant(0x400000, dl, I32));
13646
13647 // Factor in the contribution of the low 16 bits.
13648 SDValue One = DAG.getConstant(1, dl, I32);
13649 SDValue Lsb = DAG.getNode(ISD::SRL, dl, I32, Op,
13650 DAG.getShiftAmountConstant(16, I32, dl));
13651 Lsb = DAG.getNode(ISD::AND, dl, I32, Lsb, One);
13652 SDValue RoundingBias =
13653 DAG.getNode(ISD::ADD, dl, I32, Lsb, DAG.getConstant(0x7fff, dl, I32));
13654 SDValue Add = DAG.getNode(ISD::ADD, dl, I32, Op, RoundingBias);
13655
13656 // Don't round if we had a NaN, we don't want to turn 0x7fffffff into
13657 // 0x80000000.
13658 Op = DAG.getSelect(dl, I32, IsNaN, NaN, Add);
13659
13660 // Now that we have rounded, shift the bits into position.
13661 Op = DAG.getNode(ISD::SRL, dl, I32, Op,
13662 DAG.getShiftAmountConstant(16, I32, dl));
13663 EVT I16 = I32.changeElementType(*DAG.getContext(), MVT::i16);
13664 Op = DAG.getNode(ISD::TRUNCATE, dl, I16, Op);
13665 return DAG.getNode(ISD::BITCAST, dl, VT, Op);
13666 }
13667 return SDValue();
13668}
13669
13671 SelectionDAG &DAG) const {
13672 assert((Node->getOpcode() == ISD::VECTOR_SPLICE_LEFT ||
13673 Node->getOpcode() == ISD::VECTOR_SPLICE_RIGHT) &&
13674 "Unexpected opcode!");
13675 assert((Node->getValueType(0).isScalableVector() ||
13676 !isa<ConstantSDNode>(Node->getOperand(2))) &&
13677 "Fixed length vector types with constant offsets expected to use "
13678 "SHUFFLE_VECTOR!");
13679
13680 EVT VT = Node->getValueType(0);
13681 SDValue V1 = Node->getOperand(0);
13682 SDValue V2 = Node->getOperand(1);
13683 SDValue Offset = Node->getOperand(2);
13684 SDLoc DL(Node);
13685
13686 // Expand through memory thusly:
13687 // Alloca CONCAT_VECTORS_TYPES(V1, V2) Ptr
13688 // Store V1, Ptr
13689 // Store V2, Ptr + sizeof(V1)
13690 // if (VECTOR_SPLICE_LEFT)
13691 // Ptr = Ptr + (Offset * sizeof(VT.Elt))
13692 // else
13693 // Ptr = Ptr + sizeof(V1) - (Offset * size(VT.Elt))
13694 // Res = Load Ptr
13695
13696 Align Alignment = DAG.getReducedAlign(VT, /*UseABI=*/false);
13697
13699 VT.getVectorElementCount() * 2);
13700 SDValue StackPtr = DAG.CreateStackTemporary(MemVT.getStoreSize(), Alignment);
13701 EVT PtrVT = StackPtr.getValueType();
13702 auto &MF = DAG.getMachineFunction();
13703 auto FrameIndex = cast<FrameIndexSDNode>(StackPtr.getNode())->getIndex();
13704 auto PtrInfo = MachinePointerInfo::getFixedStack(MF, FrameIndex);
13705
13706 // Store the lo part of CONCAT_VECTORS(V1, V2)
13707 SDValue StoreV1 =
13708 DAG.getStore(DAG.getEntryNode(), DL, V1, StackPtr, PtrInfo, Alignment);
13709 // Store the hi part of CONCAT_VECTORS(V1, V2)
13710 SDValue VTBytes = DAG.getTypeSize(DL, PtrVT, VT.getStoreSize());
13711 SDValue StackPtr2 = DAG.getNode(ISD::ADD, DL, PtrVT, StackPtr, VTBytes);
13712 SDValue StoreV2 =
13713 DAG.getStore(StoreV1, DL, V2, StackPtr2, PtrInfo, Alignment);
13714
13715 // NOTE: TrailingBytes must be clamped so as not to read outside of V1:V2.
13716 SDValue EltByteSize =
13717 DAG.getTypeSize(DL, PtrVT, VT.getVectorElementType().getStoreSize());
13718 Offset = DAG.getZExtOrTrunc(Offset, DL, PtrVT);
13719 SDValue TrailingBytes = DAG.getNode(ISD::MUL, DL, PtrVT, Offset, EltByteSize);
13720
13721 TrailingBytes = DAG.getNode(ISD::UMIN, DL, PtrVT, TrailingBytes, VTBytes);
13722
13723 if (Node->getOpcode() == ISD::VECTOR_SPLICE_LEFT)
13724 StackPtr = DAG.getMemBasePlusOffset(StackPtr, TrailingBytes, DL);
13725 else
13726 StackPtr = DAG.getNode(ISD::SUB, DL, PtrVT, StackPtr2, TrailingBytes);
13727
13728 // Load the spliced result
13729 return DAG.getLoad(VT, DL, StoreV2, StackPtr,
13731}
13732
13734 SelectionDAG &DAG) const {
13735 SDLoc DL(Node);
13736 SDValue Vec = Node->getOperand(0);
13737 SDValue Mask = Node->getOperand(1);
13738 SDValue Passthru = Node->getOperand(2);
13739
13740 EVT VecVT = Vec.getValueType();
13741 EVT ScalarVT = VecVT.getScalarType();
13742 EVT MaskVT = Mask.getValueType();
13743 EVT MaskScalarVT = MaskVT.getScalarType();
13744
13745 // Needs to be handled by targets that have scalable vector types.
13746 if (VecVT.isScalableVector())
13747 report_fatal_error("Cannot expand masked_compress for scalable vectors.");
13748
13749 Align Alignment = DAG.getReducedAlign(VecVT, /*UseABI=*/false);
13750 SDValue StackPtr = DAG.CreateStackTemporary(VecVT.getStoreSize(), Alignment);
13751 int FI = cast<FrameIndexSDNode>(StackPtr.getNode())->getIndex();
13752 MachinePointerInfo PtrInfo =
13754
13755 MVT PositionVT = getVectorIdxTy(DAG.getDataLayout());
13756 SDValue Chain = DAG.getEntryNode();
13757 SDValue OutPos = DAG.getConstant(0, DL, PositionVT);
13758
13759 bool HasPassthru = !Passthru.isUndef();
13760
13761 // If we have a passthru vector, store it on the stack, overwrite the matching
13762 // positions and then re-write the last element that was potentially
13763 // overwritten even though mask[i] = false.
13764 if (HasPassthru)
13765 Chain = DAG.getStore(Chain, DL, Passthru, StackPtr, PtrInfo, Alignment);
13766
13767 SDValue LastWriteVal;
13768 APInt PassthruSplatVal;
13769 bool IsSplatPassthru =
13770 ISD::isConstantSplatVector(Passthru.getNode(), PassthruSplatVal);
13771
13772 if (IsSplatPassthru) {
13773 // As we do not know which position we wrote to last, we cannot simply
13774 // access that index from the passthru vector. So we first check if passthru
13775 // is a splat vector, to use any element ...
13776 LastWriteVal = DAG.getConstant(PassthruSplatVal, DL, ScalarVT);
13777 } else if (HasPassthru) {
13778 // ... if it is not a splat vector, we need to get the passthru value at
13779 // position = popcount(mask) and re-load it from the stack before it is
13780 // overwritten in the loop below.
13781 EVT PopcountVT = ScalarVT.changeTypeToInteger();
13782 SDValue Popcount = DAG.getNode(
13784 MaskVT.changeVectorElementType(*DAG.getContext(), MVT::i1), Mask);
13785 Popcount = DAG.getNode(
13787 MaskVT.changeVectorElementType(*DAG.getContext(), PopcountVT),
13788 Popcount);
13789 Popcount = DAG.getNode(ISD::VECREDUCE_ADD, DL, PopcountVT, Popcount);
13790 SDValue LastElmtPtr =
13791 getVectorElementPointer(DAG, StackPtr, VecVT, Popcount);
13792 LastWriteVal = DAG.getLoad(
13793 ScalarVT, DL, Chain, LastElmtPtr,
13795 Chain = LastWriteVal.getValue(1);
13796 }
13797
13798 unsigned NumElms = VecVT.getVectorNumElements();
13799 for (unsigned I = 0; I < NumElms; I++) {
13800 SDValue ValI = DAG.getExtractVectorElt(DL, ScalarVT, Vec, I);
13801 SDValue OutPtr = getVectorElementPointer(DAG, StackPtr, VecVT, OutPos);
13802 Chain = DAG.getStore(
13803 Chain, DL, ValI, OutPtr,
13805
13806 // Get the mask value and add it to the current output position. This
13807 // either increments by 1 if MaskI is true or adds 0 otherwise.
13808 // Freeze in case we have poison/undef mask entries.
13809 SDValue MaskI = DAG.getExtractVectorElt(DL, MaskScalarVT, Mask, I);
13810 MaskI = DAG.getFreeze(MaskI);
13811 MaskI = DAG.getNode(ISD::TRUNCATE, DL, MVT::i1, MaskI);
13812 MaskI = DAG.getNode(ISD::ZERO_EXTEND, DL, PositionVT, MaskI);
13813 OutPos = DAG.getNode(ISD::ADD, DL, PositionVT, OutPos, MaskI);
13814
13815 if (HasPassthru && I == NumElms - 1) {
13816 SDValue EndOfVector =
13817 DAG.getConstant(VecVT.getVectorNumElements() - 1, DL, PositionVT);
13818 SDValue AllLanesSelected =
13819 DAG.getSetCC(DL, MVT::i1, OutPos, EndOfVector, ISD::CondCode::SETUGT);
13820 OutPos = DAG.getNode(ISD::UMIN, DL, PositionVT, OutPos, EndOfVector);
13821 OutPtr = getVectorElementPointer(DAG, StackPtr, VecVT, OutPos);
13822
13823 // Re-write the last ValI if all lanes were selected. Otherwise,
13824 // overwrite the last write it with the passthru value.
13825 LastWriteVal = DAG.getSelect(DL, ScalarVT, AllLanesSelected, ValI,
13826 LastWriteVal, SDNodeFlags::Unpredictable);
13827 Chain = DAG.getStore(
13828 Chain, DL, LastWriteVal, OutPtr,
13830 }
13831 }
13832
13833 return DAG.getLoad(VecVT, DL, Chain, StackPtr, PtrInfo, Alignment);
13834}
13835
13837 SDLoc DL(Node);
13838 EVT VT = Node->getValueType(0);
13839
13840 bool ZeroIsPoison = Node->getOpcode() == ISD::CTTZ_ELTS_ZERO_POISON;
13841 auto [Mask, StepVec] =
13842 getLegalMaskAndStepVector(Node->getOperand(0), ZeroIsPoison, DL, DAG);
13843
13844 // No legal step vector: split mask in half and recombine results.
13845 // LoNumElts uses the non-poison CTTZ_ELTS so its result is well-defined
13846 // (== LoNumElts when no active lane), allowing the SETNE comparison.
13847 // Result: (ResLo != LoNumElts) ? ResLo : (LoNumElts + ResHi)
13848 if (!StepVec) {
13849 EVT ResVT = Node->getValueType(0);
13850 auto [MaskLo, MaskHi] = DAG.SplitVector(Node->getOperand(0), DL);
13851 SDValue LoNumElts = DAG.getElementCount(
13852 DL, ResVT, MaskLo.getValueType().getVectorElementCount());
13853 SDValue ResLo = DAG.getNode(ISD::CTTZ_ELTS, DL, ResVT, MaskLo);
13854 SDValue ResHi = DAG.getNode(Node->getOpcode(), DL, ResVT, MaskHi);
13855 SDValue ResLoNotNumElts = DAG.getSetCC(
13856 DL, getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), ResVT),
13857 ResLo, LoNumElts, ISD::SETNE);
13858 // Per LangRef, ResVT must be wide enough to hold the total element count,
13859 // so the sum cannot wrap as an unsigned add. NSW is not guaranteed since
13860 // the count is only required to fit unsigned.
13861 SDValue Sum = DAG.getNode(ISD::ADD, DL, ResVT, LoNumElts, ResHi,
13863 return DAG.getSelect(DL, ResVT, ResLoNotNumElts, ResLo, Sum);
13864 }
13865
13866 EVT StepVecVT = StepVec.getValueType();
13867 EVT StepVT = StepVecVT.getVectorElementType();
13868
13869 // Promote the scalar result type early to avoid redundant zexts.
13871 StepVT = getTypeToTransformTo(*DAG.getContext(), StepVT);
13872
13873 SDValue VL =
13874 DAG.getElementCount(DL, StepVT, StepVecVT.getVectorElementCount());
13875 SDValue SplatVL = DAG.getSplat(StepVecVT, DL, VL);
13876 StepVec = DAG.getNode(ISD::SUB, DL, StepVecVT, SplatVL, StepVec);
13877 SDValue Zeroes = DAG.getConstant(0, DL, StepVecVT);
13878 SDValue Select = DAG.getSelect(DL, StepVecVT, Mask, StepVec, Zeroes);
13880 StepVecVT.getVectorElementType(), Select);
13881 SDValue Sub = DAG.getNode(ISD::SUB, DL, StepVT, VL,
13882 DAG.getZExtOrTrunc(Max, DL, StepVT));
13883
13884 return DAG.getZExtOrTrunc(Sub, DL, VT);
13885}
13886
13888 SDLoc DL(N);
13889 SDValue Source = N->getOperand(0);
13890 SDValue Needle = N->getOperand(1);
13891 SDValue Mask = N->getOperand(2);
13892 EVT SourceVT = Source.getValueType();
13893 EVT NeedleVT = Needle.getValueType();
13894 EVT ResVT = N->getValueType(0);
13895 EVT CmpVT =
13896 getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), SourceVT);
13897
13898 assert(NeedleVT.isFixedLengthVector() && "Needle must be a fixed vector");
13899
13900 SDValue Ret = DAG.getConstant(0, DL, CmpVT);
13901 EVT NeedleEltVT = NeedleVT.getVectorElementType();
13902 for (unsigned I = 0, E = NeedleVT.getVectorNumElements(); I != E; ++I) {
13903 SDValue Splat;
13904 if (NeedleVT == SourceVT) {
13905 // Prefer a shuffle over scalar extracts + splat for fixed vectors.
13906 Splat = DAG.getVectorShuffle(
13907 SourceVT, DL, Needle, DAG.getUNDEF(SourceVT),
13909 } else {
13910 SDValue NeedleElt = DAG.getExtractVectorElt(DL, NeedleEltVT, Needle, I);
13911 Splat = DAG.getNode(ISD::SPLAT_VECTOR, DL, SourceVT, NeedleElt);
13912 }
13913 SDValue Cmp = DAG.getSetCC(DL, CmpVT, Source, Splat, ISD::SETEQ);
13914 Ret = DAG.getNode(ISD::OR, DL, CmpVT, Ret, Cmp);
13915 }
13916
13917 EVT UseVT = ResVT;
13918 // If the result is immediately truncated, only extend to that type (to avoid
13919 // unnecessary sign/zero extends).
13920 if (N->hasOneUse() && N->user_begin()->getOpcode() == ISD::TRUNCATE)
13921 UseVT = N->user_begin()->getValueType(0);
13922
13923 Mask = DAG.getBoolExtOrTrunc(Mask, DL, UseVT, Mask.getValueType());
13924 Ret = DAG.getBoolExtOrTrunc(Ret, DL, UseVT, Ret.getValueType());
13925
13926 Ret = DAG.getNode(ISD::AND, DL, UseVT, Ret, Mask);
13927 if (UseVT != ResVT)
13928 Ret = DAG.getNode(ISD::ANY_EXTEND, DL, ResVT, Ret);
13929 return Ret;
13930}
13931
13933 SelectionDAG &DAG) const {
13934 SDLoc DL(N);
13935 SDValue Acc = N->getOperand(0);
13936 SDValue MulLHS = N->getOperand(1);
13937 SDValue MulRHS = N->getOperand(2);
13938 EVT AccVT = Acc.getValueType();
13939 EVT MulOpVT = MulLHS.getValueType();
13940
13941 EVT ExtMulOpVT =
13943 MulOpVT.getVectorElementCount());
13944
13945 unsigned ExtOpcLHS, ExtOpcRHS;
13946 switch (N->getOpcode()) {
13947 default:
13948 llvm_unreachable("Unexpected opcode");
13950 ExtOpcLHS = ExtOpcRHS = ISD::ZERO_EXTEND;
13951 break;
13953 ExtOpcLHS = ExtOpcRHS = ISD::SIGN_EXTEND;
13954 break;
13956 ExtOpcLHS = ISD::SIGN_EXTEND;
13957 ExtOpcRHS = ISD::ZERO_EXTEND;
13958 break;
13960 ExtOpcLHS = ExtOpcRHS = ISD::FP_EXTEND;
13961 break;
13962 }
13963
13964 if (ExtMulOpVT != MulOpVT) {
13965 MulLHS = DAG.getNode(ExtOpcLHS, DL, ExtMulOpVT, MulLHS);
13966 MulRHS = DAG.getNode(ExtOpcRHS, DL, ExtMulOpVT, MulRHS);
13967 }
13968 SDValue Input = MulLHS;
13969 if (N->getOpcode() == ISD::PARTIAL_REDUCE_FMLA) {
13970 if (!llvm::isOneOrOneSplatFP(MulRHS))
13971 Input = DAG.getNode(ISD::FMUL, DL, ExtMulOpVT, MulLHS, MulRHS);
13972 } else if (!llvm::isOneOrOneSplat(MulRHS)) {
13973 Input = DAG.getNode(ISD::MUL, DL, ExtMulOpVT, MulLHS, MulRHS);
13974 }
13975
13976 unsigned Stride = AccVT.getVectorMinNumElements();
13977 unsigned ScaleFactor = MulOpVT.getVectorMinNumElements() / Stride;
13978
13979 // Collect all of the subvectors
13980 std::deque<SDValue> Subvectors = {Acc};
13981 for (unsigned I = 0; I < ScaleFactor; I++)
13982 Subvectors.push_back(DAG.getExtractSubvector(DL, AccVT, Input, I * Stride));
13983
13984 unsigned FlatNode =
13985 N->getOpcode() == ISD::PARTIAL_REDUCE_FMLA ? ISD::FADD : ISD::ADD;
13986
13987 // Flatten the subvector tree
13988 while (Subvectors.size() > 1) {
13989 Subvectors.push_back(
13990 DAG.getNode(FlatNode, DL, AccVT, {Subvectors[0], Subvectors[1]}));
13991 Subvectors.pop_front();
13992 Subvectors.pop_front();
13993 }
13994
13995 assert(Subvectors.size() == 1 &&
13996 "There should only be one subvector after tree flattening");
13997
13998 return Subvectors[0];
13999}
14000
14001/// Given a store node \p StoreNode, return true if it is safe to fold that node
14002/// into \p FPNode, which expands to a library call with output pointers.
14004 SDNode *FPNode) {
14006 SmallVector<const SDNode *, 8> DeferredNodes;
14008
14009 // Skip FPNode use by StoreNode (that's the use we want to fold into FPNode).
14010 for (SDValue Op : StoreNode->ops())
14011 if (Op.getNode() != FPNode)
14012 Worklist.push_back(Op.getNode());
14013
14015 while (!Worklist.empty()) {
14016 const SDNode *Node = Worklist.pop_back_val();
14017 auto [_, Inserted] = Visited.insert(Node);
14018 if (!Inserted)
14019 continue;
14020
14021 if (MaxSteps > 0 && Visited.size() >= MaxSteps)
14022 return false;
14023
14024 // Reached the FPNode (would result in a cycle).
14025 // OR Reached CALLSEQ_START (would result in nested call sequences).
14026 if (Node == FPNode || Node->getOpcode() == ISD::CALLSEQ_START)
14027 return false;
14028
14029 if (Node->getOpcode() == ISD::CALLSEQ_END) {
14030 // Defer looking into call sequences (so we can check we're outside one).
14031 // We still need to look through these for the predecessor check.
14032 DeferredNodes.push_back(Node);
14033 continue;
14034 }
14035
14036 for (SDValue Op : Node->ops())
14037 Worklist.push_back(Op.getNode());
14038 }
14039
14040 // True if we're outside a call sequence and don't have the FPNode as a
14041 // predecessor. No cycles or nested call sequences possible.
14042 return !SDNode::hasPredecessorHelper(FPNode, Visited, DeferredNodes,
14043 MaxSteps);
14044}
14045
14047 SelectionDAG &DAG, RTLIB::Libcall LC, SDNode *Node,
14049 std::optional<unsigned> CallRetResNo) const {
14050 if (LC == RTLIB::UNKNOWN_LIBCALL)
14051 return false;
14052
14053 RTLIB::LibcallImpl LibcallImpl = getLibcallImpl(LC);
14054 if (LibcallImpl == RTLIB::Unsupported)
14055 return false;
14056
14057 LLVMContext &Ctx = *DAG.getContext();
14058 EVT VT = Node->getValueType(0);
14059 unsigned NumResults = Node->getNumValues();
14060
14061 // Find users of the node that store the results (and share input chains). The
14062 // destination pointers can be used instead of creating stack allocations.
14063 SDValue StoresInChain;
14064 SmallVector<StoreSDNode *, 2> ResultStores(NumResults);
14065 for (SDNode *User : Node->users()) {
14067 continue;
14068 auto *ST = cast<StoreSDNode>(User);
14069 SDValue StoreValue = ST->getValue();
14070 unsigned ResNo = StoreValue.getResNo();
14071 // Ensure the store corresponds to an output pointer.
14072 if (CallRetResNo == ResNo)
14073 continue;
14074 // Ensure the store to the default address space and not atomic or volatile.
14075 if (!ST->isSimple() || ST->getAddressSpace() != 0)
14076 continue;
14077 // Ensure all store chains are the same (so they don't alias).
14078 if (StoresInChain && ST->getChain() != StoresInChain)
14079 continue;
14080 // Ensure the store is properly aligned.
14081 Type *StoreType = StoreValue.getValueType().getTypeForEVT(Ctx);
14082 if (ST->getAlign() <
14083 DAG.getDataLayout().getABITypeAlign(StoreType->getScalarType()))
14084 continue;
14085 // Avoid:
14086 // 1. Creating cyclic dependencies.
14087 // 2. Expanding the node to a call within a call sequence.
14089 continue;
14090 ResultStores[ResNo] = ST;
14091 StoresInChain = ST->getChain();
14092 }
14093
14094 ArgListTy Args;
14095
14096 // Pass the arguments.
14097 for (const SDValue &Op : Node->op_values()) {
14098 EVT ArgVT = Op.getValueType();
14099 Type *ArgTy = ArgVT.getTypeForEVT(Ctx);
14100 Args.emplace_back(Op, ArgTy);
14101 }
14102
14103 // Pass the output pointers.
14104 SmallVector<SDValue, 2> ResultPtrs(NumResults);
14106 for (auto [ResNo, ST] : llvm::enumerate(ResultStores)) {
14107 if (ResNo == CallRetResNo)
14108 continue;
14109 EVT ResVT = Node->getValueType(ResNo);
14110 SDValue ResultPtr = ST ? ST->getBasePtr() : DAG.CreateStackTemporary(ResVT);
14111 ResultPtrs[ResNo] = ResultPtr;
14112 Args.emplace_back(ResultPtr, PointerTy);
14113 }
14114
14115 SDLoc DL(Node);
14116
14118 // Pass the vector mask (if required).
14119 EVT MaskVT = getSetCCResultType(DAG.getDataLayout(), Ctx, VT);
14120 SDValue Mask = DAG.getBoolConstant(true, DL, MaskVT, VT);
14121 Args.emplace_back(Mask, MaskVT.getTypeForEVT(Ctx));
14122 }
14123
14124 Type *RetType = CallRetResNo.has_value()
14125 ? Node->getValueType(*CallRetResNo).getTypeForEVT(Ctx)
14126 : Type::getVoidTy(Ctx);
14127 SDValue InChain = StoresInChain ? StoresInChain : DAG.getEntryNode();
14128 SDValue Callee =
14129 DAG.getExternalSymbol(LibcallImpl, getPointerTy(DAG.getDataLayout()));
14131 CLI.setDebugLoc(DL).setChain(InChain).setLibCallee(
14132 getLibcallImplCallingConv(LibcallImpl), RetType, Callee, std::move(Args));
14133
14134 auto [Call, CallChain] = LowerCallTo(CLI);
14135
14136 for (auto [ResNo, ResultPtr] : llvm::enumerate(ResultPtrs)) {
14137 if (ResNo == CallRetResNo) {
14138 Results.push_back(Call);
14139 continue;
14140 }
14141 MachinePointerInfo PtrInfo;
14142 SDValue LoadResult = DAG.getLoad(Node->getValueType(ResNo), DL, CallChain,
14143 ResultPtr, PtrInfo);
14144 SDValue OutChain = LoadResult.getValue(1);
14145
14146 if (StoreSDNode *ST = ResultStores[ResNo]) {
14147 // Replace store with the library call.
14148 DAG.ReplaceAllUsesOfValueWith(SDValue(ST, 0), OutChain);
14149 PtrInfo = ST->getPointerInfo();
14150 } else {
14152 DAG.getMachineFunction(),
14153 cast<FrameIndexSDNode>(ResultPtr)->getIndex());
14154 }
14155
14156 Results.push_back(LoadResult);
14157 }
14158
14159 return true;
14160}
14161
14163 SDValue &LHS, SDValue &RHS,
14164 SDValue &CC, SDValue Mask,
14165 SDValue EVL, bool &NeedInvert,
14166 const SDLoc &dl, SDValue &Chain,
14167 bool IsSignaling) const {
14168 MVT OpVT = LHS.getSimpleValueType();
14169 ISD::CondCode CCCode = cast<CondCodeSDNode>(CC)->get();
14170 NeedInvert = false;
14171 assert(!EVL == !Mask && "VP Mask and EVL must either both be set or unset");
14172 bool IsNonVP = !EVL;
14173 switch (getCondCodeAction(CCCode, OpVT)) {
14174 default:
14175 llvm_unreachable("Unknown condition code action!");
14177 // Nothing to do.
14178 break;
14181 if (isCondCodeLegalOrCustom(InvCC, OpVT)) {
14182 std::swap(LHS, RHS);
14183 CC = DAG.getCondCode(InvCC);
14184 return true;
14185 }
14186 // Swapping operands didn't work. Try inverting the condition.
14187 bool NeedSwap = false;
14188 InvCC = getSetCCInverse(CCCode, OpVT);
14189 if (!isCondCodeLegalOrCustom(InvCC, OpVT)) {
14190 // If inverting the condition is not enough, try swapping operands
14191 // on top of it.
14192 InvCC = ISD::getSetCCSwappedOperands(InvCC);
14193 NeedSwap = true;
14194 }
14195 if (isCondCodeLegalOrCustom(InvCC, OpVT)) {
14196 CC = DAG.getCondCode(InvCC);
14197 NeedInvert = true;
14198 if (NeedSwap)
14199 std::swap(LHS, RHS);
14200 return true;
14201 }
14202
14203 // Special case: expand i1 comparisons using logical operations.
14204 if (OpVT == MVT::i1) {
14205 SDValue Ret;
14206 switch (CCCode) {
14207 default:
14208 llvm_unreachable("Unknown integer setcc!");
14209 case ISD::SETEQ: // X == Y --> ~(X ^ Y)
14210 Ret = DAG.getNOT(dl, DAG.getNode(ISD::XOR, dl, MVT::i1, LHS, RHS),
14211 MVT::i1);
14212 break;
14213 case ISD::SETNE: // X != Y --> (X ^ Y)
14214 Ret = DAG.getNode(ISD::XOR, dl, MVT::i1, LHS, RHS);
14215 break;
14216 case ISD::SETGT: // X >s Y --> X == 0 & Y == 1 --> ~X & Y
14217 case ISD::SETULT: // X <u Y --> X == 0 & Y == 1 --> ~X & Y
14218 Ret = DAG.getNode(ISD::AND, dl, MVT::i1, RHS,
14219 DAG.getNOT(dl, LHS, MVT::i1));
14220 break;
14221 case ISD::SETLT: // X <s Y --> X == 1 & Y == 0 --> ~Y & X
14222 case ISD::SETUGT: // X >u Y --> X == 1 & Y == 0 --> ~Y & X
14223 Ret = DAG.getNode(ISD::AND, dl, MVT::i1, LHS,
14224 DAG.getNOT(dl, RHS, MVT::i1));
14225 break;
14226 case ISD::SETULE: // X <=u Y --> X == 0 | Y == 1 --> ~X | Y
14227 case ISD::SETGE: // X >=s Y --> X == 0 | Y == 1 --> ~X | Y
14228 Ret = DAG.getNode(ISD::OR, dl, MVT::i1, RHS,
14229 DAG.getNOT(dl, LHS, MVT::i1));
14230 break;
14231 case ISD::SETUGE: // X >=u Y --> X == 1 | Y == 0 --> ~Y | X
14232 case ISD::SETLE: // X <=s Y --> X == 1 | Y == 0 --> ~Y | X
14233 Ret = DAG.getNode(ISD::OR, dl, MVT::i1, LHS,
14234 DAG.getNOT(dl, RHS, MVT::i1));
14235 break;
14236 }
14237
14238 LHS = DAG.getZExtOrTrunc(Ret, dl, VT);
14239 RHS = SDValue();
14240 CC = SDValue();
14241 return true;
14242 }
14243
14245 unsigned Opc = 0;
14246 switch (CCCode) {
14247 default:
14248 llvm_unreachable("Don't know how to expand this condition!");
14249 case ISD::SETUO:
14250 if (isCondCodeLegal(ISD::SETUNE, OpVT)) {
14251 CC1 = ISD::SETUNE;
14252 CC2 = ISD::SETUNE;
14253 Opc = ISD::OR;
14254 break;
14255 }
14257 "If SETUE is expanded, SETOEQ or SETUNE must be legal!");
14258 NeedInvert = true;
14259 [[fallthrough]];
14260 case ISD::SETO:
14262 "If SETO is expanded, SETOEQ must be legal!");
14263 CC1 = ISD::SETOEQ;
14264 CC2 = ISD::SETOEQ;
14265 Opc = ISD::AND;
14266 break;
14267 case ISD::SETONE:
14268 case ISD::SETUEQ:
14269 // If the SETUO or SETO CC isn't legal, we might be able to use
14270 // SETOGT || SETOLT, inverting the result for SETUEQ. We only need one
14271 // of SETOGT/SETOLT to be legal, the other can be emulated by swapping
14272 // the operands.
14273 CC2 = ((unsigned)CCCode & 0x8U) ? ISD::SETUO : ISD::SETO;
14274 if (!isCondCodeLegal(CC2, OpVT) && (isCondCodeLegal(ISD::SETOGT, OpVT) ||
14275 isCondCodeLegal(ISD::SETOLT, OpVT))) {
14276 CC1 = ISD::SETOGT;
14277 CC2 = ISD::SETOLT;
14278 Opc = ISD::OR;
14279 NeedInvert = ((unsigned)CCCode & 0x8U);
14280 break;
14281 }
14282 [[fallthrough]];
14283 case ISD::SETOEQ:
14284 case ISD::SETOGT:
14285 case ISD::SETOGE:
14286 case ISD::SETOLT:
14287 case ISD::SETOLE:
14288 case ISD::SETUNE:
14289 case ISD::SETUGT:
14290 case ISD::SETUGE:
14291 case ISD::SETULT:
14292 case ISD::SETULE:
14293 // If we are floating point, assign and break, otherwise fall through.
14294 if (!OpVT.isInteger()) {
14295 // We can use the 4th bit to tell if we are the unordered
14296 // or ordered version of the opcode.
14297 CC2 = ((unsigned)CCCode & 0x8U) ? ISD::SETUO : ISD::SETO;
14298 Opc = ((unsigned)CCCode & 0x8U) ? ISD::OR : ISD::AND;
14299 CC1 = (ISD::CondCode)(((int)CCCode & 0x7) | 0x10);
14300 break;
14301 }
14302 // Fallthrough if we are unsigned integer.
14303 [[fallthrough]];
14304 case ISD::SETLE:
14305 case ISD::SETGT:
14306 case ISD::SETGE:
14307 case ISD::SETLT:
14308 case ISD::SETNE:
14309 case ISD::SETEQ:
14310 // If all combinations of inverting the condition and swapping operands
14311 // didn't work then we have no means to expand the condition.
14312 llvm_unreachable("Don't know how to expand this condition!");
14313 }
14314
14315 SDValue SetCC1, SetCC2;
14316 if (CCCode != ISD::SETO && CCCode != ISD::SETUO) {
14317 // If we aren't the ordered or unorder operation,
14318 // then the pattern is (LHS CC1 RHS) Opc (LHS CC2 RHS).
14319 if (IsNonVP) {
14320 SetCC1 = DAG.getSetCC(dl, VT, LHS, RHS, CC1, Chain, IsSignaling);
14321 SetCC2 = DAG.getSetCC(dl, VT, LHS, RHS, CC2, Chain, IsSignaling);
14322 } else {
14323 SetCC1 = DAG.getSetCCVP(dl, VT, LHS, RHS, CC1, Mask, EVL);
14324 SetCC2 = DAG.getSetCCVP(dl, VT, LHS, RHS, CC2, Mask, EVL);
14325 }
14326 } else {
14327 // Otherwise, the pattern is (LHS CC1 LHS) Opc (RHS CC2 RHS)
14328 if (IsNonVP) {
14329 SetCC1 = DAG.getSetCC(dl, VT, LHS, LHS, CC1, Chain, IsSignaling);
14330 SetCC2 = DAG.getSetCC(dl, VT, RHS, RHS, CC2, Chain, IsSignaling);
14331 } else {
14332 SetCC1 = DAG.getSetCCVP(dl, VT, LHS, LHS, CC1, Mask, EVL);
14333 SetCC2 = DAG.getSetCCVP(dl, VT, RHS, RHS, CC2, Mask, EVL);
14334 }
14335 }
14336 if (Chain)
14337 Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, SetCC1.getValue(1),
14338 SetCC2.getValue(1));
14339 if (IsNonVP)
14340 LHS = DAG.getNode(Opc, dl, VT, SetCC1, SetCC2);
14341 else {
14342 // Transform the binary opcode to the VP equivalent.
14343 assert((Opc == ISD::OR || Opc == ISD::AND) && "Unexpected opcode");
14344 Opc = Opc == ISD::OR ? ISD::VP_OR : ISD::VP_AND;
14345 LHS = DAG.getNode(Opc, dl, VT, SetCC1, SetCC2, Mask, EVL);
14346 }
14347 RHS = SDValue();
14348 CC = SDValue();
14349 return true;
14350 }
14351 }
14352 return false;
14353}
14354
14356 SelectionDAG &DAG) const {
14357 EVT VT = Node->getValueType(0);
14358 // Despite its documentation, GetSplitDestVTs will assert if VT cannot be
14359 // split into two equal parts.
14360 if (!VT.isVector() || !VT.getVectorElementCount().isKnownMultipleOf(2))
14361 return SDValue();
14362
14363 // Restrict expansion to cases where both parts can be concatenated.
14364 auto [LoVT, HiVT] = DAG.GetSplitDestVTs(VT);
14365 if (LoVT != HiVT || !isTypeLegal(LoVT))
14366 return SDValue();
14367
14368 SDLoc DL(Node);
14369 unsigned Opcode = Node->getOpcode();
14370
14371 // Don't expand if the result is likely to be unrolled anyway.
14372 if (!isOperationLegalOrCustomOrPromote(Opcode, LoVT))
14373 return SDValue();
14374
14375 SmallVector<SDValue, 4> LoOps, HiOps;
14376 for (const SDValue &V : Node->op_values()) {
14377 if (!V.getValueType().isVector()) {
14378 // Scalar operands pass through to both halves unchanged.
14379 LoOps.push_back(V);
14380 HiOps.push_back(V);
14381 continue;
14382 }
14383 auto [Lo, Hi] = DAG.SplitVector(V, DL, LoVT, HiVT);
14384 LoOps.push_back(Lo);
14385 HiOps.push_back(Hi);
14386 }
14387
14388 SDValue SplitOpLo = DAG.getNode(Opcode, DL, LoVT, LoOps, Node->getFlags());
14389 SDValue SplitOpHi = DAG.getNode(Opcode, DL, HiVT, HiOps, Node->getFlags());
14390 return DAG.getNode(ISD::CONCAT_VECTORS, DL, VT, SplitOpLo, SplitOpHi);
14391}
14392
14394 const SDLoc &DL,
14395 EVT InVecVT, SDValue EltNo,
14396 LoadSDNode *OriginalLoad,
14397 SelectionDAG &DAG) const {
14398 assert(OriginalLoad->isSimple());
14399
14400 EVT VecEltVT = InVecVT.getVectorElementType();
14401
14402 // If the vector element type is not a multiple of a byte then we are unable
14403 // to correctly compute an address to load only the extracted element as a
14404 // scalar.
14405 if (!VecEltVT.isByteSized())
14406 return SDValue();
14407
14408 ISD::LoadExtType ExtTy =
14409 ResultVT.bitsGT(VecEltVT) ? ISD::EXTLOAD : ISD::NON_EXTLOAD;
14410 if (!isOperationLegalOrCustom(ISD::LOAD, VecEltVT))
14411 return SDValue();
14412
14413 std::optional<unsigned> ByteOffset;
14414 Align Alignment = OriginalLoad->getAlign();
14416 if (auto *ConstEltNo = dyn_cast<ConstantSDNode>(EltNo)) {
14417 int Elt = ConstEltNo->getZExtValue();
14418 ByteOffset = VecEltVT.getSizeInBits() * Elt / 8;
14419 MPI = OriginalLoad->getPointerInfo().getWithOffset(*ByteOffset);
14420 Alignment = commonAlignment(Alignment, *ByteOffset);
14421 } else {
14422 // Discard the pointer info except the address space because the memory
14423 // operand can't represent this new access since the offset is variable.
14424 MPI = MachinePointerInfo(OriginalLoad->getPointerInfo().getAddrSpace());
14425 Alignment = commonAlignment(Alignment, VecEltVT.getSizeInBits() / 8);
14426 }
14427
14428 if (!shouldReduceLoadWidth(OriginalLoad, ExtTy, VecEltVT, ByteOffset))
14429 return SDValue();
14430
14431 unsigned IsFast = 0;
14432 if (!allowsMemoryAccess(*DAG.getContext(), DAG.getDataLayout(), VecEltVT,
14433 OriginalLoad->getAddressSpace(), Alignment,
14434 OriginalLoad->getMemOperand()->getFlags(), &IsFast) ||
14435 !IsFast)
14436 return SDValue();
14437
14438 // The original DAG loaded the entire vector from memory, so arithmetic
14439 // within it must be inbounds.
14441 DAG, OriginalLoad->getBasePtr(), InVecVT, EltNo);
14442
14443 // We are replacing a vector load with a scalar load. The new load must have
14444 // identical memory op ordering to the original.
14445 SDValue Load;
14446 if (ResultVT.bitsGT(VecEltVT)) {
14447 // If the result type of vextract is wider than the load, then issue an
14448 // extending load instead.
14449 ISD::LoadExtType ExtType =
14450 isLoadLegal(ResultVT, VecEltVT, Alignment,
14451 OriginalLoad->getAddressSpace(), ISD::ZEXTLOAD, false)
14453 : ISD::EXTLOAD;
14454 Load = DAG.getExtLoad(ExtType, DL, ResultVT, OriginalLoad->getChain(),
14455 NewPtr, MPI, VecEltVT, Alignment,
14456 OriginalLoad->getMemOperand()->getFlags(),
14457 OriginalLoad->getAAInfo());
14458 DAG.makeEquivalentMemoryOrdering(OriginalLoad, Load);
14459 } else {
14460 // The result type is narrower or the same width as the vector element
14461 Load = DAG.getLoad(VecEltVT, DL, OriginalLoad->getChain(), NewPtr, MPI,
14462 Alignment, OriginalLoad->getMemOperand()->getFlags(),
14463 OriginalLoad->getAAInfo());
14464 DAG.makeEquivalentMemoryOrdering(OriginalLoad, Load);
14465 if (ResultVT.bitsLT(VecEltVT))
14466 Load = DAG.getNode(ISD::TRUNCATE, DL, ResultVT, Load);
14467 else
14468 Load = DAG.getBitcast(ResultVT, Load);
14469 }
14470
14471 return Load;
14472}
14473
14474// Set type id for call site info and metadata 'call_target'.
14475// We are filtering for:
14476// a) The call-graph-section use case that wants to know about indirect
14477// calls, or
14478// b) We want to annotate indirect calls.
14480 const CallBase *CB, MachineFunction &MF,
14481 MachineFunction::CallSiteInfo &CSInfo) const {
14482 if (CB && CB->isIndirectCall() &&
14485 CSInfo = MachineFunction::CallSiteInfo(*CB);
14486}
return SDValue()
unsigned RegSize
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
constexpr LLT F32
AMDGPU Register Bank Select
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
Function Alias Analysis Results
#define X(NUM, ENUM, NAME)
Definition ELF.h:856
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 SDValue expandVPFunnelShift(SDNode *Node, SelectionDAG &DAG)
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:357
static LLVM_ABI ExponentType semanticsMinExponent(const fltSemantics &)
Definition APFloat.cpp:262
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:318
static constexpr roundingMode rmNearestTiesToEven
Definition APFloat.h:353
static LLVM_ABI unsigned int semanticsPrecision(const fltSemantics &)
Definition APFloat.cpp:254
static LLVM_ABI bool isIEEELikeFP(const fltSemantics &)
Definition APFloat.cpp:295
opStatus
IEEE-754R 7: Default exception handling.
Definition APFloat.h:369
opStatus convertFromAPInt(const APInt &Input, bool IsSigned, roundingMode RM)
Definition APFloat.h:1443
static APFloat getSmallestNormalized(const fltSemantics &Sem, bool Negative=false)
Returns the smallest (by magnitude) normalized finite number in the given semantics.
Definition APFloat.h:1254
APInt bitcastToAPInt() const
Definition APFloat.h:1467
static APFloat getLargest(const fltSemantics &Sem, bool Negative=false)
Returns the largest finite number in the given semantics.
Definition APFloat.h:1234
static APFloat getInf(const fltSemantics &Sem, bool Negative=false)
Factory for Positive and Negative Infinity.
Definition APFloat.h:1194
void changeSign()
Definition APFloat.h:1393
static APFloat getNaN(const fltSemantics &Sem, bool Negative=false, uint64_t payload=0)
Factory for NaN values.
Definition APFloat.h:1205
Class for arbitrary precision integers.
Definition APInt.h:78
LLVM_ABI APInt udiv(const APInt &RHS) const
Unsigned division operation.
Definition APInt.cpp:1594
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:1788
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:1050
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:1071
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:963
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:1687
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:1965
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:647
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:1295
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:1023
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:309
static constexpr ElementCount get(ScalarTy MinVal, bool Scalable)
Definition TypeSize.h:315
AttributeList getAttributes() const
Return the attribute list for this Function.
Definition Function.h:328
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.
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:521
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 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.
SDValue getSetCCVP(const SDLoc &DL, EVT VT, SDValue LHS, SDValue RHS, ISD::CondCode Cond, SDValue Mask, SDValue EVL)
Helper function to make it easier to build VP_SETCCs if you just have an ISD::CondCode instead of an ...
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
Definition SmallPtrSet.h:99
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...
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.
MVT getRegisterType(MVT VT) const
Return the type of registers that this ValueType will eventually require.
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.
SDValue expandVPCTLZ(SDNode *N, SelectionDAG &DAG) const
Expand VP_CTLZ/VP_CTLZ_ZERO_POISON nodes.
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.
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
SDValue expandVPBSWAP(SDNode *N, SelectionDAG &DAG) const
Expand VP_BSWAP nodes.
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 expandVPBITREVERSE(SDNode *N, SelectionDAG &DAG) const
Expand VP_BITREVERSE nodes.
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 LegalizeSetCCCondCode(SelectionDAG &DAG, EVT VT, SDValue &LHS, SDValue &RHS, SDValue &CC, SDValue Mask, SDValue EVL, bool &NeedInvert, const SDLoc &dl, SDValue &Chain, bool IsSignaling=false) const
Legalize a SETCC or VP_SETCC with given LHS and RHS and condition code CC on the current target.
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 expandVPCTPOP(SDNode *N, SelectionDAG &DAG) const
Expand VP_CTPOP nodes.
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 expandVPCTTZ(SDNode *N, SelectionDAG &DAG) const
Expand VP_CTTZ/VP_CTTZ_ZERO_POISON nodes.
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:867
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:343
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 ScalarTy getFixedValue() const
Definition TypeSize.h:200
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:3035
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:345
@ Offset
Definition DWP.cpp:578
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:547
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:332
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:395
@ 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
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Count
Definition InstrProf.h:145
fltNonfiniteBehavior
Definition APFloat.h:969
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:1719
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:993
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:374
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 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
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:1031
fltNanEncoding nanEncoding
Definition APFloat.h:1033