1 //===- InstCombiner.h - InstCombine implementation --------------*- C++ -*-===// 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 /// \file 9 /// 10 /// This file provides the interface for the instcombine pass implementation. 11 /// The interface is used for generic transformations in this folder and 12 /// target specific combinations in the targets. 13 /// The visitor implementation is in \c InstCombinerImpl in 14 /// \c InstCombineInternal.h. 15 /// 16 //===----------------------------------------------------------------------===// 17 18 #ifndef LLVM_TRANSFORMS_INSTCOMBINE_INSTCOMBINER_H 19 #define LLVM_TRANSFORMS_INSTCOMBINE_INSTCOMBINER_H 20 21 #include "llvm/Analysis/InstructionSimplify.h" 22 #include "llvm/Analysis/TargetFolder.h" 23 #include "llvm/Analysis/ValueTracking.h" 24 #include "llvm/IR/IRBuilder.h" 25 #include "llvm/IR/PatternMatch.h" 26 #include "llvm/Support/Debug.h" 27 #include "llvm/Support/KnownBits.h" 28 #include <cassert> 29 30 #define DEBUG_TYPE "instcombine" 31 #include "llvm/Transforms/Utils/InstructionWorklist.h" 32 33 namespace llvm { 34 35 class AAResults; 36 class AssumptionCache; 37 class ProfileSummaryInfo; 38 class TargetLibraryInfo; 39 class TargetTransformInfo; 40 41 /// The core instruction combiner logic. 42 /// 43 /// This class provides both the logic to recursively visit instructions and 44 /// combine them. 45 class LLVM_LIBRARY_VISIBILITY InstCombiner { 46 /// Only used to call target specific intrinsic combining. 47 /// It must **NOT** be used for any other purpose, as InstCombine is a 48 /// target-independent canonicalization transform. 49 TargetTransformInfo &TTI; 50 51 public: 52 /// Maximum size of array considered when transforming. 53 uint64_t MaxArraySizeForCombine = 0; 54 55 /// An IRBuilder that automatically inserts new instructions into the 56 /// worklist. 57 using BuilderTy = IRBuilder<TargetFolder, IRBuilderCallbackInserter>; 58 BuilderTy &Builder; 59 60 protected: 61 /// A worklist of the instructions that need to be simplified. 62 InstructionWorklist &Worklist; 63 64 // Mode in which we are running the combiner. 65 const bool MinimizeSize; 66 67 AAResults *AA; 68 69 // Required analyses. 70 AssumptionCache &AC; 71 TargetLibraryInfo &TLI; 72 DominatorTree &DT; 73 const DataLayout &DL; 74 const SimplifyQuery SQ; 75 OptimizationRemarkEmitter &ORE; 76 BlockFrequencyInfo *BFI; 77 ProfileSummaryInfo *PSI; 78 79 // Optional analyses. When non-null, these can both be used to do better 80 // combining and will be updated to reflect any changes. 81 LoopInfo *LI; 82 83 bool MadeIRChange = false; 84 85 public: InstCombiner(InstructionWorklist & Worklist,BuilderTy & Builder,bool MinimizeSize,AAResults * AA,AssumptionCache & AC,TargetLibraryInfo & TLI,TargetTransformInfo & TTI,DominatorTree & DT,OptimizationRemarkEmitter & ORE,BlockFrequencyInfo * BFI,ProfileSummaryInfo * PSI,const DataLayout & DL,LoopInfo * LI)86 InstCombiner(InstructionWorklist &Worklist, BuilderTy &Builder, 87 bool MinimizeSize, AAResults *AA, AssumptionCache &AC, 88 TargetLibraryInfo &TLI, TargetTransformInfo &TTI, 89 DominatorTree &DT, OptimizationRemarkEmitter &ORE, 90 BlockFrequencyInfo *BFI, ProfileSummaryInfo *PSI, 91 const DataLayout &DL, LoopInfo *LI) 92 : TTI(TTI), Builder(Builder), Worklist(Worklist), 93 MinimizeSize(MinimizeSize), AA(AA), AC(AC), TLI(TLI), DT(DT), DL(DL), 94 SQ(DL, &TLI, &DT, &AC), ORE(ORE), BFI(BFI), PSI(PSI), LI(LI) {} 95 96 virtual ~InstCombiner() = default; 97 98 /// Return the source operand of a potentially bitcasted value while 99 /// optionally checking if it has one use. If there is no bitcast or the one 100 /// use check is not met, return the input value itself. 101 static Value *peekThroughBitcast(Value *V, bool OneUseOnly = false) { 102 if (auto *BitCast = dyn_cast<BitCastInst>(V)) 103 if (!OneUseOnly || BitCast->hasOneUse()) 104 return BitCast->getOperand(0); 105 106 // V is not a bitcast or V has more than one use and OneUseOnly is true. 107 return V; 108 } 109 110 /// Assign a complexity or rank value to LLVM Values. This is used to reduce 111 /// the amount of pattern matching needed for compares and commutative 112 /// instructions. For example, if we have: 113 /// icmp ugt X, Constant 114 /// or 115 /// xor (add X, Constant), cast Z 116 /// 117 /// We do not have to consider the commuted variants of these patterns because 118 /// canonicalization based on complexity guarantees the above ordering. 119 /// 120 /// This routine maps IR values to various complexity ranks: 121 /// 0 -> undef 122 /// 1 -> Constants 123 /// 2 -> Other non-instructions 124 /// 3 -> Arguments 125 /// 4 -> Cast and (f)neg/not instructions 126 /// 5 -> Other instructions getComplexity(Value * V)127 static unsigned getComplexity(Value *V) { 128 if (isa<Instruction>(V)) { 129 if (isa<CastInst>(V) || match(V, m_Neg(PatternMatch::m_Value())) || 130 match(V, m_Not(PatternMatch::m_Value())) || 131 match(V, m_FNeg(PatternMatch::m_Value()))) 132 return 4; 133 return 5; 134 } 135 if (isa<Argument>(V)) 136 return 3; 137 return isa<Constant>(V) ? (isa<UndefValue>(V) ? 0 : 1) : 2; 138 } 139 140 /// Predicate canonicalization reduces the number of patterns that need to be 141 /// matched by other transforms. For example, we may swap the operands of a 142 /// conditional branch or select to create a compare with a canonical 143 /// (inverted) predicate which is then more likely to be matched with other 144 /// values. isCanonicalPredicate(CmpInst::Predicate Pred)145 static bool isCanonicalPredicate(CmpInst::Predicate Pred) { 146 switch (Pred) { 147 case CmpInst::ICMP_NE: 148 case CmpInst::ICMP_ULE: 149 case CmpInst::ICMP_SLE: 150 case CmpInst::ICMP_UGE: 151 case CmpInst::ICMP_SGE: 152 // TODO: There are 16 FCMP predicates. Should others be (not) canonical? 153 case CmpInst::FCMP_ONE: 154 case CmpInst::FCMP_OLE: 155 case CmpInst::FCMP_OGE: 156 return false; 157 default: 158 return true; 159 } 160 } 161 162 /// Given an exploded icmp instruction, return true if the comparison only 163 /// checks the sign bit. If it only checks the sign bit, set TrueIfSigned if 164 /// the result of the comparison is true when the input value is signed. isSignBitCheck(ICmpInst::Predicate Pred,const APInt & RHS,bool & TrueIfSigned)165 static bool isSignBitCheck(ICmpInst::Predicate Pred, const APInt &RHS, 166 bool &TrueIfSigned) { 167 switch (Pred) { 168 case ICmpInst::ICMP_SLT: // True if LHS s< 0 169 TrueIfSigned = true; 170 return RHS.isZero(); 171 case ICmpInst::ICMP_SLE: // True if LHS s<= -1 172 TrueIfSigned = true; 173 return RHS.isAllOnes(); 174 case ICmpInst::ICMP_SGT: // True if LHS s> -1 175 TrueIfSigned = false; 176 return RHS.isAllOnes(); 177 case ICmpInst::ICMP_SGE: // True if LHS s>= 0 178 TrueIfSigned = false; 179 return RHS.isZero(); 180 case ICmpInst::ICMP_UGT: 181 // True if LHS u> RHS and RHS == sign-bit-mask - 1 182 TrueIfSigned = true; 183 return RHS.isMaxSignedValue(); 184 case ICmpInst::ICMP_UGE: 185 // True if LHS u>= RHS and RHS == sign-bit-mask (2^7, 2^15, 2^31, etc) 186 TrueIfSigned = true; 187 return RHS.isMinSignedValue(); 188 case ICmpInst::ICMP_ULT: 189 // True if LHS u< RHS and RHS == sign-bit-mask (2^7, 2^15, 2^31, etc) 190 TrueIfSigned = false; 191 return RHS.isMinSignedValue(); 192 case ICmpInst::ICMP_ULE: 193 // True if LHS u<= RHS and RHS == sign-bit-mask - 1 194 TrueIfSigned = false; 195 return RHS.isMaxSignedValue(); 196 default: 197 return false; 198 } 199 } 200 201 /// Add one to a Constant AddOne(Constant * C)202 static Constant *AddOne(Constant *C) { 203 return ConstantExpr::getAdd(C, ConstantInt::get(C->getType(), 1)); 204 } 205 206 /// Subtract one from a Constant SubOne(Constant * C)207 static Constant *SubOne(Constant *C) { 208 return ConstantExpr::getSub(C, ConstantInt::get(C->getType(), 1)); 209 } 210 211 std::optional<std::pair< 212 CmpInst::Predicate, 213 Constant *>> static getFlippedStrictnessPredicateAndConstant(CmpInst:: 214 Predicate 215 Pred, 216 Constant *C); 217 shouldAvoidAbsorbingNotIntoSelect(const SelectInst & SI)218 static bool shouldAvoidAbsorbingNotIntoSelect(const SelectInst &SI) { 219 // a ? b : false and a ? true : b are the canonical form of logical and/or. 220 // This includes !a ? b : false and !a ? true : b. Absorbing the not into 221 // the select by swapping operands would break recognition of this pattern 222 // in other analyses, so don't do that. 223 return match(&SI, PatternMatch::m_LogicalAnd(PatternMatch::m_Value(), 224 PatternMatch::m_Value())) || 225 match(&SI, PatternMatch::m_LogicalOr(PatternMatch::m_Value(), 226 PatternMatch::m_Value())); 227 } 228 229 /// Return true if the specified value is free to invert (apply ~ to). 230 /// This happens in cases where the ~ can be eliminated. If WillInvertAllUses 231 /// is true, work under the assumption that the caller intends to remove all 232 /// uses of V and only keep uses of ~V. 233 /// 234 /// See also: canFreelyInvertAllUsersOf() isFreeToInvert(Value * V,bool WillInvertAllUses)235 static bool isFreeToInvert(Value *V, bool WillInvertAllUses) { 236 // ~(~(X)) -> X. 237 if (match(V, m_Not(PatternMatch::m_Value()))) 238 return true; 239 240 // Constants can be considered to be not'ed values. 241 if (match(V, PatternMatch::m_AnyIntegralConstant())) 242 return true; 243 244 // Compares can be inverted if all of their uses are being modified to use 245 // the ~V. 246 if (isa<CmpInst>(V)) 247 return WillInvertAllUses; 248 249 // If `V` is of the form `A + Constant` then `-1 - V` can be folded into 250 // `(-1 - Constant) - A` if we are willing to invert all of the uses. 251 if (match(V, m_Add(PatternMatch::m_Value(), PatternMatch::m_ImmConstant()))) 252 return WillInvertAllUses; 253 254 // If `V` is of the form `Constant - A` then `-1 - V` can be folded into 255 // `A + (-1 - Constant)` if we are willing to invert all of the uses. 256 if (match(V, m_Sub(PatternMatch::m_ImmConstant(), PatternMatch::m_Value()))) 257 return WillInvertAllUses; 258 259 // Selects with invertible operands are freely invertible 260 if (match(V, 261 m_Select(PatternMatch::m_Value(), m_Not(PatternMatch::m_Value()), 262 m_Not(PatternMatch::m_Value())))) 263 return WillInvertAllUses; 264 265 // Min/max may be in the form of intrinsics, so handle those identically 266 // to select patterns. 267 if (match(V, m_MaxOrMin(m_Not(PatternMatch::m_Value()), 268 m_Not(PatternMatch::m_Value())))) 269 return WillInvertAllUses; 270 271 return false; 272 } 273 274 /// Given i1 V, can every user of V be freely adapted if V is changed to !V ? 275 /// InstCombine's freelyInvertAllUsersOf() must be kept in sync with this fn. 276 /// NOTE: for Instructions only! 277 /// 278 /// See also: isFreeToInvert() canFreelyInvertAllUsersOf(Instruction * V,Value * IgnoredUser)279 static bool canFreelyInvertAllUsersOf(Instruction *V, Value *IgnoredUser) { 280 // Look at every user of V. 281 for (Use &U : V->uses()) { 282 if (U.getUser() == IgnoredUser) 283 continue; // Don't consider this user. 284 285 auto *I = cast<Instruction>(U.getUser()); 286 switch (I->getOpcode()) { 287 case Instruction::Select: 288 if (U.getOperandNo() != 0) // Only if the value is used as select cond. 289 return false; 290 if (shouldAvoidAbsorbingNotIntoSelect(*cast<SelectInst>(I))) 291 return false; 292 break; 293 case Instruction::Br: 294 assert(U.getOperandNo() == 0 && "Must be branching on that value."); 295 break; // Free to invert by swapping true/false values/destinations. 296 case Instruction::Xor: // Can invert 'xor' if it's a 'not', by ignoring 297 // it. 298 if (!match(I, m_Not(PatternMatch::m_Value()))) 299 return false; // Not a 'not'. 300 break; 301 default: 302 return false; // Don't know, likely not freely invertible. 303 } 304 // So far all users were free to invert... 305 } 306 return true; // Can freely invert all users! 307 } 308 309 /// Some binary operators require special handling to avoid poison and 310 /// undefined behavior. If a constant vector has undef elements, replace those 311 /// undefs with identity constants if possible because those are always safe 312 /// to execute. If no identity constant exists, replace undef with some other 313 /// safe constant. 314 static Constant * getSafeVectorConstantForBinop(BinaryOperator::BinaryOps Opcode,Constant * In,bool IsRHSConstant)315 getSafeVectorConstantForBinop(BinaryOperator::BinaryOps Opcode, Constant *In, 316 bool IsRHSConstant) { 317 auto *InVTy = cast<FixedVectorType>(In->getType()); 318 319 Type *EltTy = InVTy->getElementType(); 320 auto *SafeC = ConstantExpr::getBinOpIdentity(Opcode, EltTy, IsRHSConstant); 321 if (!SafeC) { 322 // TODO: Should this be available as a constant utility function? It is 323 // similar to getBinOpAbsorber(). 324 if (IsRHSConstant) { 325 switch (Opcode) { 326 case Instruction::SRem: // X % 1 = 0 327 case Instruction::URem: // X %u 1 = 0 328 SafeC = ConstantInt::get(EltTy, 1); 329 break; 330 case Instruction::FRem: // X % 1.0 (doesn't simplify, but it is safe) 331 SafeC = ConstantFP::get(EltTy, 1.0); 332 break; 333 default: 334 llvm_unreachable( 335 "Only rem opcodes have no identity constant for RHS"); 336 } 337 } else { 338 switch (Opcode) { 339 case Instruction::Shl: // 0 << X = 0 340 case Instruction::LShr: // 0 >>u X = 0 341 case Instruction::AShr: // 0 >> X = 0 342 case Instruction::SDiv: // 0 / X = 0 343 case Instruction::UDiv: // 0 /u X = 0 344 case Instruction::SRem: // 0 % X = 0 345 case Instruction::URem: // 0 %u X = 0 346 case Instruction::Sub: // 0 - X (doesn't simplify, but it is safe) 347 case Instruction::FSub: // 0.0 - X (doesn't simplify, but it is safe) 348 case Instruction::FDiv: // 0.0 / X (doesn't simplify, but it is safe) 349 case Instruction::FRem: // 0.0 % X = 0 350 SafeC = Constant::getNullValue(EltTy); 351 break; 352 default: 353 llvm_unreachable("Expected to find identity constant for opcode"); 354 } 355 } 356 } 357 assert(SafeC && "Must have safe constant for binop"); 358 unsigned NumElts = InVTy->getNumElements(); 359 SmallVector<Constant *, 16> Out(NumElts); 360 for (unsigned i = 0; i != NumElts; ++i) { 361 Constant *C = In->getAggregateElement(i); 362 Out[i] = isa<UndefValue>(C) ? SafeC : C; 363 } 364 return ConstantVector::get(Out); 365 } 366 addToWorklist(Instruction * I)367 void addToWorklist(Instruction *I) { Worklist.push(I); } 368 getAssumptionCache()369 AssumptionCache &getAssumptionCache() const { return AC; } getTargetLibraryInfo()370 TargetLibraryInfo &getTargetLibraryInfo() const { return TLI; } getDominatorTree()371 DominatorTree &getDominatorTree() const { return DT; } getDataLayout()372 const DataLayout &getDataLayout() const { return DL; } getSimplifyQuery()373 const SimplifyQuery &getSimplifyQuery() const { return SQ; } getOptimizationRemarkEmitter()374 OptimizationRemarkEmitter &getOptimizationRemarkEmitter() const { 375 return ORE; 376 } getBlockFrequencyInfo()377 BlockFrequencyInfo *getBlockFrequencyInfo() const { return BFI; } getProfileSummaryInfo()378 ProfileSummaryInfo *getProfileSummaryInfo() const { return PSI; } getLoopInfo()379 LoopInfo *getLoopInfo() const { return LI; } 380 381 // Call target specific combiners 382 std::optional<Instruction *> targetInstCombineIntrinsic(IntrinsicInst &II); 383 std::optional<Value *> 384 targetSimplifyDemandedUseBitsIntrinsic(IntrinsicInst &II, APInt DemandedMask, 385 KnownBits &Known, 386 bool &KnownBitsComputed); 387 std::optional<Value *> targetSimplifyDemandedVectorEltsIntrinsic( 388 IntrinsicInst &II, APInt DemandedElts, APInt &UndefElts, 389 APInt &UndefElts2, APInt &UndefElts3, 390 std::function<void(Instruction *, unsigned, APInt, APInt &)> 391 SimplifyAndSetOp); 392 393 /// Inserts an instruction \p New before instruction \p Old 394 /// 395 /// Also adds the new instruction to the worklist and returns \p New so that 396 /// it is suitable for use as the return from the visitation patterns. InsertNewInstBefore(Instruction * New,Instruction & Old)397 Instruction *InsertNewInstBefore(Instruction *New, Instruction &Old) { 398 assert(New && !New->getParent() && 399 "New instruction already inserted into a basic block!"); 400 BasicBlock *BB = Old.getParent(); 401 New->insertInto(BB, Old.getIterator()); // Insert inst 402 Worklist.add(New); 403 return New; 404 } 405 406 /// Same as InsertNewInstBefore, but also sets the debug loc. InsertNewInstWith(Instruction * New,Instruction & Old)407 Instruction *InsertNewInstWith(Instruction *New, Instruction &Old) { 408 New->setDebugLoc(Old.getDebugLoc()); 409 return InsertNewInstBefore(New, Old); 410 } 411 412 /// A combiner-aware RAUW-like routine. 413 /// 414 /// This method is to be used when an instruction is found to be dead, 415 /// replaceable with another preexisting expression. Here we add all uses of 416 /// I to the worklist, replace all uses of I with the new value, then return 417 /// I, so that the inst combiner will know that I was modified. replaceInstUsesWith(Instruction & I,Value * V)418 Instruction *replaceInstUsesWith(Instruction &I, Value *V) { 419 // If there are no uses to replace, then we return nullptr to indicate that 420 // no changes were made to the program. 421 if (I.use_empty()) return nullptr; 422 423 Worklist.pushUsersToWorkList(I); // Add all modified instrs to worklist. 424 425 // If we are replacing the instruction with itself, this must be in a 426 // segment of unreachable code, so just clobber the instruction. 427 if (&I == V) 428 V = PoisonValue::get(I.getType()); 429 430 LLVM_DEBUG(dbgs() << "IC: Replacing " << I << "\n" 431 << " with " << *V << '\n'); 432 433 // If V is a new unnamed instruction, take the name from the old one. 434 if (V->use_empty() && isa<Instruction>(V) && !V->hasName() && I.hasName()) 435 V->takeName(&I); 436 437 I.replaceAllUsesWith(V); 438 return &I; 439 } 440 441 /// Replace operand of instruction and add old operand to the worklist. replaceOperand(Instruction & I,unsigned OpNum,Value * V)442 Instruction *replaceOperand(Instruction &I, unsigned OpNum, Value *V) { 443 Worklist.addValue(I.getOperand(OpNum)); 444 I.setOperand(OpNum, V); 445 return &I; 446 } 447 448 /// Replace use and add the previously used value to the worklist. replaceUse(Use & U,Value * NewValue)449 void replaceUse(Use &U, Value *NewValue) { 450 Worklist.addValue(U); 451 U = NewValue; 452 } 453 454 /// Combiner aware instruction erasure. 455 /// 456 /// When dealing with an instruction that has side effects or produces a void 457 /// value, we can't rely on DCE to delete the instruction. Instead, visit 458 /// methods should return the value returned by this function. 459 virtual Instruction *eraseInstFromFunction(Instruction &I) = 0; 460 computeKnownBits(const Value * V,KnownBits & Known,unsigned Depth,const Instruction * CxtI)461 void computeKnownBits(const Value *V, KnownBits &Known, unsigned Depth, 462 const Instruction *CxtI) const { 463 llvm::computeKnownBits(V, Known, DL, Depth, &AC, CxtI, &DT); 464 } 465 computeKnownBits(const Value * V,unsigned Depth,const Instruction * CxtI)466 KnownBits computeKnownBits(const Value *V, unsigned Depth, 467 const Instruction *CxtI) const { 468 return llvm::computeKnownBits(V, DL, Depth, &AC, CxtI, &DT); 469 } 470 471 bool isKnownToBeAPowerOfTwo(const Value *V, bool OrZero = false, 472 unsigned Depth = 0, 473 const Instruction *CxtI = nullptr) { 474 return llvm::isKnownToBeAPowerOfTwo(V, DL, OrZero, Depth, &AC, CxtI, &DT); 475 } 476 477 bool MaskedValueIsZero(const Value *V, const APInt &Mask, unsigned Depth = 0, 478 const Instruction *CxtI = nullptr) const { 479 return llvm::MaskedValueIsZero(V, Mask, DL, Depth, &AC, CxtI, &DT); 480 } 481 482 unsigned ComputeNumSignBits(const Value *Op, unsigned Depth = 0, 483 const Instruction *CxtI = nullptr) const { 484 return llvm::ComputeNumSignBits(Op, DL, Depth, &AC, CxtI, &DT); 485 } 486 487 unsigned ComputeMaxSignificantBits(const Value *Op, unsigned Depth = 0, 488 const Instruction *CxtI = nullptr) const { 489 return llvm::ComputeMaxSignificantBits(Op, DL, Depth, &AC, CxtI, &DT); 490 } 491 computeOverflowForUnsignedMul(const Value * LHS,const Value * RHS,const Instruction * CxtI)492 OverflowResult computeOverflowForUnsignedMul(const Value *LHS, 493 const Value *RHS, 494 const Instruction *CxtI) const { 495 return llvm::computeOverflowForUnsignedMul(LHS, RHS, DL, &AC, CxtI, &DT); 496 } 497 computeOverflowForSignedMul(const Value * LHS,const Value * RHS,const Instruction * CxtI)498 OverflowResult computeOverflowForSignedMul(const Value *LHS, const Value *RHS, 499 const Instruction *CxtI) const { 500 return llvm::computeOverflowForSignedMul(LHS, RHS, DL, &AC, CxtI, &DT); 501 } 502 computeOverflowForUnsignedAdd(const Value * LHS,const Value * RHS,const Instruction * CxtI)503 OverflowResult computeOverflowForUnsignedAdd(const Value *LHS, 504 const Value *RHS, 505 const Instruction *CxtI) const { 506 return llvm::computeOverflowForUnsignedAdd(LHS, RHS, DL, &AC, CxtI, &DT); 507 } 508 computeOverflowForSignedAdd(const Value * LHS,const Value * RHS,const Instruction * CxtI)509 OverflowResult computeOverflowForSignedAdd(const Value *LHS, const Value *RHS, 510 const Instruction *CxtI) const { 511 return llvm::computeOverflowForSignedAdd(LHS, RHS, DL, &AC, CxtI, &DT); 512 } 513 computeOverflowForUnsignedSub(const Value * LHS,const Value * RHS,const Instruction * CxtI)514 OverflowResult computeOverflowForUnsignedSub(const Value *LHS, 515 const Value *RHS, 516 const Instruction *CxtI) const { 517 return llvm::computeOverflowForUnsignedSub(LHS, RHS, DL, &AC, CxtI, &DT); 518 } 519 computeOverflowForSignedSub(const Value * LHS,const Value * RHS,const Instruction * CxtI)520 OverflowResult computeOverflowForSignedSub(const Value *LHS, const Value *RHS, 521 const Instruction *CxtI) const { 522 return llvm::computeOverflowForSignedSub(LHS, RHS, DL, &AC, CxtI, &DT); 523 } 524 525 virtual bool SimplifyDemandedBits(Instruction *I, unsigned OpNo, 526 const APInt &DemandedMask, KnownBits &Known, 527 unsigned Depth = 0) = 0; 528 virtual Value * 529 SimplifyDemandedVectorElts(Value *V, APInt DemandedElts, APInt &UndefElts, 530 unsigned Depth = 0, 531 bool AllowMultipleUsers = false) = 0; 532 }; 533 534 } // namespace llvm 535 536 #undef DEBUG_TYPE 537 538 #endif 539