1352fef3fSRoman Lebedev //===- InstCombineNegator.cpp -----------------------------------*- C++ -*-===// 2352fef3fSRoman Lebedev // 3352fef3fSRoman Lebedev // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4352fef3fSRoman Lebedev // See https://llvm.org/LICENSE.txt for license information. 5352fef3fSRoman Lebedev // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6352fef3fSRoman Lebedev // 7352fef3fSRoman Lebedev //===----------------------------------------------------------------------===// 8352fef3fSRoman Lebedev // 9352fef3fSRoman Lebedev // This file implements sinking of negation into expression trees, 10352fef3fSRoman Lebedev // as long as that can be done without increasing instruction count. 11352fef3fSRoman Lebedev // 12352fef3fSRoman Lebedev //===----------------------------------------------------------------------===// 13352fef3fSRoman Lebedev 14352fef3fSRoman Lebedev #include "InstCombineInternal.h" 15352fef3fSRoman Lebedev #include "llvm/ADT/APInt.h" 16352fef3fSRoman Lebedev #include "llvm/ADT/ArrayRef.h" 17e3d8cb1eSRoman Lebedev #include "llvm/ADT/DenseMap.h" 18352fef3fSRoman Lebedev #include "llvm/ADT/STLExtras.h" 19352fef3fSRoman Lebedev #include "llvm/ADT/SmallVector.h" 20352fef3fSRoman Lebedev #include "llvm/ADT/Statistic.h" 21352fef3fSRoman Lebedev #include "llvm/ADT/StringRef.h" 22352fef3fSRoman Lebedev #include "llvm/ADT/Twine.h" 23352fef3fSRoman Lebedev #include "llvm/Analysis/TargetFolder.h" 24352fef3fSRoman Lebedev #include "llvm/Analysis/ValueTracking.h" 25352fef3fSRoman Lebedev #include "llvm/IR/Constant.h" 26352fef3fSRoman Lebedev #include "llvm/IR/Constants.h" 27352fef3fSRoman Lebedev #include "llvm/IR/DebugLoc.h" 28352fef3fSRoman Lebedev #include "llvm/IR/IRBuilder.h" 29352fef3fSRoman Lebedev #include "llvm/IR/Instruction.h" 30352fef3fSRoman Lebedev #include "llvm/IR/Instructions.h" 31352fef3fSRoman Lebedev #include "llvm/IR/PatternMatch.h" 32352fef3fSRoman Lebedev #include "llvm/IR/Type.h" 33352fef3fSRoman Lebedev #include "llvm/IR/Use.h" 34352fef3fSRoman Lebedev #include "llvm/IR/User.h" 35352fef3fSRoman Lebedev #include "llvm/IR/Value.h" 36352fef3fSRoman Lebedev #include "llvm/Support/Casting.h" 37352fef3fSRoman Lebedev #include "llvm/Support/CommandLine.h" 38352fef3fSRoman Lebedev #include "llvm/Support/Compiler.h" 39352fef3fSRoman Lebedev #include "llvm/Support/DebugCounter.h" 40352fef3fSRoman Lebedev #include "llvm/Support/ErrorHandling.h" 41352fef3fSRoman Lebedev #include "llvm/Support/raw_ostream.h" 422a6c8715SSebastian Neubauer #include "llvm/Transforms/InstCombine/InstCombiner.h" 43a05ec856SRoman Lebedev #include <cassert> 44a05ec856SRoman Lebedev #include <cstdint> 45352fef3fSRoman Lebedev #include <functional> 46352fef3fSRoman Lebedev #include <utility> 47352fef3fSRoman Lebedev 48352fef3fSRoman Lebedev using namespace llvm; 491753008bSRahul Joshi using namespace llvm::PatternMatch; 50352fef3fSRoman Lebedev 51352fef3fSRoman Lebedev #define DEBUG_TYPE "instcombine" 52352fef3fSRoman Lebedev 53352fef3fSRoman Lebedev STATISTIC(NegatorTotalNegationsAttempted, 54352fef3fSRoman Lebedev "Negator: Number of negations attempted to be sinked"); 55352fef3fSRoman Lebedev STATISTIC(NegatorNumTreesNegated, 56352fef3fSRoman Lebedev "Negator: Number of negations successfully sinked"); 57352fef3fSRoman Lebedev STATISTIC(NegatorMaxDepthVisited, "Negator: Maximal traversal depth ever " 58352fef3fSRoman Lebedev "reached while attempting to sink negation"); 59352fef3fSRoman Lebedev STATISTIC(NegatorTimesDepthLimitReached, 60352fef3fSRoman Lebedev "Negator: How many times did the traversal depth limit was reached " 61352fef3fSRoman Lebedev "during sinking"); 62352fef3fSRoman Lebedev STATISTIC( 63352fef3fSRoman Lebedev NegatorNumValuesVisited, 64352fef3fSRoman Lebedev "Negator: Total number of values visited during attempts to sink negation"); 65e3d8cb1eSRoman Lebedev STATISTIC(NegatorNumNegationsFoundInCache, 66e3d8cb1eSRoman Lebedev "Negator: How many negations did we retrieve/reuse from cache"); 67352fef3fSRoman Lebedev STATISTIC(NegatorMaxTotalValuesVisited, 68352fef3fSRoman Lebedev "Negator: Maximal number of values ever visited while attempting to " 69352fef3fSRoman Lebedev "sink negation"); 70352fef3fSRoman Lebedev STATISTIC(NegatorNumInstructionsCreatedTotal, 71352fef3fSRoman Lebedev "Negator: Number of new negated instructions created, total"); 72352fef3fSRoman Lebedev STATISTIC(NegatorMaxInstructionsCreated, 73352fef3fSRoman Lebedev "Negator: Maximal number of new instructions created during negation " 74352fef3fSRoman Lebedev "attempt"); 75352fef3fSRoman Lebedev STATISTIC(NegatorNumInstructionsNegatedSuccess, 76352fef3fSRoman Lebedev "Negator: Number of new negated instructions created in successful " 77352fef3fSRoman Lebedev "negation sinking attempts"); 78352fef3fSRoman Lebedev 79352fef3fSRoman Lebedev DEBUG_COUNTER(NegatorCounter, "instcombine-negator", 80352fef3fSRoman Lebedev "Controls Negator transformations in InstCombine pass"); 81352fef3fSRoman Lebedev 82352fef3fSRoman Lebedev static cl::opt<bool> 83352fef3fSRoman Lebedev NegatorEnabled("instcombine-negator-enabled", cl::init(true), 84352fef3fSRoman Lebedev cl::desc("Should we attempt to sink negations?")); 85352fef3fSRoman Lebedev 86352fef3fSRoman Lebedev static cl::opt<unsigned> 87352fef3fSRoman Lebedev NegatorMaxDepth("instcombine-negator-max-depth", 88352fef3fSRoman Lebedev cl::init(NegatorDefaultMaxDepth), 89352fef3fSRoman Lebedev cl::desc("What is the maximal lookup depth when trying to " 90352fef3fSRoman Lebedev "check for viability of negation sinking.")); 91352fef3fSRoman Lebedev 9248ae6147SYingwei Zheng Negator::Negator(LLVMContext &C, const DataLayout &DL, const DominatorTree &DT_, 9348ae6147SYingwei Zheng bool IsTrulyNegation_) 94cd865e36SNikita Popov : Builder(C, TargetFolder(DL), 95352fef3fSRoman Lebedev IRBuilderCallbackInserter([&](Instruction *I) { 96352fef3fSRoman Lebedev ++NegatorNumInstructionsCreatedTotal; 97352fef3fSRoman Lebedev NewInstructions.push_back(I); 98352fef3fSRoman Lebedev })), 9948ae6147SYingwei Zheng DT(DT_), IsTrulyNegation(IsTrulyNegation_) {} 100352fef3fSRoman Lebedev 101352fef3fSRoman Lebedev #if LLVM_ENABLE_STATS 102352fef3fSRoman Lebedev Negator::~Negator() { 103352fef3fSRoman Lebedev NegatorMaxTotalValuesVisited.updateMax(NumValuesVisitedInThisNegator); 104352fef3fSRoman Lebedev } 105352fef3fSRoman Lebedev #endif 106352fef3fSRoman Lebedev 107fed0f890SRoman Lebedev // Due to the InstCombine's worklist management, there are no guarantees that 108fed0f890SRoman Lebedev // each instruction we'll encounter has been visited by InstCombine already. 109fed0f890SRoman Lebedev // In particular, most importantly for us, that means we have to canonicalize 110fed0f890SRoman Lebedev // constants to RHS ourselves, since that is helpful sometimes. 111fed0f890SRoman Lebedev std::array<Value *, 2> Negator::getSortedOperandsOfBinOp(Instruction *I) { 112fed0f890SRoman Lebedev assert(I->getNumOperands() == 2 && "Only for binops!"); 113fed0f890SRoman Lebedev std::array<Value *, 2> Ops{I->getOperand(0), I->getOperand(1)}; 114fed0f890SRoman Lebedev if (I->isCommutative() && InstCombiner::getComplexity(I->getOperand(0)) < 115fed0f890SRoman Lebedev InstCombiner::getComplexity(I->getOperand(1))) 116fed0f890SRoman Lebedev std::swap(Ops[0], Ops[1]); 117fed0f890SRoman Lebedev return Ops; 118fed0f890SRoman Lebedev } 119fed0f890SRoman Lebedev 120352fef3fSRoman Lebedev // FIXME: can this be reworked into a worklist-based algorithm while preserving 121352fef3fSRoman Lebedev // the depth-first, early bailout traversal? 1221fc73cacSNikita Popov [[nodiscard]] Value *Negator::visitImpl(Value *V, bool IsNSW, unsigned Depth) { 12367266d87SRoman Lebedev // -(undef) -> undef. 12467266d87SRoman Lebedev if (match(V, m_Undef())) 12567266d87SRoman Lebedev return V; 12667266d87SRoman Lebedev 127352fef3fSRoman Lebedev // In i1, negation can simply be ignored. 128352fef3fSRoman Lebedev if (V->getType()->isIntOrIntVectorTy(1)) 129352fef3fSRoman Lebedev return V; 130352fef3fSRoman Lebedev 131352fef3fSRoman Lebedev Value *X; 132352fef3fSRoman Lebedev 133352fef3fSRoman Lebedev // -(-(X)) -> X. 134352fef3fSRoman Lebedev if (match(V, m_Neg(m_Value(X)))) 135352fef3fSRoman Lebedev return X; 136352fef3fSRoman Lebedev 137352fef3fSRoman Lebedev // Integral constants can be freely negated. 138352fef3fSRoman Lebedev if (match(V, m_AnyIntegralConstant())) 139caa22582SYingwei Zheng return ConstantExpr::getNeg(cast<Constant>(V), 140352fef3fSRoman Lebedev /*HasNSW=*/false); 141352fef3fSRoman Lebedev 142352fef3fSRoman Lebedev // If we have a non-instruction, then give up. 143352fef3fSRoman Lebedev if (!isa<Instruction>(V)) 144352fef3fSRoman Lebedev return nullptr; 145352fef3fSRoman Lebedev 146352fef3fSRoman Lebedev // If we have started with a true negation (i.e. `sub 0, %y`), then if we've 147352fef3fSRoman Lebedev // got instruction that does not require recursive reasoning, we can still 148352fef3fSRoman Lebedev // negate it even if it has other uses, without increasing instruction count. 149352fef3fSRoman Lebedev if (!V->hasOneUse() && !IsTrulyNegation) 150352fef3fSRoman Lebedev return nullptr; 151352fef3fSRoman Lebedev 152352fef3fSRoman Lebedev auto *I = cast<Instruction>(V); 153352fef3fSRoman Lebedev unsigned BitWidth = I->getType()->getScalarSizeInBits(); 154352fef3fSRoman Lebedev 155352fef3fSRoman Lebedev // We must preserve the insertion point and debug info that is set in the 156352fef3fSRoman Lebedev // builder at the time this function is called. 157352fef3fSRoman Lebedev InstCombiner::BuilderTy::InsertPointGuard Guard(Builder); 158352fef3fSRoman Lebedev // And since we are trying to negate instruction I, that tells us about the 159352fef3fSRoman Lebedev // insertion point and the debug info that we need to keep. 160352fef3fSRoman Lebedev Builder.SetInsertPoint(I); 161352fef3fSRoman Lebedev 162352fef3fSRoman Lebedev // In some cases we can give the answer without further recursion. 163352fef3fSRoman Lebedev switch (I->getOpcode()) { 164fed0f890SRoman Lebedev case Instruction::Add: { 165fed0f890SRoman Lebedev std::array<Value *, 2> Ops = getSortedOperandsOfBinOp(I); 166352fef3fSRoman Lebedev // `inc` is always negatible. 167fed0f890SRoman Lebedev if (match(Ops[1], m_One())) 168fed0f890SRoman Lebedev return Builder.CreateNot(Ops[0], I->getName() + ".neg"); 169352fef3fSRoman Lebedev break; 170fed0f890SRoman Lebedev } 171352fef3fSRoman Lebedev case Instruction::Xor: 172352fef3fSRoman Lebedev // `not` is always negatible. 173352fef3fSRoman Lebedev if (match(I, m_Not(m_Value(X)))) 174352fef3fSRoman Lebedev return Builder.CreateAdd(X, ConstantInt::get(X->getType(), 1), 175352fef3fSRoman Lebedev I->getName() + ".neg"); 176352fef3fSRoman Lebedev break; 177352fef3fSRoman Lebedev case Instruction::AShr: 178352fef3fSRoman Lebedev case Instruction::LShr: { 179352fef3fSRoman Lebedev // Right-shift sign bit smear is negatible. 180352fef3fSRoman Lebedev const APInt *Op1Val; 181352fef3fSRoman Lebedev if (match(I->getOperand(1), m_APInt(Op1Val)) && *Op1Val == BitWidth - 1) { 182352fef3fSRoman Lebedev Value *BO = I->getOpcode() == Instruction::AShr 183352fef3fSRoman Lebedev ? Builder.CreateLShr(I->getOperand(0), I->getOperand(1)) 184352fef3fSRoman Lebedev : Builder.CreateAShr(I->getOperand(0), I->getOperand(1)); 185352fef3fSRoman Lebedev if (auto *NewInstr = dyn_cast<Instruction>(BO)) { 186352fef3fSRoman Lebedev NewInstr->copyIRFlags(I); 187352fef3fSRoman Lebedev NewInstr->setName(I->getName() + ".neg"); 188352fef3fSRoman Lebedev } 189352fef3fSRoman Lebedev return BO; 190352fef3fSRoman Lebedev } 19147aec80eSRoman Lebedev // While we could negate exact arithmetic shift: 19247aec80eSRoman Lebedev // ashr exact %x, C --> sdiv exact i8 %x, -1<<C 19347aec80eSRoman Lebedev // iff C != 0 and C u< bitwidth(%x), we don't want to, 19447aec80eSRoman Lebedev // because division is *THAT* much worse than a shift. 195352fef3fSRoman Lebedev break; 196352fef3fSRoman Lebedev } 197352fef3fSRoman Lebedev case Instruction::SExt: 198352fef3fSRoman Lebedev case Instruction::ZExt: 199352fef3fSRoman Lebedev // `*ext` of i1 is always negatible 200352fef3fSRoman Lebedev if (I->getOperand(0)->getType()->isIntOrIntVectorTy(1)) 201352fef3fSRoman Lebedev return I->getOpcode() == Instruction::SExt 202352fef3fSRoman Lebedev ? Builder.CreateZExt(I->getOperand(0), I->getType(), 203352fef3fSRoman Lebedev I->getName() + ".neg") 204352fef3fSRoman Lebedev : Builder.CreateSExt(I->getOperand(0), I->getType(), 205352fef3fSRoman Lebedev I->getName() + ".neg"); 206352fef3fSRoman Lebedev break; 207e8535fa7SSanjay Patel case Instruction::Select: { 208e8535fa7SSanjay Patel // If both arms of the select are constants, we don't need to recurse. 209e8535fa7SSanjay Patel // Therefore, this transform is not limited by uses. 210e8535fa7SSanjay Patel auto *Sel = cast<SelectInst>(I); 211e8535fa7SSanjay Patel Constant *TrueC, *FalseC; 212e8535fa7SSanjay Patel if (match(Sel->getTrueValue(), m_ImmConstant(TrueC)) && 213e8535fa7SSanjay Patel match(Sel->getFalseValue(), m_ImmConstant(FalseC))) { 214e8535fa7SSanjay Patel Constant *NegTrueC = ConstantExpr::getNeg(TrueC); 215e8535fa7SSanjay Patel Constant *NegFalseC = ConstantExpr::getNeg(FalseC); 216e8535fa7SSanjay Patel return Builder.CreateSelect(Sel->getCondition(), NegTrueC, NegFalseC, 217e8535fa7SSanjay Patel I->getName() + ".neg", /*MDFrom=*/I); 218e8535fa7SSanjay Patel } 219e8535fa7SSanjay Patel break; 220e8535fa7SSanjay Patel } 2218c664a9fSPoseydon42 case Instruction::Call: 2228c664a9fSPoseydon42 if (auto *CI = dyn_cast<CmpIntrinsic>(I); CI && CI->hasOneUse()) 2238c664a9fSPoseydon42 return Builder.CreateIntrinsic(CI->getType(), CI->getIntrinsicID(), 2248c664a9fSPoseydon42 {CI->getRHS(), CI->getLHS()}); 2258c664a9fSPoseydon42 break; 226352fef3fSRoman Lebedev default: 227352fef3fSRoman Lebedev break; // Other instructions require recursive reasoning. 228352fef3fSRoman Lebedev } 229352fef3fSRoman Lebedev 230e465f9c3SRoman Lebedev if (I->getOpcode() == Instruction::Sub && 231b3021a72SRoman Lebedev (I->hasOneUse() || match(I->getOperand(0), m_ImmConstant()))) { 232e465f9c3SRoman Lebedev // `sub` is always negatible. 233e465f9c3SRoman Lebedev // However, only do this either if the old `sub` doesn't stick around, or 234e465f9c3SRoman Lebedev // it was subtracting from a constant. Otherwise, this isn't profitable. 235e465f9c3SRoman Lebedev return Builder.CreateSub(I->getOperand(1), I->getOperand(0), 2361fc73cacSNikita Popov I->getName() + ".neg", /* HasNUW */ false, 2371fc73cacSNikita Popov IsNSW && I->hasNoSignedWrap()); 238e465f9c3SRoman Lebedev } 239e465f9c3SRoman Lebedev 2405a159ed2SRoman Lebedev // Some other cases, while still don't require recursion, 2415a159ed2SRoman Lebedev // are restricted to the one-use case. 242352fef3fSRoman Lebedev if (!V->hasOneUse()) 243352fef3fSRoman Lebedev return nullptr; 2445a159ed2SRoman Lebedev 2455a159ed2SRoman Lebedev switch (I->getOpcode()) { 246c6e56024SSanjay Patel case Instruction::ZExt: { 247c6e56024SSanjay Patel // Negation of zext of signbit is signbit splat: 248c6e56024SSanjay Patel // 0 - (zext (i8 X u>> 7) to iN) --> sext (i8 X s>> 7) to iN 249c6e56024SSanjay Patel Value *SrcOp = I->getOperand(0); 250c6e56024SSanjay Patel unsigned SrcWidth = SrcOp->getType()->getScalarSizeInBits(); 251c6e56024SSanjay Patel const APInt &FullShift = APInt(SrcWidth, SrcWidth - 1); 252c6e56024SSanjay Patel if (IsTrulyNegation && 2531baa3850SNikita Popov match(SrcOp, m_LShr(m_Value(X), m_SpecificIntAllowPoison(FullShift)))) { 254c6e56024SSanjay Patel Value *Ashr = Builder.CreateAShr(X, FullShift); 255c6e56024SSanjay Patel return Builder.CreateSExt(Ashr, I->getType()); 256c6e56024SSanjay Patel } 257c6e56024SSanjay Patel break; 258c6e56024SSanjay Patel } 2599606c690SSimon Pilgrim case Instruction::And: { 2609606c690SSimon Pilgrim Constant *ShAmt; 2619606c690SSimon Pilgrim // sub(y,and(lshr(x,C),1)) --> add(ashr(shl(x,(BW-1)-C),BW-1),y) 262470c5b80SYingwei Zheng if (match(I, m_And(m_OneUse(m_TruncOrSelf( 2639606c690SSimon Pilgrim m_LShr(m_Value(X), m_ImmConstant(ShAmt)))), 2649606c690SSimon Pilgrim m_One()))) { 2659606c690SSimon Pilgrim unsigned BW = X->getType()->getScalarSizeInBits(); 2669606c690SSimon Pilgrim Constant *BWMinusOne = ConstantInt::get(X->getType(), BW - 1); 2679606c690SSimon Pilgrim Value *R = Builder.CreateShl(X, Builder.CreateSub(BWMinusOne, ShAmt)); 2689606c690SSimon Pilgrim R = Builder.CreateAShr(R, BWMinusOne); 2699606c690SSimon Pilgrim return Builder.CreateTruncOrBitCast(R, I->getType()); 2709606c690SSimon Pilgrim } 2719606c690SSimon Pilgrim break; 2729606c690SSimon Pilgrim } 2735a159ed2SRoman Lebedev case Instruction::SDiv: 2745a159ed2SRoman Lebedev // `sdiv` is negatible if divisor is not undef/INT_MIN/1. 2755a159ed2SRoman Lebedev // While this is normally not behind a use-check, 2765a159ed2SRoman Lebedev // let's consider division to be special since it's costly. 2775a159ed2SRoman Lebedev if (auto *Op1C = dyn_cast<Constant>(I->getOperand(1))) { 27829f8628dSJuneyoung Lee if (!Op1C->containsUndefOrPoisonElement() && 27929f8628dSJuneyoung Lee Op1C->isNotMinSignedValue() && Op1C->isNotOneValue()) { 2805a159ed2SRoman Lebedev Value *BO = 2815a159ed2SRoman Lebedev Builder.CreateSDiv(I->getOperand(0), ConstantExpr::getNeg(Op1C), 2825a159ed2SRoman Lebedev I->getName() + ".neg"); 2835a159ed2SRoman Lebedev if (auto *NewInstr = dyn_cast<Instruction>(BO)) 2845a159ed2SRoman Lebedev NewInstr->setIsExact(I->isExact()); 2855a159ed2SRoman Lebedev return BO; 2865a159ed2SRoman Lebedev } 2875a159ed2SRoman Lebedev } 2885a159ed2SRoman Lebedev break; 2895a159ed2SRoman Lebedev } 2905a159ed2SRoman Lebedev 2915a159ed2SRoman Lebedev // Rest of the logic is recursive, so if it's time to give up then it's time. 292352fef3fSRoman Lebedev if (Depth > NegatorMaxDepth) { 293352fef3fSRoman Lebedev LLVM_DEBUG(dbgs() << "Negator: reached maximal allowed traversal depth in " 294352fef3fSRoman Lebedev << *V << ". Giving up.\n"); 295352fef3fSRoman Lebedev ++NegatorTimesDepthLimitReached; 296352fef3fSRoman Lebedev return nullptr; 297352fef3fSRoman Lebedev } 298352fef3fSRoman Lebedev 299352fef3fSRoman Lebedev switch (I->getOpcode()) { 300f6decfa3SRoman Lebedev case Instruction::Freeze: { 301f6decfa3SRoman Lebedev // `freeze` is negatible if its operand is negatible. 3021fc73cacSNikita Popov Value *NegOp = negate(I->getOperand(0), IsNSW, Depth + 1); 303f6decfa3SRoman Lebedev if (!NegOp) // Early return. 304f6decfa3SRoman Lebedev return nullptr; 305f6decfa3SRoman Lebedev return Builder.CreateFreeze(NegOp, I->getName() + ".neg"); 306f6decfa3SRoman Lebedev } 307352fef3fSRoman Lebedev case Instruction::PHI: { 308352fef3fSRoman Lebedev // `phi` is negatible if all the incoming values are negatible. 309cd921accSRoman Lebedev auto *PHI = cast<PHINode>(I); 310352fef3fSRoman Lebedev SmallVector<Value *, 4> NegatedIncomingValues(PHI->getNumOperands()); 311352fef3fSRoman Lebedev for (auto I : zip(PHI->incoming_values(), NegatedIncomingValues)) { 31248ae6147SYingwei Zheng // Don't negate indvars to avoid infinite loops. 31348ae6147SYingwei Zheng if (DT.dominates(PHI->getParent(), std::get<0>(I))) 31448ae6147SYingwei Zheng return nullptr; 315c4166f3dSRoman Lebedev if (!(std::get<1>(I) = 3161fc73cacSNikita Popov negate(std::get<0>(I), IsNSW, Depth + 1))) // Early return. 317352fef3fSRoman Lebedev return nullptr; 318352fef3fSRoman Lebedev } 319352fef3fSRoman Lebedev // All incoming values are indeed negatible. Create negated PHI node. 320352fef3fSRoman Lebedev PHINode *NegatedPHI = Builder.CreatePHI( 321352fef3fSRoman Lebedev PHI->getType(), PHI->getNumOperands(), PHI->getName() + ".neg"); 322352fef3fSRoman Lebedev for (auto I : zip(NegatedIncomingValues, PHI->blocks())) 323352fef3fSRoman Lebedev NegatedPHI->addIncoming(std::get<0>(I), std::get<1>(I)); 324352fef3fSRoman Lebedev return NegatedPHI; 325352fef3fSRoman Lebedev } 326352fef3fSRoman Lebedev case Instruction::Select: { 327a1b1c4a6SNikita Popov if (isKnownNegation(I->getOperand(1), I->getOperand(2), /*NeedNSW=*/false, 328a1b1c4a6SNikita Popov /*AllowPoison=*/false)) { 329f3056dccSRoman Lebedev // Of one hand of select is known to be negation of another hand, 330f3056dccSRoman Lebedev // just swap the hands around. 331352fef3fSRoman Lebedev auto *NewSelect = cast<SelectInst>(I->clone()); 332352fef3fSRoman Lebedev // Just swap the operands of the select. 333352fef3fSRoman Lebedev NewSelect->swapValues(); 334352fef3fSRoman Lebedev // Don't swap prof metadata, we didn't change the branch behavior. 335352fef3fSRoman Lebedev NewSelect->setName(I->getName() + ".neg"); 336*ff07df66SYingwei Zheng // Poison-generating flags should be dropped 337*ff07df66SYingwei Zheng Value *TV = NewSelect->getTrueValue(); 338*ff07df66SYingwei Zheng Value *FV = NewSelect->getFalseValue(); 339*ff07df66SYingwei Zheng if (match(TV, m_Neg(m_Specific(FV)))) 340*ff07df66SYingwei Zheng cast<Instruction>(TV)->dropPoisonGeneratingFlags(); 341*ff07df66SYingwei Zheng else if (match(FV, m_Neg(m_Specific(TV)))) 342*ff07df66SYingwei Zheng cast<Instruction>(FV)->dropPoisonGeneratingFlags(); 343*ff07df66SYingwei Zheng else { 344*ff07df66SYingwei Zheng cast<Instruction>(TV)->dropPoisonGeneratingFlags(); 345*ff07df66SYingwei Zheng cast<Instruction>(FV)->dropPoisonGeneratingFlags(); 346*ff07df66SYingwei Zheng } 347352fef3fSRoman Lebedev Builder.Insert(NewSelect); 348352fef3fSRoman Lebedev return NewSelect; 349352fef3fSRoman Lebedev } 350352fef3fSRoman Lebedev // `select` is negatible if both hands of `select` are negatible. 3511fc73cacSNikita Popov Value *NegOp1 = negate(I->getOperand(1), IsNSW, Depth + 1); 352352fef3fSRoman Lebedev if (!NegOp1) // Early return. 353352fef3fSRoman Lebedev return nullptr; 3541fc73cacSNikita Popov Value *NegOp2 = negate(I->getOperand(2), IsNSW, Depth + 1); 355352fef3fSRoman Lebedev if (!NegOp2) 356352fef3fSRoman Lebedev return nullptr; 357352fef3fSRoman Lebedev // Do preserve the metadata! 358352fef3fSRoman Lebedev return Builder.CreateSelect(I->getOperand(0), NegOp1, NegOp2, 359352fef3fSRoman Lebedev I->getName() + ".neg", /*MDFrom=*/I); 360352fef3fSRoman Lebedev } 36167266d87SRoman Lebedev case Instruction::ShuffleVector: { 36267266d87SRoman Lebedev // `shufflevector` is negatible if both operands are negatible. 363cd921accSRoman Lebedev auto *Shuf = cast<ShuffleVectorInst>(I); 3641fc73cacSNikita Popov Value *NegOp0 = negate(I->getOperand(0), IsNSW, Depth + 1); 36567266d87SRoman Lebedev if (!NegOp0) // Early return. 36667266d87SRoman Lebedev return nullptr; 3671fc73cacSNikita Popov Value *NegOp1 = negate(I->getOperand(1), IsNSW, Depth + 1); 36867266d87SRoman Lebedev if (!NegOp1) 36967266d87SRoman Lebedev return nullptr; 37067266d87SRoman Lebedev return Builder.CreateShuffleVector(NegOp0, NegOp1, Shuf->getShuffleMask(), 37167266d87SRoman Lebedev I->getName() + ".neg"); 37267266d87SRoman Lebedev } 373ebed96fdSRoman Lebedev case Instruction::ExtractElement: { 374ebed96fdSRoman Lebedev // `extractelement` is negatible if source operand is negatible. 375ebed96fdSRoman Lebedev auto *EEI = cast<ExtractElementInst>(I); 3761fc73cacSNikita Popov Value *NegVector = negate(EEI->getVectorOperand(), IsNSW, Depth + 1); 377ebed96fdSRoman Lebedev if (!NegVector) // Early return. 378ebed96fdSRoman Lebedev return nullptr; 379ebed96fdSRoman Lebedev return Builder.CreateExtractElement(NegVector, EEI->getIndexOperand(), 380ebed96fdSRoman Lebedev I->getName() + ".neg"); 381ebed96fdSRoman Lebedev } 38255430f53SRoman Lebedev case Instruction::InsertElement: { 38355430f53SRoman Lebedev // `insertelement` is negatible if both the source vector and 38455430f53SRoman Lebedev // element-to-be-inserted are negatible. 38555430f53SRoman Lebedev auto *IEI = cast<InsertElementInst>(I); 3861fc73cacSNikita Popov Value *NegVector = negate(IEI->getOperand(0), IsNSW, Depth + 1); 38755430f53SRoman Lebedev if (!NegVector) // Early return. 38855430f53SRoman Lebedev return nullptr; 3891fc73cacSNikita Popov Value *NegNewElt = negate(IEI->getOperand(1), IsNSW, Depth + 1); 39055430f53SRoman Lebedev if (!NegNewElt) // Early return. 39155430f53SRoman Lebedev return nullptr; 39255430f53SRoman Lebedev return Builder.CreateInsertElement(NegVector, NegNewElt, IEI->getOperand(2), 39355430f53SRoman Lebedev I->getName() + ".neg"); 39455430f53SRoman Lebedev } 395352fef3fSRoman Lebedev case Instruction::Trunc: { 396352fef3fSRoman Lebedev // `trunc` is negatible if its operand is negatible. 3971fc73cacSNikita Popov Value *NegOp = negate(I->getOperand(0), /* IsNSW */ false, Depth + 1); 398352fef3fSRoman Lebedev if (!NegOp) // Early return. 399352fef3fSRoman Lebedev return nullptr; 400352fef3fSRoman Lebedev return Builder.CreateTrunc(NegOp, I->getType(), I->getName() + ".neg"); 401352fef3fSRoman Lebedev } 402352fef3fSRoman Lebedev case Instruction::Shl: { 403352fef3fSRoman Lebedev // `shl` is negatible if the first operand is negatible. 4041fc73cacSNikita Popov IsNSW &= I->hasNoSignedWrap(); 4051fc73cacSNikita Popov if (Value *NegOp0 = negate(I->getOperand(0), IsNSW, Depth + 1)) 4061fc73cacSNikita Popov return Builder.CreateShl(NegOp0, I->getOperand(1), I->getName() + ".neg", 4071fc73cacSNikita Popov /* HasNUW */ false, IsNSW); 408f5df5cd5SRoman Lebedev // Otherwise, `shl %x, C` can be interpreted as `mul %x, 1<<C`. 409d314cf24SNikita Popov Constant *Op1C; 410d314cf24SNikita Popov if (!match(I->getOperand(1), m_ImmConstant(Op1C)) || !IsTrulyNegation) 411f5df5cd5SRoman Lebedev return nullptr; 412f5df5cd5SRoman Lebedev return Builder.CreateMul( 413f5df5cd5SRoman Lebedev I->getOperand(0), 414d314cf24SNikita Popov Builder.CreateShl(Constant::getAllOnesValue(Op1C->getType()), Op1C), 4151fc73cacSNikita Popov I->getName() + ".neg", /* HasNUW */ false, IsNSW); 416352fef3fSRoman Lebedev } 417fed0f890SRoman Lebedev case Instruction::Or: { 418cd865e36SNikita Popov if (!cast<PossiblyDisjointInst>(I)->isDisjoint()) 419a0004358SRoman Lebedev return nullptr; // Don't know how to handle `or` in general. 420fed0f890SRoman Lebedev std::array<Value *, 2> Ops = getSortedOperandsOfBinOp(I); 421a0004358SRoman Lebedev // `or`/`add` are interchangeable when operands have no common bits set. 422a0004358SRoman Lebedev // `inc` is always negatible. 423fed0f890SRoman Lebedev if (match(Ops[1], m_One())) 424fed0f890SRoman Lebedev return Builder.CreateNot(Ops[0], I->getName() + ".neg"); 425a0004358SRoman Lebedev // Else, just defer to Instruction::Add handling. 426de9d80c1SFangrui Song [[fallthrough]]; 427fed0f890SRoman Lebedev } 428352fef3fSRoman Lebedev case Instruction::Add: { 429352fef3fSRoman Lebedev // `add` is negatible if both of its operands are negatible. 4303a3c9519SRoman Lebedev SmallVector<Value *, 2> NegatedOps, NonNegatedOps; 4313a3c9519SRoman Lebedev for (Value *Op : I->operands()) { 4323a3c9519SRoman Lebedev // Can we sink the negation into this operand? 4331fc73cacSNikita Popov if (Value *NegOp = negate(Op, /* IsNSW */ false, Depth + 1)) { 4343a3c9519SRoman Lebedev NegatedOps.emplace_back(NegOp); // Successfully negated operand! 4353a3c9519SRoman Lebedev continue; 4363a3c9519SRoman Lebedev } 4373a3c9519SRoman Lebedev // Failed to sink negation into this operand. IFF we started from negation 4383a3c9519SRoman Lebedev // and we manage to sink negation into one operand, we can still do this. 4393a3c9519SRoman Lebedev if (!IsTrulyNegation) 440352fef3fSRoman Lebedev return nullptr; 4413a3c9519SRoman Lebedev NonNegatedOps.emplace_back(Op); // Just record which operand that was. 4423a3c9519SRoman Lebedev } 4433a3c9519SRoman Lebedev assert((NegatedOps.size() + NonNegatedOps.size()) == 2 && 4440d3add21SZarko Todorovski "Internal consistency check failed."); 4453a3c9519SRoman Lebedev // Did we manage to sink negation into both of the operands? 4463a3c9519SRoman Lebedev if (NegatedOps.size() == 2) // Then we get to keep the `add`! 4473a3c9519SRoman Lebedev return Builder.CreateAdd(NegatedOps[0], NegatedOps[1], 4483a3c9519SRoman Lebedev I->getName() + ".neg"); 4493a3c9519SRoman Lebedev assert(IsTrulyNegation && "We should have early-exited then."); 4503a3c9519SRoman Lebedev // Completely failed to sink negation? 4513a3c9519SRoman Lebedev if (NonNegatedOps.size() == 2) 452352fef3fSRoman Lebedev return nullptr; 4533a3c9519SRoman Lebedev // 0-(a+b) --> (-a)-b 4543a3c9519SRoman Lebedev return Builder.CreateSub(NegatedOps[0], NonNegatedOps[0], 4553a3c9519SRoman Lebedev I->getName() + ".neg"); 456352fef3fSRoman Lebedev } 457fed0f890SRoman Lebedev case Instruction::Xor: { 458fed0f890SRoman Lebedev std::array<Value *, 2> Ops = getSortedOperandsOfBinOp(I); 459352fef3fSRoman Lebedev // `xor` is negatible if one of its operands is invertible. 460352fef3fSRoman Lebedev // FIXME: InstCombineInverter? But how to connect Inverter and Negator? 461fed0f890SRoman Lebedev if (auto *C = dyn_cast<Constant>(Ops[1])) { 462f112e469SNoah Goldstein if (IsTrulyNegation) { 463fed0f890SRoman Lebedev Value *Xor = Builder.CreateXor(Ops[0], ConstantExpr::getNot(C)); 464352fef3fSRoman Lebedev return Builder.CreateAdd(Xor, ConstantInt::get(Xor->getType(), 1), 465352fef3fSRoman Lebedev I->getName() + ".neg"); 466352fef3fSRoman Lebedev } 467f112e469SNoah Goldstein } 468352fef3fSRoman Lebedev return nullptr; 469fed0f890SRoman Lebedev } 470352fef3fSRoman Lebedev case Instruction::Mul: { 471fed0f890SRoman Lebedev std::array<Value *, 2> Ops = getSortedOperandsOfBinOp(I); 472352fef3fSRoman Lebedev // `mul` is negatible if one of its operands is negatible. 473352fef3fSRoman Lebedev Value *NegatedOp, *OtherOp; 474352fef3fSRoman Lebedev // First try the second operand, in case it's a constant it will be best to 475352fef3fSRoman Lebedev // just invert it instead of sinking the `neg` deeper. 4761fc73cacSNikita Popov if (Value *NegOp1 = negate(Ops[1], /* IsNSW */ false, Depth + 1)) { 477352fef3fSRoman Lebedev NegatedOp = NegOp1; 478fed0f890SRoman Lebedev OtherOp = Ops[0]; 4791fc73cacSNikita Popov } else if (Value *NegOp0 = negate(Ops[0], /* IsNSW */ false, Depth + 1)) { 480352fef3fSRoman Lebedev NegatedOp = NegOp0; 481fed0f890SRoman Lebedev OtherOp = Ops[1]; 482352fef3fSRoman Lebedev } else 483352fef3fSRoman Lebedev // Can't negate either of them. 484352fef3fSRoman Lebedev return nullptr; 4851fc73cacSNikita Popov return Builder.CreateMul(NegatedOp, OtherOp, I->getName() + ".neg", 4861fc73cacSNikita Popov /* HasNUW */ false, IsNSW && I->hasNoSignedWrap()); 487352fef3fSRoman Lebedev } 488352fef3fSRoman Lebedev default: 489352fef3fSRoman Lebedev return nullptr; // Don't know, likely not negatible for free. 490352fef3fSRoman Lebedev } 491352fef3fSRoman Lebedev 492352fef3fSRoman Lebedev llvm_unreachable("Can't get here. We always return from switch."); 493163bd9d8SMichael Liao } 494352fef3fSRoman Lebedev 4951fc73cacSNikita Popov [[nodiscard]] Value *Negator::negate(Value *V, bool IsNSW, unsigned Depth) { 496c4166f3dSRoman Lebedev NegatorMaxDepthVisited.updateMax(Depth); 497c4166f3dSRoman Lebedev ++NegatorNumValuesVisited; 498c4166f3dSRoman Lebedev 499c4166f3dSRoman Lebedev #if LLVM_ENABLE_STATS 500c4166f3dSRoman Lebedev ++NumValuesVisitedInThisNegator; 501c4166f3dSRoman Lebedev #endif 502c4166f3dSRoman Lebedev 50384b4f5a6SRoman Lebedev #ifndef NDEBUG 50484b4f5a6SRoman Lebedev // We can't ever have a Value with such an address. 50584b4f5a6SRoman Lebedev Value *Placeholder = reinterpret_cast<Value *>(static_cast<uintptr_t>(-1)); 50684b4f5a6SRoman Lebedev #endif 50784b4f5a6SRoman Lebedev 508e3d8cb1eSRoman Lebedev // Did we already try to negate this value? 509e3d8cb1eSRoman Lebedev auto NegationsCacheIterator = NegationsCache.find(V); 510e3d8cb1eSRoman Lebedev if (NegationsCacheIterator != NegationsCache.end()) { 511e3d8cb1eSRoman Lebedev ++NegatorNumNegationsFoundInCache; 51284b4f5a6SRoman Lebedev Value *NegatedV = NegationsCacheIterator->second; 51384b4f5a6SRoman Lebedev assert(NegatedV != Placeholder && "Encountered a cycle during negation."); 51484b4f5a6SRoman Lebedev return NegatedV; 515e3d8cb1eSRoman Lebedev } 516e3d8cb1eSRoman Lebedev 51784b4f5a6SRoman Lebedev #ifndef NDEBUG 51884b4f5a6SRoman Lebedev // We did not find a cached result for negation of V. While there, 51984b4f5a6SRoman Lebedev // let's temporairly cache a placeholder value, with the idea that if later 52084b4f5a6SRoman Lebedev // during negation we fetch it from cache, we'll know we're in a cycle. 52184b4f5a6SRoman Lebedev NegationsCache[V] = Placeholder; 52284b4f5a6SRoman Lebedev #endif 52384b4f5a6SRoman Lebedev 524e3d8cb1eSRoman Lebedev // No luck. Try negating it for real. 5251fc73cacSNikita Popov Value *NegatedV = visitImpl(V, IsNSW, Depth); 52684b4f5a6SRoman Lebedev // And cache the (real) result for the future. 527e3d8cb1eSRoman Lebedev NegationsCache[V] = NegatedV; 528e3d8cb1eSRoman Lebedev 529e3d8cb1eSRoman Lebedev return NegatedV; 530c4166f3dSRoman Lebedev } 531c4166f3dSRoman Lebedev 5321fc73cacSNikita Popov [[nodiscard]] std::optional<Negator::Result> Negator::run(Value *Root, 5331fc73cacSNikita Popov bool IsNSW) { 5341fc73cacSNikita Popov Value *Negated = negate(Root, IsNSW, /*Depth=*/0); 535352fef3fSRoman Lebedev if (!Negated) { 536352fef3fSRoman Lebedev // We must cleanup newly-inserted instructions, to avoid any potential 537352fef3fSRoman Lebedev // endless combine looping. 538302313a2SKazu Hirata for (Instruction *I : llvm::reverse(NewInstructions)) 539302313a2SKazu Hirata I->eraseFromParent(); 540343de685SKazu Hirata return std::nullopt; 541352fef3fSRoman Lebedev } 542352fef3fSRoman Lebedev return std::make_pair(ArrayRef<Instruction *>(NewInstructions), Negated); 543163bd9d8SMichael Liao } 544352fef3fSRoman Lebedev 5451fc73cacSNikita Popov [[nodiscard]] Value *Negator::Negate(bool LHSIsZero, bool IsNSW, Value *Root, 5462a6c8715SSebastian Neubauer InstCombinerImpl &IC) { 547352fef3fSRoman Lebedev ++NegatorTotalNegationsAttempted; 548352fef3fSRoman Lebedev LLVM_DEBUG(dbgs() << "Negator: attempting to sink negation into " << *Root 549352fef3fSRoman Lebedev << "\n"); 550352fef3fSRoman Lebedev 551352fef3fSRoman Lebedev if (!NegatorEnabled || !DebugCounter::shouldExecute(NegatorCounter)) 552352fef3fSRoman Lebedev return nullptr; 553352fef3fSRoman Lebedev 55448ae6147SYingwei Zheng Negator N(Root->getContext(), IC.getDataLayout(), IC.getDominatorTree(), 55548ae6147SYingwei Zheng LHSIsZero); 5561fc73cacSNikita Popov std::optional<Result> Res = N.run(Root, IsNSW); 557352fef3fSRoman Lebedev if (!Res) { // Negation failed. 558352fef3fSRoman Lebedev LLVM_DEBUG(dbgs() << "Negator: failed to sink negation into " << *Root 559352fef3fSRoman Lebedev << "\n"); 560352fef3fSRoman Lebedev return nullptr; 561352fef3fSRoman Lebedev } 562352fef3fSRoman Lebedev 563352fef3fSRoman Lebedev LLVM_DEBUG(dbgs() << "Negator: successfully sunk negation into " << *Root 564352fef3fSRoman Lebedev << "\n NEW: " << *Res->second << "\n"); 565352fef3fSRoman Lebedev ++NegatorNumTreesNegated; 566352fef3fSRoman Lebedev 567352fef3fSRoman Lebedev // We must temporarily unset the 'current' insertion point and DebugLoc of the 568352fef3fSRoman Lebedev // InstCombine's IRBuilder so that it won't interfere with the ones we have 569352fef3fSRoman Lebedev // already specified when producing negated instructions. 570352fef3fSRoman Lebedev InstCombiner::BuilderTy::InsertPointGuard Guard(IC.Builder); 571352fef3fSRoman Lebedev IC.Builder.ClearInsertionPoint(); 572352fef3fSRoman Lebedev IC.Builder.SetCurrentDebugLocation(DebugLoc()); 573352fef3fSRoman Lebedev 574352fef3fSRoman Lebedev // And finally, we must add newly-created instructions into the InstCombine's 575352fef3fSRoman Lebedev // worklist (in a proper order!) so it can attempt to combine them. 576352fef3fSRoman Lebedev LLVM_DEBUG(dbgs() << "Negator: Propagating " << Res->first.size() 577352fef3fSRoman Lebedev << " instrs to InstCombine\n"); 578352fef3fSRoman Lebedev NegatorMaxInstructionsCreated.updateMax(Res->first.size()); 579352fef3fSRoman Lebedev NegatorNumInstructionsNegatedSuccess += Res->first.size(); 580352fef3fSRoman Lebedev 581352fef3fSRoman Lebedev // They are in def-use order, so nothing fancy, just insert them in order. 582302313a2SKazu Hirata for (Instruction *I : Res->first) 583302313a2SKazu Hirata IC.Builder.Insert(I, I->getName()); 584352fef3fSRoman Lebedev 585352fef3fSRoman Lebedev // And return the new root. 586352fef3fSRoman Lebedev return Res->second; 587163bd9d8SMichael Liao } 588