LLVM 24.0.0git
TargetLowering.cpp
Go to the documentation of this file.
1//===-- TargetLowering.cpp - Implement the TargetLowering class -----------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This implements the TargetLowering class.
10//
11//===----------------------------------------------------------------------===//
12
14#include "llvm/ADT/STLExtras.h"
27#include "llvm/IR/DataLayout.h"
30#include "llvm/IR/LLVMContext.h"
31#include "llvm/MC/MCAsmInfo.h"
32#include "llvm/MC/MCExpr.h"
38#include <cctype>
39#include <deque>
40using namespace llvm;
41using namespace llvm::SDPatternMatch;
42
43/// NOTE: The TargetMachine owns TLOF.
47
48// Define the virtual destructor out-of-line for build efficiency.
50
51const char *TargetLowering::getTargetNodeName(unsigned Opcode) const {
52 return nullptr;
53}
54
58
59/// Check whether a given call node is in tail position within its function. If
60/// so, it sets Chain to the input chain of the tail call.
62 SDValue &Chain) const {
64
65 // First, check if tail calls have been disabled in this function.
66 if (F.getFnAttribute("disable-tail-calls").getValueAsBool())
67 return false;
68
69 // Conservatively require the attributes of the call to match those of
70 // the return. Ignore following attributes because they don't affect the
71 // call sequence.
72 AttrBuilder CallerAttrs(F.getContext(), F.getAttributes().getRetAttrs());
73 for (const auto &Attr : {Attribute::Alignment, Attribute::Dereferenceable,
74 Attribute::DereferenceableOrNull, Attribute::NoAlias,
75 Attribute::NonNull, Attribute::NoUndef,
76 Attribute::Range, Attribute::NoFPClass})
77 CallerAttrs.removeAttribute(Attr);
78
79 if (CallerAttrs.hasAttributes())
80 return false;
81
82 // It's not safe to eliminate the sign / zero extension of the return value.
83 if (CallerAttrs.contains(Attribute::ZExt) ||
84 CallerAttrs.contains(Attribute::SExt))
85 return false;
86
87 // Check if the only use is a function return node.
88 return isUsedByReturnOnly(Node, Chain);
89}
90
92 const uint32_t *CallerPreservedMask,
93 const SmallVectorImpl<CCValAssign> &ArgLocs,
94 const SmallVectorImpl<SDValue> &OutVals) const {
95 for (unsigned I = 0, E = ArgLocs.size(); I != E; ++I) {
96 const CCValAssign &ArgLoc = ArgLocs[I];
97 if (!ArgLoc.isRegLoc())
98 continue;
99 MCRegister Reg = ArgLoc.getLocReg();
100 // Only look at callee saved registers.
101 if (MachineOperand::clobbersPhysReg(CallerPreservedMask, Reg))
102 continue;
103 // Check that we pass the value used for the caller.
104 // (We look for a CopyFromReg reading a virtual register that is used
105 // for the function live-in value of register Reg)
106 SDValue Value = OutVals[I];
107 if (Value->getOpcode() == ISD::AssertZext)
108 Value = Value.getOperand(0);
109 if (Value->getOpcode() != ISD::CopyFromReg)
110 return false;
111 Register ArgReg = cast<RegisterSDNode>(Value->getOperand(1))->getReg();
112 if (MRI.getLiveInPhysReg(ArgReg) != Reg)
113 return false;
114 }
115 return true;
116}
117
118/// Set CallLoweringInfo attribute flags based on a call instruction
119/// and called function attributes.
121 unsigned ArgIdx) {
122 IsSExt = Call->paramHasAttr(ArgIdx, Attribute::SExt);
123 IsZExt = Call->paramHasAttr(ArgIdx, Attribute::ZExt);
124 IsNoExt = Call->paramHasAttr(ArgIdx, Attribute::NoExt);
125 IsInReg = Call->paramHasAttr(ArgIdx, Attribute::InReg);
126 IsSRet = Call->paramHasAttr(ArgIdx, Attribute::StructRet);
127 IsNest = Call->paramHasAttr(ArgIdx, Attribute::Nest);
128 IsByVal = Call->paramHasAttr(ArgIdx, Attribute::ByVal);
129 IsPreallocated = Call->paramHasAttr(ArgIdx, Attribute::Preallocated);
130 IsInAlloca = Call->paramHasAttr(ArgIdx, Attribute::InAlloca);
131 IsReturned = Call->paramHasAttr(ArgIdx, Attribute::Returned);
132 IsSwiftSelf = Call->paramHasAttr(ArgIdx, Attribute::SwiftSelf);
133 IsSwiftAsync = Call->paramHasAttr(ArgIdx, Attribute::SwiftAsync);
134 IsSwiftError = Call->paramHasAttr(ArgIdx, Attribute::SwiftError);
135 Alignment = Call->getParamStackAlign(ArgIdx);
136 IndirectType = nullptr;
138 "multiple ABI attributes?");
139 if (IsByVal) {
140 IndirectType = Call->getParamByValType(ArgIdx);
141 if (!Alignment)
142 Alignment = Call->getParamAlign(ArgIdx);
143 }
144 if (IsPreallocated)
145 IndirectType = Call->getParamPreallocatedType(ArgIdx);
146 if (IsInAlloca)
147 IndirectType = Call->getParamInAllocaType(ArgIdx);
148 if (IsSRet)
149 IndirectType = Call->getParamStructRetType(ArgIdx);
150}
151
152/// Generate a libcall taking the given operands as arguments and returning a
153/// result of type RetVT.
154std::pair<SDValue, SDValue>
155TargetLowering::makeLibCall(SelectionDAG &DAG, RTLIB::LibcallImpl LibcallImpl,
157 MakeLibCallOptions CallOptions, const SDLoc &dl,
158 SDValue InChain) const {
159 if (LibcallImpl == RTLIB::Unsupported)
160 reportFatalInternalError("unsupported library call operation");
161
162 if (!InChain)
163 InChain = DAG.getEntryNode();
164
166 Args.reserve(Ops.size());
167
168 ArrayRef<Type *> OpsTypeOverrides = CallOptions.OpsTypeOverrides;
169 for (unsigned i = 0; i < Ops.size(); ++i) {
170 SDValue NewOp = Ops[i];
171 Type *Ty = i < OpsTypeOverrides.size() && OpsTypeOverrides[i]
172 ? OpsTypeOverrides[i]
173 : NewOp.getValueType().getTypeForEVT(*DAG.getContext());
174 TargetLowering::ArgListEntry Entry(NewOp, Ty);
175 if (CallOptions.IsSoften)
176 Entry.OrigTy =
177 CallOptions.OpsVTBeforeSoften[i].getTypeForEVT(*DAG.getContext());
178
179 Entry.IsSExt =
180 shouldSignExtendTypeInLibCall(Entry.Ty, CallOptions.IsSigned);
181 Entry.IsZExt = !Entry.IsSExt;
182
183 if (CallOptions.IsSoften &&
185 Entry.IsSExt = Entry.IsZExt = false;
186 }
187 Args.push_back(Entry);
188 }
189
190 SDValue Callee =
191 DAG.getExternalSymbol(LibcallImpl, getPointerTy(DAG.getDataLayout()));
192
193 Type *RetTy = RetVT.getTypeForEVT(*DAG.getContext());
194 Type *OrigRetTy = RetTy;
196 bool signExtend = shouldSignExtendTypeInLibCall(RetTy, CallOptions.IsSigned);
197 bool zeroExtend = !signExtend;
198
199 if (CallOptions.IsSoften) {
200 OrigRetTy = CallOptions.RetVTBeforeSoften.getTypeForEVT(*DAG.getContext());
202 signExtend = zeroExtend = false;
203 }
204
205 CLI.setDebugLoc(dl)
206 .setChain(InChain)
207 .setLibCallee(getLibcallImplCallingConv(LibcallImpl), RetTy, OrigRetTy,
208 Callee, std::move(Args))
209 .setNoReturn(CallOptions.DoesNotReturn)
212 .setSExtResult(signExtend)
213 .setZExtResult(zeroExtend);
214 return LowerCallTo(CLI);
215}
216
218 LLVMContext &Context, std::vector<EVT> &MemOps, unsigned Limit,
219 const MemOp &Op, unsigned DstAS, unsigned SrcAS,
220 const AttributeList &FuncAttributes, EVT *LargestVT) const {
221 EVT VT = getOptimalMemOpType(Context, Op, FuncAttributes);
222
223 if (VT == MVT::Other) {
224 // Use the largest integer type whose alignment constraints are satisfied.
225 VT = MVT::LAST_INTEGER_VALUETYPE;
226 if (Op.isFixedDstAlign()) {
227 bool LoadsFromSrc = Op.isMemcpyOrMemmove() && !Op.isMemcpyStrSrc();
228 while (VT != MVT::i8) {
229 unsigned VTSize = VT.getSizeInBits() / 8;
230 bool DstOk =
231 Op.getDstAlign() >= VTSize ||
232 allowsMisalignedMemoryAccesses(VT, DstAS, Op.getDstAlign());
233 bool SrcOk =
234 !LoadsFromSrc || Op.getSrcAlign() >= VTSize ||
235 allowsMisalignedMemoryAccesses(VT, SrcAS, Op.getSrcAlign());
236 if (DstOk && SrcOk)
237 break;
239 }
240 }
241 assert(VT.isInteger());
242
243 // Find the largest legal integer type.
244 MVT LVT = MVT::LAST_INTEGER_VALUETYPE;
245 while (!isTypeLegal(LVT))
246 LVT = (MVT::SimpleValueType)(LVT.SimpleTy - 1);
247 assert(LVT.isInteger());
248
249 // If the type we've chosen is larger than the largest legal integer type
250 // then use the largest legal type.
251 if (VT.bitsGT(LVT))
252 VT = LVT;
253 }
254
255 unsigned NumMemOps = 0;
256 uint64_t Size = Op.size();
257 while (Size) {
258 unsigned VTSize = VT.getSizeInBits() / 8;
259 while (VTSize > Size) {
260 // For now, only use non-vector load / store's for the left-over pieces.
261 EVT NewVT = VT;
262 unsigned NewVTSize;
263
264 bool Found = false;
265 if (VT.isVector() || VT.isFloatingPoint()) {
266 NewVT = (VT.getSizeInBits() > 64) ? MVT::i64 : MVT::i32;
269 Found = true;
270 else if (NewVT == MVT::i64 &&
272 isSafeMemOpType(MVT::f64)) {
273 // i64 is usually not legal on 32-bit targets, but f64 may be.
274 NewVT = MVT::f64;
275 Found = true;
276 }
277 }
278
279 if (!Found) {
280 do {
281 NewVT = (MVT::SimpleValueType)(NewVT.getSimpleVT().SimpleTy - 1);
282 if (NewVT == MVT::i8)
283 break;
284 } while (!isSafeMemOpType(NewVT.getSimpleVT()));
285 }
286 NewVTSize = NewVT.getSizeInBits() / 8;
287
288 // If the new VT cannot cover all of the remaining bits, then consider
289 // issuing a (or a pair of) unaligned and overlapping load / store.
290 unsigned Fast;
291 if (NumMemOps && !Op.isVolatile() && NewVTSize < Size &&
293 VT, DstAS, Op.isFixedDstAlign() ? Op.getDstAlign() : Align(1),
295 Fast)
296 VTSize = Size;
297 else {
298 VT = NewVT;
299 VTSize = NewVTSize;
300 }
301 }
302
303 if (++NumMemOps > Limit)
304 return false;
305
306 MemOps.push_back(VT);
307 Size -= VTSize;
308 }
309
310 return true;
311}
312
313/// Soften the operands of a comparison. This code is shared among BR_CC,
314/// SELECT_CC, and SETCC handlers.
316 SDValue &NewLHS, SDValue &NewRHS,
317 ISD::CondCode &CCCode,
318 const SDLoc &dl, const SDValue OldLHS,
319 const SDValue OldRHS) const {
320 SDValue Chain;
321 return softenSetCCOperands(DAG, VT, NewLHS, NewRHS, CCCode, dl, OldLHS,
322 OldRHS, Chain);
323}
324
325/// Select the libcall and the condition code to test its result against 0 for
326/// an ordered floating-point compare. \p BoolLC is the boolean helper (result
327/// is 0/1). \p TriStateLC is the per-predicate three-way helper and \p
328/// GenericLC the generic single-symbol three-way helper (both return -1/0/1,
329/// tested against 0 with \p TriStateCC). The boolean form is preferred, then
330/// the per-predicate three-way, then the generic three-way.
331static std::pair<RTLIB::Libcall, ISD::CondCode>
332selectFPCmpLibcall(const LibcallLoweringInfo &Libcalls, RTLIB::Libcall BoolLC,
333 RTLIB::Libcall TriStateLC, RTLIB::Libcall GenericLC,
334 ISD::CondCode TriStateCC) {
335 if (Libcalls.getLibcallImpl(BoolLC) != RTLIB::Unsupported)
336 return {BoolLC, ISD::SETNE};
337 if (Libcalls.getLibcallImpl(TriStateLC) != RTLIB::Unsupported)
338 return {TriStateLC, TriStateCC};
339 return {GenericLC, TriStateCC};
340}
341
343 SDValue &NewLHS, SDValue &NewRHS,
344 ISD::CondCode &CCCode,
345 const SDLoc &dl, const SDValue OldLHS,
346 const SDValue OldRHS,
347 SDValue &Chain,
348 bool IsSignaling) const {
349 // FIXME: Currently we cannot really respect all IEEE predicates due to libgcc
350 // not supporting it. We can update this code when libgcc provides such
351 // functions.
352
353 assert((VT == MVT::f32 || VT == MVT::f64 || VT == MVT::f128 || VT == MVT::ppcf128)
354 && "Unsupported setcc type!");
355
356 // Expand into one or more soft-fp libcall(s).
357 RTLIB::Libcall LC1 = RTLIB::UNKNOWN_LIBCALL, LC2 = RTLIB::UNKNOWN_LIBCALL;
359 bool ShouldInvertCC = false;
360
361 // Expand a compare libcall family name (e.g. OEQ, FCMP3_PRED_OEQ) to the
362 // RTLIB::Libcall for VT.
363#define FP_CMP_LIBCALL(BASE) \
364 RTLIB::getFPLibCall(VT, RTLIB::BASE##_F32, RTLIB::BASE##_F64, \
365 RTLIB::UNKNOWN_LIBCALL, RTLIB::BASE##_F128, \
366 RTLIB::BASE##_PPCF128)
367
368 switch (CCCode) {
369 case ISD::SETEQ:
370 case ISD::SETOEQ:
371 std::tie(LC1, CC1) = selectFPCmpLibcall(
372 DAG.getLibcalls(), FP_CMP_LIBCALL(OEQ), FP_CMP_LIBCALL(FCMP3_PRED_OEQ),
373 FP_CMP_LIBCALL(FCMP3), ISD::SETEQ);
374 break;
375 case ISD::SETNE:
376 case ISD::SETUNE:
377 std::tie(LC1, CC1) = selectFPCmpLibcall(
378 DAG.getLibcalls(), FP_CMP_LIBCALL(UNE), FP_CMP_LIBCALL(FCMP3_PRED_UNE),
379 FP_CMP_LIBCALL(FCMP3), ISD::SETNE);
380 // Some ABIs (e.g. AEABI) provide neither a not-equal nor a three-way
381 // compare; obtain not-equal (UNE = !OEQ) by inverting ordered-equal.
382 if (DAG.getLibcalls().getLibcallImpl(LC1) == RTLIB::Unsupported) {
383 std::tie(LC1, CC1) = selectFPCmpLibcall(
384 DAG.getLibcalls(), FP_CMP_LIBCALL(OEQ),
385 FP_CMP_LIBCALL(FCMP3_PRED_OEQ), FP_CMP_LIBCALL(FCMP3), ISD::SETEQ);
386 ShouldInvertCC = true;
387 }
388 break;
389 case ISD::SETGE:
390 case ISD::SETOGE:
391 std::tie(LC1, CC1) = selectFPCmpLibcall(
392 DAG.getLibcalls(), FP_CMP_LIBCALL(OGE), FP_CMP_LIBCALL(FCMP3_PRED_OGE),
393 FP_CMP_LIBCALL(FCMP3), ISD::SETGE);
394 break;
395 case ISD::SETLT:
396 case ISD::SETOLT:
397 std::tie(LC1, CC1) = selectFPCmpLibcall(
398 DAG.getLibcalls(), FP_CMP_LIBCALL(OLT), FP_CMP_LIBCALL(FCMP3_PRED_OLT),
399 FP_CMP_LIBCALL(FCMP3), ISD::SETLT);
400 break;
401 case ISD::SETLE:
402 case ISD::SETOLE:
403 std::tie(LC1, CC1) = selectFPCmpLibcall(
404 DAG.getLibcalls(), FP_CMP_LIBCALL(OLE), FP_CMP_LIBCALL(FCMP3_PRED_OLE),
405 FP_CMP_LIBCALL(FCMP3), ISD::SETLE);
406 break;
407 case ISD::SETGT:
408 case ISD::SETOGT:
409 std::tie(LC1, CC1) = selectFPCmpLibcall(
410 DAG.getLibcalls(), FP_CMP_LIBCALL(OGT), FP_CMP_LIBCALL(FCMP3_PRED_OGT),
411 FP_CMP_LIBCALL(FCMP3), ISD::SETGT);
412 break;
413 case ISD::SETO:
414 ShouldInvertCC = true;
415 [[fallthrough]];
416 case ISD::SETUO:
417 // Unordered is a boolean everywhere (__unordXf2 returns 0/1).
418 LC1 = FP_CMP_LIBCALL(UO);
419 CC1 = ISD::SETNE;
420 break;
421 case ISD::SETONE:
422 // SETONE = O && UNE
423 ShouldInvertCC = true;
424 [[fallthrough]];
425 case ISD::SETUEQ:
426 LC1 = FP_CMP_LIBCALL(UO);
427 CC1 = ISD::SETNE;
428 std::tie(LC2, CC2) = selectFPCmpLibcall(
429 DAG.getLibcalls(), FP_CMP_LIBCALL(OEQ), FP_CMP_LIBCALL(FCMP3_PRED_OEQ),
430 FP_CMP_LIBCALL(FCMP3), ISD::SETEQ);
431 break;
432 default:
433 // Invert CC for unordered comparisons, handled by the ordered inverse.
434 ShouldInvertCC = true;
435 switch (CCCode) {
436 case ISD::SETULT:
437 std::tie(LC1, CC1) = selectFPCmpLibcall(
438 DAG.getLibcalls(), FP_CMP_LIBCALL(OGE),
439 FP_CMP_LIBCALL(FCMP3_PRED_OGE), FP_CMP_LIBCALL(FCMP3), ISD::SETGE);
440 break;
441 case ISD::SETULE:
442 std::tie(LC1, CC1) = selectFPCmpLibcall(
443 DAG.getLibcalls(), FP_CMP_LIBCALL(OGT),
444 FP_CMP_LIBCALL(FCMP3_PRED_OGT), FP_CMP_LIBCALL(FCMP3), ISD::SETGT);
445 break;
446 case ISD::SETUGT:
447 std::tie(LC1, CC1) = selectFPCmpLibcall(
448 DAG.getLibcalls(), FP_CMP_LIBCALL(OLE),
449 FP_CMP_LIBCALL(FCMP3_PRED_OLE), FP_CMP_LIBCALL(FCMP3), ISD::SETLE);
450 break;
451 case ISD::SETUGE:
452 std::tie(LC1, CC1) = selectFPCmpLibcall(
453 DAG.getLibcalls(), FP_CMP_LIBCALL(OLT),
454 FP_CMP_LIBCALL(FCMP3_PRED_OLT), FP_CMP_LIBCALL(FCMP3), ISD::SETLT);
455 break;
456 default:
457 llvm_unreachable("Do not know how to soften this setcc!");
458 }
459 }
460
461#undef FP_CMP_LIBCALL
462
463 // Use the target specific return value for comparison lib calls.
465 SDValue Ops[2] = {NewLHS, NewRHS};
467 EVT OpsVT[2] = { OldLHS.getValueType(),
468 OldRHS.getValueType() };
469 CallOptions.setTypeListBeforeSoften(OpsVT, RetVT);
470 auto Call = makeLibCall(DAG, LC1, RetVT, Ops, CallOptions, dl, Chain);
471 NewLHS = Call.first;
472 NewRHS = DAG.getConstant(0, dl, RetVT);
473
474 if (DAG.getLibcalls().getLibcallImpl(LC1) == RTLIB::Unsupported) {
476 "no libcall available to soften floating-point compare");
477 }
478
479 CCCode = CC1;
480 if (ShouldInvertCC) {
481 assert(RetVT.isInteger());
482 CCCode = getSetCCInverse(CCCode, RetVT);
483 }
484
485 if (LC2 == RTLIB::UNKNOWN_LIBCALL) {
486 // Update Chain.
487 Chain = Call.second;
488 } else {
489 if (DAG.getLibcalls().getLibcallImpl(LC2) == RTLIB::Unsupported) {
491 "no libcall available to soften floating-point compare");
492 }
493
494 assert(CCCode == (ShouldInvertCC ? ISD::SETEQ : ISD::SETNE) &&
495 "unordered call should be simple boolean");
496
497 EVT SetCCVT =
498 getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), RetVT);
500 NewLHS = DAG.getNode(ISD::AssertZext, dl, RetVT, Call.first,
501 DAG.getValueType(MVT::i1));
502 }
503
504 SDValue Tmp = DAG.getSetCC(dl, SetCCVT, NewLHS, NewRHS, CCCode);
505 auto Call2 = makeLibCall(DAG, LC2, RetVT, Ops, CallOptions, dl, Chain);
506 CCCode = CC2;
507 if (ShouldInvertCC)
508 CCCode = getSetCCInverse(CCCode, RetVT);
509 NewLHS = DAG.getSetCC(dl, SetCCVT, Call2.first, NewRHS, CCCode);
510 if (Chain)
511 Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Call.second,
512 Call2.second);
513 NewLHS = DAG.getNode(ShouldInvertCC ? ISD::AND : ISD::OR, dl,
514 Tmp.getValueType(), Tmp, NewLHS);
515 NewRHS = SDValue();
516 }
517}
518
519/// Return the entry encoding for a jump table in the current function. The
520/// returned value is a member of the MachineJumpTableInfo::JTEntryKind enum.
522 // In non-pic modes, just use the address of a block.
525
526 // Otherwise, use a label difference.
528}
529
534
535/// This returns the relocation base for the given PIC jumptable, the same as
536/// getPICJumpTableRelocBase, but as an MCExpr.
537const MCExpr *
539 unsigned JTI,MCContext &Ctx) const{
540 // The normal PIC reloc base is the label at the start of the jump table.
541 return MCSymbolRefExpr::create(MF->getJTISymbol(JTI, Ctx), Ctx);
542}
543
545 SDValue Addr, int JTI,
546 SelectionDAG &DAG) const {
547 SDValue Chain = Value;
548 // Jump table debug info is only needed if CodeView is enabled.
550 Chain = DAG.getJumpTableDebugInfo(JTI, Chain, dl);
551 }
552 return DAG.getNode(ISD::BRIND, dl, MVT::Other, Chain, Addr);
553}
554
555bool
557 const TargetMachine &TM = getTargetMachine();
558 const GlobalValue *GV = GA->getGlobal();
559
560 // If the address is not even local to this DSO we will have to load it from
561 // a got and then add the offset.
562 if (!TM.shouldAssumeDSOLocal(GV))
563 return false;
564
565 // If the code is position independent we will have to add a base register.
567 return false;
568
569 // Otherwise we can do it.
570 return true;
571}
572
573//===----------------------------------------------------------------------===//
574// Optimization Methods
575//===----------------------------------------------------------------------===//
576
577/// If the specified instruction has a constant integer operand and there are
578/// bits set in that constant that are not demanded, then clear those bits and
579/// return true.
581 const APInt &DemandedBits,
582 const APInt &DemandedElts,
583 TargetLoweringOpt &TLO) const {
584 SDLoc DL(Op);
585 unsigned Opcode = Op.getOpcode();
586
587 // Early-out if we've ended up calling an undemanded node, leave this to
588 // constant folding.
589 if (DemandedBits.isZero() || DemandedElts.isZero())
590 return false;
591
592 // Do target-specific constant optimization.
593 if (targetShrinkDemandedConstant(Op, DemandedBits, DemandedElts, TLO))
594 return TLO.New.getNode();
595
596 // FIXME: ISD::SELECT, ISD::SELECT_CC
597 switch (Opcode) {
598 default:
599 break;
600 case ISD::XOR:
601 case ISD::AND:
602 case ISD::OR: {
603 auto *Op1C = dyn_cast<ConstantSDNode>(Op.getOperand(1));
604 if (!Op1C || Op1C->isOpaque())
605 return false;
606
607 // If this is a 'not' op, don't touch it because that's a canonical form.
608 const APInt &C = Op1C->getAPIntValue();
609 if (Opcode == ISD::XOR && DemandedBits.isSubsetOf(C))
610 return false;
611
612 if (!C.isSubsetOf(DemandedBits)) {
613 EVT VT = Op.getValueType();
614 SDValue NewC = TLO.DAG.getConstant(DemandedBits & C, DL, VT);
615 SDValue NewOp = TLO.DAG.getNode(Opcode, DL, VT, Op.getOperand(0), NewC,
616 Op->getFlags());
617 return TLO.CombineTo(Op, NewOp);
618 }
619
620 break;
621 }
622 }
623
624 return false;
625}
626
628 const APInt &DemandedBits,
629 TargetLoweringOpt &TLO) const {
630 EVT VT = Op.getValueType();
631 APInt DemandedElts = VT.isVector()
633 : APInt(1, 1);
634 return ShrinkDemandedConstant(Op, DemandedBits, DemandedElts, TLO);
635}
636
637/// Convert x+y to (VT)((SmallVT)x+(SmallVT)y) if the casts are free.
638/// This uses isTruncateFree/isZExtFree and ANY_EXTEND for the widening cast,
639/// but it could be generalized for targets with other types of implicit
640/// widening casts.
642 const APInt &DemandedBits,
643 TargetLoweringOpt &TLO) const {
644 assert(Op.getNumOperands() == 2 &&
645 "ShrinkDemandedOp only supports binary operators!");
646 assert(Op.getNode()->getNumValues() == 1 &&
647 "ShrinkDemandedOp only supports nodes with one result!");
648
649 EVT VT = Op.getValueType();
650 SelectionDAG &DAG = TLO.DAG;
651 SDLoc dl(Op);
652
653 // Early return, as this function cannot handle vector types.
654 if (VT.isVector())
655 return false;
656
657 assert(Op.getOperand(0).getValueType().getScalarSizeInBits() == BitWidth &&
658 Op.getOperand(1).getValueType().getScalarSizeInBits() == BitWidth &&
659 "ShrinkDemandedOp only supports operands that have the same size!");
660
661 // Don't do this if the node has another user, which may require the
662 // full value.
663 if (!Op.getNode()->hasOneUse())
664 return false;
665
666 // Search for the smallest integer type with free casts to and from
667 // Op's type. For expedience, just check power-of-2 integer types.
668 unsigned DemandedSize = DemandedBits.getActiveBits();
669 for (unsigned SmallVTBits = llvm::bit_ceil(DemandedSize);
670 SmallVTBits < BitWidth; SmallVTBits = NextPowerOf2(SmallVTBits)) {
671 EVT SmallVT = EVT::getIntegerVT(*DAG.getContext(), SmallVTBits);
672 if (isTruncateFree(Op, SmallVT) && isZExtFree(SmallVT, VT)) {
673 // We found a type with free casts.
674
675 // If the operation has the 'disjoint' flag, then the
676 // operands on the new node are also disjoint.
677 SDNodeFlags Flags(Op->getFlags().hasDisjoint() ? SDNodeFlags::Disjoint
679 unsigned Opcode = Op.getOpcode();
680 if (Opcode == ISD::PTRADD) {
681 // It isn't a ptradd anymore if it doesn't operate on the entire
682 // pointer.
683 Opcode = ISD::ADD;
684 }
685 SDValue X = DAG.getNode(
686 Opcode, dl, SmallVT,
687 DAG.getNode(ISD::TRUNCATE, dl, SmallVT, Op.getOperand(0)),
688 DAG.getNode(ISD::TRUNCATE, dl, SmallVT, Op.getOperand(1)), Flags);
689 assert(DemandedSize <= SmallVTBits && "Narrowed below demanded bits?");
690 SDValue Z = DAG.getNode(ISD::ANY_EXTEND, dl, VT, X);
691 return TLO.CombineTo(Op, Z);
692 }
693 }
694 return false;
695}
696
698 DAGCombinerInfo &DCI) const {
699 SelectionDAG &DAG = DCI.DAG;
700 TargetLoweringOpt TLO(DAG, !DCI.isBeforeLegalize(),
701 !DCI.isBeforeLegalizeOps());
703
704 bool Simplified = SimplifyDemandedBits(Op, DemandedBits, Known, TLO);
705 if (Simplified) {
706 DCI.AddToWorklist(Op.getNode());
708 }
709 return Simplified;
710}
711
713 const APInt &DemandedElts,
714 DAGCombinerInfo &DCI) const {
715 SelectionDAG &DAG = DCI.DAG;
716 TargetLoweringOpt TLO(DAG, !DCI.isBeforeLegalize(),
717 !DCI.isBeforeLegalizeOps());
719
720 bool Simplified =
721 SimplifyDemandedBits(Op, DemandedBits, DemandedElts, Known, TLO);
722 if (Simplified) {
723 DCI.AddToWorklist(Op.getNode());
725 }
726 return Simplified;
727}
728
732 unsigned Depth,
733 bool AssumeSingleUse) const {
734 EVT VT = Op.getValueType();
735
736 // Since the number of lanes in a scalable vector is unknown at compile time,
737 // we track one bit which is implicitly broadcast to all lanes. This means
738 // that all lanes in a scalable vector are considered demanded.
739 APInt DemandedElts = VT.isFixedLengthVector()
741 : APInt(1, 1);
742 return SimplifyDemandedBits(Op, DemandedBits, DemandedElts, Known, TLO, Depth,
743 AssumeSingleUse);
744}
745
746// TODO: Under what circumstances can we create nodes? Constant folding?
748 SDValue Op, const APInt &DemandedBits, const APInt &DemandedElts,
749 SelectionDAG &DAG, unsigned Depth) const {
750 EVT VT = Op.getValueType();
751
752 // Limit search depth.
754 return SDValue();
755
756 // Ignore UNDEFs.
757 if (Op.isUndef())
758 return SDValue();
759
760 // Not demanding any bits/elts from Op.
761 if (DemandedBits == 0 || DemandedElts == 0)
762 return DAG.getUNDEF(VT);
763
764 bool IsLE = DAG.getDataLayout().isLittleEndian();
765 unsigned NumElts = DemandedElts.getBitWidth();
766 unsigned BitWidth = DemandedBits.getBitWidth();
767 KnownBits LHSKnown, RHSKnown;
768 switch (Op.getOpcode()) {
769 case ISD::BITCAST: {
770 if (VT.isScalableVector())
771 return SDValue();
772
773 SDValue Src = peekThroughBitcasts(Op.getOperand(0));
774 EVT SrcVT = Src.getValueType();
775 EVT DstVT = Op.getValueType();
776 if (SrcVT == DstVT)
777 return Src;
778
779 unsigned NumSrcEltBits = SrcVT.getScalarSizeInBits();
780 unsigned NumDstEltBits = DstVT.getScalarSizeInBits();
781 if (NumSrcEltBits == NumDstEltBits)
783 Src, DemandedBits, DemandedElts, DAG, Depth + 1))
784 return DAG.getBitcast(DstVT, V);
785
786 if (SrcVT.isVector() && (NumDstEltBits % NumSrcEltBits) == 0) {
787 unsigned Scale = NumDstEltBits / NumSrcEltBits;
788 unsigned NumSrcElts = SrcVT.getVectorNumElements();
789 APInt DemandedSrcBits = APInt::getZero(NumSrcEltBits);
790 for (unsigned i = 0; i != Scale; ++i) {
791 unsigned EltOffset = IsLE ? i : (Scale - 1 - i);
792 unsigned BitOffset = EltOffset * NumSrcEltBits;
793 DemandedSrcBits |= DemandedBits.extractBits(NumSrcEltBits, BitOffset);
794 }
795 // Recursive calls below may turn not demanded elements into poison, so we
796 // need to demand all smaller source elements that maps to a demanded
797 // destination element.
798 APInt DemandedSrcElts = APIntOps::ScaleBitMask(DemandedElts, NumSrcElts);
799
801 Src, DemandedSrcBits, DemandedSrcElts, DAG, Depth + 1))
802 return DAG.getBitcast(DstVT, V);
803 }
804
805 // TODO - bigendian once we have test coverage.
806 if (IsLE && (NumSrcEltBits % NumDstEltBits) == 0) {
807 unsigned Scale = NumSrcEltBits / NumDstEltBits;
808 unsigned NumSrcElts = SrcVT.isVector() ? SrcVT.getVectorNumElements() : 1;
809 APInt DemandedSrcBits = APInt::getZero(NumSrcEltBits);
810 APInt DemandedSrcElts = APInt::getZero(NumSrcElts);
811 for (unsigned i = 0; i != NumElts; ++i)
812 if (DemandedElts[i]) {
813 unsigned Offset = (i % Scale) * NumDstEltBits;
814 DemandedSrcBits.insertBits(DemandedBits, Offset);
815 DemandedSrcElts.setBit(i / Scale);
816 }
817
819 Src, DemandedSrcBits, DemandedSrcElts, DAG, Depth + 1))
820 return DAG.getBitcast(DstVT, V);
821 }
822
823 break;
824 }
825 case ISD::AND: {
826 LHSKnown = DAG.computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
827 RHSKnown = DAG.computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
828
829 // If all of the demanded bits are known 1 on one side, return the other.
830 // These bits cannot contribute to the result of the 'and' in this
831 // context.
832 if (DemandedBits.isSubsetOf(LHSKnown.Zero | RHSKnown.One))
833 return Op.getOperand(0);
834 if (DemandedBits.isSubsetOf(RHSKnown.Zero | LHSKnown.One))
835 return Op.getOperand(1);
836 break;
837 }
838 case ISD::OR: {
839 LHSKnown = DAG.computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
840 RHSKnown = DAG.computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
841
842 // If all of the demanded bits are known zero on one side, return the
843 // other. These bits cannot contribute to the result of the 'or' in this
844 // context.
845 if (DemandedBits.isSubsetOf(LHSKnown.One | RHSKnown.Zero))
846 return Op.getOperand(0);
847 if (DemandedBits.isSubsetOf(RHSKnown.One | LHSKnown.Zero))
848 return Op.getOperand(1);
849 break;
850 }
851 case ISD::XOR: {
852 LHSKnown = DAG.computeKnownBits(Op.getOperand(0), DemandedElts, Depth + 1);
853 RHSKnown = DAG.computeKnownBits(Op.getOperand(1), DemandedElts, Depth + 1);
854
855 // If all of the demanded bits are known zero on one side, return the
856 // other.
857 if (DemandedBits.isSubsetOf(RHSKnown.Zero))
858 return Op.getOperand(0);
859 if (DemandedBits.isSubsetOf(LHSKnown.Zero))
860 return Op.getOperand(1);
861 break;
862 }
863 case ISD::ADD:
864 case ISD::MUL:
865 case ISD::SMIN:
866 case ISD::SMAX:
867 case ISD::UMIN:
868 case ISD::UMAX: {
869 if (DAG.isIdentityElement(Op.getOpcode(), Op->getFlags(), Op.getOperand(1),
870 DemandedElts, 1, Depth + 1))
871 return Op.getOperand(0);
872
873 if (DAG.isIdentityElement(Op.getOpcode(), Op->getFlags(), Op.getOperand(0),
874 DemandedElts, 0, Depth + 1))
875 return Op.getOperand(1);
876 break;
877 }
878 case ISD::SHL: {
879 // If we are only demanding sign bits then we can use the shift source
880 // directly.
881 if (std::optional<unsigned> MaxSA =
882 DAG.getValidMaximumShiftAmount(Op, DemandedElts, Depth + 1)) {
883 SDValue Op0 = Op.getOperand(0);
884 unsigned ShAmt = *MaxSA;
885 unsigned NumSignBits =
886 DAG.ComputeNumSignBits(Op0, DemandedElts, Depth + 1);
887 unsigned UpperDemandedBits = BitWidth - DemandedBits.countr_zero();
888 if (NumSignBits > ShAmt && (NumSignBits - ShAmt) >= (UpperDemandedBits))
889 return Op0;
890 }
891 break;
892 }
893 case ISD::SRL: {
894 // If we are only demanding sign bits then we can use the shift source
895 // directly.
896 if (std::optional<unsigned> MaxSA =
897 DAG.getValidMaximumShiftAmount(Op, DemandedElts, Depth + 1)) {
898 SDValue Op0 = Op.getOperand(0);
899 unsigned ShAmt = *MaxSA;
900 // Must already be signbits in DemandedBits bounds, and can't demand any
901 // shifted in zeroes.
902 if (DemandedBits.countl_zero() >= ShAmt) {
903 unsigned NumSignBits =
904 DAG.ComputeNumSignBits(Op0, DemandedElts, Depth + 1);
905 if (DemandedBits.countr_zero() >= (BitWidth - NumSignBits))
906 return Op0;
907 }
908 }
909 break;
910 }
911 case ISD::SETCC: {
912 SDValue Op0 = Op.getOperand(0);
913 SDValue Op1 = Op.getOperand(1);
914 ISD::CondCode CC = cast<CondCodeSDNode>(Op.getOperand(2))->get();
915 // If (1) we only need the sign-bit, (2) the setcc operands are the same
916 // width as the setcc result, and (3) the result of a setcc conforms to 0 or
917 // -1, we may be able to bypass the setcc.
918 if (DemandedBits.isSignMask() &&
922 // If we're testing X < 0, then this compare isn't needed - just use X!
923 // FIXME: We're limiting to integer types here, but this should also work
924 // if we don't care about FP signed-zero. The use of SETLT with FP means
925 // that we don't care about NaNs.
926 if (CC == ISD::SETLT && Op1.getValueType().isInteger() &&
928 return Op0;
929 }
930 break;
931 }
933 // If none of the extended bits are demanded, eliminate the sextinreg.
934 SDValue Op0 = Op.getOperand(0);
935 EVT ExVT = cast<VTSDNode>(Op.getOperand(1))->getVT();
936 unsigned ExBits = ExVT.getScalarSizeInBits();
937 if (DemandedBits.getActiveBits() <= ExBits &&
939 return Op0;
940 // If the input is already sign extended, just drop the extension.
941 unsigned NumSignBits = DAG.ComputeNumSignBits(Op0, DemandedElts, Depth + 1);
942 if (NumSignBits >= (BitWidth - ExBits + 1))
943 return Op0;
944 break;
945 }
949 if (VT.isScalableVector())
950 return SDValue();
951
952 // If we only want the lowest element and none of extended bits, then we can
953 // return the bitcasted source vector.
954 SDValue Src = Op.getOperand(0);
955 EVT SrcVT = Src.getValueType();
956 EVT DstVT = Op.getValueType();
957 if (IsLE && DemandedElts == 1 &&
958 DstVT.getSizeInBits() == SrcVT.getSizeInBits() &&
959 DemandedBits.getActiveBits() <= SrcVT.getScalarSizeInBits()) {
960 return DAG.getBitcast(DstVT, Src);
961 }
962 break;
963 }
965 if (VT.isScalableVector())
966 return SDValue();
967
968 // If we don't demand the inserted element, return the base vector.
969 SDValue Vec = Op.getOperand(0);
970 auto *CIdx = dyn_cast<ConstantSDNode>(Op.getOperand(2));
971 EVT VecVT = Vec.getValueType();
972 if (CIdx && CIdx->getAPIntValue().ult(VecVT.getVectorNumElements()) &&
973 !DemandedElts[CIdx->getZExtValue()])
974 return Vec;
975 break;
976 }
978 if (VT.isScalableVector())
979 return SDValue();
980
981 SDValue Vec = Op.getOperand(0);
982 SDValue Sub = Op.getOperand(1);
983 uint64_t Idx = Op.getConstantOperandVal(2);
984 unsigned NumSubElts = Sub.getValueType().getVectorNumElements();
985 APInt DemandedSubElts = DemandedElts.extractBits(NumSubElts, Idx);
986 // If we don't demand the inserted subvector, return the base vector.
987 if (DemandedSubElts == 0)
988 return Vec;
989 break;
990 }
991 case ISD::VECTOR_SHUFFLE: {
993 ArrayRef<int> ShuffleMask = cast<ShuffleVectorSDNode>(Op)->getMask();
994
995 // If all the demanded elts are from one operand and are inline,
996 // then we can use the operand directly.
997 bool AllUndef = true, IdentityLHS = true, IdentityRHS = true;
998 for (unsigned i = 0; i != NumElts; ++i) {
999 int M = ShuffleMask[i];
1000 if (M < 0 || !DemandedElts[i])
1001 continue;
1002 AllUndef = false;
1003 IdentityLHS &= (M == (int)i);
1004 IdentityRHS &= ((M - NumElts) == i);
1005 }
1006
1007 if (AllUndef)
1008 return DAG.getUNDEF(Op.getValueType());
1009 if (IdentityLHS)
1010 return Op.getOperand(0);
1011 if (IdentityRHS)
1012 return Op.getOperand(1);
1013 break;
1014 }
1015 default:
1016 // TODO: Probably okay to remove after audit; here to reduce change size
1017 // in initial enablement patch for scalable vectors
1018 if (VT.isScalableVector())
1019 return SDValue();
1020
1021 if (Op.getOpcode() >= ISD::BUILTIN_OP_END)
1023 Op, DemandedBits, DemandedElts, DAG, Depth))
1024 return V;
1025 break;
1026 }
1027 return SDValue();
1028}
1029
1032 unsigned Depth) const {
1033 EVT VT = Op.getValueType();
1034 // Since the number of lanes in a scalable vector is unknown at compile time,
1035 // we track one bit which is implicitly broadcast to all lanes. This means
1036 // that all lanes in a scalable vector are considered demanded.
1037 APInt DemandedElts = VT.isFixedLengthVector()
1039 : APInt(1, 1);
1040 return SimplifyMultipleUseDemandedBits(Op, DemandedBits, DemandedElts, DAG,
1041 Depth);
1042}
1043
1045 SDValue Op, const APInt &DemandedElts, SelectionDAG &DAG,
1046 unsigned Depth) const {
1047 APInt DemandedBits = APInt::getAllOnes(Op.getScalarValueSizeInBits());
1048 return SimplifyMultipleUseDemandedBits(Op, DemandedBits, DemandedElts, DAG,
1049 Depth);
1050}
1051
1052// Attempt to form ext(avgfloor(A, B)) from shr(add(ext(A), ext(B)), 1).
1053// or to form ext(avgceil(A, B)) from shr(add(ext(A), ext(B), 1), 1).
1056 const TargetLowering &TLI,
1057 const APInt &DemandedBits,
1058 const APInt &DemandedElts, unsigned Depth) {
1059 assert((Op.getOpcode() == ISD::SRL || Op.getOpcode() == ISD::SRA) &&
1060 "SRL or SRA node is required here!");
1061 // Is the right shift using an immediate value of 1?
1062 ConstantSDNode *N1C = isConstOrConstSplat(Op.getOperand(1), DemandedElts);
1063 if (!N1C || !N1C->isOne())
1064 return SDValue();
1065
1066 // We are looking for an avgfloor
1067 // add(ext, ext)
1068 // or one of these as a avgceil
1069 // add(add(ext, ext), 1)
1070 // add(add(ext, 1), ext)
1071 // add(ext, add(ext, 1))
1072 SDValue Add = Op.getOperand(0);
1073 if (Add.getOpcode() != ISD::ADD)
1074 return SDValue();
1075
1076 SDValue ExtOpA = Add.getOperand(0);
1077 SDValue ExtOpB = Add.getOperand(1);
1078 SDValue Add2;
1079 auto MatchOperands = [&](SDValue Op1, SDValue Op2, SDValue Op3, SDValue A) {
1080 ConstantSDNode *ConstOp;
1081 if ((ConstOp = isConstOrConstSplat(Op2, DemandedElts)) &&
1082 ConstOp->isOne()) {
1083 ExtOpA = Op1;
1084 ExtOpB = Op3;
1085 Add2 = A;
1086 return true;
1087 }
1088 if ((ConstOp = isConstOrConstSplat(Op3, DemandedElts)) &&
1089 ConstOp->isOne()) {
1090 ExtOpA = Op1;
1091 ExtOpB = Op2;
1092 Add2 = A;
1093 return true;
1094 }
1095 return false;
1096 };
1097 bool IsCeil =
1098 (ExtOpA.getOpcode() == ISD::ADD &&
1099 MatchOperands(ExtOpA.getOperand(0), ExtOpA.getOperand(1), ExtOpB, ExtOpA)) ||
1100 (ExtOpB.getOpcode() == ISD::ADD &&
1101 MatchOperands(ExtOpB.getOperand(0), ExtOpB.getOperand(1), ExtOpA, ExtOpB));
1102
1103 // If the shift is signed (sra):
1104 // - Needs >= 2 sign bit for both operands.
1105 // - Needs >= 2 zero bits.
1106 // If the shift is unsigned (srl):
1107 // - Needs >= 1 zero bit for both operands.
1108 // - Needs 1 demanded bit zero and >= 2 sign bits.
1109 SelectionDAG &DAG = TLO.DAG;
1110 unsigned ShiftOpc = Op.getOpcode();
1111 bool IsSigned = false;
1112 unsigned KnownBits;
1113 unsigned NumSignedA = DAG.ComputeNumSignBits(ExtOpA, DemandedElts, Depth);
1114 unsigned NumSignedB = DAG.ComputeNumSignBits(ExtOpB, DemandedElts, Depth);
1115 unsigned NumSigned = std::min(NumSignedA, NumSignedB) - 1;
1116 unsigned NumZeroA =
1117 DAG.computeKnownBits(ExtOpA, DemandedElts, Depth).countMinLeadingZeros();
1118 unsigned NumZeroB =
1119 DAG.computeKnownBits(ExtOpB, DemandedElts, Depth).countMinLeadingZeros();
1120 unsigned NumZero = std::min(NumZeroA, NumZeroB);
1121
1122 switch (ShiftOpc) {
1123 default:
1124 llvm_unreachable("Unexpected ShiftOpc in combineShiftToAVG");
1125 case ISD::SRA: {
1126 if (NumZero >= 2 && NumSigned < NumZero) {
1127 IsSigned = false;
1128 KnownBits = NumZero;
1129 break;
1130 }
1131 if (NumSigned >= 1) {
1132 IsSigned = true;
1133 KnownBits = NumSigned;
1134 break;
1135 }
1136 return SDValue();
1137 }
1138 case ISD::SRL: {
1139 if (NumZero >= 1 && NumSigned < NumZero) {
1140 IsSigned = false;
1141 KnownBits = NumZero;
1142 break;
1143 }
1144 if (NumSigned >= 1 && DemandedBits.isSignBitClear()) {
1145 IsSigned = true;
1146 KnownBits = NumSigned;
1147 break;
1148 }
1149 return SDValue();
1150 }
1151 }
1152
1153 unsigned AVGOpc = IsCeil ? (IsSigned ? ISD::AVGCEILS : ISD::AVGCEILU)
1154 : (IsSigned ? ISD::AVGFLOORS : ISD::AVGFLOORU);
1155
1156 // Find the smallest power-2 type that is legal for this vector size and
1157 // operation, given the original type size and the number of known sign/zero
1158 // bits.
1159 EVT VT = Op.getValueType();
1160 unsigned MinWidth =
1161 std::max<unsigned>(VT.getScalarSizeInBits() - KnownBits, 8);
1162 EVT NVT = EVT::getIntegerVT(*DAG.getContext(), llvm::bit_ceil(MinWidth));
1164 return SDValue();
1165 if (VT.isVector())
1166 NVT = EVT::getVectorVT(*DAG.getContext(), NVT, VT.getVectorElementCount());
1167 if (TLO.LegalTypes() && !TLI.isOperationLegal(AVGOpc, NVT)) {
1168 // If we could not transform, and (both) adds are nuw/nsw, we can use the
1169 // larger type size to do the transform.
1170 if (TLO.LegalOperations() && !TLI.isOperationLegal(AVGOpc, VT))
1171 return SDValue();
1172 if (DAG.willNotOverflowAdd(IsSigned, Add.getOperand(0),
1173 Add.getOperand(1)) &&
1174 (!Add2 || DAG.willNotOverflowAdd(IsSigned, Add2.getOperand(0),
1175 Add2.getOperand(1))))
1176 NVT = VT;
1177 else
1178 return SDValue();
1179 }
1180
1181 // Don't create a AVGFLOOR node with a scalar constant unless its legal as
1182 // this is likely to stop other folds (reassociation, value tracking etc.)
1183 if (!IsCeil && !TLI.isOperationLegal(AVGOpc, NVT) &&
1184 (isa<ConstantSDNode>(ExtOpA) || isa<ConstantSDNode>(ExtOpB)))
1185 return SDValue();
1186
1187 SDLoc DL(Op);
1188 SDValue ResultAVG =
1189 DAG.getNode(AVGOpc, DL, NVT, DAG.getExtOrTrunc(IsSigned, ExtOpA, DL, NVT),
1190 DAG.getExtOrTrunc(IsSigned, ExtOpB, DL, NVT));
1191 return DAG.getExtOrTrunc(IsSigned, ResultAVG, DL, VT);
1192}
1193
1194/// Look at Op. At this point, we know that only the OriginalDemandedBits of the
1195/// result of Op are ever used downstream. If we can use this information to
1196/// simplify Op, create a new simplified DAG node and return true, returning the
1197/// original and new nodes in Old and New. Otherwise, analyze the expression and
1198/// return a mask of Known bits for the expression (used to simplify the
1199/// caller). The Known bits may only be accurate for those bits in the
1200/// OriginalDemandedBits and OriginalDemandedElts.
1202 SDValue Op, const APInt &OriginalDemandedBits,
1203 const APInt &OriginalDemandedElts, KnownBits &Known, TargetLoweringOpt &TLO,
1204 unsigned Depth, bool AssumeSingleUse) const {
1205 unsigned BitWidth = OriginalDemandedBits.getBitWidth();
1206 assert(Op.getScalarValueSizeInBits() == BitWidth &&
1207 "Mask size mismatches value type size!");
1208
1209 // Don't know anything.
1211
1212 EVT VT = Op.getValueType();
1213 bool IsLE = TLO.DAG.getDataLayout().isLittleEndian();
1214 unsigned NumElts = OriginalDemandedElts.getBitWidth();
1215 assert((!VT.isFixedLengthVector() || NumElts == VT.getVectorNumElements()) &&
1216 "Unexpected vector size");
1217
1218 APInt DemandedBits = OriginalDemandedBits;
1219 APInt DemandedElts = OriginalDemandedElts;
1220 SDLoc dl(Op);
1221
1222 // Undef operand.
1223 if (Op.isUndef())
1224 return false;
1225
1226 // We can't simplify target constants.
1227 if (Op.getOpcode() == ISD::TargetConstant)
1228 return false;
1229
1230 if (Op.getOpcode() == ISD::Constant) {
1231 // We know all of the bits for a constant!
1232 Known = KnownBits::makeConstant(Op->getAsAPIntVal());
1233 return false;
1234 }
1235
1236 if (Op.getOpcode() == ISD::ConstantFP) {
1237 // We know all of the bits for a floating point constant!
1239 cast<ConstantFPSDNode>(Op)->getValueAPF().bitcastToAPInt());
1240 return false;
1241 }
1242
1243 // Other users may use these bits.
1244 bool HasMultiUse = false;
1245 if (!AssumeSingleUse && !Op.getNode()->hasOneUse()) {
1247 // Limit search depth.
1248 return false;
1249 }
1250 // Allow multiple uses, just set the DemandedBits/Elts to all bits.
1252 DemandedElts = APInt::getAllOnes(NumElts);
1253 HasMultiUse = true;
1254 } else if (OriginalDemandedBits == 0 || OriginalDemandedElts == 0) {
1255 // Not demanding any bits/elts from Op.
1256 return TLO.CombineTo(Op, TLO.DAG.getUNDEF(VT));
1257 } else if (Depth >= SelectionDAG::MaxRecursionDepth) {
1258 // Limit search depth.
1259 return false;
1260 }
1261
1262 KnownBits Known2;
1263 switch (Op.getOpcode()) {
1264 case ISD::SCALAR_TO_VECTOR: {
1265 if (VT.isScalableVector())
1266 return false;
1267 if (!DemandedElts[0])
1268 return TLO.CombineTo(Op, TLO.DAG.getUNDEF(VT));
1269
1270 KnownBits SrcKnown;
1271 SDValue Src = Op.getOperand(0);
1272 unsigned SrcBitWidth = Src.getScalarValueSizeInBits();
1273 APInt SrcDemandedBits = DemandedBits.zext(SrcBitWidth);
1274 if (SimplifyDemandedBits(Src, SrcDemandedBits, SrcKnown, TLO, Depth + 1))
1275 return true;
1276
1277 // Upper elements are undef, so only get the knownbits if we just demand
1278 // the bottom element.
1279 if (DemandedElts == 1)
1280 Known = SrcKnown.anyextOrTrunc(BitWidth);
1281 break;
1282 }
1283 case ISD::BUILD_VECTOR:
1284 // Collect the known bits that are shared by every demanded element.
1285 // TODO: Call SimplifyDemandedBits for non-constant demanded elements.
1286 Known = TLO.DAG.computeKnownBits(Op, DemandedElts, Depth);
1287 return false; // Don't fall through, will infinitely loop.
1288 case ISD::SPLAT_VECTOR: {
1289 SDValue Scl = Op.getOperand(0);
1290 APInt DemandedSclBits = DemandedBits.zextOrTrunc(Scl.getValueSizeInBits());
1291 KnownBits KnownScl;
1292 if (SimplifyDemandedBits(Scl, DemandedSclBits, KnownScl, TLO, Depth + 1))
1293 return true;
1294
1295 // Implicitly truncate the bits to match the official semantics of
1296 // SPLAT_VECTOR.
1297 Known = KnownScl.trunc(BitWidth);
1298 break;
1299 }
1300 case ISD::FREEZE: {
1301 SDValue N0 = Op.getOperand(0);
1303 N0, DemandedElts, UndefPoisonKind::UndefOrPoison, Depth + 1))
1304 return TLO.CombineTo(Op, N0);
1305 break;
1306 }
1307 case ISD::LOAD: {
1308 auto *LD = cast<LoadSDNode>(Op);
1309 if (getTargetConstantFromLoad(LD)) {
1310 Known = TLO.DAG.computeKnownBits(Op, DemandedElts, Depth);
1311 return false; // Don't fall through, will infinitely loop.
1312 }
1313 if (ISD::isZEXTLoad(Op.getNode()) && Op.getResNo() == 0) {
1314 // If this is a ZEXTLoad and we are looking at the loaded value.
1315 EVT MemVT = LD->getMemoryVT();
1316 unsigned MemBits = MemVT.getScalarSizeInBits();
1317 Known.Zero.setBitsFrom(MemBits);
1318 return false; // Don't fall through, will infinitely loop.
1319 }
1320 break;
1321 }
1323 if (VT.isScalableVector())
1324 return false;
1325 SDValue Vec = Op.getOperand(0);
1326 SDValue Scl = Op.getOperand(1);
1327 auto *CIdx = dyn_cast<ConstantSDNode>(Op.getOperand(2));
1328 EVT VecVT = Vec.getValueType();
1329
1330 // If index isn't constant, assume we need all vector elements AND the
1331 // inserted element.
1332 APInt DemandedVecElts(DemandedElts);
1333 if (CIdx && CIdx->getAPIntValue().ult(VecVT.getVectorNumElements())) {
1334 unsigned Idx = CIdx->getZExtValue();
1335 DemandedVecElts.clearBit(Idx);
1336
1337 // Inserted element is not required.
1338 if (!DemandedElts[Idx])
1339 return TLO.CombineTo(Op, Vec);
1340 }
1341
1342 KnownBits KnownScl;
1343 unsigned NumSclBits = Scl.getScalarValueSizeInBits();
1344 APInt DemandedSclBits = DemandedBits.zextOrTrunc(NumSclBits);
1345 if (SimplifyDemandedBits(Scl, DemandedSclBits, KnownScl, TLO, Depth + 1))
1346 return true;
1347
1348 Known = KnownScl.anyextOrTrunc(BitWidth);
1349
1350 KnownBits KnownVec;
1351 if (SimplifyDemandedBits(Vec, DemandedBits, DemandedVecElts, KnownVec, TLO,
1352 Depth + 1))
1353 return true;
1354
1355 if (!!DemandedVecElts)
1356 Known = Known.intersectWith(KnownVec);
1357
1358 return false;
1359 }
1360 case ISD::INSERT_SUBVECTOR: {
1361 if (VT.isScalableVector())
1362 return false;
1363 // Demand any elements from the subvector and the remainder from the src its
1364 // inserted into.
1365 SDValue Src = Op.getOperand(0);
1366 SDValue Sub = Op.getOperand(1);
1367 uint64_t Idx = Op.getConstantOperandVal(2);
1368 unsigned NumSubElts = Sub.getValueType().getVectorNumElements();
1369 APInt DemandedSubElts = DemandedElts.extractBits(NumSubElts, Idx);
1370 APInt DemandedSrcElts = DemandedElts;
1371 DemandedSrcElts.clearBits(Idx, Idx + NumSubElts);
1372
1373 KnownBits KnownSub, KnownSrc;
1374 if (SimplifyDemandedBits(Sub, DemandedBits, DemandedSubElts, KnownSub, TLO,
1375 Depth + 1))
1376 return true;
1377 if (SimplifyDemandedBits(Src, DemandedBits, DemandedSrcElts, KnownSrc, TLO,
1378 Depth + 1))
1379 return true;
1380
1381 Known.setAllConflict();
1382 if (!!DemandedSubElts)
1383 Known = Known.intersectWith(KnownSub);
1384 if (!!DemandedSrcElts)
1385 Known = Known.intersectWith(KnownSrc);
1386
1387 // Attempt to avoid multi-use src if we don't need anything from it.
1388 if (!DemandedBits.isAllOnes() || !DemandedSubElts.isAllOnes() ||
1389 !DemandedSrcElts.isAllOnes()) {
1391 Sub, DemandedBits, DemandedSubElts, TLO.DAG, Depth + 1);
1393 Src, DemandedBits, DemandedSrcElts, TLO.DAG, Depth + 1);
1394 if (NewSub || NewSrc) {
1395 NewSub = NewSub ? NewSub : Sub;
1396 NewSrc = NewSrc ? NewSrc : Src;
1397 SDValue NewOp = TLO.DAG.getNode(Op.getOpcode(), dl, VT, NewSrc, NewSub,
1398 Op.getOperand(2));
1399 return TLO.CombineTo(Op, NewOp);
1400 }
1401 }
1402 break;
1403 }
1405 if (VT.isScalableVector())
1406 return false;
1407 // Offset the demanded elts by the subvector index.
1408 SDValue Src = Op.getOperand(0);
1409 if (Src.getValueType().isScalableVector())
1410 break;
1411 uint64_t Idx = Op.getConstantOperandVal(1);
1412 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
1413 APInt DemandedSrcElts = DemandedElts.zext(NumSrcElts).shl(Idx);
1414
1415 if (SimplifyDemandedBits(Src, DemandedBits, DemandedSrcElts, Known, TLO,
1416 Depth + 1))
1417 return true;
1418
1419 // Attempt to avoid multi-use src if we don't need anything from it.
1420 if (!DemandedBits.isAllOnes() || !DemandedSrcElts.isAllOnes()) {
1422 Src, DemandedBits, DemandedSrcElts, TLO.DAG, Depth + 1);
1423 if (DemandedSrc) {
1424 SDValue NewOp = TLO.DAG.getNode(Op.getOpcode(), dl, VT, DemandedSrc,
1425 Op.getOperand(1));
1426 return TLO.CombineTo(Op, NewOp);
1427 }
1428 }
1429 break;
1430 }
1431 case ISD::CONCAT_VECTORS: {
1432 if (VT.isScalableVector())
1433 return false;
1434 Known.setAllConflict();
1435 EVT SubVT = Op.getOperand(0).getValueType();
1436 unsigned NumSubVecs = Op.getNumOperands();
1437 unsigned NumSubElts = SubVT.getVectorNumElements();
1438 for (unsigned i = 0; i != NumSubVecs; ++i) {
1439 APInt DemandedSubElts =
1440 DemandedElts.extractBits(NumSubElts, i * NumSubElts);
1441 if (SimplifyDemandedBits(Op.getOperand(i), DemandedBits, DemandedSubElts,
1442 Known2, TLO, Depth + 1))
1443 return true;
1444 // Known bits are shared by every demanded subvector element.
1445 if (!!DemandedSubElts)
1446 Known = Known.intersectWith(Known2);
1447 }
1448 break;
1449 }
1450 case ISD::VECTOR_SHUFFLE: {
1451 assert(!VT.isScalableVector());
1452 ArrayRef<int> ShuffleMask = cast<ShuffleVectorSDNode>(Op)->getMask();
1453
1454 // Collect demanded elements from shuffle operands..
1455 APInt DemandedLHS, DemandedRHS;
1456 if (!getShuffleDemandedElts(NumElts, ShuffleMask, DemandedElts, DemandedLHS,
1457 DemandedRHS))
1458 break;
1459
1460 if (!!DemandedLHS || !!DemandedRHS) {
1461 SDValue Op0 = Op.getOperand(0);
1462 SDValue Op1 = Op.getOperand(1);
1463
1464 Known.setAllConflict();
1465 if (!!DemandedLHS) {
1466 if (SimplifyDemandedBits(Op0, DemandedBits, DemandedLHS, Known2, TLO,
1467 Depth + 1))
1468 return true;
1469 Known = Known.intersectWith(Known2);
1470 }
1471 if (!!DemandedRHS) {
1472 if (SimplifyDemandedBits(Op1, DemandedBits, DemandedRHS, Known2, TLO,
1473 Depth + 1))
1474 return true;
1475 Known = Known.intersectWith(Known2);
1476 }
1477
1478 // Attempt to avoid multi-use ops if we don't need anything from them.
1480 Op0, DemandedBits, DemandedLHS, TLO.DAG, Depth + 1);
1482 Op1, DemandedBits, DemandedRHS, TLO.DAG, Depth + 1);
1483 if (DemandedOp0 || DemandedOp1) {
1484 Op0 = DemandedOp0 ? DemandedOp0 : Op0;
1485 Op1 = DemandedOp1 ? DemandedOp1 : Op1;
1486 SDValue NewOp = TLO.DAG.getVectorShuffle(VT, dl, Op0, Op1, ShuffleMask);
1487 return TLO.CombineTo(Op, NewOp);
1488 }
1489 }
1490 break;
1491 }
1492 case ISD::AND: {
1493 SDValue Op0 = Op.getOperand(0);
1494 SDValue Op1 = Op.getOperand(1);
1495
1496 // If the RHS is a constant, check to see if the LHS would be zero without
1497 // using the bits from the RHS. Below, we use knowledge about the RHS to
1498 // simplify the LHS, here we're using information from the LHS to simplify
1499 // the RHS.
1500 if (ConstantSDNode *RHSC = isConstOrConstSplat(Op1, DemandedElts)) {
1501 // Do not increment Depth here; that can cause an infinite loop.
1502 KnownBits LHSKnown = TLO.DAG.computeKnownBits(Op0, DemandedElts, Depth);
1503 // If the LHS already has zeros where RHSC does, this 'and' is dead.
1504 if ((LHSKnown.Zero & DemandedBits) ==
1505 (~RHSC->getAPIntValue() & DemandedBits))
1506 return TLO.CombineTo(Op, Op0);
1507
1508 // If any of the set bits in the RHS are known zero on the LHS, shrink
1509 // the constant.
1510 if (ShrinkDemandedConstant(Op, ~LHSKnown.Zero & DemandedBits,
1511 DemandedElts, TLO))
1512 return true;
1513
1514 // Bitwise-not (xor X, -1) is a special case: we don't usually shrink its
1515 // constant, but if this 'and' is only clearing bits that were just set by
1516 // the xor, then this 'and' can be eliminated by shrinking the mask of
1517 // the xor. For example, for a 32-bit X:
1518 // and (xor (srl X, 31), -1), 1 --> xor (srl X, 31), 1
1519 if (isBitwiseNot(Op0) && Op0.hasOneUse() &&
1520 LHSKnown.One == ~RHSC->getAPIntValue()) {
1521 SDValue Xor = TLO.DAG.getNode(ISD::XOR, dl, VT, Op0.getOperand(0), Op1);
1522 return TLO.CombineTo(Op, Xor);
1523 }
1524 }
1525
1526 // (X +/- Y) & Y --> ~X & Y when Y is a power of 2 (or zero).
1527 SDValue X, Y;
1528 if (sd_match(Op,
1529 m_And(m_Value(Y),
1531 m_Sub(m_Value(X), m_Deferred(Y)))))) &&
1532 TLO.DAG.isKnownToBeAPowerOfTwo(Y, DemandedElts, /*OrZero=*/true)) {
1533 return TLO.CombineTo(
1534 Op, TLO.DAG.getNode(ISD::AND, dl, VT, TLO.DAG.getNOT(dl, X, VT), Y));
1535 }
1536
1537 // AND(INSERT_SUBVECTOR(C,X,I),M) -> INSERT_SUBVECTOR(AND(C,M),X,I)
1538 // iff 'C' is Undef/Constant and AND(X,M) == X (for DemandedBits).
1539 if (Op0.getOpcode() == ISD::INSERT_SUBVECTOR && !VT.isScalableVector() &&
1540 (Op0.getOperand(0).isUndef() ||
1542 Op0->hasOneUse()) {
1543 unsigned NumSubElts =
1545 unsigned SubIdx = Op0.getConstantOperandVal(2);
1546 APInt DemandedSub =
1547 APInt::getBitsSet(NumElts, SubIdx, SubIdx + NumSubElts);
1548 KnownBits KnownSubMask =
1549 TLO.DAG.computeKnownBits(Op1, DemandedSub & DemandedElts, Depth + 1);
1550 if (DemandedBits.isSubsetOf(KnownSubMask.One)) {
1551 SDValue NewAnd =
1552 TLO.DAG.getNode(ISD::AND, dl, VT, Op0.getOperand(0), Op1);
1553 SDValue NewInsert =
1554 TLO.DAG.getNode(ISD::INSERT_SUBVECTOR, dl, VT, NewAnd,
1555 Op0.getOperand(1), Op0.getOperand(2));
1556 return TLO.CombineTo(Op, NewInsert);
1557 }
1558 }
1559
1560 if (SimplifyDemandedBits(Op1, DemandedBits, DemandedElts, Known, TLO,
1561 Depth + 1))
1562 return true;
1563 if (SimplifyDemandedBits(Op0, ~Known.Zero & DemandedBits, DemandedElts,
1564 Known2, TLO, Depth + 1))
1565 return true;
1566
1567 // If all of the demanded bits are known one on one side, return the other.
1568 // These bits cannot contribute to the result of the 'and'.
1569 if (DemandedBits.isSubsetOf(Known2.Zero | Known.One))
1570 return TLO.CombineTo(Op, Op0);
1571 if (DemandedBits.isSubsetOf(Known.Zero | Known2.One))
1572 return TLO.CombineTo(Op, Op1);
1573 // If all of the demanded bits in the inputs are known zeros, return zero.
1574 if (DemandedBits.isSubsetOf(Known.Zero | Known2.Zero))
1575 return TLO.CombineTo(Op, TLO.DAG.getConstant(0, dl, VT));
1576 // If the RHS is a constant, see if we can simplify it.
1577 if (ShrinkDemandedConstant(Op, ~Known2.Zero & DemandedBits, DemandedElts,
1578 TLO))
1579 return true;
1580 // If the operation can be done in a smaller type, do so.
1582 return true;
1583
1584 // Attempt to avoid multi-use ops if we don't need anything from them.
1585 if (!DemandedBits.isAllOnes() || !DemandedElts.isAllOnes()) {
1587 Op0, DemandedBits, DemandedElts, TLO.DAG, Depth + 1);
1589 Op1, DemandedBits, DemandedElts, TLO.DAG, Depth + 1);
1590 if (DemandedOp0 || DemandedOp1) {
1591 Op0 = DemandedOp0 ? DemandedOp0 : Op0;
1592 Op1 = DemandedOp1 ? DemandedOp1 : Op1;
1593 SDValue NewOp = TLO.DAG.getNode(Op.getOpcode(), dl, VT, Op0, Op1);
1594 return TLO.CombineTo(Op, NewOp);
1595 }
1596 }
1597
1598 Known &= Known2;
1599 break;
1600 }
1601 case ISD::OR: {
1602 SDValue Op0 = Op.getOperand(0);
1603 SDValue Op1 = Op.getOperand(1);
1604 if (SimplifyDemandedBits(Op1, DemandedBits, DemandedElts, Known, TLO,
1605 Depth + 1)) {
1606 Op->dropFlags(SDNodeFlags::Disjoint);
1607 return true;
1608 }
1609
1610 if (SimplifyDemandedBits(Op0, ~Known.One & DemandedBits, DemandedElts,
1611 Known2, TLO, Depth + 1)) {
1612 Op->dropFlags(SDNodeFlags::Disjoint);
1613 return true;
1614 }
1615
1616 // If all of the demanded bits are known zero on one side, return the other.
1617 // These bits cannot contribute to the result of the 'or'.
1618 if (DemandedBits.isSubsetOf(Known2.One | Known.Zero))
1619 return TLO.CombineTo(Op, Op0);
1620 if (DemandedBits.isSubsetOf(Known.One | Known2.Zero))
1621 return TLO.CombineTo(Op, Op1);
1622 // If the RHS is a constant, see if we can simplify it.
1623 if (ShrinkDemandedConstant(Op, DemandedBits, DemandedElts, TLO))
1624 return true;
1625 // If the operation can be done in a smaller type, do so.
1627 return true;
1628
1629 // Attempt to avoid multi-use ops if we don't need anything from them.
1630 if (!DemandedBits.isAllOnes() || !DemandedElts.isAllOnes()) {
1632 Op0, DemandedBits, DemandedElts, TLO.DAG, Depth + 1);
1634 Op1, DemandedBits, DemandedElts, TLO.DAG, Depth + 1);
1635 if (DemandedOp0 || DemandedOp1) {
1636 Op0 = DemandedOp0 ? DemandedOp0 : Op0;
1637 Op1 = DemandedOp1 ? DemandedOp1 : Op1;
1638 SDValue NewOp = TLO.DAG.getNode(Op.getOpcode(), dl, VT, Op0, Op1);
1639 return TLO.CombineTo(Op, NewOp);
1640 }
1641 }
1642
1643 // (or (and X, C1), (and (or X, Y), C2)) -> (or (and X, C1|C2), (and Y, C2))
1644 // TODO: Use SimplifyMultipleUseDemandedBits to peek through masks.
1645 SDValue X, Y, C1, C2;
1648 m_Value(C2)))))) {
1649 if (SDValue C12 =
1650 TLO.DAG.FoldConstantArithmetic(ISD::OR, dl, VT, {C1, C2})) {
1651 SDValue MaskX = TLO.DAG.getNode(ISD::AND, dl, VT, X, C12);
1652 SDValue MaskY = TLO.DAG.getNode(ISD::AND, dl, VT, Y, C2);
1653 return TLO.CombineTo(Op,
1654 TLO.DAG.getNode(ISD::OR, dl, VT, MaskX, MaskY));
1655 }
1656 }
1657
1658 Known |= Known2;
1659 break;
1660 }
1661 case ISD::XOR: {
1662 SDValue Op0 = Op.getOperand(0);
1663 SDValue Op1 = Op.getOperand(1);
1664
1665 if (SimplifyDemandedBits(Op1, DemandedBits, DemandedElts, Known, TLO,
1666 Depth + 1))
1667 return true;
1668 if (SimplifyDemandedBits(Op0, DemandedBits, DemandedElts, Known2, TLO,
1669 Depth + 1))
1670 return true;
1671
1672 // If all of the demanded bits are known zero on one side, return the other.
1673 // These bits cannot contribute to the result of the 'xor'.
1674 if (DemandedBits.isSubsetOf(Known.Zero))
1675 return TLO.CombineTo(Op, Op0);
1676 if (DemandedBits.isSubsetOf(Known2.Zero))
1677 return TLO.CombineTo(Op, Op1);
1678 // If the operation can be done in a smaller type, do so.
1680 return true;
1681
1682 // If all of the unknown bits are known to be zero on one side or the other
1683 // turn this into an *inclusive* or.
1684 // e.g. (A & C1)^(B & C2) -> (A & C1)|(B & C2) iff C1&C2 == 0
1685 if (DemandedBits.isSubsetOf(Known.Zero | Known2.Zero))
1686 return TLO.CombineTo(Op, TLO.DAG.getNode(ISD::OR, dl, VT, Op0, Op1));
1687
1688 ConstantSDNode *C = isConstOrConstSplat(Op1, DemandedElts);
1689 if (C) {
1690 // If one side is a constant, and all of the set bits in the constant are
1691 // also known set on the other side, turn this into an AND, as we know
1692 // the bits will be cleared.
1693 // e.g. (X | C1) ^ C2 --> (X | C1) & ~C2 iff (C1&C2) == C2
1694 // NB: it is okay if more bits are known than are requested
1695 if (C->getAPIntValue() == Known2.One) {
1696 SDValue ANDC =
1697 TLO.DAG.getConstant(~C->getAPIntValue() & DemandedBits, dl, VT);
1698 return TLO.CombineTo(Op, TLO.DAG.getNode(ISD::AND, dl, VT, Op0, ANDC));
1699 }
1700
1701 // If the RHS is a constant, see if we can change it. Don't alter a -1
1702 // constant because that's a 'not' op, and that is better for combining
1703 // and codegen.
1704 if (!C->isAllOnes() && DemandedBits.isSubsetOf(C->getAPIntValue())) {
1705 // We're flipping all demanded bits. Flip the undemanded bits too.
1706 SDValue New = TLO.DAG.getNOT(dl, Op0, VT);
1707 return TLO.CombineTo(Op, New);
1708 }
1709
1710 unsigned Op0Opcode = Op0.getOpcode();
1711 if ((Op0Opcode == ISD::SRL || Op0Opcode == ISD::SHL) && Op0.hasOneUse()) {
1712 if (ConstantSDNode *ShiftC =
1713 isConstOrConstSplat(Op0.getOperand(1), DemandedElts)) {
1714 // Don't crash on an oversized shift. We can not guarantee that a
1715 // bogus shift has been simplified to undef.
1716 if (ShiftC->getAPIntValue().ult(BitWidth)) {
1717 uint64_t ShiftAmt = ShiftC->getZExtValue();
1719 Ones = Op0Opcode == ISD::SHL ? Ones.shl(ShiftAmt)
1720 : Ones.lshr(ShiftAmt);
1721 if ((DemandedBits & C->getAPIntValue()) == (DemandedBits & Ones) &&
1723 // If the xor constant is a demanded mask, do a 'not' before the
1724 // shift:
1725 // xor (X << ShiftC), XorC --> (not X) << ShiftC
1726 // xor (X >> ShiftC), XorC --> (not X) >> ShiftC
1727 SDValue Not = TLO.DAG.getNOT(dl, Op0.getOperand(0), VT);
1728 return TLO.CombineTo(Op, TLO.DAG.getNode(Op0Opcode, dl, VT, Not,
1729 Op0.getOperand(1)));
1730 }
1731 }
1732 }
1733 }
1734 }
1735
1736 // If we can't turn this into a 'not', try to shrink the constant.
1737 if (!C || !C->isAllOnes())
1738 if (ShrinkDemandedConstant(Op, DemandedBits, DemandedElts, TLO))
1739 return true;
1740
1741 // Attempt to avoid multi-use ops if we don't need anything from them.
1742 if (!DemandedBits.isAllOnes() || !DemandedElts.isAllOnes()) {
1744 Op0, DemandedBits, DemandedElts, TLO.DAG, Depth + 1);
1746 Op1, DemandedBits, DemandedElts, TLO.DAG, Depth + 1);
1747 if (DemandedOp0 || DemandedOp1) {
1748 Op0 = DemandedOp0 ? DemandedOp0 : Op0;
1749 Op1 = DemandedOp1 ? DemandedOp1 : Op1;
1750 SDValue NewOp = TLO.DAG.getNode(Op.getOpcode(), dl, VT, Op0, Op1);
1751 return TLO.CombineTo(Op, NewOp);
1752 }
1753 }
1754
1755 Known ^= Known2;
1756 break;
1757 }
1758 case ISD::SELECT:
1759 if (SimplifyDemandedBits(Op.getOperand(2), DemandedBits, DemandedElts,
1760 Known, TLO, Depth + 1))
1761 return true;
1762 if (SimplifyDemandedBits(Op.getOperand(1), DemandedBits, DemandedElts,
1763 Known2, TLO, Depth + 1))
1764 return true;
1765
1766 // If the operands are constants, see if we can simplify them.
1767 if (ShrinkDemandedConstant(Op, DemandedBits, DemandedElts, TLO))
1768 return true;
1769
1770 // Only known if known in both the LHS and RHS.
1771 Known = Known.intersectWith(Known2);
1772 break;
1773 case ISD::VSELECT:
1774 if (SimplifyDemandedBits(Op.getOperand(2), DemandedBits, DemandedElts,
1775 Known, TLO, Depth + 1))
1776 return true;
1777 if (SimplifyDemandedBits(Op.getOperand(1), DemandedBits, DemandedElts,
1778 Known2, TLO, Depth + 1))
1779 return true;
1780
1781 // Only known if known in both the LHS and RHS.
1782 Known = Known.intersectWith(Known2);
1783 break;
1784 case ISD::SELECT_CC:
1785 if (SimplifyDemandedBits(Op.getOperand(3), DemandedBits, DemandedElts,
1786 Known, TLO, Depth + 1))
1787 return true;
1788 if (SimplifyDemandedBits(Op.getOperand(2), DemandedBits, DemandedElts,
1789 Known2, TLO, Depth + 1))
1790 return true;
1791
1792 // If the operands are constants, see if we can simplify them.
1793 if (ShrinkDemandedConstant(Op, DemandedBits, DemandedElts, TLO))
1794 return true;
1795
1796 // Only known if known in both the LHS and RHS.
1797 Known = Known.intersectWith(Known2);
1798 break;
1799 case ISD::SETCC: {
1800 SDValue Op0 = Op.getOperand(0);
1801 SDValue Op1 = Op.getOperand(1);
1802 ISD::CondCode CC = cast<CondCodeSDNode>(Op.getOperand(2))->get();
1803 // If we're testing X < 0, X >= 0, X <= -1 or X > -1
1804 // (X is of integer type) then we only need the sign mask of the previous
1805 // result
1806 if (Op1.getValueType().isInteger() &&
1807 (((CC == ISD::SETLT || CC == ISD::SETGE) && isNullOrNullSplat(Op1)) ||
1808 ((CC == ISD::SETLE || CC == ISD::SETGT) &&
1809 isAllOnesOrAllOnesSplat(Op1)))) {
1810 KnownBits KnownOp0;
1813 DemandedElts, KnownOp0, TLO, Depth + 1))
1814 return true;
1815 // If (1) we only need the sign-bit, (2) the setcc operands are the same
1816 // width as the setcc result, and (3) the result of a setcc conforms to 0
1817 // or -1, we may be able to bypass the setcc.
1818 if (DemandedBits.isSignMask() &&
1822 // If we remove a >= 0 or > -1 (for integers), we need to introduce a
1823 // NOT Operation
1824 if (CC == ISD::SETGE || CC == ISD::SETGT) {
1825 SDLoc DL(Op);
1826 EVT VT = Op0.getValueType();
1827 SDValue NotOp0 = TLO.DAG.getNOT(DL, Op0, VT);
1828 return TLO.CombineTo(Op, NotOp0);
1829 }
1830 return TLO.CombineTo(Op, Op0);
1831 }
1832 }
1833 if (getBooleanContents(Op0.getValueType()) ==
1835 BitWidth > 1)
1836 Known.Zero.setBitsFrom(1);
1837 break;
1838 }
1839 case ISD::SHL: {
1840 SDValue Op0 = Op.getOperand(0);
1841 SDValue Op1 = Op.getOperand(1);
1842 EVT ShiftVT = Op1.getValueType();
1843
1844 if (std::optional<unsigned> KnownSA =
1845 TLO.DAG.getValidShiftAmount(Op, DemandedElts, Depth + 1)) {
1846 unsigned ShAmt = *KnownSA;
1847 if (ShAmt == 0)
1848 return TLO.CombineTo(Op, Op0);
1849
1850 // If this is ((X >>u C1) << ShAmt), see if we can simplify this into a
1851 // single shift. We can do this if the bottom bits (which are shifted
1852 // out) are never demanded.
1853 // TODO - support non-uniform vector amounts.
1854 if (Op0.getOpcode() == ISD::SRL) {
1855 if (!DemandedBits.intersects(APInt::getLowBitsSet(BitWidth, ShAmt))) {
1856 if (std::optional<unsigned> InnerSA =
1857 TLO.DAG.getValidShiftAmount(Op0, DemandedElts, Depth + 2)) {
1858 unsigned C1 = *InnerSA;
1859 unsigned Opc = ISD::SHL;
1860 int Diff = ShAmt - C1;
1861 if (Diff < 0) {
1862 Diff = -Diff;
1863 Opc = ISD::SRL;
1864 }
1865 SDValue NewSA = TLO.DAG.getConstant(Diff, dl, ShiftVT);
1866 return TLO.CombineTo(
1867 Op, TLO.DAG.getNode(Opc, dl, VT, Op0.getOperand(0), NewSA));
1868 }
1869 }
1870 }
1871
1872 // Convert (shl (anyext x, c)) to (anyext (shl x, c)) if the high bits
1873 // are not demanded. This will likely allow the anyext to be folded away.
1874 // TODO - support non-uniform vector amounts.
1875 if (Op0.getOpcode() == ISD::ANY_EXTEND) {
1876 SDValue InnerOp = Op0.getOperand(0);
1877 EVT InnerVT = InnerOp.getValueType();
1878 unsigned InnerBits = InnerVT.getScalarSizeInBits();
1879 if (ShAmt < InnerBits && DemandedBits.getActiveBits() <= InnerBits &&
1880 isTypeDesirableForOp(ISD::SHL, InnerVT)) {
1881 SDValue NarrowShl = TLO.DAG.getNode(
1882 ISD::SHL, dl, InnerVT, InnerOp,
1883 TLO.DAG.getShiftAmountConstant(ShAmt, InnerVT, dl));
1884 return TLO.CombineTo(
1885 Op, TLO.DAG.getNode(ISD::ANY_EXTEND, dl, VT, NarrowShl));
1886 }
1887
1888 // Repeat the SHL optimization above in cases where an extension
1889 // intervenes: (shl (anyext (shr x, c1)), c2) to
1890 // (shl (anyext x), c2-c1). This requires that the bottom c1 bits
1891 // aren't demanded (as above) and that the shifted upper c1 bits of
1892 // x aren't demanded.
1893 // TODO - support non-uniform vector amounts.
1894 if (InnerOp.getOpcode() == ISD::SRL && Op0.hasOneUse() &&
1895 InnerOp.hasOneUse()) {
1896 if (std::optional<unsigned> SA2 = TLO.DAG.getValidShiftAmount(
1897 InnerOp, DemandedElts, Depth + 2)) {
1898 unsigned InnerShAmt = *SA2;
1899 if (InnerShAmt < ShAmt && InnerShAmt < InnerBits &&
1900 DemandedBits.getActiveBits() <=
1901 (InnerBits - InnerShAmt + ShAmt) &&
1902 DemandedBits.countr_zero() >= ShAmt) {
1903 SDValue NewSA =
1904 TLO.DAG.getConstant(ShAmt - InnerShAmt, dl, ShiftVT);
1905 SDValue NewExt = TLO.DAG.getNode(ISD::ANY_EXTEND, dl, VT,
1906 InnerOp.getOperand(0));
1907 return TLO.CombineTo(
1908 Op, TLO.DAG.getNode(ISD::SHL, dl, VT, NewExt, NewSA));
1909 }
1910 }
1911 }
1912 }
1913
1914 APInt InDemandedMask = DemandedBits.lshr(ShAmt);
1915 if (SimplifyDemandedBits(Op0, InDemandedMask, DemandedElts, Known, TLO,
1916 Depth + 1)) {
1917 // Disable the nsw and nuw flags. We can no longer guarantee that we
1918 // won't wrap after simplification.
1919 Op->dropFlags(SDNodeFlags::NoWrap);
1920 return true;
1921 }
1922 Known <<= ShAmt;
1923 // low bits known zero.
1924 Known.Zero.setLowBits(ShAmt);
1925
1926 // Attempt to avoid multi-use ops if we don't need anything from them.
1927 if (!InDemandedMask.isAllOnes() || !DemandedElts.isAllOnes()) {
1929 Op0, InDemandedMask, DemandedElts, TLO.DAG, Depth + 1);
1930 if (DemandedOp0) {
1931 SDValue NewOp = TLO.DAG.getNode(ISD::SHL, dl, VT, DemandedOp0, Op1);
1932 return TLO.CombineTo(Op, NewOp);
1933 }
1934 }
1935
1936 // TODO: Can we merge this fold with the one below?
1937 // Try shrinking the operation as long as the shift amount will still be
1938 // in range.
1939 if (ShAmt < DemandedBits.getActiveBits() && !VT.isVector() &&
1940 Op.getNode()->hasOneUse()) {
1941 // Search for the smallest integer type with free casts to and from
1942 // Op's type. For expedience, just check power-of-2 integer types.
1943 unsigned DemandedSize = DemandedBits.getActiveBits();
1944 for (unsigned SmallVTBits = llvm::bit_ceil(DemandedSize);
1945 SmallVTBits < BitWidth; SmallVTBits = NextPowerOf2(SmallVTBits)) {
1946 EVT SmallVT = EVT::getIntegerVT(*TLO.DAG.getContext(), SmallVTBits);
1947 if (isNarrowingProfitable(Op.getNode(), VT, SmallVT) &&
1948 isTypeDesirableForOp(ISD::SHL, SmallVT) &&
1949 isTruncateFree(VT, SmallVT) && isZExtFree(SmallVT, VT) &&
1950 (!TLO.LegalOperations() || isOperationLegal(ISD::SHL, SmallVT))) {
1951 assert(DemandedSize <= SmallVTBits &&
1952 "Narrowed below demanded bits?");
1953 // We found a type with free casts.
1954 SDValue NarrowShl = TLO.DAG.getNode(
1955 ISD::SHL, dl, SmallVT,
1956 TLO.DAG.getNode(ISD::TRUNCATE, dl, SmallVT, Op.getOperand(0)),
1957 TLO.DAG.getShiftAmountConstant(ShAmt, SmallVT, dl));
1958 return TLO.CombineTo(
1959 Op, TLO.DAG.getNode(ISD::ANY_EXTEND, dl, VT, NarrowShl));
1960 }
1961 }
1962 }
1963
1964 // Narrow shift to lower half - similar to ShrinkDemandedOp.
1965 // (shl i64:x, K) -> (i64 zero_extend (shl (i32 (trunc i64:x)), K))
1966 // Only do this if we demand the upper half so the knownbits are correct.
1967 unsigned HalfWidth = BitWidth / 2;
1968 if ((BitWidth % 2) == 0 && !VT.isVector() && ShAmt < HalfWidth &&
1969 DemandedBits.countLeadingOnes() >= HalfWidth) {
1970 EVT HalfVT = EVT::getIntegerVT(*TLO.DAG.getContext(), HalfWidth);
1971 if (isNarrowingProfitable(Op.getNode(), VT, HalfVT) &&
1972 isTypeDesirableForOp(ISD::SHL, HalfVT) &&
1973 isTruncateFree(VT, HalfVT) && isZExtFree(HalfVT, VT) &&
1974 (!TLO.LegalOperations() || isOperationLegal(ISD::SHL, HalfVT))) {
1975 // If we're demanding the upper bits at all, we must ensure
1976 // that the upper bits of the shift result are known to be zero,
1977 // which is equivalent to the narrow shift being NUW.
1978 if (bool IsNUW = (Known.countMinLeadingZeros() >= HalfWidth)) {
1979 bool IsNSW = Known.countMinSignBits() > HalfWidth;
1980 SDNodeFlags Flags;
1981 Flags.setNoSignedWrap(IsNSW);
1982 Flags.setNoUnsignedWrap(IsNUW);
1983 SDValue NewOp = TLO.DAG.getNode(ISD::TRUNCATE, dl, HalfVT, Op0);
1984 SDValue NewShiftAmt =
1985 TLO.DAG.getShiftAmountConstant(ShAmt, HalfVT, dl);
1986 SDValue NewShift = TLO.DAG.getNode(ISD::SHL, dl, HalfVT, NewOp,
1987 NewShiftAmt, Flags);
1988 SDValue NewExt =
1989 TLO.DAG.getNode(ISD::ZERO_EXTEND, dl, VT, NewShift);
1990 return TLO.CombineTo(Op, NewExt);
1991 }
1992 }
1993 }
1994 } else {
1995 // This is a variable shift, so we can't shift the demand mask by a known
1996 // amount. But if we are not demanding high bits, then we are not
1997 // demanding those bits from the pre-shifted operand either.
1998 if (unsigned CTLZ = DemandedBits.countl_zero()) {
1999 APInt DemandedFromOp(APInt::getLowBitsSet(BitWidth, BitWidth - CTLZ));
2000 if (SimplifyDemandedBits(Op0, DemandedFromOp, DemandedElts, Known, TLO,
2001 Depth + 1)) {
2002 // Disable the nsw and nuw flags. We can no longer guarantee that we
2003 // won't wrap after simplification.
2004 Op->dropFlags(SDNodeFlags::NoWrap);
2005 return true;
2006 }
2007 Known.resetAll();
2008 }
2009 }
2010
2011 // If we are only demanding sign bits then we can use the shift source
2012 // directly.
2013 if (std::optional<unsigned> MaxSA =
2014 TLO.DAG.getValidMaximumShiftAmount(Op, DemandedElts, Depth + 1)) {
2015 unsigned ShAmt = *MaxSA;
2016 unsigned NumSignBits =
2017 TLO.DAG.ComputeNumSignBits(Op0, DemandedElts, Depth + 1);
2018 unsigned UpperDemandedBits = BitWidth - DemandedBits.countr_zero();
2019 if (NumSignBits > ShAmt && (NumSignBits - ShAmt) >= (UpperDemandedBits))
2020 return TLO.CombineTo(Op, Op0);
2021 }
2022 break;
2023 }
2024 case ISD::SRL: {
2025 SDValue Op0 = Op.getOperand(0);
2026 SDValue Op1 = Op.getOperand(1);
2027 EVT ShiftVT = Op1.getValueType();
2028
2029 if (std::optional<unsigned> KnownSA =
2030 TLO.DAG.getValidShiftAmount(Op, DemandedElts, Depth + 1)) {
2031 unsigned ShAmt = *KnownSA;
2032 if (ShAmt == 0)
2033 return TLO.CombineTo(Op, Op0);
2034
2035 // If this is ((X << C1) >>u ShAmt), see if we can simplify this into a
2036 // single shift. We can do this if the top bits (which are shifted out)
2037 // are never demanded.
2038 // TODO - support non-uniform vector amounts.
2039 if (Op0.getOpcode() == ISD::SHL) {
2040 if (!DemandedBits.intersects(APInt::getHighBitsSet(BitWidth, ShAmt))) {
2041 if (std::optional<unsigned> InnerSA =
2042 TLO.DAG.getValidShiftAmount(Op0, DemandedElts, Depth + 2)) {
2043 unsigned C1 = *InnerSA;
2044 unsigned Opc = ISD::SRL;
2045 int Diff = ShAmt - C1;
2046 if (Diff < 0) {
2047 Diff = -Diff;
2048 Opc = ISD::SHL;
2049 }
2050 SDValue NewSA = TLO.DAG.getConstant(Diff, dl, ShiftVT);
2051 return TLO.CombineTo(
2052 Op, TLO.DAG.getNode(Opc, dl, VT, Op0.getOperand(0), NewSA));
2053 }
2054 }
2055 }
2056
2057 // If this is (srl (sra X, C1), ShAmt), see if we can combine this into a
2058 // single sra. We can do this if the top bits are never demanded.
2059 if (Op0.getOpcode() == ISD::SRA && Op0.hasOneUse()) {
2060 if (!DemandedBits.intersects(APInt::getHighBitsSet(BitWidth, ShAmt))) {
2061 if (std::optional<unsigned> InnerSA =
2062 TLO.DAG.getValidShiftAmount(Op0, DemandedElts, Depth + 2)) {
2063 unsigned C1 = *InnerSA;
2064 // Clamp the combined shift amount if it exceeds the bit width.
2065 unsigned Combined = std::min(C1 + ShAmt, BitWidth - 1);
2066 SDValue NewSA = TLO.DAG.getConstant(Combined, dl, ShiftVT);
2067 return TLO.CombineTo(Op, TLO.DAG.getNode(ISD::SRA, dl, VT,
2068 Op0.getOperand(0), NewSA));
2069 }
2070 }
2071 }
2072
2073 APInt InDemandedMask = (DemandedBits << ShAmt);
2074
2075 // If the shift is exact, then it does demand the low bits (and knows that
2076 // they are zero).
2077 if (Op->getFlags().hasExact())
2078 InDemandedMask.setLowBits(ShAmt);
2079
2080 // Narrow shift to lower half - similar to ShrinkDemandedOp.
2081 // (srl i64:x, K) -> (i64 zero_extend (srl (i32 (trunc i64:x)), K))
2082 if ((BitWidth % 2) == 0 && !VT.isVector()) {
2084 EVT HalfVT = EVT::getIntegerVT(*TLO.DAG.getContext(), BitWidth / 2);
2085 if (isNarrowingProfitable(Op.getNode(), VT, HalfVT) &&
2086 isTypeDesirableForOp(ISD::SRL, HalfVT) &&
2087 isTruncateFree(VT, HalfVT) && isZExtFree(HalfVT, VT) &&
2088 (!TLO.LegalOperations() || isOperationLegal(ISD::SRL, HalfVT)) &&
2089 ((InDemandedMask.countLeadingZeros() >= (BitWidth / 2)) ||
2090 TLO.DAG.MaskedValueIsZero(Op0, HiBits))) {
2091 SDValue NewOp = TLO.DAG.getNode(ISD::TRUNCATE, dl, HalfVT, Op0);
2092 SDValue NewShiftAmt =
2093 TLO.DAG.getShiftAmountConstant(ShAmt, HalfVT, dl);
2094 SDValue NewShift =
2095 TLO.DAG.getNode(ISD::SRL, dl, HalfVT, NewOp, NewShiftAmt);
2096 return TLO.CombineTo(
2097 Op, TLO.DAG.getNode(ISD::ZERO_EXTEND, dl, VT, NewShift));
2098 }
2099 }
2100
2101 // Compute the new bits that are at the top now.
2102 if (SimplifyDemandedBits(Op0, InDemandedMask, DemandedElts, Known, TLO,
2103 Depth + 1))
2104 return true;
2105 Known >>= ShAmt;
2106 // High bits known zero.
2107 Known.Zero.setHighBits(ShAmt);
2108
2109 // Attempt to avoid multi-use ops if we don't need anything from them.
2110 if (!InDemandedMask.isAllOnes() || !DemandedElts.isAllOnes()) {
2112 Op0, InDemandedMask, DemandedElts, TLO.DAG, Depth + 1);
2113 if (DemandedOp0) {
2114 SDValue NewOp = TLO.DAG.getNode(ISD::SRL, dl, VT, DemandedOp0, Op1);
2115 return TLO.CombineTo(Op, NewOp);
2116 }
2117 }
2118 } else {
2119 // Use generic knownbits computation as it has support for non-uniform
2120 // shift amounts.
2121 Known = TLO.DAG.computeKnownBits(Op, DemandedElts, Depth);
2122 }
2123
2124 // If we are only demanding sign bits then we can use the shift source
2125 // directly.
2126 if (std::optional<unsigned> MaxSA =
2127 TLO.DAG.getValidMaximumShiftAmount(Op, DemandedElts, Depth + 1)) {
2128 unsigned ShAmt = *MaxSA;
2129 // Must already be signbits in DemandedBits bounds, and can't demand any
2130 // shifted in zeroes.
2131 if (DemandedBits.countl_zero() >= ShAmt) {
2132 unsigned NumSignBits =
2133 TLO.DAG.ComputeNumSignBits(Op0, DemandedElts, Depth + 1);
2134 if (DemandedBits.countr_zero() >= (BitWidth - NumSignBits))
2135 return TLO.CombineTo(Op, Op0);
2136 }
2137 }
2138
2139 // Try to match AVG patterns (after shift simplification).
2140 if (SDValue AVG = combineShiftToAVG(Op, TLO, *this, DemandedBits,
2141 DemandedElts, Depth + 1))
2142 return TLO.CombineTo(Op, AVG);
2143
2144 break;
2145 }
2146 case ISD::SRA: {
2147 SDValue Op0 = Op.getOperand(0);
2148 SDValue Op1 = Op.getOperand(1);
2149 EVT ShiftVT = Op1.getValueType();
2150
2151 // If we only want bits that already match the signbit then we don't need
2152 // to shift.
2153 unsigned NumHiDemandedBits = BitWidth - DemandedBits.countr_zero();
2154 if (TLO.DAG.ComputeNumSignBits(Op0, DemandedElts, Depth + 1) >=
2155 NumHiDemandedBits)
2156 return TLO.CombineTo(Op, Op0);
2157
2158 // If this is an arithmetic shift right and only the low-bit is set, we can
2159 // always convert this into a logical shr, even if the shift amount is
2160 // variable. The low bit of the shift cannot be an input sign bit unless
2161 // the shift amount is >= the size of the datatype, which is undefined.
2162 if (DemandedBits.isOne())
2163 return TLO.CombineTo(Op, TLO.DAG.getNode(ISD::SRL, dl, VT, Op0, Op1));
2164
2165 if (std::optional<unsigned> KnownSA =
2166 TLO.DAG.getValidShiftAmount(Op, DemandedElts, Depth + 1)) {
2167 unsigned ShAmt = *KnownSA;
2168 if (ShAmt == 0)
2169 return TLO.CombineTo(Op, Op0);
2170
2171 // fold (sra (shl x, c1), c1) -> sext_inreg for some c1 and target
2172 // supports sext_inreg.
2173 if (Op0.getOpcode() == ISD::SHL) {
2174 if (std::optional<unsigned> InnerSA =
2175 TLO.DAG.getValidShiftAmount(Op0, DemandedElts, Depth + 2)) {
2176 unsigned LowBits = BitWidth - ShAmt;
2177 EVT ExtVT = VT.changeElementType(
2178 *TLO.DAG.getContext(),
2179 EVT::getIntegerVT(*TLO.DAG.getContext(), LowBits));
2180
2181 if (*InnerSA == ShAmt) {
2182 if (!TLO.LegalOperations() ||
2184 return TLO.CombineTo(
2185 Op, TLO.DAG.getNode(ISD::SIGN_EXTEND_INREG, dl, VT,
2186 Op0.getOperand(0),
2187 TLO.DAG.getValueType(ExtVT)));
2188
2189 // Even if we can't convert to sext_inreg, we might be able to
2190 // remove this shift pair if the input is already sign extended.
2191 unsigned NumSignBits =
2192 TLO.DAG.ComputeNumSignBits(Op0.getOperand(0), DemandedElts);
2193 if (NumSignBits > ShAmt)
2194 return TLO.CombineTo(Op, Op0.getOperand(0));
2195 }
2196 }
2197 }
2198
2199 APInt InDemandedMask = (DemandedBits << ShAmt);
2200
2201 // If the shift is exact, then it does demand the low bits (and knows that
2202 // they are zero).
2203 if (Op->getFlags().hasExact())
2204 InDemandedMask.setLowBits(ShAmt);
2205
2206 // If any of the demanded bits are produced by the sign extension, we also
2207 // demand the input sign bit.
2208 if (DemandedBits.countl_zero() < ShAmt)
2209 InDemandedMask.setSignBit();
2210
2211 if (SimplifyDemandedBits(Op0, InDemandedMask, DemandedElts, Known, TLO,
2212 Depth + 1))
2213 return true;
2214 Known >>= ShAmt;
2215
2216 // If the input sign bit is known to be zero, or if none of the top bits
2217 // are demanded, turn this into an unsigned shift right.
2218 if (Known.Zero[BitWidth - ShAmt - 1] ||
2219 DemandedBits.countl_zero() >= ShAmt) {
2220 SDNodeFlags Flags;
2221 Flags.setExact(Op->getFlags().hasExact());
2222 return TLO.CombineTo(
2223 Op, TLO.DAG.getNode(ISD::SRL, dl, VT, Op0, Op1, Flags));
2224 }
2225
2226 int Log2 = DemandedBits.exactLogBase2();
2227 if (Log2 >= 0) {
2228 // The bit must come from the sign.
2229 SDValue NewSA = TLO.DAG.getConstant(BitWidth - 1 - Log2, dl, ShiftVT);
2230 return TLO.CombineTo(Op, TLO.DAG.getNode(ISD::SRL, dl, VT, Op0, NewSA));
2231 }
2232
2233 if (Known.One[BitWidth - ShAmt - 1])
2234 // New bits are known one.
2235 Known.One.setHighBits(ShAmt);
2236
2237 // Attempt to avoid multi-use ops if we don't need anything from them.
2238 if (!InDemandedMask.isAllOnes() || !DemandedElts.isAllOnes()) {
2240 Op0, InDemandedMask, DemandedElts, TLO.DAG, Depth + 1);
2241 if (DemandedOp0) {
2242 SDValue NewOp = TLO.DAG.getNode(ISD::SRA, dl, VT, DemandedOp0, Op1);
2243 return TLO.CombineTo(Op, NewOp);
2244 }
2245 }
2246 }
2247
2248 // Try to match AVG patterns (after shift simplification).
2249 if (SDValue AVG = combineShiftToAVG(Op, TLO, *this, DemandedBits,
2250 DemandedElts, Depth + 1))
2251 return TLO.CombineTo(Op, AVG);
2252
2253 break;
2254 }
2255 case ISD::FSHL:
2256 case ISD::FSHR: {
2257 SDValue Op0 = Op.getOperand(0);
2258 SDValue Op1 = Op.getOperand(1);
2259 SDValue Op2 = Op.getOperand(2);
2260 bool IsFSHL = (Op.getOpcode() == ISD::FSHL);
2261
2262 if (ConstantSDNode *SA = isConstOrConstSplat(Op2, DemandedElts)) {
2263 unsigned Amt = SA->getAPIntValue().urem(BitWidth);
2264
2265 // For fshl, 0-shift returns the 1st arg.
2266 // For fshr, 0-shift returns the 2nd arg.
2267 if (Amt == 0) {
2268 if (SimplifyDemandedBits(IsFSHL ? Op0 : Op1, DemandedBits, DemandedElts,
2269 Known, TLO, Depth + 1))
2270 return true;
2271 break;
2272 }
2273
2274 // fshl: (Op0 << Amt) | (Op1 >> (BW - Amt))
2275 // fshr: (Op0 << (BW - Amt)) | (Op1 >> Amt)
2276 APInt Demanded0 = DemandedBits.lshr(IsFSHL ? Amt : (BitWidth - Amt));
2277 APInt Demanded1 = DemandedBits << (IsFSHL ? (BitWidth - Amt) : Amt);
2278 if (SimplifyDemandedBits(Op0, Demanded0, DemandedElts, Known2, TLO,
2279 Depth + 1))
2280 return true;
2281 if (SimplifyDemandedBits(Op1, Demanded1, DemandedElts, Known, TLO,
2282 Depth + 1))
2283 return true;
2284
2285 Known2 <<= (IsFSHL ? Amt : (BitWidth - Amt));
2286 Known >>= (IsFSHL ? (BitWidth - Amt) : Amt);
2287 Known = Known.unionWith(Known2);
2288
2289 // Attempt to avoid multi-use ops if we don't need anything from them.
2290 if (!Demanded0.isAllOnes() || !Demanded1.isAllOnes() ||
2291 !DemandedElts.isAllOnes()) {
2293 Op0, Demanded0, DemandedElts, TLO.DAG, Depth + 1);
2295 Op1, Demanded1, DemandedElts, TLO.DAG, Depth + 1);
2296 if (DemandedOp0 || DemandedOp1) {
2297 DemandedOp0 = DemandedOp0 ? DemandedOp0 : Op0;
2298 DemandedOp1 = DemandedOp1 ? DemandedOp1 : Op1;
2299 SDValue NewOp = TLO.DAG.getNode(Op.getOpcode(), dl, VT, DemandedOp0,
2300 DemandedOp1, Op2);
2301 return TLO.CombineTo(Op, NewOp);
2302 }
2303 }
2304 }
2305
2306 if (isPowerOf2_32(BitWidth)) {
2307 // Fold FSHR(Op0,Op1,Op2) -> SRL(Op1,Op2)
2308 // iff we're guaranteed not to use Op0.
2309 // TODO: Add FSHL equivalent?
2310 if (!IsFSHL && !DemandedBits.isAllOnes() &&
2311 (!TLO.LegalOperations() || isOperationLegal(ISD::SRL, VT))) {
2312 KnownBits KnownAmt =
2313 TLO.DAG.computeKnownBits(Op2, DemandedElts, Depth + 1);
2314 unsigned MaxShiftAmt =
2315 KnownAmt.getMaxValue().getLimitedValue(BitWidth - 1);
2316 // Check we don't demand any shifted bits outside Op1.
2317 if (DemandedBits.countl_zero() >= MaxShiftAmt) {
2318 EVT AmtVT = Op2.getValueType();
2319 SDValue NewAmt =
2320 TLO.DAG.getNode(ISD::AND, dl, AmtVT, Op2,
2321 TLO.DAG.getConstant(BitWidth - 1, dl, AmtVT));
2322 SDValue NewOp = TLO.DAG.getNode(ISD::SRL, dl, VT, Op1, NewAmt);
2323 return TLO.CombineTo(Op, NewOp);
2324 }
2325 }
2326
2327 // For pow-2 bitwidths we only demand the bottom modulo amt bits.
2328 APInt DemandedAmtBits(Op2.getScalarValueSizeInBits(), BitWidth - 1);
2329 if (SimplifyDemandedBits(Op2, DemandedAmtBits, DemandedElts, Known2, TLO,
2330 Depth + 1))
2331 return true;
2332 }
2333 break;
2334 }
2335 case ISD::ROTL:
2336 case ISD::ROTR: {
2337 SDValue Op0 = Op.getOperand(0);
2338 SDValue Op1 = Op.getOperand(1);
2339 bool IsROTL = (Op.getOpcode() == ISD::ROTL);
2340
2341 // If we're rotating an 0/-1 value, then it stays an 0/-1 value.
2342 if (BitWidth == TLO.DAG.ComputeNumSignBits(Op0, DemandedElts, Depth + 1))
2343 return TLO.CombineTo(Op, Op0);
2344
2345 if (ConstantSDNode *SA = isConstOrConstSplat(Op1, DemandedElts)) {
2346 unsigned Amt = SA->getAPIntValue().urem(BitWidth);
2347 unsigned RevAmt = BitWidth - Amt;
2348
2349 // rotl: (Op0 << Amt) | (Op0 >> (BW - Amt))
2350 // rotr: (Op0 << (BW - Amt)) | (Op0 >> Amt)
2351 APInt Demanded0 = DemandedBits.rotr(IsROTL ? Amt : RevAmt);
2352 if (SimplifyDemandedBits(Op0, Demanded0, DemandedElts, Known2, TLO,
2353 Depth + 1))
2354 return true;
2355
2356 // rot*(x, 0) --> x
2357 if (Amt == 0)
2358 return TLO.CombineTo(Op, Op0);
2359
2360 // See if we don't demand either half of the rotated bits.
2361 if ((!TLO.LegalOperations() || isOperationLegal(ISD::SHL, VT)) &&
2362 DemandedBits.countr_zero() >= (IsROTL ? Amt : RevAmt)) {
2363 Op1 = TLO.DAG.getConstant(IsROTL ? Amt : RevAmt, dl, Op1.getValueType());
2364 return TLO.CombineTo(Op, TLO.DAG.getNode(ISD::SHL, dl, VT, Op0, Op1));
2365 }
2366 if ((!TLO.LegalOperations() || isOperationLegal(ISD::SRL, VT)) &&
2367 DemandedBits.countl_zero() >= (IsROTL ? RevAmt : Amt)) {
2368 Op1 = TLO.DAG.getConstant(IsROTL ? RevAmt : Amt, dl, Op1.getValueType());
2369 return TLO.CombineTo(Op, TLO.DAG.getNode(ISD::SRL, dl, VT, Op0, Op1));
2370 }
2371 }
2372
2373 // For pow-2 bitwidths we only demand the bottom modulo amt bits.
2374 if (isPowerOf2_32(BitWidth)) {
2375 APInt DemandedAmtBits(Op1.getScalarValueSizeInBits(), BitWidth - 1);
2376 if (SimplifyDemandedBits(Op1, DemandedAmtBits, DemandedElts, Known2, TLO,
2377 Depth + 1))
2378 return true;
2379 }
2380 break;
2381 }
2382 case ISD::SMIN:
2383 case ISD::SMAX:
2384 case ISD::UMIN:
2385 case ISD::UMAX: {
2386 unsigned Opc = Op.getOpcode();
2387 SDValue Op0 = Op.getOperand(0);
2388 SDValue Op1 = Op.getOperand(1);
2389
2390 // If we're only demanding signbits, then we can simplify to OR/AND node.
2391 unsigned BitOp =
2392 (Opc == ISD::SMIN || Opc == ISD::UMAX) ? ISD::OR : ISD::AND;
2393 unsigned NumSignBits =
2394 std::min(TLO.DAG.ComputeNumSignBits(Op0, DemandedElts, Depth + 1),
2395 TLO.DAG.ComputeNumSignBits(Op1, DemandedElts, Depth + 1));
2396 unsigned NumDemandedUpperBits = BitWidth - DemandedBits.countr_zero();
2397 if (NumSignBits >= NumDemandedUpperBits)
2398 return TLO.CombineTo(Op, TLO.DAG.getNode(BitOp, SDLoc(Op), VT, Op0, Op1));
2399
2400 // Check if one arg is always less/greater than (or equal) to the other arg.
2401 KnownBits Known0 = TLO.DAG.computeKnownBits(Op0, DemandedElts, Depth + 1);
2402 KnownBits Known1 = TLO.DAG.computeKnownBits(Op1, DemandedElts, Depth + 1);
2403 switch (Opc) {
2404 case ISD::SMIN:
2405 if (std::optional<bool> IsSLE = KnownBits::sle(Known0, Known1))
2406 return TLO.CombineTo(Op, *IsSLE ? Op0 : Op1);
2407 if (std::optional<bool> IsSLT = KnownBits::slt(Known0, Known1))
2408 return TLO.CombineTo(Op, *IsSLT ? Op0 : Op1);
2409 Known = KnownBits::smin(Known0, Known1);
2410 break;
2411 case ISD::SMAX:
2412 if (std::optional<bool> IsSGE = KnownBits::sge(Known0, Known1))
2413 return TLO.CombineTo(Op, *IsSGE ? Op0 : Op1);
2414 if (std::optional<bool> IsSGT = KnownBits::sgt(Known0, Known1))
2415 return TLO.CombineTo(Op, *IsSGT ? Op0 : Op1);
2416 Known = KnownBits::smax(Known0, Known1);
2417 break;
2418 case ISD::UMIN:
2419 if (std::optional<bool> IsULE = KnownBits::ule(Known0, Known1))
2420 return TLO.CombineTo(Op, *IsULE ? Op0 : Op1);
2421 if (std::optional<bool> IsULT = KnownBits::ult(Known0, Known1))
2422 return TLO.CombineTo(Op, *IsULT ? Op0 : Op1);
2423 Known = KnownBits::umin(Known0, Known1);
2424 break;
2425 case ISD::UMAX:
2426 if (std::optional<bool> IsUGE = KnownBits::uge(Known0, Known1))
2427 return TLO.CombineTo(Op, *IsUGE ? Op0 : Op1);
2428 if (std::optional<bool> IsUGT = KnownBits::ugt(Known0, Known1))
2429 return TLO.CombineTo(Op, *IsUGT ? Op0 : Op1);
2430 Known = KnownBits::umax(Known0, Known1);
2431 break;
2432 }
2433 break;
2434 }
2435 case ISD::BITREVERSE: {
2436 SDValue Src = Op.getOperand(0);
2437 APInt DemandedSrcBits = DemandedBits.reverseBits();
2438 if (SimplifyDemandedBits(Src, DemandedSrcBits, DemandedElts, Known2, TLO,
2439 Depth + 1))
2440 return true;
2441 Known = Known2.reverseBits();
2442 break;
2443 }
2444 case ISD::BSWAP: {
2445 SDValue Src = Op.getOperand(0);
2446
2447 // If the only bits demanded come from one byte of the bswap result,
2448 // just shift the input byte into position to eliminate the bswap.
2449 unsigned NLZ = DemandedBits.countl_zero();
2450 unsigned NTZ = DemandedBits.countr_zero();
2451
2452 // Round NTZ down to the next byte. If we have 11 trailing zeros, then
2453 // we need all the bits down to bit 8. Likewise, round NLZ. If we
2454 // have 14 leading zeros, round to 8.
2455 NLZ = alignDown(NLZ, 8);
2456 NTZ = alignDown(NTZ, 8);
2457 // If we need exactly one byte, we can do this transformation.
2458 if (BitWidth - NLZ - NTZ == 8) {
2459 // Replace this with either a left or right shift to get the byte into
2460 // the right place.
2461 unsigned ShiftOpcode = NLZ > NTZ ? ISD::SRL : ISD::SHL;
2462 if (!TLO.LegalOperations() || isOperationLegal(ShiftOpcode, VT)) {
2463 unsigned ShiftAmount = NLZ > NTZ ? NLZ - NTZ : NTZ - NLZ;
2464 SDValue ShAmt = TLO.DAG.getShiftAmountConstant(ShiftAmount, VT, dl);
2465 SDValue NewOp = TLO.DAG.getNode(ShiftOpcode, dl, VT, Src, ShAmt);
2466 return TLO.CombineTo(Op, NewOp);
2467 }
2468 }
2469
2470 APInt DemandedSrcBits = DemandedBits.byteSwap();
2471 if (SimplifyDemandedBits(Src, DemandedSrcBits, DemandedElts, Known2, TLO,
2472 Depth + 1))
2473 return true;
2474 Known = Known2.byteSwap();
2475 break;
2476 }
2477 case ISD::CTPOP: {
2478 // If only 1 bit is demanded, replace with PARITY as long as we're before
2479 // op legalization.
2480 // FIXME: Limit to scalars for now.
2481 if (DemandedBits.isOne() && !TLO.LegalOps && !VT.isVector())
2482 return TLO.CombineTo(Op, TLO.DAG.getNode(ISD::PARITY, dl, VT,
2483 Op.getOperand(0)));
2484
2485 Known = TLO.DAG.computeKnownBits(Op, DemandedElts, Depth);
2486 break;
2487 }
2488 case ISD::PDEP: {
2489 SDValue Op0 = Op.getOperand(0);
2490 SDValue Op1 = Op.getOperand(1);
2491
2492 unsigned DemandedBitsLZ = DemandedBits.countl_zero();
2493 APInt LoMask = APInt::getLowBitsSet(BitWidth, BitWidth - DemandedBitsLZ);
2494
2495 // If the demanded bits has leading zeroes, we don't demand those from the
2496 // mask.
2497 if (SimplifyDemandedBits(Op1, LoMask, Known, TLO, Depth + 1))
2498 return true;
2499
2500 // The number of possible 1s in the mask determines the number of LSBs of
2501 // operand 0 used. Undemanded bits from the mask don't matter so filter
2502 // them before counting.
2503 KnownBits Known2;
2504 uint64_t Count = (~Known.Zero & LoMask).popcount();
2505 APInt DemandedMask(APInt::getLowBitsSet(BitWidth, Count));
2506 if (SimplifyDemandedBits(Op0, DemandedMask, Known2, TLO, Depth + 1))
2507 return true;
2508
2509 // Zeroes are retained from the mask, but not ones.
2510 Known.One.clearAllBits();
2511 // The result will have at least as many trailing zeros as the non-mask
2512 // operand since bits can only map to the same or higher bit position.
2513 Known.Zero.setLowBits(Known2.countMinTrailingZeros());
2514 break;
2515 }
2517 SDValue Op0 = Op.getOperand(0);
2518 EVT ExVT = cast<VTSDNode>(Op.getOperand(1))->getVT();
2519 unsigned ExVTBits = ExVT.getScalarSizeInBits();
2520
2521 // If we only care about the highest bit, don't bother shifting right.
2522 if (DemandedBits.isSignMask()) {
2523 unsigned MinSignedBits =
2524 TLO.DAG.ComputeMaxSignificantBits(Op0, DemandedElts, Depth + 1);
2525 bool AlreadySignExtended = ExVTBits >= MinSignedBits;
2526 // However if the input is already sign extended we expect the sign
2527 // extension to be dropped altogether later and do not simplify.
2528 if (!AlreadySignExtended) {
2529 // Compute the correct shift amount type, which must be getShiftAmountTy
2530 // for scalar types after legalization.
2531 SDValue ShiftAmt =
2532 TLO.DAG.getShiftAmountConstant(BitWidth - ExVTBits, VT, dl);
2533 return TLO.CombineTo(Op,
2534 TLO.DAG.getNode(ISD::SHL, dl, VT, Op0, ShiftAmt));
2535 }
2536 }
2537
2538 // If none of the extended bits are demanded, eliminate the sextinreg.
2539 if (DemandedBits.getActiveBits() <= ExVTBits)
2540 return TLO.CombineTo(Op, Op0);
2541
2542 APInt InputDemandedBits = DemandedBits.getLoBits(ExVTBits);
2543
2544 // Since the sign extended bits are demanded, we know that the sign
2545 // bit is demanded.
2546 InputDemandedBits.setBit(ExVTBits - 1);
2547
2548 if (SimplifyDemandedBits(Op0, InputDemandedBits, DemandedElts, Known, TLO,
2549 Depth + 1))
2550 return true;
2551
2552 // If the sign bit of the input is known set or clear, then we know the
2553 // top bits of the result.
2554
2555 // If the input sign bit is known zero, convert this into a zero extension.
2556 if (Known.Zero[ExVTBits - 1])
2557 return TLO.CombineTo(Op, TLO.DAG.getZeroExtendInReg(Op0, dl, ExVT));
2558
2559 APInt Mask = APInt::getLowBitsSet(BitWidth, ExVTBits);
2560 if (Known.One[ExVTBits - 1]) { // Input sign bit known set
2561 Known.One.setBitsFrom(ExVTBits);
2562 Known.Zero &= Mask;
2563 } else { // Input sign bit unknown
2564 Known.Zero &= Mask;
2565 Known.One &= Mask;
2566 }
2567 break;
2568 }
2569 case ISD::BUILD_PAIR: {
2570 EVT HalfVT = Op.getOperand(0).getValueType();
2571 unsigned HalfBitWidth = HalfVT.getScalarSizeInBits();
2572
2573 APInt MaskLo = DemandedBits.getLoBits(HalfBitWidth).trunc(HalfBitWidth);
2574 APInt MaskHi = DemandedBits.getHiBits(HalfBitWidth).trunc(HalfBitWidth);
2575
2576 KnownBits KnownLo, KnownHi;
2577
2578 if (SimplifyDemandedBits(Op.getOperand(0), MaskLo, KnownLo, TLO, Depth + 1))
2579 return true;
2580
2581 if (SimplifyDemandedBits(Op.getOperand(1), MaskHi, KnownHi, TLO, Depth + 1))
2582 return true;
2583
2584 Known = KnownHi.concat(KnownLo);
2585 break;
2586 }
2588 if (VT.isScalableVector())
2589 return false;
2590 [[fallthrough]];
2591 case ISD::ZERO_EXTEND: {
2592 SDValue Src = Op.getOperand(0);
2593 EVT SrcVT = Src.getValueType();
2594 unsigned InBits = SrcVT.getScalarSizeInBits();
2595 unsigned InElts = SrcVT.isFixedLengthVector() ? SrcVT.getVectorNumElements() : 1;
2596 bool IsVecInReg = Op.getOpcode() == ISD::ZERO_EXTEND_VECTOR_INREG;
2597
2598 // If none of the top bits are demanded, convert this into an any_extend.
2599 if (DemandedBits.getActiveBits() <= InBits) {
2600 // If we only need the non-extended bits of the bottom element
2601 // then we can just bitcast to the result.
2602 if (IsLE && IsVecInReg && DemandedElts == 1 &&
2603 VT.getSizeInBits() == SrcVT.getSizeInBits())
2604 return TLO.CombineTo(Op, TLO.DAG.getBitcast(VT, Src));
2605
2606 unsigned Opc =
2608 if (!TLO.LegalOperations() || isOperationLegal(Opc, VT))
2609 return TLO.CombineTo(Op, TLO.DAG.getNode(Opc, dl, VT, Src));
2610 }
2611
2612 APInt InDemandedBits = DemandedBits.trunc(InBits);
2613 APInt InDemandedElts = DemandedElts.zext(InElts);
2614 if (SimplifyDemandedBits(Src, InDemandedBits, InDemandedElts, Known, TLO,
2615 Depth + 1)) {
2616 Op->dropFlags(SDNodeFlags::NonNeg);
2617 return true;
2618 }
2619 assert(Known.getBitWidth() == InBits && "Src width has changed?");
2620 Known = Known.zext(BitWidth);
2621
2622 // Attempt to avoid multi-use ops if we don't need anything from them.
2624 Src, InDemandedBits, InDemandedElts, TLO.DAG, Depth + 1))
2625 return TLO.CombineTo(Op, TLO.DAG.getNode(Op.getOpcode(), dl, VT, NewSrc));
2626 break;
2627 }
2629 if (VT.isScalableVector())
2630 return false;
2631 [[fallthrough]];
2632 case ISD::SIGN_EXTEND: {
2633 SDValue Src = Op.getOperand(0);
2634 EVT SrcVT = Src.getValueType();
2635 unsigned InBits = SrcVT.getScalarSizeInBits();
2636 unsigned InElts = SrcVT.isFixedLengthVector() ? SrcVT.getVectorNumElements() : 1;
2637 bool IsVecInReg = Op.getOpcode() == ISD::SIGN_EXTEND_VECTOR_INREG;
2638
2639 APInt InDemandedElts = DemandedElts.zext(InElts);
2640 APInt InDemandedBits = DemandedBits.trunc(InBits);
2641
2642 // Since some of the sign extended bits are demanded, we know that the sign
2643 // bit is demanded.
2644 InDemandedBits.setBit(InBits - 1);
2645
2646 // If none of the top bits are demanded, convert this into an any_extend.
2647 if (DemandedBits.getActiveBits() <= InBits) {
2648 // If we only need the non-extended bits of the bottom element
2649 // then we can just bitcast to the result.
2650 if (IsLE && IsVecInReg && DemandedElts == 1 &&
2651 VT.getSizeInBits() == SrcVT.getSizeInBits())
2652 return TLO.CombineTo(Op, TLO.DAG.getBitcast(VT, Src));
2653
2654 // Don't lose an all signbits 0/-1 splat on targets with 0/-1 booleans.
2656 TLO.DAG.ComputeNumSignBits(Src, InDemandedElts, Depth + 1) !=
2657 InBits) {
2658 unsigned Opc =
2660 if (!TLO.LegalOperations() || isOperationLegal(Opc, VT))
2661 return TLO.CombineTo(Op, TLO.DAG.getNode(Opc, dl, VT, Src));
2662 }
2663 }
2664
2665 if (SimplifyDemandedBits(Src, InDemandedBits, InDemandedElts, Known, TLO,
2666 Depth + 1))
2667 return true;
2668 assert(Known.getBitWidth() == InBits && "Src width has changed?");
2669
2670 // If the sign bit is known one, the top bits match.
2671 Known = Known.sext(BitWidth);
2672
2673 // If the sign bit is known zero, convert this to a zero extend.
2674 if (Known.isNonNegative()) {
2675 unsigned Opc =
2677 if (!TLO.LegalOperations() || isOperationLegal(Opc, VT)) {
2678 SDNodeFlags Flags;
2679 if (!IsVecInReg)
2680 Flags |= SDNodeFlags::NonNeg;
2681 return TLO.CombineTo(Op, TLO.DAG.getNode(Opc, dl, VT, Src, Flags));
2682 }
2683 }
2684
2685 // Attempt to avoid multi-use ops if we don't need anything from them.
2687 Src, InDemandedBits, InDemandedElts, TLO.DAG, Depth + 1))
2688 return TLO.CombineTo(Op, TLO.DAG.getNode(Op.getOpcode(), dl, VT, NewSrc));
2689 break;
2690 }
2692 if (VT.isScalableVector())
2693 return false;
2694 [[fallthrough]];
2695 case ISD::ANY_EXTEND: {
2696 SDValue Src = Op.getOperand(0);
2697 EVT SrcVT = Src.getValueType();
2698 unsigned InBits = SrcVT.getScalarSizeInBits();
2699 unsigned InElts = SrcVT.isFixedLengthVector() ? SrcVT.getVectorNumElements() : 1;
2700 bool IsVecInReg = Op.getOpcode() == ISD::ANY_EXTEND_VECTOR_INREG;
2701
2702 // If we only need the bottom element then we can just bitcast.
2703 // TODO: Handle ANY_EXTEND?
2704 if (IsLE && IsVecInReg && DemandedElts == 1 &&
2705 VT.getSizeInBits() == SrcVT.getSizeInBits())
2706 return TLO.CombineTo(Op, TLO.DAG.getBitcast(VT, Src));
2707
2708 APInt InDemandedBits = DemandedBits.trunc(InBits);
2709 APInt InDemandedElts = DemandedElts.zext(InElts);
2710 if (SimplifyDemandedBits(Src, InDemandedBits, InDemandedElts, Known, TLO,
2711 Depth + 1))
2712 return true;
2713 assert(Known.getBitWidth() == InBits && "Src width has changed?");
2714 Known = Known.anyext(BitWidth);
2715
2716 // Attempt to avoid multi-use ops if we don't need anything from them.
2718 Src, InDemandedBits, InDemandedElts, TLO.DAG, Depth + 1))
2719 return TLO.CombineTo(Op, TLO.DAG.getNode(Op.getOpcode(), dl, VT, NewSrc));
2720 break;
2721 }
2722 case ISD::TRUNCATE: {
2723 SDValue Src = Op.getOperand(0);
2724
2725 // Simplify the input, using demanded bit information, and compute the known
2726 // zero/one bits live out.
2727 unsigned OperandBitWidth = Src.getScalarValueSizeInBits();
2728 APInt TruncMask = DemandedBits.zext(OperandBitWidth);
2729 if (SimplifyDemandedBits(Src, TruncMask, DemandedElts, Known, TLO,
2730 Depth + 1)) {
2731 // Disable the nsw and nuw flags. We can no longer guarantee that we
2732 // won't wrap after simplification.
2733 Op->dropFlags(SDNodeFlags::NoWrap);
2734 return true;
2735 }
2736 Known = Known.trunc(BitWidth);
2737
2738 // Attempt to avoid multi-use ops if we don't need anything from them.
2740 Src, TruncMask, DemandedElts, TLO.DAG, Depth + 1))
2741 return TLO.CombineTo(Op, TLO.DAG.getNode(ISD::TRUNCATE, dl, VT, NewSrc));
2742
2743 // If the input is only used by this truncate, see if we can shrink it based
2744 // on the known demanded bits.
2745 switch (Src.getOpcode()) {
2746 default:
2747 break;
2748 case ISD::SRL:
2749 // Shrink SRL by a constant if none of the high bits shifted in are
2750 // demanded.
2751 if (TLO.LegalTypes() && !isTypeDesirableForOp(ISD::SRL, VT))
2752 // Do not turn (vt1 truncate (vt2 srl)) into (vt1 srl) if vt1 is
2753 // undesirable.
2754 break;
2755
2756 if (Src.getNode()->hasOneUse()) {
2757 if (isTruncateFree(Src, VT) &&
2758 !isTruncateFree(Src.getValueType(), VT)) {
2759 // If truncate is only free at trunc(srl), do not turn it into
2760 // srl(trunc). The check is done by first check the truncate is free
2761 // at Src's opcode(srl), then check the truncate is not done by
2762 // referencing sub-register. In test, if both trunc(srl) and
2763 // srl(trunc)'s trunc are free, srl(trunc) performs better. If only
2764 // trunc(srl)'s trunc is free, trunc(srl) is better.
2765 break;
2766 }
2767
2768 std::optional<unsigned> ShAmtC =
2769 TLO.DAG.getValidShiftAmount(Src, DemandedElts, Depth + 2);
2770 if (!ShAmtC || *ShAmtC >= BitWidth)
2771 break;
2772 unsigned ShVal = *ShAmtC;
2773
2774 APInt HighBits =
2775 APInt::getHighBitsSet(OperandBitWidth, OperandBitWidth - BitWidth);
2776 HighBits.lshrInPlace(ShVal);
2777 HighBits = HighBits.trunc(BitWidth);
2778 if (!(HighBits & DemandedBits)) {
2779 // None of the shifted in bits are needed. Add a truncate of the
2780 // shift input, then shift it.
2781 SDValue NewShAmt = TLO.DAG.getShiftAmountConstant(ShVal, VT, dl);
2782 SDValue NewTrunc =
2783 TLO.DAG.getNode(ISD::TRUNCATE, dl, VT, Src.getOperand(0));
2784 return TLO.CombineTo(
2785 Op, TLO.DAG.getNode(ISD::SRL, dl, VT, NewTrunc, NewShAmt));
2786 }
2787 }
2788 break;
2789 }
2790
2791 break;
2792 }
2793 case ISD::AssertZext: {
2794 // AssertZext demands all of the high bits, plus any of the low bits
2795 // demanded by its users.
2796 EVT ZVT = cast<VTSDNode>(Op.getOperand(1))->getVT();
2798 if (SimplifyDemandedBits(Op.getOperand(0), ~InMask | DemandedBits, Known,
2799 TLO, Depth + 1))
2800 return true;
2801
2802 Known.Zero |= ~InMask;
2803 Known.One &= (~Known.Zero);
2804 break;
2805 }
2807 SDValue Src = Op.getOperand(0);
2808 SDValue Idx = Op.getOperand(1);
2809 ElementCount SrcEltCnt = Src.getValueType().getVectorElementCount();
2810 unsigned EltBitWidth = Src.getScalarValueSizeInBits();
2811
2812 if (SrcEltCnt.isScalable())
2813 return false;
2814
2815 // Demand the bits from every vector element without a constant index.
2816 unsigned NumSrcElts = SrcEltCnt.getFixedValue();
2817 APInt DemandedSrcElts = APInt::getAllOnes(NumSrcElts);
2818 if (auto *CIdx = dyn_cast<ConstantSDNode>(Idx))
2819 if (CIdx->getAPIntValue().ult(NumSrcElts))
2820 DemandedSrcElts = APInt::getOneBitSet(NumSrcElts, CIdx->getZExtValue());
2821
2822 // If BitWidth > EltBitWidth the value is anyext:ed. So we do not know
2823 // anything about the extended bits.
2824 APInt DemandedSrcBits = DemandedBits;
2825 if (BitWidth > EltBitWidth)
2826 DemandedSrcBits = DemandedSrcBits.trunc(EltBitWidth);
2827
2828 if (SimplifyDemandedBits(Src, DemandedSrcBits, DemandedSrcElts, Known2, TLO,
2829 Depth + 1))
2830 return true;
2831
2832 // Attempt to avoid multi-use ops if we don't need anything from them.
2833 if (!DemandedSrcBits.isAllOnes() || !DemandedSrcElts.isAllOnes()) {
2834 if (SDValue DemandedSrc = SimplifyMultipleUseDemandedBits(
2835 Src, DemandedSrcBits, DemandedSrcElts, TLO.DAG, Depth + 1)) {
2836 SDValue NewOp =
2837 TLO.DAG.getNode(Op.getOpcode(), dl, VT, DemandedSrc, Idx);
2838 return TLO.CombineTo(Op, NewOp);
2839 }
2840 }
2841
2842 Known = Known2;
2843 if (BitWidth > EltBitWidth)
2844 Known = Known.anyext(BitWidth);
2845 break;
2846 }
2847 case ISD::BITCAST: {
2848 if (VT.isScalableVector())
2849 return false;
2850 SDValue Src = Op.getOperand(0);
2851 EVT SrcVT = Src.getValueType();
2852 unsigned NumSrcEltBits = SrcVT.getScalarSizeInBits();
2853
2854 // If this is an FP->Int bitcast and if the sign bit is the only
2855 // thing demanded, turn this into a FGETSIGN.
2856 if (!TLO.LegalOperations() && !VT.isVector() && !SrcVT.isVector() &&
2857 DemandedBits == APInt::getSignMask(Op.getValueSizeInBits()) &&
2858 SrcVT.isFloatingPoint()) {
2860 // Make a FGETSIGN + SHL to move the sign bit into the appropriate
2861 // place. We expect the SHL to be eliminated by other optimizations.
2862 SDValue Sign = TLO.DAG.getNode(ISD::FGETSIGN, dl, VT, Src);
2863 unsigned ShVal = Op.getValueSizeInBits() - 1;
2864 SDValue ShAmt = TLO.DAG.getShiftAmountConstant(ShVal, VT, dl);
2865 return TLO.CombineTo(Op,
2866 TLO.DAG.getNode(ISD::SHL, dl, VT, Sign, ShAmt));
2867 }
2868 }
2869
2870 // Bitcast from a vector using SimplifyDemanded Bits/VectorElts.
2871 // Demand the elt/bit if any of the original elts/bits are demanded.
2872 if (SrcVT.isVector() && (BitWidth % NumSrcEltBits) == 0) {
2873 unsigned Scale = BitWidth / NumSrcEltBits;
2874 unsigned NumSrcElts = SrcVT.getVectorNumElements();
2875 APInt DemandedSrcBits = APInt::getZero(NumSrcEltBits);
2876 for (unsigned i = 0; i != Scale; ++i) {
2877 unsigned EltOffset = IsLE ? i : (Scale - 1 - i);
2878 unsigned BitOffset = EltOffset * NumSrcEltBits;
2879 DemandedSrcBits |= DemandedBits.extractBits(NumSrcEltBits, BitOffset);
2880 }
2881 // Recursive calls below may turn not demanded elements into poison, so we
2882 // need to demand all smaller source elements that maps to a demanded
2883 // destination element.
2884 APInt DemandedSrcElts = APIntOps::ScaleBitMask(DemandedElts, NumSrcElts);
2885
2886 APInt KnownSrcUndef, KnownSrcZero;
2887 if (SimplifyDemandedVectorElts(Src, DemandedSrcElts, KnownSrcUndef,
2888 KnownSrcZero, TLO, Depth + 1))
2889 return true;
2890
2891 KnownBits KnownSrcBits;
2892 if (SimplifyDemandedBits(Src, DemandedSrcBits, DemandedSrcElts,
2893 KnownSrcBits, TLO, Depth + 1))
2894 return true;
2895 } else if (IsLE && (NumSrcEltBits % BitWidth) == 0) {
2896 // TODO - bigendian once we have test coverage.
2897 unsigned Scale = NumSrcEltBits / BitWidth;
2898 unsigned NumSrcElts = SrcVT.isVector() ? SrcVT.getVectorNumElements() : 1;
2899 APInt DemandedSrcBits = APInt::getZero(NumSrcEltBits);
2900 APInt DemandedSrcElts = APInt::getZero(NumSrcElts);
2901 for (unsigned i = 0; i != NumElts; ++i)
2902 if (DemandedElts[i]) {
2903 unsigned Offset = (i % Scale) * BitWidth;
2904 DemandedSrcBits.insertBits(DemandedBits, Offset);
2905 DemandedSrcElts.setBit(i / Scale);
2906 }
2907
2908 if (SrcVT.isVector()) {
2909 APInt KnownSrcUndef, KnownSrcZero;
2910 if (SimplifyDemandedVectorElts(Src, DemandedSrcElts, KnownSrcUndef,
2911 KnownSrcZero, TLO, Depth + 1))
2912 return true;
2913 }
2914
2915 KnownBits KnownSrcBits;
2916 if (SimplifyDemandedBits(Src, DemandedSrcBits, DemandedSrcElts,
2917 KnownSrcBits, TLO, Depth + 1))
2918 return true;
2919
2920 // Attempt to avoid multi-use ops if we don't need anything from them.
2921 if (!DemandedSrcBits.isAllOnes() || !DemandedSrcElts.isAllOnes()) {
2922 if (SDValue DemandedSrc = SimplifyMultipleUseDemandedBits(
2923 Src, DemandedSrcBits, DemandedSrcElts, TLO.DAG, Depth + 1)) {
2924 SDValue NewOp = TLO.DAG.getBitcast(VT, DemandedSrc);
2925 return TLO.CombineTo(Op, NewOp);
2926 }
2927 }
2928 }
2929
2930 // If this is a bitcast, let computeKnownBits handle it. Only do this on a
2931 // recursive call where Known may be useful to the caller.
2932 if (Depth > 0) {
2933 Known = TLO.DAG.computeKnownBits(Op, DemandedElts, Depth);
2934 return false;
2935 }
2936 break;
2937 }
2938 case ISD::MUL:
2939 if (DemandedBits.isPowerOf2()) {
2940 // The LSB of X*Y is set only if (X & 1) == 1 and (Y & 1) == 1.
2941 // If we demand exactly one bit N and we have "X * (C' << N)" where C' is
2942 // odd (has LSB set), then the left-shifted low bit of X is the answer.
2943 unsigned CTZ = DemandedBits.countr_zero();
2944 ConstantSDNode *C = isConstOrConstSplat(Op.getOperand(1), DemandedElts);
2945 if (C && C->getAPIntValue().countr_zero() == CTZ) {
2946 SDValue AmtC = TLO.DAG.getShiftAmountConstant(CTZ, VT, dl);
2947 SDValue Shl = TLO.DAG.getNode(ISD::SHL, dl, VT, Op.getOperand(0), AmtC);
2948 return TLO.CombineTo(Op, Shl);
2949 }
2950 }
2951 // For a squared value "X * X", the bottom 2 bits are 0 and X[0] because:
2952 // X * X is odd iff X is odd.
2953 // 'Quadratic Reciprocity': X * X -> 0 for bit[1]
2954 if (Op.getOperand(0) == Op.getOperand(1) && DemandedBits.ult(4)) {
2955 SDValue One = TLO.DAG.getConstant(1, dl, VT);
2956 SDValue And1 = TLO.DAG.getNode(ISD::AND, dl, VT, Op.getOperand(0), One);
2957 return TLO.CombineTo(Op, And1);
2958 }
2959 [[fallthrough]];
2960 case ISD::PTRADD:
2961 if (Op.getOperand(0).getValueType() != Op.getOperand(1).getValueType())
2962 break;
2963 // PTRADD behaves like ADD if pointers are represented as integers.
2964 [[fallthrough]];
2965 case ISD::ADD:
2966 case ISD::SUB: {
2967 // Add, Sub, and Mul don't demand any bits in positions beyond that
2968 // of the highest bit demanded of them.
2969 SDValue Op0 = Op.getOperand(0), Op1 = Op.getOperand(1);
2970 SDNodeFlags Flags = Op.getNode()->getFlags();
2971 unsigned DemandedBitsLZ = DemandedBits.countl_zero();
2972 APInt LoMask = APInt::getLowBitsSet(BitWidth, BitWidth - DemandedBitsLZ);
2973 KnownBits KnownOp0, KnownOp1;
2974 auto GetDemandedBitsLHSMask = [&](APInt Demanded,
2975 const KnownBits &KnownRHS) {
2976 if (Op.getOpcode() == ISD::MUL)
2977 Demanded.clearHighBits(KnownRHS.countMinTrailingZeros());
2978 return Demanded;
2979 };
2980 if (SimplifyDemandedBits(Op1, LoMask, DemandedElts, KnownOp1, TLO,
2981 Depth + 1) ||
2982 SimplifyDemandedBits(Op0, GetDemandedBitsLHSMask(LoMask, KnownOp1),
2983 DemandedElts, KnownOp0, TLO, Depth + 1) ||
2984 // See if the operation should be performed at a smaller bit width.
2986 // Disable the nsw and nuw flags. We can no longer guarantee that we
2987 // won't wrap after simplification.
2988 Op->dropFlags(SDNodeFlags::NoWrap);
2989 return true;
2990 }
2991
2992 // neg x with only low bit demanded is simply x.
2993 if (Op.getOpcode() == ISD::SUB && DemandedBits.isOne() &&
2994 isNullConstant(Op0))
2995 return TLO.CombineTo(Op, Op1);
2996
2997 // Attempt to avoid multi-use ops if we don't need anything from them.
2998 if (!LoMask.isAllOnes() || !DemandedElts.isAllOnes()) {
3000 Op0, LoMask, DemandedElts, TLO.DAG, Depth + 1);
3002 Op1, LoMask, DemandedElts, TLO.DAG, Depth + 1);
3003 if (DemandedOp0 || DemandedOp1) {
3004 Op0 = DemandedOp0 ? DemandedOp0 : Op0;
3005 Op1 = DemandedOp1 ? DemandedOp1 : Op1;
3006 SDValue NewOp = TLO.DAG.getNode(Op.getOpcode(), dl, VT, Op0, Op1,
3007 Flags & ~SDNodeFlags::NoWrap);
3008 return TLO.CombineTo(Op, NewOp);
3009 }
3010 }
3011
3012 // If we have a constant operand, we may be able to turn it into -1 if we
3013 // do not demand the high bits. This can make the constant smaller to
3014 // encode, allow more general folding, or match specialized instruction
3015 // patterns (eg, 'blsr' on x86). Don't bother changing 1 to -1 because that
3016 // is probably not useful (and could be detrimental).
3018 APInt HighMask = APInt::getHighBitsSet(BitWidth, DemandedBitsLZ);
3019 if (C && !C->isAllOnes() && !C->isOne() &&
3020 (C->getAPIntValue() | HighMask).isAllOnes()) {
3021 SDValue Neg1 = TLO.DAG.getAllOnesConstant(dl, VT);
3022 // Disable the nsw and nuw flags. We can no longer guarantee that we
3023 // won't wrap after simplification.
3024 SDValue NewOp = TLO.DAG.getNode(Op.getOpcode(), dl, VT, Op0, Neg1,
3025 Flags & ~SDNodeFlags::NoWrap);
3026 return TLO.CombineTo(Op, NewOp);
3027 }
3028
3029 // Match a multiply with a disguised negated-power-of-2 and convert to a
3030 // an equivalent shift-left amount.
3031 // Example: (X * MulC) + Op1 --> Op1 - (X << log2(-MulC))
3032 auto getShiftLeftAmt = [&HighMask](SDValue Mul) -> unsigned {
3033 if (Mul.getOpcode() != ISD::MUL || !Mul.hasOneUse())
3034 return 0;
3035
3036 // Don't touch opaque constants. Also, ignore zero and power-of-2
3037 // multiplies. Those will get folded later.
3038 ConstantSDNode *MulC = isConstOrConstSplat(Mul.getOperand(1));
3039 if (MulC && !MulC->isOpaque() && !MulC->isZero() &&
3040 !MulC->getAPIntValue().isPowerOf2()) {
3041 APInt UnmaskedC = MulC->getAPIntValue() | HighMask;
3042 if (UnmaskedC.isNegatedPowerOf2())
3043 return (-UnmaskedC).logBase2();
3044 }
3045 return 0;
3046 };
3047
3048 auto foldMul = [&](ISD::NodeType NT, SDValue X, SDValue Y,
3049 unsigned ShlAmt) {
3050 SDValue ShlAmtC = TLO.DAG.getShiftAmountConstant(ShlAmt, VT, dl);
3051 SDValue Shl = TLO.DAG.getNode(ISD::SHL, dl, VT, X, ShlAmtC);
3052 SDValue Res = TLO.DAG.getNode(NT, dl, VT, Y, Shl);
3053 return TLO.CombineTo(Op, Res);
3054 };
3055
3057 if (Op.getOpcode() == ISD::ADD) {
3058 // (X * MulC) + Op1 --> Op1 - (X << log2(-MulC))
3059 if (unsigned ShAmt = getShiftLeftAmt(Op0))
3060 return foldMul(ISD::SUB, Op0.getOperand(0), Op1, ShAmt);
3061 // Op0 + (X * MulC) --> Op0 - (X << log2(-MulC))
3062 if (unsigned ShAmt = getShiftLeftAmt(Op1))
3063 return foldMul(ISD::SUB, Op1.getOperand(0), Op0, ShAmt);
3064 }
3065 if (Op.getOpcode() == ISD::SUB) {
3066 // Op0 - (X * MulC) --> Op0 + (X << log2(-MulC))
3067 if (unsigned ShAmt = getShiftLeftAmt(Op1))
3068 return foldMul(ISD::ADD, Op1.getOperand(0), Op0, ShAmt);
3069 }
3070 }
3071
3072 if (Op.getOpcode() == ISD::MUL) {
3073 Known = KnownBits::mul(KnownOp0, KnownOp1);
3074 } else { // Op.getOpcode() is either ISD::ADD, ISD::PTRADD, or ISD::SUB.
3076 Op.getOpcode() != ISD::SUB, Flags.hasNoSignedWrap(),
3077 Flags.hasNoUnsignedWrap(), KnownOp0, KnownOp1);
3078 }
3079 break;
3080 }
3081 case ISD::FABS: {
3082 SDValue Op0 = Op.getOperand(0);
3083 APInt SignMask = APInt::getSignMask(BitWidth);
3084
3085 if (!DemandedBits.intersects(SignMask))
3086 return TLO.CombineTo(Op, Op0);
3087
3088 if (SimplifyDemandedBits(Op0, DemandedBits, DemandedElts, Known, TLO,
3089 Depth + 1))
3090 return true;
3091
3092 if (Known.isNonNegative())
3093 return TLO.CombineTo(Op, Op0);
3094 if (Known.isNegative())
3095 return TLO.CombineTo(
3096 Op, TLO.DAG.getNode(ISD::FNEG, dl, VT, Op0, Op->getFlags()));
3097
3098 Known.Zero |= SignMask;
3099 Known.One &= ~SignMask;
3100
3101 break;
3102 }
3103 case ISD::FCOPYSIGN: {
3104 SDValue Op0 = Op.getOperand(0);
3105 SDValue Op1 = Op.getOperand(1);
3106
3107 unsigned BitWidth0 = Op0.getScalarValueSizeInBits();
3108 unsigned BitWidth1 = Op1.getScalarValueSizeInBits();
3109 APInt SignMask0 = APInt::getSignMask(BitWidth0);
3110 APInt SignMask1 = APInt::getSignMask(BitWidth1);
3111
3112 if (!DemandedBits.intersects(SignMask0))
3113 return TLO.CombineTo(Op, Op0);
3114
3115 if (SimplifyDemandedBits(Op0, ~SignMask0 & DemandedBits, DemandedElts,
3116 Known, TLO, Depth + 1) ||
3117 SimplifyDemandedBits(Op1, SignMask1, DemandedElts, Known2, TLO,
3118 Depth + 1))
3119 return true;
3120
3121 if (Known2.isNonNegative())
3122 return TLO.CombineTo(
3123 Op, TLO.DAG.getNode(ISD::FABS, dl, VT, Op0, Op->getFlags()));
3124
3125 if (Known2.isNegative())
3126 return TLO.CombineTo(
3127 Op, TLO.DAG.getNode(ISD::FNEG, dl, VT,
3128 TLO.DAG.getNode(ISD::FABS, SDLoc(Op0), VT, Op0)));
3129
3130 Known.Zero &= ~SignMask0;
3131 Known.One &= ~SignMask0;
3132 break;
3133 }
3134 case ISD::FNEG: {
3135 SDValue Op0 = Op.getOperand(0);
3136 APInt SignMask = APInt::getSignMask(BitWidth);
3137
3138 if (!DemandedBits.intersects(SignMask))
3139 return TLO.CombineTo(Op, Op0);
3140
3141 if (SimplifyDemandedBits(Op0, DemandedBits, DemandedElts, Known, TLO,
3142 Depth + 1))
3143 return true;
3144
3145 if (!Known.isSignUnknown()) {
3146 Known.Zero ^= SignMask;
3147 Known.One ^= SignMask;
3148 }
3149
3150 break;
3151 }
3152 default:
3153 // We also ask the target about intrinsics (which could be specific to it).
3154 if (Op.getOpcode() >= ISD::BUILTIN_OP_END ||
3155 Op.getOpcode() == ISD::INTRINSIC_WO_CHAIN) {
3156 // TODO: Probably okay to remove after audit; here to reduce change size
3157 // in initial enablement patch for scalable vectors
3158 if (Op.getValueType().isScalableVector())
3159 break;
3161 Known, TLO, Depth))
3162 return true;
3163 break;
3164 }
3165
3166 // Just use computeKnownBits to compute output bits.
3167 Known = TLO.DAG.computeKnownBits(Op, DemandedElts, Depth);
3168 break;
3169 }
3170
3171 // If we know the value of all of the demanded bits, return this as a
3172 // constant.
3174 DemandedBits.isSubsetOf(Known.Zero | Known.One)) {
3175 // Avoid folding to a constant if any OpaqueConstant is involved.
3176 if (llvm::any_of(Op->ops(), [](SDValue V) {
3177 auto *C = dyn_cast<ConstantSDNode>(V);
3178 return C && C->isOpaque();
3179 }))
3180 return false;
3181 if (VT.isInteger())
3182 return TLO.CombineTo(Op, TLO.DAG.getConstant(Known.One, dl, VT));
3183 if (VT.isFloatingPoint())
3184 return TLO.CombineTo(
3186 dl, VT));
3187 }
3188
3189 // A multi use 'all demanded elts' simplify failed to find any knownbits.
3190 // Try again just for the original demanded elts.
3191 // Ensure we do this AFTER constant folding above.
3192 if (HasMultiUse && Known.isUnknown() && !OriginalDemandedElts.isAllOnes())
3193 Known = TLO.DAG.computeKnownBits(Op, OriginalDemandedElts, Depth);
3194
3195 return false;
3196}
3197
3199 const APInt &DemandedElts,
3200 DAGCombinerInfo &DCI) const {
3201 SelectionDAG &DAG = DCI.DAG;
3202 TargetLoweringOpt TLO(DAG, !DCI.isBeforeLegalize(),
3203 !DCI.isBeforeLegalizeOps());
3204
3205 APInt KnownUndef, KnownZero;
3206 bool Simplified =
3207 SimplifyDemandedVectorElts(Op, DemandedElts, KnownUndef, KnownZero, TLO);
3208 if (Simplified) {
3209 DCI.AddToWorklist(Op.getNode());
3210 DCI.CommitTargetLoweringOpt(TLO);
3211 }
3212
3213 return Simplified;
3214}
3215
3216/// Given a vector binary operation and known undefined elements for each input
3217/// operand, compute whether each element of the output is undefined.
3219 const APInt &UndefOp0,
3220 const APInt &UndefOp1) {
3221 EVT VT = BO.getValueType();
3223 "Vector binop only");
3224
3225 EVT EltVT = VT.getVectorElementType();
3226 unsigned NumElts = VT.isFixedLengthVector() ? VT.getVectorNumElements() : 1;
3227 assert(UndefOp0.getBitWidth() == NumElts &&
3228 UndefOp1.getBitWidth() == NumElts && "Bad type for undef analysis");
3229
3230 auto getUndefOrConstantElt = [&](SDValue V, unsigned Index,
3231 const APInt &UndefVals) {
3232 if (UndefVals[Index])
3233 return DAG.getUNDEF(EltVT);
3234
3235 if (auto *BV = dyn_cast<BuildVectorSDNode>(V)) {
3236 // Try hard to make sure that the getNode() call is not creating temporary
3237 // nodes. Ignore opaque integers because they do not constant fold.
3238 SDValue Elt = BV->getOperand(Index);
3239 auto *C = dyn_cast<ConstantSDNode>(Elt);
3240 if (isa<ConstantFPSDNode>(Elt) || Elt.isUndef() || (C && !C->isOpaque()))
3241 return Elt;
3242 }
3243
3244 return SDValue();
3245 };
3246
3247 APInt KnownUndef = APInt::getZero(NumElts);
3248 for (unsigned i = 0; i != NumElts; ++i) {
3249 // If both inputs for this element are either constant or undef and match
3250 // the element type, compute the constant/undef result for this element of
3251 // the vector.
3252 // TODO: Ideally we would use FoldConstantArithmetic() here, but that does
3253 // not handle FP constants. The code within getNode() should be refactored
3254 // to avoid the danger of creating a bogus temporary node here.
3255 SDValue C0 = getUndefOrConstantElt(BO.getOperand(0), i, UndefOp0);
3256 SDValue C1 = getUndefOrConstantElt(BO.getOperand(1), i, UndefOp1);
3257 if (C0 && C1 && C0.getValueType() == EltVT && C1.getValueType() == EltVT)
3258 if (DAG.getNode(BO.getOpcode(), SDLoc(BO), EltVT, C0, C1).isUndef())
3259 KnownUndef.setBit(i);
3260 }
3261 return KnownUndef;
3262}
3263
3265 SDValue Op, const APInt &OriginalDemandedElts, APInt &KnownUndef,
3266 APInt &KnownZero, TargetLoweringOpt &TLO, unsigned Depth,
3267 bool AssumeSingleUse) const {
3268 EVT VT = Op.getValueType();
3269 unsigned Opcode = Op.getOpcode();
3270 APInt DemandedElts = OriginalDemandedElts;
3271 unsigned NumElts = DemandedElts.getBitWidth();
3272 assert(VT.isVector() && "Expected vector op");
3273
3274 KnownUndef = KnownZero = APInt::getZero(NumElts);
3275
3277 return false;
3278
3279 // TODO: For now we assume we know nothing about scalable vectors.
3280 if (VT.isScalableVector())
3281 return false;
3282
3283 assert(VT.getVectorNumElements() == NumElts &&
3284 "Mask size mismatches value type element count!");
3285
3286 // Undef operand.
3287 if (Op.isUndef()) {
3288 KnownUndef.setAllBits();
3289 return false;
3290 }
3291
3292 // If Op has other users, assume that all elements are needed.
3293 if (!AssumeSingleUse && !Op.getNode()->hasOneUse())
3294 DemandedElts.setAllBits();
3295
3296 // Not demanding any elements from Op.
3297 if (DemandedElts == 0) {
3298 KnownUndef.setAllBits();
3299 return TLO.CombineTo(Op, TLO.DAG.getUNDEF(VT));
3300 }
3301
3302 // Limit search depth.
3304 return false;
3305
3306 SDLoc DL(Op);
3307 unsigned EltSizeInBits = VT.getScalarSizeInBits();
3308 bool IsLE = TLO.DAG.getDataLayout().isLittleEndian();
3309
3310 auto TryShrinkBinOp = [&](SDValue Op0, SDValue Op1) {
3311 unsigned ShrunkSize = getPreferredShrunkVectorSizeInBits(Op, DemandedElts);
3312 if (!ShrunkSize)
3313 return false;
3314
3315 assert(ShrunkSize % EltSizeInBits == 0 &&
3316 "Shrunk size not a multiple of element size");
3317 assert(ShrunkSize < VT.getSizeInBits() &&
3318 "Shrunk size must be < original vector size");
3319 assert(ShrunkSize >= EltSizeInBits * DemandedElts.getActiveBits() &&
3320 "Shrunk size must be >= demanded size");
3321
3322 EVT ShrunkVT = VT.changeVectorElementCount(
3323 *TLO.DAG.getContext(),
3324 ElementCount::getFixed(ShrunkSize / EltSizeInBits));
3325 Op0 = TLO.DAG.getExtractSubvector(DL, ShrunkVT, Op0, 0);
3326 Op1 = TLO.DAG.getExtractSubvector(DL, ShrunkVT, Op1, 0);
3327 SDValue NewOp =
3328 TLO.DAG.getNode(Opcode, DL, ShrunkVT, Op0, Op1, Op->getFlags());
3329 return TLO.CombineTo(
3330 Op, TLO.DAG.getInsertSubvector(DL, TLO.DAG.getUNDEF(VT), NewOp, 0));
3331 };
3332
3333 // Helper for demanding the specified elements and all the bits of both binary
3334 // operands.
3335 auto SimplifyDemandedVectorEltsBinOp = [&](SDValue Op0, SDValue Op1) {
3336 SDValue NewOp0 = SimplifyMultipleUseDemandedVectorElts(Op0, DemandedElts,
3337 TLO.DAG, Depth + 1);
3338 SDValue NewOp1 = SimplifyMultipleUseDemandedVectorElts(Op1, DemandedElts,
3339 TLO.DAG, Depth + 1);
3340 if (NewOp0 || NewOp1) {
3341 SDValue NewOp =
3342 TLO.DAG.getNode(Opcode, SDLoc(Op), VT, NewOp0 ? NewOp0 : Op0,
3343 NewOp1 ? NewOp1 : Op1, Op->getFlags());
3344 return TLO.CombineTo(Op, NewOp);
3345 }
3346
3347 if (TryShrinkBinOp(Op0, Op1))
3348 return true;
3349
3350 return false;
3351 };
3352
3353 switch (Opcode) {
3354 case ISD::SCALAR_TO_VECTOR: {
3355 if (!DemandedElts[0]) {
3356 KnownUndef.setAllBits();
3357 return TLO.CombineTo(Op, TLO.DAG.getUNDEF(VT));
3358 }
3359 KnownUndef.setHighBits(NumElts - 1);
3360 break;
3361 }
3362 case ISD::BITCAST: {
3363 SDValue Src = Op.getOperand(0);
3364 EVT SrcVT = Src.getValueType();
3365
3366 if (!SrcVT.isVector()) {
3367 // TODO - bigendian once we have test coverage.
3368 if (IsLE) {
3369 APInt DemandedSrcBits = APInt::getZero(SrcVT.getSizeInBits());
3370 unsigned EltSize = VT.getScalarSizeInBits();
3371 for (unsigned I = 0; I != NumElts; ++I) {
3372 if (DemandedElts[I]) {
3373 unsigned Offset = I * EltSize;
3374 DemandedSrcBits.setBits(Offset, Offset + EltSize);
3375 }
3376 }
3378 if (SimplifyDemandedBits(Src, DemandedSrcBits, Known, TLO, Depth + 1))
3379 return true;
3380 }
3381 break;
3382 }
3383
3384 // Fast handling of 'identity' bitcasts.
3385 unsigned NumSrcElts = SrcVT.getVectorNumElements();
3386 if (NumSrcElts == NumElts)
3387 return SimplifyDemandedVectorElts(Src, DemandedElts, KnownUndef,
3388 KnownZero, TLO, Depth + 1);
3389
3390 APInt SrcDemandedElts, SrcZero, SrcUndef;
3391
3392 // Bitcast from 'large element' src vector to 'small element' vector, we
3393 // must demand a source element if any DemandedElt maps to it.
3394 if ((NumElts % NumSrcElts) == 0) {
3395 unsigned Scale = NumElts / NumSrcElts;
3396 SrcDemandedElts = APIntOps::ScaleBitMask(DemandedElts, NumSrcElts);
3397 if (SimplifyDemandedVectorElts(Src, SrcDemandedElts, SrcUndef, SrcZero,
3398 TLO, Depth + 1))
3399 return true;
3400
3401 // Try calling SimplifyDemandedBits, converting demanded elts to the bits
3402 // of the large element.
3403 // TODO - bigendian once we have test coverage.
3404 if (IsLE) {
3405 unsigned SrcEltSizeInBits = SrcVT.getScalarSizeInBits();
3406 APInt SrcDemandedBits = APInt::getZero(SrcEltSizeInBits);
3407 for (unsigned i = 0; i != NumElts; ++i)
3408 if (DemandedElts[i]) {
3409 unsigned Ofs = (i % Scale) * EltSizeInBits;
3410 SrcDemandedBits.setBits(Ofs, Ofs + EltSizeInBits);
3411 }
3412
3414 if (SimplifyDemandedBits(Src, SrcDemandedBits, SrcDemandedElts, Known,
3415 TLO, Depth + 1))
3416 return true;
3417
3418 // The bitcast has split each wide element into a number of
3419 // narrow subelements. We have just computed the Known bits
3420 // for wide elements. See if element splitting results in
3421 // some subelements being zero. Only for demanded elements!
3422 for (unsigned SubElt = 0; SubElt != Scale; ++SubElt) {
3423 if (!Known.Zero.extractBits(EltSizeInBits, SubElt * EltSizeInBits)
3424 .isAllOnes())
3425 continue;
3426 for (unsigned SrcElt = 0; SrcElt != NumSrcElts; ++SrcElt) {
3427 unsigned Elt = Scale * SrcElt + SubElt;
3428 // A wholly-undef source lane is reported as undef below; don't also
3429 // flag it as zero, keeping the undef and zero sets disjoint.
3430 if (DemandedElts[Elt] && !SrcUndef[SrcElt])
3431 KnownZero.setBit(Elt);
3432 }
3433 }
3434 }
3435
3436 // If the src element is zero/undef then all the output elements will be -
3437 // only demanded elements are guaranteed to be correct.
3438 for (unsigned i = 0; i != NumSrcElts; ++i) {
3439 if (SrcDemandedElts[i]) {
3440 if (SrcZero[i])
3441 KnownZero.setBits(i * Scale, (i + 1) * Scale);
3442 if (SrcUndef[i])
3443 KnownUndef.setBits(i * Scale, (i + 1) * Scale);
3444 }
3445 }
3446 }
3447
3448 // Bitcast from 'small element' src vector to 'large element' vector, we
3449 // demand all smaller source elements covered by the larger demanded element
3450 // of this vector.
3451 if ((NumSrcElts % NumElts) == 0) {
3452 unsigned Scale = NumSrcElts / NumElts;
3453 SrcDemandedElts = APIntOps::ScaleBitMask(DemandedElts, NumSrcElts);
3454 if (SimplifyDemandedVectorElts(Src, SrcDemandedElts, SrcUndef, SrcZero,
3455 TLO, Depth + 1))
3456 return true;
3457
3458 // If all the src elements covering an output element are zero/undef, then
3459 // the output element will be as well, assuming it was demanded.
3460 for (unsigned i = 0; i != NumElts; ++i) {
3461 if (DemandedElts[i]) {
3462 if (SrcZero.extractBits(Scale, i * Scale).isAllOnes())
3463 KnownZero.setBit(i);
3464 if (SrcUndef.extractBits(Scale, i * Scale).isAllOnes())
3465 KnownUndef.setBit(i);
3466 }
3467 }
3468 }
3469 break;
3470 }
3471 case ISD::FREEZE: {
3472 SDValue N0 = Op.getOperand(0);
3474 N0, DemandedElts, UndefPoisonKind::UndefOrPoison, Depth + 1))
3475 return TLO.CombineTo(Op, N0);
3476
3477 // TODO: Replace this with the general fold from DAGCombiner::visitFREEZE
3478 // freeze(op(x, ...)) -> op(freeze(x), ...).
3479 if (N0.getOpcode() == ISD::SCALAR_TO_VECTOR && DemandedElts == 1)
3480 return TLO.CombineTo(
3482 TLO.DAG.getFreeze(N0.getOperand(0))));
3483 break;
3484 }
3485 case ISD::BUILD_VECTOR: {
3486 // Check all elements and simplify any unused elements with UNDEF.
3487 if (!DemandedElts.isAllOnes()) {
3488 // Don't simplify BROADCASTS.
3489 if (llvm::any_of(Op->op_values(),
3490 [&](SDValue Elt) { return Op.getOperand(0) != Elt; })) {
3492 bool Updated = false;
3493 for (unsigned i = 0; i != NumElts; ++i) {
3494 if (!DemandedElts[i] && !Ops[i].isUndef()) {
3495 Ops[i] = TLO.DAG.getUNDEF(Ops[0].getValueType());
3496 KnownUndef.setBit(i);
3497 Updated = true;
3498 }
3499 }
3500 if (Updated)
3501 return TLO.CombineTo(Op, TLO.DAG.getBuildVector(VT, DL, Ops));
3502 }
3503 }
3504 for (unsigned i = 0; i != NumElts; ++i) {
3505 SDValue SrcOp = Op.getOperand(i);
3506 if (SrcOp.isUndef()) {
3507 KnownUndef.setBit(i);
3508 } else if (EltSizeInBits == SrcOp.getScalarValueSizeInBits() &&
3510 KnownZero.setBit(i);
3511 }
3512 }
3513 break;
3514 }
3515 case ISD::CONCAT_VECTORS: {
3516 EVT SubVT = Op.getOperand(0).getValueType();
3517 unsigned NumSubVecs = Op.getNumOperands();
3518 unsigned NumSubElts = SubVT.getVectorNumElements();
3519 for (unsigned i = 0; i != NumSubVecs; ++i) {
3520 SDValue SubOp = Op.getOperand(i);
3521 APInt SubElts = DemandedElts.extractBits(NumSubElts, i * NumSubElts);
3522 APInt SubUndef, SubZero;
3523 if (SimplifyDemandedVectorElts(SubOp, SubElts, SubUndef, SubZero, TLO,
3524 Depth + 1))
3525 return true;
3526 KnownUndef.insertBits(SubUndef, i * NumSubElts);
3527 KnownZero.insertBits(SubZero, i * NumSubElts);
3528 }
3529
3530 // Attempt to avoid multi-use ops if we don't need anything from them.
3531 if (!DemandedElts.isAllOnes()) {
3532 bool FoundNewSub = false;
3533 SmallVector<SDValue, 2> DemandedSubOps;
3534 for (unsigned i = 0; i != NumSubVecs; ++i) {
3535 SDValue SubOp = Op.getOperand(i);
3536 APInt SubElts = DemandedElts.extractBits(NumSubElts, i * NumSubElts);
3538 SubOp, SubElts, TLO.DAG, Depth + 1);
3539 DemandedSubOps.push_back(NewSubOp ? NewSubOp : SubOp);
3540 FoundNewSub = NewSubOp ? true : FoundNewSub;
3541 }
3542 if (FoundNewSub) {
3543 SDValue NewOp =
3544 TLO.DAG.getNode(Op.getOpcode(), SDLoc(Op), VT, DemandedSubOps);
3545 return TLO.CombineTo(Op, NewOp);
3546 }
3547 }
3548 break;
3549 }
3550 case ISD::INSERT_SUBVECTOR: {
3551 // Demand any elements from the subvector and the remainder from the src it
3552 // is inserted into.
3553 SDValue Src = Op.getOperand(0);
3554 SDValue Sub = Op.getOperand(1);
3555 uint64_t Idx = Op.getConstantOperandVal(2);
3556 unsigned NumSubElts = Sub.getValueType().getVectorNumElements();
3557 APInt DemandedSubElts = DemandedElts.extractBits(NumSubElts, Idx);
3558 APInt DemandedSrcElts = DemandedElts;
3559 DemandedSrcElts.clearBits(Idx, Idx + NumSubElts);
3560
3561 // If none of the sub operand elements are demanded, bypass the insert.
3562 if (!DemandedSubElts)
3563 return TLO.CombineTo(Op, Src);
3564
3565 APInt SubUndef, SubZero;
3566 if (SimplifyDemandedVectorElts(Sub, DemandedSubElts, SubUndef, SubZero, TLO,
3567 Depth + 1))
3568 return true;
3569
3570 // If none of the src operand elements are demanded, replace it with undef.
3571 if (!DemandedSrcElts && !Src.isUndef())
3572 return TLO.CombineTo(Op, TLO.DAG.getNode(ISD::INSERT_SUBVECTOR, DL, VT,
3573 TLO.DAG.getUNDEF(VT), Sub,
3574 Op.getOperand(2)));
3575
3576 if (SimplifyDemandedVectorElts(Src, DemandedSrcElts, KnownUndef, KnownZero,
3577 TLO, Depth + 1))
3578 return true;
3579 KnownUndef.insertBits(SubUndef, Idx);
3580 KnownZero.insertBits(SubZero, Idx);
3581
3582 // Attempt to avoid multi-use ops if we don't need anything from them.
3583 if (!DemandedSrcElts.isAllOnes() || !DemandedSubElts.isAllOnes()) {
3585 Src, DemandedSrcElts, TLO.DAG, Depth + 1);
3587 Sub, DemandedSubElts, TLO.DAG, Depth + 1);
3588 if (NewSrc || NewSub) {
3589 NewSrc = NewSrc ? NewSrc : Src;
3590 NewSub = NewSub ? NewSub : Sub;
3591 SDValue NewOp = TLO.DAG.getNode(Op.getOpcode(), SDLoc(Op), VT, NewSrc,
3592 NewSub, Op.getOperand(2));
3593 return TLO.CombineTo(Op, NewOp);
3594 }
3595 }
3596 break;
3597 }
3599 // Offset the demanded elts by the subvector index.
3600 SDValue Src = Op.getOperand(0);
3601 if (Src.getValueType().isScalableVector())
3602 break;
3603 uint64_t Idx = Op.getConstantOperandVal(1);
3604 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
3605 APInt DemandedSrcElts = DemandedElts.zext(NumSrcElts).shl(Idx);
3606
3607 APInt SrcUndef, SrcZero;
3608 if (SimplifyDemandedVectorElts(Src, DemandedSrcElts, SrcUndef, SrcZero, TLO,
3609 Depth + 1))
3610 return true;
3611 KnownUndef = SrcUndef.extractBits(NumElts, Idx);
3612 KnownZero = SrcZero.extractBits(NumElts, Idx);
3613
3614 // Attempt to avoid multi-use ops if we don't need anything from them.
3615 SDValue NewSrc = SimplifyMultipleUseDemandedVectorElts(Src, DemandedSrcElts,
3616 TLO.DAG, Depth + 1);
3617 if (NewSrc) {
3618 SDValue NewOp = TLO.DAG.getNode(Op.getOpcode(), SDLoc(Op), VT, NewSrc,
3619 Op.getOperand(1));
3620 return TLO.CombineTo(Op, NewOp);
3621 }
3622 break;
3623 }
3625 SDValue Vec = Op.getOperand(0);
3626 SDValue Scl = Op.getOperand(1);
3627 auto *CIdx = dyn_cast<ConstantSDNode>(Op.getOperand(2));
3628
3629 // For a legal, constant insertion index, if we don't need this insertion
3630 // then strip it, else remove it from the demanded elts.
3631 if (CIdx && CIdx->getAPIntValue().ult(NumElts)) {
3632 unsigned Idx = CIdx->getZExtValue();
3633 if (!DemandedElts[Idx])
3634 return TLO.CombineTo(Op, Vec);
3635
3636 APInt DemandedVecElts(DemandedElts);
3637 DemandedVecElts.clearBit(Idx);
3638 if (SimplifyDemandedVectorElts(Vec, DemandedVecElts, KnownUndef,
3639 KnownZero, TLO, Depth + 1))
3640 return true;
3641
3642 KnownUndef.setBitVal(Idx, Scl.isUndef());
3643
3644 KnownZero.setBitVal(Idx, isNullConstant(Scl) || isNullFPConstant(Scl));
3645 break;
3646 }
3647
3648 APInt VecUndef, VecZero;
3649 if (SimplifyDemandedVectorElts(Vec, DemandedElts, VecUndef, VecZero, TLO,
3650 Depth + 1))
3651 return true;
3652 // Without knowing the insertion index we can't set KnownUndef/KnownZero.
3653 break;
3654 }
3655 case ISD::VSELECT: {
3656 SDValue Sel = Op.getOperand(0);
3657 SDValue LHS = Op.getOperand(1);
3658 SDValue RHS = Op.getOperand(2);
3659
3660 // Try to transform the select condition based on the current demanded
3661 // elements.
3662 APInt UndefSel, ZeroSel;
3663 if (SimplifyDemandedVectorElts(Sel, DemandedElts, UndefSel, ZeroSel, TLO,
3664 Depth + 1))
3665 return true;
3666
3667 // See if we can simplify either vselect operand.
3668 APInt DemandedLHS(DemandedElts);
3669 APInt DemandedRHS(DemandedElts);
3670 APInt UndefLHS, ZeroLHS;
3671 APInt UndefRHS, ZeroRHS;
3672 if (SimplifyDemandedVectorElts(LHS, DemandedLHS, UndefLHS, ZeroLHS, TLO,
3673 Depth + 1))
3674 return true;
3675 if (SimplifyDemandedVectorElts(RHS, DemandedRHS, UndefRHS, ZeroRHS, TLO,
3676 Depth + 1))
3677 return true;
3678
3679 KnownUndef = UndefLHS & UndefRHS;
3680 KnownZero = ZeroLHS & ZeroRHS;
3681
3682 // If we know that the selected element is always zero, we don't need the
3683 // select value element.
3684 APInt DemandedSel = DemandedElts & ~KnownZero;
3685 if (DemandedSel != DemandedElts)
3686 if (SimplifyDemandedVectorElts(Sel, DemandedSel, UndefSel, ZeroSel, TLO,
3687 Depth + 1))
3688 return true;
3689
3690 break;
3691 }
3692 case ISD::VECTOR_SHUFFLE: {
3693 SDValue LHS = Op.getOperand(0);
3694 SDValue RHS = Op.getOperand(1);
3695 ArrayRef<int> ShuffleMask = cast<ShuffleVectorSDNode>(Op)->getMask();
3696
3697 // Collect demanded elements from shuffle operands..
3698 APInt DemandedLHS(NumElts, 0);
3699 APInt DemandedRHS(NumElts, 0);
3700 for (unsigned i = 0; i != NumElts; ++i) {
3701 int M = ShuffleMask[i];
3702 if (M < 0 || !DemandedElts[i])
3703 continue;
3704 assert(0 <= M && M < (int)(2 * NumElts) && "Shuffle index out of range");
3705 if (M < (int)NumElts)
3706 DemandedLHS.setBit(M);
3707 else
3708 DemandedRHS.setBit(M - NumElts);
3709 }
3710
3711 // If either side isn't demanded, replace it by UNDEF. We handle this
3712 // explicitly here to also simplify in case of multiple uses (on the
3713 // contrary to the SimplifyDemandedVectorElts calls below).
3714 bool FoldLHS = !DemandedLHS && !LHS.isUndef();
3715 bool FoldRHS = !DemandedRHS && !RHS.isUndef();
3716 if (FoldLHS || FoldRHS) {
3717 LHS = FoldLHS ? TLO.DAG.getUNDEF(LHS.getValueType()) : LHS;
3718 RHS = FoldRHS ? TLO.DAG.getUNDEF(RHS.getValueType()) : RHS;
3719 SDValue NewOp =
3720 TLO.DAG.getVectorShuffle(VT, SDLoc(Op), LHS, RHS, ShuffleMask);
3721 return TLO.CombineTo(Op, NewOp);
3722 }
3723
3724 // See if we can simplify either shuffle operand.
3725 APInt UndefLHS, ZeroLHS;
3726 APInt UndefRHS, ZeroRHS;
3727 if (SimplifyDemandedVectorElts(LHS, DemandedLHS, UndefLHS, ZeroLHS, TLO,
3728 Depth + 1))
3729 return true;
3730 if (SimplifyDemandedVectorElts(RHS, DemandedRHS, UndefRHS, ZeroRHS, TLO,
3731 Depth + 1))
3732 return true;
3733
3734 // Simplify mask using undef elements from LHS/RHS.
3735 bool Updated = false;
3736 bool IdentityLHS = true, IdentityRHS = true;
3737 SmallVector<int, 32> NewMask(ShuffleMask);
3738 for (unsigned i = 0; i != NumElts; ++i) {
3739 int &M = NewMask[i];
3740 if (M < 0)
3741 continue;
3742 if (!DemandedElts[i] || (M < (int)NumElts && UndefLHS[M]) ||
3743 (M >= (int)NumElts && UndefRHS[M - NumElts])) {
3744 Updated = true;
3745 M = -1;
3746 }
3747 IdentityLHS &= (M < 0) || (M == (int)i);
3748 IdentityRHS &= (M < 0) || ((M - NumElts) == i);
3749 }
3750
3751 // Update legal shuffle masks based on demanded elements if it won't reduce
3752 // to Identity which can cause premature removal of the shuffle mask.
3753 if (Updated && !IdentityLHS && !IdentityRHS && !TLO.LegalOps) {
3754 SDValue LegalShuffle =
3755 buildLegalVectorShuffle(VT, DL, LHS, RHS, NewMask, TLO.DAG);
3756 if (LegalShuffle)
3757 return TLO.CombineTo(Op, LegalShuffle);
3758 }
3759
3760 // Propagate undef/zero elements from LHS/RHS.
3761 for (unsigned i = 0; i != NumElts; ++i) {
3762 int M = ShuffleMask[i];
3763 if (M < 0) {
3764 KnownUndef.setBit(i);
3765 } else if (M < (int)NumElts) {
3766 if (UndefLHS[M])
3767 KnownUndef.setBit(i);
3768 if (ZeroLHS[M])
3769 KnownZero.setBit(i);
3770 } else {
3771 if (UndefRHS[M - NumElts])
3772 KnownUndef.setBit(i);
3773 if (ZeroRHS[M - NumElts])
3774 KnownZero.setBit(i);
3775 }
3776 }
3777 break;
3778 }
3782 APInt SrcUndef, SrcZero;
3783 SDValue Src = Op.getOperand(0);
3784 unsigned NumSrcElts = Src.getValueType().getVectorNumElements();
3785 APInt DemandedSrcElts = DemandedElts.zext(NumSrcElts);
3786 if (SimplifyDemandedVectorElts(Src, DemandedSrcElts, SrcUndef, SrcZero, TLO,
3787 Depth + 1))
3788 return true;
3789 KnownZero = SrcZero.zextOrTrunc(NumElts);
3790 KnownUndef = SrcUndef.zextOrTrunc(NumElts);
3791
3792 if (IsLE && Op.getOpcode() == ISD::ANY_EXTEND_VECTOR_INREG &&
3793 Op.getValueSizeInBits() == Src.getValueSizeInBits() &&
3794 DemandedSrcElts == 1) {
3795 // aext - if we just need the bottom element then we can bitcast.
3796 return TLO.CombineTo(Op, TLO.DAG.getBitcast(VT, Src));
3797 }
3798
3799 if (Op.getOpcode() == ISD::ZERO_EXTEND_VECTOR_INREG) {
3800 // zext(undef) upper bits are guaranteed to be zero.
3801 if (DemandedElts.isSubsetOf(KnownUndef))
3802 return TLO.CombineTo(Op, TLO.DAG.getConstant(0, SDLoc(Op), VT));
3803 KnownUndef.clearAllBits();
3804
3805 // zext - if we just need the bottom element then we can mask:
3806 // zext(and(x,c)) -> and(x,c') iff the zext is the only user of the and.
3807 if (IsLE && DemandedSrcElts == 1 && Src.getOpcode() == ISD::AND &&
3808 Op->isOnlyUserOf(Src.getNode()) &&
3809 Op.getValueSizeInBits() == Src.getValueSizeInBits()) {
3810 SDLoc DL(Op);
3811 EVT SrcVT = Src.getValueType();
3812 EVT SrcSVT = SrcVT.getScalarType();
3813
3814 // If we're after type legalization and SrcSVT is not legal, use the
3815 // promoted type for creating constants to avoid creating nodes with
3816 // illegal types.
3817 if (TLO.LegalTypes())
3818 SrcSVT = getLegalTypeToTransformTo(*TLO.DAG.getContext(), SrcSVT);
3819
3820 SmallVector<SDValue> MaskElts;
3821 MaskElts.push_back(TLO.DAG.getAllOnesConstant(DL, SrcSVT));
3822 MaskElts.append(NumSrcElts - 1, TLO.DAG.getConstant(0, DL, SrcSVT));
3823 SDValue Mask = TLO.DAG.getBuildVector(SrcVT, DL, MaskElts);
3824 if (SDValue Fold = TLO.DAG.FoldConstantArithmetic(
3825 ISD::AND, DL, SrcVT, {Src.getOperand(1), Mask})) {
3826 Fold = TLO.DAG.getNode(ISD::AND, DL, SrcVT, Src.getOperand(0), Fold);
3827 return TLO.CombineTo(Op, TLO.DAG.getBitcast(VT, Fold));
3828 }
3829 }
3830 }
3831 break;
3832 }
3833
3834 // TODO: There are more binop opcodes that could be handled here - MIN,
3835 // MAX, saturated math, etc.
3836 case ISD::ADD: {
3837 SDValue Op0 = Op.getOperand(0);
3838 SDValue Op1 = Op.getOperand(1);
3839 if (Op0 == Op1 && Op->isOnlyUserOf(Op0.getNode())) {
3840 APInt UndefLHS, ZeroLHS;
3841 if (SimplifyDemandedVectorElts(Op0, DemandedElts, UndefLHS, ZeroLHS, TLO,
3842 Depth + 1, /*AssumeSingleUse*/ true))
3843 return true;
3844 }
3845 [[fallthrough]];
3846 }
3847 case ISD::AVGCEILS:
3848 case ISD::AVGCEILU:
3849 case ISD::AVGFLOORS:
3850 case ISD::AVGFLOORU:
3851 case ISD::OR:
3852 case ISD::XOR:
3853 case ISD::SUB:
3854 case ISD::FADD:
3855 case ISD::FSUB:
3856 case ISD::FMUL:
3857 case ISD::FDIV:
3858 case ISD::FREM:
3859 case ISD::PSEUDO_FMIN:
3860 case ISD::PSEUDO_FMAX: {
3861 SDValue Op0 = Op.getOperand(0);
3862 SDValue Op1 = Op.getOperand(1);
3863
3864 APInt UndefRHS, ZeroRHS;
3865 if (SimplifyDemandedVectorElts(Op1, DemandedElts, UndefRHS, ZeroRHS, TLO,
3866 Depth + 1))
3867 return true;
3868 APInt UndefLHS, ZeroLHS;
3869 if (SimplifyDemandedVectorElts(Op0, DemandedElts, UndefLHS, ZeroLHS, TLO,
3870 Depth + 1))
3871 return true;
3872
3873 KnownZero = ZeroLHS & ZeroRHS;
3874 KnownUndef = getKnownUndefForVectorBinop(Op, TLO.DAG, UndefLHS, UndefRHS);
3875
3876 // Attempt to avoid multi-use ops if we don't need anything from them.
3877 // TODO - use KnownUndef to relax the demandedelts?
3878 if (!DemandedElts.isAllOnes())
3879 if (SimplifyDemandedVectorEltsBinOp(Op0, Op1))
3880 return true;
3881 break;
3882 }
3883 case ISD::SHL:
3884 case ISD::SRL:
3885 case ISD::SRA:
3886 case ISD::ROTL:
3887 case ISD::ROTR: {
3888 SDValue Op0 = Op.getOperand(0);
3889 SDValue Op1 = Op.getOperand(1);
3890
3891 APInt UndefRHS, ZeroRHS;
3892 if (SimplifyDemandedVectorElts(Op1, DemandedElts, UndefRHS, ZeroRHS, TLO,
3893 Depth + 1))
3894 return true;
3895 APInt UndefLHS, ZeroLHS;
3896 if (SimplifyDemandedVectorElts(Op0, DemandedElts, UndefLHS, ZeroLHS, TLO,
3897 Depth + 1))
3898 return true;
3899
3900 KnownZero = ZeroLHS;
3901 KnownUndef = UndefLHS & UndefRHS; // TODO: use getKnownUndefForVectorBinop?
3902
3903 // Attempt to avoid multi-use ops if we don't need anything from them.
3904 // TODO - use KnownUndef to relax the demandedelts?
3905 if (!DemandedElts.isAllOnes())
3906 if (SimplifyDemandedVectorEltsBinOp(Op0, Op1))
3907 return true;
3908 break;
3909 }
3910 case ISD::MUL:
3911 case ISD::MULHU:
3912 case ISD::MULHS:
3913 case ISD::AND: {
3914 SDValue Op0 = Op.getOperand(0);
3915 SDValue Op1 = Op.getOperand(1);
3916
3917 APInt SrcUndef, SrcZero;
3918 if (SimplifyDemandedVectorElts(Op1, DemandedElts, SrcUndef, SrcZero, TLO,
3919 Depth + 1))
3920 return true;
3921 // FIXME: If we know that a demanded element was zero in Op1 we don't need
3922 // to demand it in Op0 - its guaranteed to be zero. There is however a
3923 // restriction, as we must not make any of the originally demanded elements
3924 // more poisonous. We could reduce amount of elements demanded, but then we
3925 // also need a to inform SimplifyDemandedVectorElts that some elements must
3926 // not be made more poisonous.
3927 if (SimplifyDemandedVectorElts(Op0, DemandedElts, KnownUndef, KnownZero,
3928 TLO, Depth + 1))
3929 return true;
3930
3931 KnownUndef &= DemandedElts;
3932 KnownZero &= DemandedElts;
3933
3934 // If every element pair has a zero/undef/poison then just fold to zero.
3935 // fold (and x, undef/poison) -> 0 / (and x, 0) -> 0
3936 // fold (mul x, undef/poison) -> 0 / (mul x, 0) -> 0
3937 if (DemandedElts.isSubsetOf(SrcZero | KnownZero | SrcUndef | KnownUndef))
3938 return TLO.CombineTo(Op, TLO.DAG.getConstant(0, SDLoc(Op), VT));
3939
3940 // If either side has a zero element, then the result element is zero, even
3941 // if the other is an UNDEF.
3942 // TODO: Extend getKnownUndefForVectorBinop to also deal with known zeros
3943 // and then handle 'and' nodes with the rest of the binop opcodes.
3944 KnownZero |= SrcZero;
3945 KnownUndef &= SrcUndef;
3946 KnownUndef &= ~KnownZero;
3947
3948 // Attempt to avoid multi-use ops if we don't need anything from them.
3949 if (!DemandedElts.isAllOnes())
3950 if (SimplifyDemandedVectorEltsBinOp(Op0, Op1))
3951 return true;
3952 break;
3953 }
3954 case ISD::TRUNCATE:
3955 case ISD::SIGN_EXTEND:
3956 case ISD::ZERO_EXTEND:
3957 if (SimplifyDemandedVectorElts(Op.getOperand(0), DemandedElts, KnownUndef,
3958 KnownZero, TLO, Depth + 1))
3959 return true;
3960
3961 if (!DemandedElts.isAllOnes())
3963 Op.getOperand(0), DemandedElts, TLO.DAG, Depth + 1))
3964 return TLO.CombineTo(Op, TLO.DAG.getNode(Opcode, SDLoc(Op), VT, NewOp));
3965
3966 if (Op.getOpcode() == ISD::ZERO_EXTEND) {
3967 // zext(undef) upper bits are guaranteed to be zero.
3968 if (DemandedElts.isSubsetOf(KnownUndef))
3969 return TLO.CombineTo(Op, TLO.DAG.getConstant(0, SDLoc(Op), VT));
3970 KnownUndef.clearAllBits();
3971 }
3972 break;
3973 case ISD::SINT_TO_FP:
3974 case ISD::UINT_TO_FP:
3975 case ISD::FP_TO_SINT:
3976 case ISD::FP_TO_UINT:
3977 if (SimplifyDemandedVectorElts(Op.getOperand(0), DemandedElts, KnownUndef,
3978 KnownZero, TLO, Depth + 1))
3979 return true;
3980 // Don't fall through to generic undef -> undef handling.
3981 return false;
3982 default: {
3983 if (Op.getOpcode() >= ISD::BUILTIN_OP_END) {
3984 if (SimplifyDemandedVectorEltsForTargetNode(Op, DemandedElts, KnownUndef,
3985 KnownZero, TLO, Depth))
3986 return true;
3987 } else {
3989 APInt DemandedBits = APInt::getAllOnes(EltSizeInBits);
3990 if (SimplifyDemandedBits(Op, DemandedBits, OriginalDemandedElts, Known,
3991 TLO, Depth, AssumeSingleUse))
3992 return true;
3993 }
3994 break;
3995 }
3996 }
3997
3998 assert((KnownUndef & KnownZero) == 0 && "Elements flagged as undef AND zero");
3999
4000 // Constant fold all undef cases.
4001 // TODO: Handle zero cases as well.
4002 if (DemandedElts.isSubsetOf(KnownUndef))
4003 return TLO.CombineTo(Op, TLO.DAG.getUNDEF(VT));
4004
4005 return false;
4006}
4007
4008/// Determine which of the bits specified in Mask are known to be either zero or
4009/// one and return them in the Known.
4012 const APInt &DemandedElts,
4013 const SelectionDAG &DAG,
4014 unsigned Depth) const {
4015 assert((Op.getOpcode() >= ISD::BUILTIN_OP_END ||
4016 Op.getOpcode() == ISD::INTRINSIC_WO_CHAIN ||
4017 Op.getOpcode() == ISD::INTRINSIC_W_CHAIN ||
4018 Op.getOpcode() == ISD::INTRINSIC_VOID) &&
4019 "Should use MaskedValueIsZero if you don't know whether Op"
4020 " is a target node!");
4021 Known.resetAll();
4022}
4023
4026 const APInt &DemandedElts, const MachineRegisterInfo &MRI,
4027 unsigned Depth) const {
4028 Known.resetAll();
4029}
4030
4033 const APInt &DemandedElts, const MachineRegisterInfo &MRI,
4034 unsigned Depth) const {
4035 Known.resetAll();
4036}
4037
4039 KnownBits &Known, const MachineFunction &, Align Alignment) const {
4040 // The low bits are known zero if the pointer is aligned.
4041 Known.Zero.setLowBits(Log2(Alignment));
4042}
4043
4045 SelectionDAG &DAG,
4046 const SDLoc &DL,
4047 Align Alignment) const {
4048 // Materialize leading-zero stack object pointer facts as AssertZext.
4049 // Alignment-derived low zero bits are not represented on the returned DAG
4050 // value here.
4051 EVT PtrVT = Ptr.getValueType();
4052
4053 unsigned RegSize = PtrVT.getScalarSizeInBits();
4056 Alignment);
4057
4058 unsigned NumZeroBits = Known.countMinLeadingZeros();
4059 if (!NumZeroBits)
4060 return Ptr;
4061
4062 EVT FromVT = EVT::getIntegerVT(*DAG.getContext(), RegSize - NumZeroBits);
4063 return DAG.getNode(ISD::AssertZext, DL, PtrVT, Ptr, DAG.getValueType(FromVT));
4064}
4065
4071
4072/// This method can be implemented by targets that want to expose additional
4073/// information about sign bits to the DAG Combiner.
4075 const APInt &,
4076 const SelectionDAG &,
4077 unsigned Depth) const {
4078 assert((Op.getOpcode() >= ISD::BUILTIN_OP_END ||
4079 Op.getOpcode() == ISD::INTRINSIC_WO_CHAIN ||
4080 Op.getOpcode() == ISD::INTRINSIC_W_CHAIN ||
4081 Op.getOpcode() == ISD::INTRINSIC_VOID) &&
4082 "Should use ComputeNumSignBits if you don't know whether Op"
4083 " is a target node!");
4084 return 1;
4085}
4086
4088 GISelValueTracking &Analysis, Register R, const APInt &DemandedElts,
4089 const MachineRegisterInfo &MRI, unsigned Depth) const {
4090 return 1;
4091}
4092
4094 SDValue Op, const APInt &DemandedElts, APInt &KnownUndef, APInt &KnownZero,
4095 TargetLoweringOpt &TLO, unsigned Depth) const {
4096 assert((Op.getOpcode() >= ISD::BUILTIN_OP_END ||
4097 Op.getOpcode() == ISD::INTRINSIC_WO_CHAIN ||
4098 Op.getOpcode() == ISD::INTRINSIC_W_CHAIN ||
4099 Op.getOpcode() == ISD::INTRINSIC_VOID) &&
4100 "Should use SimplifyDemandedVectorElts if you don't know whether Op"
4101 " is a target node!");
4102 return false;
4103}
4104
4106 SDValue Op, const APInt &DemandedBits, const APInt &DemandedElts,
4107 KnownBits &Known, TargetLoweringOpt &TLO, unsigned Depth) const {
4108 assert((Op.getOpcode() >= ISD::BUILTIN_OP_END ||
4109 Op.getOpcode() == ISD::INTRINSIC_WO_CHAIN ||
4110 Op.getOpcode() == ISD::INTRINSIC_W_CHAIN ||
4111 Op.getOpcode() == ISD::INTRINSIC_VOID) &&
4112 "Should use SimplifyDemandedBits if you don't know whether Op"
4113 " is a target node!");
4114 computeKnownBitsForTargetNode(Op, Known, DemandedElts, TLO.DAG, Depth);
4115 return false;
4116}
4117
4119 SDValue Op, const APInt &DemandedBits, const APInt &DemandedElts,
4120 SelectionDAG &DAG, unsigned Depth) const {
4121 assert(
4122 (Op.getOpcode() >= ISD::BUILTIN_OP_END ||
4123 Op.getOpcode() == ISD::INTRINSIC_WO_CHAIN ||
4124 Op.getOpcode() == ISD::INTRINSIC_W_CHAIN ||
4125 Op.getOpcode() == ISD::INTRINSIC_VOID) &&
4126 "Should use SimplifyMultipleUseDemandedBits if you don't know whether Op"
4127 " is a target node!");
4128 return SDValue();
4129}
4130
4131SDValue
4134 SelectionDAG &DAG) const {
4135 bool LegalMask = isShuffleMaskLegal(Mask, VT);
4136 if (!LegalMask) {
4137 std::swap(N0, N1);
4139 LegalMask = isShuffleMaskLegal(Mask, VT);
4140 }
4141
4142 if (!LegalMask)
4143 return SDValue();
4144
4145 return DAG.getVectorShuffle(VT, DL, N0, N1, Mask);
4146}
4147
4149 return nullptr;
4150}
4151
4153 SDValue Op, const APInt &DemandedElts, const SelectionDAG &DAG,
4154 UndefPoisonKind Kind, unsigned Depth) const {
4155 assert(
4156 (Op.getOpcode() >= ISD::BUILTIN_OP_END ||
4157 Op.getOpcode() == ISD::INTRINSIC_WO_CHAIN ||
4158 Op.getOpcode() == ISD::INTRINSIC_W_CHAIN ||
4159 Op.getOpcode() == ISD::INTRINSIC_VOID) &&
4160 "Should use isGuaranteedNotToBeUndefOrPoison if you don't know whether Op"
4161 " is a target node!");
4162
4163 // If Op can't create undef/poison and none of its operands are undef/poison
4164 // then Op is never undef/poison.
4165 return !canCreateUndefOrPoisonForTargetNode(Op, DemandedElts, DAG, Kind,
4166 /*ConsiderFlags*/ true, Depth) &&
4167 all_of(Op->ops(), [&](SDValue V) {
4168 return DAG.isGuaranteedNotToBeUndefOrPoison(V, Kind, Depth + 1);
4169 });
4170}
4171
4173 SDValue Op, const APInt &DemandedElts, const SelectionDAG &DAG,
4174 UndefPoisonKind Kind, bool ConsiderFlags, unsigned Depth) const {
4175 assert((Op.getOpcode() >= ISD::BUILTIN_OP_END ||
4176 Op.getOpcode() == ISD::INTRINSIC_WO_CHAIN ||
4177 Op.getOpcode() == ISD::INTRINSIC_W_CHAIN ||
4178 Op.getOpcode() == ISD::INTRINSIC_VOID) &&
4179 "Should use canCreateUndefOrPoison if you don't know whether Op"
4180 " is a target node!");
4181 // Be conservative and return true.
4182 return true;
4183}
4184
4187 const APInt &DemandedElts,
4188 const SelectionDAG &DAG,
4189 unsigned Depth) const {
4190 assert((Op.getOpcode() >= ISD::BUILTIN_OP_END ||
4191 Op.getOpcode() == ISD::INTRINSIC_WO_CHAIN ||
4192 Op.getOpcode() == ISD::INTRINSIC_W_CHAIN ||
4193 Op.getOpcode() == ISD::INTRINSIC_VOID) &&
4194 "Should use computeKnownFPClass if you don't know whether Op"
4195 " is a target node!");
4196}
4197
4199 const APInt &DemandedElts,
4200 const SelectionDAG &DAG,
4201 bool SNaN,
4202 unsigned Depth) const {
4203 assert((Op.getOpcode() >= ISD::BUILTIN_OP_END ||
4204 Op.getOpcode() == ISD::INTRINSIC_WO_CHAIN ||
4205 Op.getOpcode() == ISD::INTRINSIC_W_CHAIN ||
4206 Op.getOpcode() == ISD::INTRINSIC_VOID) &&
4207 "Should use isKnownNeverNaN if you don't know whether Op"
4208 " is a target node!");
4209 return false;
4210}
4211
4213 const APInt &DemandedElts,
4214 APInt &UndefElts,
4215 const SelectionDAG &DAG,
4216 unsigned Depth) const {
4217 assert((Op.getOpcode() >= ISD::BUILTIN_OP_END ||
4218 Op.getOpcode() == ISD::INTRINSIC_WO_CHAIN ||
4219 Op.getOpcode() == ISD::INTRINSIC_W_CHAIN ||
4220 Op.getOpcode() == ISD::INTRINSIC_VOID) &&
4221 "Should use isSplatValue if you don't know whether Op"
4222 " is a target node!");
4223 return false;
4224}
4225
4226// FIXME: Ideally, this would use ISD::isConstantSplatVector(), but that must
4227// work with truncating build vectors and vectors with elements of less than
4228// 8 bits.
4230 if (!N)
4231 return false;
4232
4233 unsigned EltWidth;
4234 APInt CVal;
4235 if (ConstantSDNode *CN = isConstOrConstSplat(N, /*AllowUndefs=*/false,
4236 /*AllowTruncation=*/true)) {
4237 CVal = CN->getAPIntValue();
4238 EltWidth = N.getValueType().getScalarSizeInBits();
4239 } else
4240 return false;
4241
4242 // If this is a truncating splat, truncate the splat value.
4243 // Otherwise, we may fail to match the expected values below.
4244 if (EltWidth < CVal.getBitWidth())
4245 CVal = CVal.trunc(EltWidth);
4246
4247 switch (getBooleanContents(N.getValueType())) {
4249 return CVal[0];
4251 return CVal.isOne();
4253 return CVal.isAllOnes();
4254 }
4255
4256 llvm_unreachable("Invalid boolean contents");
4257}
4258
4260 if (!N)
4261 return false;
4262
4264 if (!CN) {
4266 if (!BV)
4267 return false;
4268
4269 // Only interested in constant splats, we don't care about undef
4270 // elements in identifying boolean constants and getConstantSplatNode
4271 // returns NULL if all ops are undef;
4272 CN = BV->getConstantSplatNode();
4273 if (!CN)
4274 return false;
4275 }
4276
4277 if (getBooleanContents(N->getValueType(0)) == UndefinedBooleanContent)
4278 return !CN->getAPIntValue()[0];
4279
4280 return CN->isZero();
4281}
4282
4284 bool SExt) const {
4285 if (VT == MVT::i1)
4286 return N->isOne();
4287
4289 switch (Cnt) {
4291 // An extended value of 1 is always true, unless its original type is i1,
4292 // in which case it will be sign extended to -1.
4293 return (N->isOne() && !SExt) || (SExt && (N->getValueType(0) != MVT::i1));
4296 return N->isAllOnes() && SExt;
4297 }
4298 llvm_unreachable("Unexpected enumeration.");
4299}
4300
4301/// This helper function of SimplifySetCC tries to optimize the comparison when
4302/// either operand of the SetCC node is a bitwise-and instruction.
4303SDValue TargetLowering::foldSetCCWithAnd(EVT VT, SDValue N0, SDValue N1,
4304 ISD::CondCode Cond, const SDLoc &DL,
4305 DAGCombinerInfo &DCI) const {
4306 if (N1.getOpcode() == ISD::AND && N0.getOpcode() != ISD::AND)
4307 std::swap(N0, N1);
4308
4309 SelectionDAG &DAG = DCI.DAG;
4310 EVT OpVT = N0.getValueType();
4311 if (N0.getOpcode() != ISD::AND || !OpVT.isInteger() ||
4312 (Cond != ISD::SETEQ && Cond != ISD::SETNE))
4313 return SDValue();
4314
4315 // (X & Y) != 0 --> zextOrTrunc(X & Y)
4316 // iff everything but LSB is known zero:
4317 if (Cond == ISD::SETNE && isNullConstant(N1) &&
4320 unsigned NumEltBits = OpVT.getScalarSizeInBits();
4321 APInt UpperBits = APInt::getHighBitsSet(NumEltBits, NumEltBits - 1);
4322 if (DAG.MaskedValueIsZero(N0, UpperBits))
4323 return DAG.getBoolExtOrTrunc(N0, DL, VT, OpVT);
4324 }
4325
4326 // Try to eliminate a power-of-2 mask constant by converting to a signbit
4327 // test in a narrow type that we can truncate to with no cost. Examples:
4328 // (i32 X & 32768) == 0 --> (trunc X to i16) >= 0
4329 // (i32 X & 32768) != 0 --> (trunc X to i16) < 0
4330 // TODO: This conservatively checks for type legality on the source and
4331 // destination types. That may inhibit optimizations, but it also
4332 // allows setcc->shift transforms that may be more beneficial.
4333 auto *AndC = dyn_cast<ConstantSDNode>(N0.getOperand(1));
4334 if (AndC && isNullConstant(N1) && AndC->getAPIntValue().isPowerOf2() &&
4335 isTypeLegal(OpVT) && N0.hasOneUse()) {
4336 EVT NarrowVT = EVT::getIntegerVT(*DAG.getContext(),
4337 AndC->getAPIntValue().getActiveBits());
4338 if (isTruncateFree(OpVT, NarrowVT) && isTypeLegal(NarrowVT)) {
4339 SDValue Trunc = DAG.getZExtOrTrunc(N0.getOperand(0), DL, NarrowVT);
4340 SDValue Zero = DAG.getConstant(0, DL, NarrowVT);
4341 return DAG.getSetCC(DL, VT, Trunc, Zero,
4343 }
4344 }
4345
4346 // Match these patterns in any of their permutations:
4347 // (X & Y) == Y
4348 // (X & Y) != Y
4349 SDValue X, Y;
4350 if (N0.getOperand(0) == N1) {
4351 X = N0.getOperand(1);
4352 Y = N0.getOperand(0);
4353 } else if (N0.getOperand(1) == N1) {
4354 X = N0.getOperand(0);
4355 Y = N0.getOperand(1);
4356 } else {
4357 return SDValue();
4358 }
4359
4360 // TODO: We should invert (X & Y) eq/ne 0 -> (X & Y) ne/eq Y if
4361 // `isXAndYEqZeroPreferableToXAndYEqY` is false. This is a bit difficult as
4362 // its liable to create and infinite loop.
4363 SDValue Zero = DAG.getConstant(0, DL, OpVT);
4364 if (isXAndYEqZeroPreferableToXAndYEqY(Cond, OpVT) &&
4366 // Simplify X & Y == Y to X & Y != 0 if Y has exactly one bit set.
4367 // Note that where Y is variable and is known to have at most one bit set
4368 // (for example, if it is Z & 1) we cannot do this; the expressions are not
4369 // equivalent when Y == 0.
4370 assert(OpVT.isInteger());
4372 if (DCI.isBeforeLegalizeOps() ||
4374 return DAG.getSetCC(DL, VT, N0, Zero, Cond);
4375 } else if (N0.hasOneUse() && hasAndNotCompare(Y)) {
4376 // If the target supports an 'and-not' or 'and-complement' logic operation,
4377 // try to use that to make a comparison operation more efficient.
4378 // But don't do this transform if the mask is a single bit because there are
4379 // more efficient ways to deal with that case (for example, 'bt' on x86 or
4380 // 'rlwinm' on PPC).
4381
4382 // Bail out if the compare operand that we want to turn into a zero is
4383 // already a zero (otherwise, infinite loop).
4384 if (isNullConstant(Y))
4385 return SDValue();
4386
4387 // Transform this into: ~X & Y == 0.
4388 SDValue NotX = DAG.getNOT(SDLoc(X), X, OpVT);
4389 SDValue NewAnd = DAG.getNode(ISD::AND, SDLoc(N0), OpVT, NotX, Y);
4390 return DAG.getSetCC(DL, VT, NewAnd, Zero, Cond);
4391 }
4392
4393 return SDValue();
4394}
4395
4396/// This helper function of SimplifySetCC tries to optimize the comparison when
4397/// either operand of the SetCC node is a bitwise-or instruction.
4398/// For now, this just transforms (X | Y) ==/!= Y into X & ~Y ==/!= 0.
4399SDValue TargetLowering::foldSetCCWithOr(EVT VT, SDValue N0, SDValue N1,
4400 ISD::CondCode Cond, const SDLoc &DL,
4401 DAGCombinerInfo &DCI) const {
4402 if (N1.getOpcode() == ISD::OR && N0.getOpcode() != ISD::OR)
4403 std::swap(N0, N1);
4404
4405 SelectionDAG &DAG = DCI.DAG;
4406 EVT OpVT = N0.getValueType();
4407 if (!N0.hasOneUse() || !OpVT.isInteger() ||
4408 (Cond != ISD::SETEQ && Cond != ISD::SETNE))
4409 return SDValue();
4410
4411 // (X | Y) == Y
4412 // (X | Y) != Y
4413 SDValue X;
4414 if (sd_match(N0, m_Or(m_Value(X), m_Specific(N1))) && hasAndNotCompare(X)) {
4415 // If the target supports an 'and-not' or 'and-complement' logic operation,
4416 // try to use that to make a comparison operation more efficient.
4417
4418 // Bail out if the compare operand that we want to turn into a zero is
4419 // already a zero (otherwise, infinite loop).
4420 if (isNullConstant(N1))
4421 return SDValue();
4422
4423 // Transform this into: X & ~Y ==/!= 0.
4424 SDValue NotY = DAG.getNOT(SDLoc(N1), N1, OpVT);
4425 SDValue NewAnd = DAG.getNode(ISD::AND, SDLoc(N0), OpVT, X, NotY);
4426 return DAG.getSetCC(DL, VT, NewAnd, DAG.getConstant(0, DL, OpVT), Cond);
4427 }
4428
4429 return SDValue();
4430}
4431
4432/// There are multiple IR patterns that could be checking whether certain
4433/// truncation of a signed number would be lossy or not. The pattern which is
4434/// best at IR level, may not lower optimally. Thus, we want to unfold it.
4435/// We are looking for the following pattern: (KeptBits is a constant)
4436/// (add %x, (1 << (KeptBits-1))) srccond (1 << KeptBits)
4437/// KeptBits won't be bitwidth(x), that will be constant-folded to true/false.
4438/// KeptBits also can't be 1, that would have been folded to %x dstcond 0
4439/// We will unfold it into the natural trunc+sext pattern:
4440/// ((%x << C) a>> C) dstcond %x
4441/// Where C = bitwidth(x) - KeptBits and C u< bitwidth(x)
4442SDValue TargetLowering::optimizeSetCCOfSignedTruncationCheck(
4443 EVT SCCVT, SDValue N0, SDValue N1, ISD::CondCode Cond, DAGCombinerInfo &DCI,
4444 const SDLoc &DL) const {
4445 // We must be comparing with a constant.
4446 ConstantSDNode *C1;
4447 if (!(C1 = dyn_cast<ConstantSDNode>(N1)))
4448 return SDValue();
4449
4450 // N0 should be: add %x, (1 << (KeptBits-1))
4451 if (N0->getOpcode() != ISD::ADD)
4452 return SDValue();
4453
4454 // And we must be 'add'ing a constant.
4455 ConstantSDNode *C01;
4456 if (!(C01 = dyn_cast<ConstantSDNode>(N0->getOperand(1))))
4457 return SDValue();
4458
4459 SDValue X = N0->getOperand(0);
4460 EVT XVT = X.getValueType();
4461
4462 // Validate constants ...
4463
4464 APInt I1 = C1->getAPIntValue();
4465
4466 ISD::CondCode NewCond;
4467 if (Cond == ISD::CondCode::SETULT) {
4468 NewCond = ISD::CondCode::SETEQ;
4469 } else if (Cond == ISD::CondCode::SETULE) {
4470 NewCond = ISD::CondCode::SETEQ;
4471 // But need to 'canonicalize' the constant.
4472 I1 += 1;
4473 } else if (Cond == ISD::CondCode::SETUGT) {
4474 NewCond = ISD::CondCode::SETNE;
4475 // But need to 'canonicalize' the constant.
4476 I1 += 1;
4477 } else if (Cond == ISD::CondCode::SETUGE) {
4478 NewCond = ISD::CondCode::SETNE;
4479 } else
4480 return SDValue();
4481
4482 APInt I01 = C01->getAPIntValue();
4483
4484 auto checkConstants = [&I1, &I01]() -> bool {
4485 // Both of them must be power-of-two, and the constant from setcc is bigger.
4486 return I1.ugt(I01) && I1.isPowerOf2() && I01.isPowerOf2();
4487 };
4488
4489 if (checkConstants()) {
4490 // Great, e.g. got icmp ult i16 (add i16 %x, 128), 256
4491 } else {
4492 // What if we invert constants? (and the target predicate)
4493 I1.negate();
4494 I01.negate();
4495 assert(XVT.isInteger());
4496 NewCond = getSetCCInverse(NewCond, XVT);
4497 if (!checkConstants())
4498 return SDValue();
4499 // Great, e.g. got icmp uge i16 (add i16 %x, -128), -256
4500 }
4501
4502 // They are power-of-two, so which bit is set?
4503 const unsigned KeptBits = I1.logBase2();
4504 const unsigned KeptBitsMinusOne = I01.logBase2();
4505
4506 // Magic!
4507 if (KeptBits != (KeptBitsMinusOne + 1))
4508 return SDValue();
4509 assert(KeptBits > 0 && KeptBits < XVT.getSizeInBits() && "unreachable");
4510
4511 // We don't want to do this in every single case.
4512 SelectionDAG &DAG = DCI.DAG;
4513 if (!shouldTransformSignedTruncationCheck(XVT, KeptBits))
4514 return SDValue();
4515
4516 // Unfold into: sext_inreg(%x) cond %x
4517 // Where 'cond' will be either 'eq' or 'ne'.
4518 SDValue SExtInReg = DAG.getNode(
4520 DAG.getValueType(EVT::getIntegerVT(*DAG.getContext(), KeptBits)));
4521 return DAG.getSetCC(DL, SCCVT, SExtInReg, X, NewCond);
4522}
4523
4524// (X & (C l>>/<< Y)) ==/!= 0 --> ((X <</l>> Y) & C) ==/!= 0
4525SDValue TargetLowering::optimizeSetCCByHoistingAndByConstFromLogicalShift(
4526 EVT SCCVT, SDValue N0, SDValue N1C, ISD::CondCode Cond,
4527 DAGCombinerInfo &DCI, const SDLoc &DL) const {
4529 "Should be a comparison with 0.");
4530 assert((Cond == ISD::SETEQ || Cond == ISD::SETNE) &&
4531 "Valid only for [in]equality comparisons.");
4532
4533 unsigned NewShiftOpcode;
4534 SDValue X, C, Y;
4535
4536 SelectionDAG &DAG = DCI.DAG;
4537
4538 // Look for '(C l>>/<< Y)'.
4539 auto Match = [&NewShiftOpcode, &X, &C, &Y, &DAG, this](SDValue V) {
4540 // The shift should be one-use.
4541 if (!V.hasOneUse())
4542 return false;
4543 unsigned OldShiftOpcode = V.getOpcode();
4544 switch (OldShiftOpcode) {
4545 case ISD::SHL:
4546 NewShiftOpcode = ISD::SRL;
4547 break;
4548 case ISD::SRL:
4549 NewShiftOpcode = ISD::SHL;
4550 break;
4551 default:
4552 return false; // must be a logical shift.
4553 }
4554 // We should be shifting a constant.
4555 // FIXME: best to use isConstantOrConstantVector().
4556 C = V.getOperand(0);
4557 ConstantSDNode *CC =
4558 isConstOrConstSplat(C, /*AllowUndefs=*/true, /*AllowTruncation=*/true);
4559 if (!CC)
4560 return false;
4561 Y = V.getOperand(1);
4562
4563 ConstantSDNode *XC =
4564 isConstOrConstSplat(X, /*AllowUndefs=*/true, /*AllowTruncation=*/true);
4566 X, XC, CC, Y, OldShiftOpcode, NewShiftOpcode, DAG);
4567 };
4568
4569 // LHS of comparison should be an one-use 'and'.
4570 if (N0.getOpcode() != ISD::AND || !N0.hasOneUse())
4571 return SDValue();
4572
4573 X = N0.getOperand(0);
4574 SDValue Mask = N0.getOperand(1);
4575
4576 // 'and' is commutative!
4577 if (!Match(Mask)) {
4578 std::swap(X, Mask);
4579 if (!Match(Mask))
4580 return SDValue();
4581 }
4582
4583 EVT VT = X.getValueType();
4584
4585 // Produce:
4586 // ((X 'OppositeShiftOpcode' Y) & C) Cond 0
4587 SDValue T0 = DAG.getNode(NewShiftOpcode, DL, VT, X, Y);
4588 SDValue T1 = DAG.getNode(ISD::AND, DL, VT, T0, C);
4589 SDValue T2 = DAG.getSetCC(DL, SCCVT, T1, N1C, Cond);
4590 return T2;
4591}
4592
4593/// Try to fold an equality comparison with a {add/sub/xor} binary operation as
4594/// the 1st operand (N0). Callers are expected to swap the N0/N1 parameters to
4595/// handle the commuted versions of these patterns.
4596SDValue TargetLowering::foldSetCCWithBinOp(EVT VT, SDValue N0, SDValue N1,
4597 ISD::CondCode Cond, const SDLoc &DL,
4598 DAGCombinerInfo &DCI) const {
4599 unsigned BOpcode = N0.getOpcode();
4600 assert((BOpcode == ISD::ADD || BOpcode == ISD::SUB || BOpcode == ISD::XOR) &&
4601 "Unexpected binop");
4602 assert((Cond == ISD::SETEQ || Cond == ISD::SETNE) && "Unexpected condcode");
4603
4604 // (X + Y) == X --> Y == 0
4605 // (X - Y) == X --> Y == 0
4606 // (X ^ Y) == X --> Y == 0
4607 SelectionDAG &DAG = DCI.DAG;
4608 EVT OpVT = N0.getValueType();
4609 SDValue X = N0.getOperand(0);
4610 SDValue Y = N0.getOperand(1);
4611 if (X == N1)
4612 return DAG.getSetCC(DL, VT, Y, DAG.getConstant(0, DL, OpVT), Cond);
4613
4614 if (Y != N1)
4615 return SDValue();
4616
4617 // (X + Y) == Y --> X == 0
4618 // (X ^ Y) == Y --> X == 0
4619 if (BOpcode == ISD::ADD || BOpcode == ISD::XOR)
4620 return DAG.getSetCC(DL, VT, X, DAG.getConstant(0, DL, OpVT), Cond);
4621
4622 // The shift would not be valid if the operands are boolean (i1).
4623 if (!N0.hasOneUse() || OpVT.getScalarSizeInBits() == 1)
4624 return SDValue();
4625
4626 // (X - Y) == Y --> X == Y << 1
4627 SDValue One = DAG.getShiftAmountConstant(1, OpVT, DL);
4628 SDValue YShl1 = DAG.getNode(ISD::SHL, DL, N1.getValueType(), Y, One);
4629 if (!DCI.isCalledByLegalizer())
4630 DCI.AddToWorklist(YShl1.getNode());
4631 return DAG.getSetCC(DL, VT, X, YShl1, Cond);
4632}
4633
4635 SDValue N0, const APInt &C1,
4636 ISD::CondCode Cond, const SDLoc &dl,
4637 SelectionDAG &DAG) {
4638 // Look through truncs that don't change the value of a ctpop.
4639 // FIXME: Add vector support? Need to be careful with setcc result type below.
4640 SDValue CTPOP = N0;
4641 if (N0.getOpcode() == ISD::TRUNCATE && N0.hasOneUse() && !VT.isVector() &&
4643 CTPOP = N0.getOperand(0);
4644
4645 if (CTPOP.getOpcode() != ISD::CTPOP || !CTPOP.hasOneUse())
4646 return SDValue();
4647
4648 EVT CTVT = CTPOP.getValueType();
4649 SDValue CTOp = CTPOP.getOperand(0);
4650
4651 // Expand a power-of-2-or-zero comparison based on ctpop:
4652 // (ctpop x) u< 2 -> (x & x-1) == 0
4653 // (ctpop x) u> 1 -> (x & x-1) != 0
4654 if (Cond == ISD::SETULT || Cond == ISD::SETUGT) {
4655 // Keep the CTPOP if it is a cheap vector op.
4656 if (CTVT.isVector() && TLI.isCtpopFast(CTVT))
4657 return SDValue();
4658
4659 unsigned CostLimit = TLI.getCustomCtpopCost(CTVT, Cond);
4660 if (C1.ugt(CostLimit + (Cond == ISD::SETULT)))
4661 return SDValue();
4662 if (C1 == 0 && (Cond == ISD::SETULT))
4663 return SDValue(); // This is handled elsewhere.
4664
4665 unsigned Passes = C1.getLimitedValue() - (Cond == ISD::SETULT);
4666
4667 SDValue NegOne = DAG.getAllOnesConstant(dl, CTVT);
4668 SDValue Result = CTOp;
4669 for (unsigned i = 0; i < Passes; i++) {
4670 SDValue Add = DAG.getNode(ISD::ADD, dl, CTVT, Result, NegOne);
4671 Result = DAG.getNode(ISD::AND, dl, CTVT, Result, Add);
4672 }
4674 return DAG.getSetCC(dl, VT, Result, DAG.getConstant(0, dl, CTVT), CC);
4675 }
4676
4677 // Expand a power-of-2 comparison based on ctpop
4678 if ((Cond == ISD::SETEQ || Cond == ISD::SETNE) && C1 == 1) {
4679 // Keep the CTPOP if it is cheap.
4680 if (TLI.isCtpopFast(CTVT))
4681 return SDValue();
4682
4683 SDValue Zero = DAG.getConstant(0, dl, CTVT);
4684 SDValue NegOne = DAG.getAllOnesConstant(dl, CTVT);
4685 assert(CTVT.isInteger());
4686 SDValue Add = DAG.getNode(ISD::ADD, dl, CTVT, CTOp, NegOne);
4687
4688 // Its not uncommon for known-never-zero X to exist in (ctpop X) eq/ne 1, so
4689 // check before emitting a potentially unnecessary op.
4690 if (DAG.isKnownNeverZero(CTOp)) {
4691 // (ctpop x) == 1 --> (x & x-1) == 0
4692 // (ctpop x) != 1 --> (x & x-1) != 0
4693 SDValue And = DAG.getNode(ISD::AND, dl, CTVT, CTOp, Add);
4694 SDValue RHS = DAG.getSetCC(dl, VT, And, Zero, Cond);
4695 return RHS;
4696 }
4697
4698 // (ctpop x) == 1 --> (x ^ x-1) > x-1
4699 // (ctpop x) != 1 --> (x ^ x-1) <= x-1
4700 SDValue Xor = DAG.getNode(ISD::XOR, dl, CTVT, CTOp, Add);
4702 return DAG.getSetCC(dl, VT, Xor, Add, CmpCond);
4703 }
4704
4705 return SDValue();
4706}
4707
4709 ISD::CondCode Cond, const SDLoc &dl,
4710 SelectionDAG &DAG) {
4711 if (Cond != ISD::SETEQ && Cond != ISD::SETNE)
4712 return SDValue();
4713
4714 auto *C1 = isConstOrConstSplat(N1, /* AllowUndefs */ true);
4715 if (!C1 || !(C1->isZero() || C1->isAllOnes()))
4716 return SDValue();
4717
4718 auto getRotateSource = [](SDValue X) {
4719 if (X.getOpcode() == ISD::ROTL || X.getOpcode() == ISD::ROTR)
4720 return X.getOperand(0);
4721 return SDValue();
4722 };
4723
4724 // Peek through a rotated value compared against 0 or -1:
4725 // (rot X, Y) == 0/-1 --> X == 0/-1
4726 // (rot X, Y) != 0/-1 --> X != 0/-1
4727 if (SDValue R = getRotateSource(N0))
4728 return DAG.getSetCC(dl, VT, R, N1, Cond);
4729
4730 // Peek through an 'or' of a rotated value compared against 0:
4731 // or (rot X, Y), Z ==/!= 0 --> (or X, Z) ==/!= 0
4732 // or Z, (rot X, Y) ==/!= 0 --> (or X, Z) ==/!= 0
4733 //
4734 // TODO: Add the 'and' with -1 sibling.
4735 // TODO: Recurse through a series of 'or' ops to find the rotate.
4736 EVT OpVT = N0.getValueType();
4737 if (N0.hasOneUse() && N0.getOpcode() == ISD::OR && C1->isZero()) {
4738 if (SDValue R = getRotateSource(N0.getOperand(0))) {
4739 SDValue NewOr = DAG.getNode(ISD::OR, dl, OpVT, R, N0.getOperand(1));
4740 return DAG.getSetCC(dl, VT, NewOr, N1, Cond);
4741 }
4742 if (SDValue R = getRotateSource(N0.getOperand(1))) {
4743 SDValue NewOr = DAG.getNode(ISD::OR, dl, OpVT, R, N0.getOperand(0));
4744 return DAG.getSetCC(dl, VT, NewOr, N1, Cond);
4745 }
4746 }
4747
4748 return SDValue();
4749}
4750
4752 ISD::CondCode Cond, const SDLoc &dl,
4753 SelectionDAG &DAG) {
4754 // If we are testing for all-bits-clear, we might be able to do that with
4755 // less shifting since bit-order does not matter.
4756 if (Cond != ISD::SETEQ && Cond != ISD::SETNE)
4757 return SDValue();
4758
4759 auto *C1 = isConstOrConstSplat(N1, /* AllowUndefs */ true);
4760 if (!C1 || !C1->isZero())
4761 return SDValue();
4762
4763 if (!N0.hasOneUse() ||
4764 (N0.getOpcode() != ISD::FSHL && N0.getOpcode() != ISD::FSHR))
4765 return SDValue();
4766
4767 unsigned BitWidth = N0.getScalarValueSizeInBits();
4768 auto *ShAmtC = isConstOrConstSplat(N0.getOperand(2));
4769 if (!ShAmtC)
4770 return SDValue();
4771
4772 uint64_t ShAmt = ShAmtC->getAPIntValue().urem(BitWidth);
4773 if (ShAmt == 0)
4774 return SDValue();
4775
4776 // Canonicalize fshr as fshl to reduce pattern-matching.
4777 if (N0.getOpcode() == ISD::FSHR)
4778 ShAmt = BitWidth - ShAmt;
4779
4780 // Match an 'or' with a specific operand 'Other' in either commuted variant.
4781 SDValue X, Y;
4782 auto matchOr = [&X, &Y](SDValue Or, SDValue Other) {
4783 if (Or.getOpcode() != ISD::OR || !Or.hasOneUse())
4784 return false;
4785 if (Or.getOperand(0) == Other) {
4786 X = Or.getOperand(0);
4787 Y = Or.getOperand(1);
4788 return true;
4789 }
4790 if (Or.getOperand(1) == Other) {
4791 X = Or.getOperand(1);
4792 Y = Or.getOperand(0);
4793 return true;
4794 }
4795 return false;
4796 };
4797
4798 EVT OpVT = N0.getValueType();
4799 EVT ShAmtVT = N0.getOperand(2).getValueType();
4800 SDValue F0 = N0.getOperand(0);
4801 SDValue F1 = N0.getOperand(1);
4802 if (matchOr(F0, F1)) {
4803 // fshl (or X, Y), X, C ==/!= 0 --> or (shl Y, C), X ==/!= 0
4804 SDValue NewShAmt = DAG.getConstant(ShAmt, dl, ShAmtVT);
4805 SDValue Shift = DAG.getNode(ISD::SHL, dl, OpVT, Y, NewShAmt);
4806 SDValue NewOr = DAG.getNode(ISD::OR, dl, OpVT, Shift, X);
4807 return DAG.getSetCC(dl, VT, NewOr, N1, Cond);
4808 }
4809 if (matchOr(F1, F0)) {
4810 // fshl X, (or X, Y), C ==/!= 0 --> or (srl Y, BW-C), X ==/!= 0
4811 SDValue NewShAmt = DAG.getConstant(BitWidth - ShAmt, dl, ShAmtVT);
4812 SDValue Shift = DAG.getNode(ISD::SRL, dl, OpVT, Y, NewShAmt);
4813 SDValue NewOr = DAG.getNode(ISD::OR, dl, OpVT, Shift, X);
4814 return DAG.getSetCC(dl, VT, NewOr, N1, Cond);
4815 }
4816
4817 return SDValue();
4818}
4819
4820/// Try to simplify a setcc built with the specified operands and cc. If it is
4821/// unable to simplify it, return a null SDValue.
4823 ISD::CondCode Cond, bool foldBooleans,
4824 DAGCombinerInfo &DCI,
4825 const SDLoc &dl) const {
4826 SelectionDAG &DAG = DCI.DAG;
4827 const DataLayout &Layout = DAG.getDataLayout();
4828 EVT OpVT = N0.getValueType();
4829 AttributeList Attr = DAG.getMachineFunction().getFunction().getAttributes();
4830
4831 // Constant fold or commute setcc.
4832 if (SDValue Fold = DAG.FoldSetCC(VT, N0, N1, Cond, dl))
4833 return Fold;
4834
4835 bool N0ConstOrSplat =
4836 isConstOrConstSplat(N0, /*AllowUndefs*/ false, /*AllowTruncate*/ true);
4837 bool N1ConstOrSplat =
4838 isConstOrConstSplat(N1, /*AllowUndefs*/ false, /*AllowTruncate*/ true);
4839
4840 // Canonicalize toward having the constant on the RHS.
4841 // TODO: Handle non-splat vector constants. All undef causes trouble.
4842 // FIXME: We can't yet fold constant scalable vector splats, so avoid an
4843 // infinite loop here when we encounter one.
4845 if (N0ConstOrSplat && !N1ConstOrSplat &&
4846 (DCI.isBeforeLegalizeOps() ||
4847 isCondCodeLegal(SwappedCC, N0.getSimpleValueType())))
4848 return DAG.getSetCC(dl, VT, N1, N0, SwappedCC);
4849
4850 // If we have a subtract with the same 2 non-constant operands as this setcc
4851 // -- but in reverse order -- then try to commute the operands of this setcc
4852 // to match. A matching pair of setcc (cmp) and sub may be combined into 1
4853 // instruction on some targets.
4854 if (!N0ConstOrSplat && !N1ConstOrSplat &&
4855 (DCI.isBeforeLegalizeOps() ||
4856 isCondCodeLegal(SwappedCC, N0.getSimpleValueType())) &&
4857 DAG.doesNodeExist(ISD::SUB, DAG.getVTList(OpVT), {N1, N0}) &&
4858 !DAG.doesNodeExist(ISD::SUB, DAG.getVTList(OpVT), {N0, N1}))
4859 return DAG.getSetCC(dl, VT, N1, N0, SwappedCC);
4860
4861 if (SDValue V = foldSetCCWithRotate(VT, N0, N1, Cond, dl, DAG))
4862 return V;
4863
4864 if (SDValue V = foldSetCCWithFunnelShift(VT, N0, N1, Cond, dl, DAG))
4865 return V;
4866
4867 if (auto *N1C = isConstOrConstSplat(N1)) {
4868 const APInt &C1 = N1C->getAPIntValue();
4869
4870 // Optimize some CTPOP cases.
4871 if (SDValue V = simplifySetCCWithCTPOP(*this, VT, N0, C1, Cond, dl, DAG))
4872 return V;
4873
4874 // For equality to 0 of a no-wrap multiply, decompose and test each op:
4875 // X * Y == 0 --> (X == 0) || (Y == 0)
4876 // X * Y != 0 --> (X != 0) && (Y != 0)
4877 // TODO: This bails out if minsize is set, but if the target doesn't have a
4878 // single instruction multiply for this type, it would likely be
4879 // smaller to decompose.
4880 if (C1.isZero() && (Cond == ISD::SETEQ || Cond == ISD::SETNE) &&
4881 N0.getOpcode() == ISD::MUL && N0.hasOneUse() &&
4882 (N0->getFlags().hasNoUnsignedWrap() ||
4883 N0->getFlags().hasNoSignedWrap()) &&
4884 !Attr.hasFnAttr(Attribute::MinSize)) {
4885 SDValue IsXZero = DAG.getSetCC(dl, VT, N0.getOperand(0), N1, Cond);
4886 SDValue IsYZero = DAG.getSetCC(dl, VT, N0.getOperand(1), N1, Cond);
4887 unsigned LogicOp = Cond == ISD::SETEQ ? ISD::OR : ISD::AND;
4888 return DAG.getNode(LogicOp, dl, VT, IsXZero, IsYZero);
4889 }
4890
4891 // If the LHS is '(srl (ctlz x), 5)', the RHS is 0/1, and this is an
4892 // equality comparison, then we're just comparing whether X itself is
4893 // zero.
4894 if (N0.getOpcode() == ISD::SRL && (C1.isZero() || C1.isOne()) &&
4895 N0.getOperand(0).getOpcode() == ISD::CTLZ &&
4897 if (ConstantSDNode *ShAmt = isConstOrConstSplat(N0.getOperand(1))) {
4898 if ((Cond == ISD::SETEQ || Cond == ISD::SETNE) &&
4899 ShAmt->getAPIntValue() == Log2_32(N0.getScalarValueSizeInBits())) {
4900 if ((C1 == 0) == (Cond == ISD::SETEQ)) {
4901 // (srl (ctlz x), 5) == 0 -> X != 0
4902 // (srl (ctlz x), 5) != 1 -> X != 0
4903 Cond = ISD::SETNE;
4904 } else {
4905 // (srl (ctlz x), 5) != 0 -> X == 0
4906 // (srl (ctlz x), 5) == 1 -> X == 0
4907 Cond = ISD::SETEQ;
4908 }
4909 SDValue Zero = DAG.getConstant(0, dl, N0.getValueType());
4910 return DAG.getSetCC(dl, VT, N0.getOperand(0).getOperand(0), Zero,
4911 Cond);
4912 }
4913 }
4914 }
4915 }
4916
4917 // setcc X, 0, setlt --> X (when X is all sign bits)
4918 // setcc X, 0, setne --> X (when X is all sign bits)
4919 //
4920 // When we know that X has 0 or -1 in each element (or scalar), this
4921 // comparison will produce X. This is only true when boolean contents are
4922 // represented via 0s and -1s.
4923 if (VT == OpVT &&
4924 // Check that the result of setcc is 0 and -1.
4926 // Match only for checks X < 0 and X != 0
4927 (Cond == ISD::SETLT || Cond == ISD::SETNE) && isNullOrNullSplat(N1) &&
4928 // The identity holds iff we know all sign bits for all lanes.
4930 return N0;
4931
4932 // FIXME: Support vectors.
4933 if (auto *N1C = dyn_cast<ConstantSDNode>(N1.getNode())) {
4934 const APInt &C1 = N1C->getAPIntValue();
4935
4936 // (zext x) == C --> x == (trunc C)
4937 // (sext x) == C --> x == (trunc C)
4938 if ((Cond == ISD::SETEQ || Cond == ISD::SETNE) &&
4939 DCI.isBeforeLegalize() && N0->hasOneUse()) {
4940 unsigned MinBits = N0.getValueSizeInBits();
4941 SDValue PreExt;
4942 bool Signed = false;
4943 if (N0->getOpcode() == ISD::ZERO_EXTEND) {
4944 // ZExt
4945 MinBits = N0->getOperand(0).getValueSizeInBits();
4946 PreExt = N0->getOperand(0);
4947 } else if (N0->getOpcode() == ISD::AND) {
4948 // DAGCombine turns costly ZExts into ANDs
4949 if (auto *C = dyn_cast<ConstantSDNode>(N0->getOperand(1)))
4950 if ((C->getAPIntValue()+1).isPowerOf2()) {
4951 MinBits = C->getAPIntValue().countr_one();
4952 PreExt = N0->getOperand(0);
4953 }
4954 } else if (N0->getOpcode() == ISD::SIGN_EXTEND) {
4955 // SExt
4956 MinBits = N0->getOperand(0).getValueSizeInBits();
4957 PreExt = N0->getOperand(0);
4958 Signed = true;
4959 } else if (auto *LN0 = dyn_cast<LoadSDNode>(N0)) {
4960 // ZEXTLOAD / SEXTLOAD
4961 if (LN0->getExtensionType() == ISD::ZEXTLOAD) {
4962 MinBits = LN0->getMemoryVT().getSizeInBits();
4963 PreExt = N0;
4964 } else if (LN0->getExtensionType() == ISD::SEXTLOAD) {
4965 Signed = true;
4966 MinBits = LN0->getMemoryVT().getSizeInBits();
4967 PreExt = N0;
4968 }
4969 }
4970
4971 // Figure out how many bits we need to preserve this constant.
4972 unsigned ReqdBits = Signed ? C1.getSignificantBits() : C1.getActiveBits();
4973
4974 // Make sure we're not losing bits from the constant.
4975 if (MinBits > 0 &&
4976 MinBits < C1.getBitWidth() &&
4977 MinBits >= ReqdBits) {
4978 EVT MinVT = EVT::getIntegerVT(*DAG.getContext(), MinBits);
4979 if (isTypeDesirableForOp(ISD::SETCC, MinVT)) {
4980 // Will get folded away.
4981 SDValue Trunc = DAG.getNode(ISD::TRUNCATE, dl, MinVT, PreExt);
4982 if (MinBits == 1 && C1 == 1)
4983 // Invert the condition.
4984 return DAG.getSetCC(dl, VT, Trunc, DAG.getConstant(0, dl, MVT::i1),
4986 SDValue C = DAG.getConstant(C1.trunc(MinBits), dl, MinVT);
4987 return DAG.getSetCC(dl, VT, Trunc, C, Cond);
4988 }
4989
4990 // If truncating the setcc operands is not desirable, we can still
4991 // simplify the expression in some cases:
4992 // setcc ([sz]ext (setcc x, y, cc)), 0, setne) -> setcc (x, y, cc)
4993 // setcc ([sz]ext (setcc x, y, cc)), 0, seteq) -> setcc (x, y, inv(cc))
4994 // setcc (zext (setcc x, y, cc)), 1, setne) -> setcc (x, y, inv(cc))
4995 // setcc (zext (setcc x, y, cc)), 1, seteq) -> setcc (x, y, cc)
4996 // setcc (sext (setcc x, y, cc)), -1, setne) -> setcc (x, y, inv(cc))
4997 // setcc (sext (setcc x, y, cc)), -1, seteq) -> setcc (x, y, cc)
4998 SDValue TopSetCC = N0->getOperand(0);
4999 unsigned N0Opc = N0->getOpcode();
5000 bool SExt = (N0Opc == ISD::SIGN_EXTEND);
5001 if (TopSetCC.getValueType() == MVT::i1 && VT == MVT::i1 &&
5002 TopSetCC.getOpcode() == ISD::SETCC &&
5003 (N0Opc == ISD::ZERO_EXTEND || N0Opc == ISD::SIGN_EXTEND) &&
5004 (isConstFalseVal(N1) ||
5005 isExtendedTrueVal(N1C, N0->getValueType(0), SExt))) {
5006
5007 bool Inverse = (N1C->isZero() && Cond == ISD::SETEQ) ||
5008 (!N1C->isZero() && Cond == ISD::SETNE);
5009
5010 if (!Inverse)
5011 return TopSetCC;
5012
5014 cast<CondCodeSDNode>(TopSetCC.getOperand(2))->get(),
5015 TopSetCC.getOperand(0).getValueType());
5016 return DAG.getSetCC(dl, VT, TopSetCC.getOperand(0),
5017 TopSetCC.getOperand(1),
5018 InvCond);
5019 }
5020 }
5021 }
5022
5023 // If the LHS is '(and load, const)', the RHS is 0, the test is for
5024 // equality or unsigned, and all 1 bits of the const are in the same
5025 // partial word, see if we can shorten the load.
5026 if (DCI.isBeforeLegalize() &&
5028 N0.getOpcode() == ISD::AND && C1 == 0 &&
5029 N0.getNode()->hasOneUse() &&
5030 isa<LoadSDNode>(N0.getOperand(0)) &&
5031 N0.getOperand(0).getNode()->hasOneUse() &&
5033 auto *Lod = cast<LoadSDNode>(N0.getOperand(0));
5034 APInt bestMask;
5035 unsigned bestWidth = 0, bestOffset = 0;
5036 if (Lod->isSimple() && Lod->isUnindexed() &&
5037 (Lod->getMemoryVT().isByteSized() ||
5038 isPaddedAtMostSignificantBitsWhenStored(Lod->getMemoryVT()))) {
5039 unsigned memWidth = Lod->getMemoryVT().getStoreSizeInBits();
5040 unsigned origWidth = N0.getValueSizeInBits();
5041 unsigned maskWidth = origWidth;
5042 // We can narrow (e.g.) 16-bit extending loads on 32-bit target to
5043 // 8 bits, but have to be careful...
5044 if (Lod->getExtensionType() != ISD::NON_EXTLOAD)
5045 origWidth = Lod->getMemoryVT().getSizeInBits();
5046 const APInt &Mask = N0.getConstantOperandAPInt(1);
5047 // Only consider power-of-2 widths (and at least one byte) as candiates
5048 // for the narrowed load.
5049 for (unsigned width = 8; width < origWidth; width *= 2) {
5050 EVT newVT = EVT::getIntegerVT(*DAG.getContext(), width);
5051 APInt newMask = APInt::getLowBitsSet(maskWidth, width);
5052 // Avoid accessing any padding here for now (we could use memWidth
5053 // instead of origWidth here otherwise).
5054 unsigned maxOffset = origWidth - width;
5055 for (unsigned offset = 0; offset <= maxOffset; offset += 8) {
5056 if (Mask.isSubsetOf(newMask)) {
5057 unsigned ptrOffset =
5058 Layout.isLittleEndian() ? offset : memWidth - width - offset;
5059 unsigned IsFast = 0;
5060 assert((ptrOffset % 8) == 0 && "Non-Bytealigned pointer offset");
5061 Align NewAlign = commonAlignment(Lod->getAlign(), ptrOffset / 8);
5063 ptrOffset / 8) &&
5065 *DAG.getContext(), Layout, newVT, Lod->getAddressSpace(),
5066 NewAlign, Lod->getMemOperand()->getFlags(), &IsFast) &&
5067 IsFast) {
5068 bestOffset = ptrOffset / 8;
5069 bestMask = Mask.lshr(offset);
5070 bestWidth = width;
5071 break;
5072 }
5073 }
5074 newMask <<= 8;
5075 }
5076 if (bestWidth)
5077 break;
5078 }
5079 }
5080 if (bestWidth) {
5081 EVT newVT = EVT::getIntegerVT(*DAG.getContext(), bestWidth);
5082 SDValue Ptr = Lod->getBasePtr();
5083 if (bestOffset != 0)
5084 Ptr = DAG.getObjectPtrOffset(dl, Ptr, TypeSize::getFixed(bestOffset));
5085 SDValue NewLoad =
5086 DAG.getLoad(newVT, dl, Lod->getChain(), Ptr,
5087 Lod->getPointerInfo().getWithOffset(bestOffset),
5088 Lod->getBaseAlign());
5089 SDValue And =
5090 DAG.getNode(ISD::AND, dl, newVT, NewLoad,
5091 DAG.getConstant(bestMask.trunc(bestWidth), dl, newVT));
5092 return DAG.getSetCC(dl, VT, And, DAG.getConstant(0LL, dl, newVT), Cond);
5093 }
5094 }
5095
5096 // If the LHS is a ZERO_EXTEND, perform the comparison on the input.
5097 if (N0.getOpcode() == ISD::ZERO_EXTEND) {
5098 unsigned InSize = N0.getOperand(0).getValueSizeInBits();
5099
5100 // If the comparison constant has bits in the upper part, the
5101 // zero-extended value could never match.
5103 C1.getBitWidth() - InSize))) {
5104 switch (Cond) {
5105 case ISD::SETUGT:
5106 case ISD::SETUGE:
5107 case ISD::SETEQ:
5108 return DAG.getConstant(0, dl, VT);
5109 case ISD::SETULT:
5110 case ISD::SETULE:
5111 case ISD::SETNE:
5112 return DAG.getConstant(1, dl, VT);
5113 case ISD::SETGT:
5114 case ISD::SETGE:
5115 // True if the sign bit of C1 is set.
5116 return DAG.getConstant(C1.isNegative(), dl, VT);
5117 case ISD::SETLT:
5118 case ISD::SETLE:
5119 // True if the sign bit of C1 isn't set.
5120 return DAG.getConstant(C1.isNonNegative(), dl, VT);
5121 default:
5122 break;
5123 }
5124 }
5125
5126 // Otherwise, we can perform the comparison with the low bits.
5127 switch (Cond) {
5128 case ISD::SETEQ:
5129 case ISD::SETNE:
5130 case ISD::SETUGT:
5131 case ISD::SETUGE:
5132 case ISD::SETULT:
5133 case ISD::SETULE: {
5134 EVT newVT = N0.getOperand(0).getValueType();
5135 // FIXME: Should use isNarrowingProfitable.
5136 if (DCI.isBeforeLegalizeOps() ||
5137 (isOperationLegal(ISD::SETCC, newVT) &&
5138 isCondCodeLegal(Cond, newVT.getSimpleVT()) &&
5140 EVT NewSetCCVT = getSetCCResultType(Layout, *DAG.getContext(), newVT);
5141 SDValue NewConst = DAG.getConstant(C1.trunc(InSize), dl, newVT);
5142
5143 SDValue NewSetCC = DAG.getSetCC(dl, NewSetCCVT, N0.getOperand(0),
5144 NewConst, Cond);
5145 return DAG.getBoolExtOrTrunc(NewSetCC, dl, VT, N0.getValueType());
5146 }
5147 break;
5148 }
5149 default:
5150 break; // todo, be more careful with signed comparisons
5151 }
5152 } else if (N0.getOpcode() == ISD::SIGN_EXTEND_INREG &&
5153 (Cond == ISD::SETEQ || Cond == ISD::SETNE) &&
5155 OpVT)) {
5156 EVT ExtSrcTy = cast<VTSDNode>(N0.getOperand(1))->getVT();
5157 unsigned ExtSrcTyBits = ExtSrcTy.getSizeInBits();
5158 EVT ExtDstTy = N0.getValueType();
5159 unsigned ExtDstTyBits = ExtDstTy.getSizeInBits();
5160
5161 // If the constant doesn't fit into the number of bits for the source of
5162 // the sign extension, it is impossible for both sides to be equal.
5163 if (C1.getSignificantBits() > ExtSrcTyBits)
5164 return DAG.getBoolConstant(Cond == ISD::SETNE, dl, VT, OpVT);
5165
5166 assert(ExtDstTy == N0.getOperand(0).getValueType() &&
5167 ExtDstTy != ExtSrcTy && "Unexpected types!");
5168 APInt Imm = APInt::getLowBitsSet(ExtDstTyBits, ExtSrcTyBits);
5169 SDValue ZextOp = DAG.getNode(ISD::AND, dl, ExtDstTy, N0.getOperand(0),
5170 DAG.getConstant(Imm, dl, ExtDstTy));
5171 if (!DCI.isCalledByLegalizer())
5172 DCI.AddToWorklist(ZextOp.getNode());
5173 // Otherwise, make this a use of a zext.
5174 return DAG.getSetCC(dl, VT, ZextOp,
5175 DAG.getConstant(C1 & Imm, dl, ExtDstTy), Cond);
5176 } else if ((N1C->isZero() || N1C->isOne()) &&
5177 (Cond == ISD::SETEQ || Cond == ISD::SETNE)) {
5178 // SETCC (X), [0|1], [EQ|NE] -> X if X is known 0/1. i1 types are
5179 // excluded as they are handled below whilst checking for foldBooleans.
5180 if ((N0.getOpcode() == ISD::SETCC || VT.getScalarType() != MVT::i1) &&
5181 isTypeLegal(VT) && VT.bitsLE(N0.getValueType()) &&
5182 (N0.getValueType() == MVT::i1 ||
5186 bool TrueWhenTrue = (Cond == ISD::SETEQ) ^ (!N1C->isOne());
5187 if (TrueWhenTrue)
5188 return DAG.getNode(ISD::TRUNCATE, dl, VT, N0);
5189 // Invert the condition.
5190 if (N0.getOpcode() == ISD::SETCC) {
5193 if (DCI.isBeforeLegalizeOps() ||
5195 return DAG.getSetCC(dl, VT, N0.getOperand(0), N0.getOperand(1), CC);
5196 }
5197 }
5198
5199 if ((N0.getOpcode() == ISD::XOR ||
5200 (N0.getOpcode() == ISD::AND &&
5201 N0.getOperand(0).getOpcode() == ISD::XOR &&
5202 N0.getOperand(1) == N0.getOperand(0).getOperand(1))) &&
5203 isOneConstant(N0.getOperand(1))) {
5204 // If this is (X^1) == 0/1, swap the RHS and eliminate the xor. We
5205 // can only do this if the top bits are known zero.
5206 unsigned BitWidth = N0.getValueSizeInBits();
5207 if (DAG.MaskedValueIsZero(N0,
5209 BitWidth-1))) {
5210 // Okay, get the un-inverted input value.
5211 SDValue Val;
5212 if (N0.getOpcode() == ISD::XOR) {
5213 Val = N0.getOperand(0);
5214 } else {
5215 assert(N0.getOpcode() == ISD::AND &&
5216 N0.getOperand(0).getOpcode() == ISD::XOR);
5217 // ((X^1)&1)^1 -> X & 1
5218 Val = DAG.getNode(ISD::AND, dl, N0.getValueType(),
5219 N0.getOperand(0).getOperand(0),
5220 N0.getOperand(1));
5221 }
5222
5223 return DAG.getSetCC(dl, VT, Val, N1,
5225 }
5226 } else if (N1C->isOne()) {
5227 SDValue Op0 = N0;
5228 if (Op0.getOpcode() == ISD::TRUNCATE)
5229 Op0 = Op0.getOperand(0);
5230
5231 if ((Op0.getOpcode() == ISD::XOR) &&
5232 Op0.getOperand(0).getOpcode() == ISD::SETCC &&
5233 Op0.getOperand(1).getOpcode() == ISD::SETCC) {
5234 SDValue XorLHS = Op0.getOperand(0);
5235 SDValue XorRHS = Op0.getOperand(1);
5236 // Ensure that the input setccs return an i1 type or 0/1 value.
5237 if (Op0.getValueType() == MVT::i1 ||
5242 // (xor (setcc), (setcc)) == / != 1 -> (setcc) != / == (setcc)
5244 return DAG.getSetCC(dl, VT, XorLHS, XorRHS, Cond);
5245 }
5246 }
5247 if (Op0.getOpcode() == ISD::AND && isOneConstant(Op0.getOperand(1))) {
5248 // If this is (X&1) == / != 1, normalize it to (X&1) != / == 0.
5249 if (Op0.getValueType().bitsGT(VT))
5250 Op0 = DAG.getNode(ISD::AND, dl, VT,
5251 DAG.getNode(ISD::TRUNCATE, dl, VT, Op0.getOperand(0)),
5252 DAG.getConstant(1, dl, VT));
5253 else if (Op0.getValueType().bitsLT(VT))
5254 Op0 = DAG.getNode(ISD::AND, dl, VT,
5255 DAG.getNode(ISD::ANY_EXTEND, dl, VT, Op0.getOperand(0)),
5256 DAG.getConstant(1, dl, VT));
5257
5258 return DAG.getSetCC(dl, VT, Op0,
5259 DAG.getConstant(0, dl, Op0.getValueType()),
5261 }
5262 if (Op0.getOpcode() == ISD::AssertZext &&
5263 cast<VTSDNode>(Op0.getOperand(1))->getVT() == MVT::i1)
5264 return DAG.getSetCC(dl, VT, Op0,
5265 DAG.getConstant(0, dl, Op0.getValueType()),
5267 }
5268 }
5269
5270 // Given:
5271 // icmp eq/ne (urem %x, %y), 0
5272 // Iff %x has 0 or 1 bits set, and %y has at least 2 bits set, omit 'urem':
5273 // icmp eq/ne %x, 0
5274 if (N0.getOpcode() == ISD::UREM && N1C->isZero() &&
5275 (Cond == ISD::SETEQ || Cond == ISD::SETNE)) {
5276 KnownBits XKnown = DAG.computeKnownBits(N0.getOperand(0));
5277 KnownBits YKnown = DAG.computeKnownBits(N0.getOperand(1));
5278 if (XKnown.countMaxPopulation() == 1 && YKnown.countMinPopulation() >= 2)
5279 return DAG.getSetCC(dl, VT, N0.getOperand(0), N1, Cond);
5280 }
5281
5282 // Fold set_cc seteq (ashr X, BW-1), -1 -> set_cc setlt X, 0
5283 // and set_cc setne (ashr X, BW-1), -1 -> set_cc setge X, 0
5284 if ((Cond == ISD::SETEQ || Cond == ISD::SETNE) &&
5286 N0.getConstantOperandAPInt(1) == OpVT.getScalarSizeInBits() - 1 &&
5287 N1C->isAllOnes()) {
5288 return DAG.getSetCC(dl, VT, N0.getOperand(0),
5289 DAG.getConstant(0, dl, OpVT),
5291 }
5292
5293 // fold (setcc (trunc x) c) -> (setcc x c)
5294 if (N0.getOpcode() == ISD::TRUNCATE &&
5296 (N0->getFlags().hasNoSignedWrap() &&
5299 EVT NewVT = N0.getOperand(0).getValueType();
5300 SDValue NewConst = DAG.getConstant(
5302 ? C1.sext(NewVT.getSizeInBits())
5303 : C1.zext(NewVT.getSizeInBits()),
5304 dl, NewVT);
5305 return DAG.getSetCC(dl, VT, N0.getOperand(0), NewConst, Cond);
5306 }
5307
5308 if (SDValue V =
5309 optimizeSetCCOfSignedTruncationCheck(VT, N0, N1, Cond, DCI, dl))
5310 return V;
5311 }
5312
5313 // These simplifications apply to splat vectors as well.
5314 // TODO: Handle more splat vector cases.
5315 if (auto *N1C = isConstOrConstSplat(N1)) {
5316 const APInt &C1 = N1C->getAPIntValue();
5317
5318 APInt MinVal, MaxVal;
5319 unsigned OperandBitSize = N1C->getValueType(0).getScalarSizeInBits();
5321 MinVal = APInt::getSignedMinValue(OperandBitSize);
5322 MaxVal = APInt::getSignedMaxValue(OperandBitSize);
5323 } else {
5324 MinVal = APInt::getMinValue(OperandBitSize);
5325 MaxVal = APInt::getMaxValue(OperandBitSize);
5326 }
5327
5328 // Canonicalize GE/LE comparisons to use GT/LT comparisons.
5329 if (Cond == ISD::SETGE || Cond == ISD::SETUGE) {
5330 // X >= MIN --> true
5331 if (C1 == MinVal)
5332 return DAG.getBoolConstant(true, dl, VT, OpVT);
5333
5334 if (!VT.isVector()) { // TODO: Support this for vectors.
5335 // X >= C0 --> X > (C0 - 1)
5336 APInt C = C1 - 1;
5338 if ((DCI.isBeforeLegalizeOps() ||
5339 isCondCodeLegal(NewCC, OpVT.getSimpleVT())) &&
5340 (!N1C->isOpaque() || (C.getBitWidth() <= 64 &&
5341 isLegalICmpImmediate(C.getSExtValue())))) {
5342 return DAG.getSetCC(dl, VT, N0,
5343 DAG.getConstant(C, dl, N1.getValueType()),
5344 NewCC);
5345 }
5346 }
5347 }
5348
5349 if (Cond == ISD::SETLE || Cond == ISD::SETULE) {
5350 // X <= MAX --> true
5351 if (C1 == MaxVal)
5352 return DAG.getBoolConstant(true, dl, VT, OpVT);
5353
5354 // X <= C0 --> X < (C0 + 1)
5355 if (!VT.isVector()) { // TODO: Support this for vectors.
5356 APInt C = C1 + 1;
5358 if ((DCI.isBeforeLegalizeOps() ||
5359 isCondCodeLegal(NewCC, OpVT.getSimpleVT())) &&
5360 (!N1C->isOpaque() || (C.getBitWidth() <= 64 &&
5361 isLegalICmpImmediate(C.getSExtValue())))) {
5362 return DAG.getSetCC(dl, VT, N0,
5363 DAG.getConstant(C, dl, N1.getValueType()),
5364 NewCC);
5365 }
5366 }
5367 }
5368
5369 if (Cond == ISD::SETLT || Cond == ISD::SETULT) {
5370 if (C1 == MinVal)
5371 return DAG.getBoolConstant(false, dl, VT, OpVT); // X < MIN --> false
5372
5373 // TODO: Support this for vectors after legalize ops.
5374 if (!VT.isVector() || DCI.isBeforeLegalizeOps()) {
5375 // Canonicalize setlt X, Max --> setne X, Max
5376 if (C1 == MaxVal)
5377 return DAG.getSetCC(dl, VT, N0, N1, ISD::SETNE);
5378
5379 // If we have setult X, 1, turn it into seteq X, 0
5380 if (C1 == MinVal+1)
5381 return DAG.getSetCC(dl, VT, N0,
5382 DAG.getConstant(MinVal, dl, N0.getValueType()),
5383 ISD::SETEQ);
5384 }
5385 }
5386
5387 if (Cond == ISD::SETGT || Cond == ISD::SETUGT) {
5388 if (C1 == MaxVal)
5389 return DAG.getBoolConstant(false, dl, VT, OpVT); // X > MAX --> false
5390
5391 // TODO: Support this for vectors after legalize ops.
5392 if (!VT.isVector() || DCI.isBeforeLegalizeOps()) {
5393 // Canonicalize setgt X, Min --> setne X, Min
5394 if (C1 == MinVal)
5395 return DAG.getSetCC(dl, VT, N0, N1, ISD::SETNE);
5396
5397 // If we have setugt X, Max-1, turn it into seteq X, Max
5398 if (C1 == MaxVal-1)
5399 return DAG.getSetCC(dl, VT, N0,
5400 DAG.getConstant(MaxVal, dl, N0.getValueType()),
5401 ISD::SETEQ);
5402 }
5403 }
5404
5405 if (Cond == ISD::SETEQ || Cond == ISD::SETNE) {
5406 // (X & (C l>>/<< Y)) ==/!= 0 --> ((X <</l>> Y) & C) ==/!= 0
5407 if (C1.isZero())
5408 if (SDValue CC = optimizeSetCCByHoistingAndByConstFromLogicalShift(
5409 VT, N0, N1, Cond, DCI, dl))
5410 return CC;
5411
5412 // For all/any comparisons, replace or(x,shl(y,bw/2)) with and/or(x,y).
5413 // For example, when high 32-bits of i64 X are known clear:
5414 // all bits clear: (X | (Y<<32)) == 0 --> (X | Y) == 0
5415 // all bits set: (X | (Y<<32)) == -1 --> (X & Y) == -1
5416 bool CmpZero = N1C->isZero();
5417 bool CmpNegOne = N1C->isAllOnes();
5418 if ((CmpZero || CmpNegOne) && N0.hasOneUse()) {
5419 // Match or(lo,shl(hi,bw/2)) pattern.
5420 auto IsConcat = [&](SDValue V, SDValue &Lo, SDValue &Hi) {
5421 unsigned EltBits = V.getScalarValueSizeInBits();
5422 if (V.getOpcode() != ISD::OR || (EltBits % 2) != 0)
5423 return false;
5424 SDValue LHS = V.getOperand(0);
5425 SDValue RHS = V.getOperand(1);
5426 APInt HiBits = APInt::getHighBitsSet(EltBits, EltBits / 2);
5427 // Unshifted element must have zero upperbits.
5428 if (RHS.getOpcode() == ISD::SHL &&
5429 isa<ConstantSDNode>(RHS.getOperand(1)) &&
5430 RHS.getConstantOperandAPInt(1) == (EltBits / 2) &&
5431 DAG.MaskedValueIsZero(LHS, HiBits)) {
5432 Lo = LHS;
5433 Hi = RHS.getOperand(0);
5434 return true;
5435 }
5436 if (LHS.getOpcode() == ISD::SHL &&
5437 isa<ConstantSDNode>(LHS.getOperand(1)) &&
5438 LHS.getConstantOperandAPInt(1) == (EltBits / 2) &&
5439 DAG.MaskedValueIsZero(RHS, HiBits)) {
5440 Lo = RHS;
5441 Hi = LHS.getOperand(0);
5442 return true;
5443 }
5444 return false;
5445 };
5446
5447 auto MergeConcat = [&](SDValue Lo, SDValue Hi) {
5448 unsigned EltBits = N0.getScalarValueSizeInBits();
5449 unsigned HalfBits = EltBits / 2;
5450 APInt HiBits = APInt::getHighBitsSet(EltBits, HalfBits);
5451 SDValue LoBits = DAG.getConstant(~HiBits, dl, OpVT);
5452 SDValue HiMask = DAG.getNode(ISD::AND, dl, OpVT, Hi, LoBits);
5453 SDValue NewN0 =
5454 DAG.getNode(CmpZero ? ISD::OR : ISD::AND, dl, OpVT, Lo, HiMask);
5455 SDValue NewN1 = CmpZero ? DAG.getConstant(0, dl, OpVT) : LoBits;
5456 return DAG.getSetCC(dl, VT, NewN0, NewN1, Cond);
5457 };
5458
5459 SDValue Lo, Hi;
5460 if (IsConcat(N0, Lo, Hi))
5461 return MergeConcat(Lo, Hi);
5462
5463 if (N0.getOpcode() == ISD::AND || N0.getOpcode() == ISD::OR) {
5464 SDValue Lo0, Lo1, Hi0, Hi1;
5465 if (IsConcat(N0.getOperand(0), Lo0, Hi0) &&
5466 IsConcat(N0.getOperand(1), Lo1, Hi1)) {
5467 return MergeConcat(DAG.getNode(N0.getOpcode(), dl, OpVT, Lo0, Lo1),
5468 DAG.getNode(N0.getOpcode(), dl, OpVT, Hi0, Hi1));
5469 }
5470 }
5471 }
5472 }
5473
5474 // If we have "setcc X, C0", check to see if we can shrink the immediate
5475 // by changing cc.
5476 // TODO: Support this for vectors after legalize ops.
5477 if (!VT.isVector() || DCI.isBeforeLegalizeOps()) {
5478 // SETUGT X, SINTMAX -> SETLT X, 0
5479 // SETUGE X, SINTMIN -> SETLT X, 0
5480 if ((Cond == ISD::SETUGT && C1.isMaxSignedValue()) ||
5481 (Cond == ISD::SETUGE && C1.isMinSignedValue()))
5482 return DAG.getSetCC(dl, VT, N0,
5483 DAG.getConstant(0, dl, N1.getValueType()),
5484 ISD::SETLT);
5485
5486 // SETULT X, SINTMIN -> SETGT X, -1
5487 // SETULE X, SINTMAX -> SETGT X, -1
5488 if ((Cond == ISD::SETULT && C1.isMinSignedValue()) ||
5489 (Cond == ISD::SETULE && C1.isMaxSignedValue()))
5490 return DAG.getSetCC(dl, VT, N0,
5491 DAG.getAllOnesConstant(dl, N1.getValueType()),
5492 ISD::SETGT);
5493 }
5494 }
5495
5496 // Back to non-vector simplifications.
5497 // TODO: Can we do these for vector splats?
5498 if (auto *N1C = dyn_cast<ConstantSDNode>(N1.getNode())) {
5499 const APInt &C1 = N1C->getAPIntValue();
5500 EVT ShValTy = N0.getValueType();
5501
5502 // Fold bit comparisons when we can. This will result in an
5503 // incorrect value when boolean false is negative one, unless
5504 // the bitsize is 1 in which case the false value is the same
5505 // in practice regardless of the representation.
5506 if ((VT.getSizeInBits() == 1 ||
5508 (Cond == ISD::SETEQ || Cond == ISD::SETNE) &&
5509 (VT == ShValTy || (isTypeLegal(VT) && VT.bitsLE(ShValTy))) &&
5510 N0.getOpcode() == ISD::AND) {
5511 if (auto *AndRHS = dyn_cast<ConstantSDNode>(N0.getOperand(1))) {
5512 if (Cond == ISD::SETNE && C1 == 0) {// (X & 8) != 0 --> (X & 8) >> 3
5513 // Perform the xform if the AND RHS is a single bit.
5514 unsigned ShCt = AndRHS->getAPIntValue().logBase2();
5515 if (AndRHS->getAPIntValue().isPowerOf2() &&
5516 !shouldAvoidTransformToShift(ShValTy, ShCt)) {
5517 return DAG.getNode(
5518 ISD::TRUNCATE, dl, VT,
5519 DAG.getNode(ISD::SRL, dl, ShValTy, N0,
5520 DAG.getShiftAmountConstant(ShCt, ShValTy, dl)));
5521 }
5522 } else if (Cond == ISD::SETEQ && C1 == AndRHS->getAPIntValue()) {
5523 // (X & 8) == 8 --> (X & 8) >> 3
5524 // Perform the xform if C1 is a single bit.
5525 unsigned ShCt = C1.logBase2();
5526 if (C1.isPowerOf2() && !shouldAvoidTransformToShift(ShValTy, ShCt)) {
5527 return DAG.getNode(
5528 ISD::TRUNCATE, dl, VT,
5529 DAG.getNode(ISD::SRL, dl, ShValTy, N0,
5530 DAG.getShiftAmountConstant(ShCt, ShValTy, dl)));
5531 }
5532 }
5533 }
5534 }
5535
5536 if (C1.getSignificantBits() <= 64 &&
5538 // (X & -256) == 256 -> (X >> 8) == 1
5539 if ((Cond == ISD::SETEQ || Cond == ISD::SETNE) &&
5540 N0.getOpcode() == ISD::AND && N0.hasOneUse()) {
5541 if (auto *AndRHS = dyn_cast<ConstantSDNode>(N0.getOperand(1))) {
5542 const APInt &AndRHSC = AndRHS->getAPIntValue();
5543 if (AndRHSC.isNegatedPowerOf2() && C1.isSubsetOf(AndRHSC)) {
5544 unsigned ShiftBits = AndRHSC.countr_zero();
5545 if (!shouldAvoidTransformToShift(ShValTy, ShiftBits)) {
5546 // If using an unsigned shift doesn't yield a legal compare
5547 // immediate, try using sra instead.
5548 APInt NewC = C1.lshr(ShiftBits);
5549 if (NewC.getSignificantBits() <= 64 &&
5551 APInt SignedC = C1.ashr(ShiftBits);
5552 if (SignedC.getSignificantBits() <= 64 &&
5554 SDValue Shift = DAG.getNode(
5555 ISD::SRA, dl, ShValTy, N0.getOperand(0),
5556 DAG.getShiftAmountConstant(ShiftBits, ShValTy, dl));
5557 SDValue CmpRHS = DAG.getConstant(SignedC, dl, ShValTy);
5558 return DAG.getSetCC(dl, VT, Shift, CmpRHS, Cond);
5559 }
5560 }
5561 SDValue Shift = DAG.getNode(
5562 ISD::SRL, dl, ShValTy, N0.getOperand(0),
5563 DAG.getShiftAmountConstant(ShiftBits, ShValTy, dl));
5564 SDValue CmpRHS = DAG.getConstant(NewC, dl, ShValTy);
5565 return DAG.getSetCC(dl, VT, Shift, CmpRHS, Cond);
5566 }
5567 }
5568 }
5569 } else if (Cond == ISD::SETULT || Cond == ISD::SETUGE ||
5570 Cond == ISD::SETULE || Cond == ISD::SETUGT) {
5571 bool AdjOne = (Cond == ISD::SETULE || Cond == ISD::SETUGT);
5572 // X < 0x100000000 -> (X >> 32) < 1
5573 // X >= 0x100000000 -> (X >> 32) >= 1
5574 // X <= 0x0ffffffff -> (X >> 32) < 1
5575 // X > 0x0ffffffff -> (X >> 32) >= 1
5576 unsigned ShiftBits;
5577 APInt NewC = C1;
5578 ISD::CondCode NewCond = Cond;
5579 if (AdjOne) {
5580 ShiftBits = C1.countr_one();
5581 NewC = NewC + 1;
5582 NewCond = (Cond == ISD::SETULE) ? ISD::SETULT : ISD::SETUGE;
5583 } else {
5584 ShiftBits = C1.countr_zero();
5585 }
5586 APInt RangeWidth = NewC;
5587 NewC.lshrInPlace(ShiftBits);
5588 if (ShiftBits && NewC.getSignificantBits() <= 64 &&
5590 !shouldAvoidTransformToShift(ShValTy, ShiftBits)) {
5591 // If this is an offset range check, try to move the offset after the
5592 // shift to avoid preserving the pre-shift add with a mask.
5593 if (N0.getOpcode() == ISD::ADD && N0.hasOneUse()) {
5594 if (auto *AddC = isConstOrConstSplat(N0.getOperand(1))) {
5595 const APInt &AddVal = AddC->getAPIntValue();
5596 if (AddVal.countr_zero() >= ShiftBits) {
5597 APInt RangeLower = -AddVal;
5598 bool Overflow;
5599 (void)RangeLower.uadd_ov(RangeWidth, Overflow);
5600 if (!RangeWidth.isZero() && !Overflow) {
5601 SDValue Shift = DAG.getNode(
5602 ISD::SRL, dl, ShValTy, N0.getOperand(0),
5603 DAG.getShiftAmountConstant(ShiftBits, ShValTy, dl));
5604 APInt Offset = -RangeLower.lshr(ShiftBits);
5605 SDValue ShiftedAdd =
5606 DAG.getNode(ISD::ADD, dl, ShValTy, Shift,
5607 DAG.getConstant(Offset, dl, ShValTy));
5608 SDValue CmpRHS = DAG.getConstant(NewC, dl, ShValTy);
5609 return DAG.getSetCC(dl, VT, ShiftedAdd, CmpRHS, NewCond);
5610 }
5611 }
5612 }
5613 }
5614 SDValue Shift =
5615 DAG.getNode(ISD::SRL, dl, ShValTy, N0,
5616 DAG.getShiftAmountConstant(ShiftBits, ShValTy, dl));
5617 SDValue CmpRHS = DAG.getConstant(NewC, dl, ShValTy);
5618 return DAG.getSetCC(dl, VT, Shift, CmpRHS, NewCond);
5619 }
5620 }
5621 }
5622 }
5623
5625 auto *CFP = cast<ConstantFPSDNode>(N1);
5626 assert(!CFP->getValueAPF().isNaN() && "Unexpected NaN value");
5627
5628 // Otherwise, we know the RHS is not a NaN. Simplify the node to drop the
5629 // constant if knowing that the operand is non-nan is enough. We prefer to
5630 // have SETO(x,x) instead of SETO(x, 0.0) because this avoids having to
5631 // materialize 0.0.
5632 if (Cond == ISD::SETO || Cond == ISD::SETUO)
5633 return DAG.getSetCC(dl, VT, N0, N0, Cond);
5634
5635 // setcc (fneg x), C -> setcc swap(pred) x, -C
5636 if (N0.getOpcode() == ISD::FNEG) {
5638 if (DCI.isBeforeLegalizeOps() ||
5639 isCondCodeLegal(SwapCond, N0.getSimpleValueType())) {
5640 SDValue NegN1 = DAG.getNode(ISD::FNEG, dl, N0.getValueType(), N1);
5641 return DAG.getSetCC(dl, VT, N0.getOperand(0), NegN1, SwapCond);
5642 }
5643 }
5644
5645 // setueq/setoeq X, (fabs Inf) -> is_fpclass X, fcInf
5647 !isFPImmLegal(CFP->getValueAPF(), CFP->getValueType(0))) {
5648 bool IsFabs = N0.getOpcode() == ISD::FABS;
5649 SDValue Op = IsFabs ? N0.getOperand(0) : N0;
5650 if ((Cond == ISD::SETOEQ || Cond == ISD::SETUEQ) && CFP->isInfinity()) {
5651 FPClassTest Flag = CFP->isNegative() ? (IsFabs ? fcNone : fcNegInf)
5652 : (IsFabs ? fcInf : fcPosInf);
5653 if (Cond == ISD::SETUEQ)
5654 Flag |= fcNan;
5655 return DAG.getNode(ISD::IS_FPCLASS, dl, VT, Op,
5656 DAG.getTargetConstant(Flag, dl, MVT::i32));
5657 }
5658 }
5659
5660 // If the condition is not legal, see if we can find an equivalent one
5661 // which is legal.
5663 // If the comparison was an awkward floating-point == or != and one of
5664 // the comparison operands is infinity or negative infinity, convert the
5665 // condition to a less-awkward <= or >=.
5666 if (CFP->getValueAPF().isInfinity()) {
5667 bool IsNegInf = CFP->getValueAPF().isNegative();
5669 switch (Cond) {
5670 case ISD::SETOEQ: NewCond = IsNegInf ? ISD::SETOLE : ISD::SETOGE; break;
5671 case ISD::SETUEQ: NewCond = IsNegInf ? ISD::SETULE : ISD::SETUGE; break;
5672 case ISD::SETUNE: NewCond = IsNegInf ? ISD::SETUGT : ISD::SETULT; break;
5673 case ISD::SETONE: NewCond = IsNegInf ? ISD::SETOGT : ISD::SETOLT; break;
5674 default: break;
5675 }
5676 if (NewCond != ISD::SETCC_INVALID &&
5677 isCondCodeLegal(NewCond, N0.getSimpleValueType()))
5678 return DAG.getSetCC(dl, VT, N0, N1, NewCond);
5679 }
5680 }
5681 }
5682
5683 if (N0 == N1) {
5684 // The sext(setcc()) => setcc() optimization relies on the appropriate
5685 // constant being emitted.
5686 assert(!N0.getValueType().isInteger() &&
5687 "Integer types should be handled by FoldSetCC");
5688
5689 bool EqTrue = ISD::isTrueWhenEqual(Cond);
5690 unsigned UOF = ISD::getUnorderedFlavor(Cond);
5691 if (UOF == 2) // FP operators that are undefined on NaNs.
5692 return DAG.getBoolConstant(EqTrue, dl, VT, OpVT);
5693 if (UOF == unsigned(EqTrue))
5694 return DAG.getBoolConstant(EqTrue, dl, VT, OpVT);
5695 // Otherwise, we can't fold it. However, we can simplify it to SETUO/SETO
5696 // if it is not already.
5697 ISD::CondCode NewCond = UOF == 0 ? ISD::SETO : ISD::SETUO;
5698 if (NewCond != Cond &&
5699 (DCI.isBeforeLegalizeOps() ||
5700 isCondCodeLegal(NewCond, N0.getSimpleValueType())))
5701 return DAG.getSetCC(dl, VT, N0, N1, NewCond);
5702 }
5703
5704 // ~X > ~Y --> Y > X
5705 // ~X < ~Y --> Y < X
5706 // ~X < C --> X > ~C
5707 // ~X > C --> X < ~C
5708 if ((isSignedIntSetCC(Cond) || isUnsignedIntSetCC(Cond)) &&
5709 N0.getValueType().isInteger()) {
5710 if (isBitwiseNot(N0)) {
5711 if (isBitwiseNot(N1))
5712 return DAG.getSetCC(dl, VT, N1.getOperand(0), N0.getOperand(0), Cond);
5713
5716 SDValue Not = DAG.getNOT(dl, N1, OpVT);
5717 return DAG.getSetCC(dl, VT, Not, N0.getOperand(0), Cond);
5718 }
5719 }
5720 }
5721
5722 if ((Cond == ISD::SETEQ || Cond == ISD::SETNE) &&
5723 N0.getValueType().isInteger()) {
5724 if (N0.getOpcode() == ISD::ADD || N0.getOpcode() == ISD::SUB ||
5725 N0.getOpcode() == ISD::XOR) {
5726 // Simplify (X+Y) == (X+Z) --> Y == Z
5727 if (N0.getOpcode() == N1.getOpcode()) {
5728 if (N0.getOperand(0) == N1.getOperand(0))
5729 return DAG.getSetCC(dl, VT, N0.getOperand(1), N1.getOperand(1), Cond);
5730 if (N0.getOperand(1) == N1.getOperand(1))
5731 return DAG.getSetCC(dl, VT, N0.getOperand(0), N1.getOperand(0), Cond);
5732 if (isCommutativeBinOp(N0.getOpcode())) {
5733 // If X op Y == Y op X, try other combinations.
5734 if (N0.getOperand(0) == N1.getOperand(1))
5735 return DAG.getSetCC(dl, VT, N0.getOperand(1), N1.getOperand(0),
5736 Cond);
5737 if (N0.getOperand(1) == N1.getOperand(0))
5738 return DAG.getSetCC(dl, VT, N0.getOperand(0), N1.getOperand(1),
5739 Cond);
5740 }
5741 }
5742
5743 // If RHS is a legal immediate value for a compare instruction, we need
5744 // to be careful about increasing register pressure needlessly.
5745 bool LegalRHSImm = false;
5746
5747 if (auto *RHSC = dyn_cast<ConstantSDNode>(N1)) {
5748 if (auto *LHSR = dyn_cast<ConstantSDNode>(N0.getOperand(1))) {
5749 // Turn (X+C1) == C2 --> X == C2-C1
5750 if (N0.getOpcode() == ISD::ADD && N0.getNode()->hasOneUse())
5751 return DAG.getSetCC(
5752 dl, VT, N0.getOperand(0),
5753 DAG.getConstant(RHSC->getAPIntValue() - LHSR->getAPIntValue(),
5754 dl, N0.getValueType()),
5755 Cond);
5756
5757 // Turn (X^C1) == C2 --> X == C1^C2
5758 if (N0.getOpcode() == ISD::XOR && N0.getNode()->hasOneUse())
5759 return DAG.getSetCC(
5760 dl, VT, N0.getOperand(0),
5761 DAG.getConstant(LHSR->getAPIntValue() ^ RHSC->getAPIntValue(),
5762 dl, N0.getValueType()),
5763 Cond);
5764 }
5765
5766 // Turn (C1-X) == C2 --> X == C1-C2
5767 if (auto *SUBC = dyn_cast<ConstantSDNode>(N0.getOperand(0)))
5768 if (N0.getOpcode() == ISD::SUB && N0.getNode()->hasOneUse())
5769 return DAG.getSetCC(
5770 dl, VT, N0.getOperand(1),
5771 DAG.getConstant(SUBC->getAPIntValue() - RHSC->getAPIntValue(),
5772 dl, N0.getValueType()),
5773 Cond);
5774
5775 // Could RHSC fold directly into a compare?
5776 if (RHSC->getValueType(0).getSizeInBits() <= 64)
5777 LegalRHSImm = isLegalICmpImmediate(RHSC->getSExtValue());
5778 }
5779
5780 // (X+Y) == X --> Y == 0 and similar folds.
5781 // Don't do this if X is an immediate that can fold into a cmp
5782 // instruction and X+Y has other uses. It could be an induction variable
5783 // chain, and the transform would increase register pressure.
5784 if (!LegalRHSImm || N0.hasOneUse())
5785 if (SDValue V = foldSetCCWithBinOp(VT, N0, N1, Cond, dl, DCI))
5786 return V;
5787 }
5788
5789 if (N1.getOpcode() == ISD::ADD || N1.getOpcode() == ISD::SUB ||
5790 N1.getOpcode() == ISD::XOR)
5791 if (SDValue V = foldSetCCWithBinOp(VT, N1, N0, Cond, dl, DCI))
5792 return V;
5793
5794 if (SDValue V = foldSetCCWithAnd(VT, N0, N1, Cond, dl, DCI))
5795 return V;
5796
5797 if (SDValue V = foldSetCCWithOr(VT, N0, N1, Cond, dl, DCI))
5798 return V;
5799 }
5800
5801 // Fold remainder of division by a constant.
5802 if ((N0.getOpcode() == ISD::UREM || N0.getOpcode() == ISD::SREM) &&
5803 N0.hasOneUse() && (Cond == ISD::SETEQ || Cond == ISD::SETNE)) {
5804 // When division is cheap or optimizing for minimum size,
5805 // fall through to DIVREM creation by skipping this fold.
5806 if (!isIntDivCheap(VT, Attr) && !Attr.hasFnAttr(Attribute::MinSize)) {
5807 if (N0.getOpcode() == ISD::UREM) {
5808 if (SDValue Folded = buildUREMEqFold(VT, N0, N1, Cond, DCI, dl))
5809 return Folded;
5810 } else if (N0.getOpcode() == ISD::SREM) {
5811 if (SDValue Folded = buildSREMEqFold(VT, N0, N1, Cond, DCI, dl))
5812 return Folded;
5813 }
5814 }
5815 }
5816
5817 // Fold away ALL boolean setcc's.
5818 if (N0.getValueType().getScalarType() == MVT::i1 && foldBooleans) {
5819 SDValue Temp;
5820 switch (Cond) {
5821 default: llvm_unreachable("Unknown integer setcc!");
5822 case ISD::SETEQ: // X == Y -> ~(X^Y)
5823 Temp = DAG.getNode(ISD::XOR, dl, OpVT, N0, N1);
5824 N0 = DAG.getNOT(dl, Temp, OpVT);
5825 if (!DCI.isCalledByLegalizer())
5826 DCI.AddToWorklist(Temp.getNode());
5827 break;
5828 case ISD::SETNE: // X != Y --> (X^Y)
5829 N0 = DAG.getNode(ISD::XOR, dl, OpVT, N0, N1);
5830 break;
5831 case ISD::SETGT: // X >s Y --> X == 0 & Y == 1 --> ~X & Y
5832 case ISD::SETULT: // X <u Y --> X == 0 & Y == 1 --> ~X & Y
5833 Temp = DAG.getNOT(dl, N0, OpVT);
5834 N0 = DAG.getNode(ISD::AND, dl, OpVT, N1, Temp);
5835 if (!DCI.isCalledByLegalizer())
5836 DCI.AddToWorklist(Temp.getNode());
5837 break;
5838 case ISD::SETLT: // X <s Y --> X == 1 & Y == 0 --> ~Y & X
5839 case ISD::SETUGT: // X >u Y --> X == 1 & Y == 0 --> ~Y & X
5840 Temp = DAG.getNOT(dl, N1, OpVT);
5841 N0 = DAG.getNode(ISD::AND, dl, OpVT, N0, Temp);
5842 if (!DCI.isCalledByLegalizer())
5843 DCI.AddToWorklist(Temp.getNode());
5844 break;
5845 case ISD::SETULE: // X <=u Y --> X == 0 | Y == 1 --> ~X | Y
5846 case ISD::SETGE: // X >=s Y --> X == 0 | Y == 1 --> ~X | Y
5847 Temp = DAG.getNOT(dl, N0, OpVT);
5848 N0 = DAG.getNode(ISD::OR, dl, OpVT, N1, Temp);
5849 if (!DCI.isCalledByLegalizer())
5850 DCI.AddToWorklist(Temp.getNode());
5851 break;
5852 case ISD::SETUGE: // X >=u Y --> X == 1 | Y == 0 --> ~Y | X
5853 case ISD::SETLE: // X <=s Y --> X == 1 | Y == 0 --> ~Y | X
5854 Temp = DAG.getNOT(dl, N1, OpVT);
5855 N0 = DAG.getNode(ISD::OR, dl, OpVT, N0, Temp);
5856 break;
5857 }
5858 if (VT.getScalarType() != MVT::i1) {
5859 if (!DCI.isCalledByLegalizer())
5860 DCI.AddToWorklist(N0.getNode());
5861 // FIXME: If running after legalize, we probably can't do this.
5863 N0 = DAG.getNode(ExtendCode, dl, VT, N0);
5864 }
5865 return N0;
5866 }
5867
5868 // Fold (setcc (trunc x) (trunc y)) -> (setcc x y)
5869 if (N0.getOpcode() == ISD::TRUNCATE && N1.getOpcode() == ISD::TRUNCATE &&
5870 N0.getOperand(0).getValueType() == N1.getOperand(0).getValueType() &&
5872 N1->getFlags().hasNoUnsignedWrap()) ||
5874 N1->getFlags().hasNoSignedWrap())) &&
5876 return DAG.getSetCC(dl, VT, N0.getOperand(0), N1.getOperand(0), Cond);
5877 }
5878
5879 // Fold (setcc (sub nsw a, b), zero, s??) -> (setcc a, b, s??)
5880 // TODO: Remove that .isVector() check
5881 if (VT.isVector() && isZeroOrZeroSplat(N1) && N0.getOpcode() == ISD::SUB &&
5883 return DAG.getSetCC(dl, VT, N0.getOperand(0), N0.getOperand(1), Cond);
5884 }
5885
5886 // Could not fold it.
5887 return SDValue();
5888}
5889
5890/// Returns true (and the GlobalValue and the offset) if the node is a
5891/// GlobalAddress + offset.
5893 int64_t &Offset) const {
5894
5895 SDNode *N = unwrapAddress(SDValue(WN, 0)).getNode();
5896
5897 if (auto *GASD = dyn_cast<GlobalAddressSDNode>(N)) {
5898 GA = GASD->getGlobal();
5899 Offset += GASD->getOffset();
5900 return true;
5901 }
5902
5903 if (N->isAnyAdd()) {
5904 SDValue N1 = N->getOperand(0);
5905 SDValue N2 = N->getOperand(1);
5906 if (isGAPlusOffset(N1.getNode(), GA, Offset)) {
5907 if (auto *V = dyn_cast<ConstantSDNode>(N2)) {
5908 Offset += V->getSExtValue();
5909 return true;
5910 }
5911 } else if (isGAPlusOffset(N2.getNode(), GA, Offset)) {
5912 if (auto *V = dyn_cast<ConstantSDNode>(N1)) {
5913 Offset += V->getSExtValue();
5914 return true;
5915 }
5916 }
5917 }
5918
5919 return false;
5920}
5921
5923 DAGCombinerInfo &DCI) const {
5924 // Default implementation: no optimization.
5925 return SDValue();
5926}
5927
5928//===----------------------------------------------------------------------===//
5929// Inline Assembler Implementation Methods
5930//===----------------------------------------------------------------------===//
5931
5934 unsigned S = Constraint.size();
5935
5936 if (S == 1) {
5937 switch (Constraint[0]) {
5938 default: break;
5939 case 'r':
5940 return C_RegisterClass;
5941 case 'm': // memory
5942 case 'o': // offsetable
5943 case 'V': // not offsetable
5944 return C_Memory;
5945 case 'p': // Address.
5946 return C_Address;
5947 case 'n': // Simple Integer
5948 case 'E': // Floating Point Constant
5949 case 'F': // Floating Point Constant
5950 return C_Immediate;
5951 case 'i': // Simple Integer or Relocatable Constant
5952 case 's': // Relocatable Constant
5953 case 'X': // Allow ANY value.
5954 case 'I': // Target registers.
5955 case 'J':
5956 case 'K':
5957 case 'L':
5958 case 'M':
5959 case 'N':
5960 case 'O':
5961 case 'P':
5962 case '<':
5963 case '>':
5964 return C_Other;
5965 }
5966 }
5967
5968 if (S > 1 && Constraint[0] == '{' && Constraint[S - 1] == '}') {
5969 if (S == 8 && Constraint.substr(1, 6) == "memory") // "{memory}"
5970 return C_Memory;
5971 return C_Register;
5972 }
5973 return C_Unknown;
5974}
5975
5976/// Try to replace an X constraint, which matches anything, with another that
5977/// has more specific requirements based on the type of the corresponding
5978/// operand.
5979const char *TargetLowering::LowerXConstraint(EVT ConstraintVT) const {
5980 if (ConstraintVT.isInteger())
5981 return "r";
5982 if (ConstraintVT.isFloatingPoint())
5983 return "f"; // works for many targets
5984 return nullptr;
5985}
5986
5988 SDValue &Chain, SDValue &Glue, const SDLoc &DL,
5989 const AsmOperandInfo &OpInfo, SelectionDAG &DAG) const {
5990 return SDValue();
5991}
5992
5993/// Lower the specified operand into the Ops vector.
5994/// If it is invalid, don't add anything to Ops.
5996 StringRef Constraint,
5997 std::vector<SDValue> &Ops,
5998 SelectionDAG &DAG) const {
5999
6000 if (Constraint.size() > 1)
6001 return;
6002
6003 char ConstraintLetter = Constraint[0];
6004 switch (ConstraintLetter) {
6005 default: break;
6006 case 'X': // Allows any operand
6007 case 'i': // Simple Integer or Relocatable Constant
6008 case 'n': // Simple Integer
6009 case 's': { // Relocatable Constant
6010
6012 uint64_t Offset = 0;
6013
6014 // Match (GA) or (C) or (GA+C) or (GA-C) or ((GA+C)+C) or (((GA+C)+C)+C),
6015 // etc., since getelementpointer is variadic. We can't use
6016 // SelectionDAG::FoldSymbolOffset because it expects the GA to be accessible
6017 // while in this case the GA may be furthest from the root node which is
6018 // likely an ISD::ADD.
6019 while (true) {
6020 if ((C = dyn_cast<ConstantSDNode>(Op)) && ConstraintLetter != 's') {
6021 // gcc prints these as sign extended. Sign extend value to 64 bits
6022 // now; without this it would get ZExt'd later in
6023 // ScheduleDAGSDNodes::EmitNode, which is very generic.
6024 bool IsBool = C->getConstantIntValue()->getBitWidth() == 1;
6025 BooleanContent BCont = getBooleanContents(MVT::i64);
6026 ISD::NodeType ExtOpc =
6027 IsBool ? getExtendForContent(BCont) : ISD::SIGN_EXTEND;
6028 int64_t ExtVal =
6029 ExtOpc == ISD::ZERO_EXTEND ? C->getZExtValue() : C->getSExtValue();
6030 Ops.push_back(
6031 DAG.getTargetConstant(Offset + ExtVal, SDLoc(C), MVT::i64));
6032 return;
6033 }
6034 if (ConstraintLetter != 'n') {
6035 if (const auto *GA = dyn_cast<GlobalAddressSDNode>(Op)) {
6036 Ops.push_back(DAG.getTargetGlobalAddress(GA->getGlobal(), SDLoc(Op),
6037 GA->getValueType(0),
6038 Offset + GA->getOffset()));
6039 return;
6040 }
6041 if (const auto *BA = dyn_cast<BlockAddressSDNode>(Op)) {
6042 Ops.push_back(DAG.getTargetBlockAddress(
6043 BA->getBlockAddress(), BA->getValueType(0),
6044 Offset + BA->getOffset(), BA->getTargetFlags()));
6045 return;
6046 }
6048 Ops.push_back(Op);
6049 return;
6050 }
6051 }
6052 const unsigned OpCode = Op.getOpcode();
6053 if (OpCode == ISD::ADD || OpCode == ISD::SUB) {
6054 if ((C = dyn_cast<ConstantSDNode>(Op.getOperand(0))))
6055 Op = Op.getOperand(1);
6056 // Subtraction is not commutative.
6057 else if (OpCode == ISD::ADD &&
6058 (C = dyn_cast<ConstantSDNode>(Op.getOperand(1))))
6059 Op = Op.getOperand(0);
6060 else
6061 return;
6062 Offset += (OpCode == ISD::ADD ? 1 : -1) * C->getSExtValue();
6063 continue;
6064 }
6065 return;
6066 }
6067 break;
6068 }
6069 }
6070}
6071
6075
6076std::pair<unsigned, const TargetRegisterClass *>
6078 StringRef Constraint,
6079 MVT VT) const {
6080 if (!Constraint.starts_with("{"))
6081 return std::make_pair(0u, static_cast<TargetRegisterClass *>(nullptr));
6082 assert(*(Constraint.end() - 1) == '}' && "Not a brace enclosed constraint?");
6083
6084 // Remove the braces from around the name.
6085 StringRef RegName(Constraint.data() + 1, Constraint.size() - 2);
6086
6087 std::pair<unsigned, const TargetRegisterClass *> R =
6088 std::make_pair(0u, static_cast<const TargetRegisterClass *>(nullptr));
6089
6090 // Figure out which register class contains this reg.
6091 for (const TargetRegisterClass &RC : RI->regclasses()) {
6092 // If none of the value types for this register class are valid, we
6093 // can't use it. For example, 64-bit reg classes on 32-bit targets.
6094 if (!isLegalRC(*RI, RC))
6095 continue;
6096
6097 for (const MCPhysReg &PR : RC) {
6098 if (RegName.equals_insensitive(RI->getRegAsmName(PR))) {
6099 std::pair<unsigned, const TargetRegisterClass *> S =
6100 std::make_pair(PR, &RC);
6101
6102 // If this register class has the requested value type, return it,
6103 // otherwise keep searching and return the first class found
6104 // if no other is found which explicitly has the requested type.
6105 if (RI->isTypeLegalForClass(RC, VT))
6106 return S;
6107 if (!R.second)
6108 R = S;
6109 }
6110 }
6111 }
6112
6113 return R;
6114}
6115
6116//===----------------------------------------------------------------------===//
6117// Constraint Selection.
6118
6119/// Return true of this is an input operand that is a matching constraint like
6120/// "4".
6122 assert(!ConstraintCode.empty() && "No known constraint!");
6123 return isdigit(static_cast<unsigned char>(ConstraintCode[0]));
6124}
6125
6126/// If this is an input matching constraint, this method returns the output
6127/// operand it matches.
6129 assert(!ConstraintCode.empty() && "No known constraint!");
6130 return atoi(ConstraintCode.c_str());
6131}
6132
6133/// Split up the constraint string from the inline assembly value into the
6134/// specific constraints and their prefixes, and also tie in the associated
6135/// operand values.
6136/// If this returns an empty vector, and if the constraint string itself
6137/// isn't empty, there was an error parsing.
6140 const TargetRegisterInfo *TRI,
6141 const CallBase &Call) const {
6142 /// Information about all of the constraints.
6143 AsmOperandInfoVector ConstraintOperands;
6144 const InlineAsm *IA = cast<InlineAsm>(Call.getCalledOperand());
6145 unsigned maCount = 0; // Largest number of multiple alternative constraints.
6146
6147 // Do a prepass over the constraints, canonicalizing them, and building up the
6148 // ConstraintOperands list.
6149 unsigned ArgNo = 0; // ArgNo - The argument of the CallInst.
6150 unsigned ResNo = 0; // ResNo - The result number of the next output.
6151 unsigned LabelNo = 0; // LabelNo - CallBr indirect dest number.
6152
6153 for (InlineAsm::ConstraintInfo &CI : IA->ParseConstraints()) {
6154 ConstraintOperands.emplace_back(std::move(CI));
6155 AsmOperandInfo &OpInfo = ConstraintOperands.back();
6156
6157 // Update multiple alternative constraint count.
6158 if (OpInfo.multipleAlternatives.size() > maCount)
6159 maCount = OpInfo.multipleAlternatives.size();
6160
6161 OpInfo.ConstraintVT = MVT::Other;
6162
6163 // Compute the value type for each operand.
6164 switch (OpInfo.Type) {
6165 case InlineAsm::isOutput: {
6166 // Indirect outputs just consume an argument.
6167 if (OpInfo.isIndirect) {
6168 OpInfo.CallOperandVal = Call.getArgOperand(ArgNo);
6169 break;
6170 }
6171
6172 // The return value of the call is this value. As such, there is no
6173 // corresponding argument.
6174 assert(!Call.getType()->isVoidTy() && "Bad inline asm!");
6175 EVT VT;
6176 if (auto *STy = dyn_cast<StructType>(Call.getType())) {
6177 VT = getAsmOperandValueType(DL, STy->getElementType(ResNo));
6178 } else {
6179 assert(ResNo == 0 && "Asm only has one result!");
6180 VT = getAsmOperandValueType(DL, Call.getType());
6181 }
6182 OpInfo.ConstraintVT = VT.isSimple() ? VT.getSimpleVT() : MVT::Other;
6183 ++ResNo;
6184 break;
6185 }
6186 case InlineAsm::isInput:
6187 OpInfo.CallOperandVal = Call.getArgOperand(ArgNo);
6188 break;
6189 case InlineAsm::isLabel:
6190 OpInfo.CallOperandVal = cast<CallBrInst>(&Call)->getIndirectDest(LabelNo);
6191 ++LabelNo;
6192 continue;
6194 // Nothing to do.
6195 break;
6196 }
6197
6198 if (OpInfo.CallOperandVal) {
6199 llvm::Type *OpTy = OpInfo.CallOperandVal->getType();
6200 if (OpInfo.isIndirect) {
6201 OpTy = Call.getParamElementType(ArgNo);
6202 assert(OpTy && "Indirect operand must have elementtype attribute");
6203 }
6204
6205 // Look for vector wrapped in a struct. e.g. { <16 x i8> }.
6207 if (STy->getNumElements() == 1)
6208 OpTy = STy->getElementType(0);
6209
6210 // If OpTy is not a single value, it may be a struct/union that we
6211 // can tile with integers.
6212 if (!OpTy->isSingleValueType() && OpTy->isSized()) {
6213 unsigned BitSize = DL.getTypeSizeInBits(OpTy);
6214 switch (BitSize) {
6215 default: break;
6216 case 1:
6217 case 8:
6218 case 16:
6219 case 32:
6220 case 64:
6221 case 128:
6222 OpTy = IntegerType::get(OpTy->getContext(), BitSize);
6223 break;
6224 }
6225 }
6226
6227 EVT VT = getAsmOperandValueType(DL, OpTy, true);
6228 OpInfo.ConstraintVT = VT.isSimple() ? VT.getSimpleVT() : MVT::Other;
6229 ArgNo++;
6230 }
6231 }
6232
6233 // If we have multiple alternative constraints, select the best alternative.
6234 if (!ConstraintOperands.empty()) {
6235 if (maCount) {
6236 unsigned bestMAIndex = 0;
6237 int bestWeight = -1;
6238 // weight: -1 = invalid match, and 0 = so-so match to 5 = good match.
6239 int weight = -1;
6240 unsigned maIndex;
6241 // Compute the sums of the weights for each alternative, keeping track
6242 // of the best (highest weight) one so far.
6243 for (maIndex = 0; maIndex < maCount; ++maIndex) {
6244 int weightSum = 0;
6245 for (unsigned cIndex = 0, eIndex = ConstraintOperands.size();
6246 cIndex != eIndex; ++cIndex) {
6247 AsmOperandInfo &OpInfo = ConstraintOperands[cIndex];
6248 if (OpInfo.Type == InlineAsm::isClobber)
6249 continue;
6250
6251 // If this is an output operand with a matching input operand,
6252 // look up the matching input. If their types mismatch, e.g. one
6253 // is an integer, the other is floating point, or their sizes are
6254 // different, flag it as an maCantMatch.
6255 if (OpInfo.hasMatchingInput()) {
6256 AsmOperandInfo &Input = ConstraintOperands[OpInfo.MatchingInput];
6257 if (OpInfo.ConstraintVT != Input.ConstraintVT) {
6258 if ((OpInfo.ConstraintVT.isInteger() !=
6259 Input.ConstraintVT.isInteger()) ||
6260 (OpInfo.ConstraintVT.getSizeInBits() !=
6261 Input.ConstraintVT.getSizeInBits())) {
6262 weightSum = -1; // Can't match.
6263 break;
6264 }
6265 }
6266 }
6267 weight = getMultipleConstraintMatchWeight(OpInfo, maIndex);
6268 if (weight == -1) {
6269 weightSum = -1;
6270 break;
6271 }
6272 weightSum += weight;
6273 }
6274 // Update best.
6275 if (weightSum > bestWeight) {
6276 bestWeight = weightSum;
6277 bestMAIndex = maIndex;
6278 }
6279 }
6280
6281 // Now select chosen alternative in each constraint.
6282 for (AsmOperandInfo &cInfo : ConstraintOperands)
6283 if (cInfo.Type != InlineAsm::isClobber)
6284 cInfo.selectAlternative(bestMAIndex);
6285 }
6286 }
6287
6288 // Check and hook up tied operands, choose constraint code to use.
6289 for (unsigned cIndex = 0, eIndex = ConstraintOperands.size();
6290 cIndex != eIndex; ++cIndex) {
6291 AsmOperandInfo &OpInfo = ConstraintOperands[cIndex];
6292
6293 // If this is an output operand with a matching input operand, look up the
6294 // matching input. If their types mismatch, e.g. one is an integer, the
6295 // other is floating point, or their sizes are different, flag it as an
6296 // error.
6297 if (OpInfo.hasMatchingInput()) {
6298 AsmOperandInfo &Input = ConstraintOperands[OpInfo.MatchingInput];
6299
6300 if (OpInfo.ConstraintVT != Input.ConstraintVT) {
6301 std::pair<unsigned, const TargetRegisterClass *> MatchRC =
6302 getRegForInlineAsmConstraint(TRI, OpInfo.ConstraintCode,
6303 OpInfo.ConstraintVT);
6304 std::pair<unsigned, const TargetRegisterClass *> InputRC =
6305 getRegForInlineAsmConstraint(TRI, Input.ConstraintCode,
6306 Input.ConstraintVT);
6307 const bool OutOpIsIntOrFP = OpInfo.ConstraintVT.isInteger() ||
6308 OpInfo.ConstraintVT.isFloatingPoint();
6309 const bool InOpIsIntOrFP = Input.ConstraintVT.isInteger() ||
6310 Input.ConstraintVT.isFloatingPoint();
6311 if ((OutOpIsIntOrFP != InOpIsIntOrFP) ||
6312 (MatchRC.second != InputRC.second)) {
6313 report_fatal_error("Unsupported asm: input constraint"
6314 " with a matching output constraint of"
6315 " incompatible type!");
6316 }
6317 }
6318 }
6319 }
6320
6321 return ConstraintOperands;
6322}
6323
6324/// Return a number indicating our preference for chosing a type of constraint
6325/// over another, for the purpose of sorting them. Immediates are almost always
6326/// preferrable (when they can be emitted). A higher return value means a
6327/// stronger preference for one constraint type relative to another.
6328/// FIXME: We should prefer registers over memory but doing so may lead to
6329/// unrecoverable register exhaustion later.
6330/// https://github.com/llvm/llvm-project/issues/20571
6332 switch (CT) {
6335 return 4;
6338 return 3;
6340 return 2;
6342 return 1;
6344 return 0;
6345 }
6346 llvm_unreachable("Invalid constraint type");
6347}
6348
6349/// Examine constraint type and operand type and determine a weight value.
6350/// This object must already have been set up with the operand type
6351/// and the current alternative constraint selected.
6354 AsmOperandInfo &info, int maIndex) const {
6356 if (maIndex >= (int)info.multipleAlternatives.size())
6357 rCodes = &info.Codes;
6358 else
6359 rCodes = &info.multipleAlternatives[maIndex].Codes;
6360 ConstraintWeight BestWeight = CW_Invalid;
6361
6362 // Loop over the options, keeping track of the most general one.
6363 for (const std::string &rCode : *rCodes) {
6364 ConstraintWeight weight =
6365 getSingleConstraintMatchWeight(info, rCode.c_str());
6366 if (weight > BestWeight)
6367 BestWeight = weight;
6368 }
6369
6370 return BestWeight;
6371}
6372
6373/// Examine constraint type and operand type and determine a weight value.
6374/// This object must already have been set up with the operand type
6375/// and the current alternative constraint selected.
6378 AsmOperandInfo &info, const char *constraint) const {
6380 Value *CallOperandVal = info.CallOperandVal;
6381 // If we don't have a value, we can't do a match,
6382 // but allow it at the lowest weight.
6383 if (!CallOperandVal)
6384 return CW_Default;
6385 // Look at the constraint type.
6386 switch (*constraint) {
6387 case 'i': // immediate integer.
6388 case 'n': // immediate integer with a known value.
6389 if (isa<ConstantInt>(CallOperandVal))
6390 weight = CW_Constant;
6391 break;
6392 case 's': // non-explicit intregal immediate.
6393 if (isa<GlobalValue>(CallOperandVal))
6394 weight = CW_Constant;
6395 break;
6396 case 'E': // immediate float if host format.
6397 case 'F': // immediate float.
6398 if (isa<ConstantFP>(CallOperandVal))
6399 weight = CW_Constant;
6400 break;
6401 case '<': // memory operand with autodecrement.
6402 case '>': // memory operand with autoincrement.
6403 case 'm': // memory operand.
6404 case 'o': // offsettable memory operand
6405 case 'V': // non-offsettable memory operand
6406 weight = CW_Memory;
6407 break;
6408 case 'r': // general register.
6409 case 'g': // general register, memory operand or immediate integer.
6410 // note: Clang converts "g" to "imr".
6411 if (CallOperandVal->getType()->isIntegerTy())
6412 weight = CW_Register;
6413 break;
6414 case 'X': // any operand.
6415 default:
6416 weight = CW_Default;
6417 break;
6418 }
6419 return weight;
6420}
6421
6422/// If there are multiple different constraints that we could pick for this
6423/// operand (e.g. "imr") try to pick the 'best' one.
6424/// This is somewhat tricky: constraints (TargetLowering::ConstraintType) fall
6425/// into seven classes:
6426/// Register -> one specific register
6427/// RegisterClass -> a group of regs
6428/// Memory -> memory
6429/// Address -> a symbolic memory reference
6430/// Immediate -> immediate values
6431/// Other -> magic values (such as "Flag Output Operands")
6432/// Unknown -> something we don't recognize yet and can't handle
6433/// Ideally, we would pick the most specific constraint possible: if we have
6434/// something that fits into a register, we would pick it. The problem here
6435/// is that if we have something that could either be in a register or in
6436/// memory that use of the register could cause selection of *other*
6437/// operands to fail: they might only succeed if we pick memory. Because of
6438/// this the heuristic we use is:
6439///
6440/// 1) If there is an 'other' constraint, and if the operand is valid for
6441/// that constraint, use it. This makes us take advantage of 'i'
6442/// constraints when available.
6443/// 2) Otherwise, pick the most general constraint present. This prefers
6444/// 'm' over 'r', for example.
6445///
6447 TargetLowering::AsmOperandInfo &OpInfo) const {
6448 ConstraintGroup Ret;
6449
6450 Ret.reserve(OpInfo.Codes.size());
6451 for (StringRef Code : OpInfo.Codes) {
6453
6454 // Indirect 'other' or 'immediate' constraints are not allowed.
6455 if (OpInfo.isIndirect && !(CType == TargetLowering::C_Memory ||
6456 CType == TargetLowering::C_Register ||
6458 continue;
6459
6460 // Things with matching constraints can only be registers, per gcc
6461 // documentation. This mainly affects "g" constraints.
6462 if (CType == TargetLowering::C_Memory && OpInfo.hasMatchingInput())
6463 continue;
6464
6465 Ret.emplace_back(Code, CType);
6466 }
6467
6469 return getConstraintPiority(a.second) > getConstraintPiority(b.second);
6470 });
6471
6472 return Ret;
6473}
6474
6475/// If we have an immediate, see if we can lower it. Return true if we can,
6476/// false otherwise.
6478 SDValue Op, SelectionDAG *DAG,
6479 const TargetLowering &TLI) {
6480
6481 assert((P.second == TargetLowering::C_Other ||
6482 P.second == TargetLowering::C_Immediate) &&
6483 "need immediate or other");
6484
6485 if (!Op.getNode())
6486 return false;
6487
6488 std::vector<SDValue> ResultOps;
6489 TLI.LowerAsmOperandForConstraint(Op, P.first, ResultOps, *DAG);
6490 return !ResultOps.empty();
6491}
6492
6493/// Determines the constraint code and constraint type to use for the specific
6494/// AsmOperandInfo, setting OpInfo.ConstraintCode and OpInfo.ConstraintType.
6496 SDValue Op,
6497 SelectionDAG *DAG) const {
6498 assert(!OpInfo.Codes.empty() && "Must have at least one constraint");
6499
6500 // Single-letter constraints ('r') are very common.
6501 if (OpInfo.Codes.size() == 1) {
6502 OpInfo.ConstraintCode = OpInfo.Codes[0];
6503 OpInfo.ConstraintType = getConstraintType(OpInfo.ConstraintCode);
6504 } else {
6506 if (G.empty())
6507 return;
6508
6509 unsigned BestIdx = 0;
6510 for (const unsigned E = G.size();
6511 BestIdx < E && (G[BestIdx].second == TargetLowering::C_Other ||
6512 G[BestIdx].second == TargetLowering::C_Immediate);
6513 ++BestIdx) {
6514 if (lowerImmediateIfPossible(G[BestIdx], Op, DAG, *this))
6515 break;
6516 // If we're out of constraints, just pick the first one.
6517 if (BestIdx + 1 == E) {
6518 BestIdx = 0;
6519 break;
6520 }
6521 }
6522
6523 OpInfo.ConstraintCode = G[BestIdx].first;
6524 OpInfo.ConstraintType = G[BestIdx].second;
6525 }
6526
6527 // 'X' matches anything.
6528 if (OpInfo.ConstraintCode == "X" && OpInfo.CallOperandVal) {
6529 // Constants are handled elsewhere. For Functions, the type here is the
6530 // type of the result, which is not what we want to look at; leave them
6531 // alone.
6532 Value *v = OpInfo.CallOperandVal;
6533 if (isa<ConstantInt>(v) || isa<Function>(v)) {
6534 return;
6535 }
6536
6537 if (isa<BasicBlock>(v) || isa<BlockAddress>(v)) {
6538 OpInfo.ConstraintCode = "i";
6539 return;
6540 }
6541
6542 // Otherwise, try to resolve it to something we know about by looking at
6543 // the actual operand type.
6544 if (const char *Repl = LowerXConstraint(OpInfo.ConstraintVT)) {
6545 OpInfo.ConstraintCode = Repl;
6546 OpInfo.ConstraintType = getConstraintType(OpInfo.ConstraintCode);
6547 }
6548 }
6549}
6550
6551/// Given an exact SDIV by a constant, create a multiplication
6552/// with the multiplicative inverse of the constant.
6553/// Ref: "Hacker's Delight" by Henry Warren, 2nd Edition, p. 242
6555 const SDLoc &dl, SelectionDAG &DAG,
6556 SmallVectorImpl<SDNode *> &Created) {
6557 SDValue Op0 = N->getOperand(0);
6558 SDValue Op1 = N->getOperand(1);
6559 EVT VT = N->getValueType(0);
6560 EVT ShVT = TLI.getShiftAmountTy(VT, DAG.getDataLayout());
6561 EVT ShSVT = ShVT.getScalarType();
6562
6563 bool UseSRA = false;
6564 SmallVector<SDValue, 16> Shifts, Factors;
6565
6566 auto BuildSDIVPattern = [&](ConstantSDNode *C) {
6567 if (C->isZero())
6568 return false;
6569
6570 EVT CT = C->getValueType(0);
6571 APInt Divisor = C->getAPIntValue();
6572 unsigned Shift = Divisor.countr_zero();
6573 if (Shift) {
6574 Divisor.ashrInPlace(Shift);
6575 UseSRA = true;
6576 }
6577 APInt Factor = Divisor.multiplicativeInverse();
6578 Shifts.push_back(DAG.getConstant(Shift, dl, ShSVT));
6579 Factors.push_back(DAG.getConstant(Factor, dl, CT));
6580 return true;
6581 };
6582
6583 // Collect all magic values from the build vector.
6584 if (!ISD::matchUnaryPredicate(Op1, BuildSDIVPattern))
6585 return SDValue();
6586
6587 SDValue Shift, Factor;
6588 if (Op1.getOpcode() == ISD::BUILD_VECTOR) {
6589 Shift = DAG.getBuildVector(ShVT, dl, Shifts);
6590 Factor = DAG.getBuildVector(VT, dl, Factors);
6591 } else if (Op1.getOpcode() == ISD::SPLAT_VECTOR) {
6592 assert(Shifts.size() == 1 && Factors.size() == 1 &&
6593 "Expected matchUnaryPredicate to return one element for scalable "
6594 "vectors");
6595 Shift = DAG.getSplatVector(ShVT, dl, Shifts[0]);
6596 Factor = DAG.getSplatVector(VT, dl, Factors[0]);
6597 } else {
6598 assert(isa<ConstantSDNode>(Op1) && "Expected a constant");
6599 Shift = Shifts[0];
6600 Factor = Factors[0];
6601 }
6602
6603 SDValue Res = Op0;
6604 if (UseSRA) {
6605 Res = DAG.getNode(ISD::SRA, dl, VT, Res, Shift, SDNodeFlags::Exact);
6606 Created.push_back(Res.getNode());
6607 }
6608
6609 return DAG.getNode(ISD::MUL, dl, VT, Res, Factor);
6610}
6611
6612/// Given an exact UDIV by a constant, create a multiplication
6613/// with the multiplicative inverse of the constant.
6614/// Ref: "Hacker's Delight" by Henry Warren, 2nd Edition, p. 242
6616 const SDLoc &dl, SelectionDAG &DAG,
6617 SmallVectorImpl<SDNode *> &Created) {
6618 EVT VT = N->getValueType(0);
6619 EVT ShVT = TLI.getShiftAmountTy(VT, DAG.getDataLayout());
6620 EVT ShSVT = ShVT.getScalarType();
6621
6622 bool UseSRL = false;
6623 SmallVector<SDValue, 16> Shifts, Factors;
6624
6625 auto BuildUDIVPattern = [&](ConstantSDNode *C) {
6626 if (C->isZero())
6627 return false;
6628
6629 EVT CT = C->getValueType(0);
6630 APInt Divisor = C->getAPIntValue();
6631 unsigned Shift = Divisor.countr_zero();
6632 if (Shift) {
6633 Divisor.lshrInPlace(Shift);
6634 UseSRL = true;
6635 }
6636 // Calculate the multiplicative inverse modulo BW.
6637 APInt Factor = Divisor.multiplicativeInverse();
6638 Shifts.push_back(DAG.getConstant(Shift, dl, ShSVT));
6639 Factors.push_back(DAG.getConstant(Factor, dl, CT));
6640 return true;
6641 };
6642
6643 SDValue Op1 = N->getOperand(1);
6644
6645 // Collect all magic values from the build vector.
6646 if (!ISD::matchUnaryPredicate(Op1, BuildUDIVPattern))
6647 return SDValue();
6648
6649 SDValue Shift, Factor;
6650 if (Op1.getOpcode() == ISD::BUILD_VECTOR) {
6651 Shift = DAG.getBuildVector(ShVT, dl, Shifts);
6652 Factor = DAG.getBuildVector(VT, dl, Factors);
6653 } else if (Op1.getOpcode() == ISD::SPLAT_VECTOR) {
6654 assert(Shifts.size() == 1 && Factors.size() == 1 &&
6655 "Expected matchUnaryPredicate to return one element for scalable "
6656 "vectors");
6657 Shift = DAG.getSplatVector(ShVT, dl, Shifts[0]);
6658 Factor = DAG.getSplatVector(VT, dl, Factors[0]);
6659 } else {
6660 assert(isa<ConstantSDNode>(Op1) && "Expected a constant");
6661 Shift = Shifts[0];
6662 Factor = Factors[0];
6663 }
6664
6665 SDValue Res = N->getOperand(0);
6666 if (UseSRL) {
6667 Res = DAG.getNode(ISD::SRL, dl, VT, Res, Shift, SDNodeFlags::Exact);
6668 Created.push_back(Res.getNode());
6669 }
6670
6671 return DAG.getNode(ISD::MUL, dl, VT, Res, Factor);
6672}
6673
6675 SelectionDAG &DAG,
6676 SmallVectorImpl<SDNode *> &Created) const {
6677 AttributeList Attr = DAG.getMachineFunction().getFunction().getAttributes();
6678 if (isIntDivCheap(N->getValueType(0), Attr))
6679 return SDValue(N, 0); // Lower SDIV as SDIV
6680 return SDValue();
6681}
6682
6683SDValue
6685 SelectionDAG &DAG,
6686 SmallVectorImpl<SDNode *> &Created) const {
6687 AttributeList Attr = DAG.getMachineFunction().getFunction().getAttributes();
6688 if (isIntDivCheap(N->getValueType(0), Attr))
6689 return SDValue(N, 0); // Lower SREM as SREM
6690 return SDValue();
6691}
6692
6693/// Build sdiv by power-of-2 with conditional move instructions
6694/// Ref: "Hacker's Delight" by Henry Warren 10-1
6695/// If conditional move/branch is preferred, we lower sdiv x, +/-2**k into:
6696/// bgez x, label
6697/// add x, x, 2**k-1
6698/// label:
6699/// sra res, x, k
6700/// neg res, res (when the divisor is negative)
6702 SDNode *N, const APInt &Divisor, SelectionDAG &DAG,
6703 SmallVectorImpl<SDNode *> &Created) const {
6704 unsigned Lg2 = Divisor.countr_zero();
6705 EVT VT = N->getValueType(0);
6706
6707 SDLoc DL(N);
6708 SDValue N0 = N->getOperand(0);
6709 SDValue Zero = DAG.getConstant(0, DL, VT);
6710 APInt Lg2Mask = APInt::getLowBitsSet(VT.getSizeInBits(), Lg2);
6711 SDValue Pow2MinusOne = DAG.getConstant(Lg2Mask, DL, VT);
6712
6713 // If N0 is negative, we need to add (Pow2 - 1) to it before shifting right.
6714 EVT CCVT = getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
6715 SDValue Cmp = DAG.getSetCC(DL, CCVT, N0, Zero, ISD::SETLT);
6716 SDValue Add = DAG.getNode(ISD::ADD, DL, VT, N0, Pow2MinusOne);
6717 SDValue CMov = DAG.getNode(ISD::SELECT, DL, VT, Cmp, Add, N0);
6718
6719 Created.push_back(Cmp.getNode());
6720 Created.push_back(Add.getNode());
6721 Created.push_back(CMov.getNode());
6722
6723 // Divide by pow2.
6724 SDValue SRA = DAG.getNode(ISD::SRA, DL, VT, CMov,
6725 DAG.getShiftAmountConstant(Lg2, VT, DL));
6726
6727 // If we're dividing by a positive value, we're done. Otherwise, we must
6728 // negate the result.
6729 if (Divisor.isNonNegative())
6730 return SRA;
6731
6732 Created.push_back(SRA.getNode());
6733 return DAG.getNode(ISD::SUB, DL, VT, Zero, SRA);
6734}
6735
6736/// Given an ISD::SDIV node expressing a divide by constant,
6737/// return a DAG expression to select that will generate the same value by
6738/// multiplying by a magic number.
6739/// Ref: "Hacker's Delight" or "The PowerPC Compiler Writer's Guide".
6741 bool IsAfterLegalization,
6742 bool IsAfterLegalTypes,
6743 SmallVectorImpl<SDNode *> &Created) const {
6744 SDLoc dl(N);
6745
6746 // If the sdiv has an 'exact' bit we can use a simpler lowering.
6747 if (N->getFlags().hasExact())
6748 return BuildExactSDIV(*this, N, dl, DAG, Created);
6749
6750 EVT VT = N->getValueType(0);
6751 EVT SVT = VT.getScalarType();
6752 EVT ShVT = getShiftAmountTy(VT, DAG.getDataLayout());
6753 EVT ShSVT = ShVT.getScalarType();
6754 unsigned EltBits = VT.getScalarSizeInBits();
6755 EVT MulVT;
6756
6757 // Check to see if we can do this.
6758 // FIXME: We should be more aggressive here.
6759 EVT QueryVT = VT;
6760 if (VT.isVector()) {
6761 // If the vector type will be legalized to a vector type with the same
6762 // element type, allow the transform before type legalization if MULHS or
6763 // SMUL_LOHI are supported.
6764 QueryVT = getLegalTypeToTransformTo(*DAG.getContext(), VT);
6765 if (!QueryVT.isVector() ||
6767 return SDValue();
6768 } else if (!isTypeLegal(VT)) {
6769 // Limit this to simple scalars for now.
6770 if (!VT.isSimple())
6771 return SDValue();
6772
6773 // If this type will be promoted to a large enough type with a legal
6774 // multiply operation, we can go ahead and do this transform.
6776 return SDValue();
6777
6778 MulVT = getTypeToTransformTo(*DAG.getContext(), VT);
6779 if (MulVT.getSizeInBits() < (2 * EltBits) ||
6780 !isOperationLegal(ISD::MUL, MulVT))
6781 return SDValue();
6782 }
6783
6784 bool HasMULHS =
6785 isOperationLegalOrCustom(ISD::MULHS, QueryVT, IsAfterLegalization);
6786 bool HasSMUL_LOHI =
6787 isOperationLegalOrCustom(ISD::SMUL_LOHI, QueryVT, IsAfterLegalization);
6788
6789 if (isTypeLegal(VT) && !HasMULHS && !HasSMUL_LOHI && MulVT == EVT()) {
6790 // If type twice as wide legal, widen and use a mul plus a shift.
6791 EVT WideVT = VT.widenIntegerElementType(*DAG.getContext());
6792 // Some targets like AMDGPU try to go from SDIV to SDIVREM which is then
6793 // custom lowered. This is very expensive so avoid it at all costs for
6794 // constant divisors.
6795 if ((!IsAfterLegalTypes && isOperationExpand(ISD::SDIV, VT) &&
6798 MulVT = WideVT;
6799 }
6800
6801 if (!HasMULHS && !HasSMUL_LOHI && MulVT == EVT())
6802 return SDValue();
6803
6804 // If we're after type legalization and SVT is not legal, use the
6805 // promoted type for creating constants to avoid creating nodes with
6806 // illegal types.
6807 if (IsAfterLegalTypes && VT.isVector()) {
6808 SVT = getTypeToTransformTo(*DAG.getContext(), SVT);
6809 if (SVT.bitsLT(VT.getScalarType()))
6810 return SDValue();
6811 ShSVT = getTypeToTransformTo(*DAG.getContext(), ShSVT);
6812 if (ShSVT.bitsLT(ShVT.getScalarType()))
6813 return SDValue();
6814 }
6815 const unsigned SVTBits = SVT.getSizeInBits();
6816
6817 SmallVector<SDValue, 16> MagicFactors, Factors, Shifts, ShiftMasks;
6818
6819 auto BuildSDIVPattern = [&](ConstantSDNode *C) {
6820 if (C->isZero())
6821 return false;
6822 // Truncate the divisor to the target scalar type in case it was promoted
6823 // during type legalization.
6824 APInt Divisor = C->getAPIntValue().trunc(EltBits);
6826 int NumeratorFactor = 0;
6827 int ShiftMask = -1;
6828
6829 if (Divisor.isOne() || Divisor.isAllOnes()) {
6830 // If d is +1/-1, we just multiply the numerator by +1/-1.
6831 NumeratorFactor = Divisor.getSExtValue();
6832 magics.Magic = 0;
6833 magics.ShiftAmount = 0;
6834 ShiftMask = 0;
6835 } else if (Divisor.isStrictlyPositive() && magics.Magic.isNegative()) {
6836 // If d > 0 and m < 0, add the numerator.
6837 NumeratorFactor = 1;
6838 } else if (Divisor.isNegative() && magics.Magic.isStrictlyPositive()) {
6839 // If d < 0 and m > 0, subtract the numerator.
6840 NumeratorFactor = -1;
6841 }
6842
6843 MagicFactors.push_back(
6844 DAG.getConstant(magics.Magic.zext(SVTBits), dl, SVT));
6845 Factors.push_back(DAG.getSignedConstant(NumeratorFactor, dl, SVT));
6846 Shifts.push_back(DAG.getConstant(magics.ShiftAmount, dl, ShSVT));
6847 ShiftMasks.push_back(DAG.getSignedConstant(ShiftMask, dl, SVT));
6848 return true;
6849 };
6850
6851 SDValue N0 = N->getOperand(0);
6852 SDValue N1 = N->getOperand(1);
6853
6854 // Collect the shifts / magic values from each element.
6855 if (!ISD::matchUnaryPredicate(N1, BuildSDIVPattern, /*AllowUndefs=*/false,
6856 /*AllowTruncation=*/true))
6857 return SDValue();
6858
6859 SDValue MagicFactor, Factor, Shift, ShiftMask;
6860 if (N1.getOpcode() == ISD::BUILD_VECTOR) {
6861 MagicFactor = DAG.getBuildVector(VT, dl, MagicFactors);
6862 Factor = DAG.getBuildVector(VT, dl, Factors);
6863 Shift = DAG.getBuildVector(ShVT, dl, Shifts);
6864 ShiftMask = DAG.getBuildVector(VT, dl, ShiftMasks);
6865 } else if (N1.getOpcode() == ISD::SPLAT_VECTOR) {
6866 assert(MagicFactors.size() == 1 && Factors.size() == 1 &&
6867 Shifts.size() == 1 && ShiftMasks.size() == 1 &&
6868 "Expected matchUnaryPredicate to return one element for scalable "
6869 "vectors");
6870 MagicFactor = DAG.getSplatVector(VT, dl, MagicFactors[0]);
6871 Factor = DAG.getSplatVector(VT, dl, Factors[0]);
6872 Shift = DAG.getSplatVector(ShVT, dl, Shifts[0]);
6873 ShiftMask = DAG.getSplatVector(VT, dl, ShiftMasks[0]);
6874 } else {
6875 assert(isa<ConstantSDNode>(N1) && "Expected a constant");
6876 MagicFactor = MagicFactors[0];
6877 Factor = Factors[0];
6878 Shift = Shifts[0];
6879 ShiftMask = ShiftMasks[0];
6880 }
6881
6882 // Multiply the numerator (operand 0) by the magic value.
6883 auto GetMULHS = [&](SDValue X, SDValue Y) {
6884 if (HasMULHS)
6885 return DAG.getNode(ISD::MULHS, dl, VT, X, Y);
6886 if (HasSMUL_LOHI) {
6887 SDValue LoHi =
6888 DAG.getNode(ISD::SMUL_LOHI, dl, DAG.getVTList(VT, VT), X, Y);
6889 return LoHi.getValue(1);
6890 }
6891
6892 X = DAG.getNode(ISD::SIGN_EXTEND, dl, MulVT, X);
6893 Y = DAG.getNode(ISD::SIGN_EXTEND, dl, MulVT, Y);
6894 Y = DAG.getNode(ISD::MUL, dl, MulVT, X, Y);
6895 Y = DAG.getNode(ISD::SRL, dl, MulVT, Y,
6896 DAG.getShiftAmountConstant(EltBits, MulVT, dl));
6897 return DAG.getNode(ISD::TRUNCATE, dl, VT, Y);
6898 };
6899
6900 SDValue Q = GetMULHS(N0, MagicFactor);
6901 if (!Q)
6902 return SDValue();
6903
6904 Created.push_back(Q.getNode());
6905
6906 // (Optionally) Add/subtract the numerator using Factor.
6907 Factor = DAG.getNode(ISD::MUL, dl, VT, N0, Factor);
6908 Created.push_back(Factor.getNode());
6909 Q = DAG.getNode(ISD::ADD, dl, VT, Q, Factor);
6910 Created.push_back(Q.getNode());
6911
6912 // Shift right algebraic by shift value.
6913 Q = DAG.getNode(ISD::SRA, dl, VT, Q, Shift);
6914 Created.push_back(Q.getNode());
6915
6916 // Extract the sign bit, mask it and add it to the quotient.
6917 SDValue SignShift = DAG.getConstant(EltBits - 1, dl, ShVT);
6918 SDValue T = DAG.getNode(ISD::SRL, dl, VT, Q, SignShift);
6919 Created.push_back(T.getNode());
6920 T = DAG.getNode(ISD::AND, dl, VT, T, ShiftMask);
6921 Created.push_back(T.getNode());
6922 return DAG.getNode(ISD::ADD, dl, VT, Q, T);
6923}
6924
6925/// Given an ISD::UDIV node expressing a divide by constant,
6926/// return a DAG expression to select that will generate the same value by
6927/// multiplying by a magic number.
6928/// Ref: "Hacker's Delight" or "The PowerPC Compiler Writer's Guide".
6930 bool IsAfterLegalization,
6931 bool IsAfterLegalTypes,
6932 SmallVectorImpl<SDNode *> &Created) const {
6933 SDLoc dl(N);
6934
6935 // If the udiv has an 'exact' bit we can use a simpler lowering.
6936 if (N->getFlags().hasExact())
6937 return BuildExactUDIV(*this, N, dl, DAG, Created);
6938
6939 EVT VT = N->getValueType(0);
6940 EVT SVT = VT.getScalarType();
6941 EVT ShVT = getShiftAmountTy(VT, DAG.getDataLayout());
6942 EVT ShSVT = ShVT.getScalarType();
6943 unsigned EltBits = VT.getScalarSizeInBits();
6944 EVT MulVT;
6945
6946 // Check to see if we can do this.
6947 // FIXME: We should be more aggressive here.
6948 EVT QueryVT = VT;
6949 if (VT.isVector()) {
6950 // If the vector type will be legalized to a vector type with the same
6951 // element type, allow the transform before type legalization if MULHU or
6952 // UMUL_LOHI are supported.
6953 QueryVT = getLegalTypeToTransformTo(*DAG.getContext(), VT);
6954 if (!QueryVT.isVector() ||
6956 return SDValue();
6957 } else if (!isTypeLegal(VT)) {
6958 // Limit this to simple scalars for now.
6959 if (!VT.isSimple())
6960 return SDValue();
6961
6962 // If this type will be promoted to a large enough type with a legal
6963 // multiply operation, we can go ahead and do this transform.
6965 return SDValue();
6966
6967 MulVT = getTypeToTransformTo(*DAG.getContext(), VT);
6968 if (MulVT.getSizeInBits() < (2 * EltBits) ||
6969 !isOperationLegal(ISD::MUL, MulVT))
6970 return SDValue();
6971 }
6972
6973 bool HasMULHU =
6974 isOperationLegalOrCustom(ISD::MULHU, QueryVT, IsAfterLegalization);
6975 bool HasUMUL_LOHI =
6976 isOperationLegalOrCustom(ISD::UMUL_LOHI, QueryVT, IsAfterLegalization);
6977
6978 if (isTypeLegal(VT) && !HasMULHU && !HasUMUL_LOHI && MulVT == EVT()) {
6979 // If type twice as wide legal, widen and use a mul plus a shift.
6980 EVT WideVT = VT.widenIntegerElementType(*DAG.getContext());
6981 // Some targets like AMDGPU try to go from UDIV to UDIVREM which is then
6982 // custom lowered. This is very expensive so avoid it at all costs for
6983 // constant divisors.
6984 if ((!IsAfterLegalTypes && isOperationExpand(ISD::UDIV, VT) &&
6987 MulVT = WideVT;
6988 }
6989
6990 if (!HasMULHU && !HasUMUL_LOHI && MulVT == EVT())
6991 return SDValue();
6992
6993 SDValue N0 = N->getOperand(0);
6994 SDValue N1 = N->getOperand(1);
6995
6996 // Try to use leading zeros of the dividend to reduce the multiplier and
6997 // avoid expensive fixups.
6998 unsigned KnownLeadingZeros = DAG.computeKnownBits(N0).countMinLeadingZeros();
6999
7000 // If we're after type legalization and SVT is not legal, use the
7001 // promoted type for creating constants to avoid creating nodes with
7002 // illegal types.
7003 if (IsAfterLegalTypes && VT.isVector()) {
7004 SVT = getTypeToTransformTo(*DAG.getContext(), SVT);
7005 if (SVT.bitsLT(VT.getScalarType()))
7006 return SDValue();
7007 ShSVT = getTypeToTransformTo(*DAG.getContext(), ShSVT);
7008 if (ShSVT.bitsLT(ShVT.getScalarType()))
7009 return SDValue();
7010 }
7011 const unsigned SVTBits = SVT.getSizeInBits();
7012
7013 // Allow i32 to be widened to i64 for uncooperative divisors if i64 MULHU or
7014 // UMUL_LOHI is supported.
7015 const EVT WideSVT = MVT::i64;
7016 const bool HasWideMULHU =
7017 VT == MVT::i32 &&
7018 isOperationLegalOrCustom(ISD::MULHU, WideSVT, IsAfterLegalization);
7019 const bool HasWideUMUL_LOHI =
7020 VT == MVT::i32 &&
7021 isOperationLegalOrCustom(ISD::UMUL_LOHI, WideSVT, IsAfterLegalization);
7022 const bool AllowWiden = (HasWideMULHU || HasWideUMUL_LOHI);
7023
7024 // For even divisors with a 33-bit magic number, the widened high-multiply
7025 // path is only worthwhile over the even-divisor rewrite on targets that
7026 // zero-extend i32 to i64 for free (e.g. x86-64 and AArch64). Elsewhere (e.g.
7027 // RISC-V) keep the even-divisor rewrite, which avoids the explicit extension.
7028 const bool AllowEvenToWiden = AllowWiden && isZExtFree(VT, WideSVT);
7029
7030 bool UseNPQ = false, UsePreShift = false, UsePostShift = false;
7031 bool UseWiden = false;
7032 SmallVector<SDValue, 16> PreShifts, PostShifts, MagicFactors, NPQFactors;
7033
7034 auto BuildUDIVPattern = [&](ConstantSDNode *C) {
7035 if (C->isZero())
7036 return false;
7037 // Truncate the divisor to the target scalar type in case it was promoted
7038 // during type legalization.
7039 APInt Divisor = C->getAPIntValue().trunc(EltBits);
7040
7041 SDValue PreShift, MagicFactor, NPQFactor, PostShift;
7042
7043 // Magic algorithm doesn't work for division by 1. We need to emit a select
7044 // at the end.
7045 if (Divisor.isOne()) {
7046 PreShift = PostShift = DAG.getUNDEF(ShSVT);
7047 MagicFactor = NPQFactor = DAG.getUNDEF(SVT);
7048 } else {
7051 Divisor, std::min(KnownLeadingZeros, Divisor.countl_zero()),
7052 /*AllowEvenDivisorOptimization=*/!AllowEvenToWiden,
7053 /*AllowWidenOptimization=*/AllowWiden);
7054
7055 if (magics.Widen) {
7056 UseWiden = true;
7057 MagicFactor = DAG.getConstant(magics.Magic, dl, WideSVT);
7058 } else {
7059 MagicFactor = DAG.getConstant(magics.Magic.zext(SVTBits), dl, SVT);
7060 }
7061
7062 assert(magics.PreShift < Divisor.getBitWidth() &&
7063 "We shouldn't generate an undefined shift!");
7064 assert(magics.PostShift < Divisor.getBitWidth() &&
7065 "We shouldn't generate an undefined shift!");
7066 assert((!magics.IsAdd || magics.PreShift == 0) &&
7067 "Unexpected pre-shift");
7068 PreShift = DAG.getConstant(magics.PreShift, dl, ShSVT);
7069 PostShift = DAG.getConstant(magics.PostShift, dl, ShSVT);
7070 NPQFactor = DAG.getConstant(
7071 magics.IsAdd ? APInt::getOneBitSet(SVTBits, EltBits - 1)
7072 : APInt::getZero(SVTBits),
7073 dl, SVT);
7074 UseNPQ |= magics.IsAdd;
7075 UsePreShift |= magics.PreShift != 0;
7076 UsePostShift |= magics.PostShift != 0;
7077 }
7078
7079 PreShifts.push_back(PreShift);
7080 MagicFactors.push_back(MagicFactor);
7081 NPQFactors.push_back(NPQFactor);
7082 PostShifts.push_back(PostShift);
7083 return true;
7084 };
7085
7086 // Collect the shifts/magic values from each element.
7087 if (!ISD::matchUnaryPredicate(N1, BuildUDIVPattern, /*AllowUndefs=*/false,
7088 /*AllowTruncation=*/true))
7089 return SDValue();
7090
7091 SDValue PreShift, PostShift, MagicFactor, NPQFactor;
7092 if (N1.getOpcode() == ISD::BUILD_VECTOR) {
7093 PreShift = DAG.getBuildVector(ShVT, dl, PreShifts);
7094 MagicFactor = DAG.getBuildVector(VT, dl, MagicFactors);
7095 NPQFactor = DAG.getBuildVector(VT, dl, NPQFactors);
7096 PostShift = DAG.getBuildVector(ShVT, dl, PostShifts);
7097 } else if (N1.getOpcode() == ISD::SPLAT_VECTOR) {
7098 assert(PreShifts.size() == 1 && MagicFactors.size() == 1 &&
7099 NPQFactors.size() == 1 && PostShifts.size() == 1 &&
7100 "Expected matchUnaryPredicate to return one for scalable vectors");
7101 PreShift = DAG.getSplatVector(ShVT, dl, PreShifts[0]);
7102 MagicFactor = DAG.getSplatVector(VT, dl, MagicFactors[0]);
7103 NPQFactor = DAG.getSplatVector(VT, dl, NPQFactors[0]);
7104 PostShift = DAG.getSplatVector(ShVT, dl, PostShifts[0]);
7105 } else {
7106 assert(isa<ConstantSDNode>(N1) && "Expected a constant");
7107 PreShift = PreShifts[0];
7108 MagicFactor = MagicFactors[0];
7109 PostShift = PostShifts[0];
7110 }
7111
7112 if (UseWiden) {
7113 // Compute: (WideSVT(x) * MagicFactor) >> WideSVTBits.
7114 SDValue WideN0 = DAG.getNode(ISD::ZERO_EXTEND, dl, WideSVT, N0);
7115
7116 // Perform WideSVTxWideSVT -> 2*WideSVT multiplication and extract high
7117 // WideSVT bits
7118 SDValue High;
7119 if (HasWideMULHU) {
7120 High = DAG.getNode(ISD::MULHU, dl, WideSVT, WideN0, MagicFactor);
7121 } else {
7122 assert(HasWideUMUL_LOHI);
7123 SDValue LoHi =
7124 DAG.getNode(ISD::UMUL_LOHI, dl, DAG.getVTList(WideSVT, WideSVT),
7125 WideN0, MagicFactor);
7126 High = LoHi.getValue(1);
7127 }
7128
7129 Created.push_back(High.getNode());
7130 return DAG.getNode(ISD::TRUNCATE, dl, VT, High);
7131 }
7132
7133 SDValue Q = N0;
7134 if (UsePreShift) {
7135 Q = DAG.getNode(ISD::SRL, dl, VT, Q, PreShift);
7136 Created.push_back(Q.getNode());
7137 }
7138
7139 auto GetMULHU = [&](SDValue X, SDValue Y) {
7140 if (HasMULHU)
7141 return DAG.getNode(ISD::MULHU, dl, VT, X, Y);
7142 if (HasUMUL_LOHI) {
7143 SDValue LoHi =
7144 DAG.getNode(ISD::UMUL_LOHI, dl, DAG.getVTList(VT, VT), X, Y);
7145 return LoHi.getValue(1);
7146 }
7147
7148 X = DAG.getNode(ISD::ZERO_EXTEND, dl, MulVT, X);
7149 Y = DAG.getNode(ISD::ZERO_EXTEND, dl, MulVT, Y);
7150 Y = DAG.getNode(ISD::MUL, dl, MulVT, X, Y);
7151 Y = DAG.getNode(ISD::SRL, dl, MulVT, Y,
7152 DAG.getShiftAmountConstant(EltBits, MulVT, dl));
7153 return DAG.getNode(ISD::TRUNCATE, dl, VT, Y);
7154 };
7155
7156 // Multiply the numerator (operand 0) by the magic value.
7157 Q = GetMULHU(Q, MagicFactor);
7158 if (!Q)
7159 return SDValue();
7160
7161 Created.push_back(Q.getNode());
7162
7163 if (UseNPQ) {
7164 SDValue NPQ = DAG.getNode(ISD::SUB, dl, VT, N0, Q);
7165 Created.push_back(NPQ.getNode());
7166
7167 // For vectors we might have a mix of non-NPQ/NPQ paths, so use
7168 // MULHU to act as a SRL-by-1 for NPQ, else multiply by zero.
7169 if (VT.isVector())
7170 NPQ = GetMULHU(NPQ, NPQFactor);
7171 else
7172 NPQ = DAG.getNode(ISD::SRL, dl, VT, NPQ, DAG.getConstant(1, dl, ShVT));
7173
7174 Created.push_back(NPQ.getNode());
7175
7176 Q = DAG.getNode(ISD::ADD, dl, VT, NPQ, Q);
7177 Created.push_back(Q.getNode());
7178 }
7179
7180 if (UsePostShift) {
7181 Q = DAG.getNode(ISD::SRL, dl, VT, Q, PostShift);
7182 Created.push_back(Q.getNode());
7183 }
7184
7185 EVT SetCCVT = getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
7186
7187 SDValue One = DAG.getConstant(1, dl, VT);
7188 SDValue IsOne = DAG.getSetCC(dl, SetCCVT, N1, One, ISD::SETEQ);
7189 return DAG.getSelect(dl, VT, IsOne, N0, Q);
7190}
7191
7192/// If all values in Values that *don't* match the predicate are same 'splat'
7193/// value, then replace all values with that splat value.
7194/// Else, if AlternativeReplacement was provided, then replace all values that
7195/// do match predicate with AlternativeReplacement value.
7196static void
7198 std::function<bool(SDValue)> Predicate,
7199 SDValue AlternativeReplacement = SDValue()) {
7200 SDValue Replacement;
7201 // Is there a value for which the Predicate does *NOT* match? What is it?
7202 auto SplatValue = llvm::find_if_not(Values, Predicate);
7203 if (SplatValue != Values.end()) {
7204 // Does Values consist only of SplatValue's and values matching Predicate?
7205 if (llvm::all_of(Values, [Predicate, SplatValue](SDValue Value) {
7206 return Value == *SplatValue || Predicate(Value);
7207 })) // Then we shall replace values matching predicate with SplatValue.
7208 Replacement = *SplatValue;
7209 }
7210 if (!Replacement) {
7211 // Oops, we did not find the "baseline" splat value.
7212 if (!AlternativeReplacement)
7213 return; // Nothing to do.
7214 // Let's replace with provided value then.
7215 Replacement = AlternativeReplacement;
7216 }
7217 std::replace_if(Values.begin(), Values.end(), Predicate, Replacement);
7218}
7219
7220/// Given an ISD::UREM used only by an ISD::SETEQ or ISD::SETNE
7221/// where the divisor and comparison target are constants,
7222/// return a DAG expression that will generate the same comparison result
7223/// using only multiplications, additions and shifts/rotations.
7224/// Ref: "Hacker's Delight" 10-17.
7225SDValue TargetLowering::buildUREMEqFold(EVT SETCCVT, SDValue REMNode,
7226 SDValue CompTargetNode,
7228 DAGCombinerInfo &DCI,
7229 const SDLoc &DL) const {
7231 if (SDValue Folded = prepareUREMEqFold(SETCCVT, REMNode, CompTargetNode, Cond,
7232 DCI, DL, Built)) {
7233 for (SDNode *N : Built)
7234 DCI.AddToWorklist(N);
7235 return Folded;
7236 }
7237
7238 return SDValue();
7239}
7240
7241SDValue
7242TargetLowering::prepareUREMEqFold(EVT SETCCVT, SDValue REMNode,
7243 SDValue CompTargetNode, ISD::CondCode Cond,
7244 DAGCombinerInfo &DCI, const SDLoc &DL,
7245 SmallVectorImpl<SDNode *> &Created) const {
7246 // fold (seteq/ne (urem N, D), C) ->
7247 // (setule/ugt (rotr (mul (sub N, C), P), K), Q)
7248 // - D must be constant, with D = D0 * 2^K where D0 is odd
7249 // - P is the multiplicative inverse of D0 modulo 2^W
7250 // - Q = floor(((2^W) - 1) / D)
7251 // where W is the width of the common type of N and D.
7252 assert((Cond == ISD::SETEQ || Cond == ISD::SETNE) &&
7253 "Only applicable for (in)equality comparisons.");
7254
7255 SelectionDAG &DAG = DCI.DAG;
7256
7257 EVT VT = REMNode.getValueType();
7258 EVT SVT = VT.getScalarType();
7259 EVT ShVT = getShiftAmountTy(VT, DAG.getDataLayout());
7260 EVT ShSVT = ShVT.getScalarType();
7261
7262 // If MUL is unavailable, we cannot proceed in any case.
7263 if (!DCI.isBeforeLegalizeOps() && !isOperationLegalOrCustom(ISD::MUL, VT))
7264 return SDValue();
7265
7266 bool ComparingWithAllZeros = true;
7267 bool AllComparisonsWithNonZerosAreTautological = true;
7268 bool HadTautologicalLanes = false;
7269 bool AllLanesAreTautological = true;
7270 bool HadEvenDivisor = false;
7271 bool AllDivisorsArePowerOfTwo = true;
7272 bool HadTautologicalInvertedLanes = false;
7273 SmallVector<SDValue, 16> PAmts, KAmts, QAmts;
7274
7275 auto BuildUREMPattern = [&](ConstantSDNode *CDiv, ConstantSDNode *CCmp) {
7276 // Division by 0 is UB. Leave it to be constant-folded elsewhere.
7277 if (CDiv->isZero())
7278 return false;
7279
7280 const APInt &D = CDiv->getAPIntValue();
7281 const APInt &Cmp = CCmp->getAPIntValue();
7282
7283 ComparingWithAllZeros &= Cmp.isZero();
7284
7285 // x u% C1` is *always* less than C1. So given `x u% C1 == C2`,
7286 // if C2 is not less than C1, the comparison is always false.
7287 // But we will only be able to produce the comparison that will give the
7288 // opposive tautological answer. So this lane would need to be fixed up.
7289 bool TautologicalInvertedLane = D.ule(Cmp);
7290 HadTautologicalInvertedLanes |= TautologicalInvertedLane;
7291
7292 // If all lanes are tautological (either all divisors are ones, or divisor
7293 // is not greater than the constant we are comparing with),
7294 // we will prefer to avoid the fold.
7295 bool TautologicalLane = D.isOne() || TautologicalInvertedLane;
7296 HadTautologicalLanes |= TautologicalLane;
7297 AllLanesAreTautological &= TautologicalLane;
7298
7299 // If we are comparing with non-zero, we need'll need to subtract said
7300 // comparison value from the LHS. But there is no point in doing that if
7301 // every lane where we are comparing with non-zero is tautological..
7302 if (!Cmp.isZero())
7303 AllComparisonsWithNonZerosAreTautological &= TautologicalLane;
7304
7305 // Decompose D into D0 * 2^K
7306 unsigned K = D.countr_zero();
7307 assert((!D.isOne() || (K == 0)) && "For divisor '1' we won't rotate.");
7308 APInt D0 = D.lshr(K);
7309
7310 // D is even if it has trailing zeros.
7311 HadEvenDivisor |= (K != 0);
7312 // D is a power-of-two if D0 is one.
7313 // If all divisors are power-of-two, we will prefer to avoid the fold.
7314 AllDivisorsArePowerOfTwo &= D0.isOne();
7315
7316 // P = inv(D0, 2^W)
7317 // 2^W requires W + 1 bits, so we have to extend and then truncate.
7318 unsigned W = D.getBitWidth();
7319 APInt P = D0.multiplicativeInverse();
7320 assert((D0 * P).isOne() && "Multiplicative inverse basic check failed.");
7321
7322 // Q = floor((2^W - 1) u/ D)
7323 // R = ((2^W - 1) u% D)
7324 APInt Q, R;
7326
7327 // If we are comparing with zero, then that comparison constant is okay,
7328 // else it may need to be one less than that.
7329 if (Cmp.ugt(R))
7330 Q -= 1;
7331
7333 "We are expecting that K is always less than all-ones for ShSVT");
7334
7335 // If the lane is tautological the result can be constant-folded.
7336 if (TautologicalLane) {
7337 // Set P and K amount to a bogus values so we can try to splat them.
7338 P = 0;
7339 KAmts.push_back(DAG.getAllOnesConstant(DL, ShSVT));
7340 // And ensure that comparison constant is tautological,
7341 // it will always compare true/false.
7342 Q.setAllBits();
7343 } else {
7344 KAmts.push_back(DAG.getConstant(K, DL, ShSVT));
7345 }
7346
7347 PAmts.push_back(DAG.getConstant(P, DL, SVT));
7348 QAmts.push_back(DAG.getConstant(Q, DL, SVT));
7349 return true;
7350 };
7351
7352 SDValue N = REMNode.getOperand(0);
7353 SDValue D = REMNode.getOperand(1);
7354
7355 // Collect the values from each element.
7356 if (!ISD::matchBinaryPredicate(D, CompTargetNode, BuildUREMPattern))
7357 return SDValue();
7358
7359 // If all lanes are tautological, the result can be constant-folded.
7360 if (AllLanesAreTautological)
7361 return SDValue();
7362
7363 // If this is a urem by a powers-of-two, avoid the fold since it can be
7364 // best implemented as a bit test.
7365 if (AllDivisorsArePowerOfTwo)
7366 return SDValue();
7367
7368 SDValue PVal, KVal, QVal;
7369 if (D.getOpcode() == ISD::BUILD_VECTOR) {
7370 if (HadTautologicalLanes) {
7371 // Try to turn PAmts into a splat, since we don't care about the values
7372 // that are currently '0'. If we can't, just keep '0'`s.
7374 // Try to turn KAmts into a splat, since we don't care about the values
7375 // that are currently '-1'. If we can't, change them to '0'`s.
7377 DAG.getConstant(0, DL, ShSVT));
7378 }
7379
7380 PVal = DAG.getBuildVector(VT, DL, PAmts);
7381 KVal = DAG.getBuildVector(ShVT, DL, KAmts);
7382 QVal = DAG.getBuildVector(VT, DL, QAmts);
7383 } else if (D.getOpcode() == ISD::SPLAT_VECTOR) {
7384 assert(PAmts.size() == 1 && KAmts.size() == 1 && QAmts.size() == 1 &&
7385 "Expected matchBinaryPredicate to return one element for "
7386 "SPLAT_VECTORs");
7387 PVal = DAG.getSplatVector(VT, DL, PAmts[0]);
7388 KVal = DAG.getSplatVector(ShVT, DL, KAmts[0]);
7389 QVal = DAG.getSplatVector(VT, DL, QAmts[0]);
7390 } else {
7391 PVal = PAmts[0];
7392 KVal = KAmts[0];
7393 QVal = QAmts[0];
7394 }
7395
7396 if (!ComparingWithAllZeros && !AllComparisonsWithNonZerosAreTautological) {
7397 if (!DCI.isBeforeLegalizeOps() && !isOperationLegalOrCustom(ISD::SUB, VT))
7398 return SDValue(); // FIXME: Could/should use `ISD::ADD`?
7399 assert(CompTargetNode.getValueType() == N.getValueType() &&
7400 "Expecting that the types on LHS and RHS of comparisons match.");
7401 N = DAG.getNode(ISD::SUB, DL, VT, N, CompTargetNode);
7402 }
7403
7404 // (mul N, P)
7405 SDValue Op0 = DAG.getNode(ISD::MUL, DL, VT, N, PVal);
7406 Created.push_back(Op0.getNode());
7407
7408 // Rotate right only if any divisor was even. We avoid rotates for all-odd
7409 // divisors as a performance improvement, since rotating by 0 is a no-op.
7410 if (HadEvenDivisor) {
7411 // We need ROTR to do this.
7412 if (!DCI.isBeforeLegalizeOps() && !isOperationLegalOrCustom(ISD::ROTR, VT))
7413 return SDValue();
7414 // UREM: (rotr (mul N, P), K)
7415 Op0 = DAG.getNode(ISD::ROTR, DL, VT, Op0, KVal);
7416 Created.push_back(Op0.getNode());
7417 }
7418
7419 // UREM: (setule/setugt (rotr (mul N, P), K), Q)
7420 SDValue NewCC =
7421 DAG.getSetCC(DL, SETCCVT, Op0, QVal,
7423 if (!HadTautologicalInvertedLanes)
7424 return NewCC;
7425
7426 // If any lanes previously compared always-false, the NewCC will give
7427 // always-true result for them, so we need to fixup those lanes.
7428 // Or the other way around for inequality predicate.
7429 assert(VT.isVector() && "Can/should only get here for vectors.");
7430 Created.push_back(NewCC.getNode());
7431
7432 // x u% C1` is *always* less than C1. So given `x u% C1 == C2`,
7433 // if C2 is not less than C1, the comparison is always false.
7434 // But we have produced the comparison that will give the
7435 // opposive tautological answer. So these lanes would need to be fixed up.
7436 SDValue TautologicalInvertedChannels =
7437 DAG.getSetCC(DL, SETCCVT, D, CompTargetNode, ISD::SETULE);
7438 Created.push_back(TautologicalInvertedChannels.getNode());
7439
7440 // NOTE: we avoid letting illegal types through even if we're before legalize
7441 // ops – legalization has a hard time producing good code for this.
7442 if (isOperationLegalOrCustom(ISD::VSELECT, SETCCVT)) {
7443 // If we have a vector select, let's replace the comparison results in the
7444 // affected lanes with the correct tautological result.
7445 SDValue Replacement = DAG.getBoolConstant(Cond == ISD::SETEQ ? false : true,
7446 DL, SETCCVT, SETCCVT);
7447 return DAG.getNode(ISD::VSELECT, DL, SETCCVT, TautologicalInvertedChannels,
7448 Replacement, NewCC);
7449 }
7450
7451 // Else, we can just invert the comparison result in the appropriate lanes.
7452 //
7453 // NOTE: see the note above VSELECT above.
7454 if (isOperationLegalOrCustom(ISD::XOR, SETCCVT))
7455 return DAG.getNode(ISD::XOR, DL, SETCCVT, NewCC,
7456 TautologicalInvertedChannels);
7457
7458 return SDValue(); // Don't know how to lower.
7459}
7460
7461/// Given an ISD::SREM used only by an ISD::SETEQ or ISD::SETNE
7462/// where the divisor is constant and the comparison target is zero,
7463/// return a DAG expression that will generate the same comparison result
7464/// using only multiplications, additions and shifts/rotations.
7465/// Ref: "Hacker's Delight" 10-17.
7466SDValue TargetLowering::buildSREMEqFold(EVT SETCCVT, SDValue REMNode,
7467 SDValue CompTargetNode,
7469 DAGCombinerInfo &DCI,
7470 const SDLoc &DL) const {
7472 if (SDValue Folded = prepareSREMEqFold(SETCCVT, REMNode, CompTargetNode, Cond,
7473 DCI, DL, Built)) {
7474 assert(Built.size() <= 7 && "Max size prediction failed.");
7475 for (SDNode *N : Built)
7476 DCI.AddToWorklist(N);
7477 return Folded;
7478 }
7479
7480 return SDValue();
7481}
7482
7483SDValue
7484TargetLowering::prepareSREMEqFold(EVT SETCCVT, SDValue REMNode,
7485 SDValue CompTargetNode, ISD::CondCode Cond,
7486 DAGCombinerInfo &DCI, const SDLoc &DL,
7487 SmallVectorImpl<SDNode *> &Created) const {
7488 // Derived from Hacker's Delight, 2nd Edition, by Hank Warren. Section 10-17.
7489 // Fold:
7490 // (seteq/ne (srem N, D), 0)
7491 // To:
7492 // (setule/ugt (rotr (add (mul N, P), A), K), Q)
7493 //
7494 // - D must be constant, with D = D0 * 2^K where D0 is odd
7495 // - P is the multiplicative inverse of D0 modulo 2^W
7496 // - A = bitwiseand(floor((2^(W - 1) - 1) / D0), (-(2^k)))
7497 // - Q = floor((2 * A) / (2^K))
7498 // where W is the width of the common type of N and D.
7499 //
7500 // When D is a power of two (and thus D0 is 1), the normal
7501 // formula for A and Q don't apply, because the derivation
7502 // depends on D not dividing 2^(W-1), and thus theorem ZRS
7503 // does not apply. This specifically fails when N = INT_MIN.
7504 //
7505 // Instead, for power-of-two D, we use:
7506 // - A = 0
7507 // | -> No offset needed. We're effectively treating it the same as urem.
7508 // - Q = 2^(W-K) - 1
7509 // |-> Test that the top K bits are zero after rotation
7510 assert((Cond == ISD::SETEQ || Cond == ISD::SETNE) &&
7511 "Only applicable for (in)equality comparisons.");
7512
7513 SelectionDAG &DAG = DCI.DAG;
7514
7515 EVT VT = REMNode.getValueType();
7516 EVT SVT = VT.getScalarType();
7517 EVT ShVT = getShiftAmountTy(VT, DAG.getDataLayout());
7518 EVT ShSVT = ShVT.getScalarType();
7519
7520 // If we are after ops legalization, and MUL is unavailable, we can not
7521 // proceed.
7522 if (!DCI.isBeforeLegalizeOps() && !isOperationLegalOrCustom(ISD::MUL, VT))
7523 return SDValue();
7524
7525 // TODO: Could support comparing with non-zero too.
7526 ConstantSDNode *CompTarget = isConstOrConstSplat(CompTargetNode);
7527 if (!CompTarget || !CompTarget->isZero())
7528 return SDValue();
7529
7530 bool HadOneDivisor = false;
7531 bool AllDivisorsAreOnes = true;
7532 bool HadEvenDivisor = false;
7533 bool AllDivisorsArePowerOfTwo = true;
7534 SmallVector<SDValue, 16> PAmts, AAmts, KAmts, QAmts;
7535
7536 auto BuildSREMPattern = [&](ConstantSDNode *C) {
7537 // Division by 0 is UB. Leave it to be constant-folded elsewhere.
7538 if (C->isZero())
7539 return false;
7540
7541 // FIXME: we don't fold `rem %X, -C` to `rem %X, C` in DAGCombine.
7542
7543 // WARNING: this fold is only valid for positive divisors!
7544 // `rem %X, -C` is equivalent to `rem %X, C`
7545 APInt D = C->getAPIntValue().abs();
7546
7547 // If all divisors are ones, we will prefer to avoid the fold.
7548 HadOneDivisor |= D.isOne();
7549 AllDivisorsAreOnes &= D.isOne();
7550
7551 // Decompose D into D0 * 2^K
7552 unsigned K = D.countr_zero();
7553 assert((!D.isOne() || (K == 0)) && "For divisor '1' we won't rotate.");
7554 APInt D0 = D.lshr(K);
7555
7556 // D is even if it has trailing zeros.
7557 HadEvenDivisor |= (K != 0);
7558
7559 // D is a power-of-two if D0 is one. This includes INT_MIN.
7560 // If all divisors are power-of-two, we will prefer to avoid the fold.
7561 AllDivisorsArePowerOfTwo &= D0.isOne();
7562
7563 // P = inv(D0, 2^W)
7564 // 2^W requires W + 1 bits, so we have to extend and then truncate.
7565 unsigned W = D.getBitWidth();
7566 APInt P = D0.multiplicativeInverse();
7567 assert((D0 * P).isOne() && "Multiplicative inverse basic check failed.");
7568
7569 // A = floor((2^(W - 1) - 1) / D0) & -2^K
7570 APInt A = APInt::getSignedMaxValue(W).udiv(D0);
7571 A.clearLowBits(K);
7572
7573 // Q = floor((2 * A) / (2^K))
7574 APInt Q = (2 * A).udiv(APInt::getOneBitSet(W, K));
7575
7577 "We are expecting that A is always less than all-ones for SVT");
7579 "We are expecting that K is always less than all-ones for ShSVT");
7580
7581 // If D was a power of two, apply the alternate constant derivation.
7582 if (D0.isOne()) {
7583 // A = 0
7584 A = APInt(W, 0);
7585 // - Q = 2^(W-K) - 1
7586 Q = APInt::getLowBitsSet(W, W - K);
7587 }
7588
7589 // If the divisor is 1 the result can be constant-folded.
7590 if (D.isOne()) {
7591 // Set P, A and K to a bogus values so we can try to splat them.
7592 P = 0;
7593 A.setAllBits();
7594 KAmts.push_back(DAG.getAllOnesConstant(DL, ShSVT));
7595
7596 // x ?% 1 == 0 <--> true <--> x u<= -1
7597 Q.setAllBits();
7598 } else {
7599 KAmts.push_back(DAG.getConstant(K, DL, ShSVT));
7600 }
7601
7602 PAmts.push_back(DAG.getConstant(P, DL, SVT));
7603 AAmts.push_back(DAG.getConstant(A, DL, SVT));
7604 QAmts.push_back(DAG.getConstant(Q, DL, SVT));
7605 return true;
7606 };
7607
7608 SDValue N = REMNode.getOperand(0);
7609 SDValue D = REMNode.getOperand(1);
7610
7611 // Collect the values from each element.
7612 if (!ISD::matchUnaryPredicate(D, BuildSREMPattern))
7613 return SDValue();
7614
7615 // If this is a srem by a one, avoid the fold since it can be constant-folded.
7616 if (AllDivisorsAreOnes)
7617 return SDValue();
7618
7619 // If this is a srem by a powers-of-two (including INT_MIN), avoid the fold
7620 // since it can be best implemented as a bit test.
7621 if (AllDivisorsArePowerOfTwo)
7622 return SDValue();
7623
7624 SDValue PVal, AVal, KVal, QVal;
7625 if (D.getOpcode() == ISD::BUILD_VECTOR) {
7626 if (HadOneDivisor) {
7627 // Try to turn PAmts into a splat, since we don't care about the values
7628 // that are currently '0'. If we can't, just keep '0'`s.
7630 // Try to turn AAmts into a splat, since we don't care about the
7631 // values that are currently '-1'. If we can't, change them to '0'`s.
7633 DAG.getConstant(0, DL, SVT));
7634 // Try to turn KAmts into a splat, since we don't care about the values
7635 // that are currently '-1'. If we can't, change them to '0'`s.
7637 DAG.getConstant(0, DL, ShSVT));
7638 }
7639
7640 PVal = DAG.getBuildVector(VT, DL, PAmts);
7641 AVal = DAG.getBuildVector(VT, DL, AAmts);
7642 KVal = DAG.getBuildVector(ShVT, DL, KAmts);
7643 QVal = DAG.getBuildVector(VT, DL, QAmts);
7644 } else if (D.getOpcode() == ISD::SPLAT_VECTOR) {
7645 assert(PAmts.size() == 1 && AAmts.size() == 1 && KAmts.size() == 1 &&
7646 QAmts.size() == 1 &&
7647 "Expected matchUnaryPredicate to return one element for scalable "
7648 "vectors");
7649 PVal = DAG.getSplatVector(VT, DL, PAmts[0]);
7650 AVal = DAG.getSplatVector(VT, DL, AAmts[0]);
7651 KVal = DAG.getSplatVector(ShVT, DL, KAmts[0]);
7652 QVal = DAG.getSplatVector(VT, DL, QAmts[0]);
7653 } else {
7654 assert(isa<ConstantSDNode>(D) && "Expected a constant");
7655 PVal = PAmts[0];
7656 AVal = AAmts[0];
7657 KVal = KAmts[0];
7658 QVal = QAmts[0];
7659 }
7660
7661 // (mul N, P)
7662 SDValue Op0 = DAG.getNode(ISD::MUL, DL, VT, N, PVal);
7663 Created.push_back(Op0.getNode());
7664
7665 // We need ADD to do this.
7666 if (!DCI.isBeforeLegalizeOps() && !isOperationLegalOrCustom(ISD::ADD, VT))
7667 return SDValue();
7668
7669 // (add (mul N, P), A)
7670 Op0 = DAG.getNode(ISD::ADD, DL, VT, Op0, AVal);
7671 Created.push_back(Op0.getNode());
7672
7673 // Rotate right only if any divisor was even. We avoid rotates for all-odd
7674 // divisors as a performance improvement, since rotating by 0 is a no-op.
7675 if (HadEvenDivisor) {
7676 // We need ROTR to do this.
7677 if (!DCI.isBeforeLegalizeOps() && !isOperationLegalOrCustom(ISD::ROTR, VT))
7678 return SDValue();
7679 // SREM: (rotr (add (mul N, P), A), K)
7680 Op0 = DAG.getNode(ISD::ROTR, DL, VT, Op0, KVal);
7681 Created.push_back(Op0.getNode());
7682 }
7683
7684 // SREM: (setule/setugt (rotr (add (mul N, P), A), K), Q)
7685 return DAG.getSetCC(DL, SETCCVT, Op0, QVal,
7687}
7688
7690 const DenormalMode &Mode,
7691 SDNodeFlags Flags) const {
7692 SDLoc DL(Op);
7693 EVT VT = Op.getValueType();
7694 EVT CCVT = getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
7695 SDValue FPZero = DAG.getConstantFP(0.0, DL, VT);
7696
7697 // This is specifically a check for the handling of denormal inputs, not the
7698 // result.
7699 if (Mode.Input == DenormalMode::PreserveSign ||
7700 Mode.Input == DenormalMode::PositiveZero) {
7701 // Test = X == 0.0
7702 return DAG.getSetCC(DL, CCVT, Op, FPZero, ISD::SETEQ, /*Chain=*/{},
7703 /*Signaling=*/false, Flags);
7704 }
7705
7706 // Testing it with denormal inputs to avoid wrong estimate.
7707 //
7708 // Test = fabs(X) < SmallestNormal
7709 const fltSemantics &FltSem = VT.getFltSemantics();
7710 APFloat SmallestNorm = APFloat::getSmallestNormalized(FltSem);
7711 SDValue NormC = DAG.getConstantFP(SmallestNorm, DL, VT);
7712 SDValue Fabs = DAG.getNode(ISD::FABS, DL, VT, Op, Flags);
7713 return DAG.getSetCC(DL, CCVT, Fabs, NormC, ISD::SETLT, /*Chain=*/{},
7714 /*Signaling=*/false, Flags);
7715}
7716
7718 bool LegalOps, bool OptForSize,
7720 unsigned Depth) const {
7721 // fneg is removable even if it has multiple uses.
7722 if (Op.getOpcode() == ISD::FNEG) {
7724 return Op.getOperand(0);
7725 }
7726
7727 // Don't recurse exponentially.
7729 return SDValue();
7730
7731 // Pre-increment recursion depth for use in recursive calls.
7732 ++Depth;
7733 const SDNodeFlags Flags = Op->getFlags();
7734 EVT VT = Op.getValueType();
7735 unsigned Opcode = Op.getOpcode();
7736
7737 // Don't allow anything with multiple uses unless we know it is free.
7738 if (!Op.hasOneUse() && Opcode != ISD::ConstantFP) {
7739 bool IsFreeExtend = Opcode == ISD::FP_EXTEND &&
7740 isFPExtFree(VT, Op.getOperand(0).getValueType());
7741 if (!IsFreeExtend)
7742 return SDValue();
7743 }
7744
7745 auto RemoveDeadNode = [&](SDValue N) {
7746 if (N && N.getNode()->use_empty())
7747 DAG.RemoveDeadNode(N.getNode());
7748 };
7749
7750 SDLoc DL(Op);
7751
7752 // Because getNegatedExpression can delete nodes we need a handle to keep
7753 // temporary nodes alive in case the recursion manages to create an identical
7754 // node.
7755 std::list<HandleSDNode> Handles;
7756
7757 switch (Opcode) {
7758 case ISD::ConstantFP: {
7759 // Don't invert constant FP values after legalization unless the target says
7760 // the negated constant is legal.
7761 bool IsOpLegal =
7763 isFPImmLegal(neg(cast<ConstantFPSDNode>(Op)->getValueAPF()), VT,
7764 OptForSize);
7765
7766 if (LegalOps && !IsOpLegal)
7767 break;
7768
7769 APFloat V = cast<ConstantFPSDNode>(Op)->getValueAPF();
7770 V.changeSign();
7771 SDValue CFP = DAG.getConstantFP(V, DL, VT);
7772
7773 // If we already have the use of the negated floating constant, it is free
7774 // to negate it even it has multiple uses.
7775 if (!Op.hasOneUse() && CFP.use_empty())
7776 break;
7778 return CFP;
7779 }
7780 case ISD::SPLAT_VECTOR: {
7781 // fold splat_vector(fneg(X)) -> splat_vector(-X)
7782 SDValue X = Op.getOperand(0);
7784 break;
7785
7786 SDValue NegX = getCheaperNegatedExpression(X, DAG, LegalOps, OptForSize);
7787 if (!NegX)
7788 break;
7790 return DAG.getNode(ISD::SPLAT_VECTOR, DL, VT, NegX);
7791 }
7792 case ISD::BUILD_VECTOR: {
7793 // Only permit BUILD_VECTOR of constants.
7794 if (llvm::any_of(Op->op_values(), [&](SDValue N) {
7795 return !N.isUndef() && !isa<ConstantFPSDNode>(N);
7796 }))
7797 break;
7798
7799 bool IsOpLegal =
7802 llvm::all_of(Op->op_values(), [&](SDValue N) {
7803 return N.isUndef() ||
7804 isFPImmLegal(neg(cast<ConstantFPSDNode>(N)->getValueAPF()), VT,
7805 OptForSize);
7806 });
7807
7808 if (LegalOps && !IsOpLegal)
7809 break;
7810
7812 for (SDValue C : Op->op_values()) {
7813 if (C.isUndef()) {
7814 Ops.push_back(C);
7815 continue;
7816 }
7817 APFloat V = cast<ConstantFPSDNode>(C)->getValueAPF();
7818 V.changeSign();
7819 Ops.push_back(DAG.getConstantFP(V, DL, C.getValueType()));
7820 }
7822 return DAG.getBuildVector(VT, DL, Ops);
7823 }
7824 case ISD::FADD: {
7825 if (!Flags.hasNoSignedZeros())
7826 break;
7827
7828 // After operation legalization, it might not be legal to create new FSUBs.
7829 if (LegalOps && !isOperationLegalOrCustom(ISD::FSUB, VT))
7830 break;
7831 SDValue X = Op.getOperand(0), Y = Op.getOperand(1);
7832
7833 // fold (fneg (fadd X, Y)) -> (fsub (fneg X), Y)
7835 SDValue NegX =
7836 getNegatedExpression(X, DAG, LegalOps, OptForSize, CostX, Depth);
7837 // Prevent this node from being deleted by the next call.
7838 if (NegX)
7839 Handles.emplace_back(NegX);
7840
7841 // fold (fneg (fadd X, Y)) -> (fsub (fneg Y), X)
7843 SDValue NegY =
7844 getNegatedExpression(Y, DAG, LegalOps, OptForSize, CostY, Depth);
7845
7846 // We're done with the handles.
7847 Handles.clear();
7848
7849 // Negate the X if its cost is less or equal than Y.
7850 if (NegX && (CostX <= CostY)) {
7851 Cost = CostX;
7852 SDValue N = DAG.getNode(ISD::FSUB, DL, VT, NegX, Y, Flags);
7853 if (NegY != N)
7854 RemoveDeadNode(NegY);
7855 return N;
7856 }
7857
7858 // Negate the Y if it is not expensive.
7859 if (NegY) {
7860 Cost = CostY;
7861 SDValue N = DAG.getNode(ISD::FSUB, DL, VT, NegY, X, Flags);
7862 if (NegX != N)
7863 RemoveDeadNode(NegX);
7864 return N;
7865 }
7866 break;
7867 }
7868 case ISD::FSUB: {
7869 // We can't turn -(A-B) into B-A when we honor signed zeros.
7870 if (!Flags.hasNoSignedZeros())
7871 break;
7872
7873 SDValue X = Op.getOperand(0), Y = Op.getOperand(1);
7874 // fold (fneg (fsub 0, Y)) -> Y
7875 if (ConstantFPSDNode *C = isConstOrConstSplatFP(X, /*AllowUndefs*/ true))
7876 if (C->isZero()) {
7878 return Y;
7879 }
7880
7881 // fold (fneg (fsub X, Y)) -> (fsub Y, X)
7883 return DAG.getNode(ISD::FSUB, DL, VT, Y, X, Flags);
7884 }
7885 case ISD::FMUL:
7886 case ISD::FDIV: {
7887 SDValue X = Op.getOperand(0), Y = Op.getOperand(1);
7888
7889 // fold (fneg (fmul X, Y)) -> (fmul (fneg X), Y)
7891 SDValue NegX =
7892 getNegatedExpression(X, DAG, LegalOps, OptForSize, CostX, Depth);
7893 // Prevent this node from being deleted by the next call.
7894 if (NegX)
7895 Handles.emplace_back(NegX);
7896
7897 // fold (fneg (fmul X, Y)) -> (fmul X, (fneg Y))
7899 SDValue NegY =
7900 getNegatedExpression(Y, DAG, LegalOps, OptForSize, CostY, Depth);
7901
7902 // We're done with the handles.
7903 Handles.clear();
7904
7905 // Negate the X if its cost is less or equal than Y.
7906 if (NegX && (CostX <= CostY)) {
7907 Cost = CostX;
7908 SDValue N = DAG.getNode(Opcode, DL, VT, NegX, Y, Flags);
7909 if (NegY != N)
7910 RemoveDeadNode(NegY);
7911 return N;
7912 }
7913
7914 // Ignore X * 2.0 because that is expected to be canonicalized to X + X.
7915 if (auto *C = isConstOrConstSplatFP(Op.getOperand(1)))
7916 if (C->isExactlyValue(2.0) && Op.getOpcode() == ISD::FMUL)
7917 break;
7918
7919 // Negate the Y if it is not expensive.
7920 if (NegY) {
7921 Cost = CostY;
7922 SDValue N = DAG.getNode(Opcode, DL, VT, X, NegY, Flags);
7923 if (NegX != N)
7924 RemoveDeadNode(NegX);
7925 return N;
7926 }
7927 break;
7928 }
7929 case ISD::FMA:
7930 case ISD::FMULADD:
7931 case ISD::FMAD: {
7932 if (!Flags.hasNoSignedZeros())
7933 break;
7934
7935 SDValue X = Op.getOperand(0), Y = Op.getOperand(1), Z = Op.getOperand(2);
7937 SDValue NegZ =
7938 getNegatedExpression(Z, DAG, LegalOps, OptForSize, CostZ, Depth);
7939 // Give up if fail to negate the Z.
7940 if (!NegZ)
7941 break;
7942
7943 // Prevent this node from being deleted by the next two calls.
7944 Handles.emplace_back(NegZ);
7945
7946 // fold (fneg (fma X, Y, Z)) -> (fma (fneg X), Y, (fneg Z))
7948 SDValue NegX =
7949 getNegatedExpression(X, DAG, LegalOps, OptForSize, CostX, Depth);
7950 // Prevent this node from being deleted by the next call.
7951 if (NegX)
7952 Handles.emplace_back(NegX);
7953
7954 // fold (fneg (fma X, Y, Z)) -> (fma X, (fneg Y), (fneg Z))
7956 SDValue NegY =
7957 getNegatedExpression(Y, DAG, LegalOps, OptForSize, CostY, Depth);
7958
7959 // We're done with the handles.
7960 Handles.clear();
7961
7962 // Negate the X if its cost is less or equal than Y.
7963 if (NegX && (CostX <= CostY)) {
7964 Cost = std::min(CostX, CostZ);
7965 SDValue N = DAG.getNode(Opcode, DL, VT, NegX, Y, NegZ, Flags);
7966 if (NegY != N)
7967 RemoveDeadNode(NegY);
7968 return N;
7969 }
7970
7971 // Negate the Y if it is not expensive.
7972 if (NegY) {
7973 Cost = std::min(CostY, CostZ);
7974 SDValue N = DAG.getNode(Opcode, DL, VT, X, NegY, NegZ, Flags);
7975 if (NegX != N)
7976 RemoveDeadNode(NegX);
7977 return N;
7978 }
7979 break;
7980 }
7981
7982 case ISD::FP_EXTEND:
7983 case ISD::FSIN:
7984 if (SDValue NegV = getNegatedExpression(Op.getOperand(0), DAG, LegalOps,
7985 OptForSize, Cost, Depth))
7986 return DAG.getNode(Opcode, DL, VT, NegV);
7987 break;
7988 case ISD::FP_ROUND:
7989 if (SDValue NegV = getNegatedExpression(Op.getOperand(0), DAG, LegalOps,
7990 OptForSize, Cost, Depth))
7991 return DAG.getNode(ISD::FP_ROUND, DL, VT, NegV, Op.getOperand(1));
7992 break;
7993 case ISD::SELECT:
7994 case ISD::VSELECT: {
7995 // fold (fneg (select C, LHS, RHS)) -> (select C, (fneg LHS), (fneg RHS))
7996 // iff at least one cost is cheaper and the other is neutral/cheaper
7997 SDValue LHS = Op.getOperand(1);
7999 SDValue NegLHS =
8000 getNegatedExpression(LHS, DAG, LegalOps, OptForSize, CostLHS, Depth);
8001 if (!NegLHS || CostLHS > NegatibleCost::Neutral) {
8002 RemoveDeadNode(NegLHS);
8003 break;
8004 }
8005
8006 // Prevent this node from being deleted by the next call.
8007 Handles.emplace_back(NegLHS);
8008
8009 SDValue RHS = Op.getOperand(2);
8011 SDValue NegRHS =
8012 getNegatedExpression(RHS, DAG, LegalOps, OptForSize, CostRHS, Depth);
8013
8014 // We're done with the handles.
8015 Handles.clear();
8016
8017 if (!NegRHS || CostRHS > NegatibleCost::Neutral ||
8018 (CostLHS != NegatibleCost::Cheaper &&
8019 CostRHS != NegatibleCost::Cheaper)) {
8020 RemoveDeadNode(NegLHS);
8021 RemoveDeadNode(NegRHS);
8022 break;
8023 }
8024
8025 Cost = std::min(CostLHS, CostRHS);
8026 return DAG.getSelect(DL, VT, Op.getOperand(0), NegLHS, NegRHS);
8027 }
8028 }
8029
8030 return SDValue();
8031}
8032
8033//===----------------------------------------------------------------------===//
8034// Legalization Utilities
8035//===----------------------------------------------------------------------===//
8036
8037bool TargetLowering::expandMUL_LOHI(unsigned Opcode, EVT VT, const SDLoc &dl,
8038 SDValue LHS, SDValue RHS,
8040 EVT HiLoVT, SelectionDAG &DAG,
8041 MulExpansionKind Kind, SDValue LL,
8042 SDValue LH, SDValue RL, SDValue RH) const {
8043 assert(Opcode == ISD::MUL || Opcode == ISD::UMUL_LOHI ||
8044 Opcode == ISD::SMUL_LOHI);
8045
8046 bool HasMULHS = (Kind == MulExpansionKind::Always) ||
8048 bool HasMULHU = (Kind == MulExpansionKind::Always) ||
8050 bool HasSMUL_LOHI = (Kind == MulExpansionKind::Always) ||
8052 bool HasUMUL_LOHI = (Kind == MulExpansionKind::Always) ||
8054
8055 if (!HasMULHU && !HasMULHS && !HasUMUL_LOHI && !HasSMUL_LOHI)
8056 return false;
8057
8058 unsigned OuterBitSize = VT.getScalarSizeInBits();
8059 unsigned InnerBitSize = HiLoVT.getScalarSizeInBits();
8060
8061 // LL, LH, RL, and RH must be either all NULL or all set to a value.
8062 assert((LL.getNode() && LH.getNode() && RL.getNode() && RH.getNode()) ||
8063 (!LL.getNode() && !LH.getNode() && !RL.getNode() && !RH.getNode()));
8064
8065 auto MakeMUL_LOHI = [&](SDValue L, SDValue R, SDValue &Lo, SDValue &Hi,
8066 bool Signed) -> bool {
8067 if ((Signed && HasSMUL_LOHI) || (!Signed && HasUMUL_LOHI)) {
8068 SDVTList VTs = DAG.getVTList(HiLoVT, HiLoVT);
8069 Lo = DAG.getNode(Signed ? ISD::SMUL_LOHI : ISD::UMUL_LOHI, dl, VTs, L, R);
8070 Hi = Lo.getValue(1);
8071 return true;
8072 }
8073 if ((Signed && HasMULHS) || (!Signed && HasMULHU)) {
8074 Lo = DAG.getNode(ISD::MUL, dl, HiLoVT, L, R);
8075 Hi = DAG.getNode(Signed ? ISD::MULHS : ISD::MULHU, dl, HiLoVT, L, R);
8076 return true;
8077 }
8078 return false;
8079 };
8080
8081 SDValue Lo, Hi;
8082
8083 if (!LL.getNode() && !RL.getNode() &&
8085 LL = DAG.getNode(ISD::TRUNCATE, dl, HiLoVT, LHS);
8086 RL = DAG.getNode(ISD::TRUNCATE, dl, HiLoVT, RHS);
8087 }
8088
8089 if (!LL.getNode())
8090 return false;
8091
8092 APInt HighMask = APInt::getHighBitsSet(OuterBitSize, InnerBitSize);
8093 if (DAG.MaskedValueIsZero(LHS, HighMask) &&
8094 DAG.MaskedValueIsZero(RHS, HighMask)) {
8095 // The inputs are both zero-extended.
8096 if (MakeMUL_LOHI(LL, RL, Lo, Hi, false)) {
8097 Result.push_back(Lo);
8098 Result.push_back(Hi);
8099 if (Opcode != ISD::MUL) {
8100 SDValue Zero = DAG.getConstant(0, dl, HiLoVT);
8101 Result.push_back(Zero);
8102 Result.push_back(Zero);
8103 }
8104 return true;
8105 }
8106 }
8107
8108 if (!VT.isVector() && Opcode == ISD::MUL &&
8109 DAG.ComputeMaxSignificantBits(LHS) <= InnerBitSize &&
8110 DAG.ComputeMaxSignificantBits(RHS) <= InnerBitSize) {
8111 // The input values are both sign-extended.
8112 // TODO non-MUL case?
8113 if (MakeMUL_LOHI(LL, RL, Lo, Hi, true)) {
8114 Result.push_back(Lo);
8115 Result.push_back(Hi);
8116 return true;
8117 }
8118 }
8119
8120 unsigned ShiftAmount = OuterBitSize - InnerBitSize;
8121 SDValue Shift = DAG.getShiftAmountConstant(ShiftAmount, VT, dl);
8122
8123 if (!LH.getNode() && !RH.getNode() &&
8126 LH = DAG.getNode(ISD::SRL, dl, VT, LHS, Shift);
8127 LH = DAG.getNode(ISD::TRUNCATE, dl, HiLoVT, LH);
8128 RH = DAG.getNode(ISD::SRL, dl, VT, RHS, Shift);
8129 RH = DAG.getNode(ISD::TRUNCATE, dl, HiLoVT, RH);
8130 }
8131
8132 if (!LH.getNode())
8133 return false;
8134
8135 if (!MakeMUL_LOHI(LL, RL, Lo, Hi, false))
8136 return false;
8137
8138 Result.push_back(Lo);
8139
8140 if (Opcode == ISD::MUL) {
8141 RH = DAG.getNode(ISD::MUL, dl, HiLoVT, LL, RH);
8142 LH = DAG.getNode(ISD::MUL, dl, HiLoVT, LH, RL);
8143 Hi = DAG.getNode(ISD::ADD, dl, HiLoVT, Hi, RH);
8144 Hi = DAG.getNode(ISD::ADD, dl, HiLoVT, Hi, LH);
8145 Result.push_back(Hi);
8146 return true;
8147 }
8148
8149 // Compute the full width result.
8150 auto Merge = [&](SDValue Lo, SDValue Hi) -> SDValue {
8151 Lo = DAG.getNode(ISD::ZERO_EXTEND, dl, VT, Lo);
8152 Hi = DAG.getNode(ISD::ZERO_EXTEND, dl, VT, Hi);
8153 Hi = DAG.getNode(ISD::SHL, dl, VT, Hi, Shift);
8154 return DAG.getNode(ISD::OR, dl, VT, Lo, Hi);
8155 };
8156
8157 SDValue Next = DAG.getNode(ISD::ZERO_EXTEND, dl, VT, Hi);
8158 if (!MakeMUL_LOHI(LL, RH, Lo, Hi, false))
8159 return false;
8160
8161 // This is effectively the add part of a multiply-add of half-sized operands,
8162 // so it cannot overflow.
8163 Next = DAG.getNode(ISD::ADD, dl, VT, Next, Merge(Lo, Hi));
8164
8165 if (!MakeMUL_LOHI(LH, RL, Lo, Hi, false))
8166 return false;
8167
8168 SDValue Zero = DAG.getConstant(0, dl, HiLoVT);
8169 EVT BoolType = getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
8170
8171 bool UseGlue = (isOperationLegalOrCustom(ISD::ADDC, VT) &&
8173 if (UseGlue)
8174 Next = DAG.getNode(ISD::ADDC, dl, DAG.getVTList(VT, MVT::Glue), Next,
8175 Merge(Lo, Hi));
8176 else
8177 Next = DAG.getNode(ISD::UADDO_CARRY, dl, DAG.getVTList(VT, BoolType), Next,
8178 Merge(Lo, Hi), DAG.getConstant(0, dl, BoolType));
8179
8180 SDValue Carry = Next.getValue(1);
8181 Result.push_back(DAG.getNode(ISD::TRUNCATE, dl, HiLoVT, Next));
8182 Next = DAG.getNode(ISD::SRL, dl, VT, Next, Shift);
8183
8184 if (!MakeMUL_LOHI(LH, RH, Lo, Hi, Opcode == ISD::SMUL_LOHI))
8185 return false;
8186
8187 if (UseGlue)
8188 Hi = DAG.getNode(ISD::ADDE, dl, DAG.getVTList(HiLoVT, MVT::Glue), Hi, Zero,
8189 Carry);
8190 else
8191 Hi = DAG.getNode(ISD::UADDO_CARRY, dl, DAG.getVTList(HiLoVT, BoolType), Hi,
8192 Zero, Carry);
8193
8194 Next = DAG.getNode(ISD::ADD, dl, VT, Next, Merge(Lo, Hi));
8195
8196 if (Opcode == ISD::SMUL_LOHI) {
8197 SDValue NextSub = DAG.getNode(ISD::SUB, dl, VT, Next,
8198 DAG.getNode(ISD::ZERO_EXTEND, dl, VT, RL));
8199 Next = DAG.getSelectCC(dl, LH, Zero, NextSub, Next, ISD::SETLT);
8200
8201 NextSub = DAG.getNode(ISD::SUB, dl, VT, Next,
8202 DAG.getNode(ISD::ZERO_EXTEND, dl, VT, LL));
8203 Next = DAG.getSelectCC(dl, RH, Zero, NextSub, Next, ISD::SETLT);
8204 }
8205
8206 Result.push_back(DAG.getNode(ISD::TRUNCATE, dl, HiLoVT, Next));
8207 Next = DAG.getNode(ISD::SRL, dl, VT, Next, Shift);
8208 Result.push_back(DAG.getNode(ISD::TRUNCATE, dl, HiLoVT, Next));
8209 return true;
8210}
8211
8213 SelectionDAG &DAG, MulExpansionKind Kind,
8214 SDValue LL, SDValue LH, SDValue RL,
8215 SDValue RH) const {
8217 bool Ok = expandMUL_LOHI(N->getOpcode(), N->getValueType(0), SDLoc(N),
8218 N->getOperand(0), N->getOperand(1), Result, HiLoVT,
8219 DAG, Kind, LL, LH, RL, RH);
8220 if (Ok) {
8221 assert(Result.size() == 2);
8222 Lo = Result[0];
8223 Hi = Result[1];
8224 }
8225 return Ok;
8226}
8227
8228// Optimize unsigned division or remainder by constants for types twice as large
8229// as a legal VT.
8230//
8231// If (1 << (BitWidth / 2)) % Constant == 1, then the remainder
8232// can be computed
8233// as:
8234// Sum = __builtin_uadd_overflow(Lo, High, &Sum);
8235// Remainder = Sum % Constant;
8236//
8237// If (1 << (BitWidth / 2)) % Constant != 1, we can search for a smaller value
8238// W such that W != (BitWidth / 2) and (1 << W) % Constant == 1. We can break
8239// High:Low into 3 chunks of W bits and compute remainder as
8240// Sum = Chunk0 + Chunk1 + Chunk2;
8241// Remainder = Sum % Constant;
8242//
8243// This is based on "Remainder by Summing Digits" from Hacker's Delight.
8244//
8245// For division, we can compute the remainder using the algorithm described
8246// above, subtract it from the dividend to get an exact multiple of Constant.
8247// Then multiply that exact multiply by the multiplicative inverse modulo
8248// (1 << (BitWidth / 2)) to get the quotient.
8249
8250// If Constant is even, we can shift right the dividend and the divisor by the
8251// number of trailing zeros in Constant before applying the remainder algorithm.
8252// If we're after the quotient, we can subtract this value from the shifted
8253// dividend and multiply by the multiplicative inverse of the shifted divisor.
8254// If we want the remainder, we shift the value left by the number of trailing
8255// zeros and add the bits that were shifted out of the dividend.
8256bool TargetLowering::expandUDIVREMByConstantViaUREMDecomposition(
8257 SDNode *N, APInt Divisor, SmallVectorImpl<SDValue> &Result, EVT HiLoVT,
8258 SelectionDAG &DAG, SDValue LL, SDValue LH) const {
8259 unsigned Opcode = N->getOpcode();
8260 EVT VT = N->getValueType(0);
8261
8262 unsigned BitWidth = Divisor.getBitWidth();
8263 unsigned HBitWidth = BitWidth / 2;
8265 HiLoVT.getScalarSizeInBits() == HBitWidth && "Unexpected VTs");
8266
8267 // If the divisor is even, shift it until it becomes odd.
8268 unsigned TrailingZeros = 0;
8269 if (!Divisor[0]) {
8270 TrailingZeros = Divisor.countr_zero();
8271 Divisor.lshrInPlace(TrailingZeros);
8272 }
8273
8274 // After removing trailing zeros, the divisor needs to be less than
8275 // (1 << HBitWidth).
8276 APInt HalfMaxPlus1 = APInt::getOneBitSet(BitWidth, HBitWidth);
8277 if (Divisor.uge(HalfMaxPlus1))
8278 return false;
8279
8280 // Look for the largest chunk width W such that (1 << W) % Divisor == 1 or
8281 // (1 << W) % Divisor == -1.
8282 unsigned BestChunkWidth = 0, AltChunkWidth = 0;
8283 for (unsigned I = HBitWidth, E = HBitWidth / 2; I > E; --I) {
8284 // Skip HBitWidth-1, it doesn't have enough bits for carries.
8285 if (I == HBitWidth - 1)
8286 continue;
8287
8288 APInt Mod = APInt::getOneBitSet(Divisor.getBitWidth(), I).urem(Divisor);
8289
8290 if (Mod.isOne()) {
8291 BestChunkWidth = I;
8292 break;
8293 }
8294
8295 // We have an alternate strategy for Remainder == Divisor - 1.
8296 // FIXME: Support HBitWidth.
8297 if (I != HBitWidth && Mod == Divisor - 1)
8298 AltChunkWidth = I;
8299 }
8300
8301 bool Alternate = false;
8302 if (!BestChunkWidth) {
8303 if (!AltChunkWidth)
8304 return false;
8305 Alternate = true;
8306 BestChunkWidth = AltChunkWidth;
8307 }
8308
8309 SDLoc dl(N);
8310
8311 assert(!LL == !LH && "Expected both input halves or no input halves!");
8312 if (!LL)
8313 std::tie(LL, LH) = DAG.SplitScalar(N->getOperand(0), dl, HiLoVT, HiLoVT);
8314
8315 bool HasFSHR = isOperationLegal(ISD::FSHR, HiLoVT);
8316
8317 auto GetFSHR = [&](SDValue Lo, SDValue Hi, unsigned ShiftAmt) {
8318 assert(ShiftAmt > 0 && ShiftAmt < HBitWidth);
8319 if (HasFSHR)
8320 return DAG.getNode(ISD::FSHR, dl, HiLoVT, Hi, Lo,
8321 DAG.getShiftAmountConstant(ShiftAmt, HiLoVT, dl));
8322 return DAG.getNode(
8323 ISD::OR, dl, HiLoVT,
8324 DAG.getNode(ISD::SRL, dl, HiLoVT, Lo,
8325 DAG.getShiftAmountConstant(ShiftAmt, HiLoVT, dl)),
8326 DAG.getNode(
8327 ISD::SHL, dl, HiLoVT, Hi,
8328 DAG.getShiftAmountConstant(HBitWidth - ShiftAmt, HiLoVT, dl)));
8329 };
8330
8331 // Helper to perform a right shift on a 128-bit value split into two halves.
8332 // Handles shifts >= HBitWidth by moving Hi to Lo and shifting Hi.
8333 auto ShiftRight = [&](SDValue &Lo, SDValue &Hi, unsigned ShiftAmt) {
8334 if (ShiftAmt == 0)
8335 return;
8336 if (ShiftAmt < HBitWidth) {
8337 Lo = GetFSHR(Lo, Hi, ShiftAmt);
8338 Hi = DAG.getNode(ISD::SRL, dl, HiLoVT, Hi,
8339 DAG.getShiftAmountConstant(ShiftAmt, HiLoVT, dl));
8340 } else if (ShiftAmt == HBitWidth) {
8341 Lo = Hi;
8342 Hi = DAG.getConstant(0, dl, HiLoVT);
8343 } else {
8344 Lo = DAG.getNode(
8345 ISD::SRL, dl, HiLoVT, Hi,
8346 DAG.getShiftAmountConstant(ShiftAmt - HBitWidth, HiLoVT, dl));
8347 Hi = DAG.getConstant(0, dl, HiLoVT);
8348 }
8349 };
8350
8351 // Shift the input by the number of TrailingZeros in the divisor. The
8352 // shifted out bits will be added to the remainder later.
8353 SDValue PartialRemL, PartialRemH;
8354 if (TrailingZeros && Opcode != ISD::UDIV) {
8355 // Save the shifted off bits if we need the remainder.
8356 if (TrailingZeros < HBitWidth) {
8357 APInt Mask = APInt::getLowBitsSet(HBitWidth, TrailingZeros);
8358 PartialRemL = DAG.getNode(ISD::AND, dl, HiLoVT, LL,
8359 DAG.getConstant(Mask, dl, HiLoVT));
8360 } else if (TrailingZeros == HBitWidth) {
8361 // All of LL is part of the remainder.
8362 PartialRemL = LL;
8363 } else {
8364 // TrailingZeros > HBitWidth: LL and part of LH are the remainder.
8365 PartialRemL = LL;
8366 APInt Mask = APInt::getLowBitsSet(HBitWidth, TrailingZeros - HBitWidth);
8367 PartialRemH = DAG.getNode(ISD::AND, dl, HiLoVT, LH,
8368 DAG.getConstant(Mask, dl, HiLoVT));
8369 }
8370 }
8371
8372 SDValue Sum;
8373 // If BestChunkWidth is HBitWidth add low and high half. If there is a carry
8374 // out, add that to the final sum.
8375 if (BestChunkWidth == HBitWidth) {
8376 assert(!Alternate);
8377 // Shift LH:LL right if there were trailing zeros in the divisor.
8378 ShiftRight(LL, LH, TrailingZeros);
8379
8380 // Use uaddo_carry if we can, otherwise use a compare to detect overflow.
8381 EVT SetCCType =
8382 getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), HiLoVT);
8384 SDVTList VTList = DAG.getVTList(HiLoVT, SetCCType);
8385 Sum = DAG.getNode(ISD::UADDO, dl, VTList, LL, LH);
8386 Sum = DAG.getNode(ISD::UADDO_CARRY, dl, VTList, Sum,
8387 DAG.getConstant(0, dl, HiLoVT), Sum.getValue(1));
8388 } else {
8389 Sum = DAG.getNode(ISD::ADD, dl, HiLoVT, LL, LH);
8390 SDValue Carry = DAG.getSetCC(dl, SetCCType, Sum, LL, ISD::SETULT);
8391 // If the boolean for the target is 0 or 1, we can add the setcc result
8392 // directly.
8393 if (getBooleanContents(HiLoVT) ==
8395 Carry = DAG.getZExtOrTrunc(Carry, dl, HiLoVT);
8396 else
8397 Carry = DAG.getSelect(dl, HiLoVT, Carry, DAG.getConstant(1, dl, HiLoVT),
8398 DAG.getConstant(0, dl, HiLoVT));
8399 Sum = DAG.getNode(ISD::ADD, dl, HiLoVT, Sum, Carry);
8400 }
8401 } else {
8402 // Otherwise split into multple chunks and add them together. We chose
8403 // BestChunkWidth so that the sum will not overflow.
8404 SDValue Mask = DAG.getConstant(
8405 APInt::getLowBitsSet(HBitWidth, BestChunkWidth), dl, HiLoVT);
8406
8407 for (unsigned I = 0; I < BitWidth - TrailingZeros; I += BestChunkWidth) {
8408 // If there were trailing zeros in the divisor, increase the shift amount.
8409 unsigned Shift = I + TrailingZeros;
8410 SDValue Chunk;
8411 if (Shift == 0)
8412 Chunk = LL;
8413 else if (Shift >= HBitWidth)
8414 Chunk = DAG.getNode(
8415 ISD::SRL, dl, HiLoVT, LH,
8416 DAG.getShiftAmountConstant(Shift - HBitWidth, HiLoVT, dl));
8417 else
8418 Chunk = GetFSHR(LL, LH, Shift);
8419 // If we're on the last chunk, we don't need an AND.
8420 if (I + BestChunkWidth < BitWidth - TrailingZeros)
8421 Chunk = DAG.getNode(ISD::AND, dl, HiLoVT, Chunk, Mask);
8422 if (!Sum) {
8423 Sum = Chunk;
8424 } else {
8425 // For Alternate, we need to subtract odd chunks.
8426 unsigned ChunkNum = I / BestChunkWidth;
8427 unsigned Opc = (Alternate && (ChunkNum % 2) != 0) ? ISD::SUB : ISD::ADD;
8428 Sum = DAG.getNode(Opc, dl, HiLoVT, Sum, Chunk);
8429 }
8430 }
8431
8432 // For Alternate, the sum may be negative, but we need a positive sum. We
8433 // can increase it by a multiple of the divisor to make it positive. For 3
8434 // chunks the largest negative value is -(2^BestChunkWidth - 1). For 4
8435 // chunks, it's 2*-(2^BestChunkWidth - 1). We know that 2^BestChunkWidth + 1
8436 // is a multiple of the divisor. Add that 1 or 2 times to make the sum
8437 // positive.
8438 if (Alternate) {
8439 unsigned NumChunks = divideCeil(BitWidth - TrailingZeros, BestChunkWidth);
8440 assert(NumChunks <= 4);
8441
8442 APInt Adjust = APInt::getOneBitSet(HBitWidth, BestChunkWidth);
8443 Adjust.setBit(0);
8444 // If there are 4 chunks, we need to adjust twice.
8445 if (NumChunks == 4)
8446 Adjust <<= 1;
8447 Sum = DAG.getNode(ISD::ADD, dl, HiLoVT, Sum,
8448 DAG.getConstant(Adjust, dl, HiLoVT));
8449 }
8450 }
8451
8452 // Perform a HiLoVT urem on the Sum using truncated divisor.
8453 SDValue RemL =
8454 DAG.getNode(ISD::UREM, dl, HiLoVT, Sum,
8455 DAG.getConstant(Divisor.trunc(HBitWidth), dl, HiLoVT));
8456 SDValue RemH = DAG.getConstant(0, dl, HiLoVT);
8457
8458 if (Opcode != ISD::UREM) {
8459 // If we didn't shift LH/LR earlier, do it now.
8460 if (BestChunkWidth != HBitWidth)
8461 ShiftRight(LL, LH, TrailingZeros);
8462
8463 // Subtract the remainder from the shifted dividend.
8464 SDValue Dividend = DAG.getNode(ISD::BUILD_PAIR, dl, VT, LL, LH);
8465 SDValue Rem = DAG.getNode(ISD::BUILD_PAIR, dl, VT, RemL, RemH);
8466
8467 Dividend = DAG.getNode(ISD::SUB, dl, VT, Dividend, Rem);
8468
8469 // Multiply by the multiplicative inverse of the divisor modulo
8470 // (1 << BitWidth).
8471 APInt MulFactor = Divisor.multiplicativeInverse();
8472
8473 SDValue Quotient = DAG.getNode(ISD::MUL, dl, VT, Dividend,
8474 DAG.getConstant(MulFactor, dl, VT));
8475
8476 // Split the quotient into low and high parts.
8477 SDValue QuotL, QuotH;
8478 std::tie(QuotL, QuotH) = DAG.SplitScalar(Quotient, dl, HiLoVT, HiLoVT);
8479 Result.push_back(QuotL);
8480 Result.push_back(QuotH);
8481 }
8482
8483 if (Opcode != ISD::UDIV) {
8484 // If we shifted the input, shift the remainder left and add the bits we
8485 // shifted off the input.
8486 if (TrailingZeros) {
8487 if (TrailingZeros < HBitWidth) {
8488 // Shift RemH:RemL left by TrailingZeros.
8489 // RemH gets the high bits shifted out of RemL.
8490 RemH = DAG.getNode(
8491 ISD::SRL, dl, HiLoVT, RemL,
8492 DAG.getShiftAmountConstant(HBitWidth - TrailingZeros, HiLoVT, dl));
8493 RemL =
8494 DAG.getNode(ISD::SHL, dl, HiLoVT, RemL,
8495 DAG.getShiftAmountConstant(TrailingZeros, HiLoVT, dl));
8496 // OR in the partial remainder.
8497 RemL = DAG.getNode(ISD::OR, dl, HiLoVT, RemL, PartialRemL,
8499 } else if (TrailingZeros == HBitWidth) {
8500 // Shift left by exactly HBitWidth: RemH becomes RemL, RemL becomes
8501 // PartialRemL.
8502 RemH = RemL;
8503 RemL = PartialRemL;
8504 } else {
8505 // Shift left by more than HBitWidth.
8506 RemH = DAG.getNode(
8507 ISD::SHL, dl, HiLoVT, RemL,
8508 DAG.getShiftAmountConstant(TrailingZeros - HBitWidth, HiLoVT, dl));
8509 RemH = DAG.getNode(ISD::OR, dl, HiLoVT, RemH, PartialRemH,
8511 RemL = PartialRemL;
8512 }
8513 }
8514 Result.push_back(RemL);
8515 Result.push_back(RemH);
8516 }
8517
8518 return true;
8519}
8520
8521bool TargetLowering::expandUDIVREMByConstantViaUMulHiMagic(
8522 SDNode *N, const APInt &Divisor, SmallVectorImpl<SDValue> &Result,
8523 EVT HiLoVT, SelectionDAG &DAG, SDValue LL, SDValue LH) const {
8524
8525 SDValue N0 = N->getOperand(0);
8526 EVT VT = N0->getValueType(0);
8527 SDLoc DL{N};
8528
8529 assert(!Divisor.isOne() && "Magic algorithm does not work for division by 1");
8530
8531 // This helper creates a MUL_LOHI of the pair (LL, LH) by a constant.
8532 auto MakeMUL_LOHIByConst = [&](unsigned Opc, SDValue LL, SDValue LH,
8533 const APInt &Const,
8534 SmallVectorImpl<SDValue> &Result) {
8535 SDValue LHS = DAG.getNode(ISD::BUILD_PAIR, DL, VT, LL, LH);
8536 SDValue RHS = DAG.getConstant(Const, DL, VT);
8537 auto [RL, RH] = DAG.SplitScalar(RHS, DL, HiLoVT, HiLoVT);
8538 return expandMUL_LOHI(Opc, VT, DL, LHS, RHS, Result, HiLoVT, DAG,
8540 LL, LH, RL, RH);
8541 };
8542
8543 // This helper creates an ADD/SUB of the pairs (LL, LH) and (RL, RH).
8544 auto MakeAddSubLong = [&](unsigned Opc, SDValue LL, SDValue LH, SDValue RL,
8545 SDValue RH) {
8546 SDValue AddSubNode =
8548 DAG.getVTList(HiLoVT, MVT::i1), LL, RL);
8549 SDValue OutL = AddSubNode.getValue(0);
8550 SDValue Overflow = AddSubNode.getValue(1);
8551 SDValue AddSubWithOverflow =
8553 DAG.getVTList(HiLoVT, MVT::i1), LH, RH, Overflow);
8554 SDValue OutH = AddSubWithOverflow.getValue(0);
8555 return std::make_pair(OutL, OutH);
8556 };
8557
8558 // This helper creates a SRL of the pair (LL, LH) by Shift.
8559 auto MakeSRLLong = [&](SDValue LL, SDValue LH, unsigned Shift) {
8560 unsigned HBitWidth = HiLoVT.getScalarSizeInBits();
8561 if (Shift < HBitWidth) {
8562 SDValue ShAmt = DAG.getShiftAmountConstant(Shift, HiLoVT, DL);
8563 SDValue ResL = DAG.getNode(ISD::FSHR, DL, HiLoVT, LH, LL, ShAmt);
8564 SDValue ResH = DAG.getNode(ISD::SRL, DL, HiLoVT, LH, ShAmt);
8565 return std::make_pair(ResL, ResH);
8566 }
8567 SDValue Zero = DAG.getConstant(0, DL, HiLoVT);
8568 if (Shift == HBitWidth)
8569 return std::make_pair(LH, Zero);
8570 assert(Shift - HBitWidth < HBitWidth &&
8571 "We shouldn't generate an undefined shift");
8572 SDValue ShAmt = DAG.getShiftAmountConstant(Shift - HBitWidth, HiLoVT, DL);
8573 return std::make_pair(DAG.getNode(ISD::SRL, DL, HiLoVT, LH, ShAmt), Zero);
8574 };
8575
8576 // Knowledge of leading zeros may help to reduce the multiplier.
8577 unsigned KnownLeadingZeros = DAG.computeKnownBits(N0).countMinLeadingZeros();
8578
8579 UnsignedDivisionByConstantInfo Magics = UnsignedDivisionByConstantInfo::get(
8580 Divisor, std::min(KnownLeadingZeros, Divisor.countl_zero()));
8581
8582 assert(!LL == !LH && "Expected both input halves or no input halves!");
8583 if (!LL)
8584 std::tie(LL, LH) = DAG.SplitScalar(N0, DL, HiLoVT, HiLoVT);
8585 SDValue QL = LL;
8586 SDValue QH = LH;
8587 if (Magics.PreShift != 0)
8588 std::tie(QL, QH) = MakeSRLLong(QL, QH, Magics.PreShift);
8589
8590 SmallVector<SDValue, 4> UMulResult;
8591 if (!MakeMUL_LOHIByConst(ISD::UMUL_LOHI, QL, QH, Magics.Magic, UMulResult))
8592 return false;
8593
8594 QL = UMulResult[2];
8595 QH = UMulResult[3];
8596
8597 if (Magics.IsAdd) {
8598 auto [NPQL, NPQH] = MakeAddSubLong(ISD::SUB, LL, LH, QL, QH);
8599 std::tie(NPQL, NPQH) = MakeSRLLong(NPQL, NPQH, 1);
8600 std::tie(QL, QH) = MakeAddSubLong(ISD::ADD, NPQL, NPQH, QL, QH);
8601 }
8602
8603 if (Magics.PostShift != 0)
8604 std::tie(QL, QH) = MakeSRLLong(QL, QH, Magics.PostShift);
8605
8606 unsigned Opcode = N->getOpcode();
8607 if (Opcode != ISD::UREM) {
8608 Result.push_back(QL);
8609 Result.push_back(QH);
8610 }
8611
8612 if (Opcode != ISD::UDIV) {
8613 SmallVector<SDValue, 2> MulResult;
8614 if (!MakeMUL_LOHIByConst(ISD::MUL, QL, QH, Divisor, MulResult))
8615 return false;
8616
8617 assert(MulResult.size() == 2);
8618
8619 auto [RemL, RemH] =
8620 MakeAddSubLong(ISD::SUB, LL, LH, MulResult[0], MulResult[1]);
8621
8622 Result.push_back(RemL);
8623 Result.push_back(RemH);
8624 }
8625
8626 return true;
8627}
8628
8631 EVT HiLoVT, SelectionDAG &DAG,
8632 SDValue LL, SDValue LH) const {
8633 unsigned Opcode = N->getOpcode();
8634
8635 // TODO: Support signed division/remainder.
8636 if (Opcode == ISD::SREM || Opcode == ISD::SDIV || Opcode == ISD::SDIVREM)
8637 return false;
8638 assert(
8639 (Opcode == ISD::UREM || Opcode == ISD::UDIV || Opcode == ISD::UDIVREM) &&
8640 "Unexpected opcode");
8641
8642 auto *CN = dyn_cast<ConstantSDNode>(N->getOperand(1));
8643 if (!CN)
8644 return false;
8645
8646 APInt Divisor = CN->getAPIntValue();
8647
8648 // The generated half-width UREM is normally optimized using high multiply.
8649 // If the wide UREM libcall is unavailable, a legal or custom half-width
8650 // UDIVREM can lower it instead.
8651 bool CanDecomposeUREMWithoutMulHi =
8652 Opcode == ISD::UREM &&
8653 getLibcallImpl(RTLIB::getUREM(N->getValueType(0))) ==
8654 RTLIB::Unsupported &&
8656 if (!CanDecomposeUREMWithoutMulHi &&
8659 return false;
8660
8661 // Prefer the smaller libcall when one is available.
8662 if (DAG.shouldOptForSize() && !CanDecomposeUREMWithoutMulHi)
8663 return false;
8664
8665 // Early out for 0 or 1 divisors.
8666 if (Divisor.ule(1))
8667 return false;
8668
8669 if (expandUDIVREMByConstantViaUREMDecomposition(N, Divisor, Result, HiLoVT,
8670 DAG, LL, LH))
8671 return true;
8672
8673 if (expandUDIVREMByConstantViaUMulHiMagic(N, Divisor, Result, HiLoVT, DAG, LL,
8674 LH))
8675 return true;
8676
8677 return false;
8678}
8679
8680// Check that (every element of) Z is undef or not an exact multiple of BW.
8681static bool isNonZeroModBitWidthOrUndef(SDValue Z, unsigned BW) {
8683 Z,
8684 [=](ConstantSDNode *C) { return !C || C->getAPIntValue().urem(BW) != 0; },
8685 /*AllowUndefs=*/true, /*AllowTruncation=*/true);
8686}
8687
8689 EVT VT = Node->getValueType(0);
8690 SDValue ShX, ShY;
8691 SDValue ShAmt, InvShAmt;
8692 SDValue X = Node->getOperand(0);
8693 SDValue Y = Node->getOperand(1);
8694 SDValue Z = Node->getOperand(2);
8695 SDValue Mask = Node->getOperand(3);
8696 SDValue VL = Node->getOperand(4);
8697
8698 unsigned BW = VT.getScalarSizeInBits();
8699 bool IsFSHL = Node->getOpcode() == ISD::VP_FSHL;
8700 SDLoc DL(SDValue(Node, 0));
8701
8702 EVT ShVT = Z.getValueType();
8703 if (isNonZeroModBitWidthOrUndef(Z, BW)) {
8704 // fshl: X << C | Y >> (BW - C)
8705 // fshr: X << (BW - C) | Y >> C
8706 // where C = Z % BW is not zero
8707 SDValue BitWidthC = DAG.getConstant(BW, DL, ShVT);
8708 ShAmt = DAG.getNode(ISD::VP_UREM, DL, ShVT, Z, BitWidthC, Mask, VL);
8709 InvShAmt = DAG.getNode(ISD::VP_SUB, DL, ShVT, BitWidthC, ShAmt, Mask, VL);
8710 ShX = DAG.getNode(ISD::VP_SHL, DL, VT, X, IsFSHL ? ShAmt : InvShAmt, Mask,
8711 VL);
8712 ShY = DAG.getNode(ISD::VP_SRL, DL, VT, Y, IsFSHL ? InvShAmt : ShAmt, Mask,
8713 VL);
8714 } else {
8715 // fshl: X << (Z % BW) | Y >> 1 >> (BW - 1 - (Z % BW))
8716 // fshr: X << 1 << (BW - 1 - (Z % BW)) | Y >> (Z % BW)
8717 SDValue BitMask = DAG.getConstant(BW - 1, DL, ShVT);
8718 if (isPowerOf2_32(BW)) {
8719 // Z % BW -> Z & (BW - 1)
8720 ShAmt = DAG.getNode(ISD::VP_AND, DL, ShVT, Z, BitMask, Mask, VL);
8721 // (BW - 1) - (Z % BW) -> ~Z & (BW - 1)
8722 SDValue NotZ = DAG.getNode(ISD::VP_XOR, DL, ShVT, Z,
8723 DAG.getAllOnesConstant(DL, ShVT), Mask, VL);
8724 InvShAmt = DAG.getNode(ISD::VP_AND, DL, ShVT, NotZ, BitMask, Mask, VL);
8725 } else {
8726 SDValue BitWidthC = DAG.getConstant(BW, DL, ShVT);
8727 ShAmt = DAG.getNode(ISD::VP_UREM, DL, ShVT, Z, BitWidthC, Mask, VL);
8728 InvShAmt = DAG.getNode(ISD::VP_SUB, DL, ShVT, BitMask, ShAmt, Mask, VL);
8729 }
8730
8731 SDValue One = DAG.getConstant(1, DL, ShVT);
8732 if (IsFSHL) {
8733 ShX = DAG.getNode(ISD::VP_SHL, DL, VT, X, ShAmt, Mask, VL);
8734 SDValue ShY1 = DAG.getNode(ISD::VP_SRL, DL, VT, Y, One, Mask, VL);
8735 ShY = DAG.getNode(ISD::VP_SRL, DL, VT, ShY1, InvShAmt, Mask, VL);
8736 } else {
8737 SDValue ShX1 = DAG.getNode(ISD::VP_SHL, DL, VT, X, One, Mask, VL);
8738 ShX = DAG.getNode(ISD::VP_SHL, DL, VT, ShX1, InvShAmt, Mask, VL);
8739 ShY = DAG.getNode(ISD::VP_SRL, DL, VT, Y, ShAmt, Mask, VL);
8740 }
8741 }
8742 return DAG.getNode(ISD::VP_OR, DL, VT, ShX, ShY, Mask, VL);
8743}
8744
8746 SelectionDAG &DAG) const {
8747 if (Node->isVPOpcode())
8748 return expandVPFunnelShift(Node, DAG);
8749
8750 EVT VT = Node->getValueType(0);
8751
8752 if (VT.isVector() && (!isOperationLegalOrCustom(ISD::SHL, VT) ||
8756 return SDValue();
8757
8758 SDValue X = Node->getOperand(0);
8759 SDValue Y = Node->getOperand(1);
8760 SDValue Z = Node->getOperand(2);
8761
8762 unsigned BW = VT.getScalarSizeInBits();
8763 bool IsFSHL = Node->getOpcode() == ISD::FSHL;
8764 SDLoc DL(SDValue(Node, 0));
8765
8766 EVT ShVT = Z.getValueType();
8767
8768 // If a funnel shift in the other direction is more supported, use it.
8769 unsigned RevOpcode = IsFSHL ? ISD::FSHR : ISD::FSHL;
8770 if (!isOperationLegalOrCustom(Node->getOpcode(), VT) &&
8771 isOperationLegalOrCustom(RevOpcode, VT) && isPowerOf2_32(BW)) {
8772 if (isNonZeroModBitWidthOrUndef(Z, BW)) {
8773 // fshl X, Y, Z -> fshr X, Y, -Z
8774 // fshr X, Y, Z -> fshl X, Y, -Z
8775 Z = DAG.getNegative(Z, DL, ShVT);
8776 } else {
8777 // fshl X, Y, Z -> fshr (srl X, 1), (fshr X, Y, 1), ~Z
8778 // fshr X, Y, Z -> fshl (fshl X, Y, 1), (shl Y, 1), ~Z
8779 SDValue One = DAG.getConstant(1, DL, ShVT);
8780 if (IsFSHL) {
8781 Y = DAG.getNode(RevOpcode, DL, VT, X, Y, One);
8782 X = DAG.getNode(ISD::SRL, DL, VT, X, One);
8783 } else {
8784 X = DAG.getNode(RevOpcode, DL, VT, X, Y, One);
8785 Y = DAG.getNode(ISD::SHL, DL, VT, Y, One);
8786 }
8787 Z = DAG.getNOT(DL, Z, ShVT);
8788 }
8789 return DAG.getNode(RevOpcode, DL, VT, X, Y, Z);
8790 }
8791
8792 SDValue ShX, ShY;
8793 SDValue ShAmt, InvShAmt;
8794 if (isNonZeroModBitWidthOrUndef(Z, BW)) {
8795 // fshl: X << C | Y >> (BW - C)
8796 // fshr: X << (BW - C) | Y >> C
8797 // where C = Z % BW is not zero
8798 SDValue BitWidthC = DAG.getConstant(BW, DL, ShVT);
8799 ShAmt = DAG.getNode(ISD::UREM, DL, ShVT, Z, BitWidthC);
8800 InvShAmt = DAG.getNode(ISD::SUB, DL, ShVT, BitWidthC, ShAmt);
8801 ShX = DAG.getNode(ISD::SHL, DL, VT, X, IsFSHL ? ShAmt : InvShAmt);
8802 ShY = DAG.getNode(ISD::SRL, DL, VT, Y, IsFSHL ? InvShAmt : ShAmt);
8803 } else {
8804 // fshl: X << (Z % BW) | Y >> 1 >> (BW - 1 - (Z % BW))
8805 // fshr: X << 1 << (BW - 1 - (Z % BW)) | Y >> (Z % BW)
8806 SDValue Mask = DAG.getConstant(BW - 1, DL, ShVT);
8807 if (isPowerOf2_32(BW)) {
8808 // Z % BW -> Z & (BW - 1)
8809 ShAmt = DAG.getNode(ISD::AND, DL, ShVT, Z, Mask);
8810 // (BW - 1) - (Z % BW) -> ~Z & (BW - 1)
8811 InvShAmt = DAG.getNode(ISD::AND, DL, ShVT, DAG.getNOT(DL, Z, ShVT), Mask);
8812 } else {
8813 SDValue BitWidthC = DAG.getConstant(BW, DL, ShVT);
8814 ShAmt = DAG.getNode(ISD::UREM, DL, ShVT, Z, BitWidthC);
8815 InvShAmt = DAG.getNode(ISD::SUB, DL, ShVT, Mask, ShAmt);
8816 }
8817
8818 SDValue One = DAG.getConstant(1, DL, ShVT);
8819 if (IsFSHL) {
8820 ShX = DAG.getNode(ISD::SHL, DL, VT, X, ShAmt);
8821 SDValue ShY1 = DAG.getNode(ISD::SRL, DL, VT, Y, One);
8822 ShY = DAG.getNode(ISD::SRL, DL, VT, ShY1, InvShAmt);
8823 } else {
8824 SDValue ShX1 = DAG.getNode(ISD::SHL, DL, VT, X, One);
8825 ShX = DAG.getNode(ISD::SHL, DL, VT, ShX1, InvShAmt);
8826 ShY = DAG.getNode(ISD::SRL, DL, VT, Y, ShAmt);
8827 }
8828 }
8829 return DAG.getNode(ISD::OR, DL, VT, ShX, ShY);
8830}
8831
8832// TODO: Merge with expandFunnelShift.
8834 SelectionDAG &DAG) const {
8835 EVT VT = Node->getValueType(0);
8836 unsigned EltSizeInBits = VT.getScalarSizeInBits();
8837 bool IsLeft = Node->getOpcode() == ISD::ROTL;
8838 SDValue Op0 = Node->getOperand(0);
8839 SDValue Op1 = Node->getOperand(1);
8840 SDLoc DL(SDValue(Node, 0));
8841
8842 EVT ShVT = Op1.getValueType();
8843 SDValue Zero = DAG.getConstant(0, DL, ShVT);
8844
8845 // If a rotate in the other direction is more supported, use it.
8846 unsigned RevRot = IsLeft ? ISD::ROTR : ISD::ROTL;
8847 if (!isOperationLegalOrCustom(Node->getOpcode(), VT) &&
8848 isOperationLegalOrCustom(RevRot, VT) && isPowerOf2_32(EltSizeInBits)) {
8849 SDValue Sub = DAG.getNode(ISD::SUB, DL, ShVT, Zero, Op1);
8850 return DAG.getNode(RevRot, DL, VT, Op0, Sub);
8851 }
8852
8853 if (!AllowVectorOps && VT.isVector() &&
8859 return SDValue();
8860
8861 unsigned ShOpc = IsLeft ? ISD::SHL : ISD::SRL;
8862 unsigned HsOpc = IsLeft ? ISD::SRL : ISD::SHL;
8863 SDValue BitWidthMinusOneC = DAG.getConstant(EltSizeInBits - 1, DL, ShVT);
8864 SDValue ShVal;
8865 SDValue HsVal;
8866 if (isPowerOf2_32(EltSizeInBits)) {
8867 // (rotl x, c) -> x << (c & (w - 1)) | x >> (-c & (w - 1))
8868 // (rotr x, c) -> x >> (c & (w - 1)) | x << (-c & (w - 1))
8869 SDValue NegOp1 = DAG.getNode(ISD::SUB, DL, ShVT, Zero, Op1);
8870 SDValue ShAmt = DAG.getNode(ISD::AND, DL, ShVT, Op1, BitWidthMinusOneC);
8871 ShVal = DAG.getNode(ShOpc, DL, VT, Op0, ShAmt);
8872 SDValue HsAmt = DAG.getNode(ISD::AND, DL, ShVT, NegOp1, BitWidthMinusOneC);
8873 HsVal = DAG.getNode(HsOpc, DL, VT, Op0, HsAmt);
8874 } else {
8875 // (rotl x, c) -> x << (c % w) | x >> 1 >> (w - 1 - (c % w))
8876 // (rotr x, c) -> x >> (c % w) | x << 1 << (w - 1 - (c % w))
8877 SDValue BitWidthC = DAG.getConstant(EltSizeInBits, DL, ShVT);
8878 SDValue ShAmt = DAG.getNode(ISD::UREM, DL, ShVT, Op1, BitWidthC);
8879 ShVal = DAG.getNode(ShOpc, DL, VT, Op0, ShAmt);
8880 SDValue HsAmt = DAG.getNode(ISD::SUB, DL, ShVT, BitWidthMinusOneC, ShAmt);
8881 SDValue One = DAG.getConstant(1, DL, ShVT);
8882 HsVal =
8883 DAG.getNode(HsOpc, DL, VT, DAG.getNode(HsOpc, DL, VT, Op0, One), HsAmt);
8884 }
8885 return DAG.getNode(ISD::OR, DL, VT, ShVal, HsVal);
8886}
8887
8888/// Check if CLMUL on VT can eventually reach a type with legal CLMUL through
8889/// a chain of halving decompositions (halving element width) and/or vector
8890/// widening (doubling element count). This guides expansion strategy selection:
8891/// if true, the halving/widening path produces better code than bit-by-bit.
8892///
8893/// HalveDepth tracks halving steps only (each creates ~4x more operations).
8894/// Widening steps are cheap (O(1) pad/extract) and don't count.
8895/// Limiting halvings to 2 prevents exponential blowup:
8896/// 1 halving: ~4 sub-CLMULs (good, e.g. v8i16 -> v8i8)
8897/// 2 halvings: ~16 sub-CLMULs (acceptable, e.g. v4i32 -> v4i16 -> v8i8)
8898/// 3 halvings: ~64 sub-CLMULs (worse than bit-by-bit expansion)
8900 EVT VT, unsigned HalveDepth = 0,
8901 unsigned TotalDepth = 0) {
8902 if (HalveDepth > 2 || TotalDepth > 8 || !VT.isFixedLengthVector())
8903 return false;
8905 return true;
8906 if (!TLI.isTypeLegal(VT))
8907 return false;
8908
8909 unsigned BW = VT.getScalarSizeInBits();
8910
8911 // Halve: halve element width, same element count.
8912 // This is the expensive step -- each halving creates ~4x more operations.
8913 if (BW % 2 == 0) {
8914 EVT HalfEltVT = EVT::getIntegerVT(Ctx, BW / 2);
8915 EVT HalfVT = VT.changeVectorElementType(Ctx, HalfEltVT);
8916 if (TLI.isTypeLegal(HalfVT) &&
8917 canNarrowCLMULToLegal(TLI, Ctx, HalfVT, HalveDepth + 1, TotalDepth + 1))
8918 return true;
8919 }
8920
8921 // Widen: double element count (fixed-width vectors only).
8922 // This is cheap -- just INSERT_SUBVECTOR + EXTRACT_SUBVECTOR.
8923 EVT WideVT = VT.getDoubleNumVectorElementsVT(Ctx);
8924 if (TLI.isTypeLegal(WideVT) &&
8925 canNarrowCLMULToLegal(TLI, Ctx, WideVT, HalveDepth, TotalDepth + 1))
8926 return true;
8927
8928 return false;
8929}
8930
8932 SDLoc DL(Node);
8933 EVT VT = Node->getValueType(0);
8934 SDValue X = Node->getOperand(0);
8935 SDValue Y = Node->getOperand(1);
8936 unsigned BW = VT.getScalarSizeInBits();
8937 unsigned Opcode = Node->getOpcode();
8938 LLVMContext &Ctx = *DAG.getContext();
8939
8940 switch (Opcode) {
8941 case ISD::CLMUL: {
8942 // For vector types, try decomposition strategies that leverage legal
8943 // CLMUL on narrower or wider element types, avoiding the expensive
8944 // bit-by-bit expansion.
8945 if (VT.isVector()) {
8946 // Strategy 1: Halving decomposition to half-element-width CLMUL.
8947 // Applies ExpandIntRes_CLMUL's identity element-wise:
8948 // CLMUL(X, Y) = (Hi << HalfBW) | Lo
8949 // where:
8950 // Lo = CLMUL(XLo, YLo)
8951 // Hi = CLMULH(XLo, YLo) ^ CLMUL(XLo, YHi) ^ CLMUL(XHi, YLo)
8952 unsigned HalfBW = BW / 2;
8953 if (BW % 2 == 0) {
8954 EVT HalfEltVT = EVT::getIntegerVT(Ctx, HalfBW);
8955 EVT HalfVT =
8956 EVT::getVectorVT(Ctx, HalfEltVT, VT.getVectorElementCount());
8957 if (isTypeLegal(HalfVT) && canNarrowCLMULToLegal(*this, Ctx, HalfVT,
8958 /*HalveDepth=*/1)) {
8959 SDValue ShAmt = DAG.getShiftAmountConstant(HalfBW, VT, DL);
8960
8961 // Extract low and high halves of each element.
8962 SDValue XLo = DAG.getNode(ISD::TRUNCATE, DL, HalfVT, X);
8963 SDValue XHi = DAG.getNode(ISD::TRUNCATE, DL, HalfVT,
8964 DAG.getNode(ISD::SRL, DL, VT, X, ShAmt));
8965 SDValue YLo = DAG.getNode(ISD::TRUNCATE, DL, HalfVT, Y);
8966 SDValue YHi = DAG.getNode(ISD::TRUNCATE, DL, HalfVT,
8967 DAG.getNode(ISD::SRL, DL, VT, Y, ShAmt));
8968
8969 // Lo = CLMUL(XLo, YLo)
8970 SDValue Lo = DAG.getNode(ISD::CLMUL, DL, HalfVT, XLo, YLo);
8971
8972 // Hi = CLMULH(XLo, YLo) ^ CLMUL(XLo, YHi) ^ CLMUL(XHi, YLo)
8973 SDValue LoH = DAG.getNode(ISD::CLMULH, DL, HalfVT, XLo, YLo);
8974 SDValue Cross1 = DAG.getNode(ISD::CLMUL, DL, HalfVT, XLo, YHi);
8975 SDValue Cross2 = DAG.getNode(ISD::CLMUL, DL, HalfVT, XHi, YLo);
8976 SDValue Cross = DAG.getNode(ISD::XOR, DL, HalfVT, Cross1, Cross2);
8977 SDValue Hi = DAG.getNode(ISD::XOR, DL, HalfVT, LoH, Cross);
8978
8979 // Reassemble: Result = ZExt(Lo) | (AnyExt(Hi) << HalfBW)
8980 SDValue LoExt = DAG.getNode(ISD::ZERO_EXTEND, DL, VT, Lo);
8981 SDValue HiExt = DAG.getNode(ISD::ANY_EXTEND, DL, VT, Hi);
8982 SDValue HiShifted = DAG.getNode(ISD::SHL, DL, VT, HiExt, ShAmt);
8983 return DAG.getNode(ISD::OR, DL, VT, LoExt, HiShifted);
8984 }
8985 }
8986
8987 // Strategy 2: Promote to double-element-width CLMUL.
8988 // CLMUL(X, Y) = Trunc(CLMUL(AnyExt(X), AnyExt(Y)))
8989 {
8990 EVT ExtVT = VT.widenIntegerElementType(Ctx);
8991 if (isTypeLegal(ExtVT) && isOperationLegalOrCustom(ISD::CLMUL, ExtVT)) {
8992 // If CLMUL on ExtVT is Custom (not Legal), the target may
8993 // scalarize it, costing O(NumElements) scalar ops. The bit-by-bit
8994 // fallback costs O(BW) vectorized iterations. Only widen when
8995 // element count is small enough that scalarization is cheaper.
8996 unsigned NumElts = VT.getVectorMinNumElements();
8997 if (isOperationLegal(ISD::CLMUL, ExtVT) || NumElts < BW) {
8998 SDValue XExt = DAG.getNode(ISD::ANY_EXTEND, DL, ExtVT, X);
8999 SDValue YExt = DAG.getNode(ISD::ANY_EXTEND, DL, ExtVT, Y);
9000 SDValue Mul = DAG.getNode(ISD::CLMUL, DL, ExtVT, XExt, YExt);
9001 return DAG.getNode(ISD::TRUNCATE, DL, VT, Mul);
9002 }
9003 }
9004 }
9005
9006 // Strategy 3: Widen element count (pad with undef, do CLMUL on wider
9007 // vector, extract lower result). CLMUL is element-wise, so upper
9008 // (undef) lanes don't affect the lower results.
9009 // e.g. v4i16 => pad to v8i16 => halve to v8i8 PMUL => extract v4i16.
9010 if (auto EC = VT.getVectorElementCount(); EC.isFixed()) {
9011 EVT WideVT = EVT::getVectorVT(Ctx, VT.getVectorElementType(), EC * 2);
9012 if (isTypeLegal(WideVT) && canNarrowCLMULToLegal(*this, Ctx, WideVT)) {
9013 SDValue Undef = DAG.getUNDEF(WideVT);
9014 SDValue XWide = DAG.getNode(ISD::INSERT_SUBVECTOR, DL, WideVT, Undef,
9015 X, DAG.getVectorIdxConstant(0, DL));
9016 SDValue YWide = DAG.getNode(ISD::INSERT_SUBVECTOR, DL, WideVT, Undef,
9017 Y, DAG.getVectorIdxConstant(0, DL));
9018 SDValue WideRes = DAG.getNode(ISD::CLMUL, DL, WideVT, XWide, YWide);
9019 return DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, VT, WideRes,
9020 DAG.getVectorIdxConstant(0, DL));
9021 }
9022 }
9023 }
9024
9025 // Special case: clmul(X, ~0) is equivalent to a "parallel prefix XOR" or
9026 // "bitwise parity" operation.
9028 SDValue R = X;
9029 for (unsigned I = 1; I < BW; I <<= 1) {
9030 SDValue ShAmt = DAG.getShiftAmountConstant(I, VT, DL);
9031 SDValue Shifted = DAG.getNode(ISD::SHL, DL, VT, R, ShAmt);
9032 R = DAG.getNode(ISD::XOR, DL, VT, R, Shifted);
9033 }
9034 return R;
9035 }
9036
9037 // NOTE: If you change this expansion, please update the cost model
9038 // calculation in BasicTTIImpl::getTypeBasedIntrinsicInstrCost for
9039 // Intrinsic::clmul.
9040
9041 // Strategy 4: multiplication with holes.
9042 //
9043 // Uses "holes" (sequences of zeroes) to avoid carry spilling. When carries
9044 // do occur, they wind up in a "hole" and are subsequently masked out of the
9045 // result.
9046 //
9047 // A hole of 3 bits is optimal for 32-bit and 64-bit inputs. 128-bit
9048 // integers need a larger hole, and for smaller integers the fallback below
9049 // is more efficient.
9050 //
9051 // Based on bmul64 in bearssl and bmul in the rust polyval crate.
9052 if (BW >= 32 && BW <= 64 &&
9054
9055 // Set every fourth bit of each nibble, equivalent to 0b00010001...0001.
9056 APInt MaskVal = APInt::getSplat(BW, APInt(4, 0b0001));
9057
9058 // Create versions of X and Y that keep only the I-th bit of
9059 // each nibble.
9060 SDValue M[4], Xp[4], Yp[4];
9061 for (unsigned I = 0; I < 4; ++I) {
9062 M[I] = DAG.getConstant(MaskVal.shl(I), DL, VT);
9063 Xp[I] = DAG.getNode(ISD::AND, DL, VT, X, M[I]);
9064 Yp[I] = DAG.getNode(ISD::AND, DL, VT, Y, M[I]);
9065 }
9066
9067 // Codegens these expressions (16 multiplications):
9068 //
9069 // z0 = (x0 * y0) ^ (x1 * y3) ^ (x2 * y2) ^ (x3 * y1);
9070 // z1 = (x0 * y1) ^ (x1 * y0) ^ (x2 * y3) ^ (x3 * y2);
9071 // z2 = (x0 * y2) ^ (x1 * y1) ^ (x2 * y0) ^ (x3 * y3);
9072 // z3 = (x0 * y3) ^ (x1 * y2) ^ (x2 * y1) ^ (x3 * y0);
9073 SDValue Res = DAG.getConstant(0, DL, VT);
9074 for (unsigned I = 0; I < 4; ++I) {
9075 SDValue Zi = DAG.getConstant(0, DL, VT);
9076 for (unsigned J = 0; J < 4; ++J) {
9077 unsigned K = (I + 4 - J) % 4;
9078 SDValue P = DAG.getNode(ISD::MUL, DL, VT, Xp[J], Yp[K]);
9079 Zi = DAG.getNode(ISD::XOR, DL, VT, Zi, P);
9080 }
9081
9082 // Keep only the bits belonging to this iteration, and bitwise or it all
9083 // together.
9084 Zi = DAG.getNode(ISD::AND, DL, VT, Zi, M[I]);
9085 Res = DAG.getNode(ISD::OR, DL, VT, Res, Zi, SDNodeFlags::Disjoint);
9086 }
9087 return Res;
9088 }
9089
9090 // Strategy 5: the naive fallback.
9091 EVT SetCCVT = getSetCCResultType(DAG.getDataLayout(), Ctx, VT);
9092
9093 SDValue Res = DAG.getConstant(0, DL, VT);
9094 for (unsigned I = 0; I < BW; ++I) {
9095 SDValue ShiftAmt = DAG.getShiftAmountConstant(I, VT, DL);
9096 SDValue Mask = DAG.getConstant(APInt::getOneBitSet(BW, I), DL, VT);
9097 SDValue YMasked = DAG.getNode(ISD::AND, DL, VT, Y, Mask);
9098
9099 // For targets with a fast bit test instruction (e.g., x86 BT) or without
9100 // multiply, use a shift-based expansion to avoid expensive MUL
9101 // instructions.
9102 SDValue Part;
9103 if (!hasBitTest(Y, ShiftAmt) &&
9106 Part = DAG.getNode(ISD::MUL, DL, VT, X, YMasked);
9107 } else {
9108 // Canonical bit test: (Y & (1 << I)) != 0
9109 SDValue Zero = DAG.getConstant(0, DL, VT);
9110 SDValue Cond = DAG.getSetCC(DL, SetCCVT, YMasked, Zero, ISD::SETEQ);
9111 SDValue XShifted = DAG.getNode(ISD::SHL, DL, VT, X, ShiftAmt);
9112 Part = DAG.getSelect(DL, VT, Cond, Zero, XShifted);
9113 }
9114 Res = DAG.getNode(ISD::XOR, DL, VT, Res, Part);
9115 }
9116 return Res;
9117 }
9118 case ISD::CLMULR:
9119 // If we have CLMUL/CLMULH, merge the shifted results to form CLMULR.
9122 SDValue Lo = DAG.getNode(ISD::CLMUL, DL, VT, X, Y);
9123 SDValue Hi = DAG.getNode(ISD::CLMULH, DL, VT, X, Y);
9124 Lo = DAG.getNode(ISD::SRL, DL, VT, Lo,
9125 DAG.getShiftAmountConstant(BW - 1, VT, DL));
9126 Hi = DAG.getNode(ISD::SHL, DL, VT, Hi,
9127 DAG.getShiftAmountConstant(1, VT, DL));
9128 return DAG.getNode(ISD::OR, DL, VT, Lo, Hi);
9129 }
9130 [[fallthrough]];
9131 case ISD::CLMULH: {
9132 EVT ExtVT = VT.widenIntegerElementType(Ctx);
9133 // Use bitreverse-based lowering (CLMULR/H = rev(CLMUL(rev,rev)) >> S)
9134 // when any of these hold:
9135 // (a) ZERO_EXTEND to ExtVT or SRL on ExtVT isn't legal.
9136 // (b) CLMUL is legal on VT but not on ExtVT (e.g. v8i8 on AArch64).
9137 // (c) CLMUL on ExtVT isn't legal, but CLMUL on VT can be efficiently
9138 // expanded via halving/widening to reach legal CLMUL. The bitreverse
9139 // path creates CLMUL(VT) which will be expanded efficiently. The
9140 // promote path would create CLMUL(ExtVT) => halving => CLMULH(VT),
9141 // causing a cycle.
9142 // Note: when CLMUL is legal on ExtVT, the zext => CLMUL(ExtVT) => shift
9143 // => trunc path is preferred over the bitreverse path, as it avoids the
9144 // cost of 3 bitreverse operations.
9149 canNarrowCLMULToLegal(*this, Ctx, VT)))) {
9150 SDValue XRev = DAG.getNode(ISD::BITREVERSE, DL, VT, X);
9151 SDValue YRev = DAG.getNode(ISD::BITREVERSE, DL, VT, Y);
9152 SDValue ClMul = DAG.getNode(ISD::CLMUL, DL, VT, XRev, YRev);
9153 SDValue Res = DAG.getNode(ISD::BITREVERSE, DL, VT, ClMul);
9154 if (Opcode == ISD::CLMULH)
9155 Res = DAG.getNode(ISD::SRL, DL, VT, Res,
9156 DAG.getShiftAmountConstant(1, VT, DL));
9157 return Res;
9158 }
9159 SDValue XExt = DAG.getNode(ISD::ZERO_EXTEND, DL, ExtVT, X);
9160 SDValue YExt = DAG.getNode(ISD::ZERO_EXTEND, DL, ExtVT, Y);
9161 SDValue ClMul = DAG.getNode(ISD::CLMUL, DL, ExtVT, XExt, YExt);
9162 unsigned ShAmt = Opcode == ISD::CLMULR ? BW - 1 : BW;
9163 SDValue HiBits = DAG.getNode(ISD::SRL, DL, ExtVT, ClMul,
9164 DAG.getShiftAmountConstant(ShAmt, ExtVT, DL));
9165 return DAG.getNode(ISD::TRUNCATE, DL, VT, HiBits);
9166 }
9167 }
9168 llvm_unreachable("Expected CLMUL, CLMULR, or CLMULH");
9169}
9170
9172 SDLoc DL(Node);
9173 EVT VT = Node->getValueType(0);
9174 SDValue Val = Node->getOperand(0);
9175 SDValue Msk = Node->getOperand(1);
9176 unsigned BW = VT.getScalarSizeInBits();
9177
9178 // Hacker's Delight §7-4: Compress, or Generalized Extract
9179 SDValue X = DAG.getNode(ISD::AND, DL, VT, Val, Msk);
9180 SDValue M = Msk;
9181 SDValue One = DAG.getShiftAmountConstant(1, VT, DL);
9182 SDValue Mk = DAG.getNode(ISD::SHL, DL, VT, DAG.getNOT(DL, M, VT), One);
9183
9184 // Repeatedly compute which bits would shift to the right by an odd amount,
9185 // shift all such bits in parallel using a mask, and double the shift amount.
9186 for (unsigned I = 1; I < BW; I *= 2) {
9187 // This expands the "parallel prefix" operation to clmul(Mk, ~0).
9188 SDValue Mp =
9189 DAG.getNode(ISD::CLMUL, DL, VT, Mk, DAG.getAllOnesConstant(DL, VT));
9190 SDValue Mv = DAG.getNode(ISD::AND, DL, VT, Mp, M);
9191 SDValue ShiftI = DAG.getShiftAmountConstant(I, VT, DL);
9192 SDValue MvS = DAG.getNode(ISD::SRL, DL, VT, Mv, ShiftI);
9193 M = DAG.getNode(ISD::OR, DL, VT, DAG.getNode(ISD::XOR, DL, VT, M, Mv), MvS,
9195 SDValue T = DAG.getNode(ISD::AND, DL, VT, X, Mv);
9196 SDValue TS = DAG.getNode(ISD::SRL, DL, VT, T, ShiftI);
9197 X = DAG.getNode(ISD::OR, DL, VT, DAG.getNode(ISD::XOR, DL, VT, X, T), TS,
9199 if (I * 2 < BW)
9200 Mk = DAG.getNode(ISD::AND, DL, VT, Mk, DAG.getNOT(DL, Mp, VT));
9201 }
9202
9203 return X;
9204}
9205
9207 SDLoc DL(Node);
9208 EVT VT = Node->getValueType(0);
9209 SDValue Val = Node->getOperand(0);
9210 SDValue Msk = Node->getOperand(1);
9211 unsigned BW = VT.getScalarSizeInBits();
9212
9213 // Hacker's Delight §7-5: Expand, or Generalized Insert.
9214 unsigned LogBW = Log2_32_Ceil(BW);
9215 SmallVector<SDValue, 8> MvArray(LogBW);
9216 SDValue One = DAG.getShiftAmountConstant(1, VT, DL);
9217 SDValue Mc = Msk;
9218 SDValue Mk = DAG.getNode(ISD::SHL, DL, VT, DAG.getNOT(DL, Msk, VT), One);
9219
9220 // First pass: compute move masks for each power of two that a bit moves by.
9221 for (unsigned S = 0; S < LogBW; ++S) {
9222 unsigned ShiftS = 1u << S;
9223 // This expands the "parallel prefix" operation to clmul(Mk, ~0).
9224 SDValue Mp =
9225 DAG.getNode(ISD::CLMUL, DL, VT, Mk, DAG.getAllOnesConstant(DL, VT));
9226 SDValue Mv = DAG.getNode(ISD::AND, DL, VT, Mp, Mc);
9227 MvArray[S] = Mv;
9228 if (S + 1 < LogBW) {
9229 SDValue McXorMv = DAG.getNode(ISD::XOR, DL, VT, Mc, Mv);
9230 SDValue MvShifted = DAG.getNode(
9231 ISD::SRL, DL, VT, Mv, DAG.getShiftAmountConstant(ShiftS, VT, DL));
9232 Mc = DAG.getNode(ISD::OR, DL, VT, McXorMv, MvShifted,
9234 Mk = DAG.getNode(ISD::AND, DL, VT, Mk, DAG.getNOT(DL, Mp, VT));
9235 }
9236 }
9237
9238 // Second pass: move bits by 32, 16, 8, 4, 2, 1, using masks, in parallel.
9239 // Each pass handles half the shift amount of the previous pass.
9240 SDValue X = Val;
9241 for (int S = (int)LogBW - 1; S >= 0; --S) {
9242 SDValue ShiftSv = DAG.getShiftAmountConstant(1ull << S, VT, DL);
9243 SDValue T = DAG.getNode(ISD::SHL, DL, VT, X, ShiftSv);
9244 SDValue UnshiftedBits =
9245 DAG.getNode(ISD::AND, DL, VT, X, DAG.getNOT(DL, MvArray[S], VT));
9246 SDValue ShiftedBits = DAG.getNode(ISD::AND, DL, VT, T, MvArray[S]);
9247 X = DAG.getNode(ISD::OR, DL, VT, UnshiftedBits, ShiftedBits,
9249 }
9250
9251 return DAG.getNode(ISD::AND, DL, VT, X, Msk);
9252}
9253
9255 SelectionDAG &DAG) const {
9256 assert(Node->getNumOperands() == 3 && "Not a double-shift!");
9257 EVT VT = Node->getValueType(0);
9258 unsigned VTBits = VT.getScalarSizeInBits();
9259 assert(isPowerOf2_32(VTBits) && "Power-of-two integer type expected");
9260
9261 bool IsSHL = Node->getOpcode() == ISD::SHL_PARTS;
9262 bool IsSRA = Node->getOpcode() == ISD::SRA_PARTS;
9263 SDValue ShOpLo = Node->getOperand(0);
9264 SDValue ShOpHi = Node->getOperand(1);
9265 SDValue ShAmt = Node->getOperand(2);
9266 EVT ShAmtVT = ShAmt.getValueType();
9267 EVT ShAmtCCVT =
9268 getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), ShAmtVT);
9269 SDLoc dl(Node);
9270
9271 // ISD::FSHL and ISD::FSHR have defined overflow behavior but ISD::SHL and
9272 // ISD::SRA/L nodes haven't. Insert an AND to be safe, it's usually optimized
9273 // away during isel.
9274 SDValue SafeShAmt = DAG.getNode(ISD::AND, dl, ShAmtVT, ShAmt,
9275 DAG.getConstant(VTBits - 1, dl, ShAmtVT));
9276 SDValue Tmp1 = IsSRA ? DAG.getNode(ISD::SRA, dl, VT, ShOpHi,
9277 DAG.getConstant(VTBits - 1, dl, ShAmtVT))
9278 : DAG.getConstant(0, dl, VT);
9279
9280 SDValue Tmp2, Tmp3;
9281 if (IsSHL) {
9282 Tmp2 = DAG.getNode(ISD::FSHL, dl, VT, ShOpHi, ShOpLo, ShAmt);
9283 Tmp3 = DAG.getNode(ISD::SHL, dl, VT, ShOpLo, SafeShAmt);
9284 } else {
9285 Tmp2 = DAG.getNode(ISD::FSHR, dl, VT, ShOpHi, ShOpLo, ShAmt);
9286 Tmp3 = DAG.getNode(IsSRA ? ISD::SRA : ISD::SRL, dl, VT, ShOpHi, SafeShAmt);
9287 }
9288
9289 // If the shift amount is larger or equal than the width of a part we don't
9290 // use the result from the FSHL/FSHR. Insert a test and select the appropriate
9291 // values for large shift amounts.
9292 SDValue AndNode = DAG.getNode(ISD::AND, dl, ShAmtVT, ShAmt,
9293 DAG.getConstant(VTBits, dl, ShAmtVT));
9294 SDValue Cond = DAG.getSetCC(dl, ShAmtCCVT, AndNode,
9295 DAG.getConstant(0, dl, ShAmtVT), ISD::SETNE);
9296
9297 if (IsSHL) {
9298 Hi = DAG.getNode(ISD::SELECT, dl, VT, Cond, Tmp3, Tmp2);
9299 Lo = DAG.getNode(ISD::SELECT, dl, VT, Cond, Tmp1, Tmp3);
9300 } else {
9301 Lo = DAG.getNode(ISD::SELECT, dl, VT, Cond, Tmp3, Tmp2);
9302 Hi = DAG.getNode(ISD::SELECT, dl, VT, Cond, Tmp1, Tmp3);
9303 }
9304}
9305
9307 SelectionDAG &DAG) const {
9308 // This implements llvm.canonicalize.f* by multiplication with 1.0, as
9309 // suggested in
9310 // https://llvm.org/docs/LangRef.html#llvm-canonicalize-intrinsic.
9311 // It uses strict_fp operations even outside a strict_fp context in order
9312 // to guarantee that the canonicalization is not optimized away by later
9313 // passes. The result chain introduced by that is intentionally ignored
9314 // since no ordering requirement is intended here.
9315 EVT VT = Node->getValueType(0);
9316 SDLoc DL(Node);
9317 SDNodeFlags Flags = Node->getFlags();
9318 Flags.setNoFPExcept(true);
9319 SDValue One = DAG.getConstantFP(1.0, DL, VT);
9320 SDValue Mul =
9321 DAG.getNode(ISD::STRICT_FMUL, DL, {VT, MVT::Other},
9322 {DAG.getEntryNode(), Node->getOperand(0), One}, Flags);
9323 return Mul;
9324}
9325
9327 SelectionDAG &DAG) const {
9328 // Expand conversion from a native IEEE float type to an arbitrary FP format
9329 // returning the result as an integer using bit manipulation.
9330 EVT ResVT = Node->getValueType(0);
9331 SDLoc dl(Node);
9332
9333 SDValue FloatVal = Node->getOperand(0);
9334 const uint64_t SemEnum = Node->getConstantOperandVal(1);
9335 const auto Sem = static_cast<APFloatBase::Semantics>(SemEnum);
9336 const auto RoundMode =
9337 static_cast<RoundingMode>(Node->getConstantOperandVal(2));
9338 const bool Saturate = Node->getConstantOperandVal(3) != 0;
9339
9340 // Supported destination formats.
9341 switch (Sem) {
9347 break;
9348 default:
9349 DAG.getContext()->emitError("CONVERT_TO_ARBITRARY_FP: not implemented "
9350 "destination format (semantics enum " +
9351 Twine(SemEnum) + ")");
9352 return SDValue();
9353 }
9354
9355 // Supported rounding modes.
9356 switch (RoundMode) {
9362 break;
9363 default:
9364 DAG.getContext()->emitError(
9365 "CONVERT_TO_ARBITRARY_FP: unsupported rounding mode (enum " +
9366 Twine(static_cast<int>(RoundMode)) + ")");
9367 return SDValue();
9368 }
9369
9370 // Destination format parameters.
9371 const fltSemantics &DstSem = APFloatBase::EnumToSemantics(Sem);
9372 const unsigned DstBits = APFloat::getSizeInBits(DstSem);
9373 const unsigned DstPrecision = APFloat::semanticsPrecision(DstSem);
9374 const unsigned DstMant = DstPrecision - 1;
9375 const unsigned DstExpBits = DstBits - DstMant - 1;
9376 const int DstBias = 1 - APFloat::semanticsMinExponent(DstSem);
9377 const unsigned DstExpMax = (1U << DstExpBits) - 1;
9378 const uint64_t DstMantMask = (DstMant > 0) ? ((1ULL << DstMant) - 1) : 0;
9379 const fltNonfiniteBehavior DstNFBehavior = DstSem.nonFiniteBehavior;
9380 const fltNanEncoding DstNanEnc = DstSem.nanEncoding;
9381
9382 // Compute the maximum normal exponent for the destination format.
9383 const unsigned DstExpMaxNormal =
9384 DstNFBehavior == fltNonfiniteBehavior::IEEE754 ? DstExpMax - 1
9385 : DstExpMax;
9386
9387 // For NanOnly formats the max exponent field for finite values
9388 // is DstExpMax, but the encoding with exp = DstExpMax and
9389 // mant = all-ones is NaN. So DstExpMaxNormal = DstExpMax, but max
9390 // mantissa at that exponent is DstMantMask - 1 (if NanEnc == AllOnes) to
9391 // avoid the NaN encoding.
9392 uint64_t DstMaxMantAtMaxExp = DstMantMask;
9393 if (DstNFBehavior == fltNonfiniteBehavior::NanOnly &&
9394 DstNanEnc == fltNanEncoding::AllOnes)
9395 DstMaxMantAtMaxExp = DstMantMask - 1;
9396
9397 // Source format parameters.
9398 EVT SrcVT = FloatVal.getValueType();
9399 const fltSemantics &SrcSem = SrcVT.getScalarType().getFltSemantics();
9400 const unsigned SrcBits = APFloat::getSizeInBits(SrcSem);
9401 const unsigned SrcPrecision = APFloat::semanticsPrecision(SrcSem);
9402 const unsigned SrcMant = SrcPrecision - 1;
9403 const uint64_t SrcMantMask = (1ULL << SrcMant) - 1;
9404
9405 // Work in the source integer type. Match the destination shape so the
9406 // expansion stays vector when ResVT is a vector.
9407 EVT IntScalarVT = EVT::getIntegerVT(*DAG.getContext(), SrcBits);
9408 EVT IntVT = ResVT.changeElementType(*DAG.getContext(), IntScalarVT);
9409 EVT SetCCVT =
9410 getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), IntVT);
9411 EVT FPSetCCVT =
9412 getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), SrcVT);
9413
9414 SDValue Zero = DAG.getConstant(0, dl, IntVT);
9415 SDValue One = DAG.getConstant(1, dl, IntVT);
9416
9417 // Bitcast source float to integer to extract the sign bit.
9418 SDValue Src = DAG.getNode(ISD::BITCAST, dl, IntVT, FloatVal);
9419 SDValue SignBit =
9420 DAG.getNode(ISD::SRL, dl, IntVT, Src,
9421 DAG.getShiftAmountConstant(SrcBits - 1, IntVT, dl));
9422
9423 // Classify the input.
9424 SDValue FPZero = DAG.getConstantFP(0.0, dl, SrcVT);
9425 SDValue FPInf = DAG.getConstantFP(APFloat::getInf(SrcSem), dl, SrcVT);
9426 SDValue AbsVal = DAG.getNode(ISD::FABS, dl, SrcVT, FloatVal);
9427 SDValue IsNaN = DAG.getSetCC(dl, FPSetCCVT, FloatVal, FPZero, ISD::SETUO);
9428 SDValue IsInf = DAG.getSetCC(dl, FPSetCCVT, AbsVal, FPInf, ISD::SETOEQ);
9429 SDValue IsZero = DAG.getSetCC(dl, FPSetCCVT, FloatVal, FPZero, ISD::SETOEQ);
9430
9431 // Split into a normalized fraction and unbiased exponent. FFREXP normalizes
9432 // source denormals automatically. The result is unspecified for Inf/NaN, but
9433 // those inputs are detected above and override the final result.
9434 EVT FrexpExpScalarVT =
9436 EVT FrexpExpVT = SrcVT.changeElementType(*DAG.getContext(), FrexpExpScalarVT);
9437 SDValue Frexp =
9438 DAG.getNode(ISD::FFREXP, dl, DAG.getVTList(SrcVT, FrexpExpVT), FloatVal);
9439 SDValue FrexpFrac = Frexp.getValue(0);
9440 SDValue FrexpExp = Frexp.getValue(1);
9441
9442 SDValue FrexpFracInt = DAG.getNode(ISD::BITCAST, dl, IntVT, FrexpFrac);
9443 SDValue EffSrcMant = DAG.getNode(ISD::AND, dl, IntVT, FrexpFracInt,
9444 DAG.getConstant(SrcMantMask, dl, IntVT));
9445
9446 SDValue FrexpExpExt = DAG.getSExtOrTrunc(FrexpExp, dl, IntVT);
9447 SDValue NewExp = DAG.getNode(ISD::ADD, dl, IntVT, FrexpExpExt,
9448 DAG.getConstant(DstBias - 1, dl, IntVT));
9449
9450 // Compute rounding increment given the round bit, sticky bits, and LSB
9451 // of the truncated mantissa.
9452 auto ComputeRoundUp = [&](SDValue RoundBit, SDValue StickyBits,
9453 SDValue LSB) -> SDValue {
9454 switch (RoundMode) {
9456 // Round up if round_bit && (sticky || lsb)
9457 SDValue StickyOrLSB = DAG.getNode(ISD::OR, dl, IntVT, StickyBits, LSB);
9458 return DAG.getNode(ISD::AND, dl, IntVT, RoundBit, StickyOrLSB);
9459 }
9461 return Zero;
9463 // Round up if positive and any truncated bits are set.
9464 SDValue AnyTruncBits =
9465 DAG.getNode(ISD::OR, dl, IntVT, RoundBit, StickyBits);
9466 SDValue HasTruncBits =
9467 DAG.getSetCC(dl, SetCCVT, AnyTruncBits, Zero, ISD::SETNE);
9468 SDValue IsPositive = DAG.getSetCC(dl, SetCCVT, SignBit, Zero, ISD::SETEQ);
9469 SDValue DoRound =
9470 DAG.getNode(ISD::AND, dl, SetCCVT, HasTruncBits, IsPositive);
9471 return DAG.getNode(ISD::ZERO_EXTEND, dl, IntVT, DoRound);
9472 }
9474 // Round up if negative and any truncated bits are set (to -Inf).
9475 SDValue AnyTruncBits =
9476 DAG.getNode(ISD::OR, dl, IntVT, RoundBit, StickyBits);
9477 SDValue HasTruncBits =
9478 DAG.getSetCC(dl, SetCCVT, AnyTruncBits, Zero, ISD::SETNE);
9479 SDValue IsNegative = DAG.getSetCC(dl, SetCCVT, SignBit, Zero, ISD::SETNE);
9480 SDValue DoRound =
9481 DAG.getNode(ISD::AND, dl, SetCCVT, HasTruncBits, IsNegative);
9482 return DAG.getNode(ISD::ZERO_EXTEND, dl, IntVT, DoRound);
9483 }
9485 return RoundBit;
9486 default:
9487 llvm_unreachable("unsupported rounding mode");
9488 }
9489 };
9490
9491 // Round mantissa from SrcMant bits to DstMant bits.
9492 SDValue TruncMant;
9493 SDValue RoundUp;
9494 if (SrcMant > DstMant) {
9495 const unsigned Shift = SrcMant - DstMant;
9496 SDValue ShiftConst = DAG.getShiftAmountConstant(Shift, IntVT, dl);
9497 TruncMant = DAG.getNode(ISD::SRL, dl, IntVT, EffSrcMant, ShiftConst);
9498
9499 // Check bit at position Shift - 1 aka the round bit.
9500 SDValue RoundBit;
9501 if (Shift >= 1) {
9502 SDValue RoundBitShift = DAG.getShiftAmountConstant(Shift - 1, IntVT, dl);
9503 SDValue ShiftedMant =
9504 DAG.getNode(ISD::SRL, dl, IntVT, EffSrcMant, RoundBitShift);
9505 RoundBit = DAG.getNode(ISD::AND, dl, IntVT, ShiftedMant, One);
9506 } else {
9507 RoundBit = Zero;
9508 }
9509
9510 // OR of all bits below the round bit to get sticky bits.
9511 SDValue StickyBits;
9512 if (Shift >= 2) {
9513 uint64_t StickyMask = maskTrailingOnes<uint64_t>(Shift - 1);
9514 StickyBits = DAG.getNode(ISD::AND, dl, IntVT, EffSrcMant,
9515 DAG.getConstant(StickyMask, dl, IntVT));
9516 StickyBits = DAG.getSetCC(dl, SetCCVT, StickyBits, Zero, ISD::SETNE);
9517 StickyBits = DAG.getNode(ISD::ZERO_EXTEND, dl, IntVT, StickyBits);
9518 } else {
9519 StickyBits = Zero;
9520 }
9521
9522 // LSB of truncated mantissa.
9523 SDValue LSB = DAG.getNode(ISD::AND, dl, IntVT, TruncMant, One);
9524
9525 RoundUp = ComputeRoundUp(RoundBit, StickyBits, LSB);
9526 } else {
9527 // If DstMant >= SrcMant, then no rounding needed, just shift left.
9528 SDValue MantShift =
9529 DAG.getShiftAmountConstant(DstMant - SrcMant, IntVT, dl);
9530 TruncMant = DAG.getNode(ISD::SHL, dl, IntVT, EffSrcMant, MantShift);
9531 RoundUp = Zero;
9532 }
9533
9534 // Apply rounding.
9535 SDValue RoundedMant = DAG.getNode(ISD::ADD, dl, IntVT, TruncMant, RoundUp);
9536
9537 // Handle mantissa overflow from rounding.
9538 // If rounded_mant > DstMantMask, carry into exponent.
9539 SDValue MantOverflow =
9540 DAG.getSetCC(dl, SetCCVT, RoundedMant,
9541 DAG.getConstant(DstMantMask, dl, IntVT), ISD::SETGT);
9542 // On overflow: mant = 0, exp += 1.
9543 SDValue AdjMant = DAG.getSelect(dl, IntVT, MantOverflow, Zero, RoundedMant);
9544 SDValue AdjExp =
9545 DAG.getNode(ISD::ADD, dl, IntVT, NewExp,
9546 DAG.getNode(ISD::ZERO_EXTEND, dl, IntVT, MantOverflow));
9547
9548 // Precompute sign shifted to MSB of destination.
9549 SDValue SignShifted =
9550 DAG.getNode(ISD::SHL, dl, IntVT, SignBit,
9551 DAG.getShiftAmountConstant(DstBits - 1, IntVT, dl));
9552
9553 // Destination denormal conversion (when new_exp <= 0).
9554 // Shift the mantissa right by 1 - new_exp additional bits and set the
9555 // exponent field to 0.
9556 SDValue ExpIsNeg = DAG.getSetCC(dl, SetCCVT, AdjExp,
9557 DAG.getConstant(1, dl, IntVT), ISD::SETLT);
9558
9559 SDValue DenormResult;
9560 {
9561 // denorm_shift = 1 - NewExp.
9562 SDValue DenormShift = DAG.getNode(ISD::SUB, dl, IntVT, One, NewExp);
9563
9564 // full_src_mant = (1 << SrcMant) | EffSrcMant.
9565 SDValue ImplicitOne =
9566 DAG.getNode(ISD::SHL, dl, IntVT, One,
9567 DAG.getShiftAmountConstant(SrcMant, IntVT, dl));
9568 SDValue FullSrcMant =
9569 DAG.getNode(ISD::OR, dl, IntVT, EffSrcMant, ImplicitOne);
9570
9571 // Total right shift = DenormShift + (SrcMant - DstMant).
9572 int64_t MantDelta = static_cast<int64_t>(SrcMant) - DstMant;
9573 SDValue TotalShift =
9574 DAG.getNode(ISD::ADD, dl, IntVT, DenormShift,
9575 DAG.getSignedConstant(MantDelta, dl, IntVT));
9576
9577 // Clamp total shift to avoid UB, then truncate denorm mantissa.
9578 EVT ShiftVT = getShiftAmountTy(IntVT, DAG.getDataLayout());
9579 SDValue MaxShift = DAG.getConstant(SrcBits - 1, dl, IntVT);
9580 SDValue ClampedShift =
9581 DAG.getNode(ISD::UMIN, dl, IntVT, TotalShift, MaxShift);
9582 SDValue DenormTruncMant =
9583 DAG.getNode(ISD::SRL, dl, IntVT, FullSrcMant,
9584 DAG.getZExtOrTrunc(ClampedShift, dl, ShiftVT));
9585
9586 // Rounding for denorm path.
9587 SDValue DenormRoundUp;
9588 {
9589 // Round bit is at position TotalShift - 1 of FullSrcMant.
9590 // Clamp to at least 1 so the subtraction doesn't underflow and create
9591 // shift nodes with invalid shift amounts.
9592 SDValue SafeShift = DAG.getNode(ISD::UMAX, dl, IntVT, ClampedShift, One);
9593 SDValue RoundBitPos = DAG.getNode(ISD::SUB, dl, IntVT, SafeShift, One);
9594 SDValue RoundBitPosAmt = DAG.getZExtOrTrunc(RoundBitPos, dl, ShiftVT);
9595 SDValue DenormRoundBit = DAG.getNode(
9596 ISD::AND, dl, IntVT,
9597 DAG.getNode(ISD::SRL, dl, IntVT, FullSrcMant, RoundBitPosAmt), One);
9598
9599 // Sticky: all bits below round bit.
9600 // sticky_mask = (1 << RoundBitPos) - 1
9601 SDValue StickyMask = DAG.getNode(
9602 ISD::SUB, dl, IntVT,
9603 DAG.getNode(ISD::SHL, dl, IntVT, One, RoundBitPosAmt), One);
9604 SDValue DenormStickyBits =
9605 DAG.getNode(ISD::AND, dl, IntVT, FullSrcMant, StickyMask);
9606 SDValue HasSticky = DAG.getNode(
9607 ISD::ZERO_EXTEND, dl, IntVT,
9608 DAG.getSetCC(dl, SetCCVT, DenormStickyBits, Zero, ISD::SETNE));
9609
9610 SDValue DenormLSB =
9611 DAG.getNode(ISD::AND, dl, IntVT, DenormTruncMant, One);
9612
9613 DenormRoundUp = ComputeRoundUp(DenormRoundBit, HasSticky, DenormLSB);
9614
9615 // Only apply rounding if TotalShift >= 1 (i.e., there are bits to round).
9616 SDValue ShiftGEOne =
9617 DAG.getSetCC(dl, SetCCVT, ClampedShift, One, ISD::SETUGE);
9618 DenormRoundUp = DAG.getSelect(dl, IntVT, ShiftGEOne, DenormRoundUp, Zero);
9619 }
9620
9621 SDValue DenormRoundedMant =
9622 DAG.getNode(ISD::ADD, dl, IntVT, DenormTruncMant, DenormRoundUp);
9623
9624 // If rounding caused overflow into the normal range, then we get the
9625 // smallest normal number.
9626 SDValue DenormMantOF =
9627 DAG.getSetCC(dl, SetCCVT, DenormRoundedMant,
9628 DAG.getConstant(DstMantMask, dl, IntVT), ISD::SETGT);
9629 SDValue DenormFinalMant =
9630 DAG.getSelect(dl, IntVT, DenormMantOF, Zero, DenormRoundedMant);
9631 SDValue DenormFinalExp = DAG.getSelect(dl, IntVT, DenormMantOF, One, Zero);
9632
9633 // Assemble: sign | (exp << DstMant) | mant
9634 SDValue DenormExpShifted =
9635 DAG.getNode(ISD::SHL, dl, IntVT, DenormFinalExp,
9636 DAG.getShiftAmountConstant(DstMant, IntVT, dl));
9637 DenormResult = DAG.getNode(
9638 ISD::OR, dl, IntVT,
9639 DAG.getNode(ISD::OR, dl, IntVT, SignShifted, DenormExpShifted),
9640 DenormFinalMant);
9641 }
9642
9643 // Exponent overflow detection.
9644 SDValue ExpOF =
9645 DAG.getSetCC(dl, SetCCVT, AdjExp,
9646 DAG.getConstant(DstExpMaxNormal, dl, IntVT), ISD::SETGT);
9647
9648 // Also check if AdjExp == DstExpMaxNormal and mantissa overflow into
9649 // a value that exceeds the max allowed mantissa at that exponent.
9650 SDValue ExpAtMax =
9651 DAG.getSetCC(dl, SetCCVT, AdjExp,
9652 DAG.getConstant(DstExpMaxNormal, dl, IntVT), ISD::SETEQ);
9653 SDValue MantExceedsMax =
9654 DAG.getSetCC(dl, SetCCVT, AdjMant,
9655 DAG.getConstant(DstMaxMantAtMaxExp, dl, IntVT), ISD::SETGT);
9656 SDValue ExpMantOF =
9657 DAG.getNode(ISD::AND, dl, SetCCVT, ExpAtMax, MantExceedsMax);
9658 SDValue IsOverflow = DAG.getNode(ISD::OR, dl, SetCCVT, ExpOF, ExpMantOF);
9659
9660 // Build overflow result.
9662
9663 if (Saturate) {
9664 // Clamp to max finite value:
9665 // sign | (DstExpMaxNormal << DstMant) | DstMaxMantAtMaxExp
9666 uint64_t MaxFinite =
9667 ((uint64_t)DstExpMaxNormal << DstMant) | DstMaxMantAtMaxExp;
9668 OverflowResult = DAG.getNode(ISD::OR, dl, IntVT, SignShifted,
9669 DAG.getConstant(MaxFinite, dl, IntVT));
9670 } else if (DstNFBehavior == fltNonfiniteBehavior::IEEE754) {
9671 // Produce infinity.
9672 uint64_t InfBits = (uint64_t)DstExpMax << DstMant;
9673 OverflowResult = DAG.getNode(ISD::OR, dl, IntVT, SignShifted,
9674 DAG.getConstant(InfBits, dl, IntVT));
9675 } else {
9676 // Emit poison if no Inf in format and not saturating.
9677 OverflowResult = DAG.getPOISON(IntVT);
9678 }
9679
9680 // Assemble normal result: sign | (AdjExp << DstMant) | AdjMant
9681 SDValue NormExpShifted =
9682 DAG.getNode(ISD::SHL, dl, IntVT, AdjExp,
9683 DAG.getShiftAmountConstant(DstMant, IntVT, dl));
9684 SDValue NormResult = DAG.getNode(
9685 ISD::OR, dl, IntVT,
9686 DAG.getNode(ISD::OR, dl, IntVT, SignShifted, NormExpShifted), AdjMant);
9687
9688 // Build special-value results.
9689 SDValue NaNResult;
9690 if (DstNFBehavior == fltNonfiniteBehavior::IEEE754) {
9691 // Produce canonical NaN.
9692 const uint64_t QNaNBit = (DstMant > 0) ? (1ULL << (DstMant - 1)) : 0;
9693 NaNResult =
9694 DAG.getConstant(((uint64_t)DstExpMax << DstMant) | QNaNBit, dl, IntVT);
9695 } else if (DstNFBehavior == fltNonfiniteBehavior::NanOnly &&
9696 DstNanEnc == fltNanEncoding::AllOnes) {
9697 // E4M3FN-style: NaN is exp=all-ones, mant=all-ones.
9698 NaNResult = DAG.getConstant(((uint64_t)DstExpMax << DstMant) | DstMantMask,
9699 dl, IntVT);
9700 } else {
9701 // NaN -> poison for finite only values.
9702 NaNResult = DAG.getPOISON(IntVT);
9703 }
9704
9705 // Inf handling.
9706 SDValue InfResult;
9707 if (DstNFBehavior == fltNonfiniteBehavior::IEEE754) {
9708 // Produce signed infinity.
9709 uint64_t InfBits = (uint64_t)DstExpMax << DstMant;
9710 InfResult = DAG.getNode(ISD::OR, dl, IntVT, SignShifted,
9711 DAG.getConstant(InfBits, dl, IntVT));
9712 } else if (Saturate) {
9713 // Inf saturates to max finite.
9714 uint64_t MaxFinite =
9715 ((uint64_t)DstExpMaxNormal << DstMant) | DstMaxMantAtMaxExp;
9716 InfResult = DAG.getNode(ISD::OR, dl, IntVT, SignShifted,
9717 DAG.getConstant(MaxFinite, dl, IntVT));
9718 } else {
9719 // No Inf and not saturating -> poison.
9720 InfResult = DAG.getPOISON(IntVT);
9721 }
9722
9723 SDValue ZeroResult = SignShifted;
9724
9725 // Final selection in an order: NaN takes priority, then Inf, then Zero.
9726 SDValue FiniteResult =
9727 DAG.getSelect(dl, IntVT, ExpIsNeg, DenormResult, NormResult);
9728 FiniteResult =
9729 DAG.getSelect(dl, IntVT, IsOverflow, OverflowResult, FiniteResult);
9730
9731 SDValue Result = FiniteResult;
9732 Result = DAG.getSelect(dl, IntVT, IsZero, ZeroResult, Result);
9733 Result = DAG.getSelect(dl, IntVT, IsInf, InfResult, Result);
9734 Result = DAG.getSelect(dl, IntVT, IsNaN, NaNResult, Result);
9735
9736 // Truncate to destination integer type.
9737 return DAG.getZExtOrTrunc(Result, dl, ResVT);
9738}
9739
9740SDValue
9742 SelectionDAG &DAG) const {
9743 SDLoc dl(Node);
9744 EVT DstVT = Node->getValueType(0);
9745 EVT DstScalarVT = DstVT.getScalarType();
9746
9747 SDValue IntVal = Node->getOperand(0);
9748 const uint64_t SemEnum = Node->getConstantOperandVal(1);
9749 const auto Sem = static_cast<APFloatBase::Semantics>(SemEnum);
9750
9751 // Supported source formats.
9752 switch (Sem) {
9758 break;
9759 default:
9760 DAG.getContext()->emitError("CONVERT_FROM_ARBITRARY_FP: not implemented "
9761 "source format (semantics enum " +
9762 Twine(SemEnum) + ")");
9763 return SDValue();
9764 }
9765
9766 const fltSemantics &SrcSem = APFloatBase::EnumToSemantics(Sem);
9767 const unsigned SrcBits = APFloat::getSizeInBits(SrcSem);
9768 const unsigned SrcPrecision = APFloat::semanticsPrecision(SrcSem);
9769 const unsigned SrcMant = SrcPrecision - 1;
9770 const unsigned SrcExp = SrcBits - SrcMant - 1;
9771 const int SrcBias = 1 - APFloat::semanticsMinExponent(SrcSem);
9772 const fltNonfiniteBehavior NFBehavior = SrcSem.nonFiniteBehavior;
9773
9774 // Destination format parameters.
9775 const fltSemantics &DstSem = DstScalarVT.getFltSemantics();
9776 const unsigned DstBits = APFloat::getSizeInBits(DstSem);
9777 const unsigned DstMant = APFloat::semanticsPrecision(DstSem) - 1;
9778 const unsigned DstExpBits = DstBits - DstMant - 1;
9779 const int DstMinExp = APFloat::semanticsMinExponent(DstSem);
9780 const int DstBias = 1 - DstMinExp;
9781 const uint64_t DstExpAllOnes = (1ULL << DstExpBits) - 1;
9782
9783 // Work in an integer type matching the destination float width.
9784 EVT IntScalarVT = EVT::getIntegerVT(*DAG.getContext(), DstBits);
9785 EVT IntVT = DstVT.isVector()
9786 ? EVT::getVectorVT(*DAG.getContext(), IntScalarVT,
9787 DstVT.getVectorElementCount())
9788 : IntScalarVT;
9789
9790 SDValue Src = DAG.getZExtOrTrunc(IntVal, dl, IntVT);
9791
9792 EVT SetCCVT =
9793 getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), IntVT);
9794
9795 SDValue Zero = DAG.getConstant(0, dl, IntVT);
9796 SDValue One = DAG.getConstant(1, dl, IntVT);
9797
9798 // Extract bit fields.
9799 const uint64_t MantMask = (SrcMant > 0) ? ((1ULL << SrcMant) - 1) : 0;
9800 const uint64_t ExpMask = (1ULL << SrcExp) - 1;
9801
9802 SDValue MantField = DAG.getNode(ISD::AND, dl, IntVT, Src,
9803 DAG.getConstant(MantMask, dl, IntVT));
9804
9805 SDValue ExpField =
9806 DAG.getNode(ISD::AND, dl, IntVT,
9807 DAG.getNode(ISD::SRL, dl, IntVT, Src,
9808 DAG.getShiftAmountConstant(SrcMant, IntVT, dl)),
9809 DAG.getConstant(ExpMask, dl, IntVT));
9810
9811 SDValue SignBit =
9812 DAG.getNode(ISD::SRL, dl, IntVT, Src,
9813 DAG.getShiftAmountConstant(SrcBits - 1, IntVT, dl));
9814
9815 SDValue SignShifted =
9816 DAG.getNode(ISD::SHL, dl, IntVT, SignBit,
9817 DAG.getShiftAmountConstant(DstBits - 1, IntVT, dl));
9818
9819 // Classify the input.
9820 SDValue ExpAllOnes = DAG.getConstant(ExpMask, dl, IntVT);
9821 SDValue IsExpAllOnes =
9822 DAG.getSetCC(dl, SetCCVT, ExpField, ExpAllOnes, ISD::SETEQ);
9823 SDValue IsExpZero = DAG.getSetCC(dl, SetCCVT, ExpField, Zero, ISD::SETEQ);
9824 SDValue IsMantZero = DAG.getSetCC(dl, SetCCVT, MantField, Zero, ISD::SETEQ);
9825 SDValue IsMantNonZero =
9826 DAG.getSetCC(dl, SetCCVT, MantField, Zero, ISD::SETNE);
9827
9828 SDValue IsNaN;
9829 if (NFBehavior == fltNonfiniteBehavior::FiniteOnly) {
9830 IsNaN = DAG.getBoolConstant(false, dl, SetCCVT, IntVT);
9831 } else if (NFBehavior == fltNonfiniteBehavior::IEEE754) {
9832 IsNaN = DAG.getNode(ISD::AND, dl, SetCCVT, IsExpAllOnes, IsMantNonZero);
9833 } else {
9835 SDValue MantAllOnes = DAG.getConstant(MantMask, dl, IntVT);
9836 SDValue IsMantAllOnes =
9837 DAG.getSetCC(dl, SetCCVT, MantField, MantAllOnes, ISD::SETEQ);
9838 IsNaN = DAG.getNode(ISD::AND, dl, SetCCVT, IsExpAllOnes, IsMantAllOnes);
9839 }
9840
9841 SDValue IsInf;
9842 if (NFBehavior == fltNonfiniteBehavior::IEEE754)
9843 IsInf = DAG.getNode(ISD::AND, dl, SetCCVT, IsExpAllOnes, IsMantZero);
9844 else
9845 IsInf = DAG.getBoolConstant(false, dl, SetCCVT, IntVT);
9846
9847 SDValue IsZero = DAG.getNode(ISD::AND, dl, SetCCVT, IsExpZero, IsMantZero);
9848 SDValue IsDenorm =
9849 DAG.getNode(ISD::AND, dl, SetCCVT, IsExpZero, IsMantNonZero);
9850
9851 // Normal value conversion.
9852 const int BiasAdjust = DstBias - SrcBias;
9853 SDValue NormDstExp =
9854 DAG.getNode(ISD::ADD, dl, IntVT, ExpField,
9855 DAG.getConstant(APInt(DstBits, BiasAdjust, true), dl, IntVT));
9856
9857 SDValue NormDstMant;
9858 if (DstMant > SrcMant) {
9859 SDValue NormDstMantShift =
9860 DAG.getShiftAmountConstant(DstMant - SrcMant, IntVT, dl);
9861 NormDstMant = DAG.getNode(ISD::SHL, dl, IntVT, MantField, NormDstMantShift);
9862 } else {
9863 NormDstMant = MantField;
9864 }
9865
9866 SDValue DstMantShift = DAG.getShiftAmountConstant(DstMant, IntVT, dl);
9867 SDValue NormExpShifted =
9868 DAG.getNode(ISD::SHL, dl, IntVT, NormDstExp, DstMantShift);
9869 SDValue NormResult =
9870 DAG.getNode(ISD::OR, dl, IntVT,
9871 DAG.getNode(ISD::OR, dl, IntVT, SignShifted, NormExpShifted),
9872 NormDstMant);
9873
9874 // Denormal value conversion.
9875 SDValue DenormResult;
9876 {
9877 const unsigned IntVTBits = DstBits;
9878 SDValue LeadingZeros =
9879 DAG.getNode(ISD::CTLZ_ZERO_POISON, dl, IntVT, MantField);
9880
9881 const int DenormExpConst =
9882 (int)IntVTBits + DstBias - SrcBias - (int)SrcMant;
9883 SDValue DenormDstExp = DAG.getNode(
9884 ISD::SUB, dl, IntVT,
9885 DAG.getConstant(APInt(DstBits, DenormExpConst, true), dl, IntVT),
9886 LeadingZeros);
9887
9888 SDValue MantMSB =
9889 DAG.getNode(ISD::SUB, dl, IntVT,
9890 DAG.getConstant(IntVTBits - 1, dl, IntVT), LeadingZeros);
9891
9892 SDValue LeadingOne = DAG.getNode(ISD::SHL, dl, IntVT, One, MantMSB);
9893 SDValue Frac = DAG.getNode(ISD::XOR, dl, IntVT, MantField, LeadingOne);
9894
9895 const unsigned ShiftSub = IntVTBits - 1 - DstMant;
9896 SDValue ShiftAmount = DAG.getNode(ISD::SUB, dl, IntVT, LeadingZeros,
9897 DAG.getConstant(ShiftSub, dl, IntVT));
9898
9899 SDValue DenormDstMant = DAG.getNode(ISD::SHL, dl, IntVT, Frac, ShiftAmount);
9900
9901 SDValue DenormExpShifted =
9902 DAG.getNode(ISD::SHL, dl, IntVT, DenormDstExp, DstMantShift);
9903 DenormResult = DAG.getNode(
9904 ISD::OR, dl, IntVT,
9905 DAG.getNode(ISD::OR, dl, IntVT, SignShifted, DenormExpShifted),
9906 DenormDstMant);
9907 }
9908
9909 SDValue FiniteResult =
9910 DAG.getSelect(dl, IntVT, IsDenorm, DenormResult, NormResult);
9911
9912 const uint64_t QNaNBit = (DstMant > 0) ? (1ULL << (DstMant - 1)) : 0;
9913 SDValue NaNResult =
9914 DAG.getConstant((DstExpAllOnes << DstMant) | QNaNBit, dl, IntVT);
9915
9916 SDValue InfResult =
9917 DAG.getNode(ISD::OR, dl, IntVT, SignShifted,
9918 DAG.getConstant(DstExpAllOnes << DstMant, dl, IntVT));
9919
9920 SDValue ZeroResult = SignShifted;
9921
9922 SDValue Result = FiniteResult;
9923 Result = DAG.getSelect(dl, IntVT, IsZero, ZeroResult, Result);
9924 Result = DAG.getSelect(dl, IntVT, IsInf, InfResult, Result);
9925 Result = DAG.getSelect(dl, IntVT, IsNaN, NaNResult, Result);
9926
9927 return DAG.getNode(ISD::BITCAST, dl, DstVT, Result);
9928}
9929
9931 SelectionDAG &DAG) const {
9932 unsigned OpNo = Node->isStrictFPOpcode() ? 1 : 0;
9933 SDValue Src = Node->getOperand(OpNo);
9934 EVT SrcVT = Src.getValueType();
9935 EVT DstVT = Node->getValueType(0);
9936 SDLoc dl(SDValue(Node, 0));
9937
9938 // FIXME: Only f32 to i64 conversions are supported.
9939 if (SrcVT != MVT::f32 || DstVT != MVT::i64)
9940 return false;
9941
9942 if (Node->isStrictFPOpcode())
9943 // When a NaN is converted to an integer a trap is allowed. We can't
9944 // use this expansion here because it would eliminate that trap. Other
9945 // traps are also allowed and cannot be eliminated. See
9946 // IEEE 754-2008 sec 5.8.
9947 return false;
9948
9949 // Expand f32 -> i64 conversion
9950 // This algorithm comes from compiler-rt's implementation of fixsfdi:
9951 // https://github.com/llvm/llvm-project/blob/main/compiler-rt/lib/builtins/fixsfdi.c
9952 unsigned SrcEltBits = SrcVT.getScalarSizeInBits();
9953 EVT IntVT = SrcVT.changeTypeToInteger();
9954 EVT IntShVT = getShiftAmountTy(IntVT, DAG.getDataLayout());
9955
9956 SDValue ExponentMask = DAG.getConstant(0x7F800000, dl, IntVT);
9957 SDValue ExponentLoBit = DAG.getConstant(23, dl, IntVT);
9958 SDValue Bias = DAG.getConstant(127, dl, IntVT);
9959 SDValue SignMask = DAG.getConstant(APInt::getSignMask(SrcEltBits), dl, IntVT);
9960 SDValue SignLowBit = DAG.getConstant(SrcEltBits - 1, dl, IntVT);
9961 SDValue MantissaMask = DAG.getConstant(0x007FFFFF, dl, IntVT);
9962
9963 SDValue Bits = DAG.getNode(ISD::BITCAST, dl, IntVT, Src);
9964
9965 SDValue ExponentBits = DAG.getNode(
9966 ISD::SRL, dl, IntVT, DAG.getNode(ISD::AND, dl, IntVT, Bits, ExponentMask),
9967 DAG.getZExtOrTrunc(ExponentLoBit, dl, IntShVT));
9968 SDValue Exponent = DAG.getNode(ISD::SUB, dl, IntVT, ExponentBits, Bias);
9969
9970 SDValue Sign = DAG.getNode(ISD::SRA, dl, IntVT,
9971 DAG.getNode(ISD::AND, dl, IntVT, Bits, SignMask),
9972 DAG.getZExtOrTrunc(SignLowBit, dl, IntShVT));
9973 Sign = DAG.getSExtOrTrunc(Sign, dl, DstVT);
9974
9975 SDValue R = DAG.getNode(ISD::OR, dl, IntVT,
9976 DAG.getNode(ISD::AND, dl, IntVT, Bits, MantissaMask),
9977 DAG.getConstant(0x00800000, dl, IntVT));
9978
9979 R = DAG.getZExtOrTrunc(R, dl, DstVT);
9980
9981 R = DAG.getSelectCC(
9982 dl, Exponent, ExponentLoBit,
9983 DAG.getNode(ISD::SHL, dl, DstVT, R,
9984 DAG.getZExtOrTrunc(
9985 DAG.getNode(ISD::SUB, dl, IntVT, Exponent, ExponentLoBit),
9986 dl, IntShVT)),
9987 DAG.getNode(ISD::SRL, dl, DstVT, R,
9988 DAG.getZExtOrTrunc(
9989 DAG.getNode(ISD::SUB, dl, IntVT, ExponentLoBit, Exponent),
9990 dl, IntShVT)),
9991 ISD::SETGT);
9992
9993 SDValue Ret = DAG.getNode(ISD::SUB, dl, DstVT,
9994 DAG.getNode(ISD::XOR, dl, DstVT, R, Sign), Sign);
9995
9996 Result = DAG.getSelectCC(dl, Exponent, DAG.getConstant(0, dl, IntVT),
9997 DAG.getConstant(0, dl, DstVT), Ret, ISD::SETLT);
9998 return true;
9999}
10000
10002 SDValue &Chain,
10003 SelectionDAG &DAG) const {
10004 SDLoc dl(SDValue(Node, 0));
10005 unsigned OpNo = Node->isStrictFPOpcode() ? 1 : 0;
10006 SDValue Src = Node->getOperand(OpNo);
10007
10008 EVT SrcVT = Src.getValueType();
10009 EVT DstVT = Node->getValueType(0);
10010 EVT SetCCVT =
10011 getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), SrcVT);
10012 EVT DstSetCCVT =
10013 getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), DstVT);
10014
10015 // Only expand vector types if we have the appropriate vector bit operations.
10016 unsigned SIntOpcode = Node->isStrictFPOpcode() ? ISD::STRICT_FP_TO_SINT :
10018 if (DstVT.isVector() && (!isOperationLegalOrCustom(SIntOpcode, DstVT) ||
10020 return false;
10021
10022 // If the maximum float value is smaller then the signed integer range,
10023 // the destination signmask can't be represented by the float, so we can
10024 // just use FP_TO_SINT directly.
10025 const fltSemantics &APFSem = SrcVT.getFltSemantics();
10026 APFloat APF(APFSem, APInt::getZero(SrcVT.getScalarSizeInBits()));
10027 APInt SignMask = APInt::getSignMask(DstVT.getScalarSizeInBits());
10029 APF.convertFromAPInt(SignMask, false, APFloat::rmNearestTiesToEven)) {
10030 if (Node->isStrictFPOpcode()) {
10031 Result = DAG.getNode(ISD::STRICT_FP_TO_SINT, dl, { DstVT, MVT::Other },
10032 { Node->getOperand(0), Src });
10033 Chain = Result.getValue(1);
10034 } else
10035 Result = DAG.getNode(ISD::FP_TO_SINT, dl, DstVT, Src);
10036 return true;
10037 }
10038
10039 // Don't expand it if there isn't cheap fsub instruction.
10041 Node->isStrictFPOpcode() ? ISD::STRICT_FSUB : ISD::FSUB, SrcVT))
10042 return false;
10043
10044 SDValue Cst = DAG.getConstantFP(APF, dl, SrcVT);
10045 SDValue Sel;
10046
10047 if (Node->isStrictFPOpcode()) {
10048 Sel = DAG.getSetCC(dl, SetCCVT, Src, Cst, ISD::SETLT,
10049 Node->getOperand(0), /*IsSignaling*/ true);
10050 Chain = Sel.getValue(1);
10051 } else {
10052 Sel = DAG.getSetCC(dl, SetCCVT, Src, Cst, ISD::SETLT);
10053 }
10054
10055 bool Strict = Node->isStrictFPOpcode() ||
10056 shouldUseStrictFP_TO_INT(SrcVT, DstVT, /*IsSigned*/ false);
10057
10058 if (Strict) {
10059 // Expand based on maximum range of FP_TO_SINT, if the value exceeds the
10060 // signmask then offset (the result of which should be fully representable).
10061 // Sel = Src < 0x8000000000000000
10062 // FltOfs = select Sel, 0, 0x8000000000000000
10063 // IntOfs = select Sel, 0, 0x8000000000000000
10064 // Result = fp_to_sint(Src - FltOfs) ^ IntOfs
10065
10066 // TODO: Should any fast-math-flags be set for the FSUB?
10067 SDValue FltOfs = DAG.getSelect(dl, SrcVT, Sel,
10068 DAG.getConstantFP(0.0, dl, SrcVT), Cst);
10069 Sel = DAG.getBoolExtOrTrunc(Sel, dl, DstSetCCVT, DstVT);
10070 SDValue IntOfs = DAG.getSelect(dl, DstVT, Sel,
10071 DAG.getConstant(0, dl, DstVT),
10072 DAG.getConstant(SignMask, dl, DstVT));
10073 SDValue SInt;
10074 if (Node->isStrictFPOpcode()) {
10075 SDValue Val = DAG.getNode(ISD::STRICT_FSUB, dl, { SrcVT, MVT::Other },
10076 { Chain, Src, FltOfs });
10077 SInt = DAG.getNode(ISD::STRICT_FP_TO_SINT, dl, { DstVT, MVT::Other },
10078 { Val.getValue(1), Val });
10079 Chain = SInt.getValue(1);
10080 } else {
10081 SDValue Val = DAG.getNode(ISD::FSUB, dl, SrcVT, Src, FltOfs);
10082 SInt = DAG.getNode(ISD::FP_TO_SINT, dl, DstVT, Val);
10083 }
10084 Result = DAG.getNode(ISD::XOR, dl, DstVT, SInt, IntOfs);
10085 } else {
10086 // Expand based on maximum range of FP_TO_SINT:
10087 // True = fp_to_sint(Src)
10088 // False = 0x8000000000000000 + fp_to_sint(Src - 0x8000000000000000)
10089 // Result = select (Src < 0x8000000000000000), True, False
10090
10091 SDValue True = DAG.getNode(ISD::FP_TO_SINT, dl, DstVT, Src);
10092 // TODO: Should any fast-math-flags be set for the FSUB?
10093 SDValue False = DAG.getNode(ISD::FP_TO_SINT, dl, DstVT,
10094 DAG.getNode(ISD::FSUB, dl, SrcVT, Src, Cst));
10095 False = DAG.getNode(ISD::XOR, dl, DstVT, False,
10096 DAG.getConstant(SignMask, dl, DstVT));
10097 Sel = DAG.getBoolExtOrTrunc(Sel, dl, DstSetCCVT, DstVT);
10098 Result = DAG.getSelect(dl, DstVT, Sel, True, False);
10099 }
10100 return true;
10101}
10102
10104 SDValue &Chain, SelectionDAG &DAG) const {
10105 // This transform is not correct for converting 0 when rounding mode is set
10106 // to round toward negative infinity which will produce -0.0. So disable
10107 // under strictfp.
10108 if (Node->isStrictFPOpcode())
10109 return false;
10110
10111 SDValue Src = Node->getOperand(0);
10112 EVT SrcVT = Src.getValueType();
10113 EVT DstVT = Node->getValueType(0);
10114
10115 // If the input is known to be non-negative and SINT_TO_FP is legal then use
10116 // it.
10117 if (Node->getFlags().hasNonNeg() &&
10119 Result =
10120 DAG.getNode(ISD::SINT_TO_FP, SDLoc(Node), DstVT, Node->getOperand(0));
10121 return true;
10122 }
10123
10124 if (SrcVT.getScalarType() != MVT::i64 || DstVT.getScalarType() != MVT::f64)
10125 return false;
10126
10127 // Only expand vector types if we have the appropriate vector bit
10128 // operations.
10129 if (SrcVT.isVector() && (!isOperationLegalOrCustom(ISD::SRL, SrcVT) ||
10134 return false;
10135
10136 SDLoc dl(SDValue(Node, 0));
10137
10138 // Implementation of unsigned i64 to f64 following the algorithm in
10139 // __floatundidf in compiler_rt. This implementation performs rounding
10140 // correctly in all rounding modes with the exception of converting 0
10141 // when rounding toward negative infinity. In that case the fsub will
10142 // produce -0.0. This will be added to +0.0 and produce -0.0 which is
10143 // incorrect.
10144 SDValue TwoP52 = DAG.getConstant(UINT64_C(0x4330000000000000), dl, SrcVT);
10145 SDValue TwoP84PlusTwoP52 = DAG.getConstantFP(
10146 llvm::bit_cast<double>(UINT64_C(0x4530000000100000)), dl, DstVT);
10147 SDValue TwoP84 = DAG.getConstant(UINT64_C(0x4530000000000000), dl, SrcVT);
10148 SDValue LoMask = DAG.getConstant(UINT64_C(0x00000000FFFFFFFF), dl, SrcVT);
10149 SDValue HiShift = DAG.getShiftAmountConstant(32, SrcVT, dl);
10150
10151 SDValue Lo = DAG.getNode(ISD::AND, dl, SrcVT, Src, LoMask);
10152 SDValue Hi = DAG.getNode(ISD::SRL, dl, SrcVT, Src, HiShift);
10153 SDValue LoOr = DAG.getNode(ISD::OR, dl, SrcVT, Lo, TwoP52);
10154 SDValue HiOr = DAG.getNode(ISD::OR, dl, SrcVT, Hi, TwoP84);
10155 SDValue LoFlt = DAG.getBitcast(DstVT, LoOr);
10156 SDValue HiFlt = DAG.getBitcast(DstVT, HiOr);
10157 SDValue HiSub = DAG.getNode(ISD::FSUB, dl, DstVT, HiFlt, TwoP84PlusTwoP52);
10158 Result = DAG.getNode(ISD::FADD, dl, DstVT, LoFlt, HiSub);
10159 return true;
10160}
10161
10162SDValue
10164 SelectionDAG &DAG) const {
10165 unsigned Opcode = Node->getOpcode();
10166 assert((Opcode == ISD::FMINNUM || Opcode == ISD::FMAXNUM ||
10167 Opcode == ISD::STRICT_FMINNUM || Opcode == ISD::STRICT_FMAXNUM) &&
10168 "Wrong opcode");
10169
10170 if (Node->getFlags().hasNoNaNs()) {
10171 ISD::CondCode Pred = Opcode == ISD::FMINNUM ? ISD::SETLT : ISD::SETGT;
10172 EVT VT = Node->getValueType(0);
10173 if ((!isCondCodeLegal(Pred, VT.getSimpleVT()) ||
10175 VT.isVector())
10176 return SDValue();
10177 SDValue Op1 = Node->getOperand(0);
10178 SDValue Op2 = Node->getOperand(1);
10179 return DAG.getSelectCC(SDLoc(Node), Op1, Op2, Op1, Op2, Pred,
10180 Node->getFlags());
10181 }
10182
10183 return SDValue();
10184}
10185
10187 SelectionDAG &DAG) const {
10188 if (SDValue Expanded = expandVectorNaryOpBySplitting(Node, DAG))
10189 return Expanded;
10190
10191 EVT VT = Node->getValueType(0);
10192 if (VT.isScalableVector())
10194 "Expanding fminnum/fmaxnum for scalable vectors is undefined.");
10195
10196 SDLoc dl(Node);
10197 unsigned NewOp =
10199
10200 if (isOperationLegalOrCustom(NewOp, VT)) {
10201 SDValue Quiet0 = Node->getOperand(0);
10202 SDValue Quiet1 = Node->getOperand(1);
10203
10204 if (!Node->getFlags().hasNoNaNs()) {
10205 // Insert canonicalizes if it's possible we need to quiet to get correct
10206 // sNaN behavior.
10207 if (!DAG.isKnownNeverSNaN(Quiet0)) {
10208 Quiet0 = DAG.getNode(ISD::FCANONICALIZE, dl, VT, Quiet0,
10209 Node->getFlags());
10210 }
10211 if (!DAG.isKnownNeverSNaN(Quiet1)) {
10212 Quiet1 = DAG.getNode(ISD::FCANONICALIZE, dl, VT, Quiet1,
10213 Node->getFlags());
10214 }
10215 }
10216
10217 return DAG.getNode(NewOp, dl, VT, Quiet0, Quiet1, Node->getFlags());
10218 }
10219
10220 // If the target has FMINIMUM/FMAXIMUM but not FMINNUM/FMAXNUM use that
10221 // instead if there are no NaNs.
10222 if (Node->getFlags().hasNoNaNs() ||
10223 (DAG.isKnownNeverNaN(Node->getOperand(0)) &&
10224 DAG.isKnownNeverNaN(Node->getOperand(1)))) {
10225 unsigned IEEE2018Op =
10226 Node->getOpcode() == ISD::FMINNUM ? ISD::FMINIMUM : ISD::FMAXIMUM;
10227 if (isOperationLegalOrCustom(IEEE2018Op, VT))
10228 return DAG.getNode(IEEE2018Op, dl, VT, Node->getOperand(0),
10229 Node->getOperand(1), Node->getFlags());
10230 }
10231
10233 return SelCC;
10234
10235 return SDValue();
10236}
10237
10239 const TargetLowering &TLI,
10240 const SDLoc &DL, SDValue Val,
10241 FPClassTest FPClass) {
10242 EVT VT = Val.getValueType();
10243 EVT CCVT = TLI.getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
10244 EVT IntVT = VT.changeTypeToInteger();
10245 EVT FloatVT = VT.changeElementType(*DAG.getContext(), MVT::f32);
10246 SDValue TestZero = DAG.getTargetConstant(FPClass, DL, MVT::i32);
10247 if (!TLI.isTypeLegal(IntVT) &&
10249 Val = DAG.getNode(ISD::FP_ROUND, DL, FloatVT, Val,
10250 DAG.getIntPtrConstant(0, DL, /*isTarget=*/true));
10251 return DAG.getNode(ISD::IS_FPCLASS, DL, CCVT, Val, TestZero);
10252}
10253
10255 SelectionDAG &DAG) const {
10256 if (SDValue Expanded = expandVectorNaryOpBySplitting(N, DAG))
10257 return Expanded;
10258
10259 SDLoc DL(N);
10260 SDValue LHS = N->getOperand(0);
10261 SDValue RHS = N->getOperand(1);
10262 unsigned Opc = N->getOpcode();
10263 EVT VT = N->getValueType(0);
10264 EVT CCVT = getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
10265 bool IsMax = Opc == ISD::FMAXIMUM;
10266 SDNodeFlags Flags = N->getFlags();
10267
10268 // First, implement comparison not propagating NaN. If no native fmin or fmax
10269 // available, use plain select with setcc instead.
10271 unsigned CompOpcIeee = IsMax ? ISD::FMAXNUM_IEEE : ISD::FMINNUM_IEEE;
10272 unsigned CompOpc = IsMax ? ISD::FMAXNUM : ISD::FMINNUM;
10273
10274 // FIXME: We should probably define fminnum/fmaxnum variants with correct
10275 // signed zero behavior.
10276 bool MinMaxMustRespectOrderedZero = false;
10277
10278 if (isOperationLegalOrCustom(CompOpcIeee, VT)) {
10279 MinMax = DAG.getNode(CompOpcIeee, DL, VT, LHS, RHS, Flags);
10280 MinMaxMustRespectOrderedZero = true;
10281 } else if (isOperationLegalOrCustom(CompOpc, VT)) {
10282 MinMax = DAG.getNode(CompOpc, DL, VT, LHS, RHS, Flags);
10283 } else {
10285 return DAG.UnrollVectorOp(N);
10286
10287 // NaN (if exists) will be propagated later, so orderness doesn't matter.
10288 SDValue Compare =
10289 DAG.getSetCC(DL, CCVT, LHS, RHS, IsMax ? ISD::SETOGT : ISD::SETOLT);
10290 MinMax = DAG.getSelect(DL, VT, Compare, LHS, RHS, Flags);
10291 }
10292
10293 // Propagate any NaN of both operands
10294 if (!N->getFlags().hasNoNaNs() &&
10295 (!DAG.isKnownNeverNaN(RHS) || !DAG.isKnownNeverNaN(LHS))) {
10296 ConstantFP *FPNaN = ConstantFP::get(*DAG.getContext(),
10298 MinMax = DAG.getSelect(DL, VT, DAG.getSetCC(DL, CCVT, LHS, RHS, ISD::SETUO),
10299 DAG.getConstantFP(*FPNaN, DL, VT), MinMax, Flags);
10300 }
10301
10302 // fminimum/fmaximum requires -0.0 less than +0.0
10303 if (!MinMaxMustRespectOrderedZero && !N->getFlags().hasNoSignedZeros() &&
10304 !DAG.isKnownNeverLogicalZero(RHS) && !DAG.isKnownNeverLogicalZero(LHS)) {
10305 SDValue IsEqual = DAG.getSetCC(DL, CCVT, LHS, RHS, ISD::SETOEQ);
10307 DAG, *this, DL, LHS, IsMax ? fcPosZero : fcNegZero);
10308 SDValue RetZero = DAG.getSelect(DL, VT, IsSpecificZero, LHS, RHS, Flags);
10309 MinMax = DAG.getSelect(DL, VT, IsEqual, RetZero, MinMax, Flags);
10310 }
10311
10312 return MinMax;
10313}
10314
10316 SelectionDAG &DAG) const {
10317 SDLoc DL(Node);
10318 SDValue LHS = Node->getOperand(0);
10319 SDValue RHS = Node->getOperand(1);
10320 unsigned Opc = Node->getOpcode();
10321 EVT VT = Node->getValueType(0);
10322 EVT CCVT = getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
10323 bool IsMax = Opc == ISD::FMAXIMUMNUM;
10324 SDNodeFlags Flags = Node->getFlags();
10325
10326 unsigned NewOp =
10328
10329 if (isOperationLegalOrCustom(NewOp, VT)) {
10330 if (!Flags.hasNoNaNs()) {
10331 // Insert canonicalizes if it's possible we need to quiet to get correct
10332 // sNaN behavior.
10333 if (!DAG.isKnownNeverSNaN(LHS)) {
10334 LHS = DAG.getNode(ISD::FCANONICALIZE, DL, VT, LHS, Flags);
10335 }
10336 if (!DAG.isKnownNeverSNaN(RHS)) {
10337 RHS = DAG.getNode(ISD::FCANONICALIZE, DL, VT, RHS, Flags);
10338 }
10339 }
10340
10341 return DAG.getNode(NewOp, DL, VT, LHS, RHS, Flags);
10342 }
10343
10344 // We can use FMINIMUM/FMAXIMUM if there is no NaN, since it has
10345 // same behaviors for all of other cases: +0.0 vs -0.0 included.
10346 if (Flags.hasNoNaNs() ||
10347 (DAG.isKnownNeverNaN(LHS) && DAG.isKnownNeverNaN(RHS))) {
10348 unsigned IEEE2019Op =
10350 if (isOperationLegalOrCustom(IEEE2019Op, VT))
10351 return DAG.getNode(IEEE2019Op, DL, VT, LHS, RHS, Flags);
10352 }
10353
10354 // FMINNUM/FMAXMUM returns qNaN if either operand is sNaN, and it may return
10355 // either one for +0.0 vs -0.0.
10356 if ((Flags.hasNoNaNs() ||
10357 (DAG.isKnownNeverSNaN(LHS) && DAG.isKnownNeverSNaN(RHS))) &&
10358 (Flags.hasNoSignedZeros() || DAG.isKnownNeverLogicalZero(LHS) ||
10359 DAG.isKnownNeverLogicalZero(RHS))) {
10360 unsigned IEEE2008Op = Opc == ISD::FMINIMUMNUM ? ISD::FMINNUM : ISD::FMAXNUM;
10361 if (isOperationLegalOrCustom(IEEE2008Op, VT))
10362 return DAG.getNode(IEEE2008Op, DL, VT, LHS, RHS, Flags);
10363 }
10364
10365 if (VT.isVector() &&
10368 return DAG.UnrollVectorOp(Node);
10369
10370 // If only one operand is NaN, override it with another operand.
10371 if (!Flags.hasNoNaNs() && !DAG.isKnownNeverNaN(LHS)) {
10372 LHS = DAG.getSelectCC(DL, LHS, LHS, RHS, LHS, ISD::SETUO);
10373 }
10374 if (!Flags.hasNoNaNs() && !DAG.isKnownNeverNaN(RHS)) {
10375 RHS = DAG.getSelectCC(DL, RHS, RHS, LHS, RHS, ISD::SETUO);
10376 }
10377
10378 // Always prefer RHS if equal.
10379 SDValue MinMax =
10380 DAG.getSelectCC(DL, LHS, RHS, LHS, RHS, IsMax ? ISD::SETGT : ISD::SETLT);
10381
10382 // TODO: We need quiet sNaN if strictfp.
10383
10384 // Fixup signed zero behavior.
10385 if (Flags.hasNoSignedZeros() || DAG.isKnownNeverLogicalZero(LHS) ||
10386 DAG.isKnownNeverLogicalZero(RHS)) {
10387 return MinMax;
10388 }
10389 SDValue IsZero = DAG.getSetCC(DL, CCVT, MinMax,
10390 DAG.getConstantFP(0.0, DL, VT), ISD::SETEQ);
10392 DAG, *this, DL, LHS, IsMax ? fcPosZero : fcNegZero);
10393 // It's OK to select from LHS and MinMax, with only one ISD::IS_FPCLASS, as
10394 // we preferred RHS when generate MinMax, if the operands are equal.
10395 SDValue RetZero = DAG.getSelect(DL, VT, IsSpecificZero, LHS, MinMax, Flags);
10396 return DAG.getSelect(DL, VT, IsZero, RetZero, MinMax, Flags);
10397}
10398
10399/// Returns a true value if if this FPClassTest can be performed with an ordered
10400/// fcmp to 0, and a false value if it's an unordered fcmp to 0. Returns
10401/// std::nullopt if it cannot be performed as a compare with 0.
10402static std::optional<bool> isFCmpEqualZero(FPClassTest Test,
10403 const fltSemantics &Semantics,
10404 const MachineFunction &MF) {
10405 FPClassTest OrderedMask = Test & ~fcNan;
10406 FPClassTest NanTest = Test & fcNan;
10407 bool IsOrdered = NanTest == fcNone;
10408 bool IsUnordered = NanTest == fcNan;
10409
10410 // Skip cases that are testing for only a qnan or snan.
10411 if (!IsOrdered && !IsUnordered)
10412 return std::nullopt;
10413
10414 if (OrderedMask == fcZero &&
10415 MF.getDenormalMode(Semantics).Input == DenormalMode::IEEE)
10416 return IsOrdered;
10417 if (OrderedMask == (fcZero | fcSubnormal) &&
10418 MF.getDenormalMode(Semantics).inputsAreZero())
10419 return IsOrdered;
10420 return std::nullopt;
10421}
10422
10424 const FPClassTest OrigTestMask,
10425 SDNodeFlags Flags, const SDLoc &DL,
10426 SelectionDAG &DAG) const {
10427 EVT OperandVT = Op.getValueType();
10428 assert(OperandVT.isFloatingPoint());
10429 FPClassTest Test = OrigTestMask;
10430
10431 // Degenerated cases.
10432 if (Test == fcNone)
10433 return DAG.getBoolConstant(false, DL, ResultVT, OperandVT);
10434 if (Test == fcAllFlags)
10435 return DAG.getBoolConstant(true, DL, ResultVT, OperandVT);
10436
10437 // PPC double double is a pair of doubles, of which the higher part determines
10438 // the value class.
10439 if (OperandVT == MVT::ppcf128) {
10440 Op = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::f64, Op,
10441 DAG.getConstant(1, DL, MVT::i32));
10442 OperandVT = MVT::f64;
10443 }
10444
10445 // Floating-point type properties.
10446 EVT ScalarFloatVT = OperandVT.getScalarType();
10447 const Type *FloatTy = ScalarFloatVT.getTypeForEVT(*DAG.getContext());
10448 const llvm::fltSemantics &Semantics = FloatTy->getFltSemantics();
10449 bool IsF80 = (ScalarFloatVT == MVT::f80);
10450
10451 // Some checks can be implemented using float comparisons, if floating point
10452 // exceptions are ignored.
10453 if (Flags.hasNoFPExcept() &&
10455 FPClassTest FPTestMask = Test;
10456 bool IsInvertedFP = false;
10457
10458 if (FPClassTest InvertedFPCheck =
10459 invertFPClassTestIfSimpler(FPTestMask, true)) {
10460 FPTestMask = InvertedFPCheck;
10461 IsInvertedFP = true;
10462 }
10463
10464 ISD::CondCode OrderedCmpOpcode = IsInvertedFP ? ISD::SETUNE : ISD::SETOEQ;
10465 ISD::CondCode UnorderedCmpOpcode = IsInvertedFP ? ISD::SETONE : ISD::SETUEQ;
10466
10467 // See if we can fold an | fcNan into an unordered compare.
10468 FPClassTest OrderedFPTestMask = FPTestMask & ~fcNan;
10469
10470 // Can't fold the ordered check if we're only testing for snan or qnan
10471 // individually.
10472 if ((FPTestMask & fcNan) != fcNan)
10473 OrderedFPTestMask = FPTestMask;
10474
10475 const bool IsOrdered = FPTestMask == OrderedFPTestMask;
10476
10477 if (std::optional<bool> IsCmp0 =
10478 isFCmpEqualZero(FPTestMask, Semantics, DAG.getMachineFunction());
10479 IsCmp0 && (isCondCodeLegalOrCustom(
10480 *IsCmp0 ? OrderedCmpOpcode : UnorderedCmpOpcode,
10481 OperandVT.getScalarType().getSimpleVT()))) {
10482
10483 // If denormals could be implicitly treated as 0, this is not equivalent
10484 // to a compare with 0 since it will also be true for denormals.
10485 return DAG.getSetCC(DL, ResultVT, Op,
10486 DAG.getConstantFP(0.0, DL, OperandVT),
10487 *IsCmp0 ? OrderedCmpOpcode : UnorderedCmpOpcode);
10488 }
10489
10490 if (FPTestMask == fcNan &&
10492 OperandVT.getScalarType().getSimpleVT()))
10493 return DAG.getSetCC(DL, ResultVT, Op, Op,
10494 IsInvertedFP ? ISD::SETO : ISD::SETUO);
10495
10496 bool IsOrderedInf = FPTestMask == fcInf;
10497 if ((FPTestMask == fcInf || FPTestMask == (fcInf | fcNan)) &&
10498 isCondCodeLegalOrCustom(IsOrderedInf ? OrderedCmpOpcode
10499 : UnorderedCmpOpcode,
10500 OperandVT.getScalarType().getSimpleVT()) &&
10503 (OperandVT.isVector() &&
10505 // isinf(x) --> fabs(x) == inf
10506 SDValue Abs = DAG.getNode(ISD::FABS, DL, OperandVT, Op);
10507 SDValue Inf =
10508 DAG.getConstantFP(APFloat::getInf(Semantics), DL, OperandVT);
10509 return DAG.getSetCC(DL, ResultVT, Abs, Inf,
10510 IsOrderedInf ? OrderedCmpOpcode : UnorderedCmpOpcode);
10511 }
10512
10513 if ((OrderedFPTestMask == fcPosInf || OrderedFPTestMask == fcNegInf) &&
10514 isCondCodeLegalOrCustom(IsOrdered ? OrderedCmpOpcode
10515 : UnorderedCmpOpcode,
10516 OperandVT.getSimpleVT())) {
10517 // isposinf(x) --> x == inf
10518 // isneginf(x) --> x == -inf
10519 // isposinf(x) || nan --> x u== inf
10520 // isneginf(x) || nan --> x u== -inf
10521
10522 SDValue Inf = DAG.getConstantFP(
10523 APFloat::getInf(Semantics, OrderedFPTestMask == fcNegInf), DL,
10524 OperandVT);
10525 return DAG.getSetCC(DL, ResultVT, Op, Inf,
10526 IsOrdered ? OrderedCmpOpcode : UnorderedCmpOpcode);
10527 }
10528
10529 if (OrderedFPTestMask == (fcSubnormal | fcZero) && !IsOrdered) {
10530 // TODO: Could handle ordered case, but it produces worse code for
10531 // x86. Maybe handle ordered if fabs is free?
10532
10533 ISD::CondCode OrderedOp = IsInvertedFP ? ISD::SETUGE : ISD::SETOLT;
10534 ISD::CondCode UnorderedOp = IsInvertedFP ? ISD::SETOGE : ISD::SETULT;
10535
10536 if (isCondCodeLegalOrCustom(IsOrdered ? OrderedOp : UnorderedOp,
10537 OperandVT.getScalarType().getSimpleVT())) {
10538 // (issubnormal(x) || iszero(x)) --> fabs(x) < smallest_normal
10539
10540 // TODO: Maybe only makes sense if fabs is free. Integer test of
10541 // exponent bits seems better for x86.
10542 SDValue Abs = DAG.getNode(ISD::FABS, DL, OperandVT, Op);
10543 SDValue SmallestNormal = DAG.getConstantFP(
10544 APFloat::getSmallestNormalized(Semantics), DL, OperandVT);
10545 return DAG.getSetCC(DL, ResultVT, Abs, SmallestNormal,
10546 IsOrdered ? OrderedOp : UnorderedOp);
10547 }
10548 }
10549
10550 if (FPTestMask == fcNormal) {
10551 // TODO: Handle unordered
10552 ISD::CondCode IsFiniteOp = IsInvertedFP ? ISD::SETUGE : ISD::SETOLT;
10553 ISD::CondCode IsNormalOp = IsInvertedFP ? ISD::SETOLT : ISD::SETUGE;
10554
10555 if (isCondCodeLegalOrCustom(IsFiniteOp,
10556 OperandVT.getScalarType().getSimpleVT()) &&
10557 isCondCodeLegalOrCustom(IsNormalOp,
10558 OperandVT.getScalarType().getSimpleVT()) &&
10559 isFAbsFree(OperandVT)) {
10560 // isnormal(x) --> fabs(x) < infinity && !(fabs(x) < smallest_normal)
10561 SDValue Inf =
10562 DAG.getConstantFP(APFloat::getInf(Semantics), DL, OperandVT);
10563 SDValue SmallestNormal = DAG.getConstantFP(
10564 APFloat::getSmallestNormalized(Semantics), DL, OperandVT);
10565
10566 SDValue Abs = DAG.getNode(ISD::FABS, DL, OperandVT, Op);
10567 SDValue IsFinite = DAG.getSetCC(DL, ResultVT, Abs, Inf, IsFiniteOp);
10568 SDValue IsNormal =
10569 DAG.getSetCC(DL, ResultVT, Abs, SmallestNormal, IsNormalOp);
10570 unsigned LogicOp = IsInvertedFP ? ISD::OR : ISD::AND;
10571 return DAG.getNode(LogicOp, DL, ResultVT, IsFinite, IsNormal);
10572 }
10573 }
10574 }
10575
10576 // Some checks may be represented as inversion of simpler check, for example
10577 // "inf|normal|subnormal|zero" => !"nan".
10578 bool IsInverted = false;
10579
10580 if (FPClassTest InvertedCheck = invertFPClassTestIfSimpler(Test, false)) {
10581 Test = InvertedCheck;
10582 IsInverted = true;
10583 }
10584
10585 // In the general case use integer operations.
10586 unsigned BitSize = OperandVT.getScalarSizeInBits();
10587 EVT IntVT = OperandVT.changeElementType(
10588 *DAG.getContext(), EVT::getIntegerVT(*DAG.getContext(), BitSize));
10589 SDValue OpAsInt = DAG.getBitcast(IntVT, Op);
10590
10591 // Various masks.
10592 APInt SignBit = APInt::getSignMask(BitSize);
10593 APInt ValueMask = APInt::getSignedMaxValue(BitSize); // All bits but sign.
10594 APInt Inf = APFloat::getInf(Semantics).bitcastToAPInt(); // Exp and int bit.
10595 const unsigned ExplicitIntBitInF80 = 63;
10596 APInt ExpMask = Inf;
10597 if (IsF80)
10598 ExpMask.clearBit(ExplicitIntBitInF80);
10599 APInt AllOneMantissa = APFloat::getLargest(Semantics).bitcastToAPInt() & ~Inf;
10600 APInt QNaNBitMask =
10601 APInt::getOneBitSet(BitSize, AllOneMantissa.getActiveBits() - 1);
10602 APInt InversionMask = APInt::getAllOnes(ResultVT.getScalarSizeInBits());
10603
10604 SDValue ValueMaskV = DAG.getConstant(ValueMask, DL, IntVT);
10605 SDValue SignBitV = DAG.getConstant(SignBit, DL, IntVT);
10606 SDValue ExpMaskV = DAG.getConstant(ExpMask, DL, IntVT);
10607 SDValue ZeroV = DAG.getConstant(0, DL, IntVT);
10608 SDValue InfV = DAG.getConstant(Inf, DL, IntVT);
10609 SDValue ResultInversionMask = DAG.getConstant(InversionMask, DL, ResultVT);
10610
10611 SDValue Res;
10612 const auto appendResult = [&](SDValue PartialRes) {
10613 if (PartialRes) {
10614 if (Res)
10615 Res = DAG.getNode(ISD::OR, DL, ResultVT, Res, PartialRes);
10616 else
10617 Res = PartialRes;
10618 }
10619 };
10620
10621 SDValue IntBitIsSetV; // Explicit integer bit in f80 mantissa is set.
10622 const auto getIntBitIsSet = [&]() -> SDValue {
10623 if (!IntBitIsSetV) {
10624 APInt IntBitMask(BitSize, 0);
10625 IntBitMask.setBit(ExplicitIntBitInF80);
10626 SDValue IntBitMaskV = DAG.getConstant(IntBitMask, DL, IntVT);
10627 SDValue IntBitV = DAG.getNode(ISD::AND, DL, IntVT, OpAsInt, IntBitMaskV);
10628 IntBitIsSetV = DAG.getSetCC(DL, ResultVT, IntBitV, ZeroV, ISD::SETNE);
10629 }
10630 return IntBitIsSetV;
10631 };
10632
10633 // Split the value into sign bit and absolute value.
10634 SDValue AbsV = DAG.getNode(ISD::AND, DL, IntVT, OpAsInt, ValueMaskV);
10635 SDValue SignV = DAG.getSetCC(DL, ResultVT, OpAsInt,
10636 DAG.getConstant(0, DL, IntVT), ISD::SETLT);
10637
10638 // Tests that involve more than one class should be processed first.
10639 SDValue PartialRes;
10640
10641 if (IsF80)
10642 ; // Detect finite numbers of f80 by checking individual classes because
10643 // they have different settings of the explicit integer bit.
10644 else if ((Test & fcFinite) == fcFinite) {
10645 // finite(V) ==> (a << 1) < (inf << 1)
10646 //
10647 // See https://github.com/llvm/llvm-project/issues/169270, this is slightly
10648 // shorter than the `finite(V) ==> abs(V) < exp_mask` formula used before.
10649
10651 "finite check requires IEEE-like FP");
10652
10653 SDValue One = DAG.getShiftAmountConstant(1, IntVT, DL);
10654 SDValue TwiceOp = DAG.getNode(ISD::SHL, DL, IntVT, OpAsInt, One);
10655 SDValue TwiceInf = DAG.getNode(ISD::SHL, DL, IntVT, ExpMaskV, One);
10656
10657 PartialRes = DAG.getSetCC(DL, ResultVT, TwiceOp, TwiceInf, ISD::SETULT);
10658 Test &= ~fcFinite;
10659 } else if ((Test & fcFinite) == fcPosFinite) {
10660 // finite(V) && V > 0 ==> V < exp_mask
10661 PartialRes = DAG.getSetCC(DL, ResultVT, OpAsInt, ExpMaskV, ISD::SETULT);
10662 Test &= ~fcPosFinite;
10663 } else if ((Test & fcFinite) == fcNegFinite) {
10664 // finite(V) && V < 0 ==> abs(V) < exp_mask && signbit == 1
10665 PartialRes = DAG.getSetCC(DL, ResultVT, AbsV, ExpMaskV, ISD::SETLT);
10666 PartialRes = DAG.getNode(ISD::AND, DL, ResultVT, PartialRes, SignV);
10667 Test &= ~fcNegFinite;
10668 }
10669 appendResult(PartialRes);
10670
10671 if (FPClassTest PartialCheck = Test & (fcZero | fcSubnormal)) {
10672 // fcZero | fcSubnormal => test all exponent bits are 0
10673 // TODO: Handle sign bit specific cases
10674 if (PartialCheck == (fcZero | fcSubnormal)) {
10675 SDValue ExpBits = DAG.getNode(ISD::AND, DL, IntVT, OpAsInt, ExpMaskV);
10676 SDValue ExpIsZero =
10677 DAG.getSetCC(DL, ResultVT, ExpBits, ZeroV, ISD::SETEQ);
10678 appendResult(ExpIsZero);
10679 Test &= ~PartialCheck & fcAllFlags;
10680 }
10681 }
10682
10683 // Check for individual classes.
10684
10685 if (unsigned PartialCheck = Test & fcZero) {
10686 if (PartialCheck == fcPosZero)
10687 PartialRes = DAG.getSetCC(DL, ResultVT, OpAsInt, ZeroV, ISD::SETEQ);
10688 else if (PartialCheck == fcZero)
10689 PartialRes = DAG.getSetCC(DL, ResultVT, AbsV, ZeroV, ISD::SETEQ);
10690 else // ISD::fcNegZero
10691 PartialRes = DAG.getSetCC(DL, ResultVT, OpAsInt, SignBitV, ISD::SETEQ);
10692 appendResult(PartialRes);
10693 }
10694
10695 if (unsigned PartialCheck = Test & fcSubnormal) {
10696 // issubnormal(V) ==> unsigned(abs(V) - 1) < (all mantissa bits set)
10697 // issubnormal(V) && V>0 ==> unsigned(V - 1) < (all mantissa bits set)
10698 SDValue V = (PartialCheck == fcPosSubnormal) ? OpAsInt : AbsV;
10699 SDValue MantissaV = DAG.getConstant(AllOneMantissa, DL, IntVT);
10700 SDValue VMinusOneV =
10701 DAG.getNode(ISD::SUB, DL, IntVT, V, DAG.getConstant(1, DL, IntVT));
10702 PartialRes = DAG.getSetCC(DL, ResultVT, VMinusOneV, MantissaV, ISD::SETULT);
10703 if (PartialCheck == fcNegSubnormal)
10704 PartialRes = DAG.getNode(ISD::AND, DL, ResultVT, PartialRes, SignV);
10705 appendResult(PartialRes);
10706 }
10707
10708 if (unsigned PartialCheck = Test & fcInf) {
10709 if (PartialCheck == fcPosInf)
10710 PartialRes = DAG.getSetCC(DL, ResultVT, OpAsInt, InfV, ISD::SETEQ);
10711 else if (PartialCheck == fcInf)
10712 PartialRes = DAG.getSetCC(DL, ResultVT, AbsV, InfV, ISD::SETEQ);
10713 else { // ISD::fcNegInf
10714 APInt NegInf = APFloat::getInf(Semantics, true).bitcastToAPInt();
10715 SDValue NegInfV = DAG.getConstant(NegInf, DL, IntVT);
10716 PartialRes = DAG.getSetCC(DL, ResultVT, OpAsInt, NegInfV, ISD::SETEQ);
10717 }
10718 appendResult(PartialRes);
10719 }
10720
10721 if (unsigned PartialCheck = Test & fcNan) {
10722 APInt InfWithQnanBit = Inf | QNaNBitMask;
10723 SDValue InfWithQnanBitV = DAG.getConstant(InfWithQnanBit, DL, IntVT);
10724 if (PartialCheck == fcNan) {
10725 // isnan(V) ==> abs(V) > int(inf)
10726 PartialRes = DAG.getSetCC(DL, ResultVT, AbsV, InfV, ISD::SETGT);
10727 if (IsF80) {
10728 // Recognize unsupported values as NaNs for compatibility with glibc.
10729 // In them (exp(V)==0) == int_bit.
10730 SDValue ExpBits = DAG.getNode(ISD::AND, DL, IntVT, AbsV, ExpMaskV);
10731 SDValue ExpIsZero =
10732 DAG.getSetCC(DL, ResultVT, ExpBits, ZeroV, ISD::SETEQ);
10733 SDValue IsPseudo =
10734 DAG.getSetCC(DL, ResultVT, getIntBitIsSet(), ExpIsZero, ISD::SETEQ);
10735 PartialRes = DAG.getNode(ISD::OR, DL, ResultVT, PartialRes, IsPseudo);
10736 }
10737 } else if (PartialCheck == fcQNan) {
10738 // isquiet(V) ==> abs(V) >= (unsigned(Inf) | quiet_bit)
10739 PartialRes =
10740 DAG.getSetCC(DL, ResultVT, AbsV, InfWithQnanBitV, ISD::SETGE);
10741 } else { // ISD::fcSNan
10742 // issignaling(V) ==> abs(V) > unsigned(Inf) &&
10743 // abs(V) < (unsigned(Inf) | quiet_bit)
10744 SDValue IsNan = DAG.getSetCC(DL, ResultVT, AbsV, InfV, ISD::SETGT);
10745 SDValue IsNotQnan =
10746 DAG.getSetCC(DL, ResultVT, AbsV, InfWithQnanBitV, ISD::SETLT);
10747 PartialRes = DAG.getNode(ISD::AND, DL, ResultVT, IsNan, IsNotQnan);
10748 }
10749 appendResult(PartialRes);
10750 }
10751
10752 if (unsigned PartialCheck = Test & fcNormal) {
10753 // isnormal(V) ==> (0 < exp < max_exp) ==> (unsigned(exp-1) < (max_exp-1))
10754 APInt ExpLSB = ExpMask & ~(ExpMask.shl(1));
10755 SDValue ExpLSBV = DAG.getConstant(ExpLSB, DL, IntVT);
10756 SDValue ExpMinus1 = DAG.getNode(ISD::SUB, DL, IntVT, AbsV, ExpLSBV);
10757 APInt ExpLimit = ExpMask - ExpLSB;
10758 SDValue ExpLimitV = DAG.getConstant(ExpLimit, DL, IntVT);
10759 PartialRes = DAG.getSetCC(DL, ResultVT, ExpMinus1, ExpLimitV, ISD::SETULT);
10760 if (PartialCheck == fcNegNormal)
10761 PartialRes = DAG.getNode(ISD::AND, DL, ResultVT, PartialRes, SignV);
10762 else if (PartialCheck == fcPosNormal) {
10763 SDValue PosSignV =
10764 DAG.getNode(ISD::XOR, DL, ResultVT, SignV, ResultInversionMask);
10765 PartialRes = DAG.getNode(ISD::AND, DL, ResultVT, PartialRes, PosSignV);
10766 }
10767 if (IsF80)
10768 PartialRes =
10769 DAG.getNode(ISD::AND, DL, ResultVT, PartialRes, getIntBitIsSet());
10770 appendResult(PartialRes);
10771 }
10772
10773 if (!Res)
10774 return DAG.getConstant(IsInverted, DL, ResultVT);
10775 if (IsInverted)
10776 Res = DAG.getNode(ISD::XOR, DL, ResultVT, Res, ResultInversionMask);
10777 return Res;
10778}
10779
10780// Only expand vector types if we have the appropriate vector bit operations.
10781static bool canExpandVectorCTPOP(const TargetLowering &TLI, EVT VT) {
10782 assert(VT.isVector() && "Expected vector type");
10783 unsigned Len = VT.getScalarSizeInBits();
10784 return TLI.isOperationLegalOrCustom(ISD::ADD, VT) &&
10787 (Len == 8 || TLI.isOperationLegalOrCustom(ISD::MUL, VT)) &&
10789}
10790
10792 SDLoc dl(Node);
10793 EVT VT = Node->getValueType(0);
10794 EVT ShVT = getShiftAmountTy(VT, DAG.getDataLayout());
10795 SDValue Op = Node->getOperand(0);
10796 unsigned Len = VT.getScalarSizeInBits();
10797 assert(VT.isInteger() && "CTPOP not implemented for this type.");
10798
10799 // TODO: Add support for irregular type lengths.
10800 if (!(Len <= 128 && Len % 8 == 0))
10801 return SDValue();
10802
10803 // Only expand vector types if we have the appropriate vector bit operations.
10804 if (VT.isVector() && !canExpandVectorCTPOP(*this, VT))
10805 return SDValue();
10806
10807 // This is the "best" algorithm from
10808 // http://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetParallel
10809 SDValue Mask55 =
10810 DAG.getConstant(APInt::getSplat(Len, APInt(8, 0x55)), dl, VT);
10811 SDValue Mask33 =
10812 DAG.getConstant(APInt::getSplat(Len, APInt(8, 0x33)), dl, VT);
10813 SDValue Mask0F =
10814 DAG.getConstant(APInt::getSplat(Len, APInt(8, 0x0F)), dl, VT);
10815
10816 // v = v - ((v >> 1) & 0x55555555...)
10817 Op = DAG.getNode(ISD::SUB, dl, VT, Op,
10818 DAG.getNode(ISD::AND, dl, VT,
10819 DAG.getNode(ISD::SRL, dl, VT, Op,
10820 DAG.getConstant(1, dl, ShVT)),
10821 Mask55));
10822 // v = (v & 0x33333333...) + ((v >> 2) & 0x33333333...)
10823 Op = DAG.getNode(ISD::ADD, dl, VT, DAG.getNode(ISD::AND, dl, VT, Op, Mask33),
10824 DAG.getNode(ISD::AND, dl, VT,
10825 DAG.getNode(ISD::SRL, dl, VT, Op,
10826 DAG.getConstant(2, dl, ShVT)),
10827 Mask33));
10828 // v = (v + (v >> 4)) & 0x0F0F0F0F...
10829 Op = DAG.getNode(ISD::AND, dl, VT,
10830 DAG.getNode(ISD::ADD, dl, VT, Op,
10831 DAG.getNode(ISD::SRL, dl, VT, Op,
10832 DAG.getConstant(4, dl, ShVT))),
10833 Mask0F);
10834
10835 if (Len <= 8)
10836 return Op;
10837
10838 // Avoid the multiply if we only have 2 bytes to add.
10839 // TODO: Only doing this for scalars because vectors weren't as obviously
10840 // improved.
10841 if (Len == 16 && !VT.isVector()) {
10842 // v = (v + (v >> 8)) & 0x00FF;
10843 return DAG.getNode(ISD::AND, dl, VT,
10844 DAG.getNode(ISD::ADD, dl, VT, Op,
10845 DAG.getNode(ISD::SRL, dl, VT, Op,
10846 DAG.getConstant(8, dl, ShVT))),
10847 DAG.getConstant(0xFF, dl, VT));
10848 }
10849
10850 // v = (v * 0x01010101...) >> (Len - 8)
10851 SDValue V;
10854 SDValue Mask01 =
10855 DAG.getConstant(APInt::getSplat(Len, APInt(8, 0x01)), dl, VT);
10856 V = DAG.getNode(ISD::MUL, dl, VT, Op, Mask01);
10857 } else {
10858 V = Op;
10859 for (unsigned Shift = 8; Shift < Len; Shift *= 2) {
10860 SDValue ShiftC = DAG.getShiftAmountConstant(Shift, VT, dl);
10861 V = DAG.getNode(ISD::ADD, dl, VT, V,
10862 DAG.getNode(ISD::SHL, dl, VT, V, ShiftC));
10863 }
10864 }
10865 return DAG.getNode(ISD::SRL, dl, VT, V, DAG.getConstant(Len - 8, dl, ShVT));
10866}
10867
10869 SDLoc dl(Node);
10870 EVT VT = Node->getValueType(0);
10871 EVT ShVT = getShiftAmountTy(VT, DAG.getDataLayout());
10872 SDValue Op = Node->getOperand(0);
10873 SDValue Mask = Node->getOperand(1);
10874 SDValue VL = Node->getOperand(2);
10875 unsigned Len = VT.getScalarSizeInBits();
10876 assert(VT.isInteger() && "VP_CTPOP not implemented for this type.");
10877
10878 // TODO: Add support for irregular type lengths.
10879 if (!(Len <= 128 && Len % 8 == 0))
10880 return SDValue();
10881
10882 // This is same algorithm of expandCTPOP from
10883 // http://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetParallel
10884 SDValue Mask55 =
10885 DAG.getConstant(APInt::getSplat(Len, APInt(8, 0x55)), dl, VT);
10886 SDValue Mask33 =
10887 DAG.getConstant(APInt::getSplat(Len, APInt(8, 0x33)), dl, VT);
10888 SDValue Mask0F =
10889 DAG.getConstant(APInt::getSplat(Len, APInt(8, 0x0F)), dl, VT);
10890
10891 SDValue Tmp1, Tmp2, Tmp3, Tmp4, Tmp5;
10892
10893 // v = v - ((v >> 1) & 0x55555555...)
10894 Tmp1 = DAG.getNode(ISD::VP_AND, dl, VT,
10895 DAG.getNode(ISD::VP_SRL, dl, VT, Op,
10896 DAG.getConstant(1, dl, ShVT), Mask, VL),
10897 Mask55, Mask, VL);
10898 Op = DAG.getNode(ISD::VP_SUB, dl, VT, Op, Tmp1, Mask, VL);
10899
10900 // v = (v & 0x33333333...) + ((v >> 2) & 0x33333333...)
10901 Tmp2 = DAG.getNode(ISD::VP_AND, dl, VT, Op, Mask33, Mask, VL);
10902 Tmp3 = DAG.getNode(ISD::VP_AND, dl, VT,
10903 DAG.getNode(ISD::VP_SRL, dl, VT, Op,
10904 DAG.getConstant(2, dl, ShVT), Mask, VL),
10905 Mask33, Mask, VL);
10906 Op = DAG.getNode(ISD::VP_ADD, dl, VT, Tmp2, Tmp3, Mask, VL);
10907
10908 // v = (v + (v >> 4)) & 0x0F0F0F0F...
10909 Tmp4 = DAG.getNode(ISD::VP_SRL, dl, VT, Op, DAG.getConstant(4, dl, ShVT),
10910 Mask, VL),
10911 Tmp5 = DAG.getNode(ISD::VP_ADD, dl, VT, Op, Tmp4, Mask, VL);
10912 Op = DAG.getNode(ISD::VP_AND, dl, VT, Tmp5, Mask0F, Mask, VL);
10913
10914 if (Len <= 8)
10915 return Op;
10916
10917 // v = (v * 0x01010101...) >> (Len - 8)
10918 SDValue V;
10920 ISD::VP_MUL, getTypeToTransformTo(*DAG.getContext(), VT))) {
10921 SDValue Mask01 =
10922 DAG.getConstant(APInt::getSplat(Len, APInt(8, 0x01)), dl, VT);
10923 V = DAG.getNode(ISD::VP_MUL, dl, VT, Op, Mask01, Mask, VL);
10924 } else {
10925 V = Op;
10926 for (unsigned Shift = 8; Shift < Len; Shift *= 2) {
10927 SDValue ShiftC = DAG.getShiftAmountConstant(Shift, VT, dl);
10928 V = DAG.getNode(ISD::VP_ADD, dl, VT, V,
10929 DAG.getNode(ISD::VP_SHL, dl, VT, V, ShiftC, Mask, VL),
10930 Mask, VL);
10931 }
10932 }
10933 return DAG.getNode(ISD::VP_SRL, dl, VT, V, DAG.getConstant(Len - 8, dl, ShVT),
10934 Mask, VL);
10935}
10936
10938 SDLoc dl(Node);
10939 EVT VT = Node->getValueType(0);
10940 EVT ShVT = getShiftAmountTy(VT, DAG.getDataLayout());
10941 SDValue Op = Node->getOperand(0);
10942 unsigned NumBitsPerElt = VT.getScalarSizeInBits();
10943
10944 // If the non-ZERO_POISON version is supported we can use that instead.
10945 if (Node->getOpcode() == ISD::CTLZ_ZERO_POISON &&
10947 return DAG.getNode(ISD::CTLZ, dl, VT, Op);
10948
10949 // If the ZERO_POISON version is supported use that and handle the zero case.
10951 EVT SetCCVT =
10952 getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
10953 SDValue CTLZ = DAG.getNode(ISD::CTLZ_ZERO_POISON, dl, VT, Op);
10954 SDValue Zero = DAG.getConstant(0, dl, VT);
10955 SDValue SrcIsZero = DAG.getSetCC(dl, SetCCVT, Op, Zero, ISD::SETEQ);
10956 return DAG.getSelect(dl, VT, SrcIsZero,
10957 DAG.getConstant(NumBitsPerElt, dl, VT), CTLZ);
10958 }
10959
10960 // Only expand vector types if we have the appropriate vector bit operations.
10961 // This includes the operations needed to expand CTPOP if it isn't supported.
10962 if (VT.isVector() && (!isPowerOf2_32(NumBitsPerElt) ||
10964 !canExpandVectorCTPOP(*this, VT)) ||
10967 return SDValue();
10968
10969 // for now, we do this:
10970 // x = x | (x >> 1);
10971 // x = x | (x >> 2);
10972 // ...
10973 // x = x | (x >>16);
10974 // x = x | (x >>32); // for 64-bit input
10975 // return popcount(~x);
10976 //
10977 // Ref: "Hacker's Delight" by Henry Warren
10978 for (unsigned i = 0; (1U << i) < NumBitsPerElt; ++i) {
10979 SDValue Tmp = DAG.getConstant(1ULL << i, dl, ShVT);
10980 Op = DAG.getNode(ISD::OR, dl, VT, Op,
10981 DAG.getNode(ISD::SRL, dl, VT, Op, Tmp));
10982 }
10983 Op = DAG.getNOT(dl, Op, VT);
10984 return DAG.getNode(ISD::CTPOP, dl, VT, Op);
10985}
10986
10988 SDLoc dl(Node);
10989 EVT VT = Node->getValueType(0);
10990 EVT ShVT = getShiftAmountTy(VT, DAG.getDataLayout());
10991 SDValue Op = Node->getOperand(0);
10992 SDValue Mask = Node->getOperand(1);
10993 SDValue VL = Node->getOperand(2);
10994 unsigned NumBitsPerElt = VT.getScalarSizeInBits();
10995
10996 // do this:
10997 // x = x | (x >> 1);
10998 // x = x | (x >> 2);
10999 // ...
11000 // x = x | (x >>16);
11001 // x = x | (x >>32); // for 64-bit input
11002 // return popcount(~x);
11003 for (unsigned i = 0; (1U << i) < NumBitsPerElt; ++i) {
11004 SDValue Tmp = DAG.getConstant(1ULL << i, dl, ShVT);
11005 Op = DAG.getNode(ISD::VP_OR, dl, VT, Op,
11006 DAG.getNode(ISD::VP_SRL, dl, VT, Op, Tmp, Mask, VL), Mask,
11007 VL);
11008 }
11009 Op = DAG.getNode(ISD::VP_XOR, dl, VT, Op, DAG.getAllOnesConstant(dl, VT),
11010 Mask, VL);
11011 return DAG.getNode(ISD::VP_CTPOP, dl, VT, Op, Mask, VL);
11012}
11013
11015 SDLoc dl(Node);
11016 EVT VT = Node->getValueType(0);
11017 SDValue Op = DAG.getFreeze(Node->getOperand(0));
11018 unsigned NumBitsPerElt = VT.getScalarSizeInBits();
11019
11020 // CTLS(x) = CTLZ(OR(SHL(XOR(x, SRA(x, BW-1)), 1), 1))
11021 // This transforms the sign bits into leading zeros that can be counted.
11022 SDValue ShiftAmt = DAG.getShiftAmountConstant(NumBitsPerElt - 1, VT, dl);
11023 SDValue SignBit = DAG.getNode(ISD::SRA, dl, VT, Op, ShiftAmt);
11024 SDValue Xor = DAG.getNode(ISD::XOR, dl, VT, Op, SignBit);
11025 SDValue Shl =
11026 DAG.getNode(ISD::SHL, dl, VT, Xor, DAG.getShiftAmountConstant(1, VT, dl));
11027 SDValue Or = DAG.getNode(ISD::OR, dl, VT, Shl, DAG.getConstant(1, dl, VT));
11028 return DAG.getNode(ISD::CTLZ_ZERO_POISON, dl, VT, Or);
11029}
11030
11032 const SDLoc &DL, EVT VT, SDValue Op,
11033 unsigned BitWidth) const {
11034 if (BitWidth != 32 && BitWidth != 64)
11035 return SDValue();
11036
11037 const DataLayout &TD = DAG.getDataLayout();
11039 return SDValue();
11040
11041 APInt DeBruijn = BitWidth == 32 ? APInt(32, 0x077CB531U)
11042 : APInt(64, 0x0218A392CD3D5DBFULL);
11043 MachinePointerInfo PtrInfo =
11045 unsigned ShiftAmt = BitWidth - Log2_32(BitWidth);
11046 SDValue Neg = DAG.getNode(ISD::SUB, DL, VT, DAG.getConstant(0, DL, VT), Op);
11047 SDValue Lookup = DAG.getNode(
11048 ISD::SRL, DL, VT,
11049 DAG.getNode(ISD::MUL, DL, VT, DAG.getNode(ISD::AND, DL, VT, Op, Neg),
11050 DAG.getConstant(DeBruijn, DL, VT)),
11051 DAG.getShiftAmountConstant(ShiftAmt, VT, DL));
11053
11055 for (unsigned i = 0; i < BitWidth; i++) {
11056 APInt Shl = DeBruijn.shl(i);
11057 APInt Lshr = Shl.lshr(ShiftAmt);
11058 Table[Lshr.getZExtValue()] = i;
11059 }
11060
11061 // Create a ConstantArray in Constant Pool
11062 auto *CA = ConstantDataArray::get(*DAG.getContext(), Table);
11063 SDValue CPIdx = DAG.getConstantPool(CA, getPointerTy(TD),
11064 TD.getPrefTypeAlign(CA->getType()));
11065 SDValue ExtLoad = DAG.getExtLoad(ISD::ZEXTLOAD, DL, VT, DAG.getEntryNode(),
11066 DAG.getMemBasePlusOffset(CPIdx, Lookup, DL),
11067 PtrInfo, MVT::i8);
11068 if (Node->getOpcode() == ISD::CTTZ_ZERO_POISON)
11069 return ExtLoad;
11070
11071 EVT SetCCVT =
11072 getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
11073 SDValue Zero = DAG.getConstant(0, DL, VT);
11074 SDValue SrcIsZero = DAG.getSetCC(DL, SetCCVT, Op, Zero, ISD::SETEQ);
11075 return DAG.getSelect(DL, VT, SrcIsZero,
11076 DAG.getConstant(BitWidth, DL, VT), ExtLoad);
11077}
11078
11080 SDLoc dl(Node);
11081 EVT VT = Node->getValueType(0);
11082 SDValue Op = Node->getOperand(0);
11083 unsigned NumBitsPerElt = VT.getScalarSizeInBits();
11084
11085 // If the non-ZERO_POISON version is supported we can use that instead.
11086 if (Node->getOpcode() == ISD::CTTZ_ZERO_POISON &&
11088 return DAG.getNode(ISD::CTTZ, dl, VT, Op);
11089
11090 // If the ZERO_POISON version is supported use that and handle the zero case.
11092 EVT SetCCVT =
11093 getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
11094 SDValue CTTZ = DAG.getNode(ISD::CTTZ_ZERO_POISON, dl, VT, Op);
11095 SDValue Zero = DAG.getConstant(0, dl, VT);
11096 SDValue SrcIsZero = DAG.getSetCC(dl, SetCCVT, Op, Zero, ISD::SETEQ);
11097 return DAG.getSelect(dl, VT, SrcIsZero,
11098 DAG.getConstant(NumBitsPerElt, dl, VT), CTTZ);
11099 }
11100
11101 // Only expand vector types if we have the appropriate vector bit operations.
11102 // This includes the operations needed to expand CTPOP if it isn't supported.
11103 if (VT.isVector() && (!isPowerOf2_32(NumBitsPerElt) ||
11106 !canExpandVectorCTPOP(*this, VT)) ||
11110 return SDValue();
11111
11112 // Emit Table Lookup if ISD::CTPOP used in the fallback path below is going
11113 // to be expanded or converted to a libcall.
11116 if (SDValue V = CTTZTableLookup(Node, DAG, dl, VT, Op, NumBitsPerElt))
11117 return V;
11118
11119 // for now, we use: { return popcount(~x & (x - 1)); }
11120 // unless the target has ctlz but not ctpop, in which case we use:
11121 // { return 32 - nlz(~x & (x-1)); }
11122 // Ref: "Hacker's Delight" by Henry Warren
11123 SDValue Tmp = DAG.getNode(
11124 ISD::AND, dl, VT, DAG.getNOT(dl, Op, VT),
11125 DAG.getNode(ISD::SUB, dl, VT, Op, DAG.getConstant(1, dl, VT)));
11126
11127 // If ISD::CTLZ is legal and CTPOP isn't, then do that instead.
11129 return DAG.getNode(ISD::SUB, dl, VT, DAG.getConstant(NumBitsPerElt, dl, VT),
11130 DAG.getNode(ISD::CTLZ, dl, VT, Tmp));
11131 }
11132
11133 return DAG.getNode(ISD::CTPOP, dl, VT, Tmp);
11134}
11135
11137 SDValue Op = Node->getOperand(0);
11138 SDValue Mask = Node->getOperand(1);
11139 SDValue VL = Node->getOperand(2);
11140 SDLoc dl(Node);
11141 EVT VT = Node->getValueType(0);
11142
11143 // Same as the vector part of expandCTTZ, use: popcount(~x & (x - 1))
11144 SDValue Not = DAG.getNode(ISD::VP_XOR, dl, VT, Op,
11145 DAG.getAllOnesConstant(dl, VT), Mask, VL);
11146 SDValue MinusOne = DAG.getNode(ISD::VP_SUB, dl, VT, Op,
11147 DAG.getConstant(1, dl, VT), Mask, VL);
11148 SDValue Tmp = DAG.getNode(ISD::VP_AND, dl, VT, Not, MinusOne, Mask, VL);
11149 return DAG.getNode(ISD::VP_CTPOP, dl, VT, Tmp, Mask, VL);
11150}
11151
11153 SelectionDAG &DAG) const {
11154 // %cond = to_bool_vec %source
11155 // %splat = splat /*val=*/VL
11156 // %tz = step_vector
11157 // %v = vp.select %cond, /*true=*/tz, /*false=*/%splat
11158 // %r = vp.reduce.umin %v
11159 SDLoc DL(N);
11160 SDValue Source = N->getOperand(0);
11161 SDValue Mask = N->getOperand(1);
11162 SDValue EVL = N->getOperand(2);
11163 EVT SrcVT = Source.getValueType();
11164 EVT ResVT = N->getValueType(0);
11165 EVT ResVecVT =
11166 EVT::getVectorVT(*DAG.getContext(), ResVT, SrcVT.getVectorElementCount());
11167
11168 // Convert to boolean vector.
11169 if (SrcVT.getScalarType() != MVT::i1) {
11170 SDValue AllZero = DAG.getConstant(0, DL, SrcVT);
11171 SrcVT = EVT::getVectorVT(*DAG.getContext(), MVT::i1,
11172 SrcVT.getVectorElementCount());
11173 Source = DAG.getNode(ISD::VP_SETCC, DL, SrcVT, Source, AllZero,
11174 DAG.getCondCode(ISD::SETNE), Mask, EVL);
11175 }
11176
11177 SDValue ExtEVL = DAG.getZExtOrTrunc(EVL, DL, ResVT);
11178 SDValue Splat = DAG.getSplat(ResVecVT, DL, ExtEVL);
11179 SDValue StepVec = DAG.getStepVector(DL, ResVecVT);
11180 SDValue Select =
11181 DAG.getNode(ISD::VP_SELECT, DL, ResVecVT, Source, StepVec, Splat, EVL);
11182 return DAG.getNode(ISD::VP_REDUCE_UMIN, DL, ResVT, ExtEVL, Select, Mask, EVL);
11183}
11184
11185/// Returns a type-legalized version of \p Mask as the first item in the
11186/// pair. The second item contains a type-legalized step vector that's
11187/// guaranteed to fit the number of elements in \p Mask.
11188/// If the stepvector would require splitting, returns an empty SDValue
11189/// as the second item to signal that the operation should be split instead.
11190static std::pair<SDValue, SDValue>
11192 SelectionDAG &DAG) {
11193 EVT MaskVT = Mask.getValueType();
11194 EVT BoolVT = MaskVT.getScalarType();
11195
11196 // Find a suitable type for a stepvector.
11197 // If zero is poison, we can assume the upper limit of the result is VF-1.
11198 ConstantRange VScaleRange(1, /*isFullSet=*/true); // Fixed length default.
11199 if (MaskVT.isScalableVector())
11200 VScaleRange = getVScaleRange(&DAG.getMachineFunction().getFunction(), 64);
11201 const TargetLowering &TLI = DAG.getTargetLoweringInfo();
11202 uint64_t EltWidth = TLI.getBitWidthForCttzElements(
11203 EVT(TLI.getVectorIdxTy(DAG.getDataLayout())),
11204 MaskVT.getVectorElementCount(), ZeroIsPoison, &VScaleRange);
11205 // If the step vector element type is smaller than the mask element type,
11206 // use the mask type directly to avoid widening issues.
11207 EltWidth = std::max(EltWidth, BoolVT.getFixedSizeInBits());
11208 EVT StepVT = MVT::getIntegerVT(EltWidth);
11209 EVT StepVecVT = MaskVT.changeVectorElementType(*DAG.getContext(), StepVT);
11210
11211 // If promotion or widening is required to make the type legal, do it here.
11212 // Promotion of integers within LegalizeVectorOps is looking for types of
11213 // the same size but with a smaller number of larger elements, not the usual
11214 // larger size with the same number of larger elements.
11216 TLI.getTypeAction(*DAG.getContext(), StepVecVT);
11217 SDValue StepVec;
11218 if (TypeAction == TargetLowering::TypePromoteInteger) {
11219 StepVecVT = TLI.getTypeToTransformTo(*DAG.getContext(), StepVecVT);
11220 StepVec = DAG.getStepVector(DL, StepVecVT);
11221 } else if (TypeAction == TargetLowering::TypeWidenVector) {
11222 // For widening, the element count changes. Create a step vector with only
11223 // the original elements valid and zeros for padding. Also widen the mask.
11224 EVT WideVecVT = TLI.getTypeToTransformTo(*DAG.getContext(), StepVecVT);
11225 unsigned WideNumElts = WideVecVT.getVectorNumElements();
11226
11227 // Build widened step vector: <0, 1, ..., OrigNumElts-1, poison, poison, ..>
11228 SDValue OrigStepVec = DAG.getStepVector(DL, StepVecVT);
11229 SDValue UndefStep = DAG.getPOISON(WideVecVT);
11230 StepVec = DAG.getInsertSubvector(DL, UndefStep, OrigStepVec, 0);
11231
11232 // Widen mask: pad with zeros.
11233 EVT WideMaskVT = EVT::getVectorVT(*DAG.getContext(), BoolVT, WideNumElts);
11234 SDValue ZeroMask = DAG.getConstant(0, DL, WideMaskVT);
11235 Mask = DAG.getInsertSubvector(DL, ZeroMask, Mask, 0);
11236 } else if (TypeAction == TargetLowering::TypeSplitVector) {
11237 // The stepvector type would require splitting. Signal to the caller
11238 // that the operation should be split instead of expanded.
11239 return {Mask, SDValue()};
11240 } else {
11241 StepVec = DAG.getStepVector(DL, StepVecVT);
11242 }
11243
11244 return {Mask, StepVec};
11245}
11246
11248 SelectionDAG &DAG) const {
11249 SDLoc DL(N);
11250 auto [Mask, StepVec] = getLegalMaskAndStepVector(
11251 N->getOperand(0), /*ZeroIsPoison=*/true, DL, DAG);
11252
11253 // If StepVec is empty, the stepvector would require splitting.
11254 // Split the operation instead and let it be recursively legalized.
11255 if (!StepVec) {
11256 EVT MaskVT = N->getOperand(0).getValueType();
11257 EVT ResVT = N->getValueType(0);
11258
11259 // Split the mask
11260 auto [LoVT, HiVT] = DAG.GetSplitDestVTs(MaskVT);
11261 auto [MaskLo, MaskHi] = DAG.SplitVector(N->getOperand(0), DL);
11262
11263 // Create split VECTOR_FIND_LAST_ACTIVE operations
11264 SDValue LoResult =
11265 DAG.getNode(ISD::VECTOR_FIND_LAST_ACTIVE, DL, ResVT, MaskLo);
11266 SDValue HiResult =
11267 DAG.getNode(ISD::VECTOR_FIND_LAST_ACTIVE, DL, ResVT, MaskHi);
11268
11269 // Check if any lane is active in the high mask.
11270 SDValue AnyHiActive = DAG.getNode(ISD::VECREDUCE_OR, DL, MVT::i1, MaskHi);
11272 AnyHiActive, DL,
11273 getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), MVT::i1),
11274 MVT::i1);
11275
11276 // Adjust HiResult by adding the number of elements in Lo
11277 SDValue LoNumElts =
11278 DAG.getElementCount(DL, ResVT, LoVT.getVectorElementCount());
11279 SDValue AdjustedHiResult =
11280 DAG.getNode(ISD::ADD, DL, ResVT, HiResult, LoNumElts);
11281
11282 // Return: AnyHiActive ? AdjustedHiResult : LoResult;
11283 return DAG.getNode(ISD::SELECT, DL, ResVT, Cond, AdjustedHiResult,
11284 LoResult);
11285 }
11286
11287 EVT StepVecVT = StepVec.getValueType();
11288 EVT StepVT = StepVec.getValueType().getVectorElementType();
11289
11290 // Zero out lanes with inactive elements, then find the highest remaining
11291 // value from the stepvector.
11292 SDValue Zeroes = DAG.getConstant(0, DL, StepVecVT);
11293 SDValue ActiveElts = DAG.getSelect(DL, StepVecVT, Mask, StepVec, Zeroes);
11294 SDValue HighestIdx = DAG.getNode(ISD::VECREDUCE_UMAX, DL, StepVT, ActiveElts);
11295 return DAG.getZExtOrTrunc(HighestIdx, DL, N->getValueType(0));
11296}
11297
11299 SelectionDAG &DAG) const {
11300 SDLoc DL(N);
11301 EVT VT = N->getValueType(0);
11302 SDValue SourceValue = N->getOperand(0);
11303 SDValue SinkValue = N->getOperand(1);
11304 SDValue EltSizeInBytes = N->getOperand(2);
11305
11306 // Note: The lane offset is scalable if the mask is scalable.
11307 ElementCount LaneOffsetEC =
11308 ElementCount::get(N->getConstantOperandVal(3), VT.isScalableVT());
11309
11310 EVT AddrVT = SourceValue->getValueType(0);
11311 bool IsReadAfterWrite = N->getOpcode() == ISD::LOOP_DEPENDENCE_RAW_MASK;
11312
11313 EVT CmpVT =
11314 getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), AddrVT);
11315
11316 // Unsigned compare: Source >= Sink.
11317 SDValue SourceAheadOfOrEqualToSink =
11318 DAG.getSetCC(DL, CmpVT, SourceValue, SinkValue, ISD::SETUGE);
11319
11320 // Take the difference between the pointers and divided by the element size,
11321 // to see how many lanes separate them.
11322 SDValue Diff = DAG.getNode(ISD::SUB, DL, AddrVT, SinkValue, SourceValue);
11323
11324 // RAW_MASK: Diff = Source >= Sink ? (Source - Sink) : (Sink - Source)
11325 if (IsReadAfterWrite)
11326 Diff = DAG.getSelect(DL, AddrVT, SourceAheadOfOrEqualToSink,
11327 DAG.getNegative(Diff, DL, AddrVT), Diff);
11328
11329 Diff = DAG.getNode(ISD::SDIV, DL, AddrVT, Diff, EltSizeInBytes);
11330
11331 // The pointers do not alias if:
11332 // - Source >= Sink (WAR_MASK)
11333 // - Source == Sink (RAW_MASK)
11334 SDValue NoAlias = SourceAheadOfOrEqualToSink;
11335 if (IsReadAfterWrite)
11336 NoAlias = DAG.getSetCC(DL, CmpVT, SourceValue, SinkValue, ISD::SETEQ);
11337
11338 // The pointers do not alias if:
11339 // Lane + LaneOffset < Diff (WAR/RAW_MASK)
11340 SDValue LaneOffset = DAG.getElementCount(DL, AddrVT, LaneOffsetEC);
11341 SDValue MaskN = DAG.getSelect(
11342 DL, AddrVT, NoAlias,
11344 AddrVT),
11345 Diff);
11346
11347 return DAG.getNode(ISD::GET_ACTIVE_LANE_MASK, DL, VT, LaneOffset, MaskN);
11348}
11349
11351 bool IsNegative) const {
11352 SDLoc dl(N);
11353 EVT VT = N->getValueType(0);
11354 SDValue Op = N->getOperand(0);
11355
11356 // If expanding ABS_MIN_POISON, fall back to ABS if the target supports it.
11357 if (N->getOpcode() == ISD::ABS_MIN_POISON &&
11359 SDValue AbsVal = DAG.getNode(ISD::ABS, dl, VT, Op);
11360 if (IsNegative)
11361 return DAG.getNegative(AbsVal, dl, VT);
11362 return AbsVal;
11363 }
11364
11365 // abs(x) -> smax(x,sub(0,x))
11366 if (!IsNegative && isOperationLegal(ISD::SUB, VT) &&
11368 SDValue Zero = DAG.getConstant(0, dl, VT);
11369 Op = DAG.getFreeze(Op);
11370 return DAG.getNode(ISD::SMAX, dl, VT, Op,
11371 DAG.getNode(ISD::SUB, dl, VT, Zero, Op));
11372 }
11373
11374 // abs(x) -> umin(x,sub(0,x))
11375 if (!IsNegative && isOperationLegal(ISD::SUB, VT) &&
11377 SDValue Zero = DAG.getConstant(0, dl, VT);
11378 Op = DAG.getFreeze(Op);
11379 return DAG.getNode(ISD::UMIN, dl, VT, Op,
11380 DAG.getNode(ISD::SUB, dl, VT, Zero, Op));
11381 }
11382
11383 // 0 - abs(x) -> smin(x, sub(0,x))
11384 if (IsNegative && isOperationLegal(ISD::SUB, VT) &&
11386 SDValue Zero = DAG.getConstant(0, dl, VT);
11387 Op = DAG.getFreeze(Op);
11388 return DAG.getNode(ISD::SMIN, dl, VT, Op,
11389 DAG.getNode(ISD::SUB, dl, VT, Zero, Op));
11390 }
11391
11392 // Only expand vector types if we have the appropriate vector operations.
11393 if (VT.isVector() &&
11395 (!IsNegative && !isOperationLegalOrCustom(ISD::ADD, VT)) ||
11396 (IsNegative && !isOperationLegalOrCustom(ISD::SUB, VT)) ||
11398 return SDValue();
11399
11400 Op = DAG.getFreeze(Op);
11401 SDValue Shift = DAG.getNode(
11402 ISD::SRA, dl, VT, Op,
11403 DAG.getShiftAmountConstant(VT.getScalarSizeInBits() - 1, VT, dl));
11404 SDValue Xor = DAG.getNode(ISD::XOR, dl, VT, Op, Shift);
11405
11406 // abs(x) -> Y = sra (X, size(X)-1); sub (xor (X, Y), Y)
11407 if (!IsNegative)
11408 return DAG.getNode(ISD::SUB, dl, VT, Xor, Shift);
11409
11410 // 0 - abs(x) -> Y = sra (X, size(X)-1); sub (Y, xor (X, Y))
11411 return DAG.getNode(ISD::SUB, dl, VT, Shift, Xor);
11412}
11413
11415 SDLoc dl(N);
11416 EVT VT = N->getValueType(0);
11417 SDValue LHS = N->getOperand(0);
11418 SDValue RHS = N->getOperand(1);
11419 bool IsSigned = N->getOpcode() == ISD::ABDS;
11420
11421 // abds(lhs, rhs) -> sub(smax(lhs,rhs), smin(lhs,rhs))
11422 // abdu(lhs, rhs) -> sub(umax(lhs,rhs), umin(lhs,rhs))
11423 unsigned MaxOpc = IsSigned ? ISD::SMAX : ISD::UMAX;
11424 unsigned MinOpc = IsSigned ? ISD::SMIN : ISD::UMIN;
11425 if (isOperationLegal(MaxOpc, VT) && isOperationLegal(MinOpc, VT)) {
11426 LHS = DAG.getFreeze(LHS);
11427 RHS = DAG.getFreeze(RHS);
11428 SDValue Max = DAG.getNode(MaxOpc, dl, VT, LHS, RHS);
11429 SDValue Min = DAG.getNode(MinOpc, dl, VT, LHS, RHS);
11430 return DAG.getNode(ISD::SUB, dl, VT, Max, Min);
11431 }
11432
11433 // abdu(lhs, rhs) -> or(usubsat(lhs,rhs), usubsat(rhs,lhs))
11434 if (!IsSigned && isOperationLegal(ISD::USUBSAT, VT)) {
11435 LHS = DAG.getFreeze(LHS);
11436 RHS = DAG.getFreeze(RHS);
11437 return DAG.getNode(ISD::OR, dl, VT,
11438 DAG.getNode(ISD::USUBSAT, dl, VT, LHS, RHS),
11439 DAG.getNode(ISD::USUBSAT, dl, VT, RHS, LHS));
11440 }
11441
11442 // If the subtract doesn't overflow then just use abs(sub())
11443 bool IsNonNegative = DAG.SignBitIsZero(LHS) && DAG.SignBitIsZero(RHS);
11444
11445 if (DAG.willNotOverflowSub(IsSigned || IsNonNegative, LHS, RHS))
11446 return DAG.getNode(ISD::ABS, dl, VT,
11447 DAG.getNode(ISD::SUB, dl, VT, LHS, RHS));
11448
11449 if (DAG.willNotOverflowSub(IsSigned || IsNonNegative, RHS, LHS))
11450 return DAG.getNode(ISD::ABS, dl, VT,
11451 DAG.getNode(ISD::SUB, dl, VT, RHS, LHS));
11452
11453 EVT CCVT = getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
11455 LHS = DAG.getFreeze(LHS);
11456 RHS = DAG.getFreeze(RHS);
11457 SDValue Cmp = DAG.getSetCC(dl, CCVT, LHS, RHS, CC);
11458
11459 // Branchless expansion iff cmp result is allbits:
11460 // abds(lhs, rhs) -> sub(sgt(lhs, rhs), xor(sgt(lhs, rhs), sub(lhs, rhs)))
11461 // abdu(lhs, rhs) -> sub(ugt(lhs, rhs), xor(ugt(lhs, rhs), sub(lhs, rhs)))
11462 if (CCVT == VT && getBooleanContents(VT) == ZeroOrNegativeOneBooleanContent) {
11463 SDValue Diff = DAG.getNode(ISD::SUB, dl, VT, LHS, RHS);
11464 SDValue Xor = DAG.getNode(ISD::XOR, dl, VT, Diff, Cmp);
11465 return DAG.getNode(ISD::SUB, dl, VT, Cmp, Xor);
11466 }
11467
11468 // Similar to the branchless expansion, if we don't prefer selects, use the
11469 // (sign-extended) usubo overflow flag if the (scalar) type is illegal as this
11470 // is more likely to legalize cleanly: abdu(lhs, rhs) -> sub(xor(sub(lhs,
11471 // rhs), uof(lhs, rhs)), uof(lhs, rhs))
11472 if (!IsSigned && VT.isScalarInteger() && !isTypeLegal(VT) &&
11474 SDValue USubO =
11475 DAG.getNode(ISD::USUBO, dl, DAG.getVTList(VT, MVT::i1), {LHS, RHS});
11476 SDValue Cmp = DAG.getNode(ISD::SIGN_EXTEND, dl, VT, USubO.getValue(1));
11477 SDValue Xor = DAG.getNode(ISD::XOR, dl, VT, USubO.getValue(0), Cmp);
11478 return DAG.getNode(ISD::SUB, dl, VT, Xor, Cmp);
11479 }
11480
11481 // FIXME: Should really try to split the vector in case it's legal on a
11482 // subvector.
11484 return DAG.UnrollVectorOp(N);
11485
11486 // abds(lhs, rhs) -> select(sgt(lhs,rhs), sub(lhs,rhs), sub(rhs,lhs))
11487 // abdu(lhs, rhs) -> select(ugt(lhs,rhs), sub(lhs,rhs), sub(rhs,lhs))
11488 return DAG.getSelect(dl, VT, Cmp, DAG.getNode(ISD::SUB, dl, VT, LHS, RHS),
11489 DAG.getNode(ISD::SUB, dl, VT, RHS, LHS));
11490}
11491
11493 SDLoc dl(N);
11494 EVT VT = N->getValueType(0);
11495 SDValue LHS = N->getOperand(0);
11496 SDValue RHS = N->getOperand(1);
11497
11498 unsigned Opc = N->getOpcode();
11499 bool IsFloor = Opc == ISD::AVGFLOORS || Opc == ISD::AVGFLOORU;
11500 bool IsSigned = Opc == ISD::AVGCEILS || Opc == ISD::AVGFLOORS;
11501 unsigned SumOpc = IsFloor ? ISD::ADD : ISD::SUB;
11502 unsigned SignOpc = IsFloor ? ISD::AND : ISD::OR;
11503 unsigned ShiftOpc = IsSigned ? ISD::SRA : ISD::SRL;
11504 unsigned ExtOpc = IsSigned ? ISD::SIGN_EXTEND : ISD::ZERO_EXTEND;
11506 Opc == ISD::AVGFLOORU || Opc == ISD::AVGCEILU) &&
11507 "Unknown AVG node");
11508
11509 // If the operands are already extended, we can add+shift.
11510 bool IsExt =
11511 (IsSigned && DAG.ComputeNumSignBits(LHS) >= 2 &&
11512 DAG.ComputeNumSignBits(RHS) >= 2) ||
11513 (!IsSigned && DAG.computeKnownBits(LHS).countMinLeadingZeros() >= 1 &&
11514 DAG.computeKnownBits(RHS).countMinLeadingZeros() >= 1);
11515 if (IsExt) {
11516 SDValue Sum = DAG.getNode(ISD::ADD, dl, VT, LHS, RHS);
11517 if (!IsFloor)
11518 Sum = DAG.getNode(ISD::ADD, dl, VT, Sum, DAG.getConstant(1, dl, VT));
11519 return DAG.getNode(ShiftOpc, dl, VT, Sum,
11520 DAG.getShiftAmountConstant(1, VT, dl));
11521 }
11522
11523 // For scalars, see if we can efficiently extend/truncate to use add+shift.
11524 if (VT.isScalarInteger()) {
11525 EVT ExtVT = VT.widenIntegerElementType(*DAG.getContext());
11526 if (isTypeLegal(ExtVT) && isTruncateFree(ExtVT, VT)) {
11527 LHS = DAG.getNode(ExtOpc, dl, ExtVT, LHS);
11528 RHS = DAG.getNode(ExtOpc, dl, ExtVT, RHS);
11529 SDValue Avg = DAG.getNode(ISD::ADD, dl, ExtVT, LHS, RHS);
11530 if (!IsFloor)
11531 Avg = DAG.getNode(ISD::ADD, dl, ExtVT, Avg,
11532 DAG.getConstant(1, dl, ExtVT));
11533 // Just use SRL as we will be truncating away the extended sign bits.
11534 Avg = DAG.getNode(ISD::SRL, dl, ExtVT, Avg,
11535 DAG.getShiftAmountConstant(1, ExtVT, dl));
11536 return DAG.getNode(ISD::TRUNCATE, dl, VT, Avg);
11537 }
11538 }
11539
11540 // avgflooru(lhs, rhs) -> or(lshr(add(lhs, rhs),1),shl(overflow, typesize-1))
11541 if (Opc == ISD::AVGFLOORU && VT.isScalarInteger() && !isTypeLegal(VT) &&
11544 SDValue UAddWithOverflow =
11545 DAG.getNode(ISD::UADDO, dl, DAG.getVTList(VT, MVT::i1), {RHS, LHS});
11546
11547 SDValue Sum = UAddWithOverflow.getValue(0);
11548 SDValue Overflow = UAddWithOverflow.getValue(1);
11549
11550 // Right shift the sum by 1
11551 SDValue LShrVal = DAG.getNode(ISD::SRL, dl, VT, Sum,
11552 DAG.getShiftAmountConstant(1, VT, dl));
11553
11554 SDValue ZeroExtOverflow = DAG.getNode(ISD::ANY_EXTEND, dl, VT, Overflow);
11555 SDValue OverflowShl = DAG.getNode(
11556 ISD::SHL, dl, VT, ZeroExtOverflow,
11557 DAG.getShiftAmountConstant(VT.getScalarSizeInBits() - 1, VT, dl));
11558
11559 return DAG.getNode(ISD::OR, dl, VT, LShrVal, OverflowShl);
11560 }
11561
11562 // avgceils(lhs, rhs) -> sub(or(lhs,rhs),ashr(xor(lhs,rhs),1))
11563 // avgceilu(lhs, rhs) -> sub(or(lhs,rhs),lshr(xor(lhs,rhs),1))
11564 // avgfloors(lhs, rhs) -> add(and(lhs,rhs),ashr(xor(lhs,rhs),1))
11565 // avgflooru(lhs, rhs) -> add(and(lhs,rhs),lshr(xor(lhs,rhs),1))
11566 LHS = DAG.getFreeze(LHS);
11567 RHS = DAG.getFreeze(RHS);
11568 SDValue Sign = DAG.getNode(SignOpc, dl, VT, LHS, RHS);
11569 SDValue Xor = DAG.getNode(ISD::XOR, dl, VT, LHS, RHS);
11570 SDValue Shift =
11571 DAG.getNode(ShiftOpc, dl, VT, Xor, DAG.getShiftAmountConstant(1, VT, dl));
11572 return DAG.getNode(SumOpc, dl, VT, Sign, Shift);
11573}
11574
11576 SDLoc dl(N);
11577 EVT VT = N->getValueType(0);
11578 SDValue Op = N->getOperand(0);
11579
11580 if (!VT.isSimple())
11581 return SDValue();
11582
11583 EVT SHVT = getShiftAmountTy(VT, DAG.getDataLayout());
11584 SDValue Tmp1, Tmp2, Tmp3, Tmp4, Tmp5, Tmp6, Tmp7, Tmp8;
11585 switch (VT.getSimpleVT().getScalarType().SimpleTy) {
11586 default:
11587 return SDValue();
11588 case MVT::i16:
11589 // Use a rotate by 8. This can be further expanded if necessary.
11590 return DAG.getNode(ISD::ROTL, dl, VT, Op, DAG.getConstant(8, dl, SHVT));
11591 case MVT::i32:
11592 // This is meant for ARM specifically, which has ROTR but no ROTL.
11593 // t = x ^ rotr(x, 16)
11594 // t = bic(t, 0x00ff0000)
11595 // t = lshr(t, 8)
11596 // x = t ^ rotr(x, 8)
11598 SDValue Rotr16 =
11599 DAG.getNode(ISD::ROTR, dl, VT, Op, DAG.getConstant(16, dl, SHVT));
11600 SDValue Tmp = DAG.getNode(ISD::XOR, dl, VT, Op, Rotr16);
11601 Tmp = DAG.getNode(ISD::AND, dl, VT, Tmp,
11602 DAG.getConstant(0xFF00FFFF, dl, VT));
11603 Tmp = DAG.getNode(ISD::SRL, dl, VT, Tmp, DAG.getConstant(8, dl, SHVT));
11604 SDValue Rotr8 =
11605 DAG.getNode(ISD::ROTR, dl, VT, Op, DAG.getConstant(8, dl, SHVT));
11606 return DAG.getNode(ISD::XOR, dl, VT, Tmp, Rotr8);
11607 }
11608 Tmp4 = DAG.getNode(ISD::SHL, dl, VT, Op, DAG.getConstant(24, dl, SHVT));
11609 Tmp3 = DAG.getNode(ISD::AND, dl, VT, Op,
11610 DAG.getConstant(0xFF00, dl, VT));
11611 Tmp3 = DAG.getNode(ISD::SHL, dl, VT, Tmp3, DAG.getConstant(8, dl, SHVT));
11612 Tmp2 = DAG.getNode(ISD::SRL, dl, VT, Op, DAG.getConstant(8, dl, SHVT));
11613 Tmp2 = DAG.getNode(ISD::AND, dl, VT, Tmp2, DAG.getConstant(0xFF00, dl, VT));
11614 Tmp1 = DAG.getNode(ISD::SRL, dl, VT, Op, DAG.getConstant(24, dl, SHVT));
11615 Tmp4 = DAG.getNode(ISD::OR, dl, VT, Tmp4, Tmp3);
11616 Tmp2 = DAG.getNode(ISD::OR, dl, VT, Tmp2, Tmp1);
11617 return DAG.getNode(ISD::OR, dl, VT, Tmp4, Tmp2);
11618 case MVT::i64:
11619 Tmp8 = DAG.getNode(ISD::SHL, dl, VT, Op, DAG.getConstant(56, dl, SHVT));
11620 Tmp7 = DAG.getNode(ISD::AND, dl, VT, Op,
11621 DAG.getConstant(255ULL<<8, dl, VT));
11622 Tmp7 = DAG.getNode(ISD::SHL, dl, VT, Tmp7, DAG.getConstant(40, dl, SHVT));
11623 Tmp6 = DAG.getNode(ISD::AND, dl, VT, Op,
11624 DAG.getConstant(255ULL<<16, dl, VT));
11625 Tmp6 = DAG.getNode(ISD::SHL, dl, VT, Tmp6, DAG.getConstant(24, dl, SHVT));
11626 Tmp5 = DAG.getNode(ISD::AND, dl, VT, Op,
11627 DAG.getConstant(255ULL<<24, dl, VT));
11628 Tmp5 = DAG.getNode(ISD::SHL, dl, VT, Tmp5, DAG.getConstant(8, dl, SHVT));
11629 Tmp4 = DAG.getNode(ISD::SRL, dl, VT, Op, DAG.getConstant(8, dl, SHVT));
11630 Tmp4 = DAG.getNode(ISD::AND, dl, VT, Tmp4,
11631 DAG.getConstant(255ULL<<24, dl, VT));
11632 Tmp3 = DAG.getNode(ISD::SRL, dl, VT, Op, DAG.getConstant(24, dl, SHVT));
11633 Tmp3 = DAG.getNode(ISD::AND, dl, VT, Tmp3,
11634 DAG.getConstant(255ULL<<16, dl, VT));
11635 Tmp2 = DAG.getNode(ISD::SRL, dl, VT, Op, DAG.getConstant(40, dl, SHVT));
11636 Tmp2 = DAG.getNode(ISD::AND, dl, VT, Tmp2,
11637 DAG.getConstant(255ULL<<8, dl, VT));
11638 Tmp1 = DAG.getNode(ISD::SRL, dl, VT, Op, DAG.getConstant(56, dl, SHVT));
11639 Tmp8 = DAG.getNode(ISD::OR, dl, VT, Tmp8, Tmp7);
11640 Tmp6 = DAG.getNode(ISD::OR, dl, VT, Tmp6, Tmp5);
11641 Tmp4 = DAG.getNode(ISD::OR, dl, VT, Tmp4, Tmp3);
11642 Tmp2 = DAG.getNode(ISD::OR, dl, VT, Tmp2, Tmp1);
11643 Tmp8 = DAG.getNode(ISD::OR, dl, VT, Tmp8, Tmp6);
11644 Tmp4 = DAG.getNode(ISD::OR, dl, VT, Tmp4, Tmp2);
11645 return DAG.getNode(ISD::OR, dl, VT, Tmp8, Tmp4);
11646 }
11647}
11648
11650 SDLoc dl(N);
11651 EVT VT = N->getValueType(0);
11652 SDValue Op = N->getOperand(0);
11653 SDValue Mask = N->getOperand(1);
11654 SDValue EVL = N->getOperand(2);
11655
11656 if (!VT.isSimple())
11657 return SDValue();
11658
11659 EVT SHVT = getShiftAmountTy(VT, DAG.getDataLayout());
11660 SDValue Tmp1, Tmp2, Tmp3, Tmp4, Tmp5, Tmp6, Tmp7, Tmp8;
11661 switch (VT.getSimpleVT().getScalarType().SimpleTy) {
11662 default:
11663 return SDValue();
11664 case MVT::i16:
11665 Tmp1 = DAG.getNode(ISD::VP_SHL, dl, VT, Op, DAG.getConstant(8, dl, SHVT),
11666 Mask, EVL);
11667 Tmp2 = DAG.getNode(ISD::VP_SRL, dl, VT, Op, DAG.getConstant(8, dl, SHVT),
11668 Mask, EVL);
11669 return DAG.getNode(ISD::VP_OR, dl, VT, Tmp1, Tmp2, Mask, EVL);
11670 case MVT::i32:
11671 Tmp4 = DAG.getNode(ISD::VP_SHL, dl, VT, Op, DAG.getConstant(24, dl, SHVT),
11672 Mask, EVL);
11673 Tmp3 = DAG.getNode(ISD::VP_AND, dl, VT, Op, DAG.getConstant(0xFF00, dl, VT),
11674 Mask, EVL);
11675 Tmp3 = DAG.getNode(ISD::VP_SHL, dl, VT, Tmp3, DAG.getConstant(8, dl, SHVT),
11676 Mask, EVL);
11677 Tmp2 = DAG.getNode(ISD::VP_SRL, dl, VT, Op, DAG.getConstant(8, dl, SHVT),
11678 Mask, EVL);
11679 Tmp2 = DAG.getNode(ISD::VP_AND, dl, VT, Tmp2,
11680 DAG.getConstant(0xFF00, dl, VT), Mask, EVL);
11681 Tmp1 = DAG.getNode(ISD::VP_SRL, dl, VT, Op, DAG.getConstant(24, dl, SHVT),
11682 Mask, EVL);
11683 Tmp4 = DAG.getNode(ISD::VP_OR, dl, VT, Tmp4, Tmp3, Mask, EVL);
11684 Tmp2 = DAG.getNode(ISD::VP_OR, dl, VT, Tmp2, Tmp1, Mask, EVL);
11685 return DAG.getNode(ISD::VP_OR, dl, VT, Tmp4, Tmp2, Mask, EVL);
11686 case MVT::i64:
11687 Tmp8 = DAG.getNode(ISD::VP_SHL, dl, VT, Op, DAG.getConstant(56, dl, SHVT),
11688 Mask, EVL);
11689 Tmp7 = DAG.getNode(ISD::VP_AND, dl, VT, Op,
11690 DAG.getConstant(255ULL << 8, dl, VT), Mask, EVL);
11691 Tmp7 = DAG.getNode(ISD::VP_SHL, dl, VT, Tmp7, DAG.getConstant(40, dl, SHVT),
11692 Mask, EVL);
11693 Tmp6 = DAG.getNode(ISD::VP_AND, dl, VT, Op,
11694 DAG.getConstant(255ULL << 16, dl, VT), Mask, EVL);
11695 Tmp6 = DAG.getNode(ISD::VP_SHL, dl, VT, Tmp6, DAG.getConstant(24, dl, SHVT),
11696 Mask, EVL);
11697 Tmp5 = DAG.getNode(ISD::VP_AND, dl, VT, Op,
11698 DAG.getConstant(255ULL << 24, dl, VT), Mask, EVL);
11699 Tmp5 = DAG.getNode(ISD::VP_SHL, dl, VT, Tmp5, DAG.getConstant(8, dl, SHVT),
11700 Mask, EVL);
11701 Tmp4 = DAG.getNode(ISD::VP_SRL, dl, VT, Op, DAG.getConstant(8, dl, SHVT),
11702 Mask, EVL);
11703 Tmp4 = DAG.getNode(ISD::VP_AND, dl, VT, Tmp4,
11704 DAG.getConstant(255ULL << 24, dl, VT), Mask, EVL);
11705 Tmp3 = DAG.getNode(ISD::VP_SRL, dl, VT, Op, DAG.getConstant(24, dl, SHVT),
11706 Mask, EVL);
11707 Tmp3 = DAG.getNode(ISD::VP_AND, dl, VT, Tmp3,
11708 DAG.getConstant(255ULL << 16, dl, VT), Mask, EVL);
11709 Tmp2 = DAG.getNode(ISD::VP_SRL, dl, VT, Op, DAG.getConstant(40, dl, SHVT),
11710 Mask, EVL);
11711 Tmp2 = DAG.getNode(ISD::VP_AND, dl, VT, Tmp2,
11712 DAG.getConstant(255ULL << 8, dl, VT), Mask, EVL);
11713 Tmp1 = DAG.getNode(ISD::VP_SRL, dl, VT, Op, DAG.getConstant(56, dl, SHVT),
11714 Mask, EVL);
11715 Tmp8 = DAG.getNode(ISD::VP_OR, dl, VT, Tmp8, Tmp7, Mask, EVL);
11716 Tmp6 = DAG.getNode(ISD::VP_OR, dl, VT, Tmp6, Tmp5, Mask, EVL);
11717 Tmp4 = DAG.getNode(ISD::VP_OR, dl, VT, Tmp4, Tmp3, Mask, EVL);
11718 Tmp2 = DAG.getNode(ISD::VP_OR, dl, VT, Tmp2, Tmp1, Mask, EVL);
11719 Tmp8 = DAG.getNode(ISD::VP_OR, dl, VT, Tmp8, Tmp6, Mask, EVL);
11720 Tmp4 = DAG.getNode(ISD::VP_OR, dl, VT, Tmp4, Tmp2, Mask, EVL);
11721 return DAG.getNode(ISD::VP_OR, dl, VT, Tmp8, Tmp4, Mask, EVL);
11722 }
11723}
11724
11726 SDLoc dl(N);
11727 EVT VT = N->getValueType(0);
11728 SDValue Op = N->getOperand(0);
11729 EVT SHVT = getShiftAmountTy(VT, DAG.getDataLayout());
11730 unsigned Sz = VT.getScalarSizeInBits();
11731
11732 SDValue Tmp, Tmp2, Tmp3;
11733
11734 // If we can, perform BSWAP first and then the mask+swap the i4, then i2
11735 // and finally the i1 pairs.
11736 // TODO: We can easily support i4/i2 legal types if any target ever does.
11737 if (Sz >= 8 && isPowerOf2_32(Sz)) {
11738 // Create the masks - repeating the pattern every byte.
11739 APInt Mask4 = APInt::getSplat(Sz, APInt(8, 0x0F));
11740 APInt Mask2 = APInt::getSplat(Sz, APInt(8, 0x33));
11741 APInt Mask1 = APInt::getSplat(Sz, APInt(8, 0x55));
11742
11743 // BSWAP if the type is wider than a single byte.
11744 Tmp = (Sz > 8 ? DAG.getNode(ISD::BSWAP, dl, VT, Op) : Op);
11745
11746 // swap i4: ((V >> 4) & 0x0F) | ((V & 0x0F) << 4)
11747 Tmp2 = DAG.getNode(ISD::SRL, dl, VT, Tmp, DAG.getConstant(4, dl, SHVT));
11748 Tmp2 = DAG.getNode(ISD::AND, dl, VT, Tmp2, DAG.getConstant(Mask4, dl, VT));
11749 Tmp3 = DAG.getNode(ISD::AND, dl, VT, Tmp, DAG.getConstant(Mask4, dl, VT));
11750 Tmp3 = DAG.getNode(ISD::SHL, dl, VT, Tmp3, DAG.getConstant(4, dl, SHVT));
11751 Tmp = DAG.getNode(ISD::OR, dl, VT, Tmp2, Tmp3);
11752
11753 // swap i2: ((V >> 2) & 0x33) | ((V & 0x33) << 2)
11754 Tmp2 = DAG.getNode(ISD::SRL, dl, VT, Tmp, DAG.getConstant(2, dl, SHVT));
11755 Tmp2 = DAG.getNode(ISD::AND, dl, VT, Tmp2, DAG.getConstant(Mask2, dl, VT));
11756 Tmp3 = DAG.getNode(ISD::AND, dl, VT, Tmp, DAG.getConstant(Mask2, dl, VT));
11757 Tmp3 = DAG.getNode(ISD::SHL, dl, VT, Tmp3, DAG.getConstant(2, dl, SHVT));
11758 Tmp = DAG.getNode(ISD::OR, dl, VT, Tmp2, Tmp3);
11759
11760 // swap i1: ((V >> 1) & 0x55) | ((V & 0x55) << 1)
11761 Tmp2 = DAG.getNode(ISD::SRL, dl, VT, Tmp, DAG.getConstant(1, dl, SHVT));
11762 Tmp2 = DAG.getNode(ISD::AND, dl, VT, Tmp2, DAG.getConstant(Mask1, dl, VT));
11763 Tmp3 = DAG.getNode(ISD::AND, dl, VT, Tmp, DAG.getConstant(Mask1, dl, VT));
11764 Tmp3 = DAG.getNode(ISD::SHL, dl, VT, Tmp3, DAG.getConstant(1, dl, SHVT));
11765 Tmp = DAG.getNode(ISD::OR, dl, VT, Tmp2, Tmp3);
11766 return Tmp;
11767 }
11768
11769 Tmp = DAG.getConstant(0, dl, VT);
11770 for (unsigned I = 0, J = Sz-1; I < Sz; ++I, --J) {
11771 if (I < J)
11772 Tmp2 =
11773 DAG.getNode(ISD::SHL, dl, VT, Op, DAG.getConstant(J - I, dl, SHVT));
11774 else
11775 Tmp2 =
11776 DAG.getNode(ISD::SRL, dl, VT, Op, DAG.getConstant(I - J, dl, SHVT));
11777
11778 APInt Shift = APInt::getOneBitSet(Sz, J);
11779 Tmp2 = DAG.getNode(ISD::AND, dl, VT, Tmp2, DAG.getConstant(Shift, dl, VT));
11780 Tmp = DAG.getNode(ISD::OR, dl, VT, Tmp, Tmp2);
11781 }
11782
11783 return Tmp;
11784}
11785
11787 assert(N->getOpcode() == ISD::VP_BITREVERSE);
11788
11789 SDLoc dl(N);
11790 EVT VT = N->getValueType(0);
11791 SDValue Op = N->getOperand(0);
11792 SDValue Mask = N->getOperand(1);
11793 SDValue EVL = N->getOperand(2);
11794 EVT SHVT = getShiftAmountTy(VT, DAG.getDataLayout());
11795 unsigned Sz = VT.getScalarSizeInBits();
11796
11797 SDValue Tmp, Tmp2, Tmp3;
11798
11799 // If we can, perform BSWAP first and then the mask+swap the i4, then i2
11800 // and finally the i1 pairs.
11801 // TODO: We can easily support i4/i2 legal types if any target ever does.
11802 if (Sz >= 8 && isPowerOf2_32(Sz)) {
11803 // Create the masks - repeating the pattern every byte.
11804 APInt Mask4 = APInt::getSplat(Sz, APInt(8, 0x0F));
11805 APInt Mask2 = APInt::getSplat(Sz, APInt(8, 0x33));
11806 APInt Mask1 = APInt::getSplat(Sz, APInt(8, 0x55));
11807
11808 // BSWAP if the type is wider than a single byte.
11809 Tmp = (Sz > 8 ? DAG.getNode(ISD::VP_BSWAP, dl, VT, Op, Mask, EVL) : Op);
11810
11811 // swap i4: ((V >> 4) & 0x0F) | ((V & 0x0F) << 4)
11812 Tmp2 = DAG.getNode(ISD::VP_SRL, dl, VT, Tmp, DAG.getConstant(4, dl, SHVT),
11813 Mask, EVL);
11814 Tmp2 = DAG.getNode(ISD::VP_AND, dl, VT, Tmp2,
11815 DAG.getConstant(Mask4, dl, VT), Mask, EVL);
11816 Tmp3 = DAG.getNode(ISD::VP_AND, dl, VT, Tmp, DAG.getConstant(Mask4, dl, VT),
11817 Mask, EVL);
11818 Tmp3 = DAG.getNode(ISD::VP_SHL, dl, VT, Tmp3, DAG.getConstant(4, dl, SHVT),
11819 Mask, EVL);
11820 Tmp = DAG.getNode(ISD::VP_OR, dl, VT, Tmp2, Tmp3, Mask, EVL);
11821
11822 // swap i2: ((V >> 2) & 0x33) | ((V & 0x33) << 2)
11823 Tmp2 = DAG.getNode(ISD::VP_SRL, dl, VT, Tmp, DAG.getConstant(2, dl, SHVT),
11824 Mask, EVL);
11825 Tmp2 = DAG.getNode(ISD::VP_AND, dl, VT, Tmp2,
11826 DAG.getConstant(Mask2, dl, VT), Mask, EVL);
11827 Tmp3 = DAG.getNode(ISD::VP_AND, dl, VT, Tmp, DAG.getConstant(Mask2, dl, VT),
11828 Mask, EVL);
11829 Tmp3 = DAG.getNode(ISD::VP_SHL, dl, VT, Tmp3, DAG.getConstant(2, dl, SHVT),
11830 Mask, EVL);
11831 Tmp = DAG.getNode(ISD::VP_OR, dl, VT, Tmp2, Tmp3, Mask, EVL);
11832
11833 // swap i1: ((V >> 1) & 0x55) | ((V & 0x55) << 1)
11834 Tmp2 = DAG.getNode(ISD::VP_SRL, dl, VT, Tmp, DAG.getConstant(1, dl, SHVT),
11835 Mask, EVL);
11836 Tmp2 = DAG.getNode(ISD::VP_AND, dl, VT, Tmp2,
11837 DAG.getConstant(Mask1, dl, VT), Mask, EVL);
11838 Tmp3 = DAG.getNode(ISD::VP_AND, dl, VT, Tmp, DAG.getConstant(Mask1, dl, VT),
11839 Mask, EVL);
11840 Tmp3 = DAG.getNode(ISD::VP_SHL, dl, VT, Tmp3, DAG.getConstant(1, dl, SHVT),
11841 Mask, EVL);
11842 Tmp = DAG.getNode(ISD::VP_OR, dl, VT, Tmp2, Tmp3, Mask, EVL);
11843 return Tmp;
11844 }
11845 return SDValue();
11846}
11847
11848std::pair<SDValue, SDValue>
11850 SelectionDAG &DAG) const {
11851 SDLoc SL(LD);
11852 SDValue Chain = LD->getChain();
11853 SDValue BasePTR = LD->getBasePtr();
11854 EVT SrcVT = LD->getMemoryVT();
11855 EVT DstVT = LD->getValueType(0);
11856 ISD::LoadExtType ExtType = LD->getExtensionType();
11857
11858 if (SrcVT.isScalableVector())
11859 report_fatal_error("Cannot scalarize scalable vector loads");
11860
11861 unsigned NumElem = SrcVT.getVectorNumElements();
11862
11863 EVT SrcEltVT = SrcVT.getScalarType();
11864 EVT DstEltVT = DstVT.getScalarType();
11865
11866 // A vector must always be stored in memory as-is, i.e. without any padding
11867 // between the elements, since various code depend on it, e.g. in the
11868 // handling of a bitcast of a vector type to int, which may be done with a
11869 // vector store followed by an integer load. A vector that does not have
11870 // elements that are byte-sized must therefore be stored as an integer
11871 // built out of the extracted vector elements.
11872 if (!SrcEltVT.isByteSized()) {
11873 unsigned NumLoadBits = SrcVT.getStoreSizeInBits();
11874 EVT LoadVT = EVT::getIntegerVT(*DAG.getContext(), NumLoadBits);
11875
11876 unsigned NumSrcBits = SrcVT.getSizeInBits();
11877 EVT SrcIntVT = EVT::getIntegerVT(*DAG.getContext(), NumSrcBits);
11878
11879 unsigned SrcEltBits = SrcEltVT.getSizeInBits();
11880 SDValue SrcEltBitMask = DAG.getConstant(
11881 APInt::getLowBitsSet(NumLoadBits, SrcEltBits), SL, LoadVT);
11882
11883 // Load the whole vector and avoid masking off the top bits as it makes
11884 // the codegen worse.
11885 SDValue Load =
11886 DAG.getExtLoad(ISD::EXTLOAD, SL, LoadVT, Chain, BasePTR,
11887 LD->getPointerInfo(), SrcIntVT, LD->getBaseAlign(),
11888 LD->getMemOperand()->getFlags(), LD->getAAInfo());
11889
11891 for (unsigned Idx = 0; Idx < NumElem; ++Idx) {
11892 unsigned ShiftIntoIdx =
11893 (DAG.getDataLayout().isBigEndian() ? (NumElem - 1) - Idx : Idx);
11894 SDValue ShiftAmount = DAG.getShiftAmountConstant(
11895 ShiftIntoIdx * SrcEltVT.getSizeInBits(), LoadVT, SL);
11896 SDValue ShiftedElt = DAG.getNode(ISD::SRL, SL, LoadVT, Load, ShiftAmount);
11897 SDValue Elt =
11898 DAG.getNode(ISD::AND, SL, LoadVT, ShiftedElt, SrcEltBitMask);
11899 SDValue Scalar = DAG.getNode(ISD::TRUNCATE, SL, SrcEltVT, Elt);
11900
11901 if (ExtType != ISD::NON_EXTLOAD) {
11902 unsigned ExtendOp = ISD::getExtForLoadExtType(false, ExtType);
11903 Scalar = DAG.getNode(ExtendOp, SL, DstEltVT, Scalar);
11904 }
11905
11906 Vals.push_back(Scalar);
11907 }
11908
11909 SDValue Value = DAG.getBuildVector(DstVT, SL, Vals);
11910 return std::make_pair(Value, Load.getValue(1));
11911 }
11912
11913 unsigned Stride = SrcEltVT.getSizeInBits() / 8;
11914 assert(SrcEltVT.isByteSized());
11915
11917 SmallVector<SDValue, 8> LoadChains;
11918
11919 for (unsigned Idx = 0; Idx < NumElem; ++Idx) {
11920 SDValue ScalarLoad = DAG.getExtLoad(
11921 ExtType, SL, DstEltVT, Chain, BasePTR,
11922 LD->getPointerInfo().getWithOffset(Idx * Stride), SrcEltVT,
11923 LD->getBaseAlign(), LD->getMemOperand()->getFlags(), LD->getAAInfo());
11924
11925 BasePTR = DAG.getObjectPtrOffset(SL, BasePTR, TypeSize::getFixed(Stride));
11926
11927 Vals.push_back(ScalarLoad.getValue(0));
11928 LoadChains.push_back(ScalarLoad.getValue(1));
11929 }
11930
11931 SDValue NewChain = DAG.getNode(ISD::TokenFactor, SL, MVT::Other, LoadChains);
11932 SDValue Value = DAG.getBuildVector(DstVT, SL, Vals);
11933
11934 return std::make_pair(Value, NewChain);
11935}
11936
11938 SelectionDAG &DAG) const {
11939 SDLoc SL(ST);
11940
11941 SDValue Chain = ST->getChain();
11942 SDValue BasePtr = ST->getBasePtr();
11943 SDValue Value = ST->getValue();
11944 EVT StVT = ST->getMemoryVT();
11945
11946 if (StVT.isScalableVector())
11947 report_fatal_error("Cannot scalarize scalable vector stores");
11948
11949 // The type of the data we want to save
11950 EVT RegVT = Value.getValueType();
11951 EVT RegSclVT = RegVT.getScalarType();
11952
11953 // The type of data as saved in memory.
11954 EVT MemSclVT = StVT.getScalarType();
11955
11956 unsigned NumElem = StVT.getVectorNumElements();
11957
11958 // A vector must always be stored in memory as-is, i.e. without any padding
11959 // between the elements, since various code depend on it, e.g. in the
11960 // handling of a bitcast of a vector type to int, which may be done with a
11961 // vector store followed by an integer load. A vector that does not have
11962 // elements that are byte-sized must therefore be stored as an integer
11963 // built out of the extracted vector elements.
11964 if (!MemSclVT.isByteSized()) {
11965 unsigned NumBits = StVT.getSizeInBits();
11966 EVT IntVT = EVT::getIntegerVT(*DAG.getContext(), NumBits);
11967
11968 SDValue CurrVal = DAG.getConstant(0, SL, IntVT);
11969
11970 for (unsigned Idx = 0; Idx < NumElem; ++Idx) {
11971 SDValue Elt = DAG.getExtractVectorElt(SL, RegSclVT, Value, Idx);
11972 SDValue Trunc = DAG.getNode(ISD::TRUNCATE, SL, MemSclVT, Elt);
11973 SDValue ExtElt = DAG.getNode(ISD::ZERO_EXTEND, SL, IntVT, Trunc);
11974 unsigned ShiftIntoIdx =
11975 (DAG.getDataLayout().isBigEndian() ? (NumElem - 1) - Idx : Idx);
11976 SDValue ShiftAmount =
11977 DAG.getConstant(ShiftIntoIdx * MemSclVT.getSizeInBits(), SL, IntVT);
11978 SDValue ShiftedElt =
11979 DAG.getNode(ISD::SHL, SL, IntVT, ExtElt, ShiftAmount);
11980 CurrVal = DAG.getNode(ISD::OR, SL, IntVT, CurrVal, ShiftedElt);
11981 }
11982
11983 return DAG.getStore(Chain, SL, CurrVal, BasePtr, ST->getPointerInfo(),
11984 ST->getBaseAlign(), ST->getMemOperand()->getFlags(),
11985 ST->getAAInfo());
11986 }
11987
11988 // Store Stride in bytes
11989 unsigned Stride = MemSclVT.getSizeInBits() / 8;
11990 assert(Stride && "Zero stride!");
11991 // Extract each of the elements from the original vector and save them into
11992 // memory individually.
11994 for (unsigned Idx = 0; Idx < NumElem; ++Idx) {
11995 SDValue Elt = DAG.getExtractVectorElt(SL, RegSclVT, Value, Idx);
11996
11997 SDValue Ptr =
11998 DAG.getObjectPtrOffset(SL, BasePtr, TypeSize::getFixed(Idx * Stride));
11999
12000 // This scalar TruncStore may be illegal, but we legalize it later.
12002 Chain, SL, Elt, Ptr, ST->getPointerInfo().getWithOffset(Idx * Stride),
12003 MemSclVT, ST->getBaseAlign(), ST->getMemOperand()->getFlags(),
12004 ST->getAAInfo());
12005
12006 Stores.push_back(Store);
12007 }
12008
12009 return DAG.getNode(ISD::TokenFactor, SL, MVT::Other, Stores);
12010}
12011
12012std::pair<SDValue, SDValue>
12014 assert(LD->getAddressingMode() == ISD::UNINDEXED &&
12015 "unaligned indexed loads not implemented!");
12016 SDValue Chain = LD->getChain();
12017 SDValue Ptr = LD->getBasePtr();
12018 EVT VT = LD->getValueType(0);
12019 EVT LoadedVT = LD->getMemoryVT();
12020 SDLoc dl(LD);
12021 auto &MF = DAG.getMachineFunction();
12022
12023 if (VT.isFloatingPoint() || VT.isVector()) {
12024 EVT intVT = EVT::getIntegerVT(*DAG.getContext(), LoadedVT.getSizeInBits());
12025 if (isTypeLegal(intVT) && isTypeLegal(LoadedVT)) {
12026 if (!isOperationLegalOrCustom(ISD::LOAD, intVT) &&
12027 LoadedVT.isVector()) {
12028 // Scalarize the load and let the individual components be handled.
12029 return scalarizeVectorLoad(LD, DAG);
12030 }
12031
12032 // Expand to a (misaligned) integer load of the same size,
12033 // then bitconvert to floating point or vector.
12034 SDValue newLoad = DAG.getLoad(intVT, dl, Chain, Ptr,
12035 LD->getMemOperand());
12036 SDValue Result = DAG.getNode(ISD::BITCAST, dl, LoadedVT, newLoad);
12037 if (LoadedVT != VT)
12038 Result = DAG.getNode(VT.isFloatingPoint() ? ISD::FP_EXTEND :
12039 ISD::ANY_EXTEND, dl, VT, Result);
12040
12041 return std::make_pair(Result, newLoad.getValue(1));
12042 }
12043
12044 // Copy the value to a (aligned) stack slot using (unaligned) integer
12045 // loads and stores, then do a (aligned) load from the stack slot.
12046 MVT RegVT = getRegisterType(*DAG.getContext(), intVT);
12047 unsigned LoadedBytes = LoadedVT.getStoreSize();
12048 unsigned RegBytes = RegVT.getSizeInBits() / 8;
12049 unsigned NumRegs = (LoadedBytes + RegBytes - 1) / RegBytes;
12050
12051 // Make sure the stack slot is also aligned for the register type.
12052 SDValue StackBase = DAG.CreateStackTemporary(LoadedVT, RegVT);
12053 auto FrameIndex = cast<FrameIndexSDNode>(StackBase.getNode())->getIndex();
12055 SDValue StackPtr = StackBase;
12056 unsigned Offset = 0;
12057
12058 EVT PtrVT = Ptr.getValueType();
12059 EVT StackPtrVT = StackPtr.getValueType();
12060
12061 SDValue PtrIncrement = DAG.getConstant(RegBytes, dl, PtrVT);
12062 SDValue StackPtrIncrement = DAG.getConstant(RegBytes, dl, StackPtrVT);
12063
12064 // Do all but one copies using the full register width.
12065 for (unsigned i = 1; i < NumRegs; i++) {
12066 // Load one integer register's worth from the original location.
12067 SDValue Load = DAG.getLoad(
12068 RegVT, dl, Chain, Ptr, LD->getPointerInfo().getWithOffset(Offset),
12069 LD->getBaseAlign(), LD->getMemOperand()->getFlags(), LD->getAAInfo());
12070 // Follow the load with a store to the stack slot. Remember the store.
12071 Stores.push_back(DAG.getStore(
12072 Load.getValue(1), dl, Load, StackPtr,
12073 MachinePointerInfo::getFixedStack(MF, FrameIndex, Offset)));
12074 // Increment the pointers.
12075 Offset += RegBytes;
12076
12077 Ptr = DAG.getObjectPtrOffset(dl, Ptr, PtrIncrement);
12078 StackPtr = DAG.getObjectPtrOffset(dl, StackPtr, StackPtrIncrement);
12079 }
12080
12081 // The last copy may be partial. Do an extending load.
12082 EVT MemVT = EVT::getIntegerVT(*DAG.getContext(),
12083 8 * (LoadedBytes - Offset));
12084 SDValue Load = DAG.getExtLoad(
12085 ISD::EXTLOAD, dl, RegVT, Chain, Ptr,
12086 LD->getPointerInfo().getWithOffset(Offset), MemVT, LD->getBaseAlign(),
12087 LD->getMemOperand()->getFlags(), LD->getAAInfo());
12088 // Follow the load with a store to the stack slot. Remember the store.
12089 // On big-endian machines this requires a truncating store to ensure
12090 // that the bits end up in the right place.
12091 Stores.push_back(DAG.getTruncStore(
12092 Load.getValue(1), dl, Load, StackPtr,
12093 MachinePointerInfo::getFixedStack(MF, FrameIndex, Offset), MemVT));
12094
12095 // The order of the stores doesn't matter - say it with a TokenFactor.
12096 SDValue TF = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Stores);
12097
12098 // Finally, perform the original load only redirected to the stack slot.
12099 Load = DAG.getExtLoad(LD->getExtensionType(), dl, VT, TF, StackBase,
12100 MachinePointerInfo::getFixedStack(MF, FrameIndex, 0),
12101 LoadedVT);
12102
12103 // Callers expect a MERGE_VALUES node.
12104 return std::make_pair(Load, TF);
12105 }
12106
12107 assert(LoadedVT.isInteger() && !LoadedVT.isVector() &&
12108 "Unaligned load of unsupported type.");
12109
12110 // Compute the new VT that is half the size of the old one. This is an
12111 // integer MVT.
12112 unsigned NumBits = LoadedVT.getSizeInBits();
12113 EVT NewLoadedVT;
12114 NewLoadedVT = EVT::getIntegerVT(*DAG.getContext(), NumBits/2);
12115 NumBits >>= 1;
12116
12117 Align Alignment = LD->getBaseAlign();
12118 unsigned IncrementSize = NumBits / 8;
12119 ISD::LoadExtType HiExtType = LD->getExtensionType();
12120
12121 // If the original load is NON_EXTLOAD, the hi part load must be ZEXTLOAD.
12122 if (HiExtType == ISD::NON_EXTLOAD)
12123 HiExtType = ISD::ZEXTLOAD;
12124
12125 // Load the value in two parts
12126 SDValue Lo, Hi;
12127 if (DAG.getDataLayout().isLittleEndian()) {
12128 Lo = DAG.getExtLoad(ISD::ZEXTLOAD, dl, VT, Chain, Ptr, LD->getPointerInfo(),
12129 NewLoadedVT, Alignment, LD->getMemOperand()->getFlags(),
12130 LD->getAAInfo());
12131
12132 Ptr = DAG.getObjectPtrOffset(dl, Ptr, TypeSize::getFixed(IncrementSize));
12133 Hi = DAG.getExtLoad(HiExtType, dl, VT, Chain, Ptr,
12134 LD->getPointerInfo().getWithOffset(IncrementSize),
12135 NewLoadedVT, Alignment, LD->getMemOperand()->getFlags(),
12136 LD->getAAInfo());
12137 } else {
12138 Hi = DAG.getExtLoad(HiExtType, dl, VT, Chain, Ptr, LD->getPointerInfo(),
12139 NewLoadedVT, Alignment, LD->getMemOperand()->getFlags(),
12140 LD->getAAInfo());
12141
12142 Ptr = DAG.getObjectPtrOffset(dl, Ptr, TypeSize::getFixed(IncrementSize));
12143 Lo = DAG.getExtLoad(ISD::ZEXTLOAD, dl, VT, Chain, Ptr,
12144 LD->getPointerInfo().getWithOffset(IncrementSize),
12145 NewLoadedVT, Alignment, LD->getMemOperand()->getFlags(),
12146 LD->getAAInfo());
12147 }
12148
12149 // aggregate the two parts
12150 SDValue ShiftAmount = DAG.getShiftAmountConstant(NumBits, VT, dl);
12151 SDValue Result = DAG.getNode(ISD::SHL, dl, VT, Hi, ShiftAmount);
12152 Result = DAG.getNode(ISD::OR, dl, VT, Result, Lo);
12153
12154 SDValue TF = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Lo.getValue(1),
12155 Hi.getValue(1));
12156
12157 return std::make_pair(Result, TF);
12158}
12159
12161 SelectionDAG &DAG) const {
12162 assert(ST->getAddressingMode() == ISD::UNINDEXED &&
12163 "unaligned indexed stores not implemented!");
12164 SDValue Chain = ST->getChain();
12165 SDValue Ptr = ST->getBasePtr();
12166 SDValue Val = ST->getValue();
12167 EVT VT = Val.getValueType();
12168 Align Alignment = ST->getBaseAlign();
12169 auto &MF = DAG.getMachineFunction();
12170 EVT StoreMemVT = ST->getMemoryVT();
12171
12172 SDLoc dl(ST);
12173 if (StoreMemVT.isFloatingPoint() || StoreMemVT.isVector()) {
12174 EVT intVT = EVT::getIntegerVT(*DAG.getContext(), VT.getSizeInBits());
12175 if (isTypeLegal(intVT)) {
12176 if (!isOperationLegalOrCustom(ISD::STORE, intVT) &&
12177 StoreMemVT.isVector()) {
12178 // Scalarize the store and let the individual components be handled.
12179 SDValue Result = scalarizeVectorStore(ST, DAG);
12180 return Result;
12181 }
12182 // Expand to a bitconvert of the value to the integer type of the
12183 // same size, then a (misaligned) int store.
12184 // FIXME: Does not handle truncating floating point stores!
12185 SDValue Result = DAG.getNode(ISD::BITCAST, dl, intVT, Val);
12186 Result = DAG.getStore(Chain, dl, Result, Ptr, ST->getPointerInfo(),
12187 Alignment, ST->getMemOperand()->getFlags());
12188 return Result;
12189 }
12190 // Do a (aligned) store to a stack slot, then copy from the stack slot
12191 // to the final destination using (unaligned) integer loads and stores.
12192 MVT RegVT = getRegisterType(
12193 *DAG.getContext(),
12194 EVT::getIntegerVT(*DAG.getContext(), StoreMemVT.getSizeInBits()));
12195 EVT PtrVT = Ptr.getValueType();
12196 unsigned StoredBytes = StoreMemVT.getStoreSize();
12197 unsigned RegBytes = RegVT.getSizeInBits() / 8;
12198 unsigned NumRegs = (StoredBytes + RegBytes - 1) / RegBytes;
12199
12200 // Make sure the stack slot is also aligned for the register type.
12201 SDValue StackPtr = DAG.CreateStackTemporary(StoreMemVT, RegVT);
12202 auto FrameIndex = cast<FrameIndexSDNode>(StackPtr.getNode())->getIndex();
12203
12204 // Perform the original store, only redirected to the stack slot.
12206 Chain, dl, Val, StackPtr,
12207 MachinePointerInfo::getFixedStack(MF, FrameIndex, 0), StoreMemVT);
12208
12209 EVT StackPtrVT = StackPtr.getValueType();
12210
12211 SDValue PtrIncrement = DAG.getConstant(RegBytes, dl, PtrVT);
12212 SDValue StackPtrIncrement = DAG.getConstant(RegBytes, dl, StackPtrVT);
12214 unsigned Offset = 0;
12215
12216 // Do all but one copies using the full register width.
12217 for (unsigned i = 1; i < NumRegs; i++) {
12218 // Load one integer register's worth from the stack slot.
12219 SDValue Load = DAG.getLoad(
12220 RegVT, dl, Store, StackPtr,
12221 MachinePointerInfo::getFixedStack(MF, FrameIndex, Offset));
12222 // Store it to the final location. Remember the store.
12223 Stores.push_back(DAG.getStore(Load.getValue(1), dl, Load, Ptr,
12224 ST->getPointerInfo().getWithOffset(Offset),
12225 ST->getBaseAlign(),
12226 ST->getMemOperand()->getFlags()));
12227 // Increment the pointers.
12228 Offset += RegBytes;
12229 StackPtr = DAG.getObjectPtrOffset(dl, StackPtr, StackPtrIncrement);
12230 Ptr = DAG.getObjectPtrOffset(dl, Ptr, PtrIncrement);
12231 }
12232
12233 // The last store may be partial. Do a truncating store. On big-endian
12234 // machines this requires an extending load from the stack slot to ensure
12235 // that the bits are in the right place.
12236 EVT LoadMemVT =
12237 EVT::getIntegerVT(*DAG.getContext(), 8 * (StoredBytes - Offset));
12238
12239 // Load from the stack slot.
12240 SDValue Load = DAG.getExtLoad(
12241 ISD::EXTLOAD, dl, RegVT, Store, StackPtr,
12242 MachinePointerInfo::getFixedStack(MF, FrameIndex, Offset), LoadMemVT);
12243
12244 Stores.push_back(DAG.getTruncStore(
12245 Load.getValue(1), dl, Load, Ptr,
12246 ST->getPointerInfo().getWithOffset(Offset), LoadMemVT,
12247 ST->getBaseAlign(), ST->getMemOperand()->getFlags(), ST->getAAInfo()));
12248 // The order of the stores doesn't matter - say it with a TokenFactor.
12249 SDValue Result = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Stores);
12250 return Result;
12251 }
12252
12253 assert(StoreMemVT.isInteger() && !StoreMemVT.isVector() &&
12254 "Unaligned store of unknown type.");
12255 // Get the half-size VT
12256 EVT NewStoredVT = StoreMemVT.getHalfSizedIntegerVT(*DAG.getContext());
12257 unsigned NumBits = NewStoredVT.getFixedSizeInBits();
12258 unsigned IncrementSize = NumBits / 8;
12259
12260 // Divide the stored value in two parts.
12261 SDValue ShiftAmount =
12262 DAG.getShiftAmountConstant(NumBits, Val.getValueType(), dl);
12263 SDValue Lo = Val;
12264 // If Val is a constant, replace the upper bits with 0. The SRL will constant
12265 // fold and not use the upper bits. A smaller constant may be easier to
12266 // materialize.
12267 if (auto *C = dyn_cast<ConstantSDNode>(Lo); C && !C->isOpaque())
12268 Lo = DAG.getNode(
12269 ISD::AND, dl, VT, Lo,
12270 DAG.getConstant(APInt::getLowBitsSet(VT.getSizeInBits(), NumBits), dl,
12271 VT));
12272 SDValue Hi = DAG.getNode(ISD::SRL, dl, VT, Val, ShiftAmount);
12273
12274 // Store the two parts
12275 SDValue Store1, Store2;
12276 Store1 = DAG.getTruncStore(Chain, dl,
12277 DAG.getDataLayout().isLittleEndian() ? Lo : Hi,
12278 Ptr, ST->getPointerInfo(), NewStoredVT, Alignment,
12279 ST->getMemOperand()->getFlags());
12280
12281 Ptr = DAG.getObjectPtrOffset(dl, Ptr, TypeSize::getFixed(IncrementSize));
12282 Store2 = DAG.getTruncStore(
12283 Chain, dl, DAG.getDataLayout().isLittleEndian() ? Hi : Lo, Ptr,
12284 ST->getPointerInfo().getWithOffset(IncrementSize), NewStoredVT, Alignment,
12285 ST->getMemOperand()->getFlags(), ST->getAAInfo());
12286
12287 SDValue Result =
12288 DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Store1, Store2);
12289 return Result;
12290}
12291
12292SDValue
12294 const SDLoc &DL, EVT DataVT,
12295 SelectionDAG &DAG,
12296 bool IsCompressedMemory) const {
12298 EVT AddrVT = Addr.getValueType();
12299 EVT MaskVT = Mask.getValueType();
12300 assert(DataVT.getVectorElementCount() == MaskVT.getVectorElementCount() &&
12301 "Incompatible types of Data and Mask");
12302 if (IsCompressedMemory) {
12303 // Incrementing the pointer according to number of '1's in the mask.
12304 if (DataVT.isScalableVector()) {
12305 EVT MaskExtVT = MaskVT.changeElementType(*DAG.getContext(), MVT::i32);
12306 SDValue MaskExt = DAG.getNode(ISD::ZERO_EXTEND, DL, MaskExtVT, Mask);
12307 Increment = DAG.getNode(ISD::VECREDUCE_ADD, DL, MVT::i32, MaskExt);
12308 } else {
12309 EVT MaskIntVT =
12310 EVT::getIntegerVT(*DAG.getContext(), MaskVT.getSizeInBits());
12311 SDValue MaskInIntReg = DAG.getBitcast(MaskIntVT, Mask);
12312 if (MaskIntVT.getSizeInBits() < 32) {
12313 MaskInIntReg =
12314 DAG.getNode(ISD::ZERO_EXTEND, DL, MVT::i32, MaskInIntReg);
12315 MaskIntVT = MVT::i32;
12316 }
12317 Increment = DAG.getNode(ISD::CTPOP, DL, MaskIntVT, MaskInIntReg);
12318 }
12319 // Scale is an element size in bytes.
12320 SDValue Scale = DAG.getConstant(DataVT.getScalarSizeInBits() / 8, DL,
12321 AddrVT);
12322 Increment = DAG.getZExtOrTrunc(Increment, DL, AddrVT);
12323 Increment = DAG.getNode(ISD::MUL, DL, AddrVT, Increment, Scale);
12324 } else
12325 Increment = DAG.getTypeSize(DL, AddrVT, DataVT.getStoreSize());
12326
12327 return DAG.getNode(ISD::ADD, DL, AddrVT, Addr, Increment);
12328}
12329
12331 EVT VecVT, const SDLoc &dl,
12332 ElementCount SubEC) {
12333 assert(!(SubEC.isScalable() && VecVT.isFixedLengthVector()) &&
12334 "Cannot index a scalable vector within a fixed-width vector");
12335
12336 unsigned NElts = VecVT.getVectorMinNumElements();
12337 unsigned NumSubElts = SubEC.getKnownMinValue();
12338 EVT IdxVT = Idx.getValueType();
12339
12340 if (VecVT.isScalableVector() && !SubEC.isScalable()) {
12341 // If this is a constant index and we know the value plus the number of the
12342 // elements in the subvector minus one is less than the minimum number of
12343 // elements then it's safe to return Idx.
12344 if (auto *IdxCst = dyn_cast<ConstantSDNode>(Idx))
12345 if (IdxCst->getZExtValue() + (NumSubElts - 1) < NElts)
12346 return Idx;
12347 SDValue VS =
12348 DAG.getVScale(dl, IdxVT, APInt(IdxVT.getFixedSizeInBits(), NElts));
12349 unsigned SubOpcode = NumSubElts <= NElts ? ISD::SUB : ISD::USUBSAT;
12350 SDValue Sub = DAG.getNode(SubOpcode, dl, IdxVT, VS,
12351 DAG.getConstant(NumSubElts, dl, IdxVT));
12352 return DAG.getNode(ISD::UMIN, dl, IdxVT, Idx, Sub);
12353 }
12354 if (isPowerOf2_32(NElts) && NumSubElts == 1) {
12355 APInt Imm = APInt::getLowBitsSet(IdxVT.getSizeInBits(), Log2_32(NElts));
12356 return DAG.getNode(ISD::AND, dl, IdxVT, Idx,
12357 DAG.getConstant(Imm, dl, IdxVT));
12358 }
12359 unsigned MaxIndex = NumSubElts < NElts ? NElts - NumSubElts : 0;
12360 return DAG.getNode(ISD::UMIN, dl, IdxVT, Idx,
12361 DAG.getConstant(MaxIndex, dl, IdxVT));
12362}
12363
12364SDValue
12366 EVT VecVT, SDValue Index,
12367 const SDNodeFlags PtrArithFlags) const {
12369 DAG, VecPtr, VecVT,
12371 Index, PtrArithFlags);
12372}
12373
12374SDValue
12376 EVT VecVT, EVT SubVecVT, SDValue Index,
12377 const SDNodeFlags PtrArithFlags) const {
12378 SDLoc dl(Index);
12379 // Make sure the index type is big enough to compute in.
12380 Index = DAG.getZExtOrTrunc(Index, dl, VecPtr.getValueType());
12381
12382 EVT EltVT = VecVT.getVectorElementType();
12383
12384 // Calculate the element offset and add it to the pointer.
12385 unsigned EltSize = EltVT.getFixedSizeInBits() / 8; // FIXME: should be ABI size.
12386 assert(EltSize * 8 == EltVT.getFixedSizeInBits() &&
12387 "Converting bits to bytes lost precision");
12388 assert(SubVecVT.getVectorElementType() == EltVT &&
12389 "Sub-vector must be a vector with matching element type");
12390 Index = clampDynamicVectorIndex(DAG, Index, VecVT, dl,
12391 SubVecVT.getVectorElementCount());
12392
12393 EVT IdxVT = Index.getValueType();
12394 if (SubVecVT.isScalableVector())
12395 Index =
12396 DAG.getNode(ISD::MUL, dl, IdxVT, Index,
12397 DAG.getVScale(dl, IdxVT, APInt(IdxVT.getSizeInBits(), 1)));
12398
12399 Index = DAG.getNode(ISD::MUL, dl, IdxVT, Index,
12400 DAG.getConstant(EltSize, dl, IdxVT));
12401 return DAG.getMemBasePlusOffset(VecPtr, Index, dl, PtrArithFlags);
12402}
12403
12404//===----------------------------------------------------------------------===//
12405// Implementation of Emulated TLS Model
12406//===----------------------------------------------------------------------===//
12407
12409 SelectionDAG &DAG) const {
12410 // Access to address of TLS varialbe xyz is lowered to a function call:
12411 // __emutls_get_address( address of global variable named "__emutls_v.xyz" )
12412 EVT PtrVT = getPointerTy(DAG.getDataLayout());
12413 PointerType *VoidPtrType = PointerType::get(*DAG.getContext(), 0);
12414 SDLoc dl(GA);
12415
12416 ArgListTy Args;
12417 const GlobalValue *GV =
12419 SmallString<32> NameString("__emutls_v.");
12420 NameString += GV->getName();
12421 StringRef EmuTlsVarName(NameString);
12422 const GlobalVariable *EmuTlsVar =
12423 GV->getParent()->getNamedGlobal(EmuTlsVarName);
12424 assert(EmuTlsVar && "Cannot find EmuTlsVar ");
12425 Args.emplace_back(DAG.getGlobalAddress(EmuTlsVar, dl, PtrVT), VoidPtrType);
12426
12427 SDValue EmuTlsGetAddr = DAG.getExternalSymbol("__emutls_get_address", PtrVT);
12428
12430 CLI.setDebugLoc(dl).setChain(DAG.getEntryNode());
12431 CLI.setLibCallee(CallingConv::C, VoidPtrType, EmuTlsGetAddr, std::move(Args));
12432 std::pair<SDValue, SDValue> CallResult = LowerCallTo(CLI);
12433
12434 // TLSADDR will be codegen'ed as call. Inform MFI that function has calls.
12435 // At last for X86 targets, maybe good for other targets too?
12437 MFI.setAdjustsStack(true); // Is this only for X86 target?
12438 MFI.setHasCalls(true);
12439
12440 assert((GA->getOffset() == 0) &&
12441 "Emulated TLS must have zero offset in GlobalAddressSDNode");
12442 return CallResult.first;
12443}
12444
12446 SelectionDAG &DAG) const {
12447 assert((Op->getOpcode() == ISD::SETCC) && "Input has to be a SETCC node.");
12448 if (!isCtlzFast())
12449 return SDValue();
12450 ISD::CondCode CC = cast<CondCodeSDNode>(Op.getOperand(2))->get();
12451 SDLoc dl(Op);
12452 if (isNullConstant(Op.getOperand(1)) && CC == ISD::SETEQ) {
12453 EVT VT = Op.getOperand(0).getValueType();
12454 SDValue Zext = Op.getOperand(0);
12455 if (VT.bitsLT(MVT::i32)) {
12456 VT = MVT::i32;
12457 Zext = DAG.getNode(ISD::ZERO_EXTEND, dl, VT, Op.getOperand(0));
12458 }
12459 unsigned Log2b = Log2_32(VT.getSizeInBits());
12460 SDValue Clz = DAG.getNode(ISD::CTLZ, dl, VT, Zext);
12461 SDValue Scc = DAG.getNode(ISD::SRL, dl, VT, Clz,
12462 DAG.getConstant(Log2b, dl, MVT::i32));
12463 return DAG.getNode(ISD::TRUNCATE, dl, MVT::i32, Scc);
12464 }
12465 return SDValue();
12466}
12467
12469 SDValue Op0 = Node->getOperand(0);
12470 SDValue Op1 = Node->getOperand(1);
12471 EVT VT = Op0.getValueType();
12472 EVT BoolVT = getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
12473 unsigned Opcode = Node->getOpcode();
12474 SDLoc DL(Node);
12475
12476 // If both sign bits are zero, flip UMIN/UMAX <-> SMIN/SMAX if legal.
12477 unsigned AltOpcode = ISD::getOppositeSignednessMinMaxOpcode(Opcode);
12478 if (isOperationLegal(AltOpcode, VT) && DAG.SignBitIsZero(Op0) &&
12479 DAG.SignBitIsZero(Op1))
12480 return DAG.getNode(AltOpcode, DL, VT, Op0, Op1);
12481
12482 // umax(x,1) --> sub(x,cmpeq(x,0)) iff cmp result is allbits
12483 if (Opcode == ISD::UMAX && llvm::isOneOrOneSplat(Op1, true) && BoolVT == VT &&
12485 Op0 = DAG.getFreeze(Op0);
12486 SDValue Zero = DAG.getConstant(0, DL, VT);
12487 return DAG.getNode(ISD::SUB, DL, VT, Op0,
12488 DAG.getSetCC(DL, VT, Op0, Zero, ISD::SETEQ));
12489 }
12490
12491 // umin(x,y) -> sub(x,usubsat(x,y))
12492 // TODO: Missing freeze(Op0)?
12493 if (Opcode == ISD::UMIN && isOperationLegal(ISD::SUB, VT) &&
12495 return DAG.getNode(ISD::SUB, DL, VT, Op0,
12496 DAG.getNode(ISD::USUBSAT, DL, VT, Op0, Op1));
12497 }
12498
12499 // umax(x,y) -> add(x,usubsat(y,x))
12500 // TODO: Missing freeze(Op0)?
12501 if (Opcode == ISD::UMAX && isOperationLegal(ISD::ADD, VT) &&
12503 return DAG.getNode(ISD::ADD, DL, VT, Op0,
12504 DAG.getNode(ISD::USUBSAT, DL, VT, Op1, Op0));
12505 }
12506
12507 // FIXME: Should really try to split the vector in case it's legal on a
12508 // subvector.
12510 return DAG.UnrollVectorOp(Node);
12511
12512 // Attempt to find an existing SETCC node that we can reuse.
12513 // TODO: Do we need a generic doesSETCCNodeExist?
12514 // TODO: Missing freeze(Op0)/freeze(Op1)?
12515 auto buildMinMax = [&](ISD::CondCode PrefCC, ISD::CondCode AltCC,
12516 ISD::CondCode PrefCommuteCC,
12517 ISD::CondCode AltCommuteCC) {
12518 SDVTList BoolVTList = DAG.getVTList(BoolVT);
12519 for (ISD::CondCode CC : {PrefCC, AltCC}) {
12520 if (DAG.doesNodeExist(ISD::SETCC, BoolVTList,
12521 {Op0, Op1, DAG.getCondCode(CC)})) {
12522 SDValue Cond = DAG.getSetCC(DL, BoolVT, Op0, Op1, CC);
12523 return DAG.getSelect(DL, VT, Cond, Op0, Op1);
12524 }
12525 }
12526 for (ISD::CondCode CC : {PrefCommuteCC, AltCommuteCC}) {
12527 if (DAG.doesNodeExist(ISD::SETCC, BoolVTList,
12528 {Op0, Op1, DAG.getCondCode(CC)})) {
12529 SDValue Cond = DAG.getSetCC(DL, BoolVT, Op0, Op1, CC);
12530 return DAG.getSelect(DL, VT, Cond, Op1, Op0);
12531 }
12532 }
12533 SDValue Cond = DAG.getSetCC(DL, BoolVT, Op0, Op1, PrefCC);
12534 return DAG.getSelect(DL, VT, Cond, Op0, Op1);
12535 };
12536
12537 // Expand Y = MAX(A, B) -> Y = (A > B) ? A : B
12538 // -> Y = (A < B) ? B : A
12539 // -> Y = (A >= B) ? A : B
12540 // -> Y = (A <= B) ? B : A
12541 switch (Opcode) {
12542 case ISD::SMAX:
12543 return buildMinMax(ISD::SETGT, ISD::SETGE, ISD::SETLT, ISD::SETLE);
12544 case ISD::SMIN:
12545 return buildMinMax(ISD::SETLT, ISD::SETLE, ISD::SETGT, ISD::SETGE);
12546 case ISD::UMAX:
12547 return buildMinMax(ISD::SETUGT, ISD::SETUGE, ISD::SETULT, ISD::SETULE);
12548 case ISD::UMIN:
12549 return buildMinMax(ISD::SETULT, ISD::SETULE, ISD::SETUGT, ISD::SETUGE);
12550 }
12551
12552 llvm_unreachable("How did we get here?");
12553}
12554
12556 unsigned Opcode = Node->getOpcode();
12557 SDValue LHS = Node->getOperand(0);
12558 SDValue RHS = Node->getOperand(1);
12559 EVT VT = LHS.getValueType();
12560 SDLoc dl(Node);
12561
12562 assert(VT == RHS.getValueType() && "Expected operands to be the same type");
12563 assert(VT.isInteger() && "Expected operands to be integers");
12564
12565 // usub.sat(a, b) -> umax(a, b) - b
12566 if (Opcode == ISD::USUBSAT && isOperationLegal(ISD::UMAX, VT)) {
12567 SDValue Max = DAG.getNode(ISD::UMAX, dl, VT, LHS, RHS);
12568 return DAG.getNode(ISD::SUB, dl, VT, Max, RHS);
12569 }
12570
12571 // usub.sat(a, 1) -> sub(a, zext(a != 0))
12572 // Prefer this on targets without legal/cost-effective overflow-carry nodes.
12573 if (Opcode == ISD::USUBSAT && isOneOrOneSplat(RHS) &&
12575 LHS = DAG.getFreeze(LHS);
12576 SDValue Zero = DAG.getConstant(0, dl, VT);
12577 EVT BoolVT = getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
12578 SDValue IsNonZero = DAG.getSetCC(dl, BoolVT, LHS, Zero, ISD::SETNE);
12579 SDValue Subtrahend = DAG.getBoolExtOrTrunc(IsNonZero, dl, VT, BoolVT);
12580 Subtrahend =
12581 DAG.getNode(ISD::AND, dl, VT, Subtrahend, DAG.getConstant(1, dl, VT));
12582 return DAG.getNode(ISD::SUB, dl, VT, LHS, Subtrahend);
12583 }
12584
12585 // uadd.sat(a, b) -> umin(a, ~b) + b
12586 if (Opcode == ISD::UADDSAT && isOperationLegal(ISD::UMIN, VT)) {
12587 SDValue InvRHS = DAG.getNOT(dl, RHS, VT);
12588 SDValue Min = DAG.getNode(ISD::UMIN, dl, VT, LHS, InvRHS);
12589 return DAG.getNode(ISD::ADD, dl, VT, Min, RHS);
12590 }
12591
12592 unsigned OverflowOp;
12593 switch (Opcode) {
12594 case ISD::SADDSAT:
12595 OverflowOp = ISD::SADDO;
12596 break;
12597 case ISD::UADDSAT:
12598 OverflowOp = ISD::UADDO;
12599 break;
12600 case ISD::SSUBSAT:
12601 OverflowOp = ISD::SSUBO;
12602 break;
12603 case ISD::USUBSAT:
12604 OverflowOp = ISD::USUBO;
12605 break;
12606 default:
12607 llvm_unreachable("Expected method to receive signed or unsigned saturation "
12608 "addition or subtraction node.");
12609 }
12610
12611 // FIXME: Should really try to split the vector in case it's legal on a
12612 // subvector.
12614 return DAG.UnrollVectorOp(Node);
12615
12616 unsigned BitWidth = LHS.getScalarValueSizeInBits();
12617 EVT BoolVT = getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
12618 SDValue Result = DAG.getNode(OverflowOp, dl, DAG.getVTList(VT, BoolVT), LHS, RHS);
12619 SDValue SumDiff = Result.getValue(0);
12620 SDValue Overflow = Result.getValue(1);
12621 SDValue Zero = DAG.getConstant(0, dl, VT);
12622 SDValue AllOnes = DAG.getAllOnesConstant(dl, VT);
12623
12624 if (Opcode == ISD::UADDSAT) {
12626 // (LHS + RHS) | OverflowMask
12627 SDValue OverflowMask = DAG.getSExtOrTrunc(Overflow, dl, VT);
12628 return DAG.getNode(ISD::OR, dl, VT, SumDiff, OverflowMask);
12629 }
12630 // Overflow ? 0xffff.... : (LHS + RHS)
12631 return DAG.getSelect(dl, VT, Overflow, AllOnes, SumDiff);
12632 }
12633
12634 if (Opcode == ISD::USUBSAT) {
12636 // (LHS - RHS) & ~OverflowMask
12637 SDValue OverflowMask = DAG.getSExtOrTrunc(Overflow, dl, VT);
12638 SDValue Not = DAG.getNOT(dl, OverflowMask, VT);
12639 return DAG.getNode(ISD::AND, dl, VT, SumDiff, Not);
12640 }
12641 // Overflow ? 0 : (LHS - RHS)
12642 return DAG.getSelect(dl, VT, Overflow, Zero, SumDiff);
12643 }
12644
12645 assert((Opcode == ISD::SADDSAT || Opcode == ISD::SSUBSAT) &&
12646 "Expected signed saturating add/sub opcode");
12647
12648 const APInt MinVal = APInt::getSignedMinValue(BitWidth);
12649 const APInt MaxVal = APInt::getSignedMaxValue(BitWidth);
12650
12651 KnownBits KnownLHS = DAG.computeKnownBits(LHS);
12652 KnownBits KnownRHS = DAG.computeKnownBits(RHS);
12653
12654 // If either of the operand signs are known, then they are guaranteed to
12655 // only saturate in one direction. If non-negative they will saturate
12656 // towards SIGNED_MAX, if negative they will saturate towards SIGNED_MIN.
12657 //
12658 // In the case of ISD::SSUBSAT, 'x - y' is equivalent to 'x + (-y)', so the
12659 // sign of 'y' has to be flipped.
12660
12661 bool LHSIsNonNegative = KnownLHS.isNonNegative();
12662 bool RHSIsNonNegative =
12663 Opcode == ISD::SADDSAT ? KnownRHS.isNonNegative() : KnownRHS.isNegative();
12664 if (LHSIsNonNegative || RHSIsNonNegative) {
12665 SDValue SatMax = DAG.getConstant(MaxVal, dl, VT);
12666 return DAG.getSelect(dl, VT, Overflow, SatMax, SumDiff);
12667 }
12668
12669 bool LHSIsNegative = KnownLHS.isNegative();
12670 bool RHSIsNegative =
12671 Opcode == ISD::SADDSAT ? KnownRHS.isNegative() : KnownRHS.isNonNegative();
12672 if (LHSIsNegative || RHSIsNegative) {
12673 SDValue SatMin = DAG.getConstant(MinVal, dl, VT);
12674 return DAG.getSelect(dl, VT, Overflow, SatMin, SumDiff);
12675 }
12676
12677 // Overflow ? (SumDiff >> BW) ^ MinVal : SumDiff
12678 SDValue SatMin = DAG.getConstant(MinVal, dl, VT);
12679 SDValue Shift = DAG.getNode(ISD::SRA, dl, VT, SumDiff,
12680 DAG.getConstant(BitWidth - 1, dl, VT));
12681 Result = DAG.getNode(ISD::XOR, dl, VT, Shift, SatMin);
12682 return DAG.getSelect(dl, VT, Overflow, Result, SumDiff);
12683}
12684
12686 unsigned Opcode = Node->getOpcode();
12687 SDValue LHS = Node->getOperand(0);
12688 SDValue RHS = Node->getOperand(1);
12689 EVT VT = LHS.getValueType();
12690 EVT ResVT = Node->getValueType(0);
12691 EVT BoolVT = getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
12692 SDLoc dl(Node);
12693
12694 auto LTPredicate = (Opcode == ISD::UCMP ? ISD::SETULT : ISD::SETLT);
12695 auto GTPredicate = (Opcode == ISD::UCMP ? ISD::SETUGT : ISD::SETGT);
12696 SDValue IsLT = DAG.getSetCC(dl, BoolVT, LHS, RHS, LTPredicate);
12697 SDValue IsGT = DAG.getSetCC(dl, BoolVT, LHS, RHS, GTPredicate);
12698
12699 // We can't perform arithmetic on i1 values. Extending them would
12700 // probably result in worse codegen, so let's just use two selects instead.
12701 // Some targets are also just better off using selects rather than subtraction
12702 // because one of the conditions can be merged with one of the selects.
12703 // And finally, if we don't know the contents of high bits of a boolean value
12704 // we can't perform any arithmetic either.
12706 BoolVT.getScalarSizeInBits() == 1 ||
12708 SDValue SelectZeroOrOne =
12709 DAG.getSelect(dl, ResVT, IsGT, DAG.getConstant(1, dl, ResVT),
12710 DAG.getConstant(0, dl, ResVT));
12711 return DAG.getSelect(dl, ResVT, IsLT, DAG.getAllOnesConstant(dl, ResVT),
12712 SelectZeroOrOne);
12713 }
12714
12716 std::swap(IsGT, IsLT);
12717 return DAG.getSExtOrTrunc(DAG.getNode(ISD::SUB, dl, BoolVT, IsGT, IsLT), dl,
12718 ResVT);
12719}
12720
12722 unsigned Opcode = Node->getOpcode();
12723 bool IsSigned = Opcode == ISD::SSHLSAT;
12724 SDValue LHS = Node->getOperand(0);
12725 SDValue RHS = Node->getOperand(1);
12726 EVT VT = LHS.getValueType();
12727 SDLoc dl(Node);
12728
12729 assert((Node->getOpcode() == ISD::SSHLSAT ||
12730 Node->getOpcode() == ISD::USHLSAT) &&
12731 "Expected a SHLSAT opcode");
12732 assert(VT.isInteger() && "Expected operands to be integers");
12733
12735 return DAG.UnrollVectorOp(Node);
12736
12737 // If LHS != (LHS << RHS) >> RHS, we have overflow and must saturate.
12738
12739 unsigned BW = VT.getScalarSizeInBits();
12740 EVT BoolVT = getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
12741 SDValue Result = DAG.getNode(ISD::SHL, dl, VT, LHS, RHS);
12742 SDValue Orig =
12743 DAG.getNode(IsSigned ? ISD::SRA : ISD::SRL, dl, VT, Result, RHS);
12744
12745 SDValue SatVal;
12746 if (IsSigned) {
12747 SDValue SatMin = DAG.getConstant(APInt::getSignedMinValue(BW), dl, VT);
12748 SDValue SatMax = DAG.getConstant(APInt::getSignedMaxValue(BW), dl, VT);
12749 SDValue Cond =
12750 DAG.getSetCC(dl, BoolVT, LHS, DAG.getConstant(0, dl, VT), ISD::SETLT);
12751 SatVal = DAG.getSelect(dl, VT, Cond, SatMin, SatMax);
12752 } else {
12753 SatVal = DAG.getConstant(APInt::getMaxValue(BW), dl, VT);
12754 }
12755 SDValue Cond = DAG.getSetCC(dl, BoolVT, LHS, Orig, ISD::SETNE);
12756 return DAG.getSelect(dl, VT, Cond, SatVal, Result);
12757}
12758
12760 bool Signed, SDValue &Lo, SDValue &Hi,
12761 SDValue LHS, SDValue RHS,
12762 SDValue HiLHS, SDValue HiRHS) const {
12763 EVT VT = LHS.getValueType();
12764 assert(RHS.getValueType() == VT && "Mismatching operand types");
12765
12766 assert((HiLHS && HiRHS) || (!HiLHS && !HiRHS));
12767 assert((!Signed || !HiLHS) &&
12768 "Signed flag should only be set when HiLHS and RiRHS are null");
12769
12770 // We'll expand the multiplication by brute force because we have no other
12771 // options. This is a trivially-generalized version of the code from
12772 // Hacker's Delight (itself derived from Knuth's Algorithm M from section
12773 // 4.3.1). If Signed is set, we can use arithmetic right shifts to propagate
12774 // sign bits while calculating the Hi half.
12775 unsigned Bits = VT.getScalarSizeInBits();
12776 unsigned HalfBits = Bits / 2;
12777 SDValue Mask = DAG.getConstant(APInt::getLowBitsSet(Bits, HalfBits), dl, VT);
12778 SDValue LL = DAG.getNode(ISD::AND, dl, VT, LHS, Mask);
12779 SDValue RL = DAG.getNode(ISD::AND, dl, VT, RHS, Mask);
12780
12781 SDValue T = DAG.getNode(ISD::MUL, dl, VT, LL, RL);
12782 SDValue TL = DAG.getNode(ISD::AND, dl, VT, T, Mask);
12783
12784 SDValue Shift = DAG.getShiftAmountConstant(HalfBits, VT, dl);
12785 // This is always an unsigned shift.
12786 SDValue TH = DAG.getNode(ISD::SRL, dl, VT, T, Shift);
12787
12788 unsigned ShiftOpc = Signed ? ISD::SRA : ISD::SRL;
12789 SDValue LH = DAG.getNode(ShiftOpc, dl, VT, LHS, Shift);
12790 SDValue RH = DAG.getNode(ShiftOpc, dl, VT, RHS, Shift);
12791
12792 SDValue U =
12793 DAG.getNode(ISD::ADD, dl, VT, DAG.getNode(ISD::MUL, dl, VT, LH, RL), TH);
12794 SDValue UL = DAG.getNode(ISD::AND, dl, VT, U, Mask);
12795 SDValue UH = DAG.getNode(ShiftOpc, dl, VT, U, Shift);
12796
12797 SDValue V =
12798 DAG.getNode(ISD::ADD, dl, VT, DAG.getNode(ISD::MUL, dl, VT, LL, RH), UL);
12799 SDValue VH = DAG.getNode(ShiftOpc, dl, VT, V, Shift);
12800
12801 Lo = DAG.getNode(ISD::ADD, dl, VT, TL,
12802 DAG.getNode(ISD::SHL, dl, VT, V, Shift));
12803
12804 Hi = DAG.getNode(ISD::ADD, dl, VT, DAG.getNode(ISD::MUL, dl, VT, LH, RH),
12805 DAG.getNode(ISD::ADD, dl, VT, UH, VH));
12806
12807 // If HiLHS and HiRHS are set, multiply them by the opposite low part and add
12808 // the products to Hi.
12809 if (HiLHS) {
12810 SDValue RHLL = DAG.getNode(ISD::MUL, dl, VT, HiRHS, LHS);
12811 SDValue RLLH = DAG.getNode(ISD::MUL, dl, VT, RHS, HiLHS);
12812 Hi = DAG.getNode(ISD::ADD, dl, VT, Hi,
12813 DAG.getNode(ISD::ADD, dl, VT, RHLL, RLLH));
12814 }
12815}
12816
12818 bool Signed, const SDValue LHS,
12819 const SDValue RHS, SDValue &Lo,
12820 SDValue &Hi) const {
12821 EVT VT = LHS.getValueType();
12822 assert(RHS.getValueType() == VT && "Mismatching operand types");
12823 EVT WideVT = VT.widenIntegerElementType(*DAG.getContext());
12824 // We can fall back to a libcall with an illegal type for the MUL if we
12825 // have a libcall big enough.
12826 RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL;
12827 if (WideVT == MVT::i16)
12828 LC = RTLIB::MUL_I16;
12829 else if (WideVT == MVT::i32)
12830 LC = RTLIB::MUL_I32;
12831 else if (WideVT == MVT::i64)
12832 LC = RTLIB::MUL_I64;
12833 else if (WideVT == MVT::i128)
12834 LC = RTLIB::MUL_I128;
12835
12836 RTLIB::LibcallImpl LibcallImpl = getLibcallImpl(LC);
12837 if (LibcallImpl == RTLIB::Unsupported) {
12838 forceExpandMultiply(DAG, dl, Signed, Lo, Hi, LHS, RHS);
12839 return;
12840 }
12841
12842 SDValue HiLHS, HiRHS;
12843 if (Signed) {
12844 // The high part is obtained by SRA'ing all but one of the bits of low
12845 // part.
12846 unsigned LoSize = VT.getFixedSizeInBits();
12847 SDValue Shift = DAG.getShiftAmountConstant(LoSize - 1, VT, dl);
12848 HiLHS = DAG.getNode(ISD::SRA, dl, VT, LHS, Shift);
12849 HiRHS = DAG.getNode(ISD::SRA, dl, VT, RHS, Shift);
12850 } else {
12851 HiLHS = DAG.getConstant(0, dl, VT);
12852 HiRHS = DAG.getConstant(0, dl, VT);
12853 }
12854
12855 // Attempt a libcall.
12856 SDValue Ret;
12858 CallOptions.setIsSigned(Signed);
12859 CallOptions.setIsPostTypeLegalization(true);
12861 // Halves of WideVT are packed into registers in different order
12862 // depending on platform endianness. This is usually handled by
12863 // the C calling convention, but we can't defer to it in
12864 // the legalizer.
12865 SDValue Args[] = {LHS, HiLHS, RHS, HiRHS};
12866 Ret = makeLibCall(DAG, LC, WideVT, Args, CallOptions, dl).first;
12867 } else {
12868 SDValue Args[] = {HiLHS, LHS, HiRHS, RHS};
12869 Ret = makeLibCall(DAG, LC, WideVT, Args, CallOptions, dl).first;
12870 }
12872 "Ret value is a collection of constituent nodes holding result.");
12873 if (DAG.getDataLayout().isLittleEndian()) {
12874 // Same as above.
12875 Lo = Ret.getOperand(0);
12876 Hi = Ret.getOperand(1);
12877 } else {
12878 Lo = Ret.getOperand(1);
12879 Hi = Ret.getOperand(0);
12880 }
12881}
12882
12883SDValue
12885 assert((Node->getOpcode() == ISD::SMULFIX ||
12886 Node->getOpcode() == ISD::UMULFIX ||
12887 Node->getOpcode() == ISD::SMULFIXSAT ||
12888 Node->getOpcode() == ISD::UMULFIXSAT) &&
12889 "Expected a fixed point multiplication opcode");
12890
12891 SDLoc dl(Node);
12892 SDValue LHS = Node->getOperand(0);
12893 SDValue RHS = Node->getOperand(1);
12894 EVT VT = LHS.getValueType();
12895 unsigned Scale = Node->getConstantOperandVal(2);
12896 bool Saturating = (Node->getOpcode() == ISD::SMULFIXSAT ||
12897 Node->getOpcode() == ISD::UMULFIXSAT);
12898 bool Signed = (Node->getOpcode() == ISD::SMULFIX ||
12899 Node->getOpcode() == ISD::SMULFIXSAT);
12900 EVT BoolVT = getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
12901 unsigned VTSize = VT.getScalarSizeInBits();
12902
12903 if (!Scale) {
12904 // [us]mul.fix(a, b, 0) -> mul(a, b)
12905 if (!Saturating) {
12907 return DAG.getNode(ISD::MUL, dl, VT, LHS, RHS);
12908 } else if (Signed && isOperationLegalOrCustom(ISD::SMULO, VT)) {
12909 SDValue Result =
12910 DAG.getNode(ISD::SMULO, dl, DAG.getVTList(VT, BoolVT), LHS, RHS);
12911 SDValue Product = Result.getValue(0);
12912 SDValue Overflow = Result.getValue(1);
12913 SDValue Zero = DAG.getConstant(0, dl, VT);
12914
12915 APInt MinVal = APInt::getSignedMinValue(VTSize);
12916 APInt MaxVal = APInt::getSignedMaxValue(VTSize);
12917 SDValue SatMin = DAG.getConstant(MinVal, dl, VT);
12918 SDValue SatMax = DAG.getConstant(MaxVal, dl, VT);
12919 // Xor the inputs, if resulting sign bit is 0 the product will be
12920 // positive, else negative.
12921 SDValue Xor = DAG.getNode(ISD::XOR, dl, VT, LHS, RHS);
12922 SDValue ProdNeg = DAG.getSetCC(dl, BoolVT, Xor, Zero, ISD::SETLT);
12923 Result = DAG.getSelect(dl, VT, ProdNeg, SatMin, SatMax);
12924 return DAG.getSelect(dl, VT, Overflow, Result, Product);
12925 } else if (!Signed && isOperationLegalOrCustom(ISD::UMULO, VT)) {
12926 SDValue Result =
12927 DAG.getNode(ISD::UMULO, dl, DAG.getVTList(VT, BoolVT), LHS, RHS);
12928 SDValue Product = Result.getValue(0);
12929 SDValue Overflow = Result.getValue(1);
12930
12931 APInt MaxVal = APInt::getMaxValue(VTSize);
12932 SDValue SatMax = DAG.getConstant(MaxVal, dl, VT);
12933 return DAG.getSelect(dl, VT, Overflow, SatMax, Product);
12934 }
12935 }
12936
12937 assert(((Signed && Scale < VTSize) || (!Signed && Scale <= VTSize)) &&
12938 "Expected scale to be less than the number of bits if signed or at "
12939 "most the number of bits if unsigned.");
12940 assert(LHS.getValueType() == RHS.getValueType() &&
12941 "Expected both operands to be the same type");
12942
12943 // Select the saturated value when Cond0 <CC> Cond1, keeping it vectorized:
12944 // SELECT_CC is scalarized for vector types, so build SETCC + VSELECT there.
12945 auto getSaturatingSelect = [&](SDValue Cond0, SDValue Cond1, SDValue Sat,
12946 SDValue Val, ISD::CondCode CC) {
12947 if (VT.isVector())
12948 return DAG.getSelect(dl, VT, DAG.getSetCC(dl, BoolVT, Cond0, Cond1, CC),
12949 Sat, Val);
12950 return DAG.getSelectCC(dl, Cond0, Cond1, Sat, Val, CC);
12951 };
12952
12953 // Get the upper and lower bits of the result.
12954 SDValue Lo, Hi;
12955 unsigned LoHiOp = Signed ? ISD::SMUL_LOHI : ISD::UMUL_LOHI;
12956 unsigned HiOp = Signed ? ISD::MULHS : ISD::MULHU;
12957 EVT WideVT = VT.widenIntegerElementType(*DAG.getContext());
12958 if (isOperationLegalOrCustom(LoHiOp, VT)) {
12959 SDValue Result = DAG.getNode(LoHiOp, dl, DAG.getVTList(VT, VT), LHS, RHS);
12960 Lo = Result.getValue(0);
12961 Hi = Result.getValue(1);
12962 } else if (isOperationLegalOrCustom(HiOp, VT)) {
12963 Lo = DAG.getNode(ISD::MUL, dl, VT, LHS, RHS);
12964 Hi = DAG.getNode(HiOp, dl, VT, LHS, RHS);
12965 } else if (isOperationLegalOrCustom(ISD::MUL, WideVT)) {
12966 // Try for a multiplication using a wider type.
12967 unsigned Ext = Signed ? ISD::SIGN_EXTEND : ISD::ZERO_EXTEND;
12968 SDValue LHSExt = DAG.getNode(Ext, dl, WideVT, LHS);
12969 SDValue RHSExt = DAG.getNode(Ext, dl, WideVT, RHS);
12970 SDValue Res = DAG.getNode(ISD::MUL, dl, WideVT, LHSExt, RHSExt);
12971 Lo = DAG.getNode(ISD::TRUNCATE, dl, VT, Res);
12972 SDValue Shifted =
12973 DAG.getNode(ISD::SRA, dl, WideVT, Res,
12974 DAG.getShiftAmountConstant(VTSize, WideVT, dl));
12975 Hi = DAG.getNode(ISD::TRUNCATE, dl, VT, Shifted);
12976 } else if (VT.isVector()) {
12977 return SDValue();
12978 } else {
12979 forceExpandWideMUL(DAG, dl, Signed, LHS, RHS, Lo, Hi);
12980 }
12981
12982 if (Scale == VTSize)
12983 // Result is just the top half since we'd be shifting by the width of the
12984 // operand. Overflow impossible so this works for both UMULFIX and
12985 // UMULFIXSAT.
12986 return Hi;
12987
12988 // The result will need to be shifted right by the scale since both operands
12989 // are scaled. The result is given to us in 2 halves, so we only want part of
12990 // both in the result.
12991 SDValue Result = DAG.getNode(ISD::FSHR, dl, VT, Hi, Lo,
12992 DAG.getShiftAmountConstant(Scale, VT, dl));
12993 if (!Saturating)
12994 return Result;
12995
12996 if (!Signed) {
12997 // Unsigned overflow happened if the upper (VTSize - Scale) bits (of the
12998 // widened multiplication) aren't all zeroes.
12999
13000 // Saturate to max if ((Hi >> Scale) != 0),
13001 // which is the same as if (Hi > ((1 << Scale) - 1))
13002 APInt MaxVal = APInt::getMaxValue(VTSize);
13003 SDValue LowMask =
13004 DAG.getConstant(APInt::getLowBitsSet(VTSize, Scale), dl, VT);
13005 return getSaturatingSelect(Hi, LowMask, DAG.getConstant(MaxVal, dl, VT),
13006 Result, ISD::SETUGT);
13007 }
13008
13009 // Signed overflow happened if the upper (VTSize - Scale + 1) bits (of the
13010 // widened multiplication) aren't all ones or all zeroes.
13011
13012 SDValue SatMin = DAG.getConstant(APInt::getSignedMinValue(VTSize), dl, VT);
13013 SDValue SatMax = DAG.getConstant(APInt::getSignedMaxValue(VTSize), dl, VT);
13014
13015 if (Scale == 0) {
13016 SDValue Sign = DAG.getNode(ISD::SRA, dl, VT, Lo,
13017 DAG.getShiftAmountConstant(VTSize - 1, VT, dl));
13018 SDValue Overflow = DAG.getSetCC(dl, BoolVT, Hi, Sign, ISD::SETNE);
13019 // Saturated to SatMin if wide product is negative, and SatMax if wide
13020 // product is positive ...
13021 SDValue Zero = DAG.getConstant(0, dl, VT);
13022 SDValue ResultIfOverflow =
13023 getSaturatingSelect(Hi, Zero, SatMin, SatMax, ISD::SETLT);
13024 // ... but only if we overflowed.
13025 return DAG.getSelect(dl, VT, Overflow, ResultIfOverflow, Result);
13026 }
13027
13028 // We handled Scale==0 above so all the bits to examine is in Hi.
13029
13030 // Saturate to max if ((Hi >> (Scale - 1)) > 0),
13031 // which is the same as if (Hi > (1 << (Scale - 1)) - 1)
13032 SDValue LowMask =
13033 DAG.getConstant(APInt::getLowBitsSet(VTSize, Scale - 1), dl, VT);
13034 // Saturate to min if (Hi >> (Scale - 1)) < -1),
13035 // which is the same as if (HI < (-1 << (Scale - 1))
13036 SDValue HighMask = DAG.getConstant(
13037 APInt::getHighBitsSet(VTSize, VTSize - Scale + 1), dl, VT);
13038 Result = getSaturatingSelect(Hi, LowMask, SatMax, Result, ISD::SETGT);
13039 Result = getSaturatingSelect(Hi, HighMask, SatMin, Result, ISD::SETLT);
13040 return Result;
13041}
13042
13043SDValue
13045 SDValue LHS, SDValue RHS,
13046 unsigned Scale, SelectionDAG &DAG) const {
13047 assert((Opcode == ISD::SDIVFIX || Opcode == ISD::SDIVFIXSAT ||
13048 Opcode == ISD::UDIVFIX || Opcode == ISD::UDIVFIXSAT) &&
13049 "Expected a fixed point division opcode");
13050
13051 EVT VT = LHS.getValueType();
13052 bool Signed = Opcode == ISD::SDIVFIX || Opcode == ISD::SDIVFIXSAT;
13053 bool Saturating = Opcode == ISD::SDIVFIXSAT || Opcode == ISD::UDIVFIXSAT;
13054 EVT BoolVT = getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
13055
13056 // If there is enough room in the type to upscale the LHS or downscale the
13057 // RHS before the division, we can perform it in this type without having to
13058 // resize. For signed operations, the LHS headroom is the number of
13059 // redundant sign bits, and for unsigned ones it is the number of zeroes.
13060 // The headroom for the RHS is the number of trailing zeroes.
13061 unsigned LHSLead = Signed ? DAG.ComputeNumSignBits(LHS) - 1
13063 unsigned RHSTrail = DAG.computeKnownBits(RHS).countMinTrailingZeros();
13064
13065 // For signed saturating operations, we need to be able to detect true integer
13066 // division overflow; that is, when you have MIN / -EPS. However, this
13067 // is undefined behavior and if we emit divisions that could take such
13068 // values it may cause undesired behavior (arithmetic exceptions on x86, for
13069 // example).
13070 // Avoid this by requiring an extra bit so that we never get this case.
13071 // FIXME: This is a bit unfortunate as it means that for an 8-bit 7-scale
13072 // signed saturating division, we need to emit a whopping 32-bit division.
13073 if (LHSLead + RHSTrail < Scale + (unsigned)(Saturating && Signed))
13074 return SDValue();
13075
13076 unsigned LHSShift = std::min(LHSLead, Scale);
13077 unsigned RHSShift = Scale - LHSShift;
13078
13079 // At this point, we know that if we shift the LHS up by LHSShift and the
13080 // RHS down by RHSShift, we can emit a regular division with a final scaling
13081 // factor of Scale.
13082
13083 if (LHSShift)
13084 LHS = DAG.getNode(ISD::SHL, dl, VT, LHS,
13085 DAG.getShiftAmountConstant(LHSShift, VT, dl));
13086 if (RHSShift)
13087 RHS = DAG.getNode(Signed ? ISD::SRA : ISD::SRL, dl, VT, RHS,
13088 DAG.getShiftAmountConstant(RHSShift, VT, dl));
13089
13090 SDValue Quot;
13091 if (Signed) {
13092 // For signed operations, if the resulting quotient is negative and the
13093 // remainder is nonzero, subtract 1 from the quotient to round towards
13094 // negative infinity.
13095 SDValue Rem;
13096 // FIXME: Ideally we would always produce an SDIVREM here, but if the
13097 // type isn't legal, SDIVREM cannot be expanded. There is no reason why
13098 // we couldn't just form a libcall, but the type legalizer doesn't do it.
13099 if (isTypeLegal(VT) &&
13101 Quot = DAG.getNode(ISD::SDIVREM, dl,
13102 DAG.getVTList(VT, VT),
13103 LHS, RHS);
13104 Rem = Quot.getValue(1);
13105 Quot = Quot.getValue(0);
13106 } else {
13107 Quot = DAG.getNode(ISD::SDIV, dl, VT,
13108 LHS, RHS);
13109 Rem = DAG.getNode(ISD::SREM, dl, VT,
13110 LHS, RHS);
13111 }
13112 SDValue Zero = DAG.getConstant(0, dl, VT);
13113 SDValue RemNonZero = DAG.getSetCC(dl, BoolVT, Rem, Zero, ISD::SETNE);
13114 SDValue LHSNeg = DAG.getSetCC(dl, BoolVT, LHS, Zero, ISD::SETLT);
13115 SDValue RHSNeg = DAG.getSetCC(dl, BoolVT, RHS, Zero, ISD::SETLT);
13116 SDValue QuotNeg = DAG.getNode(ISD::XOR, dl, BoolVT, LHSNeg, RHSNeg);
13117 SDValue Sub1 = DAG.getNode(ISD::SUB, dl, VT, Quot,
13118 DAG.getConstant(1, dl, VT));
13119 Quot = DAG.getSelect(dl, VT,
13120 DAG.getNode(ISD::AND, dl, BoolVT, RemNonZero, QuotNeg),
13121 Sub1, Quot);
13122 } else
13123 Quot = DAG.getNode(ISD::UDIV, dl, VT,
13124 LHS, RHS);
13125
13126 return Quot;
13127}
13128
13130 SDNode *Node, SDValue &Result, SDValue &Overflow, SelectionDAG &DAG) const {
13131 SDLoc dl(Node);
13132 SDValue LHS = Node->getOperand(0);
13133 SDValue RHS = Node->getOperand(1);
13134 bool IsAdd = Node->getOpcode() == ISD::UADDO;
13135
13136 // If UADDO_CARRY/SUBO_CARRY is legal, use that instead.
13137 unsigned OpcCarry = IsAdd ? ISD::UADDO_CARRY : ISD::USUBO_CARRY;
13138 if (isOperationLegalOrCustom(OpcCarry, Node->getValueType(0))) {
13139 SDValue CarryIn = DAG.getConstant(0, dl, Node->getValueType(1));
13140 SDValue NodeCarry = DAG.getNode(OpcCarry, dl, Node->getVTList(),
13141 { LHS, RHS, CarryIn });
13142 Result = SDValue(NodeCarry.getNode(), 0);
13143 Overflow = SDValue(NodeCarry.getNode(), 1);
13144 return;
13145 }
13146
13147 Result = DAG.getNode(IsAdd ? ISD::ADD : ISD::SUB, dl,
13148 LHS.getValueType(), LHS, RHS);
13149
13150 EVT ResultType = Node->getValueType(1);
13151 EVT SetCCType = getSetCCResultType(
13152 DAG.getDataLayout(), *DAG.getContext(), Node->getValueType(0));
13153 SDValue SetCC;
13154 if (IsAdd && isOneConstant(RHS)) {
13155 // Special case: uaddo X, 1 overflowed if X+1 is 0. This potential reduces
13156 // the live range of X. We assume comparing with 0 is cheap.
13157 // The general case (X + C) < C is not necessarily beneficial. Although we
13158 // reduce the live range of X, we may introduce the materialization of
13159 // constant C.
13160 SetCC =
13161 DAG.getSetCC(dl, SetCCType, Result,
13162 DAG.getConstant(0, dl, Node->getValueType(0)), ISD::SETEQ);
13163 } else if (IsAdd && isAllOnesConstant(RHS)) {
13164 // Special case: uaddo X, -1 overflows if X != 0.
13165 SetCC =
13166 DAG.getSetCC(dl, SetCCType, LHS,
13167 DAG.getConstant(0, dl, Node->getValueType(0)), ISD::SETNE);
13168 } else {
13169 ISD::CondCode CC = IsAdd ? ISD::SETULT : ISD::SETUGT;
13170 SetCC = DAG.getSetCC(dl, SetCCType, Result, LHS, CC);
13171 }
13172 Overflow = DAG.getBoolExtOrTrunc(SetCC, dl, ResultType, ResultType);
13173}
13174
13176 SDNode *Node, SDValue &Result, SDValue &Overflow, SelectionDAG &DAG) const {
13177 SDLoc dl(Node);
13178 SDValue LHS = Node->getOperand(0);
13179 SDValue RHS = Node->getOperand(1);
13180 bool IsAdd = Node->getOpcode() == ISD::SADDO;
13181
13182 Result = DAG.getNode(IsAdd ? ISD::ADD : ISD::SUB, dl,
13183 LHS.getValueType(), LHS, RHS);
13184
13185 EVT ResultType = Node->getValueType(1);
13186 EVT OType = getSetCCResultType(
13187 DAG.getDataLayout(), *DAG.getContext(), Node->getValueType(0));
13188
13189 // If SADDSAT/SSUBSAT is legal, compare results to detect overflow.
13190 unsigned OpcSat = IsAdd ? ISD::SADDSAT : ISD::SSUBSAT;
13191 if (isOperationLegal(OpcSat, LHS.getValueType())) {
13192 SDValue Sat = DAG.getNode(OpcSat, dl, LHS.getValueType(), LHS, RHS);
13193 SDValue SetCC = DAG.getSetCC(dl, OType, Result, Sat, ISD::SETNE);
13194 Overflow = DAG.getBoolExtOrTrunc(SetCC, dl, ResultType, ResultType);
13195 return;
13196 }
13197
13198 SDValue Zero = DAG.getConstant(0, dl, LHS.getValueType());
13199
13200 if (IsAdd) {
13201 // For an addition, the result should be less than one of the operands (LHS)
13202 // if and only if the other operand (RHS) is negative, otherwise there will
13203 // be overflow.
13204 SDValue ResultLowerThanLHS =
13205 DAG.getSetCC(dl, OType, Result, LHS, ISD::SETLT);
13206 SDValue RHSNegative = DAG.getSetCC(dl, OType, RHS, Zero, ISD::SETLT);
13207 Overflow = DAG.getBoolExtOrTrunc(
13208 DAG.getNode(ISD::XOR, dl, OType, RHSNegative, ResultLowerThanLHS), dl,
13209 ResultType, ResultType);
13210 } else {
13211 // For subtraction, overflow occurs when the signed comparison of operands
13212 // doesn't match the sign of the result.
13213 SDValue LHSLessThanRHS = DAG.getSetCC(dl, OType, LHS, RHS, ISD::SETLT);
13214 SDValue ResultNegative = DAG.getSetCC(dl, OType, Result, Zero, ISD::SETLT);
13215 Overflow = DAG.getBoolExtOrTrunc(
13216 DAG.getNode(ISD::XOR, dl, OType, LHSLessThanRHS, ResultNegative), dl,
13217 ResultType, ResultType);
13218 }
13219}
13220
13222 SDValue &Overflow, SelectionDAG &DAG) const {
13223 SDLoc dl(Node);
13224 EVT VT = Node->getValueType(0);
13225 EVT SetCCVT = getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
13226 SDValue LHS = Node->getOperand(0);
13227 SDValue RHS = Node->getOperand(1);
13228 bool isSigned = Node->getOpcode() == ISD::SMULO;
13229
13230 // For power-of-two multiplications we can use a simpler shift expansion.
13231 if (ConstantSDNode *RHSC = isConstOrConstSplat(RHS)) {
13232 const APInt &C = RHSC->getAPIntValue();
13233 // mulo(X, 1 << S) -> { X << S, (X << S) >> S != X }
13234 if (C.isPowerOf2()) {
13235 // smulo(x, signed_min) is same as umulo(x, signed_min).
13236 bool UseArithShift = isSigned && !C.isMinSignedValue();
13237 SDValue ShiftAmt = DAG.getShiftAmountConstant(C.logBase2(), VT, dl);
13238 Result = DAG.getNode(ISD::SHL, dl, VT, LHS, ShiftAmt);
13239 Overflow = DAG.getSetCC(dl, SetCCVT,
13240 DAG.getNode(UseArithShift ? ISD::SRA : ISD::SRL,
13241 dl, VT, Result, ShiftAmt),
13242 LHS, ISD::SETNE);
13243 return true;
13244 }
13245 }
13246
13247 SDValue BottomHalf;
13248 SDValue TopHalf;
13249 EVT WideVT = VT.widenIntegerElementType(*DAG.getContext());
13250
13251 static const unsigned Ops[2][3] =
13254 if (isOperationLegalOrCustom(Ops[isSigned][0], VT)) {
13255 BottomHalf = DAG.getNode(Ops[isSigned][0], dl, DAG.getVTList(VT, VT), LHS,
13256 RHS);
13257 TopHalf = BottomHalf.getValue(1);
13258 } else if (isOperationLegalOrCustom(Ops[isSigned][1], VT)) {
13259 BottomHalf = DAG.getNode(ISD::MUL, dl, VT, LHS, RHS);
13260 TopHalf = DAG.getNode(Ops[isSigned][1], dl, VT, LHS, RHS);
13261 } else if (isTypeLegal(WideVT)) {
13262 LHS = DAG.getNode(Ops[isSigned][2], dl, WideVT, LHS);
13263 RHS = DAG.getNode(Ops[isSigned][2], dl, WideVT, RHS);
13264 SDValue Mul = DAG.getNode(ISD::MUL, dl, WideVT, LHS, RHS);
13265 BottomHalf = DAG.getNode(ISD::TRUNCATE, dl, VT, Mul);
13266 SDValue ShiftAmt =
13267 DAG.getShiftAmountConstant(VT.getScalarSizeInBits(), WideVT, dl);
13268 TopHalf = DAG.getNode(ISD::TRUNCATE, dl, VT,
13269 DAG.getNode(ISD::SRL, dl, WideVT, Mul, ShiftAmt));
13270 } else {
13271 if (VT.isVector())
13272 return false;
13273
13274 forceExpandWideMUL(DAG, dl, isSigned, LHS, RHS, BottomHalf, TopHalf);
13275 }
13276
13277 Result = BottomHalf;
13278 if (isSigned) {
13279 SDValue ShiftAmt = DAG.getShiftAmountConstant(
13280 VT.getScalarSizeInBits() - 1, BottomHalf.getValueType(), dl);
13281 SDValue Sign = DAG.getNode(ISD::SRA, dl, VT, BottomHalf, ShiftAmt);
13282 Overflow = DAG.getSetCC(dl, SetCCVT, TopHalf, Sign, ISD::SETNE);
13283 } else {
13284 Overflow = DAG.getSetCC(dl, SetCCVT, TopHalf,
13285 DAG.getConstant(0, dl, VT), ISD::SETNE);
13286 }
13287
13288 // Truncate the result if SetCC returns a larger type than needed.
13289 EVT RType = Node->getValueType(1);
13290 if (RType.bitsLT(Overflow.getValueType()))
13291 Overflow = DAG.getNode(ISD::TRUNCATE, dl, RType, Overflow);
13292
13293 assert(RType.getSizeInBits() == Overflow.getValueSizeInBits() &&
13294 "Unexpected result type for S/UMULO legalization");
13295 return true;
13296}
13297
13299 SDLoc dl(Node);
13300 ISD::NodeType BaseOpcode = ISD::getVecReduceBaseOpcode(Node->getOpcode());
13301 SDValue Op = Node->getOperand(0);
13302 SDNodeFlags Flags = Node->getFlags();
13303 EVT VT = Op.getValueType();
13304
13305 // Try to use a shuffle reduction for power of two vectors.
13306 if (VT.isPow2VectorType()) {
13307 // See if the reduction opcode is safe to use with widened types.
13308 bool WidenSrc = false;
13309 switch (Node->getOpcode()) {
13312 case ISD::VECREDUCE_ADD:
13313 case ISD::VECREDUCE_MUL:
13314 case ISD::VECREDUCE_AND:
13315 case ISD::VECREDUCE_OR:
13316 case ISD::VECREDUCE_XOR:
13321 WidenSrc = VT.isFixedLengthVector();
13322 break;
13323 }
13324
13326 EVT HalfVT = VT.getHalfNumVectorElementsVT(*DAG.getContext());
13327 if (!isOperationLegalOrCustom(BaseOpcode, HalfVT)) {
13328 if (WidenSrc && Op.getOpcode() != ISD::BUILD_VECTOR) {
13329 // Attempt to widen the source vectors to a legal op.
13330 EVT WideVT = getTypeToTransformTo(*DAG.getContext(), HalfVT);
13331 if (WideVT.isVector() &&
13332 WideVT.getScalarType() == HalfVT.getScalarType() &&
13333 WideVT.getVectorNumElements() >= HalfVT.getVectorNumElements() &&
13334 isOperationLegalOrCustom(BaseOpcode, WideVT)) {
13335 SDValue Lo, Hi;
13336 std::tie(Lo, Hi) = DAG.SplitVector(Op, dl);
13337 Lo = DAG.getInsertSubvector(dl, DAG.getPOISON(WideVT), Lo, 0);
13338 Hi = DAG.getInsertSubvector(dl, DAG.getPOISON(WideVT), Hi, 0);
13339 Op = DAG.getNode(BaseOpcode, dl, WideVT, Lo, Hi, Flags);
13340 Op = DAG.getExtractSubvector(dl, HalfVT, Op, 0);
13341 VT = HalfVT;
13342 continue;
13343 }
13344 }
13345 break;
13346 }
13347
13348 SDValue Lo, Hi;
13349 std::tie(Lo, Hi) = DAG.SplitVector(Op, dl);
13350 Op = DAG.getNode(BaseOpcode, dl, HalfVT, Lo, Hi, Flags);
13351 VT = HalfVT;
13352
13353 // Stop if splitting is enough to make the reduction legal.
13354 if (isOperationLegalOrCustom(Node->getOpcode(), HalfVT))
13355 return DAG.getNode(Node->getOpcode(), dl, Node->getValueType(0), Op,
13356 Flags);
13357 }
13358 }
13359
13360 if (VT.isScalableVector())
13362 "Expanding reductions for scalable vectors is undefined.");
13363
13364 EVT EltVT = VT.getVectorElementType();
13365 unsigned NumElts = VT.getVectorNumElements();
13366
13368 DAG.ExtractVectorElements(Op, Ops, 0, NumElts);
13369
13370 SDValue Res = Ops[0];
13371 for (unsigned i = 1; i < NumElts; i++)
13372 Res = DAG.getNode(BaseOpcode, dl, EltVT, Res, Ops[i], Flags);
13373
13374 // Result type may be wider than element type.
13375 if (EltVT != Node->getValueType(0))
13376 Res = DAG.getNode(ISD::ANY_EXTEND, dl, Node->getValueType(0), Res);
13377 return Res;
13378}
13379
13381 SDLoc dl(Node);
13382 SDValue AccOp = Node->getOperand(0);
13383 SDValue VecOp = Node->getOperand(1);
13384 SDNodeFlags Flags = Node->getFlags();
13385
13386 EVT VT = VecOp.getValueType();
13387 EVT EltVT = VT.getVectorElementType();
13388
13389 if (VT.isScalableVector())
13391 "Expanding reductions for scalable vectors is undefined.");
13392
13393 unsigned NumElts = VT.getVectorNumElements();
13394
13396 DAG.ExtractVectorElements(VecOp, Ops, 0, NumElts);
13397
13398 unsigned BaseOpcode = ISD::getVecReduceBaseOpcode(Node->getOpcode());
13399
13400 SDValue Res = AccOp;
13401 for (unsigned i = 0; i < NumElts; i++)
13402 Res = DAG.getNode(BaseOpcode, dl, EltVT, Res, Ops[i], Flags);
13403
13404 return Res;
13405}
13406
13408 SelectionDAG &DAG) const {
13409 EVT VT = Node->getValueType(0);
13410 SDLoc dl(Node);
13411 bool isSigned = Node->getOpcode() == ISD::SREM;
13412 unsigned DivOpc = isSigned ? ISD::SDIV : ISD::UDIV;
13413 unsigned DivRemOpc = isSigned ? ISD::SDIVREM : ISD::UDIVREM;
13414 SDValue Dividend = Node->getOperand(0);
13415 SDValue Divisor = Node->getOperand(1);
13416 if (isOperationLegalOrCustom(DivRemOpc, VT)) {
13417 SDVTList VTs = DAG.getVTList(VT, VT);
13418 Result = DAG.getNode(DivRemOpc, dl, VTs, Dividend, Divisor).getValue(1);
13419 return true;
13420 }
13421 if (isOperationLegalOrCustom(DivOpc, VT)) {
13422 // X % Y -> X-X/Y*Y
13423 SDValue Divide = DAG.getNode(DivOpc, dl, VT, Dividend, Divisor);
13424 SDValue Mul = DAG.getNode(ISD::MUL, dl, VT, Divide, Divisor);
13425 Result = DAG.getNode(ISD::SUB, dl, VT, Dividend, Mul);
13426 return true;
13427 }
13428 return false;
13429}
13430
13432 SelectionDAG &DAG) const {
13433 bool IsSigned = Node->getOpcode() == ISD::FP_TO_SINT_SAT;
13434 SDLoc dl(SDValue(Node, 0));
13435 SDValue Src = Node->getOperand(0);
13436
13437 // DstVT is the result type, while SatVT is the size to which we saturate
13438 EVT SrcVT = Src.getValueType();
13439 EVT DstVT = Node->getValueType(0);
13440
13441 EVT SatVT = cast<VTSDNode>(Node->getOperand(1))->getVT();
13442 unsigned SatWidth = SatVT.getScalarSizeInBits();
13443 unsigned DstWidth = DstVT.getScalarSizeInBits();
13444 assert(SatWidth <= DstWidth &&
13445 "Expected saturation width smaller than result width");
13446
13447 // Determine minimum and maximum integer values and their corresponding
13448 // floating-point values.
13449 APInt MinInt, MaxInt;
13450 if (IsSigned) {
13451 MinInt = APInt::getSignedMinValue(SatWidth).sext(DstWidth);
13452 MaxInt = APInt::getSignedMaxValue(SatWidth).sext(DstWidth);
13453 } else {
13454 MinInt = APInt::getMinValue(SatWidth).zext(DstWidth);
13455 MaxInt = APInt::getMaxValue(SatWidth).zext(DstWidth);
13456 }
13457
13458 // We cannot risk emitting FP_TO_XINT nodes with a source VT of [b]f16, as
13459 // libcall emission cannot handle this. Large result types will fail.
13460 if (SrcVT == MVT::f16 || SrcVT == MVT::bf16) {
13461 Src = DAG.getNode(ISD::FP_EXTEND, dl, MVT::f32, Src);
13462 SrcVT = Src.getValueType();
13463 }
13464
13465 const fltSemantics &Sem = SrcVT.getFltSemantics();
13466 APFloat MinFloat(Sem);
13467 APFloat MaxFloat(Sem);
13468
13469 APFloat::opStatus MinStatus =
13470 MinFloat.convertFromAPInt(MinInt, IsSigned, APFloat::rmTowardZero);
13471 APFloat::opStatus MaxStatus =
13472 MaxFloat.convertFromAPInt(MaxInt, IsSigned, APFloat::rmTowardZero);
13473 bool AreExactFloatBounds = !(MinStatus & APFloat::opStatus::opInexact) &&
13474 !(MaxStatus & APFloat::opStatus::opInexact);
13475
13476 SDValue MinFloatNode = DAG.getConstantFP(MinFloat, dl, SrcVT);
13477 SDValue MaxFloatNode = DAG.getConstantFP(MaxFloat, dl, SrcVT);
13478
13479 // If the integer bounds are exactly representable as floats and min/max are
13480 // legal, emit a min+max+fptoi sequence. Otherwise we have to use a sequence
13481 // of comparisons and selects.
13482 auto EmitMinMax = [&](unsigned MinOpcode, unsigned MaxOpcode,
13483 bool MayPropagateNaN) {
13484 bool MinMaxLegal = isOperationLegalOrCustom(MinOpcode, SrcVT) &&
13485 isOperationLegalOrCustom(MaxOpcode, SrcVT);
13486 if (!MinMaxLegal)
13487 return SDValue();
13488
13489 SDValue Clamped = Src;
13490
13491 // Clamp Src by MinFloat from below. If !MayPropagateNaN and Src is NaN
13492 // then the result is MinFloat.
13493 Clamped = DAG.getNode(MaxOpcode, dl, SrcVT, Clamped, MinFloatNode);
13494 // Clamp by MaxFloat from above. If !MayPropagateNaN then NaN cannot occur.
13495 Clamped = DAG.getNode(MinOpcode, dl, SrcVT, Clamped, MaxFloatNode);
13496 // Convert clamped value to integer.
13497 SDValue FpToInt = DAG.getNode(IsSigned ? ISD::FP_TO_SINT : ISD::FP_TO_UINT,
13498 dl, DstVT, Clamped);
13499
13500 // If !MayPropagateNan and the conversion is unsigned case we're done,
13501 // because we mapped NaN to MinFloat, which will cast to zero.
13502 if (!MayPropagateNaN && !IsSigned)
13503 return FpToInt;
13504
13505 // Otherwise, select 0 if Src is NaN.
13506 SDValue ZeroInt = DAG.getConstant(0, dl, DstVT);
13507 EVT SetCCVT =
13508 getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), SrcVT);
13509 SDValue IsNan = DAG.getSetCC(dl, SetCCVT, Src, Src, ISD::CondCode::SETUO);
13510 return DAG.getSelect(dl, DstVT, IsNan, ZeroInt, FpToInt);
13511 };
13512 if (AreExactFloatBounds) {
13513 if (SDValue Res = EmitMinMax(ISD::FMINIMUMNUM, ISD::FMAXIMUMNUM,
13514 /*MayPropagateNaN=*/false))
13515 return Res;
13516 // These may propagate NaN for sNaN operands.
13517 if (SDValue Res =
13518 EmitMinMax(ISD::FMINNUM, ISD::FMAXNUM, /*MayPropagateNaN=*/true))
13519 return Res;
13520 // These always propagate NaN.
13521 if (SDValue Res =
13522 EmitMinMax(ISD::FMINIMUM, ISD::FMAXIMUM, /*MayPropagateNaN=*/true))
13523 return Res;
13524 }
13525
13526 SDValue MinIntNode = DAG.getConstant(MinInt, dl, DstVT);
13527 SDValue MaxIntNode = DAG.getConstant(MaxInt, dl, DstVT);
13528
13529 // Result of direct conversion. The assumption here is that the operation is
13530 // non-trapping and it's fine to apply it to an out-of-range value if we
13531 // select it away later.
13532 SDValue FpToInt =
13533 DAG.getNode(IsSigned ? ISD::FP_TO_SINT : ISD::FP_TO_UINT, dl, DstVT, Src);
13534
13535 SDValue Select = FpToInt;
13536
13537 EVT SetCCVT =
13538 getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), SrcVT);
13539
13540 // If Src ULT MinFloat, select MinInt. In particular, this also selects
13541 // MinInt if Src is NaN.
13542 SDValue ULT = DAG.getSetCC(dl, SetCCVT, Src, MinFloatNode, ISD::SETULT);
13543 Select = DAG.getSelect(dl, DstVT, ULT, MinIntNode, Select);
13544 // If Src OGT MaxFloat, select MaxInt.
13545 SDValue OGT = DAG.getSetCC(dl, SetCCVT, Src, MaxFloatNode, ISD::SETOGT);
13546 Select = DAG.getSelect(dl, DstVT, OGT, MaxIntNode, Select);
13547
13548 // In the unsigned case we are done, because we mapped NaN to MinInt, which
13549 // is already zero.
13550 if (!IsSigned)
13551 return Select;
13552
13553 // Otherwise, select 0 if Src is NaN.
13554 SDValue ZeroInt = DAG.getConstant(0, dl, DstVT);
13555 SDValue IsNan = DAG.getSetCC(dl, SetCCVT, Src, Src, ISD::CondCode::SETUO);
13556 return DAG.getSelect(dl, DstVT, IsNan, ZeroInt, Select);
13557}
13558
13560 const SDLoc &dl,
13561 SelectionDAG &DAG) const {
13562 EVT OperandVT = Op.getValueType();
13563 if (OperandVT.getScalarType() == ResultVT.getScalarType())
13564 return Op;
13565 EVT ResultIntVT = ResultVT.changeTypeToInteger();
13566 // We are rounding binary64/binary128 -> binary32 -> bfloat16. This
13567 // can induce double-rounding which may alter the results. We can
13568 // correct for this using a trick explained in: Boldo, Sylvie, and
13569 // Guillaume Melquiond. "When double rounding is odd." 17th IMACS
13570 // World Congress. 2005.
13571 SDValue Narrow = DAG.getFPExtendOrRound(Op, dl, ResultVT);
13572 SDValue NarrowAsWide = DAG.getFPExtendOrRound(Narrow, dl, OperandVT);
13573
13574 // We can keep the narrow value as-is if narrowing was exact (no
13575 // rounding error), the wide value was NaN (the narrow value is also
13576 // NaN and should be preserved) or if we rounded to the odd value.
13577 SDValue NarrowBits = DAG.getNode(ISD::BITCAST, dl, ResultIntVT, Narrow);
13578 SDValue One = DAG.getConstant(1, dl, ResultIntVT);
13579 SDValue NegativeOne = DAG.getAllOnesConstant(dl, ResultIntVT);
13580 SDValue And = DAG.getNode(ISD::AND, dl, ResultIntVT, NarrowBits, One);
13581 EVT ResultIntVTCCVT = getSetCCResultType(
13582 DAG.getDataLayout(), *DAG.getContext(), And.getValueType());
13583 SDValue Zero = DAG.getConstant(0, dl, ResultIntVT);
13584 // The result is already odd so we don't need to do anything.
13585 SDValue AlreadyOdd = DAG.getSetCC(dl, ResultIntVTCCVT, And, Zero, ISD::SETNE);
13586
13587 EVT WideSetCCVT = getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(),
13588 Op.getValueType());
13589 // We keep results which are exact, odd or NaN.
13590 SDValue KeepNarrow =
13591 DAG.getSetCC(dl, WideSetCCVT, Op, NarrowAsWide, ISD::SETUEQ);
13592 KeepNarrow = DAG.getNode(ISD::OR, dl, WideSetCCVT, KeepNarrow, AlreadyOdd);
13593 // We morally performed a round-down if AbsNarrow is smaller than
13594 // AbsWide.
13595 SDValue AbsWide = DAG.getNode(ISD::FABS, dl, OperandVT, Op);
13596 SDValue AbsNarrowAsWide = DAG.getNode(ISD::FABS, dl, OperandVT, NarrowAsWide);
13597 SDValue NarrowIsRd =
13598 DAG.getSetCC(dl, WideSetCCVT, AbsWide, AbsNarrowAsWide, ISD::SETOGT);
13599 // If the narrow value is odd or exact, pick it.
13600 // Otherwise, narrow is even and corresponds to either the rounded-up
13601 // or rounded-down value. If narrow is the rounded-down value, we want
13602 // the rounded-up value as it will be odd.
13603 SDValue Adjust = DAG.getSelect(dl, ResultIntVT, NarrowIsRd, One, NegativeOne);
13604 SDValue Adjusted = DAG.getNode(ISD::ADD, dl, ResultIntVT, NarrowBits, Adjust);
13605 Op = DAG.getSelect(dl, ResultIntVT, KeepNarrow, NarrowBits, Adjusted);
13606 return DAG.getNode(ISD::BITCAST, dl, ResultVT, Op);
13607}
13608
13610 assert(Node->getOpcode() == ISD::FP_ROUND && "Unexpected opcode!");
13611 SDValue Op = Node->getOperand(0);
13612 EVT VT = Node->getValueType(0);
13613 SDLoc dl(Node);
13614 if (VT.getScalarType() == MVT::bf16) {
13615 if (Node->getConstantOperandVal(1) == 1) {
13616 return DAG.getNode(ISD::FP_TO_BF16, dl, VT, Node->getOperand(0));
13617 }
13618 EVT OperandVT = Op.getValueType();
13619 SDValue IsNaN = DAG.getSetCC(
13620 dl,
13621 getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), OperandVT),
13622 Op, Op, ISD::SETUO);
13623
13624 // We are rounding binary64/binary128 -> binary32 -> bfloat16. This
13625 // can induce double-rounding which may alter the results. We can
13626 // correct for this using a trick explained in: Boldo, Sylvie, and
13627 // Guillaume Melquiond. "When double rounding is odd." 17th IMACS
13628 // World Congress. 2005.
13629 EVT F32 = VT.changeElementType(*DAG.getContext(), MVT::f32);
13630 EVT I32 = F32.changeTypeToInteger();
13631 Op = expandRoundInexactToOdd(F32, Op, dl, DAG);
13632 Op = DAG.getNode(ISD::BITCAST, dl, I32, Op);
13633
13634 // Conversions should set NaN's quiet bit. This also prevents NaNs from
13635 // turning into infinities.
13636 SDValue NaN =
13637 DAG.getNode(ISD::OR, dl, I32, Op, DAG.getConstant(0x400000, dl, I32));
13638
13639 // Factor in the contribution of the low 16 bits.
13640 SDValue One = DAG.getConstant(1, dl, I32);
13641 SDValue Lsb = DAG.getNode(ISD::SRL, dl, I32, Op,
13642 DAG.getShiftAmountConstant(16, I32, dl));
13643 Lsb = DAG.getNode(ISD::AND, dl, I32, Lsb, One);
13644 SDValue RoundingBias =
13645 DAG.getNode(ISD::ADD, dl, I32, Lsb, DAG.getConstant(0x7fff, dl, I32));
13646 SDValue Add = DAG.getNode(ISD::ADD, dl, I32, Op, RoundingBias);
13647
13648 // Don't round if we had a NaN, we don't want to turn 0x7fffffff into
13649 // 0x80000000.
13650 Op = DAG.getSelect(dl, I32, IsNaN, NaN, Add);
13651
13652 // Now that we have rounded, shift the bits into position.
13653 Op = DAG.getNode(ISD::SRL, dl, I32, Op,
13654 DAG.getShiftAmountConstant(16, I32, dl));
13655 EVT I16 = I32.changeElementType(*DAG.getContext(), MVT::i16);
13656 Op = DAG.getNode(ISD::TRUNCATE, dl, I16, Op);
13657 return DAG.getNode(ISD::BITCAST, dl, VT, Op);
13658 }
13659 return SDValue();
13660}
13661
13663 SelectionDAG &DAG) const {
13664 assert((Node->getOpcode() == ISD::VECTOR_SPLICE_LEFT ||
13665 Node->getOpcode() == ISD::VECTOR_SPLICE_RIGHT) &&
13666 "Unexpected opcode!");
13667 assert((Node->getValueType(0).isScalableVector() ||
13668 !isa<ConstantSDNode>(Node->getOperand(2))) &&
13669 "Fixed length vector types with constant offsets expected to use "
13670 "SHUFFLE_VECTOR!");
13671
13672 EVT VT = Node->getValueType(0);
13673 SDValue V1 = Node->getOperand(0);
13674 SDValue V2 = Node->getOperand(1);
13675 SDValue Offset = Node->getOperand(2);
13676 SDLoc DL(Node);
13677
13678 // Expand through memory thusly:
13679 // Alloca CONCAT_VECTORS_TYPES(V1, V2) Ptr
13680 // Store V1, Ptr
13681 // Store V2, Ptr + sizeof(V1)
13682 // if (VECTOR_SPLICE_LEFT)
13683 // Ptr = Ptr + (Offset * sizeof(VT.Elt))
13684 // else
13685 // Ptr = Ptr + sizeof(V1) - (Offset * size(VT.Elt))
13686 // Res = Load Ptr
13687
13688 Align Alignment = DAG.getReducedAlign(VT, /*UseABI=*/false);
13689
13691 VT.getVectorElementCount() * 2);
13692 SDValue StackPtr = DAG.CreateStackTemporary(MemVT.getStoreSize(), Alignment);
13693 EVT PtrVT = StackPtr.getValueType();
13694 auto &MF = DAG.getMachineFunction();
13695 auto FrameIndex = cast<FrameIndexSDNode>(StackPtr.getNode())->getIndex();
13696 auto PtrInfo = MachinePointerInfo::getFixedStack(MF, FrameIndex);
13697
13698 // Store the lo part of CONCAT_VECTORS(V1, V2)
13699 SDValue StoreV1 =
13700 DAG.getStore(DAG.getEntryNode(), DL, V1, StackPtr, PtrInfo, Alignment);
13701 // Store the hi part of CONCAT_VECTORS(V1, V2)
13702 SDValue VTBytes = DAG.getTypeSize(DL, PtrVT, VT.getStoreSize());
13703 SDValue StackPtr2 = DAG.getNode(ISD::ADD, DL, PtrVT, StackPtr, VTBytes);
13704 SDValue StoreV2 =
13705 DAG.getStore(StoreV1, DL, V2, StackPtr2, PtrInfo, Alignment);
13706
13707 // NOTE: TrailingBytes must be clamped so as not to read outside of V1:V2.
13708 SDValue EltByteSize =
13709 DAG.getTypeSize(DL, PtrVT, VT.getVectorElementType().getStoreSize());
13710 Offset = DAG.getZExtOrTrunc(Offset, DL, PtrVT);
13711 SDValue TrailingBytes = DAG.getNode(ISD::MUL, DL, PtrVT, Offset, EltByteSize);
13712
13713 TrailingBytes = DAG.getNode(ISD::UMIN, DL, PtrVT, TrailingBytes, VTBytes);
13714
13715 if (Node->getOpcode() == ISD::VECTOR_SPLICE_LEFT)
13716 StackPtr = DAG.getMemBasePlusOffset(StackPtr, TrailingBytes, DL);
13717 else
13718 StackPtr = DAG.getNode(ISD::SUB, DL, PtrVT, StackPtr2, TrailingBytes);
13719
13720 // Load the spliced result
13721 return DAG.getLoad(VT, DL, StoreV2, StackPtr,
13723}
13724
13726 SelectionDAG &DAG) const {
13727 SDLoc DL(Node);
13728 SDValue Vec = Node->getOperand(0);
13729 SDValue Mask = Node->getOperand(1);
13730 SDValue Passthru = Node->getOperand(2);
13731
13732 EVT VecVT = Vec.getValueType();
13733 EVT ScalarVT = VecVT.getScalarType();
13734 EVT MaskVT = Mask.getValueType();
13735 EVT MaskScalarVT = MaskVT.getScalarType();
13736
13737 // Needs to be handled by targets that have scalable vector types.
13738 if (VecVT.isScalableVector())
13739 report_fatal_error("Cannot expand masked_compress for scalable vectors.");
13740
13741 Align Alignment = DAG.getReducedAlign(VecVT, /*UseABI=*/false);
13742 SDValue StackPtr = DAG.CreateStackTemporary(VecVT.getStoreSize(), Alignment);
13743 int FI = cast<FrameIndexSDNode>(StackPtr.getNode())->getIndex();
13744 MachinePointerInfo PtrInfo =
13746
13747 MVT PositionVT = getVectorIdxTy(DAG.getDataLayout());
13748 SDValue Chain = DAG.getEntryNode();
13749 SDValue OutPos = DAG.getConstant(0, DL, PositionVT);
13750
13751 bool HasPassthru = !Passthru.isUndef();
13752
13753 // If we have a passthru vector, store it on the stack, overwrite the matching
13754 // positions and then re-write the last element that was potentially
13755 // overwritten even though mask[i] = false.
13756 if (HasPassthru)
13757 Chain = DAG.getStore(Chain, DL, Passthru, StackPtr, PtrInfo, Alignment);
13758
13759 SDValue LastWriteVal;
13760 APInt PassthruSplatVal;
13761 bool IsSplatPassthru =
13762 ISD::isConstantSplatVector(Passthru.getNode(), PassthruSplatVal);
13763
13764 if (IsSplatPassthru) {
13765 // As we do not know which position we wrote to last, we cannot simply
13766 // access that index from the passthru vector. So we first check if passthru
13767 // is a splat vector, to use any element ...
13768 LastWriteVal = DAG.getConstant(PassthruSplatVal, DL, ScalarVT);
13769 } else if (HasPassthru) {
13770 // ... if it is not a splat vector, we need to get the passthru value at
13771 // position = popcount(mask) and re-load it from the stack before it is
13772 // overwritten in the loop below.
13773 EVT PopcountVT = ScalarVT.changeTypeToInteger();
13774 SDValue Popcount = DAG.getNode(
13776 MaskVT.changeVectorElementType(*DAG.getContext(), MVT::i1), Mask);
13777 Popcount = DAG.getNode(
13779 MaskVT.changeVectorElementType(*DAG.getContext(), PopcountVT),
13780 Popcount);
13781 Popcount = DAG.getNode(ISD::VECREDUCE_ADD, DL, PopcountVT, Popcount);
13782 SDValue LastElmtPtr =
13783 getVectorElementPointer(DAG, StackPtr, VecVT, Popcount);
13784 LastWriteVal = DAG.getLoad(
13785 ScalarVT, DL, Chain, LastElmtPtr,
13787 Chain = LastWriteVal.getValue(1);
13788 }
13789
13790 unsigned NumElms = VecVT.getVectorNumElements();
13791 for (unsigned I = 0; I < NumElms; I++) {
13792 SDValue ValI = DAG.getExtractVectorElt(DL, ScalarVT, Vec, I);
13793 SDValue OutPtr = getVectorElementPointer(DAG, StackPtr, VecVT, OutPos);
13794 Chain = DAG.getStore(
13795 Chain, DL, ValI, OutPtr,
13797
13798 // Get the mask value and add it to the current output position. This
13799 // either increments by 1 if MaskI is true or adds 0 otherwise.
13800 // Freeze in case we have poison/undef mask entries.
13801 SDValue MaskI = DAG.getExtractVectorElt(DL, MaskScalarVT, Mask, I);
13802 MaskI = DAG.getFreeze(MaskI);
13803 MaskI = DAG.getNode(ISD::TRUNCATE, DL, MVT::i1, MaskI);
13804 MaskI = DAG.getNode(ISD::ZERO_EXTEND, DL, PositionVT, MaskI);
13805 OutPos = DAG.getNode(ISD::ADD, DL, PositionVT, OutPos, MaskI);
13806
13807 if (HasPassthru && I == NumElms - 1) {
13808 SDValue EndOfVector =
13809 DAG.getConstant(VecVT.getVectorNumElements() - 1, DL, PositionVT);
13810 SDValue AllLanesSelected =
13811 DAG.getSetCC(DL, MVT::i1, OutPos, EndOfVector, ISD::CondCode::SETUGT);
13812 OutPos = DAG.getNode(ISD::UMIN, DL, PositionVT, OutPos, EndOfVector);
13813 OutPtr = getVectorElementPointer(DAG, StackPtr, VecVT, OutPos);
13814
13815 // Re-write the last ValI if all lanes were selected. Otherwise,
13816 // overwrite the last write it with the passthru value.
13817 LastWriteVal = DAG.getSelect(DL, ScalarVT, AllLanesSelected, ValI,
13818 LastWriteVal, SDNodeFlags::Unpredictable);
13819 Chain = DAG.getStore(
13820 Chain, DL, LastWriteVal, OutPtr,
13822 }
13823 }
13824
13825 return DAG.getLoad(VecVT, DL, Chain, StackPtr, PtrInfo, Alignment);
13826}
13827
13829 SDLoc DL(Node);
13830 EVT VT = Node->getValueType(0);
13831
13832 bool ZeroIsPoison = Node->getOpcode() == ISD::CTTZ_ELTS_ZERO_POISON;
13833 auto [Mask, StepVec] =
13834 getLegalMaskAndStepVector(Node->getOperand(0), ZeroIsPoison, DL, DAG);
13835
13836 // No legal step vector: split mask in half and recombine results.
13837 // LoNumElts uses the non-poison CTTZ_ELTS so its result is well-defined
13838 // (== LoNumElts when no active lane), allowing the SETNE comparison.
13839 // Result: (ResLo != LoNumElts) ? ResLo : (LoNumElts + ResHi)
13840 if (!StepVec) {
13841 EVT ResVT = Node->getValueType(0);
13842 auto [MaskLo, MaskHi] = DAG.SplitVector(Node->getOperand(0), DL);
13843 SDValue LoNumElts = DAG.getElementCount(
13844 DL, ResVT, MaskLo.getValueType().getVectorElementCount());
13845 SDValue ResLo = DAG.getNode(ISD::CTTZ_ELTS, DL, ResVT, MaskLo);
13846 SDValue ResHi = DAG.getNode(Node->getOpcode(), DL, ResVT, MaskHi);
13847 SDValue ResLoNotNumElts = DAG.getSetCC(
13848 DL, getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), ResVT),
13849 ResLo, LoNumElts, ISD::SETNE);
13850 // Per LangRef, ResVT must be wide enough to hold the total element count,
13851 // so the sum cannot wrap as an unsigned add. NSW is not guaranteed since
13852 // the count is only required to fit unsigned.
13853 SDValue Sum = DAG.getNode(ISD::ADD, DL, ResVT, LoNumElts, ResHi,
13855 return DAG.getSelect(DL, ResVT, ResLoNotNumElts, ResLo, Sum);
13856 }
13857
13858 EVT StepVecVT = StepVec.getValueType();
13859 EVT StepVT = StepVecVT.getVectorElementType();
13860
13861 // Promote the scalar result type early to avoid redundant zexts.
13863 StepVT = getTypeToTransformTo(*DAG.getContext(), StepVT);
13864
13865 SDValue VL =
13866 DAG.getElementCount(DL, StepVT, StepVecVT.getVectorElementCount());
13867 SDValue SplatVL = DAG.getSplat(StepVecVT, DL, VL);
13868 StepVec = DAG.getNode(ISD::SUB, DL, StepVecVT, SplatVL, StepVec);
13869 SDValue Zeroes = DAG.getConstant(0, DL, StepVecVT);
13870 SDValue Select = DAG.getSelect(DL, StepVecVT, Mask, StepVec, Zeroes);
13872 StepVecVT.getVectorElementType(), Select);
13873 SDValue Sub = DAG.getNode(ISD::SUB, DL, StepVT, VL,
13874 DAG.getZExtOrTrunc(Max, DL, StepVT));
13875
13876 return DAG.getZExtOrTrunc(Sub, DL, VT);
13877}
13878
13880 SDLoc DL(N);
13881 SDValue Source = N->getOperand(0);
13882 SDValue Needle = N->getOperand(1);
13883 SDValue Mask = N->getOperand(2);
13884 EVT SourceVT = Source.getValueType();
13885 EVT NeedleVT = Needle.getValueType();
13886 EVT ResVT = N->getValueType(0);
13887 EVT CmpVT =
13888 getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), SourceVT);
13889
13890 assert(NeedleVT.isFixedLengthVector() && "Needle must be a fixed vector");
13891
13892 SDValue Ret = DAG.getConstant(0, DL, CmpVT);
13893 EVT NeedleEltVT = NeedleVT.getVectorElementType();
13894 for (unsigned I = 0, E = NeedleVT.getVectorNumElements(); I != E; ++I) {
13895 SDValue Splat;
13896 if (NeedleVT == SourceVT) {
13897 // Prefer a shuffle over scalar extracts + splat for fixed vectors.
13898 Splat = DAG.getVectorShuffle(
13899 SourceVT, DL, Needle, DAG.getUNDEF(SourceVT),
13901 } else {
13902 SDValue NeedleElt = DAG.getExtractVectorElt(DL, NeedleEltVT, Needle, I);
13903 Splat = DAG.getNode(ISD::SPLAT_VECTOR, DL, SourceVT, NeedleElt);
13904 }
13905 SDValue Cmp = DAG.getSetCC(DL, CmpVT, Source, Splat, ISD::SETEQ);
13906 Ret = DAG.getNode(ISD::OR, DL, CmpVT, Ret, Cmp);
13907 }
13908
13909 EVT UseVT = ResVT;
13910 // If the result is immediately truncated, only extend to that type (to avoid
13911 // unnecessary sign/zero extends).
13912 if (N->hasOneUse() && N->user_begin()->getOpcode() == ISD::TRUNCATE)
13913 UseVT = N->user_begin()->getValueType(0);
13914
13915 Mask = DAG.getBoolExtOrTrunc(Mask, DL, UseVT, Mask.getValueType());
13916 Ret = DAG.getBoolExtOrTrunc(Ret, DL, UseVT, Ret.getValueType());
13917
13918 Ret = DAG.getNode(ISD::AND, DL, UseVT, Ret, Mask);
13919 if (UseVT != ResVT)
13920 Ret = DAG.getNode(ISD::ANY_EXTEND, DL, ResVT, Ret);
13921 return Ret;
13922}
13923
13925 SelectionDAG &DAG) const {
13926 SDLoc DL(N);
13927 SDValue Acc = N->getOperand(0);
13928 SDValue MulLHS = N->getOperand(1);
13929 SDValue MulRHS = N->getOperand(2);
13930 EVT AccVT = Acc.getValueType();
13931 EVT MulOpVT = MulLHS.getValueType();
13932
13933 EVT ExtMulOpVT =
13935 MulOpVT.getVectorElementCount());
13936
13937 unsigned ExtOpcLHS, ExtOpcRHS;
13938 switch (N->getOpcode()) {
13939 default:
13940 llvm_unreachable("Unexpected opcode");
13942 ExtOpcLHS = ExtOpcRHS = ISD::ZERO_EXTEND;
13943 break;
13945 ExtOpcLHS = ExtOpcRHS = ISD::SIGN_EXTEND;
13946 break;
13948 ExtOpcLHS = ISD::SIGN_EXTEND;
13949 ExtOpcRHS = ISD::ZERO_EXTEND;
13950 break;
13952 ExtOpcLHS = ExtOpcRHS = ISD::FP_EXTEND;
13953 break;
13954 }
13955
13956 if (ExtMulOpVT != MulOpVT) {
13957 MulLHS = DAG.getNode(ExtOpcLHS, DL, ExtMulOpVT, MulLHS);
13958 MulRHS = DAG.getNode(ExtOpcRHS, DL, ExtMulOpVT, MulRHS);
13959 }
13960 SDValue Input = MulLHS;
13961 if (N->getOpcode() == ISD::PARTIAL_REDUCE_FMLA) {
13962 if (!llvm::isOneOrOneSplatFP(MulRHS))
13963 Input = DAG.getNode(ISD::FMUL, DL, ExtMulOpVT, MulLHS, MulRHS);
13964 } else if (!llvm::isOneOrOneSplat(MulRHS)) {
13965 Input = DAG.getNode(ISD::MUL, DL, ExtMulOpVT, MulLHS, MulRHS);
13966 }
13967
13968 unsigned Stride = AccVT.getVectorMinNumElements();
13969 unsigned ScaleFactor = MulOpVT.getVectorMinNumElements() / Stride;
13970
13971 // Collect all of the subvectors
13972 std::deque<SDValue> Subvectors = {Acc};
13973 for (unsigned I = 0; I < ScaleFactor; I++)
13974 Subvectors.push_back(DAG.getExtractSubvector(DL, AccVT, Input, I * Stride));
13975
13976 unsigned FlatNode =
13977 N->getOpcode() == ISD::PARTIAL_REDUCE_FMLA ? ISD::FADD : ISD::ADD;
13978
13979 // Flatten the subvector tree
13980 while (Subvectors.size() > 1) {
13981 Subvectors.push_back(
13982 DAG.getNode(FlatNode, DL, AccVT, {Subvectors[0], Subvectors[1]}));
13983 Subvectors.pop_front();
13984 Subvectors.pop_front();
13985 }
13986
13987 assert(Subvectors.size() == 1 &&
13988 "There should only be one subvector after tree flattening");
13989
13990 return Subvectors[0];
13991}
13992
13993/// Given a store node \p StoreNode, return true if it is safe to fold that node
13994/// into \p FPNode, which expands to a library call with output pointers.
13996 SDNode *FPNode) {
13998 SmallVector<const SDNode *, 8> DeferredNodes;
14000
14001 // Skip FPNode use by StoreNode (that's the use we want to fold into FPNode).
14002 for (SDValue Op : StoreNode->ops())
14003 if (Op.getNode() != FPNode)
14004 Worklist.push_back(Op.getNode());
14005
14007 while (!Worklist.empty()) {
14008 const SDNode *Node = Worklist.pop_back_val();
14009 auto [_, Inserted] = Visited.insert(Node);
14010 if (!Inserted)
14011 continue;
14012
14013 if (MaxSteps > 0 && Visited.size() >= MaxSteps)
14014 return false;
14015
14016 // Reached the FPNode (would result in a cycle).
14017 // OR Reached CALLSEQ_START (would result in nested call sequences).
14018 if (Node == FPNode || Node->getOpcode() == ISD::CALLSEQ_START)
14019 return false;
14020
14021 if (Node->getOpcode() == ISD::CALLSEQ_END) {
14022 // Defer looking into call sequences (so we can check we're outside one).
14023 // We still need to look through these for the predecessor check.
14024 DeferredNodes.push_back(Node);
14025 continue;
14026 }
14027
14028 for (SDValue Op : Node->ops())
14029 Worklist.push_back(Op.getNode());
14030 }
14031
14032 // True if we're outside a call sequence and don't have the FPNode as a
14033 // predecessor. No cycles or nested call sequences possible.
14034 return !SDNode::hasPredecessorHelper(FPNode, Visited, DeferredNodes,
14035 MaxSteps);
14036}
14037
14039 SelectionDAG &DAG, RTLIB::Libcall LC, SDNode *Node,
14041 std::optional<unsigned> CallRetResNo) const {
14042 if (LC == RTLIB::UNKNOWN_LIBCALL)
14043 return false;
14044
14045 RTLIB::LibcallImpl LibcallImpl = getLibcallImpl(LC);
14046 if (LibcallImpl == RTLIB::Unsupported)
14047 return false;
14048
14049 LLVMContext &Ctx = *DAG.getContext();
14050 EVT VT = Node->getValueType(0);
14051 unsigned NumResults = Node->getNumValues();
14052
14053 // Find users of the node that store the results (and share input chains). The
14054 // destination pointers can be used instead of creating stack allocations.
14055 SDValue StoresInChain;
14056 SmallVector<StoreSDNode *, 2> ResultStores(NumResults);
14057 for (SDNode *User : Node->users()) {
14059 continue;
14060 auto *ST = cast<StoreSDNode>(User);
14061 SDValue StoreValue = ST->getValue();
14062 unsigned ResNo = StoreValue.getResNo();
14063 // Ensure the store corresponds to an output pointer.
14064 if (CallRetResNo == ResNo)
14065 continue;
14066 // Ensure the store to the default address space and not atomic or volatile.
14067 if (!ST->isSimple() || ST->getAddressSpace() != 0)
14068 continue;
14069 // Ensure all store chains are the same (so they don't alias).
14070 if (StoresInChain && ST->getChain() != StoresInChain)
14071 continue;
14072 // Ensure the store is properly aligned.
14073 Type *StoreType = StoreValue.getValueType().getTypeForEVT(Ctx);
14074 if (ST->getAlign() <
14075 DAG.getDataLayout().getABITypeAlign(StoreType->getScalarType()))
14076 continue;
14077 // Avoid:
14078 // 1. Creating cyclic dependencies.
14079 // 2. Expanding the node to a call within a call sequence.
14081 continue;
14082 ResultStores[ResNo] = ST;
14083 StoresInChain = ST->getChain();
14084 }
14085
14086 ArgListTy Args;
14087
14088 // Pass the arguments.
14089 for (const SDValue &Op : Node->op_values()) {
14090 EVT ArgVT = Op.getValueType();
14091 Type *ArgTy = ArgVT.getTypeForEVT(Ctx);
14092 Args.emplace_back(Op, ArgTy);
14093 }
14094
14095 // Pass the output pointers.
14096 SmallVector<SDValue, 2> ResultPtrs(NumResults);
14098 for (auto [ResNo, ST] : llvm::enumerate(ResultStores)) {
14099 if (ResNo == CallRetResNo)
14100 continue;
14101 EVT ResVT = Node->getValueType(ResNo);
14102 SDValue ResultPtr = ST ? ST->getBasePtr() : DAG.CreateStackTemporary(ResVT);
14103 ResultPtrs[ResNo] = ResultPtr;
14104 Args.emplace_back(ResultPtr, PointerTy);
14105 }
14106
14107 SDLoc DL(Node);
14108
14110 // Pass the vector mask (if required).
14111 EVT MaskVT = getSetCCResultType(DAG.getDataLayout(), Ctx, VT);
14112 SDValue Mask = DAG.getBoolConstant(true, DL, MaskVT, VT);
14113 Args.emplace_back(Mask, MaskVT.getTypeForEVT(Ctx));
14114 }
14115
14116 Type *RetType = CallRetResNo.has_value()
14117 ? Node->getValueType(*CallRetResNo).getTypeForEVT(Ctx)
14118 : Type::getVoidTy(Ctx);
14119 SDValue InChain = StoresInChain ? StoresInChain : DAG.getEntryNode();
14120 SDValue Callee =
14121 DAG.getExternalSymbol(LibcallImpl, getPointerTy(DAG.getDataLayout()));
14123 CLI.setDebugLoc(DL).setChain(InChain).setLibCallee(
14124 getLibcallImplCallingConv(LibcallImpl), RetType, Callee, std::move(Args));
14125
14126 auto [Call, CallChain] = LowerCallTo(CLI);
14127
14128 for (auto [ResNo, ResultPtr] : llvm::enumerate(ResultPtrs)) {
14129 if (ResNo == CallRetResNo) {
14130 Results.push_back(Call);
14131 continue;
14132 }
14133 MachinePointerInfo PtrInfo;
14134 SDValue LoadResult = DAG.getLoad(Node->getValueType(ResNo), DL, CallChain,
14135 ResultPtr, PtrInfo);
14136 SDValue OutChain = LoadResult.getValue(1);
14137
14138 if (StoreSDNode *ST = ResultStores[ResNo]) {
14139 // Replace store with the library call.
14140 DAG.ReplaceAllUsesOfValueWith(SDValue(ST, 0), OutChain);
14141 PtrInfo = ST->getPointerInfo();
14142 } else {
14144 DAG.getMachineFunction(),
14145 cast<FrameIndexSDNode>(ResultPtr)->getIndex());
14146 }
14147
14148 Results.push_back(LoadResult);
14149 }
14150
14151 return true;
14152}
14153
14155 SDValue &LHS, SDValue &RHS,
14156 SDValue &CC, SDValue Mask,
14157 SDValue EVL, bool &NeedInvert,
14158 const SDLoc &dl, SDValue &Chain,
14159 bool IsSignaling) const {
14160 MVT OpVT = LHS.getSimpleValueType();
14161 ISD::CondCode CCCode = cast<CondCodeSDNode>(CC)->get();
14162 NeedInvert = false;
14163 assert(!EVL == !Mask && "VP Mask and EVL must either both be set or unset");
14164 bool IsNonVP = !EVL;
14165 switch (getCondCodeAction(CCCode, OpVT)) {
14166 default:
14167 llvm_unreachable("Unknown condition code action!");
14169 // Nothing to do.
14170 break;
14173 if (isCondCodeLegalOrCustom(InvCC, OpVT)) {
14174 std::swap(LHS, RHS);
14175 CC = DAG.getCondCode(InvCC);
14176 return true;
14177 }
14178 // Swapping operands didn't work. Try inverting the condition.
14179 bool NeedSwap = false;
14180 InvCC = getSetCCInverse(CCCode, OpVT);
14181 if (!isCondCodeLegalOrCustom(InvCC, OpVT)) {
14182 // If inverting the condition is not enough, try swapping operands
14183 // on top of it.
14184 InvCC = ISD::getSetCCSwappedOperands(InvCC);
14185 NeedSwap = true;
14186 }
14187 if (isCondCodeLegalOrCustom(InvCC, OpVT)) {
14188 CC = DAG.getCondCode(InvCC);
14189 NeedInvert = true;
14190 if (NeedSwap)
14191 std::swap(LHS, RHS);
14192 return true;
14193 }
14194
14195 // Special case: expand i1 comparisons using logical operations.
14196 if (OpVT == MVT::i1) {
14197 SDValue Ret;
14198 switch (CCCode) {
14199 default:
14200 llvm_unreachable("Unknown integer setcc!");
14201 case ISD::SETEQ: // X == Y --> ~(X ^ Y)
14202 Ret = DAG.getNOT(dl, DAG.getNode(ISD::XOR, dl, MVT::i1, LHS, RHS),
14203 MVT::i1);
14204 break;
14205 case ISD::SETNE: // X != Y --> (X ^ Y)
14206 Ret = DAG.getNode(ISD::XOR, dl, MVT::i1, LHS, RHS);
14207 break;
14208 case ISD::SETGT: // X >s Y --> X == 0 & Y == 1 --> ~X & Y
14209 case ISD::SETULT: // X <u Y --> X == 0 & Y == 1 --> ~X & Y
14210 Ret = DAG.getNode(ISD::AND, dl, MVT::i1, RHS,
14211 DAG.getNOT(dl, LHS, MVT::i1));
14212 break;
14213 case ISD::SETLT: // X <s Y --> X == 1 & Y == 0 --> ~Y & X
14214 case ISD::SETUGT: // X >u Y --> X == 1 & Y == 0 --> ~Y & X
14215 Ret = DAG.getNode(ISD::AND, dl, MVT::i1, LHS,
14216 DAG.getNOT(dl, RHS, MVT::i1));
14217 break;
14218 case ISD::SETULE: // X <=u Y --> X == 0 | Y == 1 --> ~X | Y
14219 case ISD::SETGE: // X >=s Y --> X == 0 | Y == 1 --> ~X | Y
14220 Ret = DAG.getNode(ISD::OR, dl, MVT::i1, RHS,
14221 DAG.getNOT(dl, LHS, MVT::i1));
14222 break;
14223 case ISD::SETUGE: // X >=u Y --> X == 1 | Y == 0 --> ~Y | X
14224 case ISD::SETLE: // X <=s Y --> X == 1 | Y == 0 --> ~Y | X
14225 Ret = DAG.getNode(ISD::OR, dl, MVT::i1, LHS,
14226 DAG.getNOT(dl, RHS, MVT::i1));
14227 break;
14228 }
14229
14230 LHS = DAG.getZExtOrTrunc(Ret, dl, VT);
14231 RHS = SDValue();
14232 CC = SDValue();
14233 return true;
14234 }
14235
14237 unsigned Opc = 0;
14238 switch (CCCode) {
14239 default:
14240 llvm_unreachable("Don't know how to expand this condition!");
14241 case ISD::SETUO:
14242 if (isCondCodeLegal(ISD::SETUNE, OpVT)) {
14243 CC1 = ISD::SETUNE;
14244 CC2 = ISD::SETUNE;
14245 Opc = ISD::OR;
14246 break;
14247 }
14249 "If SETUE is expanded, SETOEQ or SETUNE must be legal!");
14250 NeedInvert = true;
14251 [[fallthrough]];
14252 case ISD::SETO:
14254 "If SETO is expanded, SETOEQ must be legal!");
14255 CC1 = ISD::SETOEQ;
14256 CC2 = ISD::SETOEQ;
14257 Opc = ISD::AND;
14258 break;
14259 case ISD::SETONE:
14260 case ISD::SETUEQ:
14261 // If the SETUO or SETO CC isn't legal, we might be able to use
14262 // SETOGT || SETOLT, inverting the result for SETUEQ. We only need one
14263 // of SETOGT/SETOLT to be legal, the other can be emulated by swapping
14264 // the operands.
14265 CC2 = ((unsigned)CCCode & 0x8U) ? ISD::SETUO : ISD::SETO;
14266 if (!isCondCodeLegal(CC2, OpVT) && (isCondCodeLegal(ISD::SETOGT, OpVT) ||
14267 isCondCodeLegal(ISD::SETOLT, OpVT))) {
14268 CC1 = ISD::SETOGT;
14269 CC2 = ISD::SETOLT;
14270 Opc = ISD::OR;
14271 NeedInvert = ((unsigned)CCCode & 0x8U);
14272 break;
14273 }
14274 [[fallthrough]];
14275 case ISD::SETOEQ:
14276 case ISD::SETOGT:
14277 case ISD::SETOGE:
14278 case ISD::SETOLT:
14279 case ISD::SETOLE:
14280 case ISD::SETUNE:
14281 case ISD::SETUGT:
14282 case ISD::SETUGE:
14283 case ISD::SETULT:
14284 case ISD::SETULE:
14285 // If we are floating point, assign and break, otherwise fall through.
14286 if (!OpVT.isInteger()) {
14287 // We can use the 4th bit to tell if we are the unordered
14288 // or ordered version of the opcode.
14289 CC2 = ((unsigned)CCCode & 0x8U) ? ISD::SETUO : ISD::SETO;
14290 Opc = ((unsigned)CCCode & 0x8U) ? ISD::OR : ISD::AND;
14291 CC1 = (ISD::CondCode)(((int)CCCode & 0x7) | 0x10);
14292 break;
14293 }
14294 // Fallthrough if we are unsigned integer.
14295 [[fallthrough]];
14296 case ISD::SETLE:
14297 case ISD::SETGT:
14298 case ISD::SETGE:
14299 case ISD::SETLT:
14300 case ISD::SETNE:
14301 case ISD::SETEQ:
14302 // If all combinations of inverting the condition and swapping operands
14303 // didn't work then we have no means to expand the condition.
14304 llvm_unreachable("Don't know how to expand this condition!");
14305 }
14306
14307 SDValue SetCC1, SetCC2;
14308 if (CCCode != ISD::SETO && CCCode != ISD::SETUO) {
14309 // If we aren't the ordered or unorder operation,
14310 // then the pattern is (LHS CC1 RHS) Opc (LHS CC2 RHS).
14311 if (IsNonVP) {
14312 SetCC1 = DAG.getSetCC(dl, VT, LHS, RHS, CC1, Chain, IsSignaling);
14313 SetCC2 = DAG.getSetCC(dl, VT, LHS, RHS, CC2, Chain, IsSignaling);
14314 } else {
14315 SetCC1 = DAG.getSetCCVP(dl, VT, LHS, RHS, CC1, Mask, EVL);
14316 SetCC2 = DAG.getSetCCVP(dl, VT, LHS, RHS, CC2, Mask, EVL);
14317 }
14318 } else {
14319 // Otherwise, the pattern is (LHS CC1 LHS) Opc (RHS CC2 RHS)
14320 if (IsNonVP) {
14321 SetCC1 = DAG.getSetCC(dl, VT, LHS, LHS, CC1, Chain, IsSignaling);
14322 SetCC2 = DAG.getSetCC(dl, VT, RHS, RHS, CC2, Chain, IsSignaling);
14323 } else {
14324 SetCC1 = DAG.getSetCCVP(dl, VT, LHS, LHS, CC1, Mask, EVL);
14325 SetCC2 = DAG.getSetCCVP(dl, VT, RHS, RHS, CC2, Mask, EVL);
14326 }
14327 }
14328 if (Chain)
14329 Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, SetCC1.getValue(1),
14330 SetCC2.getValue(1));
14331 if (IsNonVP)
14332 LHS = DAG.getNode(Opc, dl, VT, SetCC1, SetCC2);
14333 else {
14334 // Transform the binary opcode to the VP equivalent.
14335 assert((Opc == ISD::OR || Opc == ISD::AND) && "Unexpected opcode");
14336 Opc = Opc == ISD::OR ? ISD::VP_OR : ISD::VP_AND;
14337 LHS = DAG.getNode(Opc, dl, VT, SetCC1, SetCC2, Mask, EVL);
14338 }
14339 RHS = SDValue();
14340 CC = SDValue();
14341 return true;
14342 }
14343 }
14344 return false;
14345}
14346
14348 SelectionDAG &DAG) const {
14349 EVT VT = Node->getValueType(0);
14350 // Despite its documentation, GetSplitDestVTs will assert if VT cannot be
14351 // split into two equal parts.
14352 if (!VT.isVector() || !VT.getVectorElementCount().isKnownMultipleOf(2))
14353 return SDValue();
14354
14355 // Restrict expansion to cases where both parts can be concatenated.
14356 auto [LoVT, HiVT] = DAG.GetSplitDestVTs(VT);
14357 if (LoVT != HiVT || !isTypeLegal(LoVT))
14358 return SDValue();
14359
14360 SDLoc DL(Node);
14361 unsigned Opcode = Node->getOpcode();
14362
14363 // Don't expand if the result is likely to be unrolled anyway.
14364 if (!isOperationLegalOrCustomOrPromote(Opcode, LoVT))
14365 return SDValue();
14366
14367 SmallVector<SDValue, 4> LoOps, HiOps;
14368 for (const SDValue &V : Node->op_values()) {
14369 if (!V.getValueType().isVector()) {
14370 // Scalar operands pass through to both halves unchanged.
14371 LoOps.push_back(V);
14372 HiOps.push_back(V);
14373 continue;
14374 }
14375 auto [Lo, Hi] = DAG.SplitVector(V, DL, LoVT, HiVT);
14376 LoOps.push_back(Lo);
14377 HiOps.push_back(Hi);
14378 }
14379
14380 SDValue SplitOpLo = DAG.getNode(Opcode, DL, LoVT, LoOps, Node->getFlags());
14381 SDValue SplitOpHi = DAG.getNode(Opcode, DL, HiVT, HiOps, Node->getFlags());
14382 return DAG.getNode(ISD::CONCAT_VECTORS, DL, VT, SplitOpLo, SplitOpHi);
14383}
14384
14386 const SDLoc &DL,
14387 EVT InVecVT, SDValue EltNo,
14388 LoadSDNode *OriginalLoad,
14389 SelectionDAG &DAG) const {
14390 assert(OriginalLoad->isSimple());
14391
14392 EVT VecEltVT = InVecVT.getVectorElementType();
14393
14394 // If the vector element type is not a multiple of a byte then we are unable
14395 // to correctly compute an address to load only the extracted element as a
14396 // scalar.
14397 if (!VecEltVT.isByteSized())
14398 return SDValue();
14399
14400 ISD::LoadExtType ExtTy =
14401 ResultVT.bitsGT(VecEltVT) ? ISD::EXTLOAD : ISD::NON_EXTLOAD;
14402 if (!isOperationLegalOrCustom(ISD::LOAD, VecEltVT))
14403 return SDValue();
14404
14405 std::optional<unsigned> ByteOffset;
14406 Align Alignment = OriginalLoad->getAlign();
14408 if (auto *ConstEltNo = dyn_cast<ConstantSDNode>(EltNo)) {
14409 int Elt = ConstEltNo->getZExtValue();
14410 ByteOffset = VecEltVT.getSizeInBits() * Elt / 8;
14411 MPI = OriginalLoad->getPointerInfo().getWithOffset(*ByteOffset);
14412 Alignment = commonAlignment(Alignment, *ByteOffset);
14413 } else {
14414 // Discard the pointer info except the address space because the memory
14415 // operand can't represent this new access since the offset is variable.
14416 MPI = MachinePointerInfo(OriginalLoad->getPointerInfo().getAddrSpace());
14417 Alignment = commonAlignment(Alignment, VecEltVT.getSizeInBits() / 8);
14418 }
14419
14420 if (!shouldReduceLoadWidth(OriginalLoad, ExtTy, VecEltVT, ByteOffset))
14421 return SDValue();
14422
14423 unsigned IsFast = 0;
14424 if (!allowsMemoryAccess(*DAG.getContext(), DAG.getDataLayout(), VecEltVT,
14425 OriginalLoad->getAddressSpace(), Alignment,
14426 OriginalLoad->getMemOperand()->getFlags(), &IsFast) ||
14427 !IsFast)
14428 return SDValue();
14429
14430 // The original DAG loaded the entire vector from memory, so arithmetic
14431 // within it must be inbounds.
14433 DAG, OriginalLoad->getBasePtr(), InVecVT, EltNo);
14434
14435 // We are replacing a vector load with a scalar load. The new load must have
14436 // identical memory op ordering to the original.
14437 SDValue Load;
14438 if (ResultVT.bitsGT(VecEltVT)) {
14439 // If the result type of vextract is wider than the load, then issue an
14440 // extending load instead.
14441 ISD::LoadExtType ExtType =
14442 isLoadLegal(ResultVT, VecEltVT, Alignment,
14443 OriginalLoad->getAddressSpace(), ISD::ZEXTLOAD, false)
14445 : ISD::EXTLOAD;
14446 Load = DAG.getExtLoad(ExtType, DL, ResultVT, OriginalLoad->getChain(),
14447 NewPtr, MPI, VecEltVT, Alignment,
14448 OriginalLoad->getMemOperand()->getFlags(),
14449 OriginalLoad->getAAInfo());
14450 DAG.makeEquivalentMemoryOrdering(OriginalLoad, Load);
14451 } else {
14452 // The result type is narrower or the same width as the vector element
14453 Load = DAG.getLoad(VecEltVT, DL, OriginalLoad->getChain(), NewPtr, MPI,
14454 Alignment, OriginalLoad->getMemOperand()->getFlags(),
14455 OriginalLoad->getAAInfo());
14456 DAG.makeEquivalentMemoryOrdering(OriginalLoad, Load);
14457 if (ResultVT.bitsLT(VecEltVT))
14458 Load = DAG.getNode(ISD::TRUNCATE, DL, ResultVT, Load);
14459 else
14460 Load = DAG.getBitcast(ResultVT, Load);
14461 }
14462
14463 return Load;
14464}
14465
14466// Set type id for call site info and metadata 'call_target'.
14467// We are filtering for:
14468// a) The call-graph-section use case that wants to know about indirect
14469// calls, or
14470// b) We want to annotate indirect calls.
14472 const CallBase *CB, MachineFunction &MF,
14473 MachineFunction::CallSiteInfo &CSInfo) const {
14474 if (CB && CB->isIndirectCall() &&
14477 CSInfo = MachineFunction::CallSiteInfo(*CB);
14478}
return SDValue()
unsigned RegSize
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
constexpr LLT F32
AMDGPU Register Bank Select
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
Function Alias Analysis Results
#define X(NUM, ENUM, NAME)
Definition ELF.h:856
block Block Frequency Analysis
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static std::optional< bool > isBigEndian(const SmallDenseMap< int64_t, int64_t, 8 > &MemOffset2Idx, int64_t LowestIdx)
Given a map from byte offsets in memory to indices in a load/store, determine if that map corresponds...
static bool isSigned(unsigned Opcode)
#define _
static bool ShrinkDemandedConstant(Instruction *I, unsigned OpNo, const APInt &Demanded)
Check to see if the specified operand of the specified instruction is a constant integer.
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
#define RegName(no)
lazy value info
static bool isNonZeroModBitWidthOrUndef(const MachineRegisterInfo &MRI, Register Reg, unsigned BW)
static bool isZero(Value *V, const DataLayout &DL, DominatorTree *DT, AssumptionCache *AC)
Definition Lint.cpp:539
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
#define G(x, y, z)
Definition MD5.cpp:55
static bool isUndef(const MachineInstr &MI)
Register const TargetRegisterInfo * TRI
#define T
#define T1
uint64_t High
#define P(N)
Function const char * Passes
if(auto Err=PB.parsePassPipeline(MPM, Passes)) return wrap(std MPM run * Mod
R600 Clause Merge
const SmallVectorImpl< MachineOperand > & Cond
Contains matchers for matching SelectionDAG nodes and values.
This file contains some templates that are useful if you are working with the STL at all.
static cl::opt< unsigned > MaxSteps("has-predecessor-max-steps", cl::Hidden, cl::init(8192), cl::desc("DAG combiner limit number of steps when searching DAG " "for predecessor nodes"))
static TableGen::Emitter::Opt Y("gen-skeleton-entry", EmitSkeleton, "Generate example skeleton entry")
static std::pair< SDValue, SDValue > getLegalMaskAndStepVector(SDValue Mask, bool ZeroIsPoison, SDLoc DL, SelectionDAG &DAG)
Returns a type-legalized version of Mask as the first item in the pair.
static SDValue foldSetCCWithFunnelShift(EVT VT, SDValue N0, SDValue N1, ISD::CondCode Cond, const SDLoc &dl, SelectionDAG &DAG)
static bool lowerImmediateIfPossible(TargetLowering::ConstraintPair &P, SDValue Op, SelectionDAG *DAG, const TargetLowering &TLI)
If we have an immediate, see if we can lower it.
#define FP_CMP_LIBCALL(BASE)
static SDValue expandVPFunnelShift(SDNode *Node, SelectionDAG &DAG)
static APInt getKnownUndefForVectorBinop(SDValue BO, SelectionDAG &DAG, const APInt &UndefOp0, const APInt &UndefOp1)
Given a vector binary operation and known undefined elements for each input operand,...
static SDValue BuildExactUDIV(const TargetLowering &TLI, SDNode *N, const SDLoc &dl, SelectionDAG &DAG, SmallVectorImpl< SDNode * > &Created)
Given an exact UDIV by a constant, create a multiplication with the multiplicative inverse of the con...
static std::pair< RTLIB::Libcall, ISD::CondCode > selectFPCmpLibcall(const LibcallLoweringInfo &Libcalls, RTLIB::Libcall BoolLC, RTLIB::Libcall TriStateLC, RTLIB::Libcall GenericLC, ISD::CondCode TriStateCC)
Select the libcall and the condition code to test its result against 0 for an ordered floating-point ...
static SDValue isSpecificZeroAfterMaybeRounding(SelectionDAG &DAG, const TargetLowering &TLI, const SDLoc &DL, SDValue Val, FPClassTest FPClass)
static bool canNarrowCLMULToLegal(const TargetLowering &TLI, LLVMContext &Ctx, EVT VT, unsigned HalveDepth=0, unsigned TotalDepth=0)
Check if CLMUL on VT can eventually reach a type with legal CLMUL through a chain of halving decompos...
static SDValue clampDynamicVectorIndex(SelectionDAG &DAG, SDValue Idx, EVT VecVT, const SDLoc &dl, ElementCount SubEC)
static unsigned getConstraintPiority(TargetLowering::ConstraintType CT)
Return a number indicating our preference for chosing a type of constraint over another,...
static std::optional< bool > isFCmpEqualZero(FPClassTest Test, const fltSemantics &Semantics, const MachineFunction &MF)
Returns a true value if if this FPClassTest can be performed with an ordered fcmp to 0,...
static bool canFoldStoreIntoLibCallOutputPointers(StoreSDNode *StoreNode, SDNode *FPNode)
Given a store node StoreNode, return true if it is safe to fold that node into FPNode,...
static void turnVectorIntoSplatVector(MutableArrayRef< SDValue > Values, std::function< bool(SDValue)> Predicate, SDValue AlternativeReplacement=SDValue())
If all values in Values that don't match the predicate are same 'splat' value, then replace all value...
static bool canExpandVectorCTPOP(const TargetLowering &TLI, EVT VT)
static SDValue foldSetCCWithRotate(EVT VT, SDValue N0, SDValue N1, ISD::CondCode Cond, const SDLoc &dl, SelectionDAG &DAG)
static SDValue BuildExactSDIV(const TargetLowering &TLI, SDNode *N, const SDLoc &dl, SelectionDAG &DAG, SmallVectorImpl< SDNode * > &Created)
Given an exact SDIV by a constant, create a multiplication with the multiplicative inverse of the con...
static SDValue simplifySetCCWithCTPOP(const TargetLowering &TLI, EVT VT, SDValue N0, const APInt &C1, ISD::CondCode Cond, const SDLoc &dl, SelectionDAG &DAG)
static SDValue combineShiftToAVG(SDValue Op, TargetLowering::TargetLoweringOpt &TLO, const TargetLowering &TLI, const APInt &DemandedBits, const APInt &DemandedElts, unsigned Depth)
This file describes how to lower LLVM code to machine code.
static int Lookup(ArrayRef< TableEntry > Table, unsigned Opcode)
static SDValue scalarizeVectorStore(StoreSDNode *Store, MVT StoreVT, SelectionDAG &DAG)
Scalarize a vector store, bitcasting to TargetVT to determine the scalar type.
Value * RHS
Value * LHS
The Input class is used to parse a yaml document into in-memory structs and vectors.
static LLVM_ABI const llvm::fltSemantics & EnumToSemantics(Semantics S)
Definition APFloat.cpp:134
static constexpr roundingMode rmTowardZero
Definition APFloat.h:357
static LLVM_ABI ExponentType semanticsMinExponent(const fltSemantics &)
Definition APFloat.cpp:262
static LLVM_ABI unsigned getSizeInBits(const fltSemantics &Sem)
Returns the size of the floating point number (in bits) in the given semantics.
Definition APFloat.cpp:318
static constexpr roundingMode rmNearestTiesToEven
Definition APFloat.h:353
static LLVM_ABI unsigned int semanticsPrecision(const fltSemantics &)
Definition APFloat.cpp:254
static LLVM_ABI bool isIEEELikeFP(const fltSemantics &)
Definition APFloat.cpp:295
opStatus
IEEE-754R 7: Default exception handling.
Definition APFloat.h:369
opStatus convertFromAPInt(const APInt &Input, bool IsSigned, roundingMode RM)
Definition APFloat.h:1443
static APFloat getSmallestNormalized(const fltSemantics &Sem, bool Negative=false)
Returns the smallest (by magnitude) normalized finite number in the given semantics.
Definition APFloat.h:1254
APInt bitcastToAPInt() const
Definition APFloat.h:1467
static APFloat getLargest(const fltSemantics &Sem, bool Negative=false)
Returns the largest finite number in the given semantics.
Definition APFloat.h:1234
static APFloat getInf(const fltSemantics &Sem, bool Negative=false)
Factory for Positive and Negative Infinity.
Definition APFloat.h:1194
void changeSign()
Definition APFloat.h:1393
static APFloat getNaN(const fltSemantics &Sem, bool Negative=false, uint64_t payload=0)
Factory for NaN values.
Definition APFloat.h:1205
Class for arbitrary precision integers.
Definition APInt.h:78
LLVM_ABI APInt udiv(const APInt &RHS) const
Unsigned division operation.
Definition APInt.cpp:1599
static APInt getAllOnes(unsigned numBits)
Return an APInt of a specified width with all bits set.
Definition APInt.h:235
static LLVM_ABI void udivrem(const APInt &LHS, const APInt &RHS, APInt &Quotient, APInt &Remainder)
Dual division/remainder interface.
Definition APInt.cpp:1793
void clearBit(unsigned BitPosition)
Set a given bit to 0.
Definition APInt.h:1431
bool isNegatedPowerOf2() const
Check if this APInt's negated value is a power of two greater than zero.
Definition APInt.h:450
LLVM_ABI APInt zext(unsigned width) const
Zero extend to a new width.
Definition APInt.cpp:1055
static APInt getSignMask(unsigned BitWidth)
Get the SignMask for a specific bit width.
Definition APInt.h:230
bool isMinSignedValue() const
Determine if this is the smallest signed value.
Definition APInt.h:424
uint64_t getZExtValue() const
Get zero extended value.
Definition APInt.h:1565
void setHighBits(unsigned hiBits)
Set the top hiBits bits.
Definition APInt.h:1416
LLVM_ABI APInt zextOrTrunc(unsigned width) const
Zero extend or truncate to width.
Definition APInt.cpp:1076
unsigned getActiveBits() const
Compute the number of active bits in the value.
Definition APInt.h:1537
LLVM_ABI APInt trunc(unsigned width) const
Truncate to new width.
Definition APInt.cpp:968
static APInt getMaxValue(unsigned numBits)
Gets maximum unsigned value of APInt for specific bit width.
Definition APInt.h:207
void setBit(unsigned BitPosition)
Set the given bit to 1 whose position is given as "bitPosition".
Definition APInt.h:1355
bool isAllOnes() const
Determine if all bits are set. This is true for zero-width values.
Definition APInt.h:372
bool ugt(const APInt &RHS) const
Unsigned greater than comparison.
Definition APInt.h:1191
static APInt getBitsSet(unsigned numBits, unsigned loBit, unsigned hiBit)
Get a value with a block of bits set.
Definition APInt.h:259
bool isZero() const
Determine if this value is zero, i.e. all bits are clear.
Definition APInt.h:381
LLVM_ABI APInt urem(const APInt &RHS) const
Unsigned remainder operation.
Definition APInt.cpp:1692
void setSignBit()
Set the sign bit to 1.
Definition APInt.h:1365
unsigned getBitWidth() const
Return the number of bits in the APInt.
Definition APInt.h:1513
static APInt getSignedMaxValue(unsigned numBits)
Gets maximum signed value of APInt for a specific bit width.
Definition APInt.h:210
static APInt getMinValue(unsigned numBits)
Gets minimum unsigned value of APInt for a specific bit width.
Definition APInt.h:217
bool isNegative() const
Determine sign of this APInt.
Definition APInt.h:330
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:1258
void clearAllBits()
Set every bit to 0.
Definition APInt.h:1421
void ashrInPlace(unsigned ShiftAmt)
Arithmetic right-shift this APInt by ShiftAmt in place.
Definition APInt.h:841
LLVM_ABI APInt uadd_ov(const APInt &RHS, bool &Overflow) const
Definition APInt.cpp:1970
void negate()
Negate this APInt in place.
Definition APInt.h:1493
unsigned countr_zero() const
Count the number of trailing zero bits.
Definition APInt.h:1664
unsigned countl_zero() const
The APInt version of std::countl_zero.
Definition APInt.h:1623
static LLVM_ABI APInt getSplat(unsigned NewLen, const APInt &V)
Return a value containing V broadcasted over NewLen bits.
Definition APInt.cpp:652
static APInt getSignedMinValue(unsigned numBits)
Gets minimum signed value of APInt for a specific bit width.
Definition APInt.h:220
unsigned getSignificantBits() const
Get the minimum bit size for this signed APInt.
Definition APInt.h:1556
unsigned countLeadingZeros() const
Definition APInt.h:1631
bool isStrictlyPositive() const
Determine if this APInt Value is positive.
Definition APInt.h:357
LLVM_ABI void insertBits(const APInt &SubBits, unsigned bitPosition)
Insert the bits from a smaller APInt starting at bitPosition.
Definition APInt.cpp:398
void clearLowBits(unsigned loBits)
Set bottom loBits bits to 0.
Definition APInt.h:1460
unsigned logBase2() const
Definition APInt.h:1786
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:476
APInt ashr(unsigned ShiftAmt) const
Arithmetic right-shift function.
Definition APInt.h:834
void setAllBits()
Set every bit to 1.
Definition APInt.h:1344
LLVM_ABI APInt multiplicativeInverse() const
Definition APInt.cpp:1300
bool isMaxSignedValue() const
Determine if this is the largest signed value.
Definition APInt.h:406
bool isNonNegative() const
Determine if this APInt Value is non-negative (>= 0)
Definition APInt.h:335
bool ule(const APInt &RHS) const
Unsigned less or equal comparison.
Definition APInt.h:1159
LLVM_ABI APInt sext(unsigned width) const
Sign extend to a new width.
Definition APInt.cpp:1028
void setBits(unsigned loBit, unsigned hiBit)
Set the bits from loBit (inclusive) to hiBit (exclusive) to 1.
Definition APInt.h:1392
APInt shl(unsigned shiftAmt) const
Left-shift function.
Definition APInt.h:880
bool isSubsetOf(const APInt &RHS) const
This operation checks that all bits set in this APInt are also set in RHS.
Definition APInt.h:1266
bool isPowerOf2() const
Check if this APInt's value is a power of two greater than zero.
Definition APInt.h:441
static APInt getLowBitsSet(unsigned numBits, unsigned loBitsSet)
Constructs an APInt value that has the bottom loBitsSet bits set.
Definition APInt.h:307
void clearBits(unsigned LoBit, unsigned HiBit)
Clear the bits from LoBit (inclusive) to HiBit (exclusive) to 0.
Definition APInt.h:1442
static APInt getHighBitsSet(unsigned numBits, unsigned hiBitsSet)
Constructs an APInt value that has the top hiBitsSet bits set.
Definition APInt.h:297
static APInt getZero(unsigned numBits)
Get the '0' value for the specified bit-width.
Definition APInt.h:201
void setLowBits(unsigned loBits)
Set the bottom loBits bits.
Definition APInt.h:1413
LLVM_ABI APInt extractBits(unsigned numBits, unsigned bitPosition) const
Return an APInt with the extracted bits [bitPosition,bitPosition+numBits).
Definition APInt.cpp:483
bool isOne() const
Determine if this is a value of 1.
Definition APInt.h:390
static APInt getBitsSetFrom(unsigned numBits, unsigned loBit)
Constructs an APInt value that has a contiguous range of bits set.
Definition APInt.h:287
static APInt getOneBitSet(unsigned numBits, unsigned BitNo)
Return an APInt with exactly one bit set in the result.
Definition APInt.h:240
void clearHighBits(unsigned hiBits)
Set top hiBits bits to 0.
Definition APInt.h:1467
int64_t getSExtValue() const
Get sign extended value.
Definition APInt.h:1587
void lshrInPlace(unsigned ShiftAmt)
Logical right-shift this APInt by ShiftAmt in place.
Definition APInt.h:865
APInt lshr(unsigned shiftAmt) const
Logical right-shift function.
Definition APInt.h:858
unsigned countr_one() const
Count the number of trailing one bits.
Definition APInt.h:1681
bool uge(const APInt &RHS) const
Unsigned greater or equal comparison.
Definition APInt.h:1230
void setBitVal(unsigned BitPosition, bool BitValue)
Set a given bit to a given value.
Definition APInt.h:1368
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
size_t size() const
Get the array size.
Definition ArrayRef.h:141
A "pseudo-class" with methods for operating on BUILD_VECTORs.
LLVM_ABI ConstantSDNode * getConstantSplatNode(const APInt &DemandedElts, BitVector *UndefElements=nullptr) const
Returns the demanded splatted constant or null if this is not a constant splat.
CCValAssign - Represent assignment of one arg/retval to a location.
Register getLocReg() const
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
LLVM_ABI bool isIndirectCall() const
Return true if the callsite is an indirect call.
This class represents a function call, abstracting a target machine's calling convention.
static Constant * get(LLVMContext &Context, ArrayRef< ElementTy > Elts)
get() constructor - Return a constant with array type with an element count and element type matching...
Definition Constants.h:878
ConstantFP - Floating Point Values [float, double].
Definition Constants.h:420
This class represents a range of values.
const APInt & getAPIntValue() const
This is an important base class in LLVM.
Definition Constant.h:43
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
bool isLittleEndian() const
Layout endianness...
Definition DataLayout.h:217
LLVM_ABI Align getABITypeAlign(Type *Ty) const
Returns the minimum ABI-required alignment for the specified type.
LLVM_ABI Align getPrefTypeAlign(Type *Ty) const
Returns the preferred stack/global alignment for the specified type.
static constexpr ElementCount getFixed(ScalarTy MinVal)
Definition TypeSize.h:309
static constexpr ElementCount get(ScalarTy MinVal, bool Scalable)
Definition TypeSize.h:315
AttributeList getAttributes() const
Return the attribute list for this Function.
Definition Function.h:328
const GlobalValue * getGlobal() const
Module * getParent()
Get the module that this global value is contained inside of...
std::vector< std::string > ConstraintCodeVector
Definition InlineAsm.h:104
static LLVM_ABI IntegerType * get(LLVMContext &C, unsigned NumBits)
This static method is the primary way of constructing an IntegerType.
Definition Type.cpp:348
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:68
LLVM_ABI void emitError(const Instruction *I, const Twine &ErrorStr)
emitError - Emit an error message to the currently installed error handler with optional location inf...
Tracks which library functions to use for a particular subtarget.
RTLIB::LibcallImpl getLibcallImpl(RTLIB::Libcall Call) const
Return the lowering's selection of implementation call for Call.
This class is used to represent ISD::LOAD nodes.
const SDValue & getBasePtr() const
Context object for machine code objects.
Definition MCContext.h:83
Base class for the full range of assembler expressions which are needed for parsing.
Definition MCExpr.h:34
iterator_range< regclass_iterator > regclasses() const
Wrapper class representing physical registers. Should be passed by value.
Definition MCRegister.h:41
static const MCSymbolRefExpr * create(const MCSymbol *Symbol, MCContext &Ctx, SMLoc Loc=SMLoc())
Definition MCExpr.h:213
Machine Value Type.
SimpleValueType SimpleTy
bool isInteger() const
Return true if this is an integer or a vector integer type.
TypeSize getSizeInBits() const
Returns the size of the specified MVT in bits.
static MVT getIntegerVT(unsigned BitWidth)
MVT getScalarType() const
If this is a vector, return the element type, otherwise return this.
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted.
MachineFrameInfo & getFrameInfo()
getFrameInfo - Return the frame info object for the current function.
DenormalMode getDenormalMode(const fltSemantics &FPType) const
Returns the denormal handling type for the default rounding mode of the function.
MCSymbol * getJTISymbol(unsigned JTI, MCContext &Ctx, bool isLinkerPrivate=false) const
getJTISymbol - Return the MCSymbol for the specified non-empty jump table.
Function & getFunction()
Return the LLVM function that this machine code represents.
const TargetMachine & getTarget() const
getTarget - Return the target machine this machine code is compiled with
@ EK_LabelDifference32
EK_LabelDifference32 - Each entry is the address of the block minus the address of the jump table.
@ EK_BlockAddress
EK_BlockAddress - Each entry is a plain address of block, e.g.: .word LBB123.
Flags getFlags() const
Return the raw flags of the source value,.
static bool clobbersPhysReg(const uint32_t *RegMask, MCRegister PhysReg)
clobbersPhysReg - Returns true if this RegMask clobbers PhysReg.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
LLVM_ABI MCRegister getLiveInPhysReg(Register VReg) const
getLiveInPhysReg - If VReg is a live-in virtual register, return the corresponding live-in physical r...
unsigned getAddressSpace() const
Return the address space for the associated pointer.
Align getAlign() const
AAMDNodes getAAInfo() const
Returns the AA info that describes the dereference.
bool isSimple() const
Returns true if the memory operation is neither atomic or volatile.
MachineMemOperand * getMemOperand() const
Return the unique MachineMemOperand object describing the memory reference performed by operation.
const MachinePointerInfo & getPointerInfo() const
const SDValue & getChain() const
const GlobalVariable * getNamedGlobal(StringRef Name) const
Return the global variable in the module with the specified name, of arbitrary type.
Definition Module.h:521
Represent a mutable reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:294
Class to represent pointers.
static PointerType * getUnqual(LLVMContext &C)
This constructs an opaque pointer to an object in the default address space (address space zero).
static LLVM_ABI PointerType * get(LLVMContext &C, unsigned AddressSpace)
This constructs an opaque pointer to an object in a numbered address space.
Definition Type.cpp:911
Wrapper class representing virtual and physical registers.
Definition Register.h:20
Wrapper class for IR location info (IR ordering and DebugLoc) to be passed into SDNode creation funct...
Represents one node in the SelectionDAG.
ArrayRef< SDUse > ops() const
unsigned getOpcode() const
Return the SelectionDAG opcode value for this node.
bool hasOneUse() const
Return true if there is exactly one use of this node.
SDNodeFlags getFlags() const
static bool hasPredecessorHelper(const SDNode *N, SmallPtrSetImpl< const SDNode * > &Visited, SmallVectorImpl< const SDNode * > &Worklist, unsigned int MaxSteps=0, bool TopologicalPrune=false)
Returns true if N is a predecessor of any node in Worklist.
const SDValue & getOperand(unsigned Num) const
EVT getValueType(unsigned ResNo) const
Return the type of a specified result.
Unlike LLVM values, Selection DAG nodes may return multiple values as the result of a computation.
bool isUndef() const
SDNode * getNode() const
get the SDNode which holds the desired result
bool hasOneUse() const
Return true if there is exactly one node using value ResNo of Node, in exactly one operand.
SDValue getValue(unsigned R) const
EVT getValueType() const
Return the ValueType of the referenced return value.
TypeSize getValueSizeInBits() const
Returns the size of the value in bits.
const SDValue & getOperand(unsigned i) const
bool use_empty() const
Return true if there are no nodes using value ResNo of Node.
const APInt & getConstantOperandAPInt(unsigned i) const
uint64_t getScalarValueSizeInBits() const
unsigned getResNo() const
get the index which selects a specific result in the SDNode
uint64_t getConstantOperandVal(unsigned i) const
MVT getSimpleValueType() const
Return the simple ValueType of the referenced return value.
unsigned getOpcode() const
This is used to represent a portion of an LLVM function in a low-level Data Dependence DAG representa...
LLVM_ABI SDValue getElementCount(const SDLoc &DL, EVT VT, ElementCount EC)
bool willNotOverflowAdd(bool IsSigned, SDValue N0, SDValue N1) const
Determine if the result of the addition of 2 nodes can never overflow.
LLVM_ABI Align getReducedAlign(EVT VT, bool UseABI)
In most cases this function returns the ABI alignment for a given type, except for illegal vector typ...
LLVM_ABI bool isKnownNeverLogicalZero(SDValue Op, const APInt &DemandedElts, unsigned Depth=0) const
Test whether the given floating point SDValue (or all elements of it, if it is a vector) is known to ...
SDValue getTargetGlobalAddress(const GlobalValue *GV, const SDLoc &DL, EVT VT, int64_t offset=0, unsigned TargetFlags=0)
SDValue getExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT, unsigned Opcode)
Convert Op, which must be of integer type, to the integer type VT, by either any/sign/zero-extending ...
SDValue getExtractVectorElt(const SDLoc &DL, EVT VT, SDValue Vec, unsigned Idx)
Extract element at Idx from Vec.
LLVM_ABI unsigned ComputeMaxSignificantBits(SDValue Op, unsigned Depth=0) const
Get the upper bound on bit size for this Value Op as a signed integer.
LLVM_ABI SDValue FoldSetCC(EVT VT, SDValue N1, SDValue N2, ISD::CondCode Cond, const SDLoc &dl, SDNodeFlags Flags={})
Constant fold a setcc to true or false.
bool isKnownNeverSNaN(SDValue Op, const APInt &DemandedElts, unsigned Depth=0) const
LLVM_ABI SDVTList getVTList(EVT VT)
Return an SDVTList that represents the list of values specified.
LLVM_ABI SDValue getShiftAmountConstant(uint64_t Val, EVT VT, const SDLoc &DL)
LLVM_ABI SDValue getAllOnesConstant(const SDLoc &DL, EVT VT, bool IsTarget=false, bool IsOpaque=false)
LLVM_ABI void ExtractVectorElements(SDValue Op, SmallVectorImpl< SDValue > &Args, unsigned Start=0, unsigned Count=0, EVT EltVT=EVT())
Append the extracted elements from Start to Count out of the vector Op in Args.
LLVM_ABI SDValue getFreeze(SDValue V)
Return a freeze using the SDLoc of the value operand.
LLVM_ABI SDValue getConstantPool(const Constant *C, EVT VT, MaybeAlign Align=std::nullopt, int Offs=0, bool isT=false, unsigned TargetFlags=0)
LLVM_ABI SDValue makeEquivalentMemoryOrdering(SDValue OldChain, SDValue NewMemOpChain)
If an existing load has uses of its chain, create a token factor node with that chain and the new mem...
LLVM_ABI bool isConstantIntBuildVectorOrConstantInt(SDValue N, bool AllowOpaques=true) const
Test whether the given value is a constant int or similar node.
LLVM_ABI SDValue getJumpTableDebugInfo(int JTI, SDValue Chain, const SDLoc &DL)
LLVM_ABI std::optional< unsigned > getValidMaximumShiftAmount(SDValue V, const APInt &DemandedElts, unsigned Depth=0) const
If a SHL/SRA/SRL node V has shift amounts that are all less than the element bit-width of the shift n...
LLVM_ABI SDValue UnrollVectorOp(SDNode *N, unsigned ResNE=0)
Utility function used by legalize and lowering to "unroll" a vector operation by splitting out the sc...
LLVM_ABI SDValue getVScale(const SDLoc &DL, EVT VT, APInt MulImm)
Return a node that represents the runtime scaling 'MulImm * RuntimeVL'.
LLVM_ABI SDValue getConstantFP(double Val, const SDLoc &DL, EVT VT, bool isTarget=false)
Create a ConstantFPSDNode wrapping a constant value.
static LLVM_ABI unsigned getHasPredecessorMaxSteps()
SDValue getExtractSubvector(const SDLoc &DL, EVT VT, SDValue Vec, unsigned Idx)
Return the VT typed sub-vector of Vec at Idx.
SDValue getInsertSubvector(const SDLoc &DL, SDValue Vec, SDValue SubVec, unsigned Idx)
Insert SubVec at the Idx element of Vec.
LLVM_ABI SDValue getStepVector(const SDLoc &DL, EVT ResVT, const APInt &StepVal)
Returns a vector of type ResVT whose elements contain the linear sequence <0, Step,...
SDValue getSetCC(const SDLoc &DL, EVT VT, SDValue LHS, SDValue RHS, ISD::CondCode Cond, SDValue Chain=SDValue(), bool IsSignaling=false, SDNodeFlags Flags={})
Helper function to make it easier to build SetCC's if you just have an ISD::CondCode instead of an SD...
bool willNotOverflowSub(bool IsSigned, SDValue N0, SDValue N1) const
Determine if the result of the sub of 2 nodes can never overflow.
LLVM_ABI bool shouldOptForSize() const
LLVM_ABI SDValue getNOT(const SDLoc &DL, SDValue Val, EVT VT)
Create a bitwise NOT operation as (XOR Val, -1).
const TargetLowering & getTargetLoweringInfo() const
static constexpr unsigned MaxRecursionDepth
LLVM_ABI std::pair< EVT, EVT > GetSplitDestVTs(const EVT &VT) const
Compute the VTs needed for the low/hi parts of a type which is split (or expanded) into two not neces...
SDValue getUNDEF(EVT VT)
Return an UNDEF node. UNDEF does not have a useful SDLoc.
SDValue getBuildVector(EVT VT, const SDLoc &DL, ArrayRef< SDValue > Ops)
Return an ISD::BUILD_VECTOR node.
LLVM_ABI SDValue getTruncStore(SDValue Chain, const SDLoc &dl, SDValue Val, SDValue Ptr, SDValue Offset, MachinePointerInfo PtrInfo, EVT SVT, Align Alignment, MachineMemOperand::Flags MMOFlags=MachineMemOperand::MONone, const MMOMetadata &Metadata=MMOMetadata())
LLVM_ABI SDValue getBitcast(EVT VT, SDValue V)
Return a bitcast using the SDLoc of the value operand, and casting to the provided type.
SDValue getSelect(const SDLoc &DL, EVT VT, SDValue Cond, SDValue LHS, SDValue RHS, SDNodeFlags Flags=SDNodeFlags())
Helper function to make it easier to build Select's if you just have operands and don't want to check...
LLVM_ABI SDValue getNegative(SDValue Val, const SDLoc &DL, EVT VT)
Create negative operation as (SUB 0, Val).
LLVM_ABI std::optional< unsigned > getValidShiftAmount(SDValue V, const APInt &DemandedElts, unsigned Depth=0) const
If a SHL/SRA/SRL node V has a uniform shift amount that is less than the element bit-width of the shi...
LLVM_ABI SDValue getZeroExtendInReg(SDValue Op, const SDLoc &DL, EVT VT)
Return the expression required to zero extend the Op value assuming it was the smaller SrcTy value.
const DataLayout & getDataLayout() const
LLVM_ABI SDValue getStore(SDValue Chain, const SDLoc &dl, SDValue Val, SDValue Ptr, MachinePointerInfo PtrInfo, Align Alignment, MachineMemOperand::Flags MMOFlags=MachineMemOperand::MONone, const MMOMetadata &Metadata=MMOMetadata())
Helper function to build ISD::STORE nodes.
LLVM_ABI bool doesNodeExist(unsigned Opcode, SDVTList VTList, ArrayRef< SDValue > Ops)
Check if a node exists without modifying its flags.
LLVM_ABI SDValue getConstant(uint64_t Val, const SDLoc &DL, EVT VT, bool isTarget=false, bool isOpaque=false)
Create a ConstantSDNode wrapping a constant value.
LLVM_ABI SDValue getMemBasePlusOffset(SDValue Base, TypeSize Offset, const SDLoc &DL, const SDNodeFlags Flags=SDNodeFlags())
Returns sum of the base pointer and offset.
LLVM_ABI SDValue getGlobalAddress(const GlobalValue *GV, const SDLoc &DL, EVT VT, int64_t offset=0, bool isTargetGA=false, unsigned TargetFlags=0)
LLVM_ABI SDValue getTypeSize(const SDLoc &DL, EVT VT, TypeSize TS)
LLVM_ABI SDValue getExtLoad(ISD::LoadExtType ExtType, const SDLoc &dl, EVT VT, SDValue Chain, SDValue Ptr, MachinePointerInfo PtrInfo, EVT MemVT, MaybeAlign Alignment=MaybeAlign(), MachineMemOperand::Flags MMOFlags=MachineMemOperand::MONone, const MMOMetadata &Metadata=MMOMetadata())
LLVM_ABI std::pair< SDValue, SDValue > SplitVector(const SDValue &N, const SDLoc &DL, const EVT &LoVT, const EVT &HiVT)
Split the vector with EXTRACT_SUBVECTOR using the provided VTs and return the low/high part.
LLVM_ABI SDValue getSignedConstant(int64_t Val, const SDLoc &DL, EVT VT, bool isTarget=false, bool isOpaque=false)
SDValue getSplatVector(EVT VT, const SDLoc &DL, SDValue Op)
LLVM_ABI bool SignBitIsZero(SDValue Op, unsigned Depth=0) const
Return true if the sign bit of Op is known to be zero.
LLVM_ABI void RemoveDeadNode(SDNode *N)
Remove the specified node from the system.
SDValue getSelectCC(const SDLoc &DL, SDValue LHS, SDValue RHS, SDValue True, SDValue False, ISD::CondCode Cond, SDNodeFlags Flags=SDNodeFlags())
Helper function to make it easier to build SelectCC's if you just have an ISD::CondCode instead of an...
LLVM_ABI SDValue getSExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of integer type, to the integer type VT, by either sign-extending or trunca...
LLVM_ABI SDValue getLoad(EVT VT, const SDLoc &dl, SDValue Chain, SDValue Ptr, MachinePointerInfo PtrInfo, MaybeAlign Alignment=MaybeAlign(), MachineMemOperand::Flags MMOFlags=MachineMemOperand::MONone, const MMOMetadata &Metadata=MMOMetadata())
Loads are not normal binary operators: their result type is not determined by their operands,...
LLVM_ABI bool isIdentityElement(unsigned Opc, SDNodeFlags Flags, SDValue V, unsigned OperandNo, unsigned Depth=0) const
Returns true if V is an identity element of Opc with Flags.
LLVM_ABI bool isGuaranteedNotToBeUndefOrPoison(SDValue Op, UndefPoisonKind Kind=UndefPoisonKind::UndefOrPoison, unsigned Depth=0) const
Return true if this function can prove that Op is never poison and, Kind can be used to track poison ...
LLVM_ABI bool isKnownNeverZero(SDValue Op, unsigned Depth=0) const
Test whether the given SDValue is known to contain non-zero value(s).
LLVM_ABI SDValue FoldConstantArithmetic(unsigned Opcode, const SDLoc &DL, EVT VT, ArrayRef< SDValue > Ops, SDNodeFlags Flags=SDNodeFlags())
LLVM_ABI SDValue getBoolExtOrTrunc(SDValue Op, const SDLoc &SL, EVT VT, EVT OpVT)
Convert Op, which must be of integer type, to the integer type VT, by using an extension appropriate ...
LLVM_ABI SDValue getExternalSymbol(const char *Sym, EVT VT)
const TargetMachine & getTarget() const
const LibcallLoweringInfo & getLibcalls() const
LLVM_ABI SDValue getIntPtrConstant(uint64_t Val, const SDLoc &DL, bool isTarget=false)
LLVM_ABI SDValue getValueType(EVT)
LLVM_ABI SDValue getNode(unsigned Opcode, const SDLoc &DL, EVT VT, ArrayRef< SDUse > Ops)
Gets or creates the specified node.
LLVM_ABI SDValue getFPExtendOrRound(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of float type, to the float type VT, by either extending or rounding (by tr...
LLVM_ABI bool isKnownNeverNaN(SDValue Op, const APInt &DemandedElts, bool SNaN=false, unsigned Depth=0) const
Test whether the given SDValue (or all elements of it, if it is a vector) is known to never be NaN in...
SDValue getTargetConstant(uint64_t Val, const SDLoc &DL, EVT VT, bool isOpaque=false)
LLVM_ABI unsigned ComputeNumSignBits(SDValue Op, unsigned Depth=0) const
Return the number of times the sign bit of the register is replicated into the other bits.
LLVM_ABI SDValue getBoolConstant(bool V, const SDLoc &DL, EVT VT, EVT OpVT)
Create a true or false constant of type VT using the target's BooleanContent for type OpVT.
SDValue getTargetBlockAddress(const BlockAddress *BA, EVT VT, int64_t Offset=0, unsigned TargetFlags=0)
LLVM_ABI SDValue getVectorIdxConstant(uint64_t Val, const SDLoc &DL, bool isTarget=false)
LLVM_ABI void ReplaceAllUsesOfValueWith(SDValue From, SDValue To)
Replace any uses of From with To, leaving uses of other values produced by From.getNode() alone.
MachineFunction & getMachineFunction() const
SDValue getPOISON(EVT VT)
Return a POISON node. POISON does not have a useful SDLoc.
LLVM_ABI KnownBits computeKnownBits(SDValue Op, unsigned Depth=0) const
Determine which bits of Op are known to be either zero or one and return them in Known.
LLVM_ABI SDValue getZExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of integer type, to the integer type VT, by either zero-extending or trunca...
LLVM_ABI SDValue getCondCode(ISD::CondCode Cond)
LLVM_ABI bool MaskedValueIsZero(SDValue Op, const APInt &Mask, unsigned Depth=0) const
Return true if 'Op & Mask' is known to be zero.
SDValue getObjectPtrOffset(const SDLoc &SL, SDValue Ptr, TypeSize Offset)
Create an add instruction with appropriate flags when used for addressing some offset of an object.
LLVMContext * getContext() const
LLVM_ABI bool isKnownToBeAPowerOfTwo(SDValue Val, bool OrZero=false, unsigned Depth=0) const
Test if the given value is known to have exactly one bit set.
SDValue getSetCCVP(const SDLoc &DL, EVT VT, SDValue LHS, SDValue RHS, ISD::CondCode Cond, SDValue Mask, SDValue EVL)
Helper function to make it easier to build VP_SETCCs if you just have an ISD::CondCode instead of an ...
LLVM_ABI SDValue CreateStackTemporary(TypeSize Bytes, Align Alignment)
Create a stack temporary based on the size in bytes and the alignment.
SDValue getEntryNode() const
Return the token chain corresponding to the entry of the function.
SDValue getSplat(EVT VT, const SDLoc &DL, SDValue Op)
Returns a node representing a splat of one value into all lanes of the provided vector type.
LLVM_ABI std::pair< SDValue, SDValue > SplitScalar(const SDValue &N, const SDLoc &DL, const EVT &LoVT, const EVT &HiVT)
Split the scalar node with EXTRACT_ELEMENT using the provided VTs and return the low/high part.
LLVM_ABI SDValue getVectorShuffle(EVT VT, const SDLoc &dl, SDValue N1, SDValue N2, ArrayRef< int > Mask)
Return an ISD::VECTOR_SHUFFLE node.
static void commuteMask(MutableArrayRef< int > Mask)
Change values in a shuffle permute mask assuming the two vector operands have swapped position.
size_type size() const
Definition SmallPtrSet.h:99
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
Definition SmallString.h:26
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
reference emplace_back(ArgTypes &&... Args)
void reserve(size_type N)
void append(ItTy in_start, ItTy in_end)
Add the specified range to the end of the SmallVector.
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
This class is used to represent ISD::STORE nodes.
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
constexpr StringRef substr(size_t Start, size_t N=npos) const
Return a reference to the substring from [Start, Start + N).
Definition StringRef.h:597
bool starts_with(StringRef Prefix) const
Check if this string starts with the given Prefix.
Definition StringRef.h:258
constexpr size_t size() const
Get the string size.
Definition StringRef.h:144
constexpr const char * data() const
Get a pointer to the start of the string (which may not be null terminated).
Definition StringRef.h:138
iterator end() const
Definition StringRef.h:116
Class to represent struct types.
LLVM_ABI void setAttributes(const CallBase *Call, unsigned ArgIdx)
Set CallLoweringInfo attribute flags based on a call instruction and called function attributes.
bool isOperationExpand(unsigned Op, EVT VT) const
Return true if the specified operation is illegal on this target or unlikely to be made legal with cu...
unsigned getBitWidthForCttzElements(EVT RetVT, ElementCount EC, bool ZeroIsPoison, const ConstantRange *VScaleRange) const
Return the minimum number of bits required to hold the maximum possible number of trailing zero vecto...
virtual bool isShuffleMaskLegal(ArrayRef< int >, EVT) const
Targets can use this to indicate that they only support some VECTOR_SHUFFLE operations,...
virtual bool shouldRemoveRedundantExtend(SDValue Op) const
Return true (the default) if it is profitable to remove a sext_inreg(x) where the sext is redundant,...
virtual bool shouldReduceLoadWidth(SDNode *Load, ISD::LoadExtType ExtTy, EVT NewVT, std::optional< unsigned > ByteOffset=std::nullopt) const
Return true if it is profitable to reduce a load to a smaller type.
EVT getValueType(const DataLayout &DL, Type *Ty, bool AllowUnknown=false) const
Return the EVT corresponding to this LLVM type.
virtual bool preferSelectsOverBooleanArithmetic(EVT VT) const
Should we prefer selects to doing arithmetic on boolean types.
virtual bool isLegalICmpImmediate(int64_t) const
Return true if the specified immediate is legal icmp immediate, that is the target has icmp instructi...
virtual MVT::SimpleValueType getCmpLibcallReturnType() const
Return the ValueType for comparison libcalls.
virtual bool isSExtCheaperThanZExt(EVT FromTy, EVT ToTy) const
Return true if sign-extension from FromTy to ToTy is cheaper than zero-extension.
MVT getVectorIdxTy(const DataLayout &DL) const
Returns the type to be used for the index operand of: ISD::INSERT_VECTOR_ELT, ISD::EXTRACT_VECTOR_ELT...
virtual bool isSafeMemOpType(MVT) const
Returns true if it's safe to use load / store of the specified type to expand memcpy / memset inline.
const TargetMachine & getTargetMachine() const
virtual bool isCtpopFast(EVT VT) const
Return true if ctpop instruction is fast.
virtual bool isZExtFree(Type *FromTy, Type *ToTy) const
Return true if any actual instruction that defines a value of type FromTy implicitly zero-extends the...
bool isPaddedAtMostSignificantBitsWhenStored(EVT VT) const
Indicates if any padding is guaranteed to go at the most significant bits when storing the type to me...
LegalizeTypeAction
This enum indicates whether a types are legal for a target, and if not, what action should be used to...
virtual bool hasBitTest(SDValue X, SDValue Y) const
Return true if the target has a bit-test instruction: (X & (1 << Y)) ==/!= 0 This knowledge can be us...
EVT getLegalTypeToTransformTo(LLVMContext &Context, EVT VT) const
Perform getTypeToTransformTo repeatedly until a legal type is obtained.
LegalizeAction getCondCodeAction(ISD::CondCode CC, MVT VT) const
Return how the condition code should be treated: either it is legal, needs to be expanded to some oth...
CallingConv::ID getLibcallImplCallingConv(RTLIB::LibcallImpl Call) const
Get the CallingConv that should be used for the specified libcall implementation.
virtual bool isCommutativeBinOp(unsigned Opcode) const
Returns true if the opcode is a commutative binary operation.
virtual bool isFPImmLegal(const APFloat &, EVT, bool ForCodeSize=false) const
Returns true if the target can instruction select the specified FP immediate natively.
virtual bool shouldTransformSignedTruncationCheck(EVT XVT, unsigned KeptBits) const
Should we tranform the IR-optimal check for whether given truncation down into KeptBits would be trun...
bool isLegalRC(const TargetRegisterInfo &TRI, const TargetRegisterClass &RC) const
Return true if the value types that can be represented by the specified register class are all legal.
virtual bool allowsMisalignedMemoryAccesses(EVT, unsigned AddrSpace=0, Align Alignment=Align(1), MachineMemOperand::Flags Flags=MachineMemOperand::MONone, unsigned *=nullptr) const
Determine if the target supports unaligned memory accesses.
bool isOperationCustom(unsigned Op, EVT VT) const
Return true if the operation uses custom lowering, regardless of whether the type is legal or not.
EVT getShiftAmountTy(EVT LHSTy, const DataLayout &DL) const
Returns the type for the shift amount of a shift opcode.
virtual bool shouldExtendTypeInLibCall(EVT Type) const
Returns true if arguments should be extended in lib calls.
virtual bool isTruncateFree(Type *FromTy, Type *ToTy) const
Return true if it's free to truncate a value of type FromTy to type ToTy.
virtual bool shouldAvoidTransformToShift(EVT VT, unsigned Amount) const
Return true if creating a shift of the type by the given amount is not profitable.
virtual bool isFPExtFree(EVT DestVT, EVT SrcVT) const
Return true if an fpext operation is free (for instance, because single-precision floating-point numb...
virtual EVT getSetCCResultType(const DataLayout &DL, LLVMContext &Context, EVT VT) const
Return the ValueType of the result of SETCC operations.
virtual EVT getTypeToTransformTo(LLVMContext &Context, EVT VT) const
For types supported by the target, this is an identity function.
BooleanContent getBooleanContents(bool isVec, bool isFloat) const
For targets without i1 registers, this gives the nature of the high-bits of boolean values held in ty...
bool isCondCodeLegal(ISD::CondCode CC, MVT VT) const
Return true if the specified condition code is legal for a comparison of the specified types on this ...
bool isTypeLegal(EVT VT) const
Return true if the target has native support for the specified value type.
virtual MVT getPointerTy(const DataLayout &DL, uint32_t AS=0) const
Return the pointer type for the given address space, defaults to the pointer type from the data layou...
bool isOperationLegal(unsigned Op, EVT VT) const
Return true if the specified operation is legal on this target.
TargetLoweringBase(const TargetMachine &TM, const TargetSubtargetInfo &STI)
NOTE: The TargetMachine owns TLOF.
virtual unsigned getCustomCtpopCost(EVT VT, ISD::CondCode Cond) const
Return the maximum number of "x & (x - 1)" operations that can be done instead of deferring to a cust...
virtual bool shouldProduceAndByConstByHoistingConstFromShiftsLHSOfAnd(SDValue X, ConstantSDNode *XC, ConstantSDNode *CC, SDValue Y, unsigned OldShiftOpcode, unsigned NewShiftOpcode, SelectionDAG &DAG) const
Given the pattern (X & (C l>>/<< Y)) ==/!= 0 return true if it should be transformed into: ((X <</l>>...
BooleanContent
Enum that describes how the target represents true/false values.
virtual bool isIntDivCheap(EVT VT, AttributeList Attr) const
Return true if integer divide is usually cheaper than a sequence of several shifts,...
bool isOperationLegalOrCustom(unsigned Op, EVT VT, bool LegalOnly=false) const
Return true if the specified operation is legal on this target or can be made legal with custom lower...
virtual bool allowsMemoryAccess(LLVMContext &Context, const DataLayout &DL, EVT VT, unsigned AddrSpace=0, Align Alignment=Align(1), MachineMemOperand::Flags Flags=MachineMemOperand::MONone, unsigned *Fast=nullptr) const
Return true if the target supports a memory access of this type for the given address space and align...
virtual bool hasAndNotCompare(SDValue Y) const
Return true if the target should transform: (X & Y) == Y ---> (~X & Y) == 0 (X & Y) !...
virtual bool isNarrowingProfitable(SDNode *N, EVT SrcVT, EVT DestVT) const
Return true if it's profitable to narrow operations of type SrcVT to DestVT.
virtual bool isBinOp(unsigned Opcode) const
Return true if the node is a math/logic binary operator.
RTLIB::LibcallImpl getLibcallImpl(RTLIB::Libcall Call) const
Get the libcall impl routine name for the specified libcall.
virtual bool isCtlzFast() const
Return true if ctlz instruction is fast.
virtual bool shouldUseStrictFP_TO_INT(EVT FpVT, EVT IntVT, bool IsSigned) const
Return true if it is more correct/profitable to use strict FP_TO_INT conversion operations - canonica...
NegatibleCost
Enum that specifies when a float negation is beneficial.
LegalizeTypeAction getTypeAction(LLVMContext &Context, EVT VT) const
Return how we should legalize values of this type, either it is already legal (return 'Legal') or we ...
virtual bool shouldSignExtendTypeInLibCall(Type *Ty, bool IsSigned) const
Returns true if arguments should be sign-extended in lib calls.
std::vector< ArgListEntry > ArgListTy
virtual EVT getOptimalMemOpType(LLVMContext &Context, const MemOp &Op, const AttributeList &) const
Returns the target specific optimal type for load and store operations as a result of memset,...
virtual EVT getAsmOperandValueType(const DataLayout &DL, Type *Ty, bool AllowUnknown=false) const
bool isCondCodeLegalOrCustom(ISD::CondCode CC, MVT VT) const
Return true if the specified condition code is legal or custom for a comparison of the specified type...
bool isLoadLegal(EVT ValVT, EVT MemVT, Align Alignment, unsigned AddrSpace, unsigned ExtType, bool Atomic) const
Return true if the specified load with extension is legal on this target.
MVT getRegisterType(MVT VT) const
Return the type of registers that this ValueType will eventually require.
virtual bool isFAbsFree(EVT VT) const
Return true if an fabs operation is free to the point where it is never worthwhile to replace it with...
LegalizeAction getOperationAction(unsigned Op, EVT VT) const
Return how this operation should be treated: either it is legal, needs to be promoted to a larger siz...
bool isOperationLegalOrCustomOrPromote(unsigned Op, EVT VT, bool LegalOnly=false) const
Return true if the specified operation is legal on this target or can be made legal with custom lower...
MulExpansionKind
Enum that specifies when a multiplication should be expanded.
static ISD::NodeType getExtendForContent(BooleanContent Content)
This class defines information used to lower LLVM code to legal SelectionDAG operators that the targe...
SDValue expandAddSubSat(SDNode *Node, SelectionDAG &DAG) const
Method for building the DAG expansion of ISD::[US][ADD|SUB]SAT.
SDValue buildSDIVPow2WithCMov(SDNode *N, const APInt &Divisor, SelectionDAG &DAG, SmallVectorImpl< SDNode * > &Created) const
Build sdiv by power-of-2 with conditional move instructions Ref: "Hacker's Delight" by Henry Warren 1...
virtual ConstraintWeight getMultipleConstraintMatchWeight(AsmOperandInfo &info, int maIndex) const
Examine constraint type and operand type and determine a weight value.
bool expandMultipleResultFPLibCall(SelectionDAG &DAG, RTLIB::Libcall LC, SDNode *Node, SmallVectorImpl< SDValue > &Results, std::optional< unsigned > CallRetResNo={}) const
Expands a node with multiple results to an FP or vector libcall.
SDValue expandVPCTLZ(SDNode *N, SelectionDAG &DAG) const
Expand VP_CTLZ/VP_CTLZ_ZERO_POISON nodes.
bool expandMULO(SDNode *Node, SDValue &Result, SDValue &Overflow, SelectionDAG &DAG) const
Method for building the DAG expansion of ISD::[US]MULO.
bool expandMUL(SDNode *N, SDValue &Lo, SDValue &Hi, EVT HiLoVT, SelectionDAG &DAG, MulExpansionKind Kind, SDValue LL=SDValue(), SDValue LH=SDValue(), SDValue RL=SDValue(), SDValue RH=SDValue()) const
Expand a MUL into two nodes.
SmallVector< ConstraintPair > ConstraintGroup
virtual const MCExpr * getPICJumpTableRelocBaseExpr(const MachineFunction *MF, unsigned JTI, MCContext &Ctx) const
This returns the relocation base for the given PIC jumptable, the same as getPICJumpTableRelocBase,...
virtual Align computeKnownAlignForTargetInstr(GISelValueTracking &Analysis, Register R, const MachineRegisterInfo &MRI, unsigned Depth=0) const
Determine the known alignment for the pointer value R.
bool SimplifyDemandedVectorElts(SDValue Op, const APInt &DemandedEltMask, APInt &KnownUndef, APInt &KnownZero, TargetLoweringOpt &TLO, unsigned Depth=0, bool AssumeSingleUse=false) const
Look at Vector Op.
virtual bool isUsedByReturnOnly(SDNode *, SDValue &) const
Return true if result of the specified node is used by a return node only.
SDValue scalarizeVectorStore(StoreSDNode *ST, SelectionDAG &DAG) const
virtual unsigned getPreferredShrunkVectorSizeInBits(SDValue Op, const APInt &DemandedElts) const
If only low elements of a vector are demanded, shrink the operation to the returned size in bits by c...
virtual unsigned ComputeNumSignBitsForTargetNode(SDValue Op, const APInt &DemandedElts, const SelectionDAG &DAG, unsigned Depth=0) const
This method can be implemented by targets that want to expose additional information about sign bits ...
SDValue lowerCmpEqZeroToCtlzSrl(SDValue Op, SelectionDAG &DAG) const
SDValue expandVPBSWAP(SDNode *N, SelectionDAG &DAG) const
Expand VP_BSWAP nodes.
void softenSetCCOperands(SelectionDAG &DAG, EVT VT, SDValue &NewLHS, SDValue &NewRHS, ISD::CondCode &CCCode, const SDLoc &DL, const SDValue OldLHS, const SDValue OldRHS) const
Soften the operands of a comparison.
void forceExpandWideMUL(SelectionDAG &DAG, const SDLoc &dl, bool Signed, const SDValue LHS, const SDValue RHS, SDValue &Lo, SDValue &Hi) const
Calculate full product of LHS and RHS either via a libcall or through brute force expansion of the mu...
SDValue expandVecReduceSeq(SDNode *Node, SelectionDAG &DAG) const
Expand a VECREDUCE_SEQ_* into an explicit ordered calculation.
SDValue expandFCANONICALIZE(SDNode *Node, SelectionDAG &DAG) const
Expand FCANONICALIZE to FMUL with 1.
SDValue expandCTLZ(SDNode *N, SelectionDAG &DAG) const
Expand CTLZ/CTLZ_ZERO_POISON nodes.
SDValue expandBITREVERSE(SDNode *N, SelectionDAG &DAG) const
Expand BITREVERSE nodes.
SDValue expandCTTZ(SDNode *N, SelectionDAG &DAG) const
Expand CTTZ/CTTZ_ZERO_POISON nodes.
virtual SDValue expandIndirectJTBranch(const SDLoc &dl, SDValue Value, SDValue Addr, int JTI, SelectionDAG &DAG) const
Expands target specific indirect branch for the case of JumpTable expansion.
SDValue expandABD(SDNode *N, SelectionDAG &DAG) const
Expand ABDS/ABDU nodes.
virtual bool targetShrinkDemandedConstant(SDValue Op, const APInt &DemandedBits, const APInt &DemandedElts, TargetLoweringOpt &TLO) const
std::vector< AsmOperandInfo > AsmOperandInfoVector
SDValue expandCLMUL(SDNode *N, SelectionDAG &DAG) const
Expand carryless multiply.
SDValue expandShlSat(SDNode *Node, SelectionDAG &DAG) const
Method for building the DAG expansion of ISD::[US]SHLSAT.
SDValue expandIS_FPCLASS(EVT ResultVT, SDValue Op, FPClassTest Test, SDNodeFlags Flags, const SDLoc &DL, SelectionDAG &DAG) const
Expand check for floating point class.
virtual bool isTargetCanonicalConstantNode(SDValue Op) const
Returns true if the given Opc is considered a canonical constant for the target, which should not be ...
SDValue expandFP_TO_INT_SAT(SDNode *N, SelectionDAG &DAG) const
Expand FP_TO_[US]INT_SAT into FP_TO_[US]INT and selects or min/max.
SDValue expandCttzElts(SDNode *Node, SelectionDAG &DAG) const
Expand a CTTZ_ELTS or CTTZ_ELTS_ZERO_POISON by calculating (VL - i) for each active lane (i),...
SDValue getCheaperNegatedExpression(SDValue Op, SelectionDAG &DAG, bool LegalOps, bool OptForSize, unsigned Depth=0) const
This is the helper function to return the newly negated expression only when the cost is cheaper.
virtual unsigned computeNumSignBitsForTargetInstr(GISelValueTracking &Analysis, Register R, const APInt &DemandedElts, const MachineRegisterInfo &MRI, unsigned Depth=0) const
This method can be implemented by targets that want to expose additional information about sign bits ...
SDValue SimplifyMultipleUseDemandedBits(SDValue Op, const APInt &DemandedBits, const APInt &DemandedElts, SelectionDAG &DAG, unsigned Depth=0) const
More limited version of SimplifyDemandedBits that can be used to "lookthrough" ops that don't contrib...
SDValue expandUnalignedStore(StoreSDNode *ST, SelectionDAG &DAG) const
Expands an unaligned store to 2 half-size stores for integer values, and possibly more for vectors.
SDValue SimplifyMultipleUseDemandedVectorElts(SDValue Op, const APInt &DemandedElts, SelectionDAG &DAG, unsigned Depth=0) const
Helper wrapper around SimplifyMultipleUseDemandedBits, demanding all bits from only some vector eleme...
virtual ConstraintType getConstraintType(StringRef Constraint) const
Given a constraint, return the type of constraint it is for this target.
virtual bool findOptimalMemOpLowering(LLVMContext &Context, std::vector< EVT > &MemOps, unsigned Limit, const MemOp &Op, unsigned DstAS, unsigned SrcAS, const AttributeList &FuncAttributes, EVT *LargestVT=nullptr) const
Determines the optimal series of memory ops to replace the memset / memcpy.
virtual SDValue unwrapAddress(SDValue N) const
void expandSADDSUBO(SDNode *Node, SDValue &Result, SDValue &Overflow, SelectionDAG &DAG) const
Method for building the DAG expansion of ISD::S(ADD|SUB)O.
SDValue expandVPBITREVERSE(SDNode *N, SelectionDAG &DAG) const
Expand VP_BITREVERSE nodes.
SDValue expandABS(SDNode *N, SelectionDAG &DAG, bool IsNegative=false) const
Expand ABS nodes.
SDValue expandVecReduce(SDNode *Node, SelectionDAG &DAG) const
Expand a VECREDUCE_* into an explicit calculation.
bool ShrinkDemandedConstant(SDValue Op, const APInt &DemandedBits, const APInt &DemandedElts, TargetLoweringOpt &TLO) const
Check to see if the specified operand of the specified instruction is a constant integer.
virtual bool isGuaranteedNotToBeUndefOrPoisonForTargetNode(SDValue Op, const APInt &DemandedElts, const SelectionDAG &DAG, UndefPoisonKind Kind, unsigned Depth) const
Return true if this function can prove that Op is never poison and, Kind can be used to track poison ...
SDValue expandVPCTTZElements(SDNode *N, SelectionDAG &DAG) const
Expand VP_CTTZ_ELTS/VP_CTTZ_ELTS_ZERO_POISON nodes.
SDValue BuildSDIV(SDNode *N, SelectionDAG &DAG, bool IsAfterLegalization, bool IsAfterLegalTypes, SmallVectorImpl< SDNode * > &Created) const
Given an ISD::SDIV node expressing a divide by constant, return a DAG expression to select that will ...
virtual const char * getTargetNodeName(unsigned Opcode) const
This method returns the name of a target specific DAG node.
bool expandFP_TO_UINT(SDNode *N, SDValue &Result, SDValue &Chain, SelectionDAG &DAG) const
Expand float to UINT conversion.
bool parametersInCSRMatch(const MachineRegisterInfo &MRI, const uint32_t *CallerPreservedMask, const SmallVectorImpl< CCValAssign > &ArgLocs, const SmallVectorImpl< SDValue > &OutVals) const
Check whether parameters to a call that are passed in callee saved registers are the same as from the...
virtual bool SimplifyDemandedVectorEltsForTargetNode(SDValue Op, const APInt &DemandedElts, APInt &KnownUndef, APInt &KnownZero, TargetLoweringOpt &TLO, unsigned Depth=0) const
Attempt to simplify any target nodes based on the demanded vector elements, returning true on success...
bool expandREM(SDNode *Node, SDValue &Result, SelectionDAG &DAG) const
Expand an SREM or UREM using SDIV/UDIV or SDIVREM/UDIVREM, if legal.
std::pair< SDValue, SDValue > expandUnalignedLoad(LoadSDNode *LD, SelectionDAG &DAG) const
Expands an unaligned load to 2 half-size loads for an integer, and possibly more for vectors.
SDValue expandFMINIMUMNUM_FMAXIMUMNUM(SDNode *N, SelectionDAG &DAG) const
Expand fminimumnum/fmaximumnum into multiple comparison with selects.
void forceExpandMultiply(SelectionDAG &DAG, const SDLoc &dl, bool Signed, SDValue &Lo, SDValue &Hi, SDValue LHS, SDValue RHS, SDValue HiLHS=SDValue(), SDValue HiRHS=SDValue()) const
Calculate the product twice the width of LHS and RHS.
virtual SDValue LowerToTLSEmulatedModel(const GlobalAddressSDNode *GA, SelectionDAG &DAG) const
Lower TLS global address SDNode for target independent emulated TLS model.
virtual bool isTypeDesirableForOp(unsigned, EVT VT) const
Return true if the target has native support for the specified value type and it is 'desirable' to us...
SDValue expandVectorSplice(SDNode *Node, SelectionDAG &DAG) const
Method for building the DAG expansion of ISD::VECTOR_SPLICE.
SDValue getVectorSubVecPointer(SelectionDAG &DAG, SDValue VecPtr, EVT VecVT, EVT SubVecVT, SDValue Index, const SDNodeFlags PtrArithFlags=SDNodeFlags()) const
Get a pointer to a sub-vector of type SubVecVT at index Idx located in memory for a vector of type Ve...
SDValue expandLoopDependenceMask(SDNode *N, SelectionDAG &DAG) const
Expand LOOP_DEPENDENCE_MASK nodes.
virtual const char * LowerXConstraint(EVT ConstraintVT) const
Try to replace an X constraint, which matches anything, with another that has more specific requireme...
SDValue expandCTPOP(SDNode *N, SelectionDAG &DAG) const
Expand CTPOP nodes.
virtual void computeKnownBitsForTargetInstr(GISelValueTracking &Analysis, Register R, KnownBits &Known, const APInt &DemandedElts, const MachineRegisterInfo &MRI, unsigned Depth=0) const
Determine which of the bits specified in Mask are known to be either zero or one and return them in t...
SDValue BuildUDIV(SDNode *N, SelectionDAG &DAG, bool IsAfterLegalization, bool IsAfterLegalTypes, SmallVectorImpl< SDNode * > &Created) const
Given an ISD::UDIV node expressing a divide by constant, return a DAG expression to select that will ...
SDValue expandVectorNaryOpBySplitting(SDNode *Node, SelectionDAG &DAG) const
~TargetLowering() override
std::pair< SDValue, SDValue > LowerCallTo(CallLoweringInfo &CLI) const
This function lowers an abstract call to a function into an actual call.
SDValue expandBSWAP(SDNode *N, SelectionDAG &DAG) const
Expand BSWAP nodes.
SDValue expandFMINIMUM_FMAXIMUM(SDNode *N, SelectionDAG &DAG) const
Expand fminimum/fmaximum into multiple comparison with selects.
SDValue CTTZTableLookup(SDNode *N, SelectionDAG &DAG, const SDLoc &DL, EVT VT, SDValue Op, unsigned NumBitsPerElt) const
Expand CTTZ via Table Lookup.
bool expandDIVREMByConstant(SDNode *N, SmallVectorImpl< SDValue > &Result, EVT HiLoVT, SelectionDAG &DAG, SDValue LL=SDValue(), SDValue LH=SDValue()) const
Attempt to expand an n-bit div/rem/divrem by constant using an n/2-bit algorithm.
virtual void computeKnownBitsForTargetNode(const SDValue Op, KnownBits &Known, const APInt &DemandedElts, const SelectionDAG &DAG, unsigned Depth=0) const
Determine which of the bits specified in Mask are known to be either zero or one and return them in t...
bool isPositionIndependent() const
std::pair< StringRef, TargetLowering::ConstraintType > ConstraintPair
virtual SDValue getNegatedExpression(SDValue Op, SelectionDAG &DAG, bool LegalOps, bool OptForSize, NegatibleCost &Cost, unsigned Depth=0) const
Return the newly negated expression if the cost is not expensive and set the cost in Cost to indicate...
virtual ConstraintWeight getSingleConstraintMatchWeight(AsmOperandInfo &info, const char *constraint) const
Examine constraint string and operand type and determine a weight value.
ConstraintGroup getConstraintPreferences(AsmOperandInfo &OpInfo) const
Given an OpInfo with list of constraints codes as strings, return a sorted Vector of pairs of constra...
bool expandFP_TO_SINT(SDNode *N, SDValue &Result, SelectionDAG &DAG) const
Expand float(f32) to SINT(i64) conversion.
virtual SDValue SimplifyMultipleUseDemandedBitsForTargetNode(SDValue Op, const APInt &DemandedBits, const APInt &DemandedElts, SelectionDAG &DAG, unsigned Depth) const
More limited version of SimplifyDemandedBits that can be used to "lookthrough" ops that don't contrib...
virtual SDValue LowerAsmOutputForConstraint(SDValue &Chain, SDValue &Glue, const SDLoc &DL, const AsmOperandInfo &OpInfo, SelectionDAG &DAG) const
SDValue buildLegalVectorShuffle(EVT VT, const SDLoc &DL, SDValue N0, SDValue N1, MutableArrayRef< int > Mask, SelectionDAG &DAG) const
Tries to build a legal vector shuffle using the provided parameters or equivalent variations.
virtual void computeKnownBitsForStackObjectPointer(KnownBits &Known, const MachineFunction &MF, Align Alignment) const
Determine known bits of a pointer to a known valid stack object.
virtual SDValue getPICJumpTableRelocBase(SDValue Table, SelectionDAG &DAG) const
Returns relocation base for the given PIC jumptable.
std::pair< SDValue, SDValue > scalarizeVectorLoad(LoadSDNode *LD, SelectionDAG &DAG) const
Turn load of vector type into a load of the individual elements.
virtual std::pair< unsigned, const TargetRegisterClass * > getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI, StringRef Constraint, MVT VT) const
Given a physical register constraint (e.g.
bool SimplifyDemandedBits(SDValue Op, const APInt &DemandedBits, const APInt &DemandedElts, KnownBits &Known, TargetLoweringOpt &TLO, unsigned Depth=0, bool AssumeSingleUse=false) const
Look at Op.
virtual bool SimplifyDemandedBitsForTargetNode(SDValue Op, const APInt &DemandedBits, const APInt &DemandedElts, KnownBits &Known, TargetLoweringOpt &TLO, unsigned Depth=0) const
Attempt to simplify any target nodes based on the demanded bits/elts, returning true on success.
virtual bool isDesirableToCommuteXorWithShift(const SDNode *N) const
Return true if it is profitable to combine an XOR of a logical shift to create a logical shift of NOT...
TargetLowering(const TargetLowering &)=delete
virtual bool shouldSimplifyDemandedVectorElts(SDValue Op, const TargetLoweringOpt &TLO) const
Return true if the target supports simplifying demanded vector elements by converting them to undefs.
bool isConstFalseVal(SDValue N) const
Return if the N is a constant or constant vector equal to the false value from getBooleanContents().
SDValue IncrementMemoryAddress(SDValue Addr, SDValue Mask, const SDLoc &DL, EVT DataVT, SelectionDAG &DAG, bool IsCompressedMemory) const
Increments memory address Addr according to the type of the value DataVT that should be stored.
SDValue expandVectorMatch(SDNode *N, SelectionDAG &DAG) const
Expand VECTOR_MATCH nodes.
bool isInTailCallPosition(SelectionDAG &DAG, SDNode *Node, SDValue &Chain) const
Check whether a given call node is in tail position within its function.
SDValue expandCONVERT_TO_ARBITRARY_FP(SDNode *Node, SelectionDAG &DAG) const
Expand CONVERT_TO_ARBITRARY_FP using bit manipulation.
virtual AsmOperandInfoVector ParseConstraints(const DataLayout &DL, const TargetRegisterInfo *TRI, const CallBase &Call) const
Split up the constraint string from the inline assembly value into the specific constraints and their...
virtual bool isSplatValueForTargetNode(SDValue Op, const APInt &DemandedElts, APInt &UndefElts, const SelectionDAG &DAG, unsigned Depth=0) const
Return true if vector Op has the same value across all DemandedElts, indicating any elements which ma...
SDValue expandRoundInexactToOdd(EVT ResultVT, SDValue Op, const SDLoc &DL, SelectionDAG &DAG) const
Truncate Op to ResultVT.
virtual bool shouldSplitFunctionArgumentsAsLittleEndian(const DataLayout &DL) const
For most targets, an LLVM type must be broken down into multiple smaller types.
SDValue SimplifySetCC(EVT VT, SDValue N0, SDValue N1, ISD::CondCode Cond, bool foldBooleans, DAGCombinerInfo &DCI, const SDLoc &dl) const
Try to simplify a setcc built with the specified operands and cc.
SDValue expandFunnelShift(SDNode *N, SelectionDAG &DAG) const
Expand funnel shift.
virtual bool isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const
Return true if folding a constant offset with the given GlobalAddress is legal.
bool LegalizeSetCCCondCode(SelectionDAG &DAG, EVT VT, SDValue &LHS, SDValue &RHS, SDValue &CC, SDValue Mask, SDValue EVL, bool &NeedInvert, const SDLoc &dl, SDValue &Chain, bool IsSignaling=false) const
Legalize a SETCC or VP_SETCC with given LHS and RHS and condition code CC on the current target.
bool isExtendedTrueVal(const ConstantSDNode *N, EVT VT, bool SExt) const
Return if N is a True value when extended to VT.
bool ShrinkDemandedOp(SDValue Op, unsigned BitWidth, const APInt &DemandedBits, TargetLoweringOpt &TLO) const
Convert x+y to (VT)((SmallVT)x+(SmallVT)y) if the casts are free.
bool isConstTrueVal(SDValue N) const
Return if the N is a constant or constant vector equal to the true value from getBooleanContents().
SDValue expandVPCTPOP(SDNode *N, SelectionDAG &DAG) const
Expand VP_CTPOP nodes.
SDValue expandFixedPointDiv(unsigned Opcode, const SDLoc &dl, SDValue LHS, SDValue RHS, unsigned Scale, SelectionDAG &DAG) const
Method for building the DAG expansion of ISD::[US]DIVFIX[SAT].
SDValue expandPEXT(SDNode *N, SelectionDAG &DAG) const
Expand parallel bit extract (compress).
virtual void ComputeConstraintToUse(AsmOperandInfo &OpInfo, SDValue Op, SelectionDAG *DAG=nullptr) const
Determines the constraint code and constraint type to use for the specific AsmOperandInfo,...
virtual void CollectTargetIntrinsicOperands(const CallInst &I, SmallVectorImpl< SDValue > &Ops, SelectionDAG &DAG) const
virtual bool canCreateUndefOrPoisonForTargetNode(SDValue Op, const APInt &DemandedElts, const SelectionDAG &DAG, UndefPoisonKind Kind, bool ConsiderFlags, unsigned Depth) const
Return true if Op can create undef or poison from non-undef & non-poison operands.
SDValue expandVPCTTZ(SDNode *N, SelectionDAG &DAG) const
Expand VP_CTTZ/VP_CTTZ_ZERO_POISON nodes.
SDValue expandVECTOR_COMPRESS(SDNode *Node, SelectionDAG &DAG) const
Expand a vector VECTOR_COMPRESS into a sequence of extract element, store temporarily,...
virtual const Constant * getTargetConstantFromLoad(LoadSDNode *LD) const
This method returns the constant pool value that will be loaded by LD.
SDValue expandFP_ROUND(SDNode *Node, SelectionDAG &DAG) const
Expand round(fp) to fp conversion.
SDValue createSelectForFMINNUM_FMAXNUM(SDNode *Node, SelectionDAG &DAG) const
Try to convert the fminnum/fmaxnum to a compare/select sequence.
SDValue expandCONVERT_FROM_ARBITRARY_FP(SDNode *Node, SelectionDAG &DAG) const
Expand CONVERT_FROM_ARBITRARY_FP using bit manipulation.
SDValue expandROT(SDNode *N, bool AllowVectorOps, SelectionDAG &DAG) const
Expand rotations.
SDValue annotateStackObjectPointer(SDValue Ptr, SelectionDAG &DAG, const SDLoc &DL, Align Alignment) const
Annotate a stack object pointer with known-bits assertions.
virtual void LowerAsmOperandForConstraint(SDValue Op, StringRef Constraint, std::vector< SDValue > &Ops, SelectionDAG &DAG) const
Lower the specified operand into the Ops vector.
virtual SDValue getSqrtInputTest(SDValue Operand, SelectionDAG &DAG, const DenormalMode &Mode, SDNodeFlags Flags={}) const
Return a target-dependent comparison result if the input operand is suitable for use with a square ro...
SDValue getVectorElementPointer(SelectionDAG &DAG, SDValue VecPtr, EVT VecVT, SDValue Index, const SDNodeFlags PtrArithFlags=SDNodeFlags()) const
Get a pointer to vector element Idx located in memory for a vector of type VecVT starting at a base a...
SDValue expandFMINNUM_FMAXNUM(SDNode *N, SelectionDAG &DAG) const
Expand fminnum/fmaxnum into fminnum_ieee/fmaxnum_ieee with quieted inputs.
virtual bool isGAPlusOffset(SDNode *N, const GlobalValue *&GA, int64_t &Offset) const
Returns true (and the GlobalValue and the offset) if the node is a GlobalAddress + offset.
virtual void computeKnownFPClassForTargetNode(const SDValue Op, KnownFPClass &Known, const APInt &DemandedElts, const SelectionDAG &DAG, unsigned Depth=0) const
Determine floating-point class information for a target node.
virtual unsigned getJumpTableEncoding() const
Return the entry encoding for a jump table in the current function.
virtual void computeKnownFPClassForTargetInstr(GISelValueTracking &Analysis, Register R, KnownFPClass &Known, const APInt &DemandedElts, const MachineRegisterInfo &MRI, unsigned Depth=0) const
std::pair< SDValue, SDValue > makeLibCall(SelectionDAG &DAG, RTLIB::LibcallImpl LibcallImpl, EVT RetVT, ArrayRef< SDValue > Ops, MakeLibCallOptions CallOptions, const SDLoc &dl, SDValue Chain=SDValue()) const
Returns a pair of (return value, chain).
SDValue expandCMP(SDNode *Node, SelectionDAG &DAG) const
Method for building the DAG expansion of ISD::[US]CMP.
void expandShiftParts(SDNode *N, SDValue &Lo, SDValue &Hi, SelectionDAG &DAG) const
Expand shift-by-parts.
virtual bool isKnownNeverNaNForTargetNode(SDValue Op, const APInt &DemandedElts, const SelectionDAG &DAG, bool SNaN=false, unsigned Depth=0) const
If SNaN is false,.
virtual SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const
This method will be invoked for all target nodes and for any target-independent nodes that the target...
SDValue expandFixedPointMul(SDNode *Node, SelectionDAG &DAG) const
Method for building the DAG expansion of ISD::[U|S]MULFIX[SAT].
SDValue getInboundsVectorElementPointer(SelectionDAG &DAG, SDValue VecPtr, EVT VecVT, SDValue Index) const
Get a pointer to vector element Idx located in memory for a vector of type VecVT starting at a base a...
SDValue expandIntMINMAX(SDNode *Node, SelectionDAG &DAG) const
Method for building the DAG expansion of ISD::[US][MIN|MAX].
SDValue expandVectorFindLastActive(SDNode *N, SelectionDAG &DAG) const
Expand VECTOR_FIND_LAST_ACTIVE nodes.
SDValue expandPartialReduceMLA(SDNode *Node, SelectionDAG &DAG) const
Expands PARTIAL_REDUCE_S/UMLA nodes to a series of simpler operations, consisting of zext/sext,...
void expandUADDSUBO(SDNode *Node, SDValue &Result, SDValue &Overflow, SelectionDAG &DAG) const
Method for building the DAG expansion of ISD::U(ADD|SUB)O.
SDValue expandPDEP(SDNode *N, SelectionDAG &DAG) const
Expand parallel bit deposit (expand).
virtual SDValue BuildSDIVPow2(SDNode *N, const APInt &Divisor, SelectionDAG &DAG, SmallVectorImpl< SDNode * > &Created) const
Targets may override this function to provide custom SDIV lowering for power-of-2 denominators.
SDValue scalarizeExtractedVectorLoad(EVT ResultVT, const SDLoc &DL, EVT InVecVT, SDValue EltNo, LoadSDNode *OriginalLoad, SelectionDAG &DAG) const
Replace an extraction of a load with a narrowed load.
virtual SDValue BuildSREMPow2(SDNode *N, const APInt &Divisor, SelectionDAG &DAG, SmallVectorImpl< SDNode * > &Created) const
Targets may override this function to provide custom SREM lowering for power-of-2 denominators.
bool expandUINT_TO_FP(SDNode *N, SDValue &Result, SDValue &Chain, SelectionDAG &DAG) const
Expand UINT(i64) to double(f64) conversion.
bool expandMUL_LOHI(unsigned Opcode, EVT VT, const SDLoc &dl, SDValue LHS, SDValue RHS, SmallVectorImpl< SDValue > &Result, EVT HiLoVT, SelectionDAG &DAG, MulExpansionKind Kind, SDValue LL=SDValue(), SDValue LH=SDValue(), SDValue RL=SDValue(), SDValue RH=SDValue()) const
Expand a MUL or [US]MUL_LOHI of n-bit values into two or four nodes, respectively,...
SDValue expandAVG(SDNode *N, SelectionDAG &DAG) const
Expand vector/scalar AVGCEILS/AVGCEILU/AVGFLOORS/AVGFLOORU nodes.
SDValue expandCTLS(SDNode *N, SelectionDAG &DAG) const
Expand CTLS (count leading sign bits) nodes.
void setTypeIdForCallsiteInfo(const CallBase *CB, MachineFunction &MF, MachineFunction::CallSiteInfo &CSInfo) const
Primary interface to the complete machine description for the target machine.
bool isPositionIndependent() const
const Triple & getTargetTriple() const
TargetOptions Options
unsigned EmitCallSiteInfo
The flag enables call site info production.
unsigned EmitCallGraphSection
Emit section containing call graph metadata.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
virtual StringRef getRegAsmName(MCRegister Reg) const
Return the assembly name for Reg.
bool isTypeLegalForClass(const TargetRegisterClass &RC, MVT T) const
Return true if the given TargetRegisterClass has the ValueType T.
TargetSubtargetInfo - Generic base class for all target subtargets.
bool isOSBinFormatCOFF() const
Tests whether the OS uses the COFF binary format.
Definition Triple.h:867
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition Twine.h:82
static constexpr TypeSize getFixed(ScalarTy ExactSize)
Definition TypeSize.h:343
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:46
static LLVM_ABI IntegerType * getInt32Ty(LLVMContext &C)
Definition Type.cpp:309
static LLVM_ABI Type * getVoidTy(LLVMContext &C)
Definition Type.cpp:282
Type * getScalarType() const
If this is a vector type, return the element type, otherwise return 'this'.
Definition Type.h:368
bool isIntegerTy() const
True if this is an instance of IntegerType.
Definition Type.h:257
LLVM_ABI const fltSemantics & getFltSemantics() const
Definition Type.cpp:106
LLVM Value Representation.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:255
LLVM_ABI const Value * stripPointerCastsAndAliases() const
Strip off pointer casts, all-zero GEPs, address space casts, and aliases.
Definition Value.cpp:717
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
Definition Value.cpp:319
constexpr bool isKnownMultipleOf(ScalarTy RHS) const
This function tells the caller whether the element count is known at compile time to be a multiple of...
Definition TypeSize.h:180
constexpr ScalarTy getFixedValue() const
Definition TypeSize.h:200
constexpr bool isScalable() const
Returns whether the quantity is scaled by a runtime quantity (vscale).
Definition TypeSize.h:168
constexpr ScalarTy getKnownMinValue() const
Returns the minimum value this quantity can represent.
Definition TypeSize.h:165
CallInst * Call
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
LLVM_ABI APInt ScaleBitMask(const APInt &A, unsigned NewBitWidth, bool MatchAllBits=false)
Splat/Merge neighboring bits to widen/narrow the bitmask represented by.
Definition APInt.cpp:3040
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
@ STRICT_FP_TO_SINT
STRICT_FP_TO_[US]INT - Convert a floating point value to a signed or unsigned integer.
Definition ISDOpcodes.h:479
@ FMINIMUM
FMINIMUM/FMAXIMUM - NaN-propagating minimum/maximum that also treat -0.0 as less than 0....
@ FP_TO_SINT
FP_TO_[US]INT - Convert a floating point value to a signed or unsigned integer.
Definition ISDOpcodes.h:936
@ TargetConstant
TargetConstant* - Like Constant*, but the DAG does not do any folding, simplification,...
Definition ISDOpcodes.h:179
@ AND
Bitwise operators - logical and, logical or, logical xor.
Definition ISDOpcodes.h:741
@ INTRINSIC_WO_CHAIN
RESULT = INTRINSIC_WO_CHAIN(INTRINSICID, arg1, arg2, ...) This node represents a target intrinsic fun...
Definition ISDOpcodes.h:205
@ AVGFLOORS
AVGFLOORS/AVGFLOORU - Averaging add - Add two integers using an integer of type i[N+1],...
Definition ISDOpcodes.h:712
@ VECTOR_SPLICE_RIGHT
VECTOR_SPLICE_RIGHT(VEC1, VEC2, OFFSET) - Shifts CONCAT_VECTORS(VEC1,VEC2) right by OFFSET elements a...
Definition ISDOpcodes.h:659
@ ADDE
Carry-using nodes for multiple precision addition and subtraction.
Definition ISDOpcodes.h:304
@ FREEZE
FREEZE - FREEZE(VAL) returns an arbitrary value if VAL is UNDEF (or is evaluated to UNDEF),...
Definition ISDOpcodes.h:241
@ INSERT_VECTOR_ELT
INSERT_VECTOR_ELT(VECTOR, VAL, IDX) - Returns VECTOR with the element at IDX replaced with VAL.
Definition ISDOpcodes.h:567
@ TokenFactor
TokenFactor - This node takes multiple tokens as input and produces a single token result.
Definition ISDOpcodes.h:53
@ CTTZ_ZERO_POISON
Bit counting operators with a poisoned result for zero inputs.
Definition ISDOpcodes.h:797
@ FFREXP
FFREXP - frexp, extract fractional and exponent component of a floating-point value.
@ FP_ROUND
X = FP_ROUND(Y, TRUNC) - Rounding 'Y' from a larger floating point type down to the precision of the ...
Definition ISDOpcodes.h:969
@ ZERO_EXTEND_VECTOR_INREG
ZERO_EXTEND_VECTOR_INREG(Vector) - This operator represents an in-register zero-extension of the low ...
Definition ISDOpcodes.h:931
@ FP_TO_SINT_SAT
FP_TO_[US]INT_SAT - Convert floating point value in operand 0 to a signed or unsigned scalar integer ...
Definition ISDOpcodes.h:955
@ TRUNCATE
TRUNCATE - Completely drop the high bits.
Definition ISDOpcodes.h:866
@ SHL_PARTS
SHL_PARTS/SRA_PARTS/SRL_PARTS - These operators are used for expanded integer shift operations.
Definition ISDOpcodes.h:843
@ FCOPYSIGN
FCOPYSIGN(X, Y) - Return the value of X with the sign of Y.
Definition ISDOpcodes.h:536
@ PARTIAL_REDUCE_SUMLA
@ SADDSAT
RESULT = [US]ADDSAT(LHS, RHS) - Perform saturation addition on 2 integers with the same bit width (W)...
Definition ISDOpcodes.h:365
@ CALLSEQ_START
CALLSEQ_START/CALLSEQ_END - These operators mark the beginning and end of a call sequence,...
@ CTTZ_ELTS_ZERO_POISON
@ FMINIMUMNUM
FMINIMUMNUM/FMAXIMUMNUM - minimumnum/maximumnum that is same with FMINNUM_IEEE and FMAXNUM_IEEE besid...
@ ABDS
ABDS/ABDU - Absolute difference - Return the absolute difference between two numbers interpreted as s...
Definition ISDOpcodes.h:724
@ INTRINSIC_W_CHAIN
RESULT,OUTCHAIN = INTRINSIC_W_CHAIN(INCHAIN, INTRINSICID, arg1, ...) This node represents a target in...
Definition ISDOpcodes.h:213
@ ABS_MIN_POISON
ABS with a poison result for INT_MIN.
Definition ISDOpcodes.h:753
@ BUILD_VECTOR
BUILD_VECTOR(ELT0, ELT1, ELT2, ELT3,...) - Return a fixed-width vector with the specified,...
Definition ISDOpcodes.h:558
LLVM_ABI NodeType getOppositeSignednessMinMaxOpcode(unsigned MinMaxOpc)
Given a MinMaxOpc of ISD::(U|S)MIN or ISD::(U|S)MAX, returns the corresponding opcode with the opposi...
LLVM_ABI bool isBuildVectorOfConstantSDNodes(const SDNode *N)
Return true if the specified node is a BUILD_VECTOR node of all ConstantSDNode or undef.
LLVM_ABI NodeType getExtForLoadExtType(bool IsFP, LoadExtType)
bool isNormalStore(const SDNode *N)
Returns true if the specified node is a non-truncating and unindexed store.
bool isZEXTLoad(const SDNode *N)
Returns true if the specified node is a ZEXTLOAD.
LLVM_ABI CondCode getSetCCInverse(CondCode Operation, EVT Type)
Return the operation corresponding to !(X op Y), where 'op' is a valid SetCC operation.
bool isTrueWhenEqual(CondCode Cond)
Return true if the specified condition returns true if the two operands to the condition are equal.
unsigned getUnorderedFlavor(CondCode Cond)
This function returns 0 if the condition is always false if an operand is a NaN, 1 if the condition i...
LLVM_ABI bool matchBinaryPredicate(SDValue LHS, SDValue RHS, const APInt &DemandedElts, std::function< bool(ConstantSDNode *, ConstantSDNode *)> Match, bool AllowUndefs=false, bool AllowTypeMismatch=false)
Attempt to match a binary predicate against a pair of scalar/splat constants or every element of a pa...
LLVM_ABI CondCode getSetCCSwappedOperands(CondCode Operation)
Return the operation corresponding to (Y op X) when given the operation for (X op Y).
LLVM_ABI bool isBuildVectorAllZeros(const SDNode *N)
Return true if the specified node is a BUILD_VECTOR where all of the elements are 0 or undef.
bool isSignedIntSetCC(CondCode Code)
Return true if this is a setcc instruction that performs a signed comparison when used with integer o...
LLVM_ABI bool isConstantSplatVector(const SDNode *N, APInt &SplatValue)
Node predicates.
CondCode
ISD::CondCode enum - These are ordered carefully to make the bitfields below work out,...
LLVM_ABI NodeType getVecReduceBaseOpcode(unsigned VecReduceOpcode)
Get underlying scalar opcode for VECREDUCE opcode.
LoadExtType
LoadExtType enum - This enum defines the three variants of LOADEXT (load with extension).
bool isUnsignedIntSetCC(CondCode Code)
Return true if this is a setcc instruction that performs an unsigned comparison when used with intege...
bool matchUnaryPredicate(SDValue Op, const APInt &DemandedElts, std::function< bool(ConstantSDNode *)> Match, bool AllowUndefs=false, bool AllowTruncation=false)
Hook for matching ConstantSDNode predicate.
BinaryOp_match< LHS, RHS, Instruction::And > m_And(const LHS &L, const RHS &R)
BinaryOp_match< LHS, RHS, Instruction::Add > m_Add(const LHS &L, const RHS &R)
match_deferred< Value > m_Deferred(Value *const &V)
Like m_Specific(), but works if the specific value to match is determined as part of the same match()...
specificval_ty m_Specific(const Value *V)
Match if we have a specific specified value.
auto m_Value()
Match an arbitrary value and ignore it.
BinaryOp_match< LHS, RHS, Instruction::Or > m_Or(const LHS &L, const RHS &R)
BinaryOp_match< LHS, RHS, Instruction::Sub > m_Sub(const LHS &L, const RHS &R)
LLVM_ABI Libcall getUREM(EVT VT)
Or< Preds... > m_AnyOf(const Preds &...preds)
bool sd_match(SDNode *N, const SelectionDAG *DAG, Pattern &&P)
NUses_match< 1, Value_match > m_OneUse()
This is an optimization pass for GlobalISel generic memory operations.
unsigned Log2_32_Ceil(uint32_t Value)
Return the ceil log base 2 of the specified value, 32 if the value is zero.
Definition MathExtras.h:345
@ Offset
Definition DWP.cpp:578
void stable_sort(R &&Range)
Definition STLExtras.h:2116
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1739
InstructionCost Cost
LLVM_ABI bool isNullConstant(SDValue V)
Returns true if V is a constant integer zero.
RelativeUniformCounterPtr Values
Definition InstrProf.h:91
LLVM_ABI bool isAllOnesOrAllOnesSplat(const MachineInstr &MI, const MachineRegisterInfo &MRI, bool AllowUndefs=false)
Return true if the value is a constant -1 integer or a splatted vector of a constant -1 integer (with...
Definition Utils.cpp:1557
@ Known
Known to have no common set bits.
@ Undef
Value of the register doesn't matter.
LLVM_ABI SDValue peekThroughBitcasts(SDValue V)
Return the non-bitcasted source operand of V if it exists.
auto enumerate(FirstRange &&First, RestRanges &&...Rest)
Given two or more input ranges, returns a new range whose values are tuples (A, B,...
Definition STLExtras.h:2554
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
LLVM_ABI FPClassTest invertFPClassTestIfSimpler(FPClassTest Test, bool UseFCmp)
Evaluates if the specified FP class test is better performed as the inverse (i.e.
@ Load
The value being inserted comes from a load (InsertElement only).
@ Store
The extracted value is stored (ExtractElement only).
LLVM_ABI bool isOneOrOneSplatFP(SDValue V, bool AllowUndefs=false)
Return true if the value is a constant floating-point value, or a splatted vector of a constant float...
constexpr T alignDown(U Value, V Align, W Skew=0)
Returns the largest unsigned integer less than or equal to Value and is Skew mod Align.
Definition MathExtras.h:547
void * PointerTy
LLVM_ABI bool isNullOrNullSplat(const MachineInstr &MI, const MachineRegisterInfo &MRI, bool AllowUndefs=false)
Return true if the value is a constant 0 integer or a splatted vector of a constant 0 integer (with n...
Definition Utils.cpp:1539
T bit_ceil(T Value)
Returns the smallest integral power of two no smaller than Value if Value is nonzero.
Definition bit.h:362
LLVM_ABI void reportFatalInternalError(Error Err)
Report a fatal error that indicates a bug in LLVM.
Definition Error.cpp:173
constexpr int popcount(T Value) noexcept
Count the number of set bits in a value.
Definition bit.h:156
LLVM_ABI ConstantFPSDNode * isConstOrConstSplatFP(SDValue N, bool AllowUndefs=false)
Returns the SDNode if it is a constant splat BuildVector or constant float.
constexpr bool has_single_bit(T Value) noexcept
Definition bit.h:149
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1746
LLVM_ABI bool getShuffleDemandedElts(int SrcWidth, ArrayRef< int > Mask, const APInt &DemandedElts, APInt &DemandedLHS, APInt &DemandedRHS, bool AllowUndefElts=false)
Transform a shuffle mask's output demanded element mask into demanded element masks for the 2 operand...
unsigned Log2_32(uint32_t Value)
Return the floor log base 2 of the specified value, -1 if the value is zero.
Definition MathExtras.h:332
LLVM_ABI bool isBitwiseNot(SDValue V, bool AllowUndefs=false)
Returns true if V is a bitwise not operation.
constexpr bool isPowerOf2_32(uint32_t Value)
Return true if the argument is a power of two > 0.
Definition MathExtras.h:280
FPClassTest
Floating-point class tests, supported by 'is_fpclass' intrinsic.
auto find_if_not(R &&Range, UnaryPredicate P)
Definition STLExtras.h:1777
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
Definition Error.cpp:163
LLVM_ABI ConstantRange getVScaleRange(const Function *F, unsigned BitWidth)
Determine the possible constant range of vscale with the given bit width, based on the vscale_range f...
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
Definition Casting.h:547
LLVM_ABI bool isOneOrOneSplat(SDValue V, bool AllowUndefs=false)
Return true if the value is a constant 1 integer or a splatted vector of a constant 1 integer (with n...
@ Mod
The access may modify the value stored in memory.
Definition ModRef.h:34
constexpr T divideCeil(U Numerator, V Denominator)
Returns the integer ceil(Numerator / Denominator).
Definition MathExtras.h:395
@ Other
Any other memory.
Definition ModRef.h:68
To bit_cast(const From &from) noexcept
Definition bit.h:90
@ Mul
Product of integers.
@ Xor
Bitwise or logical XOR of integers.
@ Sub
Subtraction of integers.
@ Add
Sum of integers.
uint16_t MCPhysReg
An unsigned integer type large enough to represent all physical registers, but not necessarily virtua...
Definition MCRegister.h:21
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Count
Definition InstrProf.h:145
fltNonfiniteBehavior
Definition APFloat.h:969
DWARFExpression::Operation Op
RoundingMode
Rounding mode.
@ TowardZero
roundTowardZero.
@ NearestTiesToEven
roundTiesToEven.
@ TowardPositive
roundTowardPositive.
@ NearestTiesToAway
roundTiesToAway.
@ TowardNegative
roundTowardNegative.
LLVM_ABI ConstantSDNode * isConstOrConstSplat(SDValue N, bool AllowUndefs=false, bool AllowTruncation=false)
Returns the SDNode if it is a constant splat BuildVector or constant int.
constexpr unsigned BitWidth
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
LLVM_ABI bool isZeroOrZeroSplat(SDValue N, bool AllowUndefs=false)
Return true if the value is a constant 0 integer or a splatted vector of a constant 0 integer (with n...
LLVM_ABI bool isOneConstant(SDValue V)
Returns true if V is a constant integer one.
UndefPoisonKind
Enumeration to track whether we are interested in Undef, Poison, or both.
Definition UndefPoison.h:20
Align commonAlignment(Align A, uint64_t Offset)
Returns the alignment that satisfies both alignments.
Definition Alignment.h:201
LLVM_ABI bool isNullFPConstant(SDValue V)
Returns true if V is an FP constant with a value of positive zero.
APFloat neg(APFloat X)
Returns the negated value of the argument.
Definition APFloat.h:1719
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Next
Definition InstrProf.h:147
unsigned Log2(Align A)
Returns the log2 of the alignment.
Definition Alignment.h:197
constexpr T maskTrailingOnes(unsigned N)
Create a bitmask with the N right-most bits set to 1, and all other bits set to 0.
Definition MathExtras.h:78
@ Increment
Incrementally increasing token ID.
Definition AllocToken.h:26
fltNanEncoding
Definition APFloat.h:993
LLVM_ABI bool isAllOnesConstant(SDValue V)
Returns true if V is an integer constant with all bits set.
constexpr uint64_t NextPowerOf2(uint64_t A)
Returns the next power of two (in 64-bits) that is strictly greater than A.
Definition MathExtras.h:374
MCRegisterClass TargetRegisterClass
Definition FastISel.h:58
LLVM_ABI void reportFatalUsageError(Error Err)
Report a fatal error that does not indicate a bug in LLVM.
Definition Error.cpp:177
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Definition BitVector.h:880
#define N
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39
Represent subnormal handling kind for floating point instruction inputs and outputs.
DenormalModeKind Input
Denormal treatment kind for floating point instruction inputs in the default floating-point environme...
@ PreserveSign
The sign of a flushed-to-zero number is preserved in the sign of 0.
@ PositiveZero
Denormals are flushed to positive zero.
@ IEEE
IEEE-754 denormal numbers preserved.
constexpr bool inputsAreZero() const
Return true if input denormals must be implicitly treated as 0.
Extended Value Type.
Definition ValueTypes.h:35
TypeSize getStoreSize() const
Return the number of bytes overwritten by a store of the specified value type.
Definition ValueTypes.h:418
bool isSimple() const
Test if the given EVT is simple (as opposed to being extended).
Definition ValueTypes.h:145
static EVT getVectorVT(LLVMContext &Context, EVT VT, unsigned NumElements, bool IsScalable=false)
Returns the EVT that represents a vector NumElements in length, where each element is of type VT.
Definition ValueTypes.h:70
EVT changeTypeToInteger() const
Return the type converted to an equivalently sized integer or vector with integer element type.
Definition ValueTypes.h:129
bool bitsGT(EVT VT) const
Return true if this has more bits than VT.
Definition ValueTypes.h:307
bool bitsLT(EVT VT) const
Return true if this has less bits than VT.
Definition ValueTypes.h:323
bool isFloatingPoint() const
Return true if this is a FP or a vector FP type.
Definition ValueTypes.h:155
ElementCount getVectorElementCount() const
Definition ValueTypes.h:373
EVT getDoubleNumVectorElementsVT(LLVMContext &Context) const
Definition ValueTypes.h:494
TypeSize getSizeInBits() const
Return the size of the specified value type in bits.
Definition ValueTypes.h:396
bool isByteSized() const
Return true if the bit size is a multiple of 8.
Definition ValueTypes.h:266
unsigned getVectorMinNumElements() const
Given a vector type, return the minimum number of elements it contains.
Definition ValueTypes.h:382
uint64_t getScalarSizeInBits() const
Definition ValueTypes.h:408
EVT getHalfSizedIntegerVT(LLVMContext &Context) const
Finds the smallest simple value type that is greater than or equal to half the width of this EVT.
Definition ValueTypes.h:453
bool isPow2VectorType() const
Returns true if the given vector is a power of 2.
Definition ValueTypes.h:501
TypeSize getStoreSizeInBits() const
Return the number of bits overwritten by a store of the specified value type.
Definition ValueTypes.h:435
EVT changeVectorElementType(LLVMContext &Context, EVT EltVT) const
Return a VT for a vector type whose attributes match ourselves with the exception of the element type...
Definition ValueTypes.h:98
MVT getSimpleVT() const
Return the SimpleValueType held in the specified simple EVT.
Definition ValueTypes.h:339
static EVT getIntegerVT(LLVMContext &Context, unsigned BitWidth)
Returns the EVT that represents an integer with the given number of bits.
Definition ValueTypes.h:61
uint64_t getFixedSizeInBits() const
Return the size of the specified fixed width value type in bits.
Definition ValueTypes.h:404
EVT changeVectorElementCount(LLVMContext &Context, ElementCount EC) const
Return a VT for a vector type whose attributes match ourselves with the exception of the element coun...
Definition ValueTypes.h:109
bool isScalableVT() const
Return true if the type is a scalable type.
Definition ValueTypes.h:210
bool isFixedLengthVector() const
Definition ValueTypes.h:199
bool isVector() const
Return true if this is a vector value type.
Definition ValueTypes.h:176
EVT getScalarType() const
If this is a vector type, return the element type, otherwise return this.
Definition ValueTypes.h:346
LLVM_ABI Type * getTypeForEVT(LLVMContext &Context) const
This method returns an LLVM type corresponding to the specified EVT.
EVT widenIntegerElementType(LLVMContext &Context) const
Return a VT for an integer element type with doubled bit width.
Definition ValueTypes.h:467
bool isScalableVector() const
Return true if this is a vector type where the runtime length is machine dependent.
Definition ValueTypes.h:187
EVT getVectorElementType() const
Given a vector type, return the type of each element.
Definition ValueTypes.h:351
EVT changeElementType(LLVMContext &Context, EVT EltVT) const
Return a VT for a type whose attributes match ourselves with the exception of the element type that i...
Definition ValueTypes.h:121
bool isScalarInteger() const
Return true if this is an integer, but not a vector.
Definition ValueTypes.h:165
LLVM_ABI const fltSemantics & getFltSemantics() const
Returns an APFloat semantics tag appropriate for the value type.
unsigned getVectorNumElements() const
Given a vector type, return the number of elements it contains.
Definition ValueTypes.h:359
bool bitsLE(EVT VT) const
Return true if this has no more bits than VT.
Definition ValueTypes.h:331
EVT getHalfNumVectorElementsVT(LLVMContext &Context) const
Definition ValueTypes.h:484
bool isInteger() const
Return true if this is an integer or a vector integer type.
Definition ValueTypes.h:160
static KnownBits makeConstant(const APInt &C)
Create known bits from a known constant.
Definition KnownBits.h:315
KnownBits anyextOrTrunc(unsigned BitWidth) const
Return known bits for an "any" extension or truncation of the value we're tracking.
Definition KnownBits.h:190
static LLVM_ABI KnownBits smax(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for smax(LHS, RHS).
bool isNonNegative() const
Returns true if this value is known to be non-negative.
Definition KnownBits.h:106
unsigned countMinTrailingZeros() const
Returns the minimum number of trailing zero bits.
Definition KnownBits.h:256
KnownBits trunc(unsigned BitWidth) const
Return known bits for a truncation of the value we're tracking.
Definition KnownBits.h:165
KnownBits byteSwap() const
Definition KnownBits.h:559
static LLVM_ABI std::optional< bool > sge(const KnownBits &LHS, const KnownBits &RHS)
Determine if these known bits always give the same ICMP_SGE result.
unsigned countMaxPopulation() const
Returns the maximum number of bits that could be one.
Definition KnownBits.h:303
KnownBits reverseBits() const
Definition KnownBits.h:563
KnownBits concat(const KnownBits &Lo) const
Concatenate the bits from Lo onto the bottom of *this.
Definition KnownBits.h:247
static LLVM_ABI KnownBits umax(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for umax(LHS, RHS).
unsigned countMinLeadingZeros() const
Returns the minimum number of leading zero bits.
Definition KnownBits.h:262
APInt getMaxValue() const
Return the maximal unsigned value possible given these KnownBits.
Definition KnownBits.h:146
static LLVM_ABI KnownBits smin(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for smin(LHS, RHS).
static LLVM_ABI std::optional< bool > ugt(const KnownBits &LHS, const KnownBits &RHS)
Determine if these known bits always give the same ICMP_UGT result.
static LLVM_ABI std::optional< bool > slt(const KnownBits &LHS, const KnownBits &RHS)
Determine if these known bits always give the same ICMP_SLT result.
static LLVM_ABI KnownBits computeForAddSub(bool Add, bool NSW, bool NUW, const KnownBits &LHS, const KnownBits &RHS)
Compute known bits resulting from adding LHS and RHS.
Definition KnownBits.cpp:61
static LLVM_ABI std::optional< bool > ult(const KnownBits &LHS, const KnownBits &RHS)
Determine if these known bits always give the same ICMP_ULT result.
static LLVM_ABI std::optional< bool > ule(const KnownBits &LHS, const KnownBits &RHS)
Determine if these known bits always give the same ICMP_ULE result.
bool isNegative() const
Returns true if this value is known to be negative.
Definition KnownBits.h:103
static LLVM_ABI KnownBits mul(const KnownBits &LHS, const KnownBits &RHS, bool NoUndefSelfMultiply=false)
Compute known bits resulting from multiplying LHS and RHS.
static LLVM_ABI std::optional< bool > sle(const KnownBits &LHS, const KnownBits &RHS)
Determine if these known bits always give the same ICMP_SLE result.
static LLVM_ABI std::optional< bool > sgt(const KnownBits &LHS, const KnownBits &RHS)
Determine if these known bits always give the same ICMP_SGT result.
unsigned countMinPopulation() const
Returns the number of bits known to be one.
Definition KnownBits.h:300
static LLVM_ABI std::optional< bool > uge(const KnownBits &LHS, const KnownBits &RHS)
Determine if these known bits always give the same ICMP_UGE result.
static LLVM_ABI KnownBits umin(const KnownBits &LHS, const KnownBits &RHS)
Compute known bits for umin(LHS, RHS).
Matching combinators.
This class contains a discriminated union of information about pointers in memory operands,...
LLVM_ABI unsigned getAddrSpace() const
Return the LLVM IR address space number that this pointer points into.
static LLVM_ABI MachinePointerInfo getConstantPool(MachineFunction &MF)
Return a MachinePointerInfo record that refers to the constant pool.
MachinePointerInfo getWithOffset(int64_t O) const
static LLVM_ABI MachinePointerInfo getUnknownStack(MachineFunction &MF)
Stack memory without other information.
static LLVM_ABI MachinePointerInfo getFixedStack(MachineFunction &MF, int FI, int64_t Offset=0)
Return a MachinePointerInfo record that refers to the specified FrameIndex.
static LLVM_ABI bool hasVectorMaskArgument(RTLIB::LibcallImpl Impl)
Returns true if the function has a vector mask argument, which is assumed to be the last argument.
These are IR-level optimization flags that may be propagated to SDNodes.
bool hasNoUnsignedWrap() const
bool hasNoSignedWrap() const
void setNoSignedWrap(bool b)
This represents a list of ValueType's that has been intern'd by a SelectionDAG.
Magic data for optimising signed division by a constant.
static LLVM_ABI SignedDivisionByConstantInfo get(const APInt &D)
Calculate the magic numbers required to implement a signed integer division by a constant as a sequen...
This contains information for each constraint that we are lowering.
std::string ConstraintCode
This contains the actual string for the code, like "m".
LLVM_ABI unsigned getMatchedOperand() const
If this is an input matching constraint, this method returns the output operand it matches.
LLVM_ABI bool isMatchingInputConstraint() const
Return true of this is an input operand that is a matching constraint like "4".
This structure contains all information that is necessary for lowering calls.
CallLoweringInfo & setIsPostTypeLegalization(bool Value=true)
CallLoweringInfo & setLibCallee(CallingConv::ID CC, Type *ResultType, SDValue Target, ArgListTy &&ArgsList)
CallLoweringInfo & setDiscardResult(bool Value=true)
CallLoweringInfo & setZExtResult(bool Value=true)
CallLoweringInfo & setDebugLoc(const SDLoc &dl)
CallLoweringInfo & setSExtResult(bool Value=true)
CallLoweringInfo & setNoReturn(bool Value=true)
CallLoweringInfo & setChain(SDValue InChain)
LLVM_ABI void AddToWorklist(SDNode *N)
LLVM_ABI void CommitTargetLoweringOpt(const TargetLoweringOpt &TLO)
This structure is used to pass arguments to makeLibCall function.
MakeLibCallOptions & setIsPostTypeLegalization(bool Value=true)
MakeLibCallOptions & setTypeListBeforeSoften(ArrayRef< EVT > OpsVT, EVT RetVT)
MakeLibCallOptions & setIsSigned(bool Value=true)
A convenience struct that encapsulates a DAG, and two SDValues for returning information from TargetL...
Magic data for optimising unsigned division by a constant.
static LLVM_ABI UnsignedDivisionByConstantInfo get(const APInt &D, unsigned LeadingZeros=0, bool AllowEvenDivisorOptimization=true, bool AllowWidenOptimization=false)
Calculate the magic numbers required to implement an unsigned integer division by a constant as a seq...
fltNonfiniteBehavior nonFiniteBehavior
Definition APFloat.h:1031
fltNanEncoding nanEncoding
Definition APFloat.h:1033