LLVM 24.0.0git
TargetLowering.cpp
Go to the documentation of this file.
1//===-- TargetLowering.cpp - Implement the TargetLowering class -----------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This implements the TargetLowering class.
10//
11//===----------------------------------------------------------------------===//
12
14#include "llvm/ADT/STLExtras.h"
27#include "llvm/IR/DataLayout.h"
30#include "llvm/IR/LLVMContext.h"
31#include "llvm/MC/MCAsmInfo.h"
32#include "llvm/MC/MCExpr.h"
38#include <cctype>
39#include <deque>
40using namespace llvm;
41using namespace llvm::SDPatternMatch;
42
43/// NOTE: The TargetMachine owns TLOF.
47
48// Define the virtual destructor out-of-line for build efficiency.
50
51const char *TargetLowering::getTargetNodeName(unsigned Opcode) const {
52 return nullptr;
53}
54
58
59/// Check whether a given call node is in tail position within its function. If
60/// so, it sets Chain to the input chain of the tail call.
62 SDValue &Chain) const {
64
65 // First, check if tail calls have been disabled in this function.
66 if (F.getFnAttribute("disable-tail-calls").getValueAsBool())
67 return false;
68
69 // Conservatively require the attributes of the call to match those of
70 // the return. Ignore following attributes because they don't affect the
71 // call sequence.
72 AttrBuilder CallerAttrs(F.getContext(), F.getAttributes().getRetAttrs());
73 for (const auto &Attr : {Attribute::Alignment, Attribute::Dereferenceable,
74 Attribute::DereferenceableOrNull, Attribute::NoAlias,
75 Attribute::NonNull, Attribute::NoUndef,
76 Attribute::Range, Attribute::NoFPClass})
77 CallerAttrs.removeAttribute(Attr);
78
79 if (CallerAttrs.hasAttributes())
80 return false;
81
82 // It's not safe to eliminate the sign / zero extension of the return value.
83 if (CallerAttrs.contains(Attribute::ZExt) ||
84 CallerAttrs.contains(Attribute::SExt))
85 return false;
86
87 // Check if the only use is a function return node.
88 return isUsedByReturnOnly(Node, Chain);
89}
90
92 const uint32_t *CallerPreservedMask,
93 const SmallVectorImpl<CCValAssign> &ArgLocs,
94 const SmallVectorImpl<SDValue> &OutVals) const {
95 for (unsigned I = 0, E = ArgLocs.size(); I != E; ++I) {
96 const CCValAssign &ArgLoc = ArgLocs[I];
97 if (!ArgLoc.isRegLoc())
98 continue;
99 MCRegister Reg = ArgLoc.getLocReg();
100 // Only look at callee saved registers.
101 if (MachineOperand::clobbersPhysReg(CallerPreservedMask, Reg))
102 continue;
103 // Check that we pass the value used for the caller.
104 // (We look for a CopyFromReg reading a virtual register that is used
105 // for the function live-in value of register Reg)
106 SDValue Value = OutVals[I];
107 if (Value->getOpcode() == ISD::AssertZext)
108 Value = Value.getOperand(0);
109 if (Value->getOpcode() != ISD::CopyFromReg)
110 return false;
111 Register ArgReg = cast<RegisterSDNode>(Value->getOperand(1))->getReg();
112 if (MRI.getLiveInPhysReg(ArgReg) != Reg)
113 return false;
114 }
115 return true;
116}
117
118/// Set CallLoweringInfo attribute flags based on a call instruction
119/// and called function attributes.
121 unsigned ArgIdx) {
122 IsSExt = Call->paramHasAttr(ArgIdx, Attribute::SExt);
123 IsZExt = Call->paramHasAttr(ArgIdx, Attribute::ZExt);
124 IsNoExt = Call->paramHasAttr(ArgIdx, Attribute::NoExt);
125 IsInReg = Call->paramHasAttr(ArgIdx, Attribute::InReg);
126 IsSRet = Call->paramHasAttr(ArgIdx, Attribute::StructRet);
127 IsNest = Call->paramHasAttr(ArgIdx, Attribute::Nest);
128 IsByVal = Call->paramHasAttr(ArgIdx, Attribute::ByVal);
129 IsPreallocated = Call->paramHasAttr(ArgIdx, Attribute::Preallocated);
130 IsInAlloca = Call->paramHasAttr(ArgIdx, Attribute::InAlloca);
131 IsReturned = Call->paramHasAttr(ArgIdx, Attribute::Returned);
132 IsSwiftSelf = Call->paramHasAttr(ArgIdx, Attribute::SwiftSelf);
133 IsSwiftAsync = Call->paramHasAttr(ArgIdx, Attribute::SwiftAsync);
134 IsSwiftError = Call->paramHasAttr(ArgIdx, Attribute::SwiftError);
135 Alignment = Call->getParamStackAlign(ArgIdx);
136 IndirectType = nullptr;
138 "multiple ABI attributes?");
139 if (IsByVal) {
140 IndirectType = Call->getParamByValType(ArgIdx);
141 if (!Alignment)
142 Alignment = Call->getParamAlign(ArgIdx);
143 }
144 if (IsPreallocated)
145 IndirectType = Call->getParamPreallocatedType(ArgIdx);
146 if (IsInAlloca)
147 IndirectType = Call->getParamInAllocaType(ArgIdx);
148 if (IsSRet)
149 IndirectType = Call->getParamStructRetType(ArgIdx);
150}
151
152/// Generate a libcall taking the given operands as arguments and returning a
153/// result of type RetVT.
154std::pair<SDValue, SDValue>
155TargetLowering::makeLibCall(SelectionDAG &DAG, RTLIB::LibcallImpl LibcallImpl,
157 MakeLibCallOptions CallOptions, const SDLoc &dl,
158 SDValue InChain) const {
159 if (LibcallImpl == RTLIB::Unsupported)
160 reportFatalInternalError("unsupported library call operation");
161
162 if (!InChain)
163 InChain = DAG.getEntryNode();
164
166 Args.reserve(Ops.size());
167
168 ArrayRef<Type *> OpsTypeOverrides = CallOptions.OpsTypeOverrides;
169 for (unsigned i = 0; i < Ops.size(); ++i) {
170 SDValue NewOp = Ops[i];
171 Type *Ty = i < OpsTypeOverrides.size() && OpsTypeOverrides[i]
172 ? OpsTypeOverrides[i]
173 : NewOp.getValueType().getTypeForEVT(*DAG.getContext());
174 TargetLowering::ArgListEntry Entry(NewOp, Ty);
175 if (CallOptions.IsSoften)
176 Entry.OrigTy =
177 CallOptions.OpsVTBeforeSoften[i].getTypeForEVT(*DAG.getContext());
178
179 Entry.IsSExt =
180 shouldSignExtendTypeInLibCall(Entry.Ty, CallOptions.IsSigned);
181 Entry.IsZExt = !Entry.IsSExt;
182
183 if (CallOptions.IsSoften &&
185 Entry.IsSExt = Entry.IsZExt = false;
186 }
187 Args.push_back(Entry);
188 }
189
190 SDValue Callee =
191 DAG.getExternalSymbol(LibcallImpl, getPointerTy(DAG.getDataLayout()));
192
193 Type *RetTy = RetVT.getTypeForEVT(*DAG.getContext());
194 Type *OrigRetTy = RetTy;
196 bool signExtend = shouldSignExtendTypeInLibCall(RetTy, CallOptions.IsSigned);
197 bool zeroExtend = !signExtend;
198
199 if (CallOptions.IsSoften) {
200 OrigRetTy = CallOptions.RetVTBeforeSoften.getTypeForEVT(*DAG.getContext());
202 signExtend = zeroExtend = false;
203 }
204
205 CLI.setDebugLoc(dl)
206 .setChain(InChain)
207 .setLibCallee(getLibcallImplCallingConv(LibcallImpl), RetTy, OrigRetTy,
208 Callee, std::move(Args))
209 .setNoReturn(CallOptions.DoesNotReturn)
212 .setSExtResult(signExtend)
213 .setZExtResult(zeroExtend);
214 return LowerCallTo(CLI);
215}
216
218 LLVMContext &Context, std::vector<EVT> &MemOps, unsigned Limit,
219 const MemOp &Op, unsigned DstAS, unsigned SrcAS,
220 const AttributeList &FuncAttributes, EVT *LargestVT) const {
221 EVT VT = getOptimalMemOpType(Context, Op, FuncAttributes);
222
223 if (VT == MVT::Other) {
224 // Use the largest integer type whose alignment constraints are satisfied.
225 VT = MVT::LAST_INTEGER_VALUETYPE;
226 if (Op.isFixedDstAlign()) {
227 bool LoadsFromSrc = Op.isMemcpyOrMemmove() && !Op.isMemcpyStrSrc();
228 while (VT != MVT::i8) {
229 unsigned VTSize = VT.getSizeInBits() / 8;
230 bool DstOk =
231 Op.getDstAlign() >= VTSize ||
232 allowsMisalignedMemoryAccesses(VT, DstAS, Op.getDstAlign());
233 bool SrcOk =
234 !LoadsFromSrc || Op.getSrcAlign() >= VTSize ||
235 allowsMisalignedMemoryAccesses(VT, SrcAS, Op.getSrcAlign());
236 if (DstOk && SrcOk)
237 break;
239 }
240 }
241 assert(VT.isInteger());
242
243 // Find the largest legal integer type.
244 MVT LVT = MVT::LAST_INTEGER_VALUETYPE;
245 while (!isTypeLegal(LVT))
246 LVT = (MVT::SimpleValueType)(LVT.SimpleTy - 1);
247 assert(LVT.isInteger());
248
249 // If the type we've chosen is larger than the largest legal integer type
250 // then use the largest legal type.
251 if (VT.bitsGT(LVT))
252 VT = LVT;
253 }
254
255 unsigned NumMemOps = 0;
256 uint64_t Size = Op.size();
257 while (Size) {
258 unsigned VTSize = VT.getSizeInBits() / 8;
259 while (VTSize > Size) {
260 // For now, only use non-vector load / store's for the left-over pieces.
261 EVT NewVT = VT;
262 unsigned NewVTSize;
263
264 bool Found = false;
265 if (VT.isVector() || VT.isFloatingPoint()) {
266 NewVT = (VT.getSizeInBits() > 64) ? MVT::i64 : MVT::i32;
269 Found = true;
270 else if (NewVT == MVT::i64 &&
272 isSafeMemOpType(MVT::f64)) {
273 // i64 is usually not legal on 32-bit targets, but f64 may be.
274 NewVT = MVT::f64;
275 Found = true;
276 }
277 }
278
279 if (!Found) {
280 do {
281 NewVT = (MVT::SimpleValueType)(NewVT.getSimpleVT().SimpleTy - 1);
282 if (NewVT == MVT::i8)
283 break;
284 } while (!isSafeMemOpType(NewVT.getSimpleVT()));
285 }
286 NewVTSize = NewVT.getSizeInBits() / 8;
287
288 // If the new VT cannot cover all of the remaining bits, then consider
289 // issuing a (or a pair of) unaligned and overlapping load / store.
290 unsigned Fast;
291 if (NumMemOps && !Op.isVolatile() && NewVTSize < Size &&
293 VT, DstAS, Op.isFixedDstAlign() ? Op.getDstAlign() : Align(1),
295 Fast)
296 VTSize = Size;
297 else {
298 VT = NewVT;
299 VTSize = NewVTSize;
300 }
301 }
302
303 if (++NumMemOps > Limit)
304 return false;
305
306 MemOps.push_back(VT);
307 Size -= VTSize;
308 }
309
310 return true;
311}
312
313/// Soften the operands of a comparison. This code is shared among BR_CC,
314/// SELECT_CC, and SETCC handlers.
316 SDValue &NewLHS, SDValue &NewRHS,
317 ISD::CondCode &CCCode,
318 const SDLoc &dl, const SDValue OldLHS,
319 const SDValue OldRHS) const {
320 SDValue Chain;
321 return softenSetCCOperands(DAG, VT, NewLHS, NewRHS, CCCode, dl, OldLHS,
322 OldRHS, Chain);
323}
324
325/// Select the libcall and the condition code to test its result against 0 for
326/// an ordered floating-point compare. \p BoolLC is the boolean helper (result
327/// is 0/1). \p TriStateLC is the per-predicate three-way helper and \p
328/// GenericLC the generic single-symbol three-way helper (both return -1/0/1,
329/// tested against 0 with \p TriStateCC). The boolean form is preferred, then
330/// the per-predicate three-way, then the generic three-way.
331static std::pair<RTLIB::Libcall, ISD::CondCode>
332selectFPCmpLibcall(const LibcallLoweringInfo &Libcalls, RTLIB::Libcall BoolLC,
333 RTLIB::Libcall TriStateLC, RTLIB::Libcall GenericLC,
334 ISD::CondCode TriStateCC) {
335 if (Libcalls.getLibcallImpl(BoolLC) != RTLIB::Unsupported)
336 return {BoolLC, ISD::SETNE};
337 if (Libcalls.getLibcallImpl(TriStateLC) != RTLIB::Unsupported)
338 return {TriStateLC, TriStateCC};
339 return {GenericLC, TriStateCC};
340}
341
343 SDValue &NewLHS, SDValue &NewRHS,
344 ISD::CondCode &CCCode,
345 const SDLoc &dl, const SDValue OldLHS,
346 const SDValue OldRHS,
347 SDValue &Chain,
348 bool IsSignaling) const {
349 // FIXME: Currently we cannot really respect all IEEE predicates due to libgcc
350 // not supporting it. We can update this code when libgcc provides such
351 // functions.
352
353 assert((VT == MVT::f32 || VT == MVT::f64 || VT == MVT::f128 || VT == MVT::ppcf128)
354 && "Unsupported setcc type!");
355
356 // Expand into one or more soft-fp libcall(s).
357 RTLIB::Libcall LC1 = RTLIB::UNKNOWN_LIBCALL, LC2 = RTLIB::UNKNOWN_LIBCALL;
359 bool ShouldInvertCC = false;
360
361 // Expand a compare libcall family name (e.g. OEQ, FCMP3_PRED_OEQ) to the
362 // RTLIB::Libcall for VT.
363#define FP_CMP_LIBCALL(BASE) \
364 RTLIB::getFPLibCall(VT, RTLIB::BASE##_F32, RTLIB::BASE##_F64, \
365 RTLIB::UNKNOWN_LIBCALL, RTLIB::BASE##_F128, \
366 RTLIB::BASE##_PPCF128)
367
368 switch (CCCode) {
369 case ISD::SETEQ:
370 case ISD::SETOEQ:
371 std::tie(LC1, CC1) = selectFPCmpLibcall(
372 DAG.getLibcalls(), FP_CMP_LIBCALL(OEQ), FP_CMP_LIBCALL(FCMP3_PRED_OEQ),
373 FP_CMP_LIBCALL(FCMP3), ISD::SETEQ);
374 break;
375 case ISD::SETNE:
376 case ISD::SETUNE:
377 std::tie(LC1, CC1) = selectFPCmpLibcall(
378 DAG.getLibcalls(), FP_CMP_LIBCALL(UNE), FP_CMP_LIBCALL(FCMP3_PRED_UNE),
379 FP_CMP_LIBCALL(FCMP3), ISD::SETNE);
380 // Some ABIs (e.g. AEABI) provide neither a not-equal nor a three-way
381 // compare; obtain not-equal (UNE = !OEQ) by inverting ordered-equal.
382 if (DAG.getLibcalls().getLibcallImpl(LC1) == RTLIB::Unsupported) {
383 std::tie(LC1, CC1) = selectFPCmpLibcall(
384 DAG.getLibcalls(), FP_CMP_LIBCALL(OEQ),
385 FP_CMP_LIBCALL(FCMP3_PRED_OEQ), FP_CMP_LIBCALL(FCMP3), ISD::SETEQ);
386 ShouldInvertCC = true;
387 }
388 break;
389 case ISD::SETGE:
390 case ISD::SETOGE:
391 std::tie(LC1, CC1) = selectFPCmpLibcall(
392 DAG.getLibcalls(), FP_CMP_LIBCALL(OGE), FP_CMP_LIBCALL(FCMP3_PRED_OGE),
393 FP_CMP_LIBCALL(FCMP3), ISD::SETGE);
394 break;
395 case ISD::SETLT:
396 case ISD::SETOLT:
397 std::tie(LC1, CC1) = selectFPCmpLibcall(
398 DAG.getLibcalls(), FP_CMP_LIBCALL(OLT), FP_CMP_LIBCALL(FCMP3_PRED_OLT),
399 FP_CMP_LIBCALL(FCMP3), ISD::SETLT);
400 break;
401 case ISD::SETLE:
402 case ISD::SETOLE:
403 std::tie(LC1, CC1) = selectFPCmpLibcall(
404 DAG.getLibcalls(), FP_CMP_LIBCALL(OLE), FP_CMP_LIBCALL(FCMP3_PRED_OLE),
405 FP_CMP_LIBCALL(FCMP3), ISD::SETLE);
406 break;
407 case ISD::SETGT:
408 case ISD::SETOGT:
409 std::tie(LC1, CC1) = selectFPCmpLibcall(
410 DAG.getLibcalls(), FP_CMP_LIBCALL(OGT), FP_CMP_LIBCALL(FCMP3_PRED_OGT),
411 FP_CMP_LIBCALL(FCMP3), ISD::SETGT);
412 break;
413 case ISD::SETO:
414 ShouldInvertCC = true;
415 [[fallthrough]];
416 case ISD::SETUO:
417 // Unordered is a boolean everywhere (__unordXf2 returns 0/1).
418 LC1 = FP_CMP_LIBCALL(UO);
419 CC1 = ISD::SETNE;
420 break;
421 case ISD::SETONE:
422 // SETONE = O && UNE
423 ShouldInvertCC = true;
424 [[fallthrough]];
425 case ISD::SETUEQ:
426 LC1 = FP_CMP_LIBCALL(UO);
427 CC1 = ISD::SETNE;
428 std::tie(LC2, CC2) = selectFPCmpLibcall(
429 DAG.getLibcalls(), FP_CMP_LIBCALL(OEQ), FP_CMP_LIBCALL(FCMP3_PRED_OEQ),
430 FP_CMP_LIBCALL(FCMP3), ISD::SETEQ);
431 break;
432 default:
433 // Invert CC for unordered comparisons, handled by the ordered inverse.
434 ShouldInvertCC = true;
435 switch (CCCode) {
436 case ISD::SETULT:
437 std::tie(LC1, CC1) = selectFPCmpLibcall(
438 DAG.getLibcalls(), FP_CMP_LIBCALL(OGE),
439 FP_CMP_LIBCALL(FCMP3_PRED_OGE), FP_CMP_LIBCALL(FCMP3), ISD::SETGE);
440 break;
441 case ISD::SETULE:
442 std::tie(LC1, CC1) = selectFPCmpLibcall(
443 DAG.getLibcalls(), FP_CMP_LIBCALL(OGT),
444 FP_CMP_LIBCALL(FCMP3_PRED_OGT), FP_CMP_LIBCALL(FCMP3), ISD::SETGT);
445 break;
446 case ISD::SETUGT:
447 std::tie(LC1, CC1) = selectFPCmpLibcall(
448 DAG.getLibcalls(), FP_CMP_LIBCALL(OLE),
449 FP_CMP_LIBCALL(FCMP3_PRED_OLE), FP_CMP_LIBCALL(FCMP3), ISD::SETLE);
450 break;
451 case ISD::SETUGE:
452 std::tie(LC1, CC1) = selectFPCmpLibcall(
453 DAG.getLibcalls(), FP_CMP_LIBCALL(OLT),
454 FP_CMP_LIBCALL(FCMP3_PRED_OLT), FP_CMP_LIBCALL(FCMP3), ISD::SETLT);
455 break;
456 default:
457 llvm_unreachable("Do not know how to soften this setcc!");
458 }
459 }
460
461#undef FP_CMP_LIBCALL
462
463 // Use the target specific return value for comparison lib calls.
465 SDValue Ops[2] = {NewLHS, NewRHS};
467 EVT OpsVT[2] = { OldLHS.getValueType(),
468 OldRHS.getValueType() };
469 CallOptions.setTypeListBeforeSoften(OpsVT, RetVT);
470 auto Call = makeLibCall(DAG, LC1, RetVT, Ops, CallOptions, dl, Chain);
471 NewLHS = Call.first;
472 NewRHS = DAG.getConstant(0, dl, RetVT);
473
474 if (DAG.getLibcalls().getLibcallImpl(LC1) == RTLIB::Unsupported) {
476 "no libcall available to soften floating-point compare");
477 }
478
479 CCCode = CC1;
480 if (ShouldInvertCC) {
481 assert(RetVT.isInteger());
482 CCCode = getSetCCInverse(CCCode, RetVT);
483 }
484
485 if (LC2 == RTLIB::UNKNOWN_LIBCALL) {
486 // Update Chain.
487 Chain = Call.second;
488 } else {
489 if (DAG.getLibcalls().getLibcallImpl(LC2) == RTLIB::Unsupported) {
491 "no libcall available to soften floating-point compare");
492 }
493
494 assert(CCCode == (ShouldInvertCC ? ISD::SETEQ : ISD::SETNE) &&
495 "unordered call should be simple boolean");
496
497 EVT SetCCVT =
498 getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), RetVT);
500 NewLHS = DAG.getNode(ISD::AssertZext, dl, RetVT, Call.first,
501 DAG.getValueType(MVT::i1));
502 }
503
504 SDValue Tmp = DAG.getSetCC(dl, SetCCVT, NewLHS, NewRHS, CCCode);
505 auto Call2 = makeLibCall(DAG, LC2, RetVT, Ops, CallOptions, dl, Chain);
506 CCCode = CC2;
507 if (ShouldInvertCC)
508 CCCode = getSetCCInverse(CCCode, RetVT);
509 NewLHS = DAG.getSetCC(dl, SetCCVT, Call2.first, NewRHS, CCCode);
510 if (Chain)
511 Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Call.second,
512 Call2.second);
513 NewLHS = DAG.getNode(ShouldInvertCC ? ISD::AND : ISD::OR, dl,
514 Tmp.getValueType(), Tmp, NewLHS);
515 NewRHS = SDValue();
516 }
517}
518
519/// Return the entry encoding for a jump table in the current function. The
520/// returned value is a member of the MachineJumpTableInfo::JTEntryKind enum.
522 // In non-pic modes, just use the address of a block.
525
526 // Otherwise, use a label difference.
528}
529
534
535/// This returns the relocation base for the given PIC jumptable, the same as
536/// getPICJumpTableRelocBase, but as an MCExpr.
537const MCExpr *
539 unsigned JTI,MCContext &Ctx) const{
540 // The normal PIC reloc base is the label at the start of the jump table.
541 return MCSymbolRefExpr::create(MF->getJTISymbol(JTI, Ctx), Ctx);
542}
543
545 SDValue Addr, int JTI,
546 SelectionDAG &DAG) const {
547 SDValue Chain = Value;
548 // Jump table debug info is only needed if CodeView is enabled.
550 Chain = DAG.getJumpTableDebugInfo(JTI, Chain, dl);
551 }
552 return DAG.getNode(ISD::BRIND, dl, MVT::Other, Chain, Addr);
553}
554
555bool
557 const TargetMachine &TM = getTargetMachine();
558 const GlobalValue *GV = GA->getGlobal();
559
560 // If the address is not even local to this DSO we will have to load it from
561 // a got and then add the offset.
562 if (!TM.shouldAssumeDSOLocal(GV))
563 return false;
564
565 // If the code is position independent we will have to add a base register.
567 return false;
568
569 // Otherwise we can do it.
570 return true;
571}
572
573//===----------------------------------------------------------------------===//
574// Optimization Methods
575//===----------------------------------------------------------------------===//
576
577/// If the specified instruction has a constant integer operand and there are
578/// bits set in that constant that are not demanded, then clear those bits and
579/// return true.
581 const APInt &DemandedBits,
582 const APInt &DemandedElts,
583 TargetLoweringOpt &TLO) const {
584 SDLoc DL(Op);
585 unsigned Opcode = Op.getOpcode();
586
587 // Early-out if we've ended up calling an undemanded node, leave this to
588 // constant folding.
589 if (DemandedBits.isZero() || DemandedElts.isZero())
590 return false;
591
592 // Do target-specific constant optimization.
593 if (targetShrinkDemandedConstant(Op, DemandedBits, DemandedElts, TLO))
594 return TLO.New.getNode();
595
596 // FIXME: ISD::SELECT, ISD::SELECT_CC
597 switch (Opcode) {
598 default:
599 break;
600 case ISD::XOR:
601 case ISD::AND:
602 case ISD::OR: {
603 auto *Op1C = dyn_cast<ConstantSDNode>(Op.getOperand(1));
604 if (!Op1C || Op1C->isOpaque())
605 return false;
606
607 // If this is a 'not' op, don't touch it because that's a canonical form.
608 const APInt &C = Op1C->getAPIntValue();
609 if (Opcode == ISD::XOR && DemandedBits.isSubsetOf(C))
610 return false;
611
612 if (!C.isSubsetOf(DemandedBits)) {
613 EVT VT = Op.getValueType();
614 SDValue NewC = TLO.DAG.getConstant(DemandedBits & C, DL, VT);
615 SDValue NewOp = TLO.DAG.getNode(Opcode, DL, VT, Op.getOperand(0), NewC,
616 Op->getFlags());
617 return TLO.CombineTo(Op, NewOp);
618 }
619
620 break;
621 }
622 }
623
624 return false;
625}
626
628 const APInt &DemandedBits,
629 TargetLoweringOpt &TLO) const {
630 EVT VT = Op.getValueType();
631 APInt DemandedElts = VT.isVector()
633 : APInt(1, 1);
634 return ShrinkDemandedConstant(Op, DemandedBits, DemandedElts, TLO);
635}
636
637/// Convert x+y to (VT)((SmallVT)x+(SmallVT)y) if the casts are free.
638/// This uses isTruncateFree/isZExtFree and ANY_EXTEND for the widening cast,
639/// but it could be generalized for targets with other types of implicit
640/// widening casts.
642 const APInt &DemandedBits,
643 TargetLoweringOpt &TLO) const {
644 assert(Op.getNumOperands() == 2 &&
645 "ShrinkDemandedOp only supports binary operators!");
646 assert(Op.getNode()->getNumValues() == 1 &&
647 "ShrinkDemandedOp only supports nodes with one result!");
648
649 EVT VT = Op.getValueType();
650 SelectionDAG &DAG = TLO.DAG;
651 SDLoc dl(Op);
652
653 // Early return, as this function cannot handle vector types.
654 if (VT.isVector())
655 return false;
656
657 assert(Op.getOperand(0).getValueType().getScalarSizeInBits() == BitWidth &&
658 Op.getOperand(1).getValueType().getScalarSizeInBits() == BitWidth &&
659 "ShrinkDemandedOp only supports operands that have the same size!");
660
661 // Don't do this if the node has another user, which may require the
662 // full value.
663 if (!Op.getNode()->hasOneUse())
664 return false;
665
666 // Search for the smallest integer type with free casts to and from
667 // Op's type. For expedience, just check power-of-2 integer types.
668 unsigned DemandedSize = DemandedBits.getActiveBits();
669 for (unsigned SmallVTBits = llvm::bit_ceil(DemandedSize);
670 SmallVTBits < BitWidth; SmallVTBits = NextPowerOf2(SmallVTBits)) {
671 EVT SmallVT = EVT::getIntegerVT(*DAG.getContext(), SmallVTBits);
672 if (isTruncateFree(Op, SmallVT) && isZExtFree(SmallVT, VT)) {
673 // We found a type with free casts.
674
675 // If the operation has the 'disjoint' flag, then the
676 // operands on the new node are also disjoint.
677 SDNodeFlags Flags(Op->getFlags().hasDisjoint() ? SDNodeFlags::Disjoint
679 unsigned Opcode = Op.getOpcode();
680 if (Opcode == ISD::PTRADD) {
681 // It isn't a ptradd anymore if it doesn't operate on the entire
682 // pointer.
683 Opcode = ISD::ADD;
684 }
685 SDValue X = DAG.getNode(
686 Opcode, dl, SmallVT,
687 DAG.getNode(ISD::TRUNCATE, dl, SmallVT, Op.getOperand(0)),
688 DAG.getNode(ISD::TRUNCATE, dl, SmallVT, Op.getOperand(1)), Flags);
689 assert(DemandedSize <= SmallVTBits && "Narrowed below demanded bits?");
690 SDValue Z = DAG.getNode(ISD::ANY_EXTEND, dl, VT, X);
691 return TLO.CombineTo(Op, Z);
692 }
693 }
694 return false;
695}
696
698 DAGCombinerInfo &DCI) const {
699 SelectionDAG &DAG = DCI.DAG;
700 TargetLoweringOpt TLO(DAG, !DCI.isBeforeLegalize(),
701 !DCI.isBeforeLegalizeOps());
703
704 bool Simplified = SimplifyDemandedBits(Op, DemandedBits, Known, TLO);
705 if (Simplified) {
706 DCI.AddToWorklist(Op.getNode());
708 }
709 return Simplified;
710}
711
713 const APInt &DemandedElts,
714 DAGCombinerInfo &DCI) const {
715 SelectionDAG &DAG = DCI.DAG;
716 TargetLoweringOpt TLO(DAG, !DCI.isBeforeLegalize(),
717 !DCI.isBeforeLegalizeOps());
719
720 bool Simplified =
721 SimplifyDemandedBits(Op, DemandedBits, DemandedElts, Known, TLO);
722 if (Simplified) {
723 DCI.AddToWorklist(Op.getNode());
725 }
726 return Simplified;
727}
728
732 unsigned Depth,
733 bool AssumeSingleUse) const {
734 EVT VT = Op.getValueType();
735
736 // Since the number of lanes in a scalable vector is unknown at compile time,
737 // we track one bit which is implicitly broadcast to all lanes. This means
738 // that all lanes in a scalable vector are considered demanded.
739 APInt DemandedElts = VT.isFixedLengthVector()
741 : APInt(1, 1);
742 return SimplifyDemandedBits(Op, DemandedBits, DemandedElts, Known, TLO, Depth,
743 AssumeSingleUse);
744}
745
746// TODO: Under what circumstances can we create nodes? Constant folding?
748 SDValue Op, const APInt &DemandedBits, const APInt &DemandedElts,
749 SelectionDAG &DAG, unsigned Depth) const {
750 EVT VT = Op.getValueType();
751
752 // Limit search depth.
754 return SDValue();
755
756 // Ignore UNDEFs.
757 if (Op.isUndef())
758 return SDValue();
759
760 // Not demanding any bits/elts from Op.
761 if (DemandedBits == 0 || DemandedElts == 0)
762 return DAG.getUNDEF(VT);
763
764 bool IsLE = DAG.getDataLayout().isLittleEndian();
765 unsigned NumElts = DemandedElts.getBitWidth();
766 unsigned BitWidth = DemandedBits.getBitWidth();
767 KnownBits LHSKnown, RHSKnown;
768 switch (Op.getOpcode()) {
769 case ISD::BITCAST: {
770 if (VT.isScalableVector())
771 return SDValue();
772
773 SDValue Src = peekThroughBitcasts(Op.getOperand(0));
774 EVT SrcVT = Src.getValueType();
775 EVT DstVT = Op.getValueType();
776 if (SrcVT == DstVT)
777 return Src;
778
779 unsigned NumSrcEltBits = SrcVT.getScalarSizeInBits();
780 unsigned NumDstEltBits = DstVT.getScalarSizeInBits();
781 if (NumSrcEltBits == NumDstEltBits)
783 Src, DemandedBits, DemandedElts, DAG, Depth + 1))
784 return DAG.getBitcast(DstVT, V);
785
786 if (SrcVT.isVector() && (NumDstEltBits % NumSrcEltBits) == 0) {
787 unsigned Scale = NumDstEltBits / NumSrcEltBits;
788 unsigned NumSrcElts = SrcVT.getVectorNumElements();
789 APInt DemandedSrcBits = APInt::getZero(NumSrcEltBits);
790 for (unsigned i = 0; i != Scale; ++i) {
791 unsigned EltOffset = IsLE ? i : (Scale - 1 - i);
792 unsigned BitOffset = EltOffset * NumSrcEltBits;
793 DemandedSrcBits |= DemandedBits.extractBits(NumSrcEltBits, BitOffset);
794 }
795 // Recursive calls below may turn not demanded elements into poison, so we
796 // need to demand all smaller source elements that maps to a demanded
797 // destination element.
798 APInt DemandedSrcElts = APIntOps::ScaleBitMask(DemandedElts, NumSrcElts);
799
801 Src, DemandedSrcBits, DemandedSrcElts, DAG, Depth + 1))
802 return DAG.getBitcast(DstVT, V);
803 }
804
805 // TODO - bigendian once we have test coverage.
806 if (IsLE && (NumSrcEltBits % NumDstEltBits) == 0) {
807 unsigned Scale = NumSrcEltBits / NumDstEltBits;
808 unsigned NumSrcElts = SrcVT.isVector() ? SrcVT.getVectorNumElements() : 1;
809 APInt DemandedSrcBits = APInt::getZero(NumSrcEltBits);
810 APInt DemandedSrcElts = APInt::getZero(NumSrcElts);
811 for (unsigned i = 0; i != NumElts; ++i)
812 if (DemandedElts[i]) {
813 unsigned Offset = (i % Scale) * NumDstEltBits;
814 DemandedSrcBits.insertBits(DemandedBits, Offset);
815 DemandedSrcElts.setBit(i / Scale);
816 }
817
819 Src, DemandedSrcBits, DemandedSrcElts, DAG, Depth + 1))
820 return DAG.getBitcast(DstVT, V);
821 }
822
823 break;
824 }
825 case ISD::AND: {
826 LHSKnown = DAG.computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
827 RHSKnown = DAG.computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
828
829 // If all of the demanded bits are known 1 on one side, return the other.
830 // These bits cannot contribute to the result of the 'and' in this
831 // context.
832 if (DemandedBits.isSubsetOf(LHSKnown.Zero | RHSKnown.One))
833 return Op.getOperand(0);
834 if (DemandedBits.isSubsetOf(RHSKnown.Zero | LHSKnown.One))
835 return Op.getOperand(1);
836 break;
837 }
838 case ISD::OR: {
839 LHSKnown = DAG.computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
840 RHSKnown = DAG.computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
841
842 // If all of the demanded bits are known zero on one side, return the
843 // other. These bits cannot contribute to the result of the 'or' in this
844 // context.
845 if (DemandedBits.isSubsetOf(LHSKnown.One | RHSKnown.Zero))
846 return Op.getOperand(0);
847 if (DemandedBits.isSubsetOf(RHSKnown.One | LHSKnown.Zero))
848 return Op.getOperand(1);
849 break;
850 }
851 case ISD::XOR: {
852 LHSKnown = DAG.computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
853 RHSKnown = DAG.computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
854
855 // If all of the demanded bits are known zero on one side, return the
856 // other.
857 if (DemandedBits.isSubsetOf(RHSKnown.Zero))
858 return Op.getOperand(0);
859 if (DemandedBits.isSubsetOf(LHSKnown.Zero))
860 return Op.getOperand(1);
861 break;
862 }
863 case ISD::ADD:
864 case ISD::MUL:
865 case ISD::SMIN:
866 case ISD::SMAX:
867 case ISD::UMIN:
868 case ISD::UMAX: {
869 if (DAG.isIdentityElement(Op.getOpcode(), Op->getFlags(), Op.getOperand(1),
870 DemandedElts, 1, Depth + 1))
871 return Op.getOperand(0);
872
873 if (DAG.isIdentityElement(Op.getOpcode(), Op->getFlags(), Op.getOperand(0),
874 DemandedElts, 0, Depth + 1))
875 return Op.getOperand(1);
876 break;
877 }
878 case ISD::SHL: {
879 // If we are only demanding sign bits then we can use the shift source
880 // directly.
881 if (std::optional<unsigned> MaxSA =
882 DAG.getValidMaximumShiftAmount(Op, DemandedElts, Depth + 1)) {
883 SDValue Op0 = Op.getOperand(0);
884 unsigned ShAmt = *MaxSA;
885 unsigned NumSignBits =
886 DAG.ComputeNumSignBits(Op0, DemandedElts, Depth + 1);
887 unsigned UpperDemandedBits = BitWidth - DemandedBits.countr_zero();
888 if (NumSignBits > ShAmt && (NumSignBits - ShAmt) >= (UpperDemandedBits))
889 return Op0;
890 }
891 break;
892 }
893 case ISD::SRL: {
894 // If we are only demanding sign bits then we can use the shift source
895 // directly.
896 if (std::optional<unsigned> MaxSA =
897 DAG.getValidMaximumShiftAmount(Op, DemandedElts, Depth + 1)) {
898 SDValue Op0 = Op.getOperand(0);
899 unsigned ShAmt = *MaxSA;
900 // Must already be signbits in DemandedBits bounds, and can't demand any
901 // shifted in zeroes.
902 if (DemandedBits.countl_zero() >= ShAmt) {
903 unsigned NumSignBits =
904 DAG.ComputeNumSignBits(Op0, DemandedElts, Depth + 1);
905 if (DemandedBits.countr_zero() >= (BitWidth - NumSignBits))
906 return Op0;
907 }
908 }
909 break;
910 }
911 case ISD::SETCC: {
912 SDValue Op0 = Op.getOperand(0);
913 SDValue Op1 = Op.getOperand(1);
914 ISD::CondCode CC = cast<CondCodeSDNode>(Op.getOperand(2))->get();
915 // If (1) we only need the sign-bit, (2) the setcc operands are the same
916 // width as the setcc result, and (3) the result of a setcc conforms to 0 or
917 // -1, we may be able to bypass the setcc.
918 if (DemandedBits.isSignMask() &&
922 // If we're testing X < 0, then this compare isn't needed - just use X!
923 // FIXME: We're limiting to integer types here, but this should also work
924 // if we don't care about FP signed-zero. The use of SETLT with FP means
925 // that we don't care about NaNs.
926 if (CC == ISD::SETLT && Op1.getValueType().isInteger() &&
928 return Op0;
929 }
930 break;
931 }
933 // If none of the extended bits are demanded, eliminate the sextinreg.
934 SDValue Op0 = Op.getOperand(0);
935 EVT ExVT = cast<VTSDNode>(Op.getOperand(1))->getVT();
936 unsigned ExBits = ExVT.getScalarSizeInBits();
937 if (DemandedBits.getActiveBits() <= ExBits &&
939 return Op0;
940 // If the input is already sign extended, just drop the extension.
941 unsigned NumSignBits = DAG.ComputeNumSignBits(Op0, DemandedElts, Depth + 1);
942 if (NumSignBits >= (BitWidth - ExBits + 1))
943 return Op0;
944 break;
945 }
949 if (VT.isScalableVector())
950 return SDValue();
951
952 // If we only want the lowest element and none of extended bits, then we can
953 // return the bitcasted source vector.
954 SDValue Src = Op.getOperand(0);
955 EVT SrcVT = Src.getValueType();
956 EVT DstVT = Op.getValueType();
957 if (IsLE && DemandedElts == 1 &&
958 DstVT.getSizeInBits() == SrcVT.getSizeInBits() &&
959 DemandedBits.getActiveBits() <= SrcVT.getScalarSizeInBits()) {
960 return DAG.getBitcast(DstVT, Src);
961 }
962 break;
963 }
965 if (VT.isScalableVector())
966 return SDValue();
967
968 // If we don't demand the inserted element, return the base vector.
969 SDValue Vec = Op.getOperand(0);
970 auto *CIdx = dyn_cast<ConstantSDNode>(Op.getOperand(2));
971 EVT VecVT = Vec.getValueType();
972 if (CIdx && CIdx->getAPIntValue().ult(VecVT.getVectorNumElements()) &&
973 !DemandedElts[CIdx->getZExtValue()])
974 return Vec;
975 break;
976 }
978 if (VT.isScalableVector())
979 return SDValue();
980
981 SDValue Vec = Op.getOperand(0);
982 SDValue Sub = Op.getOperand(1);
983 uint64_t Idx = Op.getConstantOperandVal(2);
984 unsigned NumSubElts = Sub.getValueType().getVectorNumElements();
985 APInt DemandedSubElts = DemandedElts.extractBits(NumSubElts, Idx);
986 // If we don't demand the inserted subvector, return the base vector.
987 if (DemandedSubElts == 0)
988 return Vec;
989 break;
990 }
991 case ISD::VECTOR_SHUFFLE: {
993 ArrayRef<int> ShuffleMask = cast<ShuffleVectorSDNode>(Op)->getMask();
994
995 // If all the demanded elts are from one operand and are inline,
996 // then we can use the operand directly.
997 bool AllUndef = true, IdentityLHS = true, IdentityRHS = true;
998 for (unsigned i = 0; i != NumElts; ++i) {
999 int M = ShuffleMask[i];
1000 if (M < 0 || !DemandedElts[i])
1001 continue;
1002 AllUndef = false;
1003 IdentityLHS &= (M == (int)i);
1004 IdentityRHS &= ((M - NumElts) == i);
1005 }
1006
1007 if (AllUndef)
1008 return DAG.getUNDEF(Op.getValueType());
1009 if (IdentityLHS)
1010 return Op.getOperand(0);
1011 if (IdentityRHS)
1012 return Op.getOperand(1);
1013 break;
1014 }
1015 default:
1016 // TODO: Probably okay to remove after audit; here to reduce change size
1017 // in initial enablement patch for scalable vectors
1018 if (VT.isScalableVector())
1019 return SDValue();
1020
1021 if (Op.getOpcode() >= ISD::BUILTIN_OP_END)
1023 Op, DemandedBits, DemandedElts, DAG, Depth))
1024 return V;
1025 break;
1026 }
1027 return SDValue();
1028}
1029
1032 unsigned Depth) const {
1033 EVT VT = Op.getValueType();
1034 // Since the number of lanes in a scalable vector is unknown at compile time,
1035 // we track one bit which is implicitly broadcast to all lanes. This means
1036 // that all lanes in a scalable vector are considered demanded.
1037 APInt DemandedElts = VT.isFixedLengthVector()
1039 : APInt(1, 1);
1040 return SimplifyMultipleUseDemandedBits(Op, DemandedBits, DemandedElts, DAG,
1041 Depth);
1042}
1043
1045 SDValue Op, const APInt &DemandedElts, SelectionDAG &DAG,
1046 unsigned Depth) const {
1047 APInt DemandedBits = APInt::getAllOnes(Op.getScalarValueSizeInBits());
1048 return SimplifyMultipleUseDemandedBits(Op, DemandedBits, DemandedElts, DAG,
1049 Depth);
1050}
1051
1052// Attempt to form ext(avgfloor(A, B)) from shr(add(ext(A), ext(B)), 1).
1053// or to form ext(avgceil(A, B)) from shr(add(ext(A), ext(B), 1), 1).
1056 const TargetLowering &TLI,
1057 const APInt &DemandedBits,
1058 const APInt &DemandedElts, unsigned Depth) {
1059 assert((Op.getOpcode() == ISD::SRL || Op.getOpcode() == ISD::SRA) &&
1060 "SRL or SRA node is required here!");
1061 // Is the right shift using an immediate value of 1?
1062 ConstantSDNode *N1C = isConstOrConstSplat(Op.getOperand(1), DemandedElts);
1063 if (!N1C || !N1C->isOne())
1064 return SDValue();
1065
1066 // We are looking for an avgfloor
1067 // add(ext, ext)
1068 // or one of these as a avgceil
1069 // add(add(ext, ext), 1)
1070 // add(add(ext, 1), ext)
1071 // add(ext, add(ext, 1))
1072 SDValue Add = Op.getOperand(0);
1073 if (Add.getOpcode() != ISD::ADD)
1074 return SDValue();
1075
1076 SDValue ExtOpA = Add.getOperand(0);
1077 SDValue ExtOpB = Add.getOperand(1);
1078 SDValue Add2;
1079 auto MatchOperands = [&](SDValue Op1, SDValue Op2, SDValue Op3, SDValue A) {
1080 ConstantSDNode *ConstOp;
1081 if ((ConstOp = isConstOrConstSplat(Op2, DemandedElts)) &&
1082 ConstOp->isOne()) {
1083 ExtOpA = Op1;
1084 ExtOpB = Op3;
1085 Add2 = A;
1086 return true;
1087 }
1088 if ((ConstOp = isConstOrConstSplat(Op3, DemandedElts)) &&
1089 ConstOp->isOne()) {
1090 ExtOpA = Op1;
1091 ExtOpB = Op2;
1092 Add2 = A;
1093 return true;
1094 }
1095 return false;
1096 };
1097 bool IsCeil =
1098 (ExtOpA.getOpcode() == ISD::ADD &&
1099 MatchOperands(ExtOpA.getOperand(0), ExtOpA.getOperand(1), ExtOpB, ExtOpA)) ||
1100 (ExtOpB.getOpcode() == ISD::ADD &&
1101 MatchOperands(ExtOpB.getOperand(0), ExtOpB.getOperand(1), ExtOpA, ExtOpB));
1102
1103 // If the shift is signed (sra):
1104 // - Needs >= 2 sign bit for both operands.
1105 // - Needs >= 2 zero bits.
1106 // If the shift is unsigned (srl):
1107 // - Needs >= 1 zero bit for both operands.
1108 // - Needs 1 demanded bit zero and >= 2 sign bits.
1109 SelectionDAG &DAG = TLO.DAG;
1110 unsigned ShiftOpc = Op.getOpcode();
1111 bool IsSigned = false;
1112 unsigned KnownBits;
1113 unsigned NumSignedA = DAG.ComputeNumSignBits(ExtOpA, DemandedElts, Depth);
1114 unsigned NumSignedB = DAG.ComputeNumSignBits(ExtOpB, DemandedElts, Depth);
1115 unsigned NumSigned = std::min(NumSignedA, NumSignedB) - 1;
1116 unsigned NumZeroA =
1117 DAG.computeKnownBits(ExtOpA, DemandedElts, Depth).countMinLeadingZeros();
1118 unsigned NumZeroB =
1119 DAG.computeKnownBits(ExtOpB, DemandedElts, Depth).countMinLeadingZeros();
1120 unsigned NumZero = std::min(NumZeroA, NumZeroB);
1121
1122 switch (ShiftOpc) {
1123 default:
1124 llvm_unreachable("Unexpected ShiftOpc in combineShiftToAVG");
1125 case ISD::SRA: {
1126 if (NumZero >= 2 && NumSigned < NumZero) {
1127 IsSigned = false;
1128 KnownBits = NumZero;
1129 break;
1130 }
1131 if (NumSigned >= 1) {
1132 IsSigned = true;
1133 KnownBits = NumSigned;
1134 break;
1135 }
1136 return SDValue();
1137 }
1138 case ISD::SRL: {
1139 if (NumZero >= 1 && NumSigned < NumZero) {
1140 IsSigned = false;
1141 KnownBits = NumZero;
1142 break;
1143 }
1144 if (NumSigned >= 1 && DemandedBits.isSignBitClear()) {
1145 IsSigned = true;
1146 KnownBits = NumSigned;
1147 break;
1148 }
1149 return SDValue();
1150 }
1151 }
1152
1153 unsigned AVGOpc = IsCeil ? (IsSigned ? ISD::AVGCEILS : ISD::AVGCEILU)
1154 : (IsSigned ? ISD::AVGFLOORS : ISD::AVGFLOORU);
1155
1156 // Find the smallest power-2 type that is legal for this vector size and
1157 // operation, given the original type size and the number of known sign/zero
1158 // bits.
1159 EVT VT = Op.getValueType();
1160 unsigned MinWidth =
1161 std::max<unsigned>(VT.getScalarSizeInBits() - KnownBits, 8);
1162 EVT NVT = EVT::getIntegerVT(*DAG.getContext(), llvm::bit_ceil(MinWidth));
1164 return SDValue();
1165 if (VT.isVector())
1166 NVT = EVT::getVectorVT(*DAG.getContext(), NVT, VT.getVectorElementCount());
1167 if (TLO.LegalTypes() && !TLI.isOperationLegal(AVGOpc, NVT)) {
1168 // If we could not transform, and (both) adds are nuw/nsw, we can use the
1169 // larger type size to do the transform.
1170 if (TLO.LegalOperations() && !TLI.isOperationLegal(AVGOpc, VT))
1171 return SDValue();
1172 if (DAG.willNotOverflowAdd(IsSigned, Add.getOperand(0),
1173 Add.getOperand(1)) &&
1174 (!Add2 || DAG.willNotOverflowAdd(IsSigned, Add2.getOperand(0),
1175 Add2.getOperand(1))))
1176 NVT = VT;
1177 else
1178 return SDValue();
1179 }
1180
1181 // Don't create a AVGFLOOR node with a scalar constant unless its legal as
1182 // this is likely to stop other folds (reassociation, value tracking etc.)
1183 if (!IsCeil && !TLI.isOperationLegal(AVGOpc, NVT) &&
1184 (isa<ConstantSDNode>(ExtOpA) || isa<ConstantSDNode>(ExtOpB)))
1185 return SDValue();
1186
1187 SDLoc DL(Op);
1188 SDValue ResultAVG =
1189 DAG.getNode(AVGOpc, DL, NVT, DAG.getExtOrTrunc(IsSigned, ExtOpA, DL, NVT),
1190 DAG.getExtOrTrunc(IsSigned, ExtOpB, DL, NVT));
1191 return DAG.getExtOrTrunc(IsSigned, ResultAVG, DL, VT);
1192}
1193
1194/// Look at Op. At this point, we know that only the OriginalDemandedBits of the
1195/// result of Op are ever used downstream. If we can use this information to
1196/// simplify Op, create a new simplified DAG node and return true, returning the
1197/// original and new nodes in Old and New. Otherwise, analyze the expression and
1198/// return a mask of Known bits for the expression (used to simplify the
1199/// caller). The Known bits may only be accurate for those bits in the
1200/// OriginalDemandedBits and OriginalDemandedElts.
1202 SDValue Op, const APInt &OriginalDemandedBits,
1203 const APInt &OriginalDemandedElts, KnownBits &Known, TargetLoweringOpt &TLO,
1204 unsigned Depth, bool AssumeSingleUse) const {
1205 unsigned BitWidth = OriginalDemandedBits.getBitWidth();
1206 assert(Op.getScalarValueSizeInBits() == BitWidth &&
1207 "Mask size mismatches value type size!");
1208
1209 // Don't know anything.
1211
1212 EVT VT = Op.getValueType();
1213 bool IsLE = TLO.DAG.getDataLayout().isLittleEndian();
1214 unsigned NumElts = OriginalDemandedElts.getBitWidth();
1215 assert((!VT.isFixedLengthVector() || NumElts == VT.getVectorNumElements()) &&
1216 "Unexpected vector size");
1217
1218 APInt DemandedBits = OriginalDemandedBits;
1219 APInt DemandedElts = OriginalDemandedElts;
1220 SDLoc dl(Op);
1221
1222 // Undef operand.
1223 if (Op.isUndef())
1224 return false;
1225
1226 // We can't simplify target constants.
1227 if (Op.getOpcode() == ISD::TargetConstant)
1228 return false;
1229
1230 if (Op.getOpcode() == ISD::Constant) {
1231 // We know all of the bits for a constant!
1232 Known = KnownBits::makeConstant(Op->getAsAPIntVal());
1233 return false;
1234 }
1235
1236 if (Op.getOpcode() == ISD::ConstantFP) {
1237 // We know all of the bits for a floating point constant!
1239 cast<ConstantFPSDNode>(Op)->getValueAPF().bitcastToAPInt());
1240 return false;
1241 }
1242
1243 // Other users may use these bits.
1244 bool HasMultiUse = false;
1245 if (!AssumeSingleUse && !Op.getNode()->hasOneUse()) {
1247 // Limit search depth.
1248 return false;
1249 }
1250 // Allow multiple uses, just set the DemandedBits/Elts to all bits.
1252 DemandedElts = APInt::getAllOnes(NumElts);
1253 HasMultiUse = true;
1254 } else if (OriginalDemandedBits == 0 || OriginalDemandedElts == 0) {
1255 // Not demanding any bits/elts from Op.
1256 return TLO.CombineTo(Op, TLO.DAG.getUNDEF(VT));
1257 } else if (Depth >= SelectionDAG::MaxRecursionDepth) {
1258 // Limit search depth.
1259 return false;
1260 }
1261
1262 KnownBits Known2;
1263 switch (Op.getOpcode()) {
1264 case ISD::SCALAR_TO_VECTOR: {
1265 if (VT.isScalableVector())
1266 return false;
1267 if (!DemandedElts[0])
1268 return TLO.CombineTo(Op, TLO.DAG.getUNDEF(VT));
1269
1270 KnownBits SrcKnown;
1271 SDValue Src = Op.getOperand(0);
1272 unsigned SrcBitWidth = Src.getScalarValueSizeInBits();
1273 APInt SrcDemandedBits = DemandedBits.zext(SrcBitWidth);
1274 if (SimplifyDemandedBits(Src, SrcDemandedBits, SrcKnown, TLO, Depth + 1))
1275 return true;
1276
1277 // Upper elements are undef, so only get the knownbits if we just demand
1278 // the bottom element.
1279 if (DemandedElts == 1)
1280 Known = SrcKnown.anyextOrTrunc(BitWidth);
1281 break;
1282 }
1283 case ISD::BUILD_VECTOR:
1284 // Collect the known bits that are shared by every demanded element.
1285 // TODO: Call SimplifyDemandedBits for non-constant demanded elements.
1286 Known = TLO.DAG.computeKnownBits(Op, DemandedElts, Depth);
1287 return false; // Don't fall through, will infinitely loop.
1288 case ISD::SPLAT_VECTOR: {
1289 SDValue Scl = Op.getOperand(0);
1290 APInt DemandedSclBits = DemandedBits.zextOrTrunc(Scl.getValueSizeInBits());
1291 KnownBits KnownScl;
1292 if (SimplifyDemandedBits(Scl, DemandedSclBits, KnownScl, TLO, Depth + 1))
1293 return true;
1294
1295 // Implicitly truncate the bits to match the official semantics of
1296 // SPLAT_VECTOR.
1297 Known = KnownScl.trunc(BitWidth);
1298 break;
1299 }
1300 case ISD::FREEZE: {
1301 SDValue N0 = Op.getOperand(0);
1303 N0, DemandedElts, UndefPoisonKind::UndefOrPoison, Depth + 1))
1304 return TLO.CombineTo(Op, N0);
1305 break;
1306 }
1307 case ISD::LOAD: {
1308 auto *LD = cast<LoadSDNode>(Op);
1309 if (getTargetConstantFromLoad(LD)) {
1310 Known = TLO.DAG.computeKnownBits(Op, DemandedElts, Depth);
1311 return false; // Don't fall through, will infinitely loop.
1312 }
1313 if (ISD::isZEXTLoad(Op.getNode()) && Op.getResNo() == 0) {
1314 // If this is a ZEXTLoad and we are looking at the loaded value.
1315 EVT MemVT = LD->getMemoryVT();
1316 unsigned MemBits = MemVT.getScalarSizeInBits();
1317 Known.Zero.setBitsFrom(MemBits);
1318 return false; // Don't fall through, will infinitely loop.
1319 }
1320 break;
1321 }
1323 if (VT.isScalableVector())
1324 return false;
1325 SDValue Vec = Op.getOperand(0);
1326 SDValue Scl = Op.getOperand(1);
1327 auto *CIdx = dyn_cast<ConstantSDNode>(Op.getOperand(2));
1328 EVT VecVT = Vec.getValueType();
1329
1330 // If index isn't constant, assume we need all vector elements AND the
1331 // inserted element.
1332 APInt DemandedVecElts(DemandedElts);
1333 if (CIdx && CIdx->getAPIntValue().ult(VecVT.getVectorNumElements())) {
1334 unsigned Idx = CIdx->getZExtValue();
1335 DemandedVecElts.clearBit(Idx);
1336
1337 // Inserted element is not required.
1338 if (!DemandedElts[Idx])
1339 return TLO.CombineTo(Op, Vec);
1340 }
1341
1342 KnownBits KnownScl;
1343 unsigned NumSclBits = Scl.getScalarValueSizeInBits();
1344 APInt DemandedSclBits = DemandedBits.zextOrTrunc(NumSclBits);
1345 if (SimplifyDemandedBits(Scl, DemandedSclBits, KnownScl, TLO, Depth + 1))
1346 return true;
1347
1348 Known = KnownScl.anyextOrTrunc(BitWidth);
1349
1350 KnownBits KnownVec;
1351 if (SimplifyDemandedBits(Vec, DemandedBits, DemandedVecElts, KnownVec, TLO,
1352 Depth + 1))
1353 return true;
1354
1355 if (!!DemandedVecElts)
1356 Known = Known.intersectWith(KnownVec);
1357
1358 return false;
1359 }
1360 case ISD::INSERT_SUBVECTOR: {
1361 if (VT.isScalableVector())
1362 return false;
1363 // Demand any elements from the subvector and the remainder from the src its
1364 // inserted into.
1365 SDValue Src = Op.getOperand(0);
1366 SDValue Sub = Op.getOperand(1);
1367 uint64_t Idx = Op.getConstantOperandVal(2);
1368 unsigned NumSubElts = Sub.getValueType().getVectorNumElements();
1369 APInt DemandedSubElts = DemandedElts.extractBits(NumSubElts, Idx);
1370 APInt DemandedSrcElts = DemandedElts;
1371 DemandedSrcElts.clearBits(Idx, Idx + NumSubElts);
1372
1373 KnownBits KnownSub, KnownSrc;
1374 if (SimplifyDemandedBits(Sub, DemandedBits, DemandedSubElts, KnownSub, TLO,
1375 Depth + 1))
1376 return true;
1377 if (SimplifyDemandedBits(Src, DemandedBits, DemandedSrcElts, KnownSrc, TLO,
1378 Depth + 1))
1379 return true;
1380
1381 Known.setAllConflict();
1382 if (!!DemandedSubElts)
1383 Known = Known.intersectWith(KnownSub);
1384 if (!!DemandedSrcElts)
1385 Known = Known.intersectWith(KnownSrc);
1386
1387 // Attempt to avoid multi-use src if we don't need anything from it.
1388 if (!DemandedBits.isAllOnes() || !DemandedSubElts.isAllOnes() ||
1389 !DemandedSrcElts.isAllOnes()) {
1391 Sub, DemandedBits, DemandedSubElts, TLO.DAG, Depth + 1);
1393 Src, DemandedBits, DemandedSrcElts, TLO.DAG, Depth + 1);
1394 if (NewSub || NewSrc) {
1395 NewSub = NewSub ? NewSub : Sub;
1396 NewSrc = NewSrc ? NewSrc : Src;
1397 SDValue NewOp = TLO.DAG.getNode(Op.getOpcode(), dl, VT, NewSrc, NewSub,
1398 Op.getOperand(2));
1399 return TLO.CombineTo(Op, NewOp);
1400 }
1401 }
1402 break;
1403 }
1405 if (VT.isScalableVector())
1406 return false;
1407 // Offset the demanded elts by the subvector index.
1408 SDValue Src = Op.getOperand(0);
1409 if (Src.getValueType().isScalableVector())
1410 break;
1411 uint64_t Idx = Op.getConstantOperandVal(1);
1412 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
1413 APInt DemandedSrcElts = DemandedElts.zext(NumSrcElts).shl(Idx);
1414
1415 if (SimplifyDemandedBits(Src, DemandedBits, DemandedSrcElts, Known, TLO,
1416 Depth + 1))
1417 return true;
1418
1419 // Attempt to avoid multi-use src if we don't need anything from it.
1420 if (!DemandedBits.isAllOnes() || !DemandedSrcElts.isAllOnes()) {
1422 Src, DemandedBits, DemandedSrcElts, TLO.DAG, Depth + 1);
1423 if (DemandedSrc) {
1424 SDValue NewOp = TLO.DAG.getNode(Op.getOpcode(), dl, VT, DemandedSrc,
1425 Op.getOperand(1));
1426 return TLO.CombineTo(Op, NewOp);
1427 }
1428 }
1429 break;
1430 }
1431 case ISD::CONCAT_VECTORS: {
1432 if (VT.isScalableVector())
1433 return false;
1434 Known.setAllConflict();
1435 EVT SubVT = Op.getOperand(0).getValueType();
1436 unsigned NumSubVecs = Op.getNumOperands();
1437 unsigned NumSubElts = SubVT.getVectorNumElements();
1438 for (unsigned i = 0; i != NumSubVecs; ++i) {
1439 APInt DemandedSubElts =
1440 DemandedElts.extractBits(NumSubElts, i * NumSubElts);
1441 if (SimplifyDemandedBits(Op.getOperand(i), DemandedBits, DemandedSubElts,
1442 Known2, TLO, Depth + 1))
1443 return true;
1444 // Known bits are shared by every demanded subvector element.
1445 if (!!DemandedSubElts)
1446 Known = Known.intersectWith(Known2);
1447 }
1448 break;
1449 }
1450 case ISD::VECTOR_SHUFFLE: {
1451 assert(!VT.isScalableVector());
1452 ArrayRef<int> ShuffleMask = cast<ShuffleVectorSDNode>(Op)->getMask();
1453
1454 // Collect demanded elements from shuffle operands..
1455 APInt DemandedLHS, DemandedRHS;
1456 if (!getShuffleDemandedElts(NumElts, ShuffleMask, DemandedElts, DemandedLHS,
1457 DemandedRHS))
1458 break;
1459
1460 if (!!DemandedLHS || !!DemandedRHS) {
1461 SDValue Op0 = Op.getOperand(0);
1462 SDValue Op1 = Op.getOperand(1);
1463
1464 Known.setAllConflict();
1465 if (!!DemandedLHS) {
1466 if (SimplifyDemandedBits(Op0, DemandedBits, DemandedLHS, Known2, TLO,
1467 Depth + 1))
1468 return true;
1469 Known = Known.intersectWith(Known2);
1470 }
1471 if (!!DemandedRHS) {
1472 if (SimplifyDemandedBits(Op1, DemandedBits, DemandedRHS, Known2, TLO,
1473 Depth + 1))
1474 return true;
1475 Known = Known.intersectWith(Known2);
1476 }
1477
1478 // Attempt to avoid multi-use ops if we don't need anything from them.
1480 Op0, DemandedBits, DemandedLHS, TLO.DAG, Depth + 1);
1482 Op1, DemandedBits, DemandedRHS, TLO.DAG, Depth + 1);
1483 if (DemandedOp0 || DemandedOp1) {
1484 Op0 = DemandedOp0 ? DemandedOp0 : Op0;
1485 Op1 = DemandedOp1 ? DemandedOp1 : Op1;
1486 SDValue NewOp = TLO.DAG.getVectorShuffle(VT, dl, Op0, Op1, ShuffleMask);
1487 return TLO.CombineTo(Op, NewOp);
1488 }
1489 }
1490 break;
1491 }
1492 case ISD::AND: {
1493 SDValue Op0 = Op.getOperand(0);
1494 SDValue Op1 = Op.getOperand(1);
1495
1496 // If the RHS is a constant, check to see if the LHS would be zero without
1497 // using the bits from the RHS. Below, we use knowledge about the RHS to
1498 // simplify the LHS, here we're using information from the LHS to simplify
1499 // the RHS.
1500 if (ConstantSDNode *RHSC = isConstOrConstSplat(Op1, DemandedElts)) {
1501 // Do not increment Depth here; that can cause an infinite loop.
1502 KnownBits LHSKnown = TLO.DAG.computeKnownBits(Op0, DemandedElts, Depth);
1503 // If the LHS already has zeros where RHSC does, this 'and' is dead.
1504 if ((LHSKnown.Zero & DemandedBits) ==
1505 (~RHSC->getAPIntValue() & DemandedBits))
1506 return TLO.CombineTo(Op, Op0);
1507
1508 // If any of the set bits in the RHS are known zero on the LHS, shrink
1509 // the constant.
1510 if (ShrinkDemandedConstant(Op, ~LHSKnown.Zero & DemandedBits,
1511 DemandedElts, TLO))
1512 return true;
1513
1514 // Bitwise-not (xor X, -1) is a special case: we don't usually shrink its
1515 // constant, but if this 'and' is only clearing bits that were just set by
1516 // the xor, then this 'and' can be eliminated by shrinking the mask of
1517 // the xor. For example, for a 32-bit X:
1518 // and (xor (srl X, 31), -1), 1 --> xor (srl X, 31), 1
1519 if (isBitwiseNot(Op0) && Op0.hasOneUse() &&
1520 LHSKnown.One == ~RHSC->getAPIntValue()) {
1521 SDValue Xor = TLO.DAG.getNode(ISD::XOR, dl, VT, Op0.getOperand(0), Op1);
1522 return TLO.CombineTo(Op, Xor);
1523 }
1524 }
1525
1526 // (X +/- Y) & Y --> ~X & Y when Y is a power of 2 (or zero).
1527 SDValue X, Y;
1528 if (sd_match(Op,
1529 m_And(m_Value(Y),
1531 m_Sub(m_Value(X), m_Deferred(Y)))))) &&
1532 TLO.DAG.isKnownToBeAPowerOfTwo(Y, DemandedElts, /*OrZero=*/true)) {
1533 return TLO.CombineTo(
1534 Op, TLO.DAG.getNode(ISD::AND, dl, VT, TLO.DAG.getNOT(dl, X, VT), Y));
1535 }
1536
1537 // AND(INSERT_SUBVECTOR(C,X,I),M) -> INSERT_SUBVECTOR(AND(C,M),X,I)
1538 // iff 'C' is Undef/Constant and AND(X,M) == X (for DemandedBits).
1539 if (Op0.getOpcode() == ISD::INSERT_SUBVECTOR && !VT.isScalableVector() &&
1540 (Op0.getOperand(0).isUndef() ||
1542 Op0->hasOneUse()) {
1543 unsigned NumSubElts =
1545 unsigned SubIdx = Op0.getConstantOperandVal(2);
1546 APInt DemandedSub =
1547 APInt::getBitsSet(NumElts, SubIdx, SubIdx + NumSubElts);
1548 KnownBits KnownSubMask =
1549 TLO.DAG.computeKnownBits(Op1, DemandedSub & DemandedElts, Depth + 1);
1550 if (DemandedBits.isSubsetOf(KnownSubMask.One)) {
1551 SDValue NewAnd =
1552 TLO.DAG.getNode(ISD::AND, dl, VT, Op0.getOperand(0), Op1);
1553 SDValue NewInsert =
1554 TLO.DAG.getNode(ISD::INSERT_SUBVECTOR, dl, VT, NewAnd,
1555 Op0.getOperand(1), Op0.getOperand(2));
1556 return TLO.CombineTo(Op, NewInsert);
1557 }
1558 }
1559
1560 if (SimplifyDemandedBits(Op1, DemandedBits, DemandedElts, Known, TLO,
1561 Depth + 1))
1562 return true;
1563 if (SimplifyDemandedBits(Op0, ~Known.Zero & DemandedBits, DemandedElts,
1564 Known2, TLO, Depth + 1))
1565 return true;
1566
1567 // If all of the demanded bits are known one on one side, return the other.
1568 // These bits cannot contribute to the result of the 'and'.
1569 if (DemandedBits.isSubsetOf(Known2.Zero | Known.One))
1570 return TLO.CombineTo(Op, Op0);
1571 if (DemandedBits.isSubsetOf(Known.Zero | Known2.One))
1572 return TLO.CombineTo(Op, Op1);
1573 // If all of the demanded bits in the inputs are known zeros, return zero.
1574 if (DemandedBits.isSubsetOf(Known.Zero | Known2.Zero))
1575 return TLO.CombineTo(Op, TLO.DAG.getConstant(0, dl, VT));
1576 // If the RHS is a constant, see if we can simplify it.
1577 if (ShrinkDemandedConstant(Op, ~Known2.Zero & DemandedBits, DemandedElts,
1578 TLO))
1579 return true;
1580 // If the operation can be done in a smaller type, do so.
1582 return true;
1583
1584 // Attempt to avoid multi-use ops if we don't need anything from them.
1585 if (!DemandedBits.isAllOnes() || !DemandedElts.isAllOnes()) {
1587 Op0, DemandedBits, DemandedElts, TLO.DAG, Depth + 1);
1589 Op1, DemandedBits, DemandedElts, TLO.DAG, Depth + 1);
1590 if (DemandedOp0 || DemandedOp1) {
1591 Op0 = DemandedOp0 ? DemandedOp0 : Op0;
1592 Op1 = DemandedOp1 ? DemandedOp1 : Op1;
1593 SDValue NewOp = TLO.DAG.getNode(Op.getOpcode(), dl, VT, Op0, Op1);
1594 return TLO.CombineTo(Op, NewOp);
1595 }
1596 }
1597
1598 Known &= Known2;
1599 break;
1600 }
1601 case ISD::OR: {
1602 SDValue Op0 = Op.getOperand(0);
1603 SDValue Op1 = Op.getOperand(1);
1604 if (SimplifyDemandedBits(Op1, DemandedBits, DemandedElts, Known, TLO,
1605 Depth + 1)) {
1606 Op->dropFlags(SDNodeFlags::Disjoint);
1607 return true;
1608 }
1609
1610 if (SimplifyDemandedBits(Op0, ~Known.One & DemandedBits, DemandedElts,
1611 Known2, TLO, Depth + 1)) {
1612 Op->dropFlags(SDNodeFlags::Disjoint);
1613 return true;
1614 }
1615
1616 // If all of the demanded bits are known zero on one side, return the other.
1617 // These bits cannot contribute to the result of the 'or'.
1618 if (DemandedBits.isSubsetOf(Known2.One | Known.Zero))
1619 return TLO.CombineTo(Op, Op0);
1620 if (DemandedBits.isSubsetOf(Known.One | Known2.Zero))
1621 return TLO.CombineTo(Op, Op1);
1622 // If the RHS is a constant, see if we can simplify it.
1623 if (ShrinkDemandedConstant(Op, DemandedBits, DemandedElts, TLO))
1624 return true;
1625 // If the operation can be done in a smaller type, do so.
1627 return true;
1628
1629 // Attempt to avoid multi-use ops if we don't need anything from them.
1630 if (!DemandedBits.isAllOnes() || !DemandedElts.isAllOnes()) {
1632 Op0, DemandedBits, DemandedElts, TLO.DAG, Depth + 1);
1634 Op1, DemandedBits, DemandedElts, TLO.DAG, Depth + 1);
1635 if (DemandedOp0 || DemandedOp1) {
1636 Op0 = DemandedOp0 ? DemandedOp0 : Op0;
1637 Op1 = DemandedOp1 ? DemandedOp1 : Op1;
1638 SDValue NewOp = TLO.DAG.getNode(Op.getOpcode(), dl, VT, Op0, Op1);
1639 return TLO.CombineTo(Op, NewOp);
1640 }
1641 }
1642
1643 // (or (and X, C1), (and (or X, Y), C2)) -> (or (and X, C1|C2), (and Y, C2))
1644 // TODO: Use SimplifyMultipleUseDemandedBits to peek through masks.
1645 SDValue X, Y, C1, C2;
1648 m_Value(C2)))))) {
1649 if (SDValue C12 =
1650 TLO.DAG.FoldConstantArithmetic(ISD::OR, dl, VT, {C1, C2})) {
1651 SDValue MaskX = TLO.DAG.getNode(ISD::AND, dl, VT, X, C12);
1652 SDValue MaskY = TLO.DAG.getNode(ISD::AND, dl, VT, Y, C2);
1653 return TLO.CombineTo(Op,
1654 TLO.DAG.getNode(ISD::OR, dl, VT, MaskX, MaskY));
1655 }
1656 }
1657
1658 Known |= Known2;
1659 break;
1660 }
1661 case ISD::XOR: {
1662 SDValue Op0 = Op.getOperand(0);
1663 SDValue Op1 = Op.getOperand(1);
1664
1665 if (SimplifyDemandedBits(Op1, DemandedBits, DemandedElts, Known, TLO,
1666 Depth + 1))
1667 return true;
1668 if (SimplifyDemandedBits(Op0, DemandedBits, DemandedElts, Known2, TLO,
1669 Depth + 1))
1670 return true;
1671
1672 // If all of the demanded bits are known zero on one side, return the other.
1673 // These bits cannot contribute to the result of the 'xor'.
1674 if (DemandedBits.isSubsetOf(Known.Zero))
1675 return TLO.CombineTo(Op, Op0);
1676 if (DemandedBits.isSubsetOf(Known2.Zero))
1677 return TLO.CombineTo(Op, Op1);
1678 // If the operation can be done in a smaller type, do so.
1680 return true;
1681
1682 // If all of the unknown bits are known to be zero on one side or the other
1683 // turn this into an *inclusive* or.
1684 // e.g. (A & C1)^(B & C2) -> (A & C1)|(B & C2) iff C1&C2 == 0
1685 if (DemandedBits.isSubsetOf(Known.Zero | Known2.Zero))
1686 return TLO.CombineTo(Op, TLO.DAG.getNode(ISD::OR, dl, VT, Op0, Op1));
1687
1688 ConstantSDNode *C = isConstOrConstSplat(Op1, DemandedElts);
1689 if (C) {
1690 // If one side is a constant, and all of the set bits in the constant are
1691 // also known set on the other side, turn this into an AND, as we know
1692 // the bits will be cleared.
1693 // e.g. (X | C1) ^ C2 --> (X | C1) & ~C2 iff (C1&C2) == C2
1694 // NB: it is okay if more bits are known than are requested
1695 if (C->getAPIntValue() == Known2.One) {
1696 SDValue ANDC =
1697 TLO.DAG.getConstant(~C->getAPIntValue() & DemandedBits, dl, VT);
1698 return TLO.CombineTo(Op, TLO.DAG.getNode(ISD::AND, dl, VT, Op0, ANDC));
1699 }
1700
1701 // If the RHS is a constant, see if we can change it. Don't alter a -1
1702 // constant because that's a 'not' op, and that is better for combining
1703 // and codegen.
1704 if (!C->isAllOnes() && DemandedBits.isSubsetOf(C->getAPIntValue())) {
1705 // We're flipping all demanded bits. Flip the undemanded bits too.
1706 SDValue New = TLO.DAG.getNOT(dl, Op0, VT);
1707 return TLO.CombineTo(Op, New);
1708 }
1709
1710 unsigned Op0Opcode = Op0.getOpcode();
1711 if ((Op0Opcode == ISD::SRL || Op0Opcode == ISD::SHL) && Op0.hasOneUse()) {
1712 if (ConstantSDNode *ShiftC =
1713 isConstOrConstSplat(Op0.getOperand(1), DemandedElts)) {
1714 // Don't crash on an oversized shift. We can not guarantee that a
1715 // bogus shift has been simplified to undef.
1716 if (ShiftC->getAPIntValue().ult(BitWidth)) {
1717 uint64_t ShiftAmt = ShiftC->getZExtValue();
1719 Ones = Op0Opcode == ISD::SHL ? Ones.shl(ShiftAmt)
1720 : Ones.lshr(ShiftAmt);
1721 if ((DemandedBits & C->getAPIntValue()) == (DemandedBits & Ones) &&
1723 // If the xor constant is a demanded mask, do a 'not' before the
1724 // shift:
1725 // xor (X << ShiftC), XorC --> (not X) << ShiftC
1726 // xor (X >> ShiftC), XorC --> (not X) >> ShiftC
1727 SDValue Not = TLO.DAG.getNOT(dl, Op0.getOperand(0), VT);
1728 return TLO.CombineTo(Op, TLO.DAG.getNode(Op0Opcode, dl, VT, Not,
1729 Op0.getOperand(1)));
1730 }
1731 }
1732 }
1733 }
1734 }
1735
1736 // If we can't turn this into a 'not', try to shrink the constant.
1737 if (!C || !C->isAllOnes())
1738 if (ShrinkDemandedConstant(Op, DemandedBits, DemandedElts, TLO))
1739 return true;
1740
1741 // Attempt to avoid multi-use ops if we don't need anything from them.
1742 if (!DemandedBits.isAllOnes() || !DemandedElts.isAllOnes()) {
1744 Op0, DemandedBits, DemandedElts, TLO.DAG, Depth + 1);
1746 Op1, DemandedBits, DemandedElts, TLO.DAG, Depth + 1);
1747 if (DemandedOp0 || DemandedOp1) {
1748 Op0 = DemandedOp0 ? DemandedOp0 : Op0;
1749 Op1 = DemandedOp1 ? DemandedOp1 : Op1;
1750 SDValue NewOp = TLO.DAG.getNode(Op.getOpcode(), dl, VT, Op0, Op1);
1751 return TLO.CombineTo(Op, NewOp);
1752 }
1753 }
1754
1755 Known ^= Known2;
1756 break;
1757 }
1758 case ISD::SELECT:
1759 if (SimplifyDemandedBits(Op.getOperand(2), DemandedBits, DemandedElts,
1760 Known, TLO, Depth + 1))
1761 return true;
1762 if (SimplifyDemandedBits(Op.getOperand(1), DemandedBits, DemandedElts,
1763 Known2, TLO, Depth + 1))
1764 return true;
1765
1766 // If the operands are constants, see if we can simplify them.
1767 if (ShrinkDemandedConstant(Op, DemandedBits, DemandedElts, TLO))
1768 return true;
1769
1770 // Only known if known in both the LHS and RHS.
1771 Known = Known.intersectWith(Known2);
1772 break;
1773 case ISD::VSELECT:
1774 if (SimplifyDemandedBits(Op.getOperand(2), DemandedBits, DemandedElts,
1775 Known, TLO, Depth + 1))
1776 return true;
1777 if (SimplifyDemandedBits(Op.getOperand(1), DemandedBits, DemandedElts,
1778 Known2, TLO, Depth + 1))
1779 return true;
1780
1781 // Only known if known in both the LHS and RHS.
1782 Known = Known.intersectWith(Known2);
1783 break;
1784 case ISD::SELECT_CC:
1785 if (SimplifyDemandedBits(Op.getOperand(3), DemandedBits, DemandedElts,
1786 Known, TLO, Depth + 1))
1787 return true;
1788 if (SimplifyDemandedBits(Op.getOperand(2), DemandedBits, DemandedElts,
1789 Known2, TLO, Depth + 1))
1790 return true;
1791
1792 // If the operands are constants, see if we can simplify them.
1793 if (ShrinkDemandedConstant(Op, DemandedBits, DemandedElts, TLO))
1794 return true;
1795
1796 // Only known if known in both the LHS and RHS.
1797 Known = Known.intersectWith(Known2);
1798 break;
1799 case ISD::SETCC: {
1800 SDValue Op0 = Op.getOperand(0);
1801 SDValue Op1 = Op.getOperand(1);
1802 ISD::CondCode CC = cast<CondCodeSDNode>(Op.getOperand(2))->get();
1803 // If we're testing X < 0, X >= 0, X <= -1 or X > -1
1804 // (X is of integer type) then we only need the sign mask of the previous
1805 // result
1806 if (Op1.getValueType().isInteger() &&
1807 (((CC == ISD::SETLT || CC == ISD::SETGE) && isNullOrNullSplat(Op1)) ||
1808 ((CC == ISD::SETLE || CC == ISD::SETGT) &&
1809 isAllOnesOrAllOnesSplat(Op1)))) {
1810 KnownBits KnownOp0;
1813 DemandedElts, KnownOp0, TLO, Depth + 1))
1814 return true;
1815 // If (1) we only need the sign-bit, (2) the setcc operands are the same
1816 // width as the setcc result, and (3) the result of a setcc conforms to 0
1817 // or -1, we may be able to bypass the setcc.
1818 if (DemandedBits.isSignMask() &&
1822 // If we remove a >= 0 or > -1 (for integers), we need to introduce a
1823 // NOT Operation
1824 if (CC == ISD::SETGE || CC == ISD::SETGT) {
1825 SDLoc DL(Op);
1826 EVT VT = Op0.getValueType();
1827 SDValue NotOp0 = TLO.DAG.getNOT(DL, Op0, VT);
1828 return TLO.CombineTo(Op, NotOp0);
1829 }
1830 return TLO.CombineTo(Op, Op0);
1831 }
1832 }
1833 if (getBooleanContents(Op0.getValueType()) ==
1835 BitWidth > 1)
1836 Known.Zero.setBitsFrom(1);
1837 break;
1838 }
1839 case ISD::SHL: {
1840 SDValue Op0 = Op.getOperand(0);
1841 SDValue Op1 = Op.getOperand(1);
1842 EVT ShiftVT = Op1.getValueType();
1843
1844 if (std::optional<unsigned> KnownSA =
1845 TLO.DAG.getValidShiftAmount(Op, DemandedElts, Depth + 1)) {
1846 unsigned ShAmt = *KnownSA;
1847 if (ShAmt == 0)
1848 return TLO.CombineTo(Op, Op0);
1849
1850 // If this is ((X >>u C1) << ShAmt), see if we can simplify this into a
1851 // single shift. We can do this if the bottom bits (which are shifted
1852 // out) are never demanded.
1853 // TODO - support non-uniform vector amounts.
1854 if (Op0.getOpcode() == ISD::SRL) {
1855 if (!DemandedBits.intersects(APInt::getLowBitsSet(BitWidth, ShAmt))) {
1856 if (std::optional<unsigned> InnerSA =
1857 TLO.DAG.getValidShiftAmount(Op0, DemandedElts, Depth + 2)) {
1858 unsigned C1 = *InnerSA;
1859 unsigned Opc = ISD::SHL;
1860 int Diff = ShAmt - C1;
1861 if (Diff < 0) {
1862 Diff = -Diff;
1863 Opc = ISD::SRL;
1864 }
1865 SDValue NewSA = TLO.DAG.getConstant(Diff, dl, ShiftVT);
1866 return TLO.CombineTo(
1867 Op, TLO.DAG.getNode(Opc, dl, VT, Op0.getOperand(0), NewSA));
1868 }
1869 }
1870 }
1871
1872 // Convert (shl (anyext x, c)) to (anyext (shl x, c)) if the high bits
1873 // are not demanded. This will likely allow the anyext to be folded away.
1874 // TODO - support non-uniform vector amounts.
1875 if (Op0.getOpcode() == ISD::ANY_EXTEND) {
1876 SDValue InnerOp = Op0.getOperand(0);
1877 EVT InnerVT = InnerOp.getValueType();
1878 unsigned InnerBits = InnerVT.getScalarSizeInBits();
1879 if (ShAmt < InnerBits && DemandedBits.getActiveBits() <= InnerBits &&
1880 isTypeDesirableForOp(ISD::SHL, InnerVT)) {
1881 SDValue NarrowShl = TLO.DAG.getNode(
1882 ISD::SHL, dl, InnerVT, InnerOp,
1883 TLO.DAG.getShiftAmountConstant(ShAmt, InnerVT, dl));
1884 return TLO.CombineTo(
1885 Op, TLO.DAG.getNode(ISD::ANY_EXTEND, dl, VT, NarrowShl));
1886 }
1887
1888 // Repeat the SHL optimization above in cases where an extension
1889 // intervenes: (shl (anyext (shr x, c1)), c2) to
1890 // (shl (anyext x), c2-c1). This requires that the bottom c1 bits
1891 // aren't demanded (as above) and that the shifted upper c1 bits of
1892 // x aren't demanded.
1893 // TODO - support non-uniform vector amounts.
1894 if (InnerOp.getOpcode() == ISD::SRL && Op0.hasOneUse() &&
1895 InnerOp.hasOneUse()) {
1896 if (std::optional<unsigned> SA2 = TLO.DAG.getValidShiftAmount(
1897 InnerOp, DemandedElts, Depth + 2)) {
1898 unsigned InnerShAmt = *SA2;
1899 if (InnerShAmt < ShAmt && InnerShAmt < InnerBits &&
1900 DemandedBits.getActiveBits() <=
1901 (InnerBits - InnerShAmt + ShAmt) &&
1902 DemandedBits.countr_zero() >= ShAmt) {
1903 SDValue NewSA =
1904 TLO.DAG.getConstant(ShAmt - InnerShAmt, dl, ShiftVT);
1905 SDValue NewExt = TLO.DAG.getNode(ISD::ANY_EXTEND, dl, VT,
1906 InnerOp.getOperand(0));
1907 return TLO.CombineTo(
1908 Op, TLO.DAG.getNode(ISD::SHL, dl, VT, NewExt, NewSA));
1909 }
1910 }
1911 }
1912 }
1913
1914 APInt InDemandedMask = DemandedBits.lshr(ShAmt);
1915 if (SimplifyDemandedBits(Op0, InDemandedMask, DemandedElts, Known, TLO,
1916 Depth + 1)) {
1917 // Disable the nsw and nuw flags. We can no longer guarantee that we
1918 // won't wrap after simplification.
1919 Op->dropFlags(SDNodeFlags::NoWrap);
1920 return true;
1921 }
1922 Known <<= ShAmt;
1923 // low bits known zero.
1924 Known.Zero.setLowBits(ShAmt);
1925
1926 // Attempt to avoid multi-use ops if we don't need anything from them.
1927 if (!InDemandedMask.isAllOnes() || !DemandedElts.isAllOnes()) {
1929 Op0, InDemandedMask, DemandedElts, TLO.DAG, Depth + 1);
1930 if (DemandedOp0) {
1931 SDValue NewOp = TLO.DAG.getNode(ISD::SHL, dl, VT, DemandedOp0, Op1);
1932 return TLO.CombineTo(Op, NewOp);
1933 }
1934 }
1935
1936 // TODO: Can we merge this fold with the one below?
1937 // Try shrinking the operation as long as the shift amount will still be
1938 // in range.
1939 if (ShAmt < DemandedBits.getActiveBits() && !VT.isVector() &&
1940 Op.getNode()->hasOneUse()) {
1941 // Search for the smallest integer type with free casts to and from
1942 // Op's type. For expedience, just check power-of-2 integer types.
1943 unsigned DemandedSize = DemandedBits.getActiveBits();
1944 for (unsigned SmallVTBits = llvm::bit_ceil(DemandedSize);
1945 SmallVTBits < BitWidth; SmallVTBits = NextPowerOf2(SmallVTBits)) {
1946 EVT SmallVT = EVT::getIntegerVT(*TLO.DAG.getContext(), SmallVTBits);
1947 if (isNarrowingProfitable(Op.getNode(), VT, SmallVT) &&
1948 isTypeDesirableForOp(ISD::SHL, SmallVT) &&
1949 isTruncateFree(VT, SmallVT) && isZExtFree(SmallVT, VT) &&
1950 (!TLO.LegalOperations() || isOperationLegal(ISD::SHL, SmallVT))) {
1951 assert(DemandedSize <= SmallVTBits &&
1952 "Narrowed below demanded bits?");
1953 // We found a type with free casts.
1954 SDValue NarrowShl = TLO.DAG.getNode(
1955 ISD::SHL, dl, SmallVT,
1956 TLO.DAG.getNode(ISD::TRUNCATE, dl, SmallVT, Op.getOperand(0)),
1957 TLO.DAG.getShiftAmountConstant(ShAmt, SmallVT, dl));
1958 return TLO.CombineTo(
1959 Op, TLO.DAG.getNode(ISD::ANY_EXTEND, dl, VT, NarrowShl));
1960 }
1961 }
1962 }
1963
1964 // Narrow shift to lower half - similar to ShrinkDemandedOp.
1965 // (shl i64:x, K) -> (i64 zero_extend (shl (i32 (trunc i64:x)), K))
1966 // Only do this if we demand the upper half so the knownbits are correct.
1967 unsigned HalfWidth = BitWidth / 2;
1968 if ((BitWidth % 2) == 0 && !VT.isVector() && ShAmt < HalfWidth &&
1969 DemandedBits.countLeadingOnes() >= HalfWidth) {
1970 EVT HalfVT = EVT::getIntegerVT(*TLO.DAG.getContext(), HalfWidth);
1971 if (isNarrowingProfitable(Op.getNode(), VT, HalfVT) &&
1972 isTypeDesirableForOp(ISD::SHL, HalfVT) &&
1973 isTruncateFree(VT, HalfVT) && isZExtFree(HalfVT, VT) &&
1974 (!TLO.LegalOperations() || isOperationLegal(ISD::SHL, HalfVT))) {
1975 // If we're demanding the upper bits at all, we must ensure
1976 // that the upper bits of the shift result are known to be zero,
1977 // which is equivalent to the narrow shift being NUW.
1978 if (bool IsNUW = (Known.countMinLeadingZeros() >= HalfWidth)) {
1979 bool IsNSW = Known.countMinSignBits() > HalfWidth;
1980 SDNodeFlags Flags;
1981 Flags.setNoSignedWrap(IsNSW);
1982 Flags.setNoUnsignedWrap(IsNUW);
1983 SDValue NewOp = TLO.DAG.getNode(ISD::TRUNCATE, dl, HalfVT, Op0);
1984 SDValue NewShiftAmt =
1985 TLO.DAG.getShiftAmountConstant(ShAmt, HalfVT, dl);
1986 SDValue NewShift = TLO.DAG.getNode(ISD::SHL, dl, HalfVT, NewOp,
1987 NewShiftAmt, Flags);
1988 SDValue NewExt =
1989 TLO.DAG.getNode(ISD::ZERO_EXTEND, dl, VT, NewShift);
1990 return TLO.CombineTo(Op, NewExt);
1991 }
1992 }
1993 }
1994 } else {
1995 // This is a variable shift, so we can't shift the demand mask by a known
1996 // amount. But if we are not demanding high bits, then we are not
1997 // demanding those bits from the pre-shifted operand either.
1998 if (unsigned CTLZ = DemandedBits.countl_zero()) {
1999 APInt DemandedFromOp(APInt::getLowBitsSet(BitWidth, BitWidth - CTLZ));
2000 if (SimplifyDemandedBits(Op0, DemandedFromOp, DemandedElts, Known, TLO,
2001 Depth + 1)) {
2002 // Disable the nsw and nuw flags. We can no longer guarantee that we
2003 // won't wrap after simplification.
2004 Op->dropFlags(SDNodeFlags::NoWrap);
2005 return true;
2006 }
2007 Known.resetAll();
2008 }
2009 }
2010
2011 // If we are only demanding sign bits then we can use the shift source
2012 // directly.
2013 if (std::optional<unsigned> MaxSA =
2014 TLO.DAG.getValidMaximumShiftAmount(Op, DemandedElts, Depth + 1)) {
2015 unsigned ShAmt = *MaxSA;
2016 unsigned NumSignBits =
2017 TLO.DAG.ComputeNumSignBits(Op0, DemandedElts, Depth + 1);
2018 unsigned UpperDemandedBits = BitWidth - DemandedBits.countr_zero();
2019 if (NumSignBits > ShAmt && (NumSignBits - ShAmt) >= (UpperDemandedBits))
2020 return TLO.CombineTo(Op, Op0);
2021 }
2022 break;
2023 }
2024 case ISD::SRL: {
2025 SDValue Op0 = Op.getOperand(0);
2026 SDValue Op1 = Op.getOperand(1);
2027 EVT ShiftVT = Op1.getValueType();
2028
2029 if (std::optional<unsigned> KnownSA =
2030 TLO.DAG.getValidShiftAmount(Op, DemandedElts, Depth + 1)) {
2031 unsigned ShAmt = *KnownSA;
2032 if (ShAmt == 0)
2033 return TLO.CombineTo(Op, Op0);
2034
2035 // If this is ((X << C1) >>u ShAmt), see if we can simplify this into a
2036 // single shift. We can do this if the top bits (which are shifted out)
2037 // are never demanded.
2038 // TODO - support non-uniform vector amounts.
2039 if (Op0.getOpcode() == ISD::SHL) {
2040 if (!DemandedBits.intersects(APInt::getHighBitsSet(BitWidth, ShAmt))) {
2041 if (std::optional<unsigned> InnerSA =
2042 TLO.DAG.getValidShiftAmount(Op0, DemandedElts, Depth + 2)) {
2043 unsigned C1 = *InnerSA;
2044 unsigned Opc = ISD::SRL;
2045 int Diff = ShAmt - C1;
2046 if (Diff < 0) {
2047 Diff = -Diff;
2048 Opc = ISD::SHL;
2049 }
2050 SDValue NewSA = TLO.DAG.getConstant(Diff, dl, ShiftVT);
2051 return TLO.CombineTo(
2052 Op, TLO.DAG.getNode(Opc, dl, VT, Op0.getOperand(0), NewSA));
2053 }
2054 }
2055 }
2056
2057 // If this is (srl (sra X, C1), ShAmt), see if we can combine this into a
2058 // single sra. We can do this if the top bits are never demanded.
2059 if (Op0.getOpcode() == ISD::SRA && Op0.hasOneUse()) {
2060 if (!DemandedBits.intersects(APInt::getHighBitsSet(BitWidth, ShAmt))) {
2061 if (std::optional<unsigned> InnerSA =
2062 TLO.DAG.getValidShiftAmount(Op0, DemandedElts, Depth + 2)) {
2063 unsigned C1 = *InnerSA;
2064 // Clamp the combined shift amount if it exceeds the bit width.
2065 unsigned Combined = std::min(C1 + ShAmt, BitWidth - 1);
2066 SDValue NewSA = TLO.DAG.getConstant(Combined, dl, ShiftVT);
2067 return TLO.CombineTo(Op, TLO.DAG.getNode(ISD::SRA, dl, VT,
2068 Op0.getOperand(0), NewSA));
2069 }
2070 }
2071 }
2072
2073 APInt InDemandedMask = (DemandedBits << ShAmt);
2074
2075 // If the shift is exact, then it does demand the low bits (and knows that
2076 // they are zero).
2077 if (Op->getFlags().hasExact())
2078 InDemandedMask.setLowBits(ShAmt);
2079
2080 // Narrow shift to lower half - similar to ShrinkDemandedOp.
2081 // (srl i64:x, K) -> (i64 zero_extend (srl (i32 (trunc i64:x)), K))
2082 if ((BitWidth % 2) == 0 && !VT.isVector()) {
2084 EVT HalfVT = EVT::getIntegerVT(*TLO.DAG.getContext(), BitWidth / 2);
2085 if (isNarrowingProfitable(Op.getNode(), VT, HalfVT) &&
2086 isTypeDesirableForOp(ISD::SRL, HalfVT) &&
2087 isTruncateFree(VT, HalfVT) && isZExtFree(HalfVT, VT) &&
2088 (!TLO.LegalOperations() || isOperationLegal(ISD::SRL, HalfVT)) &&
2089 ((InDemandedMask.countLeadingZeros() >= (BitWidth / 2)) ||
2090 TLO.DAG.MaskedValueIsZero(Op0, HiBits))) {
2091 SDValue NewOp = TLO.DAG.getNode(ISD::TRUNCATE, dl, HalfVT, Op0);
2092 SDValue NewShiftAmt =
2093 TLO.DAG.getShiftAmountConstant(ShAmt, HalfVT, dl);
2094 SDValue NewShift =
2095 TLO.DAG.getNode(ISD::SRL, dl, HalfVT, NewOp, NewShiftAmt);
2096 return TLO.CombineTo(
2097 Op, TLO.DAG.getNode(ISD::ZERO_EXTEND, dl, VT, NewShift));
2098 }
2099 }
2100
2101 // Compute the new bits that are at the top now.
2102 if (SimplifyDemandedBits(Op0, InDemandedMask, DemandedElts, Known, TLO,
2103 Depth + 1))
2104 return true;
2105 Known >>= ShAmt;
2106 // High bits known zero.
2107 Known.Zero.setHighBits(ShAmt);
2108
2109 // Attempt to avoid multi-use ops if we don't need anything from them.
2110 if (!InDemandedMask.isAllOnes() || !DemandedElts.isAllOnes()) {
2112 Op0, InDemandedMask, DemandedElts, TLO.DAG, Depth + 1);
2113 if (DemandedOp0) {
2114 SDValue NewOp = TLO.DAG.getNode(ISD::SRL, dl, VT, DemandedOp0, Op1);
2115 return TLO.CombineTo(Op, NewOp);
2116 }
2117 }
2118 } else {
2119 // Use generic knownbits computation as it has support for non-uniform
2120 // shift amounts.
2121 Known = TLO.DAG.computeKnownBits(Op, DemandedElts, Depth);
2122 }
2123
2124 // If we are only demanding sign bits then we can use the shift source
2125 // directly.
2126 if (std::optional<unsigned> MaxSA =
2127 TLO.DAG.getValidMaximumShiftAmount(Op, DemandedElts, Depth + 1)) {
2128 unsigned ShAmt = *MaxSA;
2129 // Must already be signbits in DemandedBits bounds, and can't demand any
2130 // shifted in zeroes.
2131 if (DemandedBits.countl_zero() >= ShAmt) {
2132 unsigned NumSignBits =
2133 TLO.DAG.ComputeNumSignBits(Op0, DemandedElts, Depth + 1);
2134 if (DemandedBits.countr_zero() >= (BitWidth - NumSignBits))
2135 return TLO.CombineTo(Op, Op0);
2136 }
2137 }
2138
2139 // Try to match AVG patterns (after shift simplification).
2140 if (SDValue AVG = combineShiftToAVG(Op, TLO, *this, DemandedBits,
2141 DemandedElts, Depth + 1))
2142 return TLO.CombineTo(Op, AVG);
2143
2144 break;
2145 }
2146 case ISD::SRA: {
2147 SDValue Op0 = Op.getOperand(0);
2148 SDValue Op1 = Op.getOperand(1);
2149 EVT ShiftVT = Op1.getValueType();
2150
2151 // If we only want bits that already match the signbit then we don't need
2152 // to shift.
2153 unsigned NumHiDemandedBits = BitWidth - DemandedBits.countr_zero();
2154 if (TLO.DAG.ComputeNumSignBits(Op0, DemandedElts, Depth + 1) >=
2155 NumHiDemandedBits)
2156 return TLO.CombineTo(Op, Op0);
2157
2158 // If this is an arithmetic shift right and only the low-bit is set, we can
2159 // always convert this into a logical shr, even if the shift amount is
2160 // variable. The low bit of the shift cannot be an input sign bit unless
2161 // the shift amount is >= the size of the datatype, which is undefined.
2162 if (DemandedBits.isOne())
2163 return TLO.CombineTo(Op, TLO.DAG.getNode(ISD::SRL, dl, VT, Op0, Op1));
2164
2165 if (std::optional<unsigned> KnownSA =
2166 TLO.DAG.getValidShiftAmount(Op, DemandedElts, Depth + 1)) {
2167 unsigned ShAmt = *KnownSA;
2168 if (ShAmt == 0)
2169 return TLO.CombineTo(Op, Op0);
2170
2171 // fold (sra (shl x, c1), c1) -> sext_inreg for some c1 and target
2172 // supports sext_inreg.
2173 if (Op0.getOpcode() == ISD::SHL) {
2174 if (std::optional<unsigned> InnerSA =
2175 TLO.DAG.getValidShiftAmount(Op0, DemandedElts, Depth + 2)) {
2176 unsigned LowBits = BitWidth - ShAmt;
2177 EVT ExtVT = VT.changeElementType(
2178 *TLO.DAG.getContext(),
2179 EVT::getIntegerVT(*TLO.DAG.getContext(), LowBits));
2180
2181 if (*InnerSA == ShAmt) {
2182 if (!TLO.LegalOperations() ||
2184 return TLO.CombineTo(
2185 Op, TLO.DAG.getNode(ISD::SIGN_EXTEND_INREG, dl, VT,
2186 Op0.getOperand(0),
2187 TLO.DAG.getValueType(ExtVT)));
2188
2189 // Even if we can't convert to sext_inreg, we might be able to
2190 // remove this shift pair if the input is already sign extended.
2191 unsigned NumSignBits =
2192 TLO.DAG.ComputeNumSignBits(Op0.getOperand(0), DemandedElts);
2193 if (NumSignBits > ShAmt)
2194 return TLO.CombineTo(Op, Op0.getOperand(0));
2195 }
2196 }
2197 }
2198
2199 APInt InDemandedMask = (DemandedBits << ShAmt);
2200
2201 // If the shift is exact, then it does demand the low bits (and knows that
2202 // they are zero).
2203 if (Op->getFlags().hasExact())
2204 InDemandedMask.setLowBits(ShAmt);
2205
2206 // If any of the demanded bits are produced by the sign extension, we also
2207 // demand the input sign bit.
2208 if (DemandedBits.countl_zero() < ShAmt)
2209 InDemandedMask.setSignBit();
2210
2211 if (SimplifyDemandedBits(Op0, InDemandedMask, DemandedElts, Known, TLO,
2212 Depth + 1))
2213 return true;
2214 Known >>= ShAmt;
2215
2216 // If the input sign bit is known to be zero, or if none of the top bits
2217 // are demanded, turn this into an unsigned shift right.
2218 if (Known.Zero[BitWidth - ShAmt - 1] ||
2219 DemandedBits.countl_zero() >= ShAmt) {
2220 SDNodeFlags Flags;
2221 Flags.setExact(Op->getFlags().hasExact());
2222 return TLO.CombineTo(
2223 Op, TLO.DAG.getNode(ISD::SRL, dl, VT, Op0, Op1, Flags));
2224 }
2225
2226 int Log2 = DemandedBits.exactLogBase2();
2227 if (Log2 >= 0) {
2228 // The bit must come from the sign.
2229 SDValue NewSA = TLO.DAG.getConstant(BitWidth - 1 - Log2, dl, ShiftVT);
2230 return TLO.CombineTo(Op, TLO.DAG.getNode(ISD::SRL, dl, VT, Op0, NewSA));
2231 }
2232
2233 if (Known.One[BitWidth - ShAmt - 1])
2234 // New bits are known one.
2235 Known.One.setHighBits(ShAmt);
2236
2237 // Attempt to avoid multi-use ops if we don't need anything from them.
2238 if (!InDemandedMask.isAllOnes() || !DemandedElts.isAllOnes()) {
2240 Op0, InDemandedMask, DemandedElts, TLO.DAG, Depth + 1);
2241 if (DemandedOp0) {
2242 SDValue NewOp = TLO.DAG.getNode(ISD::SRA, dl, VT, DemandedOp0, Op1);
2243 return TLO.CombineTo(Op, NewOp);
2244 }
2245 }
2246 }
2247
2248 // Try to match AVG patterns (after shift simplification).
2249 if (SDValue AVG = combineShiftToAVG(Op, TLO, *this, DemandedBits,
2250 DemandedElts, Depth + 1))
2251 return TLO.CombineTo(Op, AVG);
2252
2253 break;
2254 }
2255 case ISD::FSHL:
2256 case ISD::FSHR: {
2257 SDValue Op0 = Op.getOperand(0);
2258 SDValue Op1 = Op.getOperand(1);
2259 SDValue Op2 = Op.getOperand(2);
2260 bool IsFSHL = (Op.getOpcode() == ISD::FSHL);
2261
2262 if (ConstantSDNode *SA = isConstOrConstSplat(Op2, DemandedElts)) {
2263 unsigned Amt = SA->getAPIntValue().urem(BitWidth);
2264
2265 // For fshl, 0-shift returns the 1st arg.
2266 // For fshr, 0-shift returns the 2nd arg.
2267 if (Amt == 0) {
2268 if (SimplifyDemandedBits(IsFSHL ? Op0 : Op1, DemandedBits, DemandedElts,
2269 Known, TLO, Depth + 1))
2270 return true;
2271 break;
2272 }
2273
2274 // fshl: (Op0 << Amt) | (Op1 >> (BW - Amt))
2275 // fshr: (Op0 << (BW - Amt)) | (Op1 >> Amt)
2276 APInt Demanded0 = DemandedBits.lshr(IsFSHL ? Amt : (BitWidth - Amt));
2277 APInt Demanded1 = DemandedBits << (IsFSHL ? (BitWidth - Amt) : Amt);
2278 if (SimplifyDemandedBits(Op0, Demanded0, DemandedElts, Known2, TLO,
2279 Depth + 1))
2280 return true;
2281 if (SimplifyDemandedBits(Op1, Demanded1, DemandedElts, Known, TLO,
2282 Depth + 1))
2283 return true;
2284
2285 Known2 <<= (IsFSHL ? Amt : (BitWidth - Amt));
2286 Known >>= (IsFSHL ? (BitWidth - Amt) : Amt);
2287 Known = Known.unionWith(Known2);
2288
2289 // Attempt to avoid multi-use ops if we don't need anything from them.
2290 if (!Demanded0.isAllOnes() || !Demanded1.isAllOnes() ||
2291 !DemandedElts.isAllOnes()) {
2293 Op0, Demanded0, DemandedElts, TLO.DAG, Depth + 1);
2295 Op1, Demanded1, DemandedElts, TLO.DAG, Depth + 1);
2296 if (DemandedOp0 || DemandedOp1) {
2297 DemandedOp0 = DemandedOp0 ? DemandedOp0 : Op0;
2298 DemandedOp1 = DemandedOp1 ? DemandedOp1 : Op1;
2299 SDValue NewOp = TLO.DAG.getNode(Op.getOpcode(), dl, VT, DemandedOp0,
2300 DemandedOp1, Op2);
2301 return TLO.CombineTo(Op, NewOp);
2302 }
2303 }
2304 }
2305
2306 if (isPowerOf2_32(BitWidth)) {
2307 // Fold FSHR(Op0,Op1,Op2) -> SRL(Op1,Op2)
2308 // iff we're guaranteed not to use Op0.
2309 // TODO: Add FSHL equivalent?
2310 if (!IsFSHL && !DemandedBits.isAllOnes() &&
2311 (!TLO.LegalOperations() || isOperationLegal(ISD::SRL, VT))) {
2312 KnownBits KnownAmt =
2313 TLO.DAG.computeKnownBits(Op2, DemandedElts, Depth + 1);
2314 unsigned MaxShiftAmt =
2315 KnownAmt.getMaxValue().getLimitedValue(BitWidth - 1);
2316 // Check we don't demand any shifted bits outside Op1.
2317 if (DemandedBits.countl_zero() >= MaxShiftAmt) {
2318 EVT AmtVT = Op2.getValueType();
2319 SDValue NewAmt =
2320 TLO.DAG.getNode(ISD::AND, dl, AmtVT, Op2,
2321 TLO.DAG.getConstant(BitWidth - 1, dl, AmtVT));
2322 SDValue NewOp = TLO.DAG.getNode(ISD::SRL, dl, VT, Op1, NewAmt);
2323 return TLO.CombineTo(Op, NewOp);
2324 }
2325 }
2326
2327 // For pow-2 bitwidths we only demand the bottom modulo amt bits.
2328 APInt DemandedAmtBits(Op2.getScalarValueSizeInBits(), BitWidth - 1);
2329 if (SimplifyDemandedBits(Op2, DemandedAmtBits, DemandedElts, Known2, TLO,
2330 Depth + 1))
2331 return true;
2332 }
2333 break;
2334 }
2335 case ISD::ROTL:
2336 case ISD::ROTR: {
2337 SDValue Op0 = Op.getOperand(0);
2338 SDValue Op1 = Op.getOperand(1);
2339 bool IsROTL = (Op.getOpcode() == ISD::ROTL);
2340
2341 // If we're rotating an 0/-1 value, then it stays an 0/-1 value.
2342 if (BitWidth == TLO.DAG.ComputeNumSignBits(Op0, DemandedElts, Depth + 1))
2343 return TLO.CombineTo(Op, Op0);
2344
2345 if (ConstantSDNode *SA = isConstOrConstSplat(Op1, DemandedElts)) {
2346 unsigned Amt = SA->getAPIntValue().urem(BitWidth);
2347 unsigned RevAmt = BitWidth - Amt;
2348
2349 // rotl: (Op0 << Amt) | (Op0 >> (BW - Amt))
2350 // rotr: (Op0 << (BW - Amt)) | (Op0 >> Amt)
2351 APInt Demanded0 = DemandedBits.rotr(IsROTL ? Amt : RevAmt);
2352 if (SimplifyDemandedBits(Op0, Demanded0, DemandedElts, Known2, TLO,
2353 Depth + 1))
2354 return true;
2355
2356 // rot*(x, 0) --> x
2357 if (Amt == 0)
2358 return TLO.CombineTo(Op, Op0);
2359
2360 // See if we don't demand either half of the rotated bits.
2361 if ((!TLO.LegalOperations() || isOperationLegal(ISD::SHL, VT)) &&
2362 DemandedBits.countr_zero() >= (IsROTL ? Amt : RevAmt)) {
2363 Op1 = TLO.DAG.getConstant(IsROTL ? Amt : RevAmt, dl, Op1.getValueType());
2364 return TLO.CombineTo(Op, TLO.DAG.getNode(ISD::SHL, dl, VT, Op0, Op1));
2365 }
2366 if ((!TLO.LegalOperations() || isOperationLegal(ISD::SRL, VT)) &&
2367 DemandedBits.countl_zero() >= (IsROTL ? RevAmt : Amt)) {
2368 Op1 = TLO.DAG.getConstant(IsROTL ? RevAmt : Amt, dl, Op1.getValueType());
2369 return TLO.CombineTo(Op, TLO.DAG.getNode(ISD::SRL, dl, VT, Op0, Op1));
2370 }
2371 }
2372
2373 // For pow-2 bitwidths we only demand the bottom modulo amt bits.
2374 if (isPowerOf2_32(BitWidth)) {
2375 APInt DemandedAmtBits(Op1.getScalarValueSizeInBits(), BitWidth - 1);
2376 if (SimplifyDemandedBits(Op1, DemandedAmtBits, DemandedElts, Known2, TLO,
2377 Depth + 1))
2378 return true;
2379 }
2380 break;
2381 }
2382 case ISD::SMIN:
2383 case ISD::SMAX:
2384 case ISD::UMIN:
2385 case ISD::UMAX: {
2386 unsigned Opc = Op.getOpcode();
2387 SDValue Op0 = Op.getOperand(0);
2388 SDValue Op1 = Op.getOperand(1);
2389
2390 // If we're only demanding signbits, then we can simplify to OR/AND node.
2391 unsigned BitOp =
2392 (Opc == ISD::SMIN || Opc == ISD::UMAX) ? ISD::OR : ISD::AND;
2393 unsigned NumSignBits =
2394 std::min(TLO.DAG.ComputeNumSignBits(Op0, DemandedElts, Depth + 1),
2395 TLO.DAG.ComputeNumSignBits(Op1, DemandedElts, Depth + 1));
2396 unsigned NumDemandedUpperBits = BitWidth - DemandedBits.countr_zero();
2397 if (NumSignBits >= NumDemandedUpperBits)
2398 return TLO.CombineTo(Op, TLO.DAG.getNode(BitOp, SDLoc(Op), VT, Op0, Op1));
2399
2400 // Check if one arg is always less/greater than (or equal) to the other arg.
2401 KnownBits Known0 = TLO.DAG.computeKnownBits(Op0, DemandedElts, Depth + 1);
2402 KnownBits Known1 = TLO.DAG.computeKnownBits(Op1, DemandedElts, Depth + 1);
2403 switch (Opc) {
2404 case ISD::SMIN:
2405 if (std::optional<bool> IsSLE = KnownBits::sle(Known0, Known1))
2406 return TLO.CombineTo(Op, *IsSLE ? Op0 : Op1);
2407 if (std::optional<bool> IsSLT = KnownBits::slt(Known0, Known1))
2408 return TLO.CombineTo(Op, *IsSLT ? Op0 : Op1);
2409 Known = KnownBits::smin(Known0, Known1);
2410 break;
2411 case ISD::SMAX:
2412 if (std::optional<bool> IsSGE = KnownBits::sge(Known0, Known1))
2413 return TLO.CombineTo(Op, *IsSGE ? Op0 : Op1);
2414 if (std::optional<bool> IsSGT = KnownBits::sgt(Known0, Known1))
2415 return TLO.CombineTo(Op, *IsSGT ? Op0 : Op1);
2416 Known = KnownBits::smax(Known0, Known1);
2417 break;
2418 case ISD::UMIN:
2419 if (std::optional<bool> IsULE = KnownBits::ule(Known0, Known1))
2420 return TLO.CombineTo(Op, *IsULE ? Op0 : Op1);
2421 if (std::optional<bool> IsULT = KnownBits::ult(Known0, Known1))
2422 return TLO.CombineTo(Op, *IsULT ? Op0 : Op1);
2423 Known = KnownBits::umin(Known0, Known1);
2424 break;
2425 case ISD::UMAX:
2426 if (std::optional<bool> IsUGE = KnownBits::uge(Known0, Known1))
2427 return TLO.CombineTo(Op, *IsUGE ? Op0 : Op1);
2428 if (std::optional<bool> IsUGT = KnownBits::ugt(Known0, Known1))
2429 return TLO.CombineTo(Op, *IsUGT ? Op0 : Op1);
2430 Known = KnownBits::umax(Known0, Known1);
2431 break;
2432 }
2433 break;
2434 }
2435 case ISD::BITREVERSE: {
2436 SDValue Src = Op.getOperand(0);
2437 APInt DemandedSrcBits = DemandedBits.reverseBits();
2438 if (SimplifyDemandedBits(Src, DemandedSrcBits, DemandedElts, Known2, TLO,
2439 Depth + 1))
2440 return true;
2441 Known = Known2.reverseBits();
2442 break;
2443 }
2444 case ISD::BSWAP: {
2445 SDValue Src = Op.getOperand(0);
2446
2447 // If the only bits demanded come from one byte of the bswap result,
2448 // just shift the input byte into position to eliminate the bswap.
2449 unsigned NLZ = DemandedBits.countl_zero();
2450 unsigned NTZ = DemandedBits.countr_zero();
2451
2452 // Round NTZ down to the next byte. If we have 11 trailing zeros, then
2453 // we need all the bits down to bit 8. Likewise, round NLZ. If we
2454 // have 14 leading zeros, round to 8.
2455 NLZ = alignDown(NLZ, 8);
2456 NTZ = alignDown(NTZ, 8);
2457 // If we need exactly one byte, we can do this transformation.
2458 if (BitWidth - NLZ - NTZ == 8) {
2459 // Replace this with either a left or right shift to get the byte into
2460 // the right place.
2461 unsigned ShiftOpcode = NLZ > NTZ ? ISD::SRL : ISD::SHL;
2462 if (!TLO.LegalOperations() || isOperationLegal(ShiftOpcode, VT)) {
2463 unsigned ShiftAmount = NLZ > NTZ ? NLZ - NTZ : NTZ - NLZ;
2464 SDValue ShAmt = TLO.DAG.getShiftAmountConstant(ShiftAmount, VT, dl);
2465 SDValue NewOp = TLO.DAG.getNode(ShiftOpcode, dl, VT, Src, ShAmt);
2466 return TLO.CombineTo(Op, NewOp);
2467 }
2468 }
2469
2470 APInt DemandedSrcBits = DemandedBits.byteSwap();
2471 if (SimplifyDemandedBits(Src, DemandedSrcBits, DemandedElts, Known2, TLO,
2472 Depth + 1))
2473 return true;
2474 Known = Known2.byteSwap();
2475 break;
2476 }
2477 case ISD::CTPOP: {
2478 // If only 1 bit is demanded, replace with PARITY as long as we're before
2479 // op legalization.
2480 // FIXME: Limit to scalars for now.
2481 if (DemandedBits.isOne() && !TLO.LegalOps && !VT.isVector())
2482 return TLO.CombineTo(Op, TLO.DAG.getNode(ISD::PARITY, dl, VT,
2483 Op.getOperand(0)));
2484
2485 Known = TLO.DAG.computeKnownBits(Op, DemandedElts, Depth);
2486 break;
2487 }
2488 case ISD::PDEP: {
2489 SDValue Op0 = Op.getOperand(0);
2490 SDValue Op1 = Op.getOperand(1);
2491
2492 unsigned DemandedBitsLZ = DemandedBits.countl_zero();
2493 APInt LoMask = APInt::getLowBitsSet(BitWidth, BitWidth - DemandedBitsLZ);
2494
2495 // If the demanded bits has leading zeroes, we don't demand those from the
2496 // mask.
2497 if (SimplifyDemandedBits(Op1, LoMask, Known, TLO, Depth + 1))
2498 return true;
2499
2500 // The number of possible 1s in the mask determines the number of LSBs of
2501 // operand 0 used. Undemanded bits from the mask don't matter so filter
2502 // them before counting.
2503 KnownBits Known2;
2504 uint64_t Count = (~Known.Zero & LoMask).popcount();
2505 APInt DemandedMask(APInt::getLowBitsSet(BitWidth, Count));
2506 if (SimplifyDemandedBits(Op0, DemandedMask, Known2, TLO, Depth + 1))
2507 return true;
2508
2509 // Zeroes are retained from the mask, but not ones.
2510 Known.One.clearAllBits();
2511 // The result will have at least as many trailing zeros as the non-mask
2512 // operand since bits can only map to the same or higher bit position.
2513 Known.Zero.setLowBits(Known2.countMinTrailingZeros());
2514 break;
2515 }
2517 SDValue Op0 = Op.getOperand(0);
2518 EVT ExVT = cast<VTSDNode>(Op.getOperand(1))->getVT();
2519 unsigned ExVTBits = ExVT.getScalarSizeInBits();
2520
2521 // If we only care about the highest bit, don't bother shifting right.
2522 if (DemandedBits.isSignMask()) {
2523 unsigned MinSignedBits =
2524 TLO.DAG.ComputeMaxSignificantBits(Op0, DemandedElts, Depth + 1);
2525 bool AlreadySignExtended = ExVTBits >= MinSignedBits;
2526 // However if the input is already sign extended we expect the sign
2527 // extension to be dropped altogether later and do not simplify.
2528 if (!AlreadySignExtended) {
2529 // Compute the correct shift amount type, which must be getShiftAmountTy
2530 // for scalar types after legalization.
2531 SDValue ShiftAmt =
2532 TLO.DAG.getShiftAmountConstant(BitWidth - ExVTBits, VT, dl);
2533 return TLO.CombineTo(Op,
2534 TLO.DAG.getNode(ISD::SHL, dl, VT, Op0, ShiftAmt));
2535 }
2536 }
2537
2538 // If none of the extended bits are demanded, eliminate the sextinreg.
2539 if (DemandedBits.getActiveBits() <= ExVTBits)
2540 return TLO.CombineTo(Op, Op0);
2541
2542 APInt InputDemandedBits = DemandedBits.getLoBits(ExVTBits);
2543
2544 // Since the sign extended bits are demanded, we know that the sign
2545 // bit is demanded.
2546 InputDemandedBits.setBit(ExVTBits - 1);
2547
2548 if (SimplifyDemandedBits(Op0, InputDemandedBits, DemandedElts, Known, TLO,
2549 Depth + 1))
2550 return true;
2551
2552 // If the sign bit of the input is known set or clear, then we know the
2553 // top bits of the result.
2554
2555 // If the input sign bit is known zero, convert this into a zero extension.
2556 if (Known.Zero[ExVTBits - 1])
2557 return TLO.CombineTo(Op, TLO.DAG.getZeroExtendInReg(Op0, dl, ExVT));
2558
2559 APInt Mask = APInt::getLowBitsSet(BitWidth, ExVTBits);
2560 if (Known.One[ExVTBits - 1]) { // Input sign bit known set
2561 Known.One.setBitsFrom(ExVTBits);
2562 Known.Zero &= Mask;
2563 } else { // Input sign bit unknown
2564 Known.Zero &= Mask;
2565 Known.One &= Mask;
2566 }
2567 break;
2568 }
2569 case ISD::BUILD_PAIR: {
2570 EVT HalfVT = Op.getOperand(0).getValueType();
2571 unsigned HalfBitWidth = HalfVT.getScalarSizeInBits();
2572
2573 APInt MaskLo = DemandedBits.getLoBits(HalfBitWidth).trunc(HalfBitWidth);
2574 APInt MaskHi = DemandedBits.getHiBits(HalfBitWidth).trunc(HalfBitWidth);
2575
2576 KnownBits KnownLo, KnownHi;
2577
2578 if (SimplifyDemandedBits(Op.getOperand(0), MaskLo, KnownLo, TLO, Depth + 1))
2579 return true;
2580
2581 if (SimplifyDemandedBits(Op.getOperand(1), MaskHi, KnownHi, TLO, Depth + 1))
2582 return true;
2583
2584 Known = KnownHi.concat(KnownLo);
2585 break;
2586 }
2588 if (VT.isScalableVector())
2589 return false;
2590 [[fallthrough]];
2591 case ISD::ZERO_EXTEND: {
2592 SDValue Src = Op.getOperand(0);
2593 EVT SrcVT = Src.getValueType();
2594 unsigned InBits = SrcVT.getScalarSizeInBits();
2595 unsigned InElts = SrcVT.isFixedLengthVector() ? SrcVT.getVectorNumElements() : 1;
2596 bool IsVecInReg = Op.getOpcode() == ISD::ZERO_EXTEND_VECTOR_INREG;
2597
2598 // If none of the top bits are demanded, convert this into an any_extend.
2599 if (DemandedBits.getActiveBits() <= InBits) {
2600 // If we only need the non-extended bits of the bottom element
2601 // then we can just bitcast to the result.
2602 if (IsLE && IsVecInReg && DemandedElts == 1 &&
2603 VT.getSizeInBits() == SrcVT.getSizeInBits())
2604 return TLO.CombineTo(Op, TLO.DAG.getBitcast(VT, Src));
2605
2606 unsigned Opc =
2608 if (!TLO.LegalOperations() || isOperationLegal(Opc, VT))
2609 return TLO.CombineTo(Op, TLO.DAG.getNode(Opc, dl, VT, Src));
2610 }
2611
2612 APInt InDemandedBits = DemandedBits.trunc(InBits);
2613 APInt InDemandedElts = DemandedElts.zext(InElts);
2614 if (SimplifyDemandedBits(Src, InDemandedBits, InDemandedElts, Known, TLO,
2615 Depth + 1)) {
2616 Op->dropFlags(SDNodeFlags::NonNeg);
2617 return true;
2618 }
2619 assert(Known.getBitWidth() == InBits && "Src width has changed?");
2620 Known = Known.zext(BitWidth);
2621
2622 // Attempt to avoid multi-use ops if we don't need anything from them.
2624 Src, InDemandedBits, InDemandedElts, TLO.DAG, Depth + 1))
2625 return TLO.CombineTo(Op, TLO.DAG.getNode(Op.getOpcode(), dl, VT, NewSrc));
2626 break;
2627 }
2629 if (VT.isScalableVector())
2630 return false;
2631 [[fallthrough]];
2632 case ISD::SIGN_EXTEND: {
2633 SDValue Src = Op.getOperand(0);
2634 EVT SrcVT = Src.getValueType();
2635 unsigned InBits = SrcVT.getScalarSizeInBits();
2636 unsigned InElts = SrcVT.isFixedLengthVector() ? SrcVT.getVectorNumElements() : 1;
2637 bool IsVecInReg = Op.getOpcode() == ISD::SIGN_EXTEND_VECTOR_INREG;
2638
2639 APInt InDemandedElts = DemandedElts.zext(InElts);
2640 APInt InDemandedBits = DemandedBits.trunc(InBits);
2641
2642 // Since some of the sign extended bits are demanded, we know that the sign
2643 // bit is demanded.
2644 InDemandedBits.setBit(InBits - 1);
2645
2646 // If none of the top bits are demanded, convert this into an any_extend.
2647 if (DemandedBits.getActiveBits() <= InBits) {
2648 // If we only need the non-extended bits of the bottom element
2649 // then we can just bitcast to the result.
2650 if (IsLE && IsVecInReg && DemandedElts == 1 &&
2651 VT.getSizeInBits() == SrcVT.getSizeInBits())
2652 return TLO.CombineTo(Op, TLO.DAG.getBitcast(VT, Src));
2653
2654 // Don't lose an all signbits 0/-1 splat on targets with 0/-1 booleans.
2656 TLO.DAG.ComputeNumSignBits(Src, InDemandedElts, Depth + 1) !=
2657 InBits) {
2658 unsigned Opc =
2660 if (!TLO.LegalOperations() || isOperationLegal(Opc, VT))
2661 return TLO.CombineTo(Op, TLO.DAG.getNode(Opc, dl, VT, Src));
2662 }
2663 }
2664
2665 if (SimplifyDemandedBits(Src, InDemandedBits, InDemandedElts, Known, TLO,
2666 Depth + 1))
2667 return true;
2668 assert(Known.getBitWidth() == InBits && "Src width has changed?");
2669
2670 // If the sign bit is known one, the top bits match.
2671 Known = Known.sext(BitWidth);
2672
2673 // If the sign bit is known zero, convert this to a zero extend.
2674 if (Known.isNonNegative()) {
2675 unsigned Opc =
2677 if (!TLO.LegalOperations() || isOperationLegal(Opc, VT)) {
2678 SDNodeFlags Flags;
2679 if (!IsVecInReg)
2680 Flags |= SDNodeFlags::NonNeg;
2681 return TLO.CombineTo(Op, TLO.DAG.getNode(Opc, dl, VT, Src, Flags));
2682 }
2683 }
2684
2685 // Attempt to avoid multi-use ops if we don't need anything from them.
2687 Src, InDemandedBits, InDemandedElts, TLO.DAG, Depth + 1))
2688 return TLO.CombineTo(Op, TLO.DAG.getNode(Op.getOpcode(), dl, VT, NewSrc));
2689 break;
2690 }
2692 if (VT.isScalableVector())
2693 return false;
2694 [[fallthrough]];
2695 case ISD::ANY_EXTEND: {
2696 SDValue Src = Op.getOperand(0);
2697 EVT SrcVT = Src.getValueType();
2698 unsigned InBits = SrcVT.getScalarSizeInBits();
2699 unsigned InElts = SrcVT.isFixedLengthVector() ? SrcVT.getVectorNumElements() : 1;
2700 bool IsVecInReg = Op.getOpcode() == ISD::ANY_EXTEND_VECTOR_INREG;
2701
2702 // If we only need the bottom element then we can just bitcast.
2703 // TODO: Handle ANY_EXTEND?
2704 if (IsLE && IsVecInReg && DemandedElts == 1 &&
2705 VT.getSizeInBits() == SrcVT.getSizeInBits())
2706 return TLO.CombineTo(Op, TLO.DAG.getBitcast(VT, Src));
2707
2708 APInt InDemandedBits = DemandedBits.trunc(InBits);
2709 APInt InDemandedElts = DemandedElts.zext(InElts);
2710 if (SimplifyDemandedBits(Src, InDemandedBits, InDemandedElts, Known, TLO,
2711 Depth + 1))
2712 return true;
2713 assert(Known.getBitWidth() == InBits && "Src width has changed?");
2714 Known = Known.anyext(BitWidth);
2715
2716 // Attempt to avoid multi-use ops if we don't need anything from them.
2718 Src, InDemandedBits, InDemandedElts, TLO.DAG, Depth + 1))
2719 return TLO.CombineTo(Op, TLO.DAG.getNode(Op.getOpcode(), dl, VT, NewSrc));
2720 break;
2721 }
2722 case ISD::TRUNCATE: {
2723 SDValue Src = Op.getOperand(0);
2724
2725 // Simplify the input, using demanded bit information, and compute the known
2726 // zero/one bits live out.
2727 unsigned OperandBitWidth = Src.getScalarValueSizeInBits();
2728 APInt TruncMask = DemandedBits.zext(OperandBitWidth);
2729 if (SimplifyDemandedBits(Src, TruncMask, DemandedElts, Known, TLO,
2730 Depth + 1)) {
2731 // Disable the nsw and nuw flags. We can no longer guarantee that we
2732 // won't wrap after simplification.
2733 Op->dropFlags(SDNodeFlags::NoWrap);
2734 return true;
2735 }
2736 Known = Known.trunc(BitWidth);
2737
2738 // Attempt to avoid multi-use ops if we don't need anything from them.
2740 Src, TruncMask, DemandedElts, TLO.DAG, Depth + 1))
2741 return TLO.CombineTo(Op, TLO.DAG.getNode(ISD::TRUNCATE, dl, VT, NewSrc));
2742
2743 // If the input is only used by this truncate, see if we can shrink it based
2744 // on the known demanded bits.
2745 switch (Src.getOpcode()) {
2746 default:
2747 break;
2748 case ISD::SRL:
2749 // Shrink SRL by a constant if none of the high bits shifted in are
2750 // demanded.
2751 if (TLO.LegalTypes() && !isTypeDesirableForOp(ISD::SRL, VT))
2752 // Do not turn (vt1 truncate (vt2 srl)) into (vt1 srl) if vt1 is
2753 // undesirable.
2754 break;
2755
2756 if (Src.getNode()->hasOneUse()) {
2757 if (isTruncateFree(Src, VT) &&
2758 !isTruncateFree(Src.getValueType(), VT)) {
2759 // If truncate is only free at trunc(srl), do not turn it into
2760 // srl(trunc). The check is done by first check the truncate is free
2761 // at Src's opcode(srl), then check the truncate is not done by
2762 // referencing sub-register. In test, if both trunc(srl) and
2763 // srl(trunc)'s trunc are free, srl(trunc) performs better. If only
2764 // trunc(srl)'s trunc is free, trunc(srl) is better.
2765 break;
2766 }
2767
2768 std::optional<unsigned> ShAmtC =
2769 TLO.DAG.getValidShiftAmount(Src, DemandedElts, Depth + 2);
2770 if (!ShAmtC || *ShAmtC >= BitWidth)
2771 break;
2772 unsigned ShVal = *ShAmtC;
2773
2774 APInt HighBits =
2775 APInt::getHighBitsSet(OperandBitWidth, OperandBitWidth - BitWidth);
2776 HighBits.lshrInPlace(ShVal);
2777 HighBits = HighBits.trunc(BitWidth);
2778 if (!(HighBits & DemandedBits)) {
2779 // None of the shifted in bits are needed. Add a truncate of the
2780 // shift input, then shift it.
2781 SDValue NewShAmt = TLO.DAG.getShiftAmountConstant(ShVal, VT, dl);
2782 SDValue NewTrunc =
2783 TLO.DAG.getNode(ISD::TRUNCATE, dl, VT, Src.getOperand(0));
2784 return TLO.CombineTo(
2785 Op, TLO.DAG.getNode(ISD::SRL, dl, VT, NewTrunc, NewShAmt));
2786 }
2787 }
2788 break;
2789 }
2790
2791 break;
2792 }
2793 case ISD::AssertZext: {
2794 // AssertZext demands all of the high bits, plus any of the low bits
2795 // demanded by its users.
2796 EVT ZVT = cast<VTSDNode>(Op.getOperand(1))->getVT();
2798 if (SimplifyDemandedBits(Op.getOperand(0), ~InMask | DemandedBits, Known,
2799 TLO, Depth + 1))
2800 return true;
2801
2802 Known.Zero |= ~InMask;
2803 Known.One &= (~Known.Zero);
2804 break;
2805 }
2807 SDValue Src = Op.getOperand(0);
2808 SDValue Idx = Op.getOperand(1);
2809 ElementCount SrcEltCnt = Src.getValueType().getVectorElementCount();
2810 unsigned EltBitWidth = Src.getScalarValueSizeInBits();
2811
2812 if (SrcEltCnt.isScalable())
2813 return false;
2814
2815 // Demand the bits from every vector element without a constant index.
2816 unsigned NumSrcElts = SrcEltCnt.getFixedValue();
2817 APInt DemandedSrcElts = APInt::getAllOnes(NumSrcElts);
2818 if (auto *CIdx = dyn_cast<ConstantSDNode>(Idx))
2819 if (CIdx->getAPIntValue().ult(NumSrcElts))
2820 DemandedSrcElts = APInt::getOneBitSet(NumSrcElts, CIdx->getZExtValue());
2821
2822 // If BitWidth > EltBitWidth the value is anyext:ed. So we do not know
2823 // anything about the extended bits.
2824 APInt DemandedSrcBits = DemandedBits;
2825 if (BitWidth > EltBitWidth)
2826 DemandedSrcBits = DemandedSrcBits.trunc(EltBitWidth);
2827
2828 if (SimplifyDemandedBits(Src, DemandedSrcBits, DemandedSrcElts, Known2, TLO,
2829 Depth + 1))
2830 return true;
2831
2832 // Attempt to avoid multi-use ops if we don't need anything from them.
2833 if (!DemandedSrcBits.isAllOnes() || !DemandedSrcElts.isAllOnes()) {
2834 if (SDValue DemandedSrc = SimplifyMultipleUseDemandedBits(
2835 Src, DemandedSrcBits, DemandedSrcElts, TLO.DAG, Depth + 1)) {
2836 SDValue NewOp =
2837 TLO.DAG.getNode(Op.getOpcode(), dl, VT, DemandedSrc, Idx);
2838 return TLO.CombineTo(Op, NewOp);
2839 }
2840 }
2841
2842 Known = Known2;
2843 if (BitWidth > EltBitWidth)
2844 Known = Known.anyext(BitWidth);
2845 break;
2846 }
2847 case ISD::BITCAST: {
2848 if (VT.isScalableVector())
2849 return false;
2850 SDValue Src = Op.getOperand(0);
2851 EVT SrcVT = Src.getValueType();
2852 unsigned NumSrcEltBits = SrcVT.getScalarSizeInBits();
2853
2854 // If this is an FP->Int bitcast and if the sign bit is the only
2855 // thing demanded, turn this into a FGETSIGN.
2856 if (!TLO.LegalOperations() && !VT.isVector() && !SrcVT.isVector() &&
2857 DemandedBits == APInt::getSignMask(Op.getValueSizeInBits()) &&
2858 SrcVT.isFloatingPoint()) {
2860 // Make a FGETSIGN + SHL to move the sign bit into the appropriate
2861 // place. We expect the SHL to be eliminated by other optimizations.
2862 SDValue Sign = TLO.DAG.getNode(ISD::FGETSIGN, dl, VT, Src);
2863 unsigned ShVal = Op.getValueSizeInBits() - 1;
2864 SDValue ShAmt = TLO.DAG.getShiftAmountConstant(ShVal, VT, dl);
2865 return TLO.CombineTo(Op,
2866 TLO.DAG.getNode(ISD::SHL, dl, VT, Sign, ShAmt));
2867 }
2868 }
2869
2870 // Bitcast from a vector using SimplifyDemanded Bits/VectorElts.
2871 // Demand the elt/bit if any of the original elts/bits are demanded.
2872 if (SrcVT.isVector() && (BitWidth % NumSrcEltBits) == 0) {
2873 unsigned Scale = BitWidth / NumSrcEltBits;
2874 unsigned NumSrcElts = SrcVT.getVectorNumElements();
2875 APInt DemandedSrcBits = APInt::getZero(NumSrcEltBits);
2876 for (unsigned i = 0; i != Scale; ++i) {
2877 unsigned EltOffset = IsLE ? i : (Scale - 1 - i);
2878 unsigned BitOffset = EltOffset * NumSrcEltBits;
2879 DemandedSrcBits |= DemandedBits.extractBits(NumSrcEltBits, BitOffset);
2880 }
2881 // Recursive calls below may turn not demanded elements into poison, so we
2882 // need to demand all smaller source elements that maps to a demanded
2883 // destination element.
2884 APInt DemandedSrcElts = APIntOps::ScaleBitMask(DemandedElts, NumSrcElts);
2885
2886 APInt KnownSrcUndef, KnownSrcZero;
2887 if (SimplifyDemandedVectorElts(Src, DemandedSrcElts, KnownSrcUndef,
2888 KnownSrcZero, TLO, Depth + 1))
2889 return true;
2890
2891 KnownBits KnownSrcBits;
2892 if (SimplifyDemandedBits(Src, DemandedSrcBits, DemandedSrcElts,
2893 KnownSrcBits, TLO, Depth + 1))
2894 return true;
2895 } else if (IsLE && (NumSrcEltBits % BitWidth) == 0) {
2896 // TODO - bigendian once we have test coverage.
2897 unsigned Scale = NumSrcEltBits / BitWidth;
2898 unsigned NumSrcElts = SrcVT.isVector() ? SrcVT.getVectorNumElements() : 1;
2899 APInt DemandedSrcBits = APInt::getZero(NumSrcEltBits);
2900 APInt DemandedSrcElts = APInt::getZero(NumSrcElts);
2901 for (unsigned i = 0; i != NumElts; ++i)
2902 if (DemandedElts[i]) {
2903 unsigned Offset = (i % Scale) * BitWidth;
2904 DemandedSrcBits.insertBits(DemandedBits, Offset);
2905 DemandedSrcElts.setBit(i / Scale);
2906 }
2907
2908 if (SrcVT.isVector()) {
2909 APInt KnownSrcUndef, KnownSrcZero;
2910 if (SimplifyDemandedVectorElts(Src, DemandedSrcElts, KnownSrcUndef,
2911 KnownSrcZero, TLO, Depth + 1))
2912 return true;
2913 }
2914
2915 KnownBits KnownSrcBits;
2916 if (SimplifyDemandedBits(Src, DemandedSrcBits, DemandedSrcElts,
2917 KnownSrcBits, TLO, Depth + 1))
2918 return true;
2919
2920 // Attempt to avoid multi-use ops if we don't need anything from them.
2921 if (!DemandedSrcBits.isAllOnes() || !DemandedSrcElts.isAllOnes()) {
2922 if (SDValue DemandedSrc = SimplifyMultipleUseDemandedBits(
2923 Src, DemandedSrcBits, DemandedSrcElts, TLO.DAG, Depth + 1)) {
2924 SDValue NewOp = TLO.DAG.getBitcast(VT, DemandedSrc);
2925 return TLO.CombineTo(Op, NewOp);
2926 }
2927 }
2928 }
2929
2930 // If this is a bitcast, let computeKnownBits handle it. Only do this on a
2931 // recursive call where Known may be useful to the caller.
2932 if (Depth > 0) {
2933 Known = TLO.DAG.computeKnownBits(Op, DemandedElts, Depth);
2934 return false;
2935 }
2936 break;
2937 }
2938 case ISD::MUL:
2939 if (DemandedBits.isPowerOf2()) {
2940 // The LSB of X*Y is set only if (X & 1) == 1 and (Y & 1) == 1.
2941 // If we demand exactly one bit N and we have "X * (C' << N)" where C' is
2942 // odd (has LSB set), then the left-shifted low bit of X is the answer.
2943 unsigned CTZ = DemandedBits.countr_zero();
2944 ConstantSDNode *C = isConstOrConstSplat(Op.getOperand(1), DemandedElts);
2945 if (C && C->getAPIntValue().countr_zero() == CTZ) {
2946 SDValue AmtC = TLO.DAG.getShiftAmountConstant(CTZ, VT, dl);
2947 SDValue Shl = TLO.DAG.getNode(ISD::SHL, dl, VT, Op.getOperand(0), AmtC);
2948 return TLO.CombineTo(Op, Shl);
2949 }
2950 }
2951 // For a squared value "X * X", the bottom 2 bits are 0 and X[0] because:
2952 // X * X is odd iff X is odd.
2953 // 'Quadratic Reciprocity': X * X -> 0 for bit[1]
2954 if (Op.getOperand(0) == Op.getOperand(1) && DemandedBits.ult(4)) {
2955 SDValue One = TLO.DAG.getConstant(1, dl, VT);
2956 SDValue And1 = TLO.DAG.getNode(ISD::AND, dl, VT, Op.getOperand(0), One);
2957 return TLO.CombineTo(Op, And1);
2958 }
2959 [[fallthrough]];
2960 case ISD::PTRADD:
2961 if (Op.getOperand(0).getValueType() != Op.getOperand(1).getValueType())
2962 break;
2963 // PTRADD behaves like ADD if pointers are represented as integers.
2964 [[fallthrough]];
2965 case ISD::ADD:
2966 case ISD::SUB: {
2967 // Add, Sub, and Mul don't demand any bits in positions beyond that
2968 // of the highest bit demanded of them.
2969 SDValue Op0 = Op.getOperand(0), Op1 = Op.getOperand(1);
2970 SDNodeFlags Flags = Op.getNode()->getFlags();
2971 unsigned DemandedBitsLZ = DemandedBits.countl_zero();
2972 APInt LoMask = APInt::getLowBitsSet(BitWidth, BitWidth - DemandedBitsLZ);
2973 KnownBits KnownOp0, KnownOp1;
2974 auto GetDemandedBitsLHSMask = [&](APInt Demanded,
2975 const KnownBits &KnownRHS) {
2976 if (Op.getOpcode() == ISD::MUL)
2977 Demanded.clearHighBits(KnownRHS.countMinTrailingZeros());
2978 return Demanded;
2979 };
2980 if (SimplifyDemandedBits(Op1, LoMask, DemandedElts, KnownOp1, TLO,
2981 Depth + 1) ||
2982 SimplifyDemandedBits(Op0, GetDemandedBitsLHSMask(LoMask, KnownOp1),
2983 DemandedElts, KnownOp0, TLO, Depth + 1) ||
2984 // See if the operation should be performed at a smaller bit width.
2986 // Disable the nsw and nuw flags. We can no longer guarantee that we
2987 // won't wrap after simplification.
2988 Op->dropFlags(SDNodeFlags::NoWrap);
2989 return true;
2990 }
2991
2992 // neg x with only low bit demanded is simply x.
2993 if (Op.getOpcode() == ISD::SUB && DemandedBits.isOne() &&
2994 isNullConstant(Op0))
2995 return TLO.CombineTo(Op, Op1);
2996
2997 // Attempt to avoid multi-use ops if we don't need anything from them.
2998 if (!LoMask.isAllOnes() || !DemandedElts.isAllOnes()) {
3000 Op0, LoMask, DemandedElts, TLO.DAG, Depth + 1);
3002 Op1, LoMask, DemandedElts, TLO.DAG, Depth + 1);
3003 if (DemandedOp0 || DemandedOp1) {
3004 Op0 = DemandedOp0 ? DemandedOp0 : Op0;
3005 Op1 = DemandedOp1 ? DemandedOp1 : Op1;
3006 SDValue NewOp = TLO.DAG.getNode(Op.getOpcode(), dl, VT, Op0, Op1,
3007 Flags & ~SDNodeFlags::NoWrap);
3008 return TLO.CombineTo(Op, NewOp);
3009 }
3010 }
3011
3012 // If we have a constant operand, we may be able to turn it into -1 if we
3013 // do not demand the high bits. This can make the constant smaller to
3014 // encode, allow more general folding, or match specialized instruction
3015 // patterns (eg, 'blsr' on x86). Don't bother changing 1 to -1 because that
3016 // is probably not useful (and could be detrimental).
3018 APInt HighMask = APInt::getHighBitsSet(BitWidth, DemandedBitsLZ);
3019 if (C && !C->isAllOnes() && !C->isOne() &&
3020 (C->getAPIntValue() | HighMask).isAllOnes()) {
3021 SDValue Neg1 = TLO.DAG.getAllOnesConstant(dl, VT);
3022 // Disable the nsw and nuw flags. We can no longer guarantee that we
3023 // won't wrap after simplification.
3024 SDValue NewOp = TLO.DAG.getNode(Op.getOpcode(), dl, VT, Op0, Neg1,
3025 Flags & ~SDNodeFlags::NoWrap);
3026 return TLO.CombineTo(Op, NewOp);
3027 }
3028
3029 // Match a multiply with a disguised negated-power-of-2 and convert to a
3030 // an equivalent shift-left amount.
3031 // Example: (X * MulC) + Op1 --> Op1 - (X << log2(-MulC))
3032 auto getShiftLeftAmt = [&HighMask](SDValue Mul) -> unsigned {
3033 if (Mul.getOpcode() != ISD::MUL || !Mul.hasOneUse())
3034 return 0;
3035
3036 // Don't touch opaque constants. Also, ignore zero and power-of-2
3037 // multiplies. Those will get folded later.
3038 ConstantSDNode *MulC = isConstOrConstSplat(Mul.getOperand(1));
3039 if (MulC && !MulC->isOpaque() && !MulC->isZero() &&
3040 !MulC->getAPIntValue().isPowerOf2()) {
3041 APInt UnmaskedC = MulC->getAPIntValue() | HighMask;
3042 if (UnmaskedC.isNegatedPowerOf2())
3043 return (-UnmaskedC).logBase2();
3044 }
3045 return 0;
3046 };
3047
3048 auto foldMul = [&](ISD::NodeType NT, SDValue X, SDValue Y,
3049 unsigned ShlAmt) {
3050 SDValue ShlAmtC = TLO.DAG.getShiftAmountConstant(ShlAmt, VT, dl);
3051 SDValue Shl = TLO.DAG.getNode(ISD::SHL, dl, VT, X, ShlAmtC);
3052 SDValue Res = TLO.DAG.getNode(NT, dl, VT, Y, Shl);
3053 return TLO.CombineTo(Op, Res);
3054 };
3055
3057 if (Op.getOpcode() == ISD::ADD) {
3058 // (X * MulC) + Op1 --> Op1 - (X << log2(-MulC))
3059 if (unsigned ShAmt = getShiftLeftAmt(Op0))
3060 return foldMul(ISD::SUB, Op0.getOperand(0), Op1, ShAmt);
3061 // Op0 + (X * MulC) --> Op0 - (X << log2(-MulC))
3062 if (unsigned ShAmt = getShiftLeftAmt(Op1))
3063 return foldMul(ISD::SUB, Op1.getOperand(0), Op0, ShAmt);
3064 }
3065 if (Op.getOpcode() == ISD::SUB) {
3066 // Op0 - (X * MulC) --> Op0 + (X << log2(-MulC))
3067 if (unsigned ShAmt = getShiftLeftAmt(Op1))
3068 return foldMul(ISD::ADD, Op1.getOperand(0), Op0, ShAmt);
3069 }
3070 }
3071
3072 if (Op.getOpcode() == ISD::MUL) {
3073 Known = KnownBits::mul(KnownOp0, KnownOp1);
3074 } else { // Op.getOpcode() is either ISD::ADD, ISD::PTRADD, or ISD::SUB.
3076 Op.getOpcode() != ISD::SUB, Flags.hasNoSignedWrap(),
3077 Flags.hasNoUnsignedWrap(), KnownOp0, KnownOp1);
3078 }
3079 break;
3080 }
3081 case ISD::FABS: {
3082 SDValue Op0 = Op.getOperand(0);
3083 APInt SignMask = APInt::getSignMask(BitWidth);
3084
3085 if (!DemandedBits.intersects(SignMask))
3086 return TLO.CombineTo(Op, Op0);
3087
3088 if (SimplifyDemandedBits(Op0, DemandedBits, DemandedElts, Known, TLO,
3089 Depth + 1))
3090 return true;
3091
3092 if (Known.isNonNegative())
3093 return TLO.CombineTo(Op, Op0);
3094 if (Known.isNegative())
3095 return TLO.CombineTo(
3096 Op, TLO.DAG.getNode(ISD::FNEG, dl, VT, Op0, Op->getFlags()));
3097
3098 Known.Zero |= SignMask;
3099 Known.One &= ~SignMask;
3100
3101 break;
3102 }
3103 case ISD::FCOPYSIGN: {
3104 SDValue Op0 = Op.getOperand(0);
3105 SDValue Op1 = Op.getOperand(1);
3106
3107 unsigned BitWidth0 = Op0.getScalarValueSizeInBits();
3108 unsigned BitWidth1 = Op1.getScalarValueSizeInBits();
3109 APInt SignMask0 = APInt::getSignMask(BitWidth0);
3110 APInt SignMask1 = APInt::getSignMask(BitWidth1);
3111
3112 if (!DemandedBits.intersects(SignMask0))
3113 return TLO.CombineTo(Op, Op0);
3114
3115 if (SimplifyDemandedBits(Op0, ~SignMask0 & DemandedBits, DemandedElts,
3116 Known, TLO, Depth + 1) ||
3117 SimplifyDemandedBits(Op1, SignMask1, DemandedElts, Known2, TLO,
3118 Depth + 1))
3119 return true;
3120
3121 if (Known2.isNonNegative())
3122 return TLO.CombineTo(
3123 Op, TLO.DAG.getNode(ISD::FABS, dl, VT, Op0, Op->getFlags()));
3124
3125 if (Known2.isNegative())
3126 return TLO.CombineTo(
3127 Op, TLO.DAG.getNode(ISD::FNEG, dl, VT,
3128 TLO.DAG.getNode(ISD::FABS, SDLoc(Op0), VT, Op0)));
3129
3130 Known.Zero &= ~SignMask0;
3131 Known.One &= ~SignMask0;
3132 break;
3133 }
3134 case ISD::FNEG: {
3135 SDValue Op0 = Op.getOperand(0);
3136 APInt SignMask = APInt::getSignMask(BitWidth);
3137
3138 if (!DemandedBits.intersects(SignMask))
3139 return TLO.CombineTo(Op, Op0);
3140
3141 if (SimplifyDemandedBits(Op0, DemandedBits, DemandedElts, Known, TLO,
3142 Depth + 1))
3143 return true;
3144
3145 if (!Known.isSignUnknown()) {
3146 Known.Zero ^= SignMask;
3147 Known.One ^= SignMask;
3148 }
3149
3150 break;
3151 }
3152 default:
3153 // We also ask the target about intrinsics (which could be specific to it).
3154 if (Op.getOpcode() >= ISD::BUILTIN_OP_END ||
3155 Op.getOpcode() == ISD::INTRINSIC_WO_CHAIN) {
3156 // TODO: Probably okay to remove after audit; here to reduce change size
3157 // in initial enablement patch for scalable vectors
3158 if (Op.getValueType().isScalableVector())
3159 break;
3161 Known, TLO, Depth))
3162 return true;
3163 break;
3164 }
3165
3166 // Just use computeKnownBits to compute output bits.
3167 Known = TLO.DAG.computeKnownBits(Op, DemandedElts, Depth);
3168 break;
3169 }
3170
3171 // If we know the value of all of the demanded bits, return this as a
3172 // constant.
3174 DemandedBits.isSubsetOf(Known.Zero | Known.One)) {
3175 // Avoid folding to a constant if any OpaqueConstant is involved.
3176 if (llvm::any_of(Op->ops(), [](SDValue V) {
3177 auto *C = dyn_cast<ConstantSDNode>(V);
3178 return C && C->isOpaque();
3179 }))
3180 return false;
3181 if (VT.isInteger())
3182 return TLO.CombineTo(Op, TLO.DAG.getConstant(Known.One, dl, VT));
3183 if (VT.isFloatingPoint())
3184 return TLO.CombineTo(
3186 dl, VT));
3187 }
3188
3189 // A multi use 'all demanded elts' simplify failed to find any knownbits.
3190 // Try again just for the original demanded elts.
3191 // Ensure we do this AFTER constant folding above.
3192 if (HasMultiUse && Known.isUnknown() && !OriginalDemandedElts.isAllOnes())
3193 Known = TLO.DAG.computeKnownBits(Op, OriginalDemandedElts, Depth);
3194
3195 return false;
3196}
3197
3199 const APInt &DemandedElts,
3200 DAGCombinerInfo &DCI) const {
3201 SelectionDAG &DAG = DCI.DAG;
3202 TargetLoweringOpt TLO(DAG, !DCI.isBeforeLegalize(),
3203 !DCI.isBeforeLegalizeOps());
3204
3205 APInt KnownUndef, KnownZero;
3206 bool Simplified =
3207 SimplifyDemandedVectorElts(Op, DemandedElts, KnownUndef, KnownZero, TLO);
3208 if (Simplified) {
3209 DCI.AddToWorklist(Op.getNode());
3210 DCI.CommitTargetLoweringOpt(TLO);
3211 }
3212
3213 return Simplified;
3214}
3215
3216/// Given a vector binary operation and known undefined elements for each input
3217/// operand, compute whether each element of the output is undefined.
3219 const APInt &UndefOp0,
3220 const APInt &UndefOp1) {
3221 EVT VT = BO.getValueType();
3223 "Vector binop only");
3224
3225 EVT EltVT = VT.getVectorElementType();
3226 unsigned NumElts = VT.isFixedLengthVector() ? VT.getVectorNumElements() : 1;
3227 assert(UndefOp0.getBitWidth() == NumElts &&
3228 UndefOp1.getBitWidth() == NumElts && "Bad type for undef analysis");
3229
3230 auto getUndefOrConstantElt = [&](SDValue V, unsigned Index,
3231 const APInt &UndefVals) {
3232 if (UndefVals[Index])
3233 return DAG.getUNDEF(EltVT);
3234
3235 if (auto *BV = dyn_cast<BuildVectorSDNode>(V)) {
3236 // Try hard to make sure that the getNode() call is not creating temporary
3237 // nodes. Ignore opaque integers because they do not constant fold.
3238 SDValue Elt = BV->getOperand(Index);
3239 auto *C = dyn_cast<ConstantSDNode>(Elt);
3240 if (isa<ConstantFPSDNode>(Elt) || Elt.isUndef() || (C && !C->isOpaque()))
3241 return Elt;
3242 }
3243
3244 return SDValue();
3245 };
3246
3247 APInt KnownUndef = APInt::getZero(NumElts);
3248 for (unsigned i = 0; i != NumElts; ++i) {
3249 // If both inputs for this element are either constant or undef and match
3250 // the element type, compute the constant/undef result for this element of
3251 // the vector.
3252 // TODO: Ideally we would use FoldConstantArithmetic() here, but that does
3253 // not handle FP constants. The code within getNode() should be refactored
3254 // to avoid the danger of creating a bogus temporary node here.
3255 SDValue C0 = getUndefOrConstantElt(BO.getOperand(0), i, UndefOp0);
3256 SDValue C1 = getUndefOrConstantElt(BO.getOperand(1), i, UndefOp1);
3257 if (C0 && C1 && C0.getValueType() == EltVT && C1.getValueType() == EltVT)
3258 if (DAG.getNode(BO.getOpcode(), SDLoc(BO), EltVT, C0, C1).isUndef())
3259 KnownUndef.setBit(i);
3260 }
3261 return KnownUndef;
3262}
3263
3265 SDValue Op, const APInt &OriginalDemandedElts, APInt &KnownUndef,
3266 APInt &KnownZero, TargetLoweringOpt &TLO, unsigned Depth,
3267 bool AssumeSingleUse) const {
3268 EVT VT = Op.getValueType();
3269 unsigned Opcode = Op.getOpcode();
3270 APInt DemandedElts = OriginalDemandedElts;
3271 unsigned NumElts = DemandedElts.getBitWidth();
3272 assert(VT.isVector() && "Expected vector op");
3273
3274 KnownUndef = KnownZero = APInt::getZero(NumElts);
3275
3277 return false;
3278
3279 // TODO: For now we assume we know nothing about scalable vectors.
3280 if (VT.isScalableVector())
3281 return false;
3282
3283 assert(VT.getVectorNumElements() == NumElts &&
3284 "Mask size mismatches value type element count!");
3285
3286 // Undef operand.
3287 if (Op.isUndef()) {
3288 KnownUndef.setAllBits();
3289 return false;
3290 }
3291
3292 // If Op has other users, assume that all elements are needed.
3293 if (!AssumeSingleUse && !Op.getNode()->hasOneUse())
3294 DemandedElts.setAllBits();
3295
3296 // Not demanding any elements from Op.
3297 if (DemandedElts == 0) {
3298 KnownUndef.setAllBits();
3299 return TLO.CombineTo(Op, TLO.DAG.getUNDEF(VT));
3300 }
3301
3302 // Limit search depth.
3304 return false;
3305
3306 SDLoc DL(Op);
3307 unsigned EltSizeInBits = VT.getScalarSizeInBits();
3308 bool IsLE = TLO.DAG.getDataLayout().isLittleEndian();
3309
3310 auto TryShrinkBinOp = [&](SDValue Op0, SDValue Op1) {
3311 unsigned ShrunkSize = getPreferredShrunkVectorSizeInBits(Op, DemandedElts);
3312 if (!ShrunkSize)
3313 return false;
3314
3315 assert(ShrunkSize % EltSizeInBits == 0 &&
3316 "Shrunk size not a multiple of element size");
3317 assert(ShrunkSize < VT.getSizeInBits() &&
3318 "Shrunk size must be < original vector size");
3319 assert(ShrunkSize >= EltSizeInBits * DemandedElts.getActiveBits() &&
3320 "Shrunk size must be >= demanded size");
3321
3322 EVT ShrunkVT = VT.changeVectorElementCount(
3323 *TLO.DAG.getContext(),
3324 ElementCount::getFixed(ShrunkSize / EltSizeInBits));
3325 Op0 = TLO.DAG.getExtractSubvector(DL, ShrunkVT, Op0, 0);
3326 Op1 = TLO.DAG.getExtractSubvector(DL, ShrunkVT, Op1, 0);
3327 SDValue NewOp =
3328 TLO.DAG.getNode(Opcode, DL, ShrunkVT, Op0, Op1, Op->getFlags());
3329 return TLO.CombineTo(
3330 Op, TLO.DAG.getInsertSubvector(DL, TLO.DAG.getUNDEF(VT), NewOp, 0));
3331 };
3332
3333 // Helper for demanding the specified elements and all the bits of both binary
3334 // operands.
3335 auto SimplifyDemandedVectorEltsBinOp = [&](SDValue Op0, SDValue Op1) {
3336 SDValue NewOp0 = SimplifyMultipleUseDemandedVectorElts(Op0, DemandedElts,
3337 TLO.DAG, Depth + 1);
3338 SDValue NewOp1 = SimplifyMultipleUseDemandedVectorElts(Op1, DemandedElts,
3339 TLO.DAG, Depth + 1);
3340 if (NewOp0 || NewOp1) {
3341 SDValue NewOp =
3342 TLO.DAG.getNode(Opcode, SDLoc(Op), VT, NewOp0 ? NewOp0 : Op0,
3343 NewOp1 ? NewOp1 : Op1, Op->getFlags());
3344 return TLO.CombineTo(Op, NewOp);
3345 }
3346
3347 if (TryShrinkBinOp(Op0, Op1))
3348 return true;
3349
3350 return false;
3351 };
3352
3353 switch (Opcode) {
3354 case ISD::SCALAR_TO_VECTOR: {
3355 if (!DemandedElts[0]) {
3356 KnownUndef.setAllBits();
3357 return TLO.CombineTo(Op, TLO.DAG.getUNDEF(VT));
3358 }
3359 KnownUndef.setHighBits(NumElts - 1);
3360 break;
3361 }
3362 case ISD::BITCAST: {
3363 SDValue Src = Op.getOperand(0);
3364 EVT SrcVT = Src.getValueType();
3365
3366 if (!SrcVT.isVector()) {
3367 // TODO - bigendian once we have test coverage.
3368 if (IsLE) {
3369 APInt DemandedSrcBits = APInt::getZero(SrcVT.getSizeInBits());
3370 unsigned EltSize = VT.getScalarSizeInBits();
3371 for (unsigned I = 0; I != NumElts; ++I) {
3372 if (DemandedElts[I]) {
3373 unsigned Offset = I * EltSize;
3374 DemandedSrcBits.setBits(Offset, Offset + EltSize);
3375 }
3376 }
3378 if (SimplifyDemandedBits(Src, DemandedSrcBits, Known, TLO, Depth + 1))
3379 return true;
3380 }
3381 break;
3382 }
3383
3384 // Fast handling of 'identity' bitcasts.
3385 unsigned NumSrcElts = SrcVT.getVectorNumElements();
3386 if (NumSrcElts == NumElts)
3387 return SimplifyDemandedVectorElts(Src, DemandedElts, KnownUndef,
3388 KnownZero, TLO, Depth + 1);
3389
3390 APInt SrcDemandedElts, SrcZero, SrcUndef;
3391
3392 // Bitcast from 'large element' src vector to 'small element' vector, we
3393 // must demand a source element if any DemandedElt maps to it.
3394 if ((NumElts % NumSrcElts) == 0) {
3395 unsigned Scale = NumElts / NumSrcElts;
3396 SrcDemandedElts = APIntOps::ScaleBitMask(DemandedElts, NumSrcElts);
3397 if (SimplifyDemandedVectorElts(Src, SrcDemandedElts, SrcUndef, SrcZero,
3398 TLO, Depth + 1))
3399 return true;
3400
3401 // Try calling SimplifyDemandedBits, converting demanded elts to the bits
3402 // of the large element.
3403 // TODO - bigendian once we have test coverage.
3404 if (IsLE) {
3405 unsigned SrcEltSizeInBits = SrcVT.getScalarSizeInBits();
3406 APInt SrcDemandedBits = APInt::getZero(SrcEltSizeInBits);
3407 for (unsigned i = 0; i != NumElts; ++i)
3408 if (DemandedElts[i]) {
3409 unsigned Ofs = (i % Scale) * EltSizeInBits;
3410 SrcDemandedBits.setBits(Ofs, Ofs + EltSizeInBits);
3411 }
3412
3414 if (SimplifyDemandedBits(Src, SrcDemandedBits, SrcDemandedElts, Known,
3415 TLO, Depth + 1))
3416 return true;
3417
3418 // The bitcast has split each wide element into a number of
3419 // narrow subelements. We have just computed the Known bits
3420 // for wide elements. See if element splitting results in
3421 // some subelements being zero. Only for demanded elements!
3422 for (unsigned SubElt = 0; SubElt != Scale; ++SubElt) {
3423 if (!Known.Zero.extractBits(EltSizeInBits, SubElt * EltSizeInBits)
3424 .isAllOnes())
3425 continue;
3426 for (unsigned SrcElt = 0; SrcElt != NumSrcElts; ++SrcElt) {
3427 unsigned Elt = Scale * SrcElt + SubElt;
3428 // A wholly-undef source lane is reported as undef below; don't also
3429 // flag it as zero, keeping the undef and zero sets disjoint.
3430 if (DemandedElts[Elt] && !SrcUndef[SrcElt])
3431 KnownZero.setBit(Elt);
3432 }
3433 }
3434 }
3435
3436 // If the src element is zero/undef then all the output elements will be -
3437 // only demanded elements are guaranteed to be correct.
3438 for (unsigned i = 0; i != NumSrcElts; ++i) {
3439 if (SrcDemandedElts[i]) {
3440 if (SrcZero[i])
3441 KnownZero.setBits(i * Scale, (i + 1) * Scale);
3442 if (SrcUndef[i])
3443 KnownUndef.setBits(i * Scale, (i + 1) * Scale);
3444 }
3445 }
3446 }
3447
3448 // Bitcast from 'small element' src vector to 'large element' vector, we
3449 // demand all smaller source elements covered by the larger demanded element
3450 // of this vector.
3451 if ((NumSrcElts % NumElts) == 0) {
3452 unsigned Scale = NumSrcElts / NumElts;
3453 SrcDemandedElts = APIntOps::ScaleBitMask(DemandedElts, NumSrcElts);
3454 if (SimplifyDemandedVectorElts(Src, SrcDemandedElts, SrcUndef, SrcZero,
3455 TLO, Depth + 1))
3456 return true;
3457
3458 // If all the src elements covering an output element are zero/undef, then
3459 // the output element will be as well, assuming it was demanded.
3460 for (unsigned i = 0; i != NumElts; ++i) {
3461 if (DemandedElts[i]) {
3462 if (SrcZero.extractBits(Scale, i * Scale).isAllOnes())
3463 KnownZero.setBit(i);
3464 if (SrcUndef.extractBits(Scale, i * Scale).isAllOnes())
3465 KnownUndef.setBit(i);
3466 }
3467 }
3468 }
3469 break;
3470 }
3471 case ISD::FREEZE: {
3472 SDValue N0 = Op.getOperand(0);
3474 N0, DemandedElts, UndefPoisonKind::UndefOrPoison, Depth + 1))
3475 return TLO.CombineTo(Op, N0);
3476
3477 // TODO: Replace this with the general fold from DAGCombiner::visitFREEZE
3478 // freeze(op(x, ...)) -> op(freeze(x), ...).
3479 if (N0.getOpcode() == ISD::SCALAR_TO_VECTOR && DemandedElts == 1)
3480 return TLO.CombineTo(
3482 TLO.DAG.getFreeze(N0.getOperand(0))));
3483 break;
3484 }
3485 case ISD::BUILD_VECTOR: {
3486 // Check all elements and simplify any unused elements with UNDEF.
3487 if (!DemandedElts.isAllOnes()) {
3488 // Don't simplify BROADCASTS.
3489 if (llvm::any_of(Op->op_values(),
3490 [&](SDValue Elt) { return Op.getOperand(0) != Elt; })) {
3492 bool Updated = false;
3493 for (unsigned i = 0; i != NumElts; ++i) {
3494 if (!DemandedElts[i] && !Ops[i].isUndef()) {
3495 Ops[i] = TLO.DAG.getUNDEF(Ops[0].getValueType());
3496 KnownUndef.setBit(i);
3497 Updated = true;
3498 }
3499 }
3500 if (Updated)
3501 return TLO.CombineTo(Op, TLO.DAG.getBuildVector(VT, DL, Ops));
3502 }
3503 }
3504 for (unsigned i = 0; i != NumElts; ++i) {
3505 SDValue SrcOp = Op.getOperand(i);
3506 if (SrcOp.isUndef()) {
3507 KnownUndef.setBit(i);
3508 } else if (EltSizeInBits == SrcOp.getScalarValueSizeInBits() &&
3510 KnownZero.setBit(i);
3511 }
3512 }
3513 break;
3514 }
3515 case ISD::CONCAT_VECTORS: {
3516 EVT SubVT = Op.getOperand(0).getValueType();
3517 unsigned NumSubVecs = Op.getNumOperands();
3518 unsigned NumSubElts = SubVT.getVectorNumElements();
3519 for (unsigned i = 0; i != NumSubVecs; ++i) {
3520 SDValue SubOp = Op.getOperand(i);
3521 APInt SubElts = DemandedElts.extractBits(NumSubElts, i * NumSubElts);
3522 APInt SubUndef, SubZero;
3523 if (SimplifyDemandedVectorElts(SubOp, SubElts, SubUndef, SubZero, TLO,
3524 Depth + 1))
3525 return true;
3526 KnownUndef.insertBits(SubUndef, i * NumSubElts);
3527 KnownZero.insertBits(SubZero, i * NumSubElts);
3528 }
3529
3530 // Attempt to avoid multi-use ops if we don't need anything from them.
3531 if (!DemandedElts.isAllOnes()) {
3532 bool FoundNewSub = false;
3533 SmallVector<SDValue, 2> DemandedSubOps;
3534 for (unsigned i = 0; i != NumSubVecs; ++i) {
3535 SDValue SubOp = Op.getOperand(i);
3536 APInt SubElts = DemandedElts.extractBits(NumSubElts, i * NumSubElts);
3538 SubOp, SubElts, TLO.DAG, Depth + 1);
3539 DemandedSubOps.push_back(NewSubOp ? NewSubOp : SubOp);
3540 FoundNewSub = NewSubOp ? true : FoundNewSub;
3541 }
3542 if (FoundNewSub) {
3543 SDValue NewOp =
3544 TLO.DAG.getNode(Op.getOpcode(), SDLoc(Op), VT, DemandedSubOps);
3545 return TLO.CombineTo(Op, NewOp);
3546 }
3547 }
3548 break;
3549 }
3550 case ISD::INSERT_SUBVECTOR: {
3551 // Demand any elements from the subvector and the remainder from the src it
3552 // is inserted into.
3553 SDValue Src = Op.getOperand(0);
3554 SDValue Sub = Op.getOperand(1);
3555 uint64_t Idx = Op.getConstantOperandVal(2);
3556 unsigned NumSubElts = Sub.getValueType().getVectorNumElements();
3557 APInt DemandedSubElts = DemandedElts.extractBits(NumSubElts, Idx);
3558 APInt DemandedSrcElts = DemandedElts;
3559 DemandedSrcElts.clearBits(Idx, Idx + NumSubElts);
3560
3561 // If none of the sub operand elements are demanded, bypass the insert.
3562 if (!DemandedSubElts)
3563 return TLO.CombineTo(Op, Src);
3564
3565 APInt SubUndef, SubZero;
3566 if (SimplifyDemandedVectorElts(Sub, DemandedSubElts, SubUndef, SubZero, TLO,
3567 Depth + 1))
3568 return true;
3569
3570 // If none of the src operand elements are demanded, replace it with undef.
3571 if (!DemandedSrcElts && !Src.isUndef())
3572 return TLO.CombineTo(Op, TLO.DAG.getNode(ISD::INSERT_SUBVECTOR, DL, VT,
3573 TLO.DAG.getUNDEF(VT), Sub,
3574 Op.getOperand(2)));
3575
3576 if (SimplifyDemandedVectorElts(Src, DemandedSrcElts, KnownUndef, KnownZero,
3577 TLO, Depth + 1))
3578 return true;
3579 KnownUndef.insertBits(SubUndef, Idx);
3580 KnownZero.insertBits(SubZero, Idx);
3581
3582 // Attempt to avoid multi-use ops if we don't need anything from them.
3583 if (!DemandedSrcElts.isAllOnes() || !DemandedSubElts.isAllOnes()) {
3585 Src, DemandedSrcElts, TLO.DAG, Depth + 1);
3587 Sub, DemandedSubElts, TLO.DAG, Depth + 1);
3588 if (NewSrc || NewSub) {
3589 NewSrc = NewSrc ? NewSrc : Src;
3590 NewSub = NewSub ? NewSub : Sub;
3591 SDValue NewOp = TLO.DAG.getNode(Op.getOpcode(), SDLoc(Op), VT, NewSrc,
3592 NewSub, Op.getOperand(2));
3593 return TLO.CombineTo(Op, NewOp);
3594 }
3595 }
3596 break;
3597 }
3599 // Offset the demanded elts by the subvector index.
3600 SDValue Src = Op.getOperand(0);
3601 if (Src.getValueType().isScalableVector())
3602 break;
3603 uint64_t Idx = Op.getConstantOperandVal(1);
3604 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
3605 APInt DemandedSrcElts = DemandedElts.zext(NumSrcElts).shl(Idx);
3606
3607 APInt SrcUndef, SrcZero;
3608 if (SimplifyDemandedVectorElts(Src, DemandedSrcElts, SrcUndef, SrcZero, TLO,
3609 Depth + 1))
3610 return true;
3611 KnownUndef = SrcUndef.extractBits(NumElts, Idx);
3612 KnownZero = SrcZero.extractBits(NumElts, Idx);
3613
3614 // Attempt to avoid multi-use ops if we don't need anything from them.
3615 SDValue NewSrc = SimplifyMultipleUseDemandedVectorElts(Src, DemandedSrcElts,
3616 TLO.DAG, Depth + 1);
3617 if (NewSrc) {
3618 SDValue NewOp = TLO.DAG.getNode(Op.getOpcode(), SDLoc(Op), VT, NewSrc,
3619 Op.getOperand(1));
3620 return TLO.CombineTo(Op, NewOp);
3621 }
3622 break;
3623 }
3625 SDValue Vec = Op.getOperand(0);
3626 SDValue Scl = Op.getOperand(1);
3627 auto *CIdx = dyn_cast<ConstantSDNode>(Op.getOperand(2));
3628
3629 // For a legal, constant insertion index, if we don't need this insertion
3630 // then strip it, else remove it from the demanded elts.
3631 if (CIdx && CIdx->getAPIntValue().ult(NumElts)) {
3632 unsigned Idx = CIdx->getZExtValue();
3633 if (!DemandedElts[Idx])
3634 return TLO.CombineTo(Op, Vec);
3635
3636 APInt DemandedVecElts(DemandedElts);
3637 DemandedVecElts.clearBit(Idx);
3638 if (SimplifyDemandedVectorElts(Vec, DemandedVecElts, KnownUndef,
3639 KnownZero, TLO, Depth + 1))
3640 return true;
3641
3642 KnownUndef.setBitVal(Idx, Scl.isUndef());
3643
3644 KnownZero.setBitVal(Idx, isNullConstant(Scl) || isNullFPConstant(Scl));
3645 break;
3646 }
3647
3648 APInt VecUndef, VecZero;
3649 if (SimplifyDemandedVectorElts(Vec, DemandedElts, VecUndef, VecZero, TLO,
3650 Depth + 1))
3651 return true;
3652 // Without knowing the insertion index we can't set KnownUndef/KnownZero.
3653 break;
3654 }
3655 case ISD::VSELECT: {
3656 SDValue Sel = Op.getOperand(0);
3657 SDValue LHS = Op.getOperand(1);
3658 SDValue RHS = Op.getOperand(2);
3659
3660 // Try to transform the select condition based on the current demanded
3661 // elements.
3662 APInt UndefSel, ZeroSel;
3663 if (SimplifyDemandedVectorElts(Sel, DemandedElts, UndefSel, ZeroSel, TLO,
3664 Depth + 1))
3665 return true;
3666
3667 // See if we can simplify either vselect operand.
3668 APInt DemandedLHS(DemandedElts);
3669 APInt DemandedRHS(DemandedElts);
3670 APInt UndefLHS, ZeroLHS;
3671 APInt UndefRHS, ZeroRHS;
3672 if (SimplifyDemandedVectorElts(LHS, DemandedLHS, UndefLHS, ZeroLHS, TLO,
3673 Depth + 1))
3674 return true;
3675 if (SimplifyDemandedVectorElts(RHS, DemandedRHS, UndefRHS, ZeroRHS, TLO,
3676 Depth + 1))
3677 return true;
3678
3679 KnownUndef = UndefLHS & UndefRHS;
3680 KnownZero = ZeroLHS & ZeroRHS;
3681
3682 // If we know that the selected element is always zero, we don't need the
3683 // select value element.
3684 APInt DemandedSel = DemandedElts & ~KnownZero;
3685 if (DemandedSel != DemandedElts)
3686 if (SimplifyDemandedVectorElts(Sel, DemandedSel, UndefSel, ZeroSel, TLO,
3687 Depth + 1))
3688 return true;
3689
3690 break;
3691 }
3692 case ISD::VECTOR_SHUFFLE: {
3693 SDValue LHS = Op.getOperand(0);
3694 SDValue RHS = Op.getOperand(1);
3695 ArrayRef<int> ShuffleMask = cast<ShuffleVectorSDNode>(Op)->getMask();
3696
3697 // Collect demanded elements from shuffle operands..
3698 APInt DemandedLHS(NumElts, 0);
3699 APInt DemandedRHS(NumElts, 0);
3700 for (unsigned i = 0; i != NumElts; ++i) {
3701 int M = ShuffleMask[i];
3702 if (M < 0 || !DemandedElts[i])
3703 continue;
3704 assert(0 <= M && M < (int)(2 * NumElts) && "Shuffle index out of range");
3705 if (M < (int)NumElts)
3706 DemandedLHS.setBit(M);
3707 else
3708 DemandedRHS.setBit(M - NumElts);
3709 }
3710
3711 // If either side isn't demanded, replace it by UNDEF. We handle this
3712 // explicitly here to also simplify in case of multiple uses (on the
3713 // contrary to the SimplifyDemandedVectorElts calls below).
3714 bool FoldLHS = !DemandedLHS && !LHS.isUndef();
3715 bool FoldRHS = !DemandedRHS && !RHS.isUndef();
3716 if (FoldLHS || FoldRHS) {
3717 LHS = FoldLHS ? TLO.DAG.getUNDEF(LHS.getValueType()) : LHS;
3718 RHS = FoldRHS ? TLO.DAG.getUNDEF(RHS.getValueType()) : RHS;
3719 SDValue NewOp =
3720 TLO.DAG.getVectorShuffle(VT, SDLoc(Op), LHS, RHS, ShuffleMask);
3721 return TLO.CombineTo(Op, NewOp);
3722 }
3723
3724 // See if we can simplify either shuffle operand.
3725 APInt UndefLHS, ZeroLHS;
3726 APInt UndefRHS, ZeroRHS;
3727 if (SimplifyDemandedVectorElts(LHS, DemandedLHS, UndefLHS, ZeroLHS, TLO,
3728 Depth + 1))
3729 return true;
3730 if (SimplifyDemandedVectorElts(RHS, DemandedRHS, UndefRHS, ZeroRHS, TLO,
3731 Depth + 1))
3732 return true;
3733
3734 // Simplify mask using undef elements from LHS/RHS.
3735 bool Updated = false;
3736 bool IdentityLHS = true, IdentityRHS = true;
3737 SmallVector<int, 32> NewMask(ShuffleMask);
3738 for (unsigned i = 0; i != NumElts; ++i) {
3739 int &M = NewMask[i];
3740 if (M < 0)
3741 continue;
3742 if (!DemandedElts[i] || (M < (int)NumElts && UndefLHS[M]) ||
3743 (M >= (int)NumElts && UndefRHS[M - NumElts])) {
3744 Updated = true;
3745 M = -1;
3746 }
3747 IdentityLHS &= (M < 0) || (M == (int)i);
3748 IdentityRHS &= (M < 0) || ((M - NumElts) == i);
3749 }
3750
3751 // Update legal shuffle masks based on demanded elements if it won't reduce
3752 // to Identity which can cause premature removal of the shuffle mask.
3753 if (Updated && !IdentityLHS && !IdentityRHS && !TLO.LegalOps) {
3754 SDValue LegalShuffle =
3755 buildLegalVectorShuffle(VT, DL, LHS, RHS, NewMask, TLO.DAG);
3756 if (LegalShuffle)
3757 return TLO.CombineTo(Op, LegalShuffle);
3758 }
3759
3760 // Propagate undef/zero elements from LHS/RHS.
3761 for (unsigned i = 0; i != NumElts; ++i) {
3762 int M = ShuffleMask[i];
3763 if (M < 0) {
3764 KnownUndef.setBit(i);
3765 } else if (M < (int)NumElts) {
3766 if (UndefLHS[M])
3767 KnownUndef.setBit(i);
3768 if (ZeroLHS[M])
3769 KnownZero.setBit(i);
3770 } else {
3771 if (UndefRHS[M - NumElts])
3772 KnownUndef.setBit(i);
3773 if (ZeroRHS[M - NumElts])
3774 KnownZero.setBit(i);
3775 }
3776 }
3777 break;
3778 }
3782 APInt SrcUndef, SrcZero;
3783 SDValue Src = Op.getOperand(0);
3784 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
3785 APInt DemandedSrcElts = DemandedElts.zext(NumSrcElts);
3786 if (SimplifyDemandedVectorElts(Src, DemandedSrcElts, SrcUndef, SrcZero, TLO,
3787 Depth + 1))
3788 return true;
3789 KnownZero = SrcZero.zextOrTrunc(NumElts);
3790 KnownUndef = SrcUndef.zextOrTrunc(NumElts);
3791
3792 if (IsLE && Op.getOpcode() == ISD::ANY_EXTEND_VECTOR_INREG &&
3793 Op.getValueSizeInBits() == Src.getValueSizeInBits() &&
3794 DemandedSrcElts == 1) {
3795 // aext - if we just need the bottom element then we can bitcast.
3796 return TLO.CombineTo(Op, TLO.DAG.getBitcast(VT, Src));
3797 }
3798
3799 if (Op.getOpcode() == ISD::ZERO_EXTEND_VECTOR_INREG) {
3800 // zext(undef) upper bits are guaranteed to be zero.
3801 if (DemandedElts.isSubsetOf(KnownUndef))
3802 return TLO.CombineTo(Op, TLO.DAG.getConstant(0, SDLoc(Op), VT));
3803 KnownUndef.clearAllBits();
3804
3805 // zext - if we just need the bottom element then we can mask:
3806 // zext(and(x,c)) -> and(x,c') iff the zext is the only user of the and.
3807 if (IsLE && DemandedSrcElts == 1 && Src.getOpcode() == ISD::AND &&
3808 Op->isOnlyUserOf(Src.getNode()) &&
3809 Op.getValueSizeInBits() == Src.getValueSizeInBits()) {
3810 SDLoc DL(Op);
3811 EVT SrcVT = Src.getValueType();
3812 EVT SrcSVT = SrcVT.getScalarType();
3813
3814 // If we're after type legalization and SrcSVT is not legal, use the
3815 // promoted type for creating constants to avoid creating nodes with
3816 // illegal types.
3817 if (TLO.LegalTypes())
3818 SrcSVT = getLegalTypeToTransformTo(*TLO.DAG.getContext(), SrcSVT);
3819
3820 SmallVector<SDValue> MaskElts;
3821 MaskElts.push_back(TLO.DAG.getAllOnesConstant(DL, SrcSVT));
3822 MaskElts.append(NumSrcElts - 1, TLO.DAG.getConstant(0, DL, SrcSVT));
3823 SDValue Mask = TLO.DAG.getBuildVector(SrcVT, DL, MaskElts);
3824 if (SDValue Fold = TLO.DAG.FoldConstantArithmetic(
3825 ISD::AND, DL, SrcVT, {Src.getOperand(1), Mask})) {
3826 Fold = TLO.DAG.getNode(ISD::AND, DL, SrcVT, Src.getOperand(0), Fold);
3827 return TLO.CombineTo(Op, TLO.DAG.getBitcast(VT, Fold));
3828 }
3829 }
3830 }
3831 break;
3832 }
3833
3834 // TODO: There are more binop opcodes that could be handled here - MIN,
3835 // MAX, saturated math, etc.
3836 case ISD::ADD: {
3837 SDValue Op0 = Op.getOperand(0);
3838 SDValue Op1 = Op.getOperand(1);
3839 if (Op0 == Op1 && Op->isOnlyUserOf(Op0.getNode())) {
3840 APInt UndefLHS, ZeroLHS;
3841 if (SimplifyDemandedVectorElts(Op0, DemandedElts, UndefLHS, ZeroLHS, TLO,
3842 Depth + 1, /*AssumeSingleUse*/ true))
3843 return true;
3844 }
3845 [[fallthrough]];
3846 }
3847 case ISD::AVGCEILS:
3848 case ISD::AVGCEILU:
3849 case ISD::AVGFLOORS:
3850 case ISD::AVGFLOORU:
3851 case ISD::OR:
3852 case ISD::XOR:
3853 case ISD::SUB:
3854 case ISD::FADD:
3855 case ISD::FSUB:
3856 case ISD::FMUL:
3857 case ISD::FDIV:
3858 case ISD::FREM:
3859 case ISD::PSEUDO_FMIN:
3860 case ISD::PSEUDO_FMAX: {
3861 SDValue Op0 = Op.getOperand(0);
3862 SDValue Op1 = Op.getOperand(1);
3863
3864 APInt UndefRHS, ZeroRHS;
3865 if (SimplifyDemandedVectorElts(Op1, DemandedElts, UndefRHS, ZeroRHS, TLO,
3866 Depth + 1))
3867 return true;
3868 APInt UndefLHS, ZeroLHS;
3869 if (SimplifyDemandedVectorElts(Op0, DemandedElts, UndefLHS, ZeroLHS, TLO,
3870 Depth + 1))
3871 return true;
3872
3873 KnownZero = ZeroLHS & ZeroRHS;
3874 KnownUndef = getKnownUndefForVectorBinop(Op, TLO.DAG, UndefLHS, UndefRHS);
3875
3876 // Attempt to avoid multi-use ops if we don't need anything from them.
3877 // TODO - use KnownUndef to relax the demandedelts?
3878 if (!DemandedElts.isAllOnes())
3879 if (SimplifyDemandedVectorEltsBinOp(Op0, Op1))
3880 return true;
3881 break;
3882 }
3883 case ISD::SHL:
3884 case ISD::SRL:
3885 case ISD::SRA:
3886 case ISD::ROTL:
3887 case ISD::ROTR: {
3888 SDValue Op0 = Op.getOperand(0);
3889 SDValue Op1 = Op.getOperand(1);
3890
3891 APInt UndefRHS, ZeroRHS;
3892 if (SimplifyDemandedVectorElts(Op1, DemandedElts, UndefRHS, ZeroRHS, TLO,
3893 Depth + 1))
3894 return true;
3895 APInt UndefLHS, ZeroLHS;
3896 if (SimplifyDemandedVectorElts(Op0, DemandedElts, UndefLHS, ZeroLHS, TLO,
3897 Depth + 1))
3898 return true;
3899
3900 KnownZero = ZeroLHS;
3901 KnownUndef = UndefLHS & UndefRHS; // TODO: use getKnownUndefForVectorBinop?
3902
3903 // Attempt to avoid multi-use ops if we don't need anything from them.
3904 // TODO - use KnownUndef to relax the demandedelts?
3905 if (!DemandedElts.isAllOnes())
3906 if (SimplifyDemandedVectorEltsBinOp(Op0, Op1))
3907 return true;
3908 break;
3909 }
3910 case ISD::MUL:
3911 case ISD::MULHU:
3912 case ISD::MULHS:
3913 case ISD::AND: {
3914 SDValue Op0 = Op.getOperand(0);
3915 SDValue Op1 = Op.getOperand(1);
3916
3917 APInt SrcUndef, SrcZero;
3918 if (SimplifyDemandedVectorElts(Op1, DemandedElts, SrcUndef, SrcZero, TLO,
3919 Depth + 1))
3920 return true;
3921 // FIXME: If we know that a demanded element was zero in Op1 we don't need
3922 // to demand it in Op0 - its guaranteed to be zero. There is however a
3923 // restriction, as we must not make any of the originally demanded elements
3924 // more poisonous. We could reduce amount of elements demanded, but then we
3925 // also need a to inform SimplifyDemandedVectorElts that some elements must
3926 // not be made more poisonous.
3927 if (SimplifyDemandedVectorElts(Op0, DemandedElts, KnownUndef, KnownZero,
3928 TLO, Depth + 1))
3929 return true;
3930
3931 KnownUndef &= DemandedElts;
3932 KnownZero &= DemandedElts;
3933
3934 // If every element pair has a zero/undef/poison then just fold to zero.
3935 // fold (and x, undef/poison) -> 0 / (and x, 0) -> 0
3936 // fold (mul x, undef/poison) -> 0 / (mul x, 0) -> 0
3937 if (DemandedElts.isSubsetOf(SrcZero | KnownZero | SrcUndef | KnownUndef))
3938 return TLO.CombineTo(Op, TLO.DAG.getConstant(0, SDLoc(Op), VT));
3939
3940 // If either side has a zero element, then the result element is zero, even
3941 // if the other is an UNDEF.
3942 // TODO: Extend getKnownUndefForVectorBinop to also deal with known zeros
3943 // and then handle 'and' nodes with the rest of the binop opcodes.
3944 KnownZero |= SrcZero;
3945 KnownUndef &= SrcUndef;
3946 KnownUndef &= ~KnownZero;
3947
3948 // Attempt to avoid multi-use ops if we don't need anything from them.
3949 if (!DemandedElts.isAllOnes())
3950 if (SimplifyDemandedVectorEltsBinOp(Op0, Op1))
3951 return true;
3952 break;
3953 }
3954 case ISD::TRUNCATE:
3955 case ISD::SIGN_EXTEND:
3956 case ISD::ZERO_EXTEND:
3957 if (SimplifyDemandedVectorElts(Op.getOperand(0), DemandedElts, KnownUndef,
3958 KnownZero, TLO, Depth + 1))
3959 return true;
3960
3961 if (!DemandedElts.isAllOnes())
3963 Op.getOperand(0), DemandedElts, TLO.DAG, Depth + 1))
3964 return TLO.CombineTo(Op, TLO.DAG.getNode(Opcode, SDLoc(Op), VT, NewOp));
3965
3966 if (Op.getOpcode() == ISD::ZERO_EXTEND) {
3967 // zext(undef) upper bits are guaranteed to be zero.
3968 if (DemandedElts.isSubsetOf(KnownUndef))
3969 return TLO.CombineTo(Op, TLO.DAG.getConstant(0, SDLoc(Op), VT));
3970 KnownUndef.clearAllBits();
3971 }
3972 break;
3973 case ISD::SINT_TO_FP:
3974 case ISD::UINT_TO_FP:
3975 case ISD::FP_TO_SINT:
3976 case ISD::FP_TO_UINT:
3977 if (SimplifyDemandedVectorElts(Op.getOperand(0), DemandedElts, KnownUndef,
3978 KnownZero, TLO, Depth + 1))
3979 return true;
3980 // Don't fall through to generic undef -> undef handling.
3981 return false;
3982 default: {
3983 if (Op.getOpcode() >= ISD::BUILTIN_OP_END) {
3984 if (SimplifyDemandedVectorEltsForTargetNode(Op, DemandedElts, KnownUndef,
3985 KnownZero, TLO, Depth))
3986 return true;
3987 } else {
3989 APInt DemandedBits = APInt::getAllOnes(EltSizeInBits);
3990 if (SimplifyDemandedBits(Op, DemandedBits, OriginalDemandedElts, Known,
3991 TLO, Depth, AssumeSingleUse))
3992 return true;
3993 }
3994 break;
3995 }
3996 }
3997
3998 assert((KnownUndef & KnownZero) == 0 && "Elements flagged as undef AND zero");
3999
4000 // Constant fold all undef cases.
4001 // TODO: Handle zero cases as well.
4002 if (DemandedElts.isSubsetOf(KnownUndef))
4003 return TLO.CombineTo(Op, TLO.DAG.getUNDEF(VT));
4004
4005 return false;
4006}
4007
4008/// Determine which of the bits specified in Mask are known to be either zero or
4009/// one and return them in the Known.
4012 const APInt &DemandedElts,
4013 const SelectionDAG &DAG,
4014 unsigned Depth) const {
4015 assert((Op.getOpcode() >= ISD::BUILTIN_OP_END ||
4016 Op.getOpcode() == ISD::INTRINSIC_WO_CHAIN ||
4017 Op.getOpcode() == ISD::INTRINSIC_W_CHAIN ||
4018 Op.getOpcode() == ISD::INTRINSIC_VOID) &&
4019 "Should use MaskedValueIsZero if you don't know whether Op"
4020 " is a target node!");
4021 Known.resetAll();
4022}
4023
4026 const APInt &DemandedElts, const MachineRegisterInfo &MRI,
4027 unsigned Depth) const {
4028 Known.resetAll();
4029}
4030
4033 const APInt &DemandedElts, const MachineRegisterInfo &MRI,
4034 unsigned Depth) const {
4035 Known.resetAll();
4036}
4037
4039 KnownBits &Known, const MachineFunction &, Align Alignment) const {
4040 // The low bits are known zero if the pointer is aligned.
4041 Known.Zero.setLowBits(Log2(Alignment));
4042}
4043
4045 SelectionDAG &DAG,
4046 const SDLoc &DL,
4047 Align Alignment) const {
4048 // Materialize leading-zero stack object pointer facts as AssertZext.
4049 // Alignment-derived low zero bits are not represented on the returned DAG
4050 // value here.
4051 EVT PtrVT = Ptr.getValueType();
4052
4053 unsigned RegSize = PtrVT.getScalarSizeInBits();
4056 Alignment);
4057
4058 unsigned NumZeroBits = Known.countMinLeadingZeros();
4059 if (!NumZeroBits)
4060 return Ptr;
4061
4062 EVT FromVT = EVT::getIntegerVT(*DAG.getContext(), RegSize - NumZeroBits);
4063 return DAG.getNode(ISD::AssertZext, DL, PtrVT, Ptr, DAG.getValueType(FromVT));
4064}
4065
4071
4072/// This method can be implemented by targets that want to expose additional
4073/// information about sign bits to the DAG Combiner.
4075 const APInt &,
4076 const SelectionDAG &,
4077 unsigned Depth) const {
4078 assert((Op.getOpcode() >= ISD::BUILTIN_OP_END ||
4079 Op.getOpcode() == ISD::INTRINSIC_WO_CHAIN ||
4080 Op.getOpcode() == ISD::INTRINSIC_W_CHAIN ||
4081 Op.getOpcode() == ISD::INTRINSIC_VOID) &&
4082 "Should use ComputeNumSignBits if you don't know whether Op"
4083 " is a target node!");
4084 return 1;
4085}
4086
4088 GISelValueTracking &Analysis, Register R, const APInt &DemandedElts,
4089 const MachineRegisterInfo &MRI, unsigned Depth) const {
4090 return 1;
4091}
4092
4094 SDValue Op, const APInt &DemandedElts, APInt &KnownUndef, APInt &KnownZero,
4095 TargetLoweringOpt &TLO, unsigned Depth) const {
4096 assert((Op.getOpcode() >= ISD::BUILTIN_OP_END ||
4097 Op.getOpcode() == ISD::INTRINSIC_WO_CHAIN ||
4098 Op.getOpcode() == ISD::INTRINSIC_W_CHAIN ||
4099 Op.getOpcode() == ISD::INTRINSIC_VOID) &&
4100 "Should use SimplifyDemandedVectorElts if you don't know whether Op"
4101 " is a target node!");
4102 return false;
4103}
4104
4106 SDValue Op, const APInt &DemandedBits, const APInt &DemandedElts,
4107 KnownBits &Known, TargetLoweringOpt &TLO, unsigned Depth) const {
4108 assert((Op.getOpcode() >= ISD::BUILTIN_OP_END ||
4109 Op.getOpcode() == ISD::INTRINSIC_WO_CHAIN ||
4110 Op.getOpcode() == ISD::INTRINSIC_W_CHAIN ||
4111 Op.getOpcode() == ISD::INTRINSIC_VOID) &&
4112 "Should use SimplifyDemandedBits if you don't know whether Op"
4113 " is a target node!");
4114 computeKnownBitsForTargetNode(Op, Known, DemandedElts, TLO.DAG, Depth);
4115 return false;
4116}
4117
4119 SDValue Op, const APInt &DemandedBits, const APInt &DemandedElts,
4120 SelectionDAG &DAG, unsigned Depth) const {
4121 assert(
4122 (Op.getOpcode() >= ISD::BUILTIN_OP_END ||
4123 Op.getOpcode() == ISD::INTRINSIC_WO_CHAIN ||
4124 Op.getOpcode() == ISD::INTRINSIC_W_CHAIN ||
4125 Op.getOpcode() == ISD::INTRINSIC_VOID) &&
4126 "Should use SimplifyMultipleUseDemandedBits if you don't know whether Op"
4127 " is a target node!");
4128 return SDValue();
4129}
4130
4131SDValue
4134 SelectionDAG &DAG) const {
4135 bool LegalMask = isShuffleMaskLegal(Mask, VT);
4136 if (!LegalMask) {
4137 std::swap(N0, N1);
4139 LegalMask = isShuffleMaskLegal(Mask, VT);
4140 }
4141
4142 if (!LegalMask)
4143 return SDValue();
4144
4145 return DAG.getVectorShuffle(VT, DL, N0, N1, Mask);
4146}
4147
4149 return nullptr;
4150}
4151
4153 SDValue Op, const APInt &DemandedElts, const SelectionDAG &DAG,
4154 UndefPoisonKind Kind, unsigned Depth) const {
4155 assert(
4156 (Op.getOpcode() >= ISD::BUILTIN_OP_END ||
4157 Op.getOpcode() == ISD::INTRINSIC_WO_CHAIN ||
4158 Op.getOpcode() == ISD::INTRINSIC_W_CHAIN ||
4159 Op.getOpcode() == ISD::INTRINSIC_VOID) &&
4160 "Should use isGuaranteedNotToBeUndefOrPoison if you don't know whether Op"
4161 " is a target node!");
4162
4163 // If Op can't create undef/poison and none of its operands are undef/poison
4164 // then Op is never undef/poison.
4165 return !canCreateUndefOrPoisonForTargetNode(Op, DemandedElts, DAG, Kind,
4166 /*ConsiderFlags*/ true, Depth) &&
4167 all_of(Op->ops(), [&](SDValue V) {
4168 return DAG.isGuaranteedNotToBeUndefOrPoison(V, Kind, Depth + 1);
4169 });
4170}
4171
4173 SDValue Op, const APInt &DemandedElts, const SelectionDAG &DAG,
4174 UndefPoisonKind Kind, bool ConsiderFlags, unsigned Depth) const {
4175 assert((Op.getOpcode() >= ISD::BUILTIN_OP_END ||
4176 Op.getOpcode() == ISD::INTRINSIC_WO_CHAIN ||
4177 Op.getOpcode() == ISD::INTRINSIC_W_CHAIN ||
4178 Op.getOpcode() == ISD::INTRINSIC_VOID) &&
4179 "Should use canCreateUndefOrPoison if you don't know whether Op"
4180 " is a target node!");
4181 // Be conservative and return true.
4182 return true;
4183}
4184
4187 const APInt &DemandedElts,
4188 const SelectionDAG &DAG,
4189 unsigned Depth) const {
4190 assert((Op.getOpcode() >= ISD::BUILTIN_OP_END ||
4191 Op.getOpcode() == ISD::INTRINSIC_WO_CHAIN ||
4192 Op.getOpcode() == ISD::INTRINSIC_W_CHAIN ||
4193 Op.getOpcode() == ISD::INTRINSIC_VOID) &&
4194 "Should use computeKnownFPClass if you don't know whether Op"
4195 " is a target node!");
4196}
4197
4199 const APInt &DemandedElts,
4200 const SelectionDAG &DAG,
4201 bool SNaN,
4202 unsigned Depth) const {
4203 assert((Op.getOpcode() >= ISD::BUILTIN_OP_END ||
4204 Op.getOpcode() == ISD::INTRINSIC_WO_CHAIN ||
4205 Op.getOpcode() == ISD::INTRINSIC_W_CHAIN ||
4206 Op.getOpcode() == ISD::INTRINSIC_VOID) &&
4207 "Should use isKnownNeverNaN if you don't know whether Op"
4208 " is a target node!");
4209 return false;
4210}
4211
4213 const APInt &DemandedElts,
4214 APInt &UndefElts,
4215 const SelectionDAG &DAG,
4216 unsigned Depth) const {
4217 assert((Op.getOpcode() >= ISD::BUILTIN_OP_END ||
4218 Op.getOpcode() == ISD::INTRINSIC_WO_CHAIN ||
4219 Op.getOpcode() == ISD::INTRINSIC_W_CHAIN ||
4220 Op.getOpcode() == ISD::INTRINSIC_VOID) &&
4221 "Should use isSplatValue if you don't know whether Op"
4222 " is a target node!");
4223 return false;
4224}
4225
4226// FIXME: Ideally, this would use ISD::isConstantSplatVector(), but that must
4227// work with truncating build vectors and vectors with elements of less than
4228// 8 bits.
4230 if (!N)
4231 return false;
4232
4233 unsigned EltWidth;
4234 APInt CVal;
4235 if (ConstantSDNode *CN = isConstOrConstSplat(N, /*AllowUndefs=*/false,
4236 /*AllowTruncation=*/true)) {
4237 CVal = CN->getAPIntValue();
4238 EltWidth = N.getValueType().getScalarSizeInBits();
4239 } else
4240 return false;
4241
4242 // If this is a truncating splat, truncate the splat value.
4243 // Otherwise, we may fail to match the expected values below.
4244 if (EltWidth < CVal.getBitWidth())
4245 CVal = CVal.trunc(EltWidth);
4246
4247 switch (getBooleanContents(N.getValueType())) {
4249 return CVal[0];
4251 return CVal.isOne();
4253 return CVal.isAllOnes();
4254 }
4255
4256 llvm_unreachable("Invalid boolean contents");
4257}
4258
4260 if (!N)
4261 return false;
4262
4264 if (!CN) {
4266 if (!BV)
4267 return false;
4268
4269 // Only interested in constant splats, we don't care about undef
4270 // elements in identifying boolean constants and getConstantSplatNode
4271 // returns NULL if all ops are undef;
4272 CN = BV->getConstantSplatNode();
4273 if (!CN)
4274 return false;
4275 }
4276
4277 if (getBooleanContents(N->getValueType(0)) == UndefinedBooleanContent)
4278 return !CN->getAPIntValue()[0];
4279
4280 return CN->isZero();
4281}
4282
4284 bool SExt) const {
4285 if (VT == MVT::i1)
4286 return N->isOne();
4287
4289 switch (Cnt) {
4291 // An extended value of 1 is always true, unless its original type is i1,
4292 // in which case it will be sign extended to -1.
4293 return (N->isOne() && !SExt) || (SExt && (N->getValueType(0) != MVT::i1));
4296 return N->isAllOnes() && SExt;
4297 }
4298 llvm_unreachable("Unexpected enumeration.");
4299}
4300
4301/// This helper function of SimplifySetCC tries to optimize the comparison when
4302/// either operand of the SetCC node is a bitwise-and instruction.
4303SDValue TargetLowering::foldSetCCWithAnd(EVT VT, SDValue N0, SDValue N1,
4304 ISD::CondCode Cond, const SDLoc &DL,
4305 DAGCombinerInfo &DCI) const {
4306 if (N1.getOpcode() == ISD::AND && N0.getOpcode() != ISD::AND)
4307 std::swap(N0, N1);
4308
4309 SelectionDAG &DAG = DCI.DAG;
4310 EVT OpVT = N0.getValueType();
4311 if (N0.getOpcode() != ISD::AND || !OpVT.isInteger() ||
4312 (Cond != ISD::SETEQ && Cond != ISD::SETNE))
4313 return SDValue();
4314
4315 // (X & Y) != 0 --> zextOrTrunc(X & Y)
4316 // iff everything but LSB is known zero:
4317 if (Cond == ISD::SETNE && isNullConstant(N1) &&
4320 unsigned NumEltBits = OpVT.getScalarSizeInBits();
4321 APInt UpperBits = APInt::getHighBitsSet(NumEltBits, NumEltBits - 1);
4322 if (DAG.MaskedValueIsZero(N0, UpperBits))
4323 return DAG.getBoolExtOrTrunc(N0, DL, VT, OpVT);
4324 }
4325
4326 // Try to eliminate a power-of-2 mask constant by converting to a signbit
4327 // test in a narrow type that we can truncate to with no cost. Examples:
4328 // (i32 X & 32768) == 0 --> (trunc X to i16) >= 0
4329 // (i32 X & 32768) != 0 --> (trunc X to i16) < 0
4330 // TODO: This conservatively checks for type legality on the source and
4331 // destination types. That may inhibit optimizations, but it also
4332 // allows setcc->shift transforms that may be more beneficial.
4333 auto *AndC = dyn_cast<ConstantSDNode>(N0.getOperand(1));
4334 if (AndC && isNullConstant(N1) && AndC->getAPIntValue().isPowerOf2() &&
4335 isTypeLegal(OpVT) && N0.hasOneUse()) {
4336 EVT NarrowVT = EVT::getIntegerVT(*DAG.getContext(),
4337 AndC->getAPIntValue().getActiveBits());
4338 if (isTruncateFree(OpVT, NarrowVT) && isTypeLegal(NarrowVT)) {
4339 SDValue Trunc = DAG.getZExtOrTrunc(N0.getOperand(0), DL, NarrowVT);
4340 SDValue Zero = DAG.getConstant(0, DL, NarrowVT);
4341 return DAG.getSetCC(DL, VT, Trunc, Zero,
4343 }
4344 }
4345
4346 // Match these patterns in any of their permutations:
4347 // (X & Y) == Y
4348 // (X & Y) != Y
4349 SDValue X, Y;
4350 if (N0.getOperand(0) == N1) {
4351 X = N0.getOperand(1);
4352 Y = N0.getOperand(0);
4353 } else if (N0.getOperand(1) == N1) {
4354 X = N0.getOperand(0);
4355 Y = N0.getOperand(1);
4356 } else {
4357 return SDValue();
4358 }
4359
4360 // TODO: We should invert (X & Y) eq/ne 0 -> (X & Y) ne/eq Y if
4361 // `isXAndYEqZeroPreferableToXAndYEqY` is false. This is a bit difficult as
4362 // its liable to create and infinite loop.
4363 SDValue Zero = DAG.getConstant(0, DL, OpVT);
4364 if (isXAndYEqZeroPreferableToXAndYEqY(Cond, OpVT) &&
4366 // Simplify X & Y == Y to X & Y != 0 if Y has exactly one bit set.
4367 // Note that where Y is variable and is known to have at most one bit set
4368 // (for example, if it is Z & 1) we cannot do this; the expressions are not
4369 // equivalent when Y == 0.
4370 assert(OpVT.isInteger());
4372 if (DCI.isBeforeLegalizeOps() ||
4374 return DAG.getSetCC(DL, VT, N0, Zero, Cond);
4375 } else if (N0.hasOneUse() && hasAndNotCompare(Y)) {
4376 // If the target supports an 'and-not' or 'and-complement' logic operation,
4377 // try to use that to make a comparison operation more efficient.
4378 // But don't do this transform if the mask is a single bit because there are
4379 // more efficient ways to deal with that case (for example, 'bt' on x86 or
4380 // 'rlwinm' on PPC).
4381
4382 // Bail out if the compare operand that we want to turn into a zero is
4383 // already a zero (otherwise, infinite loop).
4384 if (isNullConstant(Y))
4385 return SDValue();
4386
4387 // Transform this into: ~X & Y == 0.
4388 SDValue NotX = DAG.getNOT(SDLoc(X), X, OpVT);
4389 SDValue NewAnd = DAG.getNode(ISD::AND, SDLoc(N0), OpVT, NotX, Y);
4390 return DAG.getSetCC(DL, VT, NewAnd, Zero, Cond);
4391 }
4392
4393 return SDValue();
4394}
4395
4396/// This helper function of SimplifySetCC tries to optimize the comparison when
4397/// either operand of the SetCC node is a bitwise-or instruction.
4398/// For now, this just transforms (X | Y) ==/!= Y into X & ~Y ==/!= 0.
4399SDValue TargetLowering::foldSetCCWithOr(EVT VT, SDValue N0, SDValue N1,
4400 ISD::CondCode Cond, const SDLoc &DL,
4401 DAGCombinerInfo &DCI) const {
4402 if (N1.getOpcode() == ISD::OR && N0.getOpcode() != ISD::OR)
4403 std::swap(N0, N1);
4404
4405 SelectionDAG &DAG = DCI.DAG;
4406 EVT OpVT = N0.getValueType();
4407 if (!N0.hasOneUse() || !OpVT.isInteger() ||
4408 (Cond != ISD::SETEQ && Cond != ISD::SETNE))
4409 return SDValue();
4410
4411 // (X | Y) == Y
4412 // (X | Y) != Y
4413 SDValue X;
4414 if (sd_match(N0, m_Or(m_Value(X), m_Specific(N1))) && hasAndNotCompare(X)) {
4415 // If the target supports an 'and-not' or 'and-complement' logic operation,
4416 // try to use that to make a comparison operation more efficient.
4417
4418 // Bail out if the compare operand that we want to turn into a zero is
4419 // already a zero (otherwise, infinite loop).
4420 if (isNullConstant(N1))
4421 return SDValue();
4422
4423 // Transform this into: X & ~Y ==/!= 0.
4424 SDValue NotY = DAG.getNOT(SDLoc(N1), N1, OpVT);
4425 SDValue NewAnd = DAG.getNode(ISD::AND, SDLoc(N0), OpVT, X, NotY);
4426 return DAG.getSetCC(DL, VT, NewAnd, DAG.getConstant(0, DL, OpVT), Cond);
4427 }
4428
4429 return SDValue();
4430}
4431
4432/// There are multiple IR patterns that could be checking whether certain
4433/// truncation of a signed number would be lossy or not. The pattern which is
4434/// best at IR level, may not lower optimally. Thus, we want to unfold it.
4435/// We are looking for the following pattern: (KeptBits is a constant)
4436/// (add %x, (1 << (KeptBits-1))) srccond (1 << KeptBits)
4437/// KeptBits won't be bitwidth(x), that will be constant-folded to true/false.
4438/// KeptBits also can't be 1, that would have been folded to %x dstcond 0
4439/// We will unfold it into the natural trunc+sext pattern:
4440/// ((%x << C) a>> C) dstcond %x
4441/// Where C = bitwidth(x) - KeptBits and C u< bitwidth(x)
4442SDValue TargetLowering::optimizeSetCCOfSignedTruncationCheck(
4443 EVT SCCVT, SDValue N0, SDValue N1, ISD::CondCode Cond, DAGCombinerInfo &DCI,
4444 const SDLoc &DL) const {
4445 // We must be comparing with a constant.
4446 ConstantSDNode *C1;
4447 if (!(C1 = dyn_cast<ConstantSDNode>(N1)))
4448 return SDValue();
4449
4450 // N0 should be: add %x, (1 << (KeptBits-1))
4451 if (N0->getOpcode() != ISD::ADD)
4452 return SDValue();
4453
4454 // And we must be 'add'ing a constant.
4455 ConstantSDNode *C01;
4456 if (!(C01 = dyn_cast<ConstantSDNode>(N0->getOperand(1))))
4457 return SDValue();
4458
4459 SDValue X = N0->getOperand(0);
4460 EVT XVT = X.getValueType();
4461
4462 // Validate constants ...
4463
4464 APInt I1 = C1->getAPIntValue();
4465
4466 ISD::CondCode NewCond;
4467 if (Cond == ISD::CondCode::SETULT) {
4468 NewCond = ISD::CondCode::SETEQ;
4469 } else if (Cond == ISD::CondCode::SETULE) {
4470 NewCond = ISD::CondCode::SETEQ;
4471 // But need to 'canonicalize' the constant.
4472 I1 += 1;
4473 } else if (Cond == ISD::CondCode::SETUGT) {
4474 NewCond = ISD::CondCode::SETNE;
4475 // But need to 'canonicalize' the constant.
4476 I1 += 1;
4477 } else if (Cond == ISD::CondCode::SETUGE) {
4478 NewCond = ISD::CondCode::SETNE;
4479 } else
4480 return SDValue();
4481
4482 APInt I01 = C01->getAPIntValue();
4483
4484 auto checkConstants = [&I1, &I01]() -> bool {
4485 // Both of them must be power-of-two, and the constant from setcc is bigger.
4486 return I1.ugt(I01) && I1.isPowerOf2() && I01.isPowerOf2();
4487 };
4488
4489 if (checkConstants()) {
4490 // Great, e.g. got icmp ult i16 (add i16 %x, 128), 256
4491 } else {
4492 // What if we invert constants? (and the target predicate)
4493 I1.negate();
4494 I01.negate();
4495 assert(XVT.isInteger());
4496 NewCond = getSetCCInverse(NewCond, XVT);
4497 if (!checkConstants())
4498 return SDValue();
4499 // Great, e.g. got icmp uge i16 (add i16 %x, -128), -256
4500 }
4501
4502 // They are power-of-two, so which bit is set?
4503 const unsigned KeptBits = I1.logBase2();
4504 const unsigned KeptBitsMinusOne = I01.logBase2();
4505
4506 // Magic!
4507 if (KeptBits != (KeptBitsMinusOne + 1))
4508 return SDValue();
4509 assert(KeptBits > 0 && KeptBits < XVT.getSizeInBits() && "unreachable");
4510
4511 // We don't want to do this in every single case.
4512 SelectionDAG &DAG = DCI.DAG;
4513 if (!shouldTransformSignedTruncationCheck(XVT, KeptBits))
4514 return SDValue();
4515
4516 // Unfold into: sext_inreg(%x) cond %x
4517 // Where 'cond' will be either 'eq' or 'ne'.
4518 SDValue SExtInReg = DAG.getNode(
4520 DAG.getValueType(EVT::getIntegerVT(*DAG.getContext(), KeptBits)));
4521 return DAG.getSetCC(DL, SCCVT, SExtInReg, X, NewCond);
4522}
4523
4524// (X & (C l>>/<< Y)) ==/!= 0 --> ((X <</l>> Y) & C) ==/!= 0
4525SDValue TargetLowering::optimizeSetCCByHoistingAndByConstFromLogicalShift(
4526 EVT SCCVT, SDValue N0, SDValue N1C, ISD::CondCode Cond,
4527 DAGCombinerInfo &DCI, const SDLoc &DL) const {
4529 "Should be a comparison with 0.");
4530 assert((Cond == ISD::SETEQ || Cond == ISD::SETNE) &&
4531 "Valid only for [in]equality comparisons.");
4532
4533 unsigned NewShiftOpcode;
4534 SDValue X, C, Y;
4535
4536 SelectionDAG &DAG = DCI.DAG;
4537
4538 // Look for '(C l>>/<< Y)'.
4539 auto Match = [&NewShiftOpcode, &X, &C, &Y, &DAG, this](SDValue V) {
4540 // The shift should be one-use.
4541 if (!V.hasOneUse())
4542 return false;
4543 unsigned OldShiftOpcode = V.getOpcode();
4544 switch (OldShiftOpcode) {
4545 case ISD::SHL:
4546 NewShiftOpcode = ISD::SRL;
4547 break;
4548 case ISD::SRL:
4549 NewShiftOpcode = ISD::SHL;
4550 break;
4551 default:
4552 return false; // must be a logical shift.
4553 }
4554 // We should be shifting a constant.
4555 // FIXME: best to use isConstantOrConstantVector().
4556 C = V.getOperand(0);
4557 ConstantSDNode *CC =
4558 isConstOrConstSplat(C, /*AllowUndefs=*/true, /*AllowTruncation=*/true);
4559 if (!CC)
4560 return false;
4561 Y = V.getOperand(1);
4562
4563 ConstantSDNode *XC =
4564 isConstOrConstSplat(X, /*AllowUndefs=*/true, /*AllowTruncation=*/true);
4566 X, XC, CC, Y, OldShiftOpcode, NewShiftOpcode, DAG);
4567 };
4568
4569 // LHS of comparison should be an one-use 'and'.
4570 if (N0.getOpcode() != ISD::AND || !N0.hasOneUse())
4571 return SDValue();
4572
4573 X = N0.getOperand(0);
4574 SDValue Mask = N0.getOperand(1);
4575
4576 // 'and' is commutative!
4577 if (!Match(Mask)) {
4578 std::swap(X, Mask);
4579 if (!Match(Mask))
4580 return SDValue();
4581 }
4582
4583 EVT VT = X.getValueType();
4584
4585 // Produce:
4586 // ((X 'OppositeShiftOpcode' Y) & C) Cond 0
4587 SDValue T0 = DAG.getNode(NewShiftOpcode, DL, VT, X, Y);
4588 SDValue T1 = DAG.getNode(ISD::AND, DL, VT, T0, C);
4589 SDValue T2 = DAG.getSetCC(DL, SCCVT, T1, N1C, Cond);
4590 return T2;
4591}
4592
4593/// Try to fold an equality comparison with a {add/sub/xor} binary operation as
4594/// the 1st operand (N0). Callers are expected to swap the N0/N1 parameters to
4595/// handle the commuted versions of these patterns.
4596SDValue TargetLowering::foldSetCCWithBinOp(EVT VT, SDValue N0, SDValue N1,
4597 ISD::CondCode Cond, const SDLoc &DL,
4598 DAGCombinerInfo &DCI) const {
4599 unsigned BOpcode = N0.getOpcode();
4600 assert((BOpcode == ISD::ADD || BOpcode == ISD::SUB || BOpcode == ISD::XOR) &&
4601 "Unexpected binop");
4602 assert((Cond == ISD::SETEQ || Cond == ISD::SETNE) && "Unexpected condcode");
4603
4604 // (X + Y) == X --> Y == 0
4605 // (X - Y) == X --> Y == 0
4606 // (X ^ Y) == X --> Y == 0
4607 SelectionDAG &DAG = DCI.DAG;
4608 EVT OpVT = N0.getValueType();
4609 SDValue X = N0.getOperand(0);
4610 SDValue Y = N0.getOperand(1);
4611 if (X == N1)
4612 return DAG.getSetCC(DL, VT, Y, DAG.getConstant(0, DL, OpVT), Cond);
4613
4614 if (Y != N1)
4615 return SDValue();
4616
4617 // (X + Y) == Y --> X == 0
4618 // (X ^ Y) == Y --> X == 0
4619 if (BOpcode == ISD::ADD || BOpcode == ISD::XOR)
4620 return DAG.getSetCC(DL, VT, X, DAG.getConstant(0, DL, OpVT), Cond);
4621
4622 // The shift would not be valid if the operands are boolean (i1).
4623 if (!N0.hasOneUse() || OpVT.getScalarSizeInBits() == 1)
4624 return SDValue();
4625
4626 // (X - Y) == Y --> X == Y << 1
4627 SDValue One = DAG.getShiftAmountConstant(1, OpVT, DL);
4628 SDValue YShl1 = DAG.getNode(ISD::SHL, DL, N1.getValueType(), Y, One);
4629 if (!DCI.isCalledByLegalizer())
4630 DCI.AddToWorklist(YShl1.getNode());
4631 return DAG.getSetCC(DL, VT, X, YShl1, Cond);
4632}
4633
4635 SDValue N0, const APInt &C1,
4636 ISD::CondCode Cond, const SDLoc &dl,
4637 SelectionDAG &DAG) {
4638 // Look through truncs that don't change the value of a ctpop.
4639 // FIXME: Add vector support? Need to be careful with setcc result type below.
4640 SDValue CTPOP = N0;
4641 if (N0.getOpcode() == ISD::TRUNCATE && N0.hasOneUse() && !VT.isVector() &&
4643 CTPOP = N0.getOperand(0);
4644
4645 if (CTPOP.getOpcode() != ISD::CTPOP || !CTPOP.hasOneUse())
4646 return SDValue();
4647
4648 EVT CTVT = CTPOP.getValueType();
4649 SDValue CTOp = CTPOP.getOperand(0);
4650
4651 // Expand a power-of-2-or-zero comparison based on ctpop:
4652 // (ctpop x) u< 2 -> (x & x-1) == 0
4653 // (ctpop x) u> 1 -> (x & x-1) != 0
4654 if (Cond == ISD::SETULT || Cond == ISD::SETUGT) {
4655 // Keep the CTPOP if it is a cheap vector op.
4656 if (CTVT.isVector() && TLI.isCtpopFast(CTVT))
4657 return SDValue();
4658
4659 unsigned CostLimit = TLI.getCustomCtpopCost(CTVT, Cond);
4660 if (C1.ugt(CostLimit + (Cond == ISD::SETULT)))
4661 return SDValue();
4662 if (C1 == 0 && (Cond == ISD::SETULT))
4663 return SDValue(); // This is handled elsewhere.
4664
4665 unsigned Passes = C1.getLimitedValue() - (Cond == ISD::SETULT);
4666
4667 SDValue NegOne = DAG.getAllOnesConstant(dl, CTVT);
4668 SDValue Result = CTOp;
4669 for (unsigned i = 0; i < Passes; i++) {
4670 SDValue Add = DAG.getNode(ISD::ADD, dl, CTVT, Result, NegOne);
4671 Result = DAG.getNode(ISD::AND, dl, CTVT, Result, Add);
4672 }
4674 return DAG.getSetCC(dl, VT, Result, DAG.getConstant(0, dl, CTVT), CC);
4675 }
4676
4677 // Expand a power-of-2 comparison based on ctpop
4678 if ((Cond == ISD::SETEQ || Cond == ISD::SETNE) && C1 == 1) {
4679 // Keep the CTPOP if it is cheap.
4680 if (TLI.isCtpopFast(CTVT))
4681 return SDValue();
4682
4683 SDValue Zero = DAG.getConstant(0, dl, CTVT);
4684 SDValue NegOne = DAG.getAllOnesConstant(dl, CTVT);
4685 assert(CTVT.isInteger());
4686 SDValue Add = DAG.getNode(ISD::ADD, dl, CTVT, CTOp, NegOne);
4687
4688 // Its not uncommon for known-never-zero X to exist in (ctpop X) eq/ne 1, so
4689 // check before emitting a potentially unnecessary op.
4690 if (DAG.isKnownNeverZero(CTOp)) {
4691 // (ctpop x) == 1 --> (x & x-1) == 0
4692 // (ctpop x) != 1 --> (x & x-1) != 0
4693 SDValue And = DAG.getNode(ISD::AND, dl, CTVT, CTOp, Add);
4694 SDValue RHS = DAG.getSetCC(dl, VT, And, Zero, Cond);
4695 return RHS;
4696 }
4697
4698 // (ctpop x) == 1 --> (x ^ x-1) > x-1
4699 // (ctpop x) != 1 --> (x ^ x-1) <= x-1
4700 SDValue Xor = DAG.getNode(ISD::XOR, dl, CTVT, CTOp, Add);
4702 return DAG.getSetCC(dl, VT, Xor, Add, CmpCond);
4703 }
4704
4705 return SDValue();
4706}
4707
4709 ISD::CondCode Cond, const SDLoc &dl,
4710 SelectionDAG &DAG) {
4711 if (Cond != ISD::SETEQ && Cond != ISD::SETNE)
4712 return SDValue();
4713
4714 auto *C1 = isConstOrConstSplat(N1, /* AllowUndefs */ true);
4715 if (!C1 || !(C1->isZero() || C1->isAllOnes()))
4716 return SDValue();
4717
4718 auto getRotateSource = [](SDValue X) {
4719 if (X.getOpcode() == ISD::ROTL || X.getOpcode() == ISD::ROTR)
4720 return X.getOperand(0);
4721 return SDValue();
4722 };
4723
4724 // Peek through a rotated value compared against 0 or -1:
4725 // (rot X, Y) == 0/-1 --> X == 0/-1
4726 // (rot X, Y) != 0/-1 --> X != 0/-1
4727 if (SDValue R = getRotateSource(N0))
4728 return DAG.getSetCC(dl, VT, R, N1, Cond);
4729
4730 // Peek through an 'or' of a rotated value compared against 0:
4731 // or (rot X, Y), Z ==/!= 0 --> (or X, Z) ==/!= 0
4732 // or Z, (rot X, Y) ==/!= 0 --> (or X, Z) ==/!= 0
4733 //
4734 // TODO: Add the 'and' with -1 sibling.
4735 // TODO: Recurse through a series of 'or' ops to find the rotate.
4736 EVT OpVT = N0.getValueType();
4737 if (N0.hasOneUse() && N0.getOpcode() == ISD::OR && C1->isZero()) {
4738 if (SDValue R = getRotateSource(N0.getOperand(0))) {
4739 SDValue NewOr = DAG.getNode(ISD::OR, dl, OpVT, R, N0.getOperand(1));
4740 return DAG.getSetCC(dl, VT, NewOr, N1, Cond);
4741 }
4742 if (SDValue R = getRotateSource(N0.getOperand(1))) {
4743 SDValue NewOr = DAG.getNode(ISD::OR, dl, OpVT, R, N0.getOperand(0));
4744 return DAG.getSetCC(dl, VT, NewOr, N1, Cond);
4745 }
4746 }
4747
4748 return SDValue();
4749}
4750
4752 ISD::CondCode Cond, const SDLoc &dl,
4753 SelectionDAG &DAG) {
4754 // If we are testing for all-bits-clear, we might be able to do that with
4755 // less shifting since bit-order does not matter.
4756 if (Cond != ISD::SETEQ && Cond != ISD::SETNE)
4757 return SDValue();
4758
4759 auto *C1 = isConstOrConstSplat(N1, /* AllowUndefs */ true);
4760 if (!C1 || !C1->isZero())
4761 return SDValue();
4762
4763 if (!N0.hasOneUse() ||
4764 (N0.getOpcode() != ISD::FSHL && N0.getOpcode() != ISD::FSHR))
4765 return SDValue();
4766
4767 unsigned BitWidth = N0.getScalarValueSizeInBits();
4768 auto *ShAmtC = isConstOrConstSplat(N0.getOperand(2));
4769 if (!ShAmtC)
4770 return SDValue();
4771
4772 uint64_t ShAmt = ShAmtC->getAPIntValue().urem(BitWidth);
4773 if (ShAmt == 0)
4774 return SDValue();
4775
4776 // Canonicalize fshr as fshl to reduce pattern-matching.
4777 if (N0.getOpcode() == ISD::FSHR)
4778 ShAmt = BitWidth - ShAmt;
4779
4780 // Match an 'or' with a specific operand 'Other' in either commuted variant.
4781 SDValue X, Y;
4782 auto matchOr = [&X, &Y](SDValue Or, SDValue Other) {
4783 if (Or.getOpcode() != ISD::OR || !Or.hasOneUse())
4784 return false;
4785 if (Or.getOperand(0) == Other) {
4786 X = Or.getOperand(0);
4787 Y = Or.getOperand(1);
4788 return true;
4789 }
4790 if (Or.getOperand(1) == Other) {
4791 X = Or.getOperand(1);
4792 Y = Or.getOperand(0);
4793 return true;
4794 }
4795 return false;
4796 };
4797
4798 EVT OpVT = N0.getValueType();
4799 EVT ShAmtVT = N0.getOperand(2).getValueType();
4800 SDValue F0 = N0.getOperand(0);
4801 SDValue F1 = N0.getOperand(1);
4802 if (matchOr(F0, F1)) {
4803 // fshl (or X, Y), X, C ==/!= 0 --> or (shl Y, C), X ==/!= 0
4804 SDValue NewShAmt = DAG.getConstant(ShAmt, dl, ShAmtVT);
4805 SDValue Shift = DAG.getNode(ISD::SHL, dl, OpVT, Y, NewShAmt);
4806 SDValue NewOr = DAG.getNode(ISD::OR, dl, OpVT, Shift, X);
4807 return DAG.getSetCC(dl, VT, NewOr, N1, Cond);
4808 }
4809 if (matchOr(F1, F0)) {
4810 // fshl X, (or X, Y), C ==/!= 0 --> or (srl Y, BW-C), X ==/!= 0
4811 SDValue NewShAmt = DAG.getConstant(BitWidth - ShAmt, dl, ShAmtVT);
4812 SDValue Shift = DAG.getNode(ISD::SRL, dl, OpVT, Y, NewShAmt);
4813 SDValue NewOr = DAG.getNode(ISD::OR, dl, OpVT, Shift, X);
4814 return DAG.getSetCC(dl, VT, NewOr, N1, Cond);
4815 }
4816
4817 return SDValue();
4818}
4819
4820/// Try to simplify a setcc built with the specified operands and cc. If it is
4821/// unable to simplify it, return a null SDValue.
4823 ISD::CondCode Cond, bool foldBooleans,
4824 DAGCombinerInfo &DCI,
4825 const SDLoc &dl) const {
4826 SelectionDAG &DAG = DCI.DAG;
4827 const DataLayout &Layout = DAG.getDataLayout();
4828 EVT OpVT = N0.getValueType();
4829 AttributeList Attr = DAG.getMachineFunction().getFunction().getAttributes();
4830
4831 // Constant fold or commute setcc.
4832 if (SDValue Fold = DAG.FoldSetCC(VT, N0, N1, Cond, dl))
4833 return Fold;
4834
4835 bool N0ConstOrSplat =
4836 isConstOrConstSplat(N0, /*AllowUndefs*/ false, /*AllowTruncate*/ true);
4837 bool N1ConstOrSplat =
4838 isConstOrConstSplat(N1, /*AllowUndefs*/ false, /*AllowTruncate*/ true);
4839
4840 // Canonicalize toward having the constant on the RHS.
4841 // TODO: Handle non-splat vector constants. All undef causes trouble.
4842 // FIXME: We can't yet fold constant scalable vector splats, so avoid an
4843 // infinite loop here when we encounter one.
4845 if (N0ConstOrSplat && !N1ConstOrSplat &&
4846 (DCI.isBeforeLegalizeOps() ||
4847 isCondCodeLegal(SwappedCC, N0.getSimpleValueType())))
4848 return DAG.getSetCC(dl, VT, N1, N0, SwappedCC);
4849
4850 // If we have a subtract with the same 2 non-constant operands as this setcc
4851 // -- but in reverse order -- then try to commute the operands of this setcc
4852 // to match. A matching pair of setcc (cmp) and sub may be combined into 1
4853 // instruction on some targets.
4854 if (!N0ConstOrSplat && !N1ConstOrSplat &&
4855 (DCI.isBeforeLegalizeOps() ||
4856 isCondCodeLegal(SwappedCC, N0.getSimpleValueType())) &&
4857 DAG.doesNodeExist(ISD::SUB, DAG.getVTList(OpVT), {N1, N0}) &&
4858 !DAG.doesNodeExist(ISD::SUB, DAG.getVTList(OpVT), {N0, N1}))
4859 return DAG.getSetCC(dl, VT, N1, N0, SwappedCC);
4860
4861 if (SDValue V = foldSetCCWithRotate(VT, N0, N1, Cond, dl, DAG))
4862 return V;
4863
4864 if (SDValue V = foldSetCCWithFunnelShift(VT, N0, N1, Cond, dl, DAG))
4865 return V;
4866
4867 if (auto *N1C = isConstOrConstSplat(N1)) {
4868 const APInt &C1 = N1C->getAPIntValue();
4869
4870 // Optimize some CTPOP cases.
4871 if (SDValue V = simplifySetCCWithCTPOP(*this, VT, N0, C1, Cond, dl, DAG))
4872 return V;
4873
4874 // For equality to 0 of a no-wrap multiply, decompose and test each op:
4875 // X * Y == 0 --> (X == 0) || (Y == 0)
4876 // X * Y != 0 --> (X != 0) && (Y != 0)
4877 // TODO: This bails out if minsize is set, but if the target doesn't have a
4878 // single instruction multiply for this type, it would likely be
4879 // smaller to decompose.
4880 if (C1.isZero() && (Cond == ISD::SETEQ || Cond == ISD::SETNE) &&
4881 N0.getOpcode() == ISD::MUL && N0.hasOneUse() &&
4882 (N0->getFlags().hasNoUnsignedWrap() ||
4883 N0->getFlags().hasNoSignedWrap()) &&
4884 !Attr.hasFnAttr(Attribute::MinSize)) {
4885 SDValue IsXZero = DAG.getSetCC(dl, VT, N0.getOperand(0), N1, Cond);
4886 SDValue IsYZero = DAG.getSetCC(dl, VT, N0.getOperand(1), N1, Cond);
4887 unsigned LogicOp = Cond == ISD::SETEQ ? ISD::OR : ISD::AND;
4888 return DAG.getNode(LogicOp, dl, VT, IsXZero, IsYZero);
4889 }
4890
4891 // If the LHS is '(srl (ctlz x), 5)', the RHS is 0/1, and this is an
4892 // equality comparison, then we're just comparing whether X itself is
4893 // zero.
4894 if (N0.getOpcode() == ISD::SRL && (C1.isZero() || C1.isOne()) &&
4895 N0.getOperand(0).getOpcode() == ISD::CTLZ &&
4897 if (ConstantSDNode *ShAmt = isConstOrConstSplat(N0.getOperand(1))) {
4898 if ((Cond == ISD::SETEQ || Cond == ISD::SETNE) &&
4899 ShAmt->getAPIntValue() == Log2_32(N0.getScalarValueSizeInBits())) {
4900 if ((C1 == 0) == (Cond == ISD::SETEQ)) {
4901 // (srl (ctlz x), 5) == 0 -> X != 0
4902 // (srl (ctlz x), 5) != 1 -> X != 0
4903 Cond = ISD::SETNE;
4904 } else {
4905 // (srl (ctlz x), 5) != 0 -> X == 0
4906 // (srl (ctlz x), 5) == 1 -> X == 0
4907 Cond = ISD::SETEQ;
4908 }
4909 SDValue Zero = DAG.getConstant(0, dl, N0.getValueType());
4910 return DAG.getSetCC(dl, VT, N0.getOperand(0).getOperand(0), Zero,
4911 Cond);
4912 }
4913 }
4914 }
4915 }
4916
4917 // setcc X, 0, setlt --> X (when X is all sign bits)
4918 // setcc X, 0, setne --> X (when X is all sign bits)
4919 //
4920 // When we know that X has 0 or -1 in each element (or scalar), this
4921 // comparison will produce X. This is only true when boolean contents are
4922 // represented via 0s and -1s.
4923 if (VT == OpVT &&
4924 // Check that the result of setcc is 0 and -1.
4926 // Match only for checks X < 0 and X != 0
4927 (Cond == ISD::SETLT || Cond == ISD::SETNE) && isNullOrNullSplat(N1) &&
4928 // The identity holds iff we know all sign bits for all lanes.
4930 return N0;
4931
4932 // FIXME: Support vectors.
4933 if (auto *N1C = dyn_cast<ConstantSDNode>(N1.getNode())) {
4934 const APInt &C1 = N1C->getAPIntValue();
4935
4936 // (zext x) == C --> x == (trunc C)
4937 // (sext x) == C --> x == (trunc C)
4938 if ((Cond == ISD::SETEQ || Cond == ISD::SETNE) &&
4939 DCI.isBeforeLegalize() && N0->hasOneUse()) {
4940 unsigned MinBits = N0.getValueSizeInBits();
4941 SDValue PreExt;
4942 bool Signed = false;
4943 if (N0->getOpcode() == ISD::ZERO_EXTEND) {
4944 // ZExt
4945 MinBits = N0->getOperand(0).getValueSizeInBits();
4946 PreExt = N0->getOperand(0);
4947 } else if (N0->getOpcode() == ISD::AND) {
4948 // DAGCombine turns costly ZExts into ANDs
4949 if (auto *C = dyn_cast<ConstantSDNode>(N0->getOperand(1)))
4950 if ((C->getAPIntValue()+1).isPowerOf2()) {
4951 MinBits = C->getAPIntValue().countr_one();
4952 PreExt = N0->getOperand(0);
4953 }
4954 } else if (N0->getOpcode() == ISD::SIGN_EXTEND) {
4955 // SExt
4956 MinBits = N0->getOperand(0).getValueSizeInBits();
4957 PreExt = N0->getOperand(0);
4958 Signed = true;
4959 } else if (auto *LN0 = dyn_cast<LoadSDNode>(N0)) {
4960 // ZEXTLOAD / SEXTLOAD
4961 if (LN0->getExtensionType() == ISD::ZEXTLOAD) {
4962 MinBits = LN0->getMemoryVT().getSizeInBits();
4963 PreExt = N0;
4964 } else if (LN0->getExtensionType() == ISD::SEXTLOAD) {
4965 Signed = true;
4966 MinBits = LN0->getMemoryVT().getSizeInBits();
4967 PreExt = N0;
4968 }
4969 }
4970
4971 // Figure out how many bits we need to preserve this constant.
4972 unsigned ReqdBits = Signed ? C1.getSignificantBits() : C1.getActiveBits();
4973
4974 // Make sure we're not losing bits from the constant.
4975 if (MinBits > 0 &&
4976 MinBits < C1.getBitWidth() &&
4977 MinBits >= ReqdBits) {
4978 EVT MinVT = EVT::getIntegerVT(*DAG.getContext(), MinBits);
4979 if (isTypeDesirableForOp(ISD::SETCC, MinVT)) {
4980 // Will get folded away.
4981 SDValue Trunc = DAG.getNode(ISD::TRUNCATE, dl, MinVT, PreExt);
4982 if (MinBits == 1 && C1 == 1)
4983 // Invert the condition.
4984 return DAG.getSetCC(dl, VT, Trunc, DAG.getConstant(0, dl, MVT::i1),
4986 SDValue C = DAG.getConstant(C1.trunc(MinBits), dl, MinVT);
4987 return DAG.getSetCC(dl, VT, Trunc, C, Cond);
4988 }
4989
4990 // If truncating the setcc operands is not desirable, we can still
4991 // simplify the expression in some cases:
4992 // setcc ([sz]ext (setcc x, y, cc)), 0, setne) -> setcc (x, y, cc)
4993 // setcc ([sz]ext (setcc x, y, cc)), 0, seteq) -> setcc (x, y, inv(cc))
4994 // setcc (zext (setcc x, y, cc)), 1, setne) -> setcc (x, y, inv(cc))
4995 // setcc (zext (setcc x, y, cc)), 1, seteq) -> setcc (x, y, cc)
4996 // setcc (sext (setcc x, y, cc)), -1, setne) -> setcc (x, y, inv(cc))
4997 // setcc (sext (setcc x, y, cc)), -1, seteq) -> setcc (x, y, cc)
4998 SDValue TopSetCC = N0->getOperand(0);
4999 unsigned N0Opc = N0->getOpcode();
5000 bool SExt = (N0Opc == ISD::SIGN_EXTEND);
5001 if (TopSetCC.getValueType() == MVT::i1 && VT == MVT::i1 &&
5002 TopSetCC.getOpcode() == ISD::SETCC &&
5003 (N0Opc == ISD::ZERO_EXTEND || N0Opc == ISD::SIGN_EXTEND) &&
5004 (isConstFalseVal(N1) ||
5005 isExtendedTrueVal(N1C, N0->getValueType(0), SExt))) {
5006
5007 bool Inverse = (N1C->isZero() && Cond == ISD::SETEQ) ||
5008 (!N1C->isZero() && Cond == ISD::SETNE);
5009
5010 if (!Inverse)
5011 return TopSetCC;
5012
5014 cast<CondCodeSDNode>(TopSetCC.getOperand(2))->get(),
5015 TopSetCC.getOperand(0).getValueType());
5016 return DAG.getSetCC(dl, VT, TopSetCC.getOperand(0),
5017 TopSetCC.getOperand(1),
5018 InvCond);
5019 }
5020 }
5021 }
5022
5023 // If the LHS is '(and load, const)', the RHS is 0, the test is for
5024 // equality or unsigned, and all 1 bits of the const are in the same
5025 // partial word, see if we can shorten the load.
5026 if (DCI.isBeforeLegalize() &&
5028 N0.getOpcode() == ISD::AND && C1 == 0 &&
5029 N0.getNode()->hasOneUse() &&
5030 isa<LoadSDNode>(N0.getOperand(0)) &&
5031 N0.getOperand(0).getNode()->hasOneUse() &&
5033 auto *Lod = cast<LoadSDNode>(N0.getOperand(0));
5034 APInt bestMask;
5035 unsigned bestWidth = 0, bestOffset = 0;
5036 if (Lod->isSimple() && Lod->isUnindexed() &&
5037 (Lod->getMemoryVT().isByteSized() ||
5038 isPaddedAtMostSignificantBitsWhenStored(Lod->getMemoryVT()))) {
5039 unsigned memWidth = Lod->getMemoryVT().getStoreSizeInBits();
5040 unsigned origWidth = N0.getValueSizeInBits();
5041 unsigned maskWidth = origWidth;
5042 // We can narrow (e.g.) 16-bit extending loads on 32-bit target to
5043 // 8 bits, but have to be careful...
5044 if (Lod->getExtensionType() != ISD::NON_EXTLOAD)
5045 origWidth = Lod->getMemoryVT().getSizeInBits();
5046 const APInt &Mask = N0.getConstantOperandAPInt(1);
5047 // Only consider power-of-2 widths (and at least one byte) as candiates
5048 // for the narrowed load.
5049 for (unsigned width = 8; width < origWidth; width *= 2) {
5050 EVT newVT = EVT::getIntegerVT(*DAG.getContext(), width);
5051 APInt newMask = APInt::getLowBitsSet(maskWidth, width);
5052 // Avoid accessing any padding here for now (we could use memWidth
5053 // instead of origWidth here otherwise).
5054 unsigned maxOffset = origWidth - width;
5055 for (unsigned offset = 0; offset <= maxOffset; offset += 8) {
5056 if (Mask.isSubsetOf(newMask)) {
5057 unsigned ptrOffset =
5058 Layout.isLittleEndian() ? offset : memWidth - width - offset;
5059 unsigned IsFast = 0;
5060 assert((ptrOffset % 8) == 0 && "Non-Bytealigned pointer offset");
5061 Align NewAlign = commonAlignment(Lod->getAlign(), ptrOffset / 8);
5063 ptrOffset / 8) &&
5065 *DAG.getContext(), Layout, newVT, Lod->getAddressSpace(),
5066 NewAlign, Lod->getMemOperand()->getFlags(), &IsFast) &&
5067 IsFast) {
5068 bestOffset = ptrOffset / 8;
5069 bestMask = Mask.lshr(offset);
5070 bestWidth = width;
5071 break;
5072 }
5073 }
5074 newMask <<= 8;
5075 }
5076 if (bestWidth)
5077 break;
5078 }
5079 }
5080 if (bestWidth) {
5081 EVT newVT = EVT::getIntegerVT(*DAG.getContext(), bestWidth);
5082 SDValue Ptr = Lod->getBasePtr();
5083 if (bestOffset != 0)
5084 Ptr = DAG.getObjectPtrOffset(dl, Ptr, TypeSize::getFixed(bestOffset));
5085 SDValue NewLoad =
5086 DAG.getLoad(newVT, dl, Lod->getChain(), Ptr,
5087 Lod->getPointerInfo().getWithOffset(bestOffset),
5088 Lod->getBaseAlign());
5089 SDValue And =
5090 DAG.getNode(ISD::AND, dl, newVT, NewLoad,
5091 DAG.getConstant(bestMask.trunc(bestWidth), dl, newVT));
5092 return DAG.getSetCC(dl, VT, And, DAG.getConstant(0LL, dl, newVT), Cond);
5093 }
5094 }
5095
5096 // If the LHS is a ZERO_EXTEND, perform the comparison on the input.
5097 if (N0.getOpcode() == ISD::ZERO_EXTEND) {
5098 unsigned InSize = N0.getOperand(0).getValueSizeInBits();
5099
5100 // If the comparison constant has bits in the upper part, the
5101 // zero-extended value could never match.
5103 C1.getBitWidth() - InSize))) {
5104 switch (Cond) {
5105 case ISD::SETUGT:
5106 case ISD::SETUGE:
5107 case ISD::SETEQ:
5108 return DAG.getConstant(0, dl, VT);
5109 case ISD::SETULT:
5110 case ISD::SETULE:
5111 case ISD::SETNE:
5112 return DAG.getConstant(1, dl, VT);
5113 case ISD::SETGT:
5114 case ISD::SETGE:
5115 // True if the sign bit of C1 is set.
5116 return DAG.getConstant(C1.isNegative(), dl, VT);
5117 case ISD::SETLT:
5118 case ISD::SETLE:
5119 // True if the sign bit of C1 isn't set.
5120 return DAG.getConstant(C1.isNonNegative(), dl, VT);
5121 default:
5122 break;
5123 }
5124 }
5125
5126 // Otherwise, we can perform the comparison with the low bits.
5127 switch (Cond) {
5128 case ISD::SETEQ:
5129 case ISD::SETNE:
5130 case ISD::SETUGT:
5131 case ISD::SETUGE:
5132 case ISD::SETULT:
5133 case ISD::SETULE: {
5134 EVT newVT = N0.getOperand(0).getValueType();
5135 // FIXME: Should use isNarrowingProfitable.
5136 if (DCI.isBeforeLegalizeOps() ||
5137 (isOperationLegal(ISD::SETCC, newVT) &&
5138 isCondCodeLegal(Cond, newVT.getSimpleVT()) &&
5140 EVT NewSetCCVT = getSetCCResultType(Layout, *DAG.getContext(), newVT);
5141 SDValue NewConst = DAG.getConstant(C1.trunc(InSize), dl, newVT);
5142
5143 SDValue NewSetCC = DAG.getSetCC(dl, NewSetCCVT, N0.getOperand(0),
5144 NewConst, Cond);
5145 return DAG.getBoolExtOrTrunc(NewSetCC, dl, VT, N0.getValueType());
5146 }
5147 break;
5148 }
5149 default:
5150 break; // todo, be more careful with signed comparisons
5151 }
5152 } else if (N0.getOpcode() == ISD::SIGN_EXTEND_INREG &&
5153 (Cond == ISD::SETEQ || Cond == ISD::SETNE) &&
5155 OpVT)) {
5156 EVT ExtSrcTy = cast<VTSDNode>(N0.getOperand(1))->getVT();
5157 unsigned ExtSrcTyBits = ExtSrcTy.getSizeInBits();
5158 EVT ExtDstTy = N0.getValueType();
5159 unsigned ExtDstTyBits = ExtDstTy.getSizeInBits();
5160
5161 // If the constant doesn't fit into the number of bits for the source of
5162 // the sign extension, it is impossible for both sides to be equal.
5163 if (C1.getSignificantBits() > ExtSrcTyBits)
5164 return DAG.getBoolConstant(Cond == ISD::SETNE, dl, VT, OpVT);
5165
5166 assert(ExtDstTy == N0.getOperand(0).getValueType() &&
5167 ExtDstTy != ExtSrcTy && "Unexpected types!");
5168 APInt Imm = APInt::getLowBitsSet(ExtDstTyBits, ExtSrcTyBits);
5169 SDValue ZextOp = DAG.getNode(ISD::AND, dl, ExtDstTy, N0.getOperand(0),
5170 DAG.getConstant(Imm, dl, ExtDstTy));
5171 if (!DCI.isCalledByLegalizer())
5172 DCI.AddToWorklist(ZextOp.getNode());
5173 // Otherwise, make this a use of a zext.
5174 return DAG.getSetCC(dl, VT, ZextOp,
5175 DAG.getConstant(C1 & Imm, dl, ExtDstTy), Cond);
5176 } else if ((N1C->isZero() || N1C->isOne()) &&
5177 (Cond == ISD::SETEQ || Cond == ISD::SETNE)) {
5178 // SETCC (X), [0|1], [EQ|NE] -> X if X is known 0/1. i1 types are
5179 // excluded as they are handled below whilst checking for foldBooleans.
5180 if ((N0.getOpcode() == ISD::SETCC || VT.getScalarType() != MVT::i1) &&
5181 isTypeLegal(VT) && VT.bitsLE(N0.getValueType()) &&
5182 (N0.getValueType() == MVT::i1 ||
5186 bool TrueWhenTrue = (Cond == ISD::SETEQ) ^ (!N1C->isOne());
5187 if (TrueWhenTrue)
5188 return DAG.getNode(ISD::TRUNCATE, dl, VT, N0);
5189 // Invert the condition.
5190 if (N0.getOpcode() == ISD::SETCC) {
5193 if (DCI.isBeforeLegalizeOps() ||
5195 return DAG.getSetCC(dl, VT, N0.getOperand(0), N0.getOperand(1), CC);
5196 }
5197 }
5198
5199 if ((N0.getOpcode() == ISD::XOR ||
5200 (N0.getOpcode() == ISD::AND &&
5201 N0.getOperand(0).getOpcode() == ISD::XOR &&
5202 N0.getOperand(1) == N0.getOperand(0).getOperand(1))) &&
5203 isOneConstant(N0.getOperand(1))) {
5204 // If this is (X^1) == 0/1, swap the RHS and eliminate the xor. We
5205 // can only do this if the top bits are known zero.
5206 unsigned BitWidth = N0.getValueSizeInBits();
5207 if (DAG.MaskedValueIsZero(N0,
5209 BitWidth-1))) {
5210 // Okay, get the un-inverted input value.
5211 SDValue Val;
5212 if (N0.getOpcode() == ISD::XOR) {
5213 Val = N0.getOperand(0);
5214 } else {
5215 assert(N0.getOpcode() == ISD::AND &&
5216 N0.getOperand(0).getOpcode() == ISD::XOR);
5217 // ((X^1)&1)^1 -> X & 1
5218 Val = DAG.getNode(ISD::AND, dl, N0.getValueType(),
5219 N0.getOperand(0).getOperand(0),
5220 N0.getOperand(1));
5221 }
5222
5223 return DAG.getSetCC(dl, VT, Val, N1,
5225 }
5226 } else if (N1C->isOne()) {
5227 SDValue Op0 = N0;
5228 if (Op0.getOpcode() == ISD::TRUNCATE)
5229 Op0 = Op0.getOperand(0);
5230
5231 if ((Op0.getOpcode() == ISD::XOR) &&
5232 Op0.getOperand(0).getOpcode() == ISD::SETCC &&
5233 Op0.getOperand(1).getOpcode() == ISD::SETCC) {
5234 SDValue XorLHS = Op0.getOperand(0);
5235 SDValue XorRHS = Op0.getOperand(1);
5236 // Ensure that the input setccs return an i1 type or 0/1 value.
5237 if (Op0.getValueType() == MVT::i1 ||
5242 // (xor (setcc), (setcc)) == / != 1 -> (setcc) != / == (setcc)
5244 return DAG.getSetCC(dl, VT, XorLHS, XorRHS, Cond);
5245 }
5246 }
5247 if (Op0.getOpcode() == ISD::AND && isOneConstant(Op0.getOperand(1))) {
5248 // If this is (X&1) == / != 1, normalize it to (X&1) != / == 0.
5249 if (Op0.getValueType().bitsGT(VT))
5250 Op0 = DAG.getNode(ISD::AND, dl, VT,
5251 DAG.getNode(ISD::TRUNCATE, dl, VT, Op0.getOperand(0)),
5252 DAG.getConstant(1, dl, VT));
5253 else if (Op0.getValueType().bitsLT(VT))
5254 Op0 = DAG.getNode(ISD::AND, dl, VT,
5255 DAG.getNode(ISD::ANY_EXTEND, dl, VT, Op0.getOperand(0)),
5256 DAG.getConstant(1, dl, VT));
5257
5258 return DAG.getSetCC(dl, VT, Op0,
5259 DAG.getConstant(0, dl, Op0.getValueType()),
5261 }
5262 if (Op0.getOpcode() == ISD::AssertZext &&
5263 cast<VTSDNode>(Op0.getOperand(1))->getVT() == MVT::i1)
5264 return DAG.getSetCC(dl, VT, Op0,
5265 DAG.getConstant(0, dl, Op0.getValueType()),
5267 }
5268 }
5269
5270 // Given:
5271 // icmp eq/ne (urem %x, %y), 0
5272 // Iff %x has 0 or 1 bits set, and %y has at least 2 bits set, omit 'urem':
5273 // icmp eq/ne %x, 0
5274 if (N0.getOpcode() == ISD::UREM && N1C->isZero() &&
5275 (Cond == ISD::SETEQ || Cond == ISD::SETNE)) {
5276 KnownBits XKnown = DAG.computeKnownBits(N0.getOperand(0));
5277 KnownBits YKnown = DAG.computeKnownBits(N0.getOperand(1));
5278 if (XKnown.countMaxPopulation() == 1 && YKnown.countMinPopulation() >= 2)
5279 return DAG.getSetCC(dl, VT, N0.getOperand(0), N1, Cond);
5280 }
5281
5282 // Fold set_cc seteq (ashr X, BW-1), -1 -> set_cc setlt X, 0
5283 // and set_cc setne (ashr X, BW-1), -1 -> set_cc setge X, 0
5284 if ((Cond == ISD::SETEQ || Cond == ISD::SETNE) &&
5286 N0.getConstantOperandAPInt(1) == OpVT.getScalarSizeInBits() - 1 &&
5287 N1C->isAllOnes()) {
5288 return DAG.getSetCC(dl, VT, N0.getOperand(0),
5289 DAG.getConstant(0, dl, OpVT),
5291 }
5292
5293 // fold (setcc (trunc x) c) -> (setcc x c)
5294 if (N0.getOpcode() == ISD::TRUNCATE &&
5296 (N0->getFlags().hasNoSignedWrap() &&
5299 EVT NewVT = N0.getOperand(0).getValueType();
5300 SDValue NewConst = DAG.getConstant(
5302 ? C1.sext(NewVT.getSizeInBits())
5303 : C1.zext(NewVT.getSizeInBits()),
5304 dl, NewVT);
5305 return DAG.getSetCC(dl, VT, N0.getOperand(0), NewConst, Cond);
5306 }
5307
5308 if (SDValue V =
5309 optimizeSetCCOfSignedTruncationCheck(VT, N0, N1, Cond, DCI, dl))
5310 return V;
5311 }
5312
5313 // These simplifications apply to splat vectors as well.
5314 // TODO: Handle more splat vector cases.
5315 if (auto *N1C = isConstOrConstSplat(N1)) {
5316 const APInt &C1 = N1C->getAPIntValue();
5317
5318 APInt MinVal, MaxVal;
5319 unsigned OperandBitSize = N1C->getValueType(0).getScalarSizeInBits();
5321 MinVal = APInt::getSignedMinValue(OperandBitSize);
5322 MaxVal = APInt::getSignedMaxValue(OperandBitSize);
5323 } else {
5324 MinVal = APInt::getMinValue(OperandBitSize);
5325 MaxVal = APInt::getMaxValue(OperandBitSize);
5326 }
5327
5328 // Canonicalize GE/LE comparisons to use GT/LT comparisons.
5329 if (Cond == ISD::SETGE || Cond == ISD::SETUGE) {
5330 // X >= MIN --> true
5331 if (C1 == MinVal)
5332 return DAG.getBoolConstant(true, dl, VT, OpVT);
5333
5334 if (!VT.isVector()) { // TODO: Support this for vectors.
5335 // X >= C0 --> X > (C0 - 1)
5336 APInt C = C1 - 1;
5338 if ((DCI.isBeforeLegalizeOps() ||
5339 isCondCodeLegal(NewCC, OpVT.getSimpleVT())) &&
5340 (!N1C->isOpaque() || (C.getBitWidth() <= 64 &&
5341 isLegalICmpImmediate(C.getSExtValue())))) {
5342 return DAG.getSetCC(dl, VT, N0,
5343 DAG.getConstant(C, dl, N1.getValueType()),
5344 NewCC);
5345 }
5346 }
5347 }
5348
5349 if (Cond == ISD::SETLE || Cond == ISD::SETULE) {
5350 // X <= MAX --> true
5351 if (C1 == MaxVal)
5352 return DAG.getBoolConstant(true, dl, VT, OpVT);
5353
5354 // X <= C0 --> X < (C0 + 1)
5355 if (!VT.isVector()) { // TODO: Support this for vectors.
5356 APInt C = C1 + 1;
5358 if ((DCI.isBeforeLegalizeOps() ||
5359 isCondCodeLegal(NewCC, OpVT.getSimpleVT())) &&
5360 (!N1C->isOpaque() || (C.getBitWidth() <= 64 &&
5361 isLegalICmpImmediate(C.getSExtValue())))) {
5362 return DAG.getSetCC(dl, VT, N0,
5363 DAG.getConstant(C, dl, N1.getValueType()),
5364 NewCC);
5365 }
5366 }
5367 }
5368
5369 if (Cond == ISD::SETLT || Cond == ISD::SETULT) {
5370 if (C1 == MinVal)
5371 return DAG.getBoolConstant(false, dl, VT, OpVT); // X < MIN --> false
5372
5373 // TODO: Support this for vectors after legalize ops.
5374 if (!VT.isVector() || DCI.isBeforeLegalizeOps()) {
5375 // Canonicalize setlt X, Max --> setne X, Max
5376 if (C1 == MaxVal)
5377 return DAG.getSetCC(dl, VT, N0, N1, ISD::SETNE);
5378
5379 // If we have setult X, 1, turn it into seteq X, 0
5380 if (C1 == MinVal+1)
5381 return DAG.getSetCC(dl, VT, N0,
5382 DAG.getConstant(MinVal, dl, N0.getValueType()),
5383 ISD::SETEQ);
5384 }
5385 }
5386
5387 if (Cond == ISD::SETGT || Cond == ISD::SETUGT) {
5388 if (C1 == MaxVal)
5389 return DAG.getBoolConstant(false, dl, VT, OpVT); // X > MAX --> false
5390
5391 // TODO: Support this for vectors after legalize ops.
5392 if (!VT.isVector() || DCI.isBeforeLegalizeOps()) {
5393 // Canonicalize setgt X, Min --> setne X, Min
5394 if (C1 == MinVal)
5395 return DAG.getSetCC(dl, VT, N0, N1, ISD::SETNE);
5396
5397 // If we have setugt X, Max-1, turn it into seteq X, Max
5398 if (C1 == MaxVal-1)
5399 return DAG.getSetCC(dl, VT, N0,
5400 DAG.getConstant(MaxVal, dl, N0.getValueType()),
5401 ISD::SETEQ);
5402 }
5403 }
5404
5405 if (Cond == ISD::SETEQ || Cond == ISD::SETNE) {
5406 // (X & (C l>>/<< Y)) ==/!= 0 --> ((X <</l>> Y) & C) ==/!= 0
5407 if (C1.isZero())
5408 if (SDValue CC = optimizeSetCCByHoistingAndByConstFromLogicalShift(
5409 VT, N0, N1, Cond, DCI, dl))
5410 return CC;
5411
5412 // For all/any comparisons, replace or(x,shl(y,bw/2)) with and/or(x,y).
5413 // For example, when high 32-bits of i64 X are known clear:
5414 // all bits clear: (X | (Y<<32)) == 0 --> (X | Y) == 0
5415 // all bits set: (X | (Y<<32)) == -1 --> (X & Y) == -1
5416 bool CmpZero = N1C->isZero();
5417 bool CmpNegOne = N1C->isAllOnes();
5418 if ((CmpZero || CmpNegOne) && N0.hasOneUse()) {
5419 // Match or(lo,shl(hi,bw/2)) pattern.
5420 auto IsConcat = [&](SDValue V, SDValue &Lo, SDValue &Hi) {
5421 unsigned EltBits = V.getScalarValueSizeInBits();
5422 if (V.getOpcode() != ISD::OR || (EltBits % 2) != 0)
5423 return false;
5424 SDValue LHS = V.getOperand(0);
5425 SDValue RHS = V.getOperand(1);
5426 APInt HiBits = APInt::getHighBitsSet(EltBits, EltBits / 2);
5427 // Unshifted element must have zero upperbits.
5428 if (RHS.getOpcode() == ISD::SHL &&
5429 isa<ConstantSDNode>(RHS.getOperand(1)) &&
5430 RHS.getConstantOperandAPInt(1) == (EltBits / 2) &&
5431 DAG.MaskedValueIsZero(LHS, HiBits)) {
5432 Lo = LHS;
5433 Hi = RHS.getOperand(0);
5434 return true;
5435 }
5436 if (LHS.getOpcode() == ISD::SHL &&
5437 isa<ConstantSDNode>(LHS.getOperand(1)) &&
5438 LHS.getConstantOperandAPInt(1) == (EltBits / 2) &&
5439 DAG.MaskedValueIsZero(RHS, HiBits)) {
5440 Lo = RHS;
5441 Hi = LHS.getOperand(0);
5442 return true;
5443 }
5444 return false;
5445 };
5446
5447 auto MergeConcat = [&](SDValue Lo, SDValue Hi) {
5448 unsigned EltBits = N0.getScalarValueSizeInBits();
5449 unsigned HalfBits = EltBits / 2;
5450 APInt HiBits = APInt::getHighBitsSet(EltBits, HalfBits);
5451 SDValue LoBits = DAG.getConstant(~HiBits, dl, OpVT);
5452 SDValue HiMask = DAG.getNode(ISD::AND, dl, OpVT, Hi, LoBits);
5453 SDValue NewN0 =
5454 DAG.getNode(CmpZero ? ISD::OR : ISD::AND, dl, OpVT, Lo, HiMask);
5455 SDValue NewN1 = CmpZero ? DAG.getConstant(0, dl, OpVT) : LoBits;
5456 return DAG.getSetCC(dl, VT, NewN0, NewN1, Cond);
5457 };
5458
5459 SDValue Lo, Hi;
5460 if (IsConcat(N0, Lo, Hi))
5461 return MergeConcat(Lo, Hi);
5462
5463 if (N0.getOpcode() == ISD::AND || N0.getOpcode() == ISD::OR) {
5464 SDValue Lo0, Lo1, Hi0, Hi1;
5465 if (IsConcat(N0.getOperand(0), Lo0, Hi0) &&
5466 IsConcat(N0.getOperand(1), Lo1, Hi1)) {
5467 return MergeConcat(DAG.getNode(N0.getOpcode(), dl, OpVT, Lo0, Lo1),
5468 DAG.getNode(N0.getOpcode(), dl, OpVT, Hi0, Hi1));
5469 }
5470 }
5471 }
5472 }
5473
5474 // If we have "setcc X, C0", check to see if we can shrink the immediate
5475 // by changing cc.
5476 // TODO: Support this for vectors after legalize ops.
5477 if (!VT.isVector() || DCI.isBeforeLegalizeOps()) {
5478 // SETUGT X, SINTMAX -> SETLT X, 0
5479 // SETUGE X, SINTMIN -> SETLT X, 0
5480 if ((Cond == ISD::SETUGT && C1.isMaxSignedValue()) ||
5481 (Cond == ISD::SETUGE && C1.isMinSignedValue()))
5482 return DAG.getSetCC(dl, VT, N0,
5483 DAG.getConstant(0, dl, N1.getValueType()),
5484 ISD::SETLT);
5485
5486 // SETULT X, SINTMIN -> SETGT X, -1
5487 // SETULE X, SINTMAX -> SETGT X, -1
5488 if ((Cond == ISD::SETULT && C1.isMinSignedValue()) ||
5489 (Cond == ISD::SETULE && C1.isMaxSignedValue()))
5490 return DAG.getSetCC(dl, VT, N0,
5491 DAG.getAllOnesConstant(dl, N1.getValueType()),
5492 ISD::SETGT);
5493 }
5494 }
5495
5496 // Back to non-vector simplifications.
5497 // TODO: Can we do these for vector splats?
5498 if (auto *N1C = dyn_cast<ConstantSDNode>(N1.getNode())) {
5499 const APInt &C1 = N1C->getAPIntValue();
5500 EVT ShValTy = N0.getValueType();
5501
5502 // Fold bit comparisons when we can. This will result in an
5503 // incorrect value when boolean false is negative one, unless
5504 // the bitsize is 1 in which case the false value is the same
5505 // in practice regardless of the representation.
5506 if ((VT.getSizeInBits() == 1 ||
5508 (Cond == ISD::SETEQ || Cond == ISD::SETNE) &&
5509 (VT == ShValTy || (isTypeLegal(VT) && VT.bitsLE(ShValTy))) &&
5510 N0.getOpcode() == ISD::AND) {
5511 if (auto *AndRHS = dyn_cast<ConstantSDNode>(N0.getOperand(1))) {
5512 if (Cond == ISD::SETNE && C1 == 0) {// (X & 8) != 0 --> (X & 8) >> 3
5513 // Perform the xform if the AND RHS is a single bit.
5514 unsigned ShCt = AndRHS->getAPIntValue().logBase2();
5515 if (AndRHS->getAPIntValue().isPowerOf2() &&
5516 !shouldAvoidTransformToShift(ShValTy, ShCt)) {
5517 return DAG.getNode(
5518 ISD::TRUNCATE, dl, VT,
5519 DAG.getNode(ISD::SRL, dl, ShValTy, N0,
5520 DAG.getShiftAmountConstant(ShCt, ShValTy, dl)));
5521 }
5522 } else if (Cond == ISD::SETEQ && C1 == AndRHS->getAPIntValue()) {
5523 // (X & 8) == 8 --> (X & 8) >> 3
5524 // Perform the xform if C1 is a single bit.
5525 unsigned ShCt = C1.logBase2();
5526 if (C1.isPowerOf2() && !shouldAvoidTransformToShift(ShValTy, ShCt)) {
5527 return DAG.getNode(
5528 ISD::TRUNCATE, dl, VT,
5529 DAG.getNode(ISD::SRL, dl, ShValTy, N0,
5530 DAG.getShiftAmountConstant(ShCt, ShValTy, dl)));
5531 }
5532 }
5533 }
5534 }
5535
5536 if (C1.getSignificantBits() <= 64 &&
5538 // (X & -256) == 256 -> (X >> 8) == 1
5539 if ((Cond == ISD::SETEQ || Cond == ISD::SETNE) &&
5540 N0.getOpcode() == ISD::AND && N0.hasOneUse()) {
5541 if (auto *AndRHS = dyn_cast<ConstantSDNode>(N0.getOperand(1))) {
5542 const APInt &AndRHSC = AndRHS->getAPIntValue();
5543 if (AndRHSC.isNegatedPowerOf2() && C1.isSubsetOf(AndRHSC)) {
5544 unsigned ShiftBits = AndRHSC.countr_zero();
5545 if (!shouldAvoidTransformToShift(ShValTy, ShiftBits)) {
5546 // If using an unsigned shift doesn't yield a legal compare
5547 // immediate, try using sra instead.
5548 APInt NewC = C1.lshr(ShiftBits);
5549 if (NewC.getSignificantBits() <= 64 &&
5551 APInt SignedC = C1.ashr(ShiftBits);
5552 if (SignedC.getSignificantBits() <= 64 &&
5554 SDValue Shift = DAG.getNode(
5555 ISD::SRA, dl, ShValTy, N0.getOperand(0),
5556 DAG.getShiftAmountConstant(ShiftBits, ShValTy, dl));
5557 SDValue CmpRHS = DAG.getConstant(SignedC, dl, ShValTy);
5558 return DAG.getSetCC(dl, VT, Shift, CmpRHS, Cond);
5559 }
5560 }
5561 SDValue Shift = DAG.getNode(
5562 ISD::SRL, dl, ShValTy, N0.getOperand(0),
5563 DAG.getShiftAmountConstant(ShiftBits, ShValTy, dl));
5564 SDValue CmpRHS = DAG.getConstant(NewC, dl, ShValTy);
5565 return DAG.getSetCC(dl, VT, Shift, CmpRHS, Cond);
5566 }
5567 }
5568 }
5569 } else if (Cond == ISD::SETULT || Cond == ISD::SETUGE ||
5570 Cond == ISD::SETULE || Cond == ISD::SETUGT) {
5571 bool AdjOne = (Cond == ISD::SETULE || Cond == ISD::SETUGT);
5572 // X < 0x100000000 -> (X >> 32) < 1
5573 // X >= 0x100000000 -> (X >> 32) >= 1
5574 // X <= 0x0ffffffff -> (X >> 32) < 1
5575 // X > 0x0ffffffff -> (X >> 32) >= 1
5576 unsigned ShiftBits;
5577 APInt NewC = C1;
5578 ISD::CondCode NewCond = Cond;
5579 if (AdjOne) {
5580 ShiftBits = C1.countr_one();
5581 NewC = NewC + 1;
5582 NewCond = (Cond == ISD::SETULE) ? ISD::SETULT : ISD::SETUGE;
5583 } else {
5584 ShiftBits = C1.countr_zero();
5585 }
5586 APInt RangeWidth = NewC;
5587 NewC.lshrInPlace(ShiftBits);
5588 if (ShiftBits && NewC.getSignificantBits() <= 64 &&
5590 !shouldAvoidTransformToShift(ShValTy, ShiftBits)) {
5591 // If this is an offset range check, try to move the offset after the
5592 // shift to avoid preserving the pre-shift add with a mask.
5593 if (N0.getOpcode() == ISD::ADD && N0.hasOneUse()) {
5594 if (auto *AddC = isConstOrConstSplat(N0.getOperand(1))) {
5595 const APInt &AddVal = AddC->getAPIntValue();
5596 if (AddVal.countr_zero() >= ShiftBits) {
5597 APInt RangeLower = -AddVal;
5598 bool Overflow;
5599 (void)RangeLower.uadd_ov(RangeWidth, Overflow);
5600 if (!RangeWidth.isZero() && !Overflow) {
5601 SDValue Shift = DAG.getNode(
5602 ISD::SRL, dl, ShValTy, N0.getOperand(0),
5603 DAG.getShiftAmountConstant(ShiftBits, ShValTy, dl));
5604 APInt Offset = -RangeLower.lshr(ShiftBits);
5605 SDValue ShiftedAdd =
5606 DAG.getNode(ISD::ADD, dl, ShValTy, Shift,
5607 DAG.getConstant(Offset, dl, ShValTy));
5608 SDValue CmpRHS = DAG.getConstant(NewC, dl, ShValTy);
5609 return DAG.getSetCC(dl, VT, ShiftedAdd, CmpRHS, NewCond);
5610 }
5611 }
5612 }
5613 }
5614 SDValue Shift =
5615 DAG.getNode(ISD::SRL, dl, ShValTy, N0,
5616 DAG.getShiftAmountConstant(ShiftBits, ShValTy, dl));
5617 SDValue CmpRHS = DAG.getConstant(NewC, dl, ShValTy);
5618 return DAG.getSetCC(dl, VT, Shift, CmpRHS, NewCond);
5619 }
5620 }
5621 }
5622 }
5623
5625 auto *CFP = cast<ConstantFPSDNode>(N1);
5626 assert(!CFP->getValueAPF().isNaN() && "Unexpected NaN value");
5627
5628 // Otherwise, we know the RHS is not a NaN. Simplify the node to drop the
5629 // constant if knowing that the operand is non-nan is enough. We prefer to
5630 // have SETO(x,x) instead of SETO(x, 0.0) because this avoids having to
5631 // materialize 0.0.
5632 if (Cond == ISD::SETO || Cond == ISD::SETUO)
5633 return DAG.getSetCC(dl, VT, N0, N0, Cond);
5634
5635 // setcc (fneg x), C -> setcc swap(pred) x, -C
5636 if (N0.getOpcode() == ISD::FNEG) {
5638 if (DCI.isBeforeLegalizeOps() ||
5639 isCondCodeLegal(SwapCond, N0.getSimpleValueType())) {
5640 SDValue NegN1 = DAG.getNode(ISD::FNEG, dl, N0.getValueType(), N1);
5641 return DAG.getSetCC(dl, VT, N0.getOperand(0), NegN1, SwapCond);
5642 }
5643 }
5644
5645 // setueq/setoeq X, (fabs Inf) -> is_fpclass X, fcInf
5647 !isFPImmLegal(CFP->getValueAPF(), CFP->getValueType(0))) {
5648 bool IsFabs = N0.getOpcode() == ISD::FABS;
5649 SDValue Op = IsFabs ? N0.getOperand(0) : N0;
5650 if ((Cond == ISD::SETOEQ || Cond == ISD::SETUEQ) && CFP->isInfinity()) {
5651 FPClassTest Flag = CFP->isNegative() ? (IsFabs ? fcNone : fcNegInf)
5652 : (IsFabs ? fcInf : fcPosInf);
5653 if (Cond == ISD::SETUEQ)
5654 Flag |= fcNan;
5655 return DAG.getNode(ISD::IS_FPCLASS, dl, VT, Op,
5656 DAG.getTargetConstant(Flag, dl, MVT::i32));
5657 }
5658 }
5659
5660 // If the condition is not legal, see if we can find an equivalent one
5661 // which is legal.
5663 // If the comparison was an awkward floating-point == or != and one of
5664 // the comparison operands is infinity or negative infinity, convert the
5665 // condition to a less-awkward <= or >=.
5666 if (CFP->getValueAPF().isInfinity()) {
5667 bool IsNegInf = CFP->getValueAPF().isNegative();
5669 switch (Cond) {
5670 case ISD::SETOEQ: NewCond = IsNegInf ? ISD::SETOLE : ISD::SETOGE; break;
5671 case ISD::SETUEQ: NewCond = IsNegInf ? ISD::SETULE : ISD::SETUGE; break;
5672 case ISD::SETUNE: NewCond = IsNegInf ? ISD::SETUGT : ISD::SETULT; break;
5673 case ISD::SETONE: NewCond = IsNegInf ? ISD::SETOGT : ISD::SETOLT; break;
5674 default: break;
5675 }
5676 if (NewCond != ISD::SETCC_INVALID &&
5677 isCondCodeLegal(NewCond, N0.getSimpleValueType()))
5678 return DAG.getSetCC(dl, VT, N0, N1, NewCond);
5679 }
5680 }
5681 }
5682
5683 if (N0 == N1) {
5684 // The sext(setcc()) => setcc() optimization relies on the appropriate
5685 // constant being emitted.
5686 assert(!N0.getValueType().isInteger() &&
5687 "Integer types should be handled by FoldSetCC");
5688
5689 bool EqTrue = ISD::isTrueWhenEqual(Cond);
5690 unsigned UOF = ISD::getUnorderedFlavor(Cond);
5691 if (UOF == 2) // FP operators that are undefined on NaNs.
5692 return DAG.getBoolConstant(EqTrue, dl, VT, OpVT);
5693 if (UOF == unsigned(EqTrue))
5694 return DAG.getBoolConstant(EqTrue, dl, VT, OpVT);
5695 // Otherwise, we can't fold it. However, we can simplify it to SETUO/SETO
5696 // if it is not already.
5697 ISD::CondCode NewCond = UOF == 0 ? ISD::SETO : ISD::SETUO;
5698 if (NewCond != Cond &&
5699 (DCI.isBeforeLegalizeOps() ||
5700 isCondCodeLegal(NewCond, N0.getSimpleValueType())))
5701 return DAG.getSetCC(dl, VT, N0, N1, NewCond);
5702 }
5703
5704 // ~X > ~Y --> Y > X
5705 // ~X < ~Y --> Y < X
5706 // ~X < C --> X > ~C
5707 // ~X > C --> X < ~C
5708 if ((isSignedIntSetCC(Cond) || isUnsignedIntSetCC(Cond)) &&
5709 N0.getValueType().isInteger()) {
5710 if (isBitwiseNot(N0)) {
5711 if (isBitwiseNot(N1))
5712 return DAG.getSetCC(dl, VT, N1.getOperand(0), N0.getOperand(0), Cond);
5713
5716 SDValue Not = DAG.getNOT(dl, N1, OpVT);
5717 return DAG.getSetCC(dl, VT, Not, N0.getOperand(0), Cond);
5718 }
5719 }
5720 }
5721
5722 if ((Cond == ISD::SETEQ || Cond == ISD::SETNE) &&
5723 N0.getValueType().isInteger()) {
5724 if (N0.getOpcode() == ISD::ADD || N0.getOpcode() == ISD::SUB ||
5725 N0.getOpcode() == ISD::XOR) {
5726 // Simplify (X+Y) == (X+Z) --> Y == Z
5727 if (N0.getOpcode() == N1.getOpcode()) {
5728 if (N0.getOperand(0) == N1.getOperand(0))
5729 return DAG.getSetCC(dl, VT, N0.getOperand(1), N1.getOperand(1), Cond);
5730 if (N0.getOperand(1) == N1.getOperand(1))
5731 return DAG.getSetCC(dl, VT, N0.getOperand(0), N1.getOperand(0), Cond);
5732 if (isCommutativeBinOp(N0.getOpcode())) {
5733 // If X op Y == Y op X, try other combinations.
5734 if (N0.getOperand(0) == N1.getOperand(1))
5735 return DAG.getSetCC(dl, VT, N0.getOperand(1), N1.getOperand(0),
5736 Cond);
5737 if (N0.getOperand(1) == N1.getOperand(0))
5738 return DAG.getSetCC(dl, VT, N0.getOperand(0), N1.getOperand(1),
5739 Cond);
5740 }
5741 }
5742
5743 // If RHS is a legal immediate value for a compare instruction, we need
5744 // to be careful about increasing register pressure needlessly.
5745 bool LegalRHSImm = false;
5746
5747 if (auto *RHSC = dyn_cast<ConstantSDNode>(N1)) {
5748 if (auto *LHSR = dyn_cast<ConstantSDNode>(N0.getOperand(1))) {
5749 // Turn (X+C1) == C2 --> X == C2-C1
5750 if (N0.getOpcode() == ISD::ADD && N0.getNode()->hasOneUse())
5751 return DAG.getSetCC(
5752 dl, VT, N0.getOperand(0),
5753 DAG.getConstant(RHSC->getAPIntValue() - LHSR->getAPIntValue(),
5754 dl, N0.getValueType()),
5755 Cond);
5756
5757 // Turn (X^C1) == C2 --> X == C1^C2
5758 if (N0.getOpcode() == ISD::XOR && N0.getNode()->hasOneUse())
5759 return DAG.getSetCC(
5760 dl, VT, N0.getOperand(0),
5761 DAG.getConstant(LHSR->getAPIntValue() ^ RHSC->getAPIntValue(),
5762 dl, N0.getValueType()),
5763 Cond);
5764 }
5765
5766 // Turn (C1-X) == C2 --> X == C1-C2
5767 if (auto *SUBC = dyn_cast<ConstantSDNode>(N0.getOperand(0)))
5768 if (N0.getOpcode() == ISD::SUB && N0.getNode()->hasOneUse())
5769 return DAG.getSetCC(
5770 dl, VT, N0.getOperand(1),
5771 DAG.getConstant(SUBC->getAPIntValue() - RHSC->getAPIntValue(),
5772 dl, N0.getValueType()),
5773 Cond);
5774
5775 // Could RHSC fold directly into a compare?
5776 if (RHSC->getValueType(0).getSizeInBits() <= 64)
5777 LegalRHSImm = isLegalICmpImmediate(RHSC->getSExtValue());
5778 }
5779
5780 // (X+Y) == X --> Y == 0 and similar folds.
5781 // Don't do this if X is an immediate that can fold into a cmp
5782 // instruction and X+Y has other uses. It could be an induction variable
5783 // chain, and the transform would increase register pressure.
5784 if (!LegalRHSImm || N0.hasOneUse())
5785 if (SDValue V = foldSetCCWithBinOp(VT, N0, N1, Cond, dl, DCI))
5786 return V;
5787 }
5788
5789 if (N1.getOpcode() == ISD::ADD || N1.getOpcode() == ISD::SUB ||
5790 N1.getOpcode() == ISD::XOR)
5791 if (SDValue V = foldSetCCWithBinOp(VT, N1, N0, Cond, dl, DCI))
5792 return V;
5793
5794 if (SDValue V = foldSetCCWithAnd(VT, N0, N1, Cond, dl, DCI))
5795 return V;
5796
5797 if (SDValue V = foldSetCCWithOr(VT, N0, N1, Cond, dl, DCI))
5798 return V;
5799 }
5800
5801 // Fold remainder of division by a constant.
5802 if ((N0.getOpcode() == ISD::UREM || N0.getOpcode() == ISD::SREM) &&
5803 N0.hasOneUse() && (Cond == ISD::SETEQ || Cond == ISD::SETNE)) {
5804 // When division is cheap or optimizing for minimum size,
5805 // fall through to DIVREM creation by skipping this fold.
5806 if (!isIntDivCheap(VT, Attr) && !Attr.hasFnAttr(Attribute::MinSize)) {
5807 if (N0.getOpcode() == ISD::UREM) {
5808 if (SDValue Folded = buildUREMEqFold(VT, N0, N1, Cond, DCI, dl))
5809 return Folded;
5810 } else if (N0.getOpcode() == ISD::SREM) {
5811 if (SDValue Folded = buildSREMEqFold(VT, N0, N1, Cond, DCI, dl))
5812 return Folded;
5813 }
5814 }
5815 }
5816
5817 // Fold away ALL boolean setcc's.
5818 if (N0.getValueType().getScalarType() == MVT::i1 && foldBooleans) {
5819 SDValue Temp;
5820 switch (Cond) {
5821 default: llvm_unreachable("Unknown integer setcc!");
5822 case ISD::SETEQ: // X == Y -> ~(X^Y)
5823 Temp = DAG.getNode(ISD::XOR, dl, OpVT, N0, N1);
5824 N0 = DAG.getNOT(dl, Temp, OpVT);
5825 if (!DCI.isCalledByLegalizer())
5826 DCI.AddToWorklist(Temp.getNode());
5827 break;
5828 case ISD::SETNE: // X != Y --> (X^Y)
5829 N0 = DAG.getNode(ISD::XOR, dl, OpVT, N0, N1);
5830 break;
5831 case ISD::SETGT: // X >s Y --> X == 0 & Y == 1 --> ~X & Y
5832 case ISD::SETULT: // X <u Y --> X == 0 & Y == 1 --> ~X & Y
5833 Temp = DAG.getNOT(dl, N0, OpVT);
5834 N0 = DAG.getNode(ISD::AND, dl, OpVT, N1, Temp);
5835 if (!DCI.isCalledByLegalizer())
5836 DCI.AddToWorklist(Temp.getNode());
5837 break;
5838 case ISD::SETLT: // X <s Y --> X == 1 & Y == 0 --> ~Y & X
5839 case ISD::SETUGT: // X >u Y --> X == 1 & Y == 0 --> ~Y & X
5840 Temp = DAG.getNOT(dl, N1, OpVT);
5841 N0 = DAG.getNode(ISD::AND, dl, OpVT, N0, Temp);
5842 if (!DCI.isCalledByLegalizer())
5843 DCI.AddToWorklist(Temp.getNode());
5844 break;
5845 case ISD::SETULE: // X <=u Y --> X == 0 | Y == 1 --> ~X | Y
5846 case ISD::SETGE: // X >=s Y --> X == 0 | Y == 1 --> ~X | Y
5847 Temp = DAG.getNOT(dl, N0, OpVT);
5848 N0 = DAG.getNode(ISD::OR, dl, OpVT, N1, Temp);
5849 if (!DCI.isCalledByLegalizer())
5850 DCI.AddToWorklist(Temp.getNode());
5851 break;
5852 case ISD::SETUGE: // X >=u Y --> X == 1 | Y == 0 --> ~Y | X
5853 case ISD::SETLE: // X <=s Y --> X == 1 | Y == 0 --> ~Y | X
5854 Temp = DAG.getNOT(dl, N1, OpVT);
5855 N0 = DAG.getNode(ISD::OR, dl, OpVT, N0, Temp);
5856 break;
5857 }
5858 if (VT.getScalarType() != MVT::i1) {
5859 if (!DCI.isCalledByLegalizer())
5860 DCI.AddToWorklist(N0.getNode());
5861 // FIXME: If running after legalize, we probably can't do this.
5863 N0 = DAG.getNode(ExtendCode, dl, VT, N0);
5864 }
5865 return N0;
5866 }
5867
5868 // Fold (setcc (trunc x) (trunc y)) -> (setcc x y)
5869 if (N0.getOpcode() == ISD::TRUNCATE && N1.getOpcode() == ISD::TRUNCATE &&
5870 N0.getOperand(0).getValueType() == N1.getOperand(0).getValueType() &&
5872 N1->getFlags().hasNoUnsignedWrap()) ||
5874 N1->getFlags().hasNoSignedWrap())) &&
5876 return DAG.getSetCC(dl, VT, N0.getOperand(0), N1.getOperand(0), Cond);
5877 }
5878
5879 // Fold (setcc (sub nsw a, b), zero, s??) -> (setcc a, b, s??)
5880 // TODO: Remove that .isVector() check
5881 if (VT.isVector() && isZeroOrZeroSplat(N1) && N0.getOpcode() == ISD::SUB &&
5883 return DAG.getSetCC(dl, VT, N0.getOperand(0), N0.getOperand(1), Cond);
5884 }
5885
5886 // Could not fold it.
5887 return SDValue();
5888}
5889
5890/// Returns true (and the GlobalValue and the offset) if the node is a
5891/// GlobalAddress + offset.
5893 int64_t &Offset) const {
5894
5895 SDNode *N = unwrapAddress(SDValue(WN, 0)).getNode();
5896
5897 if (auto *GASD = dyn_cast<GlobalAddressSDNode>(N)) {
5898 GA = GASD->getGlobal();
5899 Offset += GASD->getOffset();
5900 return true;
5901 }
5902
5903 if (N->isAnyAdd()) {
5904 SDValue N1 = N->getOperand(0);
5905 SDValue N2 = N->getOperand(1);
5906 if (isGAPlusOffset(N1.getNode(), GA, Offset)) {
5907 if (auto *V = dyn_cast<ConstantSDNode>(N2)) {
5908 Offset += V->getSExtValue();
5909 return true;
5910 }
5911 } else if (isGAPlusOffset(N2.getNode(), GA, Offset)) {
5912 if (auto *V = dyn_cast<ConstantSDNode>(N1)) {
5913 Offset += V->getSExtValue();
5914 return true;
5915 }
5916 }
5917 }
5918
5919 return false;
5920}
5921
5923 DAGCombinerInfo &DCI) const {
5924 // Default implementation: no optimization.
5925 return SDValue();
5926}
5927
5928//===----------------------------------------------------------------------===//
5929// Inline Assembler Implementation Methods
5930//===----------------------------------------------------------------------===//
5931
5934 unsigned S = Constraint.size();
5935
5936 if (S == 1) {
5937 switch (Constraint[0]) {
5938 default: break;
5939 case 'r':
5940 return C_RegisterClass;
5941 case 'm': // memory
5942 case 'o': // offsetable
5943 case 'V': // not offsetable
5944 return C_Memory;
5945 case 'p': // Address.
5946 return C_Address;
5947 case 'n': // Simple Integer
5948 case 'E': // Floating Point Constant
5949 case 'F': // Floating Point Constant
5950 return C_Immediate;
5951 case 'i': // Simple Integer or Relocatable Constant
5952 case 's': // Relocatable Constant
5953 case 'X': // Allow ANY value.
5954 case 'I': // Target registers.
5955 case 'J':
5956 case 'K':
5957 case 'L':
5958 case 'M':
5959 case 'N':
5960 case 'O':
5961 case 'P':
5962 case '<':
5963 case '>':
5964 return C_Other;
5965 }
5966 }
5967
5968 if (S > 1 && Constraint[0] == '{' && Constraint[S - 1] == '}') {
5969 if (S == 8 && Constraint.substr(1, 6) == "memory") // "{memory}"
5970 return C_Memory;
5971 return C_Register;
5972 }
5973 return C_Unknown;
5974}
5975
5976/// Try to replace an X constraint, which matches anything, with another that
5977/// has more specific requirements based on the type of the corresponding
5978/// operand.
5979const char *TargetLowering::LowerXConstraint(EVT ConstraintVT) const {
5980 if (ConstraintVT.isInteger())
5981 return "r";
5982 if (ConstraintVT.isFloatingPoint())
5983 return "f"; // works for many targets
5984 return nullptr;
5985}
5986
5988 SDValue &Chain, SDValue &Glue, const SDLoc &DL,
5989 const AsmOperandInfo &OpInfo, SelectionDAG &DAG) const {
5990 return SDValue();
5991}
5992
5993/// Lower the specified operand into the Ops vector.
5994/// If it is invalid, don't add anything to Ops.
5996 StringRef Constraint,
5997 std::vector<SDValue> &Ops,
5998 SelectionDAG &DAG) const {
5999
6000 if (Constraint.size() > 1)
6001 return;
6002
6003 char ConstraintLetter = Constraint[0];
6004 switch (ConstraintLetter) {
6005 default: break;
6006 case 'X': // Allows any operand
6007 case 'i': // Simple Integer or Relocatable Constant
6008 case 'n': // Simple Integer
6009 case 's': { // Relocatable Constant
6010
6012 uint64_t Offset = 0;
6013
6014 // Match (GA) or (C) or (GA+C) or (GA-C) or ((GA+C)+C) or (((GA+C)+C)+C),
6015 // etc., since getelementpointer is variadic. We can't use
6016 // SelectionDAG::FoldSymbolOffset because it expects the GA to be accessible
6017 // while in this case the GA may be furthest from the root node which is
6018 // likely an ISD::ADD.
6019 while (true) {
6020 if ((C = dyn_cast<ConstantSDNode>(Op)) && ConstraintLetter != 's') {
6021 // gcc prints these as sign extended. Sign extend value to 64 bits
6022 // now; without this it would get ZExt'd later in
6023 // ScheduleDAGSDNodes::EmitNode, which is very generic.
6024 bool IsBool = C->getConstantIntValue()->getBitWidth() == 1;
6025 BooleanContent BCont = getBooleanContents(MVT::i64);
6026 ISD::NodeType ExtOpc =
6027 IsBool ? getExtendForContent(BCont) : ISD::SIGN_EXTEND;
6028 int64_t ExtVal =
6029 ExtOpc == ISD::ZERO_EXTEND ? C->getZExtValue() : C->getSExtValue();
6030 Ops.push_back(
6031 DAG.getTargetConstant(Offset + ExtVal, SDLoc(C), MVT::i64));
6032 return;
6033 }
6034 if (ConstraintLetter != 'n') {
6035 if (const auto *GA = dyn_cast<GlobalAddressSDNode>(Op)) {
6036 Ops.push_back(DAG.getTargetGlobalAddress(GA->getGlobal(), SDLoc(Op),
6037 GA->getValueType(0),
6038 Offset + GA->getOffset()));
6039 return;
6040 }
6041 if (const auto *BA = dyn_cast<BlockAddressSDNode>(Op)) {
6042 Ops.push_back(DAG.getTargetBlockAddress(
6043 BA->getBlockAddress(), BA->getValueType(0),
6044 Offset + BA->getOffset(), BA->getTargetFlags()));
6045 return;
6046 }
6048 Ops.push_back(Op);
6049 return;
6050 }
6051 }
6052 const unsigned OpCode = Op.getOpcode();
6053 if (OpCode == ISD::ADD || OpCode == ISD::SUB) {
6054 if ((C = dyn_cast<ConstantSDNode>(Op.getOperand(0))))
6055 Op = Op.getOperand(1);
6056 // Subtraction is not commutative.
6057 else if (OpCode == ISD::ADD &&
6058 (C = dyn_cast<ConstantSDNode>(Op.getOperand(1))))
6059 Op = Op.getOperand(0);
6060 else
6061 return;
6062 Offset += (OpCode == ISD::ADD ? 1 : -1) * C->getSExtValue();
6063 continue;
6064 }
6065 return;
6066 }
6067 break;
6068 }
6069 }
6070}
6071
6075
6076std::pair<unsigned, const TargetRegisterClass *>
6078 StringRef Constraint,
6079 MVT VT) const {
6080 if (!Constraint.starts_with("{"))
6081 return std::make_pair(0u, static_cast<TargetRegisterClass *>(nullptr));
6082 assert(*(Constraint.end() - 1) == '}' && "Not a brace enclosed constraint?");
6083
6084 // Remove the braces from around the name.
6085 StringRef RegName(Constraint.data() + 1, Constraint.size() - 2);
6086
6087 std::pair<unsigned, const TargetRegisterClass *> R =
6088 std::make_pair(0u, static_cast<const TargetRegisterClass *>(nullptr));
6089
6090 // Figure out which register class contains this reg.
6091 for (const TargetRegisterClass &RC : RI->regclasses()) {
6092 // If none of the value types for this register class are valid, we
6093 // can't use it. For example, 64-bit reg classes on 32-bit targets.
6094 if (!isLegalRC(*RI, RC))
6095 continue;
6096
6097 for (const MCPhysReg &PR : RC) {
6098 if (RegName.equals_insensitive(RI->getRegAsmName(PR))) {
6099 std::pair<unsigned, const TargetRegisterClass *> S =
6100 std::make_pair(PR, &RC);
6101
6102 // If this register class has the requested value type, return it,
6103 // otherwise keep searching and return the first class found
6104 // if no other is found which explicitly has the requested type.
6105 if (RI->isTypeLegalForClass(RC, VT))
6106 return S;
6107 if (!R.second)
6108 R = S;
6109 }
6110 }
6111 }
6112
6113 return R;
6114}
6115
6116//===----------------------------------------------------------------------===//
6117// Constraint Selection.
6118
6119/// Return true of this is an input operand that is a matching constraint like
6120/// "4".
6122 assert(!ConstraintCode.empty() && "No known constraint!");
6123 return isdigit(static_cast<unsigned char>(ConstraintCode[0]));
6124}
6125
6126/// If this is an input matching constraint, this method returns the output
6127/// operand it matches.
6129 assert(!ConstraintCode.empty() && "No known constraint!");
6130 return atoi(ConstraintCode.c_str());
6131}
6132
6133/// Split up the constraint string from the inline assembly value into the
6134/// specific constraints and their prefixes, and also tie in the associated
6135/// operand values.
6136/// If this returns an empty vector, and if the constraint string itself
6137/// isn't empty, there was an error parsing.
6140 const TargetRegisterInfo *TRI,
6141 const CallBase &Call) const {
6142 /// Information about all of the constraints.
6143 AsmOperandInfoVector ConstraintOperands;
6144 const InlineAsm *IA = cast<InlineAsm>(Call.getCalledOperand());
6145 unsigned maCount = 0; // Largest number of multiple alternative constraints.
6146
6147 // Do a prepass over the constraints, canonicalizing them, and building up the
6148 // ConstraintOperands list.
6149 unsigned ArgNo = 0; // ArgNo - The argument of the CallInst.
6150 unsigned ResNo = 0; // ResNo - The result number of the next output.
6151 unsigned LabelNo = 0; // LabelNo - CallBr indirect dest number.
6152
6153 for (InlineAsm::ConstraintInfo &CI : IA->ParseConstraints()) {
6154 ConstraintOperands.emplace_back(std::move(CI));
6155 AsmOperandInfo &OpInfo = ConstraintOperands.back();
6156
6157 // Update multiple alternative constraint count.
6158 if (OpInfo.multipleAlternatives.size() > maCount)
6159 maCount = OpInfo.multipleAlternatives.size();
6160
6161 OpInfo.ConstraintVT = MVT::Other;
6162
6163 // Compute the value type for each operand.
6164 switch (OpInfo.Type) {
6165 case InlineAsm::isOutput: {
6166 // Indirect outputs just consume an argument.
6167 if (OpInfo.isIndirect) {
6168 OpInfo.CallOperandVal = Call.getArgOperand(ArgNo);
6169 break;
6170 }
6171
6172 // The return value of the call is this value. As such, there is no
6173 // corresponding argument.
6174 assert(!Call.getType()->isVoidTy() && "Bad inline asm!");
6175 EVT VT;
6176 if (auto *STy = dyn_cast<StructType>(Call.getType())) {
6177 VT = getAsmOperandValueType(DL, STy->getElementType(ResNo));
6178 } else {
6179 assert(ResNo == 0 && "Asm only has one result!");
6180 VT = getAsmOperandValueType(DL, Call.getType());
6181 }
6182 OpInfo.ConstraintVT = VT.isSimple() ? VT.getSimpleVT() : MVT::Other;
6183 ++ResNo;
6184 break;
6185 }
6186 case InlineAsm::isInput:
6187 OpInfo.CallOperandVal = Call.getArgOperand(ArgNo);
6188 break;
6189 case InlineAsm::isLabel:
6190 OpInfo.CallOperandVal = cast<CallBrInst>(&Call)->getIndirectDest(LabelNo);
6191 ++LabelNo;
6192 continue;
6194 // Nothing to do.
6195 break;
6196 }
6197
6198 if (OpInfo.CallOperandVal) {
6199 llvm::Type *OpTy = OpInfo.CallOperandVal->getType();
6200 if (OpInfo.isIndirect) {
6201 OpTy = Call.getParamElementType(ArgNo);
6202 assert(OpTy && "Indirect operand must have elementtype attribute");
6203 }
6204
6205 // Look for vector wrapped in a struct. e.g. { <16 x i8> }.
6207 if (STy->getNumElements() == 1)
6208 OpTy = STy->getElementType(0);
6209
6210 // If OpTy is not a single value, it may be a struct/union that we
6211 // can tile with integers.
6212 if (!OpTy->isSingleValueType() && OpTy->isSized()) {
6213 unsigned BitSize = DL.getTypeSizeInBits(OpTy);
6214 switch (BitSize) {
6215 default: break;
6216 case 1:
6217 case 8:
6218 case 16:
6219 case 32:
6220 case 64:
6221 case 128:
6222 OpTy = IntegerType::get(OpTy->getContext(), BitSize);
6223 break;
6224 }
6225 }
6226
6227 EVT VT = getAsmOperandValueType(DL, OpTy, true);
6228 OpInfo.ConstraintVT = VT.isSimple() ? VT.getSimpleVT() : MVT::Other;
6229 ArgNo++;
6230 }
6231 }
6232
6233 // If we have multiple alternative constraints, select the best alternative.
6234 if (!ConstraintOperands.empty()) {
6235 if (maCount) {
6236 unsigned bestMAIndex = 0;
6237 int bestWeight = -1;
6238 // weight: -1 = invalid match, and 0 = so-so match to 5 = good match.
6239 int weight = -1;
6240 unsigned maIndex;
6241 // Compute the sums of the weights for each alternative, keeping track
6242 // of the best (highest weight) one so far.
6243 for (maIndex = 0; maIndex < maCount; ++maIndex) {
6244 int weightSum = 0;
6245 for (unsigned cIndex = 0, eIndex = ConstraintOperands.size();
6246 cIndex != eIndex; ++cIndex) {
6247 AsmOperandInfo &OpInfo = ConstraintOperands[cIndex];
6248 if (OpInfo.Type == InlineAsm::isClobber)
6249 continue;
6250
6251 // If this is an output operand with a matching input operand,
6252 // look up the matching input. If their types mismatch, e.g. one
6253 // is an integer, the other is floating point, or their sizes are
6254 // different, flag it as an maCantMatch.
6255 if (OpInfo.hasMatchingInput()) {
6256 AsmOperandInfo &Input = ConstraintOperands[OpInfo.MatchingInput];
6257 if (OpInfo.ConstraintVT != Input.ConstraintVT) {
6258 if ((OpInfo.ConstraintVT.isInteger() !=
6259 Input.ConstraintVT.isInteger()) ||
6260 (OpInfo.ConstraintVT.getSizeInBits() !=
6261 Input.ConstraintVT.getSizeInBits())) {
6262 weightSum = -1; // Can't match.
6263 break;
6264 }
6265 }
6266 }
6267 weight = getMultipleConstraintMatchWeight(OpInfo, maIndex);
6268 if (weight == -1) {
6269 weightSum = -1;
6270 break;
6271 }
6272 weightSum += weight;
6273 }
6274 // Update best.
6275 if (weightSum > bestWeight) {
6276 bestWeight = weightSum;
6277 bestMAIndex = maIndex;
6278 }
6279 }
6280
6281 // Now select chosen alternative in each constraint.
6282 for (AsmOperandInfo &cInfo : ConstraintOperands)
6283 if (cInfo.Type != InlineAsm::isClobber)
6284 cInfo.selectAlternative(bestMAIndex);
6285 }
6286 }
6287
6288 // Check and hook up tied operands, choose constraint code to use.
6289 for (unsigned cIndex = 0, eIndex = ConstraintOperands.size();
6290 cIndex != eIndex; ++cIndex) {
6291 AsmOperandInfo &OpInfo = ConstraintOperands[cIndex];
6292
6293 // If this is an output operand with a matching input operand, look up the
6294 // matching input. If their types mismatch, e.g. one is an integer, the
6295 // other is floating point, or their sizes are different, flag it as an
6296 // error.
6297 if (OpInfo.hasMatchingInput()) {
6298 AsmOperandInfo &Input = ConstraintOperands[OpInfo.MatchingInput];
6299
6300 if (OpInfo.ConstraintVT != Input.ConstraintVT) {
6301 std::pair<unsigned, const TargetRegisterClass *> MatchRC =
6302 getRegForInlineAsmConstraint(TRI, OpInfo.ConstraintCode,
6303 OpInfo.ConstraintVT);
6304 std::pair<unsigned, const TargetRegisterClass *> InputRC =
6305 getRegForInlineAsmConstraint(TRI, Input.ConstraintCode,
6306 Input.ConstraintVT);
6307 const bool OutOpIsIntOrFP = OpInfo.ConstraintVT.isInteger() ||
6308 OpInfo.ConstraintVT.isFloatingPoint();
6309 const bool InOpIsIntOrFP = Input.ConstraintVT.isInteger() ||
6310 Input.ConstraintVT.isFloatingPoint();
6311 if ((OutOpIsIntOrFP != InOpIsIntOrFP) ||
6312 (MatchRC.second != InputRC.second)) {
6313 report_fatal_error("Unsupported asm: input constraint"
6314 " with a matching output constraint of"
6315 " incompatible type!");
6316 }
6317 }
6318 }
6319 }
6320
6321 return ConstraintOperands;
6322}
6323
6324/// Return a number indicating our preference for chosing a type of constraint
6325/// over another, for the purpose of sorting them. Immediates are almost always
6326/// preferrable (when they can be emitted). A higher return value means a
6327/// stronger preference for one constraint type relative to another.
6328/// FIXME: We should prefer registers over memory but doing so may lead to
6329/// unrecoverable register exhaustion later.
6330/// https://github.com/llvm/llvm-project/issues/20571
6332 switch (CT) {
6335 return 4;
6338 return 3;
6340 return 2;
6342 return 1;
6344 return 0;
6345 }
6346 llvm_unreachable("Invalid constraint type");
6347}
6348
6349/// Examine constraint type and operand type and determine a weight value.
6350/// This object must already have been set up with the operand type
6351/// and the current alternative constraint selected.
6354 AsmOperandInfo &info, int maIndex) const {
6356 if (maIndex >= (int)info.multipleAlternatives.size())
6357 rCodes = &info.Codes;
6358 else
6359 rCodes = &info.multipleAlternatives[maIndex].Codes;
6360 ConstraintWeight BestWeight = CW_Invalid;
6361
6362 // Loop over the options, keeping track of the most general one.
6363 for (const std::string &rCode : *rCodes) {
6364 ConstraintWeight weight =
6365 getSingleConstraintMatchWeight(info, rCode.c_str());
6366 if (weight > BestWeight)
6367 BestWeight = weight;
6368 }
6369
6370 return BestWeight;
6371}
6372
6373/// Examine constraint type and operand type and determine a weight value.
6374/// This object must already have been set up with the operand type
6375/// and the current alternative constraint selected.
6378 AsmOperandInfo &info, const char *constraint) const {
6380 Value *CallOperandVal = info.CallOperandVal;
6381 // If we don't have a value, we can't do a match,
6382 // but allow it at the lowest weight.
6383 if (!CallOperandVal)
6384 return CW_Default;
6385 // Look at the constraint type.
6386 switch (*constraint) {
6387 case 'i': // immediate integer.
6388 case 'n': // immediate integer with a known value.
6389 if (isa<ConstantInt>(CallOperandVal))
6390 weight = CW_Constant;
6391 break;
6392 case 's': // non-explicit intregal immediate.
6393 if (isa<GlobalValue>(CallOperandVal))
6394 weight = CW_Constant;
6395 break;
6396 case 'E': // immediate float if host format.
6397 case 'F': // immediate float.
6398 if (isa<ConstantFP>(CallOperandVal))
6399 weight = CW_Constant;
6400 break;
6401 case '<': // memory operand with autodecrement.
6402 case '>': // memory operand with autoincrement.
6403 case 'm': // memory operand.
6404 case 'o': // offsettable memory operand
6405 case 'V': // non-offsettable memory operand
6406 weight = CW_Memory;
6407 break;
6408 case 'r': // general register.
6409 case 'g': // general register, memory operand or immediate integer.
6410 // note: Clang converts "g" to "imr".
6411 if (CallOperandVal->getType()->isIntegerTy())
6412 weight = CW_Register;
6413 break;
6414 case 'X': // any operand.
6415 default:
6416 weight = CW_Default;
6417 break;
6418 }
6419 return weight;
6420}
6421
6422/// If there are multiple different constraints that we could pick for this
6423/// operand (e.g. "imr") try to pick the 'best' one.
6424/// This is somewhat tricky: constraints (TargetLowering::ConstraintType) fall
6425/// into seven classes:
6426/// Register -> one specific register
6427/// RegisterClass -> a group of regs
6428/// Memory -> memory
6429/// Address -> a symbolic memory reference
6430/// Immediate -> immediate values
6431/// Other -> magic values (such as "Flag Output Operands")
6432/// Unknown -> something we don't recognize yet and can't handle
6433/// Ideally, we would pick the most specific constraint possible: if we have
6434/// something that fits into a register, we would pick it. The problem here
6435/// is that if we have something that could either be in a register or in
6436/// memory that use of the register could cause selection of *other*
6437/// operands to fail: they might only succeed if we pick memory. Because of
6438/// this the heuristic we use is:
6439///
6440/// 1) If there is an 'other' constraint, and if the operand is valid for
6441/// that constraint, use it. This makes us take advantage of 'i'
6442/// constraints when available.
6443/// 2) Otherwise, pick the most general constraint present. This prefers
6444/// 'm' over 'r', for example.
6445///
6447 TargetLowering::AsmOperandInfo &OpInfo) const {
6448 ConstraintGroup Ret;
6449
6450 Ret.reserve(OpInfo.Codes.size());
6451 for (StringRef Code : OpInfo.Codes) {
6453
6454 // Indirect 'other' or 'immediate' constraints are not allowed.
6455 if (OpInfo.isIndirect && !(CType == TargetLowering::C_Memory ||
6456 CType == TargetLowering::C_Register ||
6458 continue;
6459
6460 // Things with matching constraints can only be registers, per gcc
6461 // documentation. This mainly affects "g" constraints.
6462 if (CType == TargetLowering::C_Memory && OpInfo.hasMatchingInput())
6463 continue;
6464
6465 Ret.emplace_back(Code, CType);
6466 }
6467
6469 return getConstraintPiority(a.second) > getConstraintPiority(b.second);
6470 });
6471
6472 return Ret;
6473}
6474
6475/// If we have an immediate, see if we can lower it. Return true if we can,
6476/// false otherwise.
6478 SDValue Op, SelectionDAG *DAG,
6479 const TargetLowering &TLI) {
6480
6481 assert((P.second == TargetLowering::C_Other ||
6482 P.second == TargetLowering::C_Immediate) &&
6483 "need immediate or other");
6484
6485 if (!Op.getNode())
6486 return false;
6487
6488 std::vector<SDValue> ResultOps;
6489 TLI.LowerAsmOperandForConstraint(Op, P.first, ResultOps, *DAG);
6490 return !ResultOps.empty();
6491}
6492
6493/// Determines the constraint code and constraint type to use for the specific
6494/// AsmOperandInfo, setting OpInfo.ConstraintCode and OpInfo.ConstraintType.
6496 SDValue Op,
6497 SelectionDAG *DAG) const {
6498 assert(!OpInfo.Codes.empty() && "Must have at least one constraint");
6499
6500 // Single-letter constraints ('r') are very common.
6501 if (OpInfo.Codes.size() == 1) {
6502 OpInfo.ConstraintCode = OpInfo.Codes[0];
6503 OpInfo.ConstraintType = getConstraintType(OpInfo.ConstraintCode);
6504 } else {
6506 if (G.empty())
6507 return;
6508
6509 unsigned BestIdx = 0;
6510 for (const unsigned E = G.size();
6511 BestIdx < E && (G[BestIdx].second == TargetLowering::C_Other ||
6512 G[BestIdx].second == TargetLowering::C_Immediate);
6513 ++BestIdx) {
6514 if (lowerImmediateIfPossible(G[BestIdx], Op, DAG, *this))
6515 break;
6516 // If we're out of constraints, just pick the first one.
6517 if (BestIdx + 1 == E) {
6518 BestIdx = 0;
6519 break;
6520 }
6521 }
6522
6523 OpInfo.ConstraintCode = G[BestIdx].first;
6524 OpInfo.ConstraintType = G[BestIdx].second;
6525 }
6526
6527 // 'X' matches anything.
6528 if (OpInfo.ConstraintCode == "X" && OpInfo.CallOperandVal) {
6529 // Constants are handled elsewhere. For Functions, the type here is the
6530 // type of the result, which is not what we want to look at; leave them
6531 // alone.
6532 Value *v = OpInfo.CallOperandVal;
6533 if (isa<ConstantInt>(v) || isa<Function>(v)) {
6534 return;
6535 }
6536
6537 if (isa<BasicBlock>(v) || isa<BlockAddress>(v)) {
6538 OpInfo.ConstraintCode = "i";
6539 return;
6540 }
6541
6542 // Otherwise, try to resolve it to something we know about by looking at
6543 // the actual operand type.
6544 if (const char *Repl = LowerXConstraint(OpInfo.ConstraintVT)) {
6545 OpInfo.ConstraintCode = Repl;
6546 OpInfo.ConstraintType = getConstraintType(OpInfo.ConstraintCode);
6547 }
6548 }
6549}
6550
6551/// Given an exact SDIV by a constant, create a multiplication
6552/// with the multiplicative inverse of the constant.
6553/// Ref: "Hacker's Delight" by Henry Warren, 2nd Edition, p. 242
6555 const SDLoc &dl, SelectionDAG &DAG,
6556 SmallVectorImpl<SDNode *> &Created) {
6557 SDValue Op0 = N->getOperand(0);
6558 SDValue Op1 = N->getOperand(1);
6559 EVT VT = N->getValueType(0);
6560 EVT ShVT = TLI.getShiftAmountTy(VT, DAG.getDataLayout());
6561 EVT ShSVT = ShVT.getScalarType();
6562
6563 bool UseSRA = false;
6564 SmallVector<SDValue, 16> Shifts, Factors;
6565
6566 auto BuildSDIVPattern = [&](ConstantSDNode *C) {
6567 if (C->isZero())
6568 return false;
6569
6570 EVT CT = C->getValueType(0);
6571 APInt Divisor = C->getAPIntValue();
6572 unsigned Shift = Divisor.countr_zero();
6573 if (Shift) {
6574 Divisor.ashrInPlace(Shift);
6575 UseSRA = true;
6576 }
6577 APInt Factor = Divisor.multiplicativeInverse();
6578 Shifts.push_back(DAG.getConstant(Shift, dl, ShSVT));
6579 Factors.push_back(DAG.getConstant(Factor, dl, CT));
6580 return true;
6581 };
6582
6583 // Collect all magic values from the build vector.
6584 if (!ISD::matchUnaryPredicate(Op1, BuildSDIVPattern))
6585 return SDValue();
6586
6587 SDValue Shift, Factor;
6588 if (Op1.getOpcode() == ISD::BUILD_VECTOR) {
6589 Shift = DAG.getBuildVector(ShVT, dl, Shifts);
6590 Factor = DAG.getBuildVector(VT, dl, Factors);
6591 } else if (Op1.getOpcode() == ISD::SPLAT_VECTOR) {
6592 assert(Shifts.size() == 1 && Factors.size() == 1 &&
6593 "Expected matchUnaryPredicate to return one element for scalable "
6594 "vectors");
6595 Shift = DAG.getSplatVector(ShVT, dl, Shifts[0]);
6596 Factor = DAG.getSplatVector(VT, dl, Factors[0]);
6597 } else {
6598 assert(isa<ConstantSDNode>(Op1) && "Expected a constant");
6599 Shift = Shifts[0];
6600 Factor = Factors[0];
6601 }
6602
6603 SDValue Res = Op0;
6604 if (UseSRA) {
6605 Res = DAG.getNode(ISD::SRA, dl, VT, Res, Shift, SDNodeFlags::Exact);
6606 Created.push_back(Res.getNode());
6607 }
6608
6609 return DAG.getNode(ISD::MUL, dl, VT, Res, Factor);
6610}
6611
6612/// Given an exact UDIV by a constant, create a multiplication
6613/// with the multiplicative inverse of the constant.
6614/// Ref: "Hacker's Delight" by Henry Warren, 2nd Edition, p. 242
6616 const SDLoc &dl, SelectionDAG &DAG,
6617 SmallVectorImpl<SDNode *> &Created) {
6618 EVT VT = N->getValueType(0);
6619 EVT ShVT = TLI.getShiftAmountTy(VT, DAG.getDataLayout());
6620 EVT ShSVT = ShVT.getScalarType();
6621
6622 bool UseSRL = false;
6623 SmallVector<SDValue, 16> Shifts, Factors;
6624
6625 auto BuildUDIVPattern = [&](ConstantSDNode *C) {
6626 if (C->isZero())
6627 return false;
6628
6629 EVT CT = C->getValueType(0);
6630 APInt Divisor = C->getAPIntValue();
6631 unsigned Shift = Divisor.countr_zero();
6632 if (Shift) {
6633 Divisor.lshrInPlace(Shift);
6634 UseSRL = true;
6635 }
6636 // Calculate the multiplicative inverse modulo BW.
6637 APInt Factor = Divisor.multiplicativeInverse();
6638 Shifts.push_back(DAG.getConstant(Shift, dl, ShSVT));
6639 Factors.push_back(DAG.getConstant(Factor, dl, CT));
6640 return true;
6641 };
6642
6643 SDValue Op1 = N->getOperand(1);
6644
6645 // Collect all magic values from the build vector.
6646 if (!ISD::matchUnaryPredicate(Op1, BuildUDIVPattern))
6647 return SDValue();
6648
6649 SDValue Shift, Factor;
6650 if (Op1.getOpcode() == ISD::BUILD_VECTOR) {
6651 Shift = DAG.getBuildVector(ShVT, dl, Shifts);
6652 Factor = DAG.getBuildVector(VT, dl, Factors);
6653 } else if (Op1.getOpcode() == ISD::SPLAT_VECTOR) {
6654 assert(Shifts.size() == 1 && Factors.size() == 1 &&
6655 "Expected matchUnaryPredicate to return one element for scalable "
6656 "vectors");
6657 Shift = DAG.getSplatVector(ShVT, dl, Shifts[0]);
6658 Factor = DAG.getSplatVector(VT, dl, Factors[0]);
6659 } else {
6660 assert(isa<ConstantSDNode>(Op1) && "Expected a constant");
6661 Shift = Shifts[0];
6662 Factor = Factors[0];
6663 }
6664
6665 SDValue Res = N->getOperand(0);
6666 if (UseSRL) {
6667 Res = DAG.getNode(ISD::SRL, dl, VT, Res, Shift, SDNodeFlags::Exact);
6668 Created.push_back(Res.getNode());
6669 }
6670
6671 return DAG.getNode(ISD::MUL, dl, VT, Res, Factor);
6672}
6673
6675 SelectionDAG &DAG,
6676 SmallVectorImpl<SDNode *> &Created) const {
6677 AttributeList Attr = DAG.getMachineFunction().getFunction().getAttributes();
6678 if (isIntDivCheap(N->getValueType(0), Attr))
6679 return SDValue(N, 0); // Lower SDIV as SDIV
6680 return SDValue();
6681}
6682
6683SDValue
6685 SelectionDAG &DAG,
6686 SmallVectorImpl<SDNode *> &Created) const {
6687 AttributeList Attr = DAG.getMachineFunction().getFunction().getAttributes();
6688 if (isIntDivCheap(N->getValueType(0), Attr))
6689 return SDValue(N, 0); // Lower SREM as SREM
6690 return SDValue();
6691}
6692
6693/// Build sdiv by power-of-2 with conditional move instructions
6694/// Ref: "Hacker's Delight" by Henry Warren 10-1
6695/// If conditional move/branch is preferred, we lower sdiv x, +/-2**k into:
6696/// bgez x, label
6697/// add x, x, 2**k-1
6698/// label:
6699/// sra res, x, k
6700/// neg res, res (when the divisor is negative)
6702 SDNode *N, const APInt &Divisor, SelectionDAG &DAG,
6703 SmallVectorImpl<SDNode *> &Created) const {
6704 unsigned Lg2 = Divisor.countr_zero();
6705 EVT VT = N->getValueType(0);
6706
6707 SDLoc DL(N);
6708 SDValue N0 = N->getOperand(0);
6709 SDValue Zero = DAG.getConstant(0, DL, VT);
6710 APInt Lg2Mask = APInt::getLowBitsSet(VT.getSizeInBits(), Lg2);
6711 SDValue Pow2MinusOne = DAG.getConstant(Lg2Mask, DL, VT);
6712
6713 // If N0 is negative, we need to add (Pow2 - 1) to it before shifting right.
6714 EVT CCVT = getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
6715 SDValue Cmp = DAG.getSetCC(DL, CCVT, N0, Zero, ISD::SETLT);
6716 SDValue Add = DAG.getNode(ISD::ADD, DL, VT, N0, Pow2MinusOne);
6717 SDValue CMov = DAG.getNode(ISD::SELECT, DL, VT, Cmp, Add, N0);
6718
6719 Created.push_back(Cmp.getNode());
6720 Created.push_back(Add.getNode());
6721 Created.push_back(CMov.getNode());
6722
6723 // Divide by pow2.
6724 SDValue SRA = DAG.getNode(ISD::SRA, DL, VT, CMov,
6725 DAG.getShiftAmountConstant(Lg2, VT, DL));
6726
6727 // If we're dividing by a positive value, we're done. Otherwise, we must
6728 // negate the result.
6729 if (Divisor.isNonNegative())
6730 return SRA;
6731
6732 Created.push_back(SRA.getNode());
6733 return DAG.getNode(ISD::SUB, DL, VT, Zero, SRA);
6734}
6735
6736/// Given an ISD::SDIV node expressing a divide by constant,
6737/// return a DAG expression to select that will generate the same value by
6738/// multiplying by a magic number.
6739/// Ref: "Hacker's Delight" or "The PowerPC Compiler Writer's Guide".
6741 bool IsAfterLegalization,
6742 bool IsAfterLegalTypes,
6743 SmallVectorImpl<SDNode *> &Created) const {
6744 SDLoc dl(N);
6745
6746 // If the sdiv has an 'exact' bit we can use a simpler lowering.
6747 if (N->getFlags().hasExact())
6748 return BuildExactSDIV(*this, N, dl, DAG, Created);
6749
6750 EVT VT = N->getValueType(0);
6751 EVT SVT = VT.getScalarType();
6752 EVT ShVT = getShiftAmountTy(VT, DAG.getDataLayout());
6753 EVT ShSVT = ShVT.getScalarType();
6754 unsigned EltBits = VT.getScalarSizeInBits();
6755 EVT MulVT;
6756
6757 // Check to see if we can do this.
6758 // FIXME: We should be more aggressive here.
6759 EVT QueryVT = VT;
6760 if (VT.isVector()) {
6761 // If the vector type will be legalized to a vector type with the same
6762 // element type, allow the transform before type legalization if MULHS or
6763 // SMUL_LOHI are supported.
6764 QueryVT = getLegalTypeToTransformTo(*DAG.getContext(), VT);
6765 if (!QueryVT.isVector() ||
6767 return SDValue();
6768 } else if (!isTypeLegal(VT)) {
6769 // Limit this to simple scalars for now.
6770 if (!VT.isSimple())
6771 return SDValue();
6772
6773 // If this type will be promoted to a large enough type with a legal
6774 // multiply operation, we can go ahead and do this transform.
6776 return SDValue();
6777
6778 MulVT = getTypeToTransformTo(*DAG.getContext(), VT);
6779 if (MulVT.getSizeInBits() < (2 * EltBits) ||
6780 !isOperationLegal(ISD::MUL, MulVT))
6781 return SDValue();
6782 }
6783
6784 bool HasMULHS =
6785 isOperationLegalOrCustom(ISD::MULHS, QueryVT, IsAfterLegalization);
6786 bool HasSMUL_LOHI =
6787 isOperationLegalOrCustom(ISD::SMUL_LOHI, QueryVT, IsAfterLegalization);
6788
6789 if (isTypeLegal(VT) && !HasMULHS && !HasSMUL_LOHI && MulVT == EVT()) {
6790 // If type twice as wide legal, widen and use a mul plus a shift.
6791 EVT WideVT = VT.widenIntegerElementType(*DAG.getContext());
6792 // Some targets like AMDGPU try to go from SDIV to SDIVREM which is then
6793 // custom lowered. This is very expensive so avoid it at all costs for
6794 // constant divisors.
6795 if ((!IsAfterLegalTypes && isOperationExpand(ISD::SDIV, VT) &&
6798 MulVT = WideVT;
6799 }
6800
6801 if (!HasMULHS && !HasSMUL_LOHI && MulVT == EVT())
6802 return SDValue();
6803
6804 // If we're after type legalization and SVT is not legal, use the
6805 // promoted type for creating constants to avoid creating nodes with
6806 // illegal types.
6807 if (IsAfterLegalTypes && VT.isVector()) {
6808 SVT = getTypeToTransformTo(*DAG.getContext(), SVT);
6809 if (SVT.bitsLT(VT.getScalarType()))
6810 return SDValue();
6811 ShSVT = getTypeToTransformTo(*DAG.getContext(), ShSVT);
6812 if (ShSVT.bitsLT(ShVT.getScalarType()))
6813 return SDValue();
6814 }
6815 const unsigned SVTBits = SVT.getSizeInBits();
6816
6817 SmallVector<SDValue, 16> MagicFactors, Factors, Shifts, ShiftMasks;
6818
6819 auto BuildSDIVPattern = [&](ConstantSDNode *C) {
6820 if (C->isZero())
6821 return false;
6822 // Truncate the divisor to the target scalar type in case it was promoted
6823 // during type legalization.
6824 APInt Divisor = C->getAPIntValue().trunc(EltBits);
6826 int NumeratorFactor = 0;
6827 int ShiftMask = -1;
6828
6829 if (Divisor.isOne() || Divisor.isAllOnes()) {
6830 // If d is +1/-1, we just multiply the numerator by +1/-1.
6831 NumeratorFactor = Divisor.getSExtValue();
6832 magics.Magic = 0;
6833 magics.ShiftAmount = 0;
6834 ShiftMask = 0;
6835 } else if (Divisor.isStrictlyPositive() && magics.Magic.isNegative()) {
6836 // If d > 0 and m < 0, add the numerator.
6837 NumeratorFactor = 1;
6838 } else if (Divisor.isNegative() && magics.Magic.isStrictlyPositive()) {
6839 // If d < 0 and m > 0, subtract the numerator.
6840 NumeratorFactor = -1;
6841 }
6842
6843 MagicFactors.push_back(
6844 DAG.getConstant(magics.Magic.zext(SVTBits), dl, SVT));
6845 Factors.push_back(DAG.getSignedConstant(NumeratorFactor, dl, SVT));
6846 Shifts.push_back(DAG.getConstant(magics.ShiftAmount, dl, ShSVT));
6847 ShiftMasks.push_back(DAG.getSignedConstant(ShiftMask, dl, SVT));
6848 return true;
6849 };
6850
6851 SDValue N0 = N->getOperand(0);
6852 SDValue N1 = N->getOperand(1);
6853
6854 // Collect the shifts / magic values from each element.
6855 if (!ISD::matchUnaryPredicate(N1, BuildSDIVPattern, /*AllowUndefs=*/false,
6856 /*AllowTruncation=*/true))
6857 return SDValue();
6858
6859 SDValue MagicFactor, Factor, Shift, ShiftMask;
6860 if (N1.getOpcode() == ISD::BUILD_VECTOR) {
6861 MagicFactor = DAG.getBuildVector(VT, dl, MagicFactors);
6862 Factor = DAG.getBuildVector(VT, dl, Factors);
6863 Shift = DAG.getBuildVector(ShVT, dl, Shifts);
6864 ShiftMask = DAG.getBuildVector(VT, dl, ShiftMasks);
6865 } else if (N1.getOpcode() == ISD::SPLAT_VECTOR) {
6866 assert(MagicFactors.size() == 1 && Factors.size() == 1 &&
6867 Shifts.size() == 1 && ShiftMasks.size() == 1 &&
6868 "Expected matchUnaryPredicate to return one element for scalable "
6869 "vectors");
6870 MagicFactor = DAG.getSplatVector(VT, dl, MagicFactors[0]);
6871 Factor = DAG.getSplatVector(VT, dl, Factors[0]);
6872 Shift = DAG.getSplatVector(ShVT, dl, Shifts[0]);
6873 ShiftMask = DAG.getSplatVector(VT, dl, ShiftMasks[0]);
6874 } else {
6875 assert(isa<ConstantSDNode>(N1) && "Expected a constant");
6876 MagicFactor = MagicFactors[0];
6877 Factor = Factors[0];
6878 Shift = Shifts[0];
6879 ShiftMask = ShiftMasks[0];
6880 }
6881
6882 // Multiply the numerator (operand 0) by the magic value.
6883 auto GetMULHS = [&](SDValue X, SDValue Y) {
6884 if (HasMULHS)
6885 return DAG.getNode(ISD::MULHS, dl, VT, X, Y);
6886 if (HasSMUL_LOHI) {
6887 SDValue LoHi =
6888 DAG.getNode(ISD::SMUL_LOHI, dl, DAG.getVTList(VT, VT), X, Y);
6889 return LoHi.getValue(1);
6890 }
6891
6892 X = DAG.getNode(ISD::SIGN_EXTEND, dl, MulVT, X);
6893 Y = DAG.getNode(ISD::SIGN_EXTEND, dl, MulVT, Y);
6894 Y = DAG.getNode(ISD::MUL, dl, MulVT, X, Y);
6895 Y = DAG.getNode(ISD::SRL, dl, MulVT, Y,
6896 DAG.getShiftAmountConstant(EltBits, MulVT, dl));
6897 return DAG.getNode(ISD::TRUNCATE, dl, VT, Y);
6898 };
6899
6900 SDValue Q = GetMULHS(N0, MagicFactor);
6901 if (!Q)
6902 return SDValue();
6903
6904 Created.push_back(Q.getNode());
6905
6906 // (Optionally) Add/subtract the numerator using Factor.
6907 Factor = DAG.getNode(ISD::MUL, dl, VT, N0, Factor);
6908 Created.push_back(Factor.getNode());
6909 Q = DAG.getNode(ISD::ADD, dl, VT, Q, Factor);
6910 Created.push_back(Q.getNode());
6911
6912 // Shift right algebraic by shift value.
6913 Q = DAG.getNode(ISD::SRA, dl, VT, Q, Shift);
6914 Created.push_back(Q.getNode());
6915
6916 // Extract the sign bit, mask it and add it to the quotient.
6917 SDValue SignShift = DAG.getConstant(EltBits - 1, dl, ShVT);
6918 SDValue T = DAG.getNode(ISD::SRL, dl, VT, Q, SignShift);
6919 Created.push_back(T.getNode());
6920 T = DAG.getNode(ISD::AND, dl, VT, T, ShiftMask);
6921 Created.push_back(T.getNode());
6922 return DAG.getNode(ISD::ADD, dl, VT, Q, T);
6923}
6924
6925/// Given an ISD::UDIV node expressing a divide by constant,
6926/// return a DAG expression to select that will generate the same value by
6927/// multiplying by a magic number.
6928/// Ref: "Hacker's Delight" or "The PowerPC Compiler Writer's Guide".
6930 bool IsAfterLegalization,
6931 bool IsAfterLegalTypes,
6932 SmallVectorImpl<SDNode *> &Created) const {
6933 SDLoc dl(N);
6934
6935 // If the udiv has an 'exact' bit we can use a simpler lowering.
6936 if (N->getFlags().hasExact())
6937 return BuildExactUDIV(*this, N, dl, DAG, Created);
6938
6939 EVT VT = N->getValueType(0);
6940 EVT SVT = VT.getScalarType();
6941 EVT ShVT = getShiftAmountTy(VT, DAG.getDataLayout());
6942 EVT ShSVT = ShVT.getScalarType();
6943 unsigned EltBits = VT.getScalarSizeInBits();
6944 EVT MulVT;
6945
6946 // Check to see if we can do this.
6947 // FIXME: We should be more aggressive here.
6948 EVT QueryVT = VT;
6949 if (VT.isVector()) {
6950 // If the vector type will be legalized to a vector type with the same
6951 // element type, allow the transform before type legalization if MULHU or
6952 // UMUL_LOHI are supported.
6953 QueryVT = getLegalTypeToTransformTo(*DAG.getContext(), VT);
6954 if (!QueryVT.isVector() ||
6956 return SDValue();
6957 } else if (!isTypeLegal(VT)) {
6958 // Limit this to simple scalars for now.
6959 if (!VT.isSimple())
6960 return SDValue();
6961
6962 // If this type will be promoted to a large enough type with a legal
6963 // multiply operation, we can go ahead and do this transform.
6965 return SDValue();
6966
6967 MulVT = getTypeToTransformTo(*DAG.getContext(), VT);
6968 if (MulVT.getSizeInBits() < (2 * EltBits) ||
6969 !isOperationLegal(ISD::MUL, MulVT))
6970 return SDValue();
6971 }
6972
6973 bool HasMULHU =
6974 isOperationLegalOrCustom(ISD::MULHU, QueryVT, IsAfterLegalization);
6975 bool HasUMUL_LOHI =
6976 isOperationLegalOrCustom(ISD::UMUL_LOHI, QueryVT, IsAfterLegalization);
6977
6978 if (isTypeLegal(VT) && !HasMULHU && !HasUMUL_LOHI && MulVT == EVT()) {
6979 // If type twice as wide legal, widen and use a mul plus a shift.
6980 EVT WideVT = VT.widenIntegerElementType(*DAG.getContext());
6981 // Some targets like AMDGPU try to go from UDIV to UDIVREM which is then
6982 // custom lowered. This is very expensive so avoid it at all costs for
6983 // constant divisors.
6984 if ((!IsAfterLegalTypes && isOperationExpand(ISD::UDIV, VT) &&
6987 MulVT = WideVT;
6988 }
6989
6990 if (!HasMULHU && !HasUMUL_LOHI && MulVT == EVT())
6991 return SDValue();
6992
6993 SDValue N0 = N->getOperand(0);
6994 SDValue N1 = N->getOperand(1);
6995
6996 // Try to use leading zeros of the dividend to reduce the multiplier and
6997 // avoid expensive fixups.
6998 unsigned KnownLeadingZeros = DAG.computeKnownBits(N0).countMinLeadingZeros();
6999
7000 // If we're after type legalization and SVT is not legal, use the
7001 // promoted type for creating constants to avoid creating nodes with
7002 // illegal types.
7003 if (IsAfterLegalTypes && VT.isVector()) {
7004 SVT = getTypeToTransformTo(*DAG.getContext(), SVT);
7005 if (SVT.bitsLT(VT.getScalarType()))
7006 return SDValue();
7007 ShSVT = getTypeToTransformTo(*DAG.getContext(), ShSVT);
7008 if (ShSVT.bitsLT(ShVT.getScalarType()))
7009 return SDValue();
7010 }
7011 const unsigned SVTBits = SVT.getSizeInBits();
7012
7013 // Allow i32 to be widened to i64 for uncooperative divisors if i64 MULHU or
7014 // UMUL_LOHI is supported.
7015 const EVT WideSVT = MVT::i64;
7016 const bool HasWideMULHU =
7017 VT == MVT::i32 &&
7018 isOperationLegalOrCustom(ISD::MULHU, WideSVT, IsAfterLegalization);
7019 const bool HasWideUMUL_LOHI =
7020 VT == MVT::i32 &&
7021 isOperationLegalOrCustom(ISD::UMUL_LOHI, WideSVT, IsAfterLegalization);
7022 const bool AllowWiden = (HasWideMULHU || HasWideUMUL_LOHI);
7023
7024 // For even divisors with a 33-bit magic number, the widened high-multiply
7025 // path is only worthwhile over the even-divisor rewrite on targets that
7026 // zero-extend i32 to i64 for free (e.g. x86-64 and AArch64). Elsewhere (e.g.
7027 // RISC-V) keep the even-divisor rewrite, which avoids the explicit extension.
7028 const bool AllowEvenToWiden = AllowWiden && isZExtFree(VT, WideSVT);
7029
7030 bool UseNPQ = false, UsePreShift = false, UsePostShift = false;
7031 bool UseWiden = false;
7032 SmallVector<SDValue, 16> PreShifts, PostShifts, MagicFactors, NPQFactors;
7033
7034 auto BuildUDIVPattern = [&](ConstantSDNode *C) {
7035 if (C->isZero())
7036 return false;
7037 // Truncate the divisor to the target scalar type in case it was promoted
7038 // during type legalization.
7039 APInt Divisor = C->getAPIntValue().trunc(EltBits);
7040
7041 SDValue PreShift, MagicFactor, NPQFactor, PostShift;
7042
7043 // Magic algorithm doesn't work for division by 1. We need to emit a select
7044 // at the end.
7045 if (Divisor.isOne()) {
7046 PreShift = PostShift = DAG.getUNDEF(ShSVT);
7047 MagicFactor = NPQFactor = DAG.getUNDEF(SVT);
7048 } else {
7051 Divisor, std::min(KnownLeadingZeros, Divisor.countl_zero()),
7052 /*AllowEvenDivisorOptimization=*/!AllowEvenToWiden,
7053 /*AllowWidenOptimization=*/AllowWiden);
7054
7055 if (magics.Widen) {
7056 UseWiden = true;
7057 MagicFactor = DAG.getConstant(magics.Magic, dl, WideSVT);
7058 } else {
7059 MagicFactor = DAG.getConstant(magics.Magic.zext(SVTBits), dl, SVT);
7060 }
7061
7062 assert(magics.PreShift < Divisor.getBitWidth() &&
7063 "We shouldn't generate an undefined shift!");
7064 assert(magics.PostShift < Divisor.getBitWidth() &&
7065 "We shouldn't generate an undefined shift!");
7066 assert((!magics.IsAdd || magics.PreShift == 0) &&
7067 "Unexpected pre-shift");
7068 PreShift = DAG.getConstant(magics.PreShift, dl, ShSVT);
7069 PostShift = DAG.getConstant(magics.PostShift, dl, ShSVT);
7070 NPQFactor = DAG.getConstant(
7071 magics.IsAdd ? APInt::getOneBitSet(SVTBits, EltBits - 1)
7072 : APInt::getZero(SVTBits),
7073 dl, SVT);
7074 UseNPQ |= magics.IsAdd;
7075 UsePreShift |= magics.PreShift != 0;
7076 UsePostShift |= magics.PostShift != 0;
7077 }
7078
7079 PreShifts.push_back(PreShift);
7080 MagicFactors.push_back(MagicFactor);
7081 NPQFactors.push_back(NPQFactor);
7082 PostShifts.push_back(PostShift);
7083 return true;
7084 };
7085
7086 // Collect the shifts/magic values from each element.
7087 if (!ISD::matchUnaryPredicate(N1, BuildUDIVPattern, /*AllowUndefs=*/false,
7088 /*AllowTruncation=*/true))
7089 return SDValue();
7090
7091 SDValue PreShift, PostShift, MagicFactor, NPQFactor;
7092 if (N1.getOpcode() == ISD::BUILD_VECTOR) {
7093 PreShift = DAG.getBuildVector(ShVT, dl, PreShifts);
7094 MagicFactor = DAG.getBuildVector(VT, dl, MagicFactors);
7095 NPQFactor = DAG.getBuildVector(VT, dl, NPQFactors);
7096 PostShift = DAG.getBuildVector(ShVT, dl, PostShifts);
7097 } else if (N1.getOpcode() == ISD::SPLAT_VECTOR) {
7098 assert(PreShifts.size() == 1 && MagicFactors.size() == 1 &&
7099 NPQFactors.size() == 1 && PostShifts.size() == 1 &&
7100 "Expected matchUnaryPredicate to return one for scalable vectors");
7101 PreShift = DAG.getSplatVector(ShVT, dl, PreShifts[0]);
7102 MagicFactor = DAG.getSplatVector(VT, dl, MagicFactors[0]);
7103 NPQFactor = DAG.getSplatVector(VT, dl, NPQFactors[0]);
7104 PostShift = DAG.getSplatVector(ShVT, dl, PostShifts[0]);
7105 } else {
7106 assert(isa<ConstantSDNode>(N1) && "Expected a constant");
7107 PreShift = PreShifts[0];
7108 MagicFactor = MagicFactors[0];
7109 PostShift = PostShifts[0];
7110 }
7111
7112 if (UseWiden) {
7113 // Compute: (WideSVT(x) * MagicFactor) >> WideSVTBits.
7114 SDValue WideN0 = DAG.getNode(ISD::ZERO_EXTEND, dl, WideSVT, N0);
7115
7116 // Perform WideSVTxWideSVT -> 2*WideSVT multiplication and extract high
7117 // WideSVT bits
7118 SDValue High;
7119 if (HasWideMULHU) {
7120 High = DAG.getNode(ISD::MULHU, dl, WideSVT, WideN0, MagicFactor);
7121 } else {
7122 assert(HasWideUMUL_LOHI);
7123 SDValue LoHi =
7124 DAG.getNode(ISD::UMUL_LOHI, dl, DAG.getVTList(WideSVT, WideSVT),
7125 WideN0, MagicFactor);
7126 High = LoHi.getValue(1);
7127 }
7128
7129 Created.push_back(High.getNode());
7130 return DAG.getNode(ISD::TRUNCATE, dl, VT, High);
7131 }
7132
7133 SDValue Q = N0;
7134 if (UsePreShift) {
7135 Q = DAG.getNode(ISD::SRL, dl, VT, Q, PreShift);
7136 Created.push_back(Q.getNode());
7137 }
7138
7139 auto GetMULHU = [&](SDValue X, SDValue Y) {
7140 if (HasMULHU)
7141 return DAG.getNode(ISD::MULHU, dl, VT, X, Y);
7142 if (HasUMUL_LOHI) {
7143 SDValue LoHi =
7144 DAG.getNode(ISD::UMUL_LOHI, dl, DAG.getVTList(VT, VT), X, Y);
7145 return LoHi.getValue(1);
7146 }
7147
7148 X = DAG.getNode(ISD::ZERO_EXTEND, dl, MulVT, X);
7149 Y = DAG.getNode(ISD::ZERO_EXTEND, dl, MulVT, Y);
7150 Y = DAG.getNode(ISD::MUL, dl, MulVT, X, Y);
7151 Y = DAG.getNode(ISD::SRL, dl, MulVT, Y,
7152 DAG.getShiftAmountConstant(EltBits, MulVT, dl));
7153 return DAG.getNode(ISD::TRUNCATE, dl, VT, Y);
7154 };
7155
7156 // Multiply the numerator (operand 0) by the magic value.
7157 Q = GetMULHU(Q, MagicFactor);
7158 if (!Q)
7159 return SDValue();
7160
7161 Created.push_back(Q.getNode());
7162
7163 if (UseNPQ) {
7164 SDValue NPQ = DAG.getNode(ISD::SUB, dl, VT, N0, Q);
7165 Created.push_back(NPQ.getNode());
7166
7167 // For vectors we might have a mix of non-NPQ/NPQ paths, so use
7168 // MULHU to act as a SRL-by-1 for NPQ, else multiply by zero.
7169 if (VT.isVector())
7170 NPQ = GetMULHU(NPQ, NPQFactor);
7171 else
7172 NPQ = DAG.getNode(ISD::SRL, dl, VT, NPQ, DAG.getConstant(1, dl, ShVT));
7173
7174 Created.push_back(NPQ.getNode());
7175
7176 Q = DAG.getNode(ISD::ADD, dl, VT, NPQ, Q);
7177 Created.push_back(Q.getNode());
7178 }
7179
7180 if (UsePostShift) {
7181 Q = DAG.getNode(ISD::SRL, dl, VT, Q, PostShift);
7182 Created.push_back(Q.getNode());
7183 }
7184
7185 EVT SetCCVT = getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
7186
7187 SDValue One = DAG.getConstant(1, dl, VT);
7188 SDValue IsOne = DAG.getSetCC(dl, SetCCVT, N1, One, ISD::SETEQ);
7189 return DAG.getSelect(dl, VT, IsOne, N0, Q);
7190}
7191
7192/// If all values in Values that *don't* match the predicate are same 'splat'
7193/// value, then replace all values with that splat value.
7194/// Else, if AlternativeReplacement was provided, then replace all values that
7195/// do match predicate with AlternativeReplacement value.
7196static void
7198 std::function<bool(SDValue)> Predicate,
7199 SDValue AlternativeReplacement = SDValue()) {
7200 SDValue Replacement;
7201 // Is there a value for which the Predicate does *NOT* match? What is it?
7202 auto SplatValue = llvm::find_if_not(Values, Predicate);
7203 if (SplatValue != Values.end()) {
7204 // Does Values consist only of SplatValue's and values matching Predicate?
7205 if (llvm::all_of(Values, [Predicate, SplatValue](SDValue Value) {
7206 return Value == *SplatValue || Predicate(Value);
7207 })) // Then we shall replace values matching predicate with SplatValue.
7208 Replacement = *SplatValue;
7209 }
7210 if (!Replacement) {
7211 // Oops, we did not find the "baseline" splat value.
7212 if (!AlternativeReplacement)
7213 return; // Nothing to do.
7214 // Let's replace with provided value then.
7215 Replacement = AlternativeReplacement;
7216 }
7217 std::replace_if(Values.begin(), Values.end(), Predicate, Replacement);
7218}
7219
7220/// Given an ISD::UREM used only by an ISD::SETEQ or ISD::SETNE
7221/// where the divisor and comparison target are constants,
7222/// return a DAG expression that will generate the same comparison result
7223/// using only multiplications, additions and shifts/rotations.
7224/// Ref: "Hacker's Delight" 10-17.
7225SDValue TargetLowering::buildUREMEqFold(EVT SETCCVT, SDValue REMNode,
7226 SDValue CompTargetNode,
7228 DAGCombinerInfo &DCI,
7229 const SDLoc &DL) const {
7231 if (SDValue Folded = prepareUREMEqFold(SETCCVT, REMNode, CompTargetNode, Cond,
7232 DCI, DL, Built)) {
7233 for (SDNode *N : Built)
7234 DCI.AddToWorklist(N);
7235 return Folded;
7236 }
7237
7238 return SDValue();
7239}
7240
7241SDValue
7242TargetLowering::prepareUREMEqFold(EVT SETCCVT, SDValue REMNode,
7243 SDValue CompTargetNode, ISD::CondCode Cond,
7244 DAGCombinerInfo &DCI, const SDLoc &DL,
7245 SmallVectorImpl<SDNode *> &Created) const {
7246 // fold (seteq/ne (urem N, D), C) ->
7247 // (setule/ugt (rotr (mul (sub N, C), P), K), Q)
7248 // - D must be constant, with D = D0 * 2^K where D0 is odd
7249 // - P is the multiplicative inverse of D0 modulo 2^W
7250 // - Q = floor(((2^W) - 1) / D)
7251 // where W is the width of the common type of N and D.
7252 assert((Cond == ISD::SETEQ || Cond == ISD::SETNE) &&
7253 "Only applicable for (in)equality comparisons.");
7254
7255 SelectionDAG &DAG = DCI.DAG;
7256
7257 EVT VT = REMNode.getValueType();
7258 EVT SVT = VT.getScalarType();
7259 EVT ShVT = getShiftAmountTy(VT, DAG.getDataLayout());
7260 EVT ShSVT = ShVT.getScalarType();
7261
7262 // If MUL is unavailable, we cannot proceed in any case.
7263 if (!DCI.isBeforeLegalizeOps() && !isOperationLegalOrCustom(ISD::MUL, VT))
7264 return SDValue();
7265
7266 bool ComparingWithAllZeros = true;
7267 bool AllComparisonsWithNonZerosAreTautological = true;
7268 bool HadTautologicalLanes = false;
7269 bool AllLanesAreTautological = true;
7270 bool HadEvenDivisor = false;
7271 bool AllDivisorsArePowerOfTwo = true;
7272 bool HadTautologicalInvertedLanes = false;
7273 SmallVector<SDValue, 16> PAmts, KAmts, QAmts;
7274
7275 auto BuildUREMPattern = [&](ConstantSDNode *CDiv, ConstantSDNode *CCmp) {
7276 // Division by 0 is UB. Leave it to be constant-folded elsewhere.
7277 if (CDiv->isZero())
7278 return false;
7279
7280 const APInt &D = CDiv->getAPIntValue();
7281 const APInt &Cmp = CCmp->getAPIntValue();
7282
7283 ComparingWithAllZeros &= Cmp.isZero();
7284
7285 // x u% C1` is *always* less than C1. So given `x u% C1 == C2`,
7286 // if C2 is not less than C1, the comparison is always false.
7287 // But we will only be able to produce the comparison that will give the
7288 // opposive tautological answer. So this lane would need to be fixed up.
7289 bool TautologicalInvertedLane = D.ule(Cmp);
7290 HadTautologicalInvertedLanes |= TautologicalInvertedLane;
7291
7292 // If all lanes are tautological (either all divisors are ones, or divisor
7293 // is not greater than the constant we are comparing with),
7294 // we will prefer to avoid the fold.
7295 bool TautologicalLane = D.isOne() || TautologicalInvertedLane;
7296 HadTautologicalLanes |= TautologicalLane;
7297 AllLanesAreTautological &= TautologicalLane;
7298
7299 // If we are comparing with non-zero, we need'll need to subtract said
7300 // comparison value from the LHS. But there is no point in doing that if
7301 // every lane where we are comparing with non-zero is tautological..
7302 if (!Cmp.isZero())
7303 AllComparisonsWithNonZerosAreTautological &= TautologicalLane;
7304
7305 // Decompose D into D0 * 2^K
7306 unsigned K = D.countr_zero();
7307 assert((!D.isOne() || (K == 0)) && "For divisor '1' we won't rotate.");
7308 APInt D0 = D.lshr(K);
7309
7310 // D is even if it has trailing zeros.
7311 HadEvenDivisor |= (K != 0);
7312 // D is a power-of-two if D0 is one.
7313 // If all divisors are power-of-two, we will prefer to avoid the fold.
7314 AllDivisorsArePowerOfTwo &= D0.isOne();
7315
7316 // P = inv(D0, 2^W)
7317 // 2^W requires W + 1 bits, so we have to extend and then truncate.
7318 unsigned W = D.getBitWidth();
7319 APInt P = D0.multiplicativeInverse();
7320 assert((D0 * P).isOne() && "Multiplicative inverse basic check failed.");
7321
7322 // Q = floor((2^W - 1) u/ D)
7323 // R = ((2^W - 1) u% D)
7324 APInt Q, R;
7326
7327 // If we are comparing with zero, then that comparison constant is okay,
7328 // else it may need to be one less than that.
7329 if (Cmp.ugt(R))
7330 Q -= 1;
7331
7333 "We are expecting that K is always less than all-ones for ShSVT");
7334
7335 // If the lane is tautological the result can be constant-folded.
7336 if (TautologicalLane) {
7337 // Set P and K amount to a bogus values so we can try to splat them.
7338 P = 0;
7339 KAmts.push_back(DAG.getAllOnesConstant(DL, ShSVT));
7340 // And ensure that comparison constant is tautological,
7341 // it will always compare true/false.
7342 Q.setAllBits();
7343 } else {
7344 KAmts.push_back(DAG.getConstant(K, DL, ShSVT));
7345 }
7346
7347 PAmts.push_back(DAG.getConstant(P, DL, SVT));
7348 QAmts.push_back(DAG.getConstant(Q, DL, SVT));
7349 return true;
7350 };
7351
7352 SDValue N = REMNode.getOperand(0);
7353 SDValue D = REMNode.getOperand(1);
7354
7355 // Collect the values from each element.
7356 if (!ISD::matchBinaryPredicate(D, CompTargetNode, BuildUREMPattern))
7357 return SDValue();
7358
7359 // If all lanes are tautological, the result can be constant-folded.
7360 if (AllLanesAreTautological)
7361 return SDValue();
7362
7363 // If this is a urem by a powers-of-two, avoid the fold since it can be
7364 // best implemented as a bit test.
7365 if (AllDivisorsArePowerOfTwo)
7366 return SDValue();
7367
7368 SDValue PVal, KVal, QVal;
7369 if (D.getOpcode() == ISD::BUILD_VECTOR) {
7370 if (HadTautologicalLanes) {
7371 // Try to turn PAmts into a splat, since we don't care about the values
7372 // that are currently '0'. If we can't, just keep '0'`s.
7374 // Try to turn KAmts into a splat, since we don't care about the values
7375 // that are currently '-1'. If we can't, change them to '0'`s.
7377 DAG.getConstant(0, DL, ShSVT));
7378 }
7379
7380 PVal = DAG.getBuildVector(VT, DL, PAmts);
7381 KVal = DAG.getBuildVector(ShVT, DL, KAmts);
7382 QVal = DAG.getBuildVector(VT, DL, QAmts);
7383 } else if (D.getOpcode() == ISD::SPLAT_VECTOR) {
7384 assert(PAmts.size() == 1 && KAmts.size() == 1 && QAmts.size() == 1 &&
7385 "Expected matchBinaryPredicate to return one element for "
7386 "SPLAT_VECTORs");
7387 PVal = DAG.getSplatVector(VT, DL, PAmts[0]);
7388 KVal = DAG.getSplatVector(ShVT, DL, KAmts[0]);
7389 QVal = DAG.getSplatVector(VT, DL, QAmts[0]);
7390 } else {
7391 PVal = PAmts[0];
7392 KVal = KAmts[0];
7393 QVal = QAmts[0];
7394 }
7395
7396 if (!ComparingWithAllZeros && !AllComparisonsWithNonZerosAreTautological) {
7397 if (!DCI.isBeforeLegalizeOps() && !isOperationLegalOrCustom(ISD::SUB, VT))
7398 return SDValue(); // FIXME: Could/should use `ISD::ADD`?
7399 assert(CompTargetNode.getValueType() == N.getValueType() &&
7400 "Expecting that the types on LHS and RHS of comparisons match.");
7401 N = DAG.getNode(ISD::SUB, DL, VT, N, CompTargetNode);
7402 }
7403
7404 // (mul N, P)
7405 SDValue Op0 = DAG.getNode(ISD::MUL, DL, VT, N, PVal);
7406 Created.push_back(Op0.getNode());
7407
7408 // Rotate right only if any divisor was even. We avoid rotates for all-odd
7409 // divisors as a performance improvement, since rotating by 0 is a no-op.
7410 if (HadEvenDivisor) {
7411 // We need ROTR to do this.
7412 if (!DCI.isBeforeLegalizeOps() && !isOperationLegalOrCustom(ISD::ROTR, VT))
7413 return SDValue();
7414 // UREM: (rotr (mul N, P), K)
7415 Op0 = DAG.getNode(ISD::ROTR, DL, VT, Op0, KVal);
7416 Created.push_back(Op0.getNode());
7417 }
7418
7419 // UREM: (setule/setugt (rotr (mul N, P), K), Q)
7420 SDValue NewCC =
7421 DAG.getSetCC(DL, SETCCVT, Op0, QVal,
7423 if (!HadTautologicalInvertedLanes)
7424 return NewCC;
7425
7426 // If any lanes previously compared always-false, the NewCC will give
7427 // always-true result for them, so we need to fixup those lanes.
7428 // Or the other way around for inequality predicate.
7429 assert(VT.isVector() && "Can/should only get here for vectors.");
7430 Created.push_back(NewCC.getNode());
7431
7432 // x u% C1` is *always* less than C1. So given `x u% C1 == C2`,
7433 // if C2 is not less than C1, the comparison is always false.
7434 // But we have produced the comparison that will give the
7435 // opposive tautological answer. So these lanes would need to be fixed up.
7436 SDValue TautologicalInvertedChannels =
7437 DAG.getSetCC(DL, SETCCVT, D, CompTargetNode, ISD::SETULE);
7438 Created.push_back(TautologicalInvertedChannels.getNode());
7439
7440 // NOTE: we avoid letting illegal types through even if we're before legalize
7441 // ops – legalization has a hard time producing good code for this.
7442 if (isOperationLegalOrCustom(ISD::VSELECT, SETCCVT)) {
7443 // If we have a vector select, let's replace the comparison results in the
7444 // affected lanes with the correct tautological result.
7445 SDValue Replacement = DAG.getBoolConstant(Cond == ISD::SETEQ ? false : true,
7446 DL, SETCCVT, SETCCVT);
7447 return DAG.getNode(ISD::VSELECT, DL, SETCCVT, TautologicalInvertedChannels,
7448 Replacement, NewCC);
7449 }
7450
7451 // Else, we can just invert the comparison result in the appropriate lanes.
7452 //
7453 // NOTE: see the note above VSELECT above.
7454 if (isOperationLegalOrCustom(ISD::XOR, SETCCVT))
7455 return DAG.getNode(ISD::XOR, DL, SETCCVT, NewCC,
7456 TautologicalInvertedChannels);
7457
7458 return SDValue(); // Don't know how to lower.
7459}
7460
7461/// Given an ISD::SREM used only by an ISD::SETEQ or ISD::SETNE
7462/// where the divisor is constant and the comparison target is zero,
7463/// return a DAG expression that will generate the same comparison result
7464/// using only multiplications, additions and shifts/rotations.
7465/// Ref: "Hacker's Delight" 10-17.
7466SDValue TargetLowering::buildSREMEqFold(EVT SETCCVT, SDValue REMNode,
7467 SDValue CompTargetNode,
7469 DAGCombinerInfo &DCI,
7470 const SDLoc &DL) const {
7472 if (SDValue Folded = prepareSREMEqFold(SETCCVT, REMNode, CompTargetNode, Cond,
7473 DCI, DL, Built)) {
7474 assert(Built.size() <= 7 && "Max size prediction failed.");
7475 for (SDNode *N : Built)
7476 DCI.AddToWorklist(N);
7477 return Folded;
7478 }
7479
7480 return SDValue();
7481}
7482
7483SDValue
7484TargetLowering::prepareSREMEqFold(EVT SETCCVT, SDValue REMNode,
7485 SDValue CompTargetNode, ISD::CondCode Cond,
7486 DAGCombinerInfo &DCI, const SDLoc &DL,
7487 SmallVectorImpl<SDNode *> &Created) const {
7488 // Derived from Hacker's Delight, 2nd Edition, by Hank Warren. Section 10-17.
7489 // Fold:
7490 // (seteq/ne (srem N, D), 0)
7491 // To:
7492 // (setule/ugt (rotr (add (mul N, P), A), K), Q)
7493 //
7494 // - D must be constant, with D = D0 * 2^K where D0 is odd
7495 // - P is the multiplicative inverse of D0 modulo 2^W
7496 // - A = bitwiseand(floor((2^(W - 1) - 1) / D0), (-(2^k)))
7497 // - Q = floor((2 * A) / (2^K))
7498 // where W is the width of the common type of N and D.
7499 //
7500 // When D is a power of two (and thus D0 is 1), the normal
7501 // formula for A and Q don't apply, because the derivation
7502 // depends on D not dividing 2^(W-1), and thus theorem ZRS
7503 // does not apply. This specifically fails when N = INT_MIN.
7504 //
7505 // Instead, for power-of-two D, we use:
7506 // - A = 0
7507 // | -> No offset needed. We're effectively treating it the same as urem.
7508 // - Q = 2^(W-K) - 1
7509 // |-> Test that the top K bits are zero after rotation
7510 assert((Cond == ISD::SETEQ || Cond == ISD::SETNE) &&
7511 "Only applicable for (in)equality comparisons.");
7512
7513 SelectionDAG &DAG = DCI.DAG;
7514
7515 EVT VT = REMNode.getValueType();
7516 EVT SVT = VT.getScalarType();
7517 EVT ShVT = getShiftAmountTy(VT, DAG.getDataLayout());
7518 EVT ShSVT = ShVT.getScalarType();
7519
7520 // If we are after ops legalization, and MUL is unavailable, we can not
7521 // proceed.
7522 if (!DCI.isBeforeLegalizeOps() && !isOperationLegalOrCustom(ISD::MUL, VT))
7523 return SDValue();
7524
7525 // TODO: Could support comparing with non-zero too.
7526 ConstantSDNode *CompTarget = isConstOrConstSplat(CompTargetNode);
7527 if (!CompTarget || !CompTarget->isZero())
7528 return SDValue();
7529
7530 bool HadOneDivisor = false;
7531 bool AllDivisorsAreOnes = true;
7532 bool HadEvenDivisor = false;
7533 bool AllDivisorsArePowerOfTwo = true;
7534 SmallVector<SDValue, 16> PAmts, AAmts, KAmts, QAmts;
7535
7536 auto BuildSREMPattern = [&](ConstantSDNode *C) {
7537 // Division by 0 is UB. Leave it to be constant-folded elsewhere.
7538 if (C->isZero())
7539 return false;
7540
7541 // FIXME: we don't fold `rem %X, -C` to `rem %X, C` in DAGCombine.
7542
7543 // WARNING: this fold is only valid for positive divisors!
7544 // `rem %X, -C` is equivalent to `rem %X, C`
7545 APInt D = C->getAPIntValue().abs();
7546
7547 // If all divisors are ones, we will prefer to avoid the fold.
7548 HadOneDivisor |= D.isOne();
7549 AllDivisorsAreOnes &= D.isOne();
7550
7551 // Decompose D into D0 * 2^K
7552 unsigned K = D.countr_zero();
7553 assert((!D.isOne() || (K == 0)) && "For divisor '1' we won't rotate.");
7554 APInt D0 = D.lshr(K);
7555
7556 // D is even if it has trailing zeros.
7557 HadEvenDivisor |= (K != 0);
7558
7559 // D is a power-of-two if D0 is one. This includes INT_MIN.
7560 // If all divisors are power-of-two, we will prefer to avoid the fold.
7561 AllDivisorsArePowerOfTwo &= D0.isOne();
7562
7563 // P = inv(D0, 2^W)
7564 // 2^W requires W + 1 bits, so we have to extend and then truncate.
7565 unsigned W = D.getBitWidth();
7566 APInt P = D0.multiplicativeInverse();
7567 assert((D0 * P).isOne() && "Multiplicative inverse basic check failed.");
7568
7569 // A = floor((2^(W - 1) - 1) / D0) & -2^K
7570 APInt A = APInt::getSignedMaxValue(W).udiv(D0);
7571 A.clearLowBits(K);
7572
7573 // Q = floor((2 * A) / (2^K))
7574 APInt Q = (2 * A).udiv(APInt::getOneBitSet(W, K));
7575
7577 "We are expecting that A is always less than all-ones for SVT");
7579 "We are expecting that K is always less than all-ones for ShSVT");
7580
7581 // If D was a power of two, apply the alternate constant derivation.
7582 if (D0.isOne()) {
7583 // A = 0
7584 A = APInt(W, 0);
7585 // - Q = 2^(W-K) - 1
7586 Q = APInt::getLowBitsSet(W, W - K);
7587 }
7588
7589 // If the divisor is 1 the result can be constant-folded.
7590 if (D.isOne()) {
7591 // Set P, A and K to a bogus values so we can try to splat them.
7592 P = 0;
7593 A.setAllBits();
7594 KAmts.push_back(DAG.getAllOnesConstant(DL, ShSVT));
7595
7596 // x ?% 1 == 0 <--> true <--> x u<= -1
7597 Q.setAllBits();
7598 } else {
7599 KAmts.push_back(DAG.getConstant(K, DL, ShSVT));
7600 }
7601
7602 PAmts.push_back(DAG.getConstant(P, DL, SVT));
7603 AAmts.push_back(DAG.getConstant(A, DL, SVT));
7604 QAmts.push_back(DAG.getConstant(Q, DL, SVT));
7605 return true;
7606 };
7607
7608 SDValue N = REMNode.getOperand(0);
7609 SDValue D = REMNode.getOperand(1);
7610
7611 // Collect the values from each element.
7612 if (!ISD::matchUnaryPredicate(D, BuildSREMPattern))
7613 return SDValue();
7614
7615 // If this is a srem by a one, avoid the fold since it can be constant-folded.
7616 if (AllDivisorsAreOnes)
7617 return SDValue();
7618
7619 // If this is a srem by a powers-of-two (including INT_MIN), avoid the fold
7620 // since it can be best implemented as a bit test.
7621 if (AllDivisorsArePowerOfTwo)
7622 return SDValue();
7623
7624 SDValue PVal, AVal, KVal, QVal;
7625 if (D.getOpcode() == ISD::BUILD_VECTOR) {
7626 if (HadOneDivisor) {
7627 // Try to turn PAmts into a splat, since we don't care about the values
7628 // that are currently '0'. If we can't, just keep '0'`s.
7630 // Try to turn AAmts into a splat, since we don't care about the
7631 // values that are currently '-1'. If we can't, change them to '0'`s.
7633 DAG.getConstant(0, DL, SVT));
7634 // Try to turn KAmts into a splat, since we don't care about the values
7635 // that are currently '-1'. If we can't, change them to '0'`s.
7637 DAG.getConstant(0, DL, ShSVT));
7638 }
7639
7640 PVal = DAG.getBuildVector(VT, DL, PAmts);
7641 AVal = DAG.getBuildVector(VT, DL, AAmts);
7642 KVal = DAG.getBuildVector(ShVT, DL, KAmts);
7643 QVal = DAG.getBuildVector(VT, DL, QAmts);
7644 } else if (D.getOpcode() == ISD::SPLAT_VECTOR) {
7645 assert(PAmts.size() == 1 && AAmts.size() == 1 && KAmts.size() == 1 &&
7646 QAmts.size() == 1 &&
7647 "Expected matchUnaryPredicate to return one element for scalable "
7648 "vectors");
7649 PVal = DAG.getSplatVector(VT, DL, PAmts[0]);
7650 AVal = DAG.getSplatVector(VT, DL, AAmts[0]);
7651 KVal = DAG.getSplatVector(ShVT, DL, KAmts[0]);
7652 QVal = DAG.getSplatVector(VT, DL, QAmts[0]);
7653 } else {
7654 assert(isa<ConstantSDNode>(D) && "Expected a constant");
7655 PVal = PAmts[0];
7656 AVal = AAmts[0];
7657 KVal = KAmts[0];
7658 QVal = QAmts[0];
7659 }
7660
7661 // (mul N, P)
7662 SDValue Op0 = DAG.getNode(ISD::MUL, DL, VT, N, PVal);
7663 Created.push_back(Op0.getNode());
7664
7665 // We need ADD to do this.
7666 if (!DCI.isBeforeLegalizeOps() && !isOperationLegalOrCustom(ISD::ADD, VT))
7667 return SDValue();
7668
7669 // (add (mul N, P), A)
7670 Op0 = DAG.getNode(ISD::ADD, DL, VT, Op0, AVal);
7671 Created.push_back(Op0.getNode());
7672
7673 // Rotate right only if any divisor was even. We avoid rotates for all-odd
7674 // divisors as a performance improvement, since rotating by 0 is a no-op.
7675 if (HadEvenDivisor) {
7676 // We need ROTR to do this.
7677 if (!DCI.isBeforeLegalizeOps() && !isOperationLegalOrCustom(ISD::ROTR, VT))
7678 return SDValue();
7679 // SREM: (rotr (add (mul N, P), A), K)
7680 Op0 = DAG.getNode(ISD::ROTR, DL, VT, Op0, KVal);
7681 Created.push_back(Op0.getNode());
7682 }
7683
7684 // SREM: (setule/setugt (rotr (add (mul N, P), A), K), Q)
7685 return DAG.getSetCC(DL, SETCCVT, Op0, QVal,
7687}
7688
7690 const DenormalMode &Mode,
7691 SDNodeFlags Flags) const {
7692 SDLoc DL(Op);
7693 EVT VT = Op.getValueType();
7694 EVT CCVT = getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
7695 SDValue FPZero = DAG.getConstantFP(0.0, DL, VT);
7696
7697 // This is specifically a check for the handling of denormal inputs, not the
7698 // result.
7699 if (Mode.Input == DenormalMode::PreserveSign ||
7700 Mode.Input == DenormalMode::PositiveZero) {
7701 // Test = X == 0.0
7702 return DAG.getSetCC(DL, CCVT, Op, FPZero, ISD::SETEQ, /*Chain=*/{},
7703 /*Signaling=*/false, Flags);
7704 }
7705
7706 // Testing it with denormal inputs to avoid wrong estimate.
7707 //
7708 // Test = fabs(X) < SmallestNormal
7709 const fltSemantics &FltSem = VT.getFltSemantics();
7710 APFloat SmallestNorm = APFloat::getSmallestNormalized(FltSem);
7711 SDValue NormC = DAG.getConstantFP(SmallestNorm, DL, VT);
7712 SDValue Fabs = DAG.getNode(ISD::FABS, DL, VT, Op, Flags);
7713 return DAG.getSetCC(DL, CCVT, Fabs, NormC, ISD::SETLT, /*Chain=*/{},
7714 /*Signaling=*/false, Flags);
7715}
7716
7718 bool LegalOps, bool OptForSize,
7720 unsigned Depth) const {
7721 // fneg is removable even if it has multiple uses.
7722 if (Op.getOpcode() == ISD::FNEG) {
7724 return Op.getOperand(0);
7725 }
7726
7727 // Don't recurse exponentially.
7729 return SDValue();
7730
7731 // Pre-increment recursion depth for use in recursive calls.
7732 ++Depth;
7733 const SDNodeFlags Flags = Op->getFlags();
7734 EVT VT = Op.getValueType();
7735 unsigned Opcode = Op.getOpcode();
7736
7737 // Don't allow anything with multiple uses unless we know it is free.
7738 if (!Op.hasOneUse() && Opcode != ISD::ConstantFP) {
7739 bool IsFreeExtend = Opcode == ISD::FP_EXTEND &&
7740 isFPExtFree(VT, Op.getOperand(0).getValueType());
7741 if (!IsFreeExtend)
7742 return SDValue();
7743 }
7744
7745 auto RemoveDeadNode = [&](SDValue N) {
7746 if (N && N.getNode()->use_empty())
7747 DAG.RemoveDeadNode(N.getNode());
7748 };
7749
7750 SDLoc DL(Op);
7751
7752 // Because getNegatedExpression can delete nodes we need a handle to keep
7753 // temporary nodes alive in case the recursion manages to create an identical
7754 // node.
7755 std::list<HandleSDNode> Handles;
7756
7757 switch (Opcode) {
7758 case ISD::ConstantFP: {
7759 // Don't invert constant FP values after legalization unless the target says
7760 // the negated constant is legal.
7761 bool IsOpLegal =
7763 isFPImmLegal(neg(cast<ConstantFPSDNode>(Op)->getValueAPF()), VT,
7764 OptForSize);
7765
7766 if (LegalOps && !IsOpLegal)
7767 break;
7768
7769 APFloat V = cast<ConstantFPSDNode>(Op)->getValueAPF();
7770 V.changeSign();
7771 SDValue CFP = DAG.getConstantFP(V, DL, VT);
7772
7773 // If we already have the use of the negated floating constant, it is free
7774 // to negate it even it has multiple uses.
7775 if (!Op.hasOneUse() && CFP.use_empty())
7776 break;
7778 return CFP;
7779 }
7780 case ISD::SPLAT_VECTOR: {
7781 // fold splat_vector(fneg(X)) -> splat_vector(-X)
7782 SDValue X = Op.getOperand(0);
7784 break;
7785
7786 SDValue NegX = getCheaperNegatedExpression(X, DAG, LegalOps, OptForSize);
7787 if (!NegX)
7788 break;
7790 return DAG.getNode(ISD::SPLAT_VECTOR, DL, VT, NegX);
7791 }
7792 case ISD::BUILD_VECTOR: {
7793 // Only permit BUILD_VECTOR of constants.
7794 if (llvm::any_of(Op->op_values(), [&](SDValue N) {
7795 return !N.isUndef() && !isa<ConstantFPSDNode>(N);
7796 }))
7797 break;
7798
7799 bool IsOpLegal =
7802 llvm::all_of(Op->op_values(), [&](SDValue N) {
7803 return N.isUndef() ||
7804 isFPImmLegal(neg(cast<ConstantFPSDNode>(N)->getValueAPF()), VT,
7805 OptForSize);
7806 });
7807
7808 if (LegalOps && !IsOpLegal)
7809 break;
7810
7812 for (SDValue C : Op->op_values()) {
7813 if (C.isUndef()) {
7814 Ops.push_back(C);
7815 continue;
7816 }
7817 APFloat V = cast<ConstantFPSDNode>(C)->getValueAPF();
7818 V.changeSign();
7819 Ops.push_back(DAG.getConstantFP(V, DL, C.getValueType()));
7820 }
7822 return DAG.getBuildVector(VT, DL, Ops);
7823 }
7824 case ISD::FADD: {
7825 if (!Flags.hasNoSignedZeros())
7826 break;
7827
7828 // After operation legalization, it might not be legal to create new FSUBs.
7829 if (LegalOps && !isOperationLegalOrCustom(ISD::FSUB, VT))
7830 break;
7831 SDValue X = Op.getOperand(0), Y = Op.getOperand(1);
7832
7833 // fold (fneg (fadd X, Y)) -> (fsub (fneg X), Y)
7835 SDValue NegX =
7836 getNegatedExpression(X, DAG, LegalOps, OptForSize, CostX, Depth);
7837 // Prevent this node from being deleted by the next call.
7838 if (NegX)
7839 Handles.emplace_back(NegX);
7840
7841 // fold (fneg (fadd X, Y)) -> (fsub (fneg Y), X)
7843 SDValue NegY =
7844 getNegatedExpression(Y, DAG, LegalOps, OptForSize, CostY, Depth);
7845
7846 // We're done with the handles.
7847 Handles.clear();
7848
7849 // Negate the X if its cost is less or equal than Y.
7850 if (NegX && (CostX <= CostY)) {
7851 Cost = CostX;
7852 SDValue N = DAG.getNode(ISD::FSUB, DL, VT, NegX, Y, Flags);
7853 if (NegY != N)
7854 RemoveDeadNode(NegY);
7855 return N;
7856 }
7857
7858 // Negate the Y if it is not expensive.
7859 if (NegY) {
7860 Cost = CostY;
7861 SDValue N = DAG.getNode(ISD::FSUB, DL, VT, NegY, X, Flags);
7862 if (NegX != N)
7863 RemoveDeadNode(NegX);
7864 return N;
7865 }
7866 break;
7867 }
7868 case ISD::FSUB: {
7869 // We can't turn -(A-B) into B-A when we honor signed zeros.
7870 if (!Flags.hasNoSignedZeros())
7871 break;
7872
7873 SDValue X = Op.getOperand(0), Y = Op.getOperand(1);
7874 // fold (fneg (fsub 0, Y)) -> Y
7875 if (ConstantFPSDNode *C = isConstOrConstSplatFP(X, /*AllowUndefs*/ true))
7876 if (C->isZero()) {
7878 return Y;
7879 }
7880
7881 // fold (fneg (fsub X, Y)) -> (fsub Y, X)
7883 return DAG.getNode(ISD::FSUB, DL, VT, Y, X, Flags);
7884 }
7885 case ISD::FMUL:
7886 case ISD::FDIV: {
7887 SDValue X = Op.getOperand(0), Y = Op.getOperand(1);
7888
7889 // fold (fneg (fmul X, Y)) -> (fmul (fneg X), Y)
7891 SDValue NegX =
7892 getNegatedExpression(X, DAG, LegalOps, OptForSize, CostX, Depth);
7893 // Prevent this node from being deleted by the next call.
7894 if (NegX)
7895 Handles.emplace_back(NegX);
7896
7897 // fold (fneg (fmul X, Y)) -> (fmul X, (fneg Y))
7899 SDValue NegY =
7900 getNegatedExpression(Y, DAG, LegalOps, OptForSize, CostY, Depth);
7901
7902 // We're done with the handles.
7903 Handles.clear();
7904
7905 // Negate the X if its cost is less or equal than Y.
7906 if (NegX && (CostX <= CostY)) {
7907 Cost = CostX;
7908 SDValue N = DAG.getNode(Opcode, DL, VT, NegX, Y, Flags);
7909 if (NegY != N)
7910 RemoveDeadNode(NegY);
7911 return N;
7912 }
7913
7914 // Ignore X * 2.0 because that is expected to be canonicalized to X + X.
7915 if (auto *C = isConstOrConstSplatFP(Op.getOperand(1)))
7916 if (C->isExactlyValue(2.0) && Op.getOpcode() == ISD::FMUL)
7917 break;
7918
7919 // Negate the Y if it is not expensive.
7920 if (NegY) {
7921 Cost = CostY;
7922 SDValue N = DAG.getNode(Opcode, DL, VT, X, NegY, Flags);
7923 if (NegX != N)
7924 RemoveDeadNode(NegX);
7925 return N;
7926 }
7927 break;
7928 }
7929 case ISD::FMA:
7930 case ISD::FMULADD:
7931 case ISD::FMAD: {
7932 if (!Flags.hasNoSignedZeros())
7933 break;
7934
7935 SDValue X = Op.getOperand(0), Y = Op.getOperand(1), Z = Op.getOperand(2);
7937 SDValue NegZ =
7938 getNegatedExpression(Z, DAG, LegalOps, OptForSize, CostZ, Depth);
7939 // Give up if fail to negate the Z.
7940 if (!NegZ)
7941 break;
7942
7943 // Prevent this node from being deleted by the next two calls.
7944 Handles.emplace_back(NegZ);
7945
7946 // fold (fneg (fma X, Y, Z)) -> (fma (fneg X), Y, (fneg Z))
7948 SDValue NegX =
7949 getNegatedExpression(X, DAG, LegalOps, OptForSize, CostX, Depth);
7950 // Prevent this node from being deleted by the next call.
7951 if (NegX)
7952 Handles.emplace_back(NegX);
7953
7954 // fold (fneg (fma X, Y, Z)) -> (fma X, (fneg Y), (fneg Z))
7956 SDValue NegY =
7957 getNegatedExpression(Y, DAG, LegalOps, OptForSize, CostY, Depth);
7958
7959 // We're done with the handles.
7960 Handles.clear();
7961
7962 // Negate the X if its cost is less or equal than Y.
7963 if (NegX && (CostX <= CostY)) {
7964 Cost = std::min(CostX, CostZ);
7965 SDValue N = DAG.getNode(Opcode, DL, VT, NegX, Y, NegZ, Flags);
7966 if (NegY != N)
7967 RemoveDeadNode(NegY);
7968 return N;
7969 }
7970
7971 // Negate the Y if it is not expensive.
7972 if (NegY) {
7973 Cost = std::min(CostY, CostZ);
7974 SDValue N = DAG.getNode(Opcode, DL, VT, X, NegY, NegZ, Flags);
7975 if (NegX != N)
7976 RemoveDeadNode(NegX);
7977 return N;
7978 }
7979 break;
7980 }
7981
7982 case ISD::FP_EXTEND:
7983 case ISD::FSIN:
7984 if (SDValue NegV = getNegatedExpression(Op.getOperand(0), DAG, LegalOps,
7985 OptForSize, Cost, Depth))
7986 return DAG.getNode(Opcode, DL, VT, NegV);
7987 break;
7988 case ISD::FP_ROUND:
7989 if (SDValue NegV = getNegatedExpression(Op.getOperand(0), DAG, LegalOps,
7990 OptForSize, Cost, Depth))
7991 return DAG.getNode(ISD::FP_ROUND, DL, VT, NegV, Op.getOperand(1));
7992 break;
7993 case ISD::SELECT:
7994 case ISD::VSELECT: {
7995 // fold (fneg (select C, LHS, RHS)) -> (select C, (fneg LHS), (fneg RHS))
7996 // iff at least one cost is cheaper and the other is neutral/cheaper
7997 SDValue LHS = Op.getOperand(1);
7999 SDValue NegLHS =
8000 getNegatedExpression(LHS, DAG, LegalOps, OptForSize, CostLHS, Depth);
8001 if (!NegLHS || CostLHS > NegatibleCost::Neutral) {
8002 RemoveDeadNode(NegLHS);
8003 break;
8004 }
8005
8006 // Prevent this node from being deleted by the next call.
8007 Handles.emplace_back(NegLHS);
8008
8009 SDValue RHS = Op.getOperand(2);
8011 SDValue NegRHS =
8012 getNegatedExpression(RHS, DAG, LegalOps, OptForSize, CostRHS, Depth);
8013
8014 // We're done with the handles.
8015 Handles.clear();
8016
8017 if (!NegRHS || CostRHS > NegatibleCost::Neutral ||
8018 (CostLHS != NegatibleCost::Cheaper &&
8019 CostRHS != NegatibleCost::Cheaper)) {
8020 RemoveDeadNode(NegLHS);
8021 RemoveDeadNode(NegRHS);
8022 break;
8023 }
8024
8025 Cost = std::min(CostLHS, CostRHS);
8026 return DAG.getSelect(DL, VT, Op.getOperand(0), NegLHS, NegRHS);
8027 }
8028 }
8029
8030 return SDValue();
8031}
8032
8033//===----------------------------------------------------------------------===//
8034// Legalization Utilities
8035//===----------------------------------------------------------------------===//
8036
8037bool TargetLowering::expandMUL_LOHI(unsigned Opcode, EVT VT, const SDLoc &dl,
8038 SDValue LHS, SDValue RHS,
8040 EVT HiLoVT, SelectionDAG &DAG,
8041 MulExpansionKind Kind, SDValue LL,
8042 SDValue LH, SDValue RL, SDValue RH) const {
8043 assert(Opcode == ISD::MUL || Opcode == ISD::UMUL_LOHI ||
8044 Opcode == ISD::SMUL_LOHI);
8045
8046 bool HasMULHS = (Kind == MulExpansionKind::Always) ||
8048 bool HasMULHU = (Kind == MulExpansionKind::Always) ||
8050 bool HasSMUL_LOHI = (Kind == MulExpansionKind::Always) ||
8052 bool HasUMUL_LOHI = (Kind == MulExpansionKind::Always) ||
8054
8055 if (!HasMULHU && !HasMULHS && !HasUMUL_LOHI && !HasSMUL_LOHI)
8056 return false;
8057
8058 unsigned OuterBitSize = VT.getScalarSizeInBits();
8059 unsigned InnerBitSize = HiLoVT.getScalarSizeInBits();
8060
8061 // LL, LH, RL, and RH must be either all NULL or all set to a value.
8062 assert((LL.getNode() && LH.getNode() && RL.getNode() && RH.getNode()) ||
8063 (!LL.getNode() && !LH.getNode() && !RL.getNode() && !RH.getNode()));
8064
8065 auto MakeMUL_LOHI = [&](SDValue L, SDValue R, SDValue &Lo, SDValue &Hi,
8066 bool Signed) -> bool {
8067 if ((Signed && HasSMUL_LOHI) || (!Signed && HasUMUL_LOHI)) {
8068 SDVTList VTs = DAG.getVTList(HiLoVT, HiLoVT);
8069 Lo = DAG.getNode(Signed ? ISD::SMUL_LOHI : ISD::UMUL_LOHI, dl, VTs, L, R);
8070 Hi = Lo.getValue(1);
8071 return true;
8072 }
8073 if ((Signed && HasMULHS) || (!Signed && HasMULHU)) {
8074 Lo = DAG.getNode(ISD::MUL, dl, HiLoVT, L, R);
8075 Hi = DAG.getNode(Signed ? ISD::MULHS : ISD::MULHU, dl, HiLoVT, L, R);
8076 return true;
8077 }
8078 return false;
8079 };
8080
8081 SDValue Lo, Hi;
8082
8083 if (!LL.getNode() && !RL.getNode() &&
8085 LL = DAG.getNode(ISD::TRUNCATE, dl, HiLoVT, LHS);
8086 RL = DAG.getNode(ISD::TRUNCATE, dl, HiLoVT, RHS);
8087 }
8088
8089 if (!LL.getNode())
8090 return false;
8091
8092 APInt HighMask = APInt::getHighBitsSet(OuterBitSize, InnerBitSize);
8093 if (DAG.MaskedValueIsZero(LHS, HighMask) &&
8094 DAG.MaskedValueIsZero(RHS, HighMask)) {
8095 // The inputs are both zero-extended.
8096 if (MakeMUL_LOHI(LL, RL, Lo, Hi, false)) {
8097 Result.push_back(Lo);
8098 Result.push_back(Hi);
8099 if (Opcode != ISD::MUL) {
8100 SDValue Zero = DAG.getConstant(0, dl, HiLoVT);
8101 Result.push_back(Zero);
8102 Result.push_back(Zero);
8103 }
8104 return true;
8105 }
8106 }
8107
8108 if (!VT.isVector() && Opcode == ISD::MUL &&
8109 DAG.ComputeMaxSignificantBits(LHS) <= InnerBitSize &&
8110 DAG.ComputeMaxSignificantBits(RHS) <= InnerBitSize) {
8111 // The input values are both sign-extended.
8112 // TODO non-MUL case?
8113 if (MakeMUL_LOHI(LL, RL, Lo, Hi, true)) {
8114 Result.push_back(Lo);
8115 Result.push_back(Hi);
8116 return true;
8117 }
8118 }
8119
8120 unsigned ShiftAmount = OuterBitSize - InnerBitSize;
8121 SDValue Shift = DAG.getShiftAmountConstant(ShiftAmount, VT, dl);
8122
8123 if (!LH.getNode() && !RH.getNode() &&
8126 LH = DAG.getNode(ISD::SRL, dl, VT, LHS, Shift);
8127 LH = DAG.getNode(ISD::TRUNCATE, dl, HiLoVT, LH);
8128 RH = DAG.getNode(ISD::SRL, dl, VT, RHS, Shift);
8129 RH = DAG.getNode(ISD::TRUNCATE, dl, HiLoVT, RH);
8130 }
8131
8132 if (!LH.getNode())
8133 return false;
8134
8135 if (!MakeMUL_LOHI(LL, RL, Lo, Hi, false))
8136 return false;
8137
8138 Result.push_back(Lo);
8139
8140 if (Opcode == ISD::MUL) {
8141 RH = DAG.getNode(ISD::MUL, dl, HiLoVT, LL, RH);
8142 LH = DAG.getNode(ISD::MUL, dl, HiLoVT, LH, RL);
8143 Hi = DAG.getNode(ISD::ADD, dl, HiLoVT, Hi, RH);
8144 Hi = DAG.getNode(ISD::ADD, dl, HiLoVT, Hi, LH);
8145 Result.push_back(Hi);
8146 return true;
8147 }
8148
8149 // Compute the full width result.
8150 auto Merge = [&](SDValue Lo, SDValue Hi) -> SDValue {
8151 Lo = DAG.getNode(ISD::ZERO_EXTEND, dl, VT, Lo);
8152 Hi = DAG.getNode(ISD::ZERO_EXTEND, dl, VT, Hi);
8153 Hi = DAG.getNode(ISD::SHL, dl, VT, Hi, Shift);
8154 return DAG.getNode(ISD::OR, dl, VT, Lo, Hi);
8155 };
8156
8157 SDValue Next = DAG.getNode(ISD::ZERO_EXTEND, dl, VT, Hi);
8158 if (!MakeMUL_LOHI(LL, RH, Lo, Hi, false))
8159 return false;
8160
8161 // This is effectively the add part of a multiply-add of half-sized operands,
8162 // so it cannot overflow.
8163 Next = DAG.getNode(ISD::ADD, dl, VT, Next, Merge(Lo, Hi));
8164
8165 if (!MakeMUL_LOHI(LH, RL, Lo, Hi, false))
8166 return false;
8167
8168 SDValue Zero = DAG.getConstant(0, dl, HiLoVT);
8169 EVT BoolType = getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
8170
8171 bool UseGlue = (isOperationLegalOrCustom(ISD::ADDC, VT) &&
8173 if (UseGlue)
8174 Next = DAG.getNode(ISD::ADDC, dl, DAG.getVTList(VT, MVT::Glue), Next,
8175 Merge(Lo, Hi));
8176 else
8177 Next = DAG.getNode(ISD::UADDO_CARRY, dl, DAG.getVTList(VT, BoolType), Next,
8178 Merge(Lo, Hi), DAG.getConstant(0, dl, BoolType));
8179
8180 SDValue Carry = Next.getValue(1);
8181 Result.push_back(DAG.getNode(ISD::TRUNCATE, dl, HiLoVT, Next));
8182 Next = DAG.getNode(ISD::SRL, dl, VT, Next, Shift);
8183
8184 if (!MakeMUL_LOHI(LH, RH, Lo, Hi, Opcode == ISD::SMUL_LOHI))
8185 return false;
8186
8187 if (UseGlue)
8188 Hi = DAG.getNode(ISD::ADDE, dl, DAG.getVTList(HiLoVT, MVT::Glue), Hi, Zero,
8189 Carry);
8190 else
8191 Hi = DAG.getNode(ISD::UADDO_CARRY, dl, DAG.getVTList(HiLoVT, BoolType), Hi,
8192 Zero, Carry);
8193
8194 Next = DAG.getNode(ISD::ADD, dl, VT, Next, Merge(Lo, Hi));
8195
8196 if (Opcode == ISD::SMUL_LOHI) {
8197 SDValue NextSub = DAG.getNode(ISD::SUB, dl, VT, Next,
8198 DAG.getNode(ISD::ZERO_EXTEND, dl, VT, RL));
8199 Next = DAG.getSelectCC(dl, LH, Zero, NextSub, Next, ISD::SETLT);
8200
8201 NextSub = DAG.getNode(ISD::SUB, dl, VT, Next,
8202 DAG.getNode(ISD::ZERO_EXTEND, dl, VT, LL));
8203 Next = DAG.getSelectCC(dl, RH, Zero, NextSub, Next, ISD::SETLT);
8204 }
8205
8206 Result.push_back(DAG.getNode(ISD::TRUNCATE, dl, HiLoVT, Next));
8207 Next = DAG.getNode(ISD::SRL, dl, VT, Next, Shift);
8208 Result.push_back(DAG.getNode(ISD::TRUNCATE, dl, HiLoVT, Next));
8209 return true;
8210}
8211
8213 SelectionDAG &DAG, MulExpansionKind Kind,
8214 SDValue LL, SDValue LH, SDValue RL,
8215 SDValue RH) const {
8217 bool Ok = expandMUL_LOHI(N->getOpcode(), N->getValueType(0), SDLoc(N),
8218 N->getOperand(0), N->getOperand(1), Result, HiLoVT,
8219 DAG, Kind, LL, LH, RL, RH);
8220 if (Ok) {
8221 assert(Result.size() == 2);
8222 Lo = Result[0];
8223 Hi = Result[1];
8224 }
8225 return Ok;
8226}
8227
8228// Optimize unsigned division or remainder by constants for types twice as large
8229// as a legal VT.
8230//
8231// If (1 << (BitWidth / 2)) % Constant == 1, then the remainder
8232// can be computed
8233// as:
8234// Sum = __builtin_uadd_overflow(Lo, High, &Sum);
8235// Remainder = Sum % Constant;
8236//
8237// If (1 << (BitWidth / 2)) % Constant != 1, we can search for a smaller value
8238// W such that W != (BitWidth / 2) and (1 << W) % Constant == 1. We can break
8239// High:Low into 3 chunks of W bits and compute remainder as
8240// Sum = Chunk0 + Chunk1 + Chunk2;
8241// Remainder = Sum % Constant;
8242//
8243// This is based on "Remainder by Summing Digits" from Hacker's Delight.
8244//
8245// For division, we can compute the remainder using the algorithm described
8246// above, subtract it from the dividend to get an exact multiple of Constant.
8247// Then multiply that exact multiply by the multiplicative inverse modulo
8248// (1 << (BitWidth / 2)) to get the quotient.
8249
8250// If Constant is even, we can shift right the dividend and the divisor by the
8251// number of trailing zeros in Constant before applying the remainder algorithm.
8252// If we're after the quotient, we can subtract this value from the shifted
8253// dividend and multiply by the multiplicative inverse of the shifted divisor.
8254// If we want the remainder, we shift the value left by the number of trailing
8255// zeros and add the bits that were shifted out of the dividend.
8256bool TargetLowering::expandUDIVREMByConstantViaUREMDecomposition(
8257 SDNode *N, APInt Divisor, SmallVectorImpl<SDValue> &Result, EVT HiLoVT,
8258 SelectionDAG &DAG, SDValue LL, SDValue LH) const {
8259 unsigned Opcode = N->getOpcode();
8260 EVT VT = N->getValueType(0);
8261
8262 unsigned BitWidth = Divisor.getBitWidth();
8263 unsigned HBitWidth = BitWidth / 2;
8265 HiLoVT.getScalarSizeInBits() == HBitWidth && "Unexpected VTs");
8266
8267 // If the divisor is even, shift it until it becomes odd.
8268 unsigned TrailingZeros = 0;
8269 if (!Divisor[0]) {
8270 TrailingZeros = Divisor.countr_zero();
8271 Divisor.lshrInPlace(TrailingZeros);
8272 }
8273
8274 // After removing trailing zeros, the divisor needs to be less than
8275 // (1 << HBitWidth).
8276 APInt HalfMaxPlus1 = APInt::getOneBitSet(BitWidth, HBitWidth);
8277 if (Divisor.uge(HalfMaxPlus1))
8278 return false;
8279
8280 // Look for the largest chunk width W such that (1 << W) % Divisor == 1 or
8281 // (1 << W) % Divisor == -1.
8282 unsigned BestChunkWidth = 0, AltChunkWidth = 0;
8283 for (unsigned I = HBitWidth, E = HBitWidth / 2; I > E; --I) {
8284 // Skip HBitWidth-1, it doesn't have enough bits for carries.
8285 if (I == HBitWidth - 1)
8286 continue;
8287
8288 APInt Mod = APInt::getOneBitSet(Divisor.getBitWidth(), I).urem(Divisor);
8289
8290 if (Mod.isOne()) {
8291 BestChunkWidth = I;
8292 break;
8293 }
8294
8295 // We have an alternate strategy for Remainder == Divisor - 1.
8296 // FIXME: Support HBitWidth.
8297 if (I != HBitWidth && Mod == Divisor - 1)
8298 AltChunkWidth = I;
8299 }
8300
8301 bool Alternate = false;
8302 if (!BestChunkWidth) {
8303 if (!AltChunkWidth)
8304 return false;
8305 Alternate = true;
8306 BestChunkWidth = AltChunkWidth;
8307 }
8308
8309 SDLoc dl(N);
8310
8311 assert(!LL == !LH && "Expected both input halves or no input halves!");
8312 if (!LL)
8313 std::tie(LL, LH) = DAG.SplitScalar(N->getOperand(0), dl, HiLoVT, HiLoVT);
8314
8315 bool HasFSHR = isOperationLegal(ISD::FSHR, HiLoVT);
8316
8317 auto GetFSHR = [&](SDValue Lo, SDValue Hi, unsigned ShiftAmt) {
8318 assert(ShiftAmt > 0 && ShiftAmt < HBitWidth);
8319 if (HasFSHR)
8320 return DAG.getNode(ISD::FSHR, dl, HiLoVT, Hi, Lo,
8321 DAG.getShiftAmountConstant(ShiftAmt, HiLoVT, dl));
8322 return DAG.getNode(
8323 ISD::OR, dl, HiLoVT,
8324 DAG.getNode(ISD::SRL, dl, HiLoVT, Lo,
8325 DAG.getShiftAmountConstant(ShiftAmt, HiLoVT, dl)),
8326 DAG.getNode(
8327 ISD::SHL, dl, HiLoVT, Hi,
8328 DAG.getShiftAmountConstant(HBitWidth - ShiftAmt, HiLoVT, dl)));
8329 };
8330
8331 // Helper to perform a right shift on a 128-bit value split into two halves.
8332 // Handles shifts >= HBitWidth by moving Hi to Lo and shifting Hi.
8333 auto ShiftRight = [&](SDValue &Lo, SDValue &Hi, unsigned ShiftAmt) {
8334 if (ShiftAmt == 0)
8335 return;
8336 if (ShiftAmt < HBitWidth) {
8337 Lo = GetFSHR(Lo, Hi, ShiftAmt);
8338 Hi = DAG.getNode(ISD::SRL, dl, HiLoVT, Hi,
8339 DAG.getShiftAmountConstant(ShiftAmt, HiLoVT, dl));
8340 } else if (ShiftAmt == HBitWidth) {
8341 Lo = Hi;
8342 Hi = DAG.getConstant(0, dl, HiLoVT);
8343 } else {
8344 Lo = DAG.getNode(
8345 ISD::SRL, dl, HiLoVT, Hi,
8346 DAG.getShiftAmountConstant(ShiftAmt - HBitWidth, HiLoVT, dl));
8347 Hi = DAG.getConstant(0, dl, HiLoVT);
8348 }
8349 };
8350
8351 // Shift the input by the number of TrailingZeros in the divisor. The
8352 // shifted out bits will be added to the remainder later.
8353 SDValue PartialRemL, PartialRemH;
8354 if (TrailingZeros && Opcode != ISD::UDIV) {
8355 // Save the shifted off bits if we need the remainder.
8356 if (TrailingZeros < HBitWidth) {
8357 APInt Mask = APInt::getLowBitsSet(HBitWidth, TrailingZeros);
8358 PartialRemL = DAG.getNode(ISD::AND, dl, HiLoVT, LL,
8359 DAG.getConstant(Mask, dl, HiLoVT));
8360 } else if (TrailingZeros == HBitWidth) {
8361 // All of LL is part of the remainder.
8362 PartialRemL = LL;
8363 } else {
8364 // TrailingZeros > HBitWidth: LL and part of LH are the remainder.
8365 PartialRemL = LL;
8366 APInt Mask = APInt::getLowBitsSet(HBitWidth, TrailingZeros - HBitWidth);
8367 PartialRemH = DAG.getNode(ISD::AND, dl, HiLoVT, LH,
8368 DAG.getConstant(Mask, dl, HiLoVT));
8369 }
8370 }
8371
8372 SDValue Sum;
8373 // If BestChunkWidth is HBitWidth add low and high half. If there is a carry
8374 // out, add that to the final sum.
8375 if (BestChunkWidth == HBitWidth) {
8376 assert(!Alternate);
8377 // Shift LH:LL right if there were trailing zeros in the divisor.
8378 ShiftRight(LL, LH, TrailingZeros);
8379
8380 // Use uaddo_carry if we can, otherwise use a compare to detect overflow.
8381 EVT SetCCType =
8382 getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), HiLoVT);
8384 SDVTList VTList = DAG.getVTList(HiLoVT, SetCCType);
8385 Sum = DAG.getNode(ISD::UADDO, dl, VTList, LL, LH);
8386 Sum = DAG.getNode(ISD::UADDO_CARRY, dl, VTList, Sum,
8387 DAG.getConstant(0, dl, HiLoVT), Sum.getValue(1));
8388 } else {
8389 Sum = DAG.getNode(ISD::ADD, dl, HiLoVT, LL, LH);
8390 SDValue Carry = DAG.getSetCC(dl, SetCCType, Sum, LL, ISD::SETULT);
8391 // If the boolean for the target is 0 or 1, we can add the setcc result
8392 // directly.
8393 if (getBooleanContents(HiLoVT) ==
8395 Carry = DAG.getZExtOrTrunc(Carry, dl, HiLoVT);
8396 else
8397 Carry = DAG.getSelect(dl, HiLoVT, Carry, DAG.getConstant(1, dl, HiLoVT),
8398 DAG.getConstant(0, dl, HiLoVT));
8399 Sum = DAG.getNode(ISD::ADD, dl, HiLoVT, Sum, Carry);
8400 }
8401 } else {
8402 // Otherwise split into multple chunks and add them together. We chose
8403 // BestChunkWidth so that the sum will not overflow.
8404 SDValue Mask = DAG.getConstant(
8405 APInt::getLowBitsSet(HBitWidth, BestChunkWidth), dl, HiLoVT);
8406
8407 for (unsigned I = 0; I < BitWidth - TrailingZeros; I += BestChunkWidth) {
8408 // If there were trailing zeros in the divisor, increase the shift amount.
8409 unsigned Shift = I + TrailingZeros;
8410 SDValue Chunk;
8411 if (Shift == 0)
8412 Chunk = LL;
8413 else if (Shift >= HBitWidth)
8414 Chunk = DAG.getNode(
8415 ISD::SRL, dl, HiLoVT, LH,
8416 DAG.getShiftAmountConstant(Shift - HBitWidth, HiLoVT, dl));
8417 else
8418 Chunk = GetFSHR(LL, LH, Shift);
8419 // If we're on the last chunk, we don't need an AND.
8420 if (I + BestChunkWidth < BitWidth - TrailingZeros)
8421 Chunk = DAG.getNode(ISD::AND, dl, HiLoVT, Chunk, Mask);
8422 if (!Sum) {
8423 Sum = Chunk;
8424 } else {
8425 // For Alternate, we need to subtract odd chunks.
8426 unsigned ChunkNum = I / BestChunkWidth;
8427 unsigned Opc = (Alternate && (ChunkNum % 2) != 0) ? ISD::SUB : ISD::ADD;
8428 Sum = DAG.getNode(Opc, dl, HiLoVT, Sum, Chunk);
8429 }
8430 }
8431
8432 // For Alternate, the sum may be negative, but we need a positive sum. We
8433 // can increase it by a multiple of the divisor to make it positive. For 3
8434 // chunks the largest negative value is -(2^BestChunkWidth - 1). For 4
8435 // chunks, it's 2*-(2^BestChunkWidth - 1). We know that 2^BestChunkWidth + 1
8436 // is a multiple of the divisor. Add that 1 or 2 times to make the sum
8437 // positive.
8438 if (Alternate) {
8439 unsigned NumChunks = divideCeil(BitWidth - TrailingZeros, BestChunkWidth);
8440 assert(NumChunks <= 4);
8441
8442 APInt Adjust = APInt::getOneBitSet(HBitWidth, BestChunkWidth);
8443 Adjust.setBit(0);
8444 // If there are 4 chunks, we need to adjust twice.
8445 if (NumChunks == 4)
8446 Adjust <<= 1;
8447 Sum = DAG.getNode(ISD::ADD, dl, HiLoVT, Sum,
8448 DAG.getConstant(Adjust, dl, HiLoVT));
8449 }
8450 }
8451
8452 // Perform a HiLoVT urem on the Sum using truncated divisor.
8453 SDValue RemL =
8454 DAG.getNode(ISD::UREM, dl, HiLoVT, Sum,
8455 DAG.getConstant(Divisor.trunc(HBitWidth), dl, HiLoVT));
8456 SDValue RemH = DAG.getConstant(0, dl, HiLoVT);
8457
8458 if (Opcode != ISD::UREM) {
8459 // If we didn't shift LH/LR earlier, do it now.
8460 if (BestChunkWidth != HBitWidth)
8461 ShiftRight(LL, LH, TrailingZeros);
8462
8463 // Subtract the remainder from the shifted dividend.
8464 SDValue Dividend = DAG.getNode(ISD::BUILD_PAIR, dl, VT, LL, LH);
8465 SDValue Rem = DAG.getNode(ISD::BUILD_PAIR, dl, VT, RemL, RemH);
8466
8467 Dividend = DAG.getNode(ISD::SUB, dl, VT, Dividend, Rem);
8468
8469 // Multiply by the multiplicative inverse of the divisor modulo
8470 // (1 << BitWidth).
8471 APInt MulFactor = Divisor.multiplicativeInverse();
8472
8473 SDValue Quotient = DAG.getNode(ISD::MUL, dl, VT, Dividend,
8474 DAG.getConstant(MulFactor, dl, VT));
8475
8476 // Split the quotient into low and high parts.
8477 SDValue QuotL, QuotH;
8478 std::tie(QuotL, QuotH) = DAG.SplitScalar(Quotient, dl, HiLoVT, HiLoVT);
8479 Result.push_back(QuotL);
8480 Result.push_back(QuotH);
8481 }
8482
8483 if (Opcode != ISD::UDIV) {
8484 // If we shifted the input, shift the remainder left and add the bits we
8485 // shifted off the input.
8486 if (TrailingZeros) {
8487 if (TrailingZeros < HBitWidth) {
8488 // Shift RemH:RemL left by TrailingZeros.
8489 // RemH gets the high bits shifted out of RemL.
8490 RemH = DAG.getNode(
8491 ISD::SRL, dl, HiLoVT, RemL,
8492 DAG.getShiftAmountConstant(HBitWidth - TrailingZeros, HiLoVT, dl));
8493 RemL =
8494 DAG.getNode(ISD::SHL, dl, HiLoVT, RemL,
8495 DAG.getShiftAmountConstant(TrailingZeros, HiLoVT, dl));
8496 // OR in the partial remainder.
8497 RemL = DAG.getNode(ISD::OR, dl, HiLoVT, RemL, PartialRemL,
8499 } else if (TrailingZeros == HBitWidth) {
8500 // Shift left by exactly HBitWidth: RemH becomes RemL, RemL becomes
8501 // PartialRemL.
8502 RemH = RemL;
8503 RemL = PartialRemL;
8504 } else {
8505 // Shift left by more than HBitWidth.
8506 RemH = DAG.getNode(
8507 ISD::SHL, dl, HiLoVT, RemL,
8508 DAG.getShiftAmountConstant(TrailingZeros - HBitWidth, HiLoVT, dl));
8509 RemH = DAG.getNode(ISD::OR, dl, HiLoVT, RemH, PartialRemH,
8511 RemL = PartialRemL;
8512 }
8513 }
8514 Result.push_back(RemL);
8515 Result.push_back(RemH);
8516 }
8517
8518 return true;
8519}
8520
8521bool TargetLowering::expandUDIVREMByConstantViaUMulHiMagic(
8522 SDNode *N, const APInt &Divisor, SmallVectorImpl<SDValue> &Result,
8523 EVT HiLoVT, SelectionDAG &DAG, SDValue LL, SDValue LH) const {
8524
8525 SDValue N0 = N->getOperand(0);
8526 EVT VT = N0->getValueType(0);
8527 SDLoc DL{N};
8528
8529 assert(!Divisor.isOne() && "Magic algorithm does not work for division by 1");
8530
8531 // This helper creates a MUL_LOHI of the pair (LL, LH) by a constant.
8532 auto MakeMUL_LOHIByConst = [&](unsigned Opc, SDValue LL, SDValue LH,
8533 const APInt &Const,
8534 SmallVectorImpl<SDValue> &Result) {
8535 SDValue LHS = DAG.getNode(ISD::BUILD_PAIR, DL, VT, LL, LH);
8536 SDValue RHS = DAG.getConstant(Const, DL, VT);
8537 auto [RL, RH] = DAG.SplitScalar(RHS, DL, HiLoVT, HiLoVT);
8538 return expandMUL_LOHI(Opc, VT, DL, LHS, RHS, Result, HiLoVT, DAG,
8540 LL, LH, RL, RH);
8541 };
8542
8543 // This helper creates an ADD/SUB of the pairs (LL, LH) and (RL, RH).
8544 auto MakeAddSubLong = [&](unsigned Opc, SDValue LL, SDValue LH, SDValue RL,
8545 SDValue RH) {
8546 SDValue AddSubNode =
8548 DAG.getVTList(HiLoVT, MVT::i1), LL, RL);
8549 SDValue OutL = AddSubNode.getValue(0);
8550 SDValue Overflow = AddSubNode.getValue(1);
8551 SDValue AddSubWithOverflow =
8553 DAG.getVTList(HiLoVT, MVT::i1), LH, RH, Overflow);
8554 SDValue OutH = AddSubWithOverflow.getValue(0);
8555 return std::make_pair(OutL, OutH);
8556 };
8557
8558 // This helper creates a SRL of the pair (LL, LH) by Shift.
8559 auto MakeSRLLong = [&](SDValue LL, SDValue LH, unsigned Shift) {
8560 unsigned HBitWidth = HiLoVT.getScalarSizeInBits();
8561 if (Shift < HBitWidth) {
8562 SDValue ShAmt = DAG.getShiftAmountConstant(Shift, HiLoVT, DL);
8563 SDValue ResL = DAG.getNode(ISD::FSHR, DL, HiLoVT, LH, LL, ShAmt);
8564 SDValue ResH = DAG.getNode(ISD::SRL, DL, HiLoVT, LH, ShAmt);
8565 return std::make_pair(ResL, ResH);
8566 }
8567 SDValue Zero = DAG.getConstant(0, DL, HiLoVT);
8568 if (Shift == HBitWidth)
8569 return std::make_pair(LH, Zero);
8570 assert(Shift - HBitWidth < HBitWidth &&
8571 "We shouldn't generate an undefined shift");
8572 SDValue ShAmt = DAG.getShiftAmountConstant(Shift - HBitWidth, HiLoVT, DL);
8573 return std::make_pair(DAG.getNode(ISD::SRL, DL, HiLoVT, LH, ShAmt), Zero);
8574 };
8575
8576 // Knowledge of leading zeros may help to reduce the multiplier.
8577 unsigned KnownLeadingZeros = DAG.computeKnownBits(N0).countMinLeadingZeros();
8578
8579 UnsignedDivisionByConstantInfo Magics = UnsignedDivisionByConstantInfo::get(
8580 Divisor, std::min(KnownLeadingZeros, Divisor.countl_zero()));
8581
8582 assert(!LL == !LH && "Expected both input halves or no input halves!");
8583 if (!LL)
8584 std::tie(LL, LH) = DAG.SplitScalar(N0, DL, HiLoVT, HiLoVT);
8585 SDValue QL = LL;
8586 SDValue QH = LH;
8587 if (Magics.PreShift != 0)
8588 std::tie(QL, QH) = MakeSRLLong(QL, QH, Magics.PreShift);
8589
8590 SmallVector<SDValue, 4> UMulResult;
8591 if (!MakeMUL_LOHIByConst(ISD::UMUL_LOHI, QL, QH, Magics.Magic, UMulResult))
8592 return false;
8593
8594 QL = UMulResult[2];
8595 QH = UMulResult[3];
8596
8597 if (Magics.IsAdd) {
8598 auto [NPQL, NPQH] = MakeAddSubLong(ISD::SUB, LL, LH, QL, QH);
8599 std::tie(NPQL, NPQH) = MakeSRLLong(NPQL, NPQH, 1);
8600 std::tie(QL, QH) = MakeAddSubLong(ISD::ADD, NPQL, NPQH, QL, QH);
8601 }
8602
8603 if (Magics.PostShift != 0)
8604 std::tie(QL, QH) = MakeSRLLong(QL, QH, Magics.PostShift);
8605
8606 unsigned Opcode = N->getOpcode();
8607 if (Opcode != ISD::UREM) {
8608 Result.push_back(QL);
8609 Result.push_back(QH);
8610 }
8611
8612 if (Opcode != ISD::UDIV) {
8613 SmallVector<SDValue, 2> MulResult;
8614 if (!MakeMUL_LOHIByConst(ISD::MUL, QL, QH, Divisor, MulResult))
8615 return false;
8616
8617 assert(MulResult.size() == 2);
8618
8619 auto [RemL, RemH] =
8620 MakeAddSubLong(ISD::SUB, LL, LH, MulResult[0], MulResult[1]);
8621
8622 Result.push_back(RemL);
8623 Result.push_back(RemH);
8624 }
8625
8626 return true;
8627}
8628
8631 EVT HiLoVT, SelectionDAG &DAG,
8632 SDValue LL, SDValue LH) const {
8633 unsigned Opcode = N->getOpcode();
8634
8635 // TODO: Support signed division/remainder.
8636 if (Opcode == ISD::SREM || Opcode == ISD::SDIV || Opcode == ISD::SDIVREM)
8637 return false;
8638 assert(
8639 (Opcode == ISD::UREM || Opcode == ISD::UDIV || Opcode == ISD::UDIVREM) &&
8640 "Unexpected opcode");
8641
8642 auto *CN = dyn_cast<ConstantSDNode>(N->getOperand(1));
8643 if (!CN)
8644 return false;
8645
8646 APInt Divisor = CN->getAPIntValue();
8647
8648 // The generated half-width UREM is normally optimized using high multiply.
8649 // If the wide UREM libcall is unavailable, a legal or custom half-width
8650 // UDIVREM can lower it instead.
8651 bool CanDecomposeUREMWithoutMulHi =
8652 Opcode == ISD::UREM &&
8653 getLibcallImpl(RTLIB::getUREM(N->getValueType(0))) ==
8654 RTLIB::Unsupported &&
8656 if (!CanDecomposeUREMWithoutMulHi &&
8659 return false;
8660
8661 // Prefer the smaller libcall when one is available.
8662 if (DAG.shouldOptForSize() && !CanDecomposeUREMWithoutMulHi)
8663 return false;
8664
8665 // Early out for 0 or 1 divisors.
8666 if (Divisor.ule(1))
8667 return false;
8668
8669 if (expandUDIVREMByConstantViaUREMDecomposition(N, Divisor, Result, HiLoVT,
8670 DAG, LL, LH))
8671 return true;
8672
8673 if (expandUDIVREMByConstantViaUMulHiMagic(N, Divisor, Result, HiLoVT, DAG, LL,
8674 LH))
8675 return true;
8676
8677 return false;
8678}
8679
8680// Check that (every element of) Z is undef or not an exact multiple of BW.
8681static bool isNonZeroModBitWidthOrUndef(SDValue Z, unsigned BW) {
8683 Z,
8684 [=](ConstantSDNode *C) { return !C || C->getAPIntValue().urem(BW) != 0; },
8685 /*AllowUndefs=*/true, /*AllowTruncation=*/true);
8686}
8687
8689 SelectionDAG &DAG) const {
8690 EVT VT = Node->getValueType(0);
8691
8692 if (VT.isVector() && (!isOperationLegalOrCustom(ISD::SHL, VT) ||
8696 return SDValue();
8697
8698 SDValue X = Node->getOperand(0);
8699 SDValue Y = Node->getOperand(1);
8700 SDValue Z = Node->getOperand(2);
8701
8702 unsigned BW = VT.getScalarSizeInBits();
8703 bool IsFSHL = Node->getOpcode() == ISD::FSHL;
8704 SDLoc DL(SDValue(Node, 0));
8705
8706 EVT ShVT = Z.getValueType();
8707
8708 // If a funnel shift in the other direction is more supported, use it.
8709 unsigned RevOpcode = IsFSHL ? ISD::FSHR : ISD::FSHL;
8710 if (!isOperationLegalOrCustom(Node->getOpcode(), VT) &&
8711 isOperationLegalOrCustom(RevOpcode, VT) && isPowerOf2_32(BW)) {
8712 if (isNonZeroModBitWidthOrUndef(Z, BW)) {
8713 // fshl X, Y, Z -> fshr X, Y, -Z
8714 // fshr X, Y, Z -> fshl X, Y, -Z
8715 Z = DAG.getNegative(Z, DL, ShVT);
8716 } else {
8717 // fshl X, Y, Z -> fshr (srl X, 1), (fshr X, Y, 1), ~Z
8718 // fshr X, Y, Z -> fshl (fshl X, Y, 1), (shl Y, 1), ~Z
8719 SDValue One = DAG.getConstant(1, DL, ShVT);
8720 if (IsFSHL) {
8721 Y = DAG.getNode(RevOpcode, DL, VT, X, Y, One);
8722 X = DAG.getNode(ISD::SRL, DL, VT, X, One);
8723 } else {
8724 X = DAG.getNode(RevOpcode, DL, VT, X, Y, One);
8725 Y = DAG.getNode(ISD::SHL, DL, VT, Y, One);
8726 }
8727 Z = DAG.getNOT(DL, Z, ShVT);
8728 }
8729 return DAG.getNode(RevOpcode, DL, VT, X, Y, Z);
8730 }
8731
8732 SDValue ShX, ShY;
8733 SDValue ShAmt, InvShAmt;
8734 if (isNonZeroModBitWidthOrUndef(Z, BW)) {
8735 // fshl: X << C | Y >> (BW - C)
8736 // fshr: X << (BW - C) | Y >> C
8737 // where C = Z % BW is not zero
8738 SDValue BitWidthC = DAG.getConstant(BW, DL, ShVT);
8739 ShAmt = DAG.getNode(ISD::UREM, DL, ShVT, Z, BitWidthC);
8740 InvShAmt = DAG.getNode(ISD::SUB, DL, ShVT, BitWidthC, ShAmt);
8741 ShX = DAG.getNode(ISD::SHL, DL, VT, X, IsFSHL ? ShAmt : InvShAmt);
8742 ShY = DAG.getNode(ISD::SRL, DL, VT, Y, IsFSHL ? InvShAmt : ShAmt);
8743 } else {
8744 // fshl: X << (Z % BW) | Y >> 1 >> (BW - 1 - (Z % BW))
8745 // fshr: X << 1 << (BW - 1 - (Z % BW)) | Y >> (Z % BW)
8746 SDValue Mask = DAG.getConstant(BW - 1, DL, ShVT);
8747 if (isPowerOf2_32(BW)) {
8748 // Z % BW -> Z & (BW - 1)
8749 ShAmt = DAG.getNode(ISD::AND, DL, ShVT, Z, Mask);
8750 // (BW - 1) - (Z % BW) -> ~Z & (BW - 1)
8751 InvShAmt = DAG.getNode(ISD::AND, DL, ShVT, DAG.getNOT(DL, Z, ShVT), Mask);
8752 } else {
8753 SDValue BitWidthC = DAG.getConstant(BW, DL, ShVT);
8754 ShAmt = DAG.getNode(ISD::UREM, DL, ShVT, Z, BitWidthC);
8755 InvShAmt = DAG.getNode(ISD::SUB, DL, ShVT, Mask, ShAmt);
8756 }
8757
8758 SDValue One = DAG.getConstant(1, DL, ShVT);
8759 if (IsFSHL) {
8760 ShX = DAG.getNode(ISD::SHL, DL, VT, X, ShAmt);
8761 SDValue ShY1 = DAG.getNode(ISD::SRL, DL, VT, Y, One);
8762 ShY = DAG.getNode(ISD::SRL, DL, VT, ShY1, InvShAmt);
8763 } else {
8764 SDValue ShX1 = DAG.getNode(ISD::SHL, DL, VT, X, One);
8765 ShX = DAG.getNode(ISD::SHL, DL, VT, ShX1, InvShAmt);
8766 ShY = DAG.getNode(ISD::SRL, DL, VT, Y, ShAmt);
8767 }
8768 }
8769 return DAG.getNode(ISD::OR, DL, VT, ShX, ShY);
8770}
8771
8772// TODO: Merge with expandFunnelShift.
8774 SelectionDAG &DAG) const {
8775 EVT VT = Node->getValueType(0);
8776 unsigned EltSizeInBits = VT.getScalarSizeInBits();
8777 bool IsLeft = Node->getOpcode() == ISD::ROTL;
8778 SDValue Op0 = Node->getOperand(0);
8779 SDValue Op1 = Node->getOperand(1);
8780 SDLoc DL(SDValue(Node, 0));
8781
8782 EVT ShVT = Op1.getValueType();
8783 SDValue Zero = DAG.getConstant(0, DL, ShVT);
8784
8785 // If a rotate in the other direction is more supported, use it.
8786 unsigned RevRot = IsLeft ? ISD::ROTR : ISD::ROTL;
8787 if (!isOperationLegalOrCustom(Node->getOpcode(), VT) &&
8788 isOperationLegalOrCustom(RevRot, VT) && isPowerOf2_32(EltSizeInBits)) {
8789 SDValue Sub = DAG.getNode(ISD::SUB, DL, ShVT, Zero, Op1);
8790 return DAG.getNode(RevRot, DL, VT, Op0, Sub);
8791 }
8792
8793 if (!AllowVectorOps && VT.isVector() &&
8799 return SDValue();
8800
8801 unsigned ShOpc = IsLeft ? ISD::SHL : ISD::SRL;
8802 unsigned HsOpc = IsLeft ? ISD::SRL : ISD::SHL;
8803 SDValue BitWidthMinusOneC = DAG.getConstant(EltSizeInBits - 1, DL, ShVT);
8804 SDValue ShVal;
8805 SDValue HsVal;
8806 if (isPowerOf2_32(EltSizeInBits)) {
8807 // (rotl x, c) -> x << (c & (w - 1)) | x >> (-c & (w - 1))
8808 // (rotr x, c) -> x >> (c & (w - 1)) | x << (-c & (w - 1))
8809 SDValue NegOp1 = DAG.getNode(ISD::SUB, DL, ShVT, Zero, Op1);
8810 SDValue ShAmt = DAG.getNode(ISD::AND, DL, ShVT, Op1, BitWidthMinusOneC);
8811 ShVal = DAG.getNode(ShOpc, DL, VT, Op0, ShAmt);
8812 SDValue HsAmt = DAG.getNode(ISD::AND, DL, ShVT, NegOp1, BitWidthMinusOneC);
8813 HsVal = DAG.getNode(HsOpc, DL, VT, Op0, HsAmt);
8814 } else {
8815 // (rotl x, c) -> x << (c % w) | x >> 1 >> (w - 1 - (c % w))
8816 // (rotr x, c) -> x >> (c % w) | x << 1 << (w - 1 - (c % w))
8817 SDValue BitWidthC = DAG.getConstant(EltSizeInBits, DL, ShVT);
8818 SDValue ShAmt = DAG.getNode(ISD::UREM, DL, ShVT, Op1, BitWidthC);
8819 ShVal = DAG.getNode(ShOpc, DL, VT, Op0, ShAmt);
8820 SDValue HsAmt = DAG.getNode(ISD::SUB, DL, ShVT, BitWidthMinusOneC, ShAmt);
8821 SDValue One = DAG.getConstant(1, DL, ShVT);
8822 HsVal =
8823 DAG.getNode(HsOpc, DL, VT, DAG.getNode(HsOpc, DL, VT, Op0, One), HsAmt);
8824 }
8825 return DAG.getNode(ISD::OR, DL, VT, ShVal, HsVal);
8826}
8827
8828/// Check if CLMUL on VT can eventually reach a type with legal CLMUL through
8829/// a chain of halving decompositions (halving element width) and/or vector
8830/// widening (doubling element count). This guides expansion strategy selection:
8831/// if true, the halving/widening path produces better code than bit-by-bit.
8832///
8833/// HalveDepth tracks halving steps only (each creates ~4x more operations).
8834/// Widening steps are cheap (O(1) pad/extract) and don't count.
8835/// Limiting halvings to 2 prevents exponential blowup:
8836/// 1 halving: ~4 sub-CLMULs (good, e.g. v8i16 -> v8i8)
8837/// 2 halvings: ~16 sub-CLMULs (acceptable, e.g. v4i32 -> v4i16 -> v8i8)
8838/// 3 halvings: ~64 sub-CLMULs (worse than bit-by-bit expansion)
8840 EVT VT, unsigned HalveDepth = 0,
8841 unsigned TotalDepth = 0) {
8842 if (HalveDepth > 2 || TotalDepth > 8 || !VT.isFixedLengthVector())
8843 return false;
8845 return true;
8846 if (!TLI.isTypeLegal(VT))
8847 return false;
8848
8849 unsigned BW = VT.getScalarSizeInBits();
8850
8851 // Halve: halve element width, same element count.
8852 // This is the expensive step -- each halving creates ~4x more operations.
8853 if (BW % 2 == 0) {
8854 EVT HalfEltVT = EVT::getIntegerVT(Ctx, BW / 2);
8855 EVT HalfVT = VT.changeVectorElementType(Ctx, HalfEltVT);
8856 if (TLI.isTypeLegal(HalfVT) &&
8857 canNarrowCLMULToLegal(TLI, Ctx, HalfVT, HalveDepth + 1, TotalDepth + 1))
8858 return true;
8859 }
8860
8861 // Widen: double element count (fixed-width vectors only).
8862 // This is cheap -- just INSERT_SUBVECTOR + EXTRACT_SUBVECTOR.
8863 EVT WideVT = VT.getDoubleNumVectorElementsVT(Ctx);
8864 if (TLI.isTypeLegal(WideVT) &&
8865 canNarrowCLMULToLegal(TLI, Ctx, WideVT, HalveDepth, TotalDepth + 1))
8866 return true;
8867
8868 return false;
8869}
8870
8872 SDLoc DL(Node);
8873 EVT VT = Node->getValueType(0);
8874 SDValue X = Node->getOperand(0);
8875 SDValue Y = Node->getOperand(1);
8876 unsigned BW = VT.getScalarSizeInBits();
8877 unsigned Opcode = Node->getOpcode();
8878 LLVMContext &Ctx = *DAG.getContext();
8879
8880 switch (Opcode) {
8881 case ISD::CLMUL: {
8882 // For vector types, try decomposition strategies that leverage legal
8883 // CLMUL on narrower or wider element types, avoiding the expensive
8884 // bit-by-bit expansion.
8885 if (VT.isVector()) {
8886 // Strategy 1: Halving decomposition to half-element-width CLMUL.
8887 // Applies ExpandIntRes_CLMUL's identity element-wise:
8888 // CLMUL(X, Y) = (Hi << HalfBW) | Lo
8889 // where:
8890 // Lo = CLMUL(XLo, YLo)
8891 // Hi = CLMULH(XLo, YLo) ^ CLMUL(XLo, YHi) ^ CLMUL(XHi, YLo)
8892 unsigned HalfBW = BW / 2;
8893 if (BW % 2 == 0) {
8894 EVT HalfEltVT = EVT::getIntegerVT(Ctx, HalfBW);
8895 EVT HalfVT =
8896 EVT::getVectorVT(Ctx, HalfEltVT, VT.getVectorElementCount());
8897 if (isTypeLegal(HalfVT) && canNarrowCLMULToLegal(*this, Ctx, HalfVT,
8898 /*HalveDepth=*/1)) {
8899 SDValue ShAmt = DAG.getShiftAmountConstant(HalfBW, VT, DL);
8900
8901 // Extract low and high halves of each element.
8902 SDValue XLo = DAG.getNode(ISD::TRUNCATE, DL, HalfVT, X);
8903 SDValue XHi = DAG.getNode(ISD::TRUNCATE, DL, HalfVT,
8904 DAG.getNode(ISD::SRL, DL, VT, X, ShAmt));
8905 SDValue YLo = DAG.getNode(ISD::TRUNCATE, DL, HalfVT, Y);
8906 SDValue YHi = DAG.getNode(ISD::TRUNCATE, DL, HalfVT,
8907 DAG.getNode(ISD::SRL, DL, VT, Y, ShAmt));
8908
8909 // Lo = CLMUL(XLo, YLo)
8910 SDValue Lo = DAG.getNode(ISD::CLMUL, DL, HalfVT, XLo, YLo);
8911
8912 // Hi = CLMULH(XLo, YLo) ^ CLMUL(XLo, YHi) ^ CLMUL(XHi, YLo)
8913 SDValue LoH = DAG.getNode(ISD::CLMULH, DL, HalfVT, XLo, YLo);
8914 SDValue Cross1 = DAG.getNode(ISD::CLMUL, DL, HalfVT, XLo, YHi);
8915 SDValue Cross2 = DAG.getNode(ISD::CLMUL, DL, HalfVT, XHi, YLo);
8916 SDValue Cross = DAG.getNode(ISD::XOR, DL, HalfVT, Cross1, Cross2);
8917 SDValue Hi = DAG.getNode(ISD::XOR, DL, HalfVT, LoH, Cross);
8918
8919 // Reassemble: Result = ZExt(Lo) | (AnyExt(Hi) << HalfBW)
8920 SDValue LoExt = DAG.getNode(ISD::ZERO_EXTEND, DL, VT, Lo);
8921 SDValue HiExt = DAG.getNode(ISD::ANY_EXTEND, DL, VT, Hi);
8922 SDValue HiShifted = DAG.getNode(ISD::SHL, DL, VT, HiExt, ShAmt);
8923 return DAG.getNode(ISD::OR, DL, VT, LoExt, HiShifted);
8924 }
8925 }
8926
8927 // Strategy 2: Promote to double-element-width CLMUL.
8928 // CLMUL(X, Y) = Trunc(CLMUL(AnyExt(X), AnyExt(Y)))
8929 {
8930 EVT ExtVT = VT.widenIntegerElementType(Ctx);
8931 if (isTypeLegal(ExtVT) && isOperationLegalOrCustom(ISD::CLMUL, ExtVT)) {
8932 // If CLMUL on ExtVT is Custom (not Legal), the target may
8933 // scalarize it, costing O(NumElements) scalar ops. The bit-by-bit
8934 // fallback costs O(BW) vectorized iterations. Only widen when
8935 // element count is small enough that scalarization is cheaper.
8936 unsigned NumElts = VT.getVectorMinNumElements();
8937 if (isOperationLegal(ISD::CLMUL, ExtVT) || NumElts < BW) {
8938 SDValue XExt = DAG.getNode(ISD::ANY_EXTEND, DL, ExtVT, X);
8939 SDValue YExt = DAG.getNode(ISD::ANY_EXTEND, DL, ExtVT, Y);
8940 SDValue Mul = DAG.getNode(ISD::CLMUL, DL, ExtVT, XExt, YExt);
8941 return DAG.getNode(ISD::TRUNCATE, DL, VT, Mul);
8942 }
8943 }
8944 }
8945
8946 // Strategy 3: Widen element count (pad with undef, do CLMUL on wider
8947 // vector, extract lower result). CLMUL is element-wise, so upper
8948 // (undef) lanes don't affect the lower results.
8949 // e.g. v4i16 => pad to v8i16 => halve to v8i8 PMUL => extract v4i16.
8950 if (auto EC = VT.getVectorElementCount(); EC.isFixed()) {
8951 EVT WideVT = EVT::getVectorVT(Ctx, VT.getVectorElementType(), EC * 2);
8952 if (isTypeLegal(WideVT) && canNarrowCLMULToLegal(*this, Ctx, WideVT)) {
8953 SDValue Undef = DAG.getUNDEF(WideVT);
8954 SDValue XWide = DAG.getNode(ISD::INSERT_SUBVECTOR, DL, WideVT, Undef,
8955 X, DAG.getVectorIdxConstant(0, DL));
8956 SDValue YWide = DAG.getNode(ISD::INSERT_SUBVECTOR, DL, WideVT, Undef,
8957 Y, DAG.getVectorIdxConstant(0, DL));
8958 SDValue WideRes = DAG.getNode(ISD::CLMUL, DL, WideVT, XWide, YWide);
8959 return DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, VT, WideRes,
8960 DAG.getVectorIdxConstant(0, DL));
8961 }
8962 }
8963 }
8964
8965 // Special case: clmul(X, ~0) is equivalent to a "parallel prefix XOR" or
8966 // "bitwise parity" operation.
8968 SDValue R = X;
8969 for (unsigned I = 1; I < BW; I <<= 1) {
8970 SDValue ShAmt = DAG.getShiftAmountConstant(I, VT, DL);
8971 SDValue Shifted = DAG.getNode(ISD::SHL, DL, VT, R, ShAmt);
8972 R = DAG.getNode(ISD::XOR, DL, VT, R, Shifted);
8973 }
8974 return R;
8975 }
8976
8977 // NOTE: If you change this expansion, please update the cost model
8978 // calculation in BasicTTIImpl::getTypeBasedIntrinsicInstrCost for
8979 // Intrinsic::clmul.
8980
8981 // Strategy 4: multiplication with holes.
8982 //
8983 // Uses "holes" (sequences of zeroes) to avoid carry spilling. When carries
8984 // do occur, they wind up in a "hole" and are subsequently masked out of the
8985 // result.
8986 //
8987 // A hole of 3 bits is optimal for 32-bit and 64-bit inputs. 128-bit
8988 // integers need a larger hole, and for smaller integers the fallback below
8989 // is more efficient.
8990 //
8991 // Based on bmul64 in bearssl and bmul in the rust polyval crate.
8992 if (BW >= 32 && BW <= 64 &&
8994
8995 // Set every fourth bit of each nibble, equivalent to 0b00010001...0001.
8996 APInt MaskVal = APInt::getSplat(BW, APInt(4, 0b0001));
8997
8998 // Create versions of X and Y that keep only the I-th bit of
8999 // each nibble.
9000 SDValue M[4], Xp[4], Yp[4];
9001 for (unsigned I = 0; I < 4; ++I) {
9002 M[I] = DAG.getConstant(MaskVal.shl(I), DL, VT);
9003 Xp[I] = DAG.getNode(ISD::AND, DL, VT, X, M[I]);
9004 Yp[I] = DAG.getNode(ISD::AND, DL, VT, Y, M[I]);
9005 }
9006
9007 // Codegens these expressions (16 multiplications):
9008 //
9009 // z0 = (x0 * y0) ^ (x1 * y3) ^ (x2 * y2) ^ (x3 * y1);
9010 // z1 = (x0 * y1) ^ (x1 * y0) ^ (x2 * y3) ^ (x3 * y2);
9011 // z2 = (x0 * y2) ^ (x1 * y1) ^ (x2 * y0) ^ (x3 * y3);
9012 // z3 = (x0 * y3) ^ (x1 * y2) ^ (x2 * y1) ^ (x3 * y0);
9013 SDValue Res = DAG.getConstant(0, DL, VT);
9014 for (unsigned I = 0; I < 4; ++I) {
9015 SDValue Zi = DAG.getConstant(0, DL, VT);
9016 for (unsigned J = 0; J < 4; ++J) {
9017 unsigned K = (I + 4 - J) % 4;
9018 SDValue P = DAG.getNode(ISD::MUL, DL, VT, Xp[J], Yp[K]);
9019 Zi = DAG.getNode(ISD::XOR, DL, VT, Zi, P);
9020 }
9021
9022 // Keep only the bits belonging to this iteration, and bitwise or it all
9023 // together.
9024 Zi = DAG.getNode(ISD::AND, DL, VT, Zi, M[I]);
9025 Res = DAG.getNode(ISD::OR, DL, VT, Res, Zi, SDNodeFlags::Disjoint);
9026 }
9027 return Res;
9028 }
9029
9030 // Strategy 5: the naive fallback.
9031 EVT SetCCVT = getSetCCResultType(DAG.getDataLayout(), Ctx, VT);
9032
9033 SDValue Res = DAG.getConstant(0, DL, VT);
9034 for (unsigned I = 0; I < BW; ++I) {
9035 SDValue ShiftAmt = DAG.getShiftAmountConstant(I, VT, DL);
9036 SDValue Mask = DAG.getConstant(APInt::getOneBitSet(BW, I), DL, VT);
9037 SDValue YMasked = DAG.getNode(ISD::AND, DL, VT, Y, Mask);
9038
9039 // For targets with a fast bit test instruction (e.g., x86 BT) or without
9040 // multiply, use a shift-based expansion to avoid expensive MUL
9041 // instructions.
9042 SDValue Part;
9043 if (!hasBitTest(Y, ShiftAmt) &&
9046 Part = DAG.getNode(ISD::MUL, DL, VT, X, YMasked);
9047 } else {
9048 // Canonical bit test: (Y & (1 << I)) != 0
9049 SDValue Zero = DAG.getConstant(0, DL, VT);
9050 SDValue Cond = DAG.getSetCC(DL, SetCCVT, YMasked, Zero, ISD::SETEQ);
9051 SDValue XShifted = DAG.getNode(ISD::SHL, DL, VT, X, ShiftAmt);
9052 Part = DAG.getSelect(DL, VT, Cond, Zero, XShifted);
9053 }
9054 Res = DAG.getNode(ISD::XOR, DL, VT, Res, Part);
9055 }
9056 return Res;
9057 }
9058 case ISD::CLMULR:
9059 // If we have CLMUL/CLMULH, merge the shifted results to form CLMULR.
9062 SDValue Lo = DAG.getNode(ISD::CLMUL, DL, VT, X, Y);
9063 SDValue Hi = DAG.getNode(ISD::CLMULH, DL, VT, X, Y);
9064 Lo = DAG.getNode(ISD::SRL, DL, VT, Lo,
9065 DAG.getShiftAmountConstant(BW - 1, VT, DL));
9066 Hi = DAG.getNode(ISD::SHL, DL, VT, Hi,
9067 DAG.getShiftAmountConstant(1, VT, DL));
9068 return DAG.getNode(ISD::OR, DL, VT, Lo, Hi);
9069 }
9070 [[fallthrough]];
9071 case ISD::CLMULH: {
9072 EVT ExtVT = VT.widenIntegerElementType(Ctx);
9073 // Use bitreverse-based lowering (CLMULR/H = rev(CLMUL(rev,rev)) >> S)
9074 // when any of these hold:
9075 // (a) ZERO_EXTEND to ExtVT or SRL on ExtVT isn't legal.
9076 // (b) CLMUL is legal on VT but not on ExtVT (e.g. v8i8 on AArch64).
9077 // (c) CLMUL on ExtVT isn't legal, but CLMUL on VT can be efficiently
9078 // expanded via halving/widening to reach legal CLMUL. The bitreverse
9079 // path creates CLMUL(VT) which will be expanded efficiently. The
9080 // promote path would create CLMUL(ExtVT) => halving => CLMULH(VT),
9081 // causing a cycle.
9082 // Note: when CLMUL is legal on ExtVT, the zext => CLMUL(ExtVT) => shift
9083 // => trunc path is preferred over the bitreverse path, as it avoids the
9084 // cost of 3 bitreverse operations.
9089 canNarrowCLMULToLegal(*this, Ctx, VT)))) {
9090 SDValue XRev = DAG.getNode(ISD::BITREVERSE, DL, VT, X);
9091 SDValue YRev = DAG.getNode(ISD::BITREVERSE, DL, VT, Y);
9092 SDValue ClMul = DAG.getNode(ISD::CLMUL, DL, VT, XRev, YRev);
9093 SDValue Res = DAG.getNode(ISD::BITREVERSE, DL, VT, ClMul);
9094 if (Opcode == ISD::CLMULH)
9095 Res = DAG.getNode(ISD::SRL, DL, VT, Res,
9096 DAG.getShiftAmountConstant(1, VT, DL));
9097 return Res;
9098 }
9099 SDValue XExt = DAG.getNode(ISD::ZERO_EXTEND, DL, ExtVT, X);
9100 SDValue YExt = DAG.getNode(ISD::ZERO_EXTEND, DL, ExtVT, Y);
9101 SDValue ClMul = DAG.getNode(ISD::CLMUL, DL, ExtVT, XExt, YExt);
9102 unsigned ShAmt = Opcode == ISD::CLMULR ? BW - 1 : BW;
9103 SDValue HiBits = DAG.getNode(ISD::SRL, DL, ExtVT, ClMul,
9104 DAG.getShiftAmountConstant(ShAmt, ExtVT, DL));
9105 return DAG.getNode(ISD::TRUNCATE, DL, VT, HiBits);
9106 }
9107 }
9108 llvm_unreachable("Expected CLMUL, CLMULR, or CLMULH");
9109}
9110
9112 SDLoc DL(Node);
9113 EVT VT = Node->getValueType(0);
9114 SDValue Val = Node->getOperand(0);
9115 SDValue Msk = Node->getOperand(1);
9116 unsigned BW = VT.getScalarSizeInBits();
9117
9118 // Just scalarize if scalar PEXT is legal
9120 return DAG.UnrollVectorOp(Node);
9121
9122 // Hacker's Delight §7-4: Compress, or Generalized Extract
9123 SDValue X = DAG.getNode(ISD::AND, DL, VT, Val, Msk);
9124 SDValue M = Msk;
9125 SDValue One = DAG.getShiftAmountConstant(1, VT, DL);
9126 SDValue Mk = DAG.getNode(ISD::SHL, DL, VT, DAG.getNOT(DL, M, VT), One);
9127
9128 // Repeatedly compute which bits would shift to the right by an odd amount,
9129 // shift all such bits in parallel using a mask, and double the shift amount.
9130 for (unsigned I = 1; I < BW; I *= 2) {
9131 // This expands the "parallel prefix" operation to clmul(Mk, ~0).
9132 SDValue Mp =
9133 DAG.getNode(ISD::CLMUL, DL, VT, Mk, DAG.getAllOnesConstant(DL, VT));
9134 SDValue Mv = DAG.getNode(ISD::AND, DL, VT, Mp, M);
9135 SDValue ShiftI = DAG.getShiftAmountConstant(I, VT, DL);
9136 SDValue MvS = DAG.getNode(ISD::SRL, DL, VT, Mv, ShiftI);
9137 M = DAG.getNode(ISD::OR, DL, VT, DAG.getNode(ISD::XOR, DL, VT, M, Mv), MvS,
9139 SDValue T = DAG.getNode(ISD::AND, DL, VT, X, Mv);
9140 SDValue TS = DAG.getNode(ISD::SRL, DL, VT, T, ShiftI);
9141 X = DAG.getNode(ISD::OR, DL, VT, DAG.getNode(ISD::XOR, DL, VT, X, T), TS,
9143 if (I * 2 < BW)
9144 Mk = DAG.getNode(ISD::AND, DL, VT, Mk, DAG.getNOT(DL, Mp, VT));
9145 }
9146
9147 return X;
9148}
9149
9151 SDLoc DL(Node);
9152 EVT VT = Node->getValueType(0);
9153 SDValue Val = Node->getOperand(0);
9154 SDValue Msk = Node->getOperand(1);
9155 unsigned BW = VT.getScalarSizeInBits();
9156
9157 // Just scalarize if scalar PDEP is legal
9159 return DAG.UnrollVectorOp(Node);
9160
9161 // Hacker's Delight §7-5: Expand, or Generalized Insert.
9162 unsigned LogBW = Log2_32_Ceil(BW);
9163 SmallVector<SDValue, 8> MvArray(LogBW);
9164 SDValue One = DAG.getShiftAmountConstant(1, VT, DL);
9165 SDValue Mc = Msk;
9166 SDValue Mk = DAG.getNode(ISD::SHL, DL, VT, DAG.getNOT(DL, Msk, VT), One);
9167
9168 // First pass: compute move masks for each power of two that a bit moves by.
9169 for (unsigned S = 0; S < LogBW; ++S) {
9170 unsigned ShiftS = 1u << S;
9171 // This expands the "parallel prefix" operation to clmul(Mk, ~0).
9172 SDValue Mp =
9173 DAG.getNode(ISD::CLMUL, DL, VT, Mk, DAG.getAllOnesConstant(DL, VT));
9174 SDValue Mv = DAG.getNode(ISD::AND, DL, VT, Mp, Mc);
9175 MvArray[S] = Mv;
9176 if (S + 1 < LogBW) {
9177 SDValue McXorMv = DAG.getNode(ISD::XOR, DL, VT, Mc, Mv);
9178 SDValue MvShifted = DAG.getNode(
9179 ISD::SRL, DL, VT, Mv, DAG.getShiftAmountConstant(ShiftS, VT, DL));
9180 Mc = DAG.getNode(ISD::OR, DL, VT, McXorMv, MvShifted,
9182 Mk = DAG.getNode(ISD::AND, DL, VT, Mk, DAG.getNOT(DL, Mp, VT));
9183 }
9184 }
9185
9186 // Second pass: move bits by 32, 16, 8, 4, 2, 1, using masks, in parallel.
9187 // Each pass handles half the shift amount of the previous pass.
9188 SDValue X = Val;
9189 for (int S = (int)LogBW - 1; S >= 0; --S) {
9190 SDValue ShiftSv = DAG.getShiftAmountConstant(1ull << S, VT, DL);
9191 SDValue T = DAG.getNode(ISD::SHL, DL, VT, X, ShiftSv);
9192 SDValue UnshiftedBits =
9193 DAG.getNode(ISD::AND, DL, VT, X, DAG.getNOT(DL, MvArray[S], VT));
9194 SDValue ShiftedBits = DAG.getNode(ISD::AND, DL, VT, T, MvArray[S]);
9195 X = DAG.getNode(ISD::OR, DL, VT, UnshiftedBits, ShiftedBits,
9197 }
9198
9199 return DAG.getNode(ISD::AND, DL, VT, X, Msk);
9200}
9201
9203 SelectionDAG &DAG) const {
9204 assert(Node->getNumOperands() == 3 && "Not a double-shift!");
9205 EVT VT = Node->getValueType(0);
9206 unsigned VTBits = VT.getScalarSizeInBits();
9207 assert(isPowerOf2_32(VTBits) && "Power-of-two integer type expected");
9208
9209 bool IsSHL = Node->getOpcode() == ISD::SHL_PARTS;
9210 bool IsSRA = Node->getOpcode() == ISD::SRA_PARTS;
9211 SDValue ShOpLo = Node->getOperand(0);
9212 SDValue ShOpHi = Node->getOperand(1);
9213 SDValue ShAmt = Node->getOperand(2);
9214 EVT ShAmtVT = ShAmt.getValueType();
9215 EVT ShAmtCCVT =
9216 getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), ShAmtVT);
9217 SDLoc dl(Node);
9218
9219 // ISD::FSHL and ISD::FSHR have defined overflow behavior but ISD::SHL and
9220 // ISD::SRA/L nodes haven't. Insert an AND to be safe, it's usually optimized
9221 // away during isel.
9222 SDValue SafeShAmt = DAG.getNode(ISD::AND, dl, ShAmtVT, ShAmt,
9223 DAG.getConstant(VTBits - 1, dl, ShAmtVT));
9224 SDValue Tmp1 = IsSRA ? DAG.getNode(ISD::SRA, dl, VT, ShOpHi,
9225 DAG.getConstant(VTBits - 1, dl, ShAmtVT))
9226 : DAG.getConstant(0, dl, VT);
9227
9228 SDValue Tmp2, Tmp3;
9229 if (IsSHL) {
9230 Tmp2 = DAG.getNode(ISD::FSHL, dl, VT, ShOpHi, ShOpLo, ShAmt);
9231 Tmp3 = DAG.getNode(ISD::SHL, dl, VT, ShOpLo, SafeShAmt);
9232 } else {
9233 Tmp2 = DAG.getNode(ISD::FSHR, dl, VT, ShOpHi, ShOpLo, ShAmt);
9234 Tmp3 = DAG.getNode(IsSRA ? ISD::SRA : ISD::SRL, dl, VT, ShOpHi, SafeShAmt);
9235 }
9236
9237 // If the shift amount is larger or equal than the width of a part we don't
9238 // use the result from the FSHL/FSHR. Insert a test and select the appropriate
9239 // values for large shift amounts.
9240 SDValue AndNode = DAG.getNode(ISD::AND, dl, ShAmtVT, ShAmt,
9241 DAG.getConstant(VTBits, dl, ShAmtVT));
9242 SDValue Cond = DAG.getSetCC(dl, ShAmtCCVT, AndNode,
9243 DAG.getConstant(0, dl, ShAmtVT), ISD::SETNE);
9244
9245 if (IsSHL) {
9246 Hi = DAG.getNode(ISD::SELECT, dl, VT, Cond, Tmp3, Tmp2);
9247 Lo = DAG.getNode(ISD::SELECT, dl, VT, Cond, Tmp1, Tmp3);
9248 } else {
9249 Lo = DAG.getNode(ISD::SELECT, dl, VT, Cond, Tmp3, Tmp2);
9250 Hi = DAG.getNode(ISD::SELECT, dl, VT, Cond, Tmp1, Tmp3);
9251 }
9252}
9253
9255 SelectionDAG &DAG) const {
9256 // This implements llvm.canonicalize.f* by multiplication with 1.0, as
9257 // suggested in
9258 // https://llvm.org/docs/LangRef.html#llvm-canonicalize-intrinsic.
9259 // It uses strict_fp operations even outside a strict_fp context in order
9260 // to guarantee that the canonicalization is not optimized away by later
9261 // passes. The result chain introduced by that is intentionally ignored
9262 // since no ordering requirement is intended here.
9263 EVT VT = Node->getValueType(0);
9264 SDLoc DL(Node);
9265 SDNodeFlags Flags = Node->getFlags();
9266 Flags.setNoFPExcept(true);
9267 SDValue One = DAG.getConstantFP(1.0, DL, VT);
9268 SDValue Mul =
9269 DAG.getNode(ISD::STRICT_FMUL, DL, {VT, MVT::Other},
9270 {DAG.getEntryNode(), Node->getOperand(0), One}, Flags);
9271 return Mul;
9272}
9273
9275 SelectionDAG &DAG) const {
9276 // Expand conversion from a native IEEE float type to an arbitrary FP format
9277 // returning the result as an integer using bit manipulation.
9278 EVT ResVT = Node->getValueType(0);
9279 SDLoc dl(Node);
9280
9281 SDValue FloatVal = Node->getOperand(0);
9282 const uint64_t SemEnum = Node->getConstantOperandVal(1);
9283 const auto Sem = static_cast<APFloatBase::Semantics>(SemEnum);
9284 const auto RoundMode =
9285 static_cast<RoundingMode>(Node->getConstantOperandVal(2));
9286 const bool Saturate = Node->getConstantOperandVal(3) != 0;
9287
9288 // Supported destination formats.
9289 switch (Sem) {
9296 break;
9297 default:
9298 DAG.getContext()->emitError("CONVERT_TO_ARBITRARY_FP: not implemented "
9299 "destination format (semantics enum " +
9300 Twine(SemEnum) + ")");
9301 return SDValue();
9302 }
9303
9304 // Supported rounding modes.
9305 switch (RoundMode) {
9311 break;
9312 default:
9313 DAG.getContext()->emitError(
9314 "CONVERT_TO_ARBITRARY_FP: unsupported rounding mode (enum " +
9315 Twine(static_cast<int>(RoundMode)) + ")");
9316 return SDValue();
9317 }
9318
9319 // Destination format parameters.
9320 const fltSemantics &DstSem = APFloatBase::EnumToSemantics(Sem);
9321 const unsigned DstBits = APFloat::getSizeInBits(DstSem);
9322 const unsigned DstPrecision = APFloat::semanticsPrecision(DstSem);
9323 const unsigned DstMant = DstPrecision - 1;
9324 // Unsigned formats spend no bit on the sign.
9325 const bool DstHasSign = APFloat::semanticsHasSignedRepr(DstSem);
9326 const unsigned DstExpBits = DstBits - (DstHasSign ? 1 : 0) - DstMant;
9327 const int DstBias = 1 - APFloat::semanticsMinExponent(DstSem);
9328 const unsigned DstExpMax = (1U << DstExpBits) - 1;
9329 const uint64_t DstMantMask = (DstMant > 0) ? ((1ULL << DstMant) - 1) : 0;
9330 const fltNonfiniteBehavior DstNFBehavior = DstSem.nonFiniteBehavior;
9331 const fltNanEncoding DstNanEnc = DstSem.nanEncoding;
9332
9333 // Compute the maximum normal exponent for the destination format.
9334 const unsigned DstExpMaxNormal =
9335 DstNFBehavior == fltNonfiniteBehavior::IEEE754 ? DstExpMax - 1
9336 : DstExpMax;
9337
9338 // For NanOnly formats the max exponent field for finite values
9339 // is DstExpMax, but the encoding with exp = DstExpMax and
9340 // mant = all-ones is NaN. So DstExpMaxNormal = DstExpMax, but max
9341 // mantissa at that exponent is DstMantMask - 1 (if NanEnc == AllOnes) to
9342 // avoid the NaN encoding.
9343 uint64_t DstMaxMantAtMaxExp = DstMantMask;
9344 if (DstNFBehavior == fltNonfiniteBehavior::NanOnly &&
9345 DstNanEnc == fltNanEncoding::AllOnes)
9346 DstMaxMantAtMaxExp = DstMantMask - 1;
9347
9348 // Source format parameters.
9349 EVT SrcVT = FloatVal.getValueType();
9350 const fltSemantics &SrcSem = SrcVT.getScalarType().getFltSemantics();
9351 const unsigned SrcBits = APFloat::getSizeInBits(SrcSem);
9352 const unsigned SrcPrecision = APFloat::semanticsPrecision(SrcSem);
9353 const unsigned SrcMant = SrcPrecision - 1;
9354 const uint64_t SrcMantMask = (1ULL << SrcMant) - 1;
9355
9356 // Work in the source integer type. Match the destination shape so the
9357 // expansion stays vector when ResVT is a vector.
9358 EVT IntScalarVT = EVT::getIntegerVT(*DAG.getContext(), SrcBits);
9359 EVT IntVT = ResVT.changeElementType(*DAG.getContext(), IntScalarVT);
9360 EVT SetCCVT =
9361 getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), IntVT);
9362 EVT FPSetCCVT =
9363 getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), SrcVT);
9364
9365 SDValue Zero = DAG.getConstant(0, dl, IntVT);
9366 SDValue One = DAG.getConstant(1, dl, IntVT);
9367
9368 // Bitcast source float to integer to extract the sign bit.
9369 SDValue Src = DAG.getNode(ISD::BITCAST, dl, IntVT, FloatVal);
9370 SDValue SignBit =
9371 DAG.getNode(ISD::SRL, dl, IntVT, Src,
9372 DAG.getShiftAmountConstant(SrcBits - 1, IntVT, dl));
9373
9374 // Classify the input.
9375 SDValue FPZero = DAG.getConstantFP(0.0, dl, SrcVT);
9376 SDValue FPInf = DAG.getConstantFP(APFloat::getInf(SrcSem), dl, SrcVT);
9377 SDValue AbsVal = DAG.getNode(ISD::FABS, dl, SrcVT, FloatVal);
9378 SDValue IsNaN = DAG.getSetCC(dl, FPSetCCVT, FloatVal, FPZero, ISD::SETUO);
9379 SDValue IsInf = DAG.getSetCC(dl, FPSetCCVT, AbsVal, FPInf, ISD::SETOEQ);
9380 SDValue IsZero = DAG.getSetCC(dl, FPSetCCVT, FloatVal, FPZero, ISD::SETOEQ);
9381
9382 // Split into a normalized fraction and unbiased exponent. FFREXP normalizes
9383 // source denormals automatically. The result is unspecified for Inf/NaN, but
9384 // those inputs are detected above and override the final result.
9385 EVT FrexpExpScalarVT =
9387 EVT FrexpExpVT = SrcVT.changeElementType(*DAG.getContext(), FrexpExpScalarVT);
9388 SDValue Frexp =
9389 DAG.getNode(ISD::FFREXP, dl, DAG.getVTList(SrcVT, FrexpExpVT), FloatVal);
9390 SDValue FrexpFrac = Frexp.getValue(0);
9391 SDValue FrexpExp = Frexp.getValue(1);
9392
9393 SDValue FrexpFracInt = DAG.getNode(ISD::BITCAST, dl, IntVT, FrexpFrac);
9394 SDValue EffSrcMant = DAG.getNode(ISD::AND, dl, IntVT, FrexpFracInt,
9395 DAG.getConstant(SrcMantMask, dl, IntVT));
9396
9397 SDValue FrexpExpExt = DAG.getSExtOrTrunc(FrexpExp, dl, IntVT);
9398 SDValue NewExp = DAG.getNode(ISD::ADD, dl, IntVT, FrexpExpExt,
9399 DAG.getConstant(DstBias - 1, dl, IntVT));
9400
9401 // Compute rounding increment given the round bit, sticky bits, and LSB
9402 // of the truncated mantissa.
9403 auto ComputeRoundUp = [&](SDValue RoundBit, SDValue StickyBits,
9404 SDValue LSB) -> SDValue {
9405 switch (RoundMode) {
9407 // Round up if round_bit && (sticky || lsb)
9408 SDValue StickyOrLSB = DAG.getNode(ISD::OR, dl, IntVT, StickyBits, LSB);
9409 return DAG.getNode(ISD::AND, dl, IntVT, RoundBit, StickyOrLSB);
9410 }
9412 return Zero;
9414 // Round up if positive and any truncated bits are set.
9415 SDValue AnyTruncBits =
9416 DAG.getNode(ISD::OR, dl, IntVT, RoundBit, StickyBits);
9417 SDValue HasTruncBits =
9418 DAG.getSetCC(dl, SetCCVT, AnyTruncBits, Zero, ISD::SETNE);
9419 SDValue IsPositive = DAG.getSetCC(dl, SetCCVT, SignBit, Zero, ISD::SETEQ);
9420 SDValue DoRound =
9421 DAG.getNode(ISD::AND, dl, SetCCVT, HasTruncBits, IsPositive);
9422 return DAG.getNode(ISD::ZERO_EXTEND, dl, IntVT, DoRound);
9423 }
9425 // Round up if negative and any truncated bits are set (to -Inf).
9426 SDValue AnyTruncBits =
9427 DAG.getNode(ISD::OR, dl, IntVT, RoundBit, StickyBits);
9428 SDValue HasTruncBits =
9429 DAG.getSetCC(dl, SetCCVT, AnyTruncBits, Zero, ISD::SETNE);
9430 SDValue IsNegative = DAG.getSetCC(dl, SetCCVT, SignBit, Zero, ISD::SETNE);
9431 SDValue DoRound =
9432 DAG.getNode(ISD::AND, dl, SetCCVT, HasTruncBits, IsNegative);
9433 return DAG.getNode(ISD::ZERO_EXTEND, dl, IntVT, DoRound);
9434 }
9436 return RoundBit;
9437 default:
9438 llvm_unreachable("unsupported rounding mode");
9439 }
9440 };
9441
9442 // Round mantissa from SrcMant bits to DstMant bits.
9443 SDValue TruncMant;
9444 SDValue RoundUp;
9445 if (SrcMant > DstMant) {
9446 const unsigned Shift = SrcMant - DstMant;
9447 SDValue ShiftConst = DAG.getShiftAmountConstant(Shift, IntVT, dl);
9448 TruncMant = DAG.getNode(ISD::SRL, dl, IntVT, EffSrcMant, ShiftConst);
9449
9450 // Check bit at position Shift - 1 aka the round bit.
9451 SDValue RoundBit;
9452 if (Shift >= 1) {
9453 SDValue RoundBitShift = DAG.getShiftAmountConstant(Shift - 1, IntVT, dl);
9454 SDValue ShiftedMant =
9455 DAG.getNode(ISD::SRL, dl, IntVT, EffSrcMant, RoundBitShift);
9456 RoundBit = DAG.getNode(ISD::AND, dl, IntVT, ShiftedMant, One);
9457 } else {
9458 RoundBit = Zero;
9459 }
9460
9461 // OR of all bits below the round bit to get sticky bits.
9462 SDValue StickyBits;
9463 if (Shift >= 2) {
9464 uint64_t StickyMask = maskTrailingOnes<uint64_t>(Shift - 1);
9465 StickyBits = DAG.getNode(ISD::AND, dl, IntVT, EffSrcMant,
9466 DAG.getConstant(StickyMask, dl, IntVT));
9467 StickyBits = DAG.getSetCC(dl, SetCCVT, StickyBits, Zero, ISD::SETNE);
9468 StickyBits = DAG.getNode(ISD::ZERO_EXTEND, dl, IntVT, StickyBits);
9469 } else {
9470 StickyBits = Zero;
9471 }
9472
9473 // LSB of truncated mantissa.
9474 SDValue LSB = DAG.getNode(ISD::AND, dl, IntVT, TruncMant, One);
9475
9476 RoundUp = ComputeRoundUp(RoundBit, StickyBits, LSB);
9477 } else {
9478 // If DstMant >= SrcMant, then no rounding needed, just shift left.
9479 SDValue MantShift =
9480 DAG.getShiftAmountConstant(DstMant - SrcMant, IntVT, dl);
9481 TruncMant = DAG.getNode(ISD::SHL, dl, IntVT, EffSrcMant, MantShift);
9482 RoundUp = Zero;
9483 }
9484
9485 // Apply rounding.
9486 SDValue RoundedMant = DAG.getNode(ISD::ADD, dl, IntVT, TruncMant, RoundUp);
9487
9488 // Handle mantissa overflow from rounding.
9489 // If rounded_mant > DstMantMask, carry into exponent.
9490 SDValue MantOverflow =
9491 DAG.getSetCC(dl, SetCCVT, RoundedMant,
9492 DAG.getConstant(DstMantMask, dl, IntVT), ISD::SETGT);
9493 // On overflow: mant = 0, exp += 1.
9494 SDValue AdjMant = DAG.getSelect(dl, IntVT, MantOverflow, Zero, RoundedMant);
9495 SDValue AdjExp =
9496 DAG.getNode(ISD::ADD, dl, IntVT, NewExp,
9497 DAG.getNode(ISD::ZERO_EXTEND, dl, IntVT, MantOverflow));
9498
9499 // Precompute sign shifted to MSB of destination. Unsigned formats have no
9500 // sign bit to merge in.
9501 SDValue SignShifted =
9502 DstHasSign
9503 ? DAG.getNode(ISD::SHL, dl, IntVT, SignBit,
9504 DAG.getShiftAmountConstant(DstBits - 1, IntVT, dl))
9505 : Zero;
9506
9507 // Destination denormal conversion (when new_exp <= 0).
9508 // Shift the mantissa right by 1 - new_exp additional bits and set the
9509 // exponent field to 0.
9510 SDValue ExpIsNeg = DAG.getSetCC(dl, SetCCVT, AdjExp,
9511 DAG.getConstant(1, dl, IntVT), ISD::SETLT);
9512
9513 SDValue DenormResult;
9514 {
9515 // denorm_shift = 1 - NewExp.
9516 SDValue DenormShift = DAG.getNode(ISD::SUB, dl, IntVT, One, NewExp);
9517
9518 // full_src_mant = (1 << SrcMant) | EffSrcMant.
9519 SDValue ImplicitOne =
9520 DAG.getNode(ISD::SHL, dl, IntVT, One,
9521 DAG.getShiftAmountConstant(SrcMant, IntVT, dl));
9522 SDValue FullSrcMant =
9523 DAG.getNode(ISD::OR, dl, IntVT, EffSrcMant, ImplicitOne);
9524
9525 // Total right shift = DenormShift + (SrcMant - DstMant).
9526 int64_t MantDelta = static_cast<int64_t>(SrcMant) - DstMant;
9527 SDValue TotalShift =
9528 DAG.getNode(ISD::ADD, dl, IntVT, DenormShift,
9529 DAG.getSignedConstant(MantDelta, dl, IntVT));
9530
9531 // Clamp total shift to avoid UB, then truncate denorm mantissa.
9532 EVT ShiftVT = getShiftAmountTy(IntVT, DAG.getDataLayout());
9533 SDValue MaxShift = DAG.getConstant(SrcBits - 1, dl, IntVT);
9534 SDValue ClampedShift =
9535 DAG.getNode(ISD::UMIN, dl, IntVT, TotalShift, MaxShift);
9536 SDValue DenormTruncMant =
9537 DAG.getNode(ISD::SRL, dl, IntVT, FullSrcMant,
9538 DAG.getZExtOrTrunc(ClampedShift, dl, ShiftVT));
9539
9540 // Rounding for denorm path.
9541 SDValue DenormRoundUp;
9542 {
9543 // Round bit is at position TotalShift - 1 of FullSrcMant.
9544 // Clamp to at least 1 so the subtraction doesn't underflow and create
9545 // shift nodes with invalid shift amounts.
9546 SDValue SafeShift = DAG.getNode(ISD::UMAX, dl, IntVT, ClampedShift, One);
9547 SDValue RoundBitPos = DAG.getNode(ISD::SUB, dl, IntVT, SafeShift, One);
9548 SDValue RoundBitPosAmt = DAG.getZExtOrTrunc(RoundBitPos, dl, ShiftVT);
9549 SDValue DenormRoundBit = DAG.getNode(
9550 ISD::AND, dl, IntVT,
9551 DAG.getNode(ISD::SRL, dl, IntVT, FullSrcMant, RoundBitPosAmt), One);
9552
9553 // Sticky: all bits below round bit.
9554 // sticky_mask = (1 << RoundBitPos) - 1
9555 SDValue StickyMask = DAG.getNode(
9556 ISD::SUB, dl, IntVT,
9557 DAG.getNode(ISD::SHL, dl, IntVT, One, RoundBitPosAmt), One);
9558 SDValue DenormStickyBits =
9559 DAG.getNode(ISD::AND, dl, IntVT, FullSrcMant, StickyMask);
9560 SDValue HasSticky = DAG.getNode(
9561 ISD::ZERO_EXTEND, dl, IntVT,
9562 DAG.getSetCC(dl, SetCCVT, DenormStickyBits, Zero, ISD::SETNE));
9563
9564 SDValue DenormLSB =
9565 DAG.getNode(ISD::AND, dl, IntVT, DenormTruncMant, One);
9566
9567 DenormRoundUp = ComputeRoundUp(DenormRoundBit, HasSticky, DenormLSB);
9568
9569 // Only apply rounding if TotalShift >= 1 (i.e., there are bits to round).
9570 SDValue ShiftGEOne =
9571 DAG.getSetCC(dl, SetCCVT, ClampedShift, One, ISD::SETUGE);
9572 DenormRoundUp = DAG.getSelect(dl, IntVT, ShiftGEOne, DenormRoundUp, Zero);
9573 }
9574
9575 SDValue DenormRoundedMant =
9576 DAG.getNode(ISD::ADD, dl, IntVT, DenormTruncMant, DenormRoundUp);
9577
9578 // If rounding caused overflow into the normal range, then we get the
9579 // smallest normal number.
9580 SDValue DenormMantOF =
9581 DAG.getSetCC(dl, SetCCVT, DenormRoundedMant,
9582 DAG.getConstant(DstMantMask, dl, IntVT), ISD::SETGT);
9583 SDValue DenormFinalMant =
9584 DAG.getSelect(dl, IntVT, DenormMantOF, Zero, DenormRoundedMant);
9585 SDValue DenormFinalExp = DAG.getSelect(dl, IntVT, DenormMantOF, One, Zero);
9586
9587 // Assemble: sign | (exp << DstMant) | mant
9588 SDValue DenormExpShifted =
9589 DAG.getNode(ISD::SHL, dl, IntVT, DenormFinalExp,
9590 DAG.getShiftAmountConstant(DstMant, IntVT, dl));
9591 DenormResult = DAG.getNode(
9592 ISD::OR, dl, IntVT,
9593 DAG.getNode(ISD::OR, dl, IntVT, SignShifted, DenormExpShifted),
9594 DenormFinalMant);
9595 }
9596
9597 // Exponent overflow detection.
9598 SDValue ExpOF =
9599 DAG.getSetCC(dl, SetCCVT, AdjExp,
9600 DAG.getConstant(DstExpMaxNormal, dl, IntVT), ISD::SETGT);
9601
9602 // Also check if AdjExp == DstExpMaxNormal and mantissa overflow into
9603 // a value that exceeds the max allowed mantissa at that exponent.
9604 SDValue ExpAtMax =
9605 DAG.getSetCC(dl, SetCCVT, AdjExp,
9606 DAG.getConstant(DstExpMaxNormal, dl, IntVT), ISD::SETEQ);
9607 SDValue MantExceedsMax =
9608 DAG.getSetCC(dl, SetCCVT, AdjMant,
9609 DAG.getConstant(DstMaxMantAtMaxExp, dl, IntVT), ISD::SETGT);
9610 SDValue ExpMantOF =
9611 DAG.getNode(ISD::AND, dl, SetCCVT, ExpAtMax, MantExceedsMax);
9612 SDValue IsOverflow = DAG.getNode(ISD::OR, dl, SetCCVT, ExpOF, ExpMantOF);
9613
9614 // Build overflow result.
9616
9617 if (Saturate) {
9618 // Clamp to max finite value:
9619 // sign | (DstExpMaxNormal << DstMant) | DstMaxMantAtMaxExp
9620 uint64_t MaxFinite =
9621 ((uint64_t)DstExpMaxNormal << DstMant) | DstMaxMantAtMaxExp;
9622 OverflowResult = DAG.getNode(ISD::OR, dl, IntVT, SignShifted,
9623 DAG.getConstant(MaxFinite, dl, IntVT));
9624 } else if (DstNFBehavior == fltNonfiniteBehavior::IEEE754) {
9625 // Produce infinity.
9626 uint64_t InfBits = (uint64_t)DstExpMax << DstMant;
9627 OverflowResult = DAG.getNode(ISD::OR, dl, IntVT, SignShifted,
9628 DAG.getConstant(InfBits, dl, IntVT));
9629 } else {
9630 // Emit poison if no Inf in format and not saturating.
9631 OverflowResult = DAG.getPOISON(IntVT);
9632 }
9633
9634 // Assemble normal result: sign | (AdjExp << DstMant) | AdjMant
9635 SDValue NormExpShifted =
9636 DAG.getNode(ISD::SHL, dl, IntVT, AdjExp,
9637 DAG.getShiftAmountConstant(DstMant, IntVT, dl));
9638 SDValue NormResult = DAG.getNode(
9639 ISD::OR, dl, IntVT,
9640 DAG.getNode(ISD::OR, dl, IntVT, SignShifted, NormExpShifted), AdjMant);
9641
9642 // Build special-value results.
9643 SDValue NaNResult;
9644 if (DstNFBehavior == fltNonfiniteBehavior::IEEE754) {
9645 // Produce canonical NaN.
9646 const uint64_t QNaNBit = (DstMant > 0) ? (1ULL << (DstMant - 1)) : 0;
9647 NaNResult =
9648 DAG.getConstant(((uint64_t)DstExpMax << DstMant) | QNaNBit, dl, IntVT);
9649 } else if (DstNFBehavior == fltNonfiniteBehavior::NanOnly &&
9650 DstNanEnc == fltNanEncoding::AllOnes) {
9651 // E4M3FN-style: NaN is exp=all-ones, mant=all-ones.
9652 NaNResult = DAG.getConstant(((uint64_t)DstExpMax << DstMant) | DstMantMask,
9653 dl, IntVT);
9654 } else {
9655 // NaN -> poison for finite only values.
9656 NaNResult = DAG.getPOISON(IntVT);
9657 }
9658
9659 // Inf handling.
9660 SDValue InfResult;
9661 if (DstNFBehavior == fltNonfiniteBehavior::IEEE754) {
9662 // Produce signed infinity.
9663 uint64_t InfBits = (uint64_t)DstExpMax << DstMant;
9664 InfResult = DAG.getNode(ISD::OR, dl, IntVT, SignShifted,
9665 DAG.getConstant(InfBits, dl, IntVT));
9666 } else if (Saturate) {
9667 // Inf saturates to max finite.
9668 uint64_t MaxFinite =
9669 ((uint64_t)DstExpMaxNormal << DstMant) | DstMaxMantAtMaxExp;
9670 InfResult = DAG.getNode(ISD::OR, dl, IntVT, SignShifted,
9671 DAG.getConstant(MaxFinite, dl, IntVT));
9672 } else {
9673 // No Inf and not saturating -> poison.
9674 InfResult = DAG.getPOISON(IntVT);
9675 }
9676
9677 SDValue ZeroResult = SignShifted;
9678
9679 // Final selection in an order: NaN takes priority, then Inf, then Zero.
9680 SDValue FiniteResult =
9681 DAG.getSelect(dl, IntVT, ExpIsNeg, DenormResult, NormResult);
9682 FiniteResult =
9683 DAG.getSelect(dl, IntVT, IsOverflow, OverflowResult, FiniteResult);
9684
9685 SDValue Result = FiniteResult;
9686 Result = DAG.getSelect(dl, IntVT, IsZero, ZeroResult, Result);
9687 Result = DAG.getSelect(dl, IntVT, IsInf, InfResult, Result);
9688
9689 // Negative values are unrepresentable in an unsigned format: clamp to zero
9690 // when saturating, poison otherwise so no select is needed. -0.0 is handled
9691 // by IsZero above. Run before the NaN case so a negative NaN still yields
9692 // NaN.
9693 if (!DstHasSign && Saturate) {
9694 SDValue IsNegative =
9695 DAG.getSetCC(dl, FPSetCCVT, FloatVal, FPZero, ISD::SETOLT);
9696 Result = DAG.getSelect(dl, IntVT, IsNegative, Zero, Result);
9697 }
9698
9699 Result = DAG.getSelect(dl, IntVT, IsNaN, NaNResult, Result);
9700
9701 // Truncate to destination integer type.
9702 return DAG.getZExtOrTrunc(Result, dl, ResVT);
9703}
9704
9705SDValue
9707 SelectionDAG &DAG) const {
9708 SDLoc dl(Node);
9709 EVT DstVT = Node->getValueType(0);
9710 EVT DstScalarVT = DstVT.getScalarType();
9711
9712 SDValue IntVal = Node->getOperand(0);
9713 const uint64_t SemEnum = Node->getConstantOperandVal(1);
9714 const auto Sem = static_cast<APFloatBase::Semantics>(SemEnum);
9715
9716 // Supported source formats.
9717 switch (Sem) {
9724 break;
9725 default:
9726 DAG.getContext()->emitError("CONVERT_FROM_ARBITRARY_FP: not implemented "
9727 "source format (semantics enum " +
9728 Twine(SemEnum) + ")");
9729 return SDValue();
9730 }
9731
9732 const fltSemantics &SrcSem = APFloatBase::EnumToSemantics(Sem);
9733 const unsigned SrcBits = APFloat::getSizeInBits(SrcSem);
9734 const unsigned SrcPrecision = APFloat::semanticsPrecision(SrcSem);
9735 const unsigned SrcMant = SrcPrecision - 1;
9736 // Unsigned formats spend no bit on the sign.
9737 const bool SrcHasSign = APFloat::semanticsHasSignedRepr(SrcSem);
9738 const unsigned SrcExp = SrcBits - (SrcHasSign ? 1 : 0) - SrcMant;
9739 const int SrcBias = 1 - APFloat::semanticsMinExponent(SrcSem);
9740 const fltNonfiniteBehavior NFBehavior = SrcSem.nonFiniteBehavior;
9741
9742 // Destination format parameters.
9743 const fltSemantics &DstSem = DstScalarVT.getFltSemantics();
9744 const unsigned DstBits = APFloat::getSizeInBits(DstSem);
9745 const unsigned DstMant = APFloat::semanticsPrecision(DstSem) - 1;
9746 const unsigned DstExpBits = DstBits - DstMant - 1;
9747 const int DstMinExp = APFloat::semanticsMinExponent(DstSem);
9748 const int DstBias = 1 - DstMinExp;
9749 const uint64_t DstExpAllOnes = (1ULL << DstExpBits) - 1;
9750
9751 // Work in an integer type matching the destination float width.
9752 EVT IntScalarVT = EVT::getIntegerVT(*DAG.getContext(), DstBits);
9753 EVT IntVT = DstVT.isVector()
9754 ? EVT::getVectorVT(*DAG.getContext(), IntScalarVT,
9755 DstVT.getVectorElementCount())
9756 : IntScalarVT;
9757
9758 SDValue Src = DAG.getZExtOrTrunc(IntVal, dl, IntVT);
9759
9760 EVT SetCCVT =
9761 getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), IntVT);
9762
9763 SDValue Zero = DAG.getConstant(0, dl, IntVT);
9764 SDValue One = DAG.getConstant(1, dl, IntVT);
9765
9766 // Extract bit fields.
9767 const uint64_t MantMask = (SrcMant > 0) ? ((1ULL << SrcMant) - 1) : 0;
9768 const uint64_t ExpMask = (1ULL << SrcExp) - 1;
9769
9770 SDValue MantField = DAG.getNode(ISD::AND, dl, IntVT, Src,
9771 DAG.getConstant(MantMask, dl, IntVT));
9772
9773 SDValue ExpField =
9774 DAG.getNode(ISD::AND, dl, IntVT,
9775 DAG.getNode(ISD::SRL, dl, IntVT, Src,
9776 DAG.getShiftAmountConstant(SrcMant, IntVT, dl)),
9777 DAG.getConstant(ExpMask, dl, IntVT));
9778
9779 // An unsigned source has no sign bit; bit SrcBits - 1 is part of the
9780 // exponent.
9781 SDValue SignShifted =
9782 SrcHasSign
9783 ? DAG.getNode(
9784 ISD::SHL, dl, IntVT,
9785 DAG.getNode(ISD::SRL, dl, IntVT, Src,
9786 DAG.getShiftAmountConstant(SrcBits - 1, IntVT, dl)),
9787 DAG.getShiftAmountConstant(DstBits - 1, IntVT, dl))
9788 : Zero;
9789
9790 // Classify the input.
9791 SDValue ExpAllOnes = DAG.getConstant(ExpMask, dl, IntVT);
9792 SDValue IsExpAllOnes =
9793 DAG.getSetCC(dl, SetCCVT, ExpField, ExpAllOnes, ISD::SETEQ);
9794 SDValue IsExpZero = DAG.getSetCC(dl, SetCCVT, ExpField, Zero, ISD::SETEQ);
9795 SDValue IsMantZero = DAG.getSetCC(dl, SetCCVT, MantField, Zero, ISD::SETEQ);
9796 SDValue IsMantNonZero =
9797 DAG.getSetCC(dl, SetCCVT, MantField, Zero, ISD::SETNE);
9798
9799 SDValue IsNaN;
9800 if (NFBehavior == fltNonfiniteBehavior::FiniteOnly) {
9801 IsNaN = DAG.getBoolConstant(false, dl, SetCCVT, IntVT);
9802 } else if (NFBehavior == fltNonfiniteBehavior::IEEE754) {
9803 IsNaN = DAG.getNode(ISD::AND, dl, SetCCVT, IsExpAllOnes, IsMantNonZero);
9804 } else {
9806 SDValue MantAllOnes = DAG.getConstant(MantMask, dl, IntVT);
9807 SDValue IsMantAllOnes =
9808 DAG.getSetCC(dl, SetCCVT, MantField, MantAllOnes, ISD::SETEQ);
9809 IsNaN = DAG.getNode(ISD::AND, dl, SetCCVT, IsExpAllOnes, IsMantAllOnes);
9810 }
9811
9812 SDValue IsInf;
9813 if (NFBehavior == fltNonfiniteBehavior::IEEE754)
9814 IsInf = DAG.getNode(ISD::AND, dl, SetCCVT, IsExpAllOnes, IsMantZero);
9815 else
9816 IsInf = DAG.getBoolConstant(false, dl, SetCCVT, IntVT);
9817
9818 SDValue IsZero = DAG.getNode(ISD::AND, dl, SetCCVT, IsExpZero, IsMantZero);
9819 SDValue IsDenorm =
9820 DAG.getNode(ISD::AND, dl, SetCCVT, IsExpZero, IsMantNonZero);
9821
9822 // Normal value conversion.
9823 const int BiasAdjust = DstBias - SrcBias;
9824 SDValue NormDstExp =
9825 DAG.getNode(ISD::ADD, dl, IntVT, ExpField,
9826 DAG.getConstant(APInt(DstBits, BiasAdjust, true), dl, IntVT));
9827
9828 SDValue NormDstMant;
9829 if (DstMant > SrcMant) {
9830 SDValue NormDstMantShift =
9831 DAG.getShiftAmountConstant(DstMant - SrcMant, IntVT, dl);
9832 NormDstMant = DAG.getNode(ISD::SHL, dl, IntVT, MantField, NormDstMantShift);
9833 } else {
9834 NormDstMant = MantField;
9835 }
9836
9837 SDValue DstMantShift = DAG.getShiftAmountConstant(DstMant, IntVT, dl);
9838 SDValue NormExpShifted =
9839 DAG.getNode(ISD::SHL, dl, IntVT, NormDstExp, DstMantShift);
9840 SDValue NormResult =
9841 DAG.getNode(ISD::OR, dl, IntVT,
9842 DAG.getNode(ISD::OR, dl, IntVT, SignShifted, NormExpShifted),
9843 NormDstMant);
9844
9845 // Denormal value conversion.
9846 SDValue DenormResult;
9847 {
9848 const unsigned IntVTBits = DstBits;
9849 SDValue LeadingZeros =
9850 DAG.getNode(ISD::CTLZ_ZERO_POISON, dl, IntVT, MantField);
9851
9852 const int DenormExpConst =
9853 (int)IntVTBits + DstBias - SrcBias - (int)SrcMant;
9854 SDValue DenormDstExp = DAG.getNode(
9855 ISD::SUB, dl, IntVT,
9856 DAG.getConstant(APInt(DstBits, DenormExpConst, true), dl, IntVT),
9857 LeadingZeros);
9858
9859 SDValue MantMSB =
9860 DAG.getNode(ISD::SUB, dl, IntVT,
9861 DAG.getConstant(IntVTBits - 1, dl, IntVT), LeadingZeros);
9862
9863 SDValue LeadingOne = DAG.getNode(ISD::SHL, dl, IntVT, One, MantMSB);
9864 SDValue Frac = DAG.getNode(ISD::XOR, dl, IntVT, MantField, LeadingOne);
9865
9866 const unsigned ShiftSub = IntVTBits - 1 - DstMant;
9867 SDValue ShiftAmount = DAG.getNode(ISD::SUB, dl, IntVT, LeadingZeros,
9868 DAG.getConstant(ShiftSub, dl, IntVT));
9869
9870 SDValue DenormDstMant = DAG.getNode(ISD::SHL, dl, IntVT, Frac, ShiftAmount);
9871
9872 SDValue DenormExpShifted =
9873 DAG.getNode(ISD::SHL, dl, IntVT, DenormDstExp, DstMantShift);
9874 DenormResult = DAG.getNode(
9875 ISD::OR, dl, IntVT,
9876 DAG.getNode(ISD::OR, dl, IntVT, SignShifted, DenormExpShifted),
9877 DenormDstMant);
9878 }
9879
9880 SDValue FiniteResult =
9881 DAG.getSelect(dl, IntVT, IsDenorm, DenormResult, NormResult);
9882
9883 const uint64_t QNaNBit = (DstMant > 0) ? (1ULL << (DstMant - 1)) : 0;
9884 SDValue NaNResult =
9885 DAG.getConstant((DstExpAllOnes << DstMant) | QNaNBit, dl, IntVT);
9886
9887 SDValue InfResult =
9888 DAG.getNode(ISD::OR, dl, IntVT, SignShifted,
9889 DAG.getConstant(DstExpAllOnes << DstMant, dl, IntVT));
9890
9891 SDValue ZeroResult = SignShifted;
9892
9893 SDValue Result = FiniteResult;
9894 Result = DAG.getSelect(dl, IntVT, IsZero, ZeroResult, Result);
9895 Result = DAG.getSelect(dl, IntVT, IsInf, InfResult, Result);
9896 Result = DAG.getSelect(dl, IntVT, IsNaN, NaNResult, Result);
9897
9898 return DAG.getNode(ISD::BITCAST, dl, DstVT, Result);
9899}
9900
9902 SelectionDAG &DAG) const {
9903 unsigned OpNo = Node->isStrictFPOpcode() ? 1 : 0;
9904 SDValue Src = Node->getOperand(OpNo);
9905 EVT SrcVT = Src.getValueType();
9906 EVT DstVT = Node->getValueType(0);
9907 SDLoc dl(SDValue(Node, 0));
9908
9909 // FIXME: Only f32 to i64 conversions are supported.
9910 if (SrcVT != MVT::f32 || DstVT != MVT::i64)
9911 return false;
9912
9913 if (Node->isStrictFPOpcode())
9914 // When a NaN is converted to an integer a trap is allowed. We can't
9915 // use this expansion here because it would eliminate that trap. Other
9916 // traps are also allowed and cannot be eliminated. See
9917 // IEEE 754-2008 sec 5.8.
9918 return false;
9919
9920 // Expand f32 -> i64 conversion
9921 // This algorithm comes from compiler-rt's implementation of fixsfdi:
9922 // https://github.com/llvm/llvm-project/blob/main/compiler-rt/lib/builtins/fixsfdi.c
9923 unsigned SrcEltBits = SrcVT.getScalarSizeInBits();
9924 EVT IntVT = SrcVT.changeTypeToInteger();
9925 EVT IntShVT = getShiftAmountTy(IntVT, DAG.getDataLayout());
9926
9927 SDValue ExponentMask = DAG.getConstant(0x7F800000, dl, IntVT);
9928 SDValue ExponentLoBit = DAG.getConstant(23, dl, IntVT);
9929 SDValue Bias = DAG.getConstant(127, dl, IntVT);
9930 SDValue SignMask = DAG.getConstant(APInt::getSignMask(SrcEltBits), dl, IntVT);
9931 SDValue SignLowBit = DAG.getConstant(SrcEltBits - 1, dl, IntVT);
9932 SDValue MantissaMask = DAG.getConstant(0x007FFFFF, dl, IntVT);
9933
9934 SDValue Bits = DAG.getNode(ISD::BITCAST, dl, IntVT, Src);
9935
9936 SDValue ExponentBits = DAG.getNode(
9937 ISD::SRL, dl, IntVT, DAG.getNode(ISD::AND, dl, IntVT, Bits, ExponentMask),
9938 DAG.getZExtOrTrunc(ExponentLoBit, dl, IntShVT));
9939 SDValue Exponent = DAG.getNode(ISD::SUB, dl, IntVT, ExponentBits, Bias);
9940
9941 SDValue Sign = DAG.getNode(ISD::SRA, dl, IntVT,
9942 DAG.getNode(ISD::AND, dl, IntVT, Bits, SignMask),
9943 DAG.getZExtOrTrunc(SignLowBit, dl, IntShVT));
9944 Sign = DAG.getSExtOrTrunc(Sign, dl, DstVT);
9945
9946 SDValue R = DAG.getNode(ISD::OR, dl, IntVT,
9947 DAG.getNode(ISD::AND, dl, IntVT, Bits, MantissaMask),
9948 DAG.getConstant(0x00800000, dl, IntVT));
9949
9950 R = DAG.getZExtOrTrunc(R, dl, DstVT);
9951
9952 R = DAG.getSelectCC(
9953 dl, Exponent, ExponentLoBit,
9954 DAG.getNode(ISD::SHL, dl, DstVT, R,
9955 DAG.getZExtOrTrunc(
9956 DAG.getNode(ISD::SUB, dl, IntVT, Exponent, ExponentLoBit),
9957 dl, IntShVT)),
9958 DAG.getNode(ISD::SRL, dl, DstVT, R,
9959 DAG.getZExtOrTrunc(
9960 DAG.getNode(ISD::SUB, dl, IntVT, ExponentLoBit, Exponent),
9961 dl, IntShVT)),
9962 ISD::SETGT);
9963
9964 SDValue Ret = DAG.getNode(ISD::SUB, dl, DstVT,
9965 DAG.getNode(ISD::XOR, dl, DstVT, R, Sign), Sign);
9966
9967 Result = DAG.getSelectCC(dl, Exponent, DAG.getConstant(0, dl, IntVT),
9968 DAG.getConstant(0, dl, DstVT), Ret, ISD::SETLT);
9969 return true;
9970}
9971
9973 SDValue &Chain,
9974 SelectionDAG &DAG) const {
9975 SDLoc dl(SDValue(Node, 0));
9976 unsigned OpNo = Node->isStrictFPOpcode() ? 1 : 0;
9977 SDValue Src = Node->getOperand(OpNo);
9978
9979 EVT SrcVT = Src.getValueType();
9980 EVT DstVT = Node->getValueType(0);
9981 EVT SetCCVT =
9982 getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), SrcVT);
9983 EVT DstSetCCVT =
9984 getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), DstVT);
9985
9986 // Only expand vector types if we have the appropriate vector bit operations.
9987 unsigned SIntOpcode = Node->isStrictFPOpcode() ? ISD::STRICT_FP_TO_SINT :
9989 if (DstVT.isVector() && (!isOperationLegalOrCustom(SIntOpcode, DstVT) ||
9991 return false;
9992
9993 // If the maximum float value is smaller then the signed integer range,
9994 // the destination signmask can't be represented by the float, so we can
9995 // just use FP_TO_SINT directly.
9996 const fltSemantics &APFSem = SrcVT.getFltSemantics();
9997 APFloat APF(APFSem, APInt::getZero(SrcVT.getScalarSizeInBits()));
9998 APInt SignMask = APInt::getSignMask(DstVT.getScalarSizeInBits());
10000 APF.convertFromAPInt(SignMask, false, APFloat::rmNearestTiesToEven)) {
10001 if (Node->isStrictFPOpcode()) {
10002 Result = DAG.getNode(ISD::STRICT_FP_TO_SINT, dl, { DstVT, MVT::Other },
10003 { Node->getOperand(0), Src });
10004 Chain = Result.getValue(1);
10005 } else
10006 Result = DAG.getNode(ISD::FP_TO_SINT, dl, DstVT, Src);
10007 return true;
10008 }
10009
10010 // Don't expand it if there isn't cheap fsub instruction.
10012 Node->isStrictFPOpcode() ? ISD::STRICT_FSUB : ISD::FSUB, SrcVT))
10013 return false;
10014
10015 SDValue Cst = DAG.getConstantFP(APF, dl, SrcVT);
10016 SDValue Sel;
10017
10018 if (Node->isStrictFPOpcode()) {
10019 Sel = DAG.getSetCC(dl, SetCCVT, Src, Cst, ISD::SETLT,
10020 Node->getOperand(0), /*IsSignaling*/ true);
10021 Chain = Sel.getValue(1);
10022 } else {
10023 Sel = DAG.getSetCC(dl, SetCCVT, Src, Cst, ISD::SETLT);
10024 }
10025
10026 bool Strict = Node->isStrictFPOpcode() ||
10027 shouldUseStrictFP_TO_INT(SrcVT, DstVT, /*IsSigned*/ false);
10028
10029 if (Strict) {
10030 // Expand based on maximum range of FP_TO_SINT, if the value exceeds the
10031 // signmask then offset (the result of which should be fully representable).
10032 // Sel = Src < 0x8000000000000000
10033 // FltOfs = select Sel, 0, 0x8000000000000000
10034 // IntOfs = select Sel, 0, 0x8000000000000000
10035 // Result = fp_to_sint(Src - FltOfs) ^ IntOfs
10036
10037 // TODO: Should any fast-math-flags be set for the FSUB?
10038 SDValue FltOfs = DAG.getSelect(dl, SrcVT, Sel,
10039 DAG.getConstantFP(0.0, dl, SrcVT), Cst);
10040 Sel = DAG.getBoolExtOrTrunc(Sel, dl, DstSetCCVT, DstVT);
10041 SDValue IntOfs = DAG.getSelect(dl, DstVT, Sel,
10042 DAG.getConstant(0, dl, DstVT),
10043 DAG.getConstant(SignMask, dl, DstVT));
10044 SDValue SInt;
10045 if (Node->isStrictFPOpcode()) {
10046 SDValue Val = DAG.getNode(ISD::STRICT_FSUB, dl, { SrcVT, MVT::Other },
10047 { Chain, Src, FltOfs });
10048 SInt = DAG.getNode(ISD::STRICT_FP_TO_SINT, dl, { DstVT, MVT::Other },
10049 { Val.getValue(1), Val });
10050 Chain = SInt.getValue(1);
10051 } else {
10052 SDValue Val = DAG.getNode(ISD::FSUB, dl, SrcVT, Src, FltOfs);
10053 SInt = DAG.getNode(ISD::FP_TO_SINT, dl, DstVT, Val);
10054 }
10055 Result = DAG.getNode(ISD::XOR, dl, DstVT, SInt, IntOfs);
10056 } else {
10057 // Expand based on maximum range of FP_TO_SINT:
10058 // True = fp_to_sint(Src)
10059 // False = 0x8000000000000000 + fp_to_sint(Src - 0x8000000000000000)
10060 // Result = select (Src < 0x8000000000000000), True, False
10061
10062 SDValue True = DAG.getNode(ISD::FP_TO_SINT, dl, DstVT, Src);
10063 // TODO: Should any fast-math-flags be set for the FSUB?
10064 SDValue False = DAG.getNode(ISD::FP_TO_SINT, dl, DstVT,
10065 DAG.getNode(ISD::FSUB, dl, SrcVT, Src, Cst));
10066 False = DAG.getNode(ISD::XOR, dl, DstVT, False,
10067 DAG.getConstant(SignMask, dl, DstVT));
10068 Sel = DAG.getBoolExtOrTrunc(Sel, dl, DstSetCCVT, DstVT);
10069 Result = DAG.getSelect(dl, DstVT, Sel, True, False);
10070 }
10071 return true;
10072}
10073
10075 SDValue &Chain, SelectionDAG &DAG) const {
10076 // This transform is not correct for converting 0 when rounding mode is set
10077 // to round toward negative infinity which will produce -0.0. So disable
10078 // under strictfp.
10079 if (Node->isStrictFPOpcode())
10080 return false;
10081
10082 SDValue Src = Node->getOperand(0);
10083 EVT SrcVT = Src.getValueType();
10084 EVT DstVT = Node->getValueType(0);
10085
10086 // If the input is known to be non-negative and SINT_TO_FP is legal then use
10087 // it.
10088 if (Node->getFlags().hasNonNeg() &&
10090 Result =
10091 DAG.getNode(ISD::SINT_TO_FP, SDLoc(Node), DstVT, Node->getOperand(0));
10092 return true;
10093 }
10094
10095 if (SrcVT.getScalarType() != MVT::i64 || DstVT.getScalarType() != MVT::f64)
10096 return false;
10097
10098 // Only expand vector types if we have the appropriate vector bit
10099 // operations.
10100 if (SrcVT.isVector() && (!isOperationLegalOrCustom(ISD::SRL, SrcVT) ||
10105 return false;
10106
10107 SDLoc dl(SDValue(Node, 0));
10108
10109 // Implementation of unsigned i64 to f64 following the algorithm in
10110 // __floatundidf in compiler_rt. This implementation performs rounding
10111 // correctly in all rounding modes with the exception of converting 0
10112 // when rounding toward negative infinity. In that case the fsub will
10113 // produce -0.0. This will be added to +0.0 and produce -0.0 which is
10114 // incorrect.
10115 SDValue TwoP52 = DAG.getConstant(UINT64_C(0x4330000000000000), dl, SrcVT);
10116 SDValue TwoP84PlusTwoP52 = DAG.getConstantFP(
10117 llvm::bit_cast<double>(UINT64_C(0x4530000000100000)), dl, DstVT);
10118 SDValue TwoP84 = DAG.getConstant(UINT64_C(0x4530000000000000), dl, SrcVT);
10119 SDValue LoMask = DAG.getConstant(UINT64_C(0x00000000FFFFFFFF), dl, SrcVT);
10120 SDValue HiShift = DAG.getShiftAmountConstant(32, SrcVT, dl);
10121
10122 SDValue Lo = DAG.getNode(ISD::AND, dl, SrcVT, Src, LoMask);
10123 SDValue Hi = DAG.getNode(ISD::SRL, dl, SrcVT, Src, HiShift);
10124 SDValue LoOr = DAG.getNode(ISD::OR, dl, SrcVT, Lo, TwoP52);
10125 SDValue HiOr = DAG.getNode(ISD::OR, dl, SrcVT, Hi, TwoP84);
10126 SDValue LoFlt = DAG.getBitcast(DstVT, LoOr);
10127 SDValue HiFlt = DAG.getBitcast(DstVT, HiOr);
10128 SDValue HiSub = DAG.getNode(ISD::FSUB, dl, DstVT, HiFlt, TwoP84PlusTwoP52);
10129 Result = DAG.getNode(ISD::FADD, dl, DstVT, LoFlt, HiSub);
10130 return true;
10131}
10132
10133SDValue
10135 SelectionDAG &DAG) const {
10136 unsigned Opcode = Node->getOpcode();
10137 assert((Opcode == ISD::FMINNUM || Opcode == ISD::FMAXNUM ||
10138 Opcode == ISD::STRICT_FMINNUM || Opcode == ISD::STRICT_FMAXNUM) &&
10139 "Wrong opcode");
10140
10141 if (Node->getFlags().hasNoNaNs()) {
10142 ISD::CondCode Pred = Opcode == ISD::FMINNUM ? ISD::SETLT : ISD::SETGT;
10143 EVT VT = Node->getValueType(0);
10144 if ((!isCondCodeLegal(Pred, VT.getSimpleVT()) ||
10146 VT.isVector())
10147 return SDValue();
10148 SDValue Op1 = Node->getOperand(0);
10149 SDValue Op2 = Node->getOperand(1);
10150 return DAG.getSelectCC(SDLoc(Node), Op1, Op2, Op1, Op2, Pred,
10151 Node->getFlags());
10152 }
10153
10154 return SDValue();
10155}
10156
10158 SelectionDAG &DAG) const {
10159 if (SDValue Expanded = expandVectorNaryOpBySplitting(Node, DAG))
10160 return Expanded;
10161
10162 EVT VT = Node->getValueType(0);
10163 if (VT.isScalableVector())
10165 "Expanding fminnum/fmaxnum for scalable vectors is undefined.");
10166
10167 SDLoc dl(Node);
10168 unsigned NewOp =
10170
10171 if (isOperationLegalOrCustom(NewOp, VT)) {
10172 SDValue Quiet0 = Node->getOperand(0);
10173 SDValue Quiet1 = Node->getOperand(1);
10174
10175 if (!Node->getFlags().hasNoNaNs()) {
10176 // Insert canonicalizes if it's possible we need to quiet to get correct
10177 // sNaN behavior.
10178 if (!DAG.isKnownNeverSNaN(Quiet0)) {
10179 Quiet0 = DAG.getNode(ISD::FCANONICALIZE, dl, VT, Quiet0,
10180 Node->getFlags());
10181 }
10182 if (!DAG.isKnownNeverSNaN(Quiet1)) {
10183 Quiet1 = DAG.getNode(ISD::FCANONICALIZE, dl, VT, Quiet1,
10184 Node->getFlags());
10185 }
10186 }
10187
10188 return DAG.getNode(NewOp, dl, VT, Quiet0, Quiet1, Node->getFlags());
10189 }
10190
10191 // If the target has FMINIMUM/FMAXIMUM but not FMINNUM/FMAXNUM use that
10192 // instead if there are no NaNs.
10193 if (Node->getFlags().hasNoNaNs() ||
10194 (DAG.isKnownNeverNaN(Node->getOperand(0)) &&
10195 DAG.isKnownNeverNaN(Node->getOperand(1)))) {
10196 unsigned IEEE2018Op =
10197 Node->getOpcode() == ISD::FMINNUM ? ISD::FMINIMUM : ISD::FMAXIMUM;
10198 if (isOperationLegalOrCustom(IEEE2018Op, VT))
10199 return DAG.getNode(IEEE2018Op, dl, VT, Node->getOperand(0),
10200 Node->getOperand(1), Node->getFlags());
10201 }
10202
10204 return SelCC;
10205
10206 return SDValue();
10207}
10208
10210 const TargetLowering &TLI,
10211 const SDLoc &DL, SDValue Val,
10212 FPClassTest FPClass) {
10213 EVT VT = Val.getValueType();
10214 EVT CCVT = TLI.getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
10215 EVT IntVT = VT.changeTypeToInteger();
10216 EVT FloatVT = VT.changeElementType(*DAG.getContext(), MVT::f32);
10217 SDValue TestZero = DAG.getTargetConstant(FPClass, DL, MVT::i32);
10218 if (!TLI.isTypeLegal(IntVT) &&
10220 Val = DAG.getNode(ISD::FP_ROUND, DL, FloatVT, Val,
10221 DAG.getIntPtrConstant(0, DL, /*isTarget=*/true));
10222 return DAG.getNode(ISD::IS_FPCLASS, DL, CCVT, Val, TestZero);
10223}
10224
10226 SelectionDAG &DAG) const {
10227 if (SDValue Expanded = expandVectorNaryOpBySplitting(N, DAG))
10228 return Expanded;
10229
10230 SDLoc DL(N);
10231 SDValue LHS = N->getOperand(0);
10232 SDValue RHS = N->getOperand(1);
10233 unsigned Opc = N->getOpcode();
10234 EVT VT = N->getValueType(0);
10235 EVT CCVT = getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
10236 bool IsMax = Opc == ISD::FMAXIMUM;
10237 SDNodeFlags Flags = N->getFlags();
10238
10239 // First, implement comparison not propagating NaN. If no native fmin or fmax
10240 // available, use plain select with setcc instead.
10242 unsigned CompOpcIeee = IsMax ? ISD::FMAXNUM_IEEE : ISD::FMINNUM_IEEE;
10243 unsigned CompOpc = IsMax ? ISD::FMAXNUM : ISD::FMINNUM;
10244
10245 // FIXME: We should probably define fminnum/fmaxnum variants with correct
10246 // signed zero behavior.
10247 bool MinMaxMustRespectOrderedZero = false;
10248
10249 if (isOperationLegalOrCustom(CompOpcIeee, VT)) {
10250 MinMax = DAG.getNode(CompOpcIeee, DL, VT, LHS, RHS, Flags);
10251 MinMaxMustRespectOrderedZero = true;
10252 } else if (isOperationLegalOrCustom(CompOpc, VT)) {
10253 MinMax = DAG.getNode(CompOpc, DL, VT, LHS, RHS, Flags);
10254 } else {
10256 return DAG.UnrollVectorOp(N);
10257
10258 // NaN (if exists) will be propagated later, so orderness doesn't matter.
10259 SDValue Compare =
10260 DAG.getSetCC(DL, CCVT, LHS, RHS, IsMax ? ISD::SETOGT : ISD::SETOLT);
10261 MinMax = DAG.getSelect(DL, VT, Compare, LHS, RHS, Flags);
10262 }
10263
10264 // Propagate any NaN of both operands
10265 if (!N->getFlags().hasNoNaNs() &&
10266 (!DAG.isKnownNeverNaN(RHS) || !DAG.isKnownNeverNaN(LHS))) {
10267 ConstantFP *FPNaN = ConstantFP::get(*DAG.getContext(),
10269 MinMax = DAG.getSelect(DL, VT, DAG.getSetCC(DL, CCVT, LHS, RHS, ISD::SETUO),
10270 DAG.getConstantFP(*FPNaN, DL, VT), MinMax, Flags);
10271 }
10272
10273 // fminimum/fmaximum requires -0.0 less than +0.0
10274 if (!MinMaxMustRespectOrderedZero && !N->getFlags().hasNoSignedZeros() &&
10275 !DAG.isKnownNeverLogicalZero(RHS) && !DAG.isKnownNeverLogicalZero(LHS)) {
10276 SDValue IsEqual = DAG.getSetCC(DL, CCVT, LHS, RHS, ISD::SETOEQ);
10278 DAG, *this, DL, LHS, IsMax ? fcPosZero : fcNegZero);
10279 SDValue RetZero = DAG.getSelect(DL, VT, IsSpecificZero, LHS, RHS, Flags);
10280 MinMax = DAG.getSelect(DL, VT, IsEqual, RetZero, MinMax, Flags);
10281 }
10282
10283 return MinMax;
10284}
10285
10287 SelectionDAG &DAG) const {
10288 SDLoc DL(Node);
10289 SDValue LHS = Node->getOperand(0);
10290 SDValue RHS = Node->getOperand(1);
10291 unsigned Opc = Node->getOpcode();
10292 EVT VT = Node->getValueType(0);
10293 EVT CCVT = getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
10294 bool IsMax = Opc == ISD::FMAXIMUMNUM;
10295 SDNodeFlags Flags = Node->getFlags();
10296
10297 unsigned NewOp =
10299
10300 if (isOperationLegalOrCustom(NewOp, VT)) {
10301 if (!Flags.hasNoNaNs()) {
10302 // Insert canonicalizes if it's possible we need to quiet to get correct
10303 // sNaN behavior.
10304 if (!DAG.isKnownNeverSNaN(LHS)) {
10305 LHS = DAG.getNode(ISD::FCANONICALIZE, DL, VT, LHS, Flags);
10306 }
10307 if (!DAG.isKnownNeverSNaN(RHS)) {
10308 RHS = DAG.getNode(ISD::FCANONICALIZE, DL, VT, RHS, Flags);
10309 }
10310 }
10311
10312 return DAG.getNode(NewOp, DL, VT, LHS, RHS, Flags);
10313 }
10314
10315 // We can use FMINIMUM/FMAXIMUM if there is no NaN, since it has
10316 // same behaviors for all of other cases: +0.0 vs -0.0 included.
10317 if (Flags.hasNoNaNs() ||
10318 (DAG.isKnownNeverNaN(LHS) && DAG.isKnownNeverNaN(RHS))) {
10319 unsigned IEEE2019Op =
10321 if (isOperationLegalOrCustom(IEEE2019Op, VT))
10322 return DAG.getNode(IEEE2019Op, DL, VT, LHS, RHS, Flags);
10323 }
10324
10325 // FMINNUM/FMAXMUM returns qNaN if either operand is sNaN, and it may return
10326 // either one for +0.0 vs -0.0.
10327 if ((Flags.hasNoNaNs() ||
10328 (DAG.isKnownNeverSNaN(LHS) && DAG.isKnownNeverSNaN(RHS))) &&
10329 (Flags.hasNoSignedZeros() || DAG.isKnownNeverLogicalZero(LHS) ||
10330 DAG.isKnownNeverLogicalZero(RHS))) {
10331 unsigned IEEE2008Op = Opc == ISD::FMINIMUMNUM ? ISD::FMINNUM : ISD::FMAXNUM;
10332 if (isOperationLegalOrCustom(IEEE2008Op, VT))
10333 return DAG.getNode(IEEE2008Op, DL, VT, LHS, RHS, Flags);
10334 }
10335
10336 if (VT.isVector() &&
10339 return DAG.UnrollVectorOp(Node);
10340
10341 // If only one operand is NaN, override it with another operand.
10342 if (!Flags.hasNoNaNs() && !DAG.isKnownNeverNaN(LHS)) {
10343 LHS = DAG.getSelectCC(DL, LHS, LHS, RHS, LHS, ISD::SETUO);
10344 }
10345 if (!Flags.hasNoNaNs() && !DAG.isKnownNeverNaN(RHS)) {
10346 RHS = DAG.getSelectCC(DL, RHS, RHS, LHS, RHS, ISD::SETUO);
10347 }
10348
10349 // Always prefer RHS if equal.
10350 SDValue MinMax =
10351 DAG.getSelectCC(DL, LHS, RHS, LHS, RHS, IsMax ? ISD::SETGT : ISD::SETLT);
10352
10353 // TODO: We need quiet sNaN if strictfp.
10354
10355 // Fixup signed zero behavior.
10356 if (Flags.hasNoSignedZeros() || DAG.isKnownNeverLogicalZero(LHS) ||
10357 DAG.isKnownNeverLogicalZero(RHS)) {
10358 return MinMax;
10359 }
10360 SDValue IsZero = DAG.getSetCC(DL, CCVT, MinMax,
10361 DAG.getConstantFP(0.0, DL, VT), ISD::SETEQ);
10363 DAG, *this, DL, LHS, IsMax ? fcPosZero : fcNegZero);
10364 // It's OK to select from LHS and MinMax, with only one ISD::IS_FPCLASS, as
10365 // we preferred RHS when generate MinMax, if the operands are equal.
10366 SDValue RetZero = DAG.getSelect(DL, VT, IsSpecificZero, LHS, MinMax, Flags);
10367 return DAG.getSelect(DL, VT, IsZero, RetZero, MinMax, Flags);
10368}
10369
10370/// Returns a true value if if this FPClassTest can be performed with an ordered
10371/// fcmp to 0, and a false value if it's an unordered fcmp to 0. Returns
10372/// std::nullopt if it cannot be performed as a compare with 0.
10373static std::optional<bool> isFCmpEqualZero(FPClassTest Test,
10374 const fltSemantics &Semantics,
10375 const MachineFunction &MF) {
10376 FPClassTest OrderedMask = Test & ~fcNan;
10377 FPClassTest NanTest = Test & fcNan;
10378 bool IsOrdered = NanTest == fcNone;
10379 bool IsUnordered = NanTest == fcNan;
10380
10381 // Skip cases that are testing for only a qnan or snan.
10382 if (!IsOrdered && !IsUnordered)
10383 return std::nullopt;
10384
10385 if (OrderedMask == fcZero &&
10386 MF.getDenormalMode(Semantics).Input == DenormalMode::IEEE)
10387 return IsOrdered;
10388 if (OrderedMask == (fcZero | fcSubnormal) &&
10389 MF.getDenormalMode(Semantics).inputsAreZero())
10390 return IsOrdered;
10391 return std::nullopt;
10392}
10393
10395 const FPClassTest OrigTestMask,
10396 SDNodeFlags Flags, const SDLoc &DL,
10397 SelectionDAG &DAG) const {
10398 EVT OperandVT = Op.getValueType();
10399 assert(OperandVT.isFloatingPoint());
10400 FPClassTest Test = OrigTestMask;
10401
10402 // Degenerated cases.
10403 if (Test == fcNone)
10404 return DAG.getBoolConstant(false, DL, ResultVT, OperandVT);
10405 if (Test == fcAllFlags)
10406 return DAG.getBoolConstant(true, DL, ResultVT, OperandVT);
10407
10408 // PPC double double is a pair of doubles, of which the higher part determines
10409 // the value class.
10410 if (OperandVT == MVT::ppcf128) {
10411 Op = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::f64, Op,
10412 DAG.getConstant(1, DL, MVT::i32));
10413 OperandVT = MVT::f64;
10414 }
10415
10416 // Floating-point type properties.
10417 EVT ScalarFloatVT = OperandVT.getScalarType();
10418 const Type *FloatTy = ScalarFloatVT.getTypeForEVT(*DAG.getContext());
10419 const llvm::fltSemantics &Semantics = FloatTy->getFltSemantics();
10420 bool IsF80 = (ScalarFloatVT == MVT::f80);
10421
10422 // Some checks can be implemented using float comparisons, if floating point
10423 // exceptions are ignored.
10424 if (Flags.hasNoFPExcept() &&
10426 FPClassTest FPTestMask = Test;
10427 bool IsInvertedFP = false;
10428
10429 if (FPClassTest InvertedFPCheck =
10430 invertFPClassTestIfSimpler(FPTestMask, true)) {
10431 FPTestMask = InvertedFPCheck;
10432 IsInvertedFP = true;
10433 }
10434
10435 ISD::CondCode OrderedCmpOpcode = IsInvertedFP ? ISD::SETUNE : ISD::SETOEQ;
10436 ISD::CondCode UnorderedCmpOpcode = IsInvertedFP ? ISD::SETONE : ISD::SETUEQ;
10437
10438 // See if we can fold an | fcNan into an unordered compare.
10439 FPClassTest OrderedFPTestMask = FPTestMask & ~fcNan;
10440
10441 // Can't fold the ordered check if we're only testing for snan or qnan
10442 // individually.
10443 if ((FPTestMask & fcNan) != fcNan)
10444 OrderedFPTestMask = FPTestMask;
10445
10446 const bool IsOrdered = FPTestMask == OrderedFPTestMask;
10447
10448 if (std::optional<bool> IsCmp0 =
10449 isFCmpEqualZero(FPTestMask, Semantics, DAG.getMachineFunction());
10450 IsCmp0 && (isCondCodeLegalOrCustom(
10451 *IsCmp0 ? OrderedCmpOpcode : UnorderedCmpOpcode,
10452 OperandVT.getScalarType().getSimpleVT()))) {
10453
10454 // If denormals could be implicitly treated as 0, this is not equivalent
10455 // to a compare with 0 since it will also be true for denormals.
10456 return DAG.getSetCC(DL, ResultVT, Op,
10457 DAG.getConstantFP(0.0, DL, OperandVT),
10458 *IsCmp0 ? OrderedCmpOpcode : UnorderedCmpOpcode);
10459 }
10460
10461 if (FPTestMask == fcNan &&
10463 OperandVT.getScalarType().getSimpleVT()))
10464 return DAG.getSetCC(DL, ResultVT, Op, Op,
10465 IsInvertedFP ? ISD::SETO : ISD::SETUO);
10466
10467 bool IsOrderedInf = FPTestMask == fcInf;
10468 if ((FPTestMask == fcInf || FPTestMask == (fcInf | fcNan)) &&
10469 isCondCodeLegalOrCustom(IsOrderedInf ? OrderedCmpOpcode
10470 : UnorderedCmpOpcode,
10471 OperandVT.getScalarType().getSimpleVT()) &&
10474 (OperandVT.isVector() &&
10476 // isinf(x) --> fabs(x) == inf
10477 SDValue Abs = DAG.getNode(ISD::FABS, DL, OperandVT, Op);
10478 SDValue Inf =
10479 DAG.getConstantFP(APFloat::getInf(Semantics), DL, OperandVT);
10480 return DAG.getSetCC(DL, ResultVT, Abs, Inf,
10481 IsOrderedInf ? OrderedCmpOpcode : UnorderedCmpOpcode);
10482 }
10483
10484 if ((OrderedFPTestMask == fcPosInf || OrderedFPTestMask == fcNegInf) &&
10485 isCondCodeLegalOrCustom(IsOrdered ? OrderedCmpOpcode
10486 : UnorderedCmpOpcode,
10487 OperandVT.getSimpleVT())) {
10488 // isposinf(x) --> x == inf
10489 // isneginf(x) --> x == -inf
10490 // isposinf(x) || nan --> x u== inf
10491 // isneginf(x) || nan --> x u== -inf
10492
10493 SDValue Inf = DAG.getConstantFP(
10494 APFloat::getInf(Semantics, OrderedFPTestMask == fcNegInf), DL,
10495 OperandVT);
10496 return DAG.getSetCC(DL, ResultVT, Op, Inf,
10497 IsOrdered ? OrderedCmpOpcode : UnorderedCmpOpcode);
10498 }
10499
10500 if (OrderedFPTestMask == (fcSubnormal | fcZero) && !IsOrdered) {
10501 // TODO: Could handle ordered case, but it produces worse code for
10502 // x86. Maybe handle ordered if fabs is free?
10503
10504 ISD::CondCode OrderedOp = IsInvertedFP ? ISD::SETUGE : ISD::SETOLT;
10505 ISD::CondCode UnorderedOp = IsInvertedFP ? ISD::SETOGE : ISD::SETULT;
10506
10507 if (isCondCodeLegalOrCustom(IsOrdered ? OrderedOp : UnorderedOp,
10508 OperandVT.getScalarType().getSimpleVT())) {
10509 // (issubnormal(x) || iszero(x)) --> fabs(x) < smallest_normal
10510
10511 // TODO: Maybe only makes sense if fabs is free. Integer test of
10512 // exponent bits seems better for x86.
10513 SDValue Abs = DAG.getNode(ISD::FABS, DL, OperandVT, Op);
10514 SDValue SmallestNormal = DAG.getConstantFP(
10515 APFloat::getSmallestNormalized(Semantics), DL, OperandVT);
10516 return DAG.getSetCC(DL, ResultVT, Abs, SmallestNormal,
10517 IsOrdered ? OrderedOp : UnorderedOp);
10518 }
10519 }
10520
10521 if (FPTestMask == fcNormal) {
10522 // TODO: Handle unordered
10523 ISD::CondCode IsFiniteOp = IsInvertedFP ? ISD::SETUGE : ISD::SETOLT;
10524 ISD::CondCode IsNormalOp = IsInvertedFP ? ISD::SETOLT : ISD::SETUGE;
10525
10526 if (isCondCodeLegalOrCustom(IsFiniteOp,
10527 OperandVT.getScalarType().getSimpleVT()) &&
10528 isCondCodeLegalOrCustom(IsNormalOp,
10529 OperandVT.getScalarType().getSimpleVT()) &&
10530 isFAbsFree(OperandVT)) {
10531 // isnormal(x) --> fabs(x) < infinity && !(fabs(x) < smallest_normal)
10532 SDValue Inf =
10533 DAG.getConstantFP(APFloat::getInf(Semantics), DL, OperandVT);
10534 SDValue SmallestNormal = DAG.getConstantFP(
10535 APFloat::getSmallestNormalized(Semantics), DL, OperandVT);
10536
10537 SDValue Abs = DAG.getNode(ISD::FABS, DL, OperandVT, Op);
10538 SDValue IsFinite = DAG.getSetCC(DL, ResultVT, Abs, Inf, IsFiniteOp);
10539 SDValue IsNormal =
10540 DAG.getSetCC(DL, ResultVT, Abs, SmallestNormal, IsNormalOp);
10541 unsigned LogicOp = IsInvertedFP ? ISD::OR : ISD::AND;
10542 return DAG.getNode(LogicOp, DL, ResultVT, IsFinite, IsNormal);
10543 }
10544 }
10545 }
10546
10547 // Some checks may be represented as inversion of simpler check, for example
10548 // "inf|normal|subnormal|zero" => !"nan".
10549 bool IsInverted = false;
10550
10551 if (FPClassTest InvertedCheck = invertFPClassTestIfSimpler(Test, false)) {
10552 Test = InvertedCheck;
10553 IsInverted = true;
10554 }
10555
10556 // In the general case use integer operations.
10557 unsigned BitSize = OperandVT.getScalarSizeInBits();
10558 EVT IntVT = OperandVT.changeElementType(
10559 *DAG.getContext(), EVT::getIntegerVT(*DAG.getContext(), BitSize));
10560 SDValue OpAsInt = DAG.getBitcast(IntVT, Op);
10561
10562 // Various masks.
10563 APInt SignBit = APInt::getSignMask(BitSize);
10564 APInt ValueMask = APInt::getSignedMaxValue(BitSize); // All bits but sign.
10565 APInt Inf = APFloat::getInf(Semantics).bitcastToAPInt(); // Exp and int bit.
10566 const unsigned ExplicitIntBitInF80 = 63;
10567 APInt ExpMask = Inf;
10568 if (IsF80)
10569 ExpMask.clearBit(ExplicitIntBitInF80);
10570 APInt AllOneMantissa = APFloat::getLargest(Semantics).bitcastToAPInt() & ~Inf;
10571 APInt QNaNBitMask =
10572 APInt::getOneBitSet(BitSize, AllOneMantissa.getActiveBits() - 1);
10573 APInt InversionMask = APInt::getAllOnes(ResultVT.getScalarSizeInBits());
10574
10575 SDValue ValueMaskV = DAG.getConstant(ValueMask, DL, IntVT);
10576 SDValue SignBitV = DAG.getConstant(SignBit, DL, IntVT);
10577 SDValue ExpMaskV = DAG.getConstant(ExpMask, DL, IntVT);
10578 SDValue ZeroV = DAG.getConstant(0, DL, IntVT);
10579 SDValue InfV = DAG.getConstant(Inf, DL, IntVT);
10580 SDValue ResultInversionMask = DAG.getConstant(InversionMask, DL, ResultVT);
10581
10582 SDValue Res;
10583 const auto appendResult = [&](SDValue PartialRes) {
10584 if (PartialRes) {
10585 if (Res)
10586 Res = DAG.getNode(ISD::OR, DL, ResultVT, Res, PartialRes);
10587 else
10588 Res = PartialRes;
10589 }
10590 };
10591
10592 SDValue IntBitIsSetV; // Explicit integer bit in f80 mantissa is set.
10593 const auto getIntBitIsSet = [&]() -> SDValue {
10594 if (!IntBitIsSetV) {
10595 APInt IntBitMask(BitSize, 0);
10596 IntBitMask.setBit(ExplicitIntBitInF80);
10597 SDValue IntBitMaskV = DAG.getConstant(IntBitMask, DL, IntVT);
10598 SDValue IntBitV = DAG.getNode(ISD::AND, DL, IntVT, OpAsInt, IntBitMaskV);
10599 IntBitIsSetV = DAG.getSetCC(DL, ResultVT, IntBitV, ZeroV, ISD::SETNE);
10600 }
10601 return IntBitIsSetV;
10602 };
10603
10604 // Split the value into sign bit and absolute value.
10605 SDValue AbsV = DAG.getNode(ISD::AND, DL, IntVT, OpAsInt, ValueMaskV);
10606 SDValue SignV = DAG.getSetCC(DL, ResultVT, OpAsInt,
10607 DAG.getConstant(0, DL, IntVT), ISD::SETLT);
10608
10609 // Tests that involve more than one class should be processed first.
10610 SDValue PartialRes;
10611
10612 if (IsF80)
10613 ; // Detect finite numbers of f80 by checking individual classes because
10614 // they have different settings of the explicit integer bit.
10615 else if ((Test & fcFinite) == fcFinite) {
10616 // finite(V) ==> (a << 1) < (inf << 1)
10617 //
10618 // See https://github.com/llvm/llvm-project/issues/169270, this is slightly
10619 // shorter than the `finite(V) ==> abs(V) < exp_mask` formula used before.
10620
10622 "finite check requires IEEE-like FP");
10623
10624 SDValue One = DAG.getShiftAmountConstant(1, IntVT, DL);
10625 SDValue TwiceOp = DAG.getNode(ISD::SHL, DL, IntVT, OpAsInt, One);
10626 SDValue TwiceInf = DAG.getNode(ISD::SHL, DL, IntVT, ExpMaskV, One);
10627
10628 PartialRes = DAG.getSetCC(DL, ResultVT, TwiceOp, TwiceInf, ISD::SETULT);
10629 Test &= ~fcFinite;
10630 } else if ((Test & fcFinite) == fcPosFinite) {
10631 // finite(V) && V > 0 ==> V < exp_mask
10632 PartialRes = DAG.getSetCC(DL, ResultVT, OpAsInt, ExpMaskV, ISD::SETULT);
10633 Test &= ~fcPosFinite;
10634 } else if ((Test & fcFinite) == fcNegFinite) {
10635 // finite(V) && V < 0 ==> abs(V) < exp_mask && signbit == 1
10636 PartialRes = DAG.getSetCC(DL, ResultVT, AbsV, ExpMaskV, ISD::SETLT);
10637 PartialRes = DAG.getNode(ISD::AND, DL, ResultVT, PartialRes, SignV);
10638 Test &= ~fcNegFinite;
10639 }
10640 appendResult(PartialRes);
10641
10642 if (FPClassTest PartialCheck = Test & (fcZero | fcSubnormal)) {
10643 // fcZero | fcSubnormal => test all exponent bits are 0
10644 // TODO: Handle sign bit specific cases
10645 if (PartialCheck == (fcZero | fcSubnormal)) {
10646 SDValue ExpBits = DAG.getNode(ISD::AND, DL, IntVT, OpAsInt, ExpMaskV);
10647 SDValue ExpIsZero =
10648 DAG.getSetCC(DL, ResultVT, ExpBits, ZeroV, ISD::SETEQ);
10649 appendResult(ExpIsZero);
10650 Test &= ~PartialCheck & fcAllFlags;
10651 }
10652 }
10653
10654 // Check for individual classes.
10655
10656 if (unsigned PartialCheck = Test & fcZero) {
10657 if (PartialCheck == fcPosZero)
10658 PartialRes = DAG.getSetCC(DL, ResultVT, OpAsInt, ZeroV, ISD::SETEQ);
10659 else if (PartialCheck == fcZero)
10660 PartialRes = DAG.getSetCC(DL, ResultVT, AbsV, ZeroV, ISD::SETEQ);
10661 else // ISD::fcNegZero
10662 PartialRes = DAG.getSetCC(DL, ResultVT, OpAsInt, SignBitV, ISD::SETEQ);
10663 appendResult(PartialRes);
10664 }
10665
10666 if (unsigned PartialCheck = Test & fcSubnormal) {
10667 // issubnormal(V) ==> unsigned(abs(V) - 1) < (all mantissa bits set)
10668 // issubnormal(V) && V>0 ==> unsigned(V - 1) < (all mantissa bits set)
10669 SDValue V = (PartialCheck == fcPosSubnormal) ? OpAsInt : AbsV;
10670 SDValue MantissaV = DAG.getConstant(AllOneMantissa, DL, IntVT);
10671 SDValue VMinusOneV =
10672 DAG.getNode(ISD::SUB, DL, IntVT, V, DAG.getConstant(1, DL, IntVT));
10673 PartialRes = DAG.getSetCC(DL, ResultVT, VMinusOneV, MantissaV, ISD::SETULT);
10674 if (PartialCheck == fcNegSubnormal)
10675 PartialRes = DAG.getNode(ISD::AND, DL, ResultVT, PartialRes, SignV);
10676 appendResult(PartialRes);
10677 }
10678
10679 if (unsigned PartialCheck = Test & fcInf) {
10680 if (PartialCheck == fcPosInf)
10681 PartialRes = DAG.getSetCC(DL, ResultVT, OpAsInt, InfV, ISD::SETEQ);
10682 else if (PartialCheck == fcInf)
10683 PartialRes = DAG.getSetCC(DL, ResultVT, AbsV, InfV, ISD::SETEQ);
10684 else { // ISD::fcNegInf
10685 APInt NegInf = APFloat::getInf(Semantics, true).bitcastToAPInt();
10686 SDValue NegInfV = DAG.getConstant(NegInf, DL, IntVT);
10687 PartialRes = DAG.getSetCC(DL, ResultVT, OpAsInt, NegInfV, ISD::SETEQ);
10688 }
10689 appendResult(PartialRes);
10690 }
10691
10692 if (unsigned PartialCheck = Test & fcNan) {
10693 APInt InfWithQnanBit = Inf | QNaNBitMask;
10694 SDValue InfWithQnanBitV = DAG.getConstant(InfWithQnanBit, DL, IntVT);
10695 if (PartialCheck == fcNan) {
10696 // isnan(V) ==> abs(V) > int(inf)
10697 PartialRes = DAG.getSetCC(DL, ResultVT, AbsV, InfV, ISD::SETGT);
10698 if (IsF80) {
10699 // Recognize unsupported values as NaNs for compatibility with glibc.
10700 // In them (exp(V)==0) == int_bit.
10701 SDValue ExpBits = DAG.getNode(ISD::AND, DL, IntVT, AbsV, ExpMaskV);
10702 SDValue ExpIsZero =
10703 DAG.getSetCC(DL, ResultVT, ExpBits, ZeroV, ISD::SETEQ);
10704 SDValue IsPseudo =
10705 DAG.getSetCC(DL, ResultVT, getIntBitIsSet(), ExpIsZero, ISD::SETEQ);
10706 PartialRes = DAG.getNode(ISD::OR, DL, ResultVT, PartialRes, IsPseudo);
10707 }
10708 } else if (PartialCheck == fcQNan) {
10709 // isquiet(V) ==> abs(V) >= (unsigned(Inf) | quiet_bit)
10710 PartialRes =
10711 DAG.getSetCC(DL, ResultVT, AbsV, InfWithQnanBitV, ISD::SETGE);
10712 } else { // ISD::fcSNan
10713 // issignaling(V) ==> abs(V) > unsigned(Inf) &&
10714 // abs(V) < (unsigned(Inf) | quiet_bit)
10715 SDValue IsNan = DAG.getSetCC(DL, ResultVT, AbsV, InfV, ISD::SETGT);
10716 SDValue IsNotQnan =
10717 DAG.getSetCC(DL, ResultVT, AbsV, InfWithQnanBitV, ISD::SETLT);
10718 PartialRes = DAG.getNode(ISD::AND, DL, ResultVT, IsNan, IsNotQnan);
10719 }
10720 appendResult(PartialRes);
10721 }
10722
10723 if (unsigned PartialCheck = Test & fcNormal) {
10724 // isnormal(V) ==> (0 < exp < max_exp) ==> (unsigned(exp-1) < (max_exp-1))
10725 APInt ExpLSB = ExpMask & ~(ExpMask.shl(1));
10726 SDValue ExpLSBV = DAG.getConstant(ExpLSB, DL, IntVT);
10727 SDValue ExpMinus1 = DAG.getNode(ISD::SUB, DL, IntVT, AbsV, ExpLSBV);
10728 APInt ExpLimit = ExpMask - ExpLSB;
10729 SDValue ExpLimitV = DAG.getConstant(ExpLimit, DL, IntVT);
10730 PartialRes = DAG.getSetCC(DL, ResultVT, ExpMinus1, ExpLimitV, ISD::SETULT);
10731 if (PartialCheck == fcNegNormal)
10732 PartialRes = DAG.getNode(ISD::AND, DL, ResultVT, PartialRes, SignV);
10733 else if (PartialCheck == fcPosNormal) {
10734 SDValue PosSignV =
10735 DAG.getNode(ISD::XOR, DL, ResultVT, SignV, ResultInversionMask);
10736 PartialRes = DAG.getNode(ISD::AND, DL, ResultVT, PartialRes, PosSignV);
10737 }
10738 if (IsF80)
10739 PartialRes =
10740 DAG.getNode(ISD::AND, DL, ResultVT, PartialRes, getIntBitIsSet());
10741 appendResult(PartialRes);
10742 }
10743
10744 if (!Res)
10745 return DAG.getConstant(IsInverted, DL, ResultVT);
10746 if (IsInverted)
10747 Res = DAG.getNode(ISD::XOR, DL, ResultVT, Res, ResultInversionMask);
10748 return Res;
10749}
10750
10751// Only expand vector types if we have the appropriate vector bit operations.
10752static bool canExpandVectorCTPOP(const TargetLowering &TLI, EVT VT) {
10753 assert(VT.isVector() && "Expected vector type");
10754 unsigned Len = VT.getScalarSizeInBits();
10755 return TLI.isOperationLegalOrCustom(ISD::ADD, VT) &&
10758 (Len == 8 || TLI.isOperationLegalOrCustom(ISD::MUL, VT)) &&
10760}
10761
10763 SDLoc dl(Node);
10764 EVT VT = Node->getValueType(0);
10765 EVT ShVT = getShiftAmountTy(VT, DAG.getDataLayout());
10766 SDValue Op = Node->getOperand(0);
10767 unsigned Len = VT.getScalarSizeInBits();
10768 assert(VT.isInteger() && "CTPOP not implemented for this type.");
10769
10770 // TODO: Add support for irregular type lengths.
10771 if (!(Len <= 128 && Len % 8 == 0))
10772 return SDValue();
10773
10774 // Only expand vector types if we have the appropriate vector bit operations.
10775 if (VT.isVector() && !canExpandVectorCTPOP(*this, VT))
10776 return SDValue();
10777
10778 // This is the "best" algorithm from
10779 // http://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetParallel
10780 SDValue Mask55 =
10781 DAG.getConstant(APInt::getSplat(Len, APInt(8, 0x55)), dl, VT);
10782 SDValue Mask33 =
10783 DAG.getConstant(APInt::getSplat(Len, APInt(8, 0x33)), dl, VT);
10784 SDValue Mask0F =
10785 DAG.getConstant(APInt::getSplat(Len, APInt(8, 0x0F)), dl, VT);
10786
10787 // v = v - ((v >> 1) & 0x55555555...)
10788 Op = DAG.getNode(ISD::SUB, dl, VT, Op,
10789 DAG.getNode(ISD::AND, dl, VT,
10790 DAG.getNode(ISD::SRL, dl, VT, Op,
10791 DAG.getConstant(1, dl, ShVT)),
10792 Mask55));
10793 // v = (v & 0x33333333...) + ((v >> 2) & 0x33333333...)
10794 Op = DAG.getNode(ISD::ADD, dl, VT, DAG.getNode(ISD::AND, dl, VT, Op, Mask33),
10795 DAG.getNode(ISD::AND, dl, VT,
10796 DAG.getNode(ISD::SRL, dl, VT, Op,
10797 DAG.getConstant(2, dl, ShVT)),
10798 Mask33));
10799 // v = (v + (v >> 4)) & 0x0F0F0F0F...
10800 Op = DAG.getNode(ISD::AND, dl, VT,
10801 DAG.getNode(ISD::ADD, dl, VT, Op,
10802 DAG.getNode(ISD::SRL, dl, VT, Op,
10803 DAG.getConstant(4, dl, ShVT))),
10804 Mask0F);
10805
10806 if (Len <= 8)
10807 return Op;
10808
10809 // Avoid the multiply if we only have 2 bytes to add.
10810 // TODO: Only doing this for scalars because vectors weren't as obviously
10811 // improved.
10812 if (Len == 16 && !VT.isVector()) {
10813 // v = (v + (v >> 8)) & 0x00FF;
10814 return DAG.getNode(ISD::AND, dl, VT,
10815 DAG.getNode(ISD::ADD, dl, VT, Op,
10816 DAG.getNode(ISD::SRL, dl, VT, Op,
10817 DAG.getConstant(8, dl, ShVT))),
10818 DAG.getConstant(0xFF, dl, VT));
10819 }
10820
10821 // v = (v * 0x01010101...) >> (Len - 8)
10822 SDValue V;
10825 SDValue Mask01 =
10826 DAG.getConstant(APInt::getSplat(Len, APInt(8, 0x01)), dl, VT);
10827 V = DAG.getNode(ISD::MUL, dl, VT, Op, Mask01);
10828 } else {
10829 V = Op;
10830 for (unsigned Shift = 8; Shift < Len; Shift *= 2) {
10831 SDValue ShiftC = DAG.getShiftAmountConstant(Shift, VT, dl);
10832 V = DAG.getNode(ISD::ADD, dl, VT, V,
10833 DAG.getNode(ISD::SHL, dl, VT, V, ShiftC));
10834 }
10835 }
10836 return DAG.getNode(ISD::SRL, dl, VT, V, DAG.getConstant(Len - 8, dl, ShVT));
10837}
10838
10840 SDLoc dl(Node);
10841 EVT VT = Node->getValueType(0);
10842 EVT ShVT = getShiftAmountTy(VT, DAG.getDataLayout());
10843 SDValue Op = Node->getOperand(0);
10844 unsigned NumBitsPerElt = VT.getScalarSizeInBits();
10845
10846 // If the non-ZERO_POISON version is supported we can use that instead.
10847 if (Node->getOpcode() == ISD::CTLZ_ZERO_POISON &&
10849 return DAG.getNode(ISD::CTLZ, dl, VT, Op);
10850
10851 // If the ZERO_POISON version is supported use that and handle the zero case.
10853 EVT SetCCVT =
10854 getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
10855 SDValue CTLZ = DAG.getNode(ISD::CTLZ_ZERO_POISON, dl, VT, Op);
10856 SDValue Zero = DAG.getConstant(0, dl, VT);
10857 SDValue SrcIsZero = DAG.getSetCC(dl, SetCCVT, Op, Zero, ISD::SETEQ);
10858 return DAG.getSelect(dl, VT, SrcIsZero,
10859 DAG.getConstant(NumBitsPerElt, dl, VT), CTLZ);
10860 }
10861
10862 // Only expand vector types if we have the appropriate vector bit operations.
10863 // This includes the operations needed to expand CTPOP if it isn't supported.
10864 if (VT.isVector() && (!isPowerOf2_32(NumBitsPerElt) ||
10866 !canExpandVectorCTPOP(*this, VT)) ||
10869 return SDValue();
10870
10871 // for now, we do this:
10872 // x = x | (x >> 1);
10873 // x = x | (x >> 2);
10874 // ...
10875 // x = x | (x >>16);
10876 // x = x | (x >>32); // for 64-bit input
10877 // return popcount(~x);
10878 //
10879 // Ref: "Hacker's Delight" by Henry Warren
10880 for (unsigned i = 0; (1U << i) < NumBitsPerElt; ++i) {
10881 SDValue Tmp = DAG.getConstant(1ULL << i, dl, ShVT);
10882 Op = DAG.getNode(ISD::OR, dl, VT, Op,
10883 DAG.getNode(ISD::SRL, dl, VT, Op, Tmp));
10884 }
10885 Op = DAG.getNOT(dl, Op, VT);
10886 return DAG.getNode(ISD::CTPOP, dl, VT, Op);
10887}
10888
10890 SDLoc dl(Node);
10891 EVT VT = Node->getValueType(0);
10892 SDValue Op = DAG.getFreeze(Node->getOperand(0));
10893 unsigned NumBitsPerElt = VT.getScalarSizeInBits();
10894
10895 // CTLS(x) = CTLZ(OR(SHL(XOR(x, SRA(x, BW-1)), 1), 1))
10896 // This transforms the sign bits into leading zeros that can be counted.
10897 SDValue ShiftAmt = DAG.getShiftAmountConstant(NumBitsPerElt - 1, VT, dl);
10898 SDValue SignBit = DAG.getNode(ISD::SRA, dl, VT, Op, ShiftAmt);
10899 SDValue Xor = DAG.getNode(ISD::XOR, dl, VT, Op, SignBit);
10900 SDValue Shl =
10901 DAG.getNode(ISD::SHL, dl, VT, Xor, DAG.getShiftAmountConstant(1, VT, dl));
10902 SDValue Or = DAG.getNode(ISD::OR, dl, VT, Shl, DAG.getConstant(1, dl, VT));
10903 return DAG.getNode(ISD::CTLZ_ZERO_POISON, dl, VT, Or);
10904}
10905
10907 const SDLoc &DL, EVT VT, SDValue Op,
10908 unsigned BitWidth) const {
10909 if (BitWidth != 32 && BitWidth != 64)
10910 return SDValue();
10911
10912 const DataLayout &TD = DAG.getDataLayout();
10914 return SDValue();
10915
10916 APInt DeBruijn = BitWidth == 32 ? APInt(32, 0x077CB531U)
10917 : APInt(64, 0x0218A392CD3D5DBFULL);
10918 MachinePointerInfo PtrInfo =
10920 unsigned ShiftAmt = BitWidth - Log2_32(BitWidth);
10921 SDValue Neg = DAG.getNode(ISD::SUB, DL, VT, DAG.getConstant(0, DL, VT), Op);
10922 SDValue Lookup = DAG.getNode(
10923 ISD::SRL, DL, VT,
10924 DAG.getNode(ISD::MUL, DL, VT, DAG.getNode(ISD::AND, DL, VT, Op, Neg),
10925 DAG.getConstant(DeBruijn, DL, VT)),
10926 DAG.getShiftAmountConstant(ShiftAmt, VT, DL));
10928
10930 for (unsigned i = 0; i < BitWidth; i++) {
10931 APInt Shl = DeBruijn.shl(i);
10932 APInt Lshr = Shl.lshr(ShiftAmt);
10933 Table[Lshr.getZExtValue()] = i;
10934 }
10935
10936 // Create a ConstantArray in Constant Pool
10937 auto *CA = ConstantDataArray::get(*DAG.getContext(), Table);
10938 SDValue CPIdx = DAG.getConstantPool(CA, getPointerTy(TD),
10939 TD.getPrefTypeAlign(CA->getType()));
10940 SDValue ExtLoad = DAG.getExtLoad(ISD::ZEXTLOAD, DL, VT, DAG.getEntryNode(),
10941 DAG.getMemBasePlusOffset(CPIdx, Lookup, DL),
10942 PtrInfo, MVT::i8);
10943 if (Node->getOpcode() == ISD::CTTZ_ZERO_POISON)
10944 return ExtLoad;
10945
10946 EVT SetCCVT =
10947 getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
10948 SDValue Zero = DAG.getConstant(0, DL, VT);
10949 SDValue SrcIsZero = DAG.getSetCC(DL, SetCCVT, Op, Zero, ISD::SETEQ);
10950 return DAG.getSelect(DL, VT, SrcIsZero,
10951 DAG.getConstant(BitWidth, DL, VT), ExtLoad);
10952}
10953
10955 SDLoc dl(Node);
10956 EVT VT = Node->getValueType(0);
10957 SDValue Op = Node->getOperand(0);
10958 unsigned NumBitsPerElt = VT.getScalarSizeInBits();
10959
10960 // If the non-ZERO_POISON version is supported we can use that instead.
10961 if (Node->getOpcode() == ISD::CTTZ_ZERO_POISON &&
10963 return DAG.getNode(ISD::CTTZ, dl, VT, Op);
10964
10965 // If the ZERO_POISON version is supported use that and handle the zero case.
10967 EVT SetCCVT =
10968 getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
10969 SDValue CTTZ = DAG.getNode(ISD::CTTZ_ZERO_POISON, dl, VT, Op);
10970 SDValue Zero = DAG.getConstant(0, dl, VT);
10971 SDValue SrcIsZero = DAG.getSetCC(dl, SetCCVT, Op, Zero, ISD::SETEQ);
10972 return DAG.getSelect(dl, VT, SrcIsZero,
10973 DAG.getConstant(NumBitsPerElt, dl, VT), CTTZ);
10974 }
10975
10976 // Only expand vector types if we have the appropriate vector bit operations.
10977 // This includes the operations needed to expand CTPOP if it isn't supported.
10978 if (VT.isVector() && (!isPowerOf2_32(NumBitsPerElt) ||
10981 !canExpandVectorCTPOP(*this, VT)) ||
10985 return SDValue();
10986
10987 // Emit Table Lookup if ISD::CTPOP used in the fallback path below is going
10988 // to be expanded or converted to a libcall.
10991 if (SDValue V = CTTZTableLookup(Node, DAG, dl, VT, Op, NumBitsPerElt))
10992 return V;
10993
10994 // for now, we use: { return popcount(~x & (x - 1)); }
10995 // unless the target has ctlz but not ctpop, in which case we use:
10996 // { return 32 - nlz(~x & (x-1)); }
10997 // Ref: "Hacker's Delight" by Henry Warren
10998 SDValue Tmp = DAG.getNode(
10999 ISD::AND, dl, VT, DAG.getNOT(dl, Op, VT),
11000 DAG.getNode(ISD::SUB, dl, VT, Op, DAG.getConstant(1, dl, VT)));
11001
11002 // If ISD::CTLZ is legal and CTPOP isn't, then do that instead.
11004 return DAG.getNode(ISD::SUB, dl, VT, DAG.getConstant(NumBitsPerElt, dl, VT),
11005 DAG.getNode(ISD::CTLZ, dl, VT, Tmp));
11006 }
11007
11008 return DAG.getNode(ISD::CTPOP, dl, VT, Tmp);
11009}
11010
11012 SelectionDAG &DAG) const {
11013 // %cond = to_bool_vec %source
11014 // %splat = splat /*val=*/VL
11015 // %tz = step_vector
11016 // %v = select %cond, /*true=*/tz, /*false=*/%splat
11017 // %r = vp.reduce.umin %v
11018 SDLoc DL(N);
11019 SDValue Source = N->getOperand(0);
11020 SDValue Mask = N->getOperand(1);
11021 SDValue EVL = N->getOperand(2);
11022 EVT SrcVT = Source.getValueType();
11023 EVT ResVT = N->getValueType(0);
11024 EVT ResVecVT =
11025 EVT::getVectorVT(*DAG.getContext(), ResVT, SrcVT.getVectorElementCount());
11026
11027 // Convert to boolean vector.
11028 if (SrcVT.getScalarType() != MVT::i1) {
11029 SDValue AllZero = DAG.getConstant(0, DL, SrcVT);
11030 SrcVT = EVT::getVectorVT(*DAG.getContext(), MVT::i1,
11031 SrcVT.getVectorElementCount());
11032 Source = DAG.getSetCC(DL, SrcVT, Source, AllZero, ISD::SETNE);
11033 }
11034
11035 SDValue ExtEVL = DAG.getZExtOrTrunc(EVL, DL, ResVT);
11036 SDValue Splat = DAG.getSplat(ResVecVT, DL, ExtEVL);
11037 SDValue StepVec = DAG.getStepVector(DL, ResVecVT);
11038 SDValue Select = DAG.getSelect(DL, ResVecVT, Source, StepVec, Splat);
11039 return DAG.getNode(ISD::VP_REDUCE_UMIN, DL, ResVT, ExtEVL, Select, Mask, EVL);
11040}
11041
11042/// Returns a type-legalized version of \p Mask as the first item in the
11043/// pair. The second item contains a type-legalized step vector that's
11044/// guaranteed to fit the number of elements in \p Mask.
11045/// If the stepvector would require splitting, returns an empty SDValue
11046/// as the second item to signal that the operation should be split instead.
11047static std::pair<SDValue, SDValue>
11049 SelectionDAG &DAG) {
11050 EVT MaskVT = Mask.getValueType();
11051 EVT BoolVT = MaskVT.getScalarType();
11052
11053 // Find a suitable type for a stepvector.
11054 // If zero is poison, we can assume the upper limit of the result is VF-1.
11055 ConstantRange VScaleRange(1, /*isFullSet=*/true); // Fixed length default.
11056 if (MaskVT.isScalableVector())
11057 VScaleRange = getVScaleRange(&DAG.getMachineFunction().getFunction(), 64);
11058 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
11059 uint64_t EltWidth = TLI.getBitWidthForCttzElements(
11060 EVT(TLI.getVectorIdxTy(DAG.getDataLayout())),
11061 MaskVT.getVectorElementCount(), ZeroIsPoison, &VScaleRange);
11062 // If the step vector element type is smaller than the mask element type,
11063 // use the mask type directly to avoid widening issues.
11064 EltWidth = std::max(EltWidth, BoolVT.getFixedSizeInBits());
11065 EVT StepVT = MVT::getIntegerVT(EltWidth);
11066 EVT StepVecVT = MaskVT.changeVectorElementType(*DAG.getContext(), StepVT);
11067
11068 // If promotion or widening is required to make the type legal, do it here.
11069 // Promotion of integers within LegalizeVectorOps is looking for types of
11070 // the same size but with a smaller number of larger elements, not the usual
11071 // larger size with the same number of larger elements.
11073 TLI.getTypeAction(*DAG.getContext(), StepVecVT);
11074 SDValue StepVec;
11075 if (TypeAction == TargetLowering::TypePromoteInteger) {
11076 StepVecVT = TLI.getTypeToTransformTo(*DAG.getContext(), StepVecVT);
11077 StepVec = DAG.getStepVector(DL, StepVecVT);
11078 } else if (TypeAction == TargetLowering::TypeWidenVector) {
11079 // For widening, the element count changes. Create a step vector with only
11080 // the original elements valid and zeros for padding. Also widen the mask.
11081 EVT WideVecVT = TLI.getTypeToTransformTo(*DAG.getContext(), StepVecVT);
11082 unsigned WideNumElts = WideVecVT.getVectorNumElements();
11083
11084 // Build widened step vector: <0, 1, ..., OrigNumElts-1, poison, poison, ..>
11085 SDValue OrigStepVec = DAG.getStepVector(DL, StepVecVT);
11086 SDValue UndefStep = DAG.getPOISON(WideVecVT);
11087 StepVec = DAG.getInsertSubvector(DL, UndefStep, OrigStepVec, 0);
11088
11089 // Widen mask: pad with zeros.
11090 EVT WideMaskVT = EVT::getVectorVT(*DAG.getContext(), BoolVT, WideNumElts);
11091 SDValue ZeroMask = DAG.getConstant(0, DL, WideMaskVT);
11092 Mask = DAG.getInsertSubvector(DL, ZeroMask, Mask, 0);
11093 } else if (TypeAction == TargetLowering::TypeSplitVector) {
11094 // The stepvector type would require splitting. Signal to the caller
11095 // that the operation should be split instead of expanded.
11096 return {Mask, SDValue()};
11097 } else {
11098 StepVec = DAG.getStepVector(DL, StepVecVT);
11099 }
11100
11101 return {Mask, StepVec};
11102}
11103
11105 SelectionDAG &DAG) const {
11106 SDLoc DL(N);
11107 auto [Mask, StepVec] = getLegalMaskAndStepVector(
11108 N->getOperand(0), /*ZeroIsPoison=*/true, DL, DAG);
11109
11110 // If StepVec is empty, the stepvector would require splitting.
11111 // Split the operation instead and let it be recursively legalized.
11112 if (!StepVec) {
11113 EVT MaskVT = N->getOperand(0).getValueType();
11114 EVT ResVT = N->getValueType(0);
11115
11116 // Split the mask
11117 auto [LoVT, HiVT] = DAG.GetSplitDestVTs(MaskVT);
11118 auto [MaskLo, MaskHi] = DAG.SplitVector(N->getOperand(0), DL);
11119
11120 // Create split VECTOR_FIND_LAST_ACTIVE operations
11121 SDValue LoResult =
11122 DAG.getNode(ISD::VECTOR_FIND_LAST_ACTIVE, DL, ResVT, MaskLo);
11123 SDValue HiResult =
11124 DAG.getNode(ISD::VECTOR_FIND_LAST_ACTIVE, DL, ResVT, MaskHi);
11125
11126 // Check if any lane is active in the high mask.
11127 SDValue AnyHiActive = DAG.getNode(ISD::VECREDUCE_OR, DL, MVT::i1, MaskHi);
11129 AnyHiActive, DL,
11130 getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), MVT::i1),
11131 MVT::i1);
11132
11133 // Adjust HiResult by adding the number of elements in Lo
11134 SDValue LoNumElts =
11135 DAG.getElementCount(DL, ResVT, LoVT.getVectorElementCount());
11136 SDValue AdjustedHiResult =
11137 DAG.getNode(ISD::ADD, DL, ResVT, HiResult, LoNumElts);
11138
11139 // Return: AnyHiActive ? AdjustedHiResult : LoResult;
11140 return DAG.getNode(ISD::SELECT, DL, ResVT, Cond, AdjustedHiResult,
11141 LoResult);
11142 }
11143
11144 EVT StepVecVT = StepVec.getValueType();
11145 EVT StepVT = StepVec.getValueType().getVectorElementType();
11146
11147 // Zero out lanes with inactive elements, then find the highest remaining
11148 // value from the stepvector.
11149 SDValue Zeroes = DAG.getConstant(0, DL, StepVecVT);
11150 SDValue ActiveElts = DAG.getSelect(DL, StepVecVT, Mask, StepVec, Zeroes);
11151 SDValue HighestIdx = DAG.getNode(ISD::VECREDUCE_UMAX, DL, StepVT, ActiveElts);
11152 return DAG.getZExtOrTrunc(HighestIdx, DL, N->getValueType(0));
11153}
11154
11156 SelectionDAG &DAG) const {
11157 SDLoc DL(N);
11158 EVT VT = N->getValueType(0);
11159 SDValue SourceValue = N->getOperand(0);
11160 SDValue SinkValue = N->getOperand(1);
11161 SDValue EltSizeInBytes = N->getOperand(2);
11162
11163 // Note: The lane offset is scalable if the mask is scalable.
11164 ElementCount LaneOffsetEC =
11165 ElementCount::get(N->getConstantOperandVal(3), VT.isScalableVT());
11166
11167 EVT AddrVT = SourceValue->getValueType(0);
11168 bool IsReadAfterWrite = N->getOpcode() == ISD::LOOP_DEPENDENCE_RAW_MASK;
11169
11170 EVT CmpVT =
11171 getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), AddrVT);
11172
11173 // Unsigned compare: Source >= Sink.
11174 SDValue SourceAheadOfOrEqualToSink =
11175 DAG.getSetCC(DL, CmpVT, SourceValue, SinkValue, ISD::SETUGE);
11176
11177 // Take the difference between the pointers and divided by the element size,
11178 // to see how many lanes separate them.
11179 SDValue Diff = DAG.getNode(ISD::SUB, DL, AddrVT, SinkValue, SourceValue);
11180
11181 // RAW_MASK: Diff = Source >= Sink ? (Source - Sink) : (Sink - Source)
11182 if (IsReadAfterWrite)
11183 Diff = DAG.getSelect(DL, AddrVT, SourceAheadOfOrEqualToSink,
11184 DAG.getNegative(Diff, DL, AddrVT), Diff);
11185
11186 Diff = DAG.getNode(ISD::SDIV, DL, AddrVT, Diff, EltSizeInBytes);
11187
11188 // The pointers do not alias if:
11189 // - Source >= Sink (WAR_MASK)
11190 // - Source == Sink (RAW_MASK)
11191 SDValue NoAlias = SourceAheadOfOrEqualToSink;
11192 if (IsReadAfterWrite)
11193 NoAlias = DAG.getSetCC(DL, CmpVT, SourceValue, SinkValue, ISD::SETEQ);
11194
11195 // The pointers do not alias if:
11196 // Lane + LaneOffset < Diff (WAR/RAW_MASK)
11197 SDValue LaneOffset = DAG.getElementCount(DL, AddrVT, LaneOffsetEC);
11198 SDValue MaskN = DAG.getSelect(
11199 DL, AddrVT, NoAlias,
11201 AddrVT),
11202 Diff);
11203
11204 return DAG.getNode(ISD::GET_ACTIVE_LANE_MASK, DL, VT, LaneOffset, MaskN);
11205}
11206
11208 bool IsNegative) const {
11209 SDLoc dl(N);
11210 EVT VT = N->getValueType(0);
11211 SDValue Op = N->getOperand(0);
11212
11213 // If expanding ABS_MIN_POISON, fall back to ABS if the target supports it.
11214 if (N->getOpcode() == ISD::ABS_MIN_POISON &&
11216 SDValue AbsVal = DAG.getNode(ISD::ABS, dl, VT, Op);
11217 if (IsNegative)
11218 return DAG.getNegative(AbsVal, dl, VT);
11219 return AbsVal;
11220 }
11221
11222 // abs(x) -> smax(x,sub(0,x))
11223 if (!IsNegative && isOperationLegal(ISD::SUB, VT) &&
11225 SDValue Zero = DAG.getConstant(0, dl, VT);
11226 Op = DAG.getFreeze(Op);
11227 return DAG.getNode(ISD::SMAX, dl, VT, Op,
11228 DAG.getNode(ISD::SUB, dl, VT, Zero, Op));
11229 }
11230
11231 // abs(x) -> umin(x,sub(0,x))
11232 if (!IsNegative && isOperationLegal(ISD::SUB, VT) &&
11234 SDValue Zero = DAG.getConstant(0, dl, VT);
11235 Op = DAG.getFreeze(Op);
11236 return DAG.getNode(ISD::UMIN, dl, VT, Op,
11237 DAG.getNode(ISD::SUB, dl, VT, Zero, Op));
11238 }
11239
11240 // 0 - abs(x) -> smin(x, sub(0,x))
11241 if (IsNegative && isOperationLegal(ISD::SUB, VT) &&
11243 SDValue Zero = DAG.getConstant(0, dl, VT);
11244 Op = DAG.getFreeze(Op);
11245 return DAG.getNode(ISD::SMIN, dl, VT, Op,
11246 DAG.getNode(ISD::SUB, dl, VT, Zero, Op));
11247 }
11248
11249 // Only expand vector types if we have the appropriate vector operations.
11250 if (VT.isVector() &&
11252 (!IsNegative && !isOperationLegalOrCustom(ISD::ADD, VT)) ||
11253 (IsNegative && !isOperationLegalOrCustom(ISD::SUB, VT)) ||
11255 return SDValue();
11256
11257 Op = DAG.getFreeze(Op);
11258 SDValue Shift = DAG.getNode(
11259 ISD::SRA, dl, VT, Op,
11260 DAG.getShiftAmountConstant(VT.getScalarSizeInBits() - 1, VT, dl));
11261 SDValue Xor = DAG.getNode(ISD::XOR, dl, VT, Op, Shift);
11262
11263 // abs(x) -> Y = sra (X, size(X)-1); sub (xor (X, Y), Y)
11264 if (!IsNegative)
11265 return DAG.getNode(ISD::SUB, dl, VT, Xor, Shift);
11266
11267 // 0 - abs(x) -> Y = sra (X, size(X)-1); sub (Y, xor (X, Y))
11268 return DAG.getNode(ISD::SUB, dl, VT, Shift, Xor);
11269}
11270
11272 SDLoc dl(N);
11273 EVT VT = N->getValueType(0);
11274 SDValue LHS = N->getOperand(0);
11275 SDValue RHS = N->getOperand(1);
11276 bool IsSigned = N->getOpcode() == ISD::ABDS;
11277
11278 // abds(lhs, rhs) -> sub(smax(lhs,rhs), smin(lhs,rhs))
11279 // abdu(lhs, rhs) -> sub(umax(lhs,rhs), umin(lhs,rhs))
11280 unsigned MaxOpc = IsSigned ? ISD::SMAX : ISD::UMAX;
11281 unsigned MinOpc = IsSigned ? ISD::SMIN : ISD::UMIN;
11282 if (isOperationLegal(MaxOpc, VT) && isOperationLegal(MinOpc, VT)) {
11283 LHS = DAG.getFreeze(LHS);
11284 RHS = DAG.getFreeze(RHS);
11285 SDValue Max = DAG.getNode(MaxOpc, dl, VT, LHS, RHS);
11286 SDValue Min = DAG.getNode(MinOpc, dl, VT, LHS, RHS);
11287 return DAG.getNode(ISD::SUB, dl, VT, Max, Min);
11288 }
11289
11290 // abdu(lhs, rhs) -> or(usubsat(lhs,rhs), usubsat(rhs,lhs))
11291 if (!IsSigned && isOperationLegal(ISD::USUBSAT, VT)) {
11292 LHS = DAG.getFreeze(LHS);
11293 RHS = DAG.getFreeze(RHS);
11294 return DAG.getNode(ISD::OR, dl, VT,
11295 DAG.getNode(ISD::USUBSAT, dl, VT, LHS, RHS),
11296 DAG.getNode(ISD::USUBSAT, dl, VT, RHS, LHS));
11297 }
11298
11299 // If the subtract doesn't overflow then just use abs(sub())
11300 bool IsNonNegative = DAG.SignBitIsZero(LHS) && DAG.SignBitIsZero(RHS);
11301
11302 if (DAG.willNotOverflowSub(IsSigned || IsNonNegative, LHS, RHS))
11303 return DAG.getNode(ISD::ABS, dl, VT,
11304 DAG.getNode(ISD::SUB, dl, VT, LHS, RHS));
11305
11306 if (DAG.willNotOverflowSub(IsSigned || IsNonNegative, RHS, LHS))
11307 return DAG.getNode(ISD::ABS, dl, VT,
11308 DAG.getNode(ISD::SUB, dl, VT, RHS, LHS));
11309
11310 EVT CCVT = getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
11312 LHS = DAG.getFreeze(LHS);
11313 RHS = DAG.getFreeze(RHS);
11314 SDValue Cmp = DAG.getSetCC(dl, CCVT, LHS, RHS, CC);
11315
11316 // Branchless expansion iff cmp result is allbits:
11317 // abds(lhs, rhs) -> sub(sgt(lhs, rhs), xor(sgt(lhs, rhs), sub(lhs, rhs)))
11318 // abdu(lhs, rhs) -> sub(ugt(lhs, rhs), xor(ugt(lhs, rhs), sub(lhs, rhs)))
11319 if (CCVT == VT && getBooleanContents(VT) == ZeroOrNegativeOneBooleanContent) {
11320 SDValue Diff = DAG.getNode(ISD::SUB, dl, VT, LHS, RHS);
11321 SDValue Xor = DAG.getNode(ISD::XOR, dl, VT, Diff, Cmp);
11322 return DAG.getNode(ISD::SUB, dl, VT, Cmp, Xor);
11323 }
11324
11325 // Similar to the branchless expansion, if we don't prefer selects, use the
11326 // (sign-extended) usubo overflow flag if the (scalar) type is illegal as this
11327 // is more likely to legalize cleanly: abdu(lhs, rhs) -> sub(xor(sub(lhs,
11328 // rhs), uof(lhs, rhs)), uof(lhs, rhs))
11329 if (!IsSigned && VT.isScalarInteger() && !isTypeLegal(VT) &&
11331 SDValue USubO =
11332 DAG.getNode(ISD::USUBO, dl, DAG.getVTList(VT, MVT::i1), {LHS, RHS});
11333 SDValue Cmp = DAG.getNode(ISD::SIGN_EXTEND, dl, VT, USubO.getValue(1));
11334 SDValue Xor = DAG.getNode(ISD::XOR, dl, VT, USubO.getValue(0), Cmp);
11335 return DAG.getNode(ISD::SUB, dl, VT, Xor, Cmp);
11336 }
11337
11338 // FIXME: Should really try to split the vector in case it's legal on a
11339 // subvector.
11341 return DAG.UnrollVectorOp(N);
11342
11343 // abds(lhs, rhs) -> select(sgt(lhs,rhs), sub(lhs,rhs), sub(rhs,lhs))
11344 // abdu(lhs, rhs) -> select(ugt(lhs,rhs), sub(lhs,rhs), sub(rhs,lhs))
11345 return DAG.getSelect(dl, VT, Cmp, DAG.getNode(ISD::SUB, dl, VT, LHS, RHS),
11346 DAG.getNode(ISD::SUB, dl, VT, RHS, LHS));
11347}
11348
11350 SDLoc dl(N);
11351 EVT VT = N->getValueType(0);
11352 SDValue LHS = N->getOperand(0);
11353 SDValue RHS = N->getOperand(1);
11354
11355 unsigned Opc = N->getOpcode();
11356 bool IsFloor = Opc == ISD::AVGFLOORS || Opc == ISD::AVGFLOORU;
11357 bool IsSigned = Opc == ISD::AVGCEILS || Opc == ISD::AVGFLOORS;
11358 unsigned SumOpc = IsFloor ? ISD::ADD : ISD::SUB;
11359 unsigned SignOpc = IsFloor ? ISD::AND : ISD::OR;
11360 unsigned ShiftOpc = IsSigned ? ISD::SRA : ISD::SRL;
11361 unsigned ExtOpc = IsSigned ? ISD::SIGN_EXTEND : ISD::ZERO_EXTEND;
11363 Opc == ISD::AVGFLOORU || Opc == ISD::AVGCEILU) &&
11364 "Unknown AVG node");
11365
11366 // If the operands are already extended, we can add+shift.
11367 bool IsExt =
11368 (IsSigned && DAG.ComputeNumSignBits(LHS) >= 2 &&
11369 DAG.ComputeNumSignBits(RHS) >= 2) ||
11370 (!IsSigned && DAG.computeKnownBits(LHS).countMinLeadingZeros() >= 1 &&
11371 DAG.computeKnownBits(RHS).countMinLeadingZeros() >= 1);
11372 if (IsExt) {
11373 SDValue Sum = DAG.getNode(ISD::ADD, dl, VT, LHS, RHS);
11374 if (!IsFloor)
11375 Sum = DAG.getNode(ISD::ADD, dl, VT, Sum, DAG.getConstant(1, dl, VT));
11376 return DAG.getNode(ShiftOpc, dl, VT, Sum,
11377 DAG.getShiftAmountConstant(1, VT, dl));
11378 }
11379
11380 // For scalars, see if we can efficiently extend/truncate to use add+shift.
11381 if (VT.isScalarInteger()) {
11382 EVT ExtVT = VT.widenIntegerElementType(*DAG.getContext());
11383 if (isTypeLegal(ExtVT) && isTruncateFree(ExtVT, VT)) {
11384 LHS = DAG.getNode(ExtOpc, dl, ExtVT, LHS);
11385 RHS = DAG.getNode(ExtOpc, dl, ExtVT, RHS);
11386 SDValue Avg = DAG.getNode(ISD::ADD, dl, ExtVT, LHS, RHS);
11387 if (!IsFloor)
11388 Avg = DAG.getNode(ISD::ADD, dl, ExtVT, Avg,
11389 DAG.getConstant(1, dl, ExtVT));
11390 // Just use SRL as we will be truncating away the extended sign bits.
11391 Avg = DAG.getNode(ISD::SRL, dl, ExtVT, Avg,
11392 DAG.getShiftAmountConstant(1, ExtVT, dl));
11393 return DAG.getNode(ISD::TRUNCATE, dl, VT, Avg);
11394 }
11395 }
11396
11397 // avgflooru(lhs, rhs) -> or(lshr(add(lhs, rhs),1),shl(overflow, typesize-1))
11398 if (Opc == ISD::AVGFLOORU && VT.isScalarInteger() && !isTypeLegal(VT) &&
11401 SDValue UAddWithOverflow =
11402 DAG.getNode(ISD::UADDO, dl, DAG.getVTList(VT, MVT::i1), {RHS, LHS});
11403
11404 SDValue Sum = UAddWithOverflow.getValue(0);
11405 SDValue Overflow = UAddWithOverflow.getValue(1);
11406
11407 // Right shift the sum by 1
11408 SDValue LShrVal = DAG.getNode(ISD::SRL, dl, VT, Sum,
11409 DAG.getShiftAmountConstant(1, VT, dl));
11410
11411 SDValue ZeroExtOverflow = DAG.getNode(ISD::ANY_EXTEND, dl, VT, Overflow);
11412 SDValue OverflowShl = DAG.getNode(
11413 ISD::SHL, dl, VT, ZeroExtOverflow,
11414 DAG.getShiftAmountConstant(VT.getScalarSizeInBits() - 1, VT, dl));
11415
11416 return DAG.getNode(ISD::OR, dl, VT, LShrVal, OverflowShl);
11417 }
11418
11419 // avgceils(lhs, rhs) -> sub(or(lhs,rhs),ashr(xor(lhs,rhs),1))
11420 // avgceilu(lhs, rhs) -> sub(or(lhs,rhs),lshr(xor(lhs,rhs),1))
11421 // avgfloors(lhs, rhs) -> add(and(lhs,rhs),ashr(xor(lhs,rhs),1))
11422 // avgflooru(lhs, rhs) -> add(and(lhs,rhs),lshr(xor(lhs,rhs),1))
11423 LHS = DAG.getFreeze(LHS);
11424 RHS = DAG.getFreeze(RHS);
11425 SDValue Sign = DAG.getNode(SignOpc, dl, VT, LHS, RHS);
11426 SDValue Xor = DAG.getNode(ISD::XOR, dl, VT, LHS, RHS);
11427 SDValue Shift =
11428 DAG.getNode(ShiftOpc, dl, VT, Xor, DAG.getShiftAmountConstant(1, VT, dl));
11429 return DAG.getNode(SumOpc, dl, VT, Sign, Shift);
11430}
11431
11433 SDLoc dl(N);
11434 EVT VT = N->getValueType(0);
11435 SDValue Op = N->getOperand(0);
11436
11437 if (!VT.isSimple())
11438 return SDValue();
11439
11440 EVT SHVT = getShiftAmountTy(VT, DAG.getDataLayout());
11441 SDValue Tmp1, Tmp2, Tmp3, Tmp4, Tmp5, Tmp6, Tmp7, Tmp8;
11442 switch (VT.getSimpleVT().getScalarType().SimpleTy) {
11443 default:
11444 return SDValue();
11445 case MVT::i16:
11446 // Use a rotate by 8. This can be further expanded if necessary.
11447 return DAG.getNode(ISD::ROTL, dl, VT, Op, DAG.getConstant(8, dl, SHVT));
11448 case MVT::i32:
11449 // This is meant for ARM specifically, which has ROTR but no ROTL.
11450 // t = x ^ rotr(x, 16)
11451 // t = bic(t, 0x00ff0000)
11452 // t = lshr(t, 8)
11453 // x = t ^ rotr(x, 8)
11455 SDValue Rotr16 =
11456 DAG.getNode(ISD::ROTR, dl, VT, Op, DAG.getConstant(16, dl, SHVT));
11457 SDValue Tmp = DAG.getNode(ISD::XOR, dl, VT, Op, Rotr16);
11458 Tmp = DAG.getNode(ISD::AND, dl, VT, Tmp,
11459 DAG.getConstant(0xFF00FFFF, dl, VT));
11460 Tmp = DAG.getNode(ISD::SRL, dl, VT, Tmp, DAG.getConstant(8, dl, SHVT));
11461 SDValue Rotr8 =
11462 DAG.getNode(ISD::ROTR, dl, VT, Op, DAG.getConstant(8, dl, SHVT));
11463 return DAG.getNode(ISD::XOR, dl, VT, Tmp, Rotr8);
11464 }
11465 Tmp4 = DAG.getNode(ISD::SHL, dl, VT, Op, DAG.getConstant(24, dl, SHVT));
11466 Tmp3 = DAG.getNode(ISD::AND, dl, VT, Op,
11467 DAG.getConstant(0xFF00, dl, VT));
11468 Tmp3 = DAG.getNode(ISD::SHL, dl, VT, Tmp3, DAG.getConstant(8, dl, SHVT));
11469 Tmp2 = DAG.getNode(ISD::SRL, dl, VT, Op, DAG.getConstant(8, dl, SHVT));
11470 Tmp2 = DAG.getNode(ISD::AND, dl, VT, Tmp2, DAG.getConstant(0xFF00, dl, VT));
11471 Tmp1 = DAG.getNode(ISD::SRL, dl, VT, Op, DAG.getConstant(24, dl, SHVT));
11472 Tmp4 = DAG.getNode(ISD::OR, dl, VT, Tmp4, Tmp3);
11473 Tmp2 = DAG.getNode(ISD::OR, dl, VT, Tmp2, Tmp1);
11474 return DAG.getNode(ISD::OR, dl, VT, Tmp4, Tmp2);
11475 case MVT::i64:
11476 Tmp8 = DAG.getNode(ISD::SHL, dl, VT, Op, DAG.getConstant(56, dl, SHVT));
11477 Tmp7 = DAG.getNode(ISD::AND, dl, VT, Op,
11478 DAG.getConstant(255ULL<<8, dl, VT));
11479 Tmp7 = DAG.getNode(ISD::SHL, dl, VT, Tmp7, DAG.getConstant(40, dl, SHVT));
11480 Tmp6 = DAG.getNode(ISD::AND, dl, VT, Op,
11481 DAG.getConstant(255ULL<<16, dl, VT));
11482 Tmp6 = DAG.getNode(ISD::SHL, dl, VT, Tmp6, DAG.getConstant(24, dl, SHVT));
11483 Tmp5 = DAG.getNode(ISD::AND, dl, VT, Op,
11484 DAG.getConstant(255ULL<<24, dl, VT));
11485 Tmp5 = DAG.getNode(ISD::SHL, dl, VT, Tmp5, DAG.getConstant(8, dl, SHVT));
11486 Tmp4 = DAG.getNode(ISD::SRL, dl, VT, Op, DAG.getConstant(8, dl, SHVT));
11487 Tmp4 = DAG.getNode(ISD::AND, dl, VT, Tmp4,
11488 DAG.getConstant(255ULL<<24, dl, VT));
11489 Tmp3 = DAG.getNode(ISD::SRL, dl, VT, Op, DAG.getConstant(24, dl, SHVT));
11490 Tmp3 = DAG.getNode(ISD::AND, dl, VT, Tmp3,
11491 DAG.getConstant(255ULL<<16, dl, VT));
11492 Tmp2 = DAG.getNode(ISD::SRL, dl, VT, Op, DAG.getConstant(40, dl, SHVT));
11493 Tmp2 = DAG.getNode(ISD::AND, dl, VT, Tmp2,
11494 DAG.getConstant(255ULL<<8, dl, VT));
11495 Tmp1 = DAG.getNode(ISD::SRL, dl, VT, Op, DAG.getConstant(56, dl, SHVT));
11496 Tmp8 = DAG.getNode(ISD::OR, dl, VT, Tmp8, Tmp7);
11497 Tmp6 = DAG.getNode(ISD::OR, dl, VT, Tmp6, Tmp5);
11498 Tmp4 = DAG.getNode(ISD::OR, dl, VT, Tmp4, Tmp3);
11499 Tmp2 = DAG.getNode(ISD::OR, dl, VT, Tmp2, Tmp1);
11500 Tmp8 = DAG.getNode(ISD::OR, dl, VT, Tmp8, Tmp6);
11501 Tmp4 = DAG.getNode(ISD::OR, dl, VT, Tmp4, Tmp2);
11502 return DAG.getNode(ISD::OR, dl, VT, Tmp8, Tmp4);
11503 }
11504}
11505
11507 SDLoc dl(N);
11508 EVT VT = N->getValueType(0);
11509 SDValue Op = N->getOperand(0);
11510 EVT SHVT = getShiftAmountTy(VT, DAG.getDataLayout());
11511 unsigned Sz = VT.getScalarSizeInBits();
11512
11513 SDValue Tmp, Tmp2, Tmp3;
11514
11515 // If we can, perform BSWAP first and then the mask+swap the i4, then i2
11516 // and finally the i1 pairs.
11517 // TODO: We can easily support i4/i2 legal types if any target ever does.
11518 if (Sz >= 8 && isPowerOf2_32(Sz)) {
11519 // Create the masks - repeating the pattern every byte.
11520 APInt Mask4 = APInt::getSplat(Sz, APInt(8, 0x0F));
11521 APInt Mask2 = APInt::getSplat(Sz, APInt(8, 0x33));
11522 APInt Mask1 = APInt::getSplat(Sz, APInt(8, 0x55));
11523
11524 // BSWAP if the type is wider than a single byte.
11525 Tmp = (Sz > 8 ? DAG.getNode(ISD::BSWAP, dl, VT, Op) : Op);
11526
11527 // swap i4: ((V >> 4) & 0x0F) | ((V & 0x0F) << 4)
11528 Tmp2 = DAG.getNode(ISD::SRL, dl, VT, Tmp, DAG.getConstant(4, dl, SHVT));
11529 Tmp2 = DAG.getNode(ISD::AND, dl, VT, Tmp2, DAG.getConstant(Mask4, dl, VT));
11530 Tmp3 = DAG.getNode(ISD::AND, dl, VT, Tmp, DAG.getConstant(Mask4, dl, VT));
11531 Tmp3 = DAG.getNode(ISD::SHL, dl, VT, Tmp3, DAG.getConstant(4, dl, SHVT));
11532 Tmp = DAG.getNode(ISD::OR, dl, VT, Tmp2, Tmp3);
11533
11534 // swap i2: ((V >> 2) & 0x33) | ((V & 0x33) << 2)
11535 Tmp2 = DAG.getNode(ISD::SRL, dl, VT, Tmp, DAG.getConstant(2, dl, SHVT));
11536 Tmp2 = DAG.getNode(ISD::AND, dl, VT, Tmp2, DAG.getConstant(Mask2, dl, VT));
11537 Tmp3 = DAG.getNode(ISD::AND, dl, VT, Tmp, DAG.getConstant(Mask2, dl, VT));
11538 Tmp3 = DAG.getNode(ISD::SHL, dl, VT, Tmp3, DAG.getConstant(2, dl, SHVT));
11539 Tmp = DAG.getNode(ISD::OR, dl, VT, Tmp2, Tmp3);
11540
11541 // swap i1: ((V >> 1) & 0x55) | ((V & 0x55) << 1)
11542 Tmp2 = DAG.getNode(ISD::SRL, dl, VT, Tmp, DAG.getConstant(1, dl, SHVT));
11543 Tmp2 = DAG.getNode(ISD::AND, dl, VT, Tmp2, DAG.getConstant(Mask1, dl, VT));
11544 Tmp3 = DAG.getNode(ISD::AND, dl, VT, Tmp, DAG.getConstant(Mask1, dl, VT));
11545 Tmp3 = DAG.getNode(ISD::SHL, dl, VT, Tmp3, DAG.getConstant(1, dl, SHVT));
11546 Tmp = DAG.getNode(ISD::OR, dl, VT, Tmp2, Tmp3);
11547 return Tmp;
11548 }
11549
11550 Tmp = DAG.getConstant(0, dl, VT);
11551 for (unsigned I = 0, J = Sz-1; I < Sz; ++I, --J) {
11552 if (I < J)
11553 Tmp2 =
11554 DAG.getNode(ISD::SHL, dl, VT, Op, DAG.getConstant(J - I, dl, SHVT));
11555 else
11556 Tmp2 =
11557 DAG.getNode(ISD::SRL, dl, VT, Op, DAG.getConstant(I - J, dl, SHVT));
11558
11559 APInt Shift = APInt::getOneBitSet(Sz, J);
11560 Tmp2 = DAG.getNode(ISD::AND, dl, VT, Tmp2, DAG.getConstant(Shift, dl, VT));
11561 Tmp = DAG.getNode(ISD::OR, dl, VT, Tmp, Tmp2);
11562 }
11563
11564 return Tmp;
11565}
11566
11567std::pair<SDValue, SDValue>
11569 SelectionDAG &DAG) const {
11570 SDLoc SL(LD);
11571 SDValue Chain = LD->getChain();
11572 SDValue BasePTR = LD->getBasePtr();
11573 EVT SrcVT = LD->getMemoryVT();
11574 EVT DstVT = LD->getValueType(0);
11575 ISD::LoadExtType ExtType = LD->getExtensionType();
11576
11577 if (SrcVT.isScalableVector())
11578 report_fatal_error("Cannot scalarize scalable vector loads");
11579
11580 unsigned NumElem = SrcVT.getVectorNumElements();
11581
11582 EVT SrcEltVT = SrcVT.getScalarType();
11583 EVT DstEltVT = DstVT.getScalarType();
11584
11585 // A vector must always be stored in memory as-is, i.e. without any padding
11586 // between the elements, since various code depend on it, e.g. in the
11587 // handling of a bitcast of a vector type to int, which may be done with a
11588 // vector store followed by an integer load. A vector that does not have
11589 // elements that are byte-sized must therefore be stored as an integer
11590 // built out of the extracted vector elements.
11591 if (!SrcEltVT.isByteSized()) {
11592 unsigned NumLoadBits = SrcVT.getStoreSizeInBits();
11593 EVT LoadVT = EVT::getIntegerVT(*DAG.getContext(), NumLoadBits);
11594
11595 unsigned NumSrcBits = SrcVT.getSizeInBits();
11596 EVT SrcIntVT = EVT::getIntegerVT(*DAG.getContext(), NumSrcBits);
11597
11598 unsigned SrcEltBits = SrcEltVT.getSizeInBits();
11599 SDValue SrcEltBitMask = DAG.getConstant(
11600 APInt::getLowBitsSet(NumLoadBits, SrcEltBits), SL, LoadVT);
11601
11602 // Load the whole vector and avoid masking off the top bits as it makes
11603 // the codegen worse.
11604 SDValue Load =
11605 DAG.getExtLoad(ISD::EXTLOAD, SL, LoadVT, Chain, BasePTR,
11606 LD->getPointerInfo(), SrcIntVT, LD->getBaseAlign(),
11607 LD->getMemOperand()->getFlags(), LD->getAAInfo());
11608
11610 for (unsigned Idx = 0; Idx < NumElem; ++Idx) {
11611 unsigned ShiftIntoIdx =
11612 (DAG.getDataLayout().isBigEndian() ? (NumElem - 1) - Idx : Idx);
11613 SDValue ShiftAmount = DAG.getShiftAmountConstant(
11614 ShiftIntoIdx * SrcEltVT.getSizeInBits(), LoadVT, SL);
11615 SDValue ShiftedElt = DAG.getNode(ISD::SRL, SL, LoadVT, Load, ShiftAmount);
11616 SDValue Elt =
11617 DAG.getNode(ISD::AND, SL, LoadVT, ShiftedElt, SrcEltBitMask);
11618 SDValue Scalar = DAG.getNode(ISD::TRUNCATE, SL, SrcEltVT, Elt);
11619
11620 if (ExtType != ISD::NON_EXTLOAD) {
11621 unsigned ExtendOp = ISD::getExtForLoadExtType(false, ExtType);
11622 Scalar = DAG.getNode(ExtendOp, SL, DstEltVT, Scalar);
11623 }
11624
11625 Vals.push_back(Scalar);
11626 }
11627
11628 SDValue Value = DAG.getBuildVector(DstVT, SL, Vals);
11629 return std::make_pair(Value, Load.getValue(1));
11630 }
11631
11632 unsigned Stride = SrcEltVT.getSizeInBits() / 8;
11633 assert(SrcEltVT.isByteSized());
11634
11636 SmallVector<SDValue, 8> LoadChains;
11637
11638 for (unsigned Idx = 0; Idx < NumElem; ++Idx) {
11639 SDValue ScalarLoad = DAG.getExtLoad(
11640 ExtType, SL, DstEltVT, Chain, BasePTR,
11641 LD->getPointerInfo().getWithOffset(Idx * Stride), SrcEltVT,
11642 LD->getBaseAlign(), LD->getMemOperand()->getFlags(), LD->getAAInfo());
11643
11644 BasePTR = DAG.getObjectPtrOffset(SL, BasePTR, TypeSize::getFixed(Stride));
11645
11646 Vals.push_back(ScalarLoad.getValue(0));
11647 LoadChains.push_back(ScalarLoad.getValue(1));
11648 }
11649
11650 SDValue NewChain = DAG.getNode(ISD::TokenFactor, SL, MVT::Other, LoadChains);
11651 SDValue Value = DAG.getBuildVector(DstVT, SL, Vals);
11652
11653 return std::make_pair(Value, NewChain);
11654}
11655
11657 SelectionDAG &DAG) const {
11658 SDLoc SL(ST);
11659
11660 SDValue Chain = ST->getChain();
11661 SDValue BasePtr = ST->getBasePtr();
11662 SDValue Value = ST->getValue();
11663 EVT StVT = ST->getMemoryVT();
11664
11665 if (StVT.isScalableVector())
11666 report_fatal_error("Cannot scalarize scalable vector stores");
11667
11668 // The type of the data we want to save
11669 EVT RegVT = Value.getValueType();
11670 EVT RegSclVT = RegVT.getScalarType();
11671
11672 // The type of data as saved in memory.
11673 EVT MemSclVT = StVT.getScalarType();
11674
11675 unsigned NumElem = StVT.getVectorNumElements();
11676
11677 // A vector must always be stored in memory as-is, i.e. without any padding
11678 // between the elements, since various code depend on it, e.g. in the
11679 // handling of a bitcast of a vector type to int, which may be done with a
11680 // vector store followed by an integer load. A vector that does not have
11681 // elements that are byte-sized must therefore be stored as an integer
11682 // built out of the extracted vector elements.
11683 if (!MemSclVT.isByteSized()) {
11684 unsigned NumBits = StVT.getSizeInBits();
11685 EVT IntVT = EVT::getIntegerVT(*DAG.getContext(), NumBits);
11686
11687 SDValue CurrVal = DAG.getConstant(0, SL, IntVT);
11688
11689 for (unsigned Idx = 0; Idx < NumElem; ++Idx) {
11690 SDValue Elt = DAG.getExtractVectorElt(SL, RegSclVT, Value, Idx);
11691 SDValue Trunc = DAG.getNode(ISD::TRUNCATE, SL, MemSclVT, Elt);
11692 SDValue ExtElt = DAG.getNode(ISD::ZERO_EXTEND, SL, IntVT, Trunc);
11693 unsigned ShiftIntoIdx =
11694 (DAG.getDataLayout().isBigEndian() ? (NumElem - 1) - Idx : Idx);
11695 SDValue ShiftAmount =
11696 DAG.getConstant(ShiftIntoIdx * MemSclVT.getSizeInBits(), SL, IntVT);
11697 SDValue ShiftedElt =
11698 DAG.getNode(ISD::SHL, SL, IntVT, ExtElt, ShiftAmount);
11699 CurrVal = DAG.getNode(ISD::OR, SL, IntVT, CurrVal, ShiftedElt);
11700 }
11701
11702 return DAG.getStore(Chain, SL, CurrVal, BasePtr, ST->getPointerInfo(),
11703 ST->getBaseAlign(), ST->getMemOperand()->getFlags(),
11704 ST->getAAInfo());
11705 }
11706
11707 // Store Stride in bytes
11708 unsigned Stride = MemSclVT.getSizeInBits() / 8;
11709 assert(Stride && "Zero stride!");
11710 // Extract each of the elements from the original vector and save them into
11711 // memory individually.
11713 for (unsigned Idx = 0; Idx < NumElem; ++Idx) {
11714 SDValue Elt = DAG.getExtractVectorElt(SL, RegSclVT, Value, Idx);
11715
11716 SDValue Ptr =
11717 DAG.getObjectPtrOffset(SL, BasePtr, TypeSize::getFixed(Idx * Stride));
11718
11719 // This scalar TruncStore may be illegal, but we legalize it later.
11721 Chain, SL, Elt, Ptr, ST->getPointerInfo().getWithOffset(Idx * Stride),
11722 MemSclVT, ST->getBaseAlign(), ST->getMemOperand()->getFlags(),
11723 ST->getAAInfo());
11724
11725 Stores.push_back(Store);
11726 }
11727
11728 return DAG.getNode(ISD::TokenFactor, SL, MVT::Other, Stores);
11729}
11730
11731std::pair<SDValue, SDValue>
11733 assert(LD->getAddressingMode() == ISD::UNINDEXED &&
11734 "unaligned indexed loads not implemented!");
11735 SDValue Chain = LD->getChain();
11736 SDValue Ptr = LD->getBasePtr();
11737 EVT VT = LD->getValueType(0);
11738 EVT LoadedVT = LD->getMemoryVT();
11739 SDLoc dl(LD);
11740 auto &MF = DAG.getMachineFunction();
11741
11742 if (VT.isFloatingPoint() || VT.isVector()) {
11743 EVT intVT = EVT::getIntegerVT(*DAG.getContext(), LoadedVT.getSizeInBits());
11744 if (isTypeLegal(intVT) && isTypeLegal(LoadedVT)) {
11745 if (!isOperationLegalOrCustom(ISD::LOAD, intVT) &&
11746 LoadedVT.isVector()) {
11747 // Scalarize the load and let the individual components be handled.
11748 return scalarizeVectorLoad(LD, DAG);
11749 }
11750
11751 // Expand to a (misaligned) integer load of the same size,
11752 // then bitconvert to floating point or vector.
11753 SDValue newLoad = DAG.getLoad(intVT, dl, Chain, Ptr,
11754 LD->getMemOperand());
11755 SDValue Result = DAG.getNode(ISD::BITCAST, dl, LoadedVT, newLoad);
11756 if (LoadedVT != VT)
11757 Result = DAG.getNode(VT.isFloatingPoint() ? ISD::FP_EXTEND :
11758 ISD::ANY_EXTEND, dl, VT, Result);
11759
11760 return std::make_pair(Result, newLoad.getValue(1));
11761 }
11762
11763 // Copy the value to a (aligned) stack slot using (unaligned) integer
11764 // loads and stores, then do a (aligned) load from the stack slot.
11765 MVT RegVT = getRegisterType(*DAG.getContext(), intVT);
11766 unsigned LoadedBytes = LoadedVT.getStoreSize();
11767 unsigned RegBytes = RegVT.getSizeInBits() / 8;
11768 unsigned NumRegs = (LoadedBytes + RegBytes - 1) / RegBytes;
11769
11770 // Make sure the stack slot is also aligned for the register type.
11771 SDValue StackBase = DAG.CreateStackTemporary(LoadedVT, RegVT);
11772 auto FrameIndex = cast<FrameIndexSDNode>(StackBase.getNode())->getIndex();
11774 SDValue StackPtr = StackBase;
11775 unsigned Offset = 0;
11776
11777 EVT PtrVT = Ptr.getValueType();
11778 EVT StackPtrVT = StackPtr.getValueType();
11779
11780 SDValue PtrIncrement = DAG.getConstant(RegBytes, dl, PtrVT);
11781 SDValue StackPtrIncrement = DAG.getConstant(RegBytes, dl, StackPtrVT);
11782
11783 // Do all but one copies using the full register width.
11784 for (unsigned i = 1; i < NumRegs; i++) {
11785 // Load one integer register's worth from the original location.
11786 SDValue Load = DAG.getLoad(
11787 RegVT, dl, Chain, Ptr, LD->getPointerInfo().getWithOffset(Offset),
11788 LD->getBaseAlign(), LD->getMemOperand()->getFlags(), LD->getAAInfo());
11789 // Follow the load with a store to the stack slot. Remember the store.
11790 Stores.push_back(DAG.getStore(
11791 Load.getValue(1), dl, Load, StackPtr,
11792 MachinePointerInfo::getFixedStack(MF, FrameIndex, Offset)));
11793 // Increment the pointers.
11794 Offset += RegBytes;
11795
11796 Ptr = DAG.getObjectPtrOffset(dl, Ptr, PtrIncrement);
11797 StackPtr = DAG.getObjectPtrOffset(dl, StackPtr, StackPtrIncrement);
11798 }
11799
11800 // The last copy may be partial. Do an extending load.
11801 EVT MemVT = EVT::getIntegerVT(*DAG.getContext(),
11802 8 * (LoadedBytes - Offset));
11803 SDValue Load = DAG.getExtLoad(
11804 ISD::EXTLOAD, dl, RegVT, Chain, Ptr,
11805 LD->getPointerInfo().getWithOffset(Offset), MemVT, LD->getBaseAlign(),
11806 LD->getMemOperand()->getFlags(), LD->getAAInfo());
11807 // Follow the load with a store to the stack slot. Remember the store.
11808 // On big-endian machines this requires a truncating store to ensure
11809 // that the bits end up in the right place.
11810 Stores.push_back(DAG.getTruncStore(
11811 Load.getValue(1), dl, Load, StackPtr,
11812 MachinePointerInfo::getFixedStack(MF, FrameIndex, Offset), MemVT));
11813
11814 // The order of the stores doesn't matter - say it with a TokenFactor.
11815 SDValue TF = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Stores);
11816
11817 // Finally, perform the original load only redirected to the stack slot.
11818 Load = DAG.getExtLoad(LD->getExtensionType(), dl, VT, TF, StackBase,
11819 MachinePointerInfo::getFixedStack(MF, FrameIndex, 0),
11820 LoadedVT);
11821
11822 // Callers expect a MERGE_VALUES node.
11823 return std::make_pair(Load, TF);
11824 }
11825
11826 assert(LoadedVT.isInteger() && !LoadedVT.isVector() &&
11827 "Unaligned load of unsupported type.");
11828
11829 // Compute the new VT that is half the size of the old one. This is an
11830 // integer MVT.
11831 unsigned NumBits = LoadedVT.getSizeInBits();
11832 EVT NewLoadedVT;
11833 NewLoadedVT = EVT::getIntegerVT(*DAG.getContext(), NumBits/2);
11834 NumBits >>= 1;
11835
11836 Align Alignment = LD->getBaseAlign();
11837 unsigned IncrementSize = NumBits / 8;
11838 ISD::LoadExtType HiExtType = LD->getExtensionType();
11839
11840 // If the original load is NON_EXTLOAD, the hi part load must be ZEXTLOAD.
11841 if (HiExtType == ISD::NON_EXTLOAD)
11842 HiExtType = ISD::ZEXTLOAD;
11843
11844 // Load the value in two parts
11845 SDValue Lo, Hi;
11846 if (DAG.getDataLayout().isLittleEndian()) {
11847 Lo = DAG.getExtLoad(ISD::ZEXTLOAD, dl, VT, Chain, Ptr, LD->getPointerInfo(),
11848 NewLoadedVT, Alignment, LD->getMemOperand()->getFlags(),
11849 LD->getAAInfo());
11850
11851 Ptr = DAG.getObjectPtrOffset(dl, Ptr, TypeSize::getFixed(IncrementSize));
11852 Hi = DAG.getExtLoad(HiExtType, dl, VT, Chain, Ptr,
11853 LD->getPointerInfo().getWithOffset(IncrementSize),
11854 NewLoadedVT, Alignment, LD->getMemOperand()->getFlags(),
11855 LD->getAAInfo());
11856 } else {
11857 Hi = DAG.getExtLoad(HiExtType, dl, VT, Chain, Ptr, LD->getPointerInfo(),
11858 NewLoadedVT, Alignment, LD->getMemOperand()->getFlags(),
11859 LD->getAAInfo());
11860
11861 Ptr = DAG.getObjectPtrOffset(dl, Ptr, TypeSize::getFixed(IncrementSize));
11862 Lo = DAG.getExtLoad(ISD::ZEXTLOAD, dl, VT, Chain, Ptr,
11863 LD->getPointerInfo().getWithOffset(IncrementSize),
11864 NewLoadedVT, Alignment, LD->getMemOperand()->getFlags(),
11865 LD->getAAInfo());
11866 }
11867
11868 // aggregate the two parts
11869 SDValue ShiftAmount = DAG.getShiftAmountConstant(NumBits, VT, dl);
11870 SDValue Result = DAG.getNode(ISD::SHL, dl, VT, Hi, ShiftAmount);
11871 Result = DAG.getNode(ISD::OR, dl, VT, Result, Lo);
11872
11873 SDValue TF = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Lo.getValue(1),
11874 Hi.getValue(1));
11875
11876 return std::make_pair(Result, TF);
11877}
11878
11880 SelectionDAG &DAG) const {
11881 assert(ST->getAddressingMode() == ISD::UNINDEXED &&
11882 "unaligned indexed stores not implemented!");
11883 SDValue Chain = ST->getChain();
11884 SDValue Ptr = ST->getBasePtr();
11885 SDValue Val = ST->getValue();
11886 EVT VT = Val.getValueType();
11887 Align Alignment = ST->getBaseAlign();
11888 auto &MF = DAG.getMachineFunction();
11889 EVT StoreMemVT = ST->getMemoryVT();
11890
11891 SDLoc dl(ST);
11892 if (StoreMemVT.isFloatingPoint() || StoreMemVT.isVector()) {
11893 EVT intVT = EVT::getIntegerVT(*DAG.getContext(), VT.getSizeInBits());
11894 if (isTypeLegal(intVT)) {
11895 if (!isOperationLegalOrCustom(ISD::STORE, intVT) &&
11896 StoreMemVT.isVector()) {
11897 // Scalarize the store and let the individual components be handled.
11898 SDValue Result = scalarizeVectorStore(ST, DAG);
11899 return Result;
11900 }
11901 // Expand to a bitconvert of the value to the integer type of the
11902 // same size, then a (misaligned) int store.
11903 // FIXME: Does not handle truncating floating point stores!
11904 SDValue Result = DAG.getNode(ISD::BITCAST, dl, intVT, Val);
11905 Result = DAG.getStore(Chain, dl, Result, Ptr, ST->getPointerInfo(),
11906 Alignment, ST->getMemOperand()->getFlags());
11907 return Result;
11908 }
11909 // Do a (aligned) store to a stack slot, then copy from the stack slot
11910 // to the final destination using (unaligned) integer loads and stores.
11911 MVT RegVT = getRegisterType(
11912 *DAG.getContext(),
11913 EVT::getIntegerVT(*DAG.getContext(), StoreMemVT.getSizeInBits()));
11914 EVT PtrVT = Ptr.getValueType();
11915 unsigned StoredBytes = StoreMemVT.getStoreSize();
11916 unsigned RegBytes = RegVT.getSizeInBits() / 8;
11917 unsigned NumRegs = (StoredBytes + RegBytes - 1) / RegBytes;
11918
11919 // Make sure the stack slot is also aligned for the register type.
11920 SDValue StackPtr = DAG.CreateStackTemporary(StoreMemVT, RegVT);
11921 auto FrameIndex = cast<FrameIndexSDNode>(StackPtr.getNode())->getIndex();
11922
11923 // Perform the original store, only redirected to the stack slot.
11925 Chain, dl, Val, StackPtr,
11926 MachinePointerInfo::getFixedStack(MF, FrameIndex, 0), StoreMemVT);
11927
11928 EVT StackPtrVT = StackPtr.getValueType();
11929
11930 SDValue PtrIncrement = DAG.getConstant(RegBytes, dl, PtrVT);
11931 SDValue StackPtrIncrement = DAG.getConstant(RegBytes, dl, StackPtrVT);
11933 unsigned Offset = 0;
11934
11935 // Do all but one copies using the full register width.
11936 for (unsigned i = 1; i < NumRegs; i++) {
11937 // Load one integer register's worth from the stack slot.
11938 SDValue Load = DAG.getLoad(
11939 RegVT, dl, Store, StackPtr,
11940 MachinePointerInfo::getFixedStack(MF, FrameIndex, Offset));
11941 // Store it to the final location. Remember the store.
11942 Stores.push_back(DAG.getStore(Load.getValue(1), dl, Load, Ptr,
11943 ST->getPointerInfo().getWithOffset(Offset),
11944 ST->getBaseAlign(),
11945 ST->getMemOperand()->getFlags()));
11946 // Increment the pointers.
11947 Offset += RegBytes;
11948 StackPtr = DAG.getObjectPtrOffset(dl, StackPtr, StackPtrIncrement);
11949 Ptr = DAG.getObjectPtrOffset(dl, Ptr, PtrIncrement);
11950 }
11951
11952 // The last store may be partial. Do a truncating store. On big-endian
11953 // machines this requires an extending load from the stack slot to ensure
11954 // that the bits are in the right place.
11955 EVT LoadMemVT =
11956 EVT::getIntegerVT(*DAG.getContext(), 8 * (StoredBytes - Offset));
11957
11958 // Load from the stack slot.
11959 SDValue Load = DAG.getExtLoad(
11960 ISD::EXTLOAD, dl, RegVT, Store, StackPtr,
11961 MachinePointerInfo::getFixedStack(MF, FrameIndex, Offset), LoadMemVT);
11962
11963 Stores.push_back(DAG.getTruncStore(
11964 Load.getValue(1), dl, Load, Ptr,
11965 ST->getPointerInfo().getWithOffset(Offset), LoadMemVT,
11966 ST->getBaseAlign(), ST->getMemOperand()->getFlags(), ST->getAAInfo()));
11967 // The order of the stores doesn't matter - say it with a TokenFactor.
11968 SDValue Result = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Stores);
11969 return Result;
11970 }
11971
11972 assert(StoreMemVT.isInteger() && !StoreMemVT.isVector() &&
11973 "Unaligned store of unknown type.");
11974 // Get the half-size VT
11975 EVT NewStoredVT = StoreMemVT.getHalfSizedIntegerVT(*DAG.getContext());
11976 unsigned NumBits = NewStoredVT.getFixedSizeInBits();
11977 unsigned IncrementSize = NumBits / 8;
11978
11979 // Divide the stored value in two parts.
11980 SDValue ShiftAmount =
11981 DAG.getShiftAmountConstant(NumBits, Val.getValueType(), dl);
11982 SDValue Lo = Val;
11983 // If Val is a constant, replace the upper bits with 0. The SRL will constant
11984 // fold and not use the upper bits. A smaller constant may be easier to
11985 // materialize.
11986 if (auto *C = dyn_cast<ConstantSDNode>(Lo); C && !C->isOpaque())
11987 Lo = DAG.getNode(
11988 ISD::AND, dl, VT, Lo,
11989 DAG.getConstant(APInt::getLowBitsSet(VT.getSizeInBits(), NumBits), dl,
11990 VT));
11991 SDValue Hi = DAG.getNode(ISD::SRL, dl, VT, Val, ShiftAmount);
11992
11993 // Store the two parts
11994 SDValue Store1, Store2;
11995 Store1 = DAG.getTruncStore(Chain, dl,
11996 DAG.getDataLayout().isLittleEndian() ? Lo : Hi,
11997 Ptr, ST->getPointerInfo(), NewStoredVT, Alignment,
11998 ST->getMemOperand()->getFlags());
11999
12000 Ptr = DAG.getObjectPtrOffset(dl, Ptr, TypeSize::getFixed(IncrementSize));
12001 Store2 = DAG.getTruncStore(
12002 Chain, dl, DAG.getDataLayout().isLittleEndian() ? Hi : Lo, Ptr,
12003 ST->getPointerInfo().getWithOffset(IncrementSize), NewStoredVT, Alignment,
12004 ST->getMemOperand()->getFlags(), ST->getAAInfo());
12005
12006 SDValue Result =
12007 DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Store1, Store2);
12008 return Result;
12009}
12010
12011SDValue
12013 const SDLoc &DL, EVT DataVT,
12014 SelectionDAG &DAG,
12015 bool IsCompressedMemory) const {
12017 EVT AddrVT = Addr.getValueType();
12018 EVT MaskVT = Mask.getValueType();
12019 assert(DataVT.getVectorElementCount() == MaskVT.getVectorElementCount() &&
12020 "Incompatible types of Data and Mask");
12021 if (IsCompressedMemory) {
12022 // Incrementing the pointer according to number of '1's in the mask.
12023 if (DataVT.isScalableVector()) {
12024 EVT MaskExtVT = MaskVT.changeElementType(*DAG.getContext(), MVT::i32);
12025 SDValue MaskExt = DAG.getNode(ISD::ZERO_EXTEND, DL, MaskExtVT, Mask);
12026 Increment = DAG.getNode(ISD::VECREDUCE_ADD, DL, MVT::i32, MaskExt);
12027 } else {
12028 EVT MaskIntVT =
12029 EVT::getIntegerVT(*DAG.getContext(), MaskVT.getSizeInBits());
12030 SDValue MaskInIntReg = DAG.getBitcast(MaskIntVT, Mask);
12031 if (MaskIntVT.getSizeInBits() < 32) {
12032 MaskInIntReg =
12033 DAG.getNode(ISD::ZERO_EXTEND, DL, MVT::i32, MaskInIntReg);
12034 MaskIntVT = MVT::i32;
12035 }
12036 Increment = DAG.getNode(ISD::CTPOP, DL, MaskIntVT, MaskInIntReg);
12037 }
12038 // Scale is an element size in bytes.
12039 SDValue Scale = DAG.getConstant(DataVT.getScalarSizeInBits() / 8, DL,
12040 AddrVT);
12041 Increment = DAG.getZExtOrTrunc(Increment, DL, AddrVT);
12042 Increment = DAG.getNode(ISD::MUL, DL, AddrVT, Increment, Scale);
12043 } else
12044 Increment = DAG.getTypeSize(DL, AddrVT, DataVT.getStoreSize());
12045
12046 return DAG.getNode(ISD::ADD, DL, AddrVT, Addr, Increment);
12047}
12048
12050 EVT VecVT, const SDLoc &dl,
12051 ElementCount SubEC) {
12052 assert(!(SubEC.isScalable() && VecVT.isFixedLengthVector()) &&
12053 "Cannot index a scalable vector within a fixed-width vector");
12054
12055 unsigned NElts = VecVT.getVectorMinNumElements();
12056 unsigned NumSubElts = SubEC.getKnownMinValue();
12057 EVT IdxVT = Idx.getValueType();
12058
12059 if (VecVT.isScalableVector() && !SubEC.isScalable()) {
12060 // If this is a constant index and we know the value plus the number of the
12061 // elements in the subvector minus one is less than the minimum number of
12062 // elements then it's safe to return Idx.
12063 if (auto *IdxCst = dyn_cast<ConstantSDNode>(Idx))
12064 if (IdxCst->getZExtValue() + (NumSubElts - 1) < NElts)
12065 return Idx;
12066 SDValue VS =
12067 DAG.getVScale(dl, IdxVT, APInt(IdxVT.getFixedSizeInBits(), NElts));
12068 unsigned SubOpcode = NumSubElts <= NElts ? ISD::SUB : ISD::USUBSAT;
12069 SDValue Sub = DAG.getNode(SubOpcode, dl, IdxVT, VS,
12070 DAG.getConstant(NumSubElts, dl, IdxVT));
12071 return DAG.getNode(ISD::UMIN, dl, IdxVT, Idx, Sub);
12072 }
12073 if (isPowerOf2_32(NElts) && NumSubElts == 1) {
12075 return DAG.getNode(ISD::AND, dl, IdxVT, Idx,
12076 DAG.getConstant(Imm, dl, IdxVT));
12077 }
12078 unsigned MaxIndex = NumSubElts < NElts ? NElts - NumSubElts : 0;
12079 return DAG.getNode(ISD::UMIN, dl, IdxVT, Idx,
12080 DAG.getConstant(MaxIndex, dl, IdxVT));
12081}
12082
12083SDValue
12085 EVT VecVT, SDValue Index,
12086 const SDNodeFlags PtrArithFlags) const {
12088 DAG, VecPtr, VecVT,
12090 Index, PtrArithFlags);
12091}
12092
12093SDValue
12095 EVT VecVT, EVT SubVecVT, SDValue Index,
12096 const SDNodeFlags PtrArithFlags) const {
12097 SDLoc dl(Index);
12098 // Make sure the index type is big enough to compute in.
12099 Index = DAG.getZExtOrTrunc(Index, dl, VecPtr.getValueType());
12100
12101 EVT EltVT = VecVT.getVectorElementType();
12102
12103 // Calculate the element offset and add it to the pointer.
12104 unsigned EltSize = EltVT.getFixedSizeInBits() / 8; // FIXME: should be ABI size.
12105 assert(EltSize * 8 == EltVT.getFixedSizeInBits() &&
12106 "Converting bits to bytes lost precision");
12107 assert(SubVecVT.getVectorElementType() == EltVT &&
12108 "Sub-vector must be a vector with matching element type");
12109 Index = clampDynamicVectorIndex(DAG, Index, VecVT, dl,
12110 SubVecVT.getVectorElementCount());
12111
12112 EVT IdxVT = Index.getValueType();
12113 if (SubVecVT.isScalableVector())
12114 Index =
12115 DAG.getNode(ISD::MUL, dl, IdxVT, Index,
12116 DAG.getVScale(dl, IdxVT, APInt(IdxVT.getSizeInBits(), 1)));
12117
12118 Index = DAG.getNode(ISD::MUL, dl, IdxVT, Index,
12119 DAG.getConstant(EltSize, dl, IdxVT));
12120 return DAG.getMemBasePlusOffset(VecPtr, Index, dl, PtrArithFlags);
12121}
12122
12123//===----------------------------------------------------------------------===//
12124// Implementation of Emulated TLS Model
12125//===----------------------------------------------------------------------===//
12126
12128 SelectionDAG &DAG) const {
12129 // Access to address of TLS varialbe xyz is lowered to a function call:
12130 // __emutls_get_address( address of global variable named "__emutls_v.xyz" )
12131 EVT PtrVT = getPointerTy(DAG.getDataLayout());
12132 PointerType *VoidPtrType = PointerType::get(*DAG.getContext(), 0);
12133 SDLoc dl(GA);
12134
12135 ArgListTy Args;
12136 const GlobalValue *GV =
12138 SmallString<32> NameString("__emutls_v.");
12139 NameString += GV->getName();
12140 StringRef EmuTlsVarName(NameString);
12141 const GlobalVariable *EmuTlsVar =
12142 GV->getParent()->getNamedGlobal(EmuTlsVarName);
12143 assert(EmuTlsVar && "Cannot find EmuTlsVar ");
12144 Args.emplace_back(DAG.getGlobalAddress(EmuTlsVar, dl, PtrVT), VoidPtrType);
12145
12146 SDValue EmuTlsGetAddr = DAG.getExternalSymbol("__emutls_get_address", PtrVT);
12147
12149 CLI.setDebugLoc(dl).setChain(DAG.getEntryNode());
12150 CLI.setLibCallee(CallingConv::C, VoidPtrType, EmuTlsGetAddr, std::move(Args));
12151 std::pair<SDValue, SDValue> CallResult = LowerCallTo(CLI);
12152
12153 // TLSADDR will be codegen'ed as call. Inform MFI that function has calls.
12154 // At last for X86 targets, maybe good for other targets too?
12156 MFI.setAdjustsStack(true); // Is this only for X86 target?
12157 MFI.setHasCalls(true);
12158
12159 assert((GA->getOffset() == 0) &&
12160 "Emulated TLS must have zero offset in GlobalAddressSDNode");
12161 return CallResult.first;
12162}
12163
12165 SelectionDAG &DAG) const {
12166 assert((Op->getOpcode() == ISD::SETCC) && "Input has to be a SETCC node.");
12167 if (!isCtlzFast())
12168 return SDValue();
12169 ISD::CondCode CC = cast<CondCodeSDNode>(Op.getOperand(2))->get();
12170 SDLoc dl(Op);
12171 if (isNullConstant(Op.getOperand(1)) && CC == ISD::SETEQ) {
12172 EVT VT = Op.getOperand(0).getValueType();
12173 SDValue Zext = Op.getOperand(0);
12174 if (VT.bitsLT(MVT::i32)) {
12175 VT = MVT::i32;
12176 Zext = DAG.getNode(ISD::ZERO_EXTEND, dl, VT, Op.getOperand(0));
12177 }
12178 unsigned Log2b = Log2_32(VT.getSizeInBits());
12179 SDValue Clz = DAG.getNode(ISD::CTLZ, dl, VT, Zext);
12180 SDValue Scc = DAG.getNode(ISD::SRL, dl, VT, Clz,
12181 DAG.getConstant(Log2b, dl, MVT::i32));
12182 return DAG.getNode(ISD::TRUNCATE, dl, MVT::i32, Scc);
12183 }
12184 return SDValue();
12185}
12186
12188 SDValue Op0 = Node->getOperand(0);
12189 SDValue Op1 = Node->getOperand(1);
12190 EVT VT = Op0.getValueType();
12191 EVT BoolVT = getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
12192 unsigned Opcode = Node->getOpcode();
12193 SDLoc DL(Node);
12194
12195 // If both sign bits are zero, flip UMIN/UMAX <-> SMIN/SMAX if legal.
12196 unsigned AltOpcode = ISD::getOppositeSignednessMinMaxOpcode(Opcode);
12197 if (isOperationLegal(AltOpcode, VT) && DAG.SignBitIsZero(Op0) &&
12198 DAG.SignBitIsZero(Op1))
12199 return DAG.getNode(AltOpcode, DL, VT, Op0, Op1);
12200
12201 // umax(x,1) --> sub(x,cmpeq(x,0)) iff cmp result is allbits
12202 if (Opcode == ISD::UMAX && llvm::isOneOrOneSplat(Op1, true) && BoolVT == VT &&
12204 Op0 = DAG.getFreeze(Op0);
12205 SDValue Zero = DAG.getConstant(0, DL, VT);
12206 return DAG.getNode(ISD::SUB, DL, VT, Op0,
12207 DAG.getSetCC(DL, VT, Op0, Zero, ISD::SETEQ));
12208 }
12209
12210 // umin(x,y) -> sub(x,usubsat(x,y))
12211 // TODO: Missing freeze(Op0)?
12212 if (Opcode == ISD::UMIN && isOperationLegal(ISD::SUB, VT) &&
12214 return DAG.getNode(ISD::SUB, DL, VT, Op0,
12215 DAG.getNode(ISD::USUBSAT, DL, VT, Op0, Op1));
12216 }
12217
12218 // umax(x,y) -> add(x,usubsat(y,x))
12219 // TODO: Missing freeze(Op0)?
12220 if (Opcode == ISD::UMAX && isOperationLegal(ISD::ADD, VT) &&
12222 return DAG.getNode(ISD::ADD, DL, VT, Op0,
12223 DAG.getNode(ISD::USUBSAT, DL, VT, Op1, Op0));
12224 }
12225
12226 // FIXME: Should really try to split the vector in case it's legal on a
12227 // subvector.
12229 return DAG.UnrollVectorOp(Node);
12230
12231 // Attempt to find an existing SETCC node that we can reuse.
12232 // TODO: Do we need a generic doesSETCCNodeExist?
12233 // TODO: Missing freeze(Op0)/freeze(Op1)?
12234 auto buildMinMax = [&](ISD::CondCode PrefCC, ISD::CondCode AltCC,
12235 ISD::CondCode PrefCommuteCC,
12236 ISD::CondCode AltCommuteCC) {
12237 SDVTList BoolVTList = DAG.getVTList(BoolVT);
12238 for (ISD::CondCode CC : {PrefCC, AltCC}) {
12239 if (DAG.doesNodeExist(ISD::SETCC, BoolVTList,
12240 {Op0, Op1, DAG.getCondCode(CC)})) {
12241 SDValue Cond = DAG.getSetCC(DL, BoolVT, Op0, Op1, CC);
12242 return DAG.getSelect(DL, VT, Cond, Op0, Op1);
12243 }
12244 }
12245 for (ISD::CondCode CC : {PrefCommuteCC, AltCommuteCC}) {
12246 if (DAG.doesNodeExist(ISD::SETCC, BoolVTList,
12247 {Op0, Op1, DAG.getCondCode(CC)})) {
12248 SDValue Cond = DAG.getSetCC(DL, BoolVT, Op0, Op1, CC);
12249 return DAG.getSelect(DL, VT, Cond, Op1, Op0);
12250 }
12251 }
12252 SDValue Cond = DAG.getSetCC(DL, BoolVT, Op0, Op1, PrefCC);
12253 return DAG.getSelect(DL, VT, Cond, Op0, Op1);
12254 };
12255
12256 // Expand Y = MAX(A, B) -> Y = (A > B) ? A : B
12257 // -> Y = (A < B) ? B : A
12258 // -> Y = (A >= B) ? A : B
12259 // -> Y = (A <= B) ? B : A
12260 switch (Opcode) {
12261 case ISD::SMAX:
12262 return buildMinMax(ISD::SETGT, ISD::SETGE, ISD::SETLT, ISD::SETLE);
12263 case ISD::SMIN:
12264 return buildMinMax(ISD::SETLT, ISD::SETLE, ISD::SETGT, ISD::SETGE);
12265 case ISD::UMAX:
12266 return buildMinMax(ISD::SETUGT, ISD::SETUGE, ISD::SETULT, ISD::SETULE);
12267 case ISD::UMIN:
12268 return buildMinMax(ISD::SETULT, ISD::SETULE, ISD::SETUGT, ISD::SETUGE);
12269 }
12270
12271 llvm_unreachable("How did we get here?");
12272}
12273
12275 unsigned Opcode = Node->getOpcode();
12276 SDValue LHS = Node->getOperand(0);
12277 SDValue RHS = Node->getOperand(1);
12278 EVT VT = LHS.getValueType();
12279 SDLoc dl(Node);
12280
12281 assert(VT == RHS.getValueType() && "Expected operands to be the same type");
12282 assert(VT.isInteger() && "Expected operands to be integers");
12283
12284 // usub.sat(a, b) -> umax(a, b) - b
12285 if (Opcode == ISD::USUBSAT && isOperationLegal(ISD::UMAX, VT)) {
12286 SDValue Max = DAG.getNode(ISD::UMAX, dl, VT, LHS, RHS);
12287 return DAG.getNode(ISD::SUB, dl, VT, Max, RHS);
12288 }
12289
12290 // usub.sat(a, 1) -> sub(a, zext(a != 0))
12291 // Prefer this on targets without legal/cost-effective overflow-carry nodes.
12292 if (Opcode == ISD::USUBSAT && isOneOrOneSplat(RHS) &&
12294 LHS = DAG.getFreeze(LHS);
12295 SDValue Zero = DAG.getConstant(0, dl, VT);
12296 EVT BoolVT = getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
12297 SDValue IsNonZero = DAG.getSetCC(dl, BoolVT, LHS, Zero, ISD::SETNE);
12298 SDValue Subtrahend = DAG.getBoolExtOrTrunc(IsNonZero, dl, VT, BoolVT);
12299 Subtrahend =
12300 DAG.getNode(ISD::AND, dl, VT, Subtrahend, DAG.getConstant(1, dl, VT));
12301 return DAG.getNode(ISD::SUB, dl, VT, LHS, Subtrahend);
12302 }
12303
12304 // uadd.sat(a, b) -> umin(a, ~b) + b
12305 if (Opcode == ISD::UADDSAT && isOperationLegal(ISD::UMIN, VT)) {
12306 SDValue InvRHS = DAG.getNOT(dl, RHS, VT);
12307 SDValue Min = DAG.getNode(ISD::UMIN, dl, VT, LHS, InvRHS);
12308 return DAG.getNode(ISD::ADD, dl, VT, Min, RHS);
12309 }
12310
12311 unsigned OverflowOp;
12312 switch (Opcode) {
12313 case ISD::SADDSAT:
12314 OverflowOp = ISD::SADDO;
12315 break;
12316 case ISD::UADDSAT:
12317 OverflowOp = ISD::UADDO;
12318 break;
12319 case ISD::SSUBSAT:
12320 OverflowOp = ISD::SSUBO;
12321 break;
12322 case ISD::USUBSAT:
12323 OverflowOp = ISD::USUBO;
12324 break;
12325 default:
12326 llvm_unreachable("Expected method to receive signed or unsigned saturation "
12327 "addition or subtraction node.");
12328 }
12329
12330 // FIXME: Should really try to split the vector in case it's legal on a
12331 // subvector.
12333 return DAG.UnrollVectorOp(Node);
12334
12335 unsigned BitWidth = LHS.getScalarValueSizeInBits();
12336 EVT BoolVT = getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
12337 SDValue Result = DAG.getNode(OverflowOp, dl, DAG.getVTList(VT, BoolVT), LHS, RHS);
12338 SDValue SumDiff = Result.getValue(0);
12339 SDValue Overflow = Result.getValue(1);
12340 SDValue Zero = DAG.getConstant(0, dl, VT);
12341 SDValue AllOnes = DAG.getAllOnesConstant(dl, VT);
12342
12343 if (Opcode == ISD::UADDSAT) {
12345 // (LHS + RHS) | OverflowMask
12346 SDValue OverflowMask = DAG.getSExtOrTrunc(Overflow, dl, VT);
12347 return DAG.getNode(ISD::OR, dl, VT, SumDiff, OverflowMask);
12348 }
12349 // Overflow ? 0xffff.... : (LHS + RHS)
12350 return DAG.getSelect(dl, VT, Overflow, AllOnes, SumDiff);
12351 }
12352
12353 if (Opcode == ISD::USUBSAT) {
12355 // (LHS - RHS) & ~OverflowMask
12356 SDValue OverflowMask = DAG.getSExtOrTrunc(Overflow, dl, VT);
12357 SDValue Not = DAG.getNOT(dl, OverflowMask, VT);
12358 return DAG.getNode(ISD::AND, dl, VT, SumDiff, Not);
12359 }
12360 // Overflow ? 0 : (LHS - RHS)
12361 return DAG.getSelect(dl, VT, Overflow, Zero, SumDiff);
12362 }
12363
12364 assert((Opcode == ISD::SADDSAT || Opcode == ISD::SSUBSAT) &&
12365 "Expected signed saturating add/sub opcode");
12366
12367 const APInt MinVal = APInt::getSignedMinValue(BitWidth);
12368 const APInt MaxVal = APInt::getSignedMaxValue(BitWidth);
12369
12370 KnownBits KnownLHS = DAG.computeKnownBits(LHS);
12371 KnownBits KnownRHS = DAG.computeKnownBits(RHS);
12372
12373 // If either of the operand signs are known, then they are guaranteed to
12374 // only saturate in one direction. If non-negative they will saturate
12375 // towards SIGNED_MAX, if negative they will saturate towards SIGNED_MIN.
12376 //
12377 // In the case of ISD::SSUBSAT, 'x - y' is equivalent to 'x + (-y)', so the
12378 // sign of 'y' has to be flipped.
12379
12380 bool LHSIsNonNegative = KnownLHS.isNonNegative();
12381 bool RHSIsNonNegative =
12382 Opcode == ISD::SADDSAT ? KnownRHS.isNonNegative() : KnownRHS.isNegative();
12383 if (LHSIsNonNegative || RHSIsNonNegative) {
12384 SDValue SatMax = DAG.getConstant(MaxVal, dl, VT);
12385 return DAG.getSelect(dl, VT, Overflow, SatMax, SumDiff);
12386 }
12387
12388 bool LHSIsNegative = KnownLHS.isNegative();
12389 bool RHSIsNegative =
12390 Opcode == ISD::SADDSAT ? KnownRHS.isNegative() : KnownRHS.isNonNegative();
12391 if (LHSIsNegative || RHSIsNegative) {
12392 SDValue SatMin = DAG.getConstant(MinVal, dl, VT);
12393 return DAG.getSelect(dl, VT, Overflow, SatMin, SumDiff);
12394 }
12395
12396 // Overflow ? (SumDiff >> BW) ^ MinVal : SumDiff
12397 SDValue SatMin = DAG.getConstant(MinVal, dl, VT);
12398 SDValue Shift = DAG.getNode(ISD::SRA, dl, VT, SumDiff,
12399 DAG.getConstant(BitWidth - 1, dl, VT));
12400 Result = DAG.getNode(ISD::XOR, dl, VT, Shift, SatMin);
12401 return DAG.getSelect(dl, VT, Overflow, Result, SumDiff);
12402}
12403
12405 unsigned Opcode = Node->getOpcode();
12406 SDValue LHS = Node->getOperand(0);
12407 SDValue RHS = Node->getOperand(1);
12408 EVT VT = LHS.getValueType();
12409 EVT ResVT = Node->getValueType(0);
12410 EVT BoolVT = getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
12411 SDLoc dl(Node);
12412
12413 auto LTPredicate = (Opcode == ISD::UCMP ? ISD::SETULT : ISD::SETLT);
12414 auto GTPredicate = (Opcode == ISD::UCMP ? ISD::SETUGT : ISD::SETGT);
12415 SDValue IsLT = DAG.getSetCC(dl, BoolVT, LHS, RHS, LTPredicate);
12416 SDValue IsGT = DAG.getSetCC(dl, BoolVT, LHS, RHS, GTPredicate);
12417
12418 // We can't perform arithmetic on i1 values. Extending them would
12419 // probably result in worse codegen, so let's just use two selects instead.
12420 // Some targets are also just better off using selects rather than subtraction
12421 // because one of the conditions can be merged with one of the selects.
12422 // And finally, if we don't know the contents of high bits of a boolean value
12423 // we can't perform any arithmetic either.
12425 BoolVT.getScalarSizeInBits() == 1 ||
12427 SDValue SelectZeroOrOne =
12428 DAG.getSelect(dl, ResVT, IsGT, DAG.getConstant(1, dl, ResVT),
12429 DAG.getConstant(0, dl, ResVT));
12430 return DAG.getSelect(dl, ResVT, IsLT, DAG.getAllOnesConstant(dl, ResVT),
12431 SelectZeroOrOne);
12432 }
12433
12435 std::swap(IsGT, IsLT);
12436 return DAG.getSExtOrTrunc(DAG.getNode(ISD::SUB, dl, BoolVT, IsGT, IsLT), dl,
12437 ResVT);
12438}
12439
12441 unsigned Opcode = Node->getOpcode();
12442 bool IsSigned = Opcode == ISD::SSHLSAT;
12443 SDValue LHS = Node->getOperand(0);
12444 SDValue RHS = Node->getOperand(1);
12445 EVT VT = LHS.getValueType();
12446 SDLoc dl(Node);
12447
12448 assert((Node->getOpcode() == ISD::SSHLSAT ||
12449 Node->getOpcode() == ISD::USHLSAT) &&
12450 "Expected a SHLSAT opcode");
12451 assert(VT.isInteger() && "Expected operands to be integers");
12452
12454 return DAG.UnrollVectorOp(Node);
12455
12456 // If LHS != (LHS << RHS) >> RHS, we have overflow and must saturate.
12457
12458 unsigned BW = VT.getScalarSizeInBits();
12459 EVT BoolVT = getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
12460 SDValue Result = DAG.getNode(ISD::SHL, dl, VT, LHS, RHS);
12461 SDValue Orig =
12462 DAG.getNode(IsSigned ? ISD::SRA : ISD::SRL, dl, VT, Result, RHS);
12463
12464 SDValue SatVal;
12465 if (IsSigned) {
12466 SDValue SatMin = DAG.getConstant(APInt::getSignedMinValue(BW), dl, VT);
12467 SDValue SatMax = DAG.getConstant(APInt::getSignedMaxValue(BW), dl, VT);
12468 SDValue Cond =
12469 DAG.getSetCC(dl, BoolVT, LHS, DAG.getConstant(0, dl, VT), ISD::SETLT);
12470 SatVal = DAG.getSelect(dl, VT, Cond, SatMin, SatMax);
12471 } else {
12472 SatVal = DAG.getConstant(APInt::getMaxValue(BW), dl, VT);
12473 }
12474 SDValue Cond = DAG.getSetCC(dl, BoolVT, LHS, Orig, ISD::SETNE);
12475 return DAG.getSelect(dl, VT, Cond, SatVal, Result);
12476}
12477
12479 bool Signed, SDValue &Lo, SDValue &Hi,
12480 SDValue LHS, SDValue RHS,
12481 SDValue HiLHS, SDValue HiRHS) const {
12482 EVT VT = LHS.getValueType();
12483 assert(RHS.getValueType() == VT && "Mismatching operand types");
12484
12485 assert((HiLHS && HiRHS) || (!HiLHS && !HiRHS));
12486 assert((!Signed || !HiLHS) &&
12487 "Signed flag should only be set when HiLHS and RiRHS are null");
12488
12489 // We'll expand the multiplication by brute force because we have no other
12490 // options. This is a trivially-generalized version of the code from
12491 // Hacker's Delight (itself derived from Knuth's Algorithm M from section
12492 // 4.3.1). If Signed is set, we can use arithmetic right shifts to propagate
12493 // sign bits while calculating the Hi half.
12494 unsigned Bits = VT.getScalarSizeInBits();
12495 unsigned HalfBits = Bits / 2;
12496 SDValue Mask = DAG.getConstant(APInt::getLowBitsSet(Bits, HalfBits), dl, VT);
12497 SDValue LL = DAG.getNode(ISD::AND, dl, VT, LHS, Mask);
12498 SDValue RL = DAG.getNode(ISD::AND, dl, VT, RHS, Mask);
12499
12500 SDValue T = DAG.getNode(ISD::MUL, dl, VT, LL, RL);
12501 SDValue TL = DAG.getNode(ISD::AND, dl, VT, T, Mask);
12502
12503 SDValue Shift = DAG.getShiftAmountConstant(HalfBits, VT, dl);
12504 // This is always an unsigned shift.
12505 SDValue TH = DAG.getNode(ISD::SRL, dl, VT, T, Shift);
12506
12507 unsigned ShiftOpc = Signed ? ISD::SRA : ISD::SRL;
12508 SDValue LH = DAG.getNode(ShiftOpc, dl, VT, LHS, Shift);
12509 SDValue RH = DAG.getNode(ShiftOpc, dl, VT, RHS, Shift);
12510
12511 SDValue U =
12512 DAG.getNode(ISD::ADD, dl, VT, DAG.getNode(ISD::MUL, dl, VT, LH, RL), TH);
12513 SDValue UL = DAG.getNode(ISD::AND, dl, VT, U, Mask);
12514 SDValue UH = DAG.getNode(ShiftOpc, dl, VT, U, Shift);
12515
12516 SDValue V =
12517 DAG.getNode(ISD::ADD, dl, VT, DAG.getNode(ISD::MUL, dl, VT, LL, RH), UL);
12518 SDValue VH = DAG.getNode(ShiftOpc, dl, VT, V, Shift);
12519
12520 Lo = DAG.getNode(ISD::ADD, dl, VT, TL,
12521 DAG.getNode(ISD::SHL, dl, VT, V, Shift));
12522
12523 Hi = DAG.getNode(ISD::ADD, dl, VT, DAG.getNode(ISD::MUL, dl, VT, LH, RH),
12524 DAG.getNode(ISD::ADD, dl, VT, UH, VH));
12525
12526 // If HiLHS and HiRHS are set, multiply them by the opposite low part and add
12527 // the products to Hi.
12528 if (HiLHS) {
12529 SDValue RHLL = DAG.getNode(ISD::MUL, dl, VT, HiRHS, LHS);
12530 SDValue RLLH = DAG.getNode(ISD::MUL, dl, VT, RHS, HiLHS);
12531 Hi = DAG.getNode(ISD::ADD, dl, VT, Hi,
12532 DAG.getNode(ISD::ADD, dl, VT, RHLL, RLLH));
12533 }
12534}
12535
12537 bool Signed, const SDValue LHS,
12538 const SDValue RHS, SDValue &Lo,
12539 SDValue &Hi) const {
12540 EVT VT = LHS.getValueType();
12541 assert(RHS.getValueType() == VT && "Mismatching operand types");
12542 EVT WideVT = VT.widenIntegerElementType(*DAG.getContext());
12543 // We can fall back to a libcall with an illegal type for the MUL if we
12544 // have a libcall big enough.
12545 RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL;
12546 if (WideVT == MVT::i16)
12547 LC = RTLIB::MUL_I16;
12548 else if (WideVT == MVT::i32)
12549 LC = RTLIB::MUL_I32;
12550 else if (WideVT == MVT::i64)
12551 LC = RTLIB::MUL_I64;
12552 else if (WideVT == MVT::i128)
12553 LC = RTLIB::MUL_I128;
12554
12555 RTLIB::LibcallImpl LibcallImpl = getLibcallImpl(LC);
12556 if (LibcallImpl == RTLIB::Unsupported) {
12557 forceExpandMultiply(DAG, dl, Signed, Lo, Hi, LHS, RHS);
12558 return;
12559 }
12560
12561 SDValue HiLHS, HiRHS;
12562 if (Signed) {
12563 // The high part is obtained by SRA'ing all but one of the bits of low
12564 // part.
12565 unsigned LoSize = VT.getFixedSizeInBits();
12566 SDValue Shift = DAG.getShiftAmountConstant(LoSize - 1, VT, dl);
12567 HiLHS = DAG.getNode(ISD::SRA, dl, VT, LHS, Shift);
12568 HiRHS = DAG.getNode(ISD::SRA, dl, VT, RHS, Shift);
12569 } else {
12570 HiLHS = DAG.getConstant(0, dl, VT);
12571 HiRHS = DAG.getConstant(0, dl, VT);
12572 }
12573
12574 // Attempt a libcall.
12575 SDValue Ret;
12577 CallOptions.setIsSigned(Signed);
12578 CallOptions.setIsPostTypeLegalization(true);
12580 // Halves of WideVT are packed into registers in different order
12581 // depending on platform endianness. This is usually handled by
12582 // the C calling convention, but we can't defer to it in
12583 // the legalizer.
12584 SDValue Args[] = {LHS, HiLHS, RHS, HiRHS};
12585 Ret = makeLibCall(DAG, LC, WideVT, Args, CallOptions, dl).first;
12586 } else {
12587 SDValue Args[] = {HiLHS, LHS, HiRHS, RHS};
12588 Ret = makeLibCall(DAG, LC, WideVT, Args, CallOptions, dl).first;
12589 }
12591 "Ret value is a collection of constituent nodes holding result.");
12592 if (DAG.getDataLayout().isLittleEndian()) {
12593 // Same as above.
12594 Lo = Ret.getOperand(0);
12595 Hi = Ret.getOperand(1);
12596 } else {
12597 Lo = Ret.getOperand(1);
12598 Hi = Ret.getOperand(0);
12599 }
12600}
12601
12602SDValue
12604 assert((Node->getOpcode() == ISD::SMULFIX ||
12605 Node->getOpcode() == ISD::UMULFIX ||
12606 Node->getOpcode() == ISD::SMULFIXSAT ||
12607 Node->getOpcode() == ISD::UMULFIXSAT) &&
12608 "Expected a fixed point multiplication opcode");
12609
12610 SDLoc dl(Node);
12611 SDValue LHS = Node->getOperand(0);
12612 SDValue RHS = Node->getOperand(1);
12613 EVT VT = LHS.getValueType();
12614 unsigned Scale = Node->getConstantOperandVal(2);
12615 bool Saturating = (Node->getOpcode() == ISD::SMULFIXSAT ||
12616 Node->getOpcode() == ISD::UMULFIXSAT);
12617 bool Signed = (Node->getOpcode() == ISD::SMULFIX ||
12618 Node->getOpcode() == ISD::SMULFIXSAT);
12619 EVT BoolVT = getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
12620 unsigned VTSize = VT.getScalarSizeInBits();
12621
12622 if (!Scale) {
12623 // [us]mul.fix(a, b, 0) -> mul(a, b)
12624 if (!Saturating) {
12626 return DAG.getNode(ISD::MUL, dl, VT, LHS, RHS);
12627 } else if (Signed && isOperationLegalOrCustom(ISD::SMULO, VT)) {
12628 SDValue Result =
12629 DAG.getNode(ISD::SMULO, dl, DAG.getVTList(VT, BoolVT), LHS, RHS);
12630 SDValue Product = Result.getValue(0);
12631 SDValue Overflow = Result.getValue(1);
12632 SDValue Zero = DAG.getConstant(0, dl, VT);
12633
12634 APInt MinVal = APInt::getSignedMinValue(VTSize);
12635 APInt MaxVal = APInt::getSignedMaxValue(VTSize);
12636 SDValue SatMin = DAG.getConstant(MinVal, dl, VT);
12637 SDValue SatMax = DAG.getConstant(MaxVal, dl, VT);
12638 // Xor the inputs, if resulting sign bit is 0 the product will be
12639 // positive, else negative.
12640 SDValue Xor = DAG.getNode(ISD::XOR, dl, VT, LHS, RHS);
12641 SDValue ProdNeg = DAG.getSetCC(dl, BoolVT, Xor, Zero, ISD::SETLT);
12642 Result = DAG.getSelect(dl, VT, ProdNeg, SatMin, SatMax);
12643 return DAG.getSelect(dl, VT, Overflow, Result, Product);
12644 } else if (!Signed && isOperationLegalOrCustom(ISD::UMULO, VT)) {
12645 SDValue Result =
12646 DAG.getNode(ISD::UMULO, dl, DAG.getVTList(VT, BoolVT), LHS, RHS);
12647 SDValue Product = Result.getValue(0);
12648 SDValue Overflow = Result.getValue(1);
12649
12650 APInt MaxVal = APInt::getMaxValue(VTSize);
12651 SDValue SatMax = DAG.getConstant(MaxVal, dl, VT);
12652 return DAG.getSelect(dl, VT, Overflow, SatMax, Product);
12653 }
12654 }
12655
12656 assert(((Signed && Scale < VTSize) || (!Signed && Scale <= VTSize)) &&
12657 "Expected scale to be less than the number of bits if signed or at "
12658 "most the number of bits if unsigned.");
12659 assert(LHS.getValueType() == RHS.getValueType() &&
12660 "Expected both operands to be the same type");
12661
12662 // Select the saturated value when Cond0 <CC> Cond1, keeping it vectorized:
12663 // SELECT_CC is scalarized for vector types, so build SETCC + VSELECT there.
12664 auto getSaturatingSelect = [&](SDValue Cond0, SDValue Cond1, SDValue Sat,
12665 SDValue Val, ISD::CondCode CC) {
12666 if (VT.isVector())
12667 return DAG.getSelect(dl, VT, DAG.getSetCC(dl, BoolVT, Cond0, Cond1, CC),
12668 Sat, Val);
12669 return DAG.getSelectCC(dl, Cond0, Cond1, Sat, Val, CC);
12670 };
12671
12672 // Get the upper and lower bits of the result.
12673 SDValue Lo, Hi;
12674 unsigned LoHiOp = Signed ? ISD::SMUL_LOHI : ISD::UMUL_LOHI;
12675 unsigned HiOp = Signed ? ISD::MULHS : ISD::MULHU;
12676 EVT WideVT = VT.widenIntegerElementType(*DAG.getContext());
12677 if (isOperationLegalOrCustom(LoHiOp, VT)) {
12678 SDValue Result = DAG.getNode(LoHiOp, dl, DAG.getVTList(VT, VT), LHS, RHS);
12679 Lo = Result.getValue(0);
12680 Hi = Result.getValue(1);
12681 } else if (isOperationLegalOrCustom(HiOp, VT)) {
12682 Lo = DAG.getNode(ISD::MUL, dl, VT, LHS, RHS);
12683 Hi = DAG.getNode(HiOp, dl, VT, LHS, RHS);
12684 } else if (isOperationLegalOrCustom(ISD::MUL, WideVT)) {
12685 // Try for a multiplication using a wider type.
12686 unsigned Ext = Signed ? ISD::SIGN_EXTEND : ISD::ZERO_EXTEND;
12687 SDValue LHSExt = DAG.getNode(Ext, dl, WideVT, LHS);
12688 SDValue RHSExt = DAG.getNode(Ext, dl, WideVT, RHS);
12689 SDValue Res = DAG.getNode(ISD::MUL, dl, WideVT, LHSExt, RHSExt);
12690 Lo = DAG.getNode(ISD::TRUNCATE, dl, VT, Res);
12691 SDValue Shifted =
12692 DAG.getNode(ISD::SRA, dl, WideVT, Res,
12693 DAG.getShiftAmountConstant(VTSize, WideVT, dl));
12694 Hi = DAG.getNode(ISD::TRUNCATE, dl, VT, Shifted);
12695 } else if (VT.isVector()) {
12696 return SDValue();
12697 } else {
12698 forceExpandWideMUL(DAG, dl, Signed, LHS, RHS, Lo, Hi);
12699 }
12700
12701 if (Scale == VTSize)
12702 // Result is just the top half since we'd be shifting by the width of the
12703 // operand. Overflow impossible so this works for both UMULFIX and
12704 // UMULFIXSAT.
12705 return Hi;
12706
12707 // The result will need to be shifted right by the scale since both operands
12708 // are scaled. The result is given to us in 2 halves, so we only want part of
12709 // both in the result.
12710 SDValue Result = DAG.getNode(ISD::FSHR, dl, VT, Hi, Lo,
12711 DAG.getShiftAmountConstant(Scale, VT, dl));
12712 if (!Saturating)
12713 return Result;
12714
12715 if (!Signed) {
12716 // Unsigned overflow happened if the upper (VTSize - Scale) bits (of the
12717 // widened multiplication) aren't all zeroes.
12718
12719 // Saturate to max if ((Hi >> Scale) != 0),
12720 // which is the same as if (Hi > ((1 << Scale) - 1))
12721 APInt MaxVal = APInt::getMaxValue(VTSize);
12722 SDValue LowMask =
12723 DAG.getConstant(APInt::getLowBitsSet(VTSize, Scale), dl, VT);
12724 return getSaturatingSelect(Hi, LowMask, DAG.getConstant(MaxVal, dl, VT),
12725 Result, ISD::SETUGT);
12726 }
12727
12728 // Signed overflow happened if the upper (VTSize - Scale + 1) bits (of the
12729 // widened multiplication) aren't all ones or all zeroes.
12730
12731 SDValue SatMin = DAG.getConstant(APInt::getSignedMinValue(VTSize), dl, VT);
12732 SDValue SatMax = DAG.getConstant(APInt::getSignedMaxValue(VTSize), dl, VT);
12733
12734 if (Scale == 0) {
12735 SDValue Sign = DAG.getNode(ISD::SRA, dl, VT, Lo,
12736 DAG.getShiftAmountConstant(VTSize - 1, VT, dl));
12737 SDValue Overflow = DAG.getSetCC(dl, BoolVT, Hi, Sign, ISD::SETNE);
12738 // Saturated to SatMin if wide product is negative, and SatMax if wide
12739 // product is positive ...
12740 SDValue Zero = DAG.getConstant(0, dl, VT);
12741 SDValue ResultIfOverflow =
12742 getSaturatingSelect(Hi, Zero, SatMin, SatMax, ISD::SETLT);
12743 // ... but only if we overflowed.
12744 return DAG.getSelect(dl, VT, Overflow, ResultIfOverflow, Result);
12745 }
12746
12747 // We handled Scale==0 above so all the bits to examine is in Hi.
12748
12749 // Saturate to max if ((Hi >> (Scale - 1)) > 0),
12750 // which is the same as if (Hi > (1 << (Scale - 1)) - 1)
12751 SDValue LowMask =
12752 DAG.getConstant(APInt::getLowBitsSet(VTSize, Scale - 1), dl, VT);
12753 // Saturate to min if (Hi >> (Scale - 1)) < -1),
12754 // which is the same as if (HI < (-1 << (Scale - 1))
12755 SDValue HighMask = DAG.getConstant(
12756 APInt::getHighBitsSet(VTSize, VTSize - Scale + 1), dl, VT);
12757 Result = getSaturatingSelect(Hi, LowMask, SatMax, Result, ISD::SETGT);
12758 Result = getSaturatingSelect(Hi, HighMask, SatMin, Result, ISD::SETLT);
12759 return Result;
12760}
12761
12762SDValue
12764 SDValue LHS, SDValue RHS,
12765 unsigned Scale, SelectionDAG &DAG) const {
12766 assert((Opcode == ISD::SDIVFIX || Opcode == ISD::SDIVFIXSAT ||
12767 Opcode == ISD::UDIVFIX || Opcode == ISD::UDIVFIXSAT) &&
12768 "Expected a fixed point division opcode");
12769
12770 EVT VT = LHS.getValueType();
12771 bool Signed = Opcode == ISD::SDIVFIX || Opcode == ISD::SDIVFIXSAT;
12772 bool Saturating = Opcode == ISD::SDIVFIXSAT || Opcode == ISD::UDIVFIXSAT;
12773 EVT BoolVT = getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
12774
12775 // If there is enough room in the type to upscale the LHS or downscale the
12776 // RHS before the division, we can perform it in this type without having to
12777 // resize. For signed operations, the LHS headroom is the number of
12778 // redundant sign bits, and for unsigned ones it is the number of zeroes.
12779 // The headroom for the RHS is the number of trailing zeroes.
12780 unsigned LHSLead = Signed ? DAG.ComputeNumSignBits(LHS) - 1
12782 unsigned RHSTrail = DAG.computeKnownBits(RHS).countMinTrailingZeros();
12783
12784 // For signed saturating operations, we need to be able to detect true integer
12785 // division overflow; that is, when you have MIN / -EPS. However, this
12786 // is undefined behavior and if we emit divisions that could take such
12787 // values it may cause undesired behavior (arithmetic exceptions on x86, for
12788 // example).
12789 // Avoid this by requiring an extra bit so that we never get this case.
12790 // FIXME: This is a bit unfortunate as it means that for an 8-bit 7-scale
12791 // signed saturating division, we need to emit a whopping 32-bit division.
12792 if (LHSLead + RHSTrail < Scale + (unsigned)(Saturating && Signed))
12793 return SDValue();
12794
12795 unsigned LHSShift = std::min(LHSLead, Scale);
12796 unsigned RHSShift = Scale - LHSShift;
12797
12798 // At this point, we know that if we shift the LHS up by LHSShift and the
12799 // RHS down by RHSShift, we can emit a regular division with a final scaling
12800 // factor of Scale.
12801
12802 if (LHSShift)
12803 LHS = DAG.getNode(ISD::SHL, dl, VT, LHS,
12804 DAG.getShiftAmountConstant(LHSShift, VT, dl));
12805 if (RHSShift)
12806 RHS = DAG.getNode(Signed ? ISD::SRA : ISD::SRL, dl, VT, RHS,
12807 DAG.getShiftAmountConstant(RHSShift, VT, dl));
12808
12809 SDValue Quot;
12810 if (Signed) {
12811 // For signed operations, if the resulting quotient is negative and the
12812 // remainder is nonzero, subtract 1 from the quotient to round towards
12813 // negative infinity.
12814 SDValue Rem;
12815 // FIXME: Ideally we would always produce an SDIVREM here, but if the
12816 // type isn't legal, SDIVREM cannot be expanded. There is no reason why
12817 // we couldn't just form a libcall, but the type legalizer doesn't do it.
12818 if (isTypeLegal(VT) &&
12820 Quot = DAG.getNode(ISD::SDIVREM, dl,
12821 DAG.getVTList(VT, VT),
12822 LHS, RHS);
12823 Rem = Quot.getValue(1);
12824 Quot = Quot.getValue(0);
12825 } else {
12826 Quot = DAG.getNode(ISD::SDIV, dl, VT,
12827 LHS, RHS);
12828 Rem = DAG.getNode(ISD::SREM, dl, VT,
12829 LHS, RHS);
12830 }
12831 SDValue Zero = DAG.getConstant(0, dl, VT);
12832 SDValue RemNonZero = DAG.getSetCC(dl, BoolVT, Rem, Zero, ISD::SETNE);
12833 SDValue LHSNeg = DAG.getSetCC(dl, BoolVT, LHS, Zero, ISD::SETLT);
12834 SDValue RHSNeg = DAG.getSetCC(dl, BoolVT, RHS, Zero, ISD::SETLT);
12835 SDValue QuotNeg = DAG.getNode(ISD::XOR, dl, BoolVT, LHSNeg, RHSNeg);
12836 SDValue Sub1 = DAG.getNode(ISD::SUB, dl, VT, Quot,
12837 DAG.getConstant(1, dl, VT));
12838 Quot = DAG.getSelect(dl, VT,
12839 DAG.getNode(ISD::AND, dl, BoolVT, RemNonZero, QuotNeg),
12840 Sub1, Quot);
12841 } else
12842 Quot = DAG.getNode(ISD::UDIV, dl, VT,
12843 LHS, RHS);
12844
12845 return Quot;
12846}
12847
12849 SDNode *Node, SDValue &Result, SDValue &Overflow, SelectionDAG &DAG) const {
12850 SDLoc dl(Node);
12851 SDValue LHS = Node->getOperand(0);
12852 SDValue RHS = Node->getOperand(1);
12853 bool IsAdd = Node->getOpcode() == ISD::UADDO;
12854
12855 // If UADDO_CARRY/SUBO_CARRY is legal, use that instead.
12856 unsigned OpcCarry = IsAdd ? ISD::UADDO_CARRY : ISD::USUBO_CARRY;
12857 if (isOperationLegalOrCustom(OpcCarry, Node->getValueType(0))) {
12858 SDValue CarryIn = DAG.getConstant(0, dl, Node->getValueType(1));
12859 SDValue NodeCarry = DAG.getNode(OpcCarry, dl, Node->getVTList(),
12860 { LHS, RHS, CarryIn });
12861 Result = SDValue(NodeCarry.getNode(), 0);
12862 Overflow = SDValue(NodeCarry.getNode(), 1);
12863 return;
12864 }
12865
12866 Result = DAG.getNode(IsAdd ? ISD::ADD : ISD::SUB, dl,
12867 LHS.getValueType(), LHS, RHS);
12868
12869 EVT ResultType = Node->getValueType(1);
12870 EVT SetCCType = getSetCCResultType(
12871 DAG.getDataLayout(), *DAG.getContext(), Node->getValueType(0));
12872 SDValue SetCC;
12873 if (IsAdd && isOneConstant(RHS)) {
12874 // Special case: uaddo X, 1 overflowed if X+1 is 0. This potential reduces
12875 // the live range of X. We assume comparing with 0 is cheap.
12876 // The general case (X + C) < C is not necessarily beneficial. Although we
12877 // reduce the live range of X, we may introduce the materialization of
12878 // constant C.
12879 SetCC =
12880 DAG.getSetCC(dl, SetCCType, Result,
12881 DAG.getConstant(0, dl, Node->getValueType(0)), ISD::SETEQ);
12882 } else if (IsAdd && isAllOnesConstant(RHS)) {
12883 // Special case: uaddo X, -1 overflows if X != 0.
12884 SetCC =
12885 DAG.getSetCC(dl, SetCCType, LHS,
12886 DAG.getConstant(0, dl, Node->getValueType(0)), ISD::SETNE);
12887 } else {
12888 ISD::CondCode CC = IsAdd ? ISD::SETULT : ISD::SETUGT;
12889 SetCC = DAG.getSetCC(dl, SetCCType, Result, LHS, CC);
12890 }
12891 Overflow = DAG.getBoolExtOrTrunc(SetCC, dl, ResultType, ResultType);
12892}
12893
12895 SDNode *Node, SDValue &Result, SDValue &Overflow, SelectionDAG &DAG) const {
12896 SDLoc dl(Node);
12897 SDValue LHS = Node->getOperand(0);
12898 SDValue RHS = Node->getOperand(1);
12899 bool IsAdd = Node->getOpcode() == ISD::SADDO;
12900
12901 Result = DAG.getNode(IsAdd ? ISD::ADD : ISD::SUB, dl,
12902 LHS.getValueType(), LHS, RHS);
12903
12904 EVT ResultType = Node->getValueType(1);
12905 EVT OType = getSetCCResultType(
12906 DAG.getDataLayout(), *DAG.getContext(), Node->getValueType(0));
12907
12908 // If SADDSAT/SSUBSAT is legal, compare results to detect overflow.
12909 unsigned OpcSat = IsAdd ? ISD::SADDSAT : ISD::SSUBSAT;
12910 if (isOperationLegal(OpcSat, LHS.getValueType())) {
12911 SDValue Sat = DAG.getNode(OpcSat, dl, LHS.getValueType(), LHS, RHS);
12912 SDValue SetCC = DAG.getSetCC(dl, OType, Result, Sat, ISD::SETNE);
12913 Overflow = DAG.getBoolExtOrTrunc(SetCC, dl, ResultType, ResultType);
12914 return;
12915 }
12916
12917 SDValue Zero = DAG.getConstant(0, dl, LHS.getValueType());
12918
12919 if (IsAdd) {
12920 // For an addition, the result should be less than one of the operands (LHS)
12921 // if and only if the other operand (RHS) is negative, otherwise there will
12922 // be overflow.
12923 SDValue ResultLowerThanLHS =
12924 DAG.getSetCC(dl, OType, Result, LHS, ISD::SETLT);
12925 SDValue RHSNegative = DAG.getSetCC(dl, OType, RHS, Zero, ISD::SETLT);
12926 Overflow = DAG.getBoolExtOrTrunc(
12927 DAG.getNode(ISD::XOR, dl, OType, RHSNegative, ResultLowerThanLHS), dl,
12928 ResultType, ResultType);
12929 } else {
12930 // For subtraction, overflow occurs when the signed comparison of operands
12931 // doesn't match the sign of the result.
12932 SDValue LHSLessThanRHS = DAG.getSetCC(dl, OType, LHS, RHS, ISD::SETLT);
12933 SDValue ResultNegative = DAG.getSetCC(dl, OType, Result, Zero, ISD::SETLT);
12934 Overflow = DAG.getBoolExtOrTrunc(
12935 DAG.getNode(ISD::XOR, dl, OType, LHSLessThanRHS, ResultNegative), dl,
12936 ResultType, ResultType);
12937 }
12938}
12939
12941 SDValue &Overflow, SelectionDAG &DAG) const {
12942 SDLoc dl(Node);
12943 EVT VT = Node->getValueType(0);
12944 EVT SetCCVT = getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
12945 SDValue LHS = Node->getOperand(0);
12946 SDValue RHS = Node->getOperand(1);
12947 bool isSigned = Node->getOpcode() == ISD::SMULO;
12948
12949 // For power-of-two multiplications we can use a simpler shift expansion.
12950 if (ConstantSDNode *RHSC = isConstOrConstSplat(RHS)) {
12951 const APInt &C = RHSC->getAPIntValue();
12952 // mulo(X, 1 << S) -> { X << S, (X << S) >> S != X }
12953 if (C.isPowerOf2()) {
12954 // smulo(x, signed_min) is same as umulo(x, signed_min).
12955 bool UseArithShift = isSigned && !C.isMinSignedValue();
12956 SDValue ShiftAmt = DAG.getShiftAmountConstant(C.logBase2(), VT, dl);
12957 Result = DAG.getNode(ISD::SHL, dl, VT, LHS, ShiftAmt);
12958 Overflow = DAG.getSetCC(dl, SetCCVT,
12959 DAG.getNode(UseArithShift ? ISD::SRA : ISD::SRL,
12960 dl, VT, Result, ShiftAmt),
12961 LHS, ISD::SETNE);
12962 return true;
12963 }
12964 }
12965
12966 SDValue BottomHalf;
12967 SDValue TopHalf;
12968 EVT WideVT = VT.widenIntegerElementType(*DAG.getContext());
12969
12970 static const unsigned Ops[2][3] =
12973 if (isOperationLegalOrCustom(Ops[isSigned][0], VT)) {
12974 BottomHalf = DAG.getNode(Ops[isSigned][0], dl, DAG.getVTList(VT, VT), LHS,
12975 RHS);
12976 TopHalf = BottomHalf.getValue(1);
12977 } else if (isOperationLegalOrCustom(Ops[isSigned][1], VT)) {
12978 BottomHalf = DAG.getNode(ISD::MUL, dl, VT, LHS, RHS);
12979 TopHalf = DAG.getNode(Ops[isSigned][1], dl, VT, LHS, RHS);
12980 } else if (isTypeLegal(WideVT)) {
12981 LHS = DAG.getNode(Ops[isSigned][2], dl, WideVT, LHS);
12982 RHS = DAG.getNode(Ops[isSigned][2], dl, WideVT, RHS);
12983 SDValue Mul = DAG.getNode(ISD::MUL, dl, WideVT, LHS, RHS);
12984 BottomHalf = DAG.getNode(ISD::TRUNCATE, dl, VT, Mul);
12985 SDValue ShiftAmt =
12986 DAG.getShiftAmountConstant(VT.getScalarSizeInBits(), WideVT, dl);
12987 TopHalf = DAG.getNode(ISD::TRUNCATE, dl, VT,
12988 DAG.getNode(ISD::SRL, dl, WideVT, Mul, ShiftAmt));
12989 } else {
12990 if (VT.isVector())
12991 return false;
12992
12993 forceExpandWideMUL(DAG, dl, isSigned, LHS, RHS, BottomHalf, TopHalf);
12994 }
12995
12996 Result = BottomHalf;
12997 if (isSigned) {
12998 SDValue ShiftAmt = DAG.getShiftAmountConstant(
12999 VT.getScalarSizeInBits() - 1, BottomHalf.getValueType(), dl);
13000 SDValue Sign = DAG.getNode(ISD::SRA, dl, VT, BottomHalf, ShiftAmt);
13001 Overflow = DAG.getSetCC(dl, SetCCVT, TopHalf, Sign, ISD::SETNE);
13002 } else {
13003 Overflow = DAG.getSetCC(dl, SetCCVT, TopHalf,
13004 DAG.getConstant(0, dl, VT), ISD::SETNE);
13005 }
13006
13007 // Truncate the result if SetCC returns a larger type than needed.
13008 EVT RType = Node->getValueType(1);
13009 if (RType.bitsLT(Overflow.getValueType()))
13010 Overflow = DAG.getNode(ISD::TRUNCATE, dl, RType, Overflow);
13011
13012 assert(RType.getSizeInBits() == Overflow.getValueSizeInBits() &&
13013 "Unexpected result type for S/UMULO legalization");
13014 return true;
13015}
13016
13018 SDLoc dl(Node);
13019 ISD::NodeType BaseOpcode = ISD::getVecReduceBaseOpcode(Node->getOpcode());
13020 SDValue Op = Node->getOperand(0);
13021 SDNodeFlags Flags = Node->getFlags();
13022 EVT VT = Op.getValueType();
13023
13024 // Try to use a shuffle reduction for power of two vectors.
13025 if (VT.isPow2VectorType()) {
13026 // See if the reduction opcode is safe to use with widened types.
13027 bool WidenSrc = false;
13028 switch (Node->getOpcode()) {
13031 case ISD::VECREDUCE_ADD:
13032 case ISD::VECREDUCE_MUL:
13033 case ISD::VECREDUCE_AND:
13034 case ISD::VECREDUCE_OR:
13035 case ISD::VECREDUCE_XOR:
13040 WidenSrc = VT.isFixedLengthVector();
13041 break;
13042 }
13043
13045 EVT HalfVT = VT.getHalfNumVectorElementsVT(*DAG.getContext());
13046 if (!isOperationLegalOrCustom(BaseOpcode, HalfVT)) {
13047 if (WidenSrc && Op.getOpcode() != ISD::BUILD_VECTOR) {
13048 // Attempt to widen the source vectors to a legal op.
13049 EVT WideVT = getTypeToTransformTo(*DAG.getContext(), HalfVT);
13050 if (WideVT.isVector() &&
13051 WideVT.getScalarType() == HalfVT.getScalarType() &&
13052 WideVT.getVectorNumElements() >= HalfVT.getVectorNumElements() &&
13053 isOperationLegalOrCustom(BaseOpcode, WideVT)) {
13054 SDValue Lo, Hi;
13055 std::tie(Lo, Hi) = DAG.SplitVector(Op, dl);
13056 Lo = DAG.getInsertSubvector(dl, DAG.getPOISON(WideVT), Lo, 0);
13057 Hi = DAG.getInsertSubvector(dl, DAG.getPOISON(WideVT), Hi, 0);
13058 Op = DAG.getNode(BaseOpcode, dl, WideVT, Lo, Hi, Flags);
13059 Op = DAG.getExtractSubvector(dl, HalfVT, Op, 0);
13060 VT = HalfVT;
13061 continue;
13062 }
13063 }
13064 break;
13065 }
13066
13067 SDValue Lo, Hi;
13068 std::tie(Lo, Hi) = DAG.SplitVector(Op, dl);
13069 Op = DAG.getNode(BaseOpcode, dl, HalfVT, Lo, Hi, Flags);
13070 VT = HalfVT;
13071
13072 // Stop if splitting is enough to make the reduction legal.
13073 if (isOperationLegalOrCustom(Node->getOpcode(), HalfVT))
13074 return DAG.getNode(Node->getOpcode(), dl, Node->getValueType(0), Op,
13075 Flags);
13076 }
13077 }
13078
13079 if (VT.isScalableVector())
13081 "Expanding reductions for scalable vectors is undefined.");
13082
13083 EVT EltVT = VT.getVectorElementType();
13084 unsigned NumElts = VT.getVectorNumElements();
13085
13087 DAG.ExtractVectorElements(Op, Ops, 0, NumElts);
13088
13089 SDValue Res = Ops[0];
13090 for (unsigned i = 1; i < NumElts; i++)
13091 Res = DAG.getNode(BaseOpcode, dl, EltVT, Res, Ops[i], Flags);
13092
13093 // Result type may be wider than element type.
13094 if (EltVT != Node->getValueType(0))
13095 Res = DAG.getNode(ISD::ANY_EXTEND, dl, Node->getValueType(0), Res);
13096 return Res;
13097}
13098
13100 SDLoc dl(Node);
13101 SDValue AccOp = Node->getOperand(0);
13102 SDValue VecOp = Node->getOperand(1);
13103 SDNodeFlags Flags = Node->getFlags();
13104
13105 EVT VT = VecOp.getValueType();
13106 EVT EltVT = VT.getVectorElementType();
13107
13108 if (VT.isScalableVector())
13110 "Expanding reductions for scalable vectors is undefined.");
13111
13112 unsigned NumElts = VT.getVectorNumElements();
13113
13115 DAG.ExtractVectorElements(VecOp, Ops, 0, NumElts);
13116
13117 unsigned BaseOpcode = ISD::getVecReduceBaseOpcode(Node->getOpcode());
13118
13119 SDValue Res = AccOp;
13120 for (unsigned i = 0; i < NumElts; i++)
13121 Res = DAG.getNode(BaseOpcode, dl, EltVT, Res, Ops[i], Flags);
13122
13123 return Res;
13124}
13125
13127 SelectionDAG &DAG) const {
13128 EVT VT = Node->getValueType(0);
13129 SDLoc dl(Node);
13130 bool isSigned = Node->getOpcode() == ISD::SREM;
13131 unsigned DivOpc = isSigned ? ISD::SDIV : ISD::UDIV;
13132 unsigned DivRemOpc = isSigned ? ISD::SDIVREM : ISD::UDIVREM;
13133 SDValue Dividend = Node->getOperand(0);
13134 SDValue Divisor = Node->getOperand(1);
13135 if (isOperationLegalOrCustom(DivRemOpc, VT)) {
13136 SDVTList VTs = DAG.getVTList(VT, VT);
13137 Result = DAG.getNode(DivRemOpc, dl, VTs, Dividend, Divisor).getValue(1);
13138 return true;
13139 }
13140 if (isOperationLegalOrCustom(DivOpc, VT)) {
13141 // X % Y -> X-X/Y*Y
13142 SDValue Divide = DAG.getNode(DivOpc, dl, VT, Dividend, Divisor);
13143 SDValue Mul = DAG.getNode(ISD::MUL, dl, VT, Divide, Divisor);
13144 Result = DAG.getNode(ISD::SUB, dl, VT, Dividend, Mul);
13145 return true;
13146 }
13147 return false;
13148}
13149
13151 SelectionDAG &DAG) const {
13152 bool IsSigned = Node->getOpcode() == ISD::FP_TO_SINT_SAT;
13153 SDLoc dl(SDValue(Node, 0));
13154 SDValue Src = Node->getOperand(0);
13155
13156 // DstVT is the result type, while SatVT is the size to which we saturate
13157 EVT SrcVT = Src.getValueType();
13158 EVT DstVT = Node->getValueType(0);
13159
13160 EVT SatVT = cast<VTSDNode>(Node->getOperand(1))->getVT();
13161 unsigned SatWidth = SatVT.getScalarSizeInBits();
13162 unsigned DstWidth = DstVT.getScalarSizeInBits();
13163 assert(SatWidth <= DstWidth &&
13164 "Expected saturation width smaller than result width");
13165
13166 // Determine minimum and maximum integer values and their corresponding
13167 // floating-point values.
13168 APInt MinInt, MaxInt;
13169 if (IsSigned) {
13170 MinInt = APInt::getSignedMinValue(SatWidth).sext(DstWidth);
13171 MaxInt = APInt::getSignedMaxValue(SatWidth).sext(DstWidth);
13172 } else {
13173 MinInt = APInt::getMinValue(SatWidth).zext(DstWidth);
13174 MaxInt = APInt::getMaxValue(SatWidth).zext(DstWidth);
13175 }
13176
13177 // We cannot risk emitting FP_TO_XINT nodes with a source VT of [b]f16, as
13178 // libcall emission cannot handle this. Large result types will fail.
13179 if (SrcVT == MVT::f16 || SrcVT == MVT::bf16) {
13180 Src = DAG.getNode(ISD::FP_EXTEND, dl, MVT::f32, Src);
13181 SrcVT = Src.getValueType();
13182 }
13183
13184 const fltSemantics &Sem = SrcVT.getFltSemantics();
13185 APFloat MinFloat(Sem);
13186 APFloat MaxFloat(Sem);
13187
13188 APFloat::opStatus MinStatus =
13189 MinFloat.convertFromAPInt(MinInt, IsSigned, APFloat::rmTowardZero);
13190 APFloat::opStatus MaxStatus =
13191 MaxFloat.convertFromAPInt(MaxInt, IsSigned, APFloat::rmTowardZero);
13192 bool AreExactFloatBounds = !(MinStatus & APFloat::opStatus::opInexact) &&
13193 !(MaxStatus & APFloat::opStatus::opInexact);
13194
13195 SDValue MinFloatNode = DAG.getConstantFP(MinFloat, dl, SrcVT);
13196 SDValue MaxFloatNode = DAG.getConstantFP(MaxFloat, dl, SrcVT);
13197
13198 // If the integer bounds are exactly representable as floats and min/max are
13199 // legal, emit a min+max+fptoi sequence. Otherwise we have to use a sequence
13200 // of comparisons and selects.
13201 auto EmitMinMax = [&](unsigned MinOpcode, unsigned MaxOpcode,
13202 bool MayPropagateNaN) {
13203 bool MinMaxLegal = isOperationLegalOrCustom(MinOpcode, SrcVT) &&
13204 isOperationLegalOrCustom(MaxOpcode, SrcVT);
13205 if (!MinMaxLegal)
13206 return SDValue();
13207
13208 SDValue Clamped = Src;
13209
13210 // Clamp Src by MinFloat from below. If !MayPropagateNaN and Src is NaN
13211 // then the result is MinFloat.
13212 Clamped = DAG.getNode(MaxOpcode, dl, SrcVT, Clamped, MinFloatNode);
13213 // Clamp by MaxFloat from above. If !MayPropagateNaN then NaN cannot occur.
13214 Clamped = DAG.getNode(MinOpcode, dl, SrcVT, Clamped, MaxFloatNode);
13215 // Convert clamped value to integer.
13216 SDValue FpToInt = DAG.getNode(IsSigned ? ISD::FP_TO_SINT : ISD::FP_TO_UINT,
13217 dl, DstVT, Clamped);
13218
13219 // If !MayPropagateNan and the conversion is unsigned case we're done,
13220 // because we mapped NaN to MinFloat, which will cast to zero.
13221 if (!MayPropagateNaN && !IsSigned)
13222 return FpToInt;
13223
13224 // Otherwise, select 0 if Src is NaN.
13225 SDValue ZeroInt = DAG.getConstant(0, dl, DstVT);
13226 EVT SetCCVT =
13227 getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), SrcVT);
13228 SDValue IsNan = DAG.getSetCC(dl, SetCCVT, Src, Src, ISD::CondCode::SETUO);
13229 return DAG.getSelect(dl, DstVT, IsNan, ZeroInt, FpToInt);
13230 };
13231 if (AreExactFloatBounds) {
13232 if (SDValue Res = EmitMinMax(ISD::FMINIMUMNUM, ISD::FMAXIMUMNUM,
13233 /*MayPropagateNaN=*/false))
13234 return Res;
13235 // These may propagate NaN for sNaN operands.
13236 if (SDValue Res =
13237 EmitMinMax(ISD::FMINNUM, ISD::FMAXNUM, /*MayPropagateNaN=*/true))
13238 return Res;
13239 // These always propagate NaN.
13240 if (SDValue Res =
13241 EmitMinMax(ISD::FMINIMUM, ISD::FMAXIMUM, /*MayPropagateNaN=*/true))
13242 return Res;
13243 }
13244
13245 SDValue MinIntNode = DAG.getConstant(MinInt, dl, DstVT);
13246 SDValue MaxIntNode = DAG.getConstant(MaxInt, dl, DstVT);
13247
13248 // Result of direct conversion. The assumption here is that the operation is
13249 // non-trapping and it's fine to apply it to an out-of-range value if we
13250 // select it away later.
13251 SDValue FpToInt =
13252 DAG.getNode(IsSigned ? ISD::FP_TO_SINT : ISD::FP_TO_UINT, dl, DstVT, Src);
13253
13254 SDValue Select = FpToInt;
13255
13256 EVT SetCCVT =
13257 getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), SrcVT);
13258
13259 // If Src ULT MinFloat, select MinInt. In particular, this also selects
13260 // MinInt if Src is NaN.
13261 SDValue ULT = DAG.getSetCC(dl, SetCCVT, Src, MinFloatNode, ISD::SETULT);
13262 Select = DAG.getSelect(dl, DstVT, ULT, MinIntNode, Select);
13263 // If Src OGT MaxFloat, select MaxInt.
13264 SDValue OGT = DAG.getSetCC(dl, SetCCVT, Src, MaxFloatNode, ISD::SETOGT);
13265 Select = DAG.getSelect(dl, DstVT, OGT, MaxIntNode, Select);
13266
13267 // In the unsigned case we are done, because we mapped NaN to MinInt, which
13268 // is already zero.
13269 if (!IsSigned)
13270 return Select;
13271
13272 // Otherwise, select 0 if Src is NaN.
13273 SDValue ZeroInt = DAG.getConstant(0, dl, DstVT);
13274 SDValue IsNan = DAG.getSetCC(dl, SetCCVT, Src, Src, ISD::CondCode::SETUO);
13275 return DAG.getSelect(dl, DstVT, IsNan, ZeroInt, Select);
13276}
13277
13279 const SDLoc &dl,
13280 SelectionDAG &DAG) const {
13281 EVT OperandVT = Op.getValueType();
13282 if (OperandVT.getScalarType() == ResultVT.getScalarType())
13283 return Op;
13284 EVT ResultIntVT = ResultVT.changeTypeToInteger();
13285 // We are rounding binary64/binary128 -> binary32 -> bfloat16. This
13286 // can induce double-rounding which may alter the results. We can
13287 // correct for this using a trick explained in: Boldo, Sylvie, and
13288 // Guillaume Melquiond. "When double rounding is odd." 17th IMACS
13289 // World Congress. 2005.
13290 SDValue Narrow = DAG.getFPExtendOrRound(Op, dl, ResultVT);
13291 SDValue NarrowAsWide = DAG.getFPExtendOrRound(Narrow, dl, OperandVT);
13292
13293 // We can keep the narrow value as-is if narrowing was exact (no
13294 // rounding error), the wide value was NaN (the narrow value is also
13295 // NaN and should be preserved) or if we rounded to the odd value.
13296 SDValue NarrowBits = DAG.getNode(ISD::BITCAST, dl, ResultIntVT, Narrow);
13297 SDValue One = DAG.getConstant(1, dl, ResultIntVT);
13298 SDValue NegativeOne = DAG.getAllOnesConstant(dl, ResultIntVT);
13299 SDValue And = DAG.getNode(ISD::AND, dl, ResultIntVT, NarrowBits, One);
13300 EVT ResultIntVTCCVT = getSetCCResultType(
13301 DAG.getDataLayout(), *DAG.getContext(), And.getValueType());
13302 SDValue Zero = DAG.getConstant(0, dl, ResultIntVT);
13303 // The result is already odd so we don't need to do anything.
13304 SDValue AlreadyOdd = DAG.getSetCC(dl, ResultIntVTCCVT, And, Zero, ISD::SETNE);
13305
13306 EVT WideSetCCVT = getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(),
13307 Op.getValueType());
13308 // We keep results which are exact, odd or NaN.
13309 SDValue KeepNarrow =
13310 DAG.getSetCC(dl, WideSetCCVT, Op, NarrowAsWide, ISD::SETUEQ);
13311 KeepNarrow = DAG.getNode(ISD::OR, dl, WideSetCCVT, KeepNarrow, AlreadyOdd);
13312 // We morally performed a round-down if AbsNarrow is smaller than
13313 // AbsWide.
13314 SDValue AbsWide = DAG.getNode(ISD::FABS, dl, OperandVT, Op);
13315 SDValue AbsNarrowAsWide = DAG.getNode(ISD::FABS, dl, OperandVT, NarrowAsWide);
13316 SDValue NarrowIsRd =
13317 DAG.getSetCC(dl, WideSetCCVT, AbsWide, AbsNarrowAsWide, ISD::SETOGT);
13318 // If the narrow value is odd or exact, pick it.
13319 // Otherwise, narrow is even and corresponds to either the rounded-up
13320 // or rounded-down value. If narrow is the rounded-down value, we want
13321 // the rounded-up value as it will be odd.
13322 SDValue Adjust = DAG.getSelect(dl, ResultIntVT, NarrowIsRd, One, NegativeOne);
13323 SDValue Adjusted = DAG.getNode(ISD::ADD, dl, ResultIntVT, NarrowBits, Adjust);
13324 Op = DAG.getSelect(dl, ResultIntVT, KeepNarrow, NarrowBits, Adjusted);
13325 return DAG.getNode(ISD::BITCAST, dl, ResultVT, Op);
13326}
13327
13329 assert(Node->getOpcode() == ISD::FP_ROUND && "Unexpected opcode!");
13330 SDValue Op = Node->getOperand(0);
13331 EVT VT = Node->getValueType(0);
13332 SDLoc dl(Node);
13333 if (VT.getScalarType() == MVT::bf16) {
13334 if (Node->getConstantOperandVal(1) == 1) {
13335 return DAG.getNode(ISD::FP_TO_BF16, dl, VT, Node->getOperand(0));
13336 }
13337 EVT OperandVT = Op.getValueType();
13338 SDValue IsNaN = DAG.getSetCC(
13339 dl,
13340 getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), OperandVT),
13341 Op, Op, ISD::SETUO);
13342
13343 // We are rounding binary64/binary128 -> binary32 -> bfloat16. This
13344 // can induce double-rounding which may alter the results. We can
13345 // correct for this using a trick explained in: Boldo, Sylvie, and
13346 // Guillaume Melquiond. "When double rounding is odd." 17th IMACS
13347 // World Congress. 2005.
13348 EVT F32 = VT.changeElementType(*DAG.getContext(), MVT::f32);
13349 EVT I32 = F32.changeTypeToInteger();
13350 Op = expandRoundInexactToOdd(F32, Op, dl, DAG);
13351 Op = DAG.getNode(ISD::BITCAST, dl, I32, Op);
13352
13353 // Conversions should set NaN's quiet bit. This also prevents NaNs from
13354 // turning into infinities.
13355 SDValue NaN =
13356 DAG.getNode(ISD::OR, dl, I32, Op, DAG.getConstant(0x400000, dl, I32));
13357
13358 // Factor in the contribution of the low 16 bits.
13359 SDValue One = DAG.getConstant(1, dl, I32);
13360 SDValue Lsb = DAG.getNode(ISD::SRL, dl, I32, Op,
13361 DAG.getShiftAmountConstant(16, I32, dl));
13362 Lsb = DAG.getNode(ISD::AND, dl, I32, Lsb, One);
13363 SDValue RoundingBias =
13364 DAG.getNode(ISD::ADD, dl, I32, Lsb, DAG.getConstant(0x7fff, dl, I32));
13365 SDValue Add = DAG.getNode(ISD::ADD, dl, I32, Op, RoundingBias);
13366
13367 // Don't round if we had a NaN, we don't want to turn 0x7fffffff into
13368 // 0x80000000.
13369 Op = DAG.getSelect(dl, I32, IsNaN, NaN, Add);
13370
13371 // Now that we have rounded, shift the bits into position.
13372 Op = DAG.getNode(ISD::SRL, dl, I32, Op,
13373 DAG.getShiftAmountConstant(16, I32, dl));
13374 EVT I16 = I32.changeElementType(*DAG.getContext(), MVT::i16);
13375 Op = DAG.getNode(ISD::TRUNCATE, dl, I16, Op);
13376 return DAG.getNode(ISD::BITCAST, dl, VT, Op);
13377 }
13378 return SDValue();
13379}
13380
13382 SelectionDAG &DAG) const {
13383 assert((Node->getOpcode() == ISD::VECTOR_SPLICE_LEFT ||
13384 Node->getOpcode() == ISD::VECTOR_SPLICE_RIGHT) &&
13385 "Unexpected opcode!");
13386 assert((Node->getValueType(0).isScalableVector() ||
13387 !isa<ConstantSDNode>(Node->getOperand(2))) &&
13388 "Fixed length vector types with constant offsets expected to use "
13389 "SHUFFLE_VECTOR!");
13390
13391 EVT VT = Node->getValueType(0);
13392 SDValue V1 = Node->getOperand(0);
13393 SDValue V2 = Node->getOperand(1);
13394 SDValue Offset = Node->getOperand(2);
13395 SDLoc DL(Node);
13396
13397 // Expand through memory thusly:
13398 // Alloca CONCAT_VECTORS_TYPES(V1, V2) Ptr
13399 // Store V1, Ptr
13400 // Store V2, Ptr + sizeof(V1)
13401 // if (VECTOR_SPLICE_LEFT)
13402 // Ptr = Ptr + (Offset * sizeof(VT.Elt))
13403 // else
13404 // Ptr = Ptr + sizeof(V1) - (Offset * size(VT.Elt))
13405 // Res = Load Ptr
13406
13407 Align Alignment = DAG.getReducedAlign(VT, /*UseABI=*/false);
13408
13410 VT.getVectorElementCount() * 2);
13411 SDValue StackPtr = DAG.CreateStackTemporary(MemVT.getStoreSize(), Alignment);
13412 EVT PtrVT = StackPtr.getValueType();
13413 auto &MF = DAG.getMachineFunction();
13414 auto FrameIndex = cast<FrameIndexSDNode>(StackPtr.getNode())->getIndex();
13415 auto PtrInfo = MachinePointerInfo::getFixedStack(MF, FrameIndex);
13416
13417 // Store the lo part of CONCAT_VECTORS(V1, V2)
13418 SDValue StoreV1 =
13419 DAG.getStore(DAG.getEntryNode(), DL, V1, StackPtr, PtrInfo, Alignment);
13420 // Store the hi part of CONCAT_VECTORS(V1, V2)
13421 SDValue VTBytes = DAG.getTypeSize(DL, PtrVT, VT.getStoreSize());
13422 SDValue StackPtr2 = DAG.getNode(ISD::ADD, DL, PtrVT, StackPtr, VTBytes);
13423 SDValue StoreV2 =
13424 DAG.getStore(StoreV1, DL, V2, StackPtr2, PtrInfo, Alignment);
13425
13426 // NOTE: TrailingBytes must be clamped so as not to read outside of V1:V2.
13427 SDValue EltByteSize =
13428 DAG.getTypeSize(DL, PtrVT, VT.getVectorElementType().getStoreSize());
13429 Offset = DAG.getZExtOrTrunc(Offset, DL, PtrVT);
13430 SDValue TrailingBytes = DAG.getNode(ISD::MUL, DL, PtrVT, Offset, EltByteSize);
13431
13432 TrailingBytes = DAG.getNode(ISD::UMIN, DL, PtrVT, TrailingBytes, VTBytes);
13433
13434 if (Node->getOpcode() == ISD::VECTOR_SPLICE_LEFT)
13435 StackPtr = DAG.getMemBasePlusOffset(StackPtr, TrailingBytes, DL);
13436 else
13437 StackPtr = DAG.getNode(ISD::SUB, DL, PtrVT, StackPtr2, TrailingBytes);
13438
13439 // Load the spliced result
13440 return DAG.getLoad(VT, DL, StoreV2, StackPtr,
13442}
13443
13445 SelectionDAG &DAG) const {
13446 SDLoc DL(Node);
13447 SDValue Vec = Node->getOperand(0);
13448 SDValue Mask = Node->getOperand(1);
13449 SDValue Passthru = Node->getOperand(2);
13450
13451 EVT VecVT = Vec.getValueType();
13452 EVT ScalarVT = VecVT.getScalarType();
13453 EVT MaskVT = Mask.getValueType();
13454 EVT MaskScalarVT = MaskVT.getScalarType();
13455
13456 // Needs to be handled by targets that have scalable vector types.
13457 if (VecVT.isScalableVector())
13458 report_fatal_error("Cannot expand masked_compress for scalable vectors.");
13459
13460 Align Alignment = DAG.getReducedAlign(VecVT, /*UseABI=*/false);
13461 SDValue StackPtr = DAG.CreateStackTemporary(VecVT.getStoreSize(), Alignment);
13462 int FI = cast<FrameIndexSDNode>(StackPtr.getNode())->getIndex();
13463 MachinePointerInfo PtrInfo =
13465
13466 MVT PositionVT = getVectorIdxTy(DAG.getDataLayout());
13467 SDValue Chain = DAG.getEntryNode();
13468 SDValue OutPos = DAG.getConstant(0, DL, PositionVT);
13469
13470 bool HasPassthru = !Passthru.isUndef();
13471
13472 // If we have a passthru vector, store it on the stack, overwrite the matching
13473 // positions and then re-write the last element that was potentially
13474 // overwritten even though mask[i] = false.
13475 if (HasPassthru)
13476 Chain = DAG.getStore(Chain, DL, Passthru, StackPtr, PtrInfo, Alignment);
13477
13478 SDValue LastWriteVal;
13479 APInt PassthruSplatVal;
13480 bool IsSplatPassthru =
13481 ISD::isConstantSplatVector(Passthru.getNode(), PassthruSplatVal);
13482
13483 if (IsSplatPassthru) {
13484 // As we do not know which position we wrote to last, we cannot simply
13485 // access that index from the passthru vector. So we first check if passthru
13486 // is a splat vector, to use any element ...
13487 LastWriteVal = DAG.getConstant(PassthruSplatVal, DL, ScalarVT);
13488 } else if (HasPassthru) {
13489 // ... if it is not a splat vector, we need to get the passthru value at
13490 // position = popcount(mask) and re-load it from the stack before it is
13491 // overwritten in the loop below.
13492 EVT PopcountVT = ScalarVT.changeTypeToInteger();
13493 SDValue Popcount = DAG.getNode(
13495 MaskVT.changeVectorElementType(*DAG.getContext(), MVT::i1), Mask);
13496 Popcount = DAG.getNode(
13498 MaskVT.changeVectorElementType(*DAG.getContext(), PopcountVT),
13499 Popcount);
13500 Popcount = DAG.getNode(ISD::VECREDUCE_ADD, DL, PopcountVT, Popcount);
13501 SDValue LastElmtPtr =
13502 getVectorElementPointer(DAG, StackPtr, VecVT, Popcount);
13503 LastWriteVal = DAG.getLoad(
13504 ScalarVT, DL, Chain, LastElmtPtr,
13506 Chain = LastWriteVal.getValue(1);
13507 }
13508
13509 unsigned NumElms = VecVT.getVectorNumElements();
13510 for (unsigned I = 0; I < NumElms; I++) {
13511 SDValue ValI = DAG.getExtractVectorElt(DL, ScalarVT, Vec, I);
13512 SDValue OutPtr = getVectorElementPointer(DAG, StackPtr, VecVT, OutPos);
13513 Chain = DAG.getStore(
13514 Chain, DL, ValI, OutPtr,
13516
13517 // Get the mask value and add it to the current output position. This
13518 // either increments by 1 if MaskI is true or adds 0 otherwise.
13519 // Freeze in case we have poison/undef mask entries.
13520 SDValue MaskI = DAG.getExtractVectorElt(DL, MaskScalarVT, Mask, I);
13521 MaskI = DAG.getFreeze(MaskI);
13522 MaskI = DAG.getNode(ISD::TRUNCATE, DL, MVT::i1, MaskI);
13523 MaskI = DAG.getNode(ISD::ZERO_EXTEND, DL, PositionVT, MaskI);
13524 OutPos = DAG.getNode(ISD::ADD, DL, PositionVT, OutPos, MaskI);
13525
13526 if (HasPassthru && I == NumElms - 1) {
13527 SDValue EndOfVector =
13528 DAG.getConstant(VecVT.getVectorNumElements() - 1, DL, PositionVT);
13529 SDValue AllLanesSelected =
13530 DAG.getSetCC(DL, MVT::i1, OutPos, EndOfVector, ISD::CondCode::SETUGT);
13531 OutPos = DAG.getNode(ISD::UMIN, DL, PositionVT, OutPos, EndOfVector);
13532 OutPtr = getVectorElementPointer(DAG, StackPtr, VecVT, OutPos);
13533
13534 // Re-write the last ValI if all lanes were selected. Otherwise,
13535 // overwrite the last write it with the passthru value.
13536 LastWriteVal = DAG.getSelect(DL, ScalarVT, AllLanesSelected, ValI,
13537 LastWriteVal, SDNodeFlags::Unpredictable);
13538 Chain = DAG.getStore(
13539 Chain, DL, LastWriteVal, OutPtr,
13541 }
13542 }
13543
13544 return DAG.getLoad(VecVT, DL, Chain, StackPtr, PtrInfo, Alignment);
13545}
13546
13548 SDLoc DL(Node);
13549 EVT VT = Node->getValueType(0);
13550
13551 bool ZeroIsPoison = Node->getOpcode() == ISD::CTTZ_ELTS_ZERO_POISON;
13552 auto [Mask, StepVec] =
13553 getLegalMaskAndStepVector(Node->getOperand(0), ZeroIsPoison, DL, DAG);
13554
13555 // No legal step vector: split mask in half and recombine results.
13556 // LoNumElts uses the non-poison CTTZ_ELTS so its result is well-defined
13557 // (== LoNumElts when no active lane), allowing the SETNE comparison.
13558 // Result: (ResLo != LoNumElts) ? ResLo : (LoNumElts + ResHi)
13559 if (!StepVec) {
13560 EVT ResVT = Node->getValueType(0);
13561 auto [MaskLo, MaskHi] = DAG.SplitVector(Node->getOperand(0), DL);
13562 SDValue LoNumElts = DAG.getElementCount(
13563 DL, ResVT, MaskLo.getValueType().getVectorElementCount());
13564 SDValue ResLo = DAG.getNode(ISD::CTTZ_ELTS, DL, ResVT, MaskLo);
13565 SDValue ResHi = DAG.getNode(Node->getOpcode(), DL, ResVT, MaskHi);
13566 SDValue ResLoNotNumElts = DAG.getSetCC(
13567 DL, getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), ResVT),
13568 ResLo, LoNumElts, ISD::SETNE);
13569 // Per LangRef, ResVT must be wide enough to hold the total element count,
13570 // so the sum cannot wrap as an unsigned add. NSW is not guaranteed since
13571 // the count is only required to fit unsigned.
13572 SDValue Sum = DAG.getNode(ISD::ADD, DL, ResVT, LoNumElts, ResHi,
13574 return DAG.getSelect(DL, ResVT, ResLoNotNumElts, ResLo, Sum);
13575 }
13576
13577 EVT StepVecVT = StepVec.getValueType();
13578 EVT StepVT = StepVecVT.getVectorElementType();
13579
13580 // Promote the scalar result type early to avoid redundant zexts.
13582 StepVT = getTypeToTransformTo(*DAG.getContext(), StepVT);
13583
13584 SDValue VL =
13585 DAG.getElementCount(DL, StepVT, StepVecVT.getVectorElementCount());
13586 SDValue SplatVL = DAG.getSplat(StepVecVT, DL, VL);
13587 StepVec = DAG.getNode(ISD::SUB, DL, StepVecVT, SplatVL, StepVec);
13588 SDValue Zeroes = DAG.getConstant(0, DL, StepVecVT);
13589 SDValue Select = DAG.getSelect(DL, StepVecVT, Mask, StepVec, Zeroes);
13591 StepVecVT.getVectorElementType(), Select);
13592 SDValue Sub = DAG.getNode(ISD::SUB, DL, StepVT, VL,
13593 DAG.getZExtOrTrunc(Max, DL, StepVT));
13594
13595 return DAG.getZExtOrTrunc(Sub, DL, VT);
13596}
13597
13599 SDLoc DL(N);
13600 SDValue Source = N->getOperand(0);
13601 SDValue Needle = N->getOperand(1);
13602 SDValue Mask = N->getOperand(2);
13603 EVT SourceVT = Source.getValueType();
13604 EVT NeedleVT = Needle.getValueType();
13605 EVT ResVT = N->getValueType(0);
13606 EVT CmpVT =
13607 getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), SourceVT);
13608
13609 assert(NeedleVT.isFixedLengthVector() && "Needle must be a fixed vector");
13610
13611 SDValue Ret = DAG.getConstant(0, DL, CmpVT);
13612 EVT NeedleEltVT = NeedleVT.getVectorElementType();
13613 for (unsigned I = 0, E = NeedleVT.getVectorNumElements(); I != E; ++I) {
13614 SDValue Splat;
13615 if (NeedleVT == SourceVT) {
13616 // Prefer a shuffle over scalar extracts + splat for fixed vectors.
13617 Splat = DAG.getVectorShuffle(
13618 SourceVT, DL, Needle, DAG.getUNDEF(SourceVT),
13620 } else {
13621 SDValue NeedleElt = DAG.getExtractVectorElt(DL, NeedleEltVT, Needle, I);
13622 Splat = DAG.getNode(ISD::SPLAT_VECTOR, DL, SourceVT, NeedleElt);
13623 }
13624 SDValue Cmp = DAG.getSetCC(DL, CmpVT, Source, Splat, ISD::SETEQ);
13625 Ret = DAG.getNode(ISD::OR, DL, CmpVT, Ret, Cmp);
13626 }
13627
13628 EVT UseVT = ResVT;
13629 // If the result is immediately truncated, only extend to that type (to avoid
13630 // unnecessary sign/zero extends).
13631 if (N->hasOneUse() && N->user_begin()->getOpcode() == ISD::TRUNCATE)
13632 UseVT = N->user_begin()->getValueType(0);
13633
13634 Mask = DAG.getBoolExtOrTrunc(Mask, DL, UseVT, Mask.getValueType());
13635 Ret = DAG.getBoolExtOrTrunc(Ret, DL, UseVT, Ret.getValueType());
13636
13637 Ret = DAG.getNode(ISD::AND, DL, UseVT, Ret, Mask);
13638 if (UseVT != ResVT)
13639 Ret = DAG.getNode(ISD::ANY_EXTEND, DL, ResVT, Ret);
13640 return Ret;
13641}
13642
13644 SelectionDAG &DAG) const {
13645 SDLoc DL(N);
13646 SDValue Acc = N->getOperand(0);
13647 SDValue MulLHS = N->getOperand(1);
13648 SDValue MulRHS = N->getOperand(2);
13649 EVT AccVT = Acc.getValueType();
13650 EVT MulOpVT = MulLHS.getValueType();
13651
13652 EVT ExtMulOpVT =
13654 MulOpVT.getVectorElementCount());
13655
13656 unsigned ExtOpcLHS, ExtOpcRHS;
13657 switch (N->getOpcode()) {
13658 default:
13659 llvm_unreachable("Unexpected opcode");
13661 ExtOpcLHS = ExtOpcRHS = ISD::ZERO_EXTEND;
13662 break;
13664 ExtOpcLHS = ExtOpcRHS = ISD::SIGN_EXTEND;
13665 break;
13667 ExtOpcLHS = ISD::SIGN_EXTEND;
13668 ExtOpcRHS = ISD::ZERO_EXTEND;
13669 break;
13671 ExtOpcLHS = ExtOpcRHS = ISD::FP_EXTEND;
13672 break;
13673 }
13674
13675 if (ExtMulOpVT != MulOpVT) {
13676 MulLHS = DAG.getNode(ExtOpcLHS, DL, ExtMulOpVT, MulLHS);
13677 MulRHS = DAG.getNode(ExtOpcRHS, DL, ExtMulOpVT, MulRHS);
13678 }
13679 SDValue Input = MulLHS;
13680 if (N->getOpcode() == ISD::PARTIAL_REDUCE_FMLA) {
13681 if (!llvm::isOneOrOneSplatFP(MulRHS))
13682 Input = DAG.getNode(ISD::FMUL, DL, ExtMulOpVT, MulLHS, MulRHS);
13683 } else if (!llvm::isOneOrOneSplat(MulRHS)) {
13684 Input = DAG.getNode(ISD::MUL, DL, ExtMulOpVT, MulLHS, MulRHS);
13685 }
13686
13687 unsigned Stride = AccVT.getVectorMinNumElements();
13688 unsigned ScaleFactor = MulOpVT.getVectorMinNumElements() / Stride;
13689
13690 // Collect all of the subvectors
13691 std::deque<SDValue> Subvectors = {Acc};
13692 for (unsigned I = 0; I < ScaleFactor; I++)
13693 Subvectors.push_back(DAG.getExtractSubvector(DL, AccVT, Input, I * Stride));
13694
13695 unsigned FlatNode =
13696 N->getOpcode() == ISD::PARTIAL_REDUCE_FMLA ? ISD::FADD : ISD::ADD;
13697
13698 // Flatten the subvector tree
13699 while (Subvectors.size() > 1) {
13700 Subvectors.push_back(
13701 DAG.getNode(FlatNode, DL, AccVT, {Subvectors[0], Subvectors[1]}));
13702 Subvectors.pop_front();
13703 Subvectors.pop_front();
13704 }
13705
13706 assert(Subvectors.size() == 1 &&
13707 "There should only be one subvector after tree flattening");
13708
13709 return Subvectors[0];
13710}
13711
13712/// Given a store node \p StoreNode, return true if it is safe to fold that node
13713/// into \p FPNode, which expands to a library call with output pointers.
13715 SDNode *FPNode) {
13717 SmallVector<const SDNode *, 8> DeferredNodes;
13719
13720 // Skip FPNode use by StoreNode (that's the use we want to fold into FPNode).
13721 for (SDValue Op : StoreNode->ops())
13722 if (Op.getNode() != FPNode)
13723 Worklist.push_back(Op.getNode());
13724
13726 while (!Worklist.empty()) {
13727 const SDNode *Node = Worklist.pop_back_val();
13728 auto [_, Inserted] = Visited.insert(Node);
13729 if (!Inserted)
13730 continue;
13731
13732 if (MaxSteps > 0 && Visited.size() >= MaxSteps)
13733 return false;
13734
13735 // Reached the FPNode (would result in a cycle).
13736 // OR Reached CALLSEQ_START (would result in nested call sequences).
13737 if (Node == FPNode || Node->getOpcode() == ISD::CALLSEQ_START)
13738 return false;
13739
13740 if (Node->getOpcode() == ISD::CALLSEQ_END) {
13741 // Defer looking into call sequences (so we can check we're outside one).
13742 // We still need to look through these for the predecessor check.
13743 DeferredNodes.push_back(Node);
13744 continue;
13745 }
13746
13747 for (SDValue Op : Node->ops())
13748 Worklist.push_back(Op.getNode());
13749 }
13750
13751 // True if we're outside a call sequence and don't have the FPNode as a
13752 // predecessor. No cycles or nested call sequences possible.
13753 return !SDNode::hasPredecessorHelper(FPNode, Visited, DeferredNodes,
13754 MaxSteps);
13755}
13756
13758 SelectionDAG &DAG, RTLIB::Libcall LC, SDNode *Node,
13760 std::optional<unsigned> CallRetResNo) const {
13761 if (LC == RTLIB::UNKNOWN_LIBCALL)
13762 return false;
13763
13764 RTLIB::LibcallImpl LibcallImpl = getLibcallImpl(LC);
13765 if (LibcallImpl == RTLIB::Unsupported)
13766 return false;
13767
13768 LLVMContext &Ctx = *DAG.getContext();
13769 EVT VT = Node->getValueType(0);
13770 unsigned NumResults = Node->getNumValues();
13771
13772 // Find users of the node that store the results (and share input chains). The
13773 // destination pointers can be used instead of creating stack allocations.
13774 SDValue StoresInChain;
13775 SmallVector<StoreSDNode *, 2> ResultStores(NumResults);
13776 for (SDNode *User : Node->users()) {
13778 continue;
13779 auto *ST = cast<StoreSDNode>(User);
13780 SDValue StoreValue = ST->getValue();
13781 unsigned ResNo = StoreValue.getResNo();
13782 // Ensure the store corresponds to an output pointer.
13783 if (CallRetResNo == ResNo)
13784 continue;
13785 // Ensure the store to the default address space and not atomic or volatile.
13786 if (!ST->isSimple() || ST->getAddressSpace() != 0)
13787 continue;
13788 // Ensure all store chains are the same (so they don't alias).
13789 if (StoresInChain && ST->getChain() != StoresInChain)
13790 continue;
13791 // Ensure the store is properly aligned.
13792 Type *StoreType = StoreValue.getValueType().getTypeForEVT(Ctx);
13793 if (ST->getAlign() <
13794 DAG.getDataLayout().getABITypeAlign(StoreType->getScalarType()))
13795 continue;
13796 // Avoid:
13797 // 1. Creating cyclic dependencies.
13798 // 2. Expanding the node to a call within a call sequence.
13800 continue;
13801 ResultStores[ResNo] = ST;
13802 StoresInChain = ST->getChain();
13803 }
13804
13805 ArgListTy Args;
13806
13807 // Pass the arguments.
13808 for (const SDValue &Op : Node->op_values()) {
13809 EVT ArgVT = Op.getValueType();
13810 Type *ArgTy = ArgVT.getTypeForEVT(Ctx);
13811 Args.emplace_back(Op, ArgTy);
13812 }
13813
13814 // Pass the output pointers.
13815 SmallVector<SDValue, 2> ResultPtrs(NumResults);
13817 for (auto [ResNo, ST] : llvm::enumerate(ResultStores)) {
13818 if (ResNo == CallRetResNo)
13819 continue;
13820 EVT ResVT = Node->getValueType(ResNo);
13821 SDValue ResultPtr = ST ? ST->getBasePtr() : DAG.CreateStackTemporary(ResVT);
13822 ResultPtrs[ResNo] = ResultPtr;
13823 Args.emplace_back(ResultPtr, PointerTy);
13824 }
13825
13826 SDLoc DL(Node);
13827
13829 // Pass the vector mask (if required).
13830 EVT MaskVT = getSetCCResultType(DAG.getDataLayout(), Ctx, VT);
13831 SDValue Mask = DAG.getBoolConstant(true, DL, MaskVT, VT);
13832 Args.emplace_back(Mask, MaskVT.getTypeForEVT(Ctx));
13833 }
13834
13835 Type *RetType = CallRetResNo.has_value()
13836 ? Node->getValueType(*CallRetResNo).getTypeForEVT(Ctx)
13837 : Type::getVoidTy(Ctx);
13838 SDValue InChain = StoresInChain ? StoresInChain : DAG.getEntryNode();
13839 SDValue Callee =
13840 DAG.getExternalSymbol(LibcallImpl, getPointerTy(DAG.getDataLayout()));
13842 CLI.setDebugLoc(DL).setChain(InChain).setLibCallee(
13843 getLibcallImplCallingConv(LibcallImpl), RetType, Callee, std::move(Args));
13844
13845 auto [Call, CallChain] = LowerCallTo(CLI);
13846
13847 for (auto [ResNo, ResultPtr] : llvm::enumerate(ResultPtrs)) {
13848 if (ResNo == CallRetResNo) {
13849 Results.push_back(Call);
13850 continue;
13851 }
13852 MachinePointerInfo PtrInfo;
13853 SDValue LoadResult = DAG.getLoad(Node->getValueType(ResNo), DL, CallChain,
13854 ResultPtr, PtrInfo);
13855 SDValue OutChain = LoadResult.getValue(1);
13856
13857 if (StoreSDNode *ST = ResultStores[ResNo]) {
13858 // Replace store with the library call.
13859 DAG.ReplaceAllUsesOfValueWith(SDValue(ST, 0), OutChain);
13860 PtrInfo = ST->getPointerInfo();
13861 } else {
13863 DAG.getMachineFunction(),
13864 cast<FrameIndexSDNode>(ResultPtr)->getIndex());
13865 }
13866
13867 Results.push_back(LoadResult);
13868 }
13869
13870 return true;
13871}
13872
13874 SDValue &LHS, SDValue &RHS,
13875 SDValue &CC, bool &NeedInvert,
13876 const SDLoc &dl, SDValue &Chain,
13877 bool IsSignaling) const {
13878 MVT OpVT = LHS.getSimpleValueType();
13879 ISD::CondCode CCCode = cast<CondCodeSDNode>(CC)->get();
13880 NeedInvert = false;
13881 switch (getCondCodeAction(CCCode, OpVT)) {
13882 default:
13883 llvm_unreachable("Unknown condition code action!");
13885 // Nothing to do.
13886 break;
13889 if (isCondCodeLegalOrCustom(InvCC, OpVT)) {
13890 std::swap(LHS, RHS);
13891 CC = DAG.getCondCode(InvCC);
13892 return true;
13893 }
13894 // Swapping operands didn't work. Try inverting the condition.
13895 bool NeedSwap = false;
13896 InvCC = getSetCCInverse(CCCode, OpVT);
13897 if (!isCondCodeLegalOrCustom(InvCC, OpVT)) {
13898 // If inverting the condition is not enough, try swapping operands
13899 // on top of it.
13900 InvCC = ISD::getSetCCSwappedOperands(InvCC);
13901 NeedSwap = true;
13902 }
13903 if (isCondCodeLegalOrCustom(InvCC, OpVT)) {
13904 CC = DAG.getCondCode(InvCC);
13905 NeedInvert = true;
13906 if (NeedSwap)
13907 std::swap(LHS, RHS);
13908 return true;
13909 }
13910
13911 // Special case: expand i1 comparisons using logical operations.
13912 if (OpVT == MVT::i1) {
13913 SDValue Ret;
13914 switch (CCCode) {
13915 default:
13916 llvm_unreachable("Unknown integer setcc!");
13917 case ISD::SETEQ: // X == Y --> ~(X ^ Y)
13918 Ret = DAG.getNOT(dl, DAG.getNode(ISD::XOR, dl, MVT::i1, LHS, RHS),
13919 MVT::i1);
13920 break;
13921 case ISD::SETNE: // X != Y --> (X ^ Y)
13922 Ret = DAG.getNode(ISD::XOR, dl, MVT::i1, LHS, RHS);
13923 break;
13924 case ISD::SETGT: // X >s Y --> X == 0 & Y == 1 --> ~X & Y
13925 case ISD::SETULT: // X <u Y --> X == 0 & Y == 1 --> ~X & Y
13926 Ret = DAG.getNode(ISD::AND, dl, MVT::i1, RHS,
13927 DAG.getNOT(dl, LHS, MVT::i1));
13928 break;
13929 case ISD::SETLT: // X <s Y --> X == 1 & Y == 0 --> ~Y & X
13930 case ISD::SETUGT: // X >u Y --> X == 1 & Y == 0 --> ~Y & X
13931 Ret = DAG.getNode(ISD::AND, dl, MVT::i1, LHS,
13932 DAG.getNOT(dl, RHS, MVT::i1));
13933 break;
13934 case ISD::SETULE: // X <=u Y --> X == 0 | Y == 1 --> ~X | Y
13935 case ISD::SETGE: // X >=s Y --> X == 0 | Y == 1 --> ~X | Y
13936 Ret = DAG.getNode(ISD::OR, dl, MVT::i1, RHS,
13937 DAG.getNOT(dl, LHS, MVT::i1));
13938 break;
13939 case ISD::SETUGE: // X >=u Y --> X == 1 | Y == 0 --> ~Y | X
13940 case ISD::SETLE: // X <=s Y --> X == 1 | Y == 0 --> ~Y | X
13941 Ret = DAG.getNode(ISD::OR, dl, MVT::i1, LHS,
13942 DAG.getNOT(dl, RHS, MVT::i1));
13943 break;
13944 }
13945
13946 LHS = DAG.getZExtOrTrunc(Ret, dl, VT);
13947 RHS = SDValue();
13948 CC = SDValue();
13949 return true;
13950 }
13951
13953 unsigned Opc = 0;
13954 switch (CCCode) {
13955 default:
13956 llvm_unreachable("Don't know how to expand this condition!");
13957 case ISD::SETUO:
13958 if (isCondCodeLegal(ISD::SETUNE, OpVT)) {
13959 CC1 = ISD::SETUNE;
13960 CC2 = ISD::SETUNE;
13961 Opc = ISD::OR;
13962 break;
13963 }
13965 "If SETUE is expanded, SETOEQ or SETUNE must be legal!");
13966 NeedInvert = true;
13967 [[fallthrough]];
13968 case ISD::SETO:
13970 "If SETO is expanded, SETOEQ must be legal!");
13971 CC1 = ISD::SETOEQ;
13972 CC2 = ISD::SETOEQ;
13973 Opc = ISD::AND;
13974 break;
13975 case ISD::SETONE:
13976 case ISD::SETUEQ:
13977 // If the SETUO or SETO CC isn't legal, we might be able to use
13978 // SETOGT || SETOLT, inverting the result for SETUEQ. We only need one
13979 // of SETOGT/SETOLT to be legal, the other can be emulated by swapping
13980 // the operands.
13981 CC2 = ((unsigned)CCCode & 0x8U) ? ISD::SETUO : ISD::SETO;
13982 if (!isCondCodeLegal(CC2, OpVT) && (isCondCodeLegal(ISD::SETOGT, OpVT) ||
13983 isCondCodeLegal(ISD::SETOLT, OpVT))) {
13984 CC1 = ISD::SETOGT;
13985 CC2 = ISD::SETOLT;
13986 Opc = ISD::OR;
13987 NeedInvert = ((unsigned)CCCode & 0x8U);
13988 break;
13989 }
13990 [[fallthrough]];
13991 case ISD::SETOEQ:
13992 case ISD::SETOGT:
13993 case ISD::SETOGE:
13994 case ISD::SETOLT:
13995 case ISD::SETOLE:
13996 case ISD::SETUNE:
13997 case ISD::SETUGT:
13998 case ISD::SETUGE:
13999 case ISD::SETULT:
14000 case ISD::SETULE:
14001 // If we are floating point, assign and break, otherwise fall through.
14002 if (!OpVT.isInteger()) {
14003 // We can use the 4th bit to tell if we are the unordered
14004 // or ordered version of the opcode.
14005 CC2 = ((unsigned)CCCode & 0x8U) ? ISD::SETUO : ISD::SETO;
14006 Opc = ((unsigned)CCCode & 0x8U) ? ISD::OR : ISD::AND;
14007 CC1 = (ISD::CondCode)(((int)CCCode & 0x7) | 0x10);
14008 break;
14009 }
14010 // Fallthrough if we are unsigned integer.
14011 [[fallthrough]];
14012 case ISD::SETLE:
14013 case ISD::SETGT:
14014 case ISD::SETGE:
14015 case ISD::SETLT:
14016 case ISD::SETNE:
14017 case ISD::SETEQ:
14018 // If all combinations of inverting the condition and swapping operands
14019 // didn't work then we have no means to expand the condition.
14020 llvm_unreachable("Don't know how to expand this condition!");
14021 }
14022
14023 SDValue SetCC1, SetCC2;
14024 if (CCCode != ISD::SETO && CCCode != ISD::SETUO) {
14025 // If we aren't the ordered or unorder operation,
14026 // then the pattern is (LHS CC1 RHS) Opc (LHS CC2 RHS).
14027 SetCC1 = DAG.getSetCC(dl, VT, LHS, RHS, CC1, Chain, IsSignaling);
14028 SetCC2 = DAG.getSetCC(dl, VT, LHS, RHS, CC2, Chain, IsSignaling);
14029 } else {
14030 // Otherwise, the pattern is (LHS CC1 LHS) Opc (RHS CC2 RHS)
14031 SetCC1 = DAG.getSetCC(dl, VT, LHS, LHS, CC1, Chain, IsSignaling);
14032 SetCC2 = DAG.getSetCC(dl, VT, RHS, RHS, CC2, Chain, IsSignaling);
14033 }
14034 if (Chain)
14035 Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, SetCC1.getValue(1),
14036 SetCC2.getValue(1));
14037 LHS = DAG.getNode(Opc, dl, VT, SetCC1, SetCC2);
14038 RHS = SDValue();
14039 CC = SDValue();
14040 return true;
14041 }
14042 }
14043 return false;
14044}
14045
14047 SelectionDAG &DAG) const {
14048 EVT VT = Node->getValueType(0);
14049 // Despite its documentation, GetSplitDestVTs will assert if VT cannot be
14050 // split into two equal parts.
14051 if (!VT.isVector() || !VT.getVectorElementCount().isKnownMultipleOf(2))
14052 return SDValue();
14053
14054 // Restrict expansion to cases where both parts can be concatenated.
14055 auto [LoVT, HiVT] = DAG.GetSplitDestVTs(VT);
14056 if (LoVT != HiVT || !isTypeLegal(LoVT))
14057 return SDValue();
14058
14059 SDLoc DL(Node);
14060 unsigned Opcode = Node->getOpcode();
14061
14062 // Don't expand if the result is likely to be unrolled anyway.
14063 if (!isOperationLegalOrCustomOrPromote(Opcode, LoVT))
14064 return SDValue();
14065
14066 SmallVector<SDValue, 4> LoOps, HiOps;
14067 for (const SDValue &V : Node->op_values()) {
14068 if (!V.getValueType().isVector()) {
14069 // Scalar operands pass through to both halves unchanged.
14070 LoOps.push_back(V);
14071 HiOps.push_back(V);
14072 continue;
14073 }
14074 auto [Lo, Hi] = DAG.SplitVector(V, DL, LoVT, HiVT);
14075 LoOps.push_back(Lo);
14076 HiOps.push_back(Hi);
14077 }
14078
14079 SDValue SplitOpLo = DAG.getNode(Opcode, DL, LoVT, LoOps, Node->getFlags());
14080 SDValue SplitOpHi = DAG.getNode(Opcode, DL, HiVT, HiOps, Node->getFlags());
14081 return DAG.getNode(ISD::CONCAT_VECTORS, DL, VT, SplitOpLo, SplitOpHi);
14082}
14083
14085 const SDLoc &DL,
14086 EVT InVecVT, SDValue EltNo,
14087 LoadSDNode *OriginalLoad,
14088 SelectionDAG &DAG) const {
14089 assert(OriginalLoad->isSimple());
14090
14091 EVT VecEltVT = InVecVT.getVectorElementType();
14092
14093 // If the vector element type is not a multiple of a byte then we are unable
14094 // to correctly compute an address to load only the extracted element as a
14095 // scalar.
14096 if (!VecEltVT.isByteSized())
14097 return SDValue();
14098
14099 ISD::LoadExtType ExtTy =
14100 ResultVT.bitsGT(VecEltVT) ? ISD::EXTLOAD : ISD::NON_EXTLOAD;
14101 if (!isOperationLegalOrCustom(ISD::LOAD, VecEltVT))
14102 return SDValue();
14103
14104 std::optional<unsigned> ByteOffset;
14105 Align Alignment = OriginalLoad->getAlign();
14107 if (auto *ConstEltNo = dyn_cast<ConstantSDNode>(EltNo)) {
14108 int Elt = ConstEltNo->getZExtValue();
14109 ByteOffset = VecEltVT.getSizeInBits() * Elt / 8;
14110 MPI = OriginalLoad->getPointerInfo().getWithOffset(*ByteOffset);
14111 Alignment = commonAlignment(Alignment, *ByteOffset);
14112 } else {
14113 // Discard the pointer info except the address space because the memory
14114 // operand can't represent this new access since the offset is variable.
14115 MPI = MachinePointerInfo(OriginalLoad->getPointerInfo().getAddrSpace());
14116 Alignment = commonAlignment(Alignment, VecEltVT.getSizeInBits() / 8);
14117 }
14118
14119 if (!shouldReduceLoadWidth(OriginalLoad, ExtTy, VecEltVT, ByteOffset))
14120 return SDValue();
14121
14122 unsigned IsFast = 0;
14123 if (!allowsMemoryAccess(*DAG.getContext(), DAG.getDataLayout(), VecEltVT,
14124 OriginalLoad->getAddressSpace(), Alignment,
14125 OriginalLoad->getMemOperand()->getFlags(), &IsFast) ||
14126 !IsFast)
14127 return SDValue();
14128
14129 // The original DAG loaded the entire vector from memory, so arithmetic
14130 // within it must be inbounds.
14132 DAG, OriginalLoad->getBasePtr(), InVecVT, EltNo);
14133
14134 // We are replacing a vector load with a scalar load. The new load must have
14135 // identical memory op ordering to the original.
14136 SDValue Load;
14137 if (ResultVT.bitsGT(VecEltVT)) {
14138 // If the result type of vextract is wider than the load, then issue an
14139 // extending load instead.
14140 ISD::LoadExtType ExtType =
14141 isLoadLegal(ResultVT, VecEltVT, Alignment,
14142 OriginalLoad->getAddressSpace(), ISD::ZEXTLOAD, false)
14144 : ISD::EXTLOAD;
14145 Load = DAG.getExtLoad(ExtType, DL, ResultVT, OriginalLoad->getChain(),
14146 NewPtr, MPI, VecEltVT, Alignment,
14147 OriginalLoad->getMemOperand()->getFlags(),
14148 OriginalLoad->getAAInfo());
14149 DAG.makeEquivalentMemoryOrdering(OriginalLoad, Load);
14150 } else {
14151 // The result type is narrower or the same width as the vector element
14152 Load = DAG.getLoad(VecEltVT, DL, OriginalLoad->getChain(), NewPtr, MPI,
14153 Alignment, OriginalLoad->getMemOperand()->getFlags(),
14154 OriginalLoad->getAAInfo());
14155 DAG.makeEquivalentMemoryOrdering(OriginalLoad, Load);
14156 if (ResultVT.bitsLT(VecEltVT))
14157 Load = DAG.getNode(ISD::TRUNCATE, DL, ResultVT, Load);
14158 else
14159 Load = DAG.getBitcast(ResultVT, Load);
14160 }
14161
14162 return Load;
14163}
14164
14165// Set type id for call site info and metadata 'call_target'.
14166// We are filtering for:
14167// a) The call-graph-section use case that wants to know about indirect
14168// calls, or
14169// b) We want to annotate indirect calls.
14171 const CallBase *CB, MachineFunction &MF,
14172 MachineFunction::CallSiteInfo &CSInfo) const {
14173 if (CB && CB->isIndirectCall() &&
14176 CSInfo = MachineFunction::CallSiteInfo(*CB);
14177}
return SDValue()
unsigned RegSize
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
unsigned Imm
unsigned uint64_t
constexpr LLT F32
AMDGPU Register Bank Select
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
Function Alias Analysis Results
#define X(NUM, ENUM, NAME)
Definition ELF.h: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 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 bool semanticsHasSignedRepr(const fltSemantics &)
Definition APFloat.cpp:283
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 or function.
RTLIB::LibcallImpl getLibcallImpl(RTLIB::Libcall Call) const
Return the lowering's selection of implementation call for Call.
This class is used to represent ISD::LOAD nodes.
const SDValue & getBasePtr() const
Context object for machine code objects.
Definition MCContext.h:83
Base class for the full range of assembler expressions which are needed for parsing.
Definition MCExpr.h:34
iterator_range< regclass_iterator > regclasses() const
Wrapper class representing physical registers. Should be passed by value.
Definition MCRegister.h:41
static const MCSymbolRefExpr * create(const MCSymbol *Symbol, MCContext &Ctx, SMLoc Loc=SMLoc())
Definition MCExpr.h:213
Machine Value Type.
SimpleValueType SimpleTy
bool isInteger() const
Return true if this is an integer or a vector integer type.
TypeSize getSizeInBits() const
Returns the size of the specified MVT in bits.
static MVT getIntegerVT(unsigned BitWidth)
MVT getScalarType() const
If this is a vector, return the element type, otherwise return this.
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted.
MachineFrameInfo & getFrameInfo()
getFrameInfo - Return the frame info object for the current function.
DenormalMode getDenormalMode(const fltSemantics &FPType) const
Returns the denormal handling type for the default rounding mode of the function.
MCSymbol * getJTISymbol(unsigned JTI, MCContext &Ctx, bool isLinkerPrivate=false) const
getJTISymbol - Return the MCSymbol for the specified non-empty jump table.
Function & getFunction()
Return the LLVM function that this machine code represents.
const TargetMachine & getTarget() const
getTarget - Return the target machine this machine code is compiled with
@ EK_LabelDifference32
EK_LabelDifference32 - Each entry is the address of the block minus the address of the jump table.
@ EK_BlockAddress
EK_BlockAddress - Each entry is a plain address of block, e.g.: .word LBB123.
Flags getFlags() const
Return the raw flags of the source value,.
static bool clobbersPhysReg(const uint32_t *RegMask, MCRegister PhysReg)
clobbersPhysReg - Returns true if this RegMask clobbers PhysReg.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
LLVM_ABI MCRegister getLiveInPhysReg(Register VReg) const
getLiveInPhysReg - If VReg is a live-in virtual register, return the corresponding live-in physical r...
unsigned getAddressSpace() const
Return the address space for the associated pointer.
Align getAlign() const
AAMDNodes getAAInfo() const
Returns the AA info that describes the dereference.
bool isSimple() const
Returns true if the memory operation is neither atomic or volatile.
MachineMemOperand * getMemOperand() const
Return the unique MachineMemOperand object describing the memory reference performed by operation.
const MachinePointerInfo & getPointerInfo() const
const SDValue & getChain() const
const GlobalVariable * getNamedGlobal(StringRef Name) const
Return the global variable in the module with the specified name, of arbitrary type.
Definition Module.h: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.
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...
MVT getRegisterType(LLVMContext &Context, EVT VT) const
Return the type of registers that this ValueType will eventually require.
EVT getLegalTypeToTransformTo(LLVMContext &Context, EVT VT) const
Perform getTypeToTransformTo repeatedly until a legal type is obtained.
LegalizeAction getCondCodeAction(ISD::CondCode CC, MVT VT) const
Return how the condition code should be treated: either it is legal, needs to be expanded to some oth...
CallingConv::ID getLibcallImplCallingConv(RTLIB::LibcallImpl Call) const
Get the CallingConv that should be used for the specified libcall implementation.
virtual bool isCommutativeBinOp(unsigned Opcode) const
Returns true if the opcode is a commutative binary operation.
virtual bool isFPImmLegal(const APFloat &, EVT, bool ForCodeSize=false) const
Returns true if the target can instruction select the specified FP immediate natively.
virtual bool shouldTransformSignedTruncationCheck(EVT XVT, unsigned KeptBits) const
Should we tranform the IR-optimal check for whether given truncation down into KeptBits would be trun...
bool isLegalRC(const TargetRegisterInfo &TRI, const TargetRegisterClass &RC) const
Return true if the value types that can be represented by the specified register class are all legal.
virtual bool allowsMisalignedMemoryAccesses(EVT, unsigned AddrSpace=0, Align Alignment=Align(1), MachineMemOperand::Flags Flags=MachineMemOperand::MONone, unsigned *=nullptr) const
Determine if the target supports unaligned memory accesses.
bool isOperationCustom(unsigned Op, EVT VT) const
Return true if the operation uses custom lowering, regardless of whether the type is legal or not.
EVT getShiftAmountTy(EVT LHSTy, const DataLayout &DL) const
Returns the type for the shift amount of a shift opcode.
virtual bool shouldExtendTypeInLibCall(EVT Type) const
Returns true if arguments should be extended in lib calls.
virtual bool isTruncateFree(Type *FromTy, Type *ToTy) const
Return true if it's free to truncate a value of type FromTy to type ToTy.
virtual bool shouldAvoidTransformToShift(EVT VT, unsigned Amount) const
Return true if creating a shift of the type by the given amount is not profitable.
virtual bool isFPExtFree(EVT DestVT, EVT SrcVT) const
Return true if an fpext operation is free (for instance, because single-precision floating-point numb...
virtual EVT getSetCCResultType(const DataLayout &DL, LLVMContext &Context, EVT VT) const
Return the ValueType of the result of SETCC operations.
virtual EVT getTypeToTransformTo(LLVMContext &Context, EVT VT) const
For types supported by the target, this is an identity function.
BooleanContent getBooleanContents(bool isVec, bool isFloat) const
For targets without i1 registers, this gives the nature of the high-bits of boolean values held in ty...
bool isCondCodeLegal(ISD::CondCode CC, MVT VT) const
Return true if the specified condition code is legal for a comparison of the specified types on this ...
bool isTypeLegal(EVT VT) const
Return true if the target has native support for the specified value type.
virtual MVT getPointerTy(const DataLayout &DL, uint32_t AS=0) const
Return the pointer type for the given address space, defaults to the pointer type from the data layou...
bool isOperationLegal(unsigned Op, EVT VT) const
Return true if the specified operation is legal on this target.
TargetLoweringBase(const TargetMachine &TM, const TargetSubtargetInfo &STI)
NOTE: The TargetMachine owns TLOF.
virtual unsigned getCustomCtpopCost(EVT VT, ISD::CondCode Cond) const
Return the maximum number of "x & (x - 1)" operations that can be done instead of deferring to a cust...
virtual bool shouldProduceAndByConstByHoistingConstFromShiftsLHSOfAnd(SDValue X, ConstantSDNode *XC, ConstantSDNode *CC, SDValue Y, unsigned OldShiftOpcode, unsigned NewShiftOpcode, SelectionDAG &DAG) const
Given the pattern (X & (C l>>/<< Y)) ==/!= 0 return true if it should be transformed into: ((X <</l>>...
BooleanContent
Enum that describes how the target represents true/false values.
virtual bool isIntDivCheap(EVT VT, AttributeList Attr) const
Return true if integer divide is usually cheaper than a sequence of several shifts,...
bool isOperationLegalOrCustom(unsigned Op, EVT VT, bool LegalOnly=false) const
Return true if the specified operation is legal on this target or can be made legal with custom lower...
virtual bool allowsMemoryAccess(LLVMContext &Context, const DataLayout &DL, EVT VT, unsigned AddrSpace=0, Align Alignment=Align(1), MachineMemOperand::Flags Flags=MachineMemOperand::MONone, unsigned *Fast=nullptr) const
Return true if the target supports a memory access of this type for the given address space and align...
virtual bool hasAndNotCompare(SDValue Y) const
Return true if the target should transform: (X & Y) == Y ---> (~X & Y) == 0 (X & Y) !...
virtual bool isNarrowingProfitable(SDNode *N, EVT SrcVT, EVT DestVT) const
Return true if it's profitable to narrow operations of type SrcVT to DestVT.
virtual bool isBinOp(unsigned Opcode) const
Return true if the node is a math/logic binary operator.
RTLIB::LibcallImpl getLibcallImpl(RTLIB::Libcall Call) const
Get the libcall impl routine name for the specified libcall.
virtual bool isCtlzFast() const
Return true if ctlz instruction is fast.
virtual bool shouldUseStrictFP_TO_INT(EVT FpVT, EVT IntVT, bool IsSigned) const
Return true if it is more correct/profitable to use strict FP_TO_INT conversion operations - canonica...
NegatibleCost
Enum that specifies when a float negation is beneficial.
LegalizeTypeAction getTypeAction(LLVMContext &Context, EVT VT) const
Return how we should legalize values of this type, either it is already legal (return 'Legal') or we ...
virtual bool shouldSignExtendTypeInLibCall(Type *Ty, bool IsSigned) const
Returns true if arguments should be sign-extended in lib calls.
std::vector< ArgListEntry > ArgListTy
virtual EVT getOptimalMemOpType(LLVMContext &Context, const MemOp &Op, const AttributeList &) const
Returns the target specific optimal type for load and store operations as a result of memset,...
virtual EVT getAsmOperandValueType(const DataLayout &DL, Type *Ty, bool AllowUnknown=false) const
bool isCondCodeLegalOrCustom(ISD::CondCode CC, MVT VT) const
Return true if the specified condition code is legal or custom for a comparison of the specified type...
bool isLoadLegal(EVT ValVT, EVT MemVT, Align Alignment, unsigned AddrSpace, unsigned ExtType, bool Atomic) const
Return true if the specified load with extension is legal on this target.
virtual bool isFAbsFree(EVT VT) const
Return true if an fabs operation is free to the point where it is never worthwhile to replace it with...
LegalizeAction getOperationAction(unsigned Op, EVT VT) const
Return how this operation should be treated: either it is legal, needs to be promoted to a larger siz...
bool isOperationLegalOrCustomOrPromote(unsigned Op, EVT VT, bool LegalOnly=false) const
Return true if the specified operation is legal on this target or can be made legal with custom lower...
MulExpansionKind
Enum that specifies when a multiplication should be expanded.
static ISD::NodeType getExtendForContent(BooleanContent Content)
This class defines information used to lower LLVM code to legal SelectionDAG operators that the targe...
SDValue expandAddSubSat(SDNode *Node, SelectionDAG &DAG) const
Method for building the DAG expansion of ISD::[US][ADD|SUB]SAT.
SDValue buildSDIVPow2WithCMov(SDNode *N, const APInt &Divisor, SelectionDAG &DAG, SmallVectorImpl< SDNode * > &Created) const
Build sdiv by power-of-2 with conditional move instructions Ref: "Hacker's Delight" by Henry Warren 1...
virtual ConstraintWeight getMultipleConstraintMatchWeight(AsmOperandInfo &info, int maIndex) const
Examine constraint type and operand type and determine a weight value.
bool expandMultipleResultFPLibCall(SelectionDAG &DAG, RTLIB::Libcall LC, SDNode *Node, SmallVectorImpl< SDValue > &Results, std::optional< unsigned > CallRetResNo={}) const
Expands a node with multiple results to an FP or vector libcall.
bool expandMULO(SDNode *Node, SDValue &Result, SDValue &Overflow, SelectionDAG &DAG) const
Method for building the DAG expansion of ISD::[US]MULO.
bool expandMUL(SDNode *N, SDValue &Lo, SDValue &Hi, EVT HiLoVT, SelectionDAG &DAG, MulExpansionKind Kind, SDValue LL=SDValue(), SDValue LH=SDValue(), SDValue RL=SDValue(), SDValue RH=SDValue()) const
Expand a MUL into two nodes.
SmallVector< ConstraintPair > ConstraintGroup
virtual const MCExpr * getPICJumpTableRelocBaseExpr(const MachineFunction *MF, unsigned JTI, MCContext &Ctx) const
This returns the relocation base for the given PIC jumptable, the same as getPICJumpTableRelocBase,...
virtual Align computeKnownAlignForTargetInstr(GISelValueTracking &Analysis, Register R, const MachineRegisterInfo &MRI, unsigned Depth=0) const
Determine the known alignment for the pointer value R.
bool SimplifyDemandedVectorElts(SDValue Op, const APInt &DemandedEltMask, APInt &KnownUndef, APInt &KnownZero, TargetLoweringOpt &TLO, unsigned Depth=0, bool AssumeSingleUse=false) const
Look at Vector Op.
virtual bool isUsedByReturnOnly(SDNode *, SDValue &) const
Return true if result of the specified node is used by a return node only.
bool LegalizeSetCCCondCode(SelectionDAG &DAG, EVT VT, SDValue &LHS, SDValue &RHS, SDValue &CC, bool &NeedInvert, const SDLoc &dl, SDValue &Chain, bool IsSignaling=false) const
Legalize a SETCC with given LHS and RHS and condition code CC on the current target.
SDValue scalarizeVectorStore(StoreSDNode *ST, SelectionDAG &DAG) const
virtual unsigned getPreferredShrunkVectorSizeInBits(SDValue Op, const APInt &DemandedElts) const
If only low elements of a vector are demanded, shrink the operation to the returned size in bits by c...
virtual unsigned ComputeNumSignBitsForTargetNode(SDValue Op, const APInt &DemandedElts, const SelectionDAG &DAG, unsigned Depth=0) const
This method can be implemented by targets that want to expose additional information about sign bits ...
SDValue lowerCmpEqZeroToCtlzSrl(SDValue Op, SelectionDAG &DAG) const
void softenSetCCOperands(SelectionDAG &DAG, EVT VT, SDValue &NewLHS, SDValue &NewRHS, ISD::CondCode &CCCode, const SDLoc &DL, const SDValue OldLHS, const SDValue OldRHS) const
Soften the operands of a comparison.
void forceExpandWideMUL(SelectionDAG &DAG, const SDLoc &dl, bool Signed, const SDValue LHS, const SDValue RHS, SDValue &Lo, SDValue &Hi) const
Calculate full product of LHS and RHS either via a libcall or through brute force expansion of the mu...
SDValue expandVecReduceSeq(SDNode *Node, SelectionDAG &DAG) const
Expand a VECREDUCE_SEQ_* into an explicit ordered calculation.
SDValue expandFCANONICALIZE(SDNode *Node, SelectionDAG &DAG) const
Expand FCANONICALIZE to FMUL with 1.
SDValue expandCTLZ(SDNode *N, SelectionDAG &DAG) const
Expand CTLZ/CTLZ_ZERO_POISON nodes.
SDValue expandBITREVERSE(SDNode *N, SelectionDAG &DAG) const
Expand BITREVERSE nodes.
SDValue expandCTTZ(SDNode *N, SelectionDAG &DAG) const
Expand CTTZ/CTTZ_ZERO_POISON nodes.
virtual SDValue expandIndirectJTBranch(const SDLoc &dl, SDValue Value, SDValue Addr, int JTI, SelectionDAG &DAG) const
Expands target specific indirect branch for the case of JumpTable expansion.
SDValue expandABD(SDNode *N, SelectionDAG &DAG) const
Expand ABDS/ABDU nodes.
virtual bool targetShrinkDemandedConstant(SDValue Op, const APInt &DemandedBits, const APInt &DemandedElts, TargetLoweringOpt &TLO) const
std::vector< AsmOperandInfo > AsmOperandInfoVector
SDValue expandCLMUL(SDNode *N, SelectionDAG &DAG) const
Expand carryless multiply.
SDValue expandShlSat(SDNode *Node, SelectionDAG &DAG) const
Method for building the DAG expansion of ISD::[US]SHLSAT.
SDValue expandIS_FPCLASS(EVT ResultVT, SDValue Op, FPClassTest Test, SDNodeFlags Flags, const SDLoc &DL, SelectionDAG &DAG) const
Expand check for floating point class.
virtual bool isTargetCanonicalConstantNode(SDValue Op) const
Returns true if the given Opc is considered a canonical constant for the target, which should not be ...
SDValue expandFP_TO_INT_SAT(SDNode *N, SelectionDAG &DAG) const
Expand FP_TO_[US]INT_SAT into FP_TO_[US]INT and selects or min/max.
SDValue expandCttzElts(SDNode *Node, SelectionDAG &DAG) const
Expand a CTTZ_ELTS or CTTZ_ELTS_ZERO_POISON by calculating (VL - i) for each active lane (i),...
SDValue getCheaperNegatedExpression(SDValue Op, SelectionDAG &DAG, bool LegalOps, bool OptForSize, unsigned Depth=0) const
This is the helper function to return the newly negated expression only when the cost is cheaper.
virtual unsigned computeNumSignBitsForTargetInstr(GISelValueTracking &Analysis, Register R, const APInt &DemandedElts, const MachineRegisterInfo &MRI, unsigned Depth=0) const
This method can be implemented by targets that want to expose additional information about sign bits ...
SDValue SimplifyMultipleUseDemandedBits(SDValue Op, const APInt &DemandedBits, const APInt &DemandedElts, SelectionDAG &DAG, unsigned Depth=0) const
More limited version of SimplifyDemandedBits that can be used to "lookthrough" ops that don't contrib...
SDValue expandUnalignedStore(StoreSDNode *ST, SelectionDAG &DAG) const
Expands an unaligned store to 2 half-size stores for integer values, and possibly more for vectors.
SDValue SimplifyMultipleUseDemandedVectorElts(SDValue Op, const APInt &DemandedElts, SelectionDAG &DAG, unsigned Depth=0) const
Helper wrapper around SimplifyMultipleUseDemandedBits, demanding all bits from only some vector eleme...
virtual ConstraintType getConstraintType(StringRef Constraint) const
Given a constraint, return the type of constraint it is for this target.
virtual bool findOptimalMemOpLowering(LLVMContext &Context, std::vector< EVT > &MemOps, unsigned Limit, const MemOp &Op, unsigned DstAS, unsigned SrcAS, const AttributeList &FuncAttributes, EVT *LargestVT=nullptr) const
Determines the optimal series of memory ops to replace the memset / memcpy.
virtual SDValue unwrapAddress(SDValue N) const
void expandSADDSUBO(SDNode *Node, SDValue &Result, SDValue &Overflow, SelectionDAG &DAG) const
Method for building the DAG expansion of ISD::S(ADD|SUB)O.
SDValue expandABS(SDNode *N, SelectionDAG &DAG, bool IsNegative=false) const
Expand ABS nodes.
SDValue expandVecReduce(SDNode *Node, SelectionDAG &DAG) const
Expand a VECREDUCE_* into an explicit calculation.
bool ShrinkDemandedConstant(SDValue Op, const APInt &DemandedBits, const APInt &DemandedElts, TargetLoweringOpt &TLO) const
Check to see if the specified operand of the specified instruction is a constant integer.
virtual bool isGuaranteedNotToBeUndefOrPoisonForTargetNode(SDValue Op, const APInt &DemandedElts, const SelectionDAG &DAG, UndefPoisonKind Kind, unsigned Depth) const
Return true if this function can prove that Op is never poison and, Kind can be used to track poison ...
SDValue expandVPCTTZElements(SDNode *N, SelectionDAG &DAG) const
Expand VP_CTTZ_ELTS/VP_CTTZ_ELTS_ZERO_POISON nodes.
SDValue BuildSDIV(SDNode *N, SelectionDAG &DAG, bool IsAfterLegalization, bool IsAfterLegalTypes, SmallVectorImpl< SDNode * > &Created) const
Given an ISD::SDIV node expressing a divide by constant, return a DAG expression to select that will ...
virtual const char * getTargetNodeName(unsigned Opcode) const
This method returns the name of a target specific DAG node.
bool expandFP_TO_UINT(SDNode *N, SDValue &Result, SDValue &Chain, SelectionDAG &DAG) const
Expand float to UINT conversion.
bool parametersInCSRMatch(const MachineRegisterInfo &MRI, const uint32_t *CallerPreservedMask, const SmallVectorImpl< CCValAssign > &ArgLocs, const SmallVectorImpl< SDValue > &OutVals) const
Check whether parameters to a call that are passed in callee saved registers are the same as from the...
virtual bool SimplifyDemandedVectorEltsForTargetNode(SDValue Op, const APInt &DemandedElts, APInt &KnownUndef, APInt &KnownZero, TargetLoweringOpt &TLO, unsigned Depth=0) const
Attempt to simplify any target nodes based on the demanded vector elements, returning true on success...
bool expandREM(SDNode *Node, SDValue &Result, SelectionDAG &DAG) const
Expand an SREM or UREM using SDIV/UDIV or SDIVREM/UDIVREM, if legal.
std::pair< SDValue, SDValue > expandUnalignedLoad(LoadSDNode *LD, SelectionDAG &DAG) const
Expands an unaligned load to 2 half-size loads for an integer, and possibly more for vectors.
SDValue expandFMINIMUMNUM_FMAXIMUMNUM(SDNode *N, SelectionDAG &DAG) const
Expand fminimumnum/fmaximumnum into multiple comparison with selects.
void forceExpandMultiply(SelectionDAG &DAG, const SDLoc &dl, bool Signed, SDValue &Lo, SDValue &Hi, SDValue LHS, SDValue RHS, SDValue HiLHS=SDValue(), SDValue HiRHS=SDValue()) const
Calculate the product twice the width of LHS and RHS.
virtual SDValue LowerToTLSEmulatedModel(const GlobalAddressSDNode *GA, SelectionDAG &DAG) const
Lower TLS global address SDNode for target independent emulated TLS model.
virtual bool isTypeDesirableForOp(unsigned, EVT VT) const
Return true if the target has native support for the specified value type and it is 'desirable' to us...
SDValue expandVectorSplice(SDNode *Node, SelectionDAG &DAG) const
Method for building the DAG expansion of ISD::VECTOR_SPLICE.
SDValue getVectorSubVecPointer(SelectionDAG &DAG, SDValue VecPtr, EVT VecVT, EVT SubVecVT, SDValue Index, const SDNodeFlags PtrArithFlags=SDNodeFlags()) const
Get a pointer to a sub-vector of type SubVecVT at index Idx located in memory for a vector of type Ve...
SDValue expandLoopDependenceMask(SDNode *N, SelectionDAG &DAG) const
Expand LOOP_DEPENDENCE_MASK nodes.
virtual const char * LowerXConstraint(EVT ConstraintVT) const
Try to replace an X constraint, which matches anything, with another that has more specific requireme...
SDValue expandCTPOP(SDNode *N, SelectionDAG &DAG) const
Expand CTPOP nodes.
virtual void computeKnownBitsForTargetInstr(GISelValueTracking &Analysis, Register R, KnownBits &Known, const APInt &DemandedElts, const MachineRegisterInfo &MRI, unsigned Depth=0) const
Determine which of the bits specified in Mask are known to be either zero or one and return them in t...
SDValue BuildUDIV(SDNode *N, SelectionDAG &DAG, bool IsAfterLegalization, bool IsAfterLegalTypes, SmallVectorImpl< SDNode * > &Created) const
Given an ISD::UDIV node expressing a divide by constant, return a DAG expression to select that will ...
SDValue expandVectorNaryOpBySplitting(SDNode *Node, SelectionDAG &DAG) const
~TargetLowering() override
std::pair< SDValue, SDValue > LowerCallTo(CallLoweringInfo &CLI) const
This function lowers an abstract call to a function into an actual call.
SDValue expandBSWAP(SDNode *N, SelectionDAG &DAG) const
Expand BSWAP nodes.
SDValue expandFMINIMUM_FMAXIMUM(SDNode *N, SelectionDAG &DAG) const
Expand fminimum/fmaximum into multiple comparison with selects.
SDValue CTTZTableLookup(SDNode *N, SelectionDAG &DAG, const SDLoc &DL, EVT VT, SDValue Op, unsigned NumBitsPerElt) const
Expand CTTZ via Table Lookup.
bool expandDIVREMByConstant(SDNode *N, SmallVectorImpl< SDValue > &Result, EVT HiLoVT, SelectionDAG &DAG, SDValue LL=SDValue(), SDValue LH=SDValue()) const
Attempt to expand an n-bit div/rem/divrem by constant using an n/2-bit algorithm.
virtual void computeKnownBitsForTargetNode(const SDValue Op, KnownBits &Known, const APInt &DemandedElts, const SelectionDAG &DAG, unsigned Depth=0) const
Determine which of the bits specified in Mask are known to be either zero or one and return them in t...
bool isPositionIndependent() const
std::pair< StringRef, TargetLowering::ConstraintType > ConstraintPair
virtual SDValue getNegatedExpression(SDValue Op, SelectionDAG &DAG, bool LegalOps, bool OptForSize, NegatibleCost &Cost, unsigned Depth=0) const
Return the newly negated expression if the cost is not expensive and set the cost in Cost to indicate...
virtual ConstraintWeight getSingleConstraintMatchWeight(AsmOperandInfo &info, const char *constraint) const
Examine constraint string and operand type and determine a weight value.
ConstraintGroup getConstraintPreferences(AsmOperandInfo &OpInfo) const
Given an OpInfo with list of constraints codes as strings, return a sorted Vector of pairs of constra...
bool expandFP_TO_SINT(SDNode *N, SDValue &Result, SelectionDAG &DAG) const
Expand float(f32) to SINT(i64) conversion.
virtual SDValue SimplifyMultipleUseDemandedBitsForTargetNode(SDValue Op, const APInt &DemandedBits, const APInt &DemandedElts, SelectionDAG &DAG, unsigned Depth) const
More limited version of SimplifyDemandedBits that can be used to "lookthrough" ops that don't contrib...
virtual SDValue LowerAsmOutputForConstraint(SDValue &Chain, SDValue &Glue, const SDLoc &DL, const AsmOperandInfo &OpInfo, SelectionDAG &DAG) const
SDValue buildLegalVectorShuffle(EVT VT, const SDLoc &DL, SDValue N0, SDValue N1, MutableArrayRef< int > Mask, SelectionDAG &DAG) const
Tries to build a legal vector shuffle using the provided parameters or equivalent variations.
virtual void computeKnownBitsForStackObjectPointer(KnownBits &Known, const MachineFunction &MF, Align Alignment) const
Determine known bits of a pointer to a known valid stack object.
virtual SDValue getPICJumpTableRelocBase(SDValue Table, SelectionDAG &DAG) const
Returns relocation base for the given PIC jumptable.
std::pair< SDValue, SDValue > scalarizeVectorLoad(LoadSDNode *LD, SelectionDAG &DAG) const
Turn load of vector type into a load of the individual elements.
virtual std::pair< unsigned, const TargetRegisterClass * > getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI, StringRef Constraint, MVT VT) const
Given a physical register constraint (e.g.
bool SimplifyDemandedBits(SDValue Op, const APInt &DemandedBits, const APInt &DemandedElts, KnownBits &Known, TargetLoweringOpt &TLO, unsigned Depth=0, bool AssumeSingleUse=false) const
Look at Op.
virtual bool SimplifyDemandedBitsForTargetNode(SDValue Op, const APInt &DemandedBits, const APInt &DemandedElts, KnownBits &Known, TargetLoweringOpt &TLO, unsigned Depth=0) const
Attempt to simplify any target nodes based on the demanded bits/elts, returning true on success.
virtual bool isDesirableToCommuteXorWithShift(const SDNode *N) const
Return true if it is profitable to combine an XOR of a logical shift to create a logical shift of NOT...
TargetLowering(const TargetLowering &)=delete
virtual bool shouldSimplifyDemandedVectorElts(SDValue Op, const TargetLoweringOpt &TLO) const
Return true if the target supports simplifying demanded vector elements by converting them to undefs.
bool isConstFalseVal(SDValue N) const
Return if the N is a constant or constant vector equal to the false value from getBooleanContents().
SDValue IncrementMemoryAddress(SDValue Addr, SDValue Mask, const SDLoc &DL, EVT DataVT, SelectionDAG &DAG, bool IsCompressedMemory) const
Increments memory address Addr according to the type of the value DataVT that should be stored.
SDValue expandVectorMatch(SDNode *N, SelectionDAG &DAG) const
Expand VECTOR_MATCH nodes.
bool isInTailCallPosition(SelectionDAG &DAG, SDNode *Node, SDValue &Chain) const
Check whether a given call node is in tail position within its function.
SDValue expandCONVERT_TO_ARBITRARY_FP(SDNode *Node, SelectionDAG &DAG) const
Expand CONVERT_TO_ARBITRARY_FP using bit manipulation.
virtual AsmOperandInfoVector ParseConstraints(const DataLayout &DL, const TargetRegisterInfo *TRI, const CallBase &Call) const
Split up the constraint string from the inline assembly value into the specific constraints and their...
virtual bool isSplatValueForTargetNode(SDValue Op, const APInt &DemandedElts, APInt &UndefElts, const SelectionDAG &DAG, unsigned Depth=0) const
Return true if vector Op has the same value across all DemandedElts, indicating any elements which ma...
SDValue expandRoundInexactToOdd(EVT ResultVT, SDValue Op, const SDLoc &DL, SelectionDAG &DAG) const
Truncate Op to ResultVT.
virtual bool shouldSplitFunctionArgumentsAsLittleEndian(const DataLayout &DL) const
For most targets, an LLVM type must be broken down into multiple smaller types.
SDValue SimplifySetCC(EVT VT, SDValue N0, SDValue N1, ISD::CondCode Cond, bool foldBooleans, DAGCombinerInfo &DCI, const SDLoc &dl) const
Try to simplify a setcc built with the specified operands and cc.
SDValue expandFunnelShift(SDNode *N, SelectionDAG &DAG) const
Expand funnel shift.
virtual bool isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const
Return true if folding a constant offset with the given GlobalAddress is legal.
bool isExtendedTrueVal(const ConstantSDNode *N, EVT VT, bool SExt) const
Return if N is a True value when extended to VT.
bool ShrinkDemandedOp(SDValue Op, unsigned BitWidth, const APInt &DemandedBits, TargetLoweringOpt &TLO) const
Convert x+y to (VT)((SmallVT)x+(SmallVT)y) if the casts are free.
bool isConstTrueVal(SDValue N) const
Return if the N is a constant or constant vector equal to the true value from getBooleanContents().
SDValue expandFixedPointDiv(unsigned Opcode, const SDLoc &dl, SDValue LHS, SDValue RHS, unsigned Scale, SelectionDAG &DAG) const
Method for building the DAG expansion of ISD::[US]DIVFIX[SAT].
SDValue expandPEXT(SDNode *N, SelectionDAG &DAG) const
Expand parallel bit extract (compress).
virtual void ComputeConstraintToUse(AsmOperandInfo &OpInfo, SDValue Op, SelectionDAG *DAG=nullptr) const
Determines the constraint code and constraint type to use for the specific AsmOperandInfo,...
virtual void CollectTargetIntrinsicOperands(const CallInst &I, SmallVectorImpl< SDValue > &Ops, SelectionDAG &DAG) const
virtual bool canCreateUndefOrPoisonForTargetNode(SDValue Op, const APInt &DemandedElts, const SelectionDAG &DAG, UndefPoisonKind Kind, bool ConsiderFlags, unsigned Depth) const
Return true if Op can create undef or poison from non-undef & non-poison operands.
SDValue expandVECTOR_COMPRESS(SDNode *Node, SelectionDAG &DAG) const
Expand a vector VECTOR_COMPRESS into a sequence of extract element, store temporarily,...
virtual const Constant * getTargetConstantFromLoad(LoadSDNode *LD) const
This method returns the constant pool value that will be loaded by LD.
SDValue expandFP_ROUND(SDNode *Node, SelectionDAG &DAG) const
Expand round(fp) to fp conversion.
SDValue createSelectForFMINNUM_FMAXNUM(SDNode *Node, SelectionDAG &DAG) const
Try to convert the fminnum/fmaxnum to a compare/select sequence.
SDValue expandCONVERT_FROM_ARBITRARY_FP(SDNode *Node, SelectionDAG &DAG) const
Expand CONVERT_FROM_ARBITRARY_FP using bit manipulation.
SDValue expandROT(SDNode *N, bool AllowVectorOps, SelectionDAG &DAG) const
Expand rotations.
SDValue annotateStackObjectPointer(SDValue Ptr, SelectionDAG &DAG, const SDLoc &DL, Align Alignment) const
Annotate a stack object pointer with known-bits assertions.
virtual void LowerAsmOperandForConstraint(SDValue Op, StringRef Constraint, std::vector< SDValue > &Ops, SelectionDAG &DAG) const
Lower the specified operand into the Ops vector.
virtual SDValue getSqrtInputTest(SDValue Operand, SelectionDAG &DAG, const DenormalMode &Mode, SDNodeFlags Flags={}) const
Return a target-dependent comparison result if the input operand is suitable for use with a square ro...
SDValue getVectorElementPointer(SelectionDAG &DAG, SDValue VecPtr, EVT VecVT, SDValue Index, const SDNodeFlags PtrArithFlags=SDNodeFlags()) const
Get a pointer to vector element Idx located in memory for a vector of type VecVT starting at a base a...
SDValue expandFMINNUM_FMAXNUM(SDNode *N, SelectionDAG &DAG) const
Expand fminnum/fmaxnum into fminnum_ieee/fmaxnum_ieee with quieted inputs.
virtual bool isGAPlusOffset(SDNode *N, const GlobalValue *&GA, int64_t &Offset) const
Returns true (and the GlobalValue and the offset) if the node is a GlobalAddress + offset.
virtual void computeKnownFPClassForTargetNode(const SDValue Op, KnownFPClass &Known, const APInt &DemandedElts, const SelectionDAG &DAG, unsigned Depth=0) const
Determine floating-point class information for a target node.
virtual unsigned getJumpTableEncoding() const
Return the entry encoding for a jump table in the current function.
virtual void computeKnownFPClassForTargetInstr(GISelValueTracking &Analysis, Register R, KnownFPClass &Known, const APInt &DemandedElts, const MachineRegisterInfo &MRI, unsigned Depth=0) const
std::pair< SDValue, SDValue > makeLibCall(SelectionDAG &DAG, RTLIB::LibcallImpl LibcallImpl, EVT RetVT, ArrayRef< SDValue > Ops, MakeLibCallOptions CallOptions, const SDLoc &dl, SDValue Chain=SDValue()) const
Returns a pair of (return value, chain).
SDValue expandCMP(SDNode *Node, SelectionDAG &DAG) const
Method for building the DAG expansion of ISD::[US]CMP.
void expandShiftParts(SDNode *N, SDValue &Lo, SDValue &Hi, SelectionDAG &DAG) const
Expand shift-by-parts.
virtual bool isKnownNeverNaNForTargetNode(SDValue Op, const APInt &DemandedElts, const SelectionDAG &DAG, bool SNaN=false, unsigned Depth=0) const
If SNaN is false,.
virtual SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const
This method will be invoked for all target nodes and for any target-independent nodes that the target...
SDValue expandFixedPointMul(SDNode *Node, SelectionDAG &DAG) const
Method for building the DAG expansion of ISD::[U|S]MULFIX[SAT].
SDValue getInboundsVectorElementPointer(SelectionDAG &DAG, SDValue VecPtr, EVT VecVT, SDValue Index) const
Get a pointer to vector element Idx located in memory for a vector of type VecVT starting at a base a...
SDValue expandIntMINMAX(SDNode *Node, SelectionDAG &DAG) const
Method for building the DAG expansion of ISD::[US][MIN|MAX].
SDValue expandVectorFindLastActive(SDNode *N, SelectionDAG &DAG) const
Expand VECTOR_FIND_LAST_ACTIVE nodes.
SDValue expandPartialReduceMLA(SDNode *Node, SelectionDAG &DAG) const
Expands PARTIAL_REDUCE_S/UMLA nodes to a series of simpler operations, consisting of zext/sext,...
void expandUADDSUBO(SDNode *Node, SDValue &Result, SDValue &Overflow, SelectionDAG &DAG) const
Method for building the DAG expansion of ISD::U(ADD|SUB)O.
SDValue expandPDEP(SDNode *N, SelectionDAG &DAG) const
Expand parallel bit deposit (expand).
virtual SDValue BuildSDIVPow2(SDNode *N, const APInt &Divisor, SelectionDAG &DAG, SmallVectorImpl< SDNode * > &Created) const
Targets may override this function to provide custom SDIV lowering for power-of-2 denominators.
SDValue scalarizeExtractedVectorLoad(EVT ResultVT, const SDLoc &DL, EVT InVecVT, SDValue EltNo, LoadSDNode *OriginalLoad, SelectionDAG &DAG) const
Replace an extraction of a load with a narrowed load.
virtual SDValue BuildSREMPow2(SDNode *N, const APInt &Divisor, SelectionDAG &DAG, SmallVectorImpl< SDNode * > &Created) const
Targets may override this function to provide custom SREM lowering for power-of-2 denominators.
bool expandUINT_TO_FP(SDNode *N, SDValue &Result, SDValue &Chain, SelectionDAG &DAG) const
Expand UINT(i64) to double(f64) conversion.
bool expandMUL_LOHI(unsigned Opcode, EVT VT, const SDLoc &dl, SDValue LHS, SDValue RHS, SmallVectorImpl< SDValue > &Result, EVT HiLoVT, SelectionDAG &DAG, MulExpansionKind Kind, SDValue LL=SDValue(), SDValue LH=SDValue(), SDValue RL=SDValue(), SDValue RH=SDValue()) const
Expand a MUL or [US]MUL_LOHI of n-bit values into two or four nodes, respectively,...
SDValue expandAVG(SDNode *N, SelectionDAG &DAG) const
Expand vector/scalar AVGCEILS/AVGCEILU/AVGFLOORS/AVGFLOORU nodes.
SDValue expandCTLS(SDNode *N, SelectionDAG &DAG) const
Expand CTLS (count leading sign bits) nodes.
void setTypeIdForCallsiteInfo(const CallBase *CB, MachineFunction &MF, MachineFunction::CallSiteInfo &CSInfo) const
Primary interface to the complete machine description for the target machine.
bool isPositionIndependent() const
const Triple & getTargetTriple() const
TargetOptions Options
unsigned EmitCallSiteInfo
The flag enables call site info production.
unsigned EmitCallGraphSection
Emit section containing call graph metadata.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
virtual StringRef getRegAsmName(MCRegister Reg) const
Return the assembly name for Reg.
bool isTypeLegalForClass(const TargetRegisterClass &RC, MVT T) const
Return true if the given TargetRegisterClass has the ValueType T.
TargetSubtargetInfo - Generic base class for all target subtargets.
bool isOSBinFormatCOFF() const
Tests whether the OS uses the COFF binary format.
Definition Triple.h: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
@ Fast
Assign the register banks as fast as possible (default).
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