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