| 1 | //===- InstCombineNegator.cpp -----------------------------------*- 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 | // |
| 9 | // This file implements sinking of negation into expression trees, |
| 10 | // as long as that can be done without increasing instruction count. |
| 11 | // |
| 12 | //===----------------------------------------------------------------------===// |
| 13 | |
| 14 | #include "InstCombineInternal.h" |
| 15 | #include "llvm/ADT/APInt.h" |
| 16 | #include "llvm/ADT/ArrayRef.h" |
| 17 | #include "llvm/ADT/DenseMap.h" |
| 18 | #include "llvm/ADT/STLExtras.h" |
| 19 | #include "llvm/ADT/SmallVector.h" |
| 20 | #include "llvm/ADT/Statistic.h" |
| 21 | #include "llvm/ADT/StringRef.h" |
| 22 | #include "llvm/ADT/Twine.h" |
| 23 | #include "llvm/Analysis/TargetFolder.h" |
| 24 | #include "llvm/Analysis/ValueTracking.h" |
| 25 | #include "llvm/IR/Constant.h" |
| 26 | #include "llvm/IR/Constants.h" |
| 27 | #include "llvm/IR/DebugLoc.h" |
| 28 | #include "llvm/IR/IRBuilder.h" |
| 29 | #include "llvm/IR/Instruction.h" |
| 30 | #include "llvm/IR/Instructions.h" |
| 31 | #include "llvm/IR/PatternMatch.h" |
| 32 | #include "llvm/IR/Type.h" |
| 33 | #include "llvm/IR/Use.h" |
| 34 | #include "llvm/IR/User.h" |
| 35 | #include "llvm/IR/Value.h" |
| 36 | #include "llvm/Support/Casting.h" |
| 37 | #include "llvm/Support/CommandLine.h" |
| 38 | #include "llvm/Support/Compiler.h" |
| 39 | #include "llvm/Support/DebugCounter.h" |
| 40 | #include "llvm/Support/ErrorHandling.h" |
| 41 | #include "llvm/Support/raw_ostream.h" |
| 42 | #include "llvm/Transforms/InstCombine/InstCombiner.h" |
| 43 | #include <cassert> |
| 44 | #include <cstdint> |
| 45 | #include <functional> |
| 46 | #include <utility> |
| 47 | |
| 48 | using namespace llvm; |
| 49 | using namespace llvm::PatternMatch; |
| 50 | |
| 51 | #define DEBUG_TYPE "instcombine" |
| 52 | |
| 53 | STATISTIC(NegatorTotalNegationsAttempted, |
| 54 | "Negator: Number of negations attempted to be sinked" ); |
| 55 | STATISTIC(NegatorNumTreesNegated, |
| 56 | "Negator: Number of negations successfully sinked" ); |
| 57 | STATISTIC(NegatorMaxDepthVisited, "Negator: Maximal traversal depth ever " |
| 58 | "reached while attempting to sink negation" ); |
| 59 | STATISTIC(NegatorTimesDepthLimitReached, |
| 60 | "Negator: How many times did the traversal depth limit was reached " |
| 61 | "during sinking" ); |
| 62 | STATISTIC( |
| 63 | NegatorNumValuesVisited, |
| 64 | "Negator: Total number of values visited during attempts to sink negation" ); |
| 65 | STATISTIC(NegatorNumNegationsFoundInCache, |
| 66 | "Negator: How many negations did we retrieve/reuse from cache" ); |
| 67 | STATISTIC(NegatorMaxTotalValuesVisited, |
| 68 | "Negator: Maximal number of values ever visited while attempting to " |
| 69 | "sink negation" ); |
| 70 | STATISTIC(NegatorNumInstructionsCreatedTotal, |
| 71 | "Negator: Number of new negated instructions created, total" ); |
| 72 | STATISTIC(NegatorMaxInstructionsCreated, |
| 73 | "Negator: Maximal number of new instructions created during negation " |
| 74 | "attempt" ); |
| 75 | STATISTIC(NegatorNumInstructionsNegatedSuccess, |
| 76 | "Negator: Number of new negated instructions created in successful " |
| 77 | "negation sinking attempts" ); |
| 78 | |
| 79 | DEBUG_COUNTER(NegatorCounter, "instcombine-negator" , |
| 80 | "Controls Negator transformations in InstCombine pass" ); |
| 81 | |
| 82 | static cl::opt<bool> |
| 83 | NegatorEnabled("instcombine-negator-enabled" , cl::init(Val: true), |
| 84 | cl::desc("Should we attempt to sink negations?" )); |
| 85 | |
| 86 | static cl::opt<unsigned> |
| 87 | NegatorMaxDepth("instcombine-negator-max-depth" , |
| 88 | cl::init(Val: NegatorDefaultMaxDepth), |
| 89 | cl::desc("What is the maximal lookup depth when trying to " |
| 90 | "check for viability of negation sinking." )); |
| 91 | |
| 92 | Negator::Negator(LLVMContext &C, const DataLayout &DL, const DominatorTree &DT_, |
| 93 | bool IsTrulyNegation_) |
| 94 | : Builder(C, TargetFolder(DL), |
| 95 | IRBuilderCallbackInserter([&](Instruction *I) { |
| 96 | ++NegatorNumInstructionsCreatedTotal; |
| 97 | NewInstructions.push_back(Elt: I); |
| 98 | })), |
| 99 | DT(DT_), IsTrulyNegation(IsTrulyNegation_) {} |
| 100 | |
| 101 | #if LLVM_ENABLE_STATS |
| 102 | Negator::~Negator() { |
| 103 | NegatorMaxTotalValuesVisited.updateMax(NumValuesVisitedInThisNegator); |
| 104 | } |
| 105 | #endif |
| 106 | |
| 107 | // Due to the InstCombine's worklist management, there are no guarantees that |
| 108 | // each instruction we'll encounter has been visited by InstCombine already. |
| 109 | // In particular, most importantly for us, that means we have to canonicalize |
| 110 | // constants to RHS ourselves, since that is helpful sometimes. |
| 111 | std::array<Value *, 2> Negator::getSortedOperandsOfBinOp(Instruction *I) { |
| 112 | assert(I->getNumOperands() == 2 && "Only for binops!" ); |
| 113 | std::array<Value *, 2> Ops{I->getOperand(i: 0), I->getOperand(i: 1)}; |
| 114 | if (I->isCommutative() && InstCombiner::getComplexity(V: I->getOperand(i: 0)) < |
| 115 | InstCombiner::getComplexity(V: I->getOperand(i: 1))) |
| 116 | std::swap(a&: Ops[0], b&: Ops[1]); |
| 117 | return Ops; |
| 118 | } |
| 119 | |
| 120 | // FIXME: can this be reworked into a worklist-based algorithm while preserving |
| 121 | // the depth-first, early bailout traversal? |
| 122 | [[nodiscard]] Value *Negator::visitImpl(Value *V, bool IsNSW, unsigned Depth) { |
| 123 | // -(undef) -> undef. |
| 124 | if (match(V, P: m_Undef())) |
| 125 | return V; |
| 126 | |
| 127 | // In i1, negation can simply be ignored. |
| 128 | if (V->getType()->isIntOrIntVectorTy(BitWidth: 1)) |
| 129 | return V; |
| 130 | |
| 131 | Value *X; |
| 132 | |
| 133 | // -(-(X)) -> X. |
| 134 | if (match(V, P: m_Neg(V: m_Value(V&: X)))) |
| 135 | return X; |
| 136 | |
| 137 | // Integral constants can be freely negated. |
| 138 | if (match(V, P: m_AnyIntegralConstant())) |
| 139 | return ConstantExpr::getNeg(C: cast<Constant>(Val: V), |
| 140 | /*HasNSW=*/false); |
| 141 | |
| 142 | // If we have a non-instruction, then give up. |
| 143 | if (!isa<Instruction>(Val: V)) |
| 144 | return nullptr; |
| 145 | |
| 146 | // If we have started with a true negation (i.e. `sub 0, %y`), then if we've |
| 147 | // got instruction that does not require recursive reasoning, we can still |
| 148 | // negate it even if it has other uses, without increasing instruction count. |
| 149 | if (!V->hasOneUse() && !IsTrulyNegation) |
| 150 | return nullptr; |
| 151 | |
| 152 | auto *I = cast<Instruction>(Val: V); |
| 153 | unsigned BitWidth = I->getType()->getScalarSizeInBits(); |
| 154 | |
| 155 | // We must preserve the insertion point and debug info that is set in the |
| 156 | // builder at the time this function is called. |
| 157 | InstCombiner::BuilderTy::InsertPointGuard Guard(Builder); |
| 158 | // And since we are trying to negate instruction I, that tells us about the |
| 159 | // insertion point and the debug info that we need to keep. |
| 160 | Builder.SetInsertPoint(I); |
| 161 | |
| 162 | // In some cases we can give the answer without further recursion. |
| 163 | switch (I->getOpcode()) { |
| 164 | case Instruction::Add: { |
| 165 | std::array<Value *, 2> Ops = getSortedOperandsOfBinOp(I); |
| 166 | // `inc` is always negatible. |
| 167 | if (match(V: Ops[1], P: m_One())) |
| 168 | return Builder.CreateNot(V: Ops[0], Name: I->getName() + ".neg" ); |
| 169 | break; |
| 170 | } |
| 171 | case Instruction::Xor: |
| 172 | // `not` is always negatible. |
| 173 | if (match(V: I, P: m_Not(V: m_Value(V&: X)))) |
| 174 | return Builder.CreateAdd(LHS: X, RHS: ConstantInt::get(Ty: X->getType(), V: 1), |
| 175 | Name: I->getName() + ".neg" ); |
| 176 | break; |
| 177 | case Instruction::AShr: |
| 178 | case Instruction::LShr: { |
| 179 | // Right-shift sign bit smear is negatible. |
| 180 | const APInt *Op1Val; |
| 181 | if (match(V: I->getOperand(i: 1), P: m_APInt(Res&: Op1Val)) && *Op1Val == BitWidth - 1) { |
| 182 | Value *BO = I->getOpcode() == Instruction::AShr |
| 183 | ? Builder.CreateLShr(LHS: I->getOperand(i: 0), RHS: I->getOperand(i: 1)) |
| 184 | : Builder.CreateAShr(LHS: I->getOperand(i: 0), RHS: I->getOperand(i: 1)); |
| 185 | if (auto *NewInstr = dyn_cast<Instruction>(Val: BO)) { |
| 186 | NewInstr->copyIRFlags(V: I); |
| 187 | NewInstr->setName(I->getName() + ".neg" ); |
| 188 | } |
| 189 | return BO; |
| 190 | } |
| 191 | // While we could negate exact arithmetic shift: |
| 192 | // ashr exact %x, C --> sdiv exact i8 %x, -1<<C |
| 193 | // iff C != 0 and C u< bitwidth(%x), we don't want to, |
| 194 | // because division is *THAT* much worse than a shift. |
| 195 | break; |
| 196 | } |
| 197 | case Instruction::SExt: |
| 198 | case Instruction::ZExt: |
| 199 | // `*ext` of i1 is always negatible |
| 200 | if (I->getOperand(i: 0)->getType()->isIntOrIntVectorTy(BitWidth: 1)) |
| 201 | return I->getOpcode() == Instruction::SExt |
| 202 | ? Builder.CreateZExt(V: I->getOperand(i: 0), DestTy: I->getType(), |
| 203 | Name: I->getName() + ".neg" ) |
| 204 | : Builder.CreateSExt(V: I->getOperand(i: 0), DestTy: I->getType(), |
| 205 | Name: I->getName() + ".neg" ); |
| 206 | break; |
| 207 | case Instruction::Select: { |
| 208 | // If both arms of the select are constants, we don't need to recurse. |
| 209 | // Therefore, this transform is not limited by uses. |
| 210 | auto *Sel = cast<SelectInst>(Val: I); |
| 211 | Constant *TrueC, *FalseC; |
| 212 | if (match(V: Sel->getTrueValue(), P: m_ImmConstant(C&: TrueC)) && |
| 213 | match(V: Sel->getFalseValue(), P: m_ImmConstant(C&: FalseC))) { |
| 214 | Constant *NegTrueC = ConstantExpr::getNeg(C: TrueC); |
| 215 | Constant *NegFalseC = ConstantExpr::getNeg(C: FalseC); |
| 216 | return Builder.CreateSelect(C: Sel->getCondition(), True: NegTrueC, False: NegFalseC, |
| 217 | Name: I->getName() + ".neg" , /*MDFrom=*/I); |
| 218 | } |
| 219 | break; |
| 220 | } |
| 221 | case Instruction::Call: |
| 222 | if (auto *CI = dyn_cast<CmpIntrinsic>(Val: I); CI && CI->hasOneUse()) |
| 223 | return Builder.CreateIntrinsic(RetTy: CI->getType(), ID: CI->getIntrinsicID(), |
| 224 | Args: {CI->getRHS(), CI->getLHS()}); |
| 225 | break; |
| 226 | default: |
| 227 | break; // Other instructions require recursive reasoning. |
| 228 | } |
| 229 | |
| 230 | if (I->getOpcode() == Instruction::Sub && |
| 231 | (I->hasOneUse() || match(V: I->getOperand(i: 0), P: m_ImmConstant()))) { |
| 232 | // `sub` is always negatible. |
| 233 | // However, only do this either if the old `sub` doesn't stick around, or |
| 234 | // it was subtracting from a constant. Otherwise, this isn't profitable. |
| 235 | return Builder.CreateSub(LHS: I->getOperand(i: 1), RHS: I->getOperand(i: 0), |
| 236 | Name: I->getName() + ".neg" , /*HasNUW=*/false, |
| 237 | HasNSW: IsNSW && I->hasNoSignedWrap()); |
| 238 | } |
| 239 | |
| 240 | // Some other cases, while still don't require recursion, |
| 241 | // are restricted to the one-use case. |
| 242 | if (!V->hasOneUse()) |
| 243 | return nullptr; |
| 244 | |
| 245 | switch (I->getOpcode()) { |
| 246 | case Instruction::ZExt: { |
| 247 | // Negation of zext of signbit is signbit splat: |
| 248 | // 0 - (zext (i8 X u>> 7) to iN) --> sext (i8 X s>> 7) to iN |
| 249 | Value *SrcOp = I->getOperand(i: 0); |
| 250 | unsigned SrcWidth = SrcOp->getType()->getScalarSizeInBits(); |
| 251 | const APInt &FullShift = APInt(SrcWidth, SrcWidth - 1); |
| 252 | if (IsTrulyNegation && |
| 253 | match(V: SrcOp, P: m_LShr(L: m_Value(V&: X), R: m_SpecificIntAllowPoison(V: FullShift)))) { |
| 254 | Value *Ashr = Builder.CreateAShr(LHS: X, RHS: FullShift); |
| 255 | return Builder.CreateSExt(V: Ashr, DestTy: I->getType()); |
| 256 | } |
| 257 | break; |
| 258 | } |
| 259 | case Instruction::And: { |
| 260 | Constant *ShAmt; |
| 261 | // sub(y,and(lshr(x,C),1)) --> add(ashr(shl(x,(BW-1)-C),BW-1),y) |
| 262 | if (match(V: I, P: m_And(L: m_OneUse(SubPattern: m_TruncOrSelf( |
| 263 | Op: m_LShr(L: m_Value(V&: X), R: m_ImmConstant(C&: ShAmt)))), |
| 264 | R: m_One()))) { |
| 265 | unsigned BW = X->getType()->getScalarSizeInBits(); |
| 266 | Constant *BWMinusOne = ConstantInt::get(Ty: X->getType(), V: BW - 1); |
| 267 | Value *R = Builder.CreateShl(LHS: X, RHS: Builder.CreateSub(LHS: BWMinusOne, RHS: ShAmt)); |
| 268 | R = Builder.CreateAShr(LHS: R, RHS: BWMinusOne); |
| 269 | return Builder.CreateTruncOrBitCast(V: R, DestTy: I->getType()); |
| 270 | } |
| 271 | break; |
| 272 | } |
| 273 | case Instruction::SDiv: |
| 274 | // `sdiv` is negatible if divisor is not undef/INT_MIN/1. |
| 275 | // While this is normally not behind a use-check, |
| 276 | // let's consider division to be special since it's costly. |
| 277 | if (auto *Op1C = dyn_cast<Constant>(Val: I->getOperand(i: 1))) { |
| 278 | if (!Op1C->containsUndefOrPoisonElement() && |
| 279 | Op1C->isNotMinSignedValue() && Op1C->isNotOneValue()) { |
| 280 | Value *BO = |
| 281 | Builder.CreateSDiv(LHS: I->getOperand(i: 0), RHS: ConstantExpr::getNeg(C: Op1C), |
| 282 | Name: I->getName() + ".neg" ); |
| 283 | if (auto *NewInstr = dyn_cast<Instruction>(Val: BO)) |
| 284 | NewInstr->setIsExact(I->isExact()); |
| 285 | return BO; |
| 286 | } |
| 287 | } |
| 288 | break; |
| 289 | } |
| 290 | |
| 291 | // Rest of the logic is recursive, so if it's time to give up then it's time. |
| 292 | if (Depth > NegatorMaxDepth) { |
| 293 | LLVM_DEBUG(dbgs() << "Negator: reached maximal allowed traversal depth in " |
| 294 | << *V << ". Giving up.\n" ); |
| 295 | ++NegatorTimesDepthLimitReached; |
| 296 | return nullptr; |
| 297 | } |
| 298 | |
| 299 | switch (I->getOpcode()) { |
| 300 | case Instruction::Freeze: { |
| 301 | // `freeze` is negatible if its operand is negatible. |
| 302 | Value *NegOp = negate(V: I->getOperand(i: 0), IsNSW, Depth: Depth + 1); |
| 303 | if (!NegOp) // Early return. |
| 304 | return nullptr; |
| 305 | return Builder.CreateFreeze(V: NegOp, Name: I->getName() + ".neg" ); |
| 306 | } |
| 307 | case Instruction::PHI: { |
| 308 | // `phi` is negatible if all the incoming values are negatible. |
| 309 | auto *PHI = cast<PHINode>(Val: I); |
| 310 | SmallVector<Value *, 4> NegatedIncomingValues(PHI->getNumOperands()); |
| 311 | for (auto I : zip(t: PHI->incoming_values(), u&: NegatedIncomingValues)) { |
| 312 | // Don't negate indvars to avoid infinite loops. |
| 313 | if (DT.dominates(BB: PHI->getParent(), U: std::get<0>(t&: I))) |
| 314 | return nullptr; |
| 315 | if (!(std::get<1>(t&: I) = |
| 316 | negate(V: std::get<0>(t&: I), IsNSW, Depth: Depth + 1))) // Early return. |
| 317 | return nullptr; |
| 318 | } |
| 319 | // All incoming values are indeed negatible. Create negated PHI node. |
| 320 | PHINode *NegatedPHI = Builder.CreatePHI( |
| 321 | Ty: PHI->getType(), NumReservedValues: PHI->getNumOperands(), Name: PHI->getName() + ".neg" ); |
| 322 | for (auto I : zip(t&: NegatedIncomingValues, u: PHI->blocks())) |
| 323 | NegatedPHI->addIncoming(V: std::get<0>(t&: I), BB: std::get<1>(t&: I)); |
| 324 | return NegatedPHI; |
| 325 | } |
| 326 | case Instruction::Select: { |
| 327 | if (isKnownNegation(X: I->getOperand(i: 1), Y: I->getOperand(i: 2), /*NeedNSW=*/false, |
| 328 | /*AllowPoison=*/false)) { |
| 329 | // Of one hand of select is known to be negation of another hand, |
| 330 | // just swap the hands around. |
| 331 | auto *NewSelect = cast<SelectInst>(Val: I->clone()); |
| 332 | // Just swap the operands of the select. |
| 333 | NewSelect->swapValues(); |
| 334 | // Don't swap prof metadata, we didn't change the branch behavior. |
| 335 | NewSelect->setName(I->getName() + ".neg" ); |
| 336 | // Poison-generating flags should be dropped |
| 337 | Value *TV = NewSelect->getTrueValue(); |
| 338 | Value *FV = NewSelect->getFalseValue(); |
| 339 | if (match(V: TV, P: m_Neg(V: m_Specific(V: FV)))) |
| 340 | cast<Instruction>(Val: TV)->dropPoisonGeneratingFlags(); |
| 341 | else if (match(V: FV, P: m_Neg(V: m_Specific(V: TV)))) |
| 342 | cast<Instruction>(Val: FV)->dropPoisonGeneratingFlags(); |
| 343 | else { |
| 344 | cast<Instruction>(Val: TV)->dropPoisonGeneratingFlags(); |
| 345 | cast<Instruction>(Val: FV)->dropPoisonGeneratingFlags(); |
| 346 | } |
| 347 | Builder.Insert(I: NewSelect); |
| 348 | return NewSelect; |
| 349 | } |
| 350 | // `select` is negatible if both hands of `select` are negatible. |
| 351 | Value *NegOp1 = negate(V: I->getOperand(i: 1), IsNSW, Depth: Depth + 1); |
| 352 | if (!NegOp1) // Early return. |
| 353 | return nullptr; |
| 354 | Value *NegOp2 = negate(V: I->getOperand(i: 2), IsNSW, Depth: Depth + 1); |
| 355 | if (!NegOp2) |
| 356 | return nullptr; |
| 357 | // Do preserve the metadata! |
| 358 | return Builder.CreateSelect(C: I->getOperand(i: 0), True: NegOp1, False: NegOp2, |
| 359 | Name: I->getName() + ".neg" , /*MDFrom=*/I); |
| 360 | } |
| 361 | case Instruction::ShuffleVector: { |
| 362 | // `shufflevector` is negatible if both operands are negatible. |
| 363 | auto *Shuf = cast<ShuffleVectorInst>(Val: I); |
| 364 | Value *NegOp0 = negate(V: I->getOperand(i: 0), IsNSW, Depth: Depth + 1); |
| 365 | if (!NegOp0) // Early return. |
| 366 | return nullptr; |
| 367 | Value *NegOp1 = negate(V: I->getOperand(i: 1), IsNSW, Depth: Depth + 1); |
| 368 | if (!NegOp1) |
| 369 | return nullptr; |
| 370 | return Builder.CreateShuffleVector(V1: NegOp0, V2: NegOp1, Mask: Shuf->getShuffleMask(), |
| 371 | Name: I->getName() + ".neg" ); |
| 372 | } |
| 373 | case Instruction::ExtractElement: { |
| 374 | // `extractelement` is negatible if source operand is negatible. |
| 375 | auto *EEI = cast<ExtractElementInst>(Val: I); |
| 376 | Value *NegVector = negate(V: EEI->getVectorOperand(), IsNSW, Depth: Depth + 1); |
| 377 | if (!NegVector) // Early return. |
| 378 | return nullptr; |
| 379 | return Builder.CreateExtractElement(Vec: NegVector, Idx: EEI->getIndexOperand(), |
| 380 | Name: I->getName() + ".neg" ); |
| 381 | } |
| 382 | case Instruction::InsertElement: { |
| 383 | // `insertelement` is negatible if both the source vector and |
| 384 | // element-to-be-inserted are negatible. |
| 385 | auto *IEI = cast<InsertElementInst>(Val: I); |
| 386 | Value *NegVector = negate(V: IEI->getOperand(i_nocapture: 0), IsNSW, Depth: Depth + 1); |
| 387 | if (!NegVector) // Early return. |
| 388 | return nullptr; |
| 389 | Value *NegNewElt = negate(V: IEI->getOperand(i_nocapture: 1), IsNSW, Depth: Depth + 1); |
| 390 | if (!NegNewElt) // Early return. |
| 391 | return nullptr; |
| 392 | return Builder.CreateInsertElement(Vec: NegVector, NewElt: NegNewElt, Idx: IEI->getOperand(i_nocapture: 2), |
| 393 | Name: I->getName() + ".neg" ); |
| 394 | } |
| 395 | case Instruction::Trunc: { |
| 396 | // `trunc` is negatible if its operand is negatible. |
| 397 | Value *NegOp = negate(V: I->getOperand(i: 0), /* IsNSW */ false, Depth: Depth + 1); |
| 398 | if (!NegOp) // Early return. |
| 399 | return nullptr; |
| 400 | return Builder.CreateTrunc(V: NegOp, DestTy: I->getType(), Name: I->getName() + ".neg" ); |
| 401 | } |
| 402 | case Instruction::Shl: { |
| 403 | // `shl` is negatible if the first operand is negatible. |
| 404 | IsNSW &= I->hasNoSignedWrap(); |
| 405 | if (Value *NegOp0 = negate(V: I->getOperand(i: 0), IsNSW, Depth: Depth + 1)) |
| 406 | return Builder.CreateShl(LHS: NegOp0, RHS: I->getOperand(i: 1), Name: I->getName() + ".neg" , |
| 407 | /*HasNUW=*/false, HasNSW: IsNSW); |
| 408 | // Otherwise, `shl %x, C` can be interpreted as `mul %x, 1<<C`. |
| 409 | Constant *Op1C; |
| 410 | if (!match(V: I->getOperand(i: 1), P: m_ImmConstant(C&: Op1C)) || !IsTrulyNegation) |
| 411 | return nullptr; |
| 412 | return Builder.CreateMul( |
| 413 | LHS: I->getOperand(i: 0), |
| 414 | RHS: Builder.CreateShl(LHS: Constant::getAllOnesValue(Ty: Op1C->getType()), RHS: Op1C), |
| 415 | Name: I->getName() + ".neg" , /*HasNUW=*/false, HasNSW: IsNSW); |
| 416 | } |
| 417 | case Instruction::Or: { |
| 418 | if (!cast<PossiblyDisjointInst>(Val: I)->isDisjoint()) |
| 419 | return nullptr; // Don't know how to handle `or` in general. |
| 420 | std::array<Value *, 2> Ops = getSortedOperandsOfBinOp(I); |
| 421 | // `or`/`add` are interchangeable when operands have no common bits set. |
| 422 | // `inc` is always negatible. |
| 423 | if (match(V: Ops[1], P: m_One())) |
| 424 | return Builder.CreateNot(V: Ops[0], Name: I->getName() + ".neg" ); |
| 425 | // Else, just defer to Instruction::Add handling. |
| 426 | [[fallthrough]]; |
| 427 | } |
| 428 | case Instruction::Add: { |
| 429 | // `add` is negatible if both of its operands are negatible. |
| 430 | SmallVector<Value *, 2> NegatedOps, NonNegatedOps; |
| 431 | for (Value *Op : I->operands()) { |
| 432 | // Can we sink the negation into this operand? |
| 433 | if (Value *NegOp = negate(V: Op, /* IsNSW */ false, Depth: Depth + 1)) { |
| 434 | NegatedOps.emplace_back(Args&: NegOp); // Successfully negated operand! |
| 435 | continue; |
| 436 | } |
| 437 | // Failed to sink negation into this operand. IFF we started from negation |
| 438 | // and we manage to sink negation into one operand, we can still do this. |
| 439 | if (!IsTrulyNegation) |
| 440 | return nullptr; |
| 441 | NonNegatedOps.emplace_back(Args&: Op); // Just record which operand that was. |
| 442 | } |
| 443 | assert((NegatedOps.size() + NonNegatedOps.size()) == 2 && |
| 444 | "Internal consistency check failed." ); |
| 445 | // Did we manage to sink negation into both of the operands? |
| 446 | if (NegatedOps.size() == 2) // Then we get to keep the `add`! |
| 447 | return Builder.CreateAdd(LHS: NegatedOps[0], RHS: NegatedOps[1], |
| 448 | Name: I->getName() + ".neg" ); |
| 449 | assert(IsTrulyNegation && "We should have early-exited then." ); |
| 450 | // Completely failed to sink negation? |
| 451 | if (NonNegatedOps.size() == 2) |
| 452 | return nullptr; |
| 453 | // 0-(a+b) --> (-a)-b |
| 454 | return Builder.CreateSub(LHS: NegatedOps[0], RHS: NonNegatedOps[0], |
| 455 | Name: I->getName() + ".neg" ); |
| 456 | } |
| 457 | case Instruction::Xor: { |
| 458 | std::array<Value *, 2> Ops = getSortedOperandsOfBinOp(I); |
| 459 | // `xor` is negatible if one of its operands is invertible. |
| 460 | // FIXME: InstCombineInverter? But how to connect Inverter and Negator? |
| 461 | if (auto *C = dyn_cast<Constant>(Val: Ops[1])) { |
| 462 | if (IsTrulyNegation) { |
| 463 | Value *Xor = Builder.CreateXor(LHS: Ops[0], RHS: ConstantExpr::getNot(C)); |
| 464 | return Builder.CreateAdd(LHS: Xor, RHS: ConstantInt::get(Ty: Xor->getType(), V: 1), |
| 465 | Name: I->getName() + ".neg" ); |
| 466 | } |
| 467 | } |
| 468 | return nullptr; |
| 469 | } |
| 470 | case Instruction::Mul: { |
| 471 | std::array<Value *, 2> Ops = getSortedOperandsOfBinOp(I); |
| 472 | // `mul` is negatible if one of its operands is negatible. |
| 473 | Value *NegatedOp, *OtherOp; |
| 474 | // First try the second operand, in case it's a constant it will be best to |
| 475 | // just invert it instead of sinking the `neg` deeper. |
| 476 | if (Value *NegOp1 = negate(V: Ops[1], /* IsNSW */ false, Depth: Depth + 1)) { |
| 477 | NegatedOp = NegOp1; |
| 478 | OtherOp = Ops[0]; |
| 479 | } else if (Value *NegOp0 = negate(V: Ops[0], /* IsNSW */ false, Depth: Depth + 1)) { |
| 480 | NegatedOp = NegOp0; |
| 481 | OtherOp = Ops[1]; |
| 482 | } else |
| 483 | // Can't negate either of them. |
| 484 | return nullptr; |
| 485 | return Builder.CreateMul(LHS: NegatedOp, RHS: OtherOp, Name: I->getName() + ".neg" , |
| 486 | /*HasNUW=*/false, HasNSW: IsNSW && I->hasNoSignedWrap()); |
| 487 | } |
| 488 | default: |
| 489 | return nullptr; // Don't know, likely not negatible for free. |
| 490 | } |
| 491 | |
| 492 | llvm_unreachable("Can't get here. We always return from switch." ); |
| 493 | } |
| 494 | |
| 495 | [[nodiscard]] Value *Negator::negate(Value *V, bool IsNSW, unsigned Depth) { |
| 496 | NegatorMaxDepthVisited.updateMax(V: Depth); |
| 497 | ++NegatorNumValuesVisited; |
| 498 | |
| 499 | #if LLVM_ENABLE_STATS |
| 500 | ++NumValuesVisitedInThisNegator; |
| 501 | #endif |
| 502 | |
| 503 | #ifndef NDEBUG |
| 504 | // We can't ever have a Value with such an address. |
| 505 | Value *Placeholder = reinterpret_cast<Value *>(static_cast<uintptr_t>(-1)); |
| 506 | #endif |
| 507 | |
| 508 | // Did we already try to negate this value? |
| 509 | auto NegationsCacheIterator = NegationsCache.find(Val: V); |
| 510 | if (NegationsCacheIterator != NegationsCache.end()) { |
| 511 | ++NegatorNumNegationsFoundInCache; |
| 512 | Value *NegatedV = NegationsCacheIterator->second; |
| 513 | assert(NegatedV != Placeholder && "Encountered a cycle during negation." ); |
| 514 | return NegatedV; |
| 515 | } |
| 516 | |
| 517 | #ifndef NDEBUG |
| 518 | // We did not find a cached result for negation of V. While there, |
| 519 | // let's temporairly cache a placeholder value, with the idea that if later |
| 520 | // during negation we fetch it from cache, we'll know we're in a cycle. |
| 521 | NegationsCache[V] = Placeholder; |
| 522 | #endif |
| 523 | |
| 524 | // No luck. Try negating it for real. |
| 525 | Value *NegatedV = visitImpl(V, IsNSW, Depth); |
| 526 | // And cache the (real) result for the future. |
| 527 | NegationsCache[V] = NegatedV; |
| 528 | |
| 529 | return NegatedV; |
| 530 | } |
| 531 | |
| 532 | [[nodiscard]] std::optional<Negator::Result> Negator::run(Value *Root, |
| 533 | bool IsNSW) { |
| 534 | Value *Negated = negate(V: Root, IsNSW, /*Depth=*/0); |
| 535 | if (!Negated) { |
| 536 | // We must cleanup newly-inserted instructions, to avoid any potential |
| 537 | // endless combine looping. |
| 538 | for (Instruction *I : llvm::reverse(C&: NewInstructions)) |
| 539 | I->eraseFromParent(); |
| 540 | return std::nullopt; |
| 541 | } |
| 542 | return std::make_pair(x: ArrayRef<Instruction *>(NewInstructions), y&: Negated); |
| 543 | } |
| 544 | |
| 545 | [[nodiscard]] Value *Negator::Negate(bool LHSIsZero, bool IsNSW, Value *Root, |
| 546 | InstCombinerImpl &IC) { |
| 547 | ++NegatorTotalNegationsAttempted; |
| 548 | LLVM_DEBUG(dbgs() << "Negator: attempting to sink negation into " << *Root |
| 549 | << "\n" ); |
| 550 | |
| 551 | if (!NegatorEnabled || !DebugCounter::shouldExecute(CounterName: NegatorCounter)) |
| 552 | return nullptr; |
| 553 | |
| 554 | Negator N(Root->getContext(), IC.getDataLayout(), IC.getDominatorTree(), |
| 555 | LHSIsZero); |
| 556 | std::optional<Result> Res = N.run(Root, IsNSW); |
| 557 | if (!Res) { // Negation failed. |
| 558 | LLVM_DEBUG(dbgs() << "Negator: failed to sink negation into " << *Root |
| 559 | << "\n" ); |
| 560 | return nullptr; |
| 561 | } |
| 562 | |
| 563 | LLVM_DEBUG(dbgs() << "Negator: successfully sunk negation into " << *Root |
| 564 | << "\n NEW: " << *Res->second << "\n" ); |
| 565 | ++NegatorNumTreesNegated; |
| 566 | |
| 567 | // We must temporarily unset the 'current' insertion point and DebugLoc of the |
| 568 | // InstCombine's IRBuilder so that it won't interfere with the ones we have |
| 569 | // already specified when producing negated instructions. |
| 570 | InstCombiner::BuilderTy::InsertPointGuard Guard(IC.Builder); |
| 571 | IC.Builder.ClearInsertionPoint(); |
| 572 | IC.Builder.SetCurrentDebugLocation(DebugLoc()); |
| 573 | |
| 574 | // And finally, we must add newly-created instructions into the InstCombine's |
| 575 | // worklist (in a proper order!) so it can attempt to combine them. |
| 576 | LLVM_DEBUG(dbgs() << "Negator: Propagating " << Res->first.size() |
| 577 | << " instrs to InstCombine\n" ); |
| 578 | NegatorMaxInstructionsCreated.updateMax(V: Res->first.size()); |
| 579 | NegatorNumInstructionsNegatedSuccess += Res->first.size(); |
| 580 | |
| 581 | // They are in def-use order, so nothing fancy, just insert them in order. |
| 582 | for (Instruction *I : Res->first) |
| 583 | IC.Builder.Insert(I, Name: I->getName()); |
| 584 | |
| 585 | // And return the new root. |
| 586 | return Res->second; |
| 587 | } |
| 588 | |