LLVM 24.0.0git
TypePromotion.cpp
Go to the documentation of this file.
1//===----- TypePromotion.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/// \file
10/// This is an opcode based type promotion pass for small types that would
11/// otherwise be promoted during legalisation. This works around the limitations
12/// of selection dag for cyclic regions. The search begins from icmp
13/// instructions operands where a tree, consisting of non-wrapping or safe
14/// wrapping instructions, is built, checked and promoted if possible.
15///
16//===----------------------------------------------------------------------===//
17
19#include "llvm/ADT/SetVector.h"
20#include "llvm/ADT/StringRef.h"
23#include "llvm/CodeGen/Passes.h"
27#include "llvm/IR/Attributes.h"
28#include "llvm/IR/BasicBlock.h"
29#include "llvm/IR/Constants.h"
30#include "llvm/IR/IRBuilder.h"
31#include "llvm/IR/InstrTypes.h"
32#include "llvm/IR/Instruction.h"
34#include "llvm/IR/Type.h"
35#include "llvm/IR/Value.h"
37#include "llvm/Pass.h"
41
42#define DEBUG_TYPE "type-promotion"
43#define PASS_NAME "Type Promotion"
44
45using namespace llvm;
46
47static cl::opt<bool> DisablePromotion("disable-type-promotion", cl::Hidden,
48 cl::init(false),
49 cl::desc("Disable type promotion pass"));
50
51// The goal of this pass is to enable more efficient code generation for
52// operations on narrow types (i.e. types with < 32-bits) and this is a
53// motivating IR code example:
54//
55// define hidden i32 @cmp(i8 zeroext) {
56// %2 = add i8 %0, -49
57// %3 = icmp ult i8 %2, 3
58// ..
59// }
60//
61// The issue here is that i8 is type-legalized to i32 because i8 is not a
62// legal type. Thus, arithmetic is done in integer-precision, but then the
63// byte value is masked out as follows:
64//
65// t19: i32 = add t4, Constant:i32<-49>
66// t24: i32 = and t19, Constant:i32<255>
67//
68// Consequently, we generate code like this:
69//
70// subs r0, #49
71// uxtb r1, r0
72// cmp r1, #3
73//
74// This shows that masking out the byte value results in generation of
75// the UXTB instruction. This is not optimal as r0 already contains the byte
76// value we need, and so instead we can just generate:
77//
78// sub.w r1, r0, #49
79// cmp r1, #3
80//
81// We achieve this by type promoting the IR to i32 like so for this example:
82//
83// define i32 @cmp(i8 zeroext %c) {
84// %0 = zext i8 %c to i32
85// %c.off = add i32 %0, -49
86// %1 = icmp ult i32 %c.off, 3
87// ..
88// }
89//
90// For this to be valid and legal, we need to prove that the i32 add is
91// producing the same value as the i8 addition, and that e.g. no overflow
92// happens.
93//
94// A brief sketch of the algorithm and some terminology.
95// We pattern match interesting IR patterns:
96// - which have "sources": instructions producing narrow values (i8, i16), and
97// - they have "sinks": instructions consuming these narrow values.
98//
99// We collect all instruction connecting sources and sinks in a worklist, so
100// that we can mutate these instruction and perform type promotion when it is
101// legal to do so.
102
103namespace {
104class IRPromoter {
105 LLVMContext &Ctx;
106 unsigned PromotedWidth = 0;
107 SetVector<Value *> &Visited;
108 SetVector<Value *> &Sources;
111 SmallPtrSetImpl<Instruction *> &InstsToRemove;
112 IntegerType *ExtTy = nullptr;
116
117 void ReplaceAllUsersOfWith(Value *From, Value *To);
118 void ExtendSources();
119 void ConvertTruncs();
120 void PromoteTree();
121 void TruncateSinks();
122 void Cleanup();
123
124public:
125 IRPromoter(LLVMContext &C, unsigned Width, SetVector<Value *> &visited,
128 SmallPtrSetImpl<Instruction *> &instsToRemove)
129 : Ctx(C), PromotedWidth(Width), Visited(visited), Sources(sources),
130 Sinks(sinks), SafeWrap(wrap), InstsToRemove(instsToRemove) {
131 ExtTy = IntegerType::get(Ctx, PromotedWidth);
132 }
133
134 void Mutate();
135};
136
137class TypePromotionImpl {
138 unsigned TypeSize = 0;
139 const TargetLowering *TLI = nullptr;
140 LLVMContext *Ctx = nullptr;
141 unsigned RegisterBitWidth = 0;
142 SmallPtrSet<Value *, 16> AllVisited;
143 SmallPtrSet<Instruction *, 8> SafeToPromote;
144 SmallPtrSet<Instruction *, 4> SafeWrap;
145 SmallPtrSet<Instruction *, 4> InstsToRemove;
146
147 // Does V have the same size result type as TypeSize.
148 bool EqualTypeSize(Value *V);
149 // Does V have the same size, or narrower, result type as TypeSize.
150 bool LessOrEqualTypeSize(Value *V);
151 // Does V have a result type that is wider than TypeSize.
152 bool GreaterThanTypeSize(Value *V);
153 // Does V have a result type that is narrower than TypeSize.
154 bool LessThanTypeSize(Value *V);
155 // Should V be a leaf in the promote tree?
156 bool isSource(Value *V);
157 // Should V be a root in the promotion tree?
158 bool isSink(Value *V);
159 // Should we change the result type of V? It will result in the users of V
160 // being visited.
161 bool shouldPromote(Value *V);
162 // Is I an add or a sub, which isn't marked as nuw, but where a wrapping
163 // result won't affect the computation?
164 bool isSafeWrap(Instruction *I);
165 // Can V have its integer type promoted, or can the type be ignored.
166 bool isSupportedType(Value *V);
167 // Is V an instruction with a supported opcode or another value that we can
168 // handle, such as constants and basic blocks.
169 bool isSupportedValue(Value *V);
170 // Is V an instruction thats result can trivially promoted, or has safe
171 // wrapping.
172 bool isLegalToPromote(Value *V);
173 bool TryToPromote(Value *V, unsigned PromotedWidth, const LoopInfo &LI);
174
175public:
176 bool run(Function &F, const TargetMachine *TM,
177 const TargetTransformInfo &TTI, const LoopInfo &LI);
178};
179
180class TypePromotionLegacy : public FunctionPass {
181public:
182 static char ID;
183
184 TypePromotionLegacy() : FunctionPass(ID) {}
185
186 void getAnalysisUsage(AnalysisUsage &AU) const override {
187 AU.addRequired<LoopInfoWrapperPass>();
188 AU.addRequired<TargetTransformInfoWrapperPass>();
189 AU.addRequired<TargetPassConfig>();
190 AU.setPreservesCFG();
191 }
192
193 StringRef getPassName() const override { return PASS_NAME; }
194
195 bool runOnFunction(Function &F) override;
196};
197
198} // namespace
199
201 unsigned Opc = I->getOpcode();
202 return Opc == Instruction::AShr || Opc == Instruction::SDiv ||
203 Opc == Instruction::SRem || Opc == Instruction::SExt;
204}
205
206bool TypePromotionImpl::EqualTypeSize(Value *V) {
207 return V->getType()->getScalarSizeInBits() == TypeSize;
208}
209
210bool TypePromotionImpl::LessOrEqualTypeSize(Value *V) {
211 return V->getType()->getScalarSizeInBits() <= TypeSize;
212}
213
214bool TypePromotionImpl::GreaterThanTypeSize(Value *V) {
215 return V->getType()->getScalarSizeInBits() > TypeSize;
216}
217
218bool TypePromotionImpl::LessThanTypeSize(Value *V) {
219 return V->getType()->getScalarSizeInBits() < TypeSize;
220}
221
222/// Return true if the given value is a source in the use-def chain, producing
223/// a narrow 'TypeSize' value. These values will be zext to start the promotion
224/// of the tree to i32. We guarantee that these won't populate the upper bits
225/// of the register. ZExt on the loads will be free, and the same for call
226/// return values because we only accept ones that guarantee a zeroext ret val.
227/// Many arguments will have the zeroext attribute too, so those would be free
228/// too.
229bool TypePromotionImpl::isSource(Value *V) {
230 if (!isa<IntegerType>(V->getType()))
231 return false;
232
233 // TODO Allow zext to be sources.
234 if (isa<Argument>(V))
235 return true;
236 else if (isa<LoadInst>(V))
237 return true;
238 else if (auto *Call = dyn_cast<CallInst>(V))
239 return Call->hasRetAttr(Attribute::AttrKind::ZExt);
240 else if (auto *Trunc = dyn_cast<TruncInst>(V))
241 return EqualTypeSize(Trunc);
242 return false;
243}
244
245/// Return true if V will require any promoted values to be truncated for the
246/// the IR to remain valid. We can't mutate the value type of these
247/// instructions.
248bool TypePromotionImpl::isSink(Value *V) {
249 // TODO The truncate also isn't actually necessary because we would already
250 // proved that the data value is kept within the range of the original data
251 // type. We currently remove any truncs inserted for handling zext sinks.
252
253 // Sinks are:
254 // - points where the value in the register is being observed, such as an
255 // icmp, switch or store.
256 // - points where value types have to match, such as calls and returns.
257 // - zext are included to ease the transformation and are generally removed
258 // later on.
259 if (auto *Store = dyn_cast<StoreInst>(V))
260 return LessOrEqualTypeSize(Store->getValueOperand());
261 if (auto *Return = dyn_cast<ReturnInst>(V))
262 return LessOrEqualTypeSize(Return->getReturnValue());
263 if (auto *ZExt = dyn_cast<ZExtInst>(V))
264 return GreaterThanTypeSize(ZExt);
265 if (auto *Switch = dyn_cast<SwitchInst>(V))
266 return LessThanTypeSize(Switch->getCondition());
267 if (auto *ICmp = dyn_cast<ICmpInst>(V))
268 return ICmp->isSigned() || LessThanTypeSize(ICmp->getOperand(0));
269
270 return isa<CallInst>(V);
271}
272
273/// Return whether this instruction can safely wrap.
274bool TypePromotionImpl::isSafeWrap(Instruction *I) {
275 // We can support a potentially wrapping Add/Sub instruction (I) if:
276 // - It is only used by an unsigned icmp.
277 // - The icmp uses a constant.
278 // - The wrapping instruction (I) also uses a constant.
279 //
280 // This a common pattern emitted to check if a value is within a range.
281 //
282 // For example:
283 //
284 // %sub = sub i8 %a, C1
285 // %cmp = icmp ule i8 %sub, C2
286 //
287 // or
288 //
289 // %add = add i8 %a, C1
290 // %cmp = icmp ule i8 %add, C2.
291 //
292 // We will treat an add as though it were a subtract by -C1. To promote
293 // the Add/Sub we will zero extend the LHS and the subtracted amount. For Add,
294 // this means we need to negate the constant, zero extend to RegisterBitWidth,
295 // and negate in the larger type.
296 //
297 // This will produce a value in the range [-zext(C1), zext(X)-zext(C1)] where
298 // C1 is the subtracted amount. This is either a small unsigned number or a
299 // large unsigned number in the promoted type.
300 //
301 // Now we need to correct the compare constant C2. Values >= C1 in the
302 // original add result range have been remapped to large values in the
303 // promoted range. If the compare constant fell into this range we need to
304 // remap it as well. We can do this as -(zext(-C2)).
305 //
306 // For example:
307 //
308 // %sub = sub i8 %a, 2
309 // %cmp = icmp ule i8 %sub, 254
310 //
311 // becomes
312 //
313 // %zext = zext %a to i32
314 // %sub = sub i32 %zext, 2
315 // %cmp = icmp ule i32 %sub, 4294967294
316 //
317 // Another example:
318 //
319 // %sub = sub i8 %a, 1
320 // %cmp = icmp ule i8 %sub, 254
321 //
322 // becomes
323 //
324 // %zext = zext %a to i32
325 // %sub = sub i32 %zext, 1
326 // %cmp = icmp ule i32 %sub, 254
327
328 unsigned Opc = I->getOpcode();
329 if (Opc != Instruction::Add && Opc != Instruction::Sub)
330 return false;
331
332 if (!I->hasOneUse() || !isa<ICmpInst>(*I->user_begin()) ||
333 !isa<ConstantInt>(I->getOperand(1)))
334 return false;
335
336 // Don't support an icmp that deals with sign bits.
337 auto *CI = cast<ICmpInst>(*I->user_begin());
338 if (CI->isSigned() || CI->isEquality())
339 return false;
340
341 ConstantInt *ICmpConstant = nullptr;
342 if (auto *Const = dyn_cast<ConstantInt>(CI->getOperand(0)))
343 ICmpConstant = Const;
344 else if (auto *Const = dyn_cast<ConstantInt>(CI->getOperand(1)))
345 ICmpConstant = Const;
346 else
347 return false;
348
349 const APInt &ICmpConst = ICmpConstant->getValue();
350 APInt OverflowConst = cast<ConstantInt>(I->getOperand(1))->getValue();
351 if (Opc == Instruction::Sub)
352 OverflowConst = -OverflowConst;
353
354 // If the constant is positive, we will end up filling the promoted bits with
355 // all 1s. Make sure that results in a cheap add constant.
356 if (!OverflowConst.isNonPositive()) {
357 // We don't have the true promoted width, just use 64 so we can create an
358 // int64_t for the isLegalAddImmediate call.
359 if (OverflowConst.getBitWidth() >= 64)
360 return false;
361
362 APInt NewConst = -((-OverflowConst).zext(64));
363 if (!TLI->isLegalAddImmediate(NewConst.getSExtValue()))
364 return false;
365 }
366
367 SafeWrap.insert(I);
368
369 if (OverflowConst == 0 || OverflowConst.ugt(ICmpConst)) {
370 LLVM_DEBUG(dbgs() << "IR Promotion: Allowing safe overflow for "
371 << "const of " << *I << "\n");
372 return true;
373 }
374
375 LLVM_DEBUG(dbgs() << "IR Promotion: Allowing safe overflow for "
376 << "const of " << *I << " and " << *CI << "\n");
377 SafeWrap.insert(CI);
378 return true;
379}
380
381bool TypePromotionImpl::shouldPromote(Value *V) {
382 if (!isa<IntegerType>(V->getType()) || isSink(V))
383 return false;
384
385 if (isSource(V))
386 return true;
387
388 auto *I = dyn_cast<Instruction>(V);
389 if (!I)
390 return false;
391
392 if (isa<ICmpInst>(I))
393 return false;
394
395 return true;
396}
397
398/// Return whether we can safely mutate V's type to ExtTy without having to be
399/// concerned with zero extending or truncation.
401 if (GenerateSignBits(I))
402 return false;
403
405 return true;
406
407 return I->hasNoUnsignedWrap();
408}
409
410void IRPromoter::ReplaceAllUsersOfWith(Value *From, Value *To) {
411 SmallVector<Instruction *, 4> Users;
413 bool ReplacedAll = true;
414
415 LLVM_DEBUG(dbgs() << "IR Promotion: Replacing " << *From << " with " << *To
416 << "\n");
417
418 for (Use &U : From->uses()) {
419 auto *User = cast<Instruction>(U.getUser());
420 if (InstTo && User->isIdenticalTo(InstTo)) {
421 ReplacedAll = false;
422 continue;
423 }
424 Users.push_back(User);
425 }
426
427 for (auto *U : Users)
428 U->replaceUsesOfWith(From, To);
429
430 if (ReplacedAll)
431 if (auto *I = dyn_cast<Instruction>(From))
432 InstsToRemove.insert(I);
433}
434
435void IRPromoter::ExtendSources() {
436 IRBuilder<> Builder{Ctx};
437
438 auto InsertZExt = [&](Value *V, BasicBlock::iterator InsertPt) {
439 assert(V->getType() != ExtTy && "zext already extends to i32");
440 LLVM_DEBUG(dbgs() << "IR Promotion: Inserting ZExt for " << *V << "\n");
441 Builder.SetInsertPoint(InsertPt);
442 if (auto *I = dyn_cast<Instruction>(V))
443 Builder.SetCurrentDebugLocation(I->getDebugLoc());
444
445 Value *ZExt = Builder.CreateZExt(V, ExtTy);
446 if (auto *I = dyn_cast<Instruction>(ZExt)) {
447 if (isa<Argument>(V))
448 I->moveBefore(InsertPt);
449 else
450 I->moveAfter(&*InsertPt);
451 NewInsts.insert(I);
452 }
453
454 ReplaceAllUsersOfWith(V, ZExt);
455 };
456
457 // Now, insert extending instructions between the sources and their users.
458 LLVM_DEBUG(dbgs() << "IR Promotion: Promoting sources:\n");
459 for (auto *V : Sources) {
460 LLVM_DEBUG(dbgs() << " - " << *V << "\n");
461 if (auto *I = dyn_cast<Instruction>(V))
462 InsertZExt(I, I->getIterator());
463 else if (auto *Arg = dyn_cast<Argument>(V)) {
464 BasicBlock &BB = Arg->getParent()->front();
465 InsertZExt(Arg, BB.getFirstInsertionPt());
466 } else {
467 llvm_unreachable("unhandled source that needs extending");
468 }
469 Promoted.insert(V);
470 }
471}
472
473void IRPromoter::PromoteTree() {
474 LLVM_DEBUG(dbgs() << "IR Promotion: Mutating the tree..\n");
475
476 // Mutate the types of the instructions within the tree. Here we handle
477 // constant operands.
478 for (auto *V : Visited) {
479 if (Sources.count(V))
480 continue;
481
482 auto *I = cast<Instruction>(V);
483 if (Sinks.count(I))
484 continue;
485
486 for (unsigned i = 0, e = I->getNumOperands(); i < e; ++i) {
487 Value *Op = I->getOperand(i);
488 if ((Op->getType() == ExtTy) || !isa<IntegerType>(Op->getType()))
489 continue;
490
491 // Skip the condition operand of select.
492 if (isa<SelectInst>(I) && i == 0)
493 continue;
494
495 if (auto *Const = dyn_cast<ConstantInt>(Op)) {
496 // For subtract, we only need to zext the constant. We only put it in
497 // SafeWrap because SafeWrap.size() is used elsewhere.
498 // For Add and ICmp we need to find how far the constant is from the
499 // top of its original unsigned range and place it the same distance
500 // from the top of its new unsigned range. We can do this by negating
501 // the constant, zero extending it, then negating in the new type.
502 APInt NewConst;
503 if (SafeWrap.contains(I)) {
504 if (I->getOpcode() == Instruction::ICmp)
505 NewConst = -((-Const->getValue()).zext(PromotedWidth));
506 else if (I->getOpcode() == Instruction::Add && i == 1)
507 NewConst = -((-Const->getValue()).zext(PromotedWidth));
508 else
509 NewConst = Const->getValue().zext(PromotedWidth);
510 } else
511 NewConst = Const->getValue().zext(PromotedWidth);
512
513 I->setOperand(i, ConstantInt::get(Const->getContext(), NewConst));
514 } else if (isa<UndefValue>(Op))
515 I->setOperand(i, ConstantInt::get(ExtTy, 0));
516 }
517
518 // For switch, also mutate case values, which are not operands.
519 if (auto *SI = dyn_cast<SwitchInst>(I)) {
520 for (auto Case : SI->cases()) {
521 APInt NewConst = Case.getCaseValue()->getValue().zext(PromotedWidth);
522 Case.setValue(ConstantInt::get(SI->getContext(), NewConst));
523 }
524 }
525
526 // Mutate the result type, unless this is an icmp or switch.
527 if (!isa<ICmpInst>(I) && !isa<SwitchInst>(I)) {
528 I->mutateType(ExtTy);
529 Promoted.insert(I);
530 }
531 }
532}
533
534void IRPromoter::TruncateSinks() {
535 LLVM_DEBUG(dbgs() << "IR Promotion: Fixing up the sinks:\n");
536
537 IRBuilder<> Builder{Ctx};
538
539 auto InsertTrunc = [&](Value *V, Type *TruncTy) -> Instruction * {
540 if (!isa<Instruction>(V) || !isa<IntegerType>(V->getType()))
541 return nullptr;
542
543 if ((!Promoted.count(V) && !NewInsts.count(V)) || Sources.count(V))
544 return nullptr;
545
546 LLVM_DEBUG(dbgs() << "IR Promotion: Creating " << *TruncTy << " Trunc for "
547 << *V << "\n");
549 auto *Trunc = dyn_cast<Instruction>(Builder.CreateTrunc(V, TruncTy));
550 if (Trunc)
551 NewInsts.insert(Trunc);
552 return Trunc;
553 };
554
555 // Fix up any stores or returns that use the results of the promoted
556 // chain.
557 for (auto *I : Sinks) {
558 LLVM_DEBUG(dbgs() << "IR Promotion: For Sink: " << *I << "\n");
559
560 // Handle calls separately as we need to iterate over arg operands.
561 if (auto *Call = dyn_cast<CallInst>(I)) {
562 for (unsigned i = 0; i < Call->arg_size(); ++i) {
563 Value *Arg = Call->getArgOperand(i);
564 Type *Ty = TruncTysMap[Call][i];
565 if (Instruction *Trunc = InsertTrunc(Arg, Ty)) {
566 Trunc->moveBefore(Call->getIterator());
567 Call->setArgOperand(i, Trunc);
568 }
569 }
570 continue;
571 }
572
573 // Special case switches because we need to truncate the condition.
574 if (auto *Switch = dyn_cast<SwitchInst>(I)) {
575 Type *Ty = TruncTysMap[Switch][0];
576 if (Instruction *Trunc = InsertTrunc(Switch->getCondition(), Ty)) {
577 Trunc->moveBefore(Switch->getIterator());
578 Switch->setCondition(Trunc);
579 }
580 continue;
581 }
582
583 // Don't insert a trunc for a zext which can still legally promote.
584 // Nor insert a trunc when the input value to that trunc has the same width
585 // as the zext we are inserting it for. When this happens the input operand
586 // for the zext will be promoted to the same width as the zext's return type
587 // rendering that zext unnecessary. This zext gets removed before the end
588 // of the pass.
589 if (auto ZExt = dyn_cast<ZExtInst>(I))
590 if (ZExt->getType()->getScalarSizeInBits() >= PromotedWidth)
591 continue;
592
593 // Now handle the others.
594 for (unsigned i = 0; i < I->getNumOperands(); ++i) {
595 Type *Ty = TruncTysMap[I][i];
596 if (Instruction *Trunc = InsertTrunc(I->getOperand(i), Ty)) {
597 Trunc->moveBefore(I->getIterator());
598 I->setOperand(i, Trunc);
599 }
600 }
601 }
602}
603
604void IRPromoter::Cleanup() {
605 LLVM_DEBUG(dbgs() << "IR Promotion: Cleanup..\n");
606 // Some zexts will now have become redundant, along with their trunc
607 // operands, so remove them.
608 for (auto *V : Visited) {
609 if (!isa<ZExtInst>(V))
610 continue;
611
612 auto ZExt = cast<ZExtInst>(V);
613 if (ZExt->getDestTy() != ExtTy)
614 continue;
615
616 Value *Src = ZExt->getOperand(0);
617 if (ZExt->getSrcTy() == ZExt->getDestTy()) {
618 LLVM_DEBUG(dbgs() << "IR Promotion: Removing unnecessary cast: " << *ZExt
619 << "\n");
620 ReplaceAllUsersOfWith(ZExt, Src);
621 continue;
622 }
623
624 // We've inserted a trunc for a zext sink, but we already know that the
625 // input is in range, negating the need for the trunc.
626 if (NewInsts.count(Src) && isa<TruncInst>(Src)) {
627 auto *Trunc = cast<TruncInst>(Src);
628 assert(Trunc->getOperand(0)->getType() == ExtTy &&
629 "expected inserted trunc to be operating on i32");
630 ReplaceAllUsersOfWith(ZExt, Trunc->getOperand(0));
631 }
632 }
633
634 for (auto *I : InstsToRemove) {
635 LLVM_DEBUG(dbgs() << "IR Promotion: Removing " << *I << "\n");
636 I->dropAllReferences();
637 }
638}
639
640void IRPromoter::ConvertTruncs() {
641 LLVM_DEBUG(dbgs() << "IR Promotion: Converting truncs..\n");
642 IRBuilder<> Builder{Ctx};
643
644 for (auto *V : Visited) {
645 if (!isa<TruncInst>(V) || Sources.count(V))
646 continue;
647
648 auto *Trunc = cast<TruncInst>(V);
649 Builder.SetInsertPoint(Trunc);
650 IntegerType *SrcTy = cast<IntegerType>(Trunc->getOperand(0)->getType());
651 IntegerType *DestTy = cast<IntegerType>(TruncTysMap[Trunc][0]);
652
653 unsigned NumBits = DestTy->getScalarSizeInBits();
654 ConstantInt *Mask =
655 ConstantInt::get(SrcTy, APInt::getMaxValue(NumBits).getZExtValue());
656 Value *Masked = Builder.CreateAnd(Trunc->getOperand(0), Mask);
657 if (SrcTy->getBitWidth() > ExtTy->getBitWidth())
658 Masked = Builder.CreateTrunc(Masked, ExtTy);
659
660 if (auto *I = dyn_cast<Instruction>(Masked))
661 NewInsts.insert(I);
662
663 ReplaceAllUsersOfWith(Trunc, Masked);
664 }
665}
666
667void IRPromoter::Mutate() {
668 LLVM_DEBUG(dbgs() << "IR Promotion: Promoting use-def chains to "
669 << PromotedWidth << "-bits\n");
670
671 // Cache original types of the values that will likely need truncating
672 for (auto *I : Sinks) {
673 if (auto *Call = dyn_cast<CallInst>(I)) {
674 for (Value *Arg : Call->args())
675 TruncTysMap[Call].push_back(Arg->getType());
676 } else if (auto *Switch = dyn_cast<SwitchInst>(I))
677 TruncTysMap[I].push_back(Switch->getCondition()->getType());
678 else {
679 for (const Value *Op : I->operands())
680 TruncTysMap[I].push_back(Op->getType());
681 }
682 }
683 for (auto *V : Visited) {
684 if (!isa<TruncInst>(V) || Sources.count(V))
685 continue;
686 auto *Trunc = cast<TruncInst>(V);
687 TruncTysMap[Trunc].push_back(Trunc->getDestTy());
688 }
689
690 // Insert zext instructions between sources and their users.
691 ExtendSources();
692
693 // Promote visited instructions, mutating their types in place.
694 PromoteTree();
695
696 // Convert any truncs, that aren't sources, into AND masks.
697 ConvertTruncs();
698
699 // Insert trunc instructions for use by calls, stores etc...
700 TruncateSinks();
701
702 // Finally, remove unecessary zexts and truncs, delete old instructions and
703 // clear the data structures.
704 Cleanup();
705
706 LLVM_DEBUG(dbgs() << "IR Promotion: Mutation complete\n");
707}
708
709/// We disallow booleans to make life easier when dealing with icmps but allow
710/// any other integer that fits in a scalar register. Void types are accepted
711/// so we can handle switches.
712bool TypePromotionImpl::isSupportedType(Value *V) {
713 Type *Ty = V->getType();
714
715 // Allow voids and pointers, these won't be promoted.
716 if (Ty->isVoidTy() || Ty->isPointerTy())
717 return true;
718
719 if (!isa<IntegerType>(Ty) || cast<IntegerType>(Ty)->getBitWidth() == 1 ||
720 cast<IntegerType>(Ty)->getBitWidth() > RegisterBitWidth)
721 return false;
722
723 return LessOrEqualTypeSize(V);
724}
725
726/// We accept most instructions, as well as Arguments and ConstantInsts. We
727/// Disallow casts other than zext and truncs and only allow calls if their
728/// return value is zeroext. We don't allow opcodes that can introduce sign
729/// bits.
730bool TypePromotionImpl::isSupportedValue(Value *V) {
731 if (auto *I = dyn_cast<Instruction>(V)) {
732 switch (I->getOpcode()) {
733 default:
736 case Instruction::GetElementPtr:
737 case Instruction::Store:
738 case Instruction::CondBr:
739 case Instruction::Switch:
740 return true;
741 case Instruction::PHI:
742 case Instruction::Select:
743 case Instruction::Ret:
744 case Instruction::Load:
745 case Instruction::Trunc:
746 return isSupportedType(I);
747 case Instruction::BitCast:
748 return I->getOperand(0)->getType() == I->getType();
749 case Instruction::ZExt:
750 return isSupportedType(I->getOperand(0));
751 case Instruction::ICmp:
752 // Now that we allow small types than TypeSize, only allow icmp of
753 // TypeSize because they will require a trunc to be legalised.
754 // TODO: Allow icmp of smaller types, and calculate at the end
755 // whether the transform would be beneficial.
756 if (isa<PointerType>(I->getOperand(0)->getType()))
757 return true;
758 return EqualTypeSize(I->getOperand(0));
759 case Instruction::Call: {
760 // Special cases for calls as we need to check for zeroext
761 // TODO We should accept calls even if they don't have zeroext, as they
762 // can still be sinks.
763 auto *Call = cast<CallInst>(I);
764 return isSupportedType(Call) &&
765 Call->hasRetAttr(Attribute::AttrKind::ZExt);
766 }
767 }
768 } else if (isa<Constant>(V) && !isa<ConstantExpr>(V)) {
769 return isSupportedType(V);
770 } else if (isa<Argument>(V))
771 return isSupportedType(V);
772
773 return isa<BasicBlock>(V);
774}
775
776/// Check that the type of V would be promoted and that the original type is
777/// smaller than the targeted promoted type. Check that we're not trying to
778/// promote something larger than our base 'TypeSize' type.
779bool TypePromotionImpl::isLegalToPromote(Value *V) {
780 auto *I = dyn_cast<Instruction>(V);
781 if (!I)
782 return true;
783
784 if (SafeToPromote.count(I))
785 return true;
786
787 if (isPromotedResultSafe(I) || isSafeWrap(I)) {
788 SafeToPromote.insert(I);
789 return true;
790 }
791 return false;
792}
793
794bool TypePromotionImpl::TryToPromote(Value *V, unsigned PromotedWidth,
795 const LoopInfo &LI) {
796 Type *OrigTy = V->getType();
797 TypeSize = OrigTy->getPrimitiveSizeInBits().getFixedValue();
798 SafeToPromote.clear();
799 SafeWrap.clear();
800
801 if (!isSupportedValue(V) || !shouldPromote(V) || !isLegalToPromote(V))
802 return false;
803
804 LLVM_DEBUG(dbgs() << "IR Promotion: TryToPromote: " << *V << ", from "
805 << TypeSize << " bits to " << PromotedWidth << "\n");
806
807 SetVector<Value *> WorkList;
808 SetVector<Value *> Sources;
809 SetVector<Instruction *> Sinks;
810 SetVector<Value *> CurrentVisited;
811 WorkList.insert(V);
812
813 // Return true if V was added to the worklist as a supported instruction,
814 // if it was already visited, or if we don't need to explore it (e.g.
815 // pointer values and GEPs), and false otherwise.
816 auto AddLegalInst = [&](Value *V) {
817 if (CurrentVisited.count(V))
818 return true;
819
820 // Skip promoting GEPs as their indices should have already been
821 // canonicalized to pointer width.
823 return false;
824
825 if (!isSupportedValue(V) || (shouldPromote(V) && !isLegalToPromote(V))) {
826 LLVM_DEBUG(dbgs() << "IR Promotion: Can't handle: " << *V << "\n");
827 return false;
828 }
829
830 WorkList.insert(V);
831 return true;
832 };
833
834 // Iterate through, and add to, a tree of operands and users in the use-def.
835 while (!WorkList.empty()) {
836 Value *V = WorkList.pop_back_val();
837 if (CurrentVisited.count(V))
838 continue;
839
840 // Ignore non-instructions, other than arguments.
841 if (!isa<Instruction>(V) && !isSource(V))
842 continue;
843
844 // If we've already visited this value from somewhere, bail now because
845 // the tree has already been explored.
846 // TODO: This could limit the transform, ie if we try to promote something
847 // from an i8 and fail first, before trying an i16.
848 if (!AllVisited.insert(V).second)
849 return false;
850
851 CurrentVisited.insert(V);
852
853 // Calls can be both sources and sinks.
854 if (isSink(V))
855 Sinks.insert(cast<Instruction>(V));
856
857 if (isSource(V))
858 Sources.insert(V);
859
860 if (!isSink(V) && !isSource(V)) {
861 if (auto *I = dyn_cast<Instruction>(V)) {
862 // Visit operands of any instruction visited.
863 for (auto &U : I->operands()) {
864 // Skip condition of selects.
865 if (isa<SelectInst>(I) && U.getOperandNo() == 0)
866 continue;
867 if (!AddLegalInst(U))
868 return false;
869 }
870 }
871 }
872
873 // Don't visit users of a node which isn't going to be mutated unless its a
874 // source.
875 if (isSource(V) || shouldPromote(V)) {
876 for (Use &U : V->uses()) {
877 if (!AddLegalInst(U.getUser()))
878 return false;
879 }
880 }
881 }
882
883 LLVM_DEBUG({
884 dbgs() << "IR Promotion: Visited nodes:\n";
885 for (auto *I : CurrentVisited)
886 I->dump();
887 });
888
889 unsigned ToPromote = 0;
890 unsigned NonFreeArgs = 0;
891 unsigned NonLoopSources = 0, LoopSinks = 0;
892 SmallPtrSet<BasicBlock *, 4> Blocks;
893 for (auto *CV : CurrentVisited) {
894 if (auto *I = dyn_cast<Instruction>(CV))
895 Blocks.insert(I->getParent());
896
897 if (Sources.count(CV)) {
898 if (auto *Arg = dyn_cast<Argument>(CV))
899 if (!Arg->hasZExtAttr() && !Arg->hasSExtAttr())
900 ++NonFreeArgs;
901 if (!isa<Instruction>(CV) ||
902 !LI.getLoopFor(cast<Instruction>(CV)->getParent()))
903 ++NonLoopSources;
904 continue;
905 }
906
907 if (isa<PHINode>(CV))
908 continue;
909 if (LI.getLoopFor(cast<Instruction>(CV)->getParent()))
910 ++LoopSinks;
911 if (Sinks.count(cast<Instruction>(CV)))
912 continue;
913 ++ToPromote;
914 }
915
916 // DAG optimizations should be able to handle these cases better, especially
917 // for function arguments.
918 if (!isa<PHINode>(V) && !(LoopSinks && NonLoopSources) &&
919 (ToPromote < 2 || (Blocks.size() == 1 && NonFreeArgs > SafeWrap.size())))
920 return false;
921
922 IRPromoter Promoter(*Ctx, PromotedWidth, CurrentVisited, Sources, Sinks,
923 SafeWrap, InstsToRemove);
924 Promoter.Mutate();
925 return true;
926}
927
928bool TypePromotionImpl::run(Function &F, const TargetMachine *TM,
929 const TargetTransformInfo &TTI,
930 const LoopInfo &LI) {
932 return false;
933
934 LLVM_DEBUG(dbgs() << "IR Promotion: Running on " << F.getName() << "\n");
935
936 AllVisited.clear();
937 SafeToPromote.clear();
938 SafeWrap.clear();
939 bool MadeChange = false;
940 const DataLayout &DL = F.getDataLayout();
941 const TargetSubtargetInfo *SubtargetInfo = TM->getSubtargetImpl(F);
942 TLI = SubtargetInfo->getTargetLowering();
943 RegisterBitWidth =
945 Ctx = &F.getContext();
946
947 // Return the preferred integer width of the instruction, or zero if we
948 // shouldn't try.
949 auto GetPromoteWidth = [&](Instruction *I) -> uint32_t {
950 if (!isa<IntegerType>(I->getType()))
951 return 0;
952
953 EVT SrcVT = TLI->getValueType(DL, I->getType());
954 if (SrcVT.isSimple() && TLI->isTypeLegal(SrcVT.getSimpleVT()))
955 return 0;
956
957 if (TLI->getTypeAction(*Ctx, SrcVT) != TargetLowering::TypePromoteInteger)
958 return 0;
959
960 EVT PromotedVT = TLI->getTypeToTransformTo(*Ctx, SrcVT);
961 if (TLI->isSExtCheaperThanZExt(SrcVT, PromotedVT))
962 return 0;
963 if (RegisterBitWidth < PromotedVT.getFixedSizeInBits()) {
964 LLVM_DEBUG(dbgs() << "IR Promotion: Couldn't find target register "
965 << "for promoted type\n");
966 return 0;
967 }
968
969 // TODO: Should we prefer to use RegisterBitWidth instead?
970 return PromotedVT.getFixedSizeInBits();
971 };
972
973 auto BBIsInLoop = [&](BasicBlock *BB) -> bool {
974 for (auto *L : LI)
975 if (L->contains(BB))
976 return true;
977 return false;
978 };
979
980 for (BasicBlock &BB : F) {
981 for (Instruction &I : BB) {
982 if (AllVisited.count(&I))
983 continue;
984
985 if (isa<ZExtInst>(&I) && isa<PHINode>(I.getOperand(0)) &&
986 isa<IntegerType>(I.getType()) && BBIsInLoop(&BB)) {
987 LLVM_DEBUG(dbgs() << "IR Promotion: Searching from: "
988 << *I.getOperand(0) << "\n");
989 EVT ZExtVT = TLI->getValueType(DL, I.getType());
990 Instruction *Phi = static_cast<Instruction *>(I.getOperand(0));
991 auto PromoteWidth = ZExtVT.getFixedSizeInBits();
992 if (RegisterBitWidth < PromoteWidth) {
993 LLVM_DEBUG(dbgs() << "IR Promotion: Couldn't find target "
994 << "register for ZExt type\n");
995 continue;
996 }
997 MadeChange |= TryToPromote(Phi, PromoteWidth, LI);
998 } else if (auto *ICmp = dyn_cast<ICmpInst>(&I)) {
999 // Search up from icmps to try to promote their operands.
1000 // Skip signed or pointer compares
1001 if (ICmp->isSigned())
1002 continue;
1003
1004 LLVM_DEBUG(dbgs() << "IR Promotion: Searching from: " << *ICmp << "\n");
1005
1006 for (auto &Op : ICmp->operands()) {
1007 if (auto *OpI = dyn_cast<Instruction>(Op)) {
1008 if (auto PromotedWidth = GetPromoteWidth(OpI)) {
1009 MadeChange |= TryToPromote(OpI, PromotedWidth, LI);
1010 break;
1011 }
1012 }
1013 }
1014 }
1015 }
1016 if (!InstsToRemove.empty()) {
1017 for (auto *I : InstsToRemove)
1018 I->eraseFromParent();
1019 InstsToRemove.clear();
1020 }
1021 }
1022
1023 AllVisited.clear();
1024 SafeToPromote.clear();
1025 SafeWrap.clear();
1026
1027 return MadeChange;
1028}
1029
1030INITIALIZE_PASS_BEGIN(TypePromotionLegacy, DEBUG_TYPE, PASS_NAME, false, false)
1031INITIALIZE_PASS_DEPENDENCY(LoopInfoWrapperPass)
1032INITIALIZE_PASS_DEPENDENCY(TargetPassConfig)
1033INITIALIZE_PASS_DEPENDENCY(TargetTransformInfoWrapperPass)
1034INITIALIZE_PASS_END(TypePromotionLegacy, DEBUG_TYPE, PASS_NAME, false, false)
1035
1036char TypePromotionLegacy::ID = 0;
1037
1038bool TypePromotionLegacy::runOnFunction(Function &F) {
1039 if (skipFunction(F))
1040 return false;
1041
1042 auto &TPC = getAnalysis<TargetPassConfig>();
1043 auto *TM = &TPC.getTM<TargetMachine>();
1044 auto &TTI = getAnalysis<TargetTransformInfoWrapperPass>().getTTI(F);
1045 auto &LI = getAnalysis<LoopInfoWrapperPass>().getLoopInfo();
1046
1047 TypePromotionImpl TP;
1048 return TP.run(F, TM, TTI, LI);
1049}
1050
1052 return new TypePromotionLegacy();
1053}
1054
1057 auto &TTI = AM.getResult<TargetIRAnalysis>(F);
1058 auto &LI = AM.getResult<LoopAnalysis>(F);
1059 TypePromotionImpl TP;
1060
1061 bool Changed = TP.run(F, TM, TTI, LI);
1062 if (!Changed)
1063 return PreservedAnalyses::all();
1064
1067 return PA;
1068}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static bool isSupportedType(const DataLayout &DL, const ARMTargetLowering &TLI, Type *T)
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
This file contains the simple types necessary to represent the attributes associated with functions a...
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
static bool runOnFunction(Function &F, bool PostInlining)
#define DEBUG_TYPE
ManagedStatic< HTTPClientCleanup > Cleanup
iv Induction Variable Users
Definition IVUsers.cpp:48
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
#define INITIALIZE_PASS_DEPENDENCY(depName)
Definition PassSupport.h:42
#define INITIALIZE_PASS_END(passName, arg, name, cfg, analysis)
Definition PassSupport.h:44
#define INITIALIZE_PASS_BEGIN(passName, arg, name, cfg, analysis)
Definition PassSupport.h:39
This file implements a set that has insertion order iteration characteristics.
#define LLVM_DEBUG(...)
Definition Debug.h:119
This file describes how to lower LLVM code to machine code.
Target-Independent Code Generator Pass Configuration Options pass.
This pass exposes codegen information to IR-level passes.
static bool isPromotedResultSafe(Instruction *I)
Return whether we can safely mutate V's type to ExtTy without having to be concerned with zero extend...
static cl::opt< bool > DisablePromotion("disable-type-promotion", cl::Hidden, cl::init(false), cl::desc("Disable type promotion pass"))
static bool GenerateSignBits(Instruction *I)
#define PASS_NAME
Defines an IR pass for type promotion.
static unsigned getBitWidth(Type *Ty, const DataLayout &DL)
Returns the bitwidth of the given scalar or pointer type.
LLVM_ABI APInt zext(unsigned width) const
Zero extend to a new width.
Definition APInt.cpp:1055
static APInt getMaxValue(unsigned numBits)
Gets maximum unsigned value of APInt for specific bit width.
Definition APInt.h:207
bool ugt(const APInt &RHS) const
Unsigned greater than comparison.
Definition APInt.h:1191
unsigned getBitWidth() const
Return the number of bits in the APInt.
Definition APInt.h:1513
bool isNonPositive() const
Determine if this APInt Value is non-positive (<= 0).
Definition APInt.h:362
int64_t getSExtValue() const
Get sign extended value.
Definition APInt.h:1587
PassT::Result & getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs)
Get the result of an analysis pass for a given IR unit.
AnalysisUsage & addRequired()
LLVM_ABI void setPreservesCFG()
This function should be called by the pass, iff they do not:
Definition Pass.cpp:275
LLVM_ABI const_iterator getFirstInsertionPt() const
Returns an iterator to the first instruction in this block that is suitable for inserting a non-PHI i...
InstListType::iterator iterator
Instruction iterators...
Definition BasicBlock.h:170
Represents analyses that only rely on functions' control flow.
Definition Analysis.h:73
bool hasRetAttr(Attribute::AttrKind Kind) const
Determine whether the return value has the given attribute.
Value * getArgOperand(unsigned i) const
void setArgOperand(unsigned i, Value *v)
iterator_range< User::op_iterator > args()
Iteration adapter for range-for loops.
unsigned arg_size() const
const APInt & getValue() const
Return the constant as an APInt value reference.
Definition Constants.h:159
FunctionPass class - This class is used to implement most global optimizations.
Definition Pass.h:314
void SetCurrentDebugLocation(const DebugLoc &L)
Set location information used by debugging information.
Definition IRBuilder.h:221
Value * CreateZExt(Value *V, Type *DestTy, const Twine &Name="", bool IsNonNeg=false)
Definition IRBuilder.h:2121
Value * CreateAnd(Value *LHS, Value *RHS, const Twine &Name="")
Definition IRBuilder.h:1570
Value * CreateTrunc(Value *V, Type *DestTy, const Twine &Name="", bool IsNUW=false, bool IsNSW=false)
Definition IRBuilder.h:2107
void SetInsertPoint(BasicBlock *TheBB)
This specifies that created instructions should be appended to the end of the specified block.
Definition IRBuilder.h:181
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:348
unsigned getBitWidth() const
Get the number of bits in this IntegerType.
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:68
Analysis pass that exposes the LoopInfo for a function.
Definition LoopInfo.h:587
LoopT * getLoopFor(const BlockT *BB) const
Return the inner most loop that BB lives in.
A set of analyses that are preserved following a run of a transformation pass.
Definition Analysis.h:112
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
Definition Analysis.h:118
PreservedAnalyses & preserveSet()
Mark an analysis set as preserved.
Definition Analysis.h:151
A vector that has set insertion semantics.
Definition SetVector.h:57
size_type count(const_arg_type key) const
Count the number of elements of a given key in the SetVector.
Definition SetVector.h:268
bool empty() const
Determine if the SetVector is empty or not.
Definition SetVector.h:100
bool insert(const value_type &X)
Insert a new element into the SetVector.
Definition SetVector.h:157
value_type pop_back_val()
Definition SetVector.h:285
size_type size() const
Definition SmallPtrSet.h:99
A templated base class for SmallPtrSet which provides the typesafe interface that is common across al...
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.
bool contains(ConstPtrType Ptr) const
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
Analysis pass providing the TargetTransformInfo.
EVT getValueType(const DataLayout &DL, Type *Ty, bool AllowUnknown=false) const
Return the EVT corresponding to this LLVM type.
virtual bool isSExtCheaperThanZExt(EVT FromTy, EVT ToTy) const
Return true if sign-extension from FromTy to ToTy is cheaper than zero-extension.
virtual EVT getTypeToTransformTo(LLVMContext &Context, EVT VT) const
For types supported by the target, this is an identity function.
bool isTypeLegal(EVT VT) const
Return true if the target has native support for the specified value type.
virtual bool isLegalAddImmediate(int64_t) const
Return true if the specified immediate is legal add immediate, that is the target has add instruction...
LegalizeTypeAction getTypeAction(LLVMContext &Context, EVT VT) const
Return how we should legalize values of this type, either it is already legal (return 'Legal') or we ...
virtual const TargetSubtargetInfo * getSubtargetImpl(const Function &) const
Virtual method implemented by subclasses that returns a reference to that target's TargetSubtargetInf...
virtual const TargetLowering * getTargetLowering() const
LLVM_ABI TypeSize getRegisterBitWidth(RegisterKind K) const
LLVM_ABI PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM)
bool isPointerTy() const
True if this is an instance of PointerType.
Definition Type.h:282
LLVM_ABI TypeSize getPrimitiveSizeInBits() const LLVM_READONLY
Return the basic size of this type if it is a primitive type.
Definition Type.cpp:197
LLVM_ABI unsigned getScalarSizeInBits() const LLVM_READONLY
If this is a vector type, return the getPrimitiveSizeInBits value for the element type.
Definition Type.cpp:232
bool isVoidTy() const
Return true if this is 'void'.
Definition Type.h:141
LLVM Value Representation.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:255
iterator_range< use_iterator > uses()
Definition Value.h:380
constexpr ScalarTy getFixedValue() const
Definition TypeSize.h:200
self_iterator getIterator()
Definition ilist_node.h:123
CallInst * Call
Changed
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
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.
@ BasicBlock
Various leaf nodes.
Definition ISDOpcodes.h:81
initializer< Ty > init(const Ty &Val)
@ Switch
The "resume-switch" lowering, where there are separate resume and destroy functions that are shared b...
Definition CoroShape.h:32
DXILDebugInfoMap run(Module &M)
@ User
could "use" a pointer
NodeAddr< PhiNode * > Phi
Definition RDFGraph.h:390
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 bool isLegalToPromote(const CallBase &CB, Function *Callee, const char **FailureReason=nullptr)
Return true if the given indirect call site can be made to call Callee.
LLVM_ABI FunctionPass * createTypePromotionLegacyPass()
Create IR Type Promotion pass.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
@ Store
The extracted value is stored (ExtractElement only).
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
Definition InstrProf.h:143
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:209
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
TargetTransformInfo TTI
IRBuilder(LLVMContext &, FolderTy, InserterTy, MDNode *, ArrayRef< OperandBundleDef >) -> IRBuilder< FolderTy, InserterTy >
DWARFExpression::Operation Op
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
LLVMAttributeRef wrap(Attribute Attr)
Definition Attributes.h:392
AnalysisManager< Function > FunctionAnalysisManager
Convenience typedef for the Function analysis manager.
bool isSimple() const
Test if the given EVT is simple (as opposed to being extended).
Definition ValueTypes.h:145
MVT getSimpleVT() const
Return the SimpleValueType held in the specified simple EVT.
Definition ValueTypes.h:339
uint64_t getFixedSizeInBits() const
Return the size of the specified fixed width value type in bits.
Definition ValueTypes.h:404