LLVM 23.0.0git
InstCombineAndOrXor.cpp
Go to the documentation of this file.
1//===- InstCombineAndOrXor.cpp --------------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file implements the visitAnd, visitOr, and visitXor functions.
10//
11//===----------------------------------------------------------------------===//
12
13#include "InstCombineInternal.h"
21#include "llvm/IR/Intrinsics.h"
25
26using namespace llvm;
27using namespace PatternMatch;
28
29#define DEBUG_TYPE "instcombine"
30
31namespace llvm {
33}
34
35/// This is the complement of getICmpCode, which turns an opcode and two
36/// operands into either a constant true or false, or a brand new ICmp
37/// instruction. The sign is passed in to determine which kind of predicate to
38/// use in the new icmp instruction.
39static Value *getNewICmpValue(unsigned Code, bool Sign, Value *LHS, Value *RHS,
40 InstCombiner::BuilderTy &Builder) {
41 ICmpInst::Predicate NewPred;
42 if (Constant *TorF = getPredForICmpCode(Code, Sign, LHS->getType(), NewPred))
43 return TorF;
44 return Builder.CreateICmp(NewPred, LHS, RHS);
45}
46
47/// This is the complement of getFCmpCode, which turns an opcode and two
48/// operands into either a FCmp instruction, or a true/false constant.
49static Value *getFCmpValue(unsigned Code, Value *LHS, Value *RHS,
50 InstCombiner::BuilderTy &Builder, FMFSource FMF) {
51 FCmpInst::Predicate NewPred;
52 if (Constant *TorF = getPredForFCmpCode(Code, LHS->getType(), NewPred))
53 return TorF;
54 return Builder.CreateFCmpFMF(NewPred, LHS, RHS, FMF);
55}
56
57/// Emit a computation of: (V >= Lo && V < Hi) if Inside is true, otherwise
58/// (V < Lo || V >= Hi). This method expects that Lo < Hi. IsSigned indicates
59/// whether to treat V, Lo, and Hi as signed or not.
61 const APInt &Hi, bool isSigned,
62 bool Inside) {
63 assert((isSigned ? Lo.slt(Hi) : Lo.ult(Hi)) &&
64 "Lo is not < Hi in range emission code!");
65
66 Type *Ty = V->getType();
67
68 // V >= Min && V < Hi --> V < Hi
69 // V < Min || V >= Hi --> V >= Hi
71 if (isSigned ? Lo.isMinSignedValue() : Lo.isMinValue()) {
72 Pred = isSigned ? ICmpInst::getSignedPredicate(Pred) : Pred;
73 return Builder.CreateICmp(Pred, V, ConstantInt::get(Ty, Hi));
74 }
75
76 // V >= Lo && V < Hi --> V - Lo u< Hi - Lo
77 // V < Lo || V >= Hi --> V - Lo u>= Hi - Lo
78 Value *VMinusLo =
79 Builder.CreateSub(V, ConstantInt::get(Ty, Lo), V->getName() + ".off");
80 Constant *HiMinusLo = ConstantInt::get(Ty, Hi - Lo);
81 return Builder.CreateICmp(Pred, VMinusLo, HiMinusLo);
82}
83
84/// Classify (icmp eq (A & B), C) and (icmp ne (A & B), C) as matching patterns
85/// that can be simplified.
86/// One of A and B is considered the mask. The other is the value. This is
87/// described as the "AMask" or "BMask" part of the enum. If the enum contains
88/// only "Mask", then both A and B can be considered masks. If A is the mask,
89/// then it was proven that (A & C) == C. This is trivial if C == A or C == 0.
90/// If both A and C are constants, this proof is also easy.
91/// For the following explanations, we assume that A is the mask.
92///
93/// "AllOnes" declares that the comparison is true only if (A & B) == A or all
94/// bits of A are set in B.
95/// Example: (icmp eq (A & 3), 3) -> AMask_AllOnes
96///
97/// "AllZeros" declares that the comparison is true only if (A & B) == 0 or all
98/// bits of A are cleared in B.
99/// Example: (icmp eq (A & 3), 0) -> Mask_AllZeroes
100///
101/// "Mixed" declares that (A & B) == C and C might or might not contain any
102/// number of one bits and zero bits.
103/// Example: (icmp eq (A & 3), 1) -> AMask_Mixed
104///
105/// "Not" means that in above descriptions "==" should be replaced by "!=".
106/// Example: (icmp ne (A & 3), 3) -> AMask_NotAllOnes
107///
108/// If the mask A contains a single bit, then the following is equivalent:
109/// (icmp eq (A & B), A) equals (icmp ne (A & B), 0)
110/// (icmp ne (A & B), A) equals (icmp eq (A & B), 0)
123
124/// Return the set of patterns (from MaskedICmpType) that (icmp SCC (A & B), C)
125/// satisfies.
126static unsigned getMaskedICmpType(Value *A, Value *B, Value *C,
127 ICmpInst::Predicate Pred) {
128 const APInt *ConstA = nullptr, *ConstB = nullptr, *ConstC = nullptr;
129 match(A, m_APInt(ConstA));
130 match(B, m_APInt(ConstB));
131 match(C, m_APInt(ConstC));
132 bool IsEq = (Pred == ICmpInst::ICMP_EQ);
133 bool IsAPow2 = ConstA && ConstA->isPowerOf2();
134 bool IsBPow2 = ConstB && ConstB->isPowerOf2();
135 unsigned MaskVal = 0;
136 if (ConstC && ConstC->isZero()) {
137 // if C is zero, then both A and B qualify as mask
138 MaskVal |= (IsEq ? (Mask_AllZeros | AMask_Mixed | BMask_Mixed)
140 if (IsAPow2)
141 MaskVal |= (IsEq ? (AMask_NotAllOnes | AMask_NotMixed)
143 if (IsBPow2)
144 MaskVal |= (IsEq ? (BMask_NotAllOnes | BMask_NotMixed)
146 return MaskVal;
147 }
148
149 if (A == C) {
150 MaskVal |= (IsEq ? (AMask_AllOnes | AMask_Mixed)
152 if (IsAPow2)
153 MaskVal |= (IsEq ? (Mask_NotAllZeros | AMask_NotMixed)
155 } else if (ConstA && ConstC && ConstC->isSubsetOf(*ConstA)) {
156 MaskVal |= (IsEq ? AMask_Mixed : AMask_NotMixed);
157 }
158
159 if (B == C) {
160 MaskVal |= (IsEq ? (BMask_AllOnes | BMask_Mixed)
162 if (IsBPow2)
163 MaskVal |= (IsEq ? (Mask_NotAllZeros | BMask_NotMixed)
165 } else if (ConstB && ConstC && ConstC->isSubsetOf(*ConstB)) {
166 MaskVal |= (IsEq ? BMask_Mixed : BMask_NotMixed);
167 }
168
169 return MaskVal;
170}
171
172/// Convert an analysis of a masked ICmp into its equivalent if all boolean
173/// operations had the opposite sense. Since each "NotXXX" flag (recording !=)
174/// is adjacent to the corresponding normal flag (recording ==), this just
175/// involves swapping those bits over.
176static unsigned conjugateICmpMask(unsigned Mask) {
177 unsigned NewMask;
178 NewMask = (Mask & (AMask_AllOnes | BMask_AllOnes | Mask_AllZeros |
180 << 1;
181
182 NewMask |= (Mask & (AMask_NotAllOnes | BMask_NotAllOnes | Mask_NotAllZeros |
184 >> 1;
185
186 return NewMask;
187}
188
189// Adapts the external decomposeBitTest for local use.
191 Value *&Y, Value *&Z) {
192 auto Res =
193 llvm::decomposeBitTest(Cond, /*LookThroughTrunc=*/true,
194 /*AllowNonZeroC=*/true, /*DecomposeAnd=*/true);
195 if (!Res)
196 return false;
197
198 Pred = Res->Pred;
199 X = Res->X;
200 Y = ConstantInt::get(X->getType(), Res->Mask);
201 Z = ConstantInt::get(X->getType(), Res->C);
202 return true;
203}
204
205/// Handle (icmp(A & B) ==/!= C) &/| (icmp(A & D) ==/!= E).
206/// Return the pattern classes (from MaskedICmpType) for the left hand side and
207/// the right hand side as a pair.
208/// LHS and RHS are the left hand side and the right hand side ICmps and PredL
209/// and PredR are their predicates, respectively.
210static std::optional<std::pair<unsigned, unsigned>>
213 ICmpInst::Predicate &PredR) {
214
215 // Here comes the tricky part:
216 // LHS might be of the form L11 & L12 == X, X == L21 & L22,
217 // and L11 & L12 == L21 & L22. The same goes for RHS.
218 // Now we must find those components L** and R**, that are equal, so
219 // that we can extract the parameters A, B, C, D, and E for the canonical
220 // above.
221
222 // Check whether the icmp can be decomposed into a bit test.
223 Value *L1, *L11, *L12, *L2, *L21, *L22;
224 if (decomposeBitTest(LHS, PredL, L11, L12, L2)) {
225 L21 = L22 = L1 = nullptr;
226 } else {
227 auto *LHSCMP = dyn_cast<ICmpInst>(LHS);
228 if (!LHSCMP)
229 return std::nullopt;
230
231 // Don't allow pointers. Splat vectors are fine.
232 if (!LHSCMP->getOperand(0)->getType()->isIntOrIntVectorTy())
233 return std::nullopt;
234
235 PredL = LHSCMP->getPredicate();
236 L1 = LHSCMP->getOperand(0);
237 L2 = LHSCMP->getOperand(1);
238 // Look for ANDs in the LHS icmp.
239 if (!match(L1, m_And(m_Value(L11), m_Value(L12)))) {
240 // Any icmp can be viewed as being trivially masked; if it allows us to
241 // remove one, it's worth it.
242 L11 = L1;
244 }
245
246 if (!match(L2, m_And(m_Value(L21), m_Value(L22)))) {
247 L21 = L2;
249 }
250 }
251
252 // Bail if LHS was a icmp that can't be decomposed into an equality.
253 if (!ICmpInst::isEquality(PredL))
254 return std::nullopt;
255
256 Value *R11, *R12, *R2;
257 if (decomposeBitTest(RHS, PredR, R11, R12, R2)) {
258 if (R11 == L11 || R11 == L12 || R11 == L21 || R11 == L22) {
259 A = R11;
260 D = R12;
261 } else if (R12 == L11 || R12 == L12 || R12 == L21 || R12 == L22) {
262 A = R12;
263 D = R11;
264 } else {
265 return std::nullopt;
266 }
267 E = R2;
268 } else {
269 auto *RHSCMP = dyn_cast<ICmpInst>(RHS);
270 if (!RHSCMP)
271 return std::nullopt;
272 // Don't allow pointers. Splat vectors are fine.
273 if (!RHSCMP->getOperand(0)->getType()->isIntOrIntVectorTy())
274 return std::nullopt;
275
276 PredR = RHSCMP->getPredicate();
277
278 Value *R1 = RHSCMP->getOperand(0);
279 R2 = RHSCMP->getOperand(1);
280 bool Ok = false;
281 if (!match(R1, m_And(m_Value(R11), m_Value(R12)))) {
282 // As before, model no mask as a trivial mask if it'll let us do an
283 // optimization.
284 R11 = R1;
286 }
287
288 if (R11 == L11 || R11 == L12 || R11 == L21 || R11 == L22) {
289 A = R11;
290 D = R12;
291 E = R2;
292 Ok = true;
293 } else if (R12 == L11 || R12 == L12 || R12 == L21 || R12 == L22) {
294 A = R12;
295 D = R11;
296 E = R2;
297 Ok = true;
298 }
299
300 // Avoid matching against the -1 value we created for unmasked operand.
301 if (Ok && match(A, m_AllOnes()))
302 Ok = false;
303
304 // Look for ANDs on the right side of the RHS icmp.
305 if (!Ok) {
306 if (!match(R2, m_And(m_Value(R11), m_Value(R12)))) {
307 R11 = R2;
308 R12 = Constant::getAllOnesValue(R2->getType());
309 }
310
311 if (R11 == L11 || R11 == L12 || R11 == L21 || R11 == L22) {
312 A = R11;
313 D = R12;
314 E = R1;
315 } else if (R12 == L11 || R12 == L12 || R12 == L21 || R12 == L22) {
316 A = R12;
317 D = R11;
318 E = R1;
319 } else {
320 return std::nullopt;
321 }
322 }
323 }
324
325 // Bail if RHS was a icmp that can't be decomposed into an equality.
326 if (!ICmpInst::isEquality(PredR))
327 return std::nullopt;
328
329 if (L11 == A) {
330 B = L12;
331 C = L2;
332 } else if (L12 == A) {
333 B = L11;
334 C = L2;
335 } else if (L21 == A) {
336 B = L22;
337 C = L1;
338 } else if (L22 == A) {
339 B = L21;
340 C = L1;
341 }
342
343 unsigned LeftType = getMaskedICmpType(A, B, C, PredL);
344 unsigned RightType = getMaskedICmpType(A, D, E, PredR);
345 return std::optional<std::pair<unsigned, unsigned>>(
346 std::make_pair(LeftType, RightType));
347}
348
349/// Try to fold (icmp(A & B) ==/!= C) &/| (icmp(A & D) ==/!= E) into a single
350/// (icmp(A & X) ==/!= Y), where the left-hand side is of type Mask_NotAllZeros
351/// and the right hand side is of type BMask_Mixed. For example,
352/// (icmp (A & 12) != 0) & (icmp (A & 15) == 8) -> (icmp (A & 15) == 8).
353/// Also used for logical and/or, must be poison safe.
355 Value *LHS, Value *RHS, bool IsAnd, Value *A, Value *B, Value *D, Value *E,
357 InstCombiner::BuilderTy &Builder) {
358 // We are given the canonical form:
359 // (icmp ne (A & B), 0) & (icmp eq (A & D), E).
360 // where D & E == E.
361 //
362 // If IsAnd is false, we get it in negated form:
363 // (icmp eq (A & B), 0) | (icmp ne (A & D), E) ->
364 // !((icmp ne (A & B), 0) & (icmp eq (A & D), E)).
365 //
366 // We currently handle the case of B, C, D, E are constant.
367 //
368 const APInt *BCst, *DCst, *OrigECst;
369 if (!match(B, m_APInt(BCst)) || !match(D, m_APInt(DCst)) ||
370 !match(E, m_APInt(OrigECst)))
371 return nullptr;
372
374
375 // Update E to the canonical form when D is a power of two and RHS is
376 // canonicalized as,
377 // (icmp ne (A & D), 0) -> (icmp eq (A & D), D) or
378 // (icmp ne (A & D), D) -> (icmp eq (A & D), 0).
379 APInt ECst = *OrigECst;
380 if (PredR != NewCC)
381 ECst ^= *DCst;
382
383 // If B or D is zero, skip because if LHS or RHS can be trivially folded by
384 // other folding rules and this pattern won't apply any more.
385 if (*BCst == 0 || *DCst == 0)
386 return nullptr;
387
388 // If B and D don't intersect, ie. (B & D) == 0, try to fold isNaN idiom:
389 // (icmp ne (A & FractionBits), 0) & (icmp eq (A & ExpBits), ExpBits)
390 // -> isNaN(A)
391 // Otherwise, we cannot deduce anything from it.
392 if (!BCst->intersects(*DCst)) {
393 Value *Src;
394 if (*DCst == ECst && match(A, m_ElementWiseBitCast(m_Value(Src))) &&
395 !Builder.GetInsertBlock()->getParent()->hasFnAttribute(
396 Attribute::StrictFP)) {
397 Type *Ty = Src->getType()->getScalarType();
398 if (!Ty->isIEEELikeFPTy())
399 return nullptr;
400
401 APInt ExpBits = APFloat::getInf(Ty->getFltSemantics()).bitcastToAPInt();
402 if (ECst != ExpBits)
403 return nullptr;
404 APInt FractionBits = ~ExpBits;
405 FractionBits.clearSignBit();
406 if (*BCst != FractionBits)
407 return nullptr;
408
409 return Builder.CreateFCmp(IsAnd ? FCmpInst::FCMP_UNO : FCmpInst::FCMP_ORD,
410 Src, ConstantFP::getZero(Src->getType()));
411 }
412 return nullptr;
413 }
414
415 // If the following two conditions are met:
416 //
417 // 1. mask B covers only a single bit that's not covered by mask D, that is,
418 // (B & (B ^ D)) is a power of 2 (in other words, B minus the intersection of
419 // B and D has only one bit set) and,
420 //
421 // 2. RHS (and E) indicates that the rest of B's bits are zero (in other
422 // words, the intersection of B and D is zero), that is, ((B & D) & E) == 0
423 //
424 // then that single bit in B must be one and thus the whole expression can be
425 // folded to
426 // (A & (B | D)) == (B & (B ^ D)) | E.
427 //
428 // For example,
429 // (icmp ne (A & 12), 0) & (icmp eq (A & 7), 1) -> (icmp eq (A & 15), 9)
430 // (icmp ne (A & 15), 0) & (icmp eq (A & 7), 0) -> (icmp eq (A & 15), 8)
431 if ((((*BCst & *DCst) & ECst) == 0) &&
432 (*BCst & (*BCst ^ *DCst)).isPowerOf2()) {
433 APInt BorD = *BCst | *DCst;
434 APInt BandBxorDorE = (*BCst & (*BCst ^ *DCst)) | ECst;
435 Value *NewMask = ConstantInt::get(A->getType(), BorD);
436 Value *NewMaskedValue = ConstantInt::get(A->getType(), BandBxorDorE);
437 Value *NewAnd = Builder.CreateAnd(A, NewMask);
438 return Builder.CreateICmp(NewCC, NewAnd, NewMaskedValue);
439 }
440
441 auto IsSubSetOrEqual = [](const APInt *C1, const APInt *C2) {
442 return (*C1 & *C2) == *C1;
443 };
444 auto IsSuperSetOrEqual = [](const APInt *C1, const APInt *C2) {
445 return (*C1 & *C2) == *C2;
446 };
447
448 // In the following, we consider only the cases where B is a superset of D, B
449 // is a subset of D, or B == D because otherwise there's at least one bit
450 // covered by B but not D, in which case we can't deduce much from it, so
451 // no folding (aside from the single must-be-one bit case right above.)
452 // For example,
453 // (icmp ne (A & 14), 0) & (icmp eq (A & 3), 1) -> no folding.
454 if (!IsSubSetOrEqual(BCst, DCst) && !IsSuperSetOrEqual(BCst, DCst))
455 return nullptr;
456
457 // At this point, either B is a superset of D, B is a subset of D or B == D.
458
459 // If E is zero, if B is a subset of (or equal to) D, LHS and RHS contradict
460 // and the whole expression becomes false (or true if negated), otherwise, no
461 // folding.
462 // For example,
463 // (icmp ne (A & 3), 0) & (icmp eq (A & 7), 0) -> false.
464 // (icmp ne (A & 15), 0) & (icmp eq (A & 3), 0) -> no folding.
465 if (ECst.isZero()) {
466 if (IsSubSetOrEqual(BCst, DCst))
467 return ConstantInt::get(LHS->getType(), !IsAnd);
468 return nullptr;
469 }
470
471 // At this point, B, D, E aren't zero and (B & D) == B, (B & D) == D or B ==
472 // D. If B is a superset of (or equal to) D, since E is not zero, LHS is
473 // subsumed by RHS (RHS implies LHS.) So the whole expression becomes
474 // RHS. For example,
475 // (icmp ne (A & 255), 0) & (icmp eq (A & 15), 8) -> (icmp eq (A & 15), 8).
476 // (icmp ne (A & 15), 0) & (icmp eq (A & 15), 8) -> (icmp eq (A & 15), 8).
477 if (IsSuperSetOrEqual(BCst, DCst)) {
478 // We can't guarantee that samesign hold after this fold.
479 if (auto *ICmp = dyn_cast<ICmpInst>(RHS))
480 ICmp->setSameSign(false);
481 return RHS;
482 }
483 // Otherwise, B is a subset of D. If B and E have a common bit set,
484 // ie. (B & E) != 0, then LHS is subsumed by RHS. For example.
485 // (icmp ne (A & 12), 0) & (icmp eq (A & 15), 8) -> (icmp eq (A & 15), 8).
486 assert(IsSubSetOrEqual(BCst, DCst) && "Precondition due to above code");
487 if ((*BCst & ECst) != 0) {
488 // We can't guarantee that samesign hold after this fold.
489 if (auto *ICmp = dyn_cast<ICmpInst>(RHS))
490 ICmp->setSameSign(false);
491 return RHS;
492 }
493 // Otherwise, LHS and RHS contradict and the whole expression becomes false
494 // (or true if negated.) For example,
495 // (icmp ne (A & 7), 0) & (icmp eq (A & 15), 8) -> false.
496 // (icmp ne (A & 6), 0) & (icmp eq (A & 15), 8) -> false.
497 return ConstantInt::get(LHS->getType(), !IsAnd);
498}
499
500/// Try to fold (icmp(A & B) ==/!= 0) &/| (icmp(A & D) ==/!= E) into a single
501/// (icmp(A & X) ==/!= Y), where the left-hand side and the right hand side
502/// aren't of the common mask pattern type.
503/// Also used for logical and/or, must be poison safe.
505 Value *LHS, Value *RHS, bool IsAnd, Value *A, Value *B, Value *C, Value *D,
507 unsigned LHSMask, unsigned RHSMask, InstCombiner::BuilderTy &Builder) {
509 "Expected equality predicates for masked type of icmps.");
510 // Handle Mask_NotAllZeros-BMask_Mixed cases.
511 // (icmp ne/eq (A & B), C) &/| (icmp eq/ne (A & D), E), or
512 // (icmp eq/ne (A & B), C) &/| (icmp ne/eq (A & D), E)
513 // which gets swapped to
514 // (icmp ne/eq (A & D), E) &/| (icmp eq/ne (A & B), C).
515 if (!IsAnd) {
516 LHSMask = conjugateICmpMask(LHSMask);
517 RHSMask = conjugateICmpMask(RHSMask);
518 }
519 if ((LHSMask & Mask_NotAllZeros) && (RHSMask & BMask_Mixed)) {
521 LHS, RHS, IsAnd, A, B, D, E, PredL, PredR, Builder)) {
522 return V;
523 }
524 } else if ((LHSMask & BMask_Mixed) && (RHSMask & Mask_NotAllZeros)) {
526 RHS, LHS, IsAnd, A, D, B, C, PredR, PredL, Builder)) {
527 return V;
528 }
529 }
530 return nullptr;
531}
532
533/// Try to fold (icmp(A & B) ==/!= C) &/| (icmp(A & D) ==/!= E)
534/// into a single (icmp(A & X) ==/!= Y).
536 bool IsLogical,
538 const SimplifyQuery &Q) {
539 Value *A = nullptr, *B = nullptr, *C = nullptr, *D = nullptr, *E = nullptr;
540 ICmpInst::Predicate PredL, PredR;
541 std::optional<std::pair<unsigned, unsigned>> MaskPair =
542 getMaskedTypeForICmpPair(A, B, C, D, E, LHS, RHS, PredL, PredR);
543 if (!MaskPair)
544 return nullptr;
546 "Expected equality predicates for masked type of icmps.");
547 unsigned LHSMask = MaskPair->first;
548 unsigned RHSMask = MaskPair->second;
549 unsigned Mask = LHSMask & RHSMask;
550 if (Mask == 0) {
551 // Even if the two sides don't share a common pattern, check if folding can
552 // still happen.
554 LHS, RHS, IsAnd, A, B, C, D, E, PredL, PredR, LHSMask, RHSMask,
555 Builder))
556 return V;
557 return nullptr;
558 }
559
560 // In full generality:
561 // (icmp (A & B) Op C) | (icmp (A & D) Op E)
562 // == ![ (icmp (A & B) !Op C) & (icmp (A & D) !Op E) ]
563 //
564 // If the latter can be converted into (icmp (A & X) Op Y) then the former is
565 // equivalent to (icmp (A & X) !Op Y).
566 //
567 // Therefore, we can pretend for the rest of this function that we're dealing
568 // with the conjunction, provided we flip the sense of any comparisons (both
569 // input and output).
570
571 // In most cases we're going to produce an EQ for the "&&" case.
573 if (!IsAnd) {
574 // Convert the masking analysis into its equivalent with negated
575 // comparisons.
576 Mask = conjugateICmpMask(Mask);
577 }
578
579 if (Mask & Mask_AllZeros) {
580 // (icmp eq (A & B), 0) & (icmp eq (A & D), 0)
581 // -> (icmp eq (A & (B|D)), 0)
582 if (IsLogical && !isGuaranteedNotToBeUndefOrPoison(D))
583 return nullptr; // TODO: Use freeze?
584 Value *NewOr = Builder.CreateOr(B, D);
585 Value *NewAnd = Builder.CreateAnd(A, NewOr);
586 // We can't use C as zero because we might actually handle
587 // (icmp ne (A & B), B) & (icmp ne (A & D), D)
588 // with B and D, having a single bit set.
589 Value *Zero = Constant::getNullValue(A->getType());
590 return Builder.CreateICmp(NewCC, NewAnd, Zero);
591 }
592 if (Mask & BMask_AllOnes) {
593 // (icmp eq (A & B), B) & (icmp eq (A & D), D)
594 // -> (icmp eq (A & (B|D)), (B|D))
595 if (IsLogical && !isGuaranteedNotToBeUndefOrPoison(D))
596 return nullptr; // TODO: Use freeze?
597 Value *NewOr = Builder.CreateOr(B, D);
598 Value *NewAnd = Builder.CreateAnd(A, NewOr);
599 return Builder.CreateICmp(NewCC, NewAnd, NewOr);
600 }
601 if (Mask & AMask_AllOnes) {
602 // (icmp eq (A & B), A) & (icmp eq (A & D), A)
603 // -> (icmp eq (A & (B&D)), A)
604 if (IsLogical && !isGuaranteedNotToBeUndefOrPoison(D))
605 return nullptr; // TODO: Use freeze?
606 Value *NewAnd1 = Builder.CreateAnd(B, D);
607 Value *NewAnd2 = Builder.CreateAnd(A, NewAnd1);
608 return Builder.CreateICmp(NewCC, NewAnd2, A);
609 }
610
611 const APInt *ConstB, *ConstD;
612 if (match(B, m_APInt(ConstB)) && match(D, m_APInt(ConstD))) {
613 if (Mask & (Mask_NotAllZeros | BMask_NotAllOnes)) {
614 // (icmp ne (A & B), 0) & (icmp ne (A & D), 0) and
615 // (icmp ne (A & B), B) & (icmp ne (A & D), D)
616 // -> (icmp ne (A & B), 0) or (icmp ne (A & D), 0)
617 // Only valid if one of the masks is a superset of the other (check "B&D"
618 // is the same as either B or D).
619 APInt NewMask = *ConstB & *ConstD;
620 if (NewMask == *ConstB)
621 return LHS;
622 if (NewMask == *ConstD) {
623 if (IsLogical) {
624 if (auto *RHSI = dyn_cast<Instruction>(RHS))
625 RHSI->dropPoisonGeneratingFlags();
626 }
627 return RHS;
628 }
629 }
630
631 if (Mask & AMask_NotAllOnes) {
632 // (icmp ne (A & B), B) & (icmp ne (A & D), D)
633 // -> (icmp ne (A & B), A) or (icmp ne (A & D), A)
634 // Only valid if one of the masks is a superset of the other (check "B|D"
635 // is the same as either B or D).
636 APInt NewMask = *ConstB | *ConstD;
637 if (NewMask == *ConstB)
638 return LHS;
639 if (NewMask == *ConstD)
640 return RHS;
641 }
642
643 if (Mask & (BMask_Mixed | BMask_NotMixed)) {
644 // Mixed:
645 // (icmp eq (A & B), C) & (icmp eq (A & D), E)
646 // We already know that B & C == C && D & E == E.
647 // If we can prove that (B & D) & (C ^ E) == 0, that is, the bits of
648 // C and E, which are shared by both the mask B and the mask D, don't
649 // contradict, then we can transform to
650 // -> (icmp eq (A & (B|D)), (C|E))
651 // Currently, we only handle the case of B, C, D, and E being constant.
652 // We can't simply use C and E because we might actually handle
653 // (icmp ne (A & B), B) & (icmp eq (A & D), D)
654 // with B and D, having a single bit set.
655
656 // NotMixed:
657 // (icmp ne (A & B), C) & (icmp ne (A & D), E)
658 // -> (icmp ne (A & (B & D)), (C & E))
659 // Check the intersection (B & D) for inequality.
660 // Assume that (B & D) == B || (B & D) == D, i.e B/D is a subset of D/B
661 // and (B & D) & (C ^ E) == 0, bits of C and E, which are shared by both
662 // the B and the D, don't contradict. Note that we can assume (~B & C) ==
663 // 0 && (~D & E) == 0, previous operation should delete these icmps if it
664 // hadn't been met.
665
666 const APInt *OldConstC, *OldConstE;
667 if (!match(C, m_APInt(OldConstC)) || !match(E, m_APInt(OldConstE)))
668 return nullptr;
669
670 auto FoldBMixed = [&](ICmpInst::Predicate CC, bool IsNot) -> Value * {
671 CC = IsNot ? CmpInst::getInversePredicate(CC) : CC;
672 const APInt ConstC = PredL != CC ? *ConstB ^ *OldConstC : *OldConstC;
673 const APInt ConstE = PredR != CC ? *ConstD ^ *OldConstE : *OldConstE;
674
675 if (((*ConstB & *ConstD) & (ConstC ^ ConstE)).getBoolValue())
676 return IsNot ? nullptr : ConstantInt::get(LHS->getType(), !IsAnd);
677
678 if (IsNot && !ConstB->isSubsetOf(*ConstD) &&
679 !ConstD->isSubsetOf(*ConstB))
680 return nullptr;
681
682 APInt BD, CE;
683 if (IsNot) {
684 BD = *ConstB & *ConstD;
685 CE = ConstC & ConstE;
686 } else {
687 BD = *ConstB | *ConstD;
688 CE = ConstC | ConstE;
689 }
690 Value *NewAnd = Builder.CreateAnd(A, BD);
691 Value *CEVal = ConstantInt::get(A->getType(), CE);
692 return Builder.CreateICmp(CC, NewAnd, CEVal);
693 };
694
695 if (Mask & BMask_Mixed)
696 return FoldBMixed(NewCC, false);
697 if (Mask & BMask_NotMixed) // can be else also
698 return FoldBMixed(NewCC, true);
699 }
700 }
701
702 // (icmp eq (A & B), 0) | (icmp eq (A & D), 0)
703 // -> (icmp ne (A & (B|D)), (B|D))
704 // (icmp ne (A & B), 0) & (icmp ne (A & D), 0)
705 // -> (icmp eq (A & (B|D)), (B|D))
706 // iff B and D is known to be a power of two
707 if (Mask & Mask_NotAllZeros &&
708 isKnownToBeAPowerOfTwo(B, /*OrZero=*/false, Q) &&
709 isKnownToBeAPowerOfTwo(D, /*OrZero=*/false, Q)) {
710 // If this is a logical and/or, then we must prevent propagation of a
711 // poison value from the RHS by inserting freeze.
712 if (IsLogical)
713 D = Builder.CreateFreeze(D);
714 Value *Mask = Builder.CreateOr(B, D);
715 Value *Masked = Builder.CreateAnd(A, Mask);
716 return Builder.CreateICmp(NewCC, Masked, Mask);
717 }
718 return nullptr;
719}
720
721/// Try to fold a signed range checked with lower bound 0 to an unsigned icmp.
722/// Example: (icmp sge x, 0) & (icmp slt x, n) --> icmp ult x, n
723/// If \p Inverted is true then the check is for the inverted range, e.g.
724/// (icmp slt x, 0) | (icmp sgt x, n) --> icmp ugt x, n
726 bool Inverted) {
727 // Check the lower range comparison, e.g. x >= 0
728 // InstCombine already ensured that if there is a constant it's on the RHS.
729 ConstantInt *RangeStart = dyn_cast<ConstantInt>(Cmp0->getOperand(1));
730 if (!RangeStart)
731 return nullptr;
732
733 ICmpInst::Predicate Pred0 = (Inverted ? Cmp0->getInversePredicate() :
734 Cmp0->getPredicate());
735
736 // Accept x > -1 or x >= 0 (after potentially inverting the predicate).
737 if (!((Pred0 == ICmpInst::ICMP_SGT && RangeStart->isMinusOne()) ||
738 (Pred0 == ICmpInst::ICMP_SGE && RangeStart->isZero())))
739 return nullptr;
740
741 ICmpInst::Predicate Pred1 = (Inverted ? Cmp1->getInversePredicate() :
742 Cmp1->getPredicate());
743
744 Value *Input = Cmp0->getOperand(0);
745 Value *Cmp1Op0 = Cmp1->getOperand(0);
746 Value *Cmp1Op1 = Cmp1->getOperand(1);
747 Value *RangeEnd;
748 if (match(Cmp1Op0, m_SExtOrSelf(m_Specific(Input)))) {
749 // For the upper range compare we have: icmp x, n
750 Input = Cmp1Op0;
751 RangeEnd = Cmp1Op1;
752 } else if (match(Cmp1Op1, m_SExtOrSelf(m_Specific(Input)))) {
753 // For the upper range compare we have: icmp n, x
754 Input = Cmp1Op1;
755 RangeEnd = Cmp1Op0;
756 Pred1 = ICmpInst::getSwappedPredicate(Pred1);
757 } else {
758 return nullptr;
759 }
760
761 // Check the upper range comparison, e.g. x < n
762 ICmpInst::Predicate NewPred;
763 switch (Pred1) {
764 case ICmpInst::ICMP_SLT: NewPred = ICmpInst::ICMP_ULT; break;
765 case ICmpInst::ICMP_SLE: NewPred = ICmpInst::ICMP_ULE; break;
766 default: return nullptr;
767 }
768
769 // This simplification is only valid if the upper range is not negative.
770 KnownBits Known = computeKnownBits(RangeEnd, Cmp1);
771 if (!Known.isNonNegative())
772 return nullptr;
773
774 if (Inverted)
775 NewPred = ICmpInst::getInversePredicate(NewPred);
776
777 return Builder.CreateICmp(NewPred, Input, RangeEnd);
778}
779
780// (or (icmp eq X, 0), (icmp eq X, Pow2OrZero))
781// -> (icmp eq (and X, Pow2OrZero), X)
782// (and (icmp ne X, 0), (icmp ne X, Pow2OrZero))
783// -> (icmp ne (and X, Pow2OrZero), X)
784static Value *
786 ICmpInst *LHS, ICmpInst *RHS, bool IsAnd,
787 const SimplifyQuery &Q) {
789 // Make sure we have right compares for our op.
790 if (LHS->getPredicate() != Pred || RHS->getPredicate() != Pred)
791 return nullptr;
792
793 // Make it so we can match LHS against the (icmp eq/ne X, 0) just for
794 // simplicity.
795 if (match(RHS->getOperand(1), m_Zero()))
796 std::swap(LHS, RHS);
797
798 Value *Pow2, *Op;
799 // Match the desired pattern:
800 // LHS: (icmp eq/ne X, 0)
801 // RHS: (icmp eq/ne X, Pow2OrZero)
802 // Skip if Pow2OrZero is 1. Either way it gets folded to (icmp ugt X, 1) but
803 // this form ends up slightly less canonical.
804 // We could potentially be more sophisticated than requiring LHS/RHS
805 // be one-use. We don't create additional instructions if only one
806 // of them is one-use. So cases where one is one-use and the other
807 // is two-use might be profitable.
808 if (!match(LHS, m_OneUse(m_ICmp(Pred, m_Value(Op), m_Zero()))) ||
809 !match(RHS, m_OneUse(m_c_ICmp(Pred, m_Specific(Op), m_Value(Pow2)))) ||
810 match(Pow2, m_One()) ||
811 !isKnownToBeAPowerOfTwo(Pow2, Q.DL, /*OrZero=*/true, Q.AC, Q.CxtI, Q.DT))
812 return nullptr;
813
814 Value *And = Builder.CreateAnd(Op, Pow2);
815 return Builder.CreateICmp(Pred, And, Op);
816}
817
818/// General pattern:
819/// X & Y
820///
821/// Where Y is checking that all the high bits (covered by a mask 4294967168)
822/// are uniform, i.e. %arg & 4294967168 can be either 4294967168 or 0
823/// Pattern can be one of:
824/// %t = add i32 %arg, 128
825/// %r = icmp ult i32 %t, 256
826/// Or
827/// %t0 = shl i32 %arg, 24
828/// %t1 = ashr i32 %t0, 24
829/// %r = icmp eq i32 %t1, %arg
830/// Or
831/// %t0 = trunc i32 %arg to i8
832/// %t1 = sext i8 %t0 to i32
833/// %r = icmp eq i32 %t1, %arg
834/// This pattern is a signed truncation check.
835///
836/// And X is checking that some bit in that same mask is zero.
837/// I.e. can be one of:
838/// %r = icmp sgt i32 %arg, -1
839/// Or
840/// %t = and i32 %arg, 2147483648
841/// %r = icmp eq i32 %t, 0
842///
843/// Since we are checking that all the bits in that mask are the same,
844/// and a particular bit is zero, what we are really checking is that all the
845/// masked bits are zero.
846/// So this should be transformed to:
847/// %r = icmp ult i32 %arg, 128
849 Instruction &CxtI,
850 InstCombiner::BuilderTy &Builder) {
851 assert(CxtI.getOpcode() == Instruction::And);
852
853 // Match icmp ult (add %arg, C01), C1 (C1 == C01 << 1; powers of two)
854 auto tryToMatchSignedTruncationCheck = [](ICmpInst *ICmp, Value *&X,
855 APInt &SignBitMask) -> bool {
856 const APInt *I01, *I1; // powers of two; I1 == I01 << 1
858 m_Add(m_Value(X), m_Power2(I01)),
859 m_Power2(I1))) &&
860 I1->ugt(*I01) && I01->shl(1) == *I1))
861 return false;
862 // Which bit is the new sign bit as per the 'signed truncation' pattern?
863 SignBitMask = *I01;
864 return true;
865 };
866
867 // One icmp needs to be 'signed truncation check'.
868 // We need to match this first, else we will mismatch commutative cases.
869 Value *X1;
870 APInt HighestBit;
871 ICmpInst *OtherICmp;
872 if (tryToMatchSignedTruncationCheck(ICmp1, X1, HighestBit))
873 OtherICmp = ICmp0;
874 else if (tryToMatchSignedTruncationCheck(ICmp0, X1, HighestBit))
875 OtherICmp = ICmp1;
876 else
877 return nullptr;
878
879 assert(HighestBit.isPowerOf2() && "expected to be power of two (non-zero)");
880
881 // Try to match/decompose into: icmp eq (X & Mask), 0
882 auto tryToDecompose = [](ICmpInst *ICmp, Value *&X,
883 APInt &UnsetBitsMask) -> bool {
884 CmpPredicate Pred = ICmp->getPredicate();
885 // Can it be decomposed into icmp eq (X & Mask), 0 ?
887 ICmp->getOperand(0), ICmp->getOperand(1), Pred,
888 /*LookThroughTrunc=*/false, /*AllowNonZeroC=*/false,
889 /*DecomposeAnd=*/true);
890 if (Res && Res->Pred == ICmpInst::ICMP_EQ) {
891 X = Res->X;
892 UnsetBitsMask = Res->Mask;
893 return true;
894 }
895
896 return false;
897 };
898
899 // And the other icmp needs to be decomposable into a bit test.
900 Value *X0;
901 APInt UnsetBitsMask;
902 if (!tryToDecompose(OtherICmp, X0, UnsetBitsMask))
903 return nullptr;
904
905 assert(!UnsetBitsMask.isZero() && "empty mask makes no sense.");
906
907 // Are they working on the same value?
908 Value *X;
909 if (X1 == X0) {
910 // Ok as is.
911 X = X1;
912 } else if (match(X0, m_Trunc(m_Specific(X1)))) {
913 UnsetBitsMask = UnsetBitsMask.zext(X1->getType()->getScalarSizeInBits());
914 X = X1;
915 } else
916 return nullptr;
917
918 // So which bits should be uniform as per the 'signed truncation check'?
919 // (all the bits starting with (i.e. including) HighestBit)
920 APInt SignBitsMask = ~(HighestBit - 1U);
921
922 // UnsetBitsMask must have some common bits with SignBitsMask,
923 if (!UnsetBitsMask.intersects(SignBitsMask))
924 return nullptr;
925
926 // Does UnsetBitsMask contain any bits outside of SignBitsMask?
927 if (!UnsetBitsMask.isSubsetOf(SignBitsMask)) {
928 APInt OtherHighestBit = (~UnsetBitsMask) + 1U;
929 if (!OtherHighestBit.isPowerOf2())
930 return nullptr;
931 HighestBit = APIntOps::umin(HighestBit, OtherHighestBit);
932 }
933 // Else, if it does not, then all is ok as-is.
934
935 // %r = icmp ult %X, SignBit
936 return Builder.CreateICmpULT(X, ConstantInt::get(X->getType(), HighestBit),
937 CxtI.getName() + ".simplified");
938}
939
940/// Fold (icmp eq ctpop(X) 1) | (icmp eq X 0) into (icmp ult ctpop(X) 2) and
941/// fold (icmp ne ctpop(X) 1) & (icmp ne X 0) into (icmp ugt ctpop(X) 1).
942/// Also used for logical and/or, must be poison safe if range attributes are
943/// dropped.
944static Value *foldIsPowerOf2OrZero(ICmpInst *Cmp0, ICmpInst *Cmp1, bool IsAnd,
946 InstCombinerImpl &IC) {
947 CmpPredicate Pred0, Pred1;
948 Value *X;
950 m_SpecificInt(1))) ||
951 !match(Cmp1, m_ICmp(Pred1, m_Specific(X), m_ZeroInt())))
952 return nullptr;
953
954 auto *CtPop = cast<Instruction>(Cmp0->getOperand(0));
955 if (IsAnd && Pred0 == ICmpInst::ICMP_NE && Pred1 == ICmpInst::ICMP_NE) {
956 // Drop range attributes and re-infer them in the next iteration.
957 CtPop->dropPoisonGeneratingAnnotations();
958 IC.addToWorklist(CtPop);
959 return Builder.CreateICmpUGT(CtPop, ConstantInt::get(CtPop->getType(), 1));
960 }
961 if (!IsAnd && Pred0 == ICmpInst::ICMP_EQ && Pred1 == ICmpInst::ICMP_EQ) {
962 // Drop range attributes and re-infer them in the next iteration.
963 CtPop->dropPoisonGeneratingAnnotations();
964 IC.addToWorklist(CtPop);
965 return Builder.CreateICmpULT(CtPop, ConstantInt::get(CtPop->getType(), 2));
966 }
967
968 return nullptr;
969}
970
971/// Reduce a pair of compares that check if a value has exactly 1 bit set.
972/// Also used for logical and/or, must be poison safe if range attributes are
973/// dropped.
974static Value *foldIsPowerOf2(ICmpInst *Cmp0, ICmpInst *Cmp1, bool JoinedByAnd,
976 InstCombinerImpl &IC) {
977 // Handle 'and' / 'or' commutation: make the equality check the first operand.
978 if (JoinedByAnd && Cmp1->getPredicate() == ICmpInst::ICMP_NE)
979 std::swap(Cmp0, Cmp1);
980 else if (!JoinedByAnd && Cmp1->getPredicate() == ICmpInst::ICMP_EQ)
981 std::swap(Cmp0, Cmp1);
982
983 // (X != 0) && (ctpop(X) u< 2) --> ctpop(X) == 1
984 Value *X;
985 if (JoinedByAnd &&
989 m_SpecificInt(2)))) {
990 auto *CtPop = cast<Instruction>(Cmp1->getOperand(0));
991 // Drop range attributes and re-infer them in the next iteration.
992 CtPop->dropPoisonGeneratingAnnotations();
993 IC.addToWorklist(CtPop);
994 return Builder.CreateICmpEQ(CtPop, ConstantInt::get(CtPop->getType(), 1));
995 }
996 // (X == 0) || (ctpop(X) u> 1) --> ctpop(X) != 1
997 if (!JoinedByAnd &&
1001 m_SpecificInt(1)))) {
1002 auto *CtPop = cast<Instruction>(Cmp1->getOperand(0));
1003 // Drop range attributes and re-infer them in the next iteration.
1004 CtPop->dropPoisonGeneratingAnnotations();
1005 IC.addToWorklist(CtPop);
1006 return Builder.CreateICmpNE(CtPop, ConstantInt::get(CtPop->getType(), 1));
1007 }
1008 return nullptr;
1009}
1010
1011/// Try to fold (icmp(A & B) == 0) & (icmp(A & D) != E) into (icmp A u< D) iff
1012/// B is a contiguous set of ones starting from the most significant bit
1013/// (negative power of 2), D and E are equal, and D is a contiguous set of ones
1014/// starting at the most significant zero bit in B. Parameter B supports masking
1015/// using undef/poison in either scalar or vector values.
1017 Value *A, Value *B, Value *D, Value *E, ICmpInst::Predicate PredL,
1020 "Expected equality predicates for masked type of icmps.");
1021 if (PredL != ICmpInst::ICMP_EQ || PredR != ICmpInst::ICMP_NE)
1022 return nullptr;
1023
1024 if (!match(B, m_NegatedPower2()) || !match(D, m_ShiftedMask()) ||
1025 !match(E, m_ShiftedMask()))
1026 return nullptr;
1027
1028 // Test scalar arguments for conversion. B has been validated earlier to be a
1029 // negative power of two and thus is guaranteed to have one or more contiguous
1030 // ones starting from the MSB followed by zero or more contiguous zeros. D has
1031 // been validated earlier to be a shifted set of one or more contiguous ones.
1032 // In order to match, B leading ones and D leading zeros should be equal. The
1033 // predicate that B be a negative power of 2 prevents the condition of there
1034 // ever being zero leading ones. Thus 0 == 0 cannot occur. The predicate that
1035 // D always be a shifted mask prevents the condition of D equaling 0. This
1036 // prevents matching the condition where B contains the maximum number of
1037 // leading one bits (-1) and D contains the maximum number of leading zero
1038 // bits (0).
1039 auto isReducible = [](const Value *B, const Value *D, const Value *E) {
1040 const APInt *BCst, *DCst, *ECst;
1041 return match(B, m_APIntAllowPoison(BCst)) && match(D, m_APInt(DCst)) &&
1042 match(E, m_APInt(ECst)) && *DCst == *ECst &&
1043 (isa<PoisonValue>(B) ||
1044 (BCst->countLeadingOnes() == DCst->countLeadingZeros()));
1045 };
1046
1047 // Test vector type arguments for conversion.
1048 if (const auto *BVTy = dyn_cast<VectorType>(B->getType())) {
1049 const auto *BFVTy = dyn_cast<FixedVectorType>(BVTy);
1050 const auto *BConst = dyn_cast<Constant>(B);
1051 const auto *DConst = dyn_cast<Constant>(D);
1052 const auto *EConst = dyn_cast<Constant>(E);
1053
1054 if (!BFVTy || !BConst || !DConst || !EConst)
1055 return nullptr;
1056
1057 for (unsigned I = 0; I != BFVTy->getNumElements(); ++I) {
1058 const auto *BElt = BConst->getAggregateElement(I);
1059 const auto *DElt = DConst->getAggregateElement(I);
1060 const auto *EElt = EConst->getAggregateElement(I);
1061
1062 if (!BElt || !DElt || !EElt)
1063 return nullptr;
1064 if (!isReducible(BElt, DElt, EElt))
1065 return nullptr;
1066 }
1067 } else {
1068 // Test scalar type arguments for conversion.
1069 if (!isReducible(B, D, E))
1070 return nullptr;
1071 }
1072 return Builder.CreateICmp(ICmpInst::ICMP_ULT, A, D);
1073}
1074
1075/// Try to fold ((icmp X u< P) & (icmp(X & M) != M)) or ((icmp X s> -1) &
1076/// (icmp(X & M) != M)) into (icmp X u< M). Where P is a power of 2, M < P, and
1077/// M is a contiguous shifted mask starting at the right most significant zero
1078/// bit in P. SGT is supported as when P is the largest representable power of
1079/// 2, an earlier optimization converts the expression into (icmp X s> -1).
1080/// Parameter P supports masking using undef/poison in either scalar or vector
1081/// values.
1083 bool JoinedByAnd,
1084 InstCombiner::BuilderTy &Builder) {
1085 if (!JoinedByAnd)
1086 return nullptr;
1087 Value *A = nullptr, *B = nullptr, *C = nullptr, *D = nullptr, *E = nullptr;
1088 ICmpInst::Predicate CmpPred0, CmpPred1;
1089 // Assuming P is a 2^n, getMaskedTypeForICmpPair will normalize (icmp X u<
1090 // 2^n) into (icmp (X & ~(2^n-1)) == 0) and (icmp X s> -1) into (icmp (X &
1091 // SignMask) == 0).
1092 std::optional<std::pair<unsigned, unsigned>> MaskPair =
1093 getMaskedTypeForICmpPair(A, B, C, D, E, Cmp0, Cmp1, CmpPred0, CmpPred1);
1094 if (!MaskPair)
1095 return nullptr;
1096
1097 const auto compareBMask = BMask_NotMixed | BMask_NotAllOnes;
1098 unsigned CmpMask0 = MaskPair->first;
1099 unsigned CmpMask1 = MaskPair->second;
1100 if ((CmpMask0 & Mask_AllZeros) && (CmpMask1 == compareBMask)) {
1101 if (Value *V = foldNegativePower2AndShiftedMask(A, B, D, E, CmpPred0,
1102 CmpPred1, Builder))
1103 return V;
1104 } else if ((CmpMask0 == compareBMask) && (CmpMask1 & Mask_AllZeros)) {
1105 if (Value *V = foldNegativePower2AndShiftedMask(A, D, B, C, CmpPred1,
1106 CmpPred0, Builder))
1107 return V;
1108 }
1109 return nullptr;
1110}
1111
1112/// Commuted variants are assumed to be handled by calling this function again
1113/// with the parameters swapped.
1115 ICmpInst *UnsignedICmp, bool IsAnd,
1116 const SimplifyQuery &Q,
1117 InstCombiner::BuilderTy &Builder) {
1118 Value *ZeroCmpOp;
1119 CmpPredicate EqPred;
1120 if (!match(ZeroICmp, m_ICmp(EqPred, m_Value(ZeroCmpOp), m_Zero())) ||
1121 !ICmpInst::isEquality(EqPred))
1122 return nullptr;
1123
1124 CmpPredicate UnsignedPred;
1125
1126 Value *A, *B;
1127 if (match(UnsignedICmp,
1128 m_c_ICmp(UnsignedPred, m_Specific(ZeroCmpOp), m_Value(A))) &&
1129 match(ZeroCmpOp, m_c_Add(m_Specific(A), m_Value(B))) &&
1130 (ZeroICmp->hasOneUse() || UnsignedICmp->hasOneUse())) {
1131 auto GetKnownNonZeroAndOther = [&](Value *&NonZero, Value *&Other) {
1132 if (!isKnownNonZero(NonZero, Q))
1133 std::swap(NonZero, Other);
1134 return isKnownNonZero(NonZero, Q);
1135 };
1136
1137 // Given ZeroCmpOp = (A + B)
1138 // ZeroCmpOp < A && ZeroCmpOp != 0 --> (0-X) < Y iff
1139 // ZeroCmpOp >= A || ZeroCmpOp == 0 --> (0-X) >= Y iff
1140 // with X being the value (A/B) that is known to be non-zero,
1141 // and Y being remaining value.
1142 if (UnsignedPred == ICmpInst::ICMP_ULT && EqPred == ICmpInst::ICMP_NE &&
1143 IsAnd && GetKnownNonZeroAndOther(B, A))
1144 return Builder.CreateICmpULT(Builder.CreateNeg(B), A);
1145 if (UnsignedPred == ICmpInst::ICMP_UGE && EqPred == ICmpInst::ICMP_EQ &&
1146 !IsAnd && GetKnownNonZeroAndOther(B, A))
1147 return Builder.CreateICmpUGE(Builder.CreateNeg(B), A);
1148 }
1149
1150 return nullptr;
1151}
1152
1153struct IntPart {
1155 unsigned StartBit;
1156 unsigned NumBits;
1157};
1158
1159/// Match an extraction of bits from an integer.
1160static std::optional<IntPart> matchIntPart(Value *V) {
1161 Value *X;
1162 if (!match(V, m_OneUse(m_Trunc(m_Value(X)))))
1163 return std::nullopt;
1164
1165 unsigned NumOriginalBits = X->getType()->getScalarSizeInBits();
1166 unsigned NumExtractedBits = V->getType()->getScalarSizeInBits();
1167 Value *Y;
1168 const APInt *Shift;
1169 // For a trunc(lshr Y, Shift) pattern, make sure we're only extracting bits
1170 // from Y, not any shifted-in zeroes.
1171 if (match(X, m_OneUse(m_LShr(m_Value(Y), m_APInt(Shift)))) &&
1172 Shift->ule(NumOriginalBits - NumExtractedBits))
1173 return {{Y, (unsigned)Shift->getZExtValue(), NumExtractedBits}};
1174 return {{X, 0, NumExtractedBits}};
1175}
1176
1177/// Materialize an extraction of bits from an integer in IR.
1178static Value *extractIntPart(const IntPart &P, IRBuilderBase &Builder) {
1179 Value *V = P.From;
1180 if (P.StartBit)
1181 V = Builder.CreateLShr(V, P.StartBit);
1182 Type *TruncTy = V->getType()->getWithNewBitWidth(P.NumBits);
1183 if (TruncTy != V->getType())
1184 V = Builder.CreateTrunc(V, TruncTy);
1185 return V;
1186}
1187
1188/// (icmp eq X0, Y0) & (icmp eq X1, Y1) -> icmp eq X01, Y01
1189/// (icmp ne X0, Y0) | (icmp ne X1, Y1) -> icmp ne X01, Y01
1190/// where X0, X1 and Y0, Y1 are adjacent parts extracted from an integer.
1191Value *InstCombinerImpl::foldEqOfParts(Value *Cmp0, Value *Cmp1, bool IsAnd) {
1192 if (!Cmp0->hasOneUse() || !Cmp1->hasOneUse())
1193 return nullptr;
1194
1196 auto GetMatchPart = [&](Value *CmpV,
1197 unsigned OpNo) -> std::optional<IntPart> {
1198 assert(CmpV->getType()->isIntOrIntVectorTy(1) && "Must be bool");
1199
1200 Value *X, *Y;
1201 // icmp ne (and x, 1), (and y, 1) <=> trunc (xor x, y) to i1
1202 // icmp eq (and x, 1), (and y, 1) <=> not (trunc (xor x, y) to i1)
1203 if (Pred == CmpInst::ICMP_NE
1204 ? match(CmpV, m_Trunc(m_Xor(m_Value(X), m_Value(Y))))
1205 : match(CmpV, m_Not(m_Trunc(m_Xor(m_Value(X), m_Value(Y))))))
1206 return {{OpNo == 0 ? X : Y, 0, 1}};
1207
1208 auto *Cmp = dyn_cast<ICmpInst>(CmpV);
1209 if (!Cmp)
1210 return std::nullopt;
1211
1212 if (Pred == Cmp->getPredicate())
1213 return matchIntPart(Cmp->getOperand(OpNo));
1214
1215 const APInt *C;
1216 // (icmp eq (lshr x, C), (lshr y, C)) gets optimized to:
1217 // (icmp ult (xor x, y), 1 << C) so also look for that.
1218 if (Pred == CmpInst::ICMP_EQ && Cmp->getPredicate() == CmpInst::ICMP_ULT) {
1219 if (!match(Cmp->getOperand(1), m_Power2(C)) ||
1220 !match(Cmp->getOperand(0), m_Xor(m_Value(), m_Value())))
1221 return std::nullopt;
1222 }
1223
1224 // (icmp ne (lshr x, C), (lshr y, C)) gets optimized to:
1225 // (icmp ugt (xor x, y), (1 << C) - 1) so also look for that.
1226 else if (Pred == CmpInst::ICMP_NE &&
1227 Cmp->getPredicate() == CmpInst::ICMP_UGT) {
1228 if (!match(Cmp->getOperand(1), m_LowBitMask(C)) ||
1229 !match(Cmp->getOperand(0), m_Xor(m_Value(), m_Value())))
1230 return std::nullopt;
1231 } else {
1232 return std::nullopt;
1233 }
1234
1235 unsigned From = Pred == CmpInst::ICMP_NE ? C->popcount() : C->countr_zero();
1236 Instruction *I = cast<Instruction>(Cmp->getOperand(0));
1237 return {{I->getOperand(OpNo), From, C->getBitWidth() - From}};
1238 };
1239
1240 std::optional<IntPart> L0 = GetMatchPart(Cmp0, 0);
1241 std::optional<IntPart> R0 = GetMatchPart(Cmp0, 1);
1242 std::optional<IntPart> L1 = GetMatchPart(Cmp1, 0);
1243 std::optional<IntPart> R1 = GetMatchPart(Cmp1, 1);
1244 if (!L0 || !R0 || !L1 || !R1)
1245 return nullptr;
1246
1247 // Make sure the LHS/RHS compare a part of the same value, possibly after
1248 // an operand swap.
1249 if (L0->From != L1->From || R0->From != R1->From) {
1250 if (L0->From != R1->From || R0->From != L1->From)
1251 return nullptr;
1252 std::swap(L1, R1);
1253 }
1254
1255 // Make sure the extracted parts are adjacent, canonicalizing to L0/R0 being
1256 // the low part and L1/R1 being the high part.
1257 if (L0->StartBit + L0->NumBits != L1->StartBit ||
1258 R0->StartBit + R0->NumBits != R1->StartBit) {
1259 if (L1->StartBit + L1->NumBits != L0->StartBit ||
1260 R1->StartBit + R1->NumBits != R0->StartBit)
1261 return nullptr;
1262 std::swap(L0, L1);
1263 std::swap(R0, R1);
1264 }
1265
1266 // We can simplify to a comparison of these larger parts of the integers.
1267 IntPart L = {L0->From, L0->StartBit, L0->NumBits + L1->NumBits};
1268 IntPart R = {R0->From, R0->StartBit, R0->NumBits + R1->NumBits};
1271 return Builder.CreateICmp(Pred, LValue, RValue);
1272}
1273
1274/// Reduce logic-of-compares with equality to a constant by substituting a
1275/// common operand with the constant. Callers are expected to call this with
1276/// Cmp0/Cmp1 switched to handle logic op commutativity.
1278 bool IsAnd, bool IsLogical,
1279 InstCombiner::BuilderTy &Builder,
1280 const SimplifyQuery &Q,
1281 Instruction &I) {
1282 // Match an equality compare with a non-poison constant as Cmp0.
1283 // Also, give up if the compare can be constant-folded to avoid looping.
1284 CmpPredicate Pred0;
1285 Value *X;
1286 Constant *C;
1287 if (!match(Cmp0, m_ICmp(Pred0, m_Value(X), m_Constant(C))) ||
1289 return nullptr;
1290 if ((IsAnd && Pred0 != ICmpInst::ICMP_EQ) ||
1291 (!IsAnd && Pred0 != ICmpInst::ICMP_NE))
1292 return nullptr;
1293
1294 // The other compare must include a common operand (X). Canonicalize the
1295 // common operand as operand 1 (Pred1 is swapped if the common operand was
1296 // operand 0).
1297 Value *Y;
1298 CmpPredicate Pred1;
1299 if (!match(Cmp1, m_c_ICmp(Pred1, m_Value(Y), m_Specific(X))))
1300 return nullptr;
1301
1302 // Replace variable with constant value equivalence to remove a variable use:
1303 // (X == C) && (Y Pred1 X) --> (X == C) && (Y Pred1 C)
1304 // (X != C) || (Y Pred1 X) --> (X != C) || (Y Pred1 C)
1305 // Can think of the 'or' substitution with the 'and' bool equivalent:
1306 // A || B --> A || (!A && B)
1307 Value *SubstituteCmp = simplifyICmpInst(Pred1, Y, C, Q);
1308 if (!SubstituteCmp) {
1309 // If we need to create a new instruction, require that the old compare can
1310 // be removed.
1311 if (!Cmp1->hasOneUse())
1312 return nullptr;
1313 SubstituteCmp = Builder.CreateICmp(Pred1, Y, C);
1314 }
1315 if (IsLogical) {
1316 Instruction *MDFrom =
1318 return IsAnd ? Builder.CreateLogicalAnd(Cmp0, SubstituteCmp, "", MDFrom)
1319 : Builder.CreateLogicalOr(Cmp0, SubstituteCmp, "", MDFrom);
1320 }
1321 return Builder.CreateBinOp(IsAnd ? Instruction::And : Instruction::Or, Cmp0,
1322 SubstituteCmp);
1323}
1324
1325/// Fold (icmp Pred1 V1, C1) & (icmp Pred2 V2, C2)
1326/// or (icmp Pred1 V1, C1) | (icmp Pred2 V2, C2)
1327/// into a single comparison using range-based reasoning.
1328/// NOTE: This is also used for logical and/or, must be poison-safe!
1329Value *InstCombinerImpl::foldAndOrOfICmpsUsingRanges(ICmpInst *ICmp1,
1330 ICmpInst *ICmp2,
1331 bool IsAnd) {
1332 // Return (V, CR) for a range check idiom V in CR.
1333 auto MatchExactRangeCheck =
1334 [](ICmpInst *ICmp) -> std::optional<std::pair<Value *, ConstantRange>> {
1335 const APInt *C;
1336 if (!match(ICmp->getOperand(1), m_APInt(C)))
1337 return std::nullopt;
1338 Value *LHS = ICmp->getOperand(0);
1339 CmpPredicate Pred = ICmp->getPredicate();
1340 Value *X;
1341 // Match (x & NegPow2) ==/!= C
1342 const APInt *Mask;
1343 if (ICmpInst::isEquality(Pred) &&
1345 C->countr_zero() >= Mask->countr_zero()) {
1346 ConstantRange CR(*C, *C - *Mask);
1347 if (Pred == ICmpInst::ICMP_NE)
1348 CR = CR.inverse();
1349 return std::make_pair(X, CR);
1350 }
1351 ConstantRange CR = ConstantRange::makeExactICmpRegion(Pred, *C);
1352 // Match (add X, C1) pred C
1353 // TODO: investigate whether we should apply the one-use check on m_AddLike.
1354 const APInt *C1;
1355 if (match(LHS, m_AddLike(m_Value(X), m_APInt(C1))))
1356 return std::make_pair(X, CR.subtract(*C1));
1357 return std::make_pair(LHS, CR);
1358 };
1359
1360 auto RC1 = MatchExactRangeCheck(ICmp1);
1361 if (!RC1)
1362 return nullptr;
1363
1364 auto RC2 = MatchExactRangeCheck(ICmp2);
1365 if (!RC2)
1366 return nullptr;
1367
1368 auto &[V1, CR1] = *RC1;
1369 auto &[V2, CR2] = *RC2;
1370 if (V1 != V2)
1371 return nullptr;
1372
1373 // For 'and', we use the De Morgan's Laws to simplify the implementation.
1374 if (IsAnd) {
1375 CR1 = CR1.inverse();
1376 CR2 = CR2.inverse();
1377 }
1378
1379 Type *Ty = V1->getType();
1380 Value *NewV = V1;
1381 std::optional<ConstantRange> CR = CR1.exactUnionWith(CR2);
1382 if (!CR) {
1383 if (!(ICmp1->hasOneUse() && ICmp2->hasOneUse()) || CR1.isWrappedSet() ||
1384 CR2.isWrappedSet())
1385 return nullptr;
1386
1387 // Check whether we have equal-size ranges that only differ by one bit.
1388 // In that case we can apply a mask to map one range onto the other.
1389 APInt LowerDiff = CR1.getLower() ^ CR2.getLower();
1390 APInt UpperDiff = (CR1.getUpper() - 1) ^ (CR2.getUpper() - 1);
1391 APInt CR1Size = CR1.getUpper() - CR1.getLower();
1392 if (!LowerDiff.isPowerOf2() || LowerDiff != UpperDiff ||
1393 CR1Size != CR2.getUpper() - CR2.getLower())
1394 return nullptr;
1395
1396 CR = CR1.getLower().ult(CR2.getLower()) ? CR1 : CR2;
1397 NewV = Builder.CreateAnd(NewV, ConstantInt::get(Ty, ~LowerDiff));
1398 }
1399
1400 if (IsAnd)
1401 CR = CR->inverse();
1402
1403 CmpInst::Predicate NewPred;
1404 APInt NewC, Offset;
1405 CR->getEquivalentICmp(NewPred, NewC, Offset);
1406
1407 if (Offset != 0)
1408 NewV = Builder.CreateAdd(NewV, ConstantInt::get(Ty, Offset));
1409 return Builder.CreateICmp(NewPred, NewV, ConstantInt::get(Ty, NewC));
1410}
1411
1412/// Matches canonical form of isnan, fcmp ord x, 0
1416
1417/// Matches fcmp u__ x, +/-inf
1422
1423/// and (fcmp ord x, 0), (fcmp u* x, inf) -> fcmp o* x, inf
1424///
1425/// Clang emits this pattern for doing an isfinite check in __builtin_isnormal.
1427 FCmpInst *RHS) {
1428 Value *LHS0 = LHS->getOperand(0), *LHS1 = LHS->getOperand(1);
1429 Value *RHS0 = RHS->getOperand(0), *RHS1 = RHS->getOperand(1);
1430 FCmpInst::Predicate PredL = LHS->getPredicate(), PredR = RHS->getPredicate();
1431
1432 if (!matchIsNotNaN(PredL, LHS0, LHS1) ||
1433 !matchUnorderedInfCompare(PredR, RHS0, RHS1))
1434 return nullptr;
1435
1436 return Builder.CreateFCmpFMF(FCmpInst::getOrderedPredicate(PredR), RHS0, RHS1,
1438}
1439
1440Value *InstCombinerImpl::foldLogicOfFCmps(FCmpInst *LHS, FCmpInst *RHS,
1441 bool IsAnd, bool IsLogicalSelect) {
1442 Value *LHS0 = LHS->getOperand(0), *LHS1 = LHS->getOperand(1);
1443 Value *RHS0 = RHS->getOperand(0), *RHS1 = RHS->getOperand(1);
1444 FCmpInst::Predicate PredL = LHS->getPredicate(), PredR = RHS->getPredicate();
1445
1446 if (LHS0 == RHS1 && RHS0 == LHS1) {
1447 // Swap RHS operands to match LHS.
1448 PredR = FCmpInst::getSwappedPredicate(PredR);
1449 std::swap(RHS0, RHS1);
1450 }
1451
1452 // Simplify (fcmp cc0 x, y) & (fcmp cc1 x, y).
1453 // Suppose the relation between x and y is R, where R is one of
1454 // U(1000), L(0100), G(0010) or E(0001), and CC0 and CC1 are the bitmasks for
1455 // testing the desired relations.
1456 //
1457 // Since (R & CC0) and (R & CC1) are either R or 0, we actually have this:
1458 // bool(R & CC0) && bool(R & CC1)
1459 // = bool((R & CC0) & (R & CC1))
1460 // = bool(R & (CC0 & CC1)) <= by re-association, commutation, and idempotency
1461 //
1462 // Since (R & CC0) and (R & CC1) are either R or 0, we actually have this:
1463 // bool(R & CC0) || bool(R & CC1)
1464 // = bool((R & CC0) | (R & CC1))
1465 // = bool(R & (CC0 | CC1)) <= by reversed distribution (contribution? ;)
1466 if (LHS0 == RHS0 && LHS1 == RHS1) {
1467 unsigned FCmpCodeL = getFCmpCode(PredL);
1468 unsigned FCmpCodeR = getFCmpCode(PredR);
1469 unsigned NewPred = IsAnd ? FCmpCodeL & FCmpCodeR : FCmpCodeL | FCmpCodeR;
1470
1471 // Intersect the fast math flags.
1472 // TODO: We can union the fast math flags unless this is a logical select.
1473 return getFCmpValue(NewPred, LHS0, LHS1, Builder,
1475 }
1476
1477 // This transform is not valid for a logical select.
1478 if (!IsLogicalSelect &&
1479 ((PredL == FCmpInst::FCMP_ORD && PredR == FCmpInst::FCMP_ORD && IsAnd) ||
1480 (PredL == FCmpInst::FCMP_UNO && PredR == FCmpInst::FCMP_UNO &&
1481 !IsAnd))) {
1482 if (LHS0->getType() != RHS0->getType())
1483 return nullptr;
1484
1485 // FCmp canonicalization ensures that (fcmp ord/uno X, X) and
1486 // (fcmp ord/uno X, C) will be transformed to (fcmp X, +0.0).
1487 if (match(LHS1, m_PosZeroFP()) && match(RHS1, m_PosZeroFP())) {
1488 // Ignore the constants because they are obviously not NANs:
1489 // (fcmp ord x, 0.0) & (fcmp ord y, 0.0) -> (fcmp ord x, y)
1490 // (fcmp uno x, 0.0) | (fcmp uno y, 0.0) -> (fcmp uno x, y)
1491 return Builder.CreateFCmpFMF(PredL, LHS0, RHS0,
1493 }
1494 }
1495
1496 // This transform is not valid for a logical select.
1497 if (!IsLogicalSelect && IsAnd &&
1498 stripSignOnlyFPOps(LHS0) == stripSignOnlyFPOps(RHS0)) {
1499 // and (fcmp ord x, 0), (fcmp u* x, inf) -> fcmp o* x, inf
1500 // and (fcmp ord x, 0), (fcmp u* fabs(x), inf) -> fcmp o* x, inf
1502 return Left;
1504 return Right;
1505 }
1506
1507 // Turn at least two fcmps with constants into llvm.is.fpclass.
1508 //
1509 // If we can represent a combined value test with one class call, we can
1510 // potentially eliminate 4-6 instructions. If we can represent a test with a
1511 // single fcmp with fneg and fabs, that's likely a better canonical form.
1512 if (LHS->hasOneUse() && RHS->hasOneUse()) {
1513 auto [ClassValRHS, ClassMaskRHS] =
1514 fcmpToClassTest(PredR, *RHS->getFunction(), RHS0, RHS1);
1515 if (ClassValRHS) {
1516 auto [ClassValLHS, ClassMaskLHS] =
1517 fcmpToClassTest(PredL, *LHS->getFunction(), LHS0, LHS1);
1518 if (ClassValLHS == ClassValRHS) {
1519 unsigned CombinedMask = IsAnd ? (ClassMaskLHS & ClassMaskRHS)
1520 : (ClassMaskLHS | ClassMaskRHS);
1521 return Builder.CreateIntrinsic(
1522 Intrinsic::is_fpclass, {ClassValLHS->getType()},
1523 {ClassValLHS, Builder.getInt32(CombinedMask)});
1524 }
1525 }
1526 }
1527
1528 // Canonicalize the range check idiom:
1529 // and (fcmp olt/ole/ult/ule x, C), (fcmp ogt/oge/ugt/uge x, -C)
1530 // --> fabs(x) olt/ole/ult/ule C
1531 // or (fcmp ogt/oge/ugt/uge x, C), (fcmp olt/ole/ult/ule x, -C)
1532 // --> fabs(x) ogt/oge/ugt/uge C
1533 // TODO: Generalize to handle a negated variable operand?
1534 const APFloat *LHSC, *RHSC;
1535 if (LHS0 == RHS0 && LHS->hasOneUse() && RHS->hasOneUse() &&
1536 FCmpInst::getSwappedPredicate(PredL) == PredR &&
1537 match(LHS1, m_APFloatAllowPoison(LHSC)) &&
1538 match(RHS1, m_APFloatAllowPoison(RHSC)) &&
1539 LHSC->bitwiseIsEqual(neg(*RHSC))) {
1540 auto IsLessThanOrLessEqual = [](FCmpInst::Predicate Pred) {
1541 switch (Pred) {
1542 case FCmpInst::FCMP_OLT:
1543 case FCmpInst::FCMP_OLE:
1544 case FCmpInst::FCMP_ULT:
1545 case FCmpInst::FCMP_ULE:
1546 return true;
1547 default:
1548 return false;
1549 }
1550 };
1551 if (IsLessThanOrLessEqual(IsAnd ? PredR : PredL)) {
1552 std::swap(LHSC, RHSC);
1553 std::swap(PredL, PredR);
1554 }
1555 if (IsLessThanOrLessEqual(IsAnd ? PredL : PredR)) {
1556 FastMathFlags NewFlag = LHS->getFastMathFlags();
1557 if (!IsLogicalSelect)
1558 NewFlag |= RHS->getFastMathFlags();
1559
1560 Value *FAbs =
1561 Builder.CreateUnaryIntrinsic(Intrinsic::fabs, LHS0, NewFlag);
1562 return Builder.CreateFCmpFMF(
1563 PredL, FAbs, ConstantFP::get(LHS0->getType(), *LHSC), NewFlag);
1564 }
1565 }
1566
1567 return nullptr;
1568}
1569
1570/// Match an fcmp against a special value that performs a test possible by
1571/// llvm.is.fpclass.
1572static bool matchIsFPClassLikeFCmp(Value *Op, Value *&ClassVal,
1573 uint64_t &ClassMask) {
1574 auto *FCmp = dyn_cast<FCmpInst>(Op);
1575 if (!FCmp || !FCmp->hasOneUse())
1576 return false;
1577
1578 std::tie(ClassVal, ClassMask) =
1579 fcmpToClassTest(FCmp->getPredicate(), *FCmp->getParent()->getParent(),
1580 FCmp->getOperand(0), FCmp->getOperand(1));
1581 return ClassVal != nullptr;
1582}
1583
1584/// or (is_fpclass x, mask0), (is_fpclass x, mask1)
1585/// -> is_fpclass x, (mask0 | mask1)
1586/// and (is_fpclass x, mask0), (is_fpclass x, mask1)
1587/// -> is_fpclass x, (mask0 & mask1)
1588/// xor (is_fpclass x, mask0), (is_fpclass x, mask1)
1589/// -> is_fpclass x, (mask0 ^ mask1)
1590Instruction *InstCombinerImpl::foldLogicOfIsFPClass(BinaryOperator &BO,
1591 Value *Op0, Value *Op1) {
1592 Value *ClassVal0 = nullptr;
1593 Value *ClassVal1 = nullptr;
1594 uint64_t ClassMask0, ClassMask1;
1595
1596 // Restrict to folding one fcmp into one is.fpclass for now, don't introduce a
1597 // new class.
1598 //
1599 // TODO: Support forming is.fpclass out of 2 separate fcmps when codegen is
1600 // better.
1601
1602 bool IsLHSClass =
1604 m_Value(ClassVal0), m_ConstantInt(ClassMask0))));
1605 bool IsRHSClass =
1607 m_Value(ClassVal1), m_ConstantInt(ClassMask1))));
1608 if ((((IsLHSClass || matchIsFPClassLikeFCmp(Op0, ClassVal0, ClassMask0)) &&
1609 (IsRHSClass || matchIsFPClassLikeFCmp(Op1, ClassVal1, ClassMask1)))) &&
1610 ClassVal0 == ClassVal1) {
1611 unsigned NewClassMask;
1612 switch (BO.getOpcode()) {
1613 case Instruction::And:
1614 NewClassMask = ClassMask0 & ClassMask1;
1615 break;
1616 case Instruction::Or:
1617 NewClassMask = ClassMask0 | ClassMask1;
1618 break;
1619 case Instruction::Xor:
1620 NewClassMask = ClassMask0 ^ ClassMask1;
1621 break;
1622 default:
1623 llvm_unreachable("not a binary logic operator");
1624 }
1625
1626 if (IsLHSClass) {
1627 auto *II = cast<IntrinsicInst>(Op0);
1628 II->setArgOperand(
1629 1, ConstantInt::get(II->getArgOperand(1)->getType(), NewClassMask));
1630 return replaceInstUsesWith(BO, II);
1631 }
1632
1633 if (IsRHSClass) {
1634 auto *II = cast<IntrinsicInst>(Op1);
1635 II->setArgOperand(
1636 1, ConstantInt::get(II->getArgOperand(1)->getType(), NewClassMask));
1637 return replaceInstUsesWith(BO, II);
1638 }
1639
1640 CallInst *NewClass =
1641 Builder.CreateIntrinsic(Intrinsic::is_fpclass, {ClassVal0->getType()},
1642 {ClassVal0, Builder.getInt32(NewClassMask)});
1643 return replaceInstUsesWith(BO, NewClass);
1644 }
1645
1646 return nullptr;
1647}
1648
1649/// Look for the pattern that conditionally negates a value via math operations:
1650/// cond.splat = sext i1 cond
1651/// sub = add cond.splat, x
1652/// xor = xor sub, cond.splat
1653/// and rewrite it to do the same, but via logical operations:
1654/// value.neg = sub 0, value
1655/// cond = select i1 neg, value.neg, value
1656Instruction *InstCombinerImpl::canonicalizeConditionalNegationViaMathToSelect(
1657 BinaryOperator &I) {
1658 assert(I.getOpcode() == BinaryOperator::Xor && "Only for xor!");
1659 Value *Cond, *X;
1660 // As per complexity ordering, `xor` is not commutative here.
1661 if (!match(&I, m_c_BinOp(m_OneUse(m_Value()), m_Value())) ||
1662 !match(I.getOperand(1), m_SExt(m_Value(Cond))) ||
1663 !Cond->getType()->isIntOrIntVectorTy(1) ||
1664 !match(I.getOperand(0), m_c_Add(m_SExt(m_Specific(Cond)), m_Value(X))))
1665 return nullptr;
1666 return createSelectInstWithUnknownProfile(
1667 Cond, Builder.CreateNeg(X, X->getName() + ".neg"), X);
1668}
1669
1670/// This a limited reassociation for a special case (see above) where we are
1671/// checking if two values are either both NAN (unordered) or not-NAN (ordered).
1672/// This could be handled more generally in '-reassociation', but it seems like
1673/// an unlikely pattern for a large number of logic ops and fcmps.
1675 InstCombiner::BuilderTy &Builder) {
1676 Instruction::BinaryOps Opcode = BO.getOpcode();
1677 assert((Opcode == Instruction::And || Opcode == Instruction::Or) &&
1678 "Expecting and/or op for fcmp transform");
1679
1680 // There are 4 commuted variants of the pattern. Canonicalize operands of this
1681 // logic op so an fcmp is operand 0 and a matching logic op is operand 1.
1682 Value *Op0 = BO.getOperand(0), *Op1 = BO.getOperand(1), *X;
1683 if (match(Op1, m_FCmp(m_Value(), m_AnyZeroFP())))
1684 std::swap(Op0, Op1);
1685
1686 // Match inner binop and the predicate for combining 2 NAN checks into 1.
1687 Value *BO10, *BO11;
1688 FCmpInst::Predicate NanPred = Opcode == Instruction::And ? FCmpInst::FCMP_ORD
1690 if (!match(Op0, m_SpecificFCmp(NanPred, m_Value(X), m_AnyZeroFP())) ||
1691 !match(Op1, m_BinOp(Opcode, m_Value(BO10), m_Value(BO11))))
1692 return nullptr;
1693
1694 // The inner logic op must have a matching fcmp operand.
1695 Value *Y;
1696 if (!match(BO10, m_SpecificFCmp(NanPred, m_Value(Y), m_AnyZeroFP())) ||
1697 X->getType() != Y->getType())
1698 std::swap(BO10, BO11);
1699
1700 if (!match(BO10, m_SpecificFCmp(NanPred, m_Value(Y), m_AnyZeroFP())) ||
1701 X->getType() != Y->getType())
1702 return nullptr;
1703
1704 // and (fcmp ord X, 0), (and (fcmp ord Y, 0), Z) --> and (fcmp ord X, Y), Z
1705 // or (fcmp uno X, 0), (or (fcmp uno Y, 0), Z) --> or (fcmp uno X, Y), Z
1706 // Intersect FMF from the 2 source fcmps.
1707 Value *NewFCmp =
1708 Builder.CreateFCmpFMF(NanPred, X, Y, FMFSource::intersect(Op0, BO10));
1709 return BinaryOperator::Create(Opcode, NewFCmp, BO11);
1710}
1711
1712/// Match variations of De Morgan's Laws:
1713/// (~A & ~B) == (~(A | B))
1714/// (~A | ~B) == (~(A & B))
1716 InstCombiner &IC) {
1717 const Instruction::BinaryOps Opcode = I.getOpcode();
1718 assert((Opcode == Instruction::And || Opcode == Instruction::Or) &&
1719 "Trying to match De Morgan's Laws with something other than and/or");
1720
1721 // Flip the logic operation.
1722 const Instruction::BinaryOps FlippedOpcode =
1723 (Opcode == Instruction::And) ? Instruction::Or : Instruction::And;
1724
1725 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
1726 Value *A, *B;
1727 if (match(Op0, m_OneUse(m_Not(m_Value(A)))) &&
1728 match(Op1, m_OneUse(m_Not(m_Value(B)))) &&
1729 !IC.isFreeToInvert(A, A->hasOneUse()) &&
1730 !IC.isFreeToInvert(B, B->hasOneUse())) {
1731 Value *AndOr =
1732 IC.Builder.CreateBinOp(FlippedOpcode, A, B, I.getName() + ".demorgan");
1733 return BinaryOperator::CreateNot(AndOr);
1734 }
1735
1736 // The 'not' ops may require reassociation.
1737 // (A & ~B) & ~C --> A & ~(B | C)
1738 // (~B & A) & ~C --> A & ~(B | C)
1739 // (A | ~B) | ~C --> A | ~(B & C)
1740 // (~B | A) | ~C --> A | ~(B & C)
1741 Value *C;
1742 if (match(Op0, m_OneUse(m_c_BinOp(Opcode, m_Value(A), m_Not(m_Value(B))))) &&
1743 match(Op1, m_Not(m_Value(C)))) {
1744 Value *FlippedBO = IC.Builder.CreateBinOp(FlippedOpcode, B, C);
1745 return BinaryOperator::Create(Opcode, A, IC.Builder.CreateNot(FlippedBO));
1746 }
1747
1748 return nullptr;
1749}
1750
1751bool InstCombinerImpl::shouldOptimizeCast(CastInst *CI) {
1752 Value *CastSrc = CI->getOperand(0);
1753
1754 // Noop casts and casts of constants should be eliminated trivially.
1755 if (CI->getSrcTy() == CI->getDestTy() || isa<Constant>(CastSrc))
1756 return false;
1757
1758 // If this cast is paired with another cast that can be eliminated, we prefer
1759 // to have it eliminated.
1760 if (const auto *PrecedingCI = dyn_cast<CastInst>(CastSrc))
1761 if (isEliminableCastPair(PrecedingCI, CI))
1762 return false;
1763
1764 return true;
1765}
1766
1767/// Fold {and,or,xor} (cast X), C.
1769 InstCombinerImpl &IC) {
1771 if (!C)
1772 return nullptr;
1773
1774 auto LogicOpc = Logic.getOpcode();
1775 Type *DestTy = Logic.getType();
1776 Type *SrcTy = Cast->getSrcTy();
1777
1778 // Move the logic operation ahead of a zext or sext if the constant is
1779 // unchanged in the smaller source type. Performing the logic in a smaller
1780 // type may provide more information to later folds, and the smaller logic
1781 // instruction may be cheaper (particularly in the case of vectors).
1782 Value *X;
1783 auto &DL = IC.getDataLayout();
1784 if (match(Cast, m_OneUse(m_ZExt(m_Value(X))))) {
1785 PreservedCastFlags Flags;
1786 if (Constant *TruncC = getLosslessUnsignedTrunc(C, SrcTy, DL, &Flags)) {
1787 // LogicOpc (zext X), C --> zext (LogicOpc X, C)
1788 Value *NewOp = IC.Builder.CreateBinOp(LogicOpc, X, TruncC);
1789 auto *ZExt = new ZExtInst(NewOp, DestTy);
1790 ZExt->setNonNeg(Flags.NNeg);
1791 ZExt->andIRFlags(Cast);
1792 return ZExt;
1793 }
1794 }
1795
1796 if (match(Cast, m_OneUse(m_SExtLike(m_Value(X))))) {
1797 if (Constant *TruncC = getLosslessSignedTrunc(C, SrcTy, DL)) {
1798 // LogicOpc (sext X), C --> sext (LogicOpc X, C)
1799 Value *NewOp = IC.Builder.CreateBinOp(LogicOpc, X, TruncC);
1800 return new SExtInst(NewOp, DestTy);
1801 }
1802 }
1803
1804 return nullptr;
1805}
1806
1807/// Fold {and,or,xor} (cast X), Y.
1808Instruction *InstCombinerImpl::foldCastedBitwiseLogic(BinaryOperator &I) {
1809 auto LogicOpc = I.getOpcode();
1810 assert(I.isBitwiseLogicOp() && "Unexpected opcode for bitwise logic folding");
1811
1812 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
1813
1814 // fold bitwise(A >> BW - 1, zext(icmp)) (BW is the scalar bits of the
1815 // type of A)
1816 // -> bitwise(zext(A < 0), zext(icmp))
1817 // -> zext(bitwise(A < 0, icmp))
1818 auto FoldBitwiseICmpZeroWithICmp = [&](Value *Op0,
1819 Value *Op1) -> Instruction * {
1820 Value *A;
1821 bool IsMatched =
1822 match(Op0,
1824 m_Value(A),
1825 m_SpecificInt(Op0->getType()->getScalarSizeInBits() - 1)))) &&
1826 match(Op1, m_OneUse(m_ZExt(m_ICmp(m_Value(), m_Value()))));
1827
1828 if (!IsMatched)
1829 return nullptr;
1830
1831 auto *ICmpL =
1832 Builder.CreateICmpSLT(A, Constant::getNullValue(A->getType()));
1833 auto *ICmpR = cast<ZExtInst>(Op1)->getOperand(0);
1834 auto *BitwiseOp = Builder.CreateBinOp(LogicOpc, ICmpL, ICmpR);
1835
1836 return new ZExtInst(BitwiseOp, Op0->getType());
1837 };
1838
1839 if (auto *Ret = FoldBitwiseICmpZeroWithICmp(Op0, Op1))
1840 return Ret;
1841
1842 if (auto *Ret = FoldBitwiseICmpZeroWithICmp(Op1, Op0))
1843 return Ret;
1844
1845 CastInst *Cast0 = dyn_cast<CastInst>(Op0);
1846 if (!Cast0)
1847 return nullptr;
1848
1849 // This must be a cast from an integer or integer vector source type to allow
1850 // transformation of the logic operation to the source type.
1851 Type *DestTy = I.getType();
1852 Type *SrcTy = Cast0->getSrcTy();
1853 if (!SrcTy->isIntOrIntVectorTy())
1854 return nullptr;
1855
1856 if (Instruction *Ret = foldLogicCastConstant(I, Cast0, *this))
1857 return Ret;
1858
1859 CastInst *Cast1 = dyn_cast<CastInst>(Op1);
1860 if (!Cast1)
1861 return nullptr;
1862
1863 // Both operands of the logic operation are casts. The casts must be the
1864 // same kind for reduction.
1865 Instruction::CastOps CastOpcode = Cast0->getOpcode();
1866 if (CastOpcode != Cast1->getOpcode())
1867 return nullptr;
1868
1869 // Can't fold it profitably if no one of casts has one use.
1870 if (!Cast0->hasOneUse() && !Cast1->hasOneUse())
1871 return nullptr;
1872
1873 Value *X, *Y;
1874 if (match(Cast0, m_ZExtOrSExt(m_Value(X))) &&
1875 match(Cast1, m_ZExtOrSExt(m_Value(Y)))) {
1876 // Cast the narrower source to the wider source type.
1877 unsigned XNumBits = X->getType()->getScalarSizeInBits();
1878 unsigned YNumBits = Y->getType()->getScalarSizeInBits();
1879 if (XNumBits != YNumBits) {
1880 // Cast the narrower source to the wider source type only if both of casts
1881 // have one use to avoid creating an extra instruction.
1882 if (!Cast0->hasOneUse() || !Cast1->hasOneUse())
1883 return nullptr;
1884
1885 // If the source types do not match, but the casts are matching extends,
1886 // we can still narrow the logic op.
1887 if (XNumBits < YNumBits) {
1888 X = Builder.CreateCast(CastOpcode, X, Y->getType());
1889 } else if (YNumBits < XNumBits) {
1890 Y = Builder.CreateCast(CastOpcode, Y, X->getType());
1891 }
1892 }
1893
1894 // Do the logic op in the intermediate width, then widen more.
1895 Value *NarrowLogic = Builder.CreateBinOp(LogicOpc, X, Y, I.getName());
1896 auto *Disjoint = dyn_cast<PossiblyDisjointInst>(&I);
1897 auto *NewDisjoint = dyn_cast<PossiblyDisjointInst>(NarrowLogic);
1898 if (Disjoint && NewDisjoint)
1899 NewDisjoint->setIsDisjoint(Disjoint->isDisjoint());
1900 return CastInst::Create(CastOpcode, NarrowLogic, DestTy);
1901 }
1902
1903 // If the src type of casts are different, give up for other cast opcodes.
1904 if (SrcTy != Cast1->getSrcTy())
1905 return nullptr;
1906
1907 Value *Cast0Src = Cast0->getOperand(0);
1908 Value *Cast1Src = Cast1->getOperand(0);
1909
1910 // fold logic(cast(A), cast(B)) -> cast(logic(A, B))
1911 if (shouldOptimizeCast(Cast0) && shouldOptimizeCast(Cast1)) {
1912 Value *NewOp = Builder.CreateBinOp(LogicOpc, Cast0Src, Cast1Src,
1913 I.getName());
1914 return CastInst::Create(CastOpcode, NewOp, DestTy);
1915 }
1916
1917 return nullptr;
1918}
1919
1921 InstCombiner::BuilderTy &Builder) {
1922 assert(I.getOpcode() == Instruction::And);
1923 Value *Op0 = I.getOperand(0);
1924 Value *Op1 = I.getOperand(1);
1925 Value *A, *B;
1926
1927 // Operand complexity canonicalization guarantees that the 'or' is Op0.
1928 // (A | B) & ~(A & B) --> A ^ B
1929 // (A | B) & ~(B & A) --> A ^ B
1930 if (match(&I, m_BinOp(m_Or(m_Value(A), m_Value(B)),
1932 return BinaryOperator::CreateXor(A, B);
1933
1934 // (A | ~B) & (~A | B) --> ~(A ^ B)
1935 // (A | ~B) & (B | ~A) --> ~(A ^ B)
1936 // (~B | A) & (~A | B) --> ~(A ^ B)
1937 // (~B | A) & (B | ~A) --> ~(A ^ B)
1938 if (Op0->hasOneUse() || Op1->hasOneUse())
1941 return BinaryOperator::CreateNot(Builder.CreateXor(A, B));
1942
1943 return nullptr;
1944}
1945
1947 InstCombiner::BuilderTy &Builder) {
1948 assert(I.getOpcode() == Instruction::Or);
1949 Value *Op0 = I.getOperand(0);
1950 Value *Op1 = I.getOperand(1);
1951 Value *A, *B;
1952
1953 // Operand complexity canonicalization guarantees that the 'and' is Op0.
1954 // (A & B) | ~(A | B) --> ~(A ^ B)
1955 // (A & B) | ~(B | A) --> ~(A ^ B)
1956 if (Op0->hasOneUse() || Op1->hasOneUse())
1957 if (match(Op0, m_And(m_Value(A), m_Value(B))) &&
1959 return BinaryOperator::CreateNot(Builder.CreateXor(A, B));
1960
1961 // Operand complexity canonicalization guarantees that the 'xor' is Op0.
1962 // (A ^ B) | ~(A | B) --> ~(A & B)
1963 // (A ^ B) | ~(B | A) --> ~(A & B)
1964 if (Op0->hasOneUse() || Op1->hasOneUse())
1965 if (match(Op0, m_Xor(m_Value(A), m_Value(B))) &&
1967 return BinaryOperator::CreateNot(Builder.CreateAnd(A, B));
1968
1969 // (A & ~B) | (~A & B) --> A ^ B
1970 // (A & ~B) | (B & ~A) --> A ^ B
1971 // (~B & A) | (~A & B) --> A ^ B
1972 // (~B & A) | (B & ~A) --> A ^ B
1973 if (match(Op0, m_c_And(m_Value(A), m_Not(m_Value(B)))) &&
1975 return BinaryOperator::CreateXor(A, B);
1976
1977 return nullptr;
1978}
1979
1980/// Return true if a constant shift amount is always less than the specified
1981/// bit-width. If not, the shift could create poison in the narrower type.
1982static bool canNarrowShiftAmt(Constant *C, unsigned BitWidth) {
1983 APInt Threshold(C->getType()->getScalarSizeInBits(), BitWidth);
1984 return match(C, m_SpecificInt_ICMP(ICmpInst::ICMP_ULT, Threshold));
1985}
1986
1987/// Try to use narrower ops (sink zext ops) for an 'and' with binop operand and
1988/// a common zext operand: and (binop (zext X), C), (zext X).
1989Instruction *InstCombinerImpl::narrowMaskedBinOp(BinaryOperator &And) {
1990 // This transform could also apply to {or, and, xor}, but there are better
1991 // folds for those cases, so we don't expect those patterns here. AShr is not
1992 // handled because it should always be transformed to LShr in this sequence.
1993 // The subtract transform is different because it has a constant on the left.
1994 // Add/mul commute the constant to RHS; sub with constant RHS becomes add.
1995 Value *Op0 = And.getOperand(0), *Op1 = And.getOperand(1);
1996 Constant *C;
1997 if (!match(Op0, m_OneUse(m_Add(m_Specific(Op1), m_Constant(C)))) &&
1998 !match(Op0, m_OneUse(m_Mul(m_Specific(Op1), m_Constant(C)))) &&
1999 !match(Op0, m_OneUse(m_LShr(m_Specific(Op1), m_Constant(C)))) &&
2000 !match(Op0, m_OneUse(m_Shl(m_Specific(Op1), m_Constant(C)))) &&
2001 !match(Op0, m_OneUse(m_Sub(m_Constant(C), m_Specific(Op1)))))
2002 return nullptr;
2003
2004 Value *X;
2005 if (!match(Op1, m_ZExt(m_Value(X))) || Op1->hasNUsesOrMore(3))
2006 return nullptr;
2007
2008 Type *Ty = And.getType();
2009 if (!isa<VectorType>(Ty) && !shouldChangeType(Ty, X->getType()))
2010 return nullptr;
2011
2012 // If we're narrowing a shift, the shift amount must be safe (less than the
2013 // width) in the narrower type. If the shift amount is greater, instsimplify
2014 // usually handles that case, but we can't guarantee/assert it.
2016 if (Opc == Instruction::LShr || Opc == Instruction::Shl)
2017 if (!canNarrowShiftAmt(C, X->getType()->getScalarSizeInBits()))
2018 return nullptr;
2019
2020 // and (sub C, (zext X)), (zext X) --> zext (and (sub C', X), X)
2021 // and (binop (zext X), C), (zext X) --> zext (and (binop X, C'), X)
2022 Value *NewC = ConstantExpr::getTrunc(C, X->getType());
2023 Value *NewBO = Opc == Instruction::Sub ? Builder.CreateBinOp(Opc, NewC, X)
2024 : Builder.CreateBinOp(Opc, X, NewC);
2025 return new ZExtInst(Builder.CreateAnd(NewBO, X), Ty);
2026}
2027
2028/// Try folding relatively complex patterns for both And and Or operations
2029/// with all And and Or swapped.
2031 InstCombiner::BuilderTy &Builder) {
2032 const Instruction::BinaryOps Opcode = I.getOpcode();
2033 assert(Opcode == Instruction::And || Opcode == Instruction::Or);
2034
2035 // Flip the logic operation.
2036 const Instruction::BinaryOps FlippedOpcode =
2037 (Opcode == Instruction::And) ? Instruction::Or : Instruction::And;
2038
2039 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
2040 Value *A, *B, *C, *X, *Y, *Dummy;
2041
2042 // Match following expressions:
2043 // (~(A | B) & C)
2044 // (~(A & B) | C)
2045 // Captures X = ~(A | B) or ~(A & B)
2046 const auto matchNotOrAnd =
2047 [Opcode, FlippedOpcode](Value *Op, auto m_A, auto m_B, auto m_C,
2048 Value *&X, bool CountUses = false) -> bool {
2049 if (CountUses && !Op->hasOneUse())
2050 return false;
2051
2052 if (match(Op,
2053 m_c_BinOp(FlippedOpcode,
2054 m_Value(X, m_Not(m_c_BinOp(Opcode, m_A, m_B))), m_C)))
2055 return !CountUses || X->hasOneUse();
2056
2057 return false;
2058 };
2059
2060 // (~(A | B) & C) | ... --> ...
2061 // (~(A & B) | C) & ... --> ...
2062 // TODO: One use checks are conservative. We just need to check that a total
2063 // number of multiple used values does not exceed reduction
2064 // in operations.
2065 if (matchNotOrAnd(Op0, m_Value(A), m_Value(B), m_Value(C), X)) {
2066 // (~(A | B) & C) | (~(A | C) & B) --> (B ^ C) & ~A
2067 // (~(A & B) | C) & (~(A & C) | B) --> ~((B ^ C) & A)
2068 if (matchNotOrAnd(Op1, m_Specific(A), m_Specific(C), m_Specific(B), Dummy,
2069 true)) {
2070 Value *Xor = Builder.CreateXor(B, C);
2071 return (Opcode == Instruction::Or)
2072 ? BinaryOperator::CreateAnd(Xor, Builder.CreateNot(A))
2073 : BinaryOperator::CreateNot(Builder.CreateAnd(Xor, A));
2074 }
2075
2076 // (~(A | B) & C) | (~(B | C) & A) --> (A ^ C) & ~B
2077 // (~(A & B) | C) & (~(B & C) | A) --> ~((A ^ C) & B)
2078 if (matchNotOrAnd(Op1, m_Specific(B), m_Specific(C), m_Specific(A), Dummy,
2079 true)) {
2080 Value *Xor = Builder.CreateXor(A, C);
2081 return (Opcode == Instruction::Or)
2082 ? BinaryOperator::CreateAnd(Xor, Builder.CreateNot(B))
2083 : BinaryOperator::CreateNot(Builder.CreateAnd(Xor, B));
2084 }
2085
2086 // (~(A | B) & C) | ~(A | C) --> ~((B & C) | A)
2087 // (~(A & B) | C) & ~(A & C) --> ~((B | C) & A)
2088 if (match(Op1, m_OneUse(m_Not(m_OneUse(
2089 m_c_BinOp(Opcode, m_Specific(A), m_Specific(C)))))))
2090 return BinaryOperator::CreateNot(Builder.CreateBinOp(
2091 Opcode, Builder.CreateBinOp(FlippedOpcode, B, C), A));
2092
2093 // (~(A | B) & C) | ~(B | C) --> ~((A & C) | B)
2094 // (~(A & B) | C) & ~(B & C) --> ~((A | C) & B)
2095 if (match(Op1, m_OneUse(m_Not(m_OneUse(
2096 m_c_BinOp(Opcode, m_Specific(B), m_Specific(C)))))))
2097 return BinaryOperator::CreateNot(Builder.CreateBinOp(
2098 Opcode, Builder.CreateBinOp(FlippedOpcode, A, C), B));
2099
2100 // (~(A | B) & C) | ~(C | (A ^ B)) --> ~((A | B) & (C | (A ^ B)))
2101 // Note, the pattern with swapped and/or is not handled because the
2102 // result is more undefined than a source:
2103 // (~(A & B) | C) & ~(C & (A ^ B)) --> (A ^ B ^ C) | ~(A | C) is invalid.
2104 if (Opcode == Instruction::Or && Op0->hasOneUse() &&
2105 match(Op1,
2107 Y, m_c_BinOp(Opcode, m_Specific(C),
2108 m_c_Xor(m_Specific(A), m_Specific(B)))))))) {
2109 // X = ~(A | B)
2110 // Y = (C | (A ^ B)
2111 Value *Or = cast<BinaryOperator>(X)->getOperand(0);
2112 return BinaryOperator::CreateNot(Builder.CreateAnd(Or, Y));
2113 }
2114 }
2115
2116 // (~A & B & C) | ... --> ...
2117 // (~A | B | C) | ... --> ...
2118 // TODO: One use checks are conservative. We just need to check that a total
2119 // number of multiple used values does not exceed reduction
2120 // in operations.
2121 if (match(Op0,
2122 m_OneUse(m_c_BinOp(FlippedOpcode,
2123 m_BinOp(FlippedOpcode, m_Value(B), m_Value(C)),
2124 m_Value(X, m_Not(m_Value(A)))))) ||
2125 match(Op0, m_OneUse(m_c_BinOp(FlippedOpcode,
2126 m_c_BinOp(FlippedOpcode, m_Value(C),
2127 m_Value(X, m_Not(m_Value(A)))),
2128 m_Value(B))))) {
2129 // X = ~A
2130 // (~A & B & C) | ~(A | B | C) --> ~(A | (B ^ C))
2131 // (~A | B | C) & ~(A & B & C) --> (~A | (B ^ C))
2132 if (match(Op1, m_OneUse(m_Not(m_c_BinOp(
2133 Opcode, m_c_BinOp(Opcode, m_Specific(A), m_Specific(B)),
2134 m_Specific(C))))) ||
2136 Opcode, m_c_BinOp(Opcode, m_Specific(B), m_Specific(C)),
2137 m_Specific(A))))) ||
2139 Opcode, m_c_BinOp(Opcode, m_Specific(A), m_Specific(C)),
2140 m_Specific(B)))))) {
2141 Value *Xor = Builder.CreateXor(B, C);
2142 return (Opcode == Instruction::Or)
2143 ? BinaryOperator::CreateNot(Builder.CreateOr(Xor, A))
2144 : BinaryOperator::CreateOr(Xor, X);
2145 }
2146
2147 // (~A & B & C) | ~(A | B) --> (C | ~B) & ~A
2148 // (~A | B | C) & ~(A & B) --> (C & ~B) | ~A
2149 if (match(Op1, m_OneUse(m_Not(m_OneUse(
2150 m_c_BinOp(Opcode, m_Specific(A), m_Specific(B)))))))
2152 FlippedOpcode, Builder.CreateBinOp(Opcode, C, Builder.CreateNot(B)),
2153 X);
2154
2155 // (~A & B & C) | ~(A | C) --> (B | ~C) & ~A
2156 // (~A | B | C) & ~(A & C) --> (B & ~C) | ~A
2157 if (match(Op1, m_OneUse(m_Not(m_OneUse(
2158 m_c_BinOp(Opcode, m_Specific(A), m_Specific(C)))))))
2160 FlippedOpcode, Builder.CreateBinOp(Opcode, B, Builder.CreateNot(C)),
2161 X);
2162 }
2163
2164 return nullptr;
2165}
2166
2167/// Try to reassociate a pair of binops so that values with one use only are
2168/// part of the same instruction. This may enable folds that are limited with
2169/// multi-use restrictions and makes it more likely to match other patterns that
2170/// are looking for a common operand.
2172 InstCombinerImpl::BuilderTy &Builder) {
2173 Instruction::BinaryOps Opcode = BO.getOpcode();
2174 Value *X, *Y, *Z;
2175 if (match(&BO,
2176 m_c_BinOp(Opcode, m_OneUse(m_BinOp(Opcode, m_Value(X), m_Value(Y))),
2177 m_OneUse(m_Value(Z))))) {
2178 if (!isa<Constant>(X) && !isa<Constant>(Y) && !isa<Constant>(Z)) {
2179 // (X op Y) op Z --> (Y op Z) op X
2180 if (!X->hasOneUse()) {
2181 Value *YZ = Builder.CreateBinOp(Opcode, Y, Z);
2182 return BinaryOperator::Create(Opcode, YZ, X);
2183 }
2184 // (X op Y) op Z --> (X op Z) op Y
2185 if (!Y->hasOneUse()) {
2186 Value *XZ = Builder.CreateBinOp(Opcode, X, Z);
2187 return BinaryOperator::Create(Opcode, XZ, Y);
2188 }
2189 }
2190 }
2191
2192 return nullptr;
2193}
2194
2195// Match
2196// (X + C2) | C
2197// (X + C2) ^ C
2198// (X + C2) & C
2199// and convert to do the bitwise logic first:
2200// (X | C) + C2
2201// (X ^ C) + C2
2202// (X & C) + C2
2203// iff bits affected by logic op are lower than last bit affected by math op
2205 InstCombiner::BuilderTy &Builder) {
2206 Type *Ty = I.getType();
2207 Instruction::BinaryOps OpC = I.getOpcode();
2208 Value *Op0 = I.getOperand(0);
2209 Value *Op1 = I.getOperand(1);
2210 Value *X;
2211 const APInt *C, *C2;
2212
2213 if (!(match(Op0, m_OneUse(m_Add(m_Value(X), m_APInt(C2)))) &&
2214 match(Op1, m_APInt(C))))
2215 return nullptr;
2216
2217 unsigned Width = Ty->getScalarSizeInBits();
2218 unsigned LastOneMath = Width - C2->countr_zero();
2219
2220 switch (OpC) {
2221 case Instruction::And:
2222 if (C->countl_one() < LastOneMath)
2223 return nullptr;
2224 break;
2225 case Instruction::Xor:
2226 case Instruction::Or:
2227 if (C->countl_zero() < LastOneMath)
2228 return nullptr;
2229 break;
2230 default:
2231 llvm_unreachable("Unexpected BinaryOp!");
2232 }
2233
2234 Value *NewBinOp = Builder.CreateBinOp(OpC, X, ConstantInt::get(Ty, *C));
2235 return BinaryOperator::CreateWithCopiedFlags(Instruction::Add, NewBinOp,
2236 ConstantInt::get(Ty, *C2), Op0);
2237}
2238
2239// binop(shift(ShiftedC1, ShAmt), shift(ShiftedC2, add(ShAmt, AddC))) ->
2240// shift(binop(ShiftedC1, shift(ShiftedC2, AddC)), ShAmt)
2241// where both shifts are the same and AddC is a valid shift amount.
2242Instruction *InstCombinerImpl::foldBinOpOfDisplacedShifts(BinaryOperator &I) {
2243 assert((I.isBitwiseLogicOp() || I.getOpcode() == Instruction::Add) &&
2244 "Unexpected opcode");
2245
2246 Value *ShAmt;
2247 Constant *ShiftedC1, *ShiftedC2, *AddC;
2248 Type *Ty = I.getType();
2249 unsigned BitWidth = Ty->getScalarSizeInBits();
2250 if (!match(&I, m_c_BinOp(m_Shift(m_ImmConstant(ShiftedC1), m_Value(ShAmt)),
2251 m_Shift(m_ImmConstant(ShiftedC2),
2252 m_AddLike(m_Deferred(ShAmt),
2253 m_ImmConstant(AddC))))))
2254 return nullptr;
2255
2256 // Make sure the add constant is a valid shift amount.
2257 if (!match(AddC,
2259 return nullptr;
2260
2261 // Avoid constant expressions.
2262 auto *Op0Inst = dyn_cast<Instruction>(I.getOperand(0));
2263 auto *Op1Inst = dyn_cast<Instruction>(I.getOperand(1));
2264 if (!Op0Inst || !Op1Inst)
2265 return nullptr;
2266
2267 // Both shifts must be the same.
2268 Instruction::BinaryOps ShiftOp =
2269 static_cast<Instruction::BinaryOps>(Op0Inst->getOpcode());
2270 if (ShiftOp != Op1Inst->getOpcode())
2271 return nullptr;
2272
2273 // For adds, only left shifts are supported.
2274 if (I.getOpcode() == Instruction::Add && ShiftOp != Instruction::Shl)
2275 return nullptr;
2276
2277 Value *NewC = Builder.CreateBinOp(
2278 I.getOpcode(), ShiftedC1, Builder.CreateBinOp(ShiftOp, ShiftedC2, AddC));
2279 return BinaryOperator::Create(ShiftOp, NewC, ShAmt);
2280}
2281
2282// Fold and/or/xor with two equal intrinsic IDs:
2283// bitwise(fshl (A, B, ShAmt), fshl(C, D, ShAmt))
2284// -> fshl(bitwise(A, C), bitwise(B, D), ShAmt)
2285// bitwise(fshr (A, B, ShAmt), fshr(C, D, ShAmt))
2286// -> fshr(bitwise(A, C), bitwise(B, D), ShAmt)
2287// bitwise(bswap(A), bswap(B)) -> bswap(bitwise(A, B))
2288// bitwise(bswap(A), C) -> bswap(bitwise(A, bswap(C)))
2289// bitwise(bitreverse(A), bitreverse(B)) -> bitreverse(bitwise(A, B))
2290// bitwise(bitreverse(A), C) -> bitreverse(bitwise(A, bitreverse(C)))
2291static Instruction *
2293 InstCombiner::BuilderTy &Builder) {
2294 assert(I.isBitwiseLogicOp() && "Should and/or/xor");
2295 if (!I.getOperand(0)->hasOneUse())
2296 return nullptr;
2297 IntrinsicInst *X = dyn_cast<IntrinsicInst>(I.getOperand(0));
2298 if (!X)
2299 return nullptr;
2300
2301 IntrinsicInst *Y = dyn_cast<IntrinsicInst>(I.getOperand(1));
2302 if (Y && (!Y->hasOneUse() || X->getIntrinsicID() != Y->getIntrinsicID()))
2303 return nullptr;
2304
2305 Intrinsic::ID IID = X->getIntrinsicID();
2306 const APInt *RHSC;
2307 // Try to match constant RHS.
2308 if (!Y && (!(IID == Intrinsic::bswap || IID == Intrinsic::bitreverse) ||
2309 !match(I.getOperand(1), m_APInt(RHSC))))
2310 return nullptr;
2311
2312 switch (IID) {
2313 case Intrinsic::fshl:
2314 case Intrinsic::fshr: {
2315 if (X->getOperand(2) != Y->getOperand(2))
2316 return nullptr;
2317 Value *NewOp0 =
2318 Builder.CreateBinOp(I.getOpcode(), X->getOperand(0), Y->getOperand(0));
2319 Value *NewOp1 =
2320 Builder.CreateBinOp(I.getOpcode(), X->getOperand(1), Y->getOperand(1));
2321 Function *F =
2322 Intrinsic::getOrInsertDeclaration(I.getModule(), IID, I.getType());
2323 return CallInst::Create(F, {NewOp0, NewOp1, X->getOperand(2)});
2324 }
2325 case Intrinsic::bswap:
2326 case Intrinsic::bitreverse: {
2327 Value *NewOp0 = Builder.CreateBinOp(
2328 I.getOpcode(), X->getOperand(0),
2329 Y ? Y->getOperand(0)
2330 : ConstantInt::get(I.getType(), IID == Intrinsic::bswap
2331 ? RHSC->byteSwap()
2332 : RHSC->reverseBits()));
2333 Function *F =
2334 Intrinsic::getOrInsertDeclaration(I.getModule(), IID, I.getType());
2335 return CallInst::Create(F, {NewOp0});
2336 }
2337 default:
2338 return nullptr;
2339 }
2340}
2341
2342// Try to simplify V by replacing occurrences of Op with RepOp, but only look
2343// through bitwise operations. In particular, for X | Y we try to replace Y with
2344// 0 inside X and for X & Y we try to replace Y with -1 inside X.
2345// Return the simplified result of X if successful, and nullptr otherwise.
2346// If SimplifyOnly is true, no new instructions will be created.
2348 bool SimplifyOnly,
2349 InstCombinerImpl &IC,
2350 unsigned Depth = 0) {
2351 if (Op == RepOp)
2352 return nullptr;
2353
2354 if (V == Op)
2355 return RepOp;
2356
2357 auto *I = dyn_cast<BinaryOperator>(V);
2358 if (!I || !I->isBitwiseLogicOp() || Depth >= 3)
2359 return nullptr;
2360
2361 if (!I->hasOneUse())
2362 SimplifyOnly = true;
2363
2364 Value *NewOp0 = simplifyAndOrWithOpReplaced(I->getOperand(0), Op, RepOp,
2365 SimplifyOnly, IC, Depth + 1);
2366 Value *NewOp1 = simplifyAndOrWithOpReplaced(I->getOperand(1), Op, RepOp,
2367 SimplifyOnly, IC, Depth + 1);
2368 if (!NewOp0 && !NewOp1)
2369 return nullptr;
2370
2371 if (!NewOp0)
2372 NewOp0 = I->getOperand(0);
2373 if (!NewOp1)
2374 NewOp1 = I->getOperand(1);
2375
2376 if (Value *Res = simplifyBinOp(I->getOpcode(), NewOp0, NewOp1,
2378 return Res;
2379
2380 if (SimplifyOnly)
2381 return nullptr;
2382 return IC.Builder.CreateBinOp(I->getOpcode(), NewOp0, NewOp1);
2383}
2384
2385/// Reassociate and/or expressions to see if we can fold the inner and/or ops.
2386/// TODO: Make this recursive; it's a little tricky because an arbitrary
2387/// number of and/or instructions might have to be created.
2388Value *InstCombinerImpl::reassociateBooleanAndOr(Value *LHS, Value *X, Value *Y,
2389 Instruction &I, bool IsAnd,
2390 bool RHSIsLogical) {
2391 Instruction::BinaryOps Opcode = IsAnd ? Instruction::And : Instruction::Or;
2392 // LHS bop (X lop Y) --> (LHS bop X) lop Y
2393 // LHS bop (X bop Y) --> (LHS bop X) bop Y
2394 if (Value *Res = foldBooleanAndOr(LHS, X, I, IsAnd, /*IsLogical=*/false))
2395 return RHSIsLogical ? Builder.CreateLogicalOp(Opcode, Res, Y)
2396 : Builder.CreateBinOp(Opcode, Res, Y);
2397 // LHS bop (X bop Y) --> X bop (LHS bop Y)
2398 // LHS bop (X lop Y) --> X lop (LHS bop Y)
2399 if (Value *Res = foldBooleanAndOr(LHS, Y, I, IsAnd, /*IsLogical=*/false))
2400 return RHSIsLogical ? Builder.CreateLogicalOp(Opcode, X, Res)
2401 : Builder.CreateBinOp(Opcode, X, Res);
2402 return nullptr;
2403}
2404
2405// FIXME: We use commutative matchers (m_c_*) for some, but not all, matches
2406// here. We should standardize that construct where it is needed or choose some
2407// other way to ensure that commutated variants of patterns are not missed.
2409 Type *Ty = I.getType();
2410
2411 if (Value *V = simplifyAndInst(I.getOperand(0), I.getOperand(1),
2412 SQ.getWithInstruction(&I)))
2413 return replaceInstUsesWith(I, V);
2414
2416 return &I;
2417
2419 return X;
2420
2422 return Phi;
2423
2424 // See if we can simplify any instructions used by the instruction whose sole
2425 // purpose is to compute bits we don't care about.
2427 return &I;
2428
2429 // Do this before using distributive laws to catch simple and/or/not patterns.
2431 return Xor;
2432
2434 return X;
2435
2436 // (A|B)&(A|C) -> A|(B&C) etc
2438 return replaceInstUsesWith(I, V);
2439
2441 return R;
2442
2443 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
2444
2445 Value *X, *Y;
2446 const APInt *C;
2447 if ((match(Op0, m_OneUse(m_LogicalShift(m_One(), m_Value(X)))) ||
2448 (match(Op0, m_OneUse(m_Shl(m_APInt(C), m_Value(X)))) && (*C)[0])) &&
2449 match(Op1, m_One())) {
2450 // (1 >> X) & 1 --> zext(X == 0)
2451 // (C << X) & 1 --> zext(X == 0), when C is odd
2452 Value *IsZero = Builder.CreateICmpEQ(X, ConstantInt::get(Ty, 0));
2453 return new ZExtInst(IsZero, Ty);
2454 }
2455
2456 // (-(X & 1)) & Y --> (X & 1) == 0 ? 0 : Y
2457 Value *Neg;
2458 if (match(&I,
2460 m_Value(Y)))) {
2461 Value *Cmp = Builder.CreateIsNull(Neg);
2462 return createSelectInstWithUnknownProfile(Cmp,
2464 }
2465
2466 // Canonicalize:
2467 // (X +/- Y) & Y --> ~X & Y when Y is a power of 2.
2470 m_Sub(m_Value(X), m_Deferred(Y)))))) &&
2471 isKnownToBeAPowerOfTwo(Y, /*OrZero*/ true, &I))
2472 return BinaryOperator::CreateAnd(Builder.CreateNot(X), Y);
2473
2474 if (match(Op1, m_APInt(C))) {
2475 const APInt *XorC;
2476 if (match(Op0, m_OneUse(m_Xor(m_Value(X), m_APInt(XorC))))) {
2477 // (X ^ C1) & C2 --> (X & C2) ^ (C1&C2)
2478 Constant *NewC = ConstantInt::get(Ty, *C & *XorC);
2479 Value *And = Builder.CreateAnd(X, Op1);
2480 And->takeName(Op0);
2481 return BinaryOperator::CreateXor(And, NewC);
2482 }
2483
2484 const APInt *OrC;
2485 if (match(Op0, m_OneUse(m_Or(m_Value(X), m_APInt(OrC))))) {
2486 // (X | C1) & C2 --> (X & C2^(C1&C2)) | (C1&C2)
2487 // NOTE: This reduces the number of bits set in the & mask, which
2488 // can expose opportunities for store narrowing for scalars.
2489 // NOTE: SimplifyDemandedBits should have already removed bits from C1
2490 // that aren't set in C2. Meaning we can replace (C1&C2) with C1 in
2491 // above, but this feels safer.
2492 APInt Together = *C & *OrC;
2493 Value *And = Builder.CreateAnd(X, ConstantInt::get(Ty, Together ^ *C));
2494 And->takeName(Op0);
2495 return BinaryOperator::CreateOr(And, ConstantInt::get(Ty, Together));
2496 }
2497
2498 unsigned Width = Ty->getScalarSizeInBits();
2499 const APInt *ShiftC;
2500 if (match(Op0, m_OneUse(m_SExt(m_AShr(m_Value(X), m_APInt(ShiftC))))) &&
2501 ShiftC->ult(Width)) {
2502 if (*C == APInt::getLowBitsSet(Width, Width - ShiftC->getZExtValue())) {
2503 // We are clearing high bits that were potentially set by sext+ashr:
2504 // and (sext (ashr X, ShiftC)), C --> lshr (sext X), ShiftC
2505 Value *Sext = Builder.CreateSExt(X, Ty);
2506 Constant *ShAmtC = ConstantInt::get(Ty, ShiftC->zext(Width));
2507 return BinaryOperator::CreateLShr(Sext, ShAmtC);
2508 }
2509 }
2510
2511 // If this 'and' clears the sign-bits added by ashr, replace with lshr:
2512 // and (ashr X, ShiftC), C --> lshr X, ShiftC
2513 if (match(Op0, m_AShr(m_Value(X), m_APInt(ShiftC))) && ShiftC->ult(Width) &&
2514 C->isMask(Width - ShiftC->getZExtValue()))
2515 return BinaryOperator::CreateLShr(X, ConstantInt::get(Ty, *ShiftC));
2516
2517 const APInt *AddC;
2518 if (match(Op0, m_Add(m_Value(X), m_APInt(AddC)))) {
2519 // If we are masking the result of the add down to exactly one bit and
2520 // the constant we are adding has no bits set below that bit, then the
2521 // add is flipping a single bit. Example:
2522 // (X + 4) & 4 --> (X & 4) ^ 4
2523 if (Op0->hasOneUse() && C->isPowerOf2() && (*AddC & (*C - 1)) == 0) {
2524 assert((*C & *AddC) != 0 && "Expected common bit");
2525 Value *NewAnd = Builder.CreateAnd(X, Op1);
2526 return BinaryOperator::CreateXor(NewAnd, Op1);
2527 }
2528 }
2529
2530 // ((C1 OP zext(X)) & C2) -> zext((C1 OP X) & C2) if C2 fits in the
2531 // bitwidth of X and OP behaves well when given trunc(C1) and X.
2532 auto isNarrowableBinOpcode = [](BinaryOperator *B) {
2533 switch (B->getOpcode()) {
2534 case Instruction::Xor:
2535 case Instruction::Or:
2536 case Instruction::Mul:
2537 case Instruction::Add:
2538 case Instruction::Sub:
2539 return true;
2540 default:
2541 return false;
2542 }
2543 };
2544 BinaryOperator *BO;
2545 if (match(Op0, m_OneUse(m_BinOp(BO))) && isNarrowableBinOpcode(BO)) {
2546 Instruction::BinaryOps BOpcode = BO->getOpcode();
2547 Value *X;
2548 const APInt *C1;
2549 // TODO: The one-use restrictions could be relaxed a little if the AND
2550 // is going to be removed.
2551 // Try to narrow the 'and' and a binop with constant operand:
2552 // and (bo (zext X), C1), C --> zext (and (bo X, TruncC1), TruncC)
2553 if (match(BO, m_c_BinOp(m_OneUse(m_ZExt(m_Value(X))), m_APInt(C1))) &&
2554 C->isIntN(X->getType()->getScalarSizeInBits())) {
2555 unsigned XWidth = X->getType()->getScalarSizeInBits();
2556 Constant *TruncC1 = ConstantInt::get(X->getType(), C1->trunc(XWidth));
2557 Value *BinOp = isa<ZExtInst>(BO->getOperand(0))
2558 ? Builder.CreateBinOp(BOpcode, X, TruncC1)
2559 : Builder.CreateBinOp(BOpcode, TruncC1, X);
2560 Constant *TruncC = ConstantInt::get(X->getType(), C->trunc(XWidth));
2561 Value *And = Builder.CreateAnd(BinOp, TruncC);
2562 return new ZExtInst(And, Ty);
2563 }
2564
2565 // Similar to above: if the mask matches the zext input width, then the
2566 // 'and' can be eliminated, so we can truncate the other variable op:
2567 // and (bo (zext X), Y), C --> zext (bo X, (trunc Y))
2568 if (isa<Instruction>(BO->getOperand(0)) &&
2569 match(BO->getOperand(0), m_OneUse(m_ZExt(m_Value(X)))) &&
2570 C->isMask(X->getType()->getScalarSizeInBits())) {
2571 Y = BO->getOperand(1);
2572 Value *TrY = Builder.CreateTrunc(Y, X->getType(), Y->getName() + ".tr");
2573 Value *NewBO =
2574 Builder.CreateBinOp(BOpcode, X, TrY, BO->getName() + ".narrow");
2575 return new ZExtInst(NewBO, Ty);
2576 }
2577 // and (bo Y, (zext X)), C --> zext (bo (trunc Y), X)
2578 if (isa<Instruction>(BO->getOperand(1)) &&
2579 match(BO->getOperand(1), m_OneUse(m_ZExt(m_Value(X)))) &&
2580 C->isMask(X->getType()->getScalarSizeInBits())) {
2581 Y = BO->getOperand(0);
2582 Value *TrY = Builder.CreateTrunc(Y, X->getType(), Y->getName() + ".tr");
2583 Value *NewBO =
2584 Builder.CreateBinOp(BOpcode, TrY, X, BO->getName() + ".narrow");
2585 return new ZExtInst(NewBO, Ty);
2586 }
2587 }
2588
2589 // This is intentionally placed after the narrowing transforms for
2590 // efficiency (transform directly to the narrow logic op if possible).
2591 // If the mask is only needed on one incoming arm, push the 'and' op up.
2592 if (match(Op0, m_OneUse(m_Xor(m_Value(X), m_Value(Y)))) ||
2593 match(Op0, m_OneUse(m_Or(m_Value(X), m_Value(Y))))) {
2594 APInt NotAndMask(~(*C));
2595 BinaryOperator::BinaryOps BinOp = cast<BinaryOperator>(Op0)->getOpcode();
2596 if (MaskedValueIsZero(X, NotAndMask, &I)) {
2597 // Not masking anything out for the LHS, move mask to RHS.
2598 // and ({x}or X, Y), C --> {x}or X, (and Y, C)
2599 Value *NewRHS = Builder.CreateAnd(Y, Op1, Y->getName() + ".masked");
2600 return BinaryOperator::Create(BinOp, X, NewRHS);
2601 }
2602 if (!isa<Constant>(Y) && MaskedValueIsZero(Y, NotAndMask, &I)) {
2603 // Not masking anything out for the RHS, move mask to LHS.
2604 // and ({x}or X, Y), C --> {x}or (and X, C), Y
2605 Value *NewLHS = Builder.CreateAnd(X, Op1, X->getName() + ".masked");
2606 return BinaryOperator::Create(BinOp, NewLHS, Y);
2607 }
2608 }
2609
2610 // When the mask is a power-of-2 constant and op0 is a shifted-power-of-2
2611 // constant, test if the shift amount equals the offset bit index:
2612 // (ShiftC << X) & C --> X == (log2(C) - log2(ShiftC)) ? C : 0
2613 // (ShiftC >> X) & C --> X == (log2(ShiftC) - log2(C)) ? C : 0
2614 if (C->isPowerOf2() &&
2615 match(Op0, m_OneUse(m_LogicalShift(m_Power2(ShiftC), m_Value(X))))) {
2616 int Log2ShiftC = ShiftC->exactLogBase2();
2617 int Log2C = C->exactLogBase2();
2618 bool IsShiftLeft =
2619 cast<BinaryOperator>(Op0)->getOpcode() == Instruction::Shl;
2620 int BitNum = IsShiftLeft ? Log2C - Log2ShiftC : Log2ShiftC - Log2C;
2621 assert(BitNum >= 0 && "Expected demanded bits to handle impossible mask");
2622 Value *Cmp = Builder.CreateICmpEQ(X, ConstantInt::get(Ty, BitNum));
2623 return createSelectInstWithUnknownProfile(Cmp, ConstantInt::get(Ty, *C),
2625 }
2626
2627 Constant *C1, *C2;
2628 const APInt *C3 = C;
2629 Value *X;
2630 if (C3->isPowerOf2()) {
2631 Constant *Log2C3 = ConstantInt::get(Ty, C3->countr_zero());
2633 m_ImmConstant(C2)))) &&
2634 match(C1, m_Power2())) {
2636 Constant *LshrC = ConstantExpr::getAdd(C2, Log2C3);
2637 KnownBits KnownLShrc = computeKnownBits(LshrC, nullptr);
2638 if (KnownLShrc.getMaxValue().ult(Width)) {
2639 // iff C1,C3 is pow2 and C2 + cttz(C3) < BitWidth:
2640 // ((C1 << X) >> C2) & C3 -> X == (cttz(C3)+C2-cttz(C1)) ? C3 : 0
2641 Constant *CmpC = ConstantExpr::getSub(LshrC, Log2C1);
2642 Value *Cmp = Builder.CreateICmpEQ(X, CmpC);
2643 return createSelectInstWithUnknownProfile(
2644 Cmp, ConstantInt::get(Ty, *C3), ConstantInt::getNullValue(Ty));
2645 }
2646 }
2647
2649 m_ImmConstant(C2)))) &&
2650 match(C1, m_Power2())) {
2652 Constant *Cmp =
2654 if (Cmp && Cmp->isNullValue()) {
2655 // iff C1,C3 is pow2 and Log2(C3) >= C2:
2656 // ((C1 >> X) << C2) & C3 -> X == (cttz(C1)+C2-cttz(C3)) ? C3 : 0
2657 Constant *ShlC = ConstantExpr::getAdd(C2, Log2C1);
2658 Constant *CmpC = ConstantExpr::getSub(ShlC, Log2C3);
2659 Value *Cmp = Builder.CreateICmpEQ(X, CmpC);
2660 return createSelectInstWithUnknownProfile(
2661 Cmp, ConstantInt::get(Ty, *C3), ConstantInt::getNullValue(Ty));
2662 }
2663 }
2664 }
2665 }
2666
2667 // If we are clearing the sign bit of a floating-point value, convert this to
2668 // fabs, then cast back to integer.
2669 //
2670 // This is a generous interpretation for noimplicitfloat, this is not a true
2671 // floating-point operation.
2672 //
2673 // Assumes any IEEE-represented type has the sign bit in the high bit.
2674 // TODO: Unify with APInt matcher. This version allows undef unlike m_APInt
2675 Value *CastOp;
2676 if (match(Op0, m_ElementWiseBitCast(m_Value(CastOp))) &&
2677 match(Op1, m_MaxSignedValue()) &&
2678 !Builder.GetInsertBlock()->getParent()->hasFnAttribute(
2679 Attribute::NoImplicitFloat)) {
2680 Type *EltTy = CastOp->getType()->getScalarType();
2681 if (EltTy->isFloatingPointTy() &&
2683 Value *FAbs = Builder.CreateUnaryIntrinsic(Intrinsic::fabs, CastOp);
2684 return new BitCastInst(FAbs, I.getType());
2685 }
2686 }
2687
2688 // and(shl(zext(X), Y), SignMask) -> and(sext(X), SignMask)
2689 // where Y is a valid shift amount.
2691 m_SignMask())) &&
2694 APInt(Ty->getScalarSizeInBits(),
2695 Ty->getScalarSizeInBits() -
2696 X->getType()->getScalarSizeInBits())))) {
2697 auto *SExt = Builder.CreateSExt(X, Ty, X->getName() + ".signext");
2698 return BinaryOperator::CreateAnd(SExt, Op1);
2699 }
2700
2701 if (Instruction *Z = narrowMaskedBinOp(I))
2702 return Z;
2703
2704 if (I.getType()->isIntOrIntVectorTy(1)) {
2705 if (auto *SI0 = dyn_cast<SelectInst>(Op0)) {
2706 if (auto *R =
2707 foldAndOrOfSelectUsingImpliedCond(Op1, *SI0, /* IsAnd */ true))
2708 return R;
2709 }
2710 if (auto *SI1 = dyn_cast<SelectInst>(Op1)) {
2711 if (auto *R =
2712 foldAndOrOfSelectUsingImpliedCond(Op0, *SI1, /* IsAnd */ true))
2713 return R;
2714 }
2715 }
2716
2717 if (Instruction *FoldedLogic = foldBinOpIntoSelectOrPhi(I))
2718 return FoldedLogic;
2719
2720 if (Instruction *DeMorgan = matchDeMorgansLaws(I, *this))
2721 return DeMorgan;
2722
2723 {
2724 Value *A, *B, *C;
2725 // A & ~(A ^ B) --> A & B
2726 if (match(Op1, m_Not(m_c_Xor(m_Specific(Op0), m_Value(B)))))
2727 return BinaryOperator::CreateAnd(Op0, B);
2728 // ~(A ^ B) & A --> A & B
2729 if (match(Op0, m_Not(m_c_Xor(m_Specific(Op1), m_Value(B)))))
2730 return BinaryOperator::CreateAnd(Op1, B);
2731
2732 // (A ^ B) & ((B ^ C) ^ A) -> (A ^ B) & ~C
2733 if (match(Op0, m_Xor(m_Value(A), m_Value(B))) &&
2734 match(Op1, m_Xor(m_Xor(m_Specific(B), m_Value(C)), m_Specific(A)))) {
2735 Value *NotC = Op1->hasOneUse()
2736 ? Builder.CreateNot(C)
2737 : getFreelyInverted(C, C->hasOneUse(), &Builder);
2738 if (NotC != nullptr)
2739 return BinaryOperator::CreateAnd(Op0, NotC);
2740 }
2741
2742 // ((A ^ C) ^ B) & (B ^ A) -> (B ^ A) & ~C
2743 if (match(Op0, m_Xor(m_Xor(m_Value(A), m_Value(C)), m_Value(B))) &&
2744 match(Op1, m_Xor(m_Specific(B), m_Specific(A)))) {
2745 Value *NotC = Op0->hasOneUse()
2746 ? Builder.CreateNot(C)
2747 : getFreelyInverted(C, C->hasOneUse(), &Builder);
2748 if (NotC != nullptr)
2749 return BinaryOperator::CreateAnd(Op1, Builder.CreateNot(C));
2750 }
2751
2752 // (A | B) & (~A ^ B) -> A & B
2753 // (A | B) & (B ^ ~A) -> A & B
2754 // (B | A) & (~A ^ B) -> A & B
2755 // (B | A) & (B ^ ~A) -> A & B
2756 if (match(Op1, m_c_Xor(m_Not(m_Value(A)), m_Value(B))) &&
2757 match(Op0, m_c_Or(m_Specific(A), m_Specific(B))))
2758 return BinaryOperator::CreateAnd(A, B);
2759
2760 // (~A ^ B) & (A | B) -> A & B
2761 // (~A ^ B) & (B | A) -> A & B
2762 // (B ^ ~A) & (A | B) -> A & B
2763 // (B ^ ~A) & (B | A) -> A & B
2764 if (match(Op0, m_c_Xor(m_Not(m_Value(A)), m_Value(B))) &&
2765 match(Op1, m_c_Or(m_Specific(A), m_Specific(B))))
2766 return BinaryOperator::CreateAnd(A, B);
2767
2768 // (~A | B) & (A ^ B) -> ~A & B
2769 // (~A | B) & (B ^ A) -> ~A & B
2770 // (B | ~A) & (A ^ B) -> ~A & B
2771 // (B | ~A) & (B ^ A) -> ~A & B
2772 if (match(Op0, m_c_Or(m_Not(m_Value(A)), m_Value(B))) &&
2774 return BinaryOperator::CreateAnd(Builder.CreateNot(A), B);
2775
2776 // (A ^ B) & (~A | B) -> ~A & B
2777 // (B ^ A) & (~A | B) -> ~A & B
2778 // (A ^ B) & (B | ~A) -> ~A & B
2779 // (B ^ A) & (B | ~A) -> ~A & B
2780 if (match(Op1, m_c_Or(m_Not(m_Value(A)), m_Value(B))) &&
2782 return BinaryOperator::CreateAnd(Builder.CreateNot(A), B);
2783 }
2784
2785 if (Value *Res =
2786 foldBooleanAndOr(Op0, Op1, I, /*IsAnd=*/true, /*IsLogical=*/false))
2787 return replaceInstUsesWith(I, Res);
2788
2789 if (match(Op1, m_OneUse(m_LogicalAnd(m_Value(X), m_Value(Y))))) {
2790 bool IsLogical = isa<SelectInst>(Op1);
2791 if (auto *V = reassociateBooleanAndOr(Op0, X, Y, I, /*IsAnd=*/true,
2792 /*RHSIsLogical=*/IsLogical))
2793 return replaceInstUsesWith(I, V);
2794 }
2795 if (match(Op0, m_OneUse(m_LogicalAnd(m_Value(X), m_Value(Y))))) {
2796 bool IsLogical = isa<SelectInst>(Op0);
2797 if (auto *V = reassociateBooleanAndOr(Op1, X, Y, I, /*IsAnd=*/true,
2798 /*RHSIsLogical=*/IsLogical))
2799 return replaceInstUsesWith(I, V);
2800 }
2801
2802 if (Instruction *FoldedFCmps = reassociateFCmps(I, Builder))
2803 return FoldedFCmps;
2804
2805 if (Instruction *CastedAnd = foldCastedBitwiseLogic(I))
2806 return CastedAnd;
2807
2808 if (Instruction *Sel = foldBinopOfSextBoolToSelect(I))
2809 return Sel;
2810
2811 // and(sext(A), B) / and(B, sext(A)) --> A ? B : 0, where A is i1 or <N x i1>.
2812 // TODO: Move this into foldBinopOfSextBoolToSelect as a more generalized fold
2813 // with binop identity constant. But creating a select with non-constant
2814 // arm may not be reversible due to poison semantics. Is that a good
2815 // canonicalization?
2816 Value *A, *B;
2817 if (match(&I, m_c_And(m_SExt(m_Value(A)), m_Value(B))) &&
2818 A->getType()->isIntOrIntVectorTy(1))
2819 return createSelectInstWithUnknownProfile(A, B, Constant::getNullValue(Ty));
2820
2821 // Similarly, a 'not' of the bool translates to a swap of the select arms:
2822 // ~sext(A) & B / B & ~sext(A) --> A ? 0 : B
2823 if (match(&I, m_c_And(m_Not(m_SExt(m_Value(A))), m_Value(B))) &&
2824 A->getType()->isIntOrIntVectorTy(1))
2825 return createSelectInstWithUnknownProfile(A, Constant::getNullValue(Ty), B);
2826
2827 // and(zext(A), B) -> A ? (B & 1) : 0
2828 if (match(&I, m_c_And(m_OneUse(m_ZExt(m_Value(A))), m_Value(B))) &&
2829 A->getType()->isIntOrIntVectorTy(1))
2830 return createSelectInstWithUnknownProfile(
2831 A, Builder.CreateAnd(B, ConstantInt::get(Ty, 1)),
2833
2834 // (-1 + A) & B --> A ? 0 : B where A is 0/1.
2836 m_Value(B)))) {
2837 if (A->getType()->isIntOrIntVectorTy(1))
2838 return createSelectInstWithUnknownProfile(A, Constant::getNullValue(Ty),
2839 B);
2840 if (computeKnownBits(A, &I).countMaxActiveBits() <= 1) {
2841 return createSelectInstWithUnknownProfile(
2842 Builder.CreateICmpEQ(A, Constant::getNullValue(A->getType())), B,
2844 }
2845 }
2846
2847 // (iN X s>> (N-1)) & Y --> (X s< 0) ? Y : 0 -- with optional sext
2850 m_Value(Y))) &&
2851 *C == X->getType()->getScalarSizeInBits() - 1) {
2852 Value *IsNeg = Builder.CreateIsNeg(X, "isneg");
2853 return createSelectInstWithUnknownProfile(IsNeg, Y,
2855 }
2856 // If there's a 'not' of the shifted value, swap the select operands:
2857 // ~(iN X s>> (N-1)) & Y --> (X s< 0) ? 0 : Y -- with optional sext
2860 m_Value(Y))) &&
2861 *C == X->getType()->getScalarSizeInBits() - 1) {
2862 Value *IsNeg = Builder.CreateIsNeg(X, "isneg");
2863 return createSelectInstWithUnknownProfile(IsNeg,
2865 }
2866
2867 // (~x) & y --> ~(x | (~y)) iff that gets rid of inversions
2869 return &I;
2870
2871 // An and recurrence w/loop invariant step is equivelent to (and start, step)
2872 PHINode *PN = nullptr;
2873 Value *Start = nullptr, *Step = nullptr;
2874 if (matchSimpleRecurrence(&I, PN, Start, Step) && DT.dominates(Step, PN))
2875 return replaceInstUsesWith(I, Builder.CreateAnd(Start, Step));
2876
2878 return R;
2879
2880 if (Instruction *Canonicalized = canonicalizeLogicFirst(I, Builder))
2881 return Canonicalized;
2882
2883 if (Instruction *Folded = foldLogicOfIsFPClass(I, Op0, Op1))
2884 return Folded;
2885
2886 if (Instruction *Res = foldBinOpOfDisplacedShifts(I))
2887 return Res;
2888
2890 return Res;
2891
2892 if (Value *V =
2894 /*SimplifyOnly*/ false, *this))
2895 return BinaryOperator::CreateAnd(V, Op1);
2896 if (Value *V =
2898 /*SimplifyOnly*/ false, *this))
2899 return BinaryOperator::CreateAnd(Op0, V);
2900
2901 return nullptr;
2902}
2903
2905 bool MatchBSwaps,
2906 bool MatchBitReversals) {
2908 if (!recognizeBSwapOrBitReverseIdiom(&I, MatchBSwaps, MatchBitReversals,
2909 Insts))
2910 return nullptr;
2911 Instruction *LastInst = Insts.pop_back_val();
2912 LastInst->removeFromParent();
2913
2914 for (auto *Inst : Insts) {
2915 Inst->setDebugLoc(I.getDebugLoc());
2916 Worklist.push(Inst);
2917 }
2918 return LastInst;
2919}
2920
2921std::optional<std::pair<Intrinsic::ID, SmallVector<Value *, 3>>>
2923 // TODO: Can we reduce the code duplication between this and the related
2924 // rotate matching code under visitSelect and visitTrunc?
2925 assert(Or.getOpcode() == BinaryOperator::Or && "Expecting or instruction");
2926
2927 unsigned Width = Or.getType()->getScalarSizeInBits();
2928
2929 Instruction *Or0, *Or1;
2930 if (!match(Or.getOperand(0), m_Instruction(Or0)) ||
2931 !match(Or.getOperand(1), m_Instruction(Or1)))
2932 return std::nullopt;
2933
2934 bool IsFshl = true; // Sub on LSHR.
2935 SmallVector<Value *, 3> FShiftArgs;
2936
2937 // First, find an or'd pair of opposite shifts:
2938 // or (lshr ShVal0, ShAmt0), (shl ShVal1, ShAmt1)
2939 if (isa<BinaryOperator>(Or0) && isa<BinaryOperator>(Or1)) {
2940 Value *ShVal0, *ShVal1, *ShAmt0, *ShAmt1;
2941 if (!match(Or0,
2942 m_OneUse(m_LogicalShift(m_Value(ShVal0), m_Value(ShAmt0)))) ||
2943 !match(Or1,
2944 m_OneUse(m_LogicalShift(m_Value(ShVal1), m_Value(ShAmt1)))) ||
2945 Or0->getOpcode() == Or1->getOpcode())
2946 return std::nullopt;
2947
2948 // Canonicalize to or(shl(ShVal0, ShAmt0), lshr(ShVal1, ShAmt1)).
2949 if (Or0->getOpcode() == BinaryOperator::LShr) {
2950 std::swap(Or0, Or1);
2951 std::swap(ShVal0, ShVal1);
2952 std::swap(ShAmt0, ShAmt1);
2953 }
2954 assert(Or0->getOpcode() == BinaryOperator::Shl &&
2955 Or1->getOpcode() == BinaryOperator::LShr &&
2956 "Illegal or(shift,shift) pair");
2957
2958 // Match the shift amount operands for a funnel shift pattern. This always
2959 // matches a subtraction on the R operand.
2960 auto matchShiftAmount = [&](Value *L, Value *R, unsigned Width) -> Value * {
2961 // Check for constant shift amounts that sum to the bitwidth.
2962 const APInt *LI, *RI;
2963 if (match(L, m_APIntAllowPoison(LI)) && match(R, m_APIntAllowPoison(RI)))
2964 if (LI->ult(Width) && RI->ult(Width) && (*LI + *RI) == Width)
2965 return ConstantInt::get(L->getType(), *LI);
2966
2967 Constant *LC, *RC;
2968 if (match(L, m_Constant(LC)) && match(R, m_Constant(RC)) &&
2969 match(L,
2970 m_SpecificInt_ICMP(ICmpInst::ICMP_ULT, APInt(Width, Width))) &&
2971 match(R,
2972 m_SpecificInt_ICMP(ICmpInst::ICMP_ULT, APInt(Width, Width))) &&
2974 return ConstantExpr::mergeUndefsWith(LC, RC);
2975
2976 // (shl ShVal, X) | (lshr ShVal, (Width - x)) iff X < Width.
2977 // We limit this to X < Width in case the backend re-expands the
2978 // intrinsic, and has to reintroduce a shift modulo operation (InstCombine
2979 // might remove it after this fold). This still doesn't guarantee that the
2980 // final codegen will match this original pattern.
2981 if (match(R, m_OneUse(m_Sub(m_SpecificInt(Width), m_Specific(L))))) {
2982 KnownBits KnownL = computeKnownBits(L, &Or);
2983 return KnownL.getMaxValue().ult(Width) ? L : nullptr;
2984 }
2985
2986 // For non-constant cases, the following patterns currently only work for
2987 // rotation patterns.
2988 // TODO: Add general funnel-shift compatible patterns.
2989 if (ShVal0 != ShVal1)
2990 return nullptr;
2991
2992 // For non-constant cases we don't support non-pow2 shift masks.
2993 // TODO: Is it worth matching urem as well?
2994 if (!isPowerOf2_32(Width))
2995 return nullptr;
2996
2997 // The shift amount may be masked with negation:
2998 // (shl ShVal, (X & (Width - 1))) | (lshr ShVal, ((-X) & (Width - 1)))
2999 Value *X;
3000 unsigned Mask = Width - 1;
3001 if (match(L, m_And(m_Value(X), m_SpecificInt(Mask))) &&
3002 match(R, m_And(m_Neg(m_Specific(X)), m_SpecificInt(Mask))))
3003 return X;
3004
3005 // (shl ShVal, X) | (lshr ShVal, ((-X) & (Width - 1)))
3006 if (match(R, m_And(m_Neg(m_Specific(L)), m_SpecificInt(Mask))))
3007 return L;
3008
3009 // Similar to above, but the shift amount may be extended after masking,
3010 // so return the extended value as the parameter for the intrinsic.
3011 if (match(L, m_ZExt(m_And(m_Value(X), m_SpecificInt(Mask)))) &&
3012 match(R,
3014 m_SpecificInt(Mask))))
3015 return L;
3016
3017 if (match(L, m_ZExt(m_And(m_Value(X), m_SpecificInt(Mask)))) &&
3019 return L;
3020
3021 return nullptr;
3022 };
3023
3024 Value *ShAmt = matchShiftAmount(ShAmt0, ShAmt1, Width);
3025 if (!ShAmt) {
3026 ShAmt = matchShiftAmount(ShAmt1, ShAmt0, Width);
3027 IsFshl = false; // Sub on SHL.
3028 }
3029 if (!ShAmt)
3030 return std::nullopt;
3031
3032 FShiftArgs = {ShVal0, ShVal1, ShAmt};
3033 } else if (isa<ZExtInst>(Or0) || isa<ZExtInst>(Or1)) {
3034 // If there are two 'or' instructions concat variables in opposite order:
3035 //
3036 // Slot1 and Slot2 are all zero bits.
3037 // | Slot1 | Low | Slot2 | High |
3038 // LowHigh = or (shl (zext Low), ZextLowShlAmt), (zext High)
3039 // | Slot2 | High | Slot1 | Low |
3040 // HighLow = or (shl (zext High), ZextHighShlAmt), (zext Low)
3041 //
3042 // the latter 'or' can be safely convert to
3043 // -> HighLow = fshl LowHigh, LowHigh, ZextHighShlAmt
3044 // if ZextLowShlAmt + ZextHighShlAmt == Width.
3045 if (!isa<ZExtInst>(Or1))
3046 std::swap(Or0, Or1);
3047
3048 Value *High, *ZextHigh, *Low;
3049 const APInt *ZextHighShlAmt;
3050 if (!match(Or0,
3051 m_OneUse(m_Shl(m_Value(ZextHigh), m_APInt(ZextHighShlAmt)))))
3052 return std::nullopt;
3053
3054 if (!match(Or1, m_ZExt(m_Value(Low))) ||
3055 !match(ZextHigh, m_ZExt(m_Value(High))))
3056 return std::nullopt;
3057
3058 unsigned HighSize = High->getType()->getScalarSizeInBits();
3059 unsigned LowSize = Low->getType()->getScalarSizeInBits();
3060 // Make sure High does not overlap with Low and most significant bits of
3061 // High aren't shifted out.
3062 if (ZextHighShlAmt->ult(LowSize) || ZextHighShlAmt->ugt(Width - HighSize))
3063 return std::nullopt;
3064
3065 for (User *U : ZextHigh->users()) {
3066 Value *X, *Y;
3067 if (!match(U, m_Or(m_Value(X), m_Value(Y))))
3068 continue;
3069
3070 if (!isa<ZExtInst>(Y))
3071 std::swap(X, Y);
3072
3073 const APInt *ZextLowShlAmt;
3074 if (!match(X, m_Shl(m_Specific(Or1), m_APInt(ZextLowShlAmt))) ||
3075 !match(Y, m_Specific(ZextHigh)) || !DT.dominates(U, &Or))
3076 continue;
3077
3078 // HighLow is good concat. If sum of two shifts amount equals to Width,
3079 // LowHigh must also be a good concat.
3080 if (*ZextLowShlAmt + *ZextHighShlAmt != Width)
3081 continue;
3082
3083 // Low must not overlap with High and most significant bits of Low must
3084 // not be shifted out.
3085 assert(ZextLowShlAmt->uge(HighSize) &&
3086 ZextLowShlAmt->ule(Width - LowSize) && "Invalid concat");
3087
3088 // We cannot reuse the result if it may produce poison.
3089 // Drop poison generating flags in the expression tree.
3090 // Or
3091 cast<Instruction>(U)->dropPoisonGeneratingFlags();
3092 // Shl
3093 cast<Instruction>(X)->dropPoisonGeneratingFlags();
3094
3095 FShiftArgs = {U, U, ConstantInt::get(Or0->getType(), *ZextHighShlAmt)};
3096 break;
3097 }
3098 }
3099
3100 if (FShiftArgs.empty())
3101 return std::nullopt;
3102
3103 Intrinsic::ID IID = IsFshl ? Intrinsic::fshl : Intrinsic::fshr;
3104 return std::make_pair(IID, FShiftArgs);
3105}
3106
3107/// Match UB-safe variants of the funnel shift intrinsic.
3109 if (auto Opt = IC.convertOrOfShiftsToFunnelShift(Or)) {
3110 auto [IID, FShiftArgs] = *Opt;
3111 Function *F =
3112 Intrinsic::getOrInsertDeclaration(Or.getModule(), IID, Or.getType());
3113 return CallInst::Create(F, FShiftArgs);
3114 }
3115
3116 return nullptr;
3117}
3118
3119/// Attempt to combine or(zext(x),shl(zext(y),bw/2) concat packing patterns.
3121 assert(Or.getOpcode() == Instruction::Or && "bswap requires an 'or'");
3122 Value *Op0 = Or.getOperand(0), *Op1 = Or.getOperand(1);
3123 Type *Ty = Or.getType();
3124
3125 unsigned Width = Ty->getScalarSizeInBits();
3126 if ((Width & 1) != 0)
3127 return nullptr;
3128 unsigned HalfWidth = Width / 2;
3129
3130 // Canonicalize zext (lower half) to LHS.
3131 if (!isa<ZExtInst>(Op0))
3132 std::swap(Op0, Op1);
3133
3134 // Find lower/upper half.
3135 Value *LowerSrc, *ShlVal, *UpperSrc;
3136 const APInt *C;
3137 if (!match(Op0, m_OneUse(m_ZExt(m_Value(LowerSrc)))) ||
3138 !match(Op1, m_OneUse(m_Shl(m_Value(ShlVal), m_APInt(C)))) ||
3139 !match(ShlVal, m_OneUse(m_ZExt(m_Value(UpperSrc)))))
3140 return nullptr;
3141 if (*C != HalfWidth || LowerSrc->getType() != UpperSrc->getType() ||
3142 LowerSrc->getType()->getScalarSizeInBits() != HalfWidth)
3143 return nullptr;
3144
3145 auto ConcatIntrinsicCalls = [&](Intrinsic::ID id, Value *Lo, Value *Hi) {
3146 Value *NewLower = Builder.CreateZExt(Lo, Ty);
3147 Value *NewUpper = Builder.CreateZExt(Hi, Ty);
3148 NewUpper = Builder.CreateShl(NewUpper, HalfWidth);
3149 Value *BinOp = Builder.CreateOr(NewLower, NewUpper);
3150 return Builder.CreateIntrinsic(id, Ty, BinOp);
3151 };
3152
3153 // BSWAP: Push the concat down, swapping the lower/upper sources.
3154 // concat(bswap(x),bswap(y)) -> bswap(concat(x,y))
3155 Value *LowerBSwap, *UpperBSwap;
3156 if (match(LowerSrc, m_BSwap(m_Value(LowerBSwap))) &&
3157 match(UpperSrc, m_BSwap(m_Value(UpperBSwap))))
3158 return ConcatIntrinsicCalls(Intrinsic::bswap, UpperBSwap, LowerBSwap);
3159
3160 // BITREVERSE: Push the concat down, swapping the lower/upper sources.
3161 // concat(bitreverse(x),bitreverse(y)) -> bitreverse(concat(x,y))
3162 Value *LowerBRev, *UpperBRev;
3163 if (match(LowerSrc, m_BitReverse(m_Value(LowerBRev))) &&
3164 match(UpperSrc, m_BitReverse(m_Value(UpperBRev))))
3165 return ConcatIntrinsicCalls(Intrinsic::bitreverse, UpperBRev, LowerBRev);
3166
3167 // iX ext split: extending or(zext(x),shl(zext(y),bw/2) pattern
3168 // to consume sext/ashr:
3169 // or(zext(sext(x)),shl(zext(sext(ashr(x,xbw-1))),bw/2)
3170 // or(zext(x),shl(zext(ashr(x,xbw-1)),bw/2)
3171 Value *X;
3172 if (match(LowerSrc, m_SExtOrSelf(m_Value(X))) &&
3173 match(UpperSrc,
3175 m_Specific(X),
3176 m_SpecificInt(X->getType()->getScalarSizeInBits() - 1)))))
3177 return Builder.CreateSExt(X, Ty);
3178
3179 return nullptr;
3180}
3181
3182/// If all elements of two constant vectors are 0/-1 and inverses, return true.
3184 unsigned NumElts = cast<FixedVectorType>(C1->getType())->getNumElements();
3185 for (unsigned i = 0; i != NumElts; ++i) {
3186 Constant *EltC1 = C1->getAggregateElement(i);
3187 Constant *EltC2 = C2->getAggregateElement(i);
3188 if (!EltC1 || !EltC2)
3189 return false;
3190
3191 // One element must be all ones, and the other must be all zeros.
3192 if (!((match(EltC1, m_Zero()) && match(EltC2, m_AllOnes())) ||
3193 (match(EltC2, m_Zero()) && match(EltC1, m_AllOnes()))))
3194 return false;
3195 }
3196 return true;
3197}
3198
3199/// We have an expression of the form (A & C) | (B & D). If A is a scalar or
3200/// vector composed of all-zeros or all-ones values and is the bitwise 'not' of
3201/// B, it can be used as the condition operand of a select instruction.
3202/// We will detect (A & C) | ~(B | D) when the flag ABIsTheSame enabled.
3203Value *InstCombinerImpl::getSelectCondition(Value *A, Value *B,
3204 bool ABIsTheSame) {
3205 // We may have peeked through bitcasts in the caller.
3206 // Exit immediately if we don't have (vector) integer types.
3207 Type *Ty = A->getType();
3208 if (!Ty->isIntOrIntVectorTy() || !B->getType()->isIntOrIntVectorTy())
3209 return nullptr;
3210
3211 // If A is the 'not' operand of B and has enough signbits, we have our answer.
3212 if (ABIsTheSame ? (A == B) : match(B, m_Not(m_Specific(A)))) {
3213 // If these are scalars or vectors of i1, A can be used directly.
3214 if (Ty->isIntOrIntVectorTy(1))
3215 return A;
3216
3217 // If we look through a vector bitcast, the caller will bitcast the operands
3218 // to match the condition's number of bits (N x i1).
3219 // To make this poison-safe, disallow bitcast from wide element to narrow
3220 // element. That could allow poison in lanes where it was not present in the
3221 // original code.
3223 if (A->getType()->isIntOrIntVectorTy()) {
3224 unsigned NumSignBits = ComputeNumSignBits(A);
3225 if (NumSignBits == A->getType()->getScalarSizeInBits() &&
3226 NumSignBits <= Ty->getScalarSizeInBits())
3227 return Builder.CreateTrunc(A, CmpInst::makeCmpResultType(A->getType()));
3228 }
3229 return nullptr;
3230 }
3231
3232 // TODO: add support for sext and constant case
3233 if (ABIsTheSame)
3234 return nullptr;
3235
3236 // If both operands are constants, see if the constants are inverse bitmasks.
3237 Constant *AConst, *BConst;
3238 if (match(A, m_Constant(AConst)) && match(B, m_Constant(BConst)))
3239 if (AConst == ConstantExpr::getNot(BConst) &&
3241 return Builder.CreateZExtOrTrunc(A, CmpInst::makeCmpResultType(Ty));
3242
3243 // Look for more complex patterns. The 'not' op may be hidden behind various
3244 // casts. Look through sexts and bitcasts to find the booleans.
3245 Value *Cond;
3246 Value *NotB;
3247 if (match(A, m_SExt(m_Value(Cond))) &&
3248 Cond->getType()->isIntOrIntVectorTy(1)) {
3249 // A = sext i1 Cond; B = sext (not (i1 Cond))
3250 if (match(B, m_SExt(m_Not(m_Specific(Cond)))))
3251 return Cond;
3252
3253 // A = sext i1 Cond; B = not ({bitcast} (sext (i1 Cond)))
3254 // TODO: The one-use checks are unnecessary or misplaced. If the caller
3255 // checked for uses on logic ops/casts, that should be enough to
3256 // make this transform worthwhile.
3257 if (match(B, m_OneUse(m_Not(m_Value(NotB))))) {
3258 NotB = peekThroughBitcast(NotB, true);
3259 if (match(NotB, m_SExt(m_Specific(Cond))))
3260 return Cond;
3261 }
3262 }
3263
3264 // All scalar (and most vector) possibilities should be handled now.
3265 // Try more matches that only apply to non-splat constant vectors.
3266 if (!Ty->isVectorTy())
3267 return nullptr;
3268
3269 // If both operands are xor'd with constants using the same sexted boolean
3270 // operand, see if the constants are inverse bitmasks.
3271 // TODO: Use ConstantExpr::getNot()?
3272 if (match(A, (m_Xor(m_SExt(m_Value(Cond)), m_Constant(AConst)))) &&
3273 match(B, (m_Xor(m_SExt(m_Specific(Cond)), m_Constant(BConst)))) &&
3274 Cond->getType()->isIntOrIntVectorTy(1) &&
3275 areInverseVectorBitmasks(AConst, BConst)) {
3277 return Builder.CreateXor(Cond, AConst);
3278 }
3279 return nullptr;
3280}
3281
3282/// We have an expression of the form (A & B) | (C & D). Try to simplify this
3283/// to "A' ? B : D", where A' is a boolean or vector of booleans.
3284/// When InvertFalseVal is set to true, we try to match the pattern
3285/// where we have peeked through a 'not' op and A and C are the same:
3286/// (A & B) | ~(A | D) --> (A & B) | (~A & ~D) --> A' ? B : ~D
3287Value *InstCombinerImpl::matchSelectFromAndOr(Value *A, Value *B, Value *C,
3288 Value *D, bool InvertFalseVal) {
3289 // The potential condition of the select may be bitcasted. In that case, look
3290 // through its bitcast and the corresponding bitcast of the 'not' condition.
3291 Type *OrigType = A->getType();
3292 A = peekThroughBitcast(A, true);
3293 C = peekThroughBitcast(C, true);
3294 if (Value *Cond = getSelectCondition(A, C, InvertFalseVal)) {
3295 // ((bc Cond) & B) | ((bc ~Cond) & D) --> bc (select Cond, (bc B), (bc D))
3296 // If this is a vector, we may need to cast to match the condition's length.
3297 // The bitcasts will either all exist or all not exist. The builder will
3298 // not create unnecessary casts if the types already match.
3299 Type *SelTy = A->getType();
3300 if (auto *VecTy = dyn_cast<VectorType>(Cond->getType())) {
3301 // For a fixed or scalable vector get N from <{vscale x} N x iM>
3302 unsigned Elts = VecTy->getElementCount().getKnownMinValue();
3303 // For a fixed or scalable vector, get the size in bits of N x iM; for a
3304 // scalar this is just M.
3305 unsigned SelEltSize = SelTy->getPrimitiveSizeInBits().getKnownMinValue();
3306 Type *EltTy = Builder.getIntNTy(SelEltSize / Elts);
3307 SelTy = VectorType::get(EltTy, VecTy->getElementCount());
3308 }
3309 Value *BitcastB = Builder.CreateBitCast(B, SelTy);
3310 if (InvertFalseVal)
3311 D = Builder.CreateNot(D);
3312 Value *BitcastD = Builder.CreateBitCast(D, SelTy);
3313 Value *Select = Builder.CreateSelect(Cond, BitcastB, BitcastD);
3314 return Builder.CreateBitCast(Select, OrigType);
3315 }
3316
3317 return nullptr;
3318}
3319
3320// (icmp eq X, C) | (icmp ult Other, (X - C)) -> (icmp ule Other, (X - (C + 1)))
3321// (icmp ne X, C) & (icmp uge Other, (X - C)) -> (icmp ugt Other, (X - (C + 1)))
3323 bool IsAnd, bool IsLogical,
3324 IRBuilderBase &Builder) {
3325 Value *LHS0 = LHS->getOperand(0);
3326 Value *RHS0 = RHS->getOperand(0);
3327 Value *RHS1 = RHS->getOperand(1);
3328
3329 ICmpInst::Predicate LPred =
3330 IsAnd ? LHS->getInversePredicate() : LHS->getPredicate();
3331 ICmpInst::Predicate RPred =
3332 IsAnd ? RHS->getInversePredicate() : RHS->getPredicate();
3333
3334 const APInt *CInt;
3335 if (LPred != ICmpInst::ICMP_EQ ||
3336 !match(LHS->getOperand(1), m_APIntAllowPoison(CInt)) ||
3337 !LHS0->getType()->isIntOrIntVectorTy() ||
3338 !(LHS->hasOneUse() || RHS->hasOneUse()))
3339 return nullptr;
3340
3341 auto MatchRHSOp = [LHS0, CInt](const Value *RHSOp) {
3342 return match(RHSOp,
3343 m_Add(m_Specific(LHS0), m_SpecificIntAllowPoison(-*CInt))) ||
3344 (CInt->isZero() && RHSOp == LHS0);
3345 };
3346
3347 Value *Other;
3348 if (RPred == ICmpInst::ICMP_ULT && MatchRHSOp(RHS1))
3349 Other = RHS0;
3350 else if (RPred == ICmpInst::ICMP_UGT && MatchRHSOp(RHS0))
3351 Other = RHS1;
3352 else
3353 return nullptr;
3354
3355 if (IsLogical)
3356 Other = Builder.CreateFreeze(Other);
3357
3358 return Builder.CreateICmp(
3360 Builder.CreateSub(LHS0, ConstantInt::get(LHS0->getType(), *CInt + 1)),
3361 Other);
3362}
3363
3364/// Fold (icmp)&(icmp) or (icmp)|(icmp) if possible.
3365/// If IsLogical is true, then the and/or is in select form and the transform
3366/// must be poison-safe.
3367Value *InstCombinerImpl::foldAndOrOfICmps(ICmpInst *LHS, ICmpInst *RHS,
3368 Instruction &I, bool IsAnd,
3369 bool IsLogical) {
3370 const SimplifyQuery Q = SQ.getWithInstruction(&I);
3371
3372 ICmpInst::Predicate PredL = LHS->getPredicate(), PredR = RHS->getPredicate();
3373 Value *LHS0 = LHS->getOperand(0), *RHS0 = RHS->getOperand(0);
3374 Value *LHS1 = LHS->getOperand(1), *RHS1 = RHS->getOperand(1);
3375
3376 const APInt *LHSC = nullptr, *RHSC = nullptr;
3377 match(LHS1, m_APInt(LHSC));
3378 match(RHS1, m_APInt(RHSC));
3379
3380 // (icmp1 A, B) | (icmp2 A, B) --> (icmp3 A, B)
3381 // (icmp1 A, B) & (icmp2 A, B) --> (icmp3 A, B)
3382 if (predicatesFoldable(PredL, PredR)) {
3383 if (LHS0 == RHS1 && LHS1 == RHS0) {
3384 PredL = ICmpInst::getSwappedPredicate(PredL);
3385 std::swap(LHS0, LHS1);
3386 }
3387 if (LHS0 == RHS0 && LHS1 == RHS1) {
3388 unsigned Code = IsAnd ? getICmpCode(PredL) & getICmpCode(PredR)
3389 : getICmpCode(PredL) | getICmpCode(PredR);
3390 bool IsSigned = LHS->isSigned() || RHS->isSigned();
3391 return getNewICmpValue(Code, IsSigned, LHS0, LHS1, Builder);
3392 }
3393 }
3394
3395 if (Value *V =
3396 foldAndOrOfICmpEqConstantAndICmp(LHS, RHS, IsAnd, IsLogical, Builder))
3397 return V;
3398 // We can treat logical like bitwise here, because both operands are used on
3399 // the LHS, and as such poison from both will propagate.
3401 /*IsLogical*/ false, Builder))
3402 return V;
3403
3404 if (Value *V = foldAndOrOfICmpsWithConstEq(LHS, RHS, IsAnd, IsLogical,
3405 Builder, Q, I))
3406 return V;
3407 // We can convert this case to bitwise and, because both operands are used
3408 // on the LHS, and as such poison from both will propagate.
3410 RHS, LHS, IsAnd, /*IsLogical=*/false, Builder, Q, I)) {
3411 // If RHS is still used, we should drop samesign flag.
3412 if (IsLogical && RHS->hasSameSign() && !RHS->use_empty()) {
3413 RHS->setSameSign(false);
3415 }
3416 return V;
3417 }
3418
3419 if (Value *V = foldIsPowerOf2OrZero(LHS, RHS, IsAnd, Builder, *this))
3420 return V;
3421 if (Value *V = foldIsPowerOf2OrZero(RHS, LHS, IsAnd, Builder, *this))
3422 return V;
3423
3424 // TODO: One of these directions is fine with logical and/or, the other could
3425 // be supported by inserting freeze.
3426 if (!IsLogical) {
3427 // E.g. (icmp slt x, 0) | (icmp sgt x, n) --> icmp ugt x, n
3428 // E.g. (icmp sge x, 0) & (icmp slt x, n) --> icmp ult x, n
3429 if (Value *V = simplifyRangeCheck(LHS, RHS, /*Inverted=*/!IsAnd))
3430 return V;
3431
3432 // E.g. (icmp sgt x, n) | (icmp slt x, 0) --> icmp ugt x, n
3433 // E.g. (icmp slt x, n) & (icmp sge x, 0) --> icmp ult x, n
3434 if (Value *V = simplifyRangeCheck(RHS, LHS, /*Inverted=*/!IsAnd))
3435 return V;
3436 }
3437
3438 // TODO: Add conjugated or fold, check whether it is safe for logical and/or.
3439 if (IsAnd && !IsLogical)
3441 return V;
3442
3443 if (Value *V = foldIsPowerOf2(LHS, RHS, IsAnd, Builder, *this))
3444 return V;
3445
3446 if (Value *V = foldPowerOf2AndShiftedMask(LHS, RHS, IsAnd, Builder))
3447 return V;
3448
3449 // TODO: Verify whether this is safe for logical and/or.
3450 if (!IsLogical) {
3451 if (Value *X = foldUnsignedUnderflowCheck(LHS, RHS, IsAnd, Q, Builder))
3452 return X;
3453 if (Value *X = foldUnsignedUnderflowCheck(RHS, LHS, IsAnd, Q, Builder))
3454 return X;
3455 }
3456
3457 // (icmp ne A, 0) | (icmp ne B, 0) --> (icmp ne (A|B), 0)
3458 // (icmp eq A, 0) & (icmp eq B, 0) --> (icmp eq (A|B), 0)
3459 // TODO: Remove this and below when foldLogOpOfMaskedICmps can handle undefs.
3460 if (PredL == (IsAnd ? ICmpInst::ICMP_EQ : ICmpInst::ICMP_NE) &&
3461 PredL == PredR && match(LHS1, m_ZeroInt()) && match(RHS1, m_ZeroInt()) &&
3462 LHS0->getType() == RHS0->getType() &&
3463 (!IsLogical || isGuaranteedNotToBePoison(RHS0))) {
3464 Value *NewOr = Builder.CreateOr(LHS0, RHS0);
3465 return Builder.CreateICmp(PredL, NewOr,
3467 }
3468
3469 // (icmp ne A, -1) | (icmp ne B, -1) --> (icmp ne (A&B), -1)
3470 // (icmp eq A, -1) & (icmp eq B, -1) --> (icmp eq (A&B), -1)
3471 if (PredL == (IsAnd ? ICmpInst::ICMP_EQ : ICmpInst::ICMP_NE) &&
3472 PredL == PredR && match(LHS1, m_AllOnes()) && match(RHS1, m_AllOnes()) &&
3473 LHS0->getType() == RHS0->getType() &&
3474 (!IsLogical || isGuaranteedNotToBePoison(RHS0))) {
3475 Value *NewAnd = Builder.CreateAnd(LHS0, RHS0);
3476 return Builder.CreateICmp(PredL, NewAnd,
3478 }
3479
3480 if (!IsLogical)
3481 if (Value *V =
3483 return V;
3484
3485 // This only handles icmp of constants: (icmp1 A, C1) | (icmp2 B, C2).
3486 if (!LHSC || !RHSC)
3487 return nullptr;
3488
3489 // (trunc x) == C1 & (and x, CA) == C2 -> (and x, CA|CMAX) == C1|C2
3490 // (trunc x) != C1 | (and x, CA) != C2 -> (and x, CA|CMAX) != C1|C2
3491 // where CMAX is the all ones value for the truncated type,
3492 // iff the lower bits of C2 and CA are zero.
3493 if (PredL == (IsAnd ? ICmpInst::ICMP_EQ : ICmpInst::ICMP_NE) &&
3494 PredL == PredR && LHS->hasOneUse() && RHS->hasOneUse()) {
3495 Value *V;
3496 const APInt *AndC, *SmallC = nullptr, *BigC = nullptr;
3497
3498 // (trunc x) == C1 & (and x, CA) == C2
3499 // (and x, CA) == C2 & (trunc x) == C1
3500 if (match(RHS0, m_Trunc(m_Value(V))) &&
3501 match(LHS0, m_And(m_Specific(V), m_APInt(AndC)))) {
3502 SmallC = RHSC;
3503 BigC = LHSC;
3504 } else if (match(LHS0, m_Trunc(m_Value(V))) &&
3505 match(RHS0, m_And(m_Specific(V), m_APInt(AndC)))) {
3506 SmallC = LHSC;
3507 BigC = RHSC;
3508 }
3509
3510 if (SmallC && BigC) {
3511 unsigned BigBitSize = BigC->getBitWidth();
3512 unsigned SmallBitSize = SmallC->getBitWidth();
3513
3514 // Check that the low bits are zero.
3515 APInt Low = APInt::getLowBitsSet(BigBitSize, SmallBitSize);
3516 if ((Low & *AndC).isZero() && (Low & *BigC).isZero()) {
3517 Value *NewAnd = Builder.CreateAnd(V, Low | *AndC);
3518 APInt N = SmallC->zext(BigBitSize) | *BigC;
3519 Value *NewVal = ConstantInt::get(NewAnd->getType(), N);
3520 return Builder.CreateICmp(PredL, NewAnd, NewVal);
3521 }
3522 }
3523 }
3524
3525 // Match naive pattern (and its inverted form) for checking if two values
3526 // share same sign. An example of the pattern:
3527 // (icmp slt (X & Y), 0) | (icmp sgt (X | Y), -1) -> (icmp sgt (X ^ Y), -1)
3528 // Inverted form (example):
3529 // (icmp slt (X | Y), 0) & (icmp sgt (X & Y), -1) -> (icmp slt (X ^ Y), 0)
3530 bool TrueIfSignedL, TrueIfSignedR;
3531 if (isSignBitCheck(PredL, *LHSC, TrueIfSignedL) &&
3532 isSignBitCheck(PredR, *RHSC, TrueIfSignedR) &&
3533 (RHS->hasOneUse() || LHS->hasOneUse())) {
3534 Value *X, *Y;
3535 if (IsAnd) {
3536 if ((TrueIfSignedL && !TrueIfSignedR &&
3537 match(LHS0, m_Or(m_Value(X), m_Value(Y))) &&
3538 match(RHS0, m_c_And(m_Specific(X), m_Specific(Y)))) ||
3539 (!TrueIfSignedL && TrueIfSignedR &&
3540 match(LHS0, m_And(m_Value(X), m_Value(Y))) &&
3541 match(RHS0, m_c_Or(m_Specific(X), m_Specific(Y))))) {
3542 Value *NewXor = Builder.CreateXor(X, Y);
3543 return Builder.CreateIsNeg(NewXor);
3544 }
3545 } else {
3546 if ((TrueIfSignedL && !TrueIfSignedR &&
3547 match(LHS0, m_And(m_Value(X), m_Value(Y))) &&
3548 match(RHS0, m_c_Or(m_Specific(X), m_Specific(Y)))) ||
3549 (!TrueIfSignedL && TrueIfSignedR &&
3550 match(LHS0, m_Or(m_Value(X), m_Value(Y))) &&
3551 match(RHS0, m_c_And(m_Specific(X), m_Specific(Y))))) {
3552 Value *NewXor = Builder.CreateXor(X, Y);
3553 return Builder.CreateIsNotNeg(NewXor);
3554 }
3555 }
3556 }
3557
3558 // (X & ExpMask) != 0 && (X & ExpMask) != ExpMask -> isnormal(X)
3559 // (X & ExpMask) == 0 || (X & ExpMask) == ExpMask -> !isnormal(X)
3560 Value *X;
3561 const APInt *MaskC;
3562 if (LHS0 == RHS0 && PredL == PredR &&
3563 PredL == (IsAnd ? ICmpInst::ICMP_NE : ICmpInst::ICMP_EQ) &&
3564 !I.getFunction()->hasFnAttribute(Attribute::NoImplicitFloat) &&
3565 LHS->hasOneUse() && RHS->hasOneUse() &&
3566 match(LHS0, m_And(m_ElementWiseBitCast(m_Value(X)), m_APInt(MaskC))) &&
3567 X->getType()->getScalarType()->isIEEELikeFPTy() &&
3568 APFloat(X->getType()->getScalarType()->getFltSemantics(), *MaskC)
3569 .isPosInfinity() &&
3570 ((LHSC->isZero() && *RHSC == *MaskC) ||
3571 (RHSC->isZero() && *LHSC == *MaskC)))
3572 return Builder.createIsFPClass(X, IsAnd ? FPClassTest::fcNormal
3574
3575 return foldAndOrOfICmpsUsingRanges(LHS, RHS, IsAnd);
3576}
3577
3578/// If IsLogical is true, then the and/or is in select form and the transform
3579/// must be poison-safe.
3580Value *InstCombinerImpl::foldBooleanAndOr(Value *LHS, Value *RHS,
3581 Instruction &I, bool IsAnd,
3582 bool IsLogical) {
3583 if (!LHS->getType()->isIntOrIntVectorTy(1))
3584 return nullptr;
3585
3586 // handle (roughly):
3587 // (icmp ne (A & B), C) | (icmp ne (A & D), E)
3588 // (icmp eq (A & B), C) & (icmp eq (A & D), E)
3589 if (Value *V = foldLogOpOfMaskedICmps(LHS, RHS, IsAnd, IsLogical, Builder,
3590 SQ.getWithInstruction(&I)))
3591 return V;
3592
3593 if (auto *LHSCmp = dyn_cast<ICmpInst>(LHS))
3594 if (auto *RHSCmp = dyn_cast<ICmpInst>(RHS))
3595 if (Value *Res = foldAndOrOfICmps(LHSCmp, RHSCmp, I, IsAnd, IsLogical))
3596 return Res;
3597
3598 if (auto *LHSCmp = dyn_cast<FCmpInst>(LHS))
3599 if (auto *RHSCmp = dyn_cast<FCmpInst>(RHS))
3600 if (Value *Res = foldLogicOfFCmps(LHSCmp, RHSCmp, IsAnd, IsLogical))
3601 return Res;
3602
3603 if (Value *Res = foldEqOfParts(LHS, RHS, IsAnd))
3604 return Res;
3605
3606 return nullptr;
3607}
3608
3610 InstCombiner::BuilderTy &Builder) {
3611 assert(I.getOpcode() == Instruction::Or &&
3612 "Simplification only supports or at the moment.");
3613
3614 Value *Cmp1, *Cmp2, *Cmp3, *Cmp4;
3615 if (!match(I.getOperand(0), m_And(m_Value(Cmp1), m_Value(Cmp2))) ||
3616 !match(I.getOperand(1), m_And(m_Value(Cmp3), m_Value(Cmp4))))
3617 return nullptr;
3618
3619 // Check if any two pairs of the and operations are inversions of each other.
3620 if (isKnownInversion(Cmp1, Cmp3) && isKnownInversion(Cmp2, Cmp4))
3621 return Builder.CreateXor(Cmp1, Cmp4);
3622 if (isKnownInversion(Cmp1, Cmp4) && isKnownInversion(Cmp2, Cmp3))
3623 return Builder.CreateXor(Cmp1, Cmp3);
3624
3625 return nullptr;
3626}
3627
3628/// Match \p V as "shufflevector -> bitcast" or "extractelement -> zext -> shl"
3629/// patterns, which extract vector elements and pack them in the same relative
3630/// positions.
3631///
3632/// \p Vec is the underlying vector being extracted from.
3633/// \p Mask is a bitmask identifying which packed elements are obtained from the
3634/// vector.
3635/// \p VecOffset is the vector element corresponding to index 0 of the
3636/// mask.
3638 int64_t &VecOffset,
3639 SmallBitVector &Mask,
3640 const DataLayout &DL) {
3641 // First try to match extractelement -> zext -> shl
3642 uint64_t VecIdx, ShlAmt;
3644 m_ConstantInt(VecIdx))),
3645 ShlAmt))) {
3646 auto *VecTy = dyn_cast<FixedVectorType>(Vec->getType());
3647 if (!VecTy)
3648 return false;
3649 auto *EltTy = dyn_cast<IntegerType>(VecTy->getElementType());
3650 if (!EltTy)
3651 return false;
3652
3653 const unsigned EltBitWidth = EltTy->getBitWidth();
3654 const unsigned TargetBitWidth = V->getType()->getIntegerBitWidth();
3655 if (TargetBitWidth % EltBitWidth != 0 || ShlAmt % EltBitWidth != 0)
3656 return false;
3657 const unsigned TargetEltWidth = TargetBitWidth / EltBitWidth;
3658 const unsigned ShlEltAmt = ShlAmt / EltBitWidth;
3659
3660 const unsigned MaskIdx =
3661 DL.isLittleEndian() ? ShlEltAmt : TargetEltWidth - ShlEltAmt - 1;
3662
3663 VecOffset = static_cast<int64_t>(VecIdx) - static_cast<int64_t>(MaskIdx);
3664 Mask.resize(TargetEltWidth);
3665 Mask.set(MaskIdx);
3666 return true;
3667 }
3668
3669 // Now try to match a bitcasted subvector.
3670 Instruction *SrcVecI;
3671 if (!match(V, m_BitCast(m_Instruction(SrcVecI))))
3672 return false;
3673
3674 auto *SrcTy = dyn_cast<FixedVectorType>(SrcVecI->getType());
3675 if (!SrcTy)
3676 return false;
3677
3678 Mask.resize(SrcTy->getNumElements());
3679
3680 // First check for a subvector obtained from a shufflevector.
3681 if (isa<ShuffleVectorInst>(SrcVecI)) {
3682 Constant *ConstVec;
3683 ArrayRef<int> ShuffleMask;
3684 if (!match(SrcVecI, m_Shuffle(m_Value(Vec), m_Constant(ConstVec),
3685 m_Mask(ShuffleMask))))
3686 return false;
3687
3688 auto *VecTy = dyn_cast<FixedVectorType>(Vec->getType());
3689 if (!VecTy)
3690 return false;
3691
3692 const unsigned NumVecElts = VecTy->getNumElements();
3693 bool FoundVecOffset = false;
3694 for (unsigned Idx = 0; Idx < ShuffleMask.size(); ++Idx) {
3695 if (ShuffleMask[Idx] == PoisonMaskElem)
3696 return false;
3697 const unsigned ShuffleIdx = ShuffleMask[Idx];
3698 if (ShuffleIdx >= NumVecElts) {
3699 const unsigned ConstIdx = ShuffleIdx - NumVecElts;
3700 auto *ConstElt =
3701 dyn_cast<ConstantInt>(ConstVec->getAggregateElement(ConstIdx));
3702 if (!ConstElt || !ConstElt->isNullValue())
3703 return false;
3704 continue;
3705 }
3706
3707 if (FoundVecOffset) {
3708 if (VecOffset + Idx != ShuffleIdx)
3709 return false;
3710 } else {
3711 if (ShuffleIdx < Idx)
3712 return false;
3713 VecOffset = ShuffleIdx - Idx;
3714 FoundVecOffset = true;
3715 }
3716 Mask.set(Idx);
3717 }
3718 return FoundVecOffset;
3719 }
3720
3721 // Check for a subvector obtained as an (insertelement V, 0, idx)
3722 uint64_t InsertIdx;
3723 if (!match(SrcVecI,
3724 m_InsertElt(m_Value(Vec), m_Zero(), m_ConstantInt(InsertIdx))))
3725 return false;
3726
3727 auto *VecTy = dyn_cast<FixedVectorType>(Vec->getType());
3728 if (!VecTy)
3729 return false;
3730 VecOffset = 0;
3731 bool AlreadyInsertedMaskedElt = Mask.test(InsertIdx);
3732 Mask.set();
3733 if (!AlreadyInsertedMaskedElt)
3734 Mask.reset(InsertIdx);
3735 return true;
3736}
3737
3738/// Try to fold the join of two scalar integers whose contents are packed
3739/// elements of the same vector.
3741 InstCombiner::BuilderTy &Builder,
3742 const DataLayout &DL) {
3743 assert(I.getOpcode() == Instruction::Or);
3744 Value *LhsVec, *RhsVec;
3745 int64_t LhsVecOffset, RhsVecOffset;
3746 SmallBitVector Mask;
3747 if (!matchSubIntegerPackFromVector(I.getOperand(0), LhsVec, LhsVecOffset,
3748 Mask, DL))
3749 return nullptr;
3750 if (!matchSubIntegerPackFromVector(I.getOperand(1), RhsVec, RhsVecOffset,
3751 Mask, DL))
3752 return nullptr;
3753 if (LhsVec != RhsVec || LhsVecOffset != RhsVecOffset)
3754 return nullptr;
3755
3756 // Convert into shufflevector -> bitcast;
3757 const unsigned ZeroVecIdx =
3758 cast<FixedVectorType>(LhsVec->getType())->getNumElements();
3759 SmallVector<int> ShuffleMask(Mask.size(), ZeroVecIdx);
3760 for (unsigned Idx : Mask.set_bits()) {
3761 assert(LhsVecOffset + Idx >= 0);
3762 ShuffleMask[Idx] = LhsVecOffset + Idx;
3763 }
3764
3765 Value *MaskedVec = Builder.CreateShuffleVector(
3766 LhsVec, Constant::getNullValue(LhsVec->getType()), ShuffleMask,
3767 I.getName() + ".v");
3768 return CastInst::Create(Instruction::BitCast, MaskedVec, I.getType());
3769}
3770
3771/// Match \p V as "lshr -> mask -> zext -> shl".
3772///
3773/// \p Int is the underlying integer being extracted from.
3774/// \p Mask is a bitmask identifying which bits of the integer are being
3775/// extracted. \p Offset identifies which bit of the result \p V corresponds to
3776/// the least significant bit of \p Int
3777static bool matchZExtedSubInteger(Value *V, Value *&Int, APInt &Mask,
3778 uint64_t &Offset, bool &IsShlNUW,
3779 bool &IsShlNSW) {
3780 Value *ShlOp0;
3781 uint64_t ShlAmt = 0;
3782 if (!match(V, m_OneUse(m_Shl(m_Value(ShlOp0), m_ConstantInt(ShlAmt)))))
3783 return false;
3784
3785 IsShlNUW = cast<BinaryOperator>(V)->hasNoUnsignedWrap();
3786 IsShlNSW = cast<BinaryOperator>(V)->hasNoSignedWrap();
3787
3788 Value *ZExtOp0;
3789 if (!match(ShlOp0, m_OneUse(m_ZExt(m_Value(ZExtOp0)))))
3790 return false;
3791
3792 Value *MaskedOp0;
3793 const APInt *ShiftedMaskConst = nullptr;
3794 if (!match(ZExtOp0, m_CombineOr(m_OneUse(m_And(m_Value(MaskedOp0),
3795 m_APInt(ShiftedMaskConst))),
3796 m_Value(MaskedOp0))))
3797 return false;
3798
3799 uint64_t LShrAmt = 0;
3800 if (!match(MaskedOp0,
3802 m_Value(Int))))
3803 return false;
3804
3805 if (LShrAmt > ShlAmt)
3806 return false;
3807 Offset = ShlAmt - LShrAmt;
3808
3809 Mask = ShiftedMaskConst ? ShiftedMaskConst->shl(LShrAmt)
3811 Int->getType()->getScalarSizeInBits(), LShrAmt);
3812
3813 return true;
3814}
3815
3816/// Try to fold the join of two scalar integers whose bits are unpacked and
3817/// zexted from the same source integer.
3819 InstCombiner::BuilderTy &Builder) {
3820
3821 Value *LhsInt, *RhsInt;
3822 APInt LhsMask, RhsMask;
3823 uint64_t LhsOffset, RhsOffset;
3824 bool IsLhsShlNUW, IsLhsShlNSW, IsRhsShlNUW, IsRhsShlNSW;
3825 if (!matchZExtedSubInteger(Lhs, LhsInt, LhsMask, LhsOffset, IsLhsShlNUW,
3826 IsLhsShlNSW))
3827 return nullptr;
3828 if (!matchZExtedSubInteger(Rhs, RhsInt, RhsMask, RhsOffset, IsRhsShlNUW,
3829 IsRhsShlNSW))
3830 return nullptr;
3831 if (LhsInt != RhsInt || LhsOffset != RhsOffset)
3832 return nullptr;
3833
3834 APInt Mask = LhsMask | RhsMask;
3835
3836 Type *DestTy = Lhs->getType();
3837 Value *Res = Builder.CreateShl(
3838 Builder.CreateZExt(
3839 Builder.CreateAnd(LhsInt, Mask, LhsInt->getName() + ".mask"), DestTy,
3840 LhsInt->getName() + ".zext"),
3841 ConstantInt::get(DestTy, LhsOffset), "", IsLhsShlNUW && IsRhsShlNUW,
3842 IsLhsShlNSW && IsRhsShlNSW);
3843 Res->takeName(Lhs);
3844 return Res;
3845}
3846
3847// A decomposition of ((X & Mask) * Factor). The NUW / NSW bools
3848// track these properities for preservation. Note that we can decompose
3849// equivalent select form of this expression (e.g. (!(X & Mask) ? 0 : Mask *
3850// Factor))
3855 bool NUW;
3856 bool NSW;
3857
3859 return X == Other.X && !Mask.intersects(Other.Mask) &&
3860 Factor == Other.Factor;
3861 }
3862};
3863
3864static std::optional<DecomposedBitMaskMul> matchBitmaskMul(Value *V) {
3866 if (!Op)
3867 return std::nullopt;
3868
3869 // Decompose (A & N) * C) into BitMaskMul
3870 Value *Original = nullptr;
3871 const APInt *Mask = nullptr;
3872 const APInt *MulConst = nullptr;
3873 if (match(Op, m_Mul(m_And(m_Value(Original), m_APInt(Mask)),
3874 m_APInt(MulConst)))) {
3875 if (MulConst->isZero() || Mask->isZero())
3876 return std::nullopt;
3877
3878 return std::optional<DecomposedBitMaskMul>(
3879 {Original, *MulConst, *Mask,
3880 cast<BinaryOperator>(Op)->hasNoUnsignedWrap(),
3881 cast<BinaryOperator>(Op)->hasNoSignedWrap()});
3882 }
3883
3884 Value *Cond = nullptr;
3885 const APInt *EqZero = nullptr, *NeZero = nullptr;
3886
3887 // Decompose ((A & N) ? 0 : N * C) into BitMaskMul
3888 if (match(Op, m_Select(m_Value(Cond), m_APInt(EqZero), m_APInt(NeZero)))) {
3889 auto ICmpDecompose =
3890 decomposeBitTest(Cond, /*LookThroughTrunc=*/true,
3891 /*AllowNonZeroC=*/false, /*DecomposeBitMask=*/true);
3892 if (!ICmpDecompose.has_value())
3893 return std::nullopt;
3894
3895 assert(ICmpInst::isEquality(ICmpDecompose->Pred) &&
3896 ICmpDecompose->C.isZero());
3897
3898 if (ICmpDecompose->Pred == ICmpInst::ICMP_NE)
3899 std::swap(EqZero, NeZero);
3900
3901 if (!EqZero->isZero() || NeZero->isZero())
3902 return std::nullopt;
3903
3904 if (!ICmpDecompose->Mask.isPowerOf2() || ICmpDecompose->Mask.isZero() ||
3905 NeZero->getBitWidth() != ICmpDecompose->Mask.getBitWidth())
3906 return std::nullopt;
3907
3908 if (!NeZero->urem(ICmpDecompose->Mask).isZero())
3909 return std::nullopt;
3910
3911 return std::optional<DecomposedBitMaskMul>(
3912 {ICmpDecompose->X, NeZero->udiv(ICmpDecompose->Mask),
3913 ICmpDecompose->Mask, /*NUW=*/false, /*NSW=*/false});
3914 }
3915
3916 return std::nullopt;
3917}
3918
3919/// (A & N) * C + (A & M) * C -> (A & (N + M)) & C
3920/// This also accepts the equivalent select form of (A & N) * C
3921/// expressions i.e. !(A & N) ? 0 : N * C)
3922static Value *foldBitmaskMul(Value *Op0, Value *Op1,
3923 InstCombiner::BuilderTy &Builder) {
3924 auto Decomp1 = matchBitmaskMul(Op1);
3925 if (!Decomp1)
3926 return nullptr;
3927
3928 auto Decomp0 = matchBitmaskMul(Op0);
3929 if (!Decomp0)
3930 return nullptr;
3931
3932 if (Decomp0->isCombineableWith(*Decomp1)) {
3933 Value *NewAnd = Builder.CreateAnd(
3934 Decomp0->X,
3935 ConstantInt::get(Decomp0->X->getType(), Decomp0->Mask + Decomp1->Mask));
3936
3937 return Builder.CreateMul(
3938 NewAnd, ConstantInt::get(NewAnd->getType(), Decomp1->Factor), "",
3939 Decomp0->NUW && Decomp1->NUW, Decomp0->NSW && Decomp1->NSW);
3940 }
3941
3942 return nullptr;
3943}
3944
3945Value *InstCombinerImpl::foldDisjointOr(Value *LHS, Value *RHS) {
3946 if (Value *Res = foldBitmaskMul(LHS, RHS, Builder))
3947 return Res;
3949 return Res;
3950
3951 return nullptr;
3952}
3953
3954Value *InstCombinerImpl::reassociateDisjointOr(Value *LHS, Value *RHS) {
3955
3956 Value *X, *Y;
3958 if (Value *Res = foldDisjointOr(LHS, X))
3959 return Builder.CreateOr(Res, Y, "", /*IsDisjoint=*/true);
3960 if (Value *Res = foldDisjointOr(LHS, Y))
3961 return Builder.CreateOr(Res, X, "", /*IsDisjoint=*/true);
3962 }
3963
3965 if (Value *Res = foldDisjointOr(X, RHS))
3966 return Builder.CreateOr(Res, Y, "", /*IsDisjoint=*/true);
3967 if (Value *Res = foldDisjointOr(Y, RHS))
3968 return Builder.CreateOr(Res, X, "", /*IsDisjoint=*/true);
3969 }
3970
3971 return nullptr;
3972}
3973
3974/// Fold Res, Overflow = (umul.with.overflow x c1); (or Overflow (ugt Res c2))
3975/// --> (ugt x (c2/c1)). This code checks whether a multiplication of two
3976/// unsigned numbers (one is a constant) is mathematically greater than a
3977/// second constant.
3979 InstCombiner::BuilderTy &Builder,
3980 const DataLayout &DL) {
3981 Value *WOV, *X;
3982 const APInt *C1, *C2;
3983 if (match(&I,
3986 m_Value(X), m_APInt(C1)))),
3989 m_APInt(C2))))) &&
3990 !C1->isZero()) {
3991 Constant *NewC = ConstantInt::get(X->getType(), C2->udiv(*C1));
3992 return Builder.CreateICmp(ICmpInst::ICMP_UGT, X, NewC);
3993 }
3994 return nullptr;
3995}
3996
3997/// Fold select(X >s 0, 0, -X) | smax(X, 0) --> abs(X)
3998/// select(X <s 0, -X, 0) | smax(X, 0) --> abs(X)
4000 InstCombiner::BuilderTy &Builder) {
4001 Value *X;
4002 Value *Sel;
4003 if (match(&I,
4005 auto NegX = m_Neg(m_Specific(X));
4007 m_ZeroInt()),
4008 m_ZeroInt(), NegX)) ||
4010 m_ZeroInt()),
4011 NegX, m_ZeroInt())))
4012 return Builder.CreateBinaryIntrinsic(Intrinsic::abs, X,
4013 Builder.getFalse());
4014 }
4015 return nullptr;
4016}
4017
4019 Value *C, *A, *B;
4020 // (C && A) || (!C && B)
4021 // (C && A) || (B && !C)
4022 // (A && C) || (!C && B)
4023 // (A && C) || (B && !C) (may require freeze)
4024 //
4025 // => select C, A, B
4026 if (match(Op1, m_c_LogicalAnd(m_Not(m_Value(C)), m_Value(B))) &&
4028 auto *SelOp0 = dyn_cast<SelectInst>(Op0);
4029 auto *SelOp1 = dyn_cast<SelectInst>(Op1);
4030
4031 bool MayNeedFreeze = SelOp0 && SelOp1 &&
4032 match(SelOp1->getTrueValue(),
4033 m_Not(m_Specific(SelOp0->getTrueValue())));
4034 if (MayNeedFreeze)
4035 C = Builder.CreateFreeze(C);
4037 Value *C2 = nullptr, *A2 = nullptr, *B2 = nullptr;
4038 if (match(Op0, m_LogicalAnd(m_Specific(C), m_Value(A2))) && SelOp0) {
4039 return SelectInst::Create(C, A, B, "", nullptr, SelOp0);
4040 } else if (match(Op1, m_LogicalAnd(m_Not(m_Value(C2)), m_Value(B2))) &&
4041 SelOp1) {
4042 SelectInst *NewSI = SelectInst::Create(C, A, B, "", nullptr, SelOp1);
4043 NewSI->swapProfMetadata();
4044 return NewSI;
4045 } else {
4046 return createSelectInstWithUnknownProfile(C, A, B);
4047 }
4048 }
4049 return SelectInst::Create(C, A, B);
4050 }
4051
4052 // (!C && A) || (C && B)
4053 // (A && !C) || (C && B)
4054 // (!C && A) || (B && C)
4055 // (A && !C) || (B && C) (may require freeze)
4056 //
4057 // => select C, B, A
4058 if (match(Op0, m_c_LogicalAnd(m_Not(m_Value(C)), m_Value(A))) &&
4060 auto *SelOp0 = dyn_cast<SelectInst>(Op0);
4061 auto *SelOp1 = dyn_cast<SelectInst>(Op1);
4062 bool MayNeedFreeze = SelOp0 && SelOp1 &&
4063 match(SelOp0->getTrueValue(),
4064 m_Not(m_Specific(SelOp1->getTrueValue())));
4065 if (MayNeedFreeze)
4066 C = Builder.CreateFreeze(C);
4068 Value *C2 = nullptr, *A2 = nullptr, *B2 = nullptr;
4069 if (match(Op0, m_LogicalAnd(m_Not(m_Value(C2)), m_Value(A2))) && SelOp0) {
4070 SelectInst *NewSI = SelectInst::Create(C, B, A, "", nullptr, SelOp0);
4071 NewSI->swapProfMetadata();
4072 return NewSI;
4073 } else if (match(Op1, m_LogicalAnd(m_Specific(C), m_Value(B2))) &&
4074 SelOp1) {
4075 return SelectInst::Create(C, B, A, "", nullptr, SelOp1);
4076 } else {
4077 return createSelectInstWithUnknownProfile(C, B, A);
4078 }
4079 }
4080 return SelectInst::Create(C, B, A);
4081 }
4082
4083 return nullptr;
4084}
4085
4086// FIXME: We use commutative matchers (m_c_*) for some, but not all, matches
4087// here. We should standardize that construct where it is needed or choose some
4088// other way to ensure that commutated variants of patterns are not missed.
4090 if (Value *V = simplifyOrInst(I.getOperand(0), I.getOperand(1),
4091 SQ.getWithInstruction(&I)))
4092 return replaceInstUsesWith(I, V);
4093
4095 return &I;
4096
4098 return X;
4099
4101 return Phi;
4102
4103 // See if we can simplify any instructions used by the instruction whose sole
4104 // purpose is to compute bits we don't care about.
4106 return &I;
4107
4108 // Do this before using distributive laws to catch simple and/or/not patterns.
4110 return Xor;
4111
4113 return X;
4114
4116 return X;
4117
4118 // (A & B) | (C & D) -> A ^ D where A == ~C && B == ~D
4119 // (A & B) | (C & D) -> A ^ C where A == ~D && B == ~C
4120 if (Value *V = foldOrOfInversions(I, Builder))
4121 return replaceInstUsesWith(I, V);
4122
4123 // (A&B)|(A&C) -> A&(B|C) etc
4125 return replaceInstUsesWith(I, V);
4126
4127 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
4128 Type *Ty = I.getType();
4129 if (Ty->isIntOrIntVectorTy(1)) {
4130 if (auto *SI0 = dyn_cast<SelectInst>(Op0)) {
4131 if (auto *R =
4132 foldAndOrOfSelectUsingImpliedCond(Op1, *SI0, /* IsAnd */ false))
4133 return R;
4134 }
4135 if (auto *SI1 = dyn_cast<SelectInst>(Op1)) {
4136 if (auto *R =
4137 foldAndOrOfSelectUsingImpliedCond(Op0, *SI1, /* IsAnd */ false))
4138 return R;
4139 }
4140 }
4141
4142 if (Instruction *FoldedLogic = foldBinOpIntoSelectOrPhi(I))
4143 return FoldedLogic;
4144
4145 if (Instruction *FoldedLogic = foldBinOpSelectBinOp(I))
4146 return FoldedLogic;
4147
4148 if (Instruction *BitOp = matchBSwapOrBitReverse(I, /*MatchBSwaps*/ true,
4149 /*MatchBitReversals*/ true))
4150 return BitOp;
4151
4152 if (Instruction *Funnel = matchFunnelShift(I, *this))
4153 return Funnel;
4154
4156 return replaceInstUsesWith(I, Concat);
4157
4159 return R;
4160
4162 return R;
4163
4164 if (cast<PossiblyDisjointInst>(I).isDisjoint()) {
4165 if (Instruction *R =
4166 foldAddLikeCommutative(I.getOperand(0), I.getOperand(1),
4167 /*NSW=*/true, /*NUW=*/true))
4168 return R;
4169 if (Instruction *R =
4170 foldAddLikeCommutative(I.getOperand(1), I.getOperand(0),
4171 /*NSW=*/true, /*NUW=*/true))
4172 return R;
4173
4174 if (Value *Res = foldDisjointOr(I.getOperand(0), I.getOperand(1)))
4175 return replaceInstUsesWith(I, Res);
4176
4177 if (Value *Res = reassociateDisjointOr(I.getOperand(0), I.getOperand(1)))
4178 return replaceInstUsesWith(I, Res);
4179 }
4180
4181 Value *X, *Y;
4182 const APInt *CV;
4183 if (match(&I, m_c_Or(m_OneUse(m_Xor(m_Value(X), m_APInt(CV))), m_Value(Y))) &&
4184 !CV->isAllOnes() && MaskedValueIsZero(Y, *CV, &I)) {
4185 // (X ^ C) | Y -> (X | Y) ^ C iff Y & C == 0
4186 // The check for a 'not' op is for efficiency (if Y is known zero --> ~X).
4187 Value *Or = Builder.CreateOr(X, Y);
4188 return BinaryOperator::CreateXor(Or, ConstantInt::get(Ty, *CV));
4189 }
4190
4191 // If the operands have no common bits set:
4192 // or (mul X, Y), X --> add (mul X, Y), X --> mul X, (Y + 1)
4194 m_Deferred(X)))) {
4195 Value *IncrementY = Builder.CreateAdd(Y, ConstantInt::get(Ty, 1));
4196 return BinaryOperator::CreateMul(X, IncrementY);
4197 }
4198
4199 // (C && A) || (C && B) => select C, A, B (and similar cases)
4200 //
4201 // Note: This is the same transformation used in `foldSelectOfBools`,
4202 // except that it's an `or` instead of `select`.
4203 if (I.getType()->isIntOrIntVectorTy(1) &&
4204 (Op0->hasOneUse() || Op1->hasOneUse())) {
4205 if (Instruction *V = FoldOrOfLogicalAnds(Op0, Op1)) {
4206 return V;
4207 }
4208 }
4209
4210 // (A & C) | (B & D)
4211 Value *A, *B, *C, *D;
4212 if (match(Op0, m_And(m_Value(A), m_Value(C))) &&
4213 match(Op1, m_And(m_Value(B), m_Value(D)))) {
4214
4215 // (A & C0) | (B & C1)
4216 const APInt *C0, *C1;
4217 if (match(C, m_APInt(C0)) && match(D, m_APInt(C1))) {
4218 Value *X;
4219 if (*C0 == ~*C1) {
4220 // ((X | B) & MaskC) | (B & ~MaskC) -> (X & MaskC) | B
4221 if (match(A, m_c_Or(m_Value(X), m_Specific(B))))
4222 return BinaryOperator::CreateOr(Builder.CreateAnd(X, *C0), B);
4223 // (A & MaskC) | ((X | A) & ~MaskC) -> (X & ~MaskC) | A
4224 if (match(B, m_c_Or(m_Specific(A), m_Value(X))))
4225 return BinaryOperator::CreateOr(Builder.CreateAnd(X, *C1), A);
4226
4227 // ((X ^ B) & MaskC) | (B & ~MaskC) -> (X & MaskC) ^ B
4228 if (match(A, m_c_Xor(m_Value(X), m_Specific(B))))
4229 return BinaryOperator::CreateXor(Builder.CreateAnd(X, *C0), B);
4230 // (A & MaskC) | ((X ^ A) & ~MaskC) -> (X & ~MaskC) ^ A
4231 if (match(B, m_c_Xor(m_Specific(A), m_Value(X))))
4232 return BinaryOperator::CreateXor(Builder.CreateAnd(X, *C1), A);
4233 }
4234
4235 if ((*C0 & *C1).isZero()) {
4236 // ((X | B) & C0) | (B & C1) --> (X | B) & (C0 | C1)
4237 // iff (C0 & C1) == 0 and (X & ~C0) == 0
4238 if (match(A, m_c_Or(m_Value(X), m_Specific(B))) &&
4239 MaskedValueIsZero(X, ~*C0, &I)) {
4240 Constant *C01 = ConstantInt::get(Ty, *C0 | *C1);
4241 return BinaryOperator::CreateAnd(A, C01);
4242 }
4243 // (A & C0) | ((X | A) & C1) --> (X | A) & (C0 | C1)
4244 // iff (C0 & C1) == 0 and (X & ~C1) == 0
4245 if (match(B, m_c_Or(m_Value(X), m_Specific(A))) &&
4246 MaskedValueIsZero(X, ~*C1, &I)) {
4247 Constant *C01 = ConstantInt::get(Ty, *C0 | *C1);
4248 return BinaryOperator::CreateAnd(B, C01);
4249 }
4250 // ((X | C2) & C0) | ((X | C3) & C1) --> (X | C2 | C3) & (C0 | C1)
4251 // iff (C0 & C1) == 0 and (C2 & ~C0) == 0 and (C3 & ~C1) == 0.
4252 const APInt *C2, *C3;
4253 if (match(A, m_Or(m_Value(X), m_APInt(C2))) &&
4254 match(B, m_Or(m_Specific(X), m_APInt(C3))) &&
4255 (*C2 & ~*C0).isZero() && (*C3 & ~*C1).isZero()) {
4256 Value *Or = Builder.CreateOr(X, *C2 | *C3, "bitfield");
4257 Constant *C01 = ConstantInt::get(Ty, *C0 | *C1);
4258 return BinaryOperator::CreateAnd(Or, C01);
4259 }
4260 }
4261 }
4262
4263 // Don't try to form a select if it's unlikely that we'll get rid of at
4264 // least one of the operands. A select is generally more expensive than the
4265 // 'or' that it is replacing.
4266 if (Op0->hasOneUse() || Op1->hasOneUse()) {
4267 // (Cond & C) | (~Cond & D) -> Cond ? C : D, and commuted variants.
4268 if (Value *V = matchSelectFromAndOr(A, C, B, D))
4269 return replaceInstUsesWith(I, V);
4270 if (Value *V = matchSelectFromAndOr(A, C, D, B))
4271 return replaceInstUsesWith(I, V);
4272 if (Value *V = matchSelectFromAndOr(C, A, B, D))
4273 return replaceInstUsesWith(I, V);
4274 if (Value *V = matchSelectFromAndOr(C, A, D, B))
4275 return replaceInstUsesWith(I, V);
4276 if (Value *V = matchSelectFromAndOr(B, D, A, C))
4277 return replaceInstUsesWith(I, V);
4278 if (Value *V = matchSelectFromAndOr(B, D, C, A))
4279 return replaceInstUsesWith(I, V);
4280 if (Value *V = matchSelectFromAndOr(D, B, A, C))
4281 return replaceInstUsesWith(I, V);
4282 if (Value *V = matchSelectFromAndOr(D, B, C, A))
4283 return replaceInstUsesWith(I, V);
4284 }
4285 }
4286
4287 if (match(Op0, m_And(m_Value(A), m_Value(C))) &&
4288 match(Op1, m_Not(m_Or(m_Value(B), m_Value(D)))) &&
4289 (Op0->hasOneUse() || Op1->hasOneUse())) {
4290 // (Cond & C) | ~(Cond | D) -> Cond ? C : ~D
4291 if (Value *V = matchSelectFromAndOr(A, C, B, D, true))
4292 return replaceInstUsesWith(I, V);
4293 if (Value *V = matchSelectFromAndOr(A, C, D, B, true))
4294 return replaceInstUsesWith(I, V);
4295 if (Value *V = matchSelectFromAndOr(C, A, B, D, true))
4296 return replaceInstUsesWith(I, V);
4297 if (Value *V = matchSelectFromAndOr(C, A, D, B, true))
4298 return replaceInstUsesWith(I, V);
4299 }
4300
4301 // (A ^ B) | ((B ^ C) ^ A) -> (A ^ B) | C
4302 if (match(Op0, m_Xor(m_Value(A), m_Value(B))))
4303 if (match(Op1,
4306 return BinaryOperator::CreateOr(Op0, C);
4307
4308 // ((B ^ C) ^ A) | (A ^ B) -> (A ^ B) | C
4309 if (match(Op1, m_Xor(m_Value(A), m_Value(B))))
4310 if (match(Op0,
4313 return BinaryOperator::CreateOr(Op1, C);
4314
4315 if (Instruction *DeMorgan = matchDeMorgansLaws(I, *this))
4316 return DeMorgan;
4317
4318 // Canonicalize xor to the RHS.
4319 bool SwappedForXor = false;
4320 if (match(Op0, m_Xor(m_Value(), m_Value()))) {
4321 std::swap(Op0, Op1);
4322 SwappedForXor = true;
4323 }
4324
4325 if (match(Op1, m_Xor(m_Value(A), m_Value(B)))) {
4326 // (A | ?) | (A ^ B) --> (A | ?) | B
4327 // (B | ?) | (A ^ B) --> (B | ?) | A
4328 if (match(Op0, m_c_Or(m_Specific(A), m_Value())))
4329 return BinaryOperator::CreateOr(Op0, B);
4330 if (match(Op0, m_c_Or(m_Specific(B), m_Value())))
4331 return BinaryOperator::CreateOr(Op0, A);
4332
4333 // (A & B) | (A ^ B) --> A | B
4334 // (B & A) | (A ^ B) --> A | B
4335 if (match(Op0, m_c_And(m_Specific(A), m_Specific(B))))
4336 return BinaryOperator::CreateOr(A, B);
4337
4338 // ~A | (A ^ B) --> ~(A & B)
4339 // ~B | (A ^ B) --> ~(A & B)
4340 // The swap above should always make Op0 the 'not'.
4341 if ((Op0->hasOneUse() || Op1->hasOneUse()) &&
4342 (match(Op0, m_Not(m_Specific(A))) || match(Op0, m_Not(m_Specific(B)))))
4343 return BinaryOperator::CreateNot(Builder.CreateAnd(A, B));
4344
4345 // Same as above, but peek through an 'and' to the common operand:
4346 // ~(A & ?) | (A ^ B) --> ~((A & ?) & B)
4347 // ~(B & ?) | (A ^ B) --> ~((B & ?) & A)
4349 if ((Op0->hasOneUse() || Op1->hasOneUse()) &&
4350 match(Op0,
4352 return BinaryOperator::CreateNot(Builder.CreateAnd(And, B));
4353 if ((Op0->hasOneUse() || Op1->hasOneUse()) &&
4354 match(Op0,
4356 return BinaryOperator::CreateNot(Builder.CreateAnd(And, A));
4357
4358 // (~A | C) | (A ^ B) --> ~(A & B) | C
4359 // (~B | C) | (A ^ B) --> ~(A & B) | C
4360 if (Op0->hasOneUse() && Op1->hasOneUse() &&
4361 (match(Op0, m_c_Or(m_Not(m_Specific(A)), m_Value(C))) ||
4362 match(Op0, m_c_Or(m_Not(m_Specific(B)), m_Value(C))))) {
4363 Value *Nand = Builder.CreateNot(Builder.CreateAnd(A, B), "nand");
4364 return BinaryOperator::CreateOr(Nand, C);
4365 }
4366 }
4367
4368 if (SwappedForXor)
4369 std::swap(Op0, Op1);
4370
4371 if (Value *Res =
4372 foldBooleanAndOr(Op0, Op1, I, /*IsAnd=*/false, /*IsLogical=*/false))
4373 return replaceInstUsesWith(I, Res);
4374
4375 if (match(Op1, m_OneUse(m_LogicalOr(m_Value(X), m_Value(Y))))) {
4376 bool IsLogical = isa<SelectInst>(Op1);
4377 if (auto *V = reassociateBooleanAndOr(Op0, X, Y, I, /*IsAnd=*/false,
4378 /*RHSIsLogical=*/IsLogical))
4379 return replaceInstUsesWith(I, V);
4380 }
4381 if (match(Op0, m_OneUse(m_LogicalOr(m_Value(X), m_Value(Y))))) {
4382 bool IsLogical = isa<SelectInst>(Op0);
4383 if (auto *V = reassociateBooleanAndOr(Op1, X, Y, I, /*IsAnd=*/false,
4384 /*RHSIsLogical=*/IsLogical))
4385 return replaceInstUsesWith(I, V);
4386 }
4387
4388 if (Instruction *FoldedFCmps = reassociateFCmps(I, Builder))
4389 return FoldedFCmps;
4390
4391 if (Instruction *CastedOr = foldCastedBitwiseLogic(I))
4392 return CastedOr;
4393
4394 if (Instruction *Sel = foldBinopOfSextBoolToSelect(I))
4395 return Sel;
4396
4397 // or(sext(A), B) / or(B, sext(A)) --> A ? -1 : B, where A is i1 or <N x i1>.
4398 // TODO: Move this into foldBinopOfSextBoolToSelect as a more generalized fold
4399 // with binop identity constant. But creating a select with non-constant
4400 // arm may not be reversible due to poison semantics. Is that a good
4401 // canonicalization?
4402 if (match(&I, m_c_Or(m_OneUse(m_SExt(m_Value(A))), m_Value(B))) &&
4403 A->getType()->isIntOrIntVectorTy(1))
4404 return createSelectInstWithUnknownProfile(
4406
4407 // Note: If we've gotten to the point of visiting the outer OR, then the
4408 // inner one couldn't be simplified. If it was a constant, then it won't
4409 // be simplified by a later pass either, so we try swapping the inner/outer
4410 // ORs in the hopes that we'll be able to simplify it this way.
4411 // (X|C) | V --> (X|V) | C
4412 // Pass the disjoint flag in the following two patterns:
4413 // 1. or-disjoint (or-disjoint X, C), V -->
4414 // or-disjoint (or-disjoint X, V), C
4415 //
4416 // 2. or-disjoint (or X, C), V -->
4417 // or (or-disjoint X, V), C
4418 ConstantInt *CI;
4419 if (Op0->hasOneUse() && !match(Op1, m_ConstantInt()) &&
4420 match(Op0, m_Or(m_Value(A), m_ConstantInt(CI)))) {
4421 bool IsDisjointOuter = cast<PossiblyDisjointInst>(I).isDisjoint();
4422 bool IsDisjointInner = cast<PossiblyDisjointInst>(Op0)->isDisjoint();
4423 Value *Inner = Builder.CreateOr(A, Op1);
4424 cast<PossiblyDisjointInst>(Inner)->setIsDisjoint(IsDisjointOuter);
4425 Inner->takeName(Op0);
4426 return IsDisjointOuter && IsDisjointInner
4427 ? BinaryOperator::CreateDisjointOr(Inner, CI)
4428 : BinaryOperator::CreateOr(Inner, CI);
4429 }
4430
4431 // Change (or (bool?A:B),(bool?C:D)) --> (bool?(or A,C):(or B,D))
4432 // Since this OR statement hasn't been optimized further yet, we hope
4433 // that this transformation will allow the new ORs to be optimized.
4434 {
4435 Value *X = nullptr, *Y = nullptr;
4436 if (Op0->hasOneUse() && Op1->hasOneUse() &&
4437 match(Op0, m_Select(m_Value(X), m_Value(A), m_Value(B))) &&
4438 match(Op1, m_Select(m_Value(Y), m_Value(C), m_Value(D))) && X == Y) {
4439 Value *orTrue = Builder.CreateOr(A, C);
4440 Value *orFalse = Builder.CreateOr(B, D);
4441 return SelectInst::Create(X, orTrue, orFalse);
4442 }
4443 }
4444
4445 // or(ashr(subNSW(Y, X), ScalarSizeInBits(Y) - 1), X) --> X s> Y ? -1 : X.
4446 {
4447 Value *X, *Y;
4450 m_SpecificInt(Ty->getScalarSizeInBits() - 1))),
4451 m_Deferred(X)))) {
4452 Value *NewICmpInst = Builder.CreateICmpSGT(X, Y);
4454 return createSelectInstWithUnknownProfile(NewICmpInst, AllOnes, X);
4455 }
4456 }
4457
4458 {
4459 // ((A & B) ^ A) | ((A & B) ^ B) -> A ^ B
4460 // (A ^ (A & B)) | (B ^ (A & B)) -> A ^ B
4461 // ((A & B) ^ B) | ((A & B) ^ A) -> A ^ B
4462 // (B ^ (A & B)) | (A ^ (A & B)) -> A ^ B
4463 const auto TryXorOpt = [&](Value *Lhs, Value *Rhs) -> Instruction * {
4464 if (match(Lhs, m_c_Xor(m_And(m_Value(A), m_Value(B)), m_Deferred(A))) &&
4465 match(Rhs,
4467 return BinaryOperator::CreateXor(A, B);
4468 }
4469 return nullptr;
4470 };
4471
4472 if (Instruction *Result = TryXorOpt(Op0, Op1))
4473 return Result;
4474 if (Instruction *Result = TryXorOpt(Op1, Op0))
4475 return Result;
4476 }
4477
4478 if (Instruction *V =
4480 return V;
4481
4482 CmpPredicate Pred;
4483 Value *Mul, *Ov, *MulIsNotZero, *UMulWithOv;
4484 // Check if the OR weakens the overflow condition for umul.with.overflow by
4485 // treating any non-zero result as overflow. In that case, we overflow if both
4486 // umul.with.overflow operands are != 0, as in that case the result can only
4487 // be 0, iff the multiplication overflows.
4488 if (match(&I, m_c_Or(m_Value(Ov, m_ExtractValue<1>(m_Value(UMulWithOv))),
4489 m_Value(MulIsNotZero,
4493 m_Deferred(UMulWithOv))),
4494 m_ZeroInt())))) &&
4495 (Ov->hasOneUse() || (MulIsNotZero->hasOneUse() && Mul->hasOneUse()))) {
4496 Value *A, *B;
4498 m_Value(A), m_Value(B)))) {
4499 Value *NotNullA = Builder.CreateIsNotNull(A);
4500 Value *NotNullB = Builder.CreateIsNotNull(B);
4501 return BinaryOperator::CreateAnd(NotNullA, NotNullB);
4502 }
4503 }
4504
4505 /// Res, Overflow = xxx_with_overflow X, C1
4506 /// Try to canonicalize the pattern "Overflow | icmp pred Res, C2" into
4507 /// "Overflow | icmp pred X, C2 +/- C1".
4508 const WithOverflowInst *WO;
4509 const Value *WOV;
4510 const APInt *C1, *C2;
4512 m_Value(WOV, m_WithOverflowInst(WO)))),
4514 m_APInt(C2))))) &&
4515 (WO->getBinaryOp() == Instruction::Add ||
4516 WO->getBinaryOp() == Instruction::Sub) &&
4517 (ICmpInst::isEquality(Pred) ||
4518 WO->isSigned() == ICmpInst::isSigned(Pred)) &&
4519 match(WO->getRHS(), m_APInt(C1))) {
4520 bool Overflow;
4521 APInt NewC = WO->getBinaryOp() == Instruction::Add
4522 ? (ICmpInst::isSigned(Pred) ? C2->ssub_ov(*C1, Overflow)
4523 : C2->usub_ov(*C1, Overflow))
4524 : (ICmpInst::isSigned(Pred) ? C2->sadd_ov(*C1, Overflow)
4525 : C2->uadd_ov(*C1, Overflow));
4526 if (!Overflow || ICmpInst::isEquality(Pred)) {
4527 Value *NewCmp = Builder.CreateICmp(
4528 Pred, WO->getLHS(), ConstantInt::get(WO->getLHS()->getType(), NewC));
4529 return BinaryOperator::CreateOr(Ov, NewCmp);
4530 }
4531 }
4532
4533 // Try to fold the pattern "Overflow | icmp pred Res, C2" into a single
4534 // comparison instruction for umul.with.overflow.
4536 return replaceInstUsesWith(I, R);
4537
4538 // (~x) | y --> ~(x & (~y)) iff that gets rid of inversions
4540 return &I;
4541
4542 // Improve "get low bit mask up to and including bit X" pattern:
4543 // (1 << X) | ((1 << X) + -1) --> -1 l>> (bitwidth(x) - 1 - X)
4544 if (match(&I, m_c_Or(m_Add(m_Shl(m_One(), m_Value(X)), m_AllOnes()),
4545 m_Shl(m_One(), m_Deferred(X)))) &&
4546 match(&I, m_c_Or(m_OneUse(m_Value()), m_Value()))) {
4547 Value *Sub = Builder.CreateSub(
4548 ConstantInt::get(Ty, Ty->getScalarSizeInBits() - 1), X);
4549 return BinaryOperator::CreateLShr(Constant::getAllOnesValue(Ty), Sub);
4550 }
4551
4552 // An or recurrence w/loop invariant step is equivelent to (or start, step)
4553 PHINode *PN = nullptr;
4554 Value *Start = nullptr, *Step = nullptr;
4555 if (matchSimpleRecurrence(&I, PN, Start, Step) && DT.dominates(Step, PN))
4556 return replaceInstUsesWith(I, Builder.CreateOr(Start, Step));
4557
4558 // (A & B) | (C | D) or (C | D) | (A & B)
4559 // Can be combined if C or D is of type (A/B & X)
4561 m_OneUse(m_Or(m_Value(C), m_Value(D)))))) {
4562 // (A & B) | (C | ?) -> C | (? | (A & B))
4563 // (A & B) | (C | ?) -> C | (? | (A & B))
4564 // (A & B) | (C | ?) -> C | (? | (A & B))
4565 // (A & B) | (C | ?) -> C | (? | (A & B))
4566 // (C | ?) | (A & B) -> C | (? | (A & B))
4567 // (C | ?) | (A & B) -> C | (? | (A & B))
4568 // (C | ?) | (A & B) -> C | (? | (A & B))
4569 // (C | ?) | (A & B) -> C | (? | (A & B))
4570 if (match(D, m_OneUse(m_c_And(m_Specific(A), m_Value()))) ||
4572 return BinaryOperator::CreateOr(
4573 C, Builder.CreateOr(D, Builder.CreateAnd(A, B)));
4574 // (A & B) | (? | D) -> (? | (A & B)) | D
4575 // (A & B) | (? | D) -> (? | (A & B)) | D
4576 // (A & B) | (? | D) -> (? | (A & B)) | D
4577 // (A & B) | (? | D) -> (? | (A & B)) | D
4578 // (? | D) | (A & B) -> (? | (A & B)) | D
4579 // (? | D) | (A & B) -> (? | (A & B)) | D
4580 // (? | D) | (A & B) -> (? | (A & B)) | D
4581 // (? | D) | (A & B) -> (? | (A & B)) | D
4582 if (match(C, m_OneUse(m_c_And(m_Specific(A), m_Value()))) ||
4584 return BinaryOperator::CreateOr(
4585 Builder.CreateOr(C, Builder.CreateAnd(A, B)), D);
4586 }
4587
4589 return R;
4590
4591 if (Instruction *Canonicalized = canonicalizeLogicFirst(I, Builder))
4592 return Canonicalized;
4593
4594 if (Instruction *Folded = foldLogicOfIsFPClass(I, Op0, Op1))
4595 return Folded;
4596
4597 if (Instruction *Res = foldBinOpOfDisplacedShifts(I))
4598 return Res;
4599
4600 // If we are setting the sign bit of a floating-point value, convert
4601 // this to fneg(fabs), then cast back to integer.
4602 //
4603 // If the result isn't immediately cast back to a float, this will increase
4604 // the number of instructions. This is still probably a better canonical form
4605 // as it enables FP value tracking.
4606 //
4607 // Assumes any IEEE-represented type has the sign bit in the high bit.
4608 //
4609 // This is generous interpretation of noimplicitfloat, this is not a true
4610 // floating-point operation.
4611 Value *CastOp;
4612 if (match(Op0, m_ElementWiseBitCast(m_Value(CastOp))) &&
4613 match(Op1, m_SignMask()) &&
4614 !Builder.GetInsertBlock()->getParent()->hasFnAttribute(
4615 Attribute::NoImplicitFloat)) {
4616 Type *EltTy = CastOp->getType()->getScalarType();
4617 if (EltTy->isFloatingPointTy() &&
4619 Value *FAbs = Builder.CreateUnaryIntrinsic(Intrinsic::fabs, CastOp);
4620 Value *FNegFAbs = Builder.CreateFNeg(FAbs);
4621 return new BitCastInst(FNegFAbs, I.getType());
4622 }
4623 }
4624
4625 // (X & C1) | C2 -> X & (C1 | C2) iff (X & C2) == C2
4626 if (match(Op0, m_OneUse(m_And(m_Value(X), m_APInt(C1)))) &&
4627 match(Op1, m_APInt(C2))) {
4628 KnownBits KnownX = computeKnownBits(X, &I);
4629 if ((KnownX.One & *C2) == *C2)
4630 return BinaryOperator::CreateAnd(X, ConstantInt::get(Ty, *C1 | *C2));
4631 }
4632
4634 return Res;
4635
4636 if (Value *V =
4638 /*SimplifyOnly*/ false, *this))
4639 return BinaryOperator::CreateOr(V, Op1);
4640 if (Value *V =
4642 /*SimplifyOnly*/ false, *this))
4643 return BinaryOperator::CreateOr(Op0, V);
4644
4645 if (cast<PossiblyDisjointInst>(I).isDisjoint())
4647 return replaceInstUsesWith(I, V);
4648
4650 return replaceInstUsesWith(I, Res);
4651
4652 return nullptr;
4653}
4654
4655/// A ^ B can be specified using other logic ops in a variety of patterns. We
4656/// can fold these early and efficiently by morphing an existing instruction.
4658 InstCombiner::BuilderTy &Builder) {
4659 assert(I.getOpcode() == Instruction::Xor);
4660 Value *Op0 = I.getOperand(0);
4661 Value *Op1 = I.getOperand(1);
4662 Value *A, *B;
4663
4664 // There are 4 commuted variants for each of the basic patterns.
4665
4666 // (A & B) ^ (A | B) -> A ^ B
4667 // (A & B) ^ (B | A) -> A ^ B
4668 // (A | B) ^ (A & B) -> A ^ B
4669 // (A | B) ^ (B & A) -> A ^ B
4670 if (match(&I, m_c_Xor(m_And(m_Value(A), m_Value(B)),
4672 return BinaryOperator::CreateXor(A, B);
4673
4674 // (A | ~B) ^ (~A | B) -> A ^ B
4675 // (~B | A) ^ (~A | B) -> A ^ B
4676 // (~A | B) ^ (A | ~B) -> A ^ B
4677 // (B | ~A) ^ (A | ~B) -> A ^ B
4678 if (match(&I, m_Xor(m_c_Or(m_Value(A), m_Not(m_Value(B))),
4680 return BinaryOperator::CreateXor(A, B);
4681
4682 // (A & ~B) ^ (~A & B) -> A ^ B
4683 // (~B & A) ^ (~A & B) -> A ^ B
4684 // (~A & B) ^ (A & ~B) -> A ^ B
4685 // (B & ~A) ^ (A & ~B) -> A ^ B
4686 if (match(&I, m_Xor(m_c_And(m_Value(A), m_Not(m_Value(B))),
4688 return BinaryOperator::CreateXor(A, B);
4689
4690 // For the remaining cases we need to get rid of one of the operands.
4691 if (!Op0->hasOneUse() && !Op1->hasOneUse())
4692 return nullptr;
4693
4694 // (A | B) ^ ~(A & B) -> ~(A ^ B)
4695 // (A | B) ^ ~(B & A) -> ~(A ^ B)
4696 // (A & B) ^ ~(A | B) -> ~(A ^ B)
4697 // (A & B) ^ ~(B | A) -> ~(A ^ B)
4698 // Complexity sorting ensures the not will be on the right side.
4699 if ((match(Op0, m_Or(m_Value(A), m_Value(B))) &&
4700 match(Op1, m_Not(m_c_And(m_Specific(A), m_Specific(B))))) ||
4701 (match(Op0, m_And(m_Value(A), m_Value(B))) &&
4703 return BinaryOperator::CreateNot(Builder.CreateXor(A, B));
4704
4705 return nullptr;
4706}
4707
4708Value *InstCombinerImpl::foldXorOfICmps(ICmpInst *LHS, ICmpInst *RHS,
4709 BinaryOperator &I) {
4710 assert(I.getOpcode() == Instruction::Xor && I.getOperand(0) == LHS &&
4711 I.getOperand(1) == RHS && "Should be 'xor' with these operands");
4712
4713 ICmpInst::Predicate PredL = LHS->getPredicate(), PredR = RHS->getPredicate();
4714 Value *LHS0 = LHS->getOperand(0), *LHS1 = LHS->getOperand(1);
4715 Value *RHS0 = RHS->getOperand(0), *RHS1 = RHS->getOperand(1);
4716
4717 if (predicatesFoldable(PredL, PredR)) {
4718 if (LHS0 == RHS1 && LHS1 == RHS0) {
4719 std::swap(LHS0, LHS1);
4720 PredL = ICmpInst::getSwappedPredicate(PredL);
4721 }
4722 if (LHS0 == RHS0 && LHS1 == RHS1) {
4723 // (icmp1 A, B) ^ (icmp2 A, B) --> (icmp3 A, B)
4724 unsigned Code = getICmpCode(PredL) ^ getICmpCode(PredR);
4725 bool IsSigned = LHS->isSigned() || RHS->isSigned();
4726 return getNewICmpValue(Code, IsSigned, LHS0, LHS1, Builder);
4727 }
4728 }
4729
4730 const APInt *LC, *RC;
4731 if (match(LHS1, m_APInt(LC)) && match(RHS1, m_APInt(RC)) &&
4732 LHS0->getType() == RHS0->getType() &&
4733 LHS0->getType()->isIntOrIntVectorTy()) {
4734 // Convert xor of signbit tests to signbit test of xor'd values:
4735 // (X > -1) ^ (Y > -1) --> (X ^ Y) < 0
4736 // (X < 0) ^ (Y < 0) --> (X ^ Y) < 0
4737 // (X > -1) ^ (Y < 0) --> (X ^ Y) > -1
4738 // (X < 0) ^ (Y > -1) --> (X ^ Y) > -1
4739 bool TrueIfSignedL, TrueIfSignedR;
4740 if ((LHS->hasOneUse() || RHS->hasOneUse()) &&
4741 isSignBitCheck(PredL, *LC, TrueIfSignedL) &&
4742 isSignBitCheck(PredR, *RC, TrueIfSignedR)) {
4743 Value *XorLR = Builder.CreateXor(LHS0, RHS0);
4744 return TrueIfSignedL == TrueIfSignedR ? Builder.CreateIsNeg(XorLR) :
4745 Builder.CreateIsNotNeg(XorLR);
4746 }
4747
4748 // Fold (icmp pred1 X, C1) ^ (icmp pred2 X, C2)
4749 // into a single comparison using range-based reasoning.
4750 if (LHS0 == RHS0) {
4751 ConstantRange CR1 = ConstantRange::makeExactICmpRegion(PredL, *LC);
4752 ConstantRange CR2 = ConstantRange::makeExactICmpRegion(PredR, *RC);
4753 auto CRUnion = CR1.exactUnionWith(CR2);
4754 auto CRIntersect = CR1.exactIntersectWith(CR2);
4755 if (CRUnion && CRIntersect)
4756 if (auto CR = CRUnion->exactIntersectWith(CRIntersect->inverse())) {
4757 if (CR->isFullSet())
4758 return ConstantInt::getTrue(I.getType());
4759 if (CR->isEmptySet())
4760 return ConstantInt::getFalse(I.getType());
4761
4762 CmpInst::Predicate NewPred;
4763 APInt NewC, Offset;
4764 CR->getEquivalentICmp(NewPred, NewC, Offset);
4765
4766 if ((Offset.isZero() && (LHS->hasOneUse() || RHS->hasOneUse())) ||
4767 (LHS->hasOneUse() && RHS->hasOneUse())) {
4768 Value *NewV = LHS0;
4769 Type *Ty = LHS0->getType();
4770 if (!Offset.isZero())
4771 NewV = Builder.CreateAdd(NewV, ConstantInt::get(Ty, Offset));
4772 return Builder.CreateICmp(NewPred, NewV,
4773 ConstantInt::get(Ty, NewC));
4774 }
4775 }
4776 }
4777
4778 // Fold (icmp eq/ne (X & Pow2), 0) ^ (icmp eq/ne (Y & Pow2), 0) into
4779 // (icmp eq/ne ((X ^ Y) & Pow2), 0)
4780 Value *X, *Y, *Pow2;
4781 if (ICmpInst::isEquality(PredL) && ICmpInst::isEquality(PredR) &&
4782 LC->isZero() && RC->isZero() && LHS->hasOneUse() && RHS->hasOneUse() &&
4783 match(LHS0, m_And(m_Value(X), m_Value(Pow2))) &&
4784 match(RHS0, m_And(m_Value(Y), m_Specific(Pow2))) &&
4785 isKnownToBeAPowerOfTwo(Pow2, /*OrZero=*/true, &I)) {
4786 Value *Xor = Builder.CreateXor(X, Y);
4787 Value *And = Builder.CreateAnd(Xor, Pow2);
4788 return Builder.CreateICmp(PredL == PredR ? ICmpInst::ICMP_NE
4790 And, ConstantInt::getNullValue(Xor->getType()));
4791 }
4792 }
4793
4794 // Instead of trying to imitate the folds for and/or, decompose this 'xor'
4795 // into those logic ops. That is, try to turn this into an and-of-icmps
4796 // because we have many folds for that pattern.
4797 //
4798 // This is based on a truth table definition of xor:
4799 // X ^ Y --> (X | Y) & !(X & Y)
4800 if (Value *OrICmp = simplifyBinOp(Instruction::Or, LHS, RHS, SQ)) {
4801 // TODO: If OrICmp is true, then the definition of xor simplifies to !(X&Y).
4802 // TODO: If OrICmp is false, the whole thing is false (InstSimplify?).
4803 if (Value *AndICmp = simplifyBinOp(Instruction::And, LHS, RHS, SQ)) {
4804 // TODO: Independently handle cases where the 'and' side is a constant.
4805 ICmpInst *X = nullptr, *Y = nullptr;
4806 if (OrICmp == LHS && AndICmp == RHS) {
4807 // (LHS | RHS) & !(LHS & RHS) --> LHS & !RHS --> X & !Y
4808 X = LHS;
4809 Y = RHS;
4810 }
4811 if (OrICmp == RHS && AndICmp == LHS) {
4812 // !(LHS & RHS) & (LHS | RHS) --> !LHS & RHS --> !Y & X
4813 X = RHS;
4814 Y = LHS;
4815 }
4816 if (X && Y && (Y->hasOneUse() || canFreelyInvertAllUsersOf(Y, &I))) {
4817 // Invert the predicate of 'Y', thus inverting its output.
4818 Y->setPredicate(Y->getInversePredicate());
4819 // So, are there other uses of Y?
4820 if (!Y->hasOneUse()) {
4821 // We need to adapt other uses of Y though. Get a value that matches
4822 // the original value of Y before inversion. While this increases
4823 // immediate instruction count, we have just ensured that all the
4824 // users are freely-invertible, so that 'not' *will* get folded away.
4826 // Set insertion point to right after the Y.
4827 Builder.SetInsertPoint(Y->getParent(), ++(Y->getIterator()));
4828 Value *NotY = Builder.CreateNot(Y, Y->getName() + ".not");
4829 // Replace all uses of Y (excluding the one in NotY!) with NotY.
4830 Worklist.pushUsersToWorkList(*Y);
4831 Y->replaceUsesWithIf(NotY,
4832 [NotY](Use &U) { return U.getUser() != NotY; });
4833 }
4834 // All done.
4835 return Builder.CreateAnd(LHS, RHS);
4836 }
4837 }
4838 }
4839
4840 return nullptr;
4841}
4842
4843/// If we have a masked merge, in the canonical form of:
4844/// (assuming that A only has one use.)
4845/// | A | |B|
4846/// ((x ^ y) & M) ^ y
4847/// | D |
4848/// * If M is inverted:
4849/// | D |
4850/// ((x ^ y) & ~M) ^ y
4851/// We can canonicalize by swapping the final xor operand
4852/// to eliminate the 'not' of the mask.
4853/// ((x ^ y) & M) ^ x
4854/// * If M is a constant, and D has one use, we transform to 'and' / 'or' ops
4855/// because that shortens the dependency chain and improves analysis:
4856/// (x & M) | (y & ~M)
4858 InstCombiner::BuilderTy &Builder) {
4859 Value *B, *X, *D;
4860 Value *M;
4861 if (!match(&I, m_c_Xor(m_Value(B),
4864 m_Value(M))))))
4865 return nullptr;
4866
4867 Value *NotM;
4868 if (match(M, m_Not(m_Value(NotM)))) {
4869 // De-invert the mask and swap the value in B part.
4870 Value *NewA = Builder.CreateAnd(D, NotM);
4871 return BinaryOperator::CreateXor(NewA, X);
4872 }
4873
4874 Constant *C;
4875 if (D->hasOneUse() && match(M, m_Constant(C))) {
4876 // Propagating undef is unsafe. Clamp undef elements to -1.
4877 Type *EltTy = C->getType()->getScalarType();
4879 // Unfold.
4880 Value *LHS = Builder.CreateAnd(X, C);
4881 Value *NotC = Builder.CreateNot(C);
4882 Value *RHS = Builder.CreateAnd(B, NotC);
4883 return BinaryOperator::CreateOr(LHS, RHS);
4884 }
4885
4886 return nullptr;
4887}
4888
4890 InstCombiner::BuilderTy &Builder) {
4891 Value *X, *Y;
4892 // FIXME: one-use check is not needed in general, but currently we are unable
4893 // to fold 'not' into 'icmp', if that 'icmp' has multiple uses. (D35182)
4894 if (!match(&I, m_Not(m_OneUse(m_Xor(m_Value(X), m_Value(Y))))))
4895 return nullptr;
4896
4897 auto hasCommonOperand = [](Value *A, Value *B, Value *C, Value *D) {
4898 return A == C || A == D || B == C || B == D;
4899 };
4900
4901 Value *A, *B, *C, *D;
4902 // Canonicalize ~((A & B) ^ (A | ?)) -> (A & B) | ~(A | ?)
4903 // 4 commuted variants
4904 if (match(X, m_And(m_Value(A), m_Value(B))) &&
4905 match(Y, m_Or(m_Value(C), m_Value(D))) && hasCommonOperand(A, B, C, D)) {
4906 Value *NotY = Builder.CreateNot(Y);
4907 return BinaryOperator::CreateOr(X, NotY);
4908 };
4909
4910 // Canonicalize ~((A | ?) ^ (A & B)) -> (A & B) | ~(A | ?)
4911 // 4 commuted variants
4912 if (match(Y, m_And(m_Value(A), m_Value(B))) &&
4913 match(X, m_Or(m_Value(C), m_Value(D))) && hasCommonOperand(A, B, C, D)) {
4914 Value *NotX = Builder.CreateNot(X);
4915 return BinaryOperator::CreateOr(Y, NotX);
4916 };
4917
4918 return nullptr;
4919}
4920
4921/// Canonicalize a shifty way to code absolute value to the more common pattern
4922/// that uses negation and select.
4924 InstCombiner::BuilderTy &Builder) {
4925 assert(Xor.getOpcode() == Instruction::Xor && "Expected an xor instruction.");
4926
4927 // There are 4 potential commuted variants. Move the 'ashr' candidate to Op1.
4928 // We're relying on the fact that we only do this transform when the shift has
4929 // exactly 2 uses and the add has exactly 1 use (otherwise, we might increase
4930 // instructions).
4931 Value *Op0 = Xor.getOperand(0), *Op1 = Xor.getOperand(1);
4932 if (Op0->hasNUses(2))
4933 std::swap(Op0, Op1);
4934
4935 Type *Ty = Xor.getType();
4936 Value *A;
4937 const APInt *ShAmt;
4938 if (match(Op1, m_AShr(m_Value(A), m_APInt(ShAmt))) &&
4939 Op1->hasNUses(2) && *ShAmt == Ty->getScalarSizeInBits() - 1 &&
4940 match(Op0, m_OneUse(m_c_Add(m_Specific(A), m_Specific(Op1))))) {
4941 // Op1 = ashr i32 A, 31 ; smear the sign bit
4942 // xor (add A, Op1), Op1 ; add -1 and flip bits if negative
4943 // --> (A < 0) ? -A : A
4944 Value *IsNeg = Builder.CreateIsNeg(A);
4945 // Copy the nsw flags from the add to the negate.
4946 auto *Add = cast<BinaryOperator>(Op0);
4947 Value *NegA = Add->hasNoUnsignedWrap()
4948 ? Constant::getNullValue(A->getType())
4949 : Builder.CreateNeg(A, "", Add->hasNoSignedWrap());
4950 return SelectInst::Create(IsNeg, NegA, A);
4951 }
4952 return nullptr;
4953}
4954
4956 Instruction *IgnoredUser) {
4957 auto *I = dyn_cast<Instruction>(Op);
4958 return I && IC.isFreeToInvert(I, /*WillInvertAllUses=*/true) &&
4959 IC.canFreelyInvertAllUsersOf(I, IgnoredUser);
4960}
4961
4963 Instruction *IgnoredUser) {
4964 auto *I = cast<Instruction>(Op);
4965 IC.Builder.SetInsertPoint(*I->getInsertionPointAfterDef());
4966 Value *NotOp = IC.Builder.CreateNot(Op, Op->getName() + ".not");
4967 Op->replaceUsesWithIf(NotOp,
4968 [NotOp](Use &U) { return U.getUser() != NotOp; });
4969 IC.freelyInvertAllUsersOf(NotOp, IgnoredUser);
4970 return NotOp;
4971}
4972
4973// Transform
4974// z = ~(x &/| y)
4975// into:
4976// z = ((~x) |/& (~y))
4977// iff both x and y are free to invert and all uses of z can be freely updated.
4979 Value *Op0, *Op1;
4980 if (!match(&I, m_LogicalOp(m_Value(Op0), m_Value(Op1))))
4981 return false;
4982
4983 // If this logic op has not been simplified yet, just bail out and let that
4984 // happen first. Otherwise, the code below may wrongly invert.
4985 if (Op0 == Op1)
4986 return false;
4987
4988 // If one of the operands is a user of the other,
4989 // freelyInvert->freelyInvertAllUsersOf will change the operands of I, which
4990 // may cause miscompilation.
4991 if (match(Op0, m_Not(m_Specific(Op1))) || match(Op1, m_Not(m_Specific(Op0))))
4992 return false;
4993
4994 Instruction::BinaryOps NewOpc =
4995 match(&I, m_LogicalAnd()) ? Instruction::Or : Instruction::And;
4996 bool IsBinaryOp = isa<BinaryOperator>(I);
4997
4998 // Can our users be adapted?
4999 if (!InstCombiner::canFreelyInvertAllUsersOf(&I, /*IgnoredUser=*/nullptr))
5000 return false;
5001
5002 // And can the operands be adapted?
5003 if (!canFreelyInvert(*this, Op0, &I) || !canFreelyInvert(*this, Op1, &I))
5004 return false;
5005
5006 Op0 = freelyInvert(*this, Op0, &I);
5007 Op1 = freelyInvert(*this, Op1, &I);
5008
5009 Builder.SetInsertPoint(*I.getInsertionPointAfterDef());
5010 Value *NewLogicOp;
5011 if (IsBinaryOp) {
5012 NewLogicOp = Builder.CreateBinOp(NewOpc, Op0, Op1, I.getName() + ".not");
5013 } else {
5014 NewLogicOp =
5015 Builder.CreateLogicalOp(NewOpc, Op0, Op1, I.getName() + ".not",
5016 ProfcheckDisableMetadataFixes ? nullptr : &I);
5017 if (SelectInst *SI = dyn_cast<SelectInst>(NewLogicOp))
5018 SI->swapProfMetadata();
5019 }
5020
5021 replaceInstUsesWith(I, NewLogicOp);
5022 // We can not just create an outer `not`, it will most likely be immediately
5023 // folded back, reconstructing our initial pattern, and causing an
5024 // infinite combine loop, so immediately manually fold it away.
5025 freelyInvertAllUsersOf(NewLogicOp);
5026 return true;
5027}
5028
5029// Transform
5030// z = (~x) &/| y
5031// into:
5032// z = ~(x |/& (~y))
5033// iff y is free to invert and all uses of z can be freely updated.
5035 Value *Op0, *Op1;
5036 if (!match(&I, m_LogicalOp(m_Value(Op0), m_Value(Op1))))
5037 return false;
5038 Instruction::BinaryOps NewOpc =
5039 match(&I, m_LogicalAnd()) ? Instruction::Or : Instruction::And;
5040 bool IsBinaryOp = isa<BinaryOperator>(I);
5041
5042 Value *NotOp0 = nullptr;
5043 Value *NotOp1 = nullptr;
5044 Value **OpToInvert = nullptr;
5045 if (match(Op0, m_Not(m_Value(NotOp0))) && canFreelyInvert(*this, Op1, &I)) {
5046 Op0 = NotOp0;
5047 OpToInvert = &Op1;
5048 } else if (match(Op1, m_Not(m_Value(NotOp1))) &&
5049 canFreelyInvert(*this, Op0, &I)) {
5050 Op1 = NotOp1;
5051 OpToInvert = &Op0;
5052 } else
5053 return false;
5054
5055 // And can our users be adapted?
5056 if (!InstCombiner::canFreelyInvertAllUsersOf(&I, /*IgnoredUser=*/nullptr))
5057 return false;
5058
5059 *OpToInvert = freelyInvert(*this, *OpToInvert, &I);
5060
5061 Builder.SetInsertPoint(*I.getInsertionPointAfterDef());
5062 Value *NewBinOp;
5063 if (IsBinaryOp)
5064 NewBinOp = Builder.CreateBinOp(NewOpc, Op0, Op1, I.getName() + ".not");
5065 else
5066 NewBinOp = Builder.CreateLogicalOp(NewOpc, Op0, Op1, I.getName() + ".not");
5067 replaceInstUsesWith(I, NewBinOp);
5068 // We can not just create an outer `not`, it will most likely be immediately
5069 // folded back, reconstructing our initial pattern, and causing an
5070 // infinite combine loop, so immediately manually fold it away.
5071 freelyInvertAllUsersOf(NewBinOp);
5072 return true;
5073}
5074
5075Instruction *InstCombinerImpl::foldNot(BinaryOperator &I) {
5076 Value *NotOp;
5077 if (!match(&I, m_Not(m_Value(NotOp))))
5078 return nullptr;
5079
5080 // Apply DeMorgan's Law for 'nand' / 'nor' logic with an inverted operand.
5081 // We must eliminate the and/or (one-use) for these transforms to not increase
5082 // the instruction count.
5083 //
5084 // ~(~X & Y) --> (X | ~Y)
5085 // ~(Y & ~X) --> (X | ~Y)
5086 //
5087 // Note: The logical matches do not check for the commuted patterns because
5088 // those are handled via SimplifySelectsFeedingBinaryOp().
5089 Type *Ty = I.getType();
5090 Value *X, *Y;
5091 if (match(NotOp, m_OneUse(m_c_And(m_Not(m_Value(X)), m_Value(Y))))) {
5092 Value *NotY = Builder.CreateNot(Y, Y->getName() + ".not");
5093 return BinaryOperator::CreateOr(X, NotY);
5094 }
5095 if (match(NotOp, m_OneUse(m_LogicalAnd(m_Not(m_Value(X)), m_Value(Y))))) {
5096 Value *NotY = Builder.CreateNot(Y, Y->getName() + ".not");
5098 X, ConstantInt::getTrue(Ty), NotY, "", nullptr,
5100 SI->swapProfMetadata();
5101 return SI;
5102 }
5103
5104 // ~(~X | Y) --> (X & ~Y)
5105 // ~(Y | ~X) --> (X & ~Y)
5106 if (match(NotOp, m_OneUse(m_c_Or(m_Not(m_Value(X)), m_Value(Y))))) {
5107 Value *NotY = Builder.CreateNot(Y, Y->getName() + ".not");
5108 return BinaryOperator::CreateAnd(X, NotY);
5109 }
5110 if (match(NotOp, m_OneUse(m_LogicalOr(m_Not(m_Value(X)), m_Value(Y))))) {
5111 Value *NotY = Builder.CreateNot(Y, Y->getName() + ".not");
5112 SelectInst *SI = SelectInst::Create(
5113 X, NotY, ConstantInt::getFalse(Ty), "", nullptr,
5115 SI->swapProfMetadata();
5116 return SI;
5117 }
5118
5119 // Is this a 'not' (~) fed by a binary operator?
5120 BinaryOperator *NotVal;
5121 if (match(NotOp, m_BinOp(NotVal))) {
5122 // ~((-X) | Y) --> (X - 1) & (~Y)
5123 if (match(NotVal,
5125 Value *DecX = Builder.CreateAdd(X, ConstantInt::getAllOnesValue(Ty));
5126 Value *NotY = Builder.CreateNot(Y);
5127 return BinaryOperator::CreateAnd(DecX, NotY);
5128 }
5129
5130 // ~(~X >>s Y) --> (X >>s Y)
5131 if (match(NotVal, m_AShr(m_Not(m_Value(X)), m_Value(Y))))
5132 return BinaryOperator::CreateAShr(X, Y);
5133
5134 // Treat lshr with non-negative operand as ashr.
5135 // ~(~X >>u Y) --> (X >>s Y) iff X is known negative
5136 if (match(NotVal, m_LShr(m_Not(m_Value(X)), m_Value(Y))) &&
5137 isKnownNegative(X, SQ.getWithInstruction(NotVal)))
5138 return BinaryOperator::CreateAShr(X, Y);
5139
5140 // Bit-hack form of a signbit test for iN type:
5141 // ~(X >>s (N - 1)) --> sext i1 (X > -1) to iN
5142 unsigned FullShift = Ty->getScalarSizeInBits() - 1;
5143 if (match(NotVal, m_OneUse(m_AShr(m_Value(X), m_SpecificInt(FullShift))))) {
5144 Value *IsNotNeg = Builder.CreateIsNotNeg(X, "isnotneg");
5145 return new SExtInst(IsNotNeg, Ty);
5146 }
5147
5148 // If we are inverting a right-shifted constant, we may be able to eliminate
5149 // the 'not' by inverting the constant and using the opposite shift type.
5150 // Canonicalization rules ensure that only a negative constant uses 'ashr',
5151 // but we must check that in case that transform has not fired yet.
5152
5153 // ~(C >>s Y) --> ~C >>u Y (when inverting the replicated sign bits)
5154 Constant *C;
5155 if (match(NotVal, m_AShr(m_Constant(C), m_Value(Y))) &&
5156 match(C, m_Negative()))
5157 return BinaryOperator::CreateLShr(ConstantExpr::getNot(C), Y);
5158
5159 // ~(C >>u Y) --> ~C >>s Y (when inverting the replicated sign bits)
5160 if (match(NotVal, m_LShr(m_Constant(C), m_Value(Y))) &&
5161 match(C, m_NonNegative()))
5162 return BinaryOperator::CreateAShr(ConstantExpr::getNot(C), Y);
5163
5164 // ~(X + C) --> ~C - X
5165 if (match(NotVal, m_Add(m_Value(X), m_ImmConstant(C))))
5166 return BinaryOperator::CreateSub(ConstantExpr::getNot(C), X);
5167
5168 // ~(X - Y) --> ~X + Y
5169 // FIXME: is it really beneficial to sink the `not` here?
5170 if (match(NotVal, m_Sub(m_Value(X), m_Value(Y))))
5171 if (isa<Constant>(X) || NotVal->hasOneUse())
5172 return BinaryOperator::CreateAdd(Builder.CreateNot(X), Y);
5173
5174 // ~(~X + Y) --> X - Y
5175 if (match(NotVal, m_c_Add(m_Not(m_Value(X)), m_Value(Y))))
5176 return BinaryOperator::CreateWithCopiedFlags(Instruction::Sub, X, Y,
5177 NotVal);
5178 }
5179
5180 // not (cmp A, B) = !cmp A, B
5181 CmpPredicate Pred;
5182 if (match(NotOp, m_Cmp(Pred, m_Value(), m_Value())) &&
5183 (NotOp->hasOneUse() ||
5185 /*IgnoredUser=*/nullptr))) {
5186 cast<CmpInst>(NotOp)->setPredicate(CmpInst::getInversePredicate(Pred));
5188 return &I;
5189 }
5190
5191 // not (bitcast (cmp A, B) --> bitcast (!cmp A, B)
5192 if (match(NotOp, m_OneUse(m_BitCast(m_Value(X)))) &&
5193 match(X, m_OneUse(m_Cmp(Pred, m_Value(), m_Value())))) {
5194 cast<CmpInst>(X)->setPredicate(CmpInst::getInversePredicate(Pred));
5195 return new BitCastInst(X, Ty);
5196 }
5197
5198 // Move a 'not' ahead of casts of a bool to enable logic reduction:
5199 // not (bitcast (sext i1 X)) --> bitcast (sext (not i1 X))
5200 if (match(NotOp, m_OneUse(m_BitCast(m_OneUse(m_SExt(m_Value(X)))))) &&
5201 X->getType()->isIntOrIntVectorTy(1)) {
5202 Type *SextTy = cast<BitCastOperator>(NotOp)->getSrcTy();
5203 Value *NotX = Builder.CreateNot(X);
5204 Value *Sext = Builder.CreateSExt(NotX, SextTy);
5205 return new BitCastInst(Sext, Ty);
5206 }
5207
5208 if (auto *NotOpI = dyn_cast<Instruction>(NotOp))
5209 if (sinkNotIntoLogicalOp(*NotOpI))
5210 return &I;
5211
5212 // Eliminate a bitwise 'not' op of 'not' min/max by inverting the min/max:
5213 // ~min(~X, ~Y) --> max(X, Y)
5214 // ~max(~X, Y) --> min(X, ~Y)
5215 auto *II = dyn_cast<IntrinsicInst>(NotOp);
5216 if (II && II->hasOneUse()) {
5217 if (match(NotOp, m_c_MaxOrMin(m_Not(m_Value(X)), m_Value(Y)))) {
5218 Intrinsic::ID InvID = getInverseMinMaxIntrinsic(II->getIntrinsicID());
5219 Value *NotY = Builder.CreateNot(Y);
5220 Value *InvMaxMin = Builder.CreateBinaryIntrinsic(InvID, X, NotY);
5221 return replaceInstUsesWith(I, InvMaxMin);
5222 }
5223
5224 if (II->getIntrinsicID() == Intrinsic::is_fpclass) {
5225 ConstantInt *ClassMask = cast<ConstantInt>(II->getArgOperand(1));
5226 II->setArgOperand(
5227 1, ConstantInt::get(ClassMask->getType(),
5228 ~ClassMask->getZExtValue() & fcAllFlags));
5229 return replaceInstUsesWith(I, II);
5230 }
5231 }
5232
5233 if (NotOp->hasOneUse()) {
5234 // Pull 'not' into operands of select if both operands are one-use compares
5235 // or one is one-use compare and the other one is a constant.
5236 // Inverting the predicates eliminates the 'not' operation.
5237 // Example:
5238 // not (select ?, (cmp TPred, ?, ?), (cmp FPred, ?, ?) -->
5239 // select ?, (cmp InvTPred, ?, ?), (cmp InvFPred, ?, ?)
5240 // not (select ?, (cmp TPred, ?, ?), true -->
5241 // select ?, (cmp InvTPred, ?, ?), false
5242 if (auto *Sel = dyn_cast<SelectInst>(NotOp)) {
5243 Value *TV = Sel->getTrueValue();
5244 Value *FV = Sel->getFalseValue();
5245 auto *CmpT = dyn_cast<CmpInst>(TV);
5246 auto *CmpF = dyn_cast<CmpInst>(FV);
5247 bool InvertibleT = (CmpT && CmpT->hasOneUse()) || isa<Constant>(TV);
5248 bool InvertibleF = (CmpF && CmpF->hasOneUse()) || isa<Constant>(FV);
5249 if (InvertibleT && InvertibleF) {
5250 if (CmpT)
5251 CmpT->setPredicate(CmpT->getInversePredicate());
5252 else
5253 Sel->setTrueValue(ConstantExpr::getNot(cast<Constant>(TV)));
5254 if (CmpF)
5255 CmpF->setPredicate(CmpF->getInversePredicate());
5256 else
5257 Sel->setFalseValue(ConstantExpr::getNot(cast<Constant>(FV)));
5258 return replaceInstUsesWith(I, Sel);
5259 }
5260 }
5261 }
5262
5263 if (Instruction *NewXor = foldNotXor(I, Builder))
5264 return NewXor;
5265
5266 // TODO: Could handle multi-use better by checking if all uses of NotOp (other
5267 // than I) can be inverted.
5268 if (Value *R = getFreelyInverted(NotOp, NotOp->hasOneUse(), &Builder))
5269 return replaceInstUsesWith(I, R);
5270
5271 return nullptr;
5272}
5273
5274// ((X + C) & M) ^ M --> (~C − X) & M
5276 InstCombiner::BuilderTy &Builder) {
5277 Value *X, *Mask;
5278 Constant *AddC;
5279 BinaryOperator *AddInst;
5280 if (match(&I,
5282 m_BinOp(AddInst),
5283 m_Add(m_Value(X), m_ImmConstant(AddC)))),
5284 m_Value(Mask))),
5285 m_Deferred(Mask)))) {
5286 Value *NotC = Builder.CreateNot(AddC);
5287 Value *NewSub = Builder.CreateSub(NotC, X, "", AddInst->hasNoUnsignedWrap(),
5288 AddInst->hasNoSignedWrap());
5289 return BinaryOperator::CreateAnd(NewSub, Mask);
5290 }
5291
5292 return nullptr;
5293}
5294
5295// FIXME: We use commutative matchers (m_c_*) for some, but not all, matches
5296// here. We should standardize that construct where it is needed or choose some
5297// other way to ensure that commutated variants of patterns are not missed.
5299 if (Value *V = simplifyXorInst(I.getOperand(0), I.getOperand(1),
5300 SQ.getWithInstruction(&I)))
5301 return replaceInstUsesWith(I, V);
5302
5304 return &I;
5305
5307 return X;
5308
5310 return Phi;
5311
5312 if (Instruction *NewXor = foldXorToXor(I, Builder))
5313 return NewXor;
5314
5315 // (A&B)^(A&C) -> A&(B^C) etc
5317 return replaceInstUsesWith(I, V);
5318
5319 // See if we can simplify any instructions used by the instruction whose sole
5320 // purpose is to compute bits we don't care about.
5322 return &I;
5323
5324 if (Instruction *R = foldNot(I))
5325 return R;
5326
5328 return R;
5329
5330 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
5331 Value *X, *Y, *M;
5332
5333 // (X | Y) ^ M -> (X ^ M) ^ Y
5334 // (X | Y) ^ M -> (Y ^ M) ^ X
5336 m_Value(M)))) {
5337 if (Value *XorAC = simplifyXorInst(X, M, SQ.getWithInstruction(&I)))
5338 return BinaryOperator::CreateXor(XorAC, Y);
5339
5340 if (Value *XorBC = simplifyXorInst(Y, M, SQ.getWithInstruction(&I)))
5341 return BinaryOperator::CreateXor(XorBC, X);
5342 }
5343
5344 // Fold (X & M) ^ (Y & ~M) -> (X & M) | (Y & ~M)
5345 // This it a special case in haveNoCommonBitsSet, but the computeKnownBits
5346 // calls in there are unnecessary as SimplifyDemandedInstructionBits should
5347 // have already taken care of those cases.
5348 if (match(&I, m_c_Xor(m_c_And(m_Not(m_Value(M)), m_Value()),
5349 m_c_And(m_Deferred(M), m_Value())))) {
5351 return BinaryOperator::CreateDisjointOr(Op0, Op1);
5352 else
5353 return BinaryOperator::CreateOr(Op0, Op1);
5354 }
5355
5357 return Xor;
5358
5359 Constant *C1;
5360 if (match(Op1, m_Constant(C1))) {
5361 Constant *C2;
5362
5363 if (match(Op0, m_OneUse(m_Or(m_Value(X), m_ImmConstant(C2)))) &&
5364 match(C1, m_ImmConstant())) {
5365 // (X | C2) ^ C1 --> (X & ~C2) ^ (C1^C2)
5368 Value *And = Builder.CreateAnd(
5370 return BinaryOperator::CreateXor(
5372 }
5373
5374 // Use DeMorgan and reassociation to eliminate a 'not' op.
5375 if (match(Op0, m_OneUse(m_Or(m_Not(m_Value(X)), m_Constant(C2))))) {
5376 // (~X | C2) ^ C1 --> ((X & ~C2) ^ -1) ^ C1 --> (X & ~C2) ^ ~C1
5377 Value *And = Builder.CreateAnd(X, ConstantExpr::getNot(C2));
5378 return BinaryOperator::CreateXor(And, ConstantExpr::getNot(C1));
5379 }
5380 if (match(Op0, m_OneUse(m_And(m_Not(m_Value(X)), m_Constant(C2))))) {
5381 // (~X & C2) ^ C1 --> ((X | ~C2) ^ -1) ^ C1 --> (X | ~C2) ^ ~C1
5382 Value *Or = Builder.CreateOr(X, ConstantExpr::getNot(C2));
5383 return BinaryOperator::CreateXor(Or, ConstantExpr::getNot(C1));
5384 }
5385
5386 // Convert xor ([trunc] (ashr X, BW-1)), C =>
5387 // select(X >s -1, C, ~C)
5388 // The ashr creates "AllZeroOrAllOne's", which then optionally inverses the
5389 // constant depending on whether this input is less than 0.
5390 const APInt *CA;
5391 if (match(Op0, m_OneUse(m_TruncOrSelf(
5392 m_AShr(m_Value(X), m_APIntAllowPoison(CA))))) &&
5393 *CA == X->getType()->getScalarSizeInBits() - 1 &&
5394 !match(C1, m_AllOnes())) {
5395 assert(!C1->isNullValue() && "Unexpected xor with 0");
5396 Value *IsNotNeg = Builder.CreateIsNotNeg(X);
5397 return createSelectInstWithUnknownProfile(IsNotNeg, Op1,
5398 Builder.CreateNot(Op1));
5399 }
5400 }
5401
5402 Type *Ty = I.getType();
5403 {
5404 const APInt *RHSC;
5405 if (match(Op1, m_APInt(RHSC))) {
5406 Value *X;
5407 const APInt *C;
5408 // (C - X) ^ signmaskC --> (C + signmaskC) - X
5409 if (RHSC->isSignMask() && match(Op0, m_Sub(m_APInt(C), m_Value(X))))
5410 return BinaryOperator::CreateSub(ConstantInt::get(Ty, *C + *RHSC), X);
5411
5412 // (X + C) ^ signmaskC --> X + (C + signmaskC)
5413 if (RHSC->isSignMask() && match(Op0, m_Add(m_Value(X), m_APInt(C))))
5414 return BinaryOperator::CreateAdd(X, ConstantInt::get(Ty, *C + *RHSC));
5415
5416 // (X | C) ^ RHSC --> X ^ (C ^ RHSC) iff X & C == 0
5417 if (match(Op0, m_Or(m_Value(X), m_APInt(C))) &&
5418 MaskedValueIsZero(X, *C, &I))
5419 return BinaryOperator::CreateXor(X, ConstantInt::get(Ty, *C ^ *RHSC));
5420
5421 // When X is a power-of-two or zero and zero input is poison:
5422 // ctlz(i32 X) ^ 31 --> cttz(X)
5423 // cttz(i32 X) ^ 31 --> ctlz(X)
5424 auto *II = dyn_cast<IntrinsicInst>(Op0);
5425 if (II && II->hasOneUse() && *RHSC == Ty->getScalarSizeInBits() - 1) {
5426 Intrinsic::ID IID = II->getIntrinsicID();
5427 if ((IID == Intrinsic::ctlz || IID == Intrinsic::cttz) &&
5428 match(II->getArgOperand(1), m_One()) &&
5429 isKnownToBeAPowerOfTwo(II->getArgOperand(0), /*OrZero */ true)) {
5430 IID = (IID == Intrinsic::ctlz) ? Intrinsic::cttz : Intrinsic::ctlz;
5431 Function *F =
5432 Intrinsic::getOrInsertDeclaration(II->getModule(), IID, Ty);
5433 return CallInst::Create(F, {II->getArgOperand(0), Builder.getTrue()});
5434 }
5435 }
5436
5437 // If RHSC is inverting the remaining bits of shifted X,
5438 // canonicalize to a 'not' before the shift to help SCEV and codegen:
5439 // (X << C) ^ RHSC --> ~X << C
5440 if (match(Op0, m_OneUse(m_Shl(m_Value(X), m_APInt(C)))) &&
5441 *RHSC == APInt::getAllOnes(Ty->getScalarSizeInBits()).shl(*C)) {
5442 Value *NotX = Builder.CreateNot(X);
5443 return BinaryOperator::CreateShl(NotX, ConstantInt::get(Ty, *C));
5444 }
5445 // (X >>u C) ^ RHSC --> ~X >>u C
5446 if (match(Op0, m_OneUse(m_LShr(m_Value(X), m_APInt(C)))) &&
5447 *RHSC == APInt::getAllOnes(Ty->getScalarSizeInBits()).lshr(*C)) {
5448 Value *NotX = Builder.CreateNot(X);
5449 return BinaryOperator::CreateLShr(NotX, ConstantInt::get(Ty, *C));
5450 }
5451 // TODO: We could handle 'ashr' here as well. That would be matching
5452 // a 'not' op and moving it before the shift. Doing that requires
5453 // preventing the inverse fold in canShiftBinOpWithConstantRHS().
5454 }
5455
5456 // If we are XORing the sign bit of a floating-point value, convert
5457 // this to fneg, then cast back to integer.
5458 //
5459 // This is generous interpretation of noimplicitfloat, this is not a true
5460 // floating-point operation.
5461 //
5462 // Assumes any IEEE-represented type has the sign bit in the high bit.
5463 // TODO: Unify with APInt matcher. This version allows undef unlike m_APInt
5464 Value *CastOp;
5465 if (match(Op0, m_ElementWiseBitCast(m_Value(CastOp))) &&
5466 match(Op1, m_SignMask()) &&
5467 !Builder.GetInsertBlock()->getParent()->hasFnAttribute(
5468 Attribute::NoImplicitFloat)) {
5469 Type *EltTy = CastOp->getType()->getScalarType();
5470 if (EltTy->isFloatingPointTy() &&
5472 Value *FNeg = Builder.CreateFNeg(CastOp);
5473 return new BitCastInst(FNeg, I.getType());
5474 }
5475 }
5476 }
5477
5478 // FIXME: This should not be limited to scalar (pull into APInt match above).
5479 {
5480 Value *X;
5481 ConstantInt *C1, *C2, *C3;
5482 // ((X^C1) >> C2) ^ C3 -> (X>>C2) ^ ((C1>>C2)^C3)
5483 if (match(Op1, m_ConstantInt(C3)) &&
5485 m_ConstantInt(C2))) &&
5486 Op0->hasOneUse()) {
5487 // fold (C1 >> C2) ^ C3
5488 APInt FoldConst = C1->getValue().lshr(C2->getValue());
5489 FoldConst ^= C3->getValue();
5490 // Prepare the two operands.
5491 auto *Opnd0 = Builder.CreateLShr(X, C2);
5492 Opnd0->takeName(Op0);
5493 return BinaryOperator::CreateXor(Opnd0, ConstantInt::get(Ty, FoldConst));
5494 }
5495 }
5496
5497 if (Instruction *FoldedLogic = foldBinOpIntoSelectOrPhi(I))
5498 return FoldedLogic;
5499
5500 if (Instruction *FoldedLogic = foldBinOpSelectBinOp(I))
5501 return FoldedLogic;
5502
5503 // Y ^ (X | Y) --> X & ~Y
5504 // Y ^ (Y | X) --> X & ~Y
5505 if (match(Op1, m_OneUse(m_c_Or(m_Value(X), m_Specific(Op0)))))
5506 return BinaryOperator::CreateAnd(X, Builder.CreateNot(Op0));
5507 // (X | Y) ^ Y --> X & ~Y
5508 // (Y | X) ^ Y --> X & ~Y
5509 if (match(Op0, m_OneUse(m_c_Or(m_Value(X), m_Specific(Op1)))))
5510 return BinaryOperator::CreateAnd(X, Builder.CreateNot(Op1));
5511
5512 // Y ^ (X & Y) --> ~X & Y
5513 // Y ^ (Y & X) --> ~X & Y
5514 if (match(Op1, m_OneUse(m_c_And(m_Value(X), m_Specific(Op0)))))
5515 return BinaryOperator::CreateAnd(Op0, Builder.CreateNot(X));
5516 // (X & Y) ^ Y --> ~X & Y
5517 // (Y & X) ^ Y --> ~X & Y
5518 // Canonical form is (X & C) ^ C; don't touch that.
5519 // TODO: A 'not' op is better for analysis and codegen, but demanded bits must
5520 // be fixed to prefer that (otherwise we get infinite looping).
5521 if (!match(Op1, m_Constant()) &&
5522 match(Op0, m_OneUse(m_c_And(m_Value(X), m_Specific(Op1)))))
5523 return BinaryOperator::CreateAnd(Op1, Builder.CreateNot(X));
5524
5525 Value *A, *B, *C;
5526 // (A ^ B) ^ (A | C) --> (~A & C) ^ B -- There are 4 commuted variants.
5529 return BinaryOperator::CreateXor(
5530 Builder.CreateAnd(Builder.CreateNot(A), C), B);
5531
5532 // (A ^ B) ^ (B | C) --> (~B & C) ^ A -- There are 4 commuted variants.
5535 return BinaryOperator::CreateXor(
5536 Builder.CreateAnd(Builder.CreateNot(B), C), A);
5537
5538 // (A & B) ^ (A ^ B) -> (A | B)
5539 if (match(Op0, m_And(m_Value(A), m_Value(B))) &&
5541 return BinaryOperator::CreateOr(A, B);
5542 // (A ^ B) ^ (A & B) -> (A | B)
5543 if (match(Op0, m_Xor(m_Value(A), m_Value(B))) &&
5545 return BinaryOperator::CreateOr(A, B);
5546
5547 // (A & ~B) ^ ~A -> ~(A & B)
5548 // (~B & A) ^ ~A -> ~(A & B)
5549 if (match(Op0, m_c_And(m_Value(A), m_Not(m_Value(B)))) &&
5550 match(Op1, m_Not(m_Specific(A))))
5551 return BinaryOperator::CreateNot(Builder.CreateAnd(A, B));
5552
5553 // (~A & B) ^ A --> A | B -- There are 4 commuted variants.
5555 return BinaryOperator::CreateOr(A, B);
5556
5557 // (~A | B) ^ A --> ~(A & B)
5558 if (match(Op0, m_OneUse(m_c_Or(m_Not(m_Specific(Op1)), m_Value(B)))))
5559 return BinaryOperator::CreateNot(Builder.CreateAnd(Op1, B));
5560
5561 // A ^ (~A | B) --> ~(A & B)
5562 if (match(Op1, m_OneUse(m_c_Or(m_Not(m_Specific(Op0)), m_Value(B)))))
5563 return BinaryOperator::CreateNot(Builder.CreateAnd(Op0, B));
5564
5565 // (A | B) ^ (A | C) --> (B ^ C) & ~A -- There are 4 commuted variants.
5566 // TODO: Loosen one-use restriction if common operand is a constant.
5567 Value *D;
5568 if (match(Op0, m_OneUse(m_Or(m_Value(A), m_Value(B)))) &&
5569 match(Op1, m_OneUse(m_Or(m_Value(C), m_Value(D))))) {
5570 if (B == C || B == D)
5571 std::swap(A, B);
5572 if (A == C)
5573 std::swap(C, D);
5574 if (A == D) {
5575 Value *NotA = Builder.CreateNot(A);
5576 return BinaryOperator::CreateAnd(Builder.CreateXor(B, C), NotA);
5577 }
5578 }
5579
5580 // (A & B) ^ (A | C) --> A ? ~B : C -- There are 4 commuted variants.
5581 if (I.getType()->isIntOrIntVectorTy(1) &&
5584 bool NeedFreeze = isa<SelectInst>(Op0) && isa<SelectInst>(Op1) && B == D;
5585 Instruction *MDFrom = cast<Instruction>(Op0);
5586 if (B == C || B == D) {
5587 std::swap(A, B);
5588 MDFrom = B == C ? cast<Instruction>(Op1) : nullptr;
5589 }
5590 if (A == C)
5591 std::swap(C, D);
5592 if (A == D) {
5593 if (NeedFreeze)
5594 A = Builder.CreateFreeze(A);
5595 Value *NotB = Builder.CreateNot(B);
5596 return MDFrom == nullptr || ProfcheckDisableMetadataFixes
5597 ? createSelectInstWithUnknownProfile(A, NotB, C)
5598 : SelectInst::Create(A, NotB, C, "", nullptr, MDFrom);
5599 }
5600 }
5601
5602 if (auto *LHS = dyn_cast<ICmpInst>(I.getOperand(0)))
5603 if (auto *RHS = dyn_cast<ICmpInst>(I.getOperand(1)))
5604 if (Value *V = foldXorOfICmps(LHS, RHS, I))
5605 return replaceInstUsesWith(I, V);
5606
5607 if (Instruction *CastedXor = foldCastedBitwiseLogic(I))
5608 return CastedXor;
5609
5610 if (Instruction *Abs = canonicalizeAbs(I, Builder))
5611 return Abs;
5612
5613 // Otherwise, if all else failed, try to hoist the xor-by-constant:
5614 // (X ^ C) ^ Y --> (X ^ Y) ^ C
5615 // Just like we do in other places, we completely avoid the fold
5616 // for constantexprs, at least to avoid endless combine loop.
5618 m_ImmConstant(C1))),
5619 m_Value(Y))))
5620 return BinaryOperator::CreateXor(Builder.CreateXor(X, Y), C1);
5621
5623 return R;
5624
5625 if (Instruction *Canonicalized = canonicalizeLogicFirst(I, Builder))
5626 return Canonicalized;
5627
5628 if (Instruction *Folded = foldLogicOfIsFPClass(I, Op0, Op1))
5629 return Folded;
5630
5631 if (Instruction *Folded = canonicalizeConditionalNegationViaMathToSelect(I))
5632 return Folded;
5633
5634 if (Instruction *Res = foldBinOpOfDisplacedShifts(I))
5635 return Res;
5636
5638 return Res;
5639
5641 return Res;
5642
5643 return nullptr;
5644}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
AMDGPU Register Bank Select
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static Value * foldAndOrOfICmpsWithConstEq(ICmpInst *Cmp0, ICmpInst *Cmp1, bool IsAnd, bool IsLogical, InstCombiner::BuilderTy &Builder, const SimplifyQuery &Q, Instruction &I)
Reduce logic-of-compares with equality to a constant by substituting a common operand with the consta...
static Value * foldIsPowerOf2OrZero(ICmpInst *Cmp0, ICmpInst *Cmp1, bool IsAnd, InstCombiner::BuilderTy &Builder, InstCombinerImpl &IC)
Fold (icmp eq ctpop(X) 1) | (icmp eq X 0) into (icmp ult ctpop(X) 2) and fold (icmp ne ctpop(X) 1) & ...
static Value * foldBitmaskMul(Value *Op0, Value *Op1, InstCombiner::BuilderTy &Builder)
(A & N) * C + (A & M) * C -> (A & (N + M)) & C This also accepts the equivalent select form of (A & N...
static unsigned conjugateICmpMask(unsigned Mask)
Convert an analysis of a masked ICmp into its equivalent if all boolean operations had the opposite s...
static Instruction * foldNotXor(BinaryOperator &I, InstCombiner::BuilderTy &Builder)
static Value * foldLogOpOfMaskedICmps(Value *LHS, Value *RHS, bool IsAnd, bool IsLogical, InstCombiner::BuilderTy &Builder, const SimplifyQuery &Q)
Try to fold (icmp(A & B) ==/!= C) &/| (icmp(A & D) ==/!= E) into a single (icmp(A & X) ==/!...
static Value * getFCmpValue(unsigned Code, Value *LHS, Value *RHS, InstCombiner::BuilderTy &Builder, FMFSource FMF)
This is the complement of getFCmpCode, which turns an opcode and two operands into either a FCmp inst...
static bool matchIsFPClassLikeFCmp(Value *Op, Value *&ClassVal, uint64_t &ClassMask)
Match an fcmp against a special value that performs a test possible by llvm.is.fpclass.
static Value * foldSignedTruncationCheck(ICmpInst *ICmp0, ICmpInst *ICmp1, Instruction &CxtI, InstCombiner::BuilderTy &Builder)
General pattern: X & Y.
static Instruction * visitMaskedMerge(BinaryOperator &I, InstCombiner::BuilderTy &Builder)
If we have a masked merge, in the canonical form of: (assuming that A only has one use....
static Instruction * canonicalizeAbs(BinaryOperator &Xor, InstCombiner::BuilderTy &Builder)
Canonicalize a shifty way to code absolute value to the more common pattern that uses negation and se...
static Value * foldIsPowerOf2(ICmpInst *Cmp0, ICmpInst *Cmp1, bool JoinedByAnd, InstCombiner::BuilderTy &Builder, InstCombinerImpl &IC)
Reduce a pair of compares that check if a value has exactly 1 bit set.
static Value * foldUnsignedUnderflowCheck(ICmpInst *ZeroICmp, ICmpInst *UnsignedICmp, bool IsAnd, const SimplifyQuery &Q, InstCombiner::BuilderTy &Builder)
Commuted variants are assumed to be handled by calling this function again with the parameters swappe...
static Instruction * foldOrToXor(BinaryOperator &I, InstCombiner::BuilderTy &Builder)
static Value * simplifyAndOrWithOpReplaced(Value *V, Value *Op, Value *RepOp, bool SimplifyOnly, InstCombinerImpl &IC, unsigned Depth=0)
static Instruction * matchDeMorgansLaws(BinaryOperator &I, InstCombiner &IC)
Match variations of De Morgan's Laws: (~A & ~B) == (~(A | B)) (~A | ~B) == (~(A & B))
static Value * foldLogOpOfMaskedICmpsAsymmetric(Value *LHS, Value *RHS, bool IsAnd, Value *A, Value *B, Value *C, Value *D, Value *E, ICmpInst::Predicate PredL, ICmpInst::Predicate PredR, unsigned LHSMask, unsigned RHSMask, InstCombiner::BuilderTy &Builder)
Try to fold (icmp(A & B) ==/!= 0) &/| (icmp(A & D) ==/!= E) into a single (icmp(A & X) ==/!...
static Value * FoldOrOfSelectSmaxToAbs(BinaryOperator &I, InstCombiner::BuilderTy &Builder)
Fold select(X >s 0, 0, -X) | smax(X, 0) --> abs(X) select(X <s 0, -X, 0) | smax(X,...
static Instruction * foldAndToXor(BinaryOperator &I, InstCombiner::BuilderTy &Builder)
static unsigned getMaskedICmpType(Value *A, Value *B, Value *C, ICmpInst::Predicate Pred)
Return the set of patterns (from MaskedICmpType) that (icmp SCC (A & B), C) satisfies.
static Instruction * foldXorToXor(BinaryOperator &I, InstCombiner::BuilderTy &Builder)
A ^ B can be specified using other logic ops in a variety of patterns.
static bool canNarrowShiftAmt(Constant *C, unsigned BitWidth)
Return true if a constant shift amount is always less than the specified bit-width.
static Instruction * foldLogicCastConstant(BinaryOperator &Logic, CastInst *Cast, InstCombinerImpl &IC)
Fold {and,or,xor} (cast X), C.
static Value * foldAndOrOfICmpEqConstantAndICmp(ICmpInst *LHS, ICmpInst *RHS, bool IsAnd, bool IsLogical, IRBuilderBase &Builder)
static bool canFreelyInvert(InstCombiner &IC, Value *Op, Instruction *IgnoredUser)
static Value * foldNegativePower2AndShiftedMask(Value *A, Value *B, Value *D, Value *E, ICmpInst::Predicate PredL, ICmpInst::Predicate PredR, InstCombiner::BuilderTy &Builder)
Try to fold (icmp(A & B) == 0) & (icmp(A & D) != E) into (icmp A u< D) iff B is a contiguous set of o...
static Value * matchIsFiniteTest(InstCombiner::BuilderTy &Builder, FCmpInst *LHS, FCmpInst *RHS)
and (fcmp ord x, 0), (fcmp u* x, inf) -> fcmp o* x, inf
static Value * foldPowerOf2AndShiftedMask(ICmpInst *Cmp0, ICmpInst *Cmp1, bool JoinedByAnd, InstCombiner::BuilderTy &Builder)
Try to fold ((icmp X u< P) & (icmp(X & M) != M)) or ((icmp X s> -1) & (icmp(X & M) !...
static Value * foldOrUnsignedUMulOverflowICmp(BinaryOperator &I, InstCombiner::BuilderTy &Builder, const DataLayout &DL)
Fold Res, Overflow = (umul.with.overflow x c1); (or Overflow (ugt Res c2)) --> (ugt x (c2/c1)).
static Value * freelyInvert(InstCombinerImpl &IC, Value *Op, Instruction *IgnoredUser)
static Value * foldLogOpOfMaskedICmps_NotAllZeros_BMask_Mixed(Value *LHS, Value *RHS, bool IsAnd, Value *A, Value *B, Value *D, Value *E, ICmpInst::Predicate PredL, ICmpInst::Predicate PredR, InstCombiner::BuilderTy &Builder)
Try to fold (icmp(A & B) ==/!= C) &/| (icmp(A & D) ==/!= E) into a single (icmp(A & X) ==/!...
static std::optional< IntPart > matchIntPart(Value *V)
Match an extraction of bits from an integer.
static Instruction * canonicalizeLogicFirst(BinaryOperator &I, InstCombiner::BuilderTy &Builder)
static Instruction * reassociateFCmps(BinaryOperator &BO, InstCombiner::BuilderTy &Builder)
This a limited reassociation for a special case (see above) where we are checking if two values are e...
static Value * getNewICmpValue(unsigned Code, bool Sign, Value *LHS, Value *RHS, InstCombiner::BuilderTy &Builder)
This is the complement of getICmpCode, which turns an opcode and two operands into either a constant ...
static Value * extractIntPart(const IntPart &P, IRBuilderBase &Builder)
Materialize an extraction of bits from an integer in IR.
static bool matchUnorderedInfCompare(FCmpInst::Predicate P, Value *LHS, Value *RHS)
Matches fcmp u__ x, +/-inf.
static bool matchIsNotNaN(FCmpInst::Predicate P, Value *LHS, Value *RHS)
Matches canonical form of isnan, fcmp ord x, 0.
static bool areInverseVectorBitmasks(Constant *C1, Constant *C2)
If all elements of two constant vectors are 0/-1 and inverses, return true.
MaskedICmpType
Classify (icmp eq (A & B), C) and (icmp ne (A & B), C) as matching patterns that can be simplified.
@ BMask_NotAllOnes
@ AMask_NotAllOnes
@ Mask_NotAllZeros
static Instruction * foldComplexAndOrPatterns(BinaryOperator &I, InstCombiner::BuilderTy &Builder)
Try folding relatively complex patterns for both And and Or operations with all And and Or swapped.
static bool matchZExtedSubInteger(Value *V, Value *&Int, APInt &Mask, uint64_t &Offset, bool &IsShlNUW, bool &IsShlNSW)
Match V as "lshr -> mask -> zext -> shl".
static std::optional< DecomposedBitMaskMul > matchBitmaskMul(Value *V)
static Value * foldOrOfInversions(BinaryOperator &I, InstCombiner::BuilderTy &Builder)
static bool matchSubIntegerPackFromVector(Value *V, Value *&Vec, int64_t &VecOffset, SmallBitVector &Mask, const DataLayout &DL)
Match V as "shufflevector -> bitcast" or "extractelement -> zext -> shl" patterns,...
static Instruction * matchFunnelShift(Instruction &Or, InstCombinerImpl &IC)
Match UB-safe variants of the funnel shift intrinsic.
static Instruction * reassociateForUses(BinaryOperator &BO, InstCombinerImpl::BuilderTy &Builder)
Try to reassociate a pair of binops so that values with one use only are part of the same instruction...
static Value * matchOrConcat(Instruction &Or, InstCombiner::BuilderTy &Builder)
Attempt to combine or(zext(x),shl(zext(y),bw/2) concat packing patterns.
static Value * foldAndOrOfICmpsWithPow2AndWithZero(InstCombiner::BuilderTy &Builder, ICmpInst *LHS, ICmpInst *RHS, bool IsAnd, const SimplifyQuery &Q)
static Instruction * foldMaskedAddXorPattern(BinaryOperator &I, InstCombiner::BuilderTy &Builder)
static Instruction * foldBitwiseLogicWithIntrinsics(BinaryOperator &I, InstCombiner::BuilderTy &Builder)
static std::optional< std::pair< unsigned, unsigned > > getMaskedTypeForICmpPair(Value *&A, Value *&B, Value *&C, Value *&D, Value *&E, Value *LHS, Value *RHS, ICmpInst::Predicate &PredL, ICmpInst::Predicate &PredR)
Handle (icmp(A & B) ==/!= C) &/| (icmp(A & D) ==/!= E).
static Instruction * foldIntegerPackFromVector(Instruction &I, InstCombiner::BuilderTy &Builder, const DataLayout &DL)
Try to fold the join of two scalar integers whose contents are packed elements of the same vector.
static Value * foldIntegerRepackThroughZExt(Value *Lhs, Value *Rhs, InstCombiner::BuilderTy &Builder)
Try to fold the join of two scalar integers whose bits are unpacked and zexted from the same source i...
This file provides internal interfaces used to implement the InstCombine.
This file provides the interface for the instcombine pass implementation.
static bool isZero(Value *V, const DataLayout &DL, DominatorTree *DT, AssumptionCache *AC)
Definition Lint.cpp:539
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
#define R2(n)
uint64_t High
uint64_t IntrinsicInst * II
#define P(N)
const SmallVectorImpl< MachineOperand > & Cond
This file implements the SmallBitVector class.
static unsigned getScalarSizeInBits(Type *Ty)
static TableGen::Emitter::Opt Y("gen-skeleton-entry", EmitSkeleton, "Generate example skeleton entry")
static TableGen::Emitter::OptClass< SkeletonEmitter > X("gen-skeleton-class", "Generate example skeleton class")
static constexpr int Concat[]
Value * RHS
Value * LHS
The Input class is used to parse a yaml document into in-memory structs and vectors.
static LLVM_ABI bool hasSignBitInMSB(const fltSemantics &)
Definition APFloat.cpp:259
bool bitwiseIsEqual(const APFloat &RHS) const
Definition APFloat.h:1477
bool isZero() const
Definition APFloat.h:1508
APInt bitcastToAPInt() const
Definition APFloat.h:1404
static APFloat getInf(const fltSemantics &Sem, bool Negative=false)
Factory for Positive and Negative Infinity.
Definition APFloat.h:1149
Class for arbitrary precision integers.
Definition APInt.h:78
LLVM_ABI APInt udiv(const APInt &RHS) const
Unsigned division operation.
Definition APInt.cpp:1584
static APInt getAllOnes(unsigned numBits)
Return an APInt of a specified width with all bits set.
Definition APInt.h:235
LLVM_ABI APInt zext(unsigned width) const
Zero extend to a new width.
Definition APInt.cpp:1023
uint64_t getZExtValue() const
Get zero extended value.
Definition APInt.h:1555
LLVM_ABI APInt trunc(unsigned width) const
Truncate to new width.
Definition APInt.cpp:936
unsigned countLeadingOnes() const
Definition APInt.h:1639
bool isAllOnes() const
Determine if all bits are set. This is true for zero-width values.
Definition APInt.h:372
LLVM_ABI APInt usub_ov(const APInt &RHS, bool &Overflow) const
Definition APInt.cpp:1959
bool ugt(const APInt &RHS) const
Unsigned greater than comparison.
Definition APInt.h:1189
bool isZero() const
Determine if this value is zero, i.e. all bits are clear.
Definition APInt.h:381
bool isSignMask() const
Check if the APInt's value is returned by getSignMask.
Definition APInt.h:467
unsigned getBitWidth() const
Return the number of bits in the APInt.
Definition APInt.h:1503
bool ult(const APInt &RHS) const
Unsigned less than comparison.
Definition APInt.h:1118
LLVM_ABI APInt sadd_ov(const APInt &RHS, bool &Overflow) const
Definition APInt.cpp:1939
bool intersects(const APInt &RHS) const
This operation tests if there are any pairs of corresponding bits between this APInt and RHS that are...
Definition APInt.h:1256
int32_t exactLogBase2() const
Definition APInt.h:1798
LLVM_ABI APInt reverseBits() const
Definition APInt.cpp:768
LLVM_ABI APInt uadd_ov(const APInt &RHS, bool &Overflow) const
Definition APInt.cpp:1946
unsigned countr_zero() const
Count the number of trailing zero bits.
Definition APInt.h:1654
unsigned countLeadingZeros() const
Definition APInt.h:1621
bool ule(const APInt &RHS) const
Unsigned less or equal comparison.
Definition APInt.h:1157
APInt shl(unsigned shiftAmt) const
Left-shift function.
Definition APInt.h:880
LLVM_ABI APInt byteSwap() const
Definition APInt.cpp:746
bool isSubsetOf(const APInt &RHS) const
This operation checks that all bits set in this APInt are also set in RHS.
Definition APInt.h:1264
bool isPowerOf2() const
Check if this APInt's value is a power of two greater than zero.
Definition APInt.h:441
static APInt getLowBitsSet(unsigned numBits, unsigned loBitsSet)
Constructs an APInt value that has the bottom loBitsSet bits set.
Definition APInt.h:307
LLVM_ABI APInt ssub_ov(const APInt &RHS, bool &Overflow) const
Definition APInt.cpp:1952
static APInt getBitsSetFrom(unsigned numBits, unsigned loBit)
Constructs an APInt value that has a contiguous range of bits set.
Definition APInt.h:287
APInt lshr(unsigned shiftAmt) const
Logical right-shift function.
Definition APInt.h:858
bool uge(const APInt &RHS) const
Unsigned greater or equal comparison.
Definition APInt.h:1228
void clearSignBit()
Set the sign bit to 0.
Definition APInt.h:1464
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
LLVM_ABI bool isSigned() const
Whether the intrinsic is signed or unsigned.
LLVM_ABI Instruction::BinaryOps getBinaryOp() const
Returns the binary operation underlying the intrinsic.
BinaryOps getOpcode() const
Definition InstrTypes.h:374
static LLVM_ABI BinaryOperator * CreateNot(Value *Op, const Twine &Name="", InsertPosition InsertBefore=nullptr)
static LLVM_ABI BinaryOperator * Create(BinaryOps Op, Value *S1, Value *S2, const Twine &Name=Twine(), InsertPosition InsertBefore=nullptr)
Construct a binary instruction, given the opcode and the two operands.
static BinaryOperator * CreateWithCopiedFlags(BinaryOps Opc, Value *V1, Value *V2, Value *CopyO, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Definition InstrTypes.h:219
This class represents a no-op cast from one type to another.
static CallInst * Create(FunctionType *Ty, Value *F, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
This is the base class for all instructions that perform data casts.
Definition InstrTypes.h:448
Type * getSrcTy() const
Return the source type, as a convenience.
Definition InstrTypes.h:615
Instruction::CastOps getOpcode() const
Return the opcode of this CastInst.
Definition InstrTypes.h:610
static LLVM_ABI CastInst * Create(Instruction::CastOps, Value *S, Type *Ty, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Provides a way to construct any of the CastInst subclasses using an opcode instead of the subclass's ...
Type * getDestTy() const
Return the destination type, as a convenience.
Definition InstrTypes.h:617
static Type * makeCmpResultType(Type *opnd_type)
Create a result type for fcmp/icmp.
Definition InstrTypes.h:982
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
Definition InstrTypes.h:676
@ ICMP_SLT
signed less than
Definition InstrTypes.h:705
@ ICMP_SLE
signed less or equal
Definition InstrTypes.h:706
@ FCMP_OLT
0 1 0 0 True if ordered and less than
Definition InstrTypes.h:682
@ FCMP_ULE
1 1 0 1 True if unordered, less than, or equal
Definition InstrTypes.h:691
@ ICMP_UGE
unsigned greater or equal
Definition InstrTypes.h:700
@ ICMP_UGT
unsigned greater than
Definition InstrTypes.h:699
@ ICMP_SGT
signed greater than
Definition InstrTypes.h:703
@ FCMP_ULT
1 1 0 0 True if unordered or less than
Definition InstrTypes.h:690
@ ICMP_ULT
unsigned less than
Definition InstrTypes.h:701
@ FCMP_OLE
0 1 0 1 True if ordered and less than or equal
Definition InstrTypes.h:683
@ FCMP_ORD
0 1 1 1 True if ordered (no nans)
Definition InstrTypes.h:685
@ ICMP_NE
not equal
Definition InstrTypes.h:698
@ ICMP_SGE
signed greater or equal
Definition InstrTypes.h:704
@ ICMP_ULE
unsigned less or equal
Definition InstrTypes.h:702
@ FCMP_UNO
1 0 0 0 True if unordered: isnan(X) | isnan(Y)
Definition InstrTypes.h:686
bool isSigned() const
Definition InstrTypes.h:930
Predicate getSwappedPredicate() const
For example, EQ->EQ, SLE->SGE, ULT->UGT, OEQ->OEQ, ULE->UGE, OLT->OGT, etc.
Definition InstrTypes.h:827
Predicate getInversePredicate() const
For example, EQ -> NE, UGT -> ULE, SLT -> SGE, OEQ -> UNE, UGT -> OLE, OLT -> UGE,...
Definition InstrTypes.h:789
Predicate getPredicate() const
Return the predicate for this instruction.
Definition InstrTypes.h:765
static LLVM_ABI bool isUnordered(Predicate predicate)
Determine if the predicate is an unordered operation.
static Predicate getOrderedPredicate(Predicate Pred)
Returns the ordered variant of a floating point compare.
Definition InstrTypes.h:796
An abstraction over a floating-point predicate, and a pack of an integer predicate with samesign info...
static LLVM_ABI Constant * getSub(Constant *C1, Constant *C2, bool HasNUW=false, bool HasNSW=false)
static LLVM_ABI Constant * getNot(Constant *C)
static LLVM_ABI Constant * getXor(Constant *C1, Constant *C2)
static LLVM_ABI Constant * getAdd(Constant *C1, Constant *C2, bool HasNUW=false, bool HasNSW=false)
static LLVM_ABI Constant * getTrunc(Constant *C, Type *Ty, bool OnlyIfReduced=false)
static LLVM_ABI Constant * getExactLogBase2(Constant *C)
If C is a scalar/fixed width vector of known powers of 2, then this function returns a new scalar/fix...
static LLVM_ABI Constant * getZero(Type *Ty, bool Negative=false)
This is the shared class of boolean and integer constants.
Definition Constants.h:87
bool isMinusOne() const
This function will return true iff every bit in this constant is set to true.
Definition Constants.h:231
static LLVM_ABI ConstantInt * getTrue(LLVMContext &Context)
bool isZero() const
This is just a convenience method to make client code smaller for a common code.
Definition Constants.h:219
static LLVM_ABI ConstantInt * getFalse(LLVMContext &Context)
uint64_t getZExtValue() const
Return the constant as a 64-bit unsigned integer value after it has been zero extended as appropriate...
Definition Constants.h:168
const APInt & getValue() const
Return the constant as an APInt value reference.
Definition Constants.h:159
LLVM_ABI std::optional< ConstantRange > exactUnionWith(const ConstantRange &CR) const
Union the two ranges and return the result if it can be represented exactly, otherwise return std::nu...
LLVM_ABI ConstantRange subtract(const APInt &CI) const
Subtract the specified constant from the endpoints of this constant range.
static LLVM_ABI ConstantRange makeExactICmpRegion(CmpInst::Predicate Pred, const APInt &Other)
Produce the exact range such that all values in the returned range satisfy the given predicate with a...
LLVM_ABI std::optional< ConstantRange > exactIntersectWith(const ConstantRange &CR) const
Intersect the two ranges and return the result if it can be represented exactly, otherwise return std...
This is an important base class in LLVM.
Definition Constant.h:43
static LLVM_ABI Constant * replaceUndefsWith(Constant *C, Constant *Replacement)
Try to replace undefined constant C or undefined elements in C with Replacement.
static LLVM_ABI Constant * mergeUndefsWith(Constant *C, Constant *Other)
Merges undefs of a Constant with another Constant, along with the undefs already present.
static LLVM_ABI Constant * getAllOnesValue(Type *Ty)
static LLVM_ABI Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
LLVM_ABI Constant * getAggregateElement(unsigned Elt) const
For aggregates (struct/array/vector) return the constant that corresponds to the specified element if...
LLVM_ABI bool isNullValue() const
Return true if this is the value that would be returned by getNullValue.
Definition Constants.cpp:74
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
This instruction compares its operands according to the predicate given to the constructor.
This provides a helper for copying FMF from an instruction or setting specified flags.
Definition IRBuilder.h:93
static FMFSource intersect(Value *A, Value *B)
Intersect the FMF from two instructions.
Definition IRBuilder.h:107
This instruction compares its operands according to the predicate given to the constructor.
Predicate getSignedPredicate() const
For example, EQ->EQ, SLE->SLE, UGT->SGT, etc.
bool isEquality() const
Return true if this predicate is either EQ or NE.
static bool isEquality(Predicate P)
Return true if this predicate is either EQ or NE.
Common base class shared among various IRBuilders.
Definition IRBuilder.h:114
Value * CreateNot(Value *V, const Twine &Name="")
Definition IRBuilder.h:1812
Value * CreateBinOp(Instruction::BinaryOps Opc, Value *LHS, Value *RHS, const Twine &Name="", MDNode *FPMathTag=nullptr)
Definition IRBuilder.h:1711
void SetInsertPoint(BasicBlock *TheBB)
This specifies that created instructions should be appended to the end of the specified block.
Definition IRBuilder.h:207
Instruction * canonicalizeCondSignextOfHighBitExtractToSignextHighBitExtract(BinaryOperator &I)
Instruction * foldBinOpIntoSelectOrPhi(BinaryOperator &I)
This is a convenience wrapper function for the above two functions.
Instruction * visitOr(BinaryOperator &I)
bool SimplifyAssociativeOrCommutative(BinaryOperator &I)
Performs a few simplifications for operators which are associative or commutative.
Value * foldUsingDistributiveLaws(BinaryOperator &I)
Tries to simplify binary operations which some other binary operation distributes over.
Instruction * foldBinOpShiftWithShift(BinaryOperator &I)
Value * insertRangeTest(Value *V, const APInt &Lo, const APInt &Hi, bool isSigned, bool Inside)
Emit a computation of: (V >= Lo && V < Hi) if Inside is true, otherwise (V < Lo || V >= Hi).
Instruction * foldBinOpSelectBinOp(BinaryOperator &Op)
In some cases it is beneficial to fold a select into a binary operator.
bool sinkNotIntoLogicalOp(Instruction &I)
std::optional< std::pair< Intrinsic::ID, SmallVector< Value *, 3 > > > convertOrOfShiftsToFunnelShift(Instruction &Or)
Instruction * visitAnd(BinaryOperator &I)
bool sinkNotIntoOtherHandOfLogicalOp(Instruction &I)
Instruction * foldBinopWithPhiOperands(BinaryOperator &BO)
For a binary operator with 2 phi operands, try to hoist the binary operation before the phi.
Instruction * foldAddLikeCommutative(Value *LHS, Value *RHS, bool NSW, bool NUW)
Common transforms for add / disjoint or.
Value * simplifyRangeCheck(ICmpInst *Cmp0, ICmpInst *Cmp1, bool Inverted)
Try to fold a signed range checked with lower bound 0 to an unsigned icmp.
Instruction * tryFoldInstWithCtpopWithNot(Instruction *I)
Instruction * FoldOrOfLogicalAnds(Value *Op0, Value *Op1)
Value * SimplifyAddWithRemainder(BinaryOperator &I)
Tries to simplify add operations using the definition of remainder.
Instruction * visitXor(BinaryOperator &I)
bool SimplifyDemandedInstructionBits(Instruction &Inst)
Tries to simplify operands to an integer instruction based on its demanded bits.
Instruction * foldVectorBinop(BinaryOperator &Inst)
Canonicalize the position of binops relative to shufflevector.
Instruction * matchBSwapOrBitReverse(Instruction &I, bool MatchBSwaps, bool MatchBitReversals)
Given an initial instruction, check to see if it is the root of a bswap/bitreverse idiom.
void freelyInvertAllUsersOf(Value *V, Value *IgnoredUser=nullptr)
Freely adapt every user of V as-if V was changed to !V.
The core instruction combiner logic.
SimplifyQuery SQ
const DataLayout & getDataLayout() const
IRBuilder< TargetFolder, IRBuilderCallbackInserter > BuilderTy
An IRBuilder that automatically inserts new instructions into the worklist.
bool isFreeToInvert(Value *V, bool WillInvertAllUses, bool &DoesConsume)
Return true if the specified value is free to invert (apply ~ to).
unsigned ComputeNumSignBits(const Value *Op, const Instruction *CxtI=nullptr, unsigned Depth=0) const
Instruction * replaceInstUsesWith(Instruction &I, Value *V)
A combiner-aware RAUW-like routine.
InstructionWorklist & Worklist
A worklist of the instructions that need to be simplified.
const DataLayout & DL
void computeKnownBits(const Value *V, KnownBits &Known, const Instruction *CxtI, unsigned Depth=0) const
static Value * peekThroughBitcast(Value *V, bool OneUseOnly=false)
Return the source operand of a potentially bitcasted value while optionally checking if it has one us...
bool canFreelyInvertAllUsersOf(Instruction *V, Value *IgnoredUser)
Given i1 V, can every user of V be freely adapted if V is changed to !V ?
void addToWorklist(Instruction *I)
static Value * stripSignOnlyFPOps(Value *Val)
Ignore all operations which only change the sign of a value, returning the underlying magnitude value...
bool MaskedValueIsZero(const Value *V, const APInt &Mask, const Instruction *CxtI=nullptr, unsigned Depth=0) const
DominatorTree & DT
BuilderTy & Builder
Value * getFreelyInverted(Value *V, bool WillInvertAllUses, BuilderTy *Builder, bool &DoesConsume)
const SimplifyQuery & getSimplifyQuery() const
bool isKnownToBeAPowerOfTwo(const Value *V, bool OrZero=false, const Instruction *CxtI=nullptr, unsigned Depth=0)
LLVM_ABI void removeFromParent()
This method unlinks 'this' from the containing basic block, but does not delete it.
LLVM_ABI bool hasNoUnsignedWrap() const LLVM_READONLY
Determine whether the no unsigned wrap flag is set.
LLVM_ABI bool hasNoSignedWrap() const LLVM_READONLY
Determine whether the no signed wrap flag is set.
LLVM_ABI void swapProfMetadata()
If the instruction has "branch_weights" MD_prof metadata and the MDNode has three operands (including...
unsigned getOpcode() const
Returns a member of one of the enums like Instruction::Add.
A wrapper class for inspecting calls to intrinsic functions.
This class represents a sign extension of integer types.
This class represents the LLVM 'select' instruction.
static SelectInst * Create(Value *C, Value *S1, Value *S2, const Twine &NameStr="", InsertPosition InsertBefore=nullptr, const Instruction *MDFrom=nullptr)
This is a 'bitvector' (really, a variable-sized bit array), optimized for the case when the array is ...
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:45
LLVM_ABI unsigned getIntegerBitWidth() const
bool isVectorTy() const
True if this is an instance of VectorType.
Definition Type.h:273
bool isIntOrIntVectorTy() const
Return true if this is an integer type or a vector of integer types.
Definition Type.h:246
Type * getScalarType() const
If this is a vector type, return the element type, otherwise return 'this'.
Definition Type.h:352
LLVM_ABI TypeSize getPrimitiveSizeInBits() const LLVM_READONLY
Return the basic size of this type if it is a primitive type.
Definition Type.cpp:197
LLVM_ABI Type * getWithNewBitWidth(unsigned NewBitWidth) const
Given an integer or vector type, change the lane bitwidth to NewBitwidth, whilst keeping the old numb...
LLVM_ABI unsigned getScalarSizeInBits() const LLVM_READONLY
If this is a vector type, return the getPrimitiveSizeInBits value for the element type.
Definition Type.cpp:230
bool isFloatingPointTy() const
Return true if this is one of the floating-point types.
Definition Type.h:184
LLVM_ABI const fltSemantics & getFltSemantics() const
Definition Type.cpp:106
A Use represents the edge between a Value definition and its users.
Definition Use.h:35
Value * getOperand(unsigned i) const
Definition User.h:207
LLVM Value Representation.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:256
bool hasOneUse() const
Return true if there is exactly one use of this value.
Definition Value.h:439
iterator_range< user_iterator > users()
Definition Value.h:426
LLVM_ABI bool hasNUsesOrMore(unsigned N) const
Return true if this value has N uses or more.
Definition Value.cpp:158
LLVM_ABI bool hasNUses(unsigned N) const
Return true if this Value has exactly N uses.
Definition Value.cpp:150
bool use_empty() const
Definition Value.h:346
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
Definition Value.cpp:322
LLVM_ABI void takeName(Value *V)
Transfer the name from V to this value.
Definition Value.cpp:403
static LLVM_ABI VectorType * get(Type *ElementType, ElementCount EC)
This static method is the primary way to construct an VectorType.
Represents an op.with.overflow intrinsic.
This class represents zero extension of integer types.
constexpr ScalarTy getKnownMinValue() const
Returns the minimum value this quantity can represent.
Definition TypeSize.h:165
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
const APInt & umin(const APInt &A, const APInt &B)
Determine the smaller of two APInts considered to be unsigned.
Definition APInt.h:2273
constexpr std::underlying_type_t< E > Mask()
Get a bitmask with 1s in all places up to the high-order bit of E's largest value.
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
LLVM_ABI Function * getOrInsertDeclaration(Module *M, ID id, ArrayRef< Type * > Tys={})
Look up the Function declaration of the intrinsic id in the Module M.
SpecificConstantMatch m_ZeroInt()
Convenience matchers for specific integer values.
BinaryOp_match< SpecificConstantMatch, SrcTy, TargetOpcode::G_SUB > m_Neg(const SrcTy &&Src)
Matches a register negated by a G_SUB.
BinaryOp_match< SrcTy, SpecificConstantMatch, TargetOpcode::G_XOR, true > m_Not(const SrcTy &&Src)
Matches a register not-ed by a G_XOR.
OneUse_match< SubPat > m_OneUse(const SubPat &SP)
cst_pred_ty< is_all_ones > m_AllOnes()
Match an integer or vector with all bits set.
cst_pred_ty< is_lowbit_mask > m_LowBitMask()
Match an integer or vector with only the low bit(s) set.
BinaryOp_match< LHS, RHS, Instruction::And > m_And(const LHS &L, const RHS &R)
cst_pred_ty< is_negative > m_Negative()
Match an integer or vector of negative values.
BinaryOp_match< LHS, RHS, Instruction::Add > m_Add(const LHS &L, const RHS &R)
class_match< BinaryOperator > m_BinOp()
Match an arbitrary binary operation and ignore it.
CmpClass_match< LHS, RHS, FCmpInst > m_FCmp(CmpPredicate &Pred, const LHS &L, const RHS &R)
cst_pred_ty< is_sign_mask > m_SignMask()
Match an integer or vector with only the sign bit(s) set.
BinaryOp_match< LHS, RHS, Instruction::AShr > m_AShr(const LHS &L, const RHS &R)
cstfp_pred_ty< is_inf > m_Inf()
Match a positive or negative infinity FP constant.
m_Intrinsic_Ty< Opnd0 >::Ty m_BitReverse(const Opnd0 &Op0)
cst_pred_ty< is_power2 > m_Power2()
Match an integer or vector power-of-2.
match_combine_or< CastInst_match< OpTy, TruncInst >, OpTy > m_TruncOrSelf(const OpTy &Op)
auto m_LogicalOp()
Matches either L && R or L || R where L and R are arbitrary values.
class_match< Constant > m_Constant()
Match an arbitrary Constant and ignore it.
ap_match< APInt > m_APInt(const APInt *&Res)
Match a ConstantInt or splatted ConstantVector, binding the specified pointer to the contained APInt.
BinaryOp_match< LHS, RHS, Instruction::And, true > m_c_And(const LHS &L, const RHS &R)
Matches an And with LHS and RHS in either order.
CastInst_match< OpTy, TruncInst > m_Trunc(const OpTy &Op)
Matches Trunc.
BinaryOp_match< LHS, RHS, Instruction::Xor > m_Xor(const LHS &L, const RHS &R)
ap_match< APInt > m_APIntAllowPoison(const APInt *&Res)
Match APInt while allowing poison in splat vector constants.
OverflowingBinaryOp_match< LHS, RHS, Instruction::Sub, OverflowingBinaryOperator::NoSignedWrap > m_NSWSub(const LHS &L, const RHS &R)
specific_intval< false > m_SpecificInt(const APInt &V)
Match a specific integer value or vector with all elements equal to the value.
match_combine_or< CastInst_match< OpTy, ZExtInst >, OpTy > m_ZExtOrSelf(const OpTy &Op)
bool match(Val *V, const Pattern &P)
cst_pred_ty< is_shifted_mask > m_ShiftedMask()
bind_ty< Instruction > m_Instruction(Instruction *&I)
Match an instruction, capturing it if we match.
cstfp_pred_ty< is_any_zero_fp > m_AnyZeroFP()
Match a floating-point negative zero or positive zero.
specificval_ty m_Specific(const Value *V)
Match if we have a specific specified value.
DisjointOr_match< LHS, RHS > m_DisjointOr(const LHS &L, const RHS &R)
constantexpr_match m_ConstantExpr()
Match a constant expression or a constant that contains a constant expression.
specific_intval< true > m_SpecificIntAllowPoison(const APInt &V)
ap_match< APFloat > m_APFloatAllowPoison(const APFloat *&Res)
Match APFloat while allowing poison in splat vector constants.
CmpClass_match< LHS, RHS, ICmpInst, true > m_c_ICmp(CmpPredicate &Pred, const LHS &L, const RHS &R)
Matches an ICmp with a predicate over LHS and RHS in either order.
TwoOps_match< Val_t, Idx_t, Instruction::ExtractElement > m_ExtractElt(const Val_t &Val, const Idx_t &Idx)
Matches ExtractElementInst.
cst_pred_ty< is_nonnegative > m_NonNegative()
Match an integer or vector of non-negative values.
class_match< ConstantInt > m_ConstantInt()
Match an arbitrary ConstantInt and ignore it.
cst_pred_ty< is_one > m_One()
Match an integer 1 or a vector with all elements equal to 1.
IntrinsicID_match m_Intrinsic()
Match intrinsic calls like this: m_Intrinsic<Intrinsic::fabs>(m_Value(X))
ThreeOps_match< Cond, LHS, RHS, Instruction::Select > m_Select(const Cond &C, const LHS &L, const RHS &R)
Matches SelectInst.
match_combine_or< CastInst_match< OpTy, SExtInst >, OpTy > m_SExtOrSelf(const OpTy &Op)
ExtractValue_match< Ind, Val_t > m_ExtractValue(const Val_t &V)
Match a single index ExtractValue instruction.
BinOpPred_match< LHS, RHS, is_logical_shift_op > m_LogicalShift(const LHS &L, const RHS &R)
Matches logical shift operations.
match_combine_and< LTy, RTy > m_CombineAnd(const LTy &L, const RTy &R)
Combine two pattern matchers matching L && R.
ShiftLike_match< LHS, Instruction::Shl > m_ShlOrSelf(const LHS &L, uint64_t &R)
Matches shl L, ConstShAmt or L itself (R will be set to zero in this case).
bind_ty< WithOverflowInst > m_WithOverflowInst(WithOverflowInst *&I)
Match a with overflow intrinsic, capturing it if we match.
BinaryOp_match< LHS, RHS, Instruction::Xor, true > m_c_Xor(const LHS &L, const RHS &R)
Matches an Xor with LHS and RHS in either order.
SpecificCmpClass_match< LHS, RHS, CmpInst > m_SpecificCmp(CmpPredicate MatchPred, const LHS &L, const RHS &R)
BinaryOp_match< LHS, RHS, Instruction::Mul > m_Mul(const LHS &L, const RHS &R)
deferredval_ty< Value > m_Deferred(Value *const &V)
Like m_Specific(), but works if the specific value to match is determined as part of the same match()...
auto m_LogicalOr()
Matches L || R where L and R are arbitrary values.
TwoOps_match< V1_t, V2_t, Instruction::ShuffleVector > m_Shuffle(const V1_t &v1, const V2_t &v2)
Matches ShuffleVectorInst independently of mask value.
SpecificCmpClass_match< LHS, RHS, ICmpInst > m_SpecificICmp(CmpPredicate MatchPred, const LHS &L, const RHS &R)
CastInst_match< OpTy, ZExtInst > m_ZExt(const OpTy &Op)
Matches ZExt.
class_match< CmpInst > m_Cmp()
Matches any compare instruction and ignore it.
cst_pred_ty< is_negated_power2 > m_NegatedPower2()
Match a integer or vector negated power-of-2.
match_immconstant_ty m_ImmConstant()
Match an arbitrary immediate Constant and ignore it.
DisjointOr_match< LHS, RHS, true > m_c_DisjointOr(const LHS &L, const RHS &R)
BinaryOp_match< LHS, RHS, Instruction::Add, true > m_c_Add(const LHS &L, const RHS &R)
Matches a Add with LHS and RHS in either order.
SpecificCmpClass_match< LHS, RHS, FCmpInst > m_SpecificFCmp(CmpPredicate MatchPred, const LHS &L, const RHS &R)
match_combine_or< BinaryOp_match< LHS, RHS, Instruction::Add >, DisjointOr_match< LHS, RHS > > m_AddLike(const LHS &L, const RHS &R)
Match either "add" or "or disjoint".
CastOperator_match< OpTy, Instruction::BitCast > m_BitCast(const OpTy &Op)
Matches BitCast.
match_combine_or< match_combine_or< MaxMin_match< ICmpInst, LHS, RHS, smax_pred_ty, true >, MaxMin_match< ICmpInst, LHS, RHS, smin_pred_ty, true > >, match_combine_or< MaxMin_match< ICmpInst, LHS, RHS, umax_pred_ty, true >, MaxMin_match< ICmpInst, LHS, RHS, umin_pred_ty, true > > > m_c_MaxOrMin(const LHS &L, const RHS &R)
match_combine_or< CastInst_match< OpTy, SExtInst >, NNegZExt_match< OpTy > > m_SExtLike(const OpTy &Op)
Match either "sext" or "zext nneg".
MaxMin_match< ICmpInst, LHS, RHS, smax_pred_ty > m_SMax(const LHS &L, const RHS &R)
cst_pred_ty< is_maxsignedvalue > m_MaxSignedValue()
Match an integer or vector with values having all bits except for the high bit set (0x7f....
class_match< Value > m_Value()
Match an arbitrary value and ignore it.
AnyBinaryOp_match< LHS, RHS, true > m_c_BinOp(const LHS &L, const RHS &R)
Matches a BinaryOperator with LHS and RHS in either order.
BinaryOp_match< LHS, RHS, Instruction::LShr > m_LShr(const LHS &L, const RHS &R)
CmpClass_match< LHS, RHS, ICmpInst > m_ICmp(CmpPredicate &Pred, const LHS &L, const RHS &R)
match_combine_or< CastInst_match< OpTy, ZExtInst >, CastInst_match< OpTy, SExtInst > > m_ZExtOrSExt(const OpTy &Op)
BinOpPred_match< LHS, RHS, is_shift_op > m_Shift(const LHS &L, const RHS &R)
Matches shift operations.
cstfp_pred_ty< is_pos_zero_fp > m_PosZeroFP()
Match a floating-point positive zero.
LogicalOp_match< LHS, RHS, Instruction::And, true > m_c_LogicalAnd(const LHS &L, const RHS &R)
Matches L && R with LHS and RHS in either order.
BinaryOp_match< LHS, RHS, Instruction::Shl > m_Shl(const LHS &L, const RHS &R)
auto m_LogicalAnd()
Matches L && R where L and R are arbitrary values.
BinaryOp_match< LHS, RHS, Instruction::Or > m_Or(const LHS &L, const RHS &R)
m_Intrinsic_Ty< Opnd0 >::Ty m_BSwap(const Opnd0 &Op0)
CastInst_match< OpTy, SExtInst > m_SExt(const OpTy &Op)
Matches SExt.
is_zero m_Zero()
Match any null constant or a vector with all elements equal to 0.
BinaryOp_match< LHS, RHS, Instruction::Or, true > m_c_Or(const LHS &L, const RHS &R)
Matches an Or with LHS and RHS in either order.
ThreeOps_match< Val_t, Elt_t, Idx_t, Instruction::InsertElement > m_InsertElt(const Val_t &Val, const Elt_t &Elt, const Idx_t &Idx)
Matches InsertElementInst.
ElementWiseBitCast_match< OpTy > m_ElementWiseBitCast(const OpTy &Op)
BinaryOp_match< LHS, RHS, Instruction::Sub > m_Sub(const LHS &L, const RHS &R)
match_unless< Ty > m_Unless(const Ty &M)
Match if the inner matcher does NOT match.
match_combine_or< LTy, RTy > m_CombineOr(const LTy &L, const RTy &R)
Combine two pattern matchers matching L || R.
cst_pred_ty< icmp_pred_with_threshold > m_SpecificInt_ICMP(ICmpInst::Predicate Predicate, const APInt &Threshold)
Match an integer or vector with every element comparing 'pred' (eg/ne/...) to Threshold.
NodeAddr< CodeNode * > Code
Definition RDFGraph.h:388
friend class Instruction
Iterator for Instructions in a `BasicBlock.
Definition BasicBlock.h:73
This is an optimization pass for GlobalISel generic memory operations.
Definition Types.h:26
LLVM_ABI Intrinsic::ID getInverseMinMaxIntrinsic(Intrinsic::ID MinMaxID)
@ Low
Lower the current thread's priority such that it does not affect foreground tasks significantly.
Definition Threading.h:280
@ Offset
Definition DWP.cpp:532
FunctionAddr VTableAddr Value
Definition InstrProf.h:137
Constant * getPredForFCmpCode(unsigned Code, Type *OpTy, CmpInst::Predicate &Pred)
This is the complement of getFCmpCode.
cl::opt< bool > ProfcheckDisableMetadataFixes
Definition Metadata.cpp:64
LLVM_ABI bool isSignBitCheck(ICmpInst::Predicate Pred, const APInt &RHS, bool &TrueIfSigned)
Given an exploded icmp instruction, return true if the comparison only checks the sign bit.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
bool predicatesFoldable(CmpInst::Predicate P1, CmpInst::Predicate P2)
Return true if both predicates match sign or if at least one of them is an equality comparison (which...
LLVM_ABI Constant * ConstantFoldCompareInstOperands(unsigned Predicate, Constant *LHS, Constant *RHS, const DataLayout &DL, const TargetLibraryInfo *TLI=nullptr, const Instruction *I=nullptr)
Attempt to constant fold a compare instruction (icmp/fcmp) with the specified operands.
LLVM_ABI Value * simplifyOrInst(Value *LHS, Value *RHS, const SimplifyQuery &Q)
Given operands for an Or, fold the result or return null.
LLVM_ABI Value * simplifyXorInst(Value *LHS, Value *RHS, const SimplifyQuery &Q)
Given operands for an Xor, fold the result or return null.
LLVM_ABI bool isGuaranteedNotToBeUndef(const Value *V, AssumptionCache *AC=nullptr, const Instruction *CtxI=nullptr, const DominatorTree *DT=nullptr, unsigned Depth=0)
Returns true if V cannot be undef, but may be poison.
LLVM_ABI bool matchSimpleRecurrence(const PHINode *P, BinaryOperator *&BO, Value *&Start, Value *&Step)
Attempt to match a simple first order recurrence cycle of the form: iv = phi Ty [Start,...
LLVM_ABI bool isKnownNegative(const Value *V, const SimplifyQuery &SQ, unsigned Depth=0)
Returns true if the given value is known be negative (i.e.
LLVM_ABI Constant * getLosslessUnsignedTrunc(Constant *C, Type *DestTy, const DataLayout &DL, PreservedCastFlags *Flags=nullptr)
LLVM_ABI bool recognizeBSwapOrBitReverseIdiom(Instruction *I, bool MatchBSwaps, bool MatchBitReversals, SmallVectorImpl< Instruction * > &InsertedInsts)
Try to match a bswap or bitreverse idiom.
Definition Local.cpp:3791
constexpr bool isPowerOf2_32(uint32_t Value)
Return true if the argument is a power of two > 0.
Definition MathExtras.h:279
LLVM_ABI Value * simplifyICmpInst(CmpPredicate Pred, Value *LHS, Value *RHS, const SimplifyQuery &Q)
Given operands for an ICmpInst, fold the result or return null.
LLVM_ABI Constant * getLosslessSignedTrunc(Constant *C, Type *DestTy, const DataLayout &DL, PreservedCastFlags *Flags=nullptr)
LLVM_ABI Value * simplifyAndInst(Value *LHS, Value *RHS, const SimplifyQuery &Q)
Given operands for an And, fold the result or return null.
LLVM_ABI bool isKnownInversion(const Value *X, const Value *Y)
Return true iff:
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
Definition Casting.h:547
LLVM_ABI bool isKnownNonZero(const Value *V, const SimplifyQuery &Q, unsigned Depth=0)
Return true if the given value is known to be non-zero when defined.
constexpr int PoisonMaskElem
@ Other
Any other memory.
Definition ModRef.h:68
LLVM_ABI Value * simplifyBinOp(unsigned Opcode, Value *LHS, Value *RHS, const SimplifyQuery &Q)
Given operands for a BinaryOperator, fold the result or return null.
std::optional< DecomposedBitTest > decomposeBitTest(Value *Cond, bool LookThroughTrunc=true, bool AllowNonZeroC=false, bool DecomposeAnd=false)
Decompose an icmp into the form ((X & Mask) pred C) if possible.
@ Mul
Product of integers.
@ Xor
Bitwise or logical XOR of integers.
@ And
Bitwise or logical AND of integers.
@ Sub
Subtraction of integers.
@ Add
Sum of integers.
DWARFExpression::Operation Op
LLVM_ABI bool isGuaranteedNotToBeUndefOrPoison(const Value *V, AssumptionCache *AC=nullptr, const Instruction *CtxI=nullptr, const DominatorTree *DT=nullptr, unsigned Depth=0)
Return true if this function can prove that V does not have undef bits and is never poison.
constexpr unsigned BitWidth
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
APFloat neg(APFloat X)
Returns the negated value of the argument.
Definition APFloat.h:1632
unsigned getICmpCode(CmpInst::Predicate Pred)
Encode a icmp predicate into a three bit mask.
LLVM_ABI bool isKnownToBeAPowerOfTwo(const Value *V, const DataLayout &DL, bool OrZero=false, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr, const DominatorTree *DT=nullptr, bool UseInstrInfo=true, unsigned Depth=0)
Return true if the given value is known to have exactly one bit set when defined.
LLVM_ABI bool isGuaranteedNotToBePoison(const Value *V, AssumptionCache *AC=nullptr, const Instruction *CtxI=nullptr, const DominatorTree *DT=nullptr, unsigned Depth=0)
Returns true if V cannot be poison, but may be undef.
std::pair< Value *, FPClassTest > fcmpToClassTest(FCmpInst::Predicate Pred, const Function &F, Value *LHS, Value *RHS, bool LookThroughSrc=true)
Returns a pair of values, which if passed to llvm.is.fpclass, returns the same result as an fcmp with...
unsigned getFCmpCode(CmpInst::Predicate CC)
Similar to getICmpCode but for FCmpInst.
std::optional< DecomposedBitTest > decomposeBitTestICmp(Value *LHS, Value *RHS, CmpInst::Predicate Pred, bool LookThroughTrunc=true, bool AllowNonZeroC=false, bool DecomposeAnd=false)
Decompose an icmp into the form ((X & Mask) pred C) if possible.
Constant * getPredForICmpCode(unsigned Code, bool Sign, Type *OpTy, CmpInst::Predicate &Pred)
This is the complement of getICmpCode.
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Definition BitVector.h:872
#define N
bool isCombineableWith(const DecomposedBitMaskMul Other)
bool isNonNegative() const
Returns true if this value is known to be non-negative.
Definition KnownBits.h:108
APInt getMaxValue() const
Return the maximal unsigned value possible given these KnownBits.
Definition KnownBits.h:148
Matching combinators.
const DataLayout & DL
const Instruction * CxtI
const DominatorTree * DT
SimplifyQuery getWithInstruction(const Instruction *I) const
AssumptionCache * AC