LLVM 24.0.0git
InstCombineCalls.cpp
Go to the documentation of this file.
1//===- InstCombineCalls.cpp -----------------------------------------------===//
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 file implements the visitCall, visitInvoke, and visitCallBr functions.
10//
11//===----------------------------------------------------------------------===//
12
13#include "InstCombineInternal.h"
14#include "llvm/ADT/APFloat.h"
15#include "llvm/ADT/APInt.h"
16#include "llvm/ADT/APSInt.h"
17#include "llvm/ADT/ArrayRef.h"
18#include "llvm/ADT/Bitset.h"
22#include "llvm/ADT/Statistic.h"
28#include "llvm/Analysis/Loads.h"
33#include "llvm/IR/Attributes.h"
34#include "llvm/IR/BasicBlock.h"
36#include "llvm/IR/Constant.h"
37#include "llvm/IR/Constants.h"
38#include "llvm/IR/DataLayout.h"
39#include "llvm/IR/DebugInfo.h"
41#include "llvm/IR/Function.h"
43#include "llvm/IR/InlineAsm.h"
44#include "llvm/IR/InstrTypes.h"
45#include "llvm/IR/Instruction.h"
48#include "llvm/IR/Intrinsics.h"
49#include "llvm/IR/IntrinsicsAArch64.h"
50#include "llvm/IR/IntrinsicsAMDGPU.h"
51#include "llvm/IR/IntrinsicsARM.h"
52#include "llvm/IR/IntrinsicsHexagon.h"
53#include "llvm/IR/LLVMContext.h"
54#include "llvm/IR/Metadata.h"
57#include "llvm/IR/Statepoint.h"
58#include "llvm/IR/Type.h"
59#include "llvm/IR/User.h"
60#include "llvm/IR/Value.h"
61#include "llvm/IR/ValueHandle.h"
65#include "llvm/Support/Debug.h"
76#include <algorithm>
77#include <cassert>
78#include <cstdint>
79#include <optional>
80#include <utility>
81#include <vector>
82
83#define DEBUG_TYPE "instcombine"
85
86using namespace llvm;
87using namespace PatternMatch;
88
89STATISTIC(NumSimplified, "Number of library calls simplified");
90
91/// Return the specified type promoted as it would be to pass though a va_arg
92/// area.
94 if (IntegerType* ITy = dyn_cast<IntegerType>(Ty)) {
95 if (ITy->getBitWidth() < 32)
96 return Type::getInt32Ty(Ty->getContext());
97 }
98 return Ty;
99}
100
101/// Recognize a memcpy/memmove from a trivially otherwise unused alloca.
102/// TODO: This should probably be integrated with visitAllocSites, but that
103/// requires a deeper change to allow either unread or unwritten objects.
105 auto *Src = MI->getRawSource();
106 while (isa<GetElementPtrInst>(Src)) {
107 if (!Src->hasOneUse())
108 return false;
109 Src = cast<Instruction>(Src)->getOperand(0);
110 }
111 return isa<AllocaInst>(Src) && Src->hasOneUse();
112}
113
115 Align DstAlign = getKnownAlignment(MI->getRawDest(), DL, MI, &AC, &DT);
116 MaybeAlign CopyDstAlign = MI->getDestAlign();
117 if (!CopyDstAlign || *CopyDstAlign < DstAlign) {
118 MI->setDestAlignment(DstAlign);
119 return MI;
120 }
121
122 Align SrcAlign = getKnownAlignment(MI->getRawSource(), DL, MI, &AC, &DT);
123 MaybeAlign CopySrcAlign = MI->getSourceAlign();
124 if (!CopySrcAlign || *CopySrcAlign < SrcAlign) {
125 MI->setSourceAlignment(SrcAlign);
126 return MI;
127 }
128
129 // If we have a store to a location which is known constant, we can conclude
130 // that the store must be storing the constant value (else the memory
131 // wouldn't be constant), and this must be a noop.
132 if (!isModSet(AA->getModRefInfoMask(MI->getDest()))) {
133 // Set the size of the copy to 0, it will be deleted on the next iteration.
134 MI->setLength((uint64_t)0);
135 return MI;
136 }
137
138 // If the source is provably undef, the memcpy/memmove doesn't do anything
139 // (unless the transfer is volatile).
140 if (hasUndefSource(MI) && !MI->isVolatile()) {
141 // Set the size of the copy to 0, it will be deleted on the next iteration.
142 MI->setLength((uint64_t)0);
143 return MI;
144 }
145
146 // If MemCpyInst length is 1/2/4/8 bytes then replace memcpy with
147 // load/store.
148 ConstantInt *MemOpLength = dyn_cast<ConstantInt>(MI->getLength());
149 if (!MemOpLength) return nullptr;
150
151 // Source and destination pointer types are always "i8*" for intrinsic. See
152 // if the size is something we can handle with a single primitive load/store.
153 // A single load+store correctly handles overlapping memory in the memmove
154 // case.
155 uint64_t Size = MemOpLength->getLimitedValue();
156 assert(Size && "0-sized memory transferring should be removed already.");
157
158 if (Size > 8 || (Size&(Size-1)))
159 return nullptr; // If not 1/2/4/8 bytes, exit.
160
161 // If it is an atomic and alignment is less than the size then we will
162 // introduce the unaligned memory access which will be later transformed
163 // into libcall in CodeGen. This is not evident performance gain so disable
164 // it now.
165 if (MI->isAtomic())
166 if (*CopyDstAlign < Size || *CopySrcAlign < Size)
167 return nullptr;
168
169 // Use an integer load+store unless we can find something better.
170 IntegerType* IntType = IntegerType::get(MI->getContext(), Size<<3);
171
172 // If the memcpy has metadata describing the members, see if we can get the
173 // TBAA, scope and noalias tags describing our copy.
174 AAMDNodes AACopyMD = MI->getAAMetadata().adjustForAccess(Size);
175
176 Value *Src = MI->getArgOperand(1);
177 Value *Dest = MI->getArgOperand(0);
178 LoadInst *L = Builder.CreateLoad(IntType, Src);
179 // Alignment from the mem intrinsic will be better, so use it.
180 L->setAlignment(*CopySrcAlign);
181 L->setAAMetadata(AACopyMD);
182 MDNode *LoopMemParallelMD =
183 MI->getMetadata(LLVMContext::MD_mem_parallel_loop_access);
184 if (LoopMemParallelMD)
185 L->setMetadata(LLVMContext::MD_mem_parallel_loop_access, LoopMemParallelMD);
186 MDNode *AccessGroupMD = MI->getMetadata(LLVMContext::MD_access_group);
187 if (AccessGroupMD)
188 L->setMetadata(LLVMContext::MD_access_group, AccessGroupMD);
189
190 StoreInst *S = Builder.CreateStore(L, Dest);
191 // Alignment from the mem intrinsic will be better, so use it.
192 S->setAlignment(*CopyDstAlign);
193 S->setAAMetadata(AACopyMD);
194 if (LoopMemParallelMD)
195 S->setMetadata(LLVMContext::MD_mem_parallel_loop_access, LoopMemParallelMD);
196 if (AccessGroupMD)
197 S->setMetadata(LLVMContext::MD_access_group, AccessGroupMD);
198 S->copyMetadata(*MI, LLVMContext::MD_DIAssignID);
199
200 if (auto *MT = dyn_cast<MemTransferInst>(MI)) {
201 // non-atomics can be volatile
202 L->setVolatile(MT->isVolatile());
203 S->setVolatile(MT->isVolatile());
204 }
205 if (MI->isAtomic()) {
206 // atomics have to be unordered
207 L->setOrdering(AtomicOrdering::Unordered);
209 }
210
211 // Set the size of the copy to 0, it will be deleted on the next iteration.
212 MI->setLength((uint64_t)0);
213 return MI;
214}
215
217 const Align KnownAlignment =
218 getKnownAlignment(MI->getDest(), DL, MI, &AC, &DT);
219 MaybeAlign MemSetAlign = MI->getDestAlign();
220 if (!MemSetAlign || *MemSetAlign < KnownAlignment) {
221 MI->setDestAlignment(KnownAlignment);
222 return MI;
223 }
224
225 // If we have a store to a location which is known constant, we can conclude
226 // that the store must be storing the constant value (else the memory
227 // wouldn't be constant), and this must be a noop.
228 if (!isModSet(AA->getModRefInfoMask(MI->getDest()))) {
229 // Set the size of the copy to 0, it will be deleted on the next iteration.
230 MI->setLength((uint64_t)0);
231 return MI;
232 }
233
234 // Remove memset with an undef value.
235 // FIXME: This is technically incorrect because it might overwrite a poison
236 // value. Change to PoisonValue once #52930 is resolved.
237 if (isa<UndefValue>(MI->getValue())) {
238 // Set the size of the copy to 0, it will be deleted on the next iteration.
239 MI->setLength((uint64_t)0);
240 return MI;
241 }
242
243 // Extract the length and validate the fill type.
244 ConstantInt *LenC = dyn_cast<ConstantInt>(MI->getLength());
245 Value *Fill = MI->getValue();
246 if (!LenC || !Fill->getType()->isIntegerTy(8))
247 return nullptr;
248 const uint64_t Len = LenC->getLimitedValue();
249 assert(Len && "0-sized memory setting should be removed already.");
250 const Align Alignment = MI->getDestAlign().valueOrOne();
251
252 // If it is an atomic and alignment is less than the size then we will
253 // introduce the unaligned memory access which will be later transformed
254 // into libcall in CodeGen. This is not evident performance gain so disable
255 // it now.
256 if (MI->isAtomic() && Alignment < Len)
257 return nullptr;
258
259 // memset(s,c,n) -> store s, c (for n=1,2,4,8)
260 if (Len <= 8 && isPowerOf2_32((uint32_t)Len)) {
261 Value *Dest = MI->getDest();
262
263 // Extract the fill value and store. A one-byte memset does not need
264 // replication so a nonconstant i8 fill can be stored directly.
265 Value *FillVal;
266 if (auto *FillC = dyn_cast<ConstantInt>(Fill))
267 FillVal = ConstantInt::get(MI->getContext(),
268 APInt::getSplat(Len * 8, FillC->getValue()));
269 else if (Len == 1)
270 FillVal = Fill;
271 else
272 return nullptr;
273
274 StoreInst *S = Builder.CreateStore(FillVal, Dest, MI->isVolatile());
275 S->copyMetadata(*MI, LLVMContext::MD_DIAssignID);
276 for (DbgVariableRecord *DbgAssign : at::getDVRAssignmentMarkers(S)) {
277 if (llvm::is_contained(DbgAssign->location_ops(), Fill))
278 DbgAssign->replaceVariableLocationOp(Fill, FillVal);
279 }
280
281 S->setAlignment(Alignment);
282 if (MI->isAtomic())
284
285 // Set the size of the copy to 0, it will be deleted on the next iteration.
286 MI->setLength((uint64_t)0);
287 return MI;
288 }
289
290 return nullptr;
291}
292
293// TODO, Obvious Missing Transforms:
294// * Narrow width by halfs excluding zero/undef lanes
295Value *InstCombinerImpl::simplifyMaskedLoad(IntrinsicInst &II) {
296 Value *LoadPtr = II.getArgOperand(0);
297 const Align Alignment = II.getParamAlign(0).valueOrOne();
298 Value *Mask = II.getArgOperand(1);
299
300 // If the mask is all ones or poison, this is a plain vector load of the 1st
301 // argument.
302 if (match(Mask, m_AllOnesOrPoison())) {
303 LoadInst *L = Builder.CreateAlignedLoad(II.getType(), LoadPtr, Alignment,
304 "unmaskedload");
305 L->copyMetadata(II);
306 return L;
307 }
308
309 // If we can unconditionally load from this address, replace with a
310 // load/select idiom.
311 if (isDereferenceablePointer(LoadPtr, II.getType(),
313 LoadInst *LI = Builder.CreateAlignedLoad(II.getType(), LoadPtr, Alignment,
314 "unmaskedload");
315 LI->copyMetadata(II);
316 return Builder.CreateSelect(II.getArgOperand(1), LI, II.getArgOperand(2));
317 }
318
319 return nullptr;
320}
321
322// TODO, Obvious Missing Transforms:
323// * Single constant active lane -> store
324// * Narrow width by halfs excluding zero/undef lanes
325Instruction *InstCombinerImpl::simplifyMaskedStore(IntrinsicInst &II) {
326 Value *StorePtr = II.getArgOperand(1);
327 Align Alignment = II.getParamAlign(1).valueOrOne();
328 auto *ConstMask = dyn_cast<Constant>(II.getArgOperand(2));
329 if (!ConstMask)
330 return nullptr;
331
332 // If the mask is all zeros or poison, this instruction does nothing.
333 if (match(ConstMask, m_ZeroOrPoison()))
335
336 // If the mask is all ones or poison, this is a plain vector store of the 1st
337 // argument.
338 if (match(ConstMask, m_AllOnesOrPoison())) {
339 StoreInst *S =
340 new StoreInst(II.getArgOperand(0), StorePtr, false, Alignment);
341 S->copyMetadata(II);
342 return S;
343 }
344
345 if (isa<ScalableVectorType>(ConstMask->getType()))
346 return nullptr;
347
348 // Use masked off lanes to simplify operands via SimplifyDemandedVectorElts
349 APInt DemandedElts = possiblyDemandedEltsInMask(ConstMask);
350 APInt PoisonElts(DemandedElts.getBitWidth(), 0);
351 if (Value *V = SimplifyDemandedVectorElts(II.getOperand(0), DemandedElts,
352 PoisonElts))
353 return replaceOperand(II, 0, V);
354
355 return nullptr;
356}
357
358// TODO, Obvious Missing Transforms:
359// * Single constant active lane load -> load
360// * Dereferenceable address & few lanes -> scalarize speculative load/selects
361// * Adjacent vector addresses -> masked.load
362// * Narrow width by halfs excluding zero/undef lanes
363// * Vector incrementing address -> vector masked load
364Instruction *InstCombinerImpl::simplifyMaskedGather(IntrinsicInst &II) {
365 auto *ConstMask = dyn_cast<Constant>(II.getArgOperand(1));
366 if (!ConstMask)
367 return nullptr;
368
369 // Vector splat address w/known mask -> scalar load
370 // Fold the gather to load the source vector first lane
371 // because it is reloading the same value each time
372 if (ConstMask->isAllOnesValue())
373 if (auto *SplatPtr = getSplatValue(II.getArgOperand(0))) {
374 auto *VecTy = cast<VectorType>(II.getType());
375 const Align Alignment = II.getParamAlign(0).valueOrOne();
376 LoadInst *L = Builder.CreateAlignedLoad(VecTy->getElementType(), SplatPtr,
377 Alignment, "load.scalar");
378 Value *Shuf =
379 Builder.CreateVectorSplat(VecTy->getElementCount(), L, "broadcast");
381 }
382
383 return nullptr;
384}
385
386// TODO, Obvious Missing Transforms:
387// * Single constant active lane -> store
388// * Adjacent vector addresses -> masked.store
389// * Narrow store width by halfs excluding zero/undef lanes
390// * Vector incrementing address -> vector masked store
391Instruction *InstCombinerImpl::simplifyMaskedScatter(IntrinsicInst &II) {
392 auto *ConstMask = dyn_cast<Constant>(II.getArgOperand(2));
393 if (!ConstMask)
394 return nullptr;
395
396 // If the mask is all zeros or poison, a scatter does nothing.
397 if (match(ConstMask, m_ZeroOrPoison()))
399
400 // Vector splat address -> scalar store
401 if (auto *SplatPtr = getSplatValue(II.getArgOperand(1))) {
402 // scatter(splat(value), splat(ptr), non-zero-mask) -> store value, ptr
403 if (auto *SplatValue = getSplatValue(II.getArgOperand(0))) {
404 if (maskContainsAllOneOrUndef(ConstMask)) {
405 Align Alignment = II.getParamAlign(1).valueOrOne();
406 StoreInst *S = new StoreInst(SplatValue, SplatPtr, /*IsVolatile=*/false,
407 Alignment);
408 S->copyMetadata(II);
409 return S;
410 }
411 }
412 // scatter(vector, splat(ptr), splat(true)) -> store extract(vector,
413 // lastlane), ptr
414 if (ConstMask->isAllOnesValue()) {
415 Align Alignment = II.getParamAlign(1).valueOrOne();
416 VectorType *WideLoadTy = cast<VectorType>(II.getArgOperand(1)->getType());
417 ElementCount VF = WideLoadTy->getElementCount();
418 Value *RunTimeVF = Builder.CreateElementCount(Builder.getInt32Ty(), VF);
419 Value *LastLane = Builder.CreateSub(RunTimeVF, Builder.getInt32(1));
420 Value *Extract =
421 Builder.CreateExtractElement(II.getArgOperand(0), LastLane);
422 StoreInst *S =
423 new StoreInst(Extract, SplatPtr, /*IsVolatile=*/false, Alignment);
424 S->copyMetadata(II);
425 return S;
426 }
427 }
428 if (isa<ScalableVectorType>(ConstMask->getType()))
429 return nullptr;
430
431 // Use masked off lanes to simplify operands via SimplifyDemandedVectorElts
432 APInt DemandedElts = possiblyDemandedEltsInMask(ConstMask);
433 APInt PoisonElts(DemandedElts.getBitWidth(), 0);
434 if (Value *V = SimplifyDemandedVectorElts(II.getOperand(0), DemandedElts,
435 PoisonElts))
436 return replaceOperand(II, 0, V);
437 if (Value *V = SimplifyDemandedVectorElts(II.getOperand(1), DemandedElts,
438 PoisonElts))
439 return replaceOperand(II, 1, V);
440
441 return nullptr;
442}
443
444/// This function transforms launder.invariant.group like:
445/// launder(launder(%x)) -> launder(%x) (the result is not the argument)
446/// This is legal because it preserves the most recent information about
447/// the presence or absence of invariant.group.
449 InstCombinerImpl &IC) {
450 auto *Arg = II.getArgOperand(0);
451 auto *StrippedArg = Arg->stripPointerCasts();
452 auto *StrippedInvariantGroupsArg = StrippedArg;
453 while (auto *Intr = dyn_cast<IntrinsicInst>(StrippedInvariantGroupsArg)) {
454 if (Intr->getIntrinsicID() != Intrinsic::launder_invariant_group)
455 break;
456 StrippedInvariantGroupsArg = Intr->getArgOperand(0)->stripPointerCasts();
457 }
458 if (StrippedArg == StrippedInvariantGroupsArg)
459 return nullptr; // No launders to remove.
460
461 Value *Result =
462 IC.Builder.CreateLaunderInvariantGroup(StrippedInvariantGroupsArg);
463 if (Result->getType()->getPointerAddressSpace() !=
464 II.getType()->getPointerAddressSpace())
465 Result = IC.Builder.CreateAddrSpaceCast(Result, II.getType());
466
467 return cast<Instruction>(Result);
468}
469
471 assert((II.getIntrinsicID() == Intrinsic::cttz ||
472 II.getIntrinsicID() == Intrinsic::ctlz) &&
473 "Expected cttz or ctlz intrinsic");
474 bool IsTZ = II.getIntrinsicID() == Intrinsic::cttz;
475 Value *Op0 = II.getArgOperand(0);
476 Value *Op1 = II.getArgOperand(1);
477 Value *X;
478 // ctlz(bitreverse(x)) -> cttz(x)
479 // cttz(bitreverse(x)) -> ctlz(x)
480 if (match(Op0, m_BitReverse(m_Value(X)))) {
481 Intrinsic::ID ID = IsTZ ? Intrinsic::ctlz : Intrinsic::cttz;
482 Function *F =
483 Intrinsic::getOrInsertDeclaration(II.getModule(), ID, II.getType());
484 return CallInst::Create(F, {X, II.getArgOperand(1)});
485 }
486
487 if (II.getType()->isIntOrIntVectorTy(1)) {
488 // ctlz/cttz i1 Op0 --> not Op0
489 if (match(Op1, m_Zero()))
490 return BinaryOperator::CreateNot(Op0);
491 // If zero is poison, then the input can be assumed to be "true", so the
492 // instruction simplifies to "false".
493 assert(match(Op1, m_One()) && "Expected ctlz/cttz operand to be 0 or 1");
494 return IC.replaceInstUsesWith(II, ConstantInt::getNullValue(II.getType()));
495 }
496
497 // If ctlz/cttz is only used as a shift amount, set is_zero_poison to true.
498 if (II.hasOneUse() && match(Op1, m_Zero()) &&
499 match(II.user_back(), m_Shift(m_Value(), m_Specific(&II))))
500 return CallInst::Create(II.getCalledFunction(),
501 {Op0, IC.Builder.getTrue()});
502
503 Constant *C;
504
505 if (IsTZ) {
506 // cttz(-x) -> cttz(x)
507 if (match(Op0, m_Neg(m_Value(X))))
508 return CallInst::Create(II.getCalledFunction(), {X, Op1});
509
510 // cttz(-x & x) -> cttz(x)
511 if (match(Op0, m_c_And(m_Neg(m_Value(X)), m_Deferred(X))))
512 return CallInst::Create(II.getCalledFunction(), {X, Op1});
513
514 // cttz(mul(X, OddC)) -> cttz(X)
515 if (match(Op0, m_Mul(m_Value(X),
516 m_CheckedInt([](const APInt &C) { return C[0]; }))))
517 return CallInst::Create(II.getCalledFunction(), {X, Op1});
518
519 // cttz(sext(x)) -> cttz(zext(x))
520 if (match(Op0, m_OneUse(m_SExt(m_Value(X))))) {
521 auto *Zext = IC.Builder.CreateZExt(X, II.getType());
522 auto *CttzZext =
523 IC.Builder.CreateBinaryIntrinsic(Intrinsic::cttz, Zext, Op1);
524 return IC.replaceInstUsesWith(II, CttzZext);
525 }
526
527 // Zext doesn't change the number of trailing zeros, so narrow:
528 // cttz(zext(x)) -> zext(cttz(x)) if the 'ZeroIsPoison' parameter is 'true'.
529 if (match(Op0, m_OneUse(m_ZExt(m_Value(X)))) && match(Op1, m_One())) {
530 auto *Cttz = IC.Builder.CreateBinaryIntrinsic(Intrinsic::cttz, X,
531 IC.Builder.getTrue());
532 auto *ZextCttz = IC.Builder.CreateZExt(Cttz, II.getType());
533 return IC.replaceInstUsesWith(II, ZextCttz);
534 }
535
536 // cttz(abs(x)) -> cttz(x)
537 // cttz(nabs(x)) -> cttz(x)
538 Value *Y;
540 if (SPF == SPF_ABS || SPF == SPF_NABS)
541 return CallInst::Create(II.getCalledFunction(), {X, Op1});
542
544 return CallInst::Create(II.getCalledFunction(), {X, Op1});
545
546 // cttz(shl(%const, %val), 1) --> add(cttz(%const, 1), %val)
547 if (match(Op0, m_Shl(m_ImmConstant(C), m_Value(X))) &&
548 match(Op1, m_One())) {
549 Value *ConstCttz =
550 IC.Builder.CreateBinaryIntrinsic(Intrinsic::cttz, C, Op1);
551 return BinaryOperator::CreateAdd(ConstCttz, X);
552 }
553
554 // cttz(lshr exact (%const, %val), 1) --> sub(cttz(%const, 1), %val)
555 if (match(Op0, m_Exact(m_LShr(m_ImmConstant(C), m_Value(X)))) &&
556 match(Op1, m_One())) {
557 Value *ConstCttz =
558 IC.Builder.CreateBinaryIntrinsic(Intrinsic::cttz, C, Op1);
559 return BinaryOperator::CreateSub(ConstCttz, X);
560 }
561
562 // cttz(add(lshr(UINT_MAX, %val), 1)) --> sub(width, %val)
563 if (match(Op0, m_Add(m_LShr(m_AllOnes(), m_Value(X)), m_One()))) {
564 Value *Width =
565 ConstantInt::get(II.getType(), II.getType()->getScalarSizeInBits());
566 return BinaryOperator::CreateSub(Width, X);
567 }
568 } else {
569 // ctlz(lshr(%const, %val), 1) --> add(ctlz(%const, 1), %val)
570 if (match(Op0, m_LShr(m_ImmConstant(C), m_Value(X))) &&
571 match(Op1, m_One())) {
572 Value *ConstCtlz =
573 IC.Builder.CreateBinaryIntrinsic(Intrinsic::ctlz, C, Op1);
574 return BinaryOperator::CreateAdd(ConstCtlz, X);
575 }
576
577 // ctlz(shl nuw (%const, %val), 1) --> sub(ctlz(%const, 1), %val)
578 if (match(Op0, m_NUWShl(m_ImmConstant(C), m_Value(X))) &&
579 match(Op1, m_One())) {
580 Value *ConstCtlz =
581 IC.Builder.CreateBinaryIntrinsic(Intrinsic::ctlz, C, Op1);
582 return BinaryOperator::CreateSub(ConstCtlz, X);
583 }
584
585 // ctlz(~x & (x - 1)) -> bitwidth - cttz(x, false)
586 if (Op0->hasOneUse() &&
587 match(Op0,
589 Type *Ty = II.getType();
590 unsigned BitWidth = Ty->getScalarSizeInBits();
591 auto *Cttz = IC.Builder.CreateIntrinsic(Intrinsic::cttz, Ty,
592 {X, IC.Builder.getFalse()});
593 auto *Bw = ConstantInt::get(Ty, APInt(BitWidth, BitWidth));
594 return IC.replaceInstUsesWith(II, IC.Builder.CreateSub(Bw, Cttz));
595 }
596 }
597
598 // cttz(Pow2) -> Log2(Pow2)
599 // ctlz(Pow2) -> BitWidth - 1 - Log2(Pow2)
600 if (auto *R = IC.tryGetLog2(Op0, match(Op1, m_One()))) {
601 if (IsTZ)
602 return IC.replaceInstUsesWith(II, R);
603 BinaryOperator *BO = BinaryOperator::CreateSub(
604 ConstantInt::get(R->getType(), R->getType()->getScalarSizeInBits() - 1),
605 R);
606 BO->setHasNoSignedWrap();
608 return BO;
609 }
610
612
613 // Create a mask for bits above (ctlz) or below (cttz) the first known one.
614 unsigned PossibleZeros = IsTZ ? Known.countMaxTrailingZeros()
615 : Known.countMaxLeadingZeros();
616 unsigned DefiniteZeros = IsTZ ? Known.countMinTrailingZeros()
617 : Known.countMinLeadingZeros();
618
619 // If all bits above (ctlz) or below (cttz) the first known one are known
620 // zero, this value is constant.
621 // FIXME: This should be in InstSimplify because we're replacing an
622 // instruction with a constant.
623 if (PossibleZeros == DefiniteZeros) {
624 auto *C = ConstantInt::get(Op0->getType(), DefiniteZeros);
625 return IC.replaceInstUsesWith(II, C);
626 }
627
628 // If the input to cttz/ctlz is known to be non-zero,
629 // then change the 'ZeroIsPoison' parameter to 'true'
630 // because we know the zero behavior can't affect the result.
631 if (!Known.One.isZero() ||
633 if (!match(II.getArgOperand(1), m_One()))
634 return CallInst::Create(II.getCalledFunction(),
635 {Op0, IC.Builder.getTrue()});
636 }
637
638 // Add range attribute since known bits can't completely reflect what we know.
639 unsigned BitWidth = Op0->getType()->getScalarSizeInBits();
640 if (BitWidth != 1 && !II.hasRetAttr(Attribute::Range) &&
641 !II.getMetadata(LLVMContext::MD_range)) {
642 ConstantRange Range(APInt(BitWidth, DefiniteZeros),
643 APInt(BitWidth, PossibleZeros + 1));
644 II.addRangeRetAttr(Range);
645 return &II;
646 }
647
648 return nullptr;
649}
650
652 assert(II.getIntrinsicID() == Intrinsic::ctpop &&
653 "Expected ctpop intrinsic");
654 Type *Ty = II.getType();
655 unsigned BitWidth = Ty->getScalarSizeInBits();
656 Value *Op0 = II.getArgOperand(0);
657 Value *X, *Y;
658
659 // ctpop(bitreverse(x)) -> ctpop(x)
660 // ctpop(bswap(x)) -> ctpop(x)
661 if (match(Op0, m_BitReverse(m_Value(X))) || match(Op0, m_BSwap(m_Value(X))))
662 return CallInst::Create(II.getCalledFunction(), X);
663
664 // ctpop(rot(x)) -> ctpop(x)
665 if ((match(Op0, m_FShl(m_Value(X), m_Value(Y), m_Value())) ||
666 match(Op0, m_FShr(m_Value(X), m_Value(Y), m_Value()))) &&
667 X == Y)
668 return CallInst::Create(II.getCalledFunction(), X);
669
670 // ctpop(x | -x) -> bitwidth - cttz(x, false)
671 if (Op0->hasOneUse() &&
672 match(Op0, m_c_Or(m_Value(X), m_Neg(m_Deferred(X))))) {
673 auto *Cttz = IC.Builder.CreateIntrinsic(Intrinsic::cttz, Ty,
674 {X, IC.Builder.getFalse()});
675 auto *Bw = ConstantInt::get(Ty, APInt(BitWidth, BitWidth));
676 return IC.replaceInstUsesWith(II, IC.Builder.CreateSub(Bw, Cttz));
677 }
678
679 // ctpop(~x & (x - 1)) -> cttz(x, false)
680 if (match(Op0,
682 Function *F =
683 Intrinsic::getOrInsertDeclaration(II.getModule(), Intrinsic::cttz, Ty);
684 return CallInst::Create(F, {X, IC.Builder.getFalse()});
685 }
686
687 // Zext doesn't change the number of set bits, so narrow:
688 // ctpop (zext X) --> zext (ctpop X)
689 if (match(Op0, m_OneUse(m_ZExt(m_Value(X))))) {
690 Value *NarrowPop = IC.Builder.CreateUnaryIntrinsic(Intrinsic::ctpop, X);
691 return CastInst::Create(Instruction::ZExt, NarrowPop, Ty);
692 }
693
695 IC.computeKnownBits(Op0, Known, &II);
696
697 // If all bits are zero except for exactly one fixed bit, then the result
698 // must be 0 or 1, and we can get that answer by shifting to LSB:
699 // ctpop (X & 32) --> (X & 32) >> 5
700 // TODO: Investigate removing this as its likely unnecessary given the below
701 // `isKnownToBeAPowerOfTwo` check.
702 if ((~Known.Zero).isPowerOf2())
703 return BinaryOperator::CreateLShr(
704 Op0, ConstantInt::get(Ty, (~Known.Zero).exactLogBase2()));
705
706 // More generally we can also handle non-constant power of 2 patterns such as
707 // shl/shr(Pow2, X), (X & -X), etc... by transforming:
708 // ctpop(Pow2OrZero) --> icmp ne X, 0
709 if (IC.isKnownToBeAPowerOfTwo(Op0, /* OrZero */ true))
710 return CastInst::Create(Instruction::ZExt,
713 Ty);
714
715 // Add range attribute since known bits can't completely reflect what we know.
716 if (BitWidth != 1) {
717 ConstantRange OldRange =
718 II.getRange().value_or(ConstantRange::getFull(BitWidth));
719
720 unsigned Lower = Known.countMinPopulation();
721 unsigned Upper = Known.countMaxPopulation() + 1;
722
723 if (Lower == 0 && OldRange.contains(APInt::getZero(BitWidth)) &&
725 Lower = 1;
726
728 Range = Range.intersectWith(OldRange, ConstantRange::Unsigned);
729
730 if (Range != OldRange) {
731 II.addRangeRetAttr(Range);
732 return &II;
733 }
734 }
735
736 return nullptr;
737}
738
739/// Convert `tbl`/`tbx` intrinsics to shufflevector if the mask is constant, and
740/// at most two source operands are actually referenced.
742 bool IsExtension) {
743 // Bail out if the mask is not a constant.
744 auto *C = dyn_cast<Constant>(II.getArgOperand(II.arg_size() - 1));
745 if (!C)
746 return nullptr;
747
748 auto *RetTy = cast<FixedVectorType>(II.getType());
749 unsigned NumIndexes = RetTy->getNumElements();
750
751 // Only perform this transformation for <8 x i8> and <16 x i8> vector types.
752 if (!RetTy->getElementType()->isIntegerTy(8) ||
753 (NumIndexes != 8 && NumIndexes != 16))
754 return nullptr;
755
756 // For tbx instructions, the first argument is the "fallback" vector, which
757 // has the same length as the mask and return type.
758 unsigned int StartIndex = (unsigned)IsExtension;
759 auto *SourceTy =
760 cast<FixedVectorType>(II.getArgOperand(StartIndex)->getType());
761 // Note that the element count of each source vector does *not* need to be the
762 // same as the element count of the return type and mask! All source vectors
763 // must have the same element count as each other, though.
764 unsigned NumElementsPerSource = SourceTy->getNumElements();
765
766 // There are no tbl/tbx intrinsics for which the destination size exceeds the
767 // source size. However, our definitions of the intrinsics, at least in
768 // IntrinsicsAArch64.td, allow for arbitrary destination vector sizes, so it
769 // *could* technically happen.
770 if (NumIndexes > NumElementsPerSource)
771 return nullptr;
772
773 // The tbl/tbx intrinsics take several source operands followed by a mask
774 // operand.
775 unsigned int NumSourceOperands = II.arg_size() - 1 - (unsigned)IsExtension;
776
777 // Map input operands to shuffle indices. This also helpfully deduplicates the
778 // input arguments, in case the same value is passed as an argument multiple
779 // times.
780 SmallDenseMap<Value *, unsigned, 2> ValueToShuffleSlot;
781 Value *ShuffleOperands[2] = {PoisonValue::get(SourceTy),
782 PoisonValue::get(SourceTy)};
783
784 int Indexes[16];
785 for (unsigned I = 0; I < NumIndexes; ++I) {
786 Constant *COp = C->getAggregateElement(I);
787
788 if (!COp || (!isa<UndefValue>(COp) && !isa<ConstantInt>(COp)))
789 return nullptr;
790
791 if (isa<UndefValue>(COp)) {
792 Indexes[I] = -1;
793 continue;
794 }
795
796 uint64_t Index = cast<ConstantInt>(COp)->getZExtValue();
797 // The index of the input argument that this index references (0 = first
798 // source argument, etc).
799 unsigned SourceOperandIndex = Index / NumElementsPerSource;
800 // The index of the element at that source operand.
801 unsigned SourceOperandElementIndex = Index % NumElementsPerSource;
802
803 Value *SourceOperand;
804 if (SourceOperandIndex >= NumSourceOperands) {
805 // This index is out of bounds. Map it to index into either the fallback
806 // vector (tbx) or vector of zeroes (tbl).
807 SourceOperandIndex = NumSourceOperands;
808 if (IsExtension) {
809 // For out-of-bounds indices in tbx, choose the `I`th element of the
810 // fallback.
811 SourceOperand = II.getArgOperand(0);
812 SourceOperandElementIndex = I;
813 } else {
814 // Otherwise, choose some element from the dummy vector of zeroes (we'll
815 // always choose the first).
816 SourceOperand = Constant::getNullValue(SourceTy);
817 SourceOperandElementIndex = 0;
818 }
819 } else {
820 SourceOperand = II.getArgOperand(SourceOperandIndex + StartIndex);
821 }
822
823 // The source operand may be the fallback vector, which may not have the
824 // same number of elements as the source vector. In that case, we *could*
825 // choose to extend its length with another shufflevector, but it's simpler
826 // to just bail instead.
827 if (cast<FixedVectorType>(SourceOperand->getType())->getNumElements() !=
828 NumElementsPerSource)
829 return nullptr;
830
831 // We now know the source operand referenced by this index. Make it a
832 // shufflevector operand, if it isn't already.
833 unsigned NumSlots = ValueToShuffleSlot.size();
834 // This shuffle references more than two sources, and hence cannot be
835 // represented as a shufflevector.
836 if (NumSlots == 2 && !ValueToShuffleSlot.contains(SourceOperand))
837 return nullptr;
838
839 auto [It, Inserted] =
840 ValueToShuffleSlot.try_emplace(SourceOperand, NumSlots);
841 if (Inserted)
842 ShuffleOperands[It->getSecond()] = SourceOperand;
843
844 unsigned RemappedIndex =
845 (It->getSecond() * NumElementsPerSource) + SourceOperandElementIndex;
846 Indexes[I] = RemappedIndex;
847 }
848
850 ShuffleOperands[0], ShuffleOperands[1], ArrayRef(Indexes, NumIndexes));
851 return IC.replaceInstUsesWith(II, Shuf);
852}
853
854// Returns true iff the 2 intrinsics have the same operands, limiting the
855// comparison to the first NumOperands.
856static bool haveSameOperands(const IntrinsicInst &I, const IntrinsicInst &E,
857 unsigned NumOperands) {
858 assert(I.arg_size() >= NumOperands && "Not enough operands");
859 assert(E.arg_size() >= NumOperands && "Not enough operands");
860 for (unsigned i = 0; i < NumOperands; i++)
861 if (I.getArgOperand(i) != E.getArgOperand(i))
862 return false;
863 return true;
864}
865
866// Remove trivially empty start/end intrinsic ranges, i.e. a start
867// immediately followed by an end (ignoring debuginfo or other
868// start/end intrinsics in between). As this handles only the most trivial
869// cases, tracking the nesting level is not needed:
870//
871// call @llvm.foo.start(i1 0)
872// call @llvm.foo.start(i1 0) ; This one won't be skipped: it will be removed
873// call @llvm.foo.end(i1 0)
874// call @llvm.foo.end(i1 0) ; &I
875static bool
877 std::function<bool(const IntrinsicInst &)> IsStart) {
878 // We start from the end intrinsic and scan backwards, so that InstCombine
879 // has already processed (and potentially removed) all the instructions
880 // before the end intrinsic.
881 BasicBlock::reverse_iterator BI(EndI), BE(EndI.getParent()->rend());
882 for (; BI != BE; ++BI) {
883 if (auto *I = dyn_cast<IntrinsicInst>(&*BI)) {
884 if (isa<PseudoProbeInst>(I) ||
885 I->getIntrinsicID() == EndI.getIntrinsicID())
886 continue;
887 if (IsStart(*I)) {
888 if (haveSameOperands(EndI, *I, EndI.arg_size())) {
890 IC.eraseInstFromFunction(EndI);
891 return true;
892 }
893 // Skip start intrinsics that don't pair with this end intrinsic.
894 continue;
895 }
896 }
897 break;
898 }
899
900 return false;
901}
902
904 removeTriviallyEmptyRange(I, *this, [&I](const IntrinsicInst &II) {
905 // Bail out on the case where the source va_list of a va_copy is destroyed
906 // immediately by a follow-up va_end.
907 return II.getIntrinsicID() == Intrinsic::vastart ||
908 (II.getIntrinsicID() == Intrinsic::vacopy &&
909 I.getArgOperand(0) != II.getArgOperand(1));
910 });
911 return nullptr;
912}
913
915 assert(Call.arg_size() > 1 && "Need at least 2 args to swap");
916 Value *Arg0 = Call.getArgOperand(0), *Arg1 = Call.getArgOperand(1);
917 if (isa<Constant>(Arg0) && !isa<Constant>(Arg1)) {
918 Call.setArgOperand(0, Arg1);
919 Call.setArgOperand(1, Arg0);
920 AttributeList CallAttr = Call.getAttributes();
921 AttributeSet LHSAttr = CallAttr.getParamAttrs(0);
922 AttributeSet RHSAttr = CallAttr.getParamAttrs(1);
923 LLVMContext &Ctx = Call.getContext();
924 Call.setAttributes(CallAttr
925 .setAttributesAtIndex(
926 Ctx, AttributeList::FirstArgIndex + 0, RHSAttr)
927 .setAttributesAtIndex(
928 Ctx, AttributeList::FirstArgIndex + 1, LHSAttr));
929 return &Call;
930 }
931 return nullptr;
932}
933
934/// Creates a result tuple for an overflow intrinsic \p II with a given
935/// \p Result and a constant \p Overflow value.
937 Constant *Overflow) {
938 Constant *V[] = {PoisonValue::get(Result->getType()), Overflow};
939 StructType *ST = cast<StructType>(II->getType());
940 Constant *Struct = ConstantStruct::get(ST, V);
941 return InsertValueInst::Create(Struct, Result, 0);
942}
943
945InstCombinerImpl::foldIntrinsicWithOverflowCommon(IntrinsicInst *II) {
946 WithOverflowInst *WO = cast<WithOverflowInst>(II);
947 Value *OperationResult = nullptr;
948 Constant *OverflowResult = nullptr;
949 if (OptimizeOverflowCheck(WO->getBinaryOp(), WO->isSigned(), WO->getLHS(),
950 WO->getRHS(), *WO, OperationResult, OverflowResult))
951 return createOverflowTuple(WO, OperationResult, OverflowResult);
952
953 // See whether we can optimize the overflow check with assumption information.
954 for (User *U : WO->users()) {
955 if (!match(U, m_ExtractValue<1>(m_Value())))
956 continue;
957
958 for (auto &AssumeVH : AC.assumptionsFor(U)) {
959 if (!AssumeVH)
960 continue;
961 CallInst *I = cast<CallInst>(AssumeVH);
962 if (!match(I->getArgOperand(0), m_Not(m_Specific(U))))
963 continue;
964 if (!isValidAssumeForContext(I, II, /*DT=*/nullptr,
965 /*AllowEphemerals=*/true))
966 continue;
967 Value *Result =
968 Builder.CreateBinOp(WO->getBinaryOp(), WO->getLHS(), WO->getRHS());
969 Result->takeName(WO);
970 if (auto *Inst = dyn_cast<Instruction>(Result)) {
971 if (WO->isSigned())
972 Inst->setHasNoSignedWrap();
973 else
974 Inst->setHasNoUnsignedWrap();
975 }
976 return createOverflowTuple(WO, Result,
977 ConstantInt::getFalse(U->getType()));
978 }
979 }
980
981 return nullptr;
982}
983
984static bool inputDenormalIsIEEE(const Function &F, const Type *Ty) {
985 Ty = Ty->getScalarType();
986 return F.getDenormalMode(Ty->getFltSemantics()).Input == DenormalMode::IEEE;
987}
988
989static bool inputDenormalIsDAZ(const Function &F, const Type *Ty) {
990 Ty = Ty->getScalarType();
991 return F.getDenormalMode(Ty->getFltSemantics()).inputsAreZero();
992}
993
994/// Flushing a denormal to +0.0 breaks f(-x) = -f(x) for odd f.
998 return Mode.inputsMayBePositiveZero() || Mode.outputsMayBePositiveZero();
999}
1000
1001/// \returns the compare predicate type if the test performed by
1002/// llvm.is.fpclass(x, \p Mask) is equivalent to fcmp o__ x, 0.0 with the
1003/// floating-point environment assumed for \p F for type \p Ty
1005 const Function &F, Type *Ty) {
1006 switch (static_cast<unsigned>(Mask)) {
1007 case fcZero:
1008 if (inputDenormalIsIEEE(F, Ty))
1009 return FCmpInst::FCMP_OEQ;
1010 break;
1011 case fcZero | fcSubnormal:
1012 if (inputDenormalIsDAZ(F, Ty))
1013 return FCmpInst::FCMP_OEQ;
1014 break;
1015 case fcPositive | fcNegZero:
1016 if (inputDenormalIsIEEE(F, Ty))
1017 return FCmpInst::FCMP_OGE;
1018 break;
1020 if (inputDenormalIsDAZ(F, Ty))
1021 return FCmpInst::FCMP_OGE;
1022 break;
1024 if (inputDenormalIsIEEE(F, Ty))
1025 return FCmpInst::FCMP_OGT;
1026 break;
1027 case fcNegative | fcPosZero:
1028 if (inputDenormalIsIEEE(F, Ty))
1029 return FCmpInst::FCMP_OLE;
1030 break;
1032 if (inputDenormalIsDAZ(F, Ty))
1033 return FCmpInst::FCMP_OLE;
1034 break;
1036 if (inputDenormalIsIEEE(F, Ty))
1037 return FCmpInst::FCMP_OLT;
1038 break;
1039 case fcPosNormal | fcPosInf:
1040 if (inputDenormalIsDAZ(F, Ty))
1041 return FCmpInst::FCMP_OGT;
1042 break;
1043 case fcNegNormal | fcNegInf:
1044 if (inputDenormalIsDAZ(F, Ty))
1045 return FCmpInst::FCMP_OLT;
1046 break;
1047 case ~fcZero & ~fcNan:
1048 if (inputDenormalIsIEEE(F, Ty))
1049 return FCmpInst::FCMP_ONE;
1050 break;
1051 case ~(fcZero | fcSubnormal) & ~fcNan:
1052 if (inputDenormalIsDAZ(F, Ty))
1053 return FCmpInst::FCMP_ONE;
1054 break;
1055 default:
1056 break;
1057 }
1058
1060}
1061
1062Instruction *InstCombinerImpl::foldIntrinsicIsFPClass(IntrinsicInst &II) {
1063 Value *Src0 = II.getArgOperand(0);
1064 Value *Src1 = II.getArgOperand(1);
1065 const ConstantInt *CMask = cast<ConstantInt>(Src1);
1066 FPClassTest Mask = static_cast<FPClassTest>(CMask->getZExtValue());
1067 const bool IsUnordered = (Mask & fcNan) == fcNan;
1068 const bool IsOrdered = (Mask & fcNan) == fcNone;
1069 const FPClassTest OrderedMask = Mask & ~fcNan;
1070 const FPClassTest OrderedInvertedMask = ~OrderedMask & ~fcNan;
1071
1072 const bool IsStrict =
1073 II.getFunction()->getAttributes().hasFnAttr(Attribute::StrictFP);
1074
1075 Value *FNegSrc;
1076 // is.fpclass (fneg x), mask -> is.fpclass x, (fneg mask)
1077 // TODO: Confirm whether m_FNegOrFSubNegZero is correct.
1078 if (match(Src0, m_FNegOrFSubNegZero(m_Value(FNegSrc))))
1079 return CallInst::Create(
1080 II.getCalledFunction(),
1081 {FNegSrc, ConstantInt::get(Src1->getType(), fneg(Mask))});
1082
1083 Value *FAbsSrc;
1084 if (match(Src0, m_FAbs(m_Value(FAbsSrc))))
1085 return CallInst::Create(
1086 II.getCalledFunction(),
1087 {FAbsSrc, ConstantInt::get(Src1->getType(), inverse_fabs(Mask))});
1088
1089 if ((OrderedMask == fcInf || OrderedInvertedMask == fcInf) &&
1090 (IsOrdered || IsUnordered) && !IsStrict) {
1091 // is.fpclass(x, fcInf) -> fcmp oeq fabs(x), +inf
1092 // is.fpclass(x, ~fcInf) -> fcmp one fabs(x), +inf
1093 // is.fpclass(x, fcInf|fcNan) -> fcmp ueq fabs(x), +inf
1094 // is.fpclass(x, ~(fcInf|fcNan)) -> fcmp une fabs(x), +inf
1095 Constant *Inf = ConstantFP::getInfinity(Src0->getType());
1096 FCmpInst::Predicate Pred =
1097 IsUnordered ? FCmpInst::FCMP_UEQ : FCmpInst::FCMP_OEQ;
1098 if (OrderedInvertedMask == fcInf)
1099 Pred = IsUnordered ? FCmpInst::FCMP_UNE : FCmpInst::FCMP_ONE;
1100
1101 Value *Fabs = Builder.CreateFAbs(Src0);
1102 Value *CmpInf = Builder.CreateFCmp(Pred, Fabs, Inf);
1103 CmpInf->takeName(&II);
1104 return replaceInstUsesWith(II, CmpInf);
1105 }
1106
1107 if ((OrderedMask == fcPosInf || OrderedMask == fcNegInf) &&
1108 (IsOrdered || IsUnordered) && !IsStrict) {
1109 // is.fpclass(x, fcPosInf) -> fcmp oeq x, +inf
1110 // is.fpclass(x, fcNegInf) -> fcmp oeq x, -inf
1111 // is.fpclass(x, fcPosInf|fcNan) -> fcmp ueq x, +inf
1112 // is.fpclass(x, fcNegInf|fcNan) -> fcmp ueq x, -inf
1113 Constant *Inf =
1114 ConstantFP::getInfinity(Src0->getType(), OrderedMask == fcNegInf);
1115 Value *EqInf = IsUnordered ? Builder.CreateFCmpUEQ(Src0, Inf)
1116 : Builder.CreateFCmpOEQ(Src0, Inf);
1117
1118 EqInf->takeName(&II);
1119 return replaceInstUsesWith(II, EqInf);
1120 }
1121
1122 if ((OrderedInvertedMask == fcPosInf || OrderedInvertedMask == fcNegInf) &&
1123 (IsOrdered || IsUnordered) && !IsStrict) {
1124 // is.fpclass(x, ~fcPosInf) -> fcmp one x, +inf
1125 // is.fpclass(x, ~fcNegInf) -> fcmp one x, -inf
1126 // is.fpclass(x, ~fcPosInf|fcNan) -> fcmp une x, +inf
1127 // is.fpclass(x, ~fcNegInf|fcNan) -> fcmp une x, -inf
1128 Constant *Inf = ConstantFP::getInfinity(Src0->getType(),
1129 OrderedInvertedMask == fcNegInf);
1130 Value *NeInf = IsUnordered ? Builder.CreateFCmpUNE(Src0, Inf)
1131 : Builder.CreateFCmpONE(Src0, Inf);
1132 NeInf->takeName(&II);
1133 return replaceInstUsesWith(II, NeInf);
1134 }
1135
1136 if (Mask == fcNan && !IsStrict) {
1137 // Equivalent of isnan. Replace with standard fcmp if we don't care about FP
1138 // exceptions.
1139 Value *IsNan =
1140 Builder.CreateFCmpUNO(Src0, ConstantFP::getZero(Src0->getType()));
1141 IsNan->takeName(&II);
1142 return replaceInstUsesWith(II, IsNan);
1143 }
1144
1145 if (Mask == (~fcNan & fcAllFlags) && !IsStrict) {
1146 // Equivalent of !isnan. Replace with standard fcmp.
1147 Value *FCmp =
1148 Builder.CreateFCmpORD(Src0, ConstantFP::getZero(Src0->getType()));
1149 FCmp->takeName(&II);
1150 return replaceInstUsesWith(II, FCmp);
1151 }
1152
1154
1155 // Try to replace with an fcmp with 0
1156 //
1157 // is.fpclass(x, fcZero) -> fcmp oeq x, 0.0
1158 // is.fpclass(x, fcZero | fcNan) -> fcmp ueq x, 0.0
1159 // is.fpclass(x, ~fcZero & ~fcNan) -> fcmp one x, 0.0
1160 // is.fpclass(x, ~fcZero) -> fcmp une x, 0.0
1161 //
1162 // is.fpclass(x, fcPosSubnormal | fcPosNormal | fcPosInf) -> fcmp ogt x, 0.0
1163 // is.fpclass(x, fcPositive | fcNegZero) -> fcmp oge x, 0.0
1164 //
1165 // is.fpclass(x, fcNegSubnormal | fcNegNormal | fcNegInf) -> fcmp olt x, 0.0
1166 // is.fpclass(x, fcNegative | fcPosZero) -> fcmp ole x, 0.0
1167 //
1168 if (!IsStrict && (IsOrdered || IsUnordered) &&
1169 (PredType = fpclassTestIsFCmp0(OrderedMask, *II.getFunction(),
1170 Src0->getType())) !=
1172 Constant *Zero = ConstantFP::getZero(Src0->getType());
1173 // Equivalent of == 0.
1174 Value *FCmp = Builder.CreateFCmp(
1175 IsUnordered ? FCmpInst::getUnorderedPredicate(PredType) : PredType,
1176 Src0, Zero);
1177
1178 FCmp->takeName(&II);
1179 return replaceInstUsesWith(II, FCmp);
1180 }
1181
1182 KnownFPClass Known =
1183 computeKnownFPClass(Src0, Mask, SQ.getWithInstruction(&II));
1184
1185 // If none of the tests which can return false are possible, fold to true.
1186 // fp_class (nnan x), ~(qnan|snan) -> true
1187 // fp_class (ninf x), ~(ninf|pinf) -> true
1188 if (Known.isKnownAlways(Mask))
1189 return replaceInstUsesWith(II, ConstantInt::get(II.getType(), true));
1190
1191 // Clear test bits we know must be false from the source value.
1192 // fp_class (nnan x), qnan|snan|other -> fp_class (nnan x), other
1193 // fp_class (ninf x), ninf|pinf|other -> fp_class (ninf x), other
1194 if ((Mask & Known.getKnownFPClasses()) != Mask) {
1195 II.setArgOperand(
1196 1, ConstantInt::get(Src1->getType(), Mask & Known.getKnownFPClasses()));
1197 return &II;
1198 }
1199
1200 return nullptr;
1201}
1202
1203static std::optional<bool> getKnownSign(Value *Op, const SimplifyQuery &SQ) {
1205 if (Known.isNonNegative())
1206 return false;
1207 if (Known.isNegative())
1208 return true;
1209
1210 Value *X, *Y;
1211 if (match(Op, m_NSWSub(m_Value(X), m_Value(Y))))
1213
1214 return std::nullopt;
1215}
1216
1217static std::optional<bool> getKnownSignOrZero(Value *Op,
1218 const SimplifyQuery &SQ) {
1219 if (std::optional<bool> Sign = getKnownSign(Op, SQ))
1220 return Sign;
1221
1222 Value *X, *Y;
1223 if (match(Op, m_NSWSub(m_Value(X), m_Value(Y))))
1225
1226 return std::nullopt;
1227}
1228
1229/// Return true if two values \p Op0 and \p Op1 are known to have the same sign.
1230static bool signBitMustBeTheSame(Value *Op0, Value *Op1,
1231 const SimplifyQuery &SQ) {
1232 std::optional<bool> Known1 = getKnownSign(Op1, SQ);
1233 if (!Known1)
1234 return false;
1235 std::optional<bool> Known0 = getKnownSign(Op0, SQ);
1236 if (!Known0)
1237 return false;
1238 return *Known0 == *Known1;
1239}
1240
1241// Determines if ldexp(ldexp(x, a), b) -> ldexp(x, sadd.sat(a, b)) is safe.
1242//
1243// This is true if, when the add saturates, the resulting ldexp is guaranteed to
1244// produce 0 or inf.
1245static bool ldexpSaturatingAddIsSafe(Type *FpTy, Type *ExpTy) {
1246 const fltSemantics &FltSem = FpTy->getScalarType()->getFltSemantics();
1247 if (!APFloat::semanticsHasInf(FltSem))
1248 return false;
1249
1250 // Cap ExpBits at 32 because scalbn takes an int. This is sufficient for any
1251 // reasonable fp type (for example, `double` only has 11 exponent bits).
1252 unsigned ExpBits = std::min(ExpTy->getScalarSizeInBits(), 32u);
1253 int SignedMax = static_cast<int>(maxIntN(ExpBits));
1254 int SignedMin = static_cast<int>(minIntN(ExpBits));
1255 APFloat ScaledUp = scalbn(APFloat::getSmallest(FltSem), SignedMax,
1257 APFloat ScaledDown = scalbn(APFloat::getLargest(FltSem), SignedMin,
1259 return ScaledUp.isInfinity() && ScaledDown.isZero();
1260}
1261
1262/// Try to canonicalize min/max(X + C0, C1) as min/max(X, C1 - C0) + C0. This
1263/// can trigger other combines.
1265 InstCombiner::BuilderTy &Builder) {
1266 Intrinsic::ID MinMaxID = II->getIntrinsicID();
1267 assert((MinMaxID == Intrinsic::smax || MinMaxID == Intrinsic::smin ||
1268 MinMaxID == Intrinsic::umax || MinMaxID == Intrinsic::umin) &&
1269 "Expected a min or max intrinsic");
1270
1271 // TODO: Match vectors with undef elements, but undef may not propagate.
1272 Value *Op0 = II->getArgOperand(0), *Op1 = II->getArgOperand(1);
1273 Value *X;
1274 const APInt *C0, *C1;
1275 if (!match(Op0, m_OneUse(m_Add(m_Value(X), m_APInt(C0)))) ||
1276 !match(Op1, m_APInt(C1)))
1277 return nullptr;
1278
1279 // Check for necessary no-wrap and overflow constraints.
1280 bool IsSigned = MinMaxID == Intrinsic::smax || MinMaxID == Intrinsic::smin;
1281 auto *Add = cast<BinaryOperator>(Op0);
1282 if ((IsSigned && !Add->hasNoSignedWrap()) ||
1283 (!IsSigned && !Add->hasNoUnsignedWrap()))
1284 return nullptr;
1285
1286 // If the constant difference overflows, then instsimplify should reduce the
1287 // min/max to the add or C1.
1288 bool Overflow;
1289 APInt CDiff =
1290 IsSigned ? C1->ssub_ov(*C0, Overflow) : C1->usub_ov(*C0, Overflow);
1291 assert(!Overflow && "Expected simplify of min/max");
1292
1293 // min/max (add X, C0), C1 --> add (min/max X, C1 - C0), C0
1294 // Note: the "mismatched" no-overflow setting does not propagate.
1295 Constant *NewMinMaxC = ConstantInt::get(II->getType(), CDiff);
1296 Value *NewMinMax = Builder.CreateBinaryIntrinsic(MinMaxID, X, NewMinMaxC);
1297 return IsSigned ? BinaryOperator::CreateNSWAdd(NewMinMax, Add->getOperand(1))
1298 : BinaryOperator::CreateNUWAdd(NewMinMax, Add->getOperand(1));
1299}
1300/// Match a sadd_sat or ssub_sat which is using min/max to clamp the value.
1301Instruction *InstCombinerImpl::matchSAddSubSat(IntrinsicInst &MinMax1) {
1302 Type *Ty = MinMax1.getType();
1303
1304 // We are looking for a tree of:
1305 // max(INT_MIN, min(INT_MAX, add(sext(A), sext(B))))
1306 // Where the min and max could be reversed
1307 Instruction *MinMax2;
1308 BinaryOperator *AddSub;
1309 const APInt *MinValue, *MaxValue;
1310 if (match(&MinMax1, m_SMin(m_Instruction(MinMax2), m_APInt(MaxValue)))) {
1311 if (!match(MinMax2, m_SMax(m_BinOp(AddSub), m_APInt(MinValue))))
1312 return nullptr;
1313 } else if (match(&MinMax1,
1314 m_SMax(m_Instruction(MinMax2), m_APInt(MinValue)))) {
1315 if (!match(MinMax2, m_SMin(m_BinOp(AddSub), m_APInt(MaxValue))))
1316 return nullptr;
1317 } else
1318 return nullptr;
1319
1320 // Check that the constants clamp a saturate, and that the new type would be
1321 // sensible to convert to.
1322 if (!(*MaxValue + 1).isPowerOf2() || -*MinValue != *MaxValue + 1)
1323 return nullptr;
1324 // In what bitwidth can this be treated as saturating arithmetics?
1325 unsigned NewBitWidth = (*MaxValue + 1).logBase2() + 1;
1326 // FIXME: This isn't quite right for vectors, but using the scalar type is a
1327 // good first approximation for what should be done there.
1328 if (!shouldChangeType(Ty->getScalarType()->getIntegerBitWidth(), NewBitWidth))
1329 return nullptr;
1330
1331 // Also make sure that the inner min/max and the add/sub have one use.
1332 if (!MinMax2->hasOneUse() || !AddSub->hasOneUse())
1333 return nullptr;
1334
1335 // Create the new type (which can be a vector type)
1336 Type *NewTy = Ty->getWithNewBitWidth(NewBitWidth);
1337
1338 Intrinsic::ID IntrinsicID;
1339 if (AddSub->getOpcode() == Instruction::Add)
1340 IntrinsicID = Intrinsic::sadd_sat;
1341 else if (AddSub->getOpcode() == Instruction::Sub)
1342 IntrinsicID = Intrinsic::ssub_sat;
1343 else
1344 return nullptr;
1345
1346 // The two operands of the add/sub must be nsw-truncatable to the NewTy. This
1347 // is usually achieved via a sext from a smaller type.
1348 if (ComputeMaxSignificantBits(AddSub->getOperand(0), AddSub) > NewBitWidth ||
1349 ComputeMaxSignificantBits(AddSub->getOperand(1), AddSub) > NewBitWidth)
1350 return nullptr;
1351
1352 // Finally create and return the sat intrinsic, truncated to the new type
1353 Value *AT = Builder.CreateTrunc(AddSub->getOperand(0), NewTy);
1354 Value *BT = Builder.CreateTrunc(AddSub->getOperand(1), NewTy);
1355 Value *Sat = Builder.CreateIntrinsic(IntrinsicID, NewTy, {AT, BT});
1356 return CastInst::Create(Instruction::SExt, Sat, Ty);
1357}
1358
1359
1360/// If we have a clamp pattern like max (min X, 42), 41 -- where the output
1361/// can only be one of two possible constant values -- turn that into a select
1362/// of constants.
1364 InstCombiner::BuilderTy &Builder) {
1365 Value *I0 = II->getArgOperand(0), *I1 = II->getArgOperand(1);
1366 Value *X;
1367 const APInt *C0, *C1;
1368 if (!match(I1, m_APInt(C1)) || !I0->hasOneUse())
1369 return nullptr;
1370
1372 switch (II->getIntrinsicID()) {
1373 case Intrinsic::smax:
1374 if (match(I0, m_SMin(m_Value(X), m_APInt(C0))) && *C0 == *C1 + 1)
1375 Pred = ICmpInst::ICMP_SGT;
1376 break;
1377 case Intrinsic::smin:
1378 if (match(I0, m_SMax(m_Value(X), m_APInt(C0))) && *C1 == *C0 + 1)
1379 Pred = ICmpInst::ICMP_SLT;
1380 break;
1381 case Intrinsic::umax:
1382 if (match(I0, m_UMin(m_Value(X), m_APInt(C0))) && *C0 == *C1 + 1)
1383 Pred = ICmpInst::ICMP_UGT;
1384 break;
1385 case Intrinsic::umin:
1386 if (match(I0, m_UMax(m_Value(X), m_APInt(C0))) && *C1 == *C0 + 1)
1387 Pred = ICmpInst::ICMP_ULT;
1388 break;
1389 default:
1390 llvm_unreachable("Expected min/max intrinsic");
1391 }
1392 if (Pred == CmpInst::BAD_ICMP_PREDICATE)
1393 return nullptr;
1394
1395 // max (min X, 42), 41 --> X > 41 ? 42 : 41
1396 // min (max X, 42), 43 --> X < 43 ? 42 : 43
1397 Value *Cmp = Builder.CreateICmp(Pred, X, I1);
1398 auto *SI = SelectInst::Create(Cmp, ConstantInt::get(II->getType(), *C0), I1);
1400 II->getFunction());
1401 return SI;
1402}
1403
1404/// If this min/max has a constant operand and an operand that is a matching
1405/// min/max with a constant operand, constant-fold the 2 constant operands.
1407 IRBuilderBase &Builder,
1408 const SimplifyQuery &SQ) {
1409 Intrinsic::ID MinMaxID = II->getIntrinsicID();
1410 auto *LHS = dyn_cast<MinMaxIntrinsic>(II->getArgOperand(0));
1411 if (!LHS)
1412 return nullptr;
1413
1414 Constant *C0, *C1;
1415 if (!match(LHS->getArgOperand(1), m_ImmConstant(C0)) ||
1416 !match(II->getArgOperand(1), m_ImmConstant(C1)))
1417 return nullptr;
1418
1419 // max (max X, C0), C1 --> max X, (max C0, C1)
1420 // min (min X, C0), C1 --> min X, (min C0, C1)
1421 // umax (smax X, nneg C0), nneg C1 --> smax X, (umax C0, C1)
1422 // smin (umin X, nneg C0), nneg C1 --> umin X, (smin C0, C1)
1423 Intrinsic::ID InnerMinMaxID = LHS->getIntrinsicID();
1424 if (InnerMinMaxID != MinMaxID &&
1425 !(((MinMaxID == Intrinsic::umax && InnerMinMaxID == Intrinsic::smax) ||
1426 (MinMaxID == Intrinsic::smin && InnerMinMaxID == Intrinsic::umin)) &&
1428 return nullptr;
1429
1431 Value *CondC = Builder.CreateICmp(Pred, C0, C1);
1432 Value *NewC = Builder.CreateSelect(CondC, C0, C1);
1433 return Builder.CreateIntrinsic(InnerMinMaxID, II->getType(),
1434 {LHS->getArgOperand(0), NewC});
1435}
1436
1437/// If this min/max has a matching min/max operand with a constant, try to push
1438/// the constant operand into this instruction. This can enable more folds.
1439static Instruction *
1441 InstCombiner::BuilderTy &Builder) {
1442 // Match and capture a min/max operand candidate.
1443 Value *X, *Y;
1444 Constant *C;
1445 Instruction *Inner;
1447 m_Instruction(Inner),
1449 m_Value(Y))))
1450 return nullptr;
1451
1452 // The inner op must match. Check for constants to avoid infinite loops.
1453 Intrinsic::ID MinMaxID = II->getIntrinsicID();
1454 auto *InnerMM = dyn_cast<IntrinsicInst>(Inner);
1455 if (!InnerMM || InnerMM->getIntrinsicID() != MinMaxID ||
1457 return nullptr;
1458
1459 // max (max X, C), Y --> max (max X, Y), C
1461 MinMaxID, II->getType());
1462 Value *NewInner = Builder.CreateBinaryIntrinsic(MinMaxID, X, Y);
1463 NewInner->takeName(Inner);
1464 return CallInst::Create(MinMax, {NewInner, C});
1465}
1466
1467/// Reduce a sequence of min/max intrinsics with a common operand.
1469 // Match 3 of the same min/max ops. Example: umin(umin(), umin()).
1470 auto *LHS = dyn_cast<IntrinsicInst>(II->getArgOperand(0));
1471 auto *RHS = dyn_cast<IntrinsicInst>(II->getArgOperand(1));
1472 Intrinsic::ID MinMaxID = II->getIntrinsicID();
1473 if (!LHS || !RHS || LHS->getIntrinsicID() != MinMaxID ||
1474 RHS->getIntrinsicID() != MinMaxID ||
1475 (!LHS->hasOneUse() && !RHS->hasOneUse()))
1476 return nullptr;
1477
1478 Value *A = LHS->getArgOperand(0);
1479 Value *B = LHS->getArgOperand(1);
1480 Value *C = RHS->getArgOperand(0);
1481 Value *D = RHS->getArgOperand(1);
1482
1483 // Look for a common operand.
1484 Value *MinMaxOp = nullptr;
1485 Value *ThirdOp = nullptr;
1486 if (LHS->hasOneUse()) {
1487 // If the LHS is only used in this chain and the RHS is used outside of it,
1488 // reuse the RHS min/max because that will eliminate the LHS.
1489 if (D == A || C == A) {
1490 // min(min(a, b), min(c, a)) --> min(min(c, a), b)
1491 // min(min(a, b), min(a, d)) --> min(min(a, d), b)
1492 MinMaxOp = RHS;
1493 ThirdOp = B;
1494 } else if (D == B || C == B) {
1495 // min(min(a, b), min(c, b)) --> min(min(c, b), a)
1496 // min(min(a, b), min(b, d)) --> min(min(b, d), a)
1497 MinMaxOp = RHS;
1498 ThirdOp = A;
1499 }
1500 } else {
1501 assert(RHS->hasOneUse() && "Expected one-use operand");
1502 // Reuse the LHS. This will eliminate the RHS.
1503 if (D == A || D == B) {
1504 // min(min(a, b), min(c, a)) --> min(min(a, b), c)
1505 // min(min(a, b), min(c, b)) --> min(min(a, b), c)
1506 MinMaxOp = LHS;
1507 ThirdOp = C;
1508 } else if (C == A || C == B) {
1509 // min(min(a, b), min(b, d)) --> min(min(a, b), d)
1510 // min(min(a, b), min(c, b)) --> min(min(a, b), d)
1511 MinMaxOp = LHS;
1512 ThirdOp = D;
1513 }
1514 }
1515
1516 if (!MinMaxOp || !ThirdOp)
1517 return nullptr;
1518
1519 Module *Mod = II->getModule();
1520 Function *MinMax =
1521 Intrinsic::getOrInsertDeclaration(Mod, MinMaxID, II->getType());
1522 return CallInst::Create(MinMax, { MinMaxOp, ThirdOp });
1523}
1524
1525/// If all arguments of the intrinsic are unary shuffles with the same mask,
1526/// try to shuffle after the intrinsic.
1529 if (!II->getType()->isVectorTy() ||
1530 !isTriviallyVectorizable(II->getIntrinsicID()) ||
1531 !II->getCalledFunction()->isSpeculatable())
1532 return nullptr;
1533
1534 Value *X;
1535 Constant *C;
1536 ArrayRef<int> Mask;
1537 auto *NonConstArg = find_if_not(II->args(), [&II](Use &Arg) {
1538 return isa<Constant>(Arg.get()) ||
1539 isVectorIntrinsicWithScalarOpAtArg(II->getIntrinsicID(),
1540 Arg.getOperandNo(), nullptr);
1541 });
1542 if (!NonConstArg ||
1543 !match(NonConstArg, m_Shuffle(m_Value(X), m_Poison(), m_Mask(Mask))))
1544 return nullptr;
1545
1546 // At least 1 operand must be a shuffle with 1 use because we are creating 2
1547 // instructions.
1548 if (none_of(II->args(), match_fn(m_OneUse(m_Shuffle(m_Value(), m_Value())))))
1549 return nullptr;
1550
1551 // See if all arguments are shuffled with the same mask.
1553 Type *SrcTy = X->getType();
1554 for (Use &Arg : II->args()) {
1555 if (isVectorIntrinsicWithScalarOpAtArg(II->getIntrinsicID(),
1556 Arg.getOperandNo(), nullptr))
1557 NewArgs.push_back(Arg);
1558 else if (match(&Arg,
1559 m_Shuffle(m_Value(X), m_Poison(), m_SpecificMask(Mask))) &&
1560 X->getType() == SrcTy)
1561 NewArgs.push_back(X);
1562 else if (match(&Arg, m_ImmConstant(C))) {
1563 // If it's a constant, try find the constant that would be shuffled to C.
1564 if (Constant *ShuffledC =
1565 unshuffleConstant(Mask, C, cast<VectorType>(SrcTy)))
1566 NewArgs.push_back(ShuffledC);
1567 else
1568 return nullptr;
1569 } else
1570 return nullptr;
1571 }
1572
1573 // intrinsic (shuf X, M), (shuf Y, M), ... --> shuf (intrinsic X, Y, ...), M
1574 Instruction *FPI = isa<FPMathOperator>(II) ? II : nullptr;
1575 // Result type might be a different vector width.
1576 // TODO: Check that the result type isn't widened?
1577 VectorType *ResTy =
1578 VectorType::get(II->getType()->getScalarType(), cast<VectorType>(SrcTy));
1579 Value *NewIntrinsic =
1580 Builder.CreateIntrinsic(ResTy, II->getIntrinsicID(), NewArgs, FPI);
1581 return new ShuffleVectorInst(NewIntrinsic, Mask);
1582}
1583
1584/// If all arguments of the intrinsic are reverses, try to pull the reverse
1585/// after the intrinsic.
1587 if (!II->getType()->isVectorTy() ||
1588 !isTriviallyVectorizable(II->getIntrinsicID()))
1589 return nullptr;
1590
1591 // At least 1 operand must be a reverse with 1 use because we are creating 2
1592 // instructions.
1593 if (none_of(II->args(), [](Value *V) {
1594 return match(V, m_OneUse(m_VecReverse(m_Value())));
1595 }))
1596 return nullptr;
1597
1598 Value *X;
1599 Constant *C;
1600 SmallVector<Value *> NewArgs;
1601 for (Use &Arg : II->args()) {
1602 if (isVectorIntrinsicWithScalarOpAtArg(II->getIntrinsicID(),
1603 Arg.getOperandNo(), nullptr))
1604 NewArgs.push_back(Arg);
1605 else if (match(&Arg, m_VecReverse(m_Value(X))))
1606 NewArgs.push_back(X);
1607 else if (isSplatValue(Arg))
1608 NewArgs.push_back(Arg);
1609 else if (match(&Arg, m_ImmConstant(C)))
1610 NewArgs.push_back(Builder.CreateVectorReverse(C));
1611 else
1612 return nullptr;
1613 }
1614
1615 // intrinsic (reverse X), (reverse Y), ... --> reverse (intrinsic X, Y, ...)
1616 Instruction *FPI = isa<FPMathOperator>(II) ? II : nullptr;
1617 Value *NewIntrinsic = Builder.CreateIntrinsic(
1618 II->getType(), II->getIntrinsicID(), NewArgs, FPI);
1619 return Builder.CreateVectorReverse(NewIntrinsic);
1620}
1621
1622/// Fold the following cases and accepts bswap and bitreverse intrinsics:
1623/// bswap(logic_op(bswap(x), y)) --> logic_op(x, bswap(y))
1624/// bswap(logic_op(bswap(x), bswap(y))) --> logic_op(x, y) (ignores multiuse)
1625template <Intrinsic::ID IntrID>
1627 InstCombiner::BuilderTy &Builder) {
1628 static_assert(IntrID == Intrinsic::bswap || IntrID == Intrinsic::bitreverse,
1629 "This helper only supports BSWAP and BITREVERSE intrinsics");
1630
1631 Value *X, *Y;
1632 // Find bitwise logic op. Check that it is a BinaryOperator explicitly so we
1633 // don't match ConstantExpr that aren't meaningful for this transform.
1636 Value *OldReorderX, *OldReorderY;
1638
1639 // If both X and Y are bswap/bitreverse, the transform reduces the number
1640 // of instructions even if there's multiuse.
1641 // If only one operand is bswap/bitreverse, we need to ensure the operand
1642 // have only one use.
1643 if (match(X, m_Intrinsic<IntrID>(m_Value(OldReorderX))) &&
1644 match(Y, m_Intrinsic<IntrID>(m_Value(OldReorderY)))) {
1645 return BinaryOperator::Create(Op, OldReorderX, OldReorderY);
1646 }
1647
1648 if (match(X, m_OneUse(m_Intrinsic<IntrID>(m_Value(OldReorderX))))) {
1649 Value *NewReorder = Builder.CreateUnaryIntrinsic(IntrID, Y);
1650 return BinaryOperator::Create(Op, OldReorderX, NewReorder);
1651 }
1652
1653 if (match(Y, m_OneUse(m_Intrinsic<IntrID>(m_Value(OldReorderY))))) {
1654 Value *NewReorder = Builder.CreateUnaryIntrinsic(IntrID, X);
1655 return BinaryOperator::Create(Op, NewReorder, OldReorderY);
1656 }
1657 }
1658 return nullptr;
1659}
1660
1661/// Helper to match idempotent binary intrinsics, namely, intrinsics where
1662/// `f(f(x, y), y) == f(x, y)` holds.
1664 switch (IID) {
1665 case Intrinsic::smax:
1666 case Intrinsic::smin:
1667 case Intrinsic::umax:
1668 case Intrinsic::umin:
1669 case Intrinsic::maximum:
1670 case Intrinsic::minimum:
1671 case Intrinsic::maximumnum:
1672 case Intrinsic::minimumnum:
1673 case Intrinsic::maxnum:
1674 case Intrinsic::minnum:
1675 return true;
1676 default:
1677 return false;
1678 }
1679}
1680
1681/// Attempt to simplify value-accumulating recurrences of kind:
1682/// %umax.acc = phi i8 [ %umax, %backedge ], [ %a, %entry ]
1683/// %umax = call i8 @llvm.umax.i8(i8 %umax.acc, i8 %b)
1684/// And let the idempotent binary intrinsic be hoisted, when the operands are
1685/// known to be loop-invariant.
1687 IntrinsicInst *II) {
1688 PHINode *PN;
1689 Value *Init, *OtherOp;
1690
1691 // A binary intrinsic recurrence with loop-invariant operands is equivalent to
1692 // `call @llvm.binary.intrinsic(Init, OtherOp)`.
1693 auto IID = II->getIntrinsicID();
1694 if (!isIdempotentBinaryIntrinsic(IID) ||
1696 !IC.getDominatorTree().dominates(OtherOp, PN))
1697 return nullptr;
1698
1699 auto *InvariantBinaryInst =
1700 IC.Builder.CreateBinaryIntrinsic(IID, Init, OtherOp);
1701 if (isa<FPMathOperator>(InvariantBinaryInst))
1702 cast<Instruction>(InvariantBinaryInst)->copyFastMathFlags(II);
1703 return InvariantBinaryInst;
1704}
1705
1706static Value *simplifyReductionOperand(Value *Arg, bool CanReorderLanes) {
1707 if (!CanReorderLanes)
1708 return nullptr;
1709
1710 Value *V;
1711 if (match(Arg, m_VecReverse(m_Value(V))))
1712 return V;
1713
1714 ArrayRef<int> Mask;
1715 if (!isa<FixedVectorType>(Arg->getType()) ||
1716 !match(Arg, m_Shuffle(m_Value(V), m_Undef(), m_Mask(Mask))) ||
1717 !cast<ShuffleVectorInst>(Arg)->isSingleSource())
1718 return nullptr;
1719
1720 int Sz = Mask.size();
1721 SmallBitVector UsedIndices(Sz);
1722 for (int Idx : Mask) {
1723 if (Idx == PoisonMaskElem || UsedIndices.test(Idx))
1724 return nullptr;
1725 UsedIndices.set(Idx);
1726 }
1727
1728 // Can remove shuffle iff just shuffled elements, no repeats, undefs, or
1729 // other changes.
1730 return UsedIndices.all() ? V : nullptr;
1731}
1732
1733/// Fold an unsigned minimum of trailing or leading zero bits counts:
1734/// umin(cttz(CtOp1, ZeroUndef), ConstOp) --> cttz(CtOp1 | (1 << ConstOp))
1735/// umin(ctlz(CtOp1, ZeroUndef), ConstOp) --> ctlz(CtOp1 | (SignedMin
1736/// >> ConstOp))
1737/// umin(cttz(CtOp1), cttz(CtOp2)) --> cttz(CtOp1 | CtOp2)
1738/// umin(ctlz(CtOp1), ctlz(CtOp2)) --> ctlz(CtOp1 | CtOp2)
1739template <Intrinsic::ID IntrID>
1740static Value *
1742 const DataLayout &DL,
1743 InstCombiner::BuilderTy &Builder) {
1744 static_assert(IntrID == Intrinsic::cttz || IntrID == Intrinsic::ctlz,
1745 "This helper only supports cttz and ctlz intrinsics");
1746
1747 Value *CtOp1, *CtOp2;
1748 Value *ZeroUndef1, *ZeroUndef2;
1749 if (!match(I0, m_OneUse(
1750 m_Intrinsic<IntrID>(m_Value(CtOp1), m_Value(ZeroUndef1)))))
1751 return nullptr;
1752
1753 if (match(I1,
1754 m_OneUse(m_Intrinsic<IntrID>(m_Value(CtOp2), m_Value(ZeroUndef2)))))
1755 return Builder.CreateBinaryIntrinsic(
1756 IntrID, Builder.CreateOr(CtOp1, CtOp2),
1757 Builder.CreateOr(ZeroUndef1, ZeroUndef2));
1758
1759 unsigned BitWidth = I1->getType()->getScalarSizeInBits();
1760 auto LessBitWidth = [BitWidth](auto &C) { return C.ult(BitWidth); };
1761 if (!match(I1, m_CheckedInt(LessBitWidth)))
1762 // We have a constant >= BitWidth (which can be handled by CVP)
1763 // or a non-splat vector with elements < and >= BitWidth
1764 return nullptr;
1765
1766 Type *Ty = I1->getType();
1768 IntrID == Intrinsic::cttz ? Instruction::Shl : Instruction::LShr,
1769 IntrID == Intrinsic::cttz
1770 ? ConstantInt::get(Ty, 1)
1771 : ConstantInt::get(Ty, APInt::getSignedMinValue(BitWidth)),
1772 cast<Constant>(I1), DL);
1773 return Builder.CreateBinaryIntrinsic(
1774 IntrID, Builder.CreateOr(CtOp1, NewConst),
1775 ConstantInt::getTrue(ZeroUndef1->getType()));
1776}
1777
1778/// Return whether "X LOp (Y ROp Z)" is always equal to
1779/// "(X LOp Y) ROp (X LOp Z)".
1781 bool HasNSW, Intrinsic::ID ROp) {
1782 switch (ROp) {
1783 case Intrinsic::umax:
1784 case Intrinsic::umin:
1785 if (HasNUW && LOp == Instruction::Add)
1786 return true;
1787 if (HasNUW && LOp == Instruction::Shl)
1788 return true;
1789 return false;
1790 case Intrinsic::smax:
1791 case Intrinsic::smin:
1792 return HasNSW && LOp == Instruction::Add;
1793 default:
1794 return false;
1795 }
1796}
1797
1798/// Return whether "(X ROp Y) LOp Z" is always equal to
1799/// "(X LOp Z) ROp (Y LOp Z)".
1801 bool HasNSW, Intrinsic::ID ROp) {
1802 if (Instruction::isCommutative(LOp) || LOp == Instruction::Shl)
1803 return leftDistributesOverRight(LOp, HasNUW, HasNSW, ROp);
1804 switch (ROp) {
1805 case Intrinsic::umax:
1806 case Intrinsic::umin:
1807 return HasNUW && LOp == Instruction::Sub;
1808 case Intrinsic::smax:
1809 case Intrinsic::smin:
1810 return HasNSW && LOp == Instruction::Sub;
1811 default:
1812 return false;
1813 }
1814}
1815
1816// Attempts to factorise a common term
1817// in an instruction that has the form "(A op' B) op (C op' D)
1818// where op is an intrinsic and op' is a binop
1819static Value *
1821 InstCombiner::BuilderTy &Builder) {
1822 Value *LHS = II->getOperand(0), *RHS = II->getOperand(1);
1823 Intrinsic::ID TopLevelOpcode = II->getIntrinsicID();
1824
1827
1828 if (!Op0 || !Op1)
1829 return nullptr;
1830
1831 if (Op0->getOpcode() != Op1->getOpcode())
1832 return nullptr;
1833
1834 if (!Op0->hasOneUse() || !Op1->hasOneUse())
1835 return nullptr;
1836
1837 Instruction::BinaryOps InnerOpcode =
1838 static_cast<Instruction::BinaryOps>(Op0->getOpcode());
1839 bool HasNUW = Op0->hasNoUnsignedWrap() && Op1->hasNoUnsignedWrap();
1840 bool HasNSW = Op0->hasNoSignedWrap() && Op1->hasNoSignedWrap();
1841
1842 Value *A = Op0->getOperand(0);
1843 Value *B = Op0->getOperand(1);
1844 Value *C = Op1->getOperand(0);
1845 Value *D = Op1->getOperand(1);
1846
1847 // Attempts to swap variables such that A equals C or B equals D,
1848 // if the inner operation is commutative.
1849 if (Op0->isCommutative() && A != C && B != D) {
1850 if (A == D || B == C)
1851 std::swap(C, D);
1852 else
1853 return nullptr;
1854 }
1855
1856 if (A == C &&
1857 leftDistributesOverRight(InnerOpcode, HasNUW, HasNSW, TopLevelOpcode)) {
1858 Value *NewIntrinsic = Builder.CreateBinaryIntrinsic(TopLevelOpcode, B, D);
1859 return Builder.CreateNoWrapBinOp(InnerOpcode, A, NewIntrinsic, HasNUW,
1860 HasNSW);
1861 }
1862 if (B == D &&
1863 rightDistributesOverLeft(InnerOpcode, HasNUW, HasNSW, TopLevelOpcode)) {
1864 Value *NewIntrinsic = Builder.CreateBinaryIntrinsic(TopLevelOpcode, A, C);
1865 return Builder.CreateNoWrapBinOp(InnerOpcode, NewIntrinsic, B, HasNUW,
1866 HasNSW);
1867 }
1868 return nullptr;
1869}
1870
1872 Value *Arg0 = II->getArgOperand(0);
1873 auto *ShiftConst = dyn_cast<Constant>(II->getArgOperand(1));
1874 if (!ShiftConst)
1875 return nullptr;
1876
1877 int ElemBits = Arg0->getType()->getScalarSizeInBits();
1878 bool AllPositive = true;
1879 bool AllNegative = true;
1880
1881 auto Check = [&](Constant *C) -> bool {
1882 if (auto *CI = dyn_cast_or_null<ConstantInt>(C)) {
1883 const APInt &V = CI->getValue();
1884 if (V.isNonNegative()) {
1885 AllNegative = false;
1886 return AllPositive && V.ult(ElemBits);
1887 }
1888 AllPositive = false;
1889 return AllNegative && V.sgt(-ElemBits);
1890 }
1891 return false;
1892 };
1893
1894 if (auto *VTy = dyn_cast<FixedVectorType>(Arg0->getType())) {
1895 for (unsigned I = 0, E = VTy->getNumElements(); I < E; ++I) {
1896 if (!Check(ShiftConst->getAggregateElement(I)))
1897 return nullptr;
1898 }
1899
1900 } else if (!Check(ShiftConst))
1901 return nullptr;
1902
1903 IRBuilderBase &B = IC.Builder;
1904 if (AllPositive)
1905 return IC.replaceInstUsesWith(*II, B.CreateShl(Arg0, ShiftConst));
1906
1907 Value *NegAmt = B.CreateNeg(ShiftConst);
1908 Intrinsic::ID IID = II->getIntrinsicID();
1909 const bool IsSigned =
1910 IID == Intrinsic::arm_neon_vshifts || IID == Intrinsic::aarch64_neon_sshl;
1911 Value *Result =
1912 IsSigned ? B.CreateAShr(Arg0, NegAmt) : B.CreateLShr(Arg0, NegAmt);
1913 return IC.replaceInstUsesWith(*II, Result);
1914}
1915
1916// If II is llvm.sin(x) or llvm.cos(x), and there is a matching
1917// llvm.cos(x) or llvm.sin(x) using the same argument, combine them
1918// into a single llvm.sincos(x) call. Returns the result for II
1919// extracted from sincos, or nullptr if no match is found.
1921 InstCombinerImpl &IC) {
1922 Intrinsic::ID IID = II->getIntrinsicID();
1923 bool IsSin = IID == Intrinsic::sin;
1924 Intrinsic::ID MatchID = IsSin ? Intrinsic::cos : Intrinsic::sin;
1925
1926 Value *Arg = II->getArgOperand(0);
1927
1928 // Don't bother looking through uses of constants.
1929 if (isa<Constant>(Arg))
1930 return nullptr;
1931
1932 // Look for a matching cos/sin intrinsic with the same argument.
1933 IntrinsicInst *Match = nullptr;
1934 for (User *U : Arg->users()) {
1935 if (auto *Cand = dyn_cast<IntrinsicInst>(U)) {
1936 if (Cand != II && !Cand->use_empty() &&
1937 Cand->getIntrinsicID() == MatchID) {
1938 Match = Cand;
1939 break;
1940 }
1941 }
1942 }
1943
1944 if (!Match)
1945 return nullptr;
1946
1947 // Insert sincos right after the argument definition.
1949 if (auto *ArgInst = dyn_cast<Instruction>(Arg)) {
1950 std::optional<BasicBlock::iterator> InsertPt =
1951 ArgInst->getInsertionPointAfterDef();
1952 if (!InsertPt)
1953 return nullptr;
1954 B.SetInsertPoint(*InsertPt);
1955 } else {
1956 BasicBlock &EntryBB = II->getFunction()->getEntryBlock();
1957 B.SetInsertPoint(EntryBB.begin());
1958 }
1959
1961 II->getModule(), Intrinsic::sincos, Arg->getType());
1962 CallInst *SinCos = B.CreateCall(SinCosFunc, Arg, "sincos");
1963 // Intersect fast-math flags from the two calls.
1964 SinCos->setFastMathFlags(II->getFastMathFlags() & Match->getFastMathFlags());
1965 // Propagate the most-generic fpmath metadata from the two original calls.
1967 II->getMetadata(LLVMContext::MD_fpmath),
1968 Match->getMetadata(LLVMContext::MD_fpmath)))
1969 SinCos->setMetadata(LLVMContext::MD_fpmath, MD);
1970 Value *Sin = B.CreateExtractValue(SinCos, 0, "sin");
1971 Value *Cos = B.CreateExtractValue(SinCos, 1, "cos");
1972
1973 // Replace the matching call and erase it.
1974 IC.replaceInstUsesWith(*Match, IsSin ? Cos : Sin);
1975 IC.eraseInstFromFunction(*Match);
1976 return IsSin ? Sin : Cos;
1977}
1978
1979/// Fold an scmp/ucmp intrinsic whose operands are extended from a narrower
1980/// type:
1981/// scmp (sext X), (sext Y) --> scmp X, Y
1982/// scmp (zext X), (zext Y) --> ucmp X, Y
1983/// ucmp (ext X), (ext Y) --> ucmp X, Y
1984/// Both operands must use the same extend opcode and source type. A constant
1985/// operand is narrowed instead, if truncating and re-extending it gives back
1986/// the same constant.
1988 InstCombiner::BuilderTy &Builder,
1989 const DataLayout &DL) {
1990 // scmp/ucmp are not commutative, so the extend may be on either side.
1991 unsigned ExtIdx = 0;
1992 Value *X;
1993 if (!match(II->getArgOperand(0), m_ZExtOrSExt(m_Value(X)))) {
1994 ExtIdx = 1;
1995 if (!match(II->getArgOperand(1), m_ZExtOrSExt(m_Value(X))))
1996 return nullptr;
1997 }
1998
1999 auto CastOpc = static_cast<Instruction::CastOps>(
2000 cast<Operator>(II->getArgOperand(ExtIdx))->getOpcode());
2001 Type *NarrowTy = X->getType();
2002
2003 // The other operand must be the same kind of extend from the same type, or a
2004 // constant that can be narrowed losslessly.
2005 Value *OtherOp = II->getArgOperand(1 - ExtIdx);
2006 Value *Y;
2007 Constant *WideC;
2008 if (match(OtherOp, m_ZExtOrSExt(m_Value(Y)))) {
2009 if (cast<Operator>(OtherOp)->getOpcode() != CastOpc ||
2010 Y->getType() != NarrowTy)
2011 return nullptr;
2012 } else if (match(OtherOp, m_ImmConstant(WideC))) {
2013 Y = getLosslessInvCast(WideC, NarrowTy, CastOpc, DL);
2014 if (!Y)
2015 return nullptr;
2016 } else {
2017 return nullptr;
2018 }
2019
2020 // Both extends preserve the unsigned order, so an unsigned compare of the
2021 // narrow operands is always equivalent. The signed order is only preserved by
2022 // sext; zero extended values are non-negative, so a signed compare of those
2023 // is an unsigned compare of the narrow operands.
2024 Intrinsic::ID NewIID =
2025 II->getIntrinsicID() == Intrinsic::scmp && CastOpc == Instruction::SExt
2026 ? Intrinsic::scmp
2027 : Intrinsic::ucmp;
2028 if (ExtIdx != 0)
2029 std::swap(X, Y);
2030 return Builder.CreateIntrinsic(II->getType(), NewIID, {X, Y});
2031}
2032
2033/// CallInst simplification. This mostly only handles folding of intrinsic
2034/// instructions. For normal calls, it allows visitCallBase to do the heavy
2035/// lifting.
2037 // Don't try to simplify calls without uses. It will not do anything useful,
2038 // but will result in the following folds being skipped.
2039 if (!CI.use_empty()) {
2040 SmallVector<Value *, 8> Args(CI.args());
2041 if (Value *V = simplifyCall(&CI, CI.getCalledOperand(), Args,
2042 SQ.getWithInstruction(&CI)))
2043 return replaceInstUsesWith(CI, V);
2044 }
2045
2046 if (Value *FreedOp = getFreedOperand(&CI, &TLI))
2047 return visitFree(CI, FreedOp);
2048
2049 // If the caller function (i.e. us, the function that contains this CallInst)
2050 // is nounwind, mark the call as nounwind, even if the callee isn't.
2051 if (CI.getFunction()->doesNotThrow() && !CI.doesNotThrow()) {
2052 CI.setDoesNotThrow();
2053 return &CI;
2054 }
2055
2057 if (!II)
2058 return visitCallBase(CI);
2059
2060 // Intrinsics cannot occur in an invoke or a callbr, so handle them here
2061 // instead of in visitCallBase.
2062 if (auto *MI = dyn_cast<AnyMemIntrinsic>(II)) {
2063 if (auto NumBytes = MI->getLengthInBytes()) {
2064 // memmove/cpy/set of zero bytes is a noop.
2065 if (NumBytes->isZero())
2066 return eraseInstFromFunction(CI);
2067
2068 // For atomic unordered mem intrinsics if len is not a positive or
2069 // not a multiple of element size then behavior is undefined.
2070 if (MI->isAtomic() &&
2071 (NumBytes->isNegative() ||
2072 (NumBytes->getZExtValue() % MI->getElementSizeInBytes() != 0))) {
2074 assert(MI->getType()->isVoidTy() &&
2075 "non void atomic unordered mem intrinsic");
2076 return eraseInstFromFunction(*MI);
2077 }
2078 }
2079
2080 // No other transformations apply to volatile transfers.
2081 if (MI->isVolatile())
2082 return nullptr;
2083
2085 // memmove(x,x,size) -> noop.
2086 if (MTI->getSource() == MTI->getDest())
2087 return eraseInstFromFunction(CI);
2088 }
2089
2090 auto IsPointerUndefined = [MI](Value *Ptr) {
2091 return isa<ConstantPointerNull>(Ptr) &&
2093 MI->getFunction(),
2094 cast<PointerType>(Ptr->getType())->getAddressSpace());
2095 };
2096 bool SrcIsUndefined = false;
2097 // If we can determine a pointer alignment that is bigger than currently
2098 // set, update the alignment.
2099 if (auto *MTI = dyn_cast<AnyMemTransferInst>(MI)) {
2101 return I;
2102 SrcIsUndefined = IsPointerUndefined(MTI->getRawSource());
2103 } else if (auto *MSI = dyn_cast<AnyMemSetInst>(MI)) {
2104 if (Instruction *I = SimplifyAnyMemSet(MSI))
2105 return I;
2106 }
2107
2108 // If src/dest is null, this memory intrinsic must be a noop.
2109 if (SrcIsUndefined || IsPointerUndefined(MI->getRawDest())) {
2110 Builder.CreateAssumption(Builder.CreateIsNull(MI->getLength()));
2111 return eraseInstFromFunction(CI);
2112 }
2113
2114 // If we have a memmove and the source operation is a constant global,
2115 // then the source and dest pointers can't alias, so we can change this
2116 // into a call to memcpy.
2117 if (auto *MMI = dyn_cast<AnyMemMoveInst>(MI)) {
2118 if (GlobalVariable *GVSrc = dyn_cast<GlobalVariable>(MMI->getSource()))
2119 if (GVSrc->isConstant()) {
2120 Module *M = CI.getModule();
2121 Intrinsic::ID MemCpyID =
2122 MMI->isAtomic()
2123 ? Intrinsic::memcpy_element_unordered_atomic
2124 : Intrinsic::memcpy;
2125 Type *Tys[3] = { CI.getArgOperand(0)->getType(),
2126 CI.getArgOperand(1)->getType(),
2127 CI.getArgOperand(2)->getType() };
2129 Intrinsic::getOrInsertDeclaration(M, MemCpyID, Tys));
2130 return II;
2131 }
2132 }
2133 }
2134
2135 // For fixed width vector result intrinsics, use the generic demanded vector
2136 // support.
2137 if (auto *IIFVTy = dyn_cast<FixedVectorType>(II->getType())) {
2138 auto VWidth = IIFVTy->getNumElements();
2139 APInt PoisonElts(VWidth, 0);
2140 APInt AllOnesEltMask(APInt::getAllOnes(VWidth));
2141 if (Value *V = SimplifyDemandedVectorElts(II, AllOnesEltMask, PoisonElts)) {
2142 if (V != II)
2143 return replaceInstUsesWith(*II, V);
2144 return II;
2145 }
2146 }
2147
2148 if (II->isCommutative()) {
2149 if (auto Pair = matchSymmetricPair(II->getOperand(0), II->getOperand(1))) {
2150 replaceOperand(*II, 0, Pair->first);
2151 replaceOperand(*II, 1, Pair->second);
2152 II->dropPoisonGeneratingAnnotations();
2153 II->dropUBImplyingAttrsAndMetadata();
2154 return II;
2155 }
2156
2157 if (CallInst *NewCall = canonicalizeConstantArg0ToArg1(CI))
2158 return NewCall;
2159 }
2160
2161 // Unused constrained FP intrinsic calls may have declared side effect, which
2162 // prevents it from being removed. In some cases however the side effect is
2163 // actually absent. To detect this case, call SimplifyConstrainedFPCall. If it
2164 // returns a replacement, the call may be removed.
2165 if (CI.use_empty() && isa<ConstrainedFPIntrinsic>(CI)) {
2166 if (simplifyConstrainedFPCall(&CI, SQ.getWithInstruction(&CI)))
2167 return eraseInstFromFunction(CI);
2168 }
2169
2170 Intrinsic::ID IID = II->getIntrinsicID();
2171 switch (IID) {
2172 case Intrinsic::objectsize: {
2173 SmallVector<Instruction *> InsertedInstructions;
2174 if (Value *V = lowerObjectSizeCall(II, DL, &TLI, AA, /*MustSucceed=*/false,
2175 &InsertedInstructions)) {
2176 for (Instruction *Inserted : InsertedInstructions)
2177 Worklist.add(Inserted);
2178 return replaceInstUsesWith(CI, V);
2179 }
2180 return nullptr;
2181 }
2182 case Intrinsic::abs: {
2183 Value *IIOperand = II->getArgOperand(0);
2184 bool IntMinIsPoison = cast<Constant>(II->getArgOperand(1))->isOneValue();
2185
2186 // abs(-x) -> abs(x)
2187 Value *X;
2188 if (match(IIOperand, m_Neg(m_Value(X))))
2189 return CallInst::Create(
2190 II->getCalledFunction(),
2191 {X,
2192 Builder.getInt1(IntMinIsPoison ||
2193 cast<Instruction>(IIOperand)->hasNoSignedWrap())});
2194
2195 if (match(IIOperand, m_c_Select(m_Neg(m_Value(X)), m_Deferred(X))))
2196 return CallInst::Create(II->getCalledFunction(),
2197 {X, II->getArgOperand(1)});
2198
2199 Value *Y;
2200 // abs(a * abs(b)) -> abs(a * b)
2201 if (match(IIOperand,
2204 bool NSW =
2205 cast<Instruction>(IIOperand)->hasNoSignedWrap() && IntMinIsPoison;
2206 auto *XY = NSW ? Builder.CreateNSWMul(X, Y) : Builder.CreateMul(X, Y);
2207 return CallInst::Create(II->getCalledFunction(),
2208 {XY, II->getArgOperand(1)});
2209 }
2210
2211 if (std::optional<bool> Known =
2212 getKnownSignOrZero(IIOperand, SQ.getWithInstruction(II))) {
2213 // abs(x) -> x if x >= 0 (include abs(x-y) --> x - y where x >= y)
2214 // abs(x) -> x if x > 0 (include abs(x-y) --> x - y where x > y)
2215 if (!*Known)
2216 return replaceInstUsesWith(*II, IIOperand);
2217
2218 // abs(x) -> -x if x < 0
2219 // abs(x) -> -x if x < = 0 (include abs(x-y) --> y - x where x <= y)
2220 if (IntMinIsPoison)
2221 return BinaryOperator::CreateNSWNeg(IIOperand);
2222 return BinaryOperator::CreateNeg(IIOperand);
2223 }
2224
2225 // abs (sext X) --> zext (abs X*)
2226 // Clear the IsIntMin (nsw) bit on the abs to allow narrowing.
2227 if (match(IIOperand, m_OneUse(m_SExt(m_Value(X))))) {
2228 Value *NarrowAbs =
2229 Builder.CreateBinaryIntrinsic(Intrinsic::abs, X, Builder.getFalse());
2230 return CastInst::Create(Instruction::ZExt, NarrowAbs, II->getType());
2231 }
2232
2233 // Match a complicated way to check if a number is odd/even:
2234 // abs (srem X, 2) --> and X, 1
2235 const APInt *C;
2236 if (match(IIOperand, m_SRem(m_Value(X), m_APInt(C))) && *C == 2)
2237 return BinaryOperator::CreateAnd(X, ConstantInt::get(II->getType(), 1));
2238
2239 break;
2240 }
2241 case Intrinsic::umin: {
2242 Value *I0 = II->getArgOperand(0), *I1 = II->getArgOperand(1);
2243 // umin(x, 1) == zext(x != 0)
2244 if (match(I1, m_One())) {
2245 assert(II->getType()->getScalarSizeInBits() != 1 &&
2246 "Expected simplify of umin with max constant");
2247 Value *Zero = Constant::getNullValue(I0->getType());
2248 Value *Cmp = Builder.CreateICmpNE(I0, Zero);
2249 return CastInst::Create(Instruction::ZExt, Cmp, II->getType());
2250 }
2251 // umin(cttz(x), const) --> cttz(x | (1 << const))
2252 if (Value *FoldedCttz =
2254 I0, I1, DL, Builder))
2255 return replaceInstUsesWith(*II, FoldedCttz);
2256 // umin(ctlz(x), const) --> ctlz(x | (SignedMin >> const))
2257 if (Value *FoldedCtlz =
2259 I0, I1, DL, Builder))
2260 return replaceInstUsesWith(*II, FoldedCtlz);
2261 [[fallthrough]];
2262 }
2263 case Intrinsic::umax: {
2264 Value *I0 = II->getArgOperand(0), *I1 = II->getArgOperand(1);
2265 Value *X, *Y;
2266 if (match(I0, m_ZExt(m_Value(X))) && match(I1, m_ZExt(m_Value(Y))) &&
2267 (I0->hasOneUse() || I1->hasOneUse()) && X->getType() == Y->getType()) {
2268 Value *NarrowMaxMin = Builder.CreateBinaryIntrinsic(IID, X, Y);
2269 return CastInst::Create(Instruction::ZExt, NarrowMaxMin, II->getType());
2270 }
2271 Constant *C;
2272 if (match(I0, m_ZExt(m_Value(X))) && match(I1, m_Constant(C)) &&
2273 I0->hasOneUse()) {
2274 if (Constant *NarrowC = getLosslessUnsignedTrunc(C, X->getType(), DL)) {
2275 Value *NarrowMaxMin = Builder.CreateBinaryIntrinsic(IID, X, NarrowC);
2276 return CastInst::Create(Instruction::ZExt, NarrowMaxMin, II->getType());
2277 }
2278 }
2279 // If C is not 0:
2280 // umax(nuw_shl(x, C), x + 1) -> x == 0 ? 1 : nuw_shl(x, C)
2281 // If C is not 0 or 1:
2282 // umax(nuw_mul(x, C), x + 1) -> x == 0 ? 1 : nuw_mul(x, C)
2283 auto foldMaxMulShift = [&](Value *A, Value *B) -> Instruction * {
2284 const APInt *C;
2285 Value *X;
2286 if (!match(A, m_NUWShl(m_Value(X), m_APInt(C))) &&
2287 !(match(A, m_NUWMul(m_Value(X), m_APInt(C))) && !C->isOne()))
2288 return nullptr;
2289 if (C->isZero())
2290 return nullptr;
2291 if (!match(B, m_OneUse(m_Add(m_Specific(X), m_One()))))
2292 return nullptr;
2293
2294 Value *Cmp = Builder.CreateICmpEQ(X, ConstantInt::get(X->getType(), 0));
2295 Value *NewSelect = nullptr;
2296 NewSelect = Builder.CreateSelectWithUnknownProfile(
2297 Cmp, ConstantInt::get(X->getType(), 1), A, DEBUG_TYPE);
2298 return replaceInstUsesWith(*II, NewSelect);
2299 };
2300
2301 if (IID == Intrinsic::umax) {
2302 if (Instruction *I = foldMaxMulShift(I0, I1))
2303 return I;
2304 if (Instruction *I = foldMaxMulShift(I1, I0))
2305 return I;
2306 }
2307
2308 // If both operands of unsigned min/max are sign-extended, it is still ok
2309 // to narrow the operation.
2310 [[fallthrough]];
2311 }
2312 case Intrinsic::smax:
2313 case Intrinsic::smin: {
2314 Value *I0 = II->getArgOperand(0), *I1 = II->getArgOperand(1);
2315 Value *X, *Y;
2316 if (match(I0, m_SExt(m_Value(X))) && match(I1, m_SExt(m_Value(Y))) &&
2317 (I0->hasOneUse() || I1->hasOneUse()) && X->getType() == Y->getType()) {
2318 Value *NarrowMaxMin = Builder.CreateBinaryIntrinsic(IID, X, Y);
2319 return CastInst::Create(Instruction::SExt, NarrowMaxMin, II->getType());
2320 }
2321
2322 Constant *C;
2323 if (match(I0, m_SExt(m_Value(X))) && match(I1, m_Constant(C)) &&
2324 I0->hasOneUse()) {
2325 if (Constant *NarrowC = getLosslessSignedTrunc(C, X->getType(), DL)) {
2326 Value *NarrowMaxMin = Builder.CreateBinaryIntrinsic(IID, X, NarrowC);
2327 return CastInst::Create(Instruction::SExt, NarrowMaxMin, II->getType());
2328 }
2329 }
2330
2331 // smax(smin(X, MinC), MaxC) -> smin(smax(X, MaxC), MinC) if MinC s>= MaxC
2332 // umax(umin(X, MinC), MaxC) -> umin(umax(X, MaxC), MinC) if MinC u>= MaxC
2333 const APInt *MinC, *MaxC;
2334 auto CreateCanonicalClampForm = [&](bool IsSigned) {
2335 auto MaxIID = IsSigned ? Intrinsic::smax : Intrinsic::umax;
2336 auto MinIID = IsSigned ? Intrinsic::smin : Intrinsic::umin;
2337 Value *NewMax = Builder.CreateBinaryIntrinsic(
2338 MaxIID, X, ConstantInt::get(X->getType(), *MaxC));
2339 return replaceInstUsesWith(
2340 *II, Builder.CreateBinaryIntrinsic(
2341 MinIID, NewMax, ConstantInt::get(X->getType(), *MinC)));
2342 };
2343 if (IID == Intrinsic::smax &&
2345 m_APInt(MinC)))) &&
2346 match(I1, m_APInt(MaxC)) && MinC->sgt(*MaxC))
2347 return CreateCanonicalClampForm(true);
2348 if (IID == Intrinsic::umax &&
2350 m_APInt(MinC)))) &&
2351 match(I1, m_APInt(MaxC)) && MinC->ugt(*MaxC))
2352 return CreateCanonicalClampForm(false);
2353
2354 // umin(i1 X, i1 Y) -> and i1 X, Y
2355 // smax(i1 X, i1 Y) -> and i1 X, Y
2356 if ((IID == Intrinsic::umin || IID == Intrinsic::smax) &&
2357 II->getType()->isIntOrIntVectorTy(1)) {
2358 return BinaryOperator::CreateAnd(I0, I1);
2359 }
2360
2361 // umax(i1 X, i1 Y) -> or i1 X, Y
2362 // smin(i1 X, i1 Y) -> or i1 X, Y
2363 if ((IID == Intrinsic::umax || IID == Intrinsic::smin) &&
2364 II->getType()->isIntOrIntVectorTy(1)) {
2365 return BinaryOperator::CreateOr(I0, I1);
2366 }
2367
2368 // smin(smax(X, -1), 1) -> scmp(X, 0)
2369 // smax(smin(X, 1), -1) -> scmp(X, 0)
2370 // At this point, smax(smin(X, 1), -1) is changed to smin(smax(X, -1)
2371 // And i1's have been changed to and/ors
2372 // So we only need to check for smin
2373 if (IID == Intrinsic::smin) {
2374 if (match(I0, m_OneUse(m_SMax(m_Value(X), m_AllOnes()))) &&
2375 match(I1, m_One())) {
2376 Value *Zero = ConstantInt::get(X->getType(), 0);
2377 return replaceInstUsesWith(
2378 CI,
2379 Builder.CreateIntrinsic(II->getType(), Intrinsic::scmp, {X, Zero}));
2380 }
2381 }
2382
2383 if (IID == Intrinsic::smax || IID == Intrinsic::smin) {
2384 // smax (neg nsw X), (neg nsw Y) --> neg nsw (smin X, Y)
2385 // smin (neg nsw X), (neg nsw Y) --> neg nsw (smax X, Y)
2386 // TODO: Canonicalize neg after min/max if I1 is constant.
2387 if (match(I0, m_NSWNeg(m_Value(X))) && match(I1, m_NSWNeg(m_Value(Y))) &&
2388 (I0->hasOneUse() || I1->hasOneUse())) {
2390 Value *InvMaxMin = Builder.CreateBinaryIntrinsic(InvID, X, Y);
2391 return BinaryOperator::CreateNSWNeg(InvMaxMin);
2392 }
2393 }
2394
2395 // (umax X, (xor X, Pow2))
2396 // -> (or X, Pow2)
2397 // (umin X, (xor X, Pow2))
2398 // -> (and X, ~Pow2)
2399 // (smax X, (xor X, Pos_Pow2))
2400 // -> (or X, Pos_Pow2)
2401 // (smin X, (xor X, Pos_Pow2))
2402 // -> (and X, ~Pos_Pow2)
2403 // (smax X, (xor X, Neg_Pow2))
2404 // -> (and X, ~Neg_Pow2)
2405 // (smin X, (xor X, Neg_Pow2))
2406 // -> (or X, Neg_Pow2)
2407 if ((match(I0, m_c_Xor(m_Specific(I1), m_Value(X))) ||
2408 match(I1, m_c_Xor(m_Specific(I0), m_Value(X)))) &&
2409 isKnownToBeAPowerOfTwo(X, /* OrZero */ true)) {
2410 bool UseOr = IID == Intrinsic::smax || IID == Intrinsic::umax;
2411 bool UseAndN = IID == Intrinsic::smin || IID == Intrinsic::umin;
2412
2413 if (IID == Intrinsic::smax || IID == Intrinsic::smin) {
2414 auto KnownSign = getKnownSign(X, SQ.getWithInstruction(II));
2415 if (KnownSign == std::nullopt) {
2416 UseOr = false;
2417 UseAndN = false;
2418 } else if (*KnownSign /* true is Signed. */) {
2419 UseOr ^= true;
2420 UseAndN ^= true;
2421 Type *Ty = I0->getType();
2422 // Negative power of 2 must be IntMin. It's possible to be able to
2423 // prove negative / power of 2 without actually having known bits, so
2424 // just get the value by hand.
2426 Ty, APInt::getSignedMinValue(Ty->getScalarSizeInBits()));
2427 }
2428 }
2429 if (UseOr)
2430 return BinaryOperator::CreateOr(I0, X);
2431 else if (UseAndN)
2432 return BinaryOperator::CreateAnd(I0, Builder.CreateNot(X));
2433 }
2434
2435 // If we can eliminate ~A and Y is free to invert:
2436 // max ~A, Y --> ~(min A, ~Y)
2437 //
2438 // Examples:
2439 // max ~A, ~Y --> ~(min A, Y)
2440 // max ~A, C --> ~(min A, ~C)
2441 // max ~A, (max ~Y, ~Z) --> ~min( A, (min Y, Z))
2442 auto moveNotAfterMinMax = [&](Value *X, Value *Y) -> Instruction * {
2443 Value *A;
2444 if (match(X, m_OneUse(m_Not(m_Value(A)))) &&
2445 !isFreeToInvert(A, A->hasOneUse())) {
2446 if (Value *NotY = getFreelyInverted(Y, Y->hasOneUse(), &Builder)) {
2448 Value *InvMaxMin = Builder.CreateBinaryIntrinsic(InvID, A, NotY);
2449 return BinaryOperator::CreateNot(InvMaxMin);
2450 }
2451 }
2452 return nullptr;
2453 };
2454
2455 if (Instruction *I = moveNotAfterMinMax(I0, I1))
2456 return I;
2457 if (Instruction *I = moveNotAfterMinMax(I1, I0))
2458 return I;
2459
2461 return I;
2462
2463 // minmax (X & NegPow2C, Y & NegPow2C) --> minmax(X, Y) & NegPow2C
2464 const APInt *RHSC;
2465 if (match(I0, m_OneUse(m_And(m_Value(X), m_NegatedPower2(RHSC)))) &&
2466 match(I1, m_OneUse(m_And(m_Value(Y), m_SpecificInt(*RHSC)))))
2467 return BinaryOperator::CreateAnd(Builder.CreateBinaryIntrinsic(IID, X, Y),
2468 ConstantInt::get(II->getType(), *RHSC));
2469
2470 // smax(X, -X) --> abs(X)
2471 // smin(X, -X) --> -abs(X)
2472 // umax(X, -X) --> -abs(X)
2473 // umin(X, -X) --> abs(X)
2474 if (isKnownNegation(I0, I1)) {
2475 // We can choose either operand as the input to abs(), but if we can
2476 // eliminate the only use of a value, that's better for subsequent
2477 // transforms/analysis.
2478 if (I0->hasOneUse() && !I1->hasOneUse())
2479 std::swap(I0, I1);
2480
2481 // This is some variant of abs(). See if we can propagate 'nsw' to the abs
2482 // operation and potentially its negation.
2483 bool IntMinIsPoison = isKnownNegation(I0, I1, /* NeedNSW */ true);
2484 Value *Abs = Builder.CreateBinaryIntrinsic(
2485 Intrinsic::abs, I0,
2486 ConstantInt::getBool(II->getContext(), IntMinIsPoison));
2487
2488 // We don't have a "nabs" intrinsic, so negate if needed based on the
2489 // max/min operation.
2490 if (IID == Intrinsic::smin || IID == Intrinsic::umax)
2491 Abs = Builder.CreateNeg(Abs, "nabs", IntMinIsPoison);
2492 return replaceInstUsesWith(CI, Abs);
2493 }
2494
2496 return Sel;
2497
2498 if (Instruction *SAdd = matchSAddSubSat(*II))
2499 return SAdd;
2500
2501 if (Value *NewMinMax = reassociateMinMaxWithConstants(II, Builder, SQ))
2502 return replaceInstUsesWith(*II, NewMinMax);
2503
2505 return R;
2506
2507 if (Instruction *NewMinMax = factorizeMinMaxTree(II))
2508 return NewMinMax;
2509
2510 // Try to fold minmax with constant RHS based on range information
2511 if (match(I1, m_APIntAllowPoison(RHSC))) {
2512 ICmpInst::Predicate Pred =
2514 bool IsSigned = MinMaxIntrinsic::isSigned(IID);
2516 I0, IsSigned, SQ.getWithInstruction(II));
2517 if (!LHS_CR.isFullSet()) {
2518 if (LHS_CR.icmp(Pred, *RHSC))
2519 return replaceInstUsesWith(*II, I0);
2520 if (LHS_CR.icmp(ICmpInst::getSwappedPredicate(Pred), *RHSC))
2521 return replaceInstUsesWith(*II,
2522 ConstantInt::get(II->getType(), *RHSC));
2523 }
2524 }
2525
2527 return replaceInstUsesWith(*II, V);
2528
2529 break;
2530 }
2531 case Intrinsic::scmp:
2532 case Intrinsic::ucmp: {
2534 return replaceInstUsesWith(CI, V);
2535
2536 auto *Cmp = cast<CmpIntrinsic>(II);
2537 Value *I0 = Cmp->getLHS(), *I1 = Cmp->getRHS();
2538 Value *LHS, *RHS;
2539 if (matchCommonBinOpOperands(I0, I1, Cmp->getLTPredicate(), LHS, RHS,
2540 SQ.getWithInstruction(II)))
2541 return replaceInstUsesWith(
2542 CI, Builder.CreateIntrinsic(II->getType(), IID, {LHS, RHS}));
2543
2544 if (IID == Intrinsic::ucmp)
2545 break;
2546
2547 // scmp(X, 0) -> sext_or_trunc(X) if X is known to be one of -1, 0, 1.
2548 if (match(I1, m_Zero())) {
2549 ConstantRange Range = computeConstantRange(I0, /*ForSigned=*/true,
2550 SQ.getWithInstruction(II));
2551 if (Range.getSignedMin().sge(-1) && Range.getSignedMax().sle(1))
2552 return replaceInstUsesWith(
2553 CI, Builder.CreateSExtOrTrunc(I0, II->getType()));
2554 }
2555 if (match(I0, m_NSWSub(m_Value(LHS), m_Value(RHS))) && match(I1, m_Zero()))
2556 return replaceInstUsesWith(
2557 CI,
2558 Builder.CreateIntrinsic(II->getType(), Intrinsic::scmp, {LHS, RHS}));
2559 break;
2560 }
2561 case Intrinsic::bitreverse: {
2562 Value *IIOperand = II->getArgOperand(0);
2563 // bitrev (zext i1 X to ?) --> X ? SignBitC : 0
2564 Value *X;
2565 if (match(IIOperand, m_ZExt(m_Value(X))) &&
2566 X->getType()->isIntOrIntVectorTy(1)) {
2567 Type *Ty = II->getType();
2568 APInt SignBit = APInt::getSignMask(Ty->getScalarSizeInBits());
2569 SelectInst *SI = SelectInst::Create(X, ConstantInt::get(Ty, SignBit),
2571 // Mark the branch weights explicitly unknown as in the general case we
2572 // cannot infer the probability of the condition without additional value
2573 // profiling.
2575 return SI;
2576 }
2577
2578 if (Instruction *crossLogicOpFold =
2580 return crossLogicOpFold;
2581
2582 break;
2583 }
2584 case Intrinsic::bswap: {
2585 Value *IIOperand = II->getArgOperand(0);
2586
2587 // Try to canonicalize bswap-of-logical-shift-by-8-bit-multiple as
2588 // inverse-shift-of-bswap:
2589 // bswap (shl X, Y) --> lshr (bswap X), Y
2590 // bswap (lshr X, Y) --> shl (bswap X), Y
2591 Value *X, *Y;
2592 if (match(IIOperand, m_OneUse(m_LogicalShift(m_Value(X), m_Value(Y))))) {
2593 unsigned BitWidth = IIOperand->getType()->getScalarSizeInBits();
2595 Value *NewSwap = Builder.CreateUnaryIntrinsic(Intrinsic::bswap, X);
2596 BinaryOperator::BinaryOps InverseShift =
2597 cast<BinaryOperator>(IIOperand)->getOpcode() == Instruction::Shl
2598 ? Instruction::LShr
2599 : Instruction::Shl;
2600 return BinaryOperator::Create(InverseShift, NewSwap, Y);
2601 }
2602 }
2603
2604 KnownBits Known = computeKnownBits(IIOperand, II);
2605 uint64_t LZ = alignDown(Known.countMinLeadingZeros(), 8);
2606 uint64_t TZ = alignDown(Known.countMinTrailingZeros(), 8);
2607 unsigned BW = Known.getBitWidth();
2608
2609 // bswap(x) -> shift(x) if x has exactly one "active byte"
2610 if (BW - LZ - TZ == 8) {
2611 assert(LZ != TZ && "active byte cannot be in the middle");
2612 if (LZ > TZ) // -> shl(x) if the "active byte" is in the low part of x
2613 return BinaryOperator::CreateNUWShl(
2614 IIOperand, ConstantInt::get(IIOperand->getType(), LZ - TZ));
2615 // -> lshr(x) if the "active byte" is in the high part of x
2616 return BinaryOperator::CreateExactLShr(
2617 IIOperand, ConstantInt::get(IIOperand->getType(), TZ - LZ));
2618 }
2619
2620 // bswap(trunc(bswap(x))) -> trunc(lshr(x, c))
2621 if (match(IIOperand, m_Trunc(m_BSwap(m_Value(X))))) {
2622 unsigned C = X->getType()->getScalarSizeInBits() - BW;
2623 Value *CV = ConstantInt::get(X->getType(), C);
2624 Value *V = Builder.CreateLShr(X, CV);
2625 return new TruncInst(V, IIOperand->getType());
2626 }
2627
2628 if (Instruction *crossLogicOpFold =
2630 return crossLogicOpFold;
2631 }
2632
2633 // Try to fold into bitreverse if bswap is the root of the expression tree.
2634 if (Instruction *BitOp = matchBSwapOrBitReverse(*II, /*MatchBSwaps*/ false,
2635 /*MatchBitReversals*/ true))
2636 return BitOp;
2637 break;
2638 }
2639 case Intrinsic::masked_load:
2640 if (Value *SimplifiedMaskedOp = simplifyMaskedLoad(*II))
2641 return replaceInstUsesWith(CI, SimplifiedMaskedOp);
2642 break;
2643 case Intrinsic::masked_store:
2644 return simplifyMaskedStore(*II);
2645 case Intrinsic::masked_gather:
2646 return simplifyMaskedGather(*II);
2647 case Intrinsic::masked_scatter:
2648 return simplifyMaskedScatter(*II);
2649 case Intrinsic::launder_invariant_group:
2650 if (auto *SkippedBarrier = simplifyInvariantGroupIntrinsic(*II, *this))
2651 return replaceInstUsesWith(*II, SkippedBarrier);
2652 break;
2653 case Intrinsic::powi: {
2654 if (ConstantInt *Power = dyn_cast<ConstantInt>(II->getArgOperand(1))) {
2655 // 0 and 1 are handled in instsimplify
2656 // powi(x, -1) -> 1/x
2657 if (Power->isMinusOne())
2658 return BinaryOperator::CreateFDivFMF(ConstantFP::get(CI.getType(), 1.0),
2659 II->getArgOperand(0), II);
2660 // powi(x, 2) -> x*x
2661 if (Power->equalsInt(2))
2662 return BinaryOperator::CreateFMulFMF(II->getArgOperand(0),
2663 II->getArgOperand(0), II);
2664
2665 if (!Power->getValue()[0]) {
2666 Value *X;
2667 // If power is even:
2668 // powi(-x, p) -> powi(x, p)
2669 // powi(fabs(x), p) -> powi(x, p)
2670 // powi(copysign(x, y), p) -> powi(x, p)
2671 // TODO: Confirm whether m_FNegOrFSubNegZero is correct.
2672 if (match(II->getArgOperand(0), m_FNegOrFSubNegZero(m_Value(X))) ||
2673 match(II->getArgOperand(0), m_FAbs(m_Value(X))) ||
2674 match(II->getArgOperand(0),
2676 return CallInst::Create(II->getCalledFunction(), {X, Power});
2677 }
2678 }
2679 if (ConstantFP *Base = dyn_cast<ConstantFP>(II->getArgOperand(0))) {
2680 Value *Exp = II->getArgOperand(1);
2681 Type *Ty = Base->getType();
2682 // powi(2.0, p) -> ldexp(1.0, p)
2683 if (II->hasApproxFunc() && Base->isExactlyValue(2.0)) {
2684 ConstantFP *One = ConstantFP::get(Ty, 1.0);
2685 if (auto *VTy = dyn_cast<VectorType>(Ty))
2686 Exp = Builder.CreateVectorSplat(VTy->getElementCount(), Exp);
2687 Value *Ldexp = Builder.CreateLdexp(One, Exp, II);
2688 return replaceInstUsesWith(*II, Ldexp);
2689 }
2690 }
2691 break;
2692 }
2693
2694 case Intrinsic::cttz:
2695 case Intrinsic::ctlz:
2696 if (auto *I = foldCttzCtlz(*II, *this))
2697 return I;
2698 break;
2699
2700 case Intrinsic::ctpop:
2701 if (auto *I = foldCtpop(*II, *this))
2702 return I;
2703 break;
2704
2705 case Intrinsic::fshl:
2706 case Intrinsic::fshr: {
2707 Value *Op0 = II->getArgOperand(0), *Op1 = II->getArgOperand(1);
2708 Type *Ty = II->getType();
2709 unsigned BitWidth = Ty->getScalarSizeInBits();
2710 Constant *ShAmtC;
2711 if (match(II->getArgOperand(2), m_ImmConstant(ShAmtC))) {
2712 // Canonicalize a shift amount constant operand to modulo the bit-width.
2713 Constant *WidthC = ConstantInt::get(Ty, BitWidth);
2714 Constant *ModuloC =
2715 ConstantFoldBinaryOpOperands(Instruction::URem, ShAmtC, WidthC, DL);
2716 if (!ModuloC)
2717 return nullptr;
2718 if (ModuloC != ShAmtC)
2719 return CallInst::Create(II->getCalledFunction(), {Op0, Op1, ModuloC});
2720
2722 ShAmtC, DL),
2723 m_One()) &&
2724 "Shift amount expected to be modulo bitwidth");
2725
2726 // Canonicalize funnel shift right by constant to funnel shift left. This
2727 // is not entirely arbitrary. For historical reasons, the backend may
2728 // recognize rotate left patterns but miss rotate right patterns.
2729 if (IID == Intrinsic::fshr) {
2730 // fshr X, Y, C --> fshl X, Y, (BitWidth - C) if C is not zero.
2731 if (!isKnownNonZero(ShAmtC, SQ.getWithInstruction(II)))
2732 return nullptr;
2733
2734 Constant *LeftShiftC = ConstantExpr::getSub(WidthC, ShAmtC);
2735 Module *Mod = II->getModule();
2736 Function *Fshl =
2737 Intrinsic::getOrInsertDeclaration(Mod, Intrinsic::fshl, Ty);
2738 return CallInst::Create(Fshl, { Op0, Op1, LeftShiftC });
2739 }
2740 assert(IID == Intrinsic::fshl &&
2741 "All funnel shifts by simple constants should go left");
2742
2743 // fshl(X, 0, C) --> shl X, C
2744 // fshl(X, undef, C) --> shl X, C
2745 if (match(Op1, m_ZeroInt()) || match(Op1, m_Undef()))
2746 return BinaryOperator::CreateShl(Op0, ShAmtC);
2747
2748 // fshl(0, X, C) --> lshr X, (BW-C)
2749 // fshl(undef, X, C) --> lshr X, (BW-C)
2750 // Similar to fshr -> fshl fold above, this is only valid if C is not zero
2751 if ((match(Op0, m_ZeroInt()) || match(Op0, m_Undef())) &&
2752 isKnownNonZero(ShAmtC, SQ.getWithInstruction(II)))
2753 return BinaryOperator::CreateLShr(Op1,
2754 ConstantExpr::getSub(WidthC, ShAmtC));
2755
2756 // fshl i16 X, X, 8 --> bswap i16 X (reduce to more-specific form)
2757 if (Op0 == Op1 && BitWidth == 16 && match(ShAmtC, m_SpecificInt(8))) {
2758 Module *Mod = II->getModule();
2759 Function *Bswap =
2760 Intrinsic::getOrInsertDeclaration(Mod, Intrinsic::bswap, Ty);
2761 return CallInst::Create(Bswap, { Op0 });
2762 }
2763 if (Instruction *BitOp =
2764 matchBSwapOrBitReverse(*II, /*MatchBSwaps*/ true,
2765 /*MatchBitReversals*/ true))
2766 return BitOp;
2767
2768 // R = fshl(X, X, C2)
2769 // fshl(R, R, C1) --> fshl(X, X, (C1 + C2) % bitsize)
2770 Value *InnerOp;
2771 const APInt *ShAmtInnerC, *ShAmtOuterC;
2772 if (match(Op0, m_FShl(m_Value(InnerOp), m_Deferred(InnerOp),
2773 m_APInt(ShAmtInnerC))) &&
2774 match(ShAmtC, m_APInt(ShAmtOuterC)) && Op0 == Op1) {
2775 APInt Sum = *ShAmtOuterC + *ShAmtInnerC;
2776 APInt Modulo = Sum.urem(APInt(Sum.getBitWidth(), BitWidth));
2777 if (Modulo.isZero())
2778 return replaceInstUsesWith(*II, InnerOp);
2779 Constant *ModuloC = ConstantInt::get(Ty, Modulo);
2781 {InnerOp, InnerOp, ModuloC});
2782 }
2783 }
2784
2785 // fshl(X, X, Neg(Y)) --> fshr(X, X, Y)
2786 // fshr(X, X, Neg(Y)) --> fshl(X, X, Y)
2787 // if BitWidth is a power-of-2
2788 Value *Y;
2789 if (Op0 == Op1 && isPowerOf2_32(BitWidth) &&
2790 match(II->getArgOperand(2), m_Neg(m_Value(Y)))) {
2791 Module *Mod = II->getModule();
2793 Mod, IID == Intrinsic::fshl ? Intrinsic::fshr : Intrinsic::fshl, Ty);
2794 return CallInst::Create(OppositeShift, {Op0, Op1, Y});
2795 }
2796
2797 // fshl(X, 0, Y) --> shl(X, and(Y, BitWidth - 1)) if bitwidth is a
2798 // power-of-2
2799 if (IID == Intrinsic::fshl && isPowerOf2_32(BitWidth) &&
2800 match(Op1, m_ZeroInt())) {
2801 Value *Op2 = II->getArgOperand(2);
2802 Value *And = Builder.CreateAnd(Op2, ConstantInt::get(Ty, BitWidth - 1));
2803 return BinaryOperator::CreateShl(Op0, And);
2804 }
2805
2806 // Left or right might be masked.
2808 return &CI;
2809
2810 // The shift amount (operand 2) of a funnel shift is modulo the bitwidth,
2811 // so only the low bits of the shift amount are demanded if the bitwidth is
2812 // a power-of-2.
2813 if (!isPowerOf2_32(BitWidth))
2814 break;
2816 KnownBits Op2Known(BitWidth);
2817 if (SimplifyDemandedBits(II, 2, Op2Demanded, Op2Known))
2818 return &CI;
2819 break;
2820 }
2821 case Intrinsic::pdep: {
2822 const APInt *MaskC;
2823 if (match(II->getArgOperand(1), m_APInt(MaskC))) {
2824 unsigned MaskIdx, MaskLen;
2825 if (MaskC->isShiftedMask(MaskIdx, MaskLen)) {
2826 // any single contiguous sequence of 1s anywhere in the mask simply
2827 // describes a subset of the input bits shifted to the appropriate
2828 // position. Replace with the straight forward IR.
2829 Value *Input = II->getArgOperand(0);
2830 Value *ShiftAmt = ConstantInt::get(II->getType(), MaskIdx);
2831 Value *Shifted = Builder.CreateShl(Input, ShiftAmt);
2832 Value *Masked = Builder.CreateAnd(Shifted, II->getArgOperand(1));
2833 return replaceInstUsesWith(*II, Masked);
2834 }
2835 }
2836 break;
2837 }
2838 case Intrinsic::pext: {
2839 const APInt *MaskC;
2840 if (match(II->getArgOperand(1), m_APInt(MaskC))) {
2841 unsigned MaskIdx, MaskLen;
2842 if (MaskC->isShiftedMask(MaskIdx, MaskLen)) {
2843 // any single contiguous sequence of 1s anywhere in the mask simply
2844 // describes a subset of the input bits shifted to the appropriate
2845 // position. Replace with the straight forward IR.
2846 Value *Input = II->getArgOperand(0);
2847 Value *Masked = Builder.CreateAnd(Input, II->getArgOperand(1));
2848 Value *ShiftAmt = ConstantInt::get(II->getType(), MaskIdx);
2849 Value *Shifted = Builder.CreateLShr(Masked, ShiftAmt);
2850 return replaceInstUsesWith(*II, Shifted);
2851 }
2852 }
2853 break;
2854 }
2855 case Intrinsic::ptrmask: {
2856 unsigned BitWidth = DL.getPointerTypeSizeInBits(II->getType());
2859 return II;
2860
2861 Value *InnerPtr, *InnerMask;
2862 bool Changed = false;
2863 // Combine:
2864 // (ptrmask (ptrmask p, A), B)
2865 // -> (ptrmask p, (and A, B))
2866 if (match(II->getArgOperand(0),
2868 m_Value(InnerMask))))) {
2869 assert(II->getArgOperand(1)->getType() == InnerMask->getType() &&
2870 "Mask types must match");
2871 // TODO: If InnerMask == Op1, we could copy attributes from inner
2872 // callsite -> outer callsite.
2873 Value *NewMask = Builder.CreateAnd(II->getArgOperand(1), InnerMask);
2874 replaceOperand(CI, 0, InnerPtr);
2875 replaceOperand(CI, 1, NewMask);
2876 Changed = true;
2877 }
2878
2879 // See if we can deduce non-null.
2880 if (!CI.hasRetAttr(Attribute::NonNull) &&
2881 (Known.isNonZero() ||
2882 isKnownNonZero(II, getSimplifyQuery().getWithInstruction(II)))) {
2883 CI.addRetAttr(Attribute::NonNull);
2884 Changed = true;
2885 }
2886
2887 unsigned NewAlignmentLog =
2889 std::min(BitWidth - 1, Known.countMinTrailingZeros()));
2890 // Known bits will capture if we had alignment information associated with
2891 // the pointer argument.
2892 if (NewAlignmentLog > Log2(CI.getRetAlign().valueOrOne())) {
2894 CI.getContext(), Align::fromLog2(NewAlignmentLog)));
2895 Changed = true;
2896 }
2897 if (Changed)
2898 return &CI;
2899 break;
2900 }
2901
2902 case Intrinsic::smulh: {
2903 Value *Arg0 = II->getArgOperand(0);
2904 Value *Arg1 = II->getArgOperand(1);
2905 unsigned BitWidth = II->getType()->getScalarSizeInBits();
2906
2907 // Multiply by one.
2908 if (BitWidth > 1 && match(Arg1, m_One()))
2909 return replaceInstUsesWith(CI, Builder.CreateAShr(Arg0, BitWidth - 1));
2910 break;
2911 }
2912
2913 case Intrinsic::uadd_with_overflow:
2914 case Intrinsic::sadd_with_overflow: {
2915 if (Instruction *I = foldIntrinsicWithOverflowCommon(II))
2916 return I;
2917
2918 // Given 2 constant operands whose sum does not overflow:
2919 // uaddo (X +nuw C0), C1 -> uaddo X, C0 + C1
2920 // saddo (X +nsw C0), C1 -> saddo X, C0 + C1
2921 Value *X;
2922 const APInt *C0, *C1;
2923 Value *Arg0 = II->getArgOperand(0);
2924 Value *Arg1 = II->getArgOperand(1);
2925 bool IsSigned = IID == Intrinsic::sadd_with_overflow;
2926 bool HasNWAdd = IsSigned
2927 ? match(Arg0, m_NSWAddLike(m_Value(X), m_APInt(C0)))
2928 : match(Arg0, m_NUWAddLike(m_Value(X), m_APInt(C0)));
2929 if (HasNWAdd && match(Arg1, m_APInt(C1))) {
2930 bool Overflow;
2931 APInt NewC =
2932 IsSigned ? C1->sadd_ov(*C0, Overflow) : C1->uadd_ov(*C0, Overflow);
2933 if (!Overflow)
2934 return replaceInstUsesWith(
2935 *II, Builder.CreateBinaryIntrinsic(
2936 IID, X, ConstantInt::get(Arg1->getType(), NewC)));
2937 }
2938 break;
2939 }
2940
2941 case Intrinsic::umul_with_overflow:
2942 case Intrinsic::smul_with_overflow:
2943 case Intrinsic::usub_with_overflow:
2944 if (Instruction *I = foldIntrinsicWithOverflowCommon(II))
2945 return I;
2946 break;
2947
2948 case Intrinsic::ssub_with_overflow: {
2949 if (Instruction *I = foldIntrinsicWithOverflowCommon(II))
2950 return I;
2951
2952 Constant *C;
2953 Value *Arg0 = II->getArgOperand(0);
2954 Value *Arg1 = II->getArgOperand(1);
2955 // Given a constant C that is not the minimum signed value
2956 // for an integer of a given bit width:
2957 //
2958 // ssubo X, C -> saddo X, -C
2959 if (match(Arg1, m_Constant(C)) && C->isNotMinSignedValue()) {
2960 Value *NegVal = ConstantExpr::getNeg(C);
2961 // Build a saddo call that is equivalent to the discovered
2962 // ssubo call.
2963 return replaceInstUsesWith(
2964 *II, Builder.CreateBinaryIntrinsic(Intrinsic::sadd_with_overflow,
2965 Arg0, NegVal));
2966 }
2967
2968 break;
2969 }
2970
2971 case Intrinsic::uadd_sat:
2972 case Intrinsic::sadd_sat:
2973 case Intrinsic::usub_sat:
2974 case Intrinsic::ssub_sat: {
2976 Type *Ty = SI->getType();
2977 Value *Arg0 = SI->getLHS();
2978 Value *Arg1 = SI->getRHS();
2979
2980 // Make use of known overflow information.
2981 OverflowResult OR = computeOverflow(SI->getBinaryOp(), SI->isSigned(),
2982 Arg0, Arg1, SI);
2983 switch (OR) {
2985 break;
2987 if (SI->isSigned())
2988 return BinaryOperator::CreateNSW(SI->getBinaryOp(), Arg0, Arg1);
2989 else
2990 return BinaryOperator::CreateNUW(SI->getBinaryOp(), Arg0, Arg1);
2992 unsigned BitWidth = Ty->getScalarSizeInBits();
2993 APInt Min = APSInt::getMinValue(BitWidth, !SI->isSigned());
2994 return replaceInstUsesWith(*SI, ConstantInt::get(Ty, Min));
2995 }
2997 unsigned BitWidth = Ty->getScalarSizeInBits();
2998 APInt Max = APSInt::getMaxValue(BitWidth, !SI->isSigned());
2999 return replaceInstUsesWith(*SI, ConstantInt::get(Ty, Max));
3000 }
3001 }
3002
3003 // usub_sat((sub nuw C, A), C1) -> usub_sat(usub_sat(C, C1), A)
3004 // which after that:
3005 // usub_sat((sub nuw C, A), C1) -> usub_sat(C - C1, A) if C1 u< C
3006 // usub_sat((sub nuw C, A), C1) -> 0 otherwise
3007 Constant *C, *C1;
3008 Value *A;
3009 if (IID == Intrinsic::usub_sat &&
3010 match(Arg0, m_NUWSub(m_ImmConstant(C), m_Value(A))) &&
3011 match(Arg1, m_ImmConstant(C1))) {
3012 auto *NewC = Builder.CreateBinaryIntrinsic(Intrinsic::usub_sat, C, C1);
3013 auto *NewSub =
3014 Builder.CreateBinaryIntrinsic(Intrinsic::usub_sat, NewC, A);
3015 return replaceInstUsesWith(*SI, NewSub);
3016 }
3017
3018 // ssub.sat(X, C) -> sadd.sat(X, -C) if C != MIN
3019 if (IID == Intrinsic::ssub_sat && match(Arg1, m_Constant(C)) &&
3020 C->isNotMinSignedValue()) {
3021 Value *NegVal = ConstantExpr::getNeg(C);
3022 return replaceInstUsesWith(
3023 *II, Builder.CreateBinaryIntrinsic(
3024 Intrinsic::sadd_sat, Arg0, NegVal));
3025 }
3026
3027 // sat(sat(X + Val2) + Val) -> sat(X + (Val+Val2))
3028 // sat(sat(X - Val2) - Val) -> sat(X - (Val+Val2))
3029 // if Val and Val2 have the same sign
3030 if (auto *Other = dyn_cast<IntrinsicInst>(Arg0)) {
3031 Value *X;
3032 const APInt *Val, *Val2;
3033 APInt NewVal;
3034 bool IsUnsigned =
3035 IID == Intrinsic::uadd_sat || IID == Intrinsic::usub_sat;
3036 if (Other->getIntrinsicID() == IID &&
3037 match(Arg1, m_APInt(Val)) &&
3038 match(Other->getArgOperand(0), m_Value(X)) &&
3039 match(Other->getArgOperand(1), m_APInt(Val2))) {
3040 if (IsUnsigned)
3041 NewVal = Val->uadd_sat(*Val2);
3042 else if (Val->isNonNegative() == Val2->isNonNegative()) {
3043 bool Overflow;
3044 NewVal = Val->sadd_ov(*Val2, Overflow);
3045 if (Overflow) {
3046 // Both adds together may add more than SignedMaxValue
3047 // without saturating the final result.
3048 break;
3049 }
3050 } else {
3051 // Cannot fold saturated addition with different signs.
3052 break;
3053 }
3054
3055 return replaceInstUsesWith(
3056 *II, Builder.CreateBinaryIntrinsic(
3057 IID, X, ConstantInt::get(II->getType(), NewVal)));
3058 }
3059 }
3060 break;
3061 }
3062
3063 case Intrinsic::minnum:
3064 case Intrinsic::maxnum:
3065 case Intrinsic::minimumnum:
3066 case Intrinsic::maximumnum:
3067 case Intrinsic::minimum:
3068 case Intrinsic::maximum: {
3069 Value *Arg0 = II->getArgOperand(0);
3070 Value *Arg1 = II->getArgOperand(1);
3071 Value *X, *Y;
3072 // TODO: Confirm whether m_FNegOrFSubNegZero is correct.
3073 if (match(Arg0, m_FNegOrFSubNegZero(m_Value(X))) &&
3075 (Arg0->hasOneUse() || Arg1->hasOneUse())) {
3076 // If both operands are negated, invert the call and negate the result:
3077 // min(-X, -Y) --> -(max(X, Y))
3078 // max(-X, -Y) --> -(min(X, Y))
3079 Intrinsic::ID NewIID;
3080 switch (IID) {
3081 case Intrinsic::maxnum:
3082 NewIID = Intrinsic::minnum;
3083 break;
3084 case Intrinsic::minnum:
3085 NewIID = Intrinsic::maxnum;
3086 break;
3087 case Intrinsic::maximumnum:
3088 NewIID = Intrinsic::minimumnum;
3089 break;
3090 case Intrinsic::minimumnum:
3091 NewIID = Intrinsic::maximumnum;
3092 break;
3093 case Intrinsic::maximum:
3094 NewIID = Intrinsic::minimum;
3095 break;
3096 case Intrinsic::minimum:
3097 NewIID = Intrinsic::maximum;
3098 break;
3099 default:
3100 llvm_unreachable("unexpected intrinsic ID");
3101 }
3102 Value *NewCall = Builder.CreateBinaryIntrinsic(NewIID, X, Y, II);
3103 Instruction *FNeg = UnaryOperator::CreateFNeg(NewCall);
3104 FNeg->copyIRFlags(II);
3105 return FNeg;
3106 }
3107
3108 // m(m(X, C2), C1) -> m(X, C)
3109 const APFloat *C1, *C2;
3110 if (auto *M = dyn_cast<IntrinsicInst>(Arg0)) {
3111 if (M->getIntrinsicID() == IID && match(Arg1, m_APFloat(C1)) &&
3112 ((match(M->getArgOperand(0), m_Value(X)) &&
3113 match(M->getArgOperand(1), m_APFloat(C2))) ||
3114 (match(M->getArgOperand(1), m_Value(X)) &&
3115 match(M->getArgOperand(0), m_APFloat(C2))))) {
3116 APFloat Res(0.0);
3117 switch (IID) {
3118 case Intrinsic::maxnum:
3119 Res = maxnum(*C1, *C2);
3120 break;
3121 case Intrinsic::minnum:
3122 Res = minnum(*C1, *C2);
3123 break;
3124 case Intrinsic::maximumnum:
3125 Res = maximumnum(*C1, *C2);
3126 break;
3127 case Intrinsic::minimumnum:
3128 Res = minimumnum(*C1, *C2);
3129 break;
3130 case Intrinsic::maximum:
3131 Res = maximum(*C1, *C2);
3132 break;
3133 case Intrinsic::minimum:
3134 Res = minimum(*C1, *C2);
3135 break;
3136 default:
3137 llvm_unreachable("unexpected intrinsic ID");
3138 }
3139 // TODO: Conservatively intersecting FMF. If Res == C2, the transform
3140 // was a simplification (so Arg0 and its original flags could
3141 // propagate?)
3142 Value *V = Builder.CreateBinaryIntrinsic(
3143 IID, X, ConstantFP::get(Arg0->getType(), Res),
3145 return replaceInstUsesWith(*II, V);
3146 }
3147 }
3148
3149 // m((fpext X), (fpext Y)) -> fpext (m(X, Y))
3150 if (match(Arg0, m_FPExt(m_Value(X))) && match(Arg1, m_FPExt(m_Value(Y))) &&
3151 (Arg0->hasOneUse() || Arg1->hasOneUse()) &&
3152 X->getType() == Y->getType()) {
3153 Value *NewCall =
3154 Builder.CreateBinaryIntrinsic(IID, X, Y, II, II->getName());
3155 return new FPExtInst(NewCall, II->getType());
3156 }
3157
3158 // m(fpext X, C) -> fpext m(X, TruncC) if C can be losslessly truncated.
3159 Constant *C;
3160 if (match(Arg0, m_OneUse(m_FPExt(m_Value(X)))) &&
3161 match(Arg1, m_ImmConstant(C))) {
3162 if (Constant *TruncC =
3163 getLosslessInvCast(C, X->getType(), Instruction::FPExt, DL)) {
3164 Value *NewCall =
3165 Builder.CreateBinaryIntrinsic(IID, X, TruncC, II, II->getName());
3166 return new FPExtInst(NewCall, II->getType());
3167 }
3168 }
3169
3170 // m(uitofp X, uitofp Y) -> uitofp (umin/umax(X, Y))
3171 // m(sitofp X, sitofp Y) -> sitofp (smin/smax(X, Y))
3172 if (match(Arg0, m_IToFP(m_Value(X))) && match(Arg1, m_IToFP(m_Value(Y))) &&
3173 cast<Instruction>(Arg0)->getOpcode() ==
3174 cast<Instruction>(Arg1)->getOpcode() &&
3175 (Arg0->hasOneUse() || Arg1->hasOneUse()) &&
3176 X->getType() == Y->getType()) {
3177 bool IsSigned = isa<SIToFPInst>(Arg0);
3178 bool IsMax = IID == Intrinsic::maxnum || IID == Intrinsic::maximum ||
3179 IID == Intrinsic::maximumnum;
3180 Intrinsic::ID IntIID =
3181 IsMax ? (IsSigned ? Intrinsic::smax : Intrinsic::umax)
3182 : (IsSigned ? Intrinsic::smin : Intrinsic::umin);
3183 Value *NewInt = Builder.CreateBinaryIntrinsic(IntIID, X, Y);
3184 auto *NewCast =
3185 CastInst::Create(IsSigned ? Instruction::SIToFP : Instruction::UIToFP,
3186 NewInt, II->getType());
3187 // umax/umin of two nneg values is nneg. Both flags are required: nneg is
3188 // not a known bit of the integer, so visitUIToFP cannot recover it later.
3189 if (!IsSigned && cast<Instruction>(Arg0)->hasNonNeg() &&
3190 cast<Instruction>(Arg1)->hasNonNeg())
3191 NewCast->setNonNeg();
3192 return NewCast;
3193 }
3194
3195 // max X, -X --> fabs X
3196 // min X, -X --> -(fabs X)
3197 // TODO: Remove one-use limitation? That is obviously better for max,
3198 // hence why we don't check for one-use for that. However,
3199 // it would be an extra instruction for min (fnabs), but
3200 // that is still likely better for analysis and codegen.
3201 auto IsMinMaxOrXNegX = [IID, &X](Value *Op0, Value *Op1) {
3202 // TODO: Confirm whether m_FNegOrFSubNegZero is correct.
3203 if (match(Op0, m_FNegOrFSubNegZero(m_Value(X))) &&
3204 match(Op1, m_Specific(X)))
3205 return Op0->hasOneUse() ||
3206 (IID != Intrinsic::minimum && IID != Intrinsic::minnum &&
3207 IID != Intrinsic::minimumnum);
3208 return false;
3209 };
3210
3211 if (IsMinMaxOrXNegX(Arg0, Arg1) || IsMinMaxOrXNegX(Arg1, Arg0)) {
3212 Value *R = Builder.CreateFAbs(X, II);
3213 if (IID == Intrinsic::minimum || IID == Intrinsic::minnum ||
3214 IID == Intrinsic::minimumnum)
3215 R = Builder.CreateFNegFMF(R, II);
3216 return replaceInstUsesWith(*II, R);
3217 }
3218
3219 break;
3220 }
3221 case Intrinsic::matrix_multiply: {
3222 // Optimize negation in matrix multiplication.
3223
3224 // -A * -B -> A * B
3225 Value *A, *B;
3226 // TODO: Confirm whether m_FNegOrFSubNegZero is correct.
3227 if (match(II->getArgOperand(0), m_FNegOrFSubNegZero(m_Value(A))) &&
3228 match(II->getArgOperand(1), m_FNegOrFSubNegZero(m_Value(B)))) {
3229 replaceOperand(*II, 0, A);
3230 replaceOperand(*II, 1, B);
3231 return II;
3232 }
3233
3234 Value *Op0 = II->getOperand(0);
3235 Value *Op1 = II->getOperand(1);
3236 Value *OpNotNeg, *NegatedOp;
3237 unsigned NegatedOpArg, OtherOpArg;
3238 // TODO: Confirm whether m_FNegOrFSubNegZero is correct.
3239 if (match(Op0, m_FNegOrFSubNegZero(m_Value(OpNotNeg)))) {
3240 NegatedOp = Op0;
3241 NegatedOpArg = 0;
3242 OtherOpArg = 1;
3243 } else if (match(Op1, m_FNegOrFSubNegZero(m_Value(OpNotNeg)))) {
3244 NegatedOp = Op1;
3245 NegatedOpArg = 1;
3246 OtherOpArg = 0;
3247 } else
3248 // Multiplication doesn't have a negated operand.
3249 break;
3250
3251 // Only optimize if the negated operand has only one use.
3252 if (!NegatedOp->hasOneUse())
3253 break;
3254
3255 Value *OtherOp = II->getOperand(OtherOpArg);
3256 VectorType *RetTy = cast<VectorType>(II->getType());
3257 VectorType *NegatedOpTy = cast<VectorType>(NegatedOp->getType());
3258 VectorType *OtherOpTy = cast<VectorType>(OtherOp->getType());
3259 ElementCount NegatedCount = NegatedOpTy->getElementCount();
3260 ElementCount OtherCount = OtherOpTy->getElementCount();
3261 ElementCount RetCount = RetTy->getElementCount();
3262 // (-A) * B -> A * (-B), if it is cheaper to negate B and vice versa.
3263 if (ElementCount::isKnownGT(NegatedCount, OtherCount) &&
3264 ElementCount::isKnownLT(OtherCount, RetCount)) {
3265 Value *InverseOtherOp = Builder.CreateFNeg(OtherOp);
3266 replaceOperand(*II, NegatedOpArg, OpNotNeg);
3267 replaceOperand(*II, OtherOpArg, InverseOtherOp);
3268 return II;
3269 }
3270 // (-A) * B -> -(A * B), if it is cheaper to negate the result
3271 if (ElementCount::isKnownGT(NegatedCount, RetCount)) {
3272 SmallVector<Value *, 5> NewArgs(II->args());
3273 NewArgs[NegatedOpArg] = OpNotNeg;
3274 Value *NewMul = Builder.CreateIntrinsic(II->getType(), IID, NewArgs, II);
3275 return replaceInstUsesWith(*II, Builder.CreateFNegFMF(NewMul, II));
3276 }
3277 break;
3278 }
3279 case Intrinsic::fmuladd: {
3280 // Try to simplify the underlying FMul.
3281 if (Value *V =
3282 simplifyFMulInst(II->getArgOperand(0), II->getArgOperand(1),
3283 II->getFastMathFlags(), SQ.getWithInstruction(II)))
3284 return BinaryOperator::CreateFAddFMF(V, II->getArgOperand(2),
3285 II->getFastMathFlags());
3286
3287 [[fallthrough]];
3288 }
3289 case Intrinsic::fma: {
3290 // fma fneg(x), fneg(y), z -> fma x, y, z
3291 Value *Src0 = II->getArgOperand(0);
3292 Value *Src1 = II->getArgOperand(1);
3293 Value *Src2 = II->getArgOperand(2);
3294 Value *X, *Y;
3295 // TODO: Confirm whether m_FNegOrFSubNegZero is correct.
3296 if (match(Src0, m_FNegOrFSubNegZero(m_Value(X))) &&
3298 return replaceInstUsesWith(
3299 *II, Builder.CreateIntrinsic(IID, II->getType(), {X, Y, Src2}, II));
3300
3301 // fma fabs(x), fabs(x), z -> fma x, x, z
3302 if (match(Src0, m_FAbs(m_Value(X))) && match(Src1, m_FAbs(m_Specific(X))))
3303 return replaceInstUsesWith(
3304 *II, Builder.CreateIntrinsic(IID, II->getType(), {X, X, Src2}, II));
3305
3306 // Try to simplify the underlying FMul. We can only apply simplifications
3307 // that do not require rounding.
3308 if (Value *V = simplifyFMAFMul(Src0, Src1, II->getFastMathFlags(),
3309 SQ.getWithInstruction(II)))
3310 return BinaryOperator::CreateFAddFMF(V, Src2, II->getFastMathFlags());
3311
3312 // fma x, y, 0 -> fmul x, y
3313 // This is always valid for -0.0, but requires nsz for +0.0 as
3314 // -0.0 + 0.0 = 0.0, which would not be the same as the fmul on its own.
3315 if (match(Src2, m_NegZeroFP()) ||
3316 (match(Src2, m_PosZeroFP()) && II->getFastMathFlags().noSignedZeros()))
3317 return BinaryOperator::CreateFMulFMF(Src0, Src1, II);
3318
3319 // fma x, -1.0, y -> fsub y, x
3320 if (match(Src1, m_SpecificFP(-1.0)))
3321 return BinaryOperator::CreateFSubFMF(Src2, Src0, II);
3322
3323 break;
3324 }
3325 case Intrinsic::copysign: {
3326 Value *Mag = II->getArgOperand(0), *Sign = II->getArgOperand(1);
3327 if (std::optional<bool> KnownSignBit = computeKnownFPSignBit(
3328 Sign, getSimplifyQuery().getWithInstruction(II))) {
3329 if (*KnownSignBit) {
3330 // If we know that the sign argument is negative, reduce to FNABS:
3331 // copysign Mag, -Sign --> fneg (fabs Mag)
3332 Value *Fabs = Builder.CreateFAbs(Mag, II);
3333 return replaceInstUsesWith(*II, Builder.CreateFNegFMF(Fabs, II));
3334 }
3335
3336 // If we know that the sign argument is positive, reduce to FABS:
3337 // copysign Mag, +Sign --> fabs Mag
3338 Value *Fabs = Builder.CreateFAbs(Mag, II);
3339 return replaceInstUsesWith(*II, Fabs);
3340 }
3341
3342 // Propagate sign argument through nested calls:
3343 // copysign Mag, (copysign ?, X) --> copysign Mag, X
3344 Value *X;
3346 Value *CopySign =
3347 Builder.CreateCopySign(Mag, X, FMFSource::intersect(II, Sign));
3348 return replaceInstUsesWith(*II, CopySign);
3349 }
3350
3351 // Clear sign-bit of constant magnitude:
3352 // copysign -MagC, X --> copysign MagC, X
3353 // TODO: Support constant folding for fabs
3354 const APFloat *MagC;
3355 if (match(Mag, m_APFloat(MagC)) && MagC->isNegative()) {
3356 APFloat PosMagC = *MagC;
3357 PosMagC.clearSign();
3358 return replaceInstUsesWith(
3359 *II, Builder.CreateCopySign(ConstantFP::get(Mag->getType(), PosMagC),
3360 Sign, II));
3361 }
3362
3363 // Peek through changes of magnitude's sign-bit. This call rewrites those:
3364 // copysign (fabs X), Sign --> copysign X, Sign
3365 // copysign (fneg X), Sign --> copysign X, Sign
3366 // TODO: Confirm whether m_FNegOrFSubNegZero is correct.
3367 if (match(Mag, m_FAbs(m_Value(X))) ||
3369 return replaceInstUsesWith(*II, Builder.CreateCopySign(X, Sign, II));
3370
3371 // copysign(floor(fabs(X)), X) --> copysign(trunc(X), X)
3372 // copysign ignores the sign bit of its magnitude argument (implicit fabs),
3373 // so replacing floor(fabs(X)) with trunc(X) is correct for all inputs
3374 // including NaN without requiring nnan. The m_FAbs match also ensures
3375 // the floor argument is non-negative, so floor == trunc.
3376 Value *FAbsArg;
3377 if (match(Mag, m_Intrinsic<Intrinsic::floor>(m_FAbs(m_Value(FAbsArg)))) &&
3378 FAbsArg == Sign) {
3379 Value *Trunc = Builder.CreateUnaryIntrinsic(Intrinsic::trunc, Sign, II);
3380 return replaceInstUsesWith(*II, Builder.CreateCopySign(Trunc, Sign, II));
3381 }
3382
3383 Type *SignEltTy = Sign->getType()->getScalarType();
3384
3385 Value *CastSrc;
3386 if (match(Sign,
3388 CastSrc->getType()->isIntOrIntVectorTy() &&
3392 APInt::getSignMask(Known.getBitWidth()), Known,
3393 SQ))
3394 return II;
3395 }
3396
3397 break;
3398 }
3399 case Intrinsic::fabs: {
3400 Value *Cond, *TVal, *FVal;
3401 Value *Arg = II->getArgOperand(0);
3402 Value *X;
3403 // fabs (-X) --> fabs (X)
3404 // TODO: Confirm whether m_FNegOrFSubNegZero is correct.
3405 if (match(Arg, m_FNegOrFSubNegZero(m_Value(X)))) {
3406 Value *Fabs = Builder.CreateFAbs(X, II);
3407 return replaceInstUsesWith(CI, Fabs);
3408 }
3409
3410 if (match(Arg, m_Select(m_Value(Cond), m_Value(TVal), m_Value(FVal)))) {
3411 // fabs (select Cond, TrueC, FalseC) --> select Cond, AbsT, AbsF
3412 if (Arg->hasOneUse() ? (isa<Constant>(TVal) || isa<Constant>(FVal))
3413 : (isa<Constant>(TVal) && isa<Constant>(FVal))) {
3414 CallInst *AbsT = Builder.CreateCall(II->getCalledFunction(), {TVal});
3415 CallInst *AbsF = Builder.CreateCall(II->getCalledFunction(), {FVal});
3416 // Given the condition is the same, we pull metadata (particularly
3417 // profile metadata) from the original select instruction.
3419 Cond, AbsT, AbsF, "", nullptr,
3421 SI->setFastMathFlags(II->getFastMathFlags() |
3422 cast<SelectInst>(Arg)->getFastMathFlags());
3423 // Can't copy nsz to select, as even with the nsz flag the fabs result
3424 // always has the sign bit unset.
3425 SI->setHasNoSignedZeros(false);
3426 return SI;
3427 }
3428 // fabs (select Cond, -FVal, FVal) --> fabs FVal
3429 // TODO: Confirm whether m_FNegOrFSubNegZero is correct.
3430 if (match(TVal, m_FNegOrFSubNegZero(m_Specific(FVal))))
3431 return replaceInstUsesWith(*II, Builder.CreateFAbs(FVal, II));
3432 // fabs (select Cond, TVal, -TVal) --> fabs TVal
3433 // TODO: Confirm whether m_FNegOrFSubNegZero is correct.
3434 if (match(FVal, m_FNegOrFSubNegZero(m_Specific(TVal))))
3435 return replaceInstUsesWith(*II, Builder.CreateFAbs(TVal, II));
3436 }
3437
3438 Value *Magnitude, *Sign;
3439 if (match(II->getArgOperand(0),
3440 m_CopySign(m_Value(Magnitude), m_Value(Sign)))) {
3441 // fabs (copysign x, y) -> (fabs x)
3442 Value *AbsSign = Builder.CreateFAbs(Magnitude, II);
3443 return replaceInstUsesWith(*II, AbsSign);
3444 }
3445
3446 [[fallthrough]];
3447 }
3448 case Intrinsic::ceil:
3449 case Intrinsic::floor:
3450 case Intrinsic::round:
3451 case Intrinsic::roundeven:
3452 case Intrinsic::nearbyint:
3453 case Intrinsic::rint:
3454 case Intrinsic::trunc: {
3455 Value *ExtSrc;
3456 if (match(II->getArgOperand(0), m_OneUse(m_FPExt(m_Value(ExtSrc))))) {
3457 // Narrow the call: intrinsic (fpext x) -> fpext (intrinsic x)
3458 Value *NarrowII = Builder.CreateUnaryIntrinsic(IID, ExtSrc, II);
3459 return new FPExtInst(NarrowII, II->getType());
3460 }
3461 break;
3462 }
3463 case Intrinsic::cos:
3464 case Intrinsic::amdgcn_cos:
3465 case Intrinsic::cosh: {
3466 Value *X, *Sign;
3467 Value *Src = II->getArgOperand(0);
3468 // TODO: Confirm whether m_FNegOrFSubNegZero is correct.
3469 if (match(Src, m_FNegOrFSubNegZero(m_Value(X))) ||
3470 match(Src, m_FAbs(m_Value(X))) ||
3471 match(Src, m_CopySign(m_Value(X), m_Value(Sign)))) {
3472 // f(-x) --> f(x)
3473 // f(fabs(x)) --> f(x)
3474 // f(copysign(x, y)) --> f(x)
3475 // for f in {cos, cosh}
3476 return replaceInstUsesWith(*II, Builder.CreateUnaryIntrinsic(IID, X, II));
3477 }
3478 if (IID == Intrinsic::cos) {
3479 if (Value *Result = foldSinAndCosToSinCos(II, Builder, *this))
3480 return replaceInstUsesWith(*II, Result);
3481 }
3482 break;
3483 }
3484 case Intrinsic::sin:
3485 case Intrinsic::amdgcn_sin:
3486 case Intrinsic::sinh:
3487 case Intrinsic::tan:
3488 case Intrinsic::tanh: {
3489 Value *X;
3490 // TODO: Confirm whether m_FNegOrFSubNegZero is correct.
3491 if (match(II->getArgOperand(0),
3494 // f(-x) --> -f(x)
3495 // for f in {sin, sinh, tan, tanh}
3496 Value *NewFunc = Builder.CreateUnaryIntrinsic(IID, X, II);
3497 return UnaryOperator::CreateFNegFMF(NewFunc, II);
3498 }
3499 if (IID == Intrinsic::sin) {
3500 if (Value *Result = foldSinAndCosToSinCos(II, Builder, *this))
3501 return replaceInstUsesWith(*II, Result);
3502 }
3503 break;
3504 }
3505 case Intrinsic::ldexp: {
3506 Value *Src = II->getArgOperand(0);
3507 Value *Exp = II->getArgOperand(1);
3508
3509 // ldexp(x, K) -> fmul x, 2^K
3510 uint64_t ConstExp;
3511 if (match(Exp, m_ConstantInt(ConstExp))) {
3512 const fltSemantics &FPTy =
3513 Src->getType()->getScalarType()->getFltSemantics();
3514
3515 APFloat Scaled = scalbn(APFloat::getOne(FPTy), static_cast<int>(ConstExp),
3517 if (!Scaled.isZero() && !Scaled.isInfinity()) {
3518 // Skip overflow and underflow cases.
3519 Constant *FPConst = ConstantFP::get(Src->getType(), Scaled);
3520 return BinaryOperator::CreateFMulFMF(Src, FPConst, II);
3521 }
3522 }
3523
3524 // ldexp(ldexp(x, a), b) -> ldexp(x, sadd.sat(a, b))
3525 //
3526 // A danger is if the first ldexp would overflow to infinity or underflow to
3527 // zero, but the combined exponent avoids it.
3528 //
3529 // We ignore this with reassoc, or if we know both exponents have the same
3530 // sign (since then we'd just double down on the over/underflow which would
3531 // occur anyway).
3532 //
3533 // ldexp can take arbitrary integer types, so we also need to ensure that
3534 // our exponent type is wide enough so that if sadd.sat(a, b) saturates,
3535 // then ldexp at the saturated exponent saturates to inf or zero as well.
3536 //
3537 // TODO: Could do better if we had range tracking for the input value
3538 // exponent. Also could broaden sign check to cover == 0 case.
3539 Value *InnerSrc;
3540 Value *InnerExp;
3542 m_Value(InnerSrc), m_Value(InnerExp)))) &&
3543 Exp->getType() == InnerExp->getType()) {
3544 FastMathFlags FMF = II->getFastMathFlags();
3545 FastMathFlags InnerFlags = cast<FPMathOperator>(Src)->getFastMathFlags();
3546
3547 if (ldexpSaturatingAddIsSafe(II->getType(), Exp->getType()) &&
3548 ((FMF.allowReassoc() && InnerFlags.allowReassoc()) ||
3549 signBitMustBeTheSame(Exp, InnerExp, SQ.getWithInstruction(II)))) {
3550 Value *NewExp =
3551 Builder.CreateBinaryIntrinsic(Intrinsic::sadd_sat, InnerExp, Exp);
3552 return replaceInstUsesWith(
3553 *II, Builder.CreateLdexp(InnerSrc, NewExp, FMF | InnerFlags));
3554 }
3555 }
3556
3557 // ldexp(x, zext(i1 y)) -> fmul x, (select y, 2.0, 1.0)
3558 // ldexp(x, sext(i1 y)) -> fmul x, (select y, 0.5, 1.0)
3559 // For both of the cases below, we have no information on the distribution
3560 // of x in the general case, so we mark the created selects as having
3561 // unknown branch weights.
3562 Value *ExtSrc;
3563 if (match(Exp, m_ZExt(m_Value(ExtSrc))) &&
3564 ExtSrc->getType()->getScalarSizeInBits() == 1) {
3565 Value *Select = Builder.CreateSelectWithUnknownProfile(
3566 ExtSrc, ConstantFP::get(II->getType(), 2.0),
3567 ConstantFP::get(II->getType(), 1.0), DEBUG_TYPE);
3569 }
3570 if (match(Exp, m_SExt(m_Value(ExtSrc))) &&
3571 ExtSrc->getType()->getScalarSizeInBits() == 1) {
3572 Value *Select = Builder.CreateSelectWithUnknownProfile(
3573 ExtSrc, ConstantFP::get(II->getType(), 0.5),
3574 ConstantFP::get(II->getType(), 1.0), DEBUG_TYPE);
3576 }
3577
3578 // ldexp(x, c ? exp : 0) -> c ? ldexp(x, exp) : x
3579 // ldexp(x, c ? 0 : exp) -> c ? x : ldexp(x, exp)
3580 ///
3581 // TODO: If we cared, should insert a canonicalize for x
3582 Value *SelectCond, *SelectLHS, *SelectRHS;
3583 Instruction *SelectInst = nullptr;
3584 if (match(II->getArgOperand(1),
3586 SelectInst, m_Select(m_Value(SelectCond), m_Value(SelectLHS),
3587 m_Value(SelectRHS)))))) {
3588 Value *NewLdexp = nullptr;
3589 Value *Select = nullptr;
3590 if (match(SelectRHS, m_ZeroInt())) {
3591 NewLdexp = Builder.CreateLdexp(Src, SelectLHS, II);
3592 Select = Builder.CreateSelect(
3593 SelectCond, NewLdexp, Src, "",
3595 } else if (match(SelectLHS, m_ZeroInt())) {
3596 NewLdexp = Builder.CreateLdexp(Src, SelectRHS, II);
3597 Select = Builder.CreateSelect(
3598 SelectCond, Src, NewLdexp, "",
3600 }
3601
3602 if (NewLdexp) {
3603 Select->takeName(II);
3604 return replaceInstUsesWith(*II, Select);
3605 }
3606 }
3607
3608 break;
3609 }
3610 case Intrinsic::ptrauth_auth:
3611 case Intrinsic::ptrauth_resign: {
3612 // (sign|resign) + (auth|resign) can be folded by omitting the middle
3613 // sign+auth component if the key and discriminator match.
3614 bool NeedSign = II->getIntrinsicID() == Intrinsic::ptrauth_resign;
3615 Value *Ptr = II->getArgOperand(0);
3616 Value *Key = II->getArgOperand(1);
3617 Value *Disc = II->getArgOperand(2);
3618 Value *DS = nullptr;
3619 if (auto Bundle = II->getOperandBundle(LLVMContext::OB_deactivation_symbol))
3620 DS = Bundle->Inputs[0];
3621
3622 // AuthKey will be the key we need to end up authenticating against in
3623 // whatever we replace this sequence with.
3624 Value *AuthKey = nullptr, *AuthDisc = nullptr, *BasePtr;
3625 if (const auto *CI = dyn_cast<CallBase>(Ptr)) {
3626 Value *OtherDS = nullptr;
3627 if (auto Bundle =
3629 OtherDS = Bundle->Inputs[0];
3630 if (DS != OtherDS)
3631 break;
3632
3633 if (CI->getIntrinsicID() == Intrinsic::ptrauth_sign) {
3634 if (CI->getArgOperand(1) != Key || CI->getArgOperand(2) != Disc)
3635 break;
3636 } else if (CI->getIntrinsicID() == Intrinsic::ptrauth_resign) {
3637 // The resign intrinsic does not support deactivation symbols.
3638 assert(!DS);
3639 if (CI->getArgOperand(3) != Key || CI->getArgOperand(4) != Disc)
3640 break;
3641 AuthKey = CI->getArgOperand(1);
3642 AuthDisc = CI->getArgOperand(2);
3643 } else
3644 break;
3645 BasePtr = CI->getArgOperand(0);
3646 } else if (const auto *PtrToInt = dyn_cast<PtrToIntOperator>(Ptr)) {
3647 // ptrauth constants are equivalent to a call to @llvm.ptrauth.sign for
3648 // our purposes, so check for that too.
3649 const auto *CPA = dyn_cast<ConstantPtrAuth>(PtrToInt->getOperand(0));
3650 if (!CPA || DS || !CPA->isKnownCompatibleWith(Key, Disc, DL))
3651 break;
3652
3653 // resign(ptrauth(p,ks,ds),ks,ds,kr,dr) -> ptrauth(p,kr,dr)
3654 if (NeedSign && isa<ConstantInt>(II->getArgOperand(4))) {
3655 auto *SignKey = cast<ConstantInt>(II->getArgOperand(3));
3656 auto *SignDisc = cast<ConstantInt>(II->getArgOperand(4));
3657 auto *Null = ConstantPointerNull::get(Builder.getPtrTy());
3658 auto *NewCPA = ConstantPtrAuth::get(CPA->getPointer(), SignKey,
3659 SignDisc, /*AddrDisc=*/Null,
3660 /*DeactivationSymbol=*/Null);
3662 *II, ConstantExpr::getPointerCast(NewCPA, II->getType()));
3663 return eraseInstFromFunction(*II);
3664 }
3665
3666 // auth(ptrauth(p,k,d),k,d) -> p
3667 BasePtr = Builder.CreatePtrToInt(CPA->getPointer(), II->getType());
3668 } else
3669 break;
3670
3671 unsigned NewIntrin;
3672 if (AuthKey && NeedSign) {
3673 // resign(0,1) + resign(1,2) = resign(0, 2)
3674 NewIntrin = Intrinsic::ptrauth_resign;
3675 } else if (AuthKey) {
3676 // resign(0,1) + auth(1) = auth(0)
3677 NewIntrin = Intrinsic::ptrauth_auth;
3678 } else if (NeedSign) {
3679 // sign(0) + resign(0, 1) = sign(1)
3680 NewIntrin = Intrinsic::ptrauth_sign;
3681 } else {
3682 // sign(0) + auth(0) = nop
3683 replaceInstUsesWith(*II, BasePtr);
3684 return eraseInstFromFunction(*II);
3685 }
3686
3687 SmallVector<Value *, 4> CallArgs;
3688 CallArgs.push_back(BasePtr);
3689 if (AuthKey) {
3690 CallArgs.push_back(AuthKey);
3691 CallArgs.push_back(AuthDisc);
3692 }
3693
3694 if (NeedSign) {
3695 CallArgs.push_back(II->getArgOperand(3));
3696 CallArgs.push_back(II->getArgOperand(4));
3697 }
3698
3699 std::vector<OperandBundleDef> Bundles;
3700 if (DS)
3701 Bundles.push_back(OperandBundleDef("deactivation-symbol", DS));
3702
3703 Function *NewFn =
3704 Intrinsic::getOrInsertDeclaration(II->getModule(), NewIntrin);
3705 return CallInst::Create(NewFn, CallArgs, Bundles);
3706 }
3707 case Intrinsic::arm_neon_vtbl1:
3708 case Intrinsic::arm_neon_vtbl2:
3709 case Intrinsic::arm_neon_vtbl3:
3710 case Intrinsic::arm_neon_vtbl4:
3711 case Intrinsic::aarch64_neon_tbl1:
3712 case Intrinsic::aarch64_neon_tbl2:
3713 case Intrinsic::aarch64_neon_tbl3:
3714 case Intrinsic::aarch64_neon_tbl4:
3715 return simplifyNeonTbl(*II, *this, /*IsExtension=*/false);
3716 case Intrinsic::arm_neon_vtbx1:
3717 case Intrinsic::arm_neon_vtbx2:
3718 case Intrinsic::arm_neon_vtbx3:
3719 case Intrinsic::arm_neon_vtbx4:
3720 case Intrinsic::aarch64_neon_tbx1:
3721 case Intrinsic::aarch64_neon_tbx2:
3722 case Intrinsic::aarch64_neon_tbx3:
3723 case Intrinsic::aarch64_neon_tbx4:
3724 return simplifyNeonTbl(*II, *this, /*IsExtension=*/true);
3725
3726 case Intrinsic::arm_neon_vmulls:
3727 case Intrinsic::arm_neon_vmullu:
3728 case Intrinsic::aarch64_neon_smull:
3729 case Intrinsic::aarch64_neon_umull: {
3730 Value *Arg0 = II->getArgOperand(0);
3731 Value *Arg1 = II->getArgOperand(1);
3732
3733 // Handle mul by zero first:
3735 return replaceInstUsesWith(CI, ConstantAggregateZero::get(II->getType()));
3736 }
3737
3738 // Check for constant LHS & RHS - in this case we just simplify.
3739 bool Zext = (IID == Intrinsic::arm_neon_vmullu ||
3740 IID == Intrinsic::aarch64_neon_umull);
3741 VectorType *NewVT = cast<VectorType>(II->getType());
3742 if (Constant *CV0 = dyn_cast<Constant>(Arg0)) {
3743 if (Constant *CV1 = dyn_cast<Constant>(Arg1)) {
3744 Value *V0 = Builder.CreateIntCast(CV0, NewVT, /*isSigned=*/!Zext);
3745 Value *V1 = Builder.CreateIntCast(CV1, NewVT, /*isSigned=*/!Zext);
3746 return replaceInstUsesWith(CI, Builder.CreateMul(V0, V1));
3747 }
3748
3749 // Couldn't simplify - canonicalize constant to the RHS.
3750 std::swap(Arg0, Arg1);
3751 }
3752
3753 // Handle mul by one:
3754 if (Constant *CV1 = dyn_cast<Constant>(Arg1))
3755 if (ConstantInt *Splat =
3756 dyn_cast_or_null<ConstantInt>(CV1->getSplatValue()))
3757 if (Splat->isOne())
3758 return CastInst::CreateIntegerCast(Arg0, II->getType(),
3759 /*isSigned=*/!Zext);
3760
3761 break;
3762 }
3763 case Intrinsic::arm_neon_aesd:
3764 case Intrinsic::arm_neon_aese:
3765 case Intrinsic::aarch64_crypto_aesd:
3766 case Intrinsic::aarch64_crypto_aese:
3767 case Intrinsic::aarch64_sve_aesd:
3768 case Intrinsic::aarch64_sve_aese: {
3769 Value *DataArg = II->getArgOperand(0);
3770 Value *KeyArg = II->getArgOperand(1);
3771
3772 // Accept zero on either operand.
3773 if (!match(KeyArg, m_ZeroInt()))
3774 std::swap(KeyArg, DataArg);
3775
3776 // Try to use the builtin XOR in AESE and AESD to eliminate a prior XOR
3777 Value *Data, *Key;
3778 if (match(KeyArg, m_ZeroInt()) &&
3779 match(DataArg, m_Xor(m_Value(Data), m_Value(Key)))) {
3780 replaceOperand(*II, 0, Data);
3781 replaceOperand(*II, 1, Key);
3782 return II;
3783 }
3784 break;
3785 }
3786 case Intrinsic::arm_neon_vshifts:
3787 case Intrinsic::arm_neon_vshiftu:
3788 case Intrinsic::aarch64_neon_sshl:
3789 case Intrinsic::aarch64_neon_ushl:
3790 return foldNeonShift(II, *this);
3791 case Intrinsic::hexagon_V6_vandvrt:
3792 case Intrinsic::hexagon_V6_vandvrt_128B: {
3793 // Simplify Q -> V -> Q conversion.
3794 if (auto Op0 = dyn_cast<IntrinsicInst>(II->getArgOperand(0))) {
3795 Intrinsic::ID ID0 = Op0->getIntrinsicID();
3796 if (ID0 != Intrinsic::hexagon_V6_vandqrt &&
3797 ID0 != Intrinsic::hexagon_V6_vandqrt_128B)
3798 break;
3799 Value *Bytes = Op0->getArgOperand(1), *Mask = II->getArgOperand(1);
3800 uint64_t Bytes1 = computeKnownBits(Bytes, Op0).One.getZExtValue();
3801 uint64_t Mask1 = computeKnownBits(Mask, II).One.getZExtValue();
3802 // Check if every byte has common bits in Bytes and Mask.
3803 uint64_t C = Bytes1 & Mask1;
3804 if ((C & 0xFF) && (C & 0xFF00) && (C & 0xFF0000) && (C & 0xFF000000))
3805 return replaceInstUsesWith(*II, Op0->getArgOperand(0));
3806 }
3807 break;
3808 }
3809 case Intrinsic::stackrestore: {
3810 enum class ClassifyResult {
3811 None,
3812 Alloca,
3813 StackRestore,
3814 CallWithSideEffects,
3815 };
3816 auto Classify = [](const Instruction *I) {
3817 if (isa<AllocaInst>(I))
3818 return ClassifyResult::Alloca;
3819
3820 if (auto *CI = dyn_cast<CallInst>(I)) {
3821 if (auto *II = dyn_cast<IntrinsicInst>(CI)) {
3822 if (II->getIntrinsicID() == Intrinsic::stackrestore)
3823 return ClassifyResult::StackRestore;
3824
3825 if (II->mayHaveSideEffects())
3826 return ClassifyResult::CallWithSideEffects;
3827 } else {
3828 // Consider all non-intrinsic calls to be side effects
3829 return ClassifyResult::CallWithSideEffects;
3830 }
3831 }
3832
3833 return ClassifyResult::None;
3834 };
3835
3836 // If the stacksave and the stackrestore are in the same BB, and there is
3837 // no intervening call, alloca, or stackrestore of a different stacksave,
3838 // remove the restore. This can happen when variable allocas are DCE'd.
3839 if (IntrinsicInst *SS = dyn_cast<IntrinsicInst>(II->getArgOperand(0))) {
3840 if (SS->getIntrinsicID() == Intrinsic::stacksave &&
3841 SS->getParent() == II->getParent()) {
3842 BasicBlock::iterator BI(SS);
3843 bool CannotRemove = false;
3844 for (++BI; &*BI != II; ++BI) {
3845 switch (Classify(&*BI)) {
3846 case ClassifyResult::None:
3847 // So far so good, look at next instructions.
3848 break;
3849
3850 case ClassifyResult::StackRestore:
3851 // If we found an intervening stackrestore for a different
3852 // stacksave, we can't remove the stackrestore. Otherwise, continue.
3853 if (cast<IntrinsicInst>(*BI).getArgOperand(0) != SS)
3854 CannotRemove = true;
3855 break;
3856
3857 case ClassifyResult::Alloca:
3858 case ClassifyResult::CallWithSideEffects:
3859 // If we found an alloca, a non-intrinsic call, or an intrinsic
3860 // call with side effects, we can't remove the stackrestore.
3861 CannotRemove = true;
3862 break;
3863 }
3864 if (CannotRemove)
3865 break;
3866 }
3867
3868 if (!CannotRemove)
3869 return eraseInstFromFunction(CI);
3870 }
3871 }
3872
3873 // Scan down this block to see if there is another stack restore in the
3874 // same block without an intervening call/alloca.
3876 Instruction *TI = II->getParent()->getTerminator();
3877 bool CannotRemove = false;
3878 for (++BI; &*BI != TI; ++BI) {
3879 switch (Classify(&*BI)) {
3880 case ClassifyResult::None:
3881 // So far so good, look at next instructions.
3882 break;
3883
3884 case ClassifyResult::StackRestore:
3885 // If there is a stackrestore below this one, remove this one.
3886 return eraseInstFromFunction(CI);
3887
3888 case ClassifyResult::Alloca:
3889 case ClassifyResult::CallWithSideEffects:
3890 // If we found an alloca, a non-intrinsic call, or an intrinsic call
3891 // with side effects (such as llvm.stacksave and llvm.read_register),
3892 // we can't remove the stack restore.
3893 CannotRemove = true;
3894 break;
3895 }
3896 if (CannotRemove)
3897 break;
3898 }
3899
3900 // If the stack restore is in a return, resume, or unwind block and if there
3901 // are no allocas or calls between the restore and the return, nuke the
3902 // restore.
3903 if (!CannotRemove && (isa<ReturnInst>(TI) || isa<ResumeInst>(TI)))
3904 return eraseInstFromFunction(CI);
3905 break;
3906 }
3907 case Intrinsic::lifetime_end:
3908 // Asan needs to poison memory to detect invalid access which is possible
3909 // even for empty lifetime range.
3910 if (II->getFunction()->hasFnAttribute(Attribute::SanitizeAddress) ||
3911 II->getFunction()->hasFnAttribute(Attribute::SanitizeMemory) ||
3912 II->getFunction()->hasFnAttribute(Attribute::SanitizeHWAddress) ||
3913 II->getFunction()->hasFnAttribute(Attribute::SanitizeMemTag))
3914 break;
3915
3916 if (removeTriviallyEmptyRange(*II, *this, [](const IntrinsicInst &I) {
3917 return I.getIntrinsicID() == Intrinsic::lifetime_start;
3918 }))
3919 return nullptr;
3920 break;
3921 case Intrinsic::assume: {
3922 for (auto [Idx, OBU] : llvm::enumerate(II->operand_bundles())) {
3923 auto RemoveBundle = [&, Idx = Idx]() -> Instruction * {
3924 if (II->getNumOperandBundles() == 1)
3925 return eraseInstFromFunction(*II);
3927 };
3928
3929 switch (getBundleAttrFromOBU(OBU)) {
3930 case BundleAttr::None:
3931 llvm_unreachable("Unexpected Attribute");
3932 case BundleAttr::Align: {
3933 // Try to remove redundant alignment assumptions.
3934 auto [Ptr, _, OffsetPtr, Alignment, Offset] = getAssumeAlignInfo(OBU);
3935
3936 if (!Alignment)
3937 break;
3938
3939 // Remove align 1 and non-power-of-two bundles; they don't add any
3940 // useful information.
3941 if (*Alignment == 1 || !isPowerOf2_64(*Alignment))
3942 return RemoveBundle();
3943
3944 if (auto *GEP = dyn_cast<GEPOperator>(Ptr);
3945 GEP &&
3946 GEP->getMaxPreservedAlignment(getDataLayout()) >= *Alignment) {
3947 Builder.CreateAlignmentAssumption(
3948 getDataLayout(), GEP->getPointerOperand(), *Alignment,
3949 OffsetPtr ? const_cast<Value *>(OffsetPtr->get()) : nullptr);
3950 return RemoveBundle();
3951 }
3952
3953 if (!Offset)
3954 break;
3955
3956 Value *BasePtr;
3957 const APInt *PtrOffset;
3958 if (match(Ptr.get(), m_PtrAdd(m_Value(BasePtr), m_APInt(PtrOffset)))) {
3959 auto PtrOffsetVal =
3960 PtrOffset->sextOrTrunc(DL.getIndexTypeSizeInBits(Ptr->getType()))
3961 .trySExtValue();
3962 if (!PtrOffsetVal)
3963 break;
3964 Builder.CreateAlignmentAssumption(
3965 DL, BasePtr, *Alignment,
3966 Builder.getInt64(*Offset - *PtrOffsetVal));
3967 return RemoveBundle();
3968 }
3969
3970 // Don't try to remove align assumptions for pointers derived from
3971 // arguments. We might lose information if the function gets inline and
3972 // the align argument attribute disappears.
3973 Value *UO = getUnderlyingObject(Ptr);
3974 if (!UO || isa<Argument>(UO))
3975 break;
3976
3977 // Compute known bits for the pointer and drop the assume if the
3978 // known alignment isn't increased by it.
3979 auto AlignMask = (*Alignment - 1);
3980 if (KnownBits KB = computeKnownBits(Ptr, II);
3981 (KB.Zero & AlignMask) == (~*Offset & AlignMask) &&
3982 (KB.One & AlignMask) == (*Offset & AlignMask))
3983 return RemoveBundle();
3984 break;
3985 }
3986
3987 case BundleAttr::Dereferenceable: {
3988 auto [Ptr, _, Count] = getAssumeDereferenceableInfo(OBU);
3989
3990 if (!Count)
3991 break;
3992
3993 if (*Count == 0 ||
3995 getSimplifyQuery().getWithInstruction(II)))
3996 return RemoveBundle();
3997
3998 break;
3999 }
4000
4001 case BundleAttr::Ignore:
4002 return RemoveBundle();
4003
4004 case BundleAttr::NonNull: {
4005 auto [Ptr] = llvm::getAssumeNonNullInfo(OBU);
4006
4007 // Drop assume if we can prove nonnull without it
4008 if (isKnownNonZero(Ptr, getSimplifyQuery().getWithInstruction(II)))
4009 return RemoveBundle();
4010
4011 // Fold the assume into metadata if it's valid at the load
4012 if (auto *LI = dyn_cast<LoadInst>(Ptr);
4013 LI &&
4014 isValidAssumeForContext(II, LI, &DT, /*AllowEphemerals=*/true)) {
4015 MDNode *MD = MDNode::get(II->getContext(), {});
4016 LI->setMetadata(LLVMContext::MD_nonnull, MD);
4017 LI->setMetadata(LLVMContext::MD_noundef, MD);
4018 return RemoveBundle();
4019 }
4020
4021 if (auto *GEP = dyn_cast<GEPOperator>(Ptr);
4022 GEP && GEP->isInBounds() &&
4023 !NullPointerIsDefined(II->getFunction(),
4024 Ptr->getType()->getPointerAddressSpace())) {
4025 Builder.CreateNonnullAssumption(GEP->stripInBoundsOffsets());
4026 return RemoveBundle();
4027 }
4028
4029 // TODO: apply nonnull return attributes to calls and invokes
4030 break;
4031 }
4032
4033 case BundleAttr::NoUndef: {
4034 auto [Val] = getAssumeNoUndefInfo(OBU);
4035
4037 return RemoveBundle();
4038
4039 if (auto *LI = dyn_cast<LoadInst>(Val);
4040 LI &&
4041 isValidAssumeForContext(II, LI, &DT, /*AllowEphemerals=*/true)) {
4042 LI->setMetadata(LLVMContext::MD_noundef,
4043 MDNode::get(II->getContext(), {}));
4044 return RemoveBundle();
4045 }
4046
4047 } break;
4048
4049 case BundleAttr::SeparateStorage: {
4050 auto [Ptr1, Ptr2] = getAssumeSeparateStorageInfo(OBU);
4051 // Separate storage assumptions apply to the underlying allocations, not
4052 // any particular pointer within them. When evaluating the hints for AA
4053 // purposes we getUnderlyingObject them; by precomputing the answers
4054 // here we can avoid having to do so repeatedly there.
4055 auto MaybeSimplifyHint = [&](const Use &U) {
4056 Value *Hint = U.get();
4057 // Not having a limit is safe because InstCombine removes unreachable
4058 // code.
4059 Value *UnderlyingObject = getUnderlyingObject(Hint, /*MaxLookup*/ 0);
4060 if (Hint != UnderlyingObject)
4061 replaceUse(const_cast<Use &>(U), UnderlyingObject);
4062 };
4063 MaybeSimplifyHint(Ptr1);
4064 MaybeSimplifyHint(Ptr2);
4065 SimpleAAQueryInfo AAQI(*AA);
4066 AAQI.AllowEphemerals = false;
4067 if (AA->alias(MemoryLocation::getBeforeOrAfter(Ptr1),
4070 return RemoveBundle();
4071 }
4072 } break;
4073
4074 // TODO: Drop these assumes when they are redundant
4075 case BundleAttr::DereferenceableOrNull:
4076 case BundleAttr::Range:
4077 break;
4078
4079 // This cannot be simplified
4080 case BundleAttr::Cold:
4081 break;
4082 }
4083 }
4084
4085 if (II->hasOperandBundles()) {
4086 // Merge consecutive assumes to save some resources
4087 if (auto *PrevAI = dyn_cast_or_null<AssumeInst>(II->getPrevNode());
4088 PrevAI && PrevAI->hasOperandBundles()) {
4090 Bundles.reserve(II->getNumOperandBundles() +
4091 PrevAI->getNumOperandBundles());
4092 for (auto Bundle : PrevAI->operand_bundles())
4093 Bundles.emplace_back(Bundle);
4094 for (auto Bundle : II->operand_bundles())
4095 Bundles.emplace_back(Bundle);
4096 Builder.CreateAssumption(Bundles);
4097 eraseInstFromFunction(*PrevAI);
4098 return eraseInstFromFunction(*II);
4099 }
4100
4101 // If the assume has operand bundles, the folds below will never work, so
4102 // don't bother trying.
4103 break;
4104 }
4105
4106 Value *IIOperand = II->getArgOperand(0);
4107
4108 // Canonicalize assume(a && b) -> assume(a); assume(b);
4109 // Note: New assumption intrinsics created here are registered by
4110 // the InstCombineIRInserter object.
4111 Value *A, *B;
4112 if (match(IIOperand, m_LogicalAnd(m_Value(A), m_Value(B)))) {
4113 Builder.CreateAssumption(A);
4114 Builder.CreateAssumption(B);
4115 return eraseInstFromFunction(*II);
4116 }
4117 // assume(!(a || b)) -> assume(!a); assume(!b);
4118 if (match(IIOperand, m_Not(m_LogicalOr(m_Value(A), m_Value(B))))) {
4119 Builder.CreateAssumption(Builder.CreateNot(A));
4120 Builder.CreateAssumption(Builder.CreateNot(B));
4121 return eraseInstFromFunction(*II);
4122 }
4123
4124 // Convert nonnull assume like:
4125 // %A = icmp ne i32* %PTR, null
4126 // call void @llvm.assume(i1 %A)
4127 // into
4128 // call void @llvm.assume(i1 true) [ "nonnull"(i32* %PTR) ]
4129 if (match(
4130 IIOperand,
4133 m_Zero())))) &&
4134 A->getType()->isPointerTy()) {
4135 Builder.CreateNonnullAssumption(A);
4136 return eraseInstFromFunction(*II);
4137 }
4138
4139 // Convert alignment assume like:
4140 // %B = ptrtoint ptr %A to i64
4141 // %C = and i64 %B, Constant
4142 // %D = icmp eq i64 %C, 0
4143 // call void @llvm.assume(i1 %D)
4144 // into
4145 // call void @llvm.assume(i1 true) [ "align"(ptr [[A]], i64 Constant + 1)]
4146 uint64_t AlignMask = 1;
4147 if ((match(IIOperand, m_Not(m_Trunc(m_Value(A)))) ||
4148 match(IIOperand,
4150 m_And(m_Value(A), m_ConstantInt(AlignMask)),
4151 m_Zero())))) {
4152 if (isPowerOf2_64(AlignMask + 1) &&
4154 Builder.CreateAlignmentAssumption(getDataLayout(), A, AlignMask + 1);
4155 return eraseInstFromFunction(*II);
4156 }
4157 }
4158
4159 // Remove assumes on true/false
4160 if (auto *CI = dyn_cast<ConstantInt>(IIOperand);
4161 CI || isa<UndefValue, PoisonValue>(IIOperand)) {
4162 if (!CI || CI->isZero())
4164 return eraseInstFromFunction(*II);
4165 }
4166
4167 // Update the cache of affected values for this assumption (we might be
4168 // here because we just simplified the condition).
4169 AC.updateAffectedValues(cast<AssumeInst>(II));
4170 break;
4171 }
4172 case Intrinsic::experimental_guard: {
4173 // Is this guard followed by another guard? We scan forward over a small
4174 // fixed window of instructions to handle common cases with conditions
4175 // computed between guards.
4176 Instruction *NextInst = II->getNextNode();
4177 for (unsigned i = 0; i < CLOpts.guard_widening_window; i++) {
4178 // Note: Using context-free form to avoid compile time blow up
4179 if (!isSafeToSpeculativelyExecute(NextInst))
4180 break;
4181 NextInst = NextInst->getNextNode();
4182 }
4183 Value *NextCond = nullptr;
4184 if (match(NextInst,
4186 Value *CurrCond = II->getArgOperand(0);
4187
4188 // Remove a guard that it is immediately preceded by an identical guard.
4189 // Otherwise canonicalize guard(a); guard(b) -> guard(a & b).
4190 if (CurrCond != NextCond) {
4191 Instruction *MoveI = II->getNextNode();
4192 while (MoveI != NextInst) {
4193 auto *Temp = MoveI;
4194 MoveI = MoveI->getNextNode();
4195 Temp->moveBefore(II->getIterator());
4196 }
4197 replaceOperand(*II, 0, Builder.CreateAnd(CurrCond, NextCond));
4198 }
4199 eraseInstFromFunction(*NextInst);
4200 return II;
4201 }
4202 break;
4203 }
4204 case Intrinsic::vector_insert: {
4205 Value *Vec = II->getArgOperand(0);
4206 Value *SubVec = II->getArgOperand(1);
4207 Value *Idx = II->getArgOperand(2);
4208 auto *DstTy = dyn_cast<FixedVectorType>(II->getType());
4209 auto *VecTy = dyn_cast<FixedVectorType>(Vec->getType());
4210 auto *SubVecTy = dyn_cast<FixedVectorType>(SubVec->getType());
4211
4212 // Only canonicalize if the destination vector, Vec, and SubVec are all
4213 // fixed vectors.
4214 if (DstTy && VecTy && SubVecTy) {
4215 unsigned DstNumElts = DstTy->getNumElements();
4216 unsigned VecNumElts = VecTy->getNumElements();
4217 unsigned SubVecNumElts = SubVecTy->getNumElements();
4218 unsigned IdxN = cast<ConstantInt>(Idx)->getZExtValue();
4219
4220 // An insert that entirely overwrites Vec with SubVec is a nop.
4221 if (VecNumElts == SubVecNumElts)
4222 return replaceInstUsesWith(CI, SubVec);
4223
4224 // Widen SubVec into a vector of the same width as Vec, since
4225 // shufflevector requires the two input vectors to be the same width.
4226 // Elements beyond the bounds of SubVec within the widened vector are
4227 // undefined.
4228 SmallVector<int, 8> WidenMask;
4229 unsigned i;
4230 for (i = 0; i != SubVecNumElts; ++i)
4231 WidenMask.push_back(i);
4232 for (; i != VecNumElts; ++i)
4233 WidenMask.push_back(PoisonMaskElem);
4234
4235 Value *WidenShuffle = Builder.CreateShuffleVector(SubVec, WidenMask);
4236
4238 for (unsigned i = 0; i != IdxN; ++i)
4239 Mask.push_back(i);
4240 for (unsigned i = DstNumElts; i != DstNumElts + SubVecNumElts; ++i)
4241 Mask.push_back(i);
4242 for (unsigned i = IdxN + SubVecNumElts; i != DstNumElts; ++i)
4243 Mask.push_back(i);
4244
4245 Value *Shuffle = Builder.CreateShuffleVector(Vec, WidenShuffle, Mask);
4246 return replaceInstUsesWith(CI, Shuffle);
4247 }
4248 break;
4249 }
4250 case Intrinsic::vector_extract: {
4251 Value *Vec = II->getArgOperand(0);
4252 Value *Idx = II->getArgOperand(1);
4253
4254 Type *ReturnType = II->getType();
4255 // (extract_vector (insert_vector InsertTuple, InsertValue, InsertIdx),
4256 // ExtractIdx)
4257 uint64_t ExtractIdx = cast<ConstantInt>(Idx)->getZExtValue();
4258 Value *InsertTuple, *InsertIdx, *InsertValue;
4260 m_Value(InsertValue),
4261 m_Value(InsertIdx))) &&
4262 InsertValue->getType() == ReturnType) {
4263 uint64_t Index = cast<ConstantInt>(InsertIdx)->getZExtValue();
4264 // Case where we get the same index right after setting it.
4265 // extract.vector(insert.vector(InsertTuple, InsertValue, Idx), Idx) -->
4266 // InsertValue
4267 if (ExtractIdx == Index)
4268 return replaceInstUsesWith(CI, InsertValue);
4269 // If we are getting a different index than what was set in the
4270 // insert.vector intrinsic. We can just set the input tuple to the one up
4271 // in the chain. extract.vector(insert.vector(InsertTuple, InsertValue,
4272 // InsertIndex), ExtractIndex)
4273 // --> extract.vector(InsertTuple, ExtractIndex)
4274 else
4275 return replaceOperand(CI, 0, InsertTuple);
4276 }
4277
4278 ConstantInt *ALMUpperBound;
4280 m_Value(), m_ConstantInt(ALMUpperBound)))) {
4281 const auto &Attrs = II->getFunction()->getAttributes().getFnAttrs();
4282 unsigned VScaleMin = Attrs.getVScaleRangeMin();
4283 unsigned ScaleFactor =
4284 cast<VectorType>(ReturnType)->isScalableTy() ? VScaleMin : 1;
4285 if (ExtractIdx * ScaleFactor >= ALMUpperBound->getZExtValue())
4286 return replaceInstUsesWith(CI,
4287 ConstantVector::getNullValue(ReturnType));
4288 }
4289
4290 auto *DstTy = dyn_cast<VectorType>(ReturnType);
4291 auto *VecTy = dyn_cast<VectorType>(Vec->getType());
4292
4293 if (DstTy && VecTy) {
4294 auto DstEltCnt = DstTy->getElementCount();
4295 auto VecEltCnt = VecTy->getElementCount();
4296 unsigned IdxN = cast<ConstantInt>(Idx)->getZExtValue();
4297
4298 // Extracting the entirety of Vec is a nop.
4299 if (DstEltCnt == VecTy->getElementCount()) {
4300 replaceInstUsesWith(CI, Vec);
4301 return eraseInstFromFunction(CI);
4302 }
4303
4304 // Only canonicalize to shufflevector if the destination vector and
4305 // Vec are fixed vectors.
4306 if (VecEltCnt.isScalable() || DstEltCnt.isScalable())
4307 break;
4308
4310 for (unsigned i = 0; i != DstEltCnt.getKnownMinValue(); ++i)
4311 Mask.push_back(IdxN + i);
4312
4313 Value *Shuffle = Builder.CreateShuffleVector(Vec, Mask);
4314 return replaceInstUsesWith(CI, Shuffle);
4315 }
4316 break;
4317 }
4318 case Intrinsic::experimental_vp_reverse: {
4319 Value *X;
4320 Value *Vec = II->getArgOperand(0);
4321 Value *Mask = II->getArgOperand(1);
4322 if (!match(Mask, m_AllOnes()))
4323 break;
4324 Value *EVL = II->getArgOperand(2);
4325 // TODO: Canonicalize experimental.vp.reverse after unop/binops?
4326 // rev(unop rev(X)) --> unop X
4327 if (match(Vec,
4329 m_Value(X), m_AllOnes(), m_Specific(EVL)))))) {
4330 auto *OldUnOp = cast<UnaryOperator>(Vec);
4332 OldUnOp->getOpcode(), X, OldUnOp, OldUnOp->getName(),
4333 II->getIterator());
4334 return replaceInstUsesWith(CI, NewUnOp);
4335 }
4336 break;
4337 }
4338 case Intrinsic::vector_reduce_or:
4339 case Intrinsic::vector_reduce_and: {
4340 // Canonicalize logical or/and reductions:
4341 // Or reduction for i1 is represented as:
4342 // %val = bitcast <ReduxWidth x i1> to iReduxWidth
4343 // %res = cmp ne iReduxWidth %val, 0
4344 // And reduction for i1 is represented as:
4345 // %val = bitcast <ReduxWidth x i1> to iReduxWidth
4346 // %res = cmp eq iReduxWidth %val, 11111
4347 Value *Arg = II->getArgOperand(0);
4348 Value *Vect;
4349
4350 if (Value *NewOp =
4351 simplifyReductionOperand(Arg, /*CanReorderLanes=*/true)) {
4352 replaceUse(II->getOperandUse(0), NewOp);
4353 return II;
4354 }
4355
4356 if (match(Arg, m_ZExtOrSExtOrSelf(m_Value(Vect)))) {
4357 if (auto *FTy = dyn_cast<FixedVectorType>(Vect->getType()))
4358 if (FTy->getElementType() == Builder.getInt1Ty()) {
4359 Value *Res = Builder.CreateBitCast(
4360 Vect, Builder.getIntNTy(FTy->getNumElements()));
4361 if (IID == Intrinsic::vector_reduce_and) {
4362 Res = Builder.CreateICmpEQ(
4364 } else {
4365 assert(IID == Intrinsic::vector_reduce_or &&
4366 "Expected or reduction.");
4367 Res = Builder.CreateIsNotNull(Res);
4368 }
4369 if (Arg != Vect)
4370 Res = Builder.CreateCast(cast<CastInst>(Arg)->getOpcode(), Res,
4371 II->getType());
4372 return replaceInstUsesWith(CI, Res);
4373 }
4374 }
4375 [[fallthrough]];
4376 }
4377 case Intrinsic::vector_reduce_add: {
4378 if (IID == Intrinsic::vector_reduce_add) {
4379 // Convert vector_reduce_add(ZExt(<n x i1>)) to
4380 // ZExtOrTrunc(ctpop(bitcast <n x i1> to in)).
4381 // Convert vector_reduce_add(SExt(<n x i1>)) to
4382 // -ZExtOrTrunc(ctpop(bitcast <n x i1> to in)).
4383 // Convert vector_reduce_add(<n x i1>) to
4384 // Trunc(ctpop(bitcast <n x i1> to in)).
4385 Value *Arg = II->getArgOperand(0);
4386 Value *Vect;
4387
4388 if (Value *NewOp =
4389 simplifyReductionOperand(Arg, /*CanReorderLanes=*/true)) {
4390 replaceUse(II->getOperandUse(0), NewOp);
4391 return II;
4392 }
4393
4394 // vector.reduce.add.vNiM(splat(%x)) -> mul(%x, N)
4395 if (Value *Splat = getSplatValue(Arg)) {
4396 ElementCount VecToReduceCount =
4397 cast<VectorType>(Arg->getType())->getElementCount();
4398 if (VecToReduceCount.isFixed()) {
4399 unsigned VectorSize = VecToReduceCount.getFixedValue();
4400 return BinaryOperator::CreateMul(
4401 Splat,
4402 ConstantInt::get(Splat->getType(), VectorSize, /*IsSigned=*/false,
4403 /*ImplicitTrunc=*/true));
4404 }
4405 }
4406
4407 if (match(Arg, m_ZExtOrSExtOrSelf(m_Value(Vect)))) {
4408 if (auto *FTy = dyn_cast<FixedVectorType>(Vect->getType()))
4409 if (FTy->getElementType() == Builder.getInt1Ty()) {
4410 Value *V = Builder.CreateBitCast(
4411 Vect, Builder.getIntNTy(FTy->getNumElements()));
4412 Value *Res = Builder.CreateUnaryIntrinsic(Intrinsic::ctpop, V);
4413 Res = Builder.CreateZExtOrTrunc(Res, II->getType());
4414 if (Arg != Vect &&
4415 cast<Instruction>(Arg)->getOpcode() == Instruction::SExt)
4416 Res = Builder.CreateNeg(Res);
4417 return replaceInstUsesWith(CI, Res);
4418 }
4419 }
4420 }
4421 [[fallthrough]];
4422 }
4423 case Intrinsic::vector_reduce_xor: {
4424 if (IID == Intrinsic::vector_reduce_xor) {
4425 // Exclusive disjunction reduction over the vector with
4426 // (potentially-extended) i1 element type is actually a
4427 // (potentially-extended) arithmetic `add` reduction over the original
4428 // non-extended value:
4429 // vector_reduce_xor(?ext(<n x i1>))
4430 // -->
4431 // ?ext(vector_reduce_add(<n x i1>))
4432 Value *Arg = II->getArgOperand(0);
4433 Value *Vect;
4434
4435 if (Value *NewOp =
4436 simplifyReductionOperand(Arg, /*CanReorderLanes=*/true)) {
4437 replaceUse(II->getOperandUse(0), NewOp);
4438 return II;
4439 }
4440
4441 if (match(Arg, m_ZExtOrSExtOrSelf(m_Value(Vect)))) {
4442 if (auto *VTy = dyn_cast<VectorType>(Vect->getType()))
4443 if (VTy->getElementType() == Builder.getInt1Ty()) {
4444 Value *Res = Builder.CreateAddReduce(Vect);
4445 if (Arg != Vect)
4446 Res = Builder.CreateCast(cast<CastInst>(Arg)->getOpcode(), Res,
4447 II->getType());
4448 return replaceInstUsesWith(CI, Res);
4449 }
4450 }
4451 }
4452 [[fallthrough]];
4453 }
4454 case Intrinsic::vector_reduce_mul: {
4455 if (IID == Intrinsic::vector_reduce_mul) {
4456 Value *Arg = II->getArgOperand(0);
4457
4458 if (Value *NewOp =
4459 simplifyReductionOperand(Arg, /*CanReorderLanes=*/true)) {
4460 replaceUse(II->getOperandUse(0), NewOp);
4461 return II;
4462 }
4463
4464 // vector_reduce_mul(zext(<n x i1>)), or
4465 // vector_reduce_mul(sext(<n x i1>)) (if n is even) -->
4466 // zext(vector_reduce_and(<n x i1>)).
4467 // (The sext case doesn't work if n is odd because multiplying an odd
4468 // number of -1's produces -1, not 1.)
4469 Value *Vect;
4470 bool IsZext = match(Arg, m_ZExt(m_Value(Vect))) &&
4471 Vect->getType()->isIntOrIntVectorTy(1);
4472 bool IsSext =
4473 match(Arg, m_SExt(m_Value(Vect))) &&
4474 Vect->getType()->isIntOrIntVectorTy(1) &&
4475 cast<VectorType>(Vect->getType())->getElementCount().isKnownEven();
4476 if (IsZext || IsSext) {
4477 Value *Res = Builder.CreateAndReduce(Vect);
4478 return CastInst::Create(Instruction::ZExt, Res, II->getType());
4479 }
4480
4481 // vector_reduce_mul(<n x i1>) --> vector_reduce_and(<n x i1>)
4482 if (Arg->getType()->isIntOrIntVectorTy(1))
4483 return replaceInstUsesWith(CI, Builder.CreateAndReduce(Arg));
4484 }
4485 [[fallthrough]];
4486 }
4487 case Intrinsic::vector_reduce_umin:
4488 case Intrinsic::vector_reduce_umax: {
4489 if (IID == Intrinsic::vector_reduce_umin ||
4490 IID == Intrinsic::vector_reduce_umax) {
4491 // UMin/UMax reduction over the vector with (potentially-extended)
4492 // i1 element type is actually a (potentially-extended)
4493 // logical `and`/`or` reduction over the original non-extended value:
4494 // vector_reduce_u{min,max}(?ext(<n x i1>))
4495 // -->
4496 // ?ext(vector_reduce_{and,or}(<n x i1>))
4497 Value *Arg = II->getArgOperand(0);
4498 Value *Vect;
4499
4500 if (Value *NewOp =
4501 simplifyReductionOperand(Arg, /*CanReorderLanes=*/true)) {
4502 replaceUse(II->getOperandUse(0), NewOp);
4503 return II;
4504 }
4505
4506 if (match(Arg, m_ZExtOrSExtOrSelf(m_Value(Vect)))) {
4507 if (auto *VTy = dyn_cast<VectorType>(Vect->getType()))
4508 if (VTy->getElementType() == Builder.getInt1Ty()) {
4509 Value *Res = IID == Intrinsic::vector_reduce_umin
4510 ? Builder.CreateAndReduce(Vect)
4511 : Builder.CreateOrReduce(Vect);
4512 if (Arg != Vect)
4513 Res = Builder.CreateCast(cast<CastInst>(Arg)->getOpcode(), Res,
4514 II->getType());
4515 return replaceInstUsesWith(CI, Res);
4516 }
4517 }
4518 }
4519 [[fallthrough]];
4520 }
4521 case Intrinsic::vector_reduce_smin:
4522 case Intrinsic::vector_reduce_smax: {
4523 if (IID == Intrinsic::vector_reduce_smin ||
4524 IID == Intrinsic::vector_reduce_smax) {
4525 // SMin/SMax reduction over the vector with (potentially-extended)
4526 // i1 element type is actually a (potentially-extended)
4527 // logical `and`/`or` reduction over the original non-extended value:
4528 // vector_reduce_s{min,max}(<n x i1>)
4529 // -->
4530 // vector_reduce_{or,and}(<n x i1>)
4531 // and
4532 // vector_reduce_s{min,max}(sext(<n x i1>))
4533 // -->
4534 // sext(vector_reduce_{or,and}(<n x i1>))
4535 // and
4536 // vector_reduce_s{min,max}(zext(<n x i1>))
4537 // -->
4538 // zext(vector_reduce_{and,or}(<n x i1>))
4539 Value *Arg = II->getArgOperand(0);
4540 Value *Vect;
4541
4542 if (Value *NewOp =
4543 simplifyReductionOperand(Arg, /*CanReorderLanes=*/true)) {
4544 replaceUse(II->getOperandUse(0), NewOp);
4545 return II;
4546 }
4547
4548 if (match(Arg, m_ZExtOrSExtOrSelf(m_Value(Vect)))) {
4549 if (auto *VTy = dyn_cast<VectorType>(Vect->getType()))
4550 if (VTy->getElementType() == Builder.getInt1Ty()) {
4551 Instruction::CastOps ExtOpc = Instruction::CastOps::CastOpsEnd;
4552 if (Arg != Vect)
4553 ExtOpc = cast<CastInst>(Arg)->getOpcode();
4554 Value *Res = ((IID == Intrinsic::vector_reduce_smin) ==
4555 (ExtOpc == Instruction::CastOps::ZExt))
4556 ? Builder.CreateAndReduce(Vect)
4557 : Builder.CreateOrReduce(Vect);
4558 if (Arg != Vect)
4559 Res = Builder.CreateCast(ExtOpc, Res, II->getType());
4560 return replaceInstUsesWith(CI, Res);
4561 }
4562 }
4563 }
4564 [[fallthrough]];
4565 }
4566 case Intrinsic::vector_reduce_fmax:
4567 case Intrinsic::vector_reduce_fmin:
4568 case Intrinsic::vector_reduce_fadd:
4569 case Intrinsic::vector_reduce_fmul: {
4570 bool CanReorderLanes = (IID != Intrinsic::vector_reduce_fadd &&
4571 IID != Intrinsic::vector_reduce_fmul) ||
4572 II->hasAllowReassoc();
4573 const unsigned ArgIdx = (IID == Intrinsic::vector_reduce_fadd ||
4574 IID == Intrinsic::vector_reduce_fmul)
4575 ? 1
4576 : 0;
4577 Value *Arg = II->getArgOperand(ArgIdx);
4578 if (Value *NewOp = simplifyReductionOperand(Arg, CanReorderLanes)) {
4579 replaceUse(II->getOperandUse(ArgIdx), NewOp);
4580 return nullptr;
4581 }
4582 break;
4583 }
4584 case Intrinsic::is_fpclass: {
4585 if (Instruction *I = foldIntrinsicIsFPClass(*II))
4586 return I;
4587 break;
4588 }
4589 case Intrinsic::threadlocal_address: {
4590 Align MinAlign = getKnownAlignment(II->getArgOperand(0), DL, II, &AC, &DT);
4591 MaybeAlign Align = II->getRetAlign();
4592 if (MinAlign > Align.valueOrOne()) {
4593 II->addRetAttr(Attribute::getWithAlignment(II->getContext(), MinAlign));
4594 return II;
4595 }
4596 break;
4597 }
4598 case Intrinsic::fptoui_sat:
4599 case Intrinsic::fptosi_sat:
4600 if (Instruction *I = foldItoFPtoI(*II))
4601 return I;
4602 break;
4603 case Intrinsic::frexp: {
4604 // frexp(frexp(x).fract) -> { frexp(x).fract, 0 }: the fraction operand is
4605 // already normalized, so the first result is idempotent and the second is
4606 // zero.
4607 if (match(II->getArgOperand(0),
4609 Value *Res = Builder.CreateInsertValue(PoisonValue::get(II->getType()),
4610 II->getArgOperand(0), 0);
4611 Res = Builder.CreateInsertValue(
4612 Res, Constant::getNullValue(II->getType()->getStructElementType(1)),
4613 1);
4614 return replaceInstUsesWith(*II, Res);
4615 }
4616 break;
4617 }
4618 case Intrinsic::get_active_lane_mask: {
4619 const APInt *Op0, *Op1;
4620 if (match(II->getOperand(0), m_StrictlyPositive(Op0)) &&
4621 match(II->getOperand(1), m_APInt(Op1))) {
4622 Type *OpTy = II->getOperand(0)->getType();
4623 return replaceInstUsesWith(
4624 *II, Builder.CreateIntrinsic(
4625 II->getType(), Intrinsic::get_active_lane_mask,
4626 {Constant::getNullValue(OpTy),
4627 ConstantInt::get(OpTy, Op1->usub_sat(*Op0))}));
4628 }
4629 break;
4630 }
4631 case Intrinsic::experimental_get_vector_length: {
4632 // get.vector.length(Cnt, MaxLanes) --> Cnt when Cnt <= MaxLanes
4633 unsigned BitWidth =
4634 std::max(II->getArgOperand(0)->getType()->getScalarSizeInBits(),
4635 II->getType()->getScalarSizeInBits());
4636 ConstantRange Cnt =
4637 computeConstantRangeIncludingKnownBits(II->getArgOperand(0), false,
4638 SQ.getWithInstruction(II))
4640 ConstantRange MaxLanes = cast<ConstantInt>(II->getArgOperand(1))
4641 ->getValue()
4642 .zextOrTrunc(Cnt.getBitWidth());
4643 if (cast<ConstantInt>(II->getArgOperand(2))->isOne())
4644 MaxLanes = MaxLanes.multiply(
4645 getVScaleRange(II->getFunction(), Cnt.getBitWidth()));
4646
4647 if (Cnt.icmp(CmpInst::ICMP_ULE, MaxLanes))
4648 return replaceInstUsesWith(
4649 *II, Builder.CreateZExtOrTrunc(II->getArgOperand(0), II->getType()));
4650 return nullptr;
4651 }
4652 default: {
4653 // Handle target specific intrinsics
4654 std::optional<Instruction *> V = targetInstCombineIntrinsic(*II);
4655 if (V)
4656 return *V;
4657 break;
4658 }
4659 }
4660
4661 // Try to fold intrinsic into select/phi operands. This is legal if:
4662 // * The intrinsic is speculatable.
4663 // * The operand is one of the following:
4664 // - a phi.
4665 // - a select with a scalar condition.
4666 // - a select with a vector condition and II is not a cross lane operation.
4668 for (Value *Op : II->args()) {
4669 if (auto *Sel = dyn_cast<SelectInst>(Op)) {
4670 bool IsVectorCond = Sel->getCondition()->getType()->isVectorTy();
4671 if (IsVectorCond &&
4672 (!isNotCrossLaneOperation(II) || !II->getType()->isVectorTy()))
4673 continue;
4674 // Don't replace a scalar select with a more expensive vector select if
4675 // we can't simplify both arms of the select.
4676 bool SimplifyBothArms =
4677 !Op->getType()->isVectorTy() && II->getType()->isVectorTy();
4679 *II, Sel, /*FoldWithMultiUse=*/false, SimplifyBothArms))
4680 return R;
4681 }
4682 if (auto *Phi = dyn_cast<PHINode>(Op))
4683 if (Instruction *R = foldOpIntoPhi(*II, Phi))
4684 return R;
4685 }
4686 }
4687
4689 return Shuf;
4690
4692 return replaceInstUsesWith(*II, Reverse);
4693
4695 return replaceInstUsesWith(*II, Res);
4696
4697 // Some intrinsics (like experimental_gc_statepoint) can be used in invoke
4698 // context, so it is handled in visitCallBase and we should trigger it.
4699 return visitCallBase(*II);
4700}
4701
4702// Fence instruction simplification
4704 auto *NFI = dyn_cast<FenceInst>(FI.getNextNode());
4705 // This check is solely here to handle arbitrary target-dependent syncscopes.
4706 // TODO: Can remove if does not matter in practice.
4707 if (NFI && FI.isIdenticalTo(NFI))
4708 return eraseInstFromFunction(FI);
4709
4710 // Returns true if FI1 is identical or stronger fence than FI2.
4711 auto isIdenticalOrStrongerFence = [](FenceInst *FI1, FenceInst *FI2) {
4712 auto FI1SyncScope = FI1->getSyncScopeID();
4713 // Consider same scope, where scope is global or single-thread.
4714 if (FI1SyncScope != FI2->getSyncScopeID() ||
4715 (FI1SyncScope != SyncScope::System &&
4716 FI1SyncScope != SyncScope::SingleThread))
4717 return false;
4718
4719 return isAtLeastOrStrongerThan(FI1->getOrdering(), FI2->getOrdering());
4720 };
4721 if (NFI && isIdenticalOrStrongerFence(NFI, &FI))
4722 return eraseInstFromFunction(FI);
4723
4724 if (auto *PFI = dyn_cast_or_null<FenceInst>(FI.getPrevNode()))
4725 if (isIdenticalOrStrongerFence(PFI, &FI))
4726 return eraseInstFromFunction(FI);
4727 return nullptr;
4728}
4729
4730// InvokeInst simplification
4732 return visitCallBase(II);
4733}
4734
4735// CallBrInst simplification
4737 return visitCallBase(CBI);
4738}
4739
4740// A simple parser for format string specifiers for the purposes of the
4741// modular-format attribute. In the case of malformed format strings this might
4742// under or over report the specifiers present, but such cases are undefined
4743// behavior.
4745 Bitset<256> Specifiers;
4746 for (size_t I = 0; I < FormatStr.size(); ++I) {
4747 if (FormatStr[I] != '%')
4748 continue;
4749
4750 // Check for escaped '%'.
4751 if (I + 1 < FormatStr.size() && FormatStr[I + 1] == '%') {
4752 ++I; // Skip the second '%'.
4753 continue;
4754 }
4755
4756 // Scan past allowed prefix characters.
4757 size_t J =
4758 FormatStr.find_first_not_of("0123456789-+ #0$.*'hlLjztqwvI", I + 1);
4759 if (J == StringRef::npos)
4760 break;
4761
4762 Specifiers.set(static_cast<unsigned char>(FormatStr[J]));
4763 I = J; // Resume search from after the specifier.
4764 }
4765 return Specifiers;
4766}
4767
4768static bool isAspectNeeded(StringRef Aspect, CallInst *CI,
4769 std::optional<unsigned> FirstArgIdx,
4770 const std::optional<Bitset<256>> &Specifiers) {
4771 if (Aspect == "float") {
4772 if (Specifiers) {
4773 static constexpr Bitset<256> FloatSpecifiers{'f', 'F', 'e', 'E',
4774 'g', 'G', 'a', 'A'};
4775 return (*Specifiers & FloatSpecifiers).any();
4776 }
4777 // Fallback to type-based check for dynamic format string.
4778 if (!FirstArgIdx)
4779 return true;
4780 return llvm::any_of(
4781 llvm::make_range(std::next(CI->arg_begin(), *FirstArgIdx),
4782 CI->arg_end()),
4783 [](Value *V) { return V->getType()->isFloatingPointTy(); });
4784 }
4785 if (Aspect == "fixed") {
4786 if (Specifiers) {
4787 static constexpr Bitset<256> FixedSpecifiers{'r', 'R', 'k', 'K'};
4788 return (*Specifiers & FixedSpecifiers).any();
4789 }
4790 // Fallback for fixed-point: assume needed if format is dynamic.
4791 return true;
4792 }
4793 // Unknown aspects are always considered to be needed.
4794 return true;
4795}
4796
4797static void referenceAspect(StringRef Aspect, StringRef ImplName, Module *M,
4798 IRBuilderBase &B) {
4799 SmallString<20> Name = ImplName;
4800 Name += '_';
4801 Name += Aspect;
4802 LLVMContext &Ctx = M->getContext();
4803 Function *RelocNoneFn =
4804 Intrinsic::getOrInsertDeclaration(M, Intrinsic::reloc_none);
4805 B.CreateCall(RelocNoneFn,
4806 {MetadataAsValue::get(Ctx, MDString::get(Ctx, Name))});
4807}
4808
4810 if (!CI->hasFnAttr("modular-format"))
4811 return nullptr;
4812
4814 llvm::split(CI->getFnAttr("modular-format").getValueAsString(), ','));
4815 if (Args.size() < 5)
4816 return nullptr;
4817
4818 StringRef FormatIdxStr = Args[1];
4819 StringRef FirstArgIdxStr = Args[2];
4820 StringRef FnName = Args[3];
4821 StringRef ImplName = Args[4];
4823
4824 unsigned FormatIdx;
4825 std::optional<unsigned> FirstArgIdx;
4826 [[maybe_unused]] bool Error;
4827 Error = FormatIdxStr.getAsInteger(10, FormatIdx);
4828 assert(!Error && "invalid format arg index");
4829 --FormatIdx; // 1-based to 0-based
4830
4831 FirstArgIdx.emplace();
4832 Error = FirstArgIdxStr.getAsInteger(10, *FirstArgIdx);
4833 assert(!Error && "invalid first arg index");
4834 if (*FirstArgIdx > 0)
4835 --*FirstArgIdx; // 1-based to 0-based
4836 else
4837 FirstArgIdx.reset();
4838
4839 if (AllAspects.empty())
4840 return nullptr;
4841
4842 Value *FormatVal = CI->getArgOperand(FormatIdx);
4843 StringRef FormatStr;
4844
4845 std::optional<Bitset<256>> Specifiers;
4846 if (getConstantStringInfo(FormatVal, FormatStr))
4847 Specifiers = parseFormatStringSpecifiers(FormatStr);
4848
4849 SmallVector<StringRef> NeededAspects;
4850 for (StringRef Aspect : AllAspects)
4851 if (isAspectNeeded(Aspect, CI, FirstArgIdx, Specifiers))
4852 NeededAspects.push_back(Aspect);
4853
4854 if (NeededAspects.size() == AllAspects.size())
4855 return nullptr;
4856
4857 Module *M = CI->getModule();
4858 LLVMContext &Ctx = M->getContext();
4859 Function *Callee = CI->getCalledFunction();
4860 FunctionCallee ModularFn = M->getOrInsertFunction(
4861 FnName, Callee->getFunctionType(),
4862 Callee->getAttributes().removeFnAttribute(Ctx, "modular-format"));
4863 CallInst *New = cast<CallInst>(CI->clone());
4864 New->setCalledFunction(ModularFn);
4865 New->removeFnAttr("modular-format");
4866 B.Insert(New);
4867
4868 llvm::sort(NeededAspects);
4869 for (StringRef Request : NeededAspects)
4870 referenceAspect(Request, ImplName, M, B);
4871
4872 return New;
4873}
4874
4875Instruction *InstCombinerImpl::tryOptimizeCall(CallInst *CI) {
4876 if (!CI->getCalledFunction()) return nullptr;
4877
4878 // Skip optimizing notail and musttail calls so
4879 // LibCallSimplifier::optimizeCall doesn't have to preserve those invariants.
4880 // LibCallSimplifier::optimizeCall should try to preserve tail calls though.
4881 if (CI->isMustTailCall() || CI->isNoTailCall())
4882 return nullptr;
4883
4884 auto InstCombineRAUW = [this](Instruction *From, Value *With) {
4885 replaceInstUsesWith(*From, With);
4886 };
4887 auto InstCombineErase = [this](Instruction *I) {
4889 };
4890 LibCallSimplifier Simplifier(DL, &TLI, &DT, &DC, &AC, ORE, BFI, PSI,
4891 InstCombineRAUW, InstCombineErase);
4892 if (Value *With = Simplifier.optimizeCall(CI, Builder)) {
4893 ++NumSimplified;
4894 return CI->use_empty() ? CI : replaceInstUsesWith(*CI, With);
4895 }
4896 if (Value *With = optimizeModularFormat(CI, Builder)) {
4897 ++NumSimplified;
4898 return CI->use_empty() ? CI : replaceInstUsesWith(*CI, With);
4899 }
4900
4901 return nullptr;
4902}
4903
4905 // Strip off at most one level of pointer casts, looking for an alloca. This
4906 // is good enough in practice and simpler than handling any number of casts.
4907 Value *Underlying = TrampMem->stripPointerCasts();
4908 if (Underlying != TrampMem &&
4909 (!Underlying->hasOneUse() || Underlying->user_back() != TrampMem))
4910 return nullptr;
4911 if (!isa<AllocaInst>(Underlying))
4912 return nullptr;
4913
4914 IntrinsicInst *InitTrampoline = nullptr;
4915 for (User *U : TrampMem->users()) {
4917 if (!II)
4918 return nullptr;
4919 if (II->getIntrinsicID() == Intrinsic::init_trampoline) {
4920 if (InitTrampoline)
4921 // More than one init_trampoline writes to this value. Give up.
4922 return nullptr;
4923 InitTrampoline = II;
4924 continue;
4925 }
4926 if (II->getIntrinsicID() == Intrinsic::adjust_trampoline)
4927 // Allow any number of calls to adjust.trampoline.
4928 continue;
4929 return nullptr;
4930 }
4931
4932 // No call to init.trampoline found.
4933 if (!InitTrampoline)
4934 return nullptr;
4935
4936 // Check that the alloca is being used in the expected way.
4937 if (InitTrampoline->getOperand(0) != TrampMem)
4938 return nullptr;
4939
4940 return InitTrampoline;
4941}
4942
4944 Value *TrampMem) {
4945 // Visit all the previous instructions in the basic block, and try to find a
4946 // init.trampoline which has a direct path to the adjust.trampoline.
4947 for (BasicBlock::iterator I = AdjustTramp->getIterator(),
4948 E = AdjustTramp->getParent()->begin();
4949 I != E;) {
4950 Instruction *Inst = &*--I;
4952 if (II->getIntrinsicID() == Intrinsic::init_trampoline &&
4953 II->getOperand(0) == TrampMem)
4954 return II;
4955 if (Inst->mayWriteToMemory())
4956 return nullptr;
4957 }
4958 return nullptr;
4959}
4960
4961// Given a call to llvm.adjust.trampoline, find and return the corresponding
4962// call to llvm.init.trampoline if the call to the trampoline can be optimized
4963// to a direct call to a function. Otherwise return NULL.
4965 Callee = Callee->stripPointerCasts();
4966 IntrinsicInst *AdjustTramp = dyn_cast<IntrinsicInst>(Callee);
4967 if (!AdjustTramp ||
4968 AdjustTramp->getIntrinsicID() != Intrinsic::adjust_trampoline)
4969 return nullptr;
4970
4971 Value *TrampMem = AdjustTramp->getOperand(0);
4972
4974 return IT;
4975 if (IntrinsicInst *IT = findInitTrampolineFromBB(AdjustTramp, TrampMem))
4976 return IT;
4977 return nullptr;
4978}
4979
4980Instruction *InstCombinerImpl::foldPtrAuthIntrinsicCallee(CallBase &Call) {
4981 const Value *Callee = Call.getCalledOperand();
4982 const auto *IPC = dyn_cast<IntToPtrInst>(Callee);
4983 if (!IPC || !IPC->isNoopCast(DL))
4984 return nullptr;
4985
4986 const auto *II = dyn_cast<IntrinsicInst>(IPC->getOperand(0));
4987 if (!II)
4988 return nullptr;
4989
4990 Intrinsic::ID IIID = II->getIntrinsicID();
4991 if (IIID != Intrinsic::ptrauth_resign && IIID != Intrinsic::ptrauth_sign)
4992 return nullptr;
4993
4994 // Isolate the ptrauth bundle from the others.
4995 std::optional<OperandBundleUse> PtrAuthBundleOrNone;
4997 for (unsigned BI = 0, BE = Call.getNumOperandBundles(); BI != BE; ++BI) {
4998 OperandBundleUse Bundle = Call.getOperandBundleAt(BI);
4999 if (Bundle.getTagID() == LLVMContext::OB_ptrauth)
5000 PtrAuthBundleOrNone = Bundle;
5001 else
5002 NewBundles.emplace_back(Bundle);
5003 }
5004
5005 if (!PtrAuthBundleOrNone)
5006 return nullptr;
5007
5008 Value *NewCallee = nullptr;
5009 switch (IIID) {
5010 // call(ptrauth.resign(p)), ["ptrauth"()] -> call p, ["ptrauth"()]
5011 // assuming the call bundle and the sign operands match.
5012 case Intrinsic::ptrauth_resign: {
5013 // Resign result key should match bundle.
5014 if (II->getOperand(3) != PtrAuthBundleOrNone->Inputs[0])
5015 return nullptr;
5016 // Resign result discriminator should match bundle.
5017 if (II->getOperand(4) != PtrAuthBundleOrNone->Inputs[1])
5018 return nullptr;
5019
5020 // Resign input (auth) key should also match: we can't change the key on
5021 // the new call we're generating, because we don't know what keys are valid.
5022 if (II->getOperand(1) != PtrAuthBundleOrNone->Inputs[0])
5023 return nullptr;
5024
5025 Value *NewBundleOps[] = {II->getOperand(1), II->getOperand(2)};
5026 NewBundles.emplace_back("ptrauth", NewBundleOps);
5027 NewCallee = II->getOperand(0);
5028 break;
5029 }
5030
5031 // call(ptrauth.sign(p)), ["ptrauth"()] -> call p
5032 // assuming the call bundle and the sign operands match.
5033 // Non-ptrauth indirect calls are undesirable, but so is ptrauth.sign.
5034 case Intrinsic::ptrauth_sign: {
5035 // Sign key should match bundle.
5036 if (II->getOperand(1) != PtrAuthBundleOrNone->Inputs[0])
5037 return nullptr;
5038 // Sign discriminator should match bundle.
5039 if (II->getOperand(2) != PtrAuthBundleOrNone->Inputs[1])
5040 return nullptr;
5041 NewCallee = II->getOperand(0);
5042 break;
5043 }
5044 default:
5045 llvm_unreachable("unexpected intrinsic ID");
5046 }
5047
5048 if (!NewCallee)
5049 return nullptr;
5050
5051 NewCallee = Builder.CreateBitOrPointerCast(NewCallee, Callee->getType());
5052 CallBase *NewCall = CallBase::Create(&Call, NewBundles);
5053 NewCall->setCalledOperand(NewCallee);
5054 return NewCall;
5055}
5056
5057Instruction *InstCombinerImpl::foldPtrAuthConstantCallee(CallBase &Call) {
5059 if (!CPA)
5060 return nullptr;
5061
5062 auto *CalleeF = dyn_cast<Function>(CPA->getPointer());
5063 // If the ptrauth constant isn't based on a function pointer, bail out.
5064 if (!CalleeF)
5065 return nullptr;
5066
5067 // Inspect the call ptrauth bundle to check it matches the ptrauth constant.
5069 if (!PAB)
5070 return nullptr;
5071
5072 auto *Key = cast<ConstantInt>(PAB->Inputs[0]);
5073 Value *Discriminator = PAB->Inputs[1];
5074
5075 // If the bundle doesn't match, this is probably going to fail to auth.
5076 if (!CPA->isKnownCompatibleWith(Key, Discriminator, DL))
5077 return nullptr;
5078
5079 // If the bundle matches the constant, proceed in making this a direct call.
5081 NewCall->setCalledOperand(CalleeF);
5082 return NewCall;
5083}
5084
5085bool InstCombinerImpl::annotateAnyAllocSite(CallBase &Call,
5086 const TargetLibraryInfo *TLI) {
5087 // Note: We only handle cases which can't be driven from generic attributes
5088 // here. So, for example, nonnull and noalias (which are common properties
5089 // of some allocation functions) are expected to be handled via annotation
5090 // of the respective allocator declaration with generic attributes.
5091 bool Changed = false;
5092
5093 if (!Call.getType()->isPointerTy())
5094 return Changed;
5095
5096 std::optional<APInt> Size = getAllocSize(&Call, TLI);
5097 if (Size && *Size != 0) {
5098 // TODO: We really should just emit deref_or_null here and then
5099 // let the generic inference code combine that with nonnull.
5100 if (Call.hasRetAttr(Attribute::NonNull)) {
5101 Changed = !Call.hasRetAttr(Attribute::Dereferenceable);
5103 Call.getContext(), Size->getLimitedValue()));
5104 } else {
5105 Changed = !Call.hasRetAttr(Attribute::DereferenceableOrNull);
5107 Call.getContext(), Size->getLimitedValue()));
5108 }
5109 }
5110
5111 // Add alignment attribute if alignment is a power of two constant.
5113 if (!Alignment)
5114 return Changed;
5115
5116 ConstantInt *AlignOpC = dyn_cast<ConstantInt>(Alignment);
5117 if (AlignOpC && AlignOpC->getValue().ult(llvm::Value::MaximumAlignment)) {
5118 uint64_t AlignmentVal = AlignOpC->getZExtValue();
5119 if (llvm::isPowerOf2_64(AlignmentVal)) {
5120 Align ExistingAlign = Call.getRetAlign().valueOrOne();
5121 Align NewAlign = Align(AlignmentVal);
5122 if (NewAlign > ExistingAlign) {
5125 Changed = true;
5126 }
5127 }
5128 }
5129 return Changed;
5130}
5131
5132/// Improvements for call, callbr and invoke instructions.
5133Instruction *InstCombinerImpl::visitCallBase(CallBase &Call) {
5134 bool Changed = annotateAnyAllocSite(Call, &TLI);
5135
5136 // Mark any parameters that are known to be non-null with the nonnull
5137 // attribute. This is helpful for inlining calls to functions with null
5138 // checks on their arguments.
5139 SmallVector<unsigned, 4> ArgNos;
5140 unsigned ArgNo = 0;
5141
5142 for (Value *V : Call.args()) {
5143 if (V->getType()->isPointerTy()) {
5144 // Simplify the nonnull operand if the parameter is known to be nonnull.
5145 // Otherwise, try to infer nonnull for it.
5146 bool UseProvenance =
5149 V->getType()->getPointerAddressSpace());
5150 if (Call.paramHasAttr(ArgNo, Attribute::NonNull) || UseProvenance) {
5151 if (Value *Res = simplifyNonNullOperand(V, UseProvenance)) {
5152 replaceOperand(Call, ArgNo, Res);
5153 Changed = true;
5154 }
5155 } else if (isKnownNonZero(V,
5156 getSimplifyQuery().getWithInstruction(&Call))) {
5157 ArgNos.push_back(ArgNo);
5158 }
5159 }
5160 ArgNo++;
5161 }
5162
5163 assert(ArgNo == Call.arg_size() && "Call arguments not processed correctly.");
5164
5165 if (!ArgNos.empty()) {
5166 AttributeList AS = Call.getAttributes();
5167 LLVMContext &Ctx = Call.getContext();
5168 AS = AS.addParamAttribute(Ctx, ArgNos,
5169 Attribute::get(Ctx, Attribute::NonNull));
5170 Call.setAttributes(AS);
5171 Changed = true;
5172 }
5173
5174 // If the callee is a pointer to a function, attempt to move any casts to the
5175 // arguments of the call/callbr/invoke.
5177 Function *CalleeF = dyn_cast<Function>(Callee);
5178 if ((!CalleeF || CalleeF->getFunctionType() != Call.getFunctionType()) &&
5179 transformConstExprCastCall(Call))
5180 return nullptr;
5181
5182 if (CalleeF) {
5183 // Remove the convergent attr on calls when the callee is not convergent.
5184 if (Call.isConvergent() && !CalleeF->isConvergent() &&
5185 !CalleeF->isIntrinsic()) {
5186 LLVM_DEBUG(dbgs() << "Removing convergent attr from instr " << Call
5187 << "\n");
5189 return &Call;
5190 }
5191
5192 // If the call and callee calling conventions don't match, and neither one
5193 // of the calling conventions is compatible with C calling convention
5194 // this call must be unreachable, as the call is undefined.
5195 if ((CalleeF->getCallingConv() != Call.getCallingConv() &&
5196 !(CalleeF->getCallingConv() == llvm::CallingConv::C &&
5200 // Only do this for calls to a function with a body. A prototype may
5201 // not actually end up matching the implementation's calling conv for a
5202 // variety of reasons (e.g. it may be written in assembly).
5203 !CalleeF->isDeclaration()) {
5204 Instruction *OldCall = &Call;
5206 // If OldCall does not return void then replaceInstUsesWith poison.
5207 // This allows ValueHandlers and custom metadata to adjust itself.
5208 if (!OldCall->getType()->isVoidTy())
5209 replaceInstUsesWith(*OldCall, PoisonValue::get(OldCall->getType()));
5210 if (isa<CallInst>(OldCall))
5211 return eraseInstFromFunction(*OldCall);
5212
5213 // We cannot remove an invoke or a callbr, because it would change thexi
5214 // CFG, just change the callee to a null pointer.
5215 cast<CallBase>(OldCall)->setCalledFunction(
5216 CalleeF->getFunctionType(),
5217 Constant::getNullValue(CalleeF->getType()));
5218 return nullptr;
5219 }
5220 }
5221
5222 // Calling a null function pointer is undefined if a null address isn't
5223 // dereferenceable.
5224 if ((isa<ConstantPointerNull>(Callee) &&
5226 isa<UndefValue>(Callee)) {
5227 // If Call does not return void then replaceInstUsesWith poison.
5228 // This allows ValueHandlers and custom metadata to adjust itself.
5229 if (!Call.getType()->isVoidTy())
5231
5232 if (Call.isTerminator()) {
5233 // Can't remove an invoke or callbr because we cannot change the CFG.
5234 return nullptr;
5235 }
5236
5237 // This instruction is not reachable, just remove it.
5240 }
5241
5242 if (IntrinsicInst *II = findInitTrampoline(Callee))
5243 return transformCallThroughTrampoline(Call, *II);
5244
5245 // Combine calls involving pointer authentication intrinsics.
5246 if (Instruction *NewCall = foldPtrAuthIntrinsicCallee(Call))
5247 return NewCall;
5248
5249 // Combine calls to ptrauth constants.
5250 if (Instruction *NewCall = foldPtrAuthConstantCallee(Call))
5251 return NewCall;
5252
5253 if (isa<InlineAsm>(Callee) && !Call.doesNotThrow()) {
5254 InlineAsm *IA = cast<InlineAsm>(Callee);
5255 if (!IA->canThrow()) {
5256 // Normal inline asm calls cannot throw - mark them
5257 // 'nounwind'.
5259 Changed = true;
5260 }
5261 }
5262
5263 // Try to optimize the call if possible, we require DataLayout for most of
5264 // this. None of these calls are seen as possibly dead so go ahead and
5265 // delete the instruction now.
5266 if (CallInst *CI = dyn_cast<CallInst>(&Call)) {
5267 Instruction *I = tryOptimizeCall(CI);
5268 // If we changed something return the result, etc. Otherwise let
5269 // the fallthrough check.
5270 if (I) return eraseInstFromFunction(*I);
5271 }
5272
5273 if (!Call.use_empty() && !Call.isMustTailCall())
5274 if (Value *ReturnedArg = Call.getReturnedArgOperand()) {
5275 Type *CallTy = Call.getType();
5276 Type *RetArgTy = ReturnedArg->getType();
5277 if (RetArgTy->canLosslesslyBitCastTo(CallTy))
5278 return replaceInstUsesWith(
5279 Call, Builder.CreateBitOrPointerCast(ReturnedArg, CallTy));
5280 }
5281
5282 // Drop unnecessary callee_type metadata from calls that were converted
5283 // into direct calls.
5284 if (Call.getMetadata(LLVMContext::MD_callee_type) && !Call.isIndirectCall()) {
5285 Call.setMetadata(LLVMContext::MD_callee_type, nullptr);
5286 Changed = true;
5287 }
5288
5289 // Drop unnecessary kcfi operand bundles from calls that were converted
5290 // into direct calls.
5292 if (Bundle && !Call.isIndirectCall()) {
5293 DEBUG_WITH_TYPE(DEBUG_TYPE "-kcfi", {
5294 if (CalleeF) {
5295 ConstantInt *FunctionType = nullptr;
5296 ConstantInt *ExpectedType = cast<ConstantInt>(Bundle->Inputs[0]);
5297
5298 if (MDNode *MD = CalleeF->getMetadata(LLVMContext::MD_kcfi_type))
5299 FunctionType = mdconst::extract<ConstantInt>(MD->getOperand(0));
5300
5301 if (FunctionType &&
5302 FunctionType->getZExtValue() != ExpectedType->getZExtValue())
5303 dbgs() << Call.getModule()->getName()
5304 << ": warning: kcfi: " << Call.getCaller()->getName()
5305 << ": call to " << CalleeF->getName()
5306 << " using a mismatching function pointer type\n";
5307 }
5308 });
5309
5311 }
5312
5313 if (isRemovableAlloc(&Call, &TLI))
5314 return visitAllocSite(Call);
5315
5316 // Handle intrinsics which can be used in both call and invoke context.
5317 switch (Call.getIntrinsicID()) {
5318 case Intrinsic::experimental_gc_statepoint: {
5319 GCStatepointInst &GCSP = *cast<GCStatepointInst>(&Call);
5320 SmallPtrSet<Value *, 32> LiveGcValues;
5321 for (const GCRelocateInst *Reloc : GCSP.getGCRelocates()) {
5322 GCRelocateInst &GCR = *const_cast<GCRelocateInst *>(Reloc);
5323
5324 // Remove the relocation if unused.
5325 if (GCR.use_empty()) {
5327 continue;
5328 }
5329
5330 Value *DerivedPtr = GCR.getDerivedPtr();
5331 Value *BasePtr = GCR.getBasePtr();
5332
5333 // Undef is undef, even after relocation.
5334 if (isa<UndefValue>(DerivedPtr) || isa<UndefValue>(BasePtr)) {
5337 continue;
5338 }
5339
5340 if (auto *PT = dyn_cast<PointerType>(GCR.getType())) {
5341 // The relocation of null will be null for most any collector.
5342 // TODO: provide a hook for this in GCStrategy. There might be some
5343 // weird collector this property does not hold for.
5344 if (isa<ConstantPointerNull>(DerivedPtr)) {
5345 // Use null-pointer of gc_relocate's type to replace it.
5348 continue;
5349 }
5350
5351 // isKnownNonNull -> nonnull attribute
5352 if (!GCR.hasRetAttr(Attribute::NonNull) &&
5353 isKnownNonZero(DerivedPtr,
5354 getSimplifyQuery().getWithInstruction(&Call))) {
5355 GCR.addRetAttr(Attribute::NonNull);
5356 // We discovered new fact, re-check users.
5357 Worklist.pushUsersToWorkList(GCR);
5358 }
5359 }
5360
5361 // If we have two copies of the same pointer in the statepoint argument
5362 // list, canonicalize to one. This may let us common gc.relocates.
5363 if (GCR.getBasePtr() == GCR.getDerivedPtr() &&
5364 GCR.getBasePtrIndex() != GCR.getDerivedPtrIndex()) {
5365 auto *OpIntTy = GCR.getOperand(2)->getType();
5366 GCR.setOperand(2, ConstantInt::get(OpIntTy, GCR.getBasePtrIndex()));
5367 }
5368
5369 // TODO: relocate((gep p, C, C2, ...)) -> gep(relocate(p), C, C2, ...)
5370 LiveGcValues.insert(BasePtr);
5371 LiveGcValues.insert(DerivedPtr);
5372 }
5373 std::optional<OperandBundleUse> Bundle =
5375 unsigned NumOfGCLives = LiveGcValues.size();
5376 if (!Bundle || NumOfGCLives == Bundle->Inputs.size())
5377 break;
5378 // We can reduce the size of gc live bundle.
5379 DenseMap<Value *, unsigned> Val2Idx;
5380 std::vector<Value *> NewLiveGc;
5381 for (Value *V : Bundle->Inputs) {
5382 auto [It, Inserted] = Val2Idx.try_emplace(V);
5383 if (!Inserted)
5384 continue;
5385 if (LiveGcValues.count(V)) {
5386 It->second = NewLiveGc.size();
5387 NewLiveGc.push_back(V);
5388 } else
5389 It->second = NumOfGCLives;
5390 }
5391 // Update all gc.relocates
5392 for (const GCRelocateInst *Reloc : GCSP.getGCRelocates()) {
5393 GCRelocateInst &GCR = *const_cast<GCRelocateInst *>(Reloc);
5394 Value *BasePtr = GCR.getBasePtr();
5395 assert(Val2Idx.count(BasePtr) && Val2Idx[BasePtr] != NumOfGCLives &&
5396 "Missed live gc for base pointer");
5397 auto *OpIntTy1 = GCR.getOperand(1)->getType();
5398 GCR.setOperand(1, ConstantInt::get(OpIntTy1, Val2Idx[BasePtr]));
5399 Value *DerivedPtr = GCR.getDerivedPtr();
5400 assert(Val2Idx.count(DerivedPtr) && Val2Idx[DerivedPtr] != NumOfGCLives &&
5401 "Missed live gc for derived pointer");
5402 auto *OpIntTy2 = GCR.getOperand(2)->getType();
5403 GCR.setOperand(2, ConstantInt::get(OpIntTy2, Val2Idx[DerivedPtr]));
5404 }
5405 // Create new statepoint instruction.
5406 OperandBundleDef NewBundle("gc-live", std::move(NewLiveGc));
5407 return CallBase::Create(&Call, NewBundle);
5408 }
5409 default: { break; }
5410 }
5411
5412 return Changed ? &Call : nullptr;
5413}
5414
5415/// If the callee is a constexpr cast of a function, attempt to move the cast to
5416/// the arguments of the call/invoke.
5417/// CallBrInst is not supported.
5418bool InstCombinerImpl::transformConstExprCastCall(CallBase &Call) {
5419 auto *Callee =
5421 if (!Callee)
5422 return false;
5423
5425 "CallBr's don't have a single point after a def to insert at");
5426
5427 // Don't perform the transform for declarations, which may not be fully
5428 // accurate. For example, void @foo() is commonly used as a placeholder for
5429 // unknown prototypes.
5430 if (Callee->isDeclaration())
5431 return false;
5432
5433 // If this is a call to a thunk function, don't remove the cast. Thunks are
5434 // used to transparently forward all incoming parameters and outgoing return
5435 // values, so it's important to leave the cast in place.
5436 if (Callee->hasFnAttribute("thunk"))
5437 return false;
5438
5439 // If this is a call to a naked function, the assembly might be
5440 // using an argument, or otherwise rely on the frame layout,
5441 // the function prototype will mismatch.
5442 if (Callee->hasFnAttribute(Attribute::Naked))
5443 return false;
5444
5445 // If this is a musttail call, the callee's prototype must match the caller's
5446 // prototype with the exception of pointee types. The code below doesn't
5447 // implement that, so we can't do this transform.
5448 // TODO: Do the transform if it only requires adding pointer casts.
5449 if (Call.isMustTailCall())
5450 return false;
5451
5453 const AttributeList &CallerPAL = Call.getAttributes();
5454
5455 // Okay, this is a cast from a function to a different type. Unless doing so
5456 // would cause a type conversion of one of our arguments, change this call to
5457 // be a direct call with arguments casted to the appropriate types.
5458 FunctionType *FT = Callee->getFunctionType();
5459 Type *OldRetTy = Caller->getType();
5460 Type *NewRetTy = FT->getReturnType();
5461
5462 // Check to see if we are changing the return type...
5463 if (OldRetTy != NewRetTy) {
5464
5465 if (NewRetTy->isStructTy())
5466 return false; // TODO: Handle multiple return values.
5467
5468 if (!CastInst::isBitOrNoopPointerCastable(NewRetTy, OldRetTy, DL)) {
5469 if (!Caller->use_empty())
5470 return false; // Cannot transform this return value.
5471 }
5472
5473 if (!CallerPAL.isEmpty() && !Caller->use_empty()) {
5474 AttrBuilder RAttrs(FT->getContext(), CallerPAL.getRetAttrs());
5475 if (RAttrs.overlaps(AttributeFuncs::typeIncompatible(
5476 NewRetTy, CallerPAL.getRetAttrs())))
5477 return false; // Attribute not compatible with transformed value.
5478 }
5479
5480 // If the callbase is an invoke instruction, and the return value is
5481 // used by a PHI node in a successor, we cannot change the return type of
5482 // the call because there is no place to put the cast instruction (without
5483 // breaking the critical edge). Bail out in this case.
5484 if (!Caller->use_empty()) {
5485 BasicBlock *PhisNotSupportedBlock = nullptr;
5486 if (auto *II = dyn_cast<InvokeInst>(Caller))
5487 PhisNotSupportedBlock = II->getNormalDest();
5488 if (PhisNotSupportedBlock)
5489 for (User *U : Caller->users())
5490 if (PHINode *PN = dyn_cast<PHINode>(U))
5491 if (PN->getParent() == PhisNotSupportedBlock)
5492 return false;
5493 }
5494 }
5495
5496 unsigned NumActualArgs = Call.arg_size();
5497 unsigned NumCommonArgs = std::min(FT->getNumParams(), NumActualArgs);
5498
5499 // Prevent us turning:
5500 // declare void @takes_i32_inalloca(i32* inalloca)
5501 // call void bitcast (void (i32*)* @takes_i32_inalloca to void (i32)*)(i32 0)
5502 //
5503 // into:
5504 // call void @takes_i32_inalloca(i32* null)
5505 //
5506 // Similarly, avoid folding away bitcasts of byval calls.
5507 if (Callee->getAttributes().hasAttrSomewhere(Attribute::InAlloca) ||
5508 Callee->getAttributes().hasAttrSomewhere(Attribute::Preallocated))
5509 return false;
5510
5511 auto AI = Call.arg_begin();
5512 for (unsigned i = 0, e = NumCommonArgs; i != e; ++i, ++AI) {
5513 Type *ParamTy = FT->getParamType(i);
5514 Type *ActTy = (*AI)->getType();
5515
5516 if (!CastInst::isBitOrNoopPointerCastable(ActTy, ParamTy, DL))
5517 return false; // Cannot transform this parameter value.
5518
5519 // Check if there are any incompatible attributes we cannot drop safely.
5520 if (AttrBuilder(FT->getContext(), CallerPAL.getParamAttrs(i))
5521 .overlaps(AttributeFuncs::typeIncompatible(
5522 ParamTy, CallerPAL.getParamAttrs(i),
5523 AttributeFuncs::ASK_UNSAFE_TO_DROP)))
5524 return false; // Attribute not compatible with transformed value.
5525
5526 if (Call.isInAllocaArgument(i) ||
5527 CallerPAL.hasParamAttr(i, Attribute::Preallocated))
5528 return false; // Cannot transform to and from inalloca/preallocated.
5529
5530 if (CallerPAL.hasParamAttr(i, Attribute::SwiftError))
5531 return false;
5532
5533 if (CallerPAL.hasParamAttr(i, Attribute::ByVal) !=
5534 Callee->getAttributes().hasParamAttr(i, Attribute::ByVal))
5535 return false; // Cannot transform to or from byval.
5536 }
5537
5538 if (FT->getNumParams() < NumActualArgs && FT->isVarArg() &&
5539 !CallerPAL.isEmpty()) {
5540 // In this case we have more arguments than the new function type, but we
5541 // won't be dropping them. Check that these extra arguments have attributes
5542 // that are compatible with being a vararg call argument.
5543 unsigned SRetIdx;
5544 if (CallerPAL.hasAttrSomewhere(Attribute::StructRet, &SRetIdx) &&
5545 SRetIdx - AttributeList::FirstArgIndex >= FT->getNumParams())
5546 return false;
5547 }
5548
5549 // Okay, we decided that this is a safe thing to do: go ahead and start
5550 // inserting cast instructions as necessary.
5551 SmallVector<Value *, 8> Args;
5553 Args.reserve(NumActualArgs);
5554 ArgAttrs.reserve(NumActualArgs);
5555
5556 // Get any return attributes.
5557 AttrBuilder RAttrs(FT->getContext(), CallerPAL.getRetAttrs());
5558
5559 // If the return value is not being used, the type may not be compatible
5560 // with the existing attributes. Wipe out any problematic attributes.
5561 RAttrs.remove(
5562 AttributeFuncs::typeIncompatible(NewRetTy, CallerPAL.getRetAttrs()));
5563
5564 LLVMContext &Ctx = Call.getContext();
5565 AI = Call.arg_begin();
5566 for (unsigned i = 0; i != NumCommonArgs; ++i, ++AI) {
5567 Type *ParamTy = FT->getParamType(i);
5568
5569 Value *NewArg = *AI;
5570 if ((*AI)->getType() != ParamTy)
5571 NewArg = Builder.CreateBitOrPointerCast(*AI, ParamTy);
5572 Args.push_back(NewArg);
5573
5574 // Add any parameter attributes except the ones incompatible with the new
5575 // type. Note that we made sure all incompatible ones are safe to drop.
5576 AttributeMask IncompatibleAttrs = AttributeFuncs::typeIncompatible(
5577 ParamTy, CallerPAL.getParamAttrs(i), AttributeFuncs::ASK_SAFE_TO_DROP);
5578 ArgAttrs.push_back(
5579 CallerPAL.getParamAttrs(i).removeAttributes(Ctx, IncompatibleAttrs));
5580 }
5581
5582 // If the function takes more arguments than the call was taking, add them
5583 // now.
5584 for (unsigned i = NumCommonArgs; i != FT->getNumParams(); ++i) {
5585 Args.push_back(Constant::getNullValue(FT->getParamType(i)));
5586 ArgAttrs.push_back(AttributeSet());
5587 }
5588
5589 // If we are removing arguments to the function, emit an obnoxious warning.
5590 if (FT->getNumParams() < NumActualArgs) {
5591 // TODO: if (!FT->isVarArg()) this call may be unreachable. PR14722
5592 if (FT->isVarArg()) {
5593 // Add all of the arguments in their promoted form to the arg list.
5594 for (unsigned i = FT->getNumParams(); i != NumActualArgs; ++i, ++AI) {
5595 Type *PTy = getPromotedType((*AI)->getType());
5596 Value *NewArg = *AI;
5597 if (PTy != (*AI)->getType()) {
5598 // Must promote to pass through va_arg area!
5599 Instruction::CastOps opcode =
5600 CastInst::getCastOpcode(*AI, false, PTy, false);
5601 NewArg = Builder.CreateCast(opcode, *AI, PTy);
5602 }
5603 Args.push_back(NewArg);
5604
5605 // Add any parameter attributes.
5606 ArgAttrs.push_back(CallerPAL.getParamAttrs(i));
5607 }
5608 }
5609 }
5610
5611 AttributeSet FnAttrs = CallerPAL.getFnAttrs();
5612
5613 if (NewRetTy->isVoidTy())
5614 Caller->setName(""); // Void type should not have a name.
5615
5616 assert((ArgAttrs.size() == FT->getNumParams() || FT->isVarArg()) &&
5617 "missing argument attributes");
5618 AttributeList NewCallerPAL = AttributeList::get(
5619 Ctx, FnAttrs, AttributeSet::get(Ctx, RAttrs), ArgAttrs);
5620
5622 Call.getOperandBundlesAsDefs(OpBundles);
5623
5624 CallBase *NewCall;
5625 if (InvokeInst *II = dyn_cast<InvokeInst>(Caller)) {
5626 NewCall = Builder.CreateInvoke(Callee, II->getNormalDest(),
5627 II->getUnwindDest(), Args, OpBundles);
5628 } else {
5629 NewCall = Builder.CreateCall(Callee, Args, OpBundles);
5630 cast<CallInst>(NewCall)->setTailCallKind(
5631 cast<CallInst>(Caller)->getTailCallKind());
5632 }
5633 NewCall->takeName(Caller);
5635 NewCall->setAttributes(NewCallerPAL);
5636
5637 // Preserve prof metadata if any.
5638 NewCall->copyMetadata(*Caller, {LLVMContext::MD_prof});
5639
5640 // Insert a cast of the return type as necessary.
5641 Instruction *NC = NewCall;
5642 Value *NV = NC;
5643 if (OldRetTy != NV->getType() && !Caller->use_empty()) {
5644 assert(!NV->getType()->isVoidTy());
5646 NC->setDebugLoc(Caller->getDebugLoc());
5647
5648 auto OptInsertPt = NewCall->getInsertionPointAfterDef();
5649 assert(OptInsertPt && "No place to insert cast");
5650 InsertNewInstBefore(NC, *OptInsertPt);
5651 Worklist.pushUsersToWorkList(*Caller);
5652 }
5653
5654 if (!Caller->use_empty())
5655 replaceInstUsesWith(*Caller, NV);
5656 else if (Caller->hasValueHandle()) {
5657 if (OldRetTy == NV->getType())
5659 else
5660 // We cannot call ValueIsRAUWd with a different type, and the
5661 // actual tracked value will disappear.
5663 }
5664
5665 eraseInstFromFunction(*Caller);
5666 return true;
5667}
5668
5669/// Turn a call to a function created by init_trampoline / adjust_trampoline
5670/// intrinsic pair into a direct call to the underlying function.
5672InstCombinerImpl::transformCallThroughTrampoline(CallBase &Call,
5673 IntrinsicInst &Tramp) {
5674 FunctionType *FTy = Call.getFunctionType();
5675 AttributeList Attrs = Call.getAttributes();
5676
5677 // If the call already has the 'nest' attribute somewhere then give up -
5678 // otherwise 'nest' would occur twice after splicing in the chain.
5679 if (Attrs.hasAttrSomewhere(Attribute::Nest))
5680 return nullptr;
5681
5683 FunctionType *NestFTy = NestF->getFunctionType();
5684
5685 AttributeList NestAttrs = NestF->getAttributes();
5686 if (!NestAttrs.isEmpty()) {
5687 unsigned NestArgNo = 0;
5688 Type *NestTy = nullptr;
5689 AttributeSet NestAttr;
5690
5691 // Look for a parameter marked with the 'nest' attribute.
5692 for (FunctionType::param_iterator I = NestFTy->param_begin(),
5693 E = NestFTy->param_end();
5694 I != E; ++NestArgNo, ++I) {
5695 AttributeSet AS = NestAttrs.getParamAttrs(NestArgNo);
5696 if (AS.hasAttribute(Attribute::Nest)) {
5697 // Record the parameter type and any other attributes.
5698 NestTy = *I;
5699 NestAttr = AS;
5700 break;
5701 }
5702 }
5703
5704 if (NestTy) {
5705 std::vector<Value*> NewArgs;
5706 std::vector<AttributeSet> NewArgAttrs;
5707 NewArgs.reserve(Call.arg_size() + 1);
5708 NewArgAttrs.reserve(Call.arg_size());
5709
5710 // Insert the nest argument into the call argument list, which may
5711 // mean appending it. Likewise for attributes.
5712
5713 {
5714 unsigned ArgNo = 0;
5715 auto I = Call.arg_begin(), E = Call.arg_end();
5716 do {
5717 if (ArgNo == NestArgNo) {
5718 // Add the chain argument and attributes.
5719 Value *NestVal = Tramp.getArgOperand(2);
5720 if (NestVal->getType() != NestTy)
5721 NestVal = Builder.CreateBitCast(NestVal, NestTy, "nest");
5722 NewArgs.push_back(NestVal);
5723 NewArgAttrs.push_back(NestAttr);
5724 }
5725
5726 if (I == E)
5727 break;
5728
5729 // Add the original argument and attributes.
5730 NewArgs.push_back(*I);
5731 NewArgAttrs.push_back(Attrs.getParamAttrs(ArgNo));
5732
5733 ++ArgNo;
5734 ++I;
5735 } while (true);
5736 }
5737
5738 // The trampoline may have been bitcast to a bogus type (FTy).
5739 // Handle this by synthesizing a new function type, equal to FTy
5740 // with the chain parameter inserted.
5741
5742 std::vector<Type*> NewTypes;
5743 NewTypes.reserve(FTy->getNumParams()+1);
5744
5745 // Insert the chain's type into the list of parameter types, which may
5746 // mean appending it.
5747 {
5748 unsigned ArgNo = 0;
5749 FunctionType::param_iterator I = FTy->param_begin(),
5750 E = FTy->param_end();
5751
5752 do {
5753 if (ArgNo == NestArgNo)
5754 // Add the chain's type.
5755 NewTypes.push_back(NestTy);
5756
5757 if (I == E)
5758 break;
5759
5760 // Add the original type.
5761 NewTypes.push_back(*I);
5762
5763 ++ArgNo;
5764 ++I;
5765 } while (true);
5766 }
5767
5768 // Replace the trampoline call with a direct call. Let the generic
5769 // code sort out any function type mismatches.
5770 FunctionType *NewFTy =
5771 FunctionType::get(FTy->getReturnType(), NewTypes, FTy->isVarArg());
5772 AttributeList NewPAL =
5773 AttributeList::get(FTy->getContext(), Attrs.getFnAttrs(),
5774 Attrs.getRetAttrs(), NewArgAttrs);
5775
5777 Call.getOperandBundlesAsDefs(OpBundles);
5778
5779 Instruction *NewCaller;
5780 if (InvokeInst *II = dyn_cast<InvokeInst>(&Call)) {
5781 NewCaller = InvokeInst::Create(NewFTy, NestF, II->getNormalDest(),
5782 II->getUnwindDest(), NewArgs, OpBundles);
5783 cast<InvokeInst>(NewCaller)->setCallingConv(II->getCallingConv());
5784 cast<InvokeInst>(NewCaller)->setAttributes(NewPAL);
5785 } else if (CallBrInst *CBI = dyn_cast<CallBrInst>(&Call)) {
5786 NewCaller =
5787 CallBrInst::Create(NewFTy, NestF, CBI->getDefaultDest(),
5788 CBI->getIndirectDests(), NewArgs, OpBundles);
5789 cast<CallBrInst>(NewCaller)->setCallingConv(CBI->getCallingConv());
5790 cast<CallBrInst>(NewCaller)->setAttributes(NewPAL);
5791 } else {
5792 NewCaller = CallInst::Create(NewFTy, NestF, NewArgs, OpBundles);
5793 cast<CallInst>(NewCaller)->setTailCallKind(
5794 cast<CallInst>(Call).getTailCallKind());
5795 cast<CallInst>(NewCaller)->setCallingConv(
5796 cast<CallInst>(Call).getCallingConv());
5797 cast<CallInst>(NewCaller)->setAttributes(NewPAL);
5798 }
5799 NewCaller->setDebugLoc(Call.getDebugLoc());
5800
5801 return NewCaller;
5802 }
5803 }
5804
5805 // Replace the trampoline call with a direct call. Since there is no 'nest'
5806 // parameter, there is no need to adjust the argument list. Let the generic
5807 // code sort out any function type mismatches.
5808 Call.setCalledFunction(FTy, NestF);
5809 return &Call;
5810}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
uint64_t uint64_t
AMDGPU Register Bank Select
This file declares a class to represent arbitrary precision floating point values and provide a varie...
This file implements a class to represent arbitrary precision integral constant values and operations...
This file implements the APSInt class, which is a simple class that represents an arbitrary sized int...
@ Scaled
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static cl::opt< ITMode > IT(cl::desc("IT block support"), cl::Hidden, cl::init(DefaultIT), cl::values(clEnumValN(DefaultIT, "arm-default-it", "Generate any type of IT block"), clEnumValN(RestrictedIT, "arm-restrict-it", "Disallow complex IT blocks")))
Atomic ordering constants.
This file contains the simple types necessary to represent the attributes associated with functions a...
#define X(NUM, ENUM, NAME)
Definition ELF.h:665
BitTracker BT
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 GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
static SDValue foldBitOrderCrossLogicOp(SDNode *N, SelectionDAG &DAG)
#define Check(C,...)
#define DEBUG_TYPE
Hexagon Common GEP
#define _
IRTranslator LLVM IR MI
static Type * getPromotedType(Type *Ty)
Return the specified type promoted as it would be to pass though a va_arg area.
static Instruction * createOverflowTuple(IntrinsicInst *II, Value *Result, Constant *Overflow)
Creates a result tuple for an overflow intrinsic II with a given Result and a constant Overflow value...
static void referenceAspect(StringRef Aspect, StringRef ImplName, Module *M, IRBuilderBase &B)
static bool inputDenormalIsIEEE(const Function &F, const Type *Ty)
static IntrinsicInst * findInitTrampolineFromAlloca(Value *TrampMem)
static bool removeTriviallyEmptyRange(IntrinsicInst &EndI, InstCombinerImpl &IC, std::function< bool(const IntrinsicInst &)> IsStart)
static bool inputDenormalIsDAZ(const Function &F, const Type *Ty)
static Instruction * reassociateMinMaxWithConstantInOperand(IntrinsicInst *II, InstCombiner::BuilderTy &Builder)
If this min/max has a matching min/max operand with a constant, try to push the constant operand into...
static bool isIdempotentBinaryIntrinsic(Intrinsic::ID IID)
Helper to match idempotent binary intrinsics, namely, intrinsics where f(f(x, y), y) == f(x,...
static bool signBitMustBeTheSame(Value *Op0, Value *Op1, const SimplifyQuery &SQ)
Return true if two values Op0 and Op1 are known to have the same sign.
static Value * optimizeModularFormat(CallInst *CI, IRBuilderBase &B)
static Instruction * moveAddAfterMinMax(IntrinsicInst *II, InstCombiner::BuilderTy &Builder)
Try to canonicalize min/max(X + C0, C1) as min/max(X, C1 - C0) + C0.
static Instruction * simplifyInvariantGroupIntrinsic(IntrinsicInst &II, InstCombinerImpl &IC)
This function transforms launder.invariant.group like: launder(launder(x)) -> launder(x) (the result ...
static bool haveSameOperands(const IntrinsicInst &I, const IntrinsicInst &E, unsigned NumOperands)
static std::optional< bool > getKnownSign(Value *Op, const SimplifyQuery &SQ)
static bool hasUndefSource(AnyMemTransferInst *MI)
Recognize a memcpy/memmove from a trivially otherwise unused alloca.
static Instruction * factorizeMinMaxTree(IntrinsicInst *II)
Reduce a sequence of min/max intrinsics with a common operand.
static Instruction * foldClampRangeOfTwo(IntrinsicInst *II, InstCombiner::BuilderTy &Builder)
If we have a clamp pattern like max (min X, 42), 41 – where the output can only be one of two possibl...
static Value * simplifyReductionOperand(Value *Arg, bool CanReorderLanes)
static IntrinsicInst * findInitTrampolineFromBB(IntrinsicInst *AdjustTramp, Value *TrampMem)
static bool isAspectNeeded(StringRef Aspect, CallInst *CI, std::optional< unsigned > FirstArgIdx, const std::optional< Bitset< 256 > > &Specifiers)
static Value * foldIntrinsicUsingDistributiveLaws(IntrinsicInst *II, InstCombiner::BuilderTy &Builder)
static std::optional< bool > getKnownSignOrZero(Value *Op, const SimplifyQuery &SQ)
static Value * foldMinimumOverTrailingOrLeadingZeroCount(Value *I0, Value *I1, const DataLayout &DL, InstCombiner::BuilderTy &Builder)
Fold an unsigned minimum of trailing or leading zero bits counts: umin(cttz(CtOp1,...
static bool rightDistributesOverLeft(Instruction::BinaryOps LOp, bool HasNUW, bool HasNSW, Intrinsic::ID ROp)
Return whether "(X ROp Y) LOp Z" is always equal to "(X LOp Z) ROp (Y LOp Z)".
static Value * foldIdempotentBinaryIntrinsicRecurrence(InstCombinerImpl &IC, IntrinsicInst *II)
Attempt to simplify value-accumulating recurrences of kind: umax.acc = phi i8 [ umax,...
static bool ldexpSaturatingAddIsSafe(Type *FpTy, Type *ExpTy)
static Instruction * foldCtpop(IntrinsicInst &II, InstCombinerImpl &IC)
static Instruction * simplifyNeonTbl(IntrinsicInst &II, InstCombiner &IC, bool IsExtension)
Convert tbl/tbx intrinsics to shufflevector if the mask is constant, and at most two source operands ...
static Instruction * foldCttzCtlz(IntrinsicInst &II, InstCombinerImpl &IC)
static IntrinsicInst * findInitTrampoline(Value *Callee)
static Value * foldCmpIntrinsicOfExtended(IntrinsicInst *II, InstCombiner::BuilderTy &Builder, const DataLayout &DL)
Fold an scmp/ucmp intrinsic whose operands are extended from a narrower type: scmp (sext X),...
static Bitset< 256 > parseFormatStringSpecifiers(StringRef FormatStr)
static FCmpInst::Predicate fpclassTestIsFCmp0(FPClassTest Mask, const Function &F, Type *Ty)
static bool leftDistributesOverRight(Instruction::BinaryOps LOp, bool HasNUW, bool HasNSW, Intrinsic::ID ROp)
Return whether "X LOp (Y ROp Z)" is always equal to "(X LOp Y) ROp (X LOp Z)".
static Value * reassociateMinMaxWithConstants(IntrinsicInst *II, IRBuilderBase &Builder, const SimplifyQuery &SQ)
If this min/max has a constant operand and an operand that is a matching min/max with a constant oper...
static Value * foldSinAndCosToSinCos(IntrinsicInst *II, IRBuilderBase &B, InstCombinerImpl &IC)
static bool mayFlushDenormalsToPositiveZero(const CallInst *CI)
Flushing a denormal to +0.0 breaks f(-x) = -f(x) for odd f.
static CallInst * canonicalizeConstantArg0ToArg1(CallInst &Call)
static Instruction * foldNeonShift(IntrinsicInst *II, InstCombinerImpl &IC)
This file provides internal interfaces used to implement the InstCombine.
This file provides the interface for the instcombine pass implementation.
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
static const Function * getCalledFunction(const Value *V)
This file contains the declarations for metadata subclasses.
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
uint64_t IntrinsicInst * II
if(auto Err=PB.parsePassPipeline(MPM, Passes)) return wrap(std MPM run * Mod
This file contains the declarations for profiling metadata utility functions.
SmallVector< MachineOperand, 4 > Cond
int64_t C1
int64_t C0
static cl::opt< RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode > Mode("regalloc-enable-advisor", cl::Hidden, cl::init(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Default), cl::desc("Enable regalloc advisor mode"), cl::values(clEnumValN(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Default, "default", "Default"), clEnumValN(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Release, "release", "precompiled"), clEnumValN(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Development, "development", "for training")))
This file implements the SmallBitVector class.
This file defines the SmallVector class.
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
Definition Statistic.h:171
This file contains some functions that are useful when dealing with strings.
#define LLVM_DEBUG(...)
Definition Debug.h:119
#define DEBUG_WITH_TYPE(TYPE,...)
DEBUG_WITH_TYPE macro - This macro should be used by passes to emit debug information.
Definition Debug.h:72
static TableGen::Emitter::Opt Y("gen-skeleton-entry", EmitSkeleton, "Generate example skeleton entry")
Value * RHS
Value * LHS
The Input class is used to parse a yaml document into in-memory structs and vectors.
bool AllowEphemerals
Whether ephemeral values should be allowed when checking assumes.
static LLVM_ABI bool semanticsHasInf(const fltSemantics &)
Definition APFloat.cpp:367
static constexpr roundingMode rmNearestTiesToEven
Definition APFloat.h:361
static LLVM_ABI bool hasSignBitInMSB(const fltSemantics &)
Definition APFloat.cpp:380
bool isNegative() const
Definition APFloat.h:1583
void clearSign()
Definition APFloat.h:1402
static APFloat getOne(const fltSemantics &Sem, bool Negative=false)
Factory for Positive and Negative One.
Definition APFloat.h:1192
bool isZero() const
Definition APFloat.h:1579
static APFloat getLargest(const fltSemantics &Sem, bool Negative=false)
Returns the largest finite number in the given semantics.
Definition APFloat.h:1242
static APFloat getSmallest(const fltSemantics &Sem, bool Negative=false)
Returns the smallest (by magnitude) finite number in the given semantics.
Definition APFloat.h:1252
bool isInfinity() const
Definition APFloat.h:1580
Class for arbitrary precision integers.
Definition APInt.h:78
static APInt getAllOnes(unsigned numBits)
Return an APInt of a specified width with all bits set.
Definition APInt.h:230
static APInt getSignMask(unsigned BitWidth)
Get the SignMask for a specific bit width.
Definition APInt.h:225
bool sgt(const APInt &RHS) const
Signed greater than comparison.
Definition APInt.h:1205
bool ugt(const APInt &RHS) const
Unsigned greater than comparison.
Definition APInt.h:1186
bool isZero() const
Determine if this value is zero, i.e. all bits are clear.
Definition APInt.h:376
LLVM_ABI APInt urem(const APInt &RHS) const
Unsigned remainder operation.
Definition APInt.cpp:1695
unsigned getBitWidth() const
Return the number of bits in the APInt.
Definition APInt.h:1508
bool ult(const APInt &RHS) const
Unsigned less than comparison.
Definition APInt.h:1115
LLVM_ABI APInt sadd_ov(const APInt &RHS, bool &Overflow) const
Definition APInt.cpp:1966
static LLVM_ABI APInt getSplat(unsigned NewLen, const APInt &V)
Return a value containing V broadcasted over NewLen bits.
Definition APInt.cpp:648
static APInt getSignedMinValue(unsigned numBits)
Gets minimum signed value of APInt for a specific bit width.
Definition APInt.h:215
LLVM_ABI APInt sextOrTrunc(unsigned width) const
Sign extend or truncate to width.
Definition APInt.cpp:1086
bool isShiftedMask() const
Return true if this APInt value contains a non-empty sequence of ones with the remainder zero.
Definition APInt.h:506
LLVM_ABI APInt uadd_sat(const APInt &RHS) const
Definition APInt.cpp:2074
bool isNonNegative() const
Determine if this APInt Value is non-negative (>= 0)
Definition APInt.h:330
static APInt getLowBitsSet(unsigned numBits, unsigned loBitsSet)
Constructs an APInt value that has the bottom loBitsSet bits set.
Definition APInt.h:302
static APInt getZero(unsigned numBits)
Get the '0' value for the specified bit-width.
Definition APInt.h:196
std::optional< int64_t > trySExtValue() const
Get sign extended value if possible.
Definition APInt.h:1594
static APSInt getMinValue(uint32_t numBits, bool Unsigned)
Return the APSInt representing the minimum integer value with the given bit width and signedness.
Definition APSInt.h:310
static APSInt getMaxValue(uint32_t numBits, bool Unsigned)
Return the APSInt representing the maximum integer value with the given bit width and signedness.
Definition APSInt.h:302
@ NoAlias
The two locations do not alias at all.
This class represents any memset intrinsic.
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
ArrayRef< T > drop_front(size_t N=1) const
Drop the first N elements of the array.
Definition ArrayRef.h:194
size_t size() const
Get the array size.
Definition ArrayRef.h:141
bool empty() const
Check if the array is empty.
Definition ArrayRef.h:136
This class holds the attributes for a particular argument, parameter, function, or return value.
Definition Attributes.h:406
LLVM_ABI bool hasAttribute(Attribute::AttrKind Kind) const
Return true if the attribute exists in this set.
static LLVM_ABI AttributeSet get(LLVMContext &C, const AttrBuilder &B)
static LLVM_ABI Attribute get(LLVMContext &Context, AttrKind Kind, uint64_t Val=0)
Return a uniquified Attribute object.
static LLVM_ABI Attribute getWithDereferenceableBytes(LLVMContext &Context, uint64_t Bytes)
static LLVM_ABI Attribute getWithDereferenceableOrNullBytes(LLVMContext &Context, uint64_t Bytes)
LLVM_ABI StringRef getValueAsString() const
Return the attribute's value as a string.
static LLVM_ABI Attribute getWithAlignment(LLVMContext &Context, Align Alignment)
Return a uniquified Attribute object that has the specific alignment set.
LLVM Basic Block Representation.
Definition BasicBlock.h:62
iterator begin()
Instruction iterator methods.
Definition BasicBlock.h:440
InstListType::reverse_iterator reverse_iterator
Definition BasicBlock.h:172
InstListType::iterator iterator
Instruction iterators...
Definition BasicBlock.h:170
LLVM_ABI bool isSigned() const
Whether the intrinsic is signed or unsigned.
LLVM_ABI Instruction::BinaryOps getBinaryOp() const
Returns the binary operation underlying the intrinsic.
static BinaryOperator * CreateFAddFMF(Value *V1, Value *V2, FastMathFlags FMF, const Twine &Name="")
Definition InstrTypes.h:271
static LLVM_ABI BinaryOperator * CreateNeg(Value *Op, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Helper functions to construct and inspect unary operations (NEG and NOT) via binary operators SUB and...
static BinaryOperator * CreateNSW(BinaryOps Opc, Value *V1, Value *V2, const Twine &Name="")
Definition InstrTypes.h:314
static LLVM_ABI BinaryOperator * CreateNot(Value *Op, const Twine &Name="", InsertPosition InsertBefore=nullptr)
static LLVM_ABI BinaryOperator * Create(BinaryOps Op, Value *S1, Value *S2, const Twine &Name=Twine(), InsertPosition InsertBefore=nullptr)
Construct a binary instruction, given the opcode and the two operands.
static BinaryOperator * CreateNUW(BinaryOps Opc, Value *V1, Value *V2, const Twine &Name="")
Definition InstrTypes.h:329
static BinaryOperator * CreateFMulFMF(Value *V1, Value *V2, FastMathFlags FMF, const Twine &Name="")
Definition InstrTypes.h:279
static BinaryOperator * CreateFDivFMF(Value *V1, Value *V2, FastMathFlags FMF, const Twine &Name="")
Definition InstrTypes.h:283
static BinaryOperator * CreateFSubFMF(Value *V1, Value *V2, FastMathFlags FMF, const Twine &Name="")
Definition InstrTypes.h:275
static LLVM_ABI BinaryOperator * CreateNSWNeg(Value *Op, const Twine &Name="", InsertPosition InsertBefore=nullptr)
This is a constexpr reimplementation of a subset of std::bitset.
Definition Bitset.h:30
constexpr bool any() const
Definition Bitset.h:113
constexpr Bitset & set()
Definition Bitset.h:81
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
void setCallingConv(CallingConv::ID CC)
void setDoesNotThrow()
MaybeAlign getRetAlign() const
Extract the alignment of the return value.
LLVM_ABI void getOperandBundlesAsDefs(SmallVectorImpl< OperandBundleDef > &Defs) const
Return the list of operand bundles attached to this instruction as a vector of OperandBundleDefs.
OperandBundleUse getOperandBundleAt(unsigned Index) const
Return the operand bundle at a specific index.
std::optional< OperandBundleUse > getOperandBundle(StringRef Name) const
Return an operand bundle by name, if present.
Function * getCalledFunction() const
Returns the function called, or null if this is an indirect function invocation or the function signa...
bool isInAllocaArgument(unsigned ArgNo) const
Determine whether this argument is passed in an alloca.
bool hasFnAttr(Attribute::AttrKind Kind) const
Determine whether this call has the given attribute.
bool hasRetAttr(Attribute::AttrKind Kind) const
Determine whether the return value has the given attribute.
unsigned getNumOperandBundles() const
Return the number of operand bundles associated with this User.
uint64_t getParamDereferenceableBytes(unsigned i) const
Extract the number of dereferenceable bytes for a call or parameter (0=unknown).
CallingConv::ID getCallingConv() const
LLVM_ABI bool paramHasAttr(unsigned ArgNo, Attribute::AttrKind Kind) const
Determine whether the argument or parameter has the given attribute.
User::op_iterator arg_begin()
Return the iterator pointing to the beginning of the argument list.
LLVM_ABI bool isIndirectCall() const
Return true if the callsite is an indirect call.
static LLVM_ABI CallBase * removeOperandBundleAt(CallBase *CB, size_t Offset, InsertPosition InsertPtr=nullptr)
void setNotConvergent()
Value * getCalledOperand() const
void setAttributes(AttributeList A)
Set the attributes for this call.
Attribute getFnAttr(StringRef Kind) const
Get the attribute of a given kind for the function.
bool doesNotThrow() const
Determine if the call cannot unwind.
void addRetAttr(Attribute::AttrKind Kind)
Adds the attribute to the return value.
Value * getArgOperand(unsigned i) const
User::op_iterator arg_end()
Return the iterator pointing to the end of the argument list.
bool isConvergent() const
Determine if the invoke is convergent.
FunctionType * getFunctionType() const
LLVM_ABI Intrinsic::ID getIntrinsicID() const
Returns the intrinsic ID of the intrinsic called or Intrinsic::not_intrinsic if the called function i...
Value * getReturnedArgOperand() const
If one of the arguments has the 'returned' attribute, returns its operand value.
static LLVM_ABI CallBase * Create(CallBase *CB, ArrayRef< OperandBundleDef > Bundles, InsertPosition InsertPt=nullptr)
Create a clone of CB with a different set of operand bundles and insert it before InsertPt.
iterator_range< User::op_iterator > args()
Iteration adapter for range-for loops.
void setCalledOperand(Value *V)
static LLVM_ABI CallBase * removeOperandBundle(CallBase *CB, uint32_t ID, InsertPosition InsertPt=nullptr)
Create a clone of CB with operand bundle ID removed.
unsigned arg_size() const
AttributeList getAttributes() const
Return the attributes for this call.
void setCalledFunction(Function *Fn)
Sets the function called, including updating the function type.
LLVM_ABI Function * getCaller()
Helper to get the caller (the parent function).
CallBr instruction, tracking function calls that may not return control but instead transfer it to a ...
static CallBrInst * Create(FunctionType *Ty, Value *Func, BasicBlock *DefaultDest, ArrayRef< BasicBlock * > IndirectDests, ArrayRef< Value * > Args, const Twine &NameStr, InsertPosition InsertBefore=nullptr)
This class represents a function call, abstracting a target machine's calling convention.
bool isNoTailCall() const
static CallInst * Create(FunctionType *Ty, Value *F, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
bool isMustTailCall() const
static LLVM_ABI Instruction::CastOps getCastOpcode(const Value *Val, bool SrcIsSigned, Type *Ty, bool DstIsSigned)
Returns the opcode necessary to cast Val into Ty using usual casting rules.
static LLVM_ABI CastInst * CreateIntegerCast(Value *S, Type *Ty, bool isSigned, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Create a ZExt, BitCast, or Trunc for int -> int casts.
static LLVM_ABI bool isBitOrNoopPointerCastable(Type *SrcTy, Type *DestTy, const DataLayout &DL)
Check whether a bitcast, inttoptr, or ptrtoint cast between these types is valid and a no-op.
static LLVM_ABI CastInst * CreateBitOrPointerCast(Value *S, Type *Ty, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Create a BitCast, a PtrToInt, or an IntToPTr cast instruction.
static LLVM_ABI CastInst * Create(Instruction::CastOps, Value *S, Type *Ty, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Provides a way to construct any of the CastInst subclasses using an opcode instead of the subclass's ...
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
Definition InstrTypes.h:740
@ FCMP_OEQ
0 0 0 1 True if ordered and equal
Definition InstrTypes.h:743
@ ICMP_SLT
signed less than
Definition InstrTypes.h:769
@ ICMP_SLE
signed less or equal
Definition InstrTypes.h:770
@ FCMP_OLT
0 1 0 0 True if ordered and less than
Definition InstrTypes.h:746
@ FCMP_OGT
0 0 1 0 True if ordered and greater than
Definition InstrTypes.h:744
@ FCMP_OGE
0 0 1 1 True if ordered and greater than or equal
Definition InstrTypes.h:745
@ ICMP_UGT
unsigned greater than
Definition InstrTypes.h:763
@ ICMP_SGT
signed greater than
Definition InstrTypes.h:767
@ FCMP_ONE
0 1 1 0 True if ordered and operands are unequal
Definition InstrTypes.h:748
@ FCMP_UEQ
1 0 0 1 True if unordered or equal
Definition InstrTypes.h:751
@ ICMP_ULT
unsigned less than
Definition InstrTypes.h:765
@ FCMP_OLE
0 1 0 1 True if ordered and less than or equal
Definition InstrTypes.h:747
@ ICMP_NE
not equal
Definition InstrTypes.h:762
@ FCMP_UNE
1 1 1 0 True if unordered or not equal
Definition InstrTypes.h:756
@ ICMP_ULE
unsigned less or equal
Definition InstrTypes.h:766
Predicate getSwappedPredicate() const
For example, EQ->EQ, SLE->SGE, ULT->UGT, OEQ->OEQ, ULE->UGE, OLT->OGT, etc.
Definition InstrTypes.h:890
Predicate getNonStrictPredicate() const
For example, SGT -> SGE, SLT -> SLE, ULT -> ULE, UGT -> UGE.
Definition InstrTypes.h:934
Predicate getUnorderedPredicate() const
Definition InstrTypes.h:874
static LLVM_ABI ConstantAggregateZero * get(Type *Ty)
static LLVM_ABI Constant * getPointerCast(Constant *C, Type *Ty)
Create a BitCast, AddrSpaceCast, or a PtrToInt cast constant expression.
static LLVM_ABI Constant * getSub(Constant *C1, Constant *C2, bool HasNUW=false, bool HasNSW=false)
static LLVM_ABI Constant * getNeg(Constant *C, bool HasNSW=false)
ConstantFP - Floating Point Values [float, double].
Definition Constants.h:420
static LLVM_ABI ConstantFP * getZero(Type *Ty, bool Negative=false)
static LLVM_ABI ConstantFP * getInfinity(Type *Ty, bool Negative=false)
This is the shared class of boolean and integer constants.
Definition Constants.h:87
uint64_t getLimitedValue(uint64_t Limit=~0ULL) const
getLimitedValue - If the value is smaller than the specified limit, return it, otherwise return the l...
Definition Constants.h:269
static LLVM_ABI ConstantInt * getTrue(LLVMContext &Context)
static LLVM_ABI ConstantInt * getFalse(LLVMContext &Context)
uint64_t getZExtValue() const
Return the constant as a 64-bit unsigned integer value after it has been zero extended as appropriate...
Definition Constants.h:168
const APInt & getValue() const
Return the constant as an APInt value reference.
Definition Constants.h:159
static LLVM_ABI ConstantInt * getBool(LLVMContext &Context, bool V)
static LLVM_ABI ConstantPointerNull * get(PointerType *T)
Static factory methods - Return objects of the specified value.
static LLVM_ABI ConstantPtrAuth * get(Constant *Ptr, ConstantInt *Key, ConstantInt *Disc, Constant *AddrDisc, Constant *DeactivationSymbol)
Return a pointer signed with the specified parameters.
This class represents a range of values.
LLVM_ABI ConstantRange zextOrTrunc(uint32_t BitWidth) const
Make this range have the bit width given by BitWidth.
LLVM_ABI bool isFullSet() const
Return true if this set contains all of the elements possible for this data-type.
LLVM_ABI bool icmp(CmpInst::Predicate Pred, const ConstantRange &Other) const
Does the predicate Pred hold between ranges this and Other?
LLVM_ABI ConstantRange multiply(const ConstantRange &Other, unsigned NoWrapKind=0) const
Return a new range representing the possible values resulting from a multiplication of a value in thi...
LLVM_ABI bool contains(const APInt &Val) const
Return true if the specified value is in the set.
uint32_t getBitWidth() const
Get the bit width of this ConstantRange.
static LLVM_ABI Constant * get(StructType *T, ArrayRef< Constant * > V)
This is an important base class in LLVM.
Definition Constant.h:44
static LLVM_ABI Constant * getIntegerValue(Type *Ty, const APInt &V)
Return the value for an integer or pointer constant, or a vector thereof, with the given scalar value...
static LLVM_ABI Constant * getAllOnesValue(Type *Ty)
static LLVM_ABI Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
Record of a variable value-assignment, aka a non instruction representation of the dbg....
bool contains(const_arg_type_t< KeyT > Val) const
Return true if the specified key is in the map, false otherwise.
Definition DenseMap.h:757
size_type count(const_arg_type_t< KeyT > Val) const
Return 1 if the specified key is in the map, 0 otherwise.
Definition DenseMap.h:762
unsigned size() const
Definition DenseMap.h:717
std::pair< iterator, bool > try_emplace(KeyT &&Key, Ts &&...Args)
Definition DenseMap.h:856
LLVM_ABI bool dominates(const BasicBlock *BB, const Use &U) const
Return true if the (end of the) basic block BB dominates the use U.
Lightweight error class with error context and mandatory checking.
Definition Error.h:159
static FMFSource intersect(Value *A, Value *B)
Intersect the FMF from two instructions.
Definition IRBuilder.h:104
This class represents an extension of floating point types.
Convenience struct for specifying and reasoning about fast-math flags.
Definition FMF.h:23
bool allowReassoc() const
Flag queries.
Definition FMF.h:64
An instruction for ordering other memory operations.
SyncScope::ID getSyncScopeID() const
Returns the synchronization scope ID of this fence instruction.
AtomicOrdering getOrdering() const
Returns the ordering constraint of this fence instruction.
A handy container for a FunctionType+Callee-pointer pair, which can be passed around as a single enti...
Type::subtype_iterator param_iterator
static LLVM_ABI FunctionType * get(Type *Result, ArrayRef< Type * > Params, bool isVarArg)
This static method is the primary way of constructing a FunctionType.
bool isConvergent() const
Determine if the call is convergent.
Definition Function.h:593
FunctionType * getFunctionType() const
Returns the FunctionType for me.
Definition Function.h:212
CallingConv::ID getCallingConv() const
getCallingConv()/setCallingConv(CC) - These method get and set the calling convention of this functio...
Definition Function.h:273
AttributeList getAttributes() const
Return the attribute list for this Function.
Definition Function.h:329
bool doesNotThrow() const
Determine if the function cannot unwind.
Definition Function.h:577
bool isIntrinsic() const
isIntrinsic - Returns true if the function's name starts with "llvm.".
Definition Function.h:252
DenormalMode getDenormalMode(const fltSemantics &FPType) const
Returns the denormal handling type for the default rounding mode of the function.
Definition Function.cpp:807
LLVM_ABI Value * getBasePtr() const
unsigned getBasePtrIndex() const
The index into the associate statepoint's argument list which contains the base pointer of the pointe...
LLVM_ABI Value * getDerivedPtr() const
unsigned getDerivedPtrIndex() const
The index into the associate statepoint's argument list which contains the pointer whose relocation t...
std::vector< const GCRelocateInst * > getGCRelocates() const
Get list of all gc reloactes linked to this statepoint May contain several relocations for the same b...
Definition Statepoint.h:206
MDNode * getMetadata(unsigned KindID) const
Get the metadata of given kind attached to this GlobalObject.
LLVM_ABI bool isDeclaration() const
Return true if the primary definition of this global value is outside of the current translation unit...
Definition Globals.cpp:408
PointerType * getType() const
Global values are always pointers.
Common base class shared among various IRBuilders.
Definition IRBuilder.h:111
Value * CreateAddrSpaceCast(Value *V, Type *DestTy, const Twine &Name="", bool IsNonNull=false)
Definition IRBuilder.h:2248
LLVM_ABI Value * CreateLaunderInvariantGroup(Value *Ptr)
Create a launder.invariant.group intrinsic call.
ConstantInt * getTrue()
Get the constant value for i1 true.
Definition IRBuilder.h:445
LLVM_ABI Value * CreateBinaryIntrinsic(Intrinsic::ID ID, Value *LHS, Value *RHS, FMFSource FMFSource={}, const Twine &Name="")
Create a call to intrinsic ID with 2 operands which is mangled on the first type.
Value * CreateSub(Value *LHS, Value *RHS, const Twine &Name="", bool HasNUW=false, bool HasNSW=false)
Definition IRBuilder.h:1435
Value * CreateZExt(Value *V, Type *DestTy, const Twine &Name="", bool IsNonNeg=false)
Definition IRBuilder.h:2121
Value * CreateShuffleVector(Value *V1, Value *V2, Value *Mask, const Twine &Name="")
Definition IRBuilder.h:2691
LLVM_ABI Value * CreateIntrinsic(Intrinsic::ID ID, ArrayRef< Type * > OverloadTypes, ArrayRef< Value * > Args, FMFSource FMFSource={}, const Twine &Name="", ArrayRef< OperandBundleDef > OpBundles={}, function_ref< void(CallInst *)> SetFn=[](CallInst *) {})
Variant to create a possibly constant-folded intrinsic.
ConstantInt * getFalse()
Get the constant value for i1 false.
Definition IRBuilder.h:450
Value * CreateICmp(CmpInst::Predicate P, Value *LHS, Value *RHS, const Twine &Name="")
Definition IRBuilder.h:2492
LLVM_ABI Value * CreateUnaryIntrinsic(Intrinsic::ID ID, Value *Op, FMFSource FMFSource={}, const Twine &Name="")
Create a call to intrinsic ID with 1 operand which is mangled on its type.
static InsertValueInst * Create(Value *Agg, Value *Val, ArrayRef< unsigned > Idxs, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
Instruction * foldOpIntoPhi(Instruction &I, PHINode *PN, bool AllowMultipleUses=false)
Given a binary operator, cast instruction, or select which has a PHI node as operand #0,...
Value * SimplifyDemandedVectorElts(Value *V, APInt DemandedElts, APInt &PoisonElts, unsigned Depth=0, bool AllowMultipleUsers=false) override
The specified value produces a vector with any number of elements.
bool matchCommonBinOpOperands(Value *Op0, Value *Op1, CmpInst::Predicate Pred, Value *&LHS, Value *&RHS, const SimplifyQuery &Q)
Match Op0 Pred Op1 on binops with a removable common operand.
bool SimplifyDemandedBits(Instruction *I, unsigned Op, const APInt &DemandedMask, KnownBits &Known, const SimplifyQuery &Q, unsigned Depth=0) override
This form of SimplifyDemandedBits simplifies the specified instruction operand if possible,...
Instruction * FoldOpIntoSelect(Instruction &Op, SelectInst *SI, bool FoldWithMultiUse=false, bool SimplifyBothArms=false)
Given an instruction with a select as one operand and a constant as the other operand,...
Instruction * SimplifyAnyMemSet(AnyMemSetInst *MI)
Instruction * foldItoFPtoI(FPToIntTy &FI)
fpto{s/u}i.sat --> X or zext(X) or sext(X) or trunc(X) This is safe if the intermediate type has enou...
Instruction * visitFree(CallInst &FI, Value *FreedOp)
Instruction * visitCallBrInst(CallBrInst &CBI)
OverflowResult computeOverflow(Instruction::BinaryOps BinaryOp, bool IsSigned, Value *LHS, Value *RHS, Instruction *CtxI) const
Instruction * eraseInstFromFunction(Instruction &I) override
Combiner aware instruction erasure.
Value * foldReversedIntrinsicOperands(IntrinsicInst *II)
If all arguments of the intrinsic are reverses, try to pull the reverse after the intrinsic.
const InstCombineCLOptions & CLOpts
Value * tryGetLog2(Value *Op, bool AssumeNonZero)
Instruction * visitFenceInst(FenceInst &FI)
Instruction * foldShuffledIntrinsicOperands(IntrinsicInst *II)
If all arguments of the intrinsic are unary shuffles with the same mask, try to shuffle after the int...
Instruction * visitInvokeInst(InvokeInst &II)
bool SimplifyDemandedInstructionBits(Instruction &Inst)
Tries to simplify operands to an integer instruction based on its demanded bits.
void CreateNonTerminatorUnreachable(Instruction *InsertAt)
Create and insert the idiom we use to indicate a block is unreachable without having to rewrite the C...
Instruction * visitVAEndInst(VAEndInst &I)
Instruction * matchBSwapOrBitReverse(Instruction &I, bool MatchBSwaps, bool MatchBitReversals)
Given an initial instruction, check to see if it is the root of a bswap/bitreverse idiom.
Constant * unshuffleConstant(ArrayRef< int > ShMask, Constant *C, VectorType *NewCTy)
Find a constant NewC that has property: shuffle(NewC, poison, ShMask) = C for lanes that select NewC.
Instruction * visitAllocSite(Instruction &FI)
Instruction * SimplifyAnyMemTransfer(AnyMemTransferInst *MI)
Instruction * visitCallInst(CallInst &CI)
CallInst simplification.
The core instruction combiner logic.
SimplifyQuery SQ
const DataLayout & getDataLayout() const
bool isFreeToInvert(Value *V, bool WillInvertAllUses, bool &DoesConsume)
Return true if the specified value is free to invert (apply ~ to).
DominatorTree & getDominatorTree() const
BlockFrequencyInfo * BFI
unsigned ComputeMaxSignificantBits(const Value *Op, const Instruction *CtxI=nullptr, unsigned Depth=0) const
bool isKnownToBeAPowerOfTwo(const Value *V, bool OrZero=false, const Instruction *CtxI=nullptr, unsigned Depth=0)
TargetLibraryInfo & TLI
Instruction * InsertNewInstBefore(Instruction *New, BasicBlock::iterator Old)
Inserts an instruction New before instruction Old.
Instruction * replaceInstUsesWith(Instruction &I, Value *V)
A combiner-aware RAUW-like routine.
void replaceUse(Use &U, Value *NewValue)
Replace use and add the previously used value to the worklist.
InstructionWorklist & Worklist
A worklist of the instructions that need to be simplified.
const DataLayout & DL
DomConditionCache DC
bool MaskedValueIsZero(const Value *V, const APInt &Mask, const Instruction *CtxI=nullptr, unsigned Depth=0) const
IRBuilder< TargetFolder, IRBuilderInstCombineInserter > BuilderTy
An IRBuilder that automatically inserts new instructions into the worklist.
LLVM_ABI std::optional< Instruction * > targetInstCombineIntrinsic(IntrinsicInst &II)
AssumptionCache & AC
Instruction * replaceOperand(Instruction &I, unsigned OpNum, Value *V)
Replace operand of instruction and add old operand to the worklist.
DominatorTree & DT
ProfileSummaryInfo * PSI
OptimizationRemarkEmitter & ORE
void computeKnownBits(const Value *V, KnownBits &Known, const Instruction *CtxI, unsigned Depth=0) const
Value * getFreelyInverted(Value *V, bool WillInvertAllUses, BuilderTy *Builder, bool &DoesConsume)
const SimplifyQuery & getSimplifyQuery() const
LLVM_ABI Instruction * clone() const
Create a copy of 'this' instruction that is identical in all ways except the following:
LLVM_ABI void setHasNoUnsignedWrap(bool b=true)
Set or clear the nuw flag on this instruction, which must be an operator which supports this flag.
LLVM_ABI bool mayWriteToMemory() const LLVM_READONLY
Return true if this instruction may modify memory.
LLVM_ABI void copyIRFlags(const Value *V, bool IncludeWrapFlags=true)
Convenience method to copy supported exact, fast-math, and (optionally) wrapping flags from V to this...
LLVM_ABI void setHasNoSignedWrap(bool b=true)
Set or clear the nsw flag on this instruction, which must be an operator which supports this flag.
const DebugLoc & getDebugLoc() const
Return the debug location for this node as a DebugLoc.
LLVM_ABI const Module * getModule() const
Return the module owning the function this instruction belongs to or nullptr it the function does not...
LLVM_ABI void setAAMetadata(const AAMDNodes &N)
Sets the AA metadata on this instruction from the AAMDNodes structure.
LLVM_ABI bool isCommutative() const LLVM_READONLY
Return true if the instruction is commutative:
LLVM_ABI void moveBefore(InstListType::iterator InsertPos)
Unlink this instruction from its current basic block and insert it into the basic block that MovePos ...
LLVM_ABI void setFastMathFlags(FastMathFlags FMF)
Convenience function for setting multiple fast-math flags on this instruction, which must be an opera...
LLVM_ABI const Function * getFunction() const
Return the function this instruction belongs to.
MDNode * getMetadata(unsigned KindID) const
Get the metadata of given kind attached to this Instruction.
bool isTerminator() const
iterator_range< user_iterator > users()
LLVM_ABI void setMetadata(unsigned KindID, MDNode *Node)
Set the metadata of the specified kind to the specified node.
LLVM_ABI FastMathFlags getFastMathFlags() const LLVM_READONLY
Convenience function for getting all the fast-math flags, which must be an operator which supports th...
LLVM_ABI std::optional< InstListType::iterator > getInsertionPointAfterDef()
Get the first insertion point at which the result of this instruction is defined.
LLVM_ABI bool isIdenticalTo(const Instruction *I) const LLVM_READONLY
Return true if the specified instruction is exactly identical to the current one.
void setDebugLoc(DebugLoc Loc)
Set the debug location information for this instruction.
LLVM_ABI void copyMetadata(const Instruction &SrcInst, ArrayRef< unsigned > WL=ArrayRef< unsigned >())
Copy metadata from SrcInst to this instruction.
Class to represent integer types.
static LLVM_ABI IntegerType * get(LLVMContext &C, unsigned NumBits)
This static method is the primary way of constructing an IntegerType.
Definition Type.cpp:338
A wrapper class for inspecting calls to intrinsic functions.
Intrinsic::ID getIntrinsicID() const
Return the intrinsic ID of this intrinsic.
Invoke instruction.
static InvokeInst * Create(FunctionType *Ty, Value *Func, BasicBlock *IfNormal, BasicBlock *IfException, ArrayRef< Value * > Args, const Twine &NameStr, InsertPosition InsertBefore=nullptr)
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:76
An instruction for reading from memory.
Metadata node.
Definition Metadata.h:1081
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Definition Metadata.h:1579
static LLVM_ABI MDNode * getMostGenericFPMath(MDNode *A, MDNode *B)
static LLVM_ABI MDString * get(LLVMContext &Context, StringRef Str)
Definition Metadata.cpp:597
static MemoryLocation getBeforeOrAfter(const Value *Ptr, const AAMDNodes &AATags=AAMDNodes())
Return a location that may access any location before or after Ptr, while remaining within the underl...
static LLVM_ABI MetadataAsValue * get(LLVMContext &Context, Metadata *MD)
Definition Metadata.cpp:107
static ICmpInst::Predicate getPredicate(Intrinsic::ID ID)
Returns the comparison predicate underlying the intrinsic.
ICmpInst::Predicate getPredicate() const
Returns the comparison predicate underlying the intrinsic.
bool isSigned() const
Whether the intrinsic is signed or unsigned.
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:68
StringRef getName() const
Get a short "name" for the module.
Definition Module.h:316
unsigned getOpcode() const
Return the opcode for this Instruction or ConstantExpr.
Definition Operator.h:43
Utility class for integer operators which may exhibit overflow - Add, Sub, Mul, and Shl.
Definition Operator.h:78
bool hasNoSignedWrap() const
Test whether this operation is known to never undergo signed overflow, aka the nsw property.
Definition Operator.h:113
bool hasNoUnsignedWrap() const
Test whether this operation is known to never undergo unsigned overflow, aka the nuw property.
Definition Operator.h:107
bool isCommutative() const
Return true if the instruction is commutative.
Definition Operator.h:130
static LLVM_ABI PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
Represents a saturating add/sub intrinsic.
This class represents the LLVM 'select' instruction.
static SelectInst * Create(Value *C, Value *S1, Value *S2, const Twine &NameStr="", InsertPosition InsertBefore=nullptr, const Instruction *MDFrom=nullptr)
This instruction constructs a fixed permutation of two input vectors.
AAQueryInfo that uses SimpleCaptureAnalysis.
This is a 'bitvector' (really, a variable-sized bit array), optimized for the case when the array is ...
SmallBitVector & set()
bool test(unsigned Idx) const
Returns true if bit Idx is set.
bool all() const
Returns true if all bits are set.
size_type size() const
size_type count(ConstPtrType Ptr) const
count - Return 1 if the specified pointer is in the set, 0 otherwise.
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
Definition SmallString.h:26
reference emplace_back(ArgTypes &&... Args)
void reserve(size_type N)
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
An instruction for storing to memory.
void setVolatile(bool V)
Specify whether this is a volatile store or not.
void setAlignment(Align Align)
void setOrdering(AtomicOrdering Ordering)
Sets the ordering constraint of this store instruction.
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
static constexpr size_t npos
Definition StringRef.h:58
bool getAsInteger(unsigned Radix, T &Result) const
Parse the current string as an integer of the specified radix.
Definition StringRef.h:490
constexpr size_t size() const
Get the string size.
Definition StringRef.h:144
LLVM_ABI size_t find_first_not_of(char C, size_t From=0) const
Find the first character in the string that is not C or npos if not found.
Class to represent struct types.
static LLVM_ABI bool isCallingConvCCompatible(CallBase *CI)
Returns true if call site / callee has cdecl-compatible calling conventions.
Provides information about what library functions are available for the current target.
This class represents a truncation of integer types.
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:46
LLVM_ABI unsigned getIntegerBitWidth() const
static LLVM_ABI IntegerType * getInt32Ty(LLVMContext &C)
Definition Type.cpp:299
bool isIntOrIntVectorTy() const
Return true if this is an integer type or a vector of integer types.
Definition Type.h:258
bool isPointerTy() const
True if this is an instance of PointerType.
Definition Type.h:277
LLVM_ABI bool canLosslesslyBitCastTo(Type *Ty) const
Return true if this type could be converted with a lossless BitCast to type 'Ty'.
Definition Type.cpp:143
Type * getScalarType() const
If this is a vector type, return the element type, otherwise return 'this'.
Definition Type.h:363
bool isStructTy() const
True if this is an instance of StructType.
Definition Type.h:271
LLVM_ABI TypeSize getPrimitiveSizeInBits() const LLVM_READONLY
Return the basic size of this type if it is a primitive type.
Definition Type.cpp:187
LLVM_ABI Type * getWithNewBitWidth(unsigned NewBitWidth) const
Given an integer or vector type, change the lane bitwidth to NewBitwidth, whilst keeping the old numb...
LLVM_ABI unsigned getScalarSizeInBits() const LLVM_READONLY
If this is a vector type, return the getPrimitiveSizeInBits value for the element type.
Definition Type.cpp:222
bool isIntegerTy() const
True if this is an instance of IntegerType.
Definition Type.h:252
LLVM_ABI const fltSemantics & getFltSemantics() const
Definition Type.cpp:96
bool isVoidTy() const
Return true if this is 'void'.
Definition Type.h:141
static UnaryOperator * CreateWithCopiedFlags(UnaryOps Opc, Value *V, Instruction *CopyO, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Definition InstrTypes.h:148
static UnaryOperator * CreateFNegFMF(Value *Op, Instruction *FMFSource, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Definition InstrTypes.h:156
static LLVM_ABI UndefValue * get(Type *T)
Static factory methods - Return an 'undef' object of the specified type.
A Use represents the edge between a Value definition and its users.
Definition Use.h:35
LLVM_ABI unsigned getOperandNo() const
Return the operand # of this use in its User.
Definition Use.cpp:35
void setOperand(unsigned i, Value *Val)
Definition User.h:212
Value * getOperand(unsigned i) const
Definition User.h:207
This represents the llvm.va_end intrinsic.
static LLVM_ABI void ValueIsDeleted(Value *V)
Definition Value.cpp:1222
static LLVM_ABI void ValueIsRAUWd(Value *Old, Value *New)
Definition Value.cpp:1275
LLVM Value Representation.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:257
static constexpr uint64_t MaximumAlignment
Definition Value.h:801
bool hasOneUse() const
Return true if there is exactly one use of this value.
Definition Value.h:441
LLVMContext & getContext() const
All values hold a context through their type.
Definition Value.h:260
iterator_range< user_iterator > users()
Definition Value.h:428
LLVM_ABI const Value * stripPointerCasts() const
Strip off pointer casts, all-zero GEPs and address space casts.
Definition Value.cpp:708
bool use_empty() const
Definition Value.h:348
static constexpr unsigned MaxAlignmentExponent
The maximum alignment for instructions.
Definition Value.h:800
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
Definition Value.cpp:315
LLVM_ABI void takeName(Value *V)
Transfer the name from V to this value.
Definition Value.cpp:396
Base class of all SIMD vector types.
ElementCount getElementCount() const
Return an ElementCount instance to represent the (possibly scalable) number of elements in the vector...
static LLVM_ABI VectorType * get(Type *ElementType, ElementCount EC)
This static method is the primary way to construct an VectorType.
constexpr ScalarTy getFixedValue() const
Definition TypeSize.h:201
static constexpr bool isKnownLT(const FixedOrScalableQuantity &LHS, const FixedOrScalableQuantity &RHS)
Definition TypeSize.h:217
constexpr bool isFixed() const
Returns true if the quantity is not scaled by vscale.
Definition TypeSize.h:172
static constexpr bool isKnownGT(const FixedOrScalableQuantity &LHS, const FixedOrScalableQuantity &RHS)
Definition TypeSize.h:224
const ParentTy * getParent() const
Definition ilist_node.h:34
self_iterator getIterator()
Definition ilist_node.h:123
NodeTy * getNextNode()
Get the next node, or nullptr for the list tail.
Definition ilist_node.h:348
CallInst * Call
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
constexpr char Align[]
Key for Kernel::Arg::Metadata::mAlign.
constexpr char Args[]
Key for Kernel::Metadata::mArgs.
constexpr char Attrs[]
Key for Kernel::Metadata::mAttrs.
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
@ BasicBlock
Various leaf nodes.
Definition ISDOpcodes.h:83
LLVM_ABI Function * getOrInsertDeclaration(Module *M, ID id, ArrayRef< Type * > OverloadTys={})
Look up the Function declaration of the intrinsic id in the Module M.
SpecificConstantMatch m_ZeroInt()
Convenience matchers for specific integer values.
auto m_PosZeroFP()
Matches a floating-point positive zero.
BinaryOp_match< SpecificConstantMatch, SrcTy, TargetOpcode::G_SUB > m_Neg(const SrcTy &&Src)
Matches a register negated by a G_SUB.
AllOnesConstantMatch m_AllOnes()
BinaryOp_match< SrcTy, SpecificConstantMatch, TargetOpcode::G_XOR, true > m_Not(const SrcTy &&Src)
Matches a register not-ed by a G_XOR.
OneUse_match< SubPat > m_OneUse(const SubPat &SP)
match_combine_or< Ty... > m_CombineOr(const Ty &...Ps)
Combine pattern matchers matching any of Ps patterns.
match_combine_and< Ty... > m_CombineAnd(const Ty &...Ps)
Combine pattern matchers matching all of Ps patterns.
BinaryOp_match< LHS, RHS, Instruction::And > m_And(const LHS &L, const RHS &R)
auto m_BSwap(const Opnd0 &Op0)
PtrAdd_match< PointerOpTy, OffsetOpTy > m_PtrAdd(const PointerOpTy &PointerOp, const OffsetOpTy &OffsetOp)
Matches GEP with i8 source element type.
BinaryOp_match< LHS, RHS, Instruction::Add > m_Add(const LHS &L, const RHS &R)
auto m_BitReverse(const Opnd0 &Op0)
auto m_PtrToIntOrAddr(const OpTy &Op)
Matches PtrToInt or PtrToAddr.
auto m_Poison()
Match an arbitrary poison constant.
ap_match< APInt > m_APInt(const APInt *&Res)
Match a ConstantInt or splatted ConstantVector, binding the specified pointer to the contained APInt.
BinaryOp_match< LHS, RHS, Instruction::And, true > m_c_And(const LHS &L, const RHS &R)
Matches an And with LHS and RHS in either order.
CastInst_match< OpTy, TruncInst > m_Trunc(const OpTy &Op)
Matches Trunc.
BinaryOp_match< LHS, RHS, Instruction::Xor > m_Xor(const LHS &L, const RHS &R)
ap_match< APInt > m_APIntAllowPoison(const APInt *&Res)
Match APInt while allowing poison in splat vector constants.
OverflowingBinaryOp_match< LHS, RHS, Instruction::Sub, OverflowingBinaryOperator::NoSignedWrap > m_NSWSub(const LHS &L, const RHS &R)
specific_intval< false > m_SpecificInt(const APInt &V)
Match a specific integer value or vector with all elements equal to the value.
bool match(Val *V, const Pattern &P)
match_bind< Instruction > m_Instruction(Instruction *&I)
Match an instruction, capturing it if we match.
auto m_UMin(const Opnd0 &Op0, const Opnd1 &Op1)
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.
ap_match< APFloat > m_APFloat(const APFloat *&Res)
Match a ConstantFP or splatted ConstantVector, binding the specified pointer to the contained APFloat...
auto match_fn(const Pattern &P)
A match functor that can be used as a UnaryPredicate in functional algorithms like all_of.
OverflowingBinaryOp_match< cst_pred_ty< is_zero_int >, ValTy, Instruction::Sub, OverflowingBinaryOperator::NoSignedWrap > m_NSWNeg(const ValTy &V)
Matches a 'Neg' as 'sub nsw 0, V'.
auto m_SMax(const Opnd0 &Op0, const Opnd1 &Op1)
cst_pred_ty< is_one > m_One()
Match an integer 1 or a vector with all elements equal to 1.
ThreeOps_match< Cond, LHS, RHS, Instruction::Select > m_Select(const Cond &C, const LHS &L, const RHS &R)
Matches SelectInst.
cstfp_pred_ty< is_neg_zero_fp > m_NegZeroFP()
Match a floating-point negative zero.
auto m_BinOp()
Match an arbitrary binary operation and ignore it.
auto m_UMax(const Opnd0 &Op0, const Opnd1 &Op1)
specific_fpval m_SpecificFP(double V)
Match a specific floating point value or vector with all elements equal to the value.
auto m_CopySign(const Opnd0 &Op0, const Opnd1 &Op1)
ExtractValue_match< Ind, Val_t > m_ExtractValue(const Val_t &V)
Match a single index ExtractValue instruction.
BinOpPred_match< LHS, RHS, is_logical_shift_op > m_LogicalShift(const LHS &L, const RHS &R)
Matches logical shift operations.
match_combine_or< CastInst_match< OpTy, UIToFPInst >, CastInst_match< OpTy, SIToFPInst > > m_IToFP(const OpTy &Op)
auto m_Value()
Match an arbitrary value and ignore it.
BinaryOp_match< LHS, RHS, Instruction::Xor, true > m_c_Xor(const LHS &L, const RHS &R)
Matches an Xor with LHS and RHS in either order.
BinaryOp_match< LHS, RHS, Instruction::Mul > m_Mul(const LHS &L, const RHS &R)
auto m_Constant()
Match an arbitrary Constant and ignore it.
match_combine_or< match_combine_or< CastInst_match< OpTy, ZExtInst >, CastInst_match< OpTy, SExtInst > >, OpTy > m_ZExtOrSExtOrSelf(const OpTy &Op)
auto m_LogicalOr()
Matches L || R where L and R are arbitrary values.
TwoOps_match< V1_t, V2_t, Instruction::ShuffleVector > m_Shuffle(const V1_t &v1, const V2_t &v2)
Matches ShuffleVectorInst independently of mask value.
cst_pred_ty< is_strictlypositive > m_StrictlyPositive()
Match an integer or vector of strictly positive values.
ThreeOps_match< decltype(m_Value()), LHS, RHS, Instruction::Select, true > m_c_Select(const LHS &L, const RHS &R)
Match Select(C, LHS, RHS) or Select(C, RHS, LHS)
CastInst_match< OpTy, FPExtInst > m_FPExt(const OpTy &Op)
SpecificCmpClass_match< LHS, RHS, ICmpInst > m_SpecificICmp(CmpPredicate MatchPred, const LHS &L, const RHS &R)
CastInst_match< OpTy, ZExtInst > m_ZExt(const OpTy &Op)
Matches ZExt.
OverflowingBinaryOp_match< LHS, RHS, Instruction::Shl, OverflowingBinaryOperator::NoUnsignedWrap > m_NUWShl(const LHS &L, const RHS &R)
OverflowingBinaryOp_match< LHS, RHS, Instruction::Mul, OverflowingBinaryOperator::NoUnsignedWrap > m_NUWMul(const LHS &L, const RHS &R)
is_zero< true > m_Zero()
Match any null constant or a vector with all elements equal to 0.
auto m_FShl(const Opnd0 &Op0, const Opnd1 &Op1, const Opnd2 &Op2)
cst_pred_ty< is_negated_power2 > m_NegatedPower2()
Match a integer or vector negated power-of-2.
match_immconstant_ty m_ImmConstant()
Match an arbitrary immediate Constant and ignore it.
cst_pred_ty< custom_checkfn< APInt > > m_CheckedInt(function_ref< bool(const APInt &)> CheckFn)
Match an integer or vector where CheckFn(ele) for each element is true.
auto m_Intrinsic(const Ts &...Ops)
Match intrinsic calls like this: m_Intrinsic<Intrinsic::fabs>(m_Value(X))
auto m_c_MaxOrMin(const LHS &L, const RHS &R)
OverflowingBinaryOp_match< LHS, RHS, Instruction::Sub, OverflowingBinaryOperator::NoUnsignedWrap > m_NUWSub(const LHS &L, const RHS &R)
auto m_SMin(const Opnd0 &Op0, const Opnd1 &Op1)
FNeg_match< OpTy, true > m_FNegOrFSubNegZero(const OpTy &X)
Match fneg X or fsub -0.0, X.
auto m_FAbs(const Opnd0 &Op0)
match_combine_or< OverflowingBinaryOp_match< LHS, RHS, Instruction::Add, OverflowingBinaryOperator::NoSignedWrap >, DisjointOr_match< LHS, RHS > > m_NSWAddLike(const LHS &L, const RHS &R)
Match either "add nsw" or "or disjoint".
BinaryOp_match< LHS, RHS, Instruction::LShr > m_LShr(const LHS &L, const RHS &R)
match_combine_or< CastInst_match< OpTy, ZExtInst >, CastInst_match< OpTy, SExtInst > > m_ZExtOrSExt(const OpTy &Op)
Exact_match< T > m_Exact(const T &SubPattern)
BinOpPred_match< LHS, RHS, is_shift_op > m_Shift(const LHS &L, const RHS &R)
Matches shift operations.
auto m_UnOp()
Match an arbitrary unary operation and ignore it.
BinaryOp_match< LHS, RHS, Instruction::Shl > m_Shl(const LHS &L, const RHS &R)
auto m_MaxOrMin(const Opnd0 &Op0, const Opnd1 &Op1)
auto m_LogicalAnd()
Matches L && R where L and R are arbitrary values.
BinaryOp_match< LHS, RHS, Instruction::SRem > m_SRem(const LHS &L, const RHS &R)
auto m_Undef()
Match an arbitrary undef constant.
auto m_VecReverse(const Opnd0 &Op0)
CastInst_match< OpTy, SExtInst > m_SExt(const OpTy &Op)
Matches SExt.
BinaryOp_match< LHS, RHS, Instruction::Or, true > m_c_Or(const LHS &L, const RHS &R)
Matches an Or with LHS and RHS in either order.
match_combine_or< OverflowingBinaryOp_match< LHS, RHS, Instruction::Add, OverflowingBinaryOperator::NoUnsignedWrap >, DisjointOr_match< LHS, RHS > > m_NUWAddLike(const LHS &L, const RHS &R)
Match either "add nuw" or "or disjoint".
BinOpPred_match< LHS, RHS, is_bitwiselogic_op > m_BitwiseLogic(const LHS &L, const RHS &R)
Matches bitwise logic operations.
ElementWiseBitCast_match< OpTy > m_ElementWiseBitCast(const OpTy &Op)
BinaryOp_match< LHS, RHS, Instruction::Mul, true > m_c_Mul(const LHS &L, const RHS &R)
Matches a Mul with LHS and RHS in either order.
auto m_FShr(const Opnd0 &Op0, const Opnd1 &Op1, const Opnd2 &Op2)
auto m_ConstantInt()
Match an arbitrary ConstantInt and ignore it.
@ SingleThread
Synchronized with respect to signal handlers executing in the same thread.
Definition LLVMContext.h:63
@ System
Synchronized with respect to all concurrently executing threads.
Definition LLVMContext.h:66
SmallVector< DbgVariableRecord * > getDVRAssignmentMarkers(const Instruction *Inst)
Return a range of dbg_assign records for which Inst performs the assignment they encode.
Definition DebugInfo.h:209
std::enable_if_t< detail::IsValidPointer< X, Y >::value, X * > extract(Y &&MD)
Extract a Value from Metadata.
Definition Metadata.h:679
constexpr double e
DiagnosticInfoOptimizationBase::Argument NV
friend class Instruction
Iterator for Instructions in a `BasicBlock.
Definition BasicBlock.h:73
This is an optimization pass for GlobalISel generic memory operations.
LLVM_ABI Intrinsic::ID getInverseMinMaxIntrinsic(Intrinsic::ID MinMaxID)
unsigned Log2_32_Ceil(uint32_t Value)
Return the ceil log base 2 of the specified value, 32 if the value is zero.
Definition MathExtras.h:339
@ Offset
Definition DWP.cpp:577
@ NeverOverflows
Never overflows.
@ AlwaysOverflowsHigh
Always overflows in the direction of signed/unsigned max value.
@ AlwaysOverflowsLow
Always overflows in the direction of signed/unsigned min value.
@ MayOverflow
May or may not overflow.
LLVM_ABI KnownFPClass computeKnownFPClass(const Value *V, const APInt &DemandedElts, FPClassTest InterestedClasses, const SimplifyQuery &SQ, unsigned Depth=0)
Determine which floating-point classes are valid for V, and return them in KnownFPClass bit sets.
LLVM_ABI cl::opt< bool > ProfcheckDisableMetadataFixes
Definition LoopInfo.cpp:61
LLVM_ABI Value * simplifyFMulInst(Value *LHS, Value *RHS, FastMathFlags FMF, const SimplifyQuery &Q, fp::ExceptionBehavior ExBehavior=fp::ebIgnore, RoundingMode Rounding=RoundingMode::NearestTiesToEven)
Given operands for an FMul, fold the result or return null.
LLVM_ABI APInt possiblyDemandedEltsInMask(Value *Mask)
Given a mask vector of the form <Y x i1>, return an APInt (of bitwidth Y) for each lane which may be ...
BundleAttr getBundleAttrFromOBU(OperandBundleUse OBU)
@ Known
Known to have no common set bits.
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:2570
LLVM_ABI void setExplicitlyUnknownBranchWeightsIfProfiled(Instruction &I, StringRef PassName, const Function *F=nullptr)
Like setExplicitlyUnknownBranchWeights(...), but only sets unknown branch weights in the new instruct...
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 bool isRemovableAlloc(const CallBase *V, const TargetLibraryInfo *TLI)
Return true if this is a call to an allocation function that does not have side effects that we are r...
LLVM_ABI bool getConstantStringInfo(const Value *V, StringRef &Str, bool TrimAtNul=true)
This function computes the length of a null-terminated C string pointed to by V.
constexpr int64_t minIntN(int64_t N)
Gets the minimum value for a N-bit signed integer.
Definition MathExtras.h:224
LLVM_ABI Value * lowerObjectSizeCall(IntrinsicInst *ObjectSize, const DataLayout &DL, const TargetLibraryInfo *TLI, bool MustSucceed)
Try to turn a call to @llvm.objectsize into an integer value of the given Type.
LLVM_ABI AssumeSeparateStorageInfo getAssumeSeparateStorageInfo(OperandBundleUse)
LLVM_ABI Value * getAllocAlignment(const CallBase *V, const TargetLibraryInfo *TLI)
Gets the alignment argument for an aligned_alloc-like function, using either built-in knowledge based...
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
LLVM_READONLY APFloat maximum(const APFloat &A, const APFloat &B)
Implements IEEE 754-2019 maximum semantics.
Definition APFloat.h:1801
LLVM_ABI Value * simplifyCall(CallBase *Call, Value *Callee, ArrayRef< Value * > Args, const SimplifyQuery &Q)
Given a callsite, callee, and arguments, fold the result or return null.
LLVM_ABI void computeKnownBits(const Value *V, KnownBits &Known, const DataLayout &DL, AssumptionCache *AC=nullptr, const Instruction *CtxI=nullptr, const DominatorTree *DT=nullptr, bool UseInstrInfo=true, unsigned Depth=0)
Determine which bits of V are known to be either zero or one and return them in the KnownZero/KnownOn...
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:546
constexpr bool isPowerOf2_64(uint64_t Value)
Return true if the argument is a power of two > 0 (64 bit edition.)
Definition MathExtras.h:285
LLVM_ABI bool isSafeToSpeculativelyExecute(const Instruction *I, const Instruction *CtxI=nullptr, AssumptionCache *AC=nullptr, const DominatorTree *DT=nullptr, const TargetLibraryInfo *TLI=nullptr, bool UseVariableInfo=true, bool IgnoreUBImplyingAttrs=true)
Return true if the instruction does not have any effects besides calculating the result and does not ...
LLVM_ABI Value * getSplatValue(const Value *V)
Get splat value if the input is a splat vector or return nullptr.
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
Definition InstrProf.h:143
constexpr T MinAlign(U A, V B)
A and B are either alignments or offsets.
Definition MathExtras.h:352
LLVM_ABI Constant * ConstantFoldCompareInstOperands(unsigned Predicate, Constant *LHS, Constant *RHS, const DataLayout &DL, const TargetLibraryInfo *TLI=nullptr, const Function *CtxF=nullptr)
Attempt to constant fold a compare instruction (icmp/fcmp) with the specified operands.
LLVM_ABI bool isValidAssumeForContext(const Instruction *I, const Instruction *CtxI, const DominatorTree *DT=nullptr, bool AllowEphemerals=false)
Return true if it is valid to use the assumptions provided by an assume intrinsic,...
auto dyn_cast_or_null(const Y &Val)
Definition Casting.h:753
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:1762
LLVM_ABI bool isSplatValue(const Value *V, int Index=-1, unsigned Depth=0)
Return true if each element of the vector value V is poisoned or equal to every other non-poisoned el...
LLVM_READONLY APFloat maxnum(const APFloat &A, const APFloat &B)
Implements IEEE-754 2008 maxNum semantics.
Definition APFloat.h:1756
SelectPatternFlavor
Specific patterns of select instructions we can match.
@ SPF_ABS
Floating point maxnum.
@ SPF_NABS
Absolute value.
LLVM_ABI Constant * getLosslessUnsignedTrunc(Constant *C, Type *DestTy, const DataLayout &DL, PreservedCastFlags *Flags=nullptr)
constexpr bool isPowerOf2_32(uint32_t Value)
Return true if the argument is a power of two > 0.
Definition MathExtras.h:280
bool isModSet(const ModRefInfo MRI)
Definition ModRef.h:49
void sort(IteratorTy Start, IteratorTy End)
Definition STLExtras.h:1652
LLVM_READONLY APFloat minimumnum(const APFloat &A, const APFloat &B)
Implements IEEE 754-2019 minimumNumber semantics.
Definition APFloat.h:1787
FPClassTest
Floating-point class tests, supported by 'is_fpclass' intrinsic.
APFloat scalbn(APFloat X, int Exp, APFloat::roundingMode RM)
Returns: X * 2^Exp for integral exponents.
Definition APFloat.h:1701
LLVM_ABI bool matchSimpleBinaryIntrinsicRecurrence(const IntrinsicInst *I, PHINode *&P, Value *&Init, Value *&OtherOp)
Attempt to match a simple value-accumulating recurrence of the form: llvm.intrinsic....
LLVM_ABI bool NullPointerIsDefined(const Function *F, unsigned AS=0)
Check whether null pointer dereferencing is considered undefined behavior for a given function or an ...
auto find_if_not(R &&Range, UnaryPredicate P)
Definition STLExtras.h:1793
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:209
bool none_of(R &&Range, UnaryPredicate P)
Provide wrappers to std::none_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1769
bool isAtLeastOrStrongerThan(AtomicOrdering AO, AtomicOrdering Other)
LLVM_ABI Constant * getLosslessSignedTrunc(Constant *C, Type *DestTy, const DataLayout &DL, PreservedCastFlags *Flags=nullptr)
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...
iterator_range< SplittingIterator > split(StringRef Str, StringRef Separator)
Split the specified string over a separator and return a range-compatible iterable over its partition...
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
LLVM_ABI const Value * getUnderlyingObject(const Value *V, unsigned MaxLookup=MaxLookupSearchDepth, bool MustPreserveProvenance=false)
This method strips off any GEP address adjustments, pointer casts or llvm.threadlocal....
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 isNotCrossLaneOperation(const Instruction *I)
Return true if the instruction doesn't potentially cross vector lanes.
LLVM_ATTRIBUTE_VISIBILITY_DEFAULT AnalysisKey InnerAnalysisManagerProxy< AnalysisManagerT, IRUnitT, ExtraArgTs... >::Key
LLVM_ABI Constant * ConstantFoldBinaryOpOperands(unsigned Opcode, Constant *LHS, Constant *RHS, const DataLayout &DL)
Attempt to constant fold a binary operation with the specified operands.
LLVM_ABI bool isKnownNonZero(const Value *V, const SimplifyQuery &Q, unsigned Depth=0)
Return true if the given value is known to be non-zero when defined.
constexpr int PoisonMaskElem
@ Mod
The access may modify the value stored in memory.
Definition ModRef.h:34
LLVM_ABI Value * simplifyFMAFMul(Value *LHS, Value *RHS, FastMathFlags FMF, const SimplifyQuery &Q, fp::ExceptionBehavior ExBehavior=fp::ebIgnore, RoundingMode Rounding=RoundingMode::NearestTiesToEven)
Given operands for the multiplication of a FMA, fold the result or return null.
@ Other
Any other memory.
Definition ModRef.h:68
LLVM_ABI Value * simplifyConstrainedFPCall(CallBase *Call, const SimplifyQuery &Q)
Given a constrained FP intrinsic call, tries to compute its simplified version.
LLVM_READONLY APFloat minnum(const APFloat &A, const APFloat &B)
Implements IEEE-754 2008 minNum semantics.
Definition APFloat.h:1737
OperandBundleDefT< Value * > OperandBundleDef
Definition AutoUpgrade.h:34
LLVM_ABI AssumeNonNullInfo getAssumeNonNullInfo(OperandBundleUse)
@ Add
Sum of integers.
LLVM_ABI bool isVectorIntrinsicWithScalarOpAtArg(Intrinsic::ID ID, unsigned ScalarOpdIdx, const TargetTransformInfo *TTI)
Identifies if the vector form of the intrinsic has a scalar operand.
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Count
Definition InstrProf.h:145
LLVM_ABI ConstantRange computeConstantRangeIncludingKnownBits(const WithCache< const Value * > &V, bool ForSigned, const SimplifyQuery &SQ)
Combine constant ranges from computeConstantRange() and computeKnownBits().
DWARFExpression::Operation Op
bool isSafeToSpeculativelyExecuteWithVariableReplaced(const Instruction *I, bool IgnoreUBImplyingAttrs=true)
Don't use information from its non-constant operands.
LLVM_ABI bool isGuaranteedNotToBeUndefOrPoison(const Value *V, AssumptionCache *AC=nullptr, const Instruction *CtxI=nullptr, const DominatorTree *DT=nullptr, unsigned Depth=0)
Return true if this function can prove that V does not have undef bits and is never poison.
ArrayRef(const T &OneElt) -> ArrayRef< T >
LLVM_ABI Value * getFreedOperand(const CallBase *CB, const TargetLibraryInfo *TLI)
If this if a call to a free function, return the freed operand.
constexpr int64_t maxIntN(int64_t N)
Gets the maximum value for a N-bit signed integer.
Definition MathExtras.h:233
constexpr unsigned BitWidth
LLVM_ABI Constant * getLosslessInvCast(Constant *C, Type *InvCastTo, unsigned CastOp, const DataLayout &DL, PreservedCastFlags *Flags=nullptr)
Try to cast C to InvC losslessly, satisfying CastOp(InvC) equals C, or CastOp(InvC) is a refined valu...
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
Definition STLExtras.h:1963
LLVM_ABI std::optional< APInt > getAllocSize(const CallBase *CB, const TargetLibraryInfo *TLI, function_ref< const Value *(const Value *)> Mapper=[](const Value *V) { return V;})
Return the size of the requested allocation.
Align getKnownAlignment(Value *V, const DataLayout &DL, const Instruction *CtxI=nullptr, AssumptionCache *AC=nullptr, const DominatorTree *DT=nullptr)
Try to infer an alignment for the specified pointer.
Definition Local.h:240
LLVM_ABI AssumeAlignInfo getAssumeAlignInfo(OperandBundleUse)
unsigned Log2(Align A)
Returns the log2 of the alignment.
Definition Alignment.h:202
LLVM_ABI bool maskContainsAllOneOrUndef(Value *Mask)
Given a mask vector of i1, Return true if any of the elements of this predicate mask are known to be ...
LLVM_ABI std::optional< bool > isImpliedByDomCondition(const Value *Cond, const Instruction *ContextI, const DataLayout &DL)
Return the boolean condition value in the context of the given instruction if it is known based on do...
LLVM_ABI bool isDereferenceablePointer(const Value *V, Type *Ty, const SimplifyQuery &Q, bool IgnoreFree=false)
Equivalent to isDereferenceableAndAlignedPointer with an alignment of 1.
Definition Loads.cpp:266
LLVM_READONLY APFloat minimum(const APFloat &A, const APFloat &B)
Implements IEEE 754-2019 minimum semantics.
Definition APFloat.h:1774
LLVM_ABI bool isKnownNegation(const Value *X, const Value *Y, bool NeedNSW=false, bool AllowPoison=true)
Return true if the two given values are negation.
LLVM_READONLY APFloat maximumnum(const APFloat &A, const APFloat &B)
Implements IEEE 754-2019 maximumNumber semantics.
Definition APFloat.h:1814
LLVM_ABI AssumeDereferenceableInfo getAssumeDereferenceableInfo(OperandBundleUse)
LLVM_ABI bool isKnownNonNegative(const Value *V, const SimplifyQuery &SQ, unsigned Depth=0)
Returns true if the give value is known to be non-negative.
LLVM_ABI SelectPatternResult matchSelectPattern(Value *V, Value *&LHS, Value *&RHS, Instruction::CastOps *CastOp=nullptr)
Pattern match integer [SU]MIN, [SU]MAX and ABS idioms, returning the kind and providing the out param...
LLVM_ABI AssumeNoUndefInfo getAssumeNoUndefInfo(OperandBundleUse)
LLVM_ABI bool isTriviallyVectorizable(Intrinsic::ID ID)
Identify if the intrinsic is trivially vectorizable.
LLVM_ABI std::optional< bool > computeKnownFPSignBit(const Value *V, const SimplifyQuery &SQ, unsigned Depth=0)
Return false if we can prove that the specified FP value's sign bit is 0.
LLVM_ABI ConstantRange computeConstantRange(const Value *V, bool ForSigned, const SimplifyQuery &SQ, unsigned Depth=0)
Determine the possible constant range of an integer or vector of integer value.
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Definition BitVector.h:880
#define NC
Definition regutils.h:42
A collection of metadata nodes that might be associated with a memory access used by the alias-analys...
Definition Metadata.h:774
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39
static constexpr Align fromLog2(unsigned Log2Value)
Returns an alignment of 1 << Log2Value bytes.
Definition Alignment.h:73
Represent subnormal handling kind for floating point instruction inputs and outputs.
@ IEEE
IEEE-754 denormal numbers preserved.
Matching combinators.
This struct is a compact representation of a valid (power of two) or undefined (0) alignment.
Definition Alignment.h:111
Align valueOrOne() const
For convenience, returns a valid alignment or 1 if undefined.
Definition Alignment.h:135
uint32_t getTagID() const
Return the tag of this operand bundle as an integer.
ArrayRef< Use > Inputs
SelectPatternFlavor Flavor
const DataLayout & DL
SimplifyQuery getWithInstruction(const Instruction *I) const
const Instruction * CtxI