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