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