Thanks to visit codestin.com
Credit goes to llvm.org

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 // We cannot reuse the result if it may produce poison.
3084 // Drop poison generating flags in the expression tree.
3085 // Or
3086 cast<Instruction>(U)->dropPoisonGeneratingFlags();
3087 // Shl
3088 cast<Instruction>(X)->dropPoisonGeneratingFlags();
3089
3090 FShiftArgs = {U, U, ConstantInt::get(Or0->getType(), *ZextHighShlAmt)};
3091 break;
3092 }
3093 }
3094
3095 if (FShiftArgs.empty())
3096 return std::nullopt;
3097
3098 Intrinsic::ID IID = IsFshl ? Intrinsic::fshl : Intrinsic::fshr;
3099 return std::make_pair(IID, FShiftArgs);
3100}
3101
3102/// Match UB-safe variants of the funnel shift intrinsic.
3104 if (auto Opt = IC.convertOrOfShiftsToFunnelShift(Or)) {
3105 auto [IID, FShiftArgs] = *Opt;
3106 Function *F =
3107 Intrinsic::getOrInsertDeclaration(Or.getModule(), IID, Or.getType());
3108 return CallInst::Create(F, FShiftArgs);
3109 }
3110
3111 return nullptr;
3112}
3113
3114/// Attempt to combine or(zext(x),shl(zext(y),bw/2) concat packing patterns.
3116 assert(Or.getOpcode() == Instruction::Or && "bswap requires an 'or'");
3117 Value *Op0 = Or.getOperand(0), *Op1 = Or.getOperand(1);
3118 Type *Ty = Or.getType();
3119
3120 unsigned Width = Ty->getScalarSizeInBits();
3121 if ((Width & 1) != 0)
3122 return nullptr;
3123 unsigned HalfWidth = Width / 2;
3124
3125 // Canonicalize zext (lower half) to LHS.
3126 if (!isa<ZExtInst>(Op0))
3127 std::swap(Op0, Op1);
3128
3129 // Find lower/upper half.
3130 Value *LowerSrc, *ShlVal, *UpperSrc;
3131 const APInt *C;
3132 if (!match(Op0, m_OneUse(m_ZExt(m_Value(LowerSrc)))) ||
3133 !match(Op1, m_OneUse(m_Shl(m_Value(ShlVal), m_APInt(C)))) ||
3134 !match(ShlVal, m_OneUse(m_ZExt(m_Value(UpperSrc)))))
3135 return nullptr;
3136 if (*C != HalfWidth || LowerSrc->getType() != UpperSrc->getType() ||
3137 LowerSrc->getType()->getScalarSizeInBits() != HalfWidth)
3138 return nullptr;
3139
3140 auto ConcatIntrinsicCalls = [&](Intrinsic::ID id, Value *Lo, Value *Hi) {
3141 Value *NewLower = Builder.CreateZExt(Lo, Ty);
3142 Value *NewUpper = Builder.CreateZExt(Hi, Ty);
3143 NewUpper = Builder.CreateShl(NewUpper, HalfWidth);
3144 Value *BinOp = Builder.CreateOr(NewLower, NewUpper);
3145 return Builder.CreateIntrinsic(id, Ty, BinOp);
3146 };
3147
3148 // BSWAP: Push the concat down, swapping the lower/upper sources.
3149 // concat(bswap(x),bswap(y)) -> bswap(concat(x,y))
3150 Value *LowerBSwap, *UpperBSwap;
3151 if (match(LowerSrc, m_BSwap(m_Value(LowerBSwap))) &&
3152 match(UpperSrc, m_BSwap(m_Value(UpperBSwap))))
3153 return ConcatIntrinsicCalls(Intrinsic::bswap, UpperBSwap, LowerBSwap);
3154
3155 // BITREVERSE: Push the concat down, swapping the lower/upper sources.
3156 // concat(bitreverse(x),bitreverse(y)) -> bitreverse(concat(x,y))
3157 Value *LowerBRev, *UpperBRev;
3158 if (match(LowerSrc, m_BitReverse(m_Value(LowerBRev))) &&
3159 match(UpperSrc, m_BitReverse(m_Value(UpperBRev))))
3160 return ConcatIntrinsicCalls(Intrinsic::bitreverse, UpperBRev, LowerBRev);
3161
3162 // iX ext split: extending or(zext(x),shl(zext(y),bw/2) pattern
3163 // to consume sext/ashr:
3164 // or(zext(sext(x)),shl(zext(sext(ashr(x,xbw-1))),bw/2)
3165 // or(zext(x),shl(zext(ashr(x,xbw-1)),bw/2)
3166 Value *X;
3167 if (match(LowerSrc, m_SExtOrSelf(m_Value(X))) &&
3168 match(UpperSrc,
3170 m_Specific(X),
3171 m_SpecificInt(X->getType()->getScalarSizeInBits() - 1)))))
3172 return Builder.CreateSExt(X, Ty);
3173
3174 return nullptr;
3175}
3176
3177/// If all elements of two constant vectors are 0/-1 and inverses, return true.
3179 unsigned NumElts = cast<FixedVectorType>(C1->getType())->getNumElements();
3180 for (unsigned i = 0; i != NumElts; ++i) {
3181 Constant *EltC1 = C1->getAggregateElement(i);
3182 Constant *EltC2 = C2->getAggregateElement(i);
3183 if (!EltC1 || !EltC2)
3184 return false;
3185
3186 // One element must be all ones, and the other must be all zeros.
3187 if (!((match(EltC1, m_Zero()) && match(EltC2, m_AllOnes())) ||
3188 (match(EltC2, m_Zero()) && match(EltC1, m_AllOnes()))))
3189 return false;
3190 }
3191 return true;
3192}
3193
3194/// We have an expression of the form (A & C) | (B & D). If A is a scalar or
3195/// vector composed of all-zeros or all-ones values and is the bitwise 'not' of
3196/// B, it can be used as the condition operand of a select instruction.
3197/// We will detect (A & C) | ~(B | D) when the flag ABIsTheSame enabled.
3198Value *InstCombinerImpl::getSelectCondition(Value *A, Value *B,
3199 bool ABIsTheSame) {
3200 // We may have peeked through bitcasts in the caller.
3201 // Exit immediately if we don't have (vector) integer types.
3202 Type *Ty = A->getType();
3203 if (!Ty->isIntOrIntVectorTy() || !B->getType()->isIntOrIntVectorTy())
3204 return nullptr;
3205
3206 // If A is the 'not' operand of B and has enough signbits, we have our answer.
3207 if (ABIsTheSame ? (A == B) : match(B, m_Not(m_Specific(A)))) {
3208 // If these are scalars or vectors of i1, A can be used directly.
3209 if (Ty->isIntOrIntVectorTy(1))
3210 return A;
3211
3212 // If we look through a vector bitcast, the caller will bitcast the operands
3213 // to match the condition's number of bits (N x i1).
3214 // To make this poison-safe, disallow bitcast from wide element to narrow
3215 // element. That could allow poison in lanes where it was not present in the
3216 // original code.
3218 if (A->getType()->isIntOrIntVectorTy()) {
3219 unsigned NumSignBits = ComputeNumSignBits(A);
3220 if (NumSignBits == A->getType()->getScalarSizeInBits() &&
3221 NumSignBits <= Ty->getScalarSizeInBits())
3222 return Builder.CreateTrunc(A, CmpInst::makeCmpResultType(A->getType()));
3223 }
3224 return nullptr;
3225 }
3226
3227 // TODO: add support for sext and constant case
3228 if (ABIsTheSame)
3229 return nullptr;
3230
3231 // If both operands are constants, see if the constants are inverse bitmasks.
3232 Constant *AConst, *BConst;
3233 if (match(A, m_Constant(AConst)) && match(B, m_Constant(BConst)))
3234 if (AConst == ConstantExpr::getNot(BConst) &&
3236 return Builder.CreateZExtOrTrunc(A, CmpInst::makeCmpResultType(Ty));
3237
3238 // Look for more complex patterns. The 'not' op may be hidden behind various
3239 // casts. Look through sexts and bitcasts to find the booleans.
3240 Value *Cond;
3241 Value *NotB;
3242 if (match(A, m_SExt(m_Value(Cond))) &&
3243 Cond->getType()->isIntOrIntVectorTy(1)) {
3244 // A = sext i1 Cond; B = sext (not (i1 Cond))
3245 if (match(B, m_SExt(m_Not(m_Specific(Cond)))))
3246 return Cond;
3247
3248 // A = sext i1 Cond; B = not ({bitcast} (sext (i1 Cond)))
3249 // TODO: The one-use checks are unnecessary or misplaced. If the caller
3250 // checked for uses on logic ops/casts, that should be enough to
3251 // make this transform worthwhile.
3252 if (match(B, m_OneUse(m_Not(m_Value(NotB))))) {
3253 NotB = peekThroughBitcast(NotB, true);
3254 if (match(NotB, m_SExt(m_Specific(Cond))))
3255 return Cond;
3256 }
3257 }
3258
3259 // All scalar (and most vector) possibilities should be handled now.
3260 // Try more matches that only apply to non-splat constant vectors.
3261 if (!Ty->isVectorTy())
3262 return nullptr;
3263
3264 // If both operands are xor'd with constants using the same sexted boolean
3265 // operand, see if the constants are inverse bitmasks.
3266 // TODO: Use ConstantExpr::getNot()?
3267 if (match(A, (m_Xor(m_SExt(m_Value(Cond)), m_Constant(AConst)))) &&
3268 match(B, (m_Xor(m_SExt(m_Specific(Cond)), m_Constant(BConst)))) &&
3269 Cond->getType()->isIntOrIntVectorTy(1) &&
3270 areInverseVectorBitmasks(AConst, BConst)) {
3272 return Builder.CreateXor(Cond, AConst);
3273 }
3274 return nullptr;
3275}
3276
3277/// We have an expression of the form (A & B) | (C & D). Try to simplify this
3278/// to "A' ? B : D", where A' is a boolean or vector of booleans.
3279/// When InvertFalseVal is set to true, we try to match the pattern
3280/// where we have peeked through a 'not' op and A and C are the same:
3281/// (A & B) | ~(A | D) --> (A & B) | (~A & ~D) --> A' ? B : ~D
3282Value *InstCombinerImpl::matchSelectFromAndOr(Value *A, Value *B, Value *C,
3283 Value *D, bool InvertFalseVal) {
3284 // The potential condition of the select may be bitcasted. In that case, look
3285 // through its bitcast and the corresponding bitcast of the 'not' condition.
3286 Type *OrigType = A->getType();
3287 A = peekThroughBitcast(A, true);
3288 C = peekThroughBitcast(C, true);
3289 if (Value *Cond = getSelectCondition(A, C, InvertFalseVal)) {
3290 // ((bc Cond) & B) | ((bc ~Cond) & D) --> bc (select Cond, (bc B), (bc D))
3291 // If this is a vector, we may need to cast to match the condition's length.
3292 // The bitcasts will either all exist or all not exist. The builder will
3293 // not create unnecessary casts if the types already match.
3294 Type *SelTy = A->getType();
3295 if (auto *VecTy = dyn_cast<VectorType>(Cond->getType())) {
3296 // For a fixed or scalable vector get N from <{vscale x} N x iM>
3297 unsigned Elts = VecTy->getElementCount().getKnownMinValue();
3298 // For a fixed or scalable vector, get the size in bits of N x iM; for a
3299 // scalar this is just M.
3300 unsigned SelEltSize = SelTy->getPrimitiveSizeInBits().getKnownMinValue();
3301 Type *EltTy = Builder.getIntNTy(SelEltSize / Elts);
3302 SelTy = VectorType::get(EltTy, VecTy->getElementCount());
3303 }
3304 Value *BitcastB = Builder.CreateBitCast(B, SelTy);
3305 if (InvertFalseVal)
3306 D = Builder.CreateNot(D);
3307 Value *BitcastD = Builder.CreateBitCast(D, SelTy);
3308 Value *Select = Builder.CreateSelect(Cond, BitcastB, BitcastD);
3309 return Builder.CreateBitCast(Select, OrigType);
3310 }
3311
3312 return nullptr;
3313}
3314
3315// (icmp eq X, C) | (icmp ult Other, (X - C)) -> (icmp ule Other, (X - (C + 1)))
3316// (icmp ne X, C) & (icmp uge Other, (X - C)) -> (icmp ugt Other, (X - (C + 1)))
3318 bool IsAnd, bool IsLogical,
3319 IRBuilderBase &Builder) {
3320 Value *LHS0 = LHS->getOperand(0);
3321 Value *RHS0 = RHS->getOperand(0);
3322 Value *RHS1 = RHS->getOperand(1);
3323
3324 ICmpInst::Predicate LPred =
3325 IsAnd ? LHS->getInversePredicate() : LHS->getPredicate();
3326 ICmpInst::Predicate RPred =
3327 IsAnd ? RHS->getInversePredicate() : RHS->getPredicate();
3328
3329 const APInt *CInt;
3330 if (LPred != ICmpInst::ICMP_EQ ||
3331 !match(LHS->getOperand(1), m_APIntAllowPoison(CInt)) ||
3332 !LHS0->getType()->isIntOrIntVectorTy() ||
3333 !(LHS->hasOneUse() || RHS->hasOneUse()))
3334 return nullptr;
3335
3336 auto MatchRHSOp = [LHS0, CInt](const Value *RHSOp) {
3337 return match(RHSOp,
3338 m_Add(m_Specific(LHS0), m_SpecificIntAllowPoison(-*CInt))) ||
3339 (CInt->isZero() && RHSOp == LHS0);
3340 };
3341
3342 Value *Other;
3343 if (RPred == ICmpInst::ICMP_ULT && MatchRHSOp(RHS1))
3344 Other = RHS0;
3345 else if (RPred == ICmpInst::ICMP_UGT && MatchRHSOp(RHS0))
3346 Other = RHS1;
3347 else
3348 return nullptr;
3349
3350 if (IsLogical)
3351 Other = Builder.CreateFreeze(Other);
3352
3353 return Builder.CreateICmp(
3355 Builder.CreateSub(LHS0, ConstantInt::get(LHS0->getType(), *CInt + 1)),
3356 Other);
3357}
3358
3359/// Fold (icmp)&(icmp) or (icmp)|(icmp) if possible.
3360/// If IsLogical is true, then the and/or is in select form and the transform
3361/// must be poison-safe.
3362Value *InstCombinerImpl::foldAndOrOfICmps(ICmpInst *LHS, ICmpInst *RHS,
3363 Instruction &I, bool IsAnd,
3364 bool IsLogical) {
3365 const SimplifyQuery Q = SQ.getWithInstruction(&I);
3366
3367 ICmpInst::Predicate PredL = LHS->getPredicate(), PredR = RHS->getPredicate();
3368 Value *LHS0 = LHS->getOperand(0), *RHS0 = RHS->getOperand(0);
3369 Value *LHS1 = LHS->getOperand(1), *RHS1 = RHS->getOperand(1);
3370
3371 const APInt *LHSC = nullptr, *RHSC = nullptr;
3372 match(LHS1, m_APInt(LHSC));
3373 match(RHS1, m_APInt(RHSC));
3374
3375 // (icmp1 A, B) | (icmp2 A, B) --> (icmp3 A, B)
3376 // (icmp1 A, B) & (icmp2 A, B) --> (icmp3 A, B)
3377 if (predicatesFoldable(PredL, PredR)) {
3378 if (LHS0 == RHS1 && LHS1 == RHS0) {
3379 PredL = ICmpInst::getSwappedPredicate(PredL);
3380 std::swap(LHS0, LHS1);
3381 }
3382 if (LHS0 == RHS0 && LHS1 == RHS1) {
3383 unsigned Code = IsAnd ? getICmpCode(PredL) & getICmpCode(PredR)
3384 : getICmpCode(PredL) | getICmpCode(PredR);
3385 bool IsSigned = LHS->isSigned() || RHS->isSigned();
3386 return getNewICmpValue(Code, IsSigned, LHS0, LHS1, Builder);
3387 }
3388 }
3389
3390 if (Value *V =
3391 foldAndOrOfICmpEqConstantAndICmp(LHS, RHS, IsAnd, IsLogical, Builder))
3392 return V;
3393 // We can treat logical like bitwise here, because both operands are used on
3394 // the LHS, and as such poison from both will propagate.
3396 /*IsLogical*/ false, Builder))
3397 return V;
3398
3399 if (Value *V =
3400 foldAndOrOfICmpsWithConstEq(LHS, RHS, IsAnd, IsLogical, Builder, Q))
3401 return V;
3402 // We can convert this case to bitwise and, because both operands are used
3403 // on the LHS, and as such poison from both will propagate.
3404 if (Value *V = foldAndOrOfICmpsWithConstEq(RHS, LHS, IsAnd,
3405 /*IsLogical=*/false, Builder, Q)) {
3406 // If RHS is still used, we should drop samesign flag.
3407 if (IsLogical && RHS->hasSameSign() && !RHS->use_empty()) {
3408 RHS->setSameSign(false);
3410 }
3411 return V;
3412 }
3413
3414 if (Value *V = foldIsPowerOf2OrZero(LHS, RHS, IsAnd, Builder, *this))
3415 return V;
3416 if (Value *V = foldIsPowerOf2OrZero(RHS, LHS, IsAnd, Builder, *this))
3417 return V;
3418
3419 // TODO: One of these directions is fine with logical and/or, the other could
3420 // be supported by inserting freeze.
3421 if (!IsLogical) {
3422 // E.g. (icmp slt x, 0) | (icmp sgt x, n) --> icmp ugt x, n
3423 // E.g. (icmp sge x, 0) & (icmp slt x, n) --> icmp ult x, n
3424 if (Value *V = simplifyRangeCheck(LHS, RHS, /*Inverted=*/!IsAnd))
3425 return V;
3426
3427 // E.g. (icmp sgt x, n) | (icmp slt x, 0) --> icmp ugt x, n
3428 // E.g. (icmp slt x, n) & (icmp sge x, 0) --> icmp ult x, n
3429 if (Value *V = simplifyRangeCheck(RHS, LHS, /*Inverted=*/!IsAnd))
3430 return V;
3431 }
3432
3433 // TODO: Add conjugated or fold, check whether it is safe for logical and/or.
3434 if (IsAnd && !IsLogical)
3436 return V;
3437
3438 if (Value *V = foldIsPowerOf2(LHS, RHS, IsAnd, Builder, *this))
3439 return V;
3440
3441 if (Value *V = foldPowerOf2AndShiftedMask(LHS, RHS, IsAnd, Builder))
3442 return V;
3443
3444 // TODO: Verify whether this is safe for logical and/or.
3445 if (!IsLogical) {
3446 if (Value *X = foldUnsignedUnderflowCheck(LHS, RHS, IsAnd, Q, Builder))
3447 return X;
3448 if (Value *X = foldUnsignedUnderflowCheck(RHS, LHS, IsAnd, Q, Builder))
3449 return X;
3450 }
3451
3452 // (icmp ne A, 0) | (icmp ne B, 0) --> (icmp ne (A|B), 0)
3453 // (icmp eq A, 0) & (icmp eq B, 0) --> (icmp eq (A|B), 0)
3454 // TODO: Remove this and below when foldLogOpOfMaskedICmps can handle undefs.
3455 if (PredL == (IsAnd ? ICmpInst::ICMP_EQ : ICmpInst::ICMP_NE) &&
3456 PredL == PredR && match(LHS1, m_ZeroInt()) && match(RHS1, m_ZeroInt()) &&
3457 LHS0->getType() == RHS0->getType() &&
3458 (!IsLogical || isGuaranteedNotToBePoison(RHS0))) {
3459 Value *NewOr = Builder.CreateOr(LHS0, RHS0);
3460 return Builder.CreateICmp(PredL, NewOr,
3462 }
3463
3464 // (icmp ne A, -1) | (icmp ne B, -1) --> (icmp ne (A&B), -1)
3465 // (icmp eq A, -1) & (icmp eq B, -1) --> (icmp eq (A&B), -1)
3466 if (PredL == (IsAnd ? ICmpInst::ICMP_EQ : ICmpInst::ICMP_NE) &&
3467 PredL == PredR && match(LHS1, m_AllOnes()) && match(RHS1, m_AllOnes()) &&
3468 LHS0->getType() == RHS0->getType() &&
3469 (!IsLogical || isGuaranteedNotToBePoison(RHS0))) {
3470 Value *NewAnd = Builder.CreateAnd(LHS0, RHS0);
3471 return Builder.CreateICmp(PredL, NewAnd,
3473 }
3474
3475 if (!IsLogical)
3476 if (Value *V =
3478 return V;
3479
3480 // This only handles icmp of constants: (icmp1 A, C1) | (icmp2 B, C2).
3481 if (!LHSC || !RHSC)
3482 return nullptr;
3483
3484 // (trunc x) == C1 & (and x, CA) == C2 -> (and x, CA|CMAX) == C1|C2
3485 // (trunc x) != C1 | (and x, CA) != C2 -> (and x, CA|CMAX) != C1|C2
3486 // where CMAX is the all ones value for the truncated type,
3487 // iff the lower bits of C2 and CA are zero.
3488 if (PredL == (IsAnd ? ICmpInst::ICMP_EQ : ICmpInst::ICMP_NE) &&
3489 PredL == PredR && LHS->hasOneUse() && RHS->hasOneUse()) {
3490 Value *V;
3491 const APInt *AndC, *SmallC = nullptr, *BigC = nullptr;
3492
3493 // (trunc x) == C1 & (and x, CA) == C2
3494 // (and x, CA) == C2 & (trunc x) == C1
3495 if (match(RHS0, m_Trunc(m_Value(V))) &&
3496 match(LHS0, m_And(m_Specific(V), m_APInt(AndC)))) {
3497 SmallC = RHSC;
3498 BigC = LHSC;
3499 } else if (match(LHS0, m_Trunc(m_Value(V))) &&
3500 match(RHS0, m_And(m_Specific(V), m_APInt(AndC)))) {
3501 SmallC = LHSC;
3502 BigC = RHSC;
3503 }
3504
3505 if (SmallC && BigC) {
3506 unsigned BigBitSize = BigC->getBitWidth();
3507 unsigned SmallBitSize = SmallC->getBitWidth();
3508
3509 // Check that the low bits are zero.
3510 APInt Low = APInt::getLowBitsSet(BigBitSize, SmallBitSize);
3511 if ((Low & *AndC).isZero() && (Low & *BigC).isZero()) {
3512 Value *NewAnd = Builder.CreateAnd(V, Low | *AndC);
3513 APInt N = SmallC->zext(BigBitSize) | *BigC;
3514 Value *NewVal = ConstantInt::get(NewAnd->getType(), N);
3515 return Builder.CreateICmp(PredL, NewAnd, NewVal);
3516 }
3517 }
3518 }
3519
3520 // Match naive pattern (and its inverted form) for checking if two values
3521 // share same sign. An example of the pattern:
3522 // (icmp slt (X & Y), 0) | (icmp sgt (X | Y), -1) -> (icmp sgt (X ^ Y), -1)
3523 // Inverted form (example):
3524 // (icmp slt (X | Y), 0) & (icmp sgt (X & Y), -1) -> (icmp slt (X ^ Y), 0)
3525 bool TrueIfSignedL, TrueIfSignedR;
3526 if (isSignBitCheck(PredL, *LHSC, TrueIfSignedL) &&
3527 isSignBitCheck(PredR, *RHSC, TrueIfSignedR) &&
3528 (RHS->hasOneUse() || LHS->hasOneUse())) {
3529 Value *X, *Y;
3530 if (IsAnd) {
3531 if ((TrueIfSignedL && !TrueIfSignedR &&
3532 match(LHS0, m_Or(m_Value(X), m_Value(Y))) &&
3533 match(RHS0, m_c_And(m_Specific(X), m_Specific(Y)))) ||
3534 (!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 Value *NewXor = Builder.CreateXor(X, Y);
3538 return Builder.CreateIsNeg(NewXor);
3539 }
3540 } else {
3541 if ((TrueIfSignedL && !TrueIfSignedR &&
3542 match(LHS0, m_And(m_Value(X), m_Value(Y))) &&
3543 match(RHS0, m_c_Or(m_Specific(X), m_Specific(Y)))) ||
3544 (!TrueIfSignedL && TrueIfSignedR &&
3545 match(LHS0, m_Or(m_Value(X), m_Value(Y))) &&
3546 match(RHS0, m_c_And(m_Specific(X), m_Specific(Y))))) {
3547 Value *NewXor = Builder.CreateXor(X, Y);
3548 return Builder.CreateIsNotNeg(NewXor);
3549 }
3550 }
3551 }
3552
3553 // (X & ExpMask) != 0 && (X & ExpMask) != ExpMask -> isnormal(X)
3554 // (X & ExpMask) == 0 || (X & ExpMask) == ExpMask -> !isnormal(X)
3555 Value *X;
3556 const APInt *MaskC;
3557 if (LHS0 == RHS0 && PredL == PredR &&
3558 PredL == (IsAnd ? ICmpInst::ICMP_NE : ICmpInst::ICMP_EQ) &&
3559 !I.getFunction()->hasFnAttribute(Attribute::NoImplicitFloat) &&
3560 LHS->hasOneUse() && RHS->hasOneUse() &&
3561 match(LHS0, m_And(m_ElementWiseBitCast(m_Value(X)), m_APInt(MaskC))) &&
3562 X->getType()->getScalarType()->isIEEELikeFPTy() &&
3563 APFloat(X->getType()->getScalarType()->getFltSemantics(), *MaskC)
3564 .isPosInfinity() &&
3565 ((LHSC->isZero() && *RHSC == *MaskC) ||
3566 (RHSC->isZero() && *LHSC == *MaskC)))
3567 return Builder.createIsFPClass(X, IsAnd ? FPClassTest::fcNormal
3569
3570 return foldAndOrOfICmpsUsingRanges(LHS, RHS, IsAnd);
3571}
3572
3573/// If IsLogical is true, then the and/or is in select form and the transform
3574/// must be poison-safe.
3575Value *InstCombinerImpl::foldBooleanAndOr(Value *LHS, Value *RHS,
3576 Instruction &I, bool IsAnd,
3577 bool IsLogical) {
3578 if (!LHS->getType()->isIntOrIntVectorTy(1))
3579 return nullptr;
3580
3581 // handle (roughly):
3582 // (icmp ne (A & B), C) | (icmp ne (A & D), E)
3583 // (icmp eq (A & B), C) & (icmp eq (A & D), E)
3584 if (Value *V = foldLogOpOfMaskedICmps(LHS, RHS, IsAnd, IsLogical, Builder,
3585 SQ.getWithInstruction(&I)))
3586 return V;
3587
3588 if (auto *LHSCmp = dyn_cast<ICmpInst>(LHS))
3589 if (auto *RHSCmp = dyn_cast<ICmpInst>(RHS))
3590 if (Value *Res = foldAndOrOfICmps(LHSCmp, RHSCmp, I, IsAnd, IsLogical))
3591 return Res;
3592
3593 if (auto *LHSCmp = dyn_cast<FCmpInst>(LHS))
3594 if (auto *RHSCmp = dyn_cast<FCmpInst>(RHS))
3595 if (Value *Res = foldLogicOfFCmps(LHSCmp, RHSCmp, IsAnd, IsLogical))
3596 return Res;
3597
3598 if (Value *Res = foldEqOfParts(LHS, RHS, IsAnd))
3599 return Res;
3600
3601 return nullptr;
3602}
3603
3605 InstCombiner::BuilderTy &Builder) {
3606 assert(I.getOpcode() == Instruction::Or &&
3607 "Simplification only supports or at the moment.");
3608
3609 Value *Cmp1, *Cmp2, *Cmp3, *Cmp4;
3610 if (!match(I.getOperand(0), m_And(m_Value(Cmp1), m_Value(Cmp2))) ||
3611 !match(I.getOperand(1), m_And(m_Value(Cmp3), m_Value(Cmp4))))
3612 return nullptr;
3613
3614 // Check if any two pairs of the and operations are inversions of each other.
3615 if (isKnownInversion(Cmp1, Cmp3) && isKnownInversion(Cmp2, Cmp4))
3616 return Builder.CreateXor(Cmp1, Cmp4);
3617 if (isKnownInversion(Cmp1, Cmp4) && isKnownInversion(Cmp2, Cmp3))
3618 return Builder.CreateXor(Cmp1, Cmp3);
3619
3620 return nullptr;
3621}
3622
3623/// Match \p V as "shufflevector -> bitcast" or "extractelement -> zext -> shl"
3624/// patterns, which extract vector elements and pack them in the same relative
3625/// positions.
3626///
3627/// \p Vec is the underlying vector being extracted from.
3628/// \p Mask is a bitmask identifying which packed elements are obtained from the
3629/// vector.
3630/// \p VecOffset is the vector element corresponding to index 0 of the
3631/// mask.
3633 int64_t &VecOffset,
3634 SmallBitVector &Mask,
3635 const DataLayout &DL) {
3636 // First try to match extractelement -> zext -> shl
3637 uint64_t VecIdx, ShlAmt;
3639 m_ConstantInt(VecIdx))),
3640 ShlAmt))) {
3641 auto *VecTy = dyn_cast<FixedVectorType>(Vec->getType());
3642 if (!VecTy)
3643 return false;
3644 auto *EltTy = dyn_cast<IntegerType>(VecTy->getElementType());
3645 if (!EltTy)
3646 return false;
3647
3648 const unsigned EltBitWidth = EltTy->getBitWidth();
3649 const unsigned TargetBitWidth = V->getType()->getIntegerBitWidth();
3650 if (TargetBitWidth % EltBitWidth != 0 || ShlAmt % EltBitWidth != 0)
3651 return false;
3652 const unsigned TargetEltWidth = TargetBitWidth / EltBitWidth;
3653 const unsigned ShlEltAmt = ShlAmt / EltBitWidth;
3654
3655 const unsigned MaskIdx =
3656 DL.isLittleEndian() ? ShlEltAmt : TargetEltWidth - ShlEltAmt - 1;
3657
3658 VecOffset = static_cast<int64_t>(VecIdx) - static_cast<int64_t>(MaskIdx);
3659 Mask.resize(TargetEltWidth);
3660 Mask.set(MaskIdx);
3661 return true;
3662 }
3663
3664 // Now try to match a bitcasted subvector.
3665 Instruction *SrcVecI;
3666 if (!match(V, m_BitCast(m_Instruction(SrcVecI))))
3667 return false;
3668
3669 auto *SrcTy = dyn_cast<FixedVectorType>(SrcVecI->getType());
3670 if (!SrcTy)
3671 return false;
3672
3673 Mask.resize(SrcTy->getNumElements());
3674
3675 // First check for a subvector obtained from a shufflevector.
3676 if (isa<ShuffleVectorInst>(SrcVecI)) {
3677 Constant *ConstVec;
3678 ArrayRef<int> ShuffleMask;
3679 if (!match(SrcVecI, m_Shuffle(m_Value(Vec), m_Constant(ConstVec),
3680 m_Mask(ShuffleMask))))
3681 return false;
3682
3683 auto *VecTy = dyn_cast<FixedVectorType>(Vec->getType());
3684 if (!VecTy)
3685 return false;
3686
3687 const unsigned NumVecElts = VecTy->getNumElements();
3688 bool FoundVecOffset = false;
3689 for (unsigned Idx = 0; Idx < ShuffleMask.size(); ++Idx) {
3690 if (ShuffleMask[Idx] == PoisonMaskElem)
3691 return false;
3692 const unsigned ShuffleIdx = ShuffleMask[Idx];
3693 if (ShuffleIdx >= NumVecElts) {
3694 const unsigned ConstIdx = ShuffleIdx - NumVecElts;
3695 auto *ConstElt =
3696 dyn_cast<ConstantInt>(ConstVec->getAggregateElement(ConstIdx));
3697 if (!ConstElt || !ConstElt->isNullValue())
3698 return false;
3699 continue;
3700 }
3701
3702 if (FoundVecOffset) {
3703 if (VecOffset + Idx != ShuffleIdx)
3704 return false;
3705 } else {
3706 if (ShuffleIdx < Idx)
3707 return false;
3708 VecOffset = ShuffleIdx - Idx;
3709 FoundVecOffset = true;
3710 }
3711 Mask.set(Idx);
3712 }
3713 return FoundVecOffset;
3714 }
3715
3716 // Check for a subvector obtained as an (insertelement V, 0, idx)
3717 uint64_t InsertIdx;
3718 if (!match(SrcVecI,
3719 m_InsertElt(m_Value(Vec), m_Zero(), m_ConstantInt(InsertIdx))))
3720 return false;
3721
3722 auto *VecTy = dyn_cast<FixedVectorType>(Vec->getType());
3723 if (!VecTy)
3724 return false;
3725 VecOffset = 0;
3726 bool AlreadyInsertedMaskedElt = Mask.test(InsertIdx);
3727 Mask.set();
3728 if (!AlreadyInsertedMaskedElt)
3729 Mask.reset(InsertIdx);
3730 return true;
3731}
3732
3733/// Try to fold the join of two scalar integers whose contents are packed
3734/// elements of the same vector.
3736 InstCombiner::BuilderTy &Builder,
3737 const DataLayout &DL) {
3738 assert(I.getOpcode() == Instruction::Or);
3739 Value *LhsVec, *RhsVec;
3740 int64_t LhsVecOffset, RhsVecOffset;
3741 SmallBitVector Mask;
3742 if (!matchSubIntegerPackFromVector(I.getOperand(0), LhsVec, LhsVecOffset,
3743 Mask, DL))
3744 return nullptr;
3745 if (!matchSubIntegerPackFromVector(I.getOperand(1), RhsVec, RhsVecOffset,
3746 Mask, DL))
3747 return nullptr;
3748 if (LhsVec != RhsVec || LhsVecOffset != RhsVecOffset)
3749 return nullptr;
3750
3751 // Convert into shufflevector -> bitcast;
3752 const unsigned ZeroVecIdx =
3753 cast<FixedVectorType>(LhsVec->getType())->getNumElements();
3754 SmallVector<int> ShuffleMask(Mask.size(), ZeroVecIdx);
3755 for (unsigned Idx : Mask.set_bits()) {
3756 assert(LhsVecOffset + Idx >= 0);
3757 ShuffleMask[Idx] = LhsVecOffset + Idx;
3758 }
3759
3760 Value *MaskedVec = Builder.CreateShuffleVector(
3761 LhsVec, Constant::getNullValue(LhsVec->getType()), ShuffleMask,
3762 I.getName() + ".v");
3763 return CastInst::Create(Instruction::BitCast, MaskedVec, I.getType());
3764}
3765
3766/// Match \p V as "lshr -> mask -> zext -> shl".
3767///
3768/// \p Int is the underlying integer being extracted from.
3769/// \p Mask is a bitmask identifying which bits of the integer are being
3770/// extracted. \p Offset identifies which bit of the result \p V corresponds to
3771/// the least significant bit of \p Int
3772static bool matchZExtedSubInteger(Value *V, Value *&Int, APInt &Mask,
3773 uint64_t &Offset, bool &IsShlNUW,
3774 bool &IsShlNSW) {
3775 Value *ShlOp0;
3776 uint64_t ShlAmt = 0;
3777 if (!match(V, m_OneUse(m_Shl(m_Value(ShlOp0), m_ConstantInt(ShlAmt)))))
3778 return false;
3779
3780 IsShlNUW = cast<BinaryOperator>(V)->hasNoUnsignedWrap();
3781 IsShlNSW = cast<BinaryOperator>(V)->hasNoSignedWrap();
3782
3783 Value *ZExtOp0;
3784 if (!match(ShlOp0, m_OneUse(m_ZExt(m_Value(ZExtOp0)))))
3785 return false;
3786
3787 Value *MaskedOp0;
3788 const APInt *ShiftedMaskConst = nullptr;
3789 if (!match(ZExtOp0, m_CombineOr(m_OneUse(m_And(m_Value(MaskedOp0),
3790 m_APInt(ShiftedMaskConst))),
3791 m_Value(MaskedOp0))))
3792 return false;
3793
3794 uint64_t LShrAmt = 0;
3795 if (!match(MaskedOp0,
3797 m_Value(Int))))
3798 return false;
3799
3800 if (LShrAmt > ShlAmt)
3801 return false;
3802 Offset = ShlAmt - LShrAmt;
3803
3804 Mask = ShiftedMaskConst ? ShiftedMaskConst->shl(LShrAmt)
3806 Int->getType()->getScalarSizeInBits(), LShrAmt);
3807
3808 return true;
3809}
3810
3811/// Try to fold the join of two scalar integers whose bits are unpacked and
3812/// zexted from the same source integer.
3814 InstCombiner::BuilderTy &Builder) {
3815
3816 Value *LhsInt, *RhsInt;
3817 APInt LhsMask, RhsMask;
3818 uint64_t LhsOffset, RhsOffset;
3819 bool IsLhsShlNUW, IsLhsShlNSW, IsRhsShlNUW, IsRhsShlNSW;
3820 if (!matchZExtedSubInteger(Lhs, LhsInt, LhsMask, LhsOffset, IsLhsShlNUW,
3821 IsLhsShlNSW))
3822 return nullptr;
3823 if (!matchZExtedSubInteger(Rhs, RhsInt, RhsMask, RhsOffset, IsRhsShlNUW,
3824 IsRhsShlNSW))
3825 return nullptr;
3826 if (LhsInt != RhsInt || LhsOffset != RhsOffset)
3827 return nullptr;
3828
3829 APInt Mask = LhsMask | RhsMask;
3830
3831 Type *DestTy = Lhs->getType();
3832 Value *Res = Builder.CreateShl(
3833 Builder.CreateZExt(
3834 Builder.CreateAnd(LhsInt, Mask, LhsInt->getName() + ".mask"), DestTy,
3835 LhsInt->getName() + ".zext"),
3836 ConstantInt::get(DestTy, LhsOffset), "", IsLhsShlNUW && IsRhsShlNUW,
3837 IsLhsShlNSW && IsRhsShlNSW);
3838 Res->takeName(Lhs);
3839 return Res;
3840}
3841
3842// A decomposition of ((X & Mask) * Factor). The NUW / NSW bools
3843// track these properities for preservation. Note that we can decompose
3844// equivalent select form of this expression (e.g. (!(X & Mask) ? 0 : Mask *
3845// Factor))
3850 bool NUW;
3851 bool NSW;
3852
3854 return X == Other.X && !Mask.intersects(Other.Mask) &&
3855 Factor == Other.Factor;
3856 }
3857};
3858
3859static std::optional<DecomposedBitMaskMul> matchBitmaskMul(Value *V) {
3861 if (!Op)
3862 return std::nullopt;
3863
3864 // Decompose (A & N) * C) into BitMaskMul
3865 Value *Original = nullptr;
3866 const APInt *Mask = nullptr;
3867 const APInt *MulConst = nullptr;
3868 if (match(Op, m_Mul(m_And(m_Value(Original), m_APInt(Mask)),
3869 m_APInt(MulConst)))) {
3870 if (MulConst->isZero() || Mask->isZero())
3871 return std::nullopt;
3872
3873 return std::optional<DecomposedBitMaskMul>(
3874 {Original, *MulConst, *Mask,
3875 cast<BinaryOperator>(Op)->hasNoUnsignedWrap(),
3876 cast<BinaryOperator>(Op)->hasNoSignedWrap()});
3877 }
3878
3879 Value *Cond = nullptr;
3880 const APInt *EqZero = nullptr, *NeZero = nullptr;
3881
3882 // Decompose ((A & N) ? 0 : N * C) into BitMaskMul
3883 if (match(Op, m_Select(m_Value(Cond), m_APInt(EqZero), m_APInt(NeZero)))) {
3884 auto ICmpDecompose =
3885 decomposeBitTest(Cond, /*LookThruTrunc=*/true,
3886 /*AllowNonZeroC=*/false, /*DecomposeBitMask=*/true);
3887 if (!ICmpDecompose.has_value())
3888 return std::nullopt;
3889
3890 assert(ICmpInst::isEquality(ICmpDecompose->Pred) &&
3891 ICmpDecompose->C.isZero());
3892
3893 if (ICmpDecompose->Pred == ICmpInst::ICMP_NE)
3894 std::swap(EqZero, NeZero);
3895
3896 if (!EqZero->isZero() || NeZero->isZero())
3897 return std::nullopt;
3898
3899 if (!ICmpDecompose->Mask.isPowerOf2() || ICmpDecompose->Mask.isZero() ||
3900 NeZero->getBitWidth() != ICmpDecompose->Mask.getBitWidth())
3901 return std::nullopt;
3902
3903 if (!NeZero->urem(ICmpDecompose->Mask).isZero())
3904 return std::nullopt;
3905
3906 return std::optional<DecomposedBitMaskMul>(
3907 {ICmpDecompose->X, NeZero->udiv(ICmpDecompose->Mask),
3908 ICmpDecompose->Mask, /*NUW=*/false, /*NSW=*/false});
3909 }
3910
3911 return std::nullopt;
3912}
3913
3914/// (A & N) * C + (A & M) * C -> (A & (N + M)) & C
3915/// This also accepts the equivalent select form of (A & N) * C
3916/// expressions i.e. !(A & N) ? 0 : N * C)
3917static Value *foldBitmaskMul(Value *Op0, Value *Op1,
3918 InstCombiner::BuilderTy &Builder) {
3919 auto Decomp1 = matchBitmaskMul(Op1);
3920 if (!Decomp1)
3921 return nullptr;
3922
3923 auto Decomp0 = matchBitmaskMul(Op0);
3924 if (!Decomp0)
3925 return nullptr;
3926
3927 if (Decomp0->isCombineableWith(*Decomp1)) {
3928 Value *NewAnd = Builder.CreateAnd(
3929 Decomp0->X,
3930 ConstantInt::get(Decomp0->X->getType(), Decomp0->Mask + Decomp1->Mask));
3931
3932 return Builder.CreateMul(
3933 NewAnd, ConstantInt::get(NewAnd->getType(), Decomp1->Factor), "",
3934 Decomp0->NUW && Decomp1->NUW, Decomp0->NSW && Decomp1->NSW);
3935 }
3936
3937 return nullptr;
3938}
3939
3940Value *InstCombinerImpl::foldDisjointOr(Value *LHS, Value *RHS) {
3941 if (Value *Res = foldBitmaskMul(LHS, RHS, Builder))
3942 return Res;
3944 return Res;
3945
3946 return nullptr;
3947}
3948
3949Value *InstCombinerImpl::reassociateDisjointOr(Value *LHS, Value *RHS) {
3950
3951 Value *X, *Y;
3953 if (Value *Res = foldDisjointOr(LHS, X))
3954 return Builder.CreateOr(Res, Y, "", /*IsDisjoint=*/true);
3955 if (Value *Res = foldDisjointOr(LHS, Y))
3956 return Builder.CreateOr(Res, X, "", /*IsDisjoint=*/true);
3957 }
3958
3960 if (Value *Res = foldDisjointOr(X, RHS))
3961 return Builder.CreateOr(Res, Y, "", /*IsDisjoint=*/true);
3962 if (Value *Res = foldDisjointOr(Y, RHS))
3963 return Builder.CreateOr(Res, X, "", /*IsDisjoint=*/true);
3964 }
3965
3966 return nullptr;
3967}
3968
3969/// Fold Res, Overflow = (umul.with.overflow x c1); (or Overflow (ugt Res c2))
3970/// --> (ugt x (c2/c1)). This code checks whether a multiplication of two
3971/// unsigned numbers (one is a constant) is mathematically greater than a
3972/// second constant.
3974 InstCombiner::BuilderTy &Builder,
3975 const DataLayout &DL) {
3976 Value *WOV, *X;
3977 const APInt *C1, *C2;
3978 if (match(&I,
3981 m_Value(X), m_APInt(C1)))),
3984 m_APInt(C2))))) &&
3985 !C1->isZero()) {
3986 Constant *NewC = ConstantInt::get(X->getType(), C2->udiv(*C1));
3987 return Builder.CreateICmp(ICmpInst::ICMP_UGT, X, NewC);
3988 }
3989 return nullptr;
3990}
3991
3992// FIXME: We use commutative matchers (m_c_*) for some, but not all, matches
3993// here. We should standardize that construct where it is needed or choose some
3994// other way to ensure that commutated variants of patterns are not missed.
3996 if (Value *V = simplifyOrInst(I.getOperand(0), I.getOperand(1),
3997 SQ.getWithInstruction(&I)))
3998 return replaceInstUsesWith(I, V);
3999
4001 return &I;
4002
4004 return X;
4005
4007 return Phi;
4008
4009 // See if we can simplify any instructions used by the instruction whose sole
4010 // purpose is to compute bits we don't care about.
4012 return &I;
4013
4014 // Do this before using distributive laws to catch simple and/or/not patterns.
4016 return Xor;
4017
4019 return X;
4020
4022 return X;
4023
4024 // (A & B) | (C & D) -> A ^ D where A == ~C && B == ~D
4025 // (A & B) | (C & D) -> A ^ C where A == ~D && B == ~C
4026 if (Value *V = foldOrOfInversions(I, Builder))
4027 return replaceInstUsesWith(I, V);
4028
4029 // (A&B)|(A&C) -> A&(B|C) etc
4031 return replaceInstUsesWith(I, V);
4032
4033 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
4034 Type *Ty = I.getType();
4035 if (Ty->isIntOrIntVectorTy(1)) {
4036 if (auto *SI0 = dyn_cast<SelectInst>(Op0)) {
4037 if (auto *R =
4038 foldAndOrOfSelectUsingImpliedCond(Op1, *SI0, /* IsAnd */ false))
4039 return R;
4040 }
4041 if (auto *SI1 = dyn_cast<SelectInst>(Op1)) {
4042 if (auto *R =
4043 foldAndOrOfSelectUsingImpliedCond(Op0, *SI1, /* IsAnd */ false))
4044 return R;
4045 }
4046 }
4047
4048 if (Instruction *FoldedLogic = foldBinOpIntoSelectOrPhi(I))
4049 return FoldedLogic;
4050
4051 if (Instruction *BitOp = matchBSwapOrBitReverse(I, /*MatchBSwaps*/ true,
4052 /*MatchBitReversals*/ true))
4053 return BitOp;
4054
4055 if (Instruction *Funnel = matchFunnelShift(I, *this))
4056 return Funnel;
4057
4059 return replaceInstUsesWith(I, Concat);
4060
4062 return R;
4063
4065 return R;
4066
4067 if (cast<PossiblyDisjointInst>(I).isDisjoint()) {
4068 if (Instruction *R =
4069 foldAddLikeCommutative(I.getOperand(0), I.getOperand(1),
4070 /*NSW=*/true, /*NUW=*/true))
4071 return R;
4072 if (Instruction *R =
4073 foldAddLikeCommutative(I.getOperand(1), I.getOperand(0),
4074 /*NSW=*/true, /*NUW=*/true))
4075 return R;
4076
4077 if (Value *Res = foldDisjointOr(I.getOperand(0), I.getOperand(1)))
4078 return replaceInstUsesWith(I, Res);
4079
4080 if (Value *Res = reassociateDisjointOr(I.getOperand(0), I.getOperand(1)))
4081 return replaceInstUsesWith(I, Res);
4082 }
4083
4084 Value *X, *Y;
4085 const APInt *CV;
4086 if (match(&I, m_c_Or(m_OneUse(m_Xor(m_Value(X), m_APInt(CV))), m_Value(Y))) &&
4087 !CV->isAllOnes() && MaskedValueIsZero(Y, *CV, &I)) {
4088 // (X ^ C) | Y -> (X | Y) ^ C iff Y & C == 0
4089 // The check for a 'not' op is for efficiency (if Y is known zero --> ~X).
4090 Value *Or = Builder.CreateOr(X, Y);
4091 return BinaryOperator::CreateXor(Or, ConstantInt::get(Ty, *CV));
4092 }
4093
4094 // If the operands have no common bits set:
4095 // or (mul X, Y), X --> add (mul X, Y), X --> mul X, (Y + 1)
4097 m_Deferred(X)))) {
4098 Value *IncrementY = Builder.CreateAdd(Y, ConstantInt::get(Ty, 1));
4099 return BinaryOperator::CreateMul(X, IncrementY);
4100 }
4101
4102 // (A & C) | (B & D)
4103 Value *A, *B, *C, *D;
4104 if (match(Op0, m_And(m_Value(A), m_Value(C))) &&
4105 match(Op1, m_And(m_Value(B), m_Value(D)))) {
4106
4107 // (A & C0) | (B & C1)
4108 const APInt *C0, *C1;
4109 if (match(C, m_APInt(C0)) && match(D, m_APInt(C1))) {
4110 Value *X;
4111 if (*C0 == ~*C1) {
4112 // ((X | B) & MaskC) | (B & ~MaskC) -> (X & MaskC) | B
4113 if (match(A, m_c_Or(m_Value(X), m_Specific(B))))
4114 return BinaryOperator::CreateOr(Builder.CreateAnd(X, *C0), B);
4115 // (A & MaskC) | ((X | A) & ~MaskC) -> (X & ~MaskC) | A
4116 if (match(B, m_c_Or(m_Specific(A), m_Value(X))))
4117 return BinaryOperator::CreateOr(Builder.CreateAnd(X, *C1), A);
4118
4119 // ((X ^ B) & MaskC) | (B & ~MaskC) -> (X & MaskC) ^ B
4120 if (match(A, m_c_Xor(m_Value(X), m_Specific(B))))
4121 return BinaryOperator::CreateXor(Builder.CreateAnd(X, *C0), B);
4122 // (A & MaskC) | ((X ^ A) & ~MaskC) -> (X & ~MaskC) ^ A
4123 if (match(B, m_c_Xor(m_Specific(A), m_Value(X))))
4124 return BinaryOperator::CreateXor(Builder.CreateAnd(X, *C1), A);
4125 }
4126
4127 if ((*C0 & *C1).isZero()) {
4128 // ((X | B) & C0) | (B & C1) --> (X | B) & (C0 | C1)
4129 // iff (C0 & C1) == 0 and (X & ~C0) == 0
4130 if (match(A, m_c_Or(m_Value(X), m_Specific(B))) &&
4131 MaskedValueIsZero(X, ~*C0, &I)) {
4132 Constant *C01 = ConstantInt::get(Ty, *C0 | *C1);
4133 return BinaryOperator::CreateAnd(A, C01);
4134 }
4135 // (A & C0) | ((X | A) & C1) --> (X | A) & (C0 | C1)
4136 // iff (C0 & C1) == 0 and (X & ~C1) == 0
4137 if (match(B, m_c_Or(m_Value(X), m_Specific(A))) &&
4138 MaskedValueIsZero(X, ~*C1, &I)) {
4139 Constant *C01 = ConstantInt::get(Ty, *C0 | *C1);
4140 return BinaryOperator::CreateAnd(B, C01);
4141 }
4142 // ((X | C2) & C0) | ((X | C3) & C1) --> (X | C2 | C3) & (C0 | C1)
4143 // iff (C0 & C1) == 0 and (C2 & ~C0) == 0 and (C3 & ~C1) == 0.
4144 const APInt *C2, *C3;
4145 if (match(A, m_Or(m_Value(X), m_APInt(C2))) &&
4146 match(B, m_Or(m_Specific(X), m_APInt(C3))) &&
4147 (*C2 & ~*C0).isZero() && (*C3 & ~*C1).isZero()) {
4148 Value *Or = Builder.CreateOr(X, *C2 | *C3, "bitfield");
4149 Constant *C01 = ConstantInt::get(Ty, *C0 | *C1);
4150 return BinaryOperator::CreateAnd(Or, C01);
4151 }
4152 }
4153 }
4154
4155 // Don't try to form a select if it's unlikely that we'll get rid of at
4156 // least one of the operands. A select is generally more expensive than the
4157 // 'or' that it is replacing.
4158 if (Op0->hasOneUse() || Op1->hasOneUse()) {
4159 // (Cond & C) | (~Cond & D) -> Cond ? C : D, and commuted variants.
4160 if (Value *V = matchSelectFromAndOr(A, C, B, D))
4161 return replaceInstUsesWith(I, V);
4162 if (Value *V = matchSelectFromAndOr(A, C, D, B))
4163 return replaceInstUsesWith(I, V);
4164 if (Value *V = matchSelectFromAndOr(C, A, B, D))
4165 return replaceInstUsesWith(I, V);
4166 if (Value *V = matchSelectFromAndOr(C, A, D, B))
4167 return replaceInstUsesWith(I, V);
4168 if (Value *V = matchSelectFromAndOr(B, D, A, C))
4169 return replaceInstUsesWith(I, V);
4170 if (Value *V = matchSelectFromAndOr(B, D, C, A))
4171 return replaceInstUsesWith(I, V);
4172 if (Value *V = matchSelectFromAndOr(D, B, A, C))
4173 return replaceInstUsesWith(I, V);
4174 if (Value *V = matchSelectFromAndOr(D, B, C, A))
4175 return replaceInstUsesWith(I, V);
4176 }
4177 }
4178
4179 if (match(Op0, m_And(m_Value(A), m_Value(C))) &&
4180 match(Op1, m_Not(m_Or(m_Value(B), m_Value(D)))) &&
4181 (Op0->hasOneUse() || Op1->hasOneUse())) {
4182 // (Cond & C) | ~(Cond | D) -> Cond ? C : ~D
4183 if (Value *V = matchSelectFromAndOr(A, C, B, D, true))
4184 return replaceInstUsesWith(I, V);
4185 if (Value *V = matchSelectFromAndOr(A, C, D, B, true))
4186 return replaceInstUsesWith(I, V);
4187 if (Value *V = matchSelectFromAndOr(C, A, B, D, true))
4188 return replaceInstUsesWith(I, V);
4189 if (Value *V = matchSelectFromAndOr(C, A, D, B, true))
4190 return replaceInstUsesWith(I, V);
4191 }
4192
4193 // (A ^ B) | ((B ^ C) ^ A) -> (A ^ B) | C
4194 if (match(Op0, m_Xor(m_Value(A), m_Value(B))))
4195 if (match(Op1,
4198 return BinaryOperator::CreateOr(Op0, C);
4199
4200 // ((B ^ C) ^ A) | (A ^ B) -> (A ^ B) | C
4201 if (match(Op1, m_Xor(m_Value(A), m_Value(B))))
4202 if (match(Op0,
4205 return BinaryOperator::CreateOr(Op1, C);
4206
4207 if (Instruction *DeMorgan = matchDeMorgansLaws(I, *this))
4208 return DeMorgan;
4209
4210 // Canonicalize xor to the RHS.
4211 bool SwappedForXor = false;
4212 if (match(Op0, m_Xor(m_Value(), m_Value()))) {
4213 std::swap(Op0, Op1);
4214 SwappedForXor = true;
4215 }
4216
4217 if (match(Op1, m_Xor(m_Value(A), m_Value(B)))) {
4218 // (A | ?) | (A ^ B) --> (A | ?) | B
4219 // (B | ?) | (A ^ B) --> (B | ?) | A
4220 if (match(Op0, m_c_Or(m_Specific(A), m_Value())))
4221 return BinaryOperator::CreateOr(Op0, B);
4222 if (match(Op0, m_c_Or(m_Specific(B), m_Value())))
4223 return BinaryOperator::CreateOr(Op0, A);
4224
4225 // (A & B) | (A ^ B) --> A | B
4226 // (B & A) | (A ^ B) --> A | B
4227 if (match(Op0, m_c_And(m_Specific(A), m_Specific(B))))
4228 return BinaryOperator::CreateOr(A, B);
4229
4230 // ~A | (A ^ B) --> ~(A & B)
4231 // ~B | (A ^ B) --> ~(A & B)
4232 // The swap above should always make Op0 the 'not'.
4233 if ((Op0->hasOneUse() || Op1->hasOneUse()) &&
4234 (match(Op0, m_Not(m_Specific(A))) || match(Op0, m_Not(m_Specific(B)))))
4235 return BinaryOperator::CreateNot(Builder.CreateAnd(A, B));
4236
4237 // Same as above, but peek through an 'and' to the common operand:
4238 // ~(A & ?) | (A ^ B) --> ~((A & ?) & B)
4239 // ~(B & ?) | (A ^ B) --> ~((B & ?) & A)
4241 if ((Op0->hasOneUse() || Op1->hasOneUse()) &&
4242 match(Op0,
4244 return BinaryOperator::CreateNot(Builder.CreateAnd(And, B));
4245 if ((Op0->hasOneUse() || Op1->hasOneUse()) &&
4246 match(Op0,
4248 return BinaryOperator::CreateNot(Builder.CreateAnd(And, A));
4249
4250 // (~A | C) | (A ^ B) --> ~(A & B) | C
4251 // (~B | C) | (A ^ B) --> ~(A & B) | C
4252 if (Op0->hasOneUse() && Op1->hasOneUse() &&
4253 (match(Op0, m_c_Or(m_Not(m_Specific(A)), m_Value(C))) ||
4254 match(Op0, m_c_Or(m_Not(m_Specific(B)), m_Value(C))))) {
4255 Value *Nand = Builder.CreateNot(Builder.CreateAnd(A, B), "nand");
4256 return BinaryOperator::CreateOr(Nand, C);
4257 }
4258 }
4259
4260 if (SwappedForXor)
4261 std::swap(Op0, Op1);
4262
4263 if (Value *Res =
4264 foldBooleanAndOr(Op0, Op1, I, /*IsAnd=*/false, /*IsLogical=*/false))
4265 return replaceInstUsesWith(I, Res);
4266
4267 if (match(Op1, m_OneUse(m_LogicalOr(m_Value(X), m_Value(Y))))) {
4268 bool IsLogical = isa<SelectInst>(Op1);
4269 if (auto *V = reassociateBooleanAndOr(Op0, X, Y, I, /*IsAnd=*/false,
4270 /*RHSIsLogical=*/IsLogical))
4271 return replaceInstUsesWith(I, V);
4272 }
4273 if (match(Op0, m_OneUse(m_LogicalOr(m_Value(X), m_Value(Y))))) {
4274 bool IsLogical = isa<SelectInst>(Op0);
4275 if (auto *V = reassociateBooleanAndOr(Op1, X, Y, I, /*IsAnd=*/false,
4276 /*RHSIsLogical=*/IsLogical))
4277 return replaceInstUsesWith(I, V);
4278 }
4279
4280 if (Instruction *FoldedFCmps = reassociateFCmps(I, Builder))
4281 return FoldedFCmps;
4282
4283 if (Instruction *CastedOr = foldCastedBitwiseLogic(I))
4284 return CastedOr;
4285
4286 if (Instruction *Sel = foldBinopOfSextBoolToSelect(I))
4287 return Sel;
4288
4289 // or(sext(A), B) / or(B, sext(A)) --> A ? -1 : B, where A is i1 or <N x i1>.
4290 // TODO: Move this into foldBinopOfSextBoolToSelect as a more generalized fold
4291 // with binop identity constant. But creating a select with non-constant
4292 // arm may not be reversible due to poison semantics. Is that a good
4293 // canonicalization?
4294 if (match(&I, m_c_Or(m_OneUse(m_SExt(m_Value(A))), m_Value(B))) &&
4295 A->getType()->isIntOrIntVectorTy(1))
4297
4298 // Note: If we've gotten to the point of visiting the outer OR, then the
4299 // inner one couldn't be simplified. If it was a constant, then it won't
4300 // be simplified by a later pass either, so we try swapping the inner/outer
4301 // ORs in the hopes that we'll be able to simplify it this way.
4302 // (X|C) | V --> (X|V) | C
4303 // Pass the disjoint flag in the following two patterns:
4304 // 1. or-disjoint (or-disjoint X, C), V -->
4305 // or-disjoint (or-disjoint X, V), C
4306 //
4307 // 2. or-disjoint (or X, C), V -->
4308 // or (or-disjoint X, V), C
4309 ConstantInt *CI;
4310 if (Op0->hasOneUse() && !match(Op1, m_ConstantInt()) &&
4311 match(Op0, m_Or(m_Value(A), m_ConstantInt(CI)))) {
4312 bool IsDisjointOuter = cast<PossiblyDisjointInst>(I).isDisjoint();
4313 bool IsDisjointInner = cast<PossiblyDisjointInst>(Op0)->isDisjoint();
4314 Value *Inner = Builder.CreateOr(A, Op1);
4315 cast<PossiblyDisjointInst>(Inner)->setIsDisjoint(IsDisjointOuter);
4316 Inner->takeName(Op0);
4317 return IsDisjointOuter && IsDisjointInner
4318 ? BinaryOperator::CreateDisjointOr(Inner, CI)
4319 : BinaryOperator::CreateOr(Inner, CI);
4320 }
4321
4322 // Change (or (bool?A:B),(bool?C:D)) --> (bool?(or A,C):(or B,D))
4323 // Since this OR statement hasn't been optimized further yet, we hope
4324 // that this transformation will allow the new ORs to be optimized.
4325 {
4326 Value *X = nullptr, *Y = nullptr;
4327 if (Op0->hasOneUse() && Op1->hasOneUse() &&
4328 match(Op0, m_Select(m_Value(X), m_Value(A), m_Value(B))) &&
4329 match(Op1, m_Select(m_Value(Y), m_Value(C), m_Value(D))) && X == Y) {
4330 Value *orTrue = Builder.CreateOr(A, C);
4331 Value *orFalse = Builder.CreateOr(B, D);
4332 return SelectInst::Create(X, orTrue, orFalse);
4333 }
4334 }
4335
4336 // or(ashr(subNSW(Y, X), ScalarSizeInBits(Y) - 1), X) --> X s> Y ? -1 : X.
4337 {
4338 Value *X, *Y;
4341 m_SpecificInt(Ty->getScalarSizeInBits() - 1))),
4342 m_Deferred(X)))) {
4343 Value *NewICmpInst = Builder.CreateICmpSGT(X, Y);
4345 return SelectInst::Create(NewICmpInst, AllOnes, X);
4346 }
4347 }
4348
4349 {
4350 // ((A & B) ^ A) | ((A & B) ^ B) -> A ^ B
4351 // (A ^ (A & B)) | (B ^ (A & B)) -> A ^ B
4352 // ((A & B) ^ B) | ((A & B) ^ A) -> A ^ B
4353 // (B ^ (A & B)) | (A ^ (A & B)) -> A ^ B
4354 const auto TryXorOpt = [&](Value *Lhs, Value *Rhs) -> Instruction * {
4355 if (match(Lhs, m_c_Xor(m_And(m_Value(A), m_Value(B)), m_Deferred(A))) &&
4356 match(Rhs,
4358 return BinaryOperator::CreateXor(A, B);
4359 }
4360 return nullptr;
4361 };
4362
4363 if (Instruction *Result = TryXorOpt(Op0, Op1))
4364 return Result;
4365 if (Instruction *Result = TryXorOpt(Op1, Op0))
4366 return Result;
4367 }
4368
4369 if (Instruction *V =
4371 return V;
4372
4373 CmpPredicate Pred;
4374 Value *Mul, *Ov, *MulIsNotZero, *UMulWithOv;
4375 // Check if the OR weakens the overflow condition for umul.with.overflow by
4376 // treating any non-zero result as overflow. In that case, we overflow if both
4377 // umul.with.overflow operands are != 0, as in that case the result can only
4378 // be 0, iff the multiplication overflows.
4379 if (match(&I, m_c_Or(m_Value(Ov, m_ExtractValue<1>(m_Value(UMulWithOv))),
4380 m_Value(MulIsNotZero,
4384 m_Deferred(UMulWithOv))),
4385 m_ZeroInt())))) &&
4386 (Ov->hasOneUse() || (MulIsNotZero->hasOneUse() && Mul->hasOneUse()))) {
4387 Value *A, *B;
4389 m_Value(A), m_Value(B)))) {
4390 Value *NotNullA = Builder.CreateIsNotNull(A);
4391 Value *NotNullB = Builder.CreateIsNotNull(B);
4392 return BinaryOperator::CreateAnd(NotNullA, NotNullB);
4393 }
4394 }
4395
4396 /// Res, Overflow = xxx_with_overflow X, C1
4397 /// Try to canonicalize the pattern "Overflow | icmp pred Res, C2" into
4398 /// "Overflow | icmp pred X, C2 +/- C1".
4399 const WithOverflowInst *WO;
4400 const Value *WOV;
4401 const APInt *C1, *C2;
4403 m_Value(WOV, m_WithOverflowInst(WO)))),
4405 m_APInt(C2))))) &&
4406 (WO->getBinaryOp() == Instruction::Add ||
4407 WO->getBinaryOp() == Instruction::Sub) &&
4408 (ICmpInst::isEquality(Pred) ||
4409 WO->isSigned() == ICmpInst::isSigned(Pred)) &&
4410 match(WO->getRHS(), m_APInt(C1))) {
4411 bool Overflow;
4412 APInt NewC = WO->getBinaryOp() == Instruction::Add
4413 ? (ICmpInst::isSigned(Pred) ? C2->ssub_ov(*C1, Overflow)
4414 : C2->usub_ov(*C1, Overflow))
4415 : (ICmpInst::isSigned(Pred) ? C2->sadd_ov(*C1, Overflow)
4416 : C2->uadd_ov(*C1, Overflow));
4417 if (!Overflow || ICmpInst::isEquality(Pred)) {
4418 Value *NewCmp = Builder.CreateICmp(
4419 Pred, WO->getLHS(), ConstantInt::get(WO->getLHS()->getType(), NewC));
4420 return BinaryOperator::CreateOr(Ov, NewCmp);
4421 }
4422 }
4423
4424 // Try to fold the pattern "Overflow | icmp pred Res, C2" into a single
4425 // comparison instruction for umul.with.overflow.
4427 return replaceInstUsesWith(I, R);
4428
4429 // (~x) | y --> ~(x & (~y)) iff that gets rid of inversions
4431 return &I;
4432
4433 // Improve "get low bit mask up to and including bit X" pattern:
4434 // (1 << X) | ((1 << X) + -1) --> -1 l>> (bitwidth(x) - 1 - X)
4435 if (match(&I, m_c_Or(m_Add(m_Shl(m_One(), m_Value(X)), m_AllOnes()),
4436 m_Shl(m_One(), m_Deferred(X)))) &&
4437 match(&I, m_c_Or(m_OneUse(m_Value()), m_Value()))) {
4438 Value *Sub = Builder.CreateSub(
4439 ConstantInt::get(Ty, Ty->getScalarSizeInBits() - 1), X);
4440 return BinaryOperator::CreateLShr(Constant::getAllOnesValue(Ty), Sub);
4441 }
4442
4443 // An or recurrence w/loop invariant step is equivelent to (or start, step)
4444 PHINode *PN = nullptr;
4445 Value *Start = nullptr, *Step = nullptr;
4446 if (matchSimpleRecurrence(&I, PN, Start, Step) && DT.dominates(Step, PN))
4447 return replaceInstUsesWith(I, Builder.CreateOr(Start, Step));
4448
4449 // (A & B) | (C | D) or (C | D) | (A & B)
4450 // Can be combined if C or D is of type (A/B & X)
4452 m_OneUse(m_Or(m_Value(C), m_Value(D)))))) {
4453 // (A & B) | (C | ?) -> C | (? | (A & B))
4454 // (A & B) | (C | ?) -> C | (? | (A & B))
4455 // (A & B) | (C | ?) -> C | (? | (A & B))
4456 // (A & B) | (C | ?) -> C | (? | (A & B))
4457 // (C | ?) | (A & B) -> C | (? | (A & B))
4458 // (C | ?) | (A & B) -> C | (? | (A & B))
4459 // (C | ?) | (A & B) -> C | (? | (A & B))
4460 // (C | ?) | (A & B) -> C | (? | (A & B))
4461 if (match(D, m_OneUse(m_c_And(m_Specific(A), m_Value()))) ||
4463 return BinaryOperator::CreateOr(
4464 C, Builder.CreateOr(D, Builder.CreateAnd(A, B)));
4465 // (A & B) | (? | D) -> (? | (A & B)) | D
4466 // (A & B) | (? | D) -> (? | (A & B)) | D
4467 // (A & B) | (? | D) -> (? | (A & B)) | D
4468 // (A & B) | (? | D) -> (? | (A & B)) | D
4469 // (? | D) | (A & B) -> (? | (A & B)) | D
4470 // (? | D) | (A & B) -> (? | (A & B)) | D
4471 // (? | D) | (A & B) -> (? | (A & B)) | D
4472 // (? | D) | (A & B) -> (? | (A & B)) | D
4473 if (match(C, m_OneUse(m_c_And(m_Specific(A), m_Value()))) ||
4475 return BinaryOperator::CreateOr(
4476 Builder.CreateOr(C, Builder.CreateAnd(A, B)), D);
4477 }
4478
4480 return R;
4481
4482 if (Instruction *Canonicalized = canonicalizeLogicFirst(I, Builder))
4483 return Canonicalized;
4484
4485 if (Instruction *Folded = foldLogicOfIsFPClass(I, Op0, Op1))
4486 return Folded;
4487
4488 if (Instruction *Res = foldBinOpOfDisplacedShifts(I))
4489 return Res;
4490
4491 // If we are setting the sign bit of a floating-point value, convert
4492 // this to fneg(fabs), then cast back to integer.
4493 //
4494 // If the result isn't immediately cast back to a float, this will increase
4495 // the number of instructions. This is still probably a better canonical form
4496 // as it enables FP value tracking.
4497 //
4498 // Assumes any IEEE-represented type has the sign bit in the high bit.
4499 //
4500 // This is generous interpretation of noimplicitfloat, this is not a true
4501 // floating-point operation.
4502 Value *CastOp;
4503 if (match(Op0, m_ElementWiseBitCast(m_Value(CastOp))) &&
4504 match(Op1, m_SignMask()) &&
4505 !Builder.GetInsertBlock()->getParent()->hasFnAttribute(
4506 Attribute::NoImplicitFloat)) {
4507 Type *EltTy = CastOp->getType()->getScalarType();
4508 if (EltTy->isFloatingPointTy() &&
4510 Value *FAbs = Builder.CreateUnaryIntrinsic(Intrinsic::fabs, CastOp);
4511 Value *FNegFAbs = Builder.CreateFNeg(FAbs);
4512 return new BitCastInst(FNegFAbs, I.getType());
4513 }
4514 }
4515
4516 // (X & C1) | C2 -> X & (C1 | C2) iff (X & C2) == C2
4517 if (match(Op0, m_OneUse(m_And(m_Value(X), m_APInt(C1)))) &&
4518 match(Op1, m_APInt(C2))) {
4519 KnownBits KnownX = computeKnownBits(X, &I);
4520 if ((KnownX.One & *C2) == *C2)
4521 return BinaryOperator::CreateAnd(X, ConstantInt::get(Ty, *C1 | *C2));
4522 }
4523
4525 return Res;
4526
4527 if (Value *V =
4529 /*SimplifyOnly*/ false, *this))
4530 return BinaryOperator::CreateOr(V, Op1);
4531 if (Value *V =
4533 /*SimplifyOnly*/ false, *this))
4534 return BinaryOperator::CreateOr(Op0, V);
4535
4536 if (cast<PossiblyDisjointInst>(I).isDisjoint())
4538 return replaceInstUsesWith(I, V);
4539
4540 return nullptr;
4541}
4542
4543/// A ^ B can be specified using other logic ops in a variety of patterns. We
4544/// can fold these early and efficiently by morphing an existing instruction.
4546 InstCombiner::BuilderTy &Builder) {
4547 assert(I.getOpcode() == Instruction::Xor);
4548 Value *Op0 = I.getOperand(0);
4549 Value *Op1 = I.getOperand(1);
4550 Value *A, *B;
4551
4552 // There are 4 commuted variants for each of the basic patterns.
4553
4554 // (A & B) ^ (A | B) -> A ^ B
4555 // (A & B) ^ (B | A) -> A ^ B
4556 // (A | B) ^ (A & B) -> A ^ B
4557 // (A | B) ^ (B & A) -> A ^ B
4558 if (match(&I, m_c_Xor(m_And(m_Value(A), m_Value(B)),
4560 return BinaryOperator::CreateXor(A, B);
4561
4562 // (A | ~B) ^ (~A | B) -> A ^ B
4563 // (~B | A) ^ (~A | B) -> A ^ B
4564 // (~A | B) ^ (A | ~B) -> A ^ B
4565 // (B | ~A) ^ (A | ~B) -> A ^ B
4566 if (match(&I, m_Xor(m_c_Or(m_Value(A), m_Not(m_Value(B))),
4568 return BinaryOperator::CreateXor(A, B);
4569
4570 // (A & ~B) ^ (~A & B) -> A ^ B
4571 // (~B & A) ^ (~A & B) -> A ^ B
4572 // (~A & B) ^ (A & ~B) -> A ^ B
4573 // (B & ~A) ^ (A & ~B) -> A ^ B
4574 if (match(&I, m_Xor(m_c_And(m_Value(A), m_Not(m_Value(B))),
4576 return BinaryOperator::CreateXor(A, B);
4577
4578 // For the remaining cases we need to get rid of one of the operands.
4579 if (!Op0->hasOneUse() && !Op1->hasOneUse())
4580 return nullptr;
4581
4582 // (A | B) ^ ~(A & B) -> ~(A ^ B)
4583 // (A | B) ^ ~(B & A) -> ~(A ^ B)
4584 // (A & B) ^ ~(A | B) -> ~(A ^ B)
4585 // (A & B) ^ ~(B | A) -> ~(A ^ B)
4586 // Complexity sorting ensures the not will be on the right side.
4587 if ((match(Op0, m_Or(m_Value(A), m_Value(B))) &&
4588 match(Op1, m_Not(m_c_And(m_Specific(A), m_Specific(B))))) ||
4589 (match(Op0, m_And(m_Value(A), m_Value(B))) &&
4591 return BinaryOperator::CreateNot(Builder.CreateXor(A, B));
4592
4593 return nullptr;
4594}
4595
4596Value *InstCombinerImpl::foldXorOfICmps(ICmpInst *LHS, ICmpInst *RHS,
4597 BinaryOperator &I) {
4598 assert(I.getOpcode() == Instruction::Xor && I.getOperand(0) == LHS &&
4599 I.getOperand(1) == RHS && "Should be 'xor' with these operands");
4600
4601 ICmpInst::Predicate PredL = LHS->getPredicate(), PredR = RHS->getPredicate();
4602 Value *LHS0 = LHS->getOperand(0), *LHS1 = LHS->getOperand(1);
4603 Value *RHS0 = RHS->getOperand(0), *RHS1 = RHS->getOperand(1);
4604
4605 if (predicatesFoldable(PredL, PredR)) {
4606 if (LHS0 == RHS1 && LHS1 == RHS0) {
4607 std::swap(LHS0, LHS1);
4608 PredL = ICmpInst::getSwappedPredicate(PredL);
4609 }
4610 if (LHS0 == RHS0 && LHS1 == RHS1) {
4611 // (icmp1 A, B) ^ (icmp2 A, B) --> (icmp3 A, B)
4612 unsigned Code = getICmpCode(PredL) ^ getICmpCode(PredR);
4613 bool IsSigned = LHS->isSigned() || RHS->isSigned();
4614 return getNewICmpValue(Code, IsSigned, LHS0, LHS1, Builder);
4615 }
4616 }
4617
4618 const APInt *LC, *RC;
4619 if (match(LHS1, m_APInt(LC)) && match(RHS1, m_APInt(RC)) &&
4620 LHS0->getType() == RHS0->getType() &&
4621 LHS0->getType()->isIntOrIntVectorTy()) {
4622 // Convert xor of signbit tests to signbit test of xor'd values:
4623 // (X > -1) ^ (Y > -1) --> (X ^ Y) < 0
4624 // (X < 0) ^ (Y < 0) --> (X ^ Y) < 0
4625 // (X > -1) ^ (Y < 0) --> (X ^ Y) > -1
4626 // (X < 0) ^ (Y > -1) --> (X ^ Y) > -1
4627 bool TrueIfSignedL, TrueIfSignedR;
4628 if ((LHS->hasOneUse() || RHS->hasOneUse()) &&
4629 isSignBitCheck(PredL, *LC, TrueIfSignedL) &&
4630 isSignBitCheck(PredR, *RC, TrueIfSignedR)) {
4631 Value *XorLR = Builder.CreateXor(LHS0, RHS0);
4632 return TrueIfSignedL == TrueIfSignedR ? Builder.CreateIsNeg(XorLR) :
4633 Builder.CreateIsNotNeg(XorLR);
4634 }
4635
4636 // Fold (icmp pred1 X, C1) ^ (icmp pred2 X, C2)
4637 // into a single comparison using range-based reasoning.
4638 if (LHS0 == RHS0) {
4639 ConstantRange CR1 = ConstantRange::makeExactICmpRegion(PredL, *LC);
4640 ConstantRange CR2 = ConstantRange::makeExactICmpRegion(PredR, *RC);
4641 auto CRUnion = CR1.exactUnionWith(CR2);
4642 auto CRIntersect = CR1.exactIntersectWith(CR2);
4643 if (CRUnion && CRIntersect)
4644 if (auto CR = CRUnion->exactIntersectWith(CRIntersect->inverse())) {
4645 if (CR->isFullSet())
4646 return ConstantInt::getTrue(I.getType());
4647 if (CR->isEmptySet())
4648 return ConstantInt::getFalse(I.getType());
4649
4650 CmpInst::Predicate NewPred;
4651 APInt NewC, Offset;
4652 CR->getEquivalentICmp(NewPred, NewC, Offset);
4653
4654 if ((Offset.isZero() && (LHS->hasOneUse() || RHS->hasOneUse())) ||
4655 (LHS->hasOneUse() && RHS->hasOneUse())) {
4656 Value *NewV = LHS0;
4657 Type *Ty = LHS0->getType();
4658 if (!Offset.isZero())
4659 NewV = Builder.CreateAdd(NewV, ConstantInt::get(Ty, Offset));
4660 return Builder.CreateICmp(NewPred, NewV,
4661 ConstantInt::get(Ty, NewC));
4662 }
4663 }
4664 }
4665
4666 // Fold (icmp eq/ne (X & Pow2), 0) ^ (icmp eq/ne (Y & Pow2), 0) into
4667 // (icmp eq/ne ((X ^ Y) & Pow2), 0)
4668 Value *X, *Y, *Pow2;
4669 if (ICmpInst::isEquality(PredL) && ICmpInst::isEquality(PredR) &&
4670 LC->isZero() && RC->isZero() && LHS->hasOneUse() && RHS->hasOneUse() &&
4671 match(LHS0, m_And(m_Value(X), m_Value(Pow2))) &&
4672 match(RHS0, m_And(m_Value(Y), m_Specific(Pow2))) &&
4673 isKnownToBeAPowerOfTwo(Pow2, /*OrZero=*/true, &I)) {
4674 Value *Xor = Builder.CreateXor(X, Y);
4675 Value *And = Builder.CreateAnd(Xor, Pow2);
4676 return Builder.CreateICmp(PredL == PredR ? ICmpInst::ICMP_NE
4678 And, ConstantInt::getNullValue(Xor->getType()));
4679 }
4680 }
4681
4682 // Instead of trying to imitate the folds for and/or, decompose this 'xor'
4683 // into those logic ops. That is, try to turn this into an and-of-icmps
4684 // because we have many folds for that pattern.
4685 //
4686 // This is based on a truth table definition of xor:
4687 // X ^ Y --> (X | Y) & !(X & Y)
4688 if (Value *OrICmp = simplifyBinOp(Instruction::Or, LHS, RHS, SQ)) {
4689 // TODO: If OrICmp is true, then the definition of xor simplifies to !(X&Y).
4690 // TODO: If OrICmp is false, the whole thing is false (InstSimplify?).
4691 if (Value *AndICmp = simplifyBinOp(Instruction::And, LHS, RHS, SQ)) {
4692 // TODO: Independently handle cases where the 'and' side is a constant.
4693 ICmpInst *X = nullptr, *Y = nullptr;
4694 if (OrICmp == LHS && AndICmp == RHS) {
4695 // (LHS | RHS) & !(LHS & RHS) --> LHS & !RHS --> X & !Y
4696 X = LHS;
4697 Y = RHS;
4698 }
4699 if (OrICmp == RHS && AndICmp == LHS) {
4700 // !(LHS & RHS) & (LHS | RHS) --> !LHS & RHS --> !Y & X
4701 X = RHS;
4702 Y = LHS;
4703 }
4704 if (X && Y && (Y->hasOneUse() || canFreelyInvertAllUsersOf(Y, &I))) {
4705 // Invert the predicate of 'Y', thus inverting its output.
4706 Y->setPredicate(Y->getInversePredicate());
4707 // So, are there other uses of Y?
4708 if (!Y->hasOneUse()) {
4709 // We need to adapt other uses of Y though. Get a value that matches
4710 // the original value of Y before inversion. While this increases
4711 // immediate instruction count, we have just ensured that all the
4712 // users are freely-invertible, so that 'not' *will* get folded away.
4714 // Set insertion point to right after the Y.
4715 Builder.SetInsertPoint(Y->getParent(), ++(Y->getIterator()));
4716 Value *NotY = Builder.CreateNot(Y, Y->getName() + ".not");
4717 // Replace all uses of Y (excluding the one in NotY!) with NotY.
4718 Worklist.pushUsersToWorkList(*Y);
4719 Y->replaceUsesWithIf(NotY,
4720 [NotY](Use &U) { return U.getUser() != NotY; });
4721 }
4722 // All done.
4723 return Builder.CreateAnd(LHS, RHS);
4724 }
4725 }
4726 }
4727
4728 return nullptr;
4729}
4730
4731/// If we have a masked merge, in the canonical form of:
4732/// (assuming that A only has one use.)
4733/// | A | |B|
4734/// ((x ^ y) & M) ^ y
4735/// | D |
4736/// * If M is inverted:
4737/// | D |
4738/// ((x ^ y) & ~M) ^ y
4739/// We can canonicalize by swapping the final xor operand
4740/// to eliminate the 'not' of the mask.
4741/// ((x ^ y) & M) ^ x
4742/// * If M is a constant, and D has one use, we transform to 'and' / 'or' ops
4743/// because that shortens the dependency chain and improves analysis:
4744/// (x & M) | (y & ~M)
4746 InstCombiner::BuilderTy &Builder) {
4747 Value *B, *X, *D;
4748 Value *M;
4749 if (!match(&I, m_c_Xor(m_Value(B),
4752 m_Value(M))))))
4753 return nullptr;
4754
4755 Value *NotM;
4756 if (match(M, m_Not(m_Value(NotM)))) {
4757 // De-invert the mask and swap the value in B part.
4758 Value *NewA = Builder.CreateAnd(D, NotM);
4759 return BinaryOperator::CreateXor(NewA, X);
4760 }
4761
4762 Constant *C;
4763 if (D->hasOneUse() && match(M, m_Constant(C))) {
4764 // Propagating undef is unsafe. Clamp undef elements to -1.
4765 Type *EltTy = C->getType()->getScalarType();
4767 // Unfold.
4768 Value *LHS = Builder.CreateAnd(X, C);
4769 Value *NotC = Builder.CreateNot(C);
4770 Value *RHS = Builder.CreateAnd(B, NotC);
4771 return BinaryOperator::CreateOr(LHS, RHS);
4772 }
4773
4774 return nullptr;
4775}
4776
4778 InstCombiner::BuilderTy &Builder) {
4779 Value *X, *Y;
4780 // FIXME: one-use check is not needed in general, but currently we are unable
4781 // to fold 'not' into 'icmp', if that 'icmp' has multiple uses. (D35182)
4782 if (!match(&I, m_Not(m_OneUse(m_Xor(m_Value(X), m_Value(Y))))))
4783 return nullptr;
4784
4785 auto hasCommonOperand = [](Value *A, Value *B, Value *C, Value *D) {
4786 return A == C || A == D || B == C || B == D;
4787 };
4788
4789 Value *A, *B, *C, *D;
4790 // Canonicalize ~((A & B) ^ (A | ?)) -> (A & B) | ~(A | ?)
4791 // 4 commuted variants
4792 if (match(X, m_And(m_Value(A), m_Value(B))) &&
4793 match(Y, m_Or(m_Value(C), m_Value(D))) && hasCommonOperand(A, B, C, D)) {
4794 Value *NotY = Builder.CreateNot(Y);
4795 return BinaryOperator::CreateOr(X, NotY);
4796 };
4797
4798 // Canonicalize ~((A | ?) ^ (A & B)) -> (A & B) | ~(A | ?)
4799 // 4 commuted variants
4800 if (match(Y, m_And(m_Value(A), m_Value(B))) &&
4801 match(X, m_Or(m_Value(C), m_Value(D))) && hasCommonOperand(A, B, C, D)) {
4802 Value *NotX = Builder.CreateNot(X);
4803 return BinaryOperator::CreateOr(Y, NotX);
4804 };
4805
4806 return nullptr;
4807}
4808
4809/// Canonicalize a shifty way to code absolute value to the more common pattern
4810/// that uses negation and select.
4812 InstCombiner::BuilderTy &Builder) {
4813 assert(Xor.getOpcode() == Instruction::Xor && "Expected an xor instruction.");
4814
4815 // There are 4 potential commuted variants. Move the 'ashr' candidate to Op1.
4816 // We're relying on the fact that we only do this transform when the shift has
4817 // exactly 2 uses and the add has exactly 1 use (otherwise, we might increase
4818 // instructions).
4819 Value *Op0 = Xor.getOperand(0), *Op1 = Xor.getOperand(1);
4820 if (Op0->hasNUses(2))
4821 std::swap(Op0, Op1);
4822
4823 Type *Ty = Xor.getType();
4824 Value *A;
4825 const APInt *ShAmt;
4826 if (match(Op1, m_AShr(m_Value(A), m_APInt(ShAmt))) &&
4827 Op1->hasNUses(2) && *ShAmt == Ty->getScalarSizeInBits() - 1 &&
4828 match(Op0, m_OneUse(m_c_Add(m_Specific(A), m_Specific(Op1))))) {
4829 // Op1 = ashr i32 A, 31 ; smear the sign bit
4830 // xor (add A, Op1), Op1 ; add -1 and flip bits if negative
4831 // --> (A < 0) ? -A : A
4832 Value *IsNeg = Builder.CreateIsNeg(A);
4833 // Copy the nsw flags from the add to the negate.
4834 auto *Add = cast<BinaryOperator>(Op0);
4835 Value *NegA = Add->hasNoUnsignedWrap()
4836 ? Constant::getNullValue(A->getType())
4837 : Builder.CreateNeg(A, "", Add->hasNoSignedWrap());
4838 return SelectInst::Create(IsNeg, NegA, A);
4839 }
4840 return nullptr;
4841}
4842
4844 Instruction *IgnoredUser) {
4845 auto *I = dyn_cast<Instruction>(Op);
4846 return I && IC.isFreeToInvert(I, /*WillInvertAllUses=*/true) &&
4847 IC.canFreelyInvertAllUsersOf(I, IgnoredUser);
4848}
4849
4851 Instruction *IgnoredUser) {
4852 auto *I = cast<Instruction>(Op);
4853 IC.Builder.SetInsertPoint(*I->getInsertionPointAfterDef());
4854 Value *NotOp = IC.Builder.CreateNot(Op, Op->getName() + ".not");
4855 Op->replaceUsesWithIf(NotOp,
4856 [NotOp](Use &U) { return U.getUser() != NotOp; });
4857 IC.freelyInvertAllUsersOf(NotOp, IgnoredUser);
4858 return NotOp;
4859}
4860
4861// Transform
4862// z = ~(x &/| y)
4863// into:
4864// z = ((~x) |/& (~y))
4865// iff both x and y are free to invert and all uses of z can be freely updated.
4867 Value *Op0, *Op1;
4868 if (!match(&I, m_LogicalOp(m_Value(Op0), m_Value(Op1))))
4869 return false;
4870
4871 // If this logic op has not been simplified yet, just bail out and let that
4872 // happen first. Otherwise, the code below may wrongly invert.
4873 if (Op0 == Op1)
4874 return false;
4875
4876 // If one of the operands is a user of the other,
4877 // freelyInvert->freelyInvertAllUsersOf will change the operands of I, which
4878 // may cause miscompilation.
4879 if (match(Op0, m_Not(m_Specific(Op1))) || match(Op1, m_Not(m_Specific(Op0))))
4880 return false;
4881
4882 Instruction::BinaryOps NewOpc =
4883 match(&I, m_LogicalAnd()) ? Instruction::Or : Instruction::And;
4884 bool IsBinaryOp = isa<BinaryOperator>(I);
4885
4886 // Can our users be adapted?
4887 if (!InstCombiner::canFreelyInvertAllUsersOf(&I, /*IgnoredUser=*/nullptr))
4888 return false;
4889
4890 // And can the operands be adapted?
4891 if (!canFreelyInvert(*this, Op0, &I) || !canFreelyInvert(*this, Op1, &I))
4892 return false;
4893
4894 Op0 = freelyInvert(*this, Op0, &I);
4895 Op1 = freelyInvert(*this, Op1, &I);
4896
4897 Builder.SetInsertPoint(*I.getInsertionPointAfterDef());
4898 Value *NewLogicOp;
4899 if (IsBinaryOp)
4900 NewLogicOp = Builder.CreateBinOp(NewOpc, Op0, Op1, I.getName() + ".not");
4901 else
4902 NewLogicOp =
4903 Builder.CreateLogicalOp(NewOpc, Op0, Op1, I.getName() + ".not");
4904
4905 replaceInstUsesWith(I, NewLogicOp);
4906 // We can not just create an outer `not`, it will most likely be immediately
4907 // folded back, reconstructing our initial pattern, and causing an
4908 // infinite combine loop, so immediately manually fold it away.
4909 freelyInvertAllUsersOf(NewLogicOp);
4910 return true;
4911}
4912
4913// Transform
4914// z = (~x) &/| y
4915// into:
4916// z = ~(x |/& (~y))
4917// iff y is free to invert and all uses of z can be freely updated.
4919 Value *Op0, *Op1;
4920 if (!match(&I, m_LogicalOp(m_Value(Op0), m_Value(Op1))))
4921 return false;
4922 Instruction::BinaryOps NewOpc =
4923 match(&I, m_LogicalAnd()) ? Instruction::Or : Instruction::And;
4924 bool IsBinaryOp = isa<BinaryOperator>(I);
4925
4926 Value *NotOp0 = nullptr;
4927 Value *NotOp1 = nullptr;
4928 Value **OpToInvert = nullptr;
4929 if (match(Op0, m_Not(m_Value(NotOp0))) && canFreelyInvert(*this, Op1, &I)) {
4930 Op0 = NotOp0;
4931 OpToInvert = &Op1;
4932 } else if (match(Op1, m_Not(m_Value(NotOp1))) &&
4933 canFreelyInvert(*this, Op0, &I)) {
4934 Op1 = NotOp1;
4935 OpToInvert = &Op0;
4936 } else
4937 return false;
4938
4939 // And can our users be adapted?
4940 if (!InstCombiner::canFreelyInvertAllUsersOf(&I, /*IgnoredUser=*/nullptr))
4941 return false;
4942
4943 *OpToInvert = freelyInvert(*this, *OpToInvert, &I);
4944
4945 Builder.SetInsertPoint(*I.getInsertionPointAfterDef());
4946 Value *NewBinOp;
4947 if (IsBinaryOp)
4948 NewBinOp = Builder.CreateBinOp(NewOpc, Op0, Op1, I.getName() + ".not");
4949 else
4950 NewBinOp = Builder.CreateLogicalOp(NewOpc, Op0, Op1, I.getName() + ".not");
4951 replaceInstUsesWith(I, NewBinOp);
4952 // We can not just create an outer `not`, it will most likely be immediately
4953 // folded back, reconstructing our initial pattern, and causing an
4954 // infinite combine loop, so immediately manually fold it away.
4955 freelyInvertAllUsersOf(NewBinOp);
4956 return true;
4957}
4958
4959Instruction *InstCombinerImpl::foldNot(BinaryOperator &I) {
4960 Value *NotOp;
4961 if (!match(&I, m_Not(m_Value(NotOp))))
4962 return nullptr;
4963
4964 // Apply DeMorgan's Law for 'nand' / 'nor' logic with an inverted operand.
4965 // We must eliminate the and/or (one-use) for these transforms to not increase
4966 // the instruction count.
4967 //
4968 // ~(~X & Y) --> (X | ~Y)
4969 // ~(Y & ~X) --> (X | ~Y)
4970 //
4971 // Note: The logical matches do not check for the commuted patterns because
4972 // those are handled via SimplifySelectsFeedingBinaryOp().
4973 Type *Ty = I.getType();
4974 Value *X, *Y;
4975 if (match(NotOp, m_OneUse(m_c_And(m_Not(m_Value(X)), m_Value(Y))))) {
4976 Value *NotY = Builder.CreateNot(Y, Y->getName() + ".not");
4977 return BinaryOperator::CreateOr(X, NotY);
4978 }
4979 if (match(NotOp, m_OneUse(m_LogicalAnd(m_Not(m_Value(X)), m_Value(Y))))) {
4980 Value *NotY = Builder.CreateNot(Y, Y->getName() + ".not");
4981 return SelectInst::Create(X, ConstantInt::getTrue(Ty), NotY);
4982 }
4983
4984 // ~(~X | Y) --> (X & ~Y)
4985 // ~(Y | ~X) --> (X & ~Y)
4986 if (match(NotOp, m_OneUse(m_c_Or(m_Not(m_Value(X)), m_Value(Y))))) {
4987 Value *NotY = Builder.CreateNot(Y, Y->getName() + ".not");
4988 return BinaryOperator::CreateAnd(X, NotY);
4989 }
4990 if (match(NotOp, m_OneUse(m_LogicalOr(m_Not(m_Value(X)), m_Value(Y))))) {
4991 Value *NotY = Builder.CreateNot(Y, Y->getName() + ".not");
4992 return SelectInst::Create(X, NotY, ConstantInt::getFalse(Ty));
4993 }
4994
4995 // Is this a 'not' (~) fed by a binary operator?
4996 BinaryOperator *NotVal;
4997 if (match(NotOp, m_BinOp(NotVal))) {
4998 // ~((-X) | Y) --> (X - 1) & (~Y)
4999 if (match(NotVal,
5001 Value *DecX = Builder.CreateAdd(X, ConstantInt::getAllOnesValue(Ty));
5002 Value *NotY = Builder.CreateNot(Y);
5003 return BinaryOperator::CreateAnd(DecX, NotY);
5004 }
5005
5006 // ~(~X >>s Y) --> (X >>s Y)
5007 if (match(NotVal, m_AShr(m_Not(m_Value(X)), m_Value(Y))))
5008 return BinaryOperator::CreateAShr(X, Y);
5009
5010 // Treat lshr with non-negative operand as ashr.
5011 // ~(~X >>u Y) --> (X >>s Y) iff X is known negative
5012 if (match(NotVal, m_LShr(m_Not(m_Value(X)), m_Value(Y))) &&
5013 isKnownNegative(X, SQ.getWithInstruction(NotVal)))
5014 return BinaryOperator::CreateAShr(X, Y);
5015
5016 // Bit-hack form of a signbit test for iN type:
5017 // ~(X >>s (N - 1)) --> sext i1 (X > -1) to iN
5018 unsigned FullShift = Ty->getScalarSizeInBits() - 1;
5019 if (match(NotVal, m_OneUse(m_AShr(m_Value(X), m_SpecificInt(FullShift))))) {
5020 Value *IsNotNeg = Builder.CreateIsNotNeg(X, "isnotneg");
5021 return new SExtInst(IsNotNeg, Ty);
5022 }
5023
5024 // If we are inverting a right-shifted constant, we may be able to eliminate
5025 // the 'not' by inverting the constant and using the opposite shift type.
5026 // Canonicalization rules ensure that only a negative constant uses 'ashr',
5027 // but we must check that in case that transform has not fired yet.
5028
5029 // ~(C >>s Y) --> ~C >>u Y (when inverting the replicated sign bits)
5030 Constant *C;
5031 if (match(NotVal, m_AShr(m_Constant(C), m_Value(Y))) &&
5032 match(C, m_Negative()))
5033 return BinaryOperator::CreateLShr(ConstantExpr::getNot(C), Y);
5034
5035 // ~(C >>u Y) --> ~C >>s Y (when inverting the replicated sign bits)
5036 if (match(NotVal, m_LShr(m_Constant(C), m_Value(Y))) &&
5037 match(C, m_NonNegative()))
5038 return BinaryOperator::CreateAShr(ConstantExpr::getNot(C), Y);
5039
5040 // ~(X + C) --> ~C - X
5041 if (match(NotVal, m_Add(m_Value(X), m_ImmConstant(C))))
5042 return BinaryOperator::CreateSub(ConstantExpr::getNot(C), X);
5043
5044 // ~(X - Y) --> ~X + Y
5045 // FIXME: is it really beneficial to sink the `not` here?
5046 if (match(NotVal, m_Sub(m_Value(X), m_Value(Y))))
5047 if (isa<Constant>(X) || NotVal->hasOneUse())
5048 return BinaryOperator::CreateAdd(Builder.CreateNot(X), Y);
5049
5050 // ~(~X + Y) --> X - Y
5051 if (match(NotVal, m_c_Add(m_Not(m_Value(X)), m_Value(Y))))
5052 return BinaryOperator::CreateWithCopiedFlags(Instruction::Sub, X, Y,
5053 NotVal);
5054 }
5055
5056 // not (cmp A, B) = !cmp A, B
5057 CmpPredicate Pred;
5058 if (match(NotOp, m_Cmp(Pred, m_Value(), m_Value())) &&
5059 (NotOp->hasOneUse() ||
5061 /*IgnoredUser=*/nullptr))) {
5062 cast<CmpInst>(NotOp)->setPredicate(CmpInst::getInversePredicate(Pred));
5064 return &I;
5065 }
5066
5067 // Move a 'not' ahead of casts of a bool to enable logic reduction:
5068 // not (bitcast (sext i1 X)) --> bitcast (sext (not i1 X))
5069 if (match(NotOp, m_OneUse(m_BitCast(m_OneUse(m_SExt(m_Value(X)))))) && X->getType()->isIntOrIntVectorTy(1)) {
5070 Type *SextTy = cast<BitCastOperator>(NotOp)->getSrcTy();
5071 Value *NotX = Builder.CreateNot(X);
5072 Value *Sext = Builder.CreateSExt(NotX, SextTy);
5073 return new BitCastInst(Sext, Ty);
5074 }
5075
5076 if (auto *NotOpI = dyn_cast<Instruction>(NotOp))
5077 if (sinkNotIntoLogicalOp(*NotOpI))
5078 return &I;
5079
5080 // Eliminate a bitwise 'not' op of 'not' min/max by inverting the min/max:
5081 // ~min(~X, ~Y) --> max(X, Y)
5082 // ~max(~X, Y) --> min(X, ~Y)
5083 auto *II = dyn_cast<IntrinsicInst>(NotOp);
5084 if (II && II->hasOneUse()) {
5085 if (match(NotOp, m_c_MaxOrMin(m_Not(m_Value(X)), m_Value(Y)))) {
5086 Intrinsic::ID InvID = getInverseMinMaxIntrinsic(II->getIntrinsicID());
5087 Value *NotY = Builder.CreateNot(Y);
5088 Value *InvMaxMin = Builder.CreateBinaryIntrinsic(InvID, X, NotY);
5089 return replaceInstUsesWith(I, InvMaxMin);
5090 }
5091
5092 if (II->getIntrinsicID() == Intrinsic::is_fpclass) {
5093 ConstantInt *ClassMask = cast<ConstantInt>(II->getArgOperand(1));
5094 II->setArgOperand(
5095 1, ConstantInt::get(ClassMask->getType(),
5096 ~ClassMask->getZExtValue() & fcAllFlags));
5097 return replaceInstUsesWith(I, II);
5098 }
5099 }
5100
5101 if (NotOp->hasOneUse()) {
5102 // Pull 'not' into operands of select if both operands are one-use compares
5103 // or one is one-use compare and the other one is a constant.
5104 // Inverting the predicates eliminates the 'not' operation.
5105 // Example:
5106 // not (select ?, (cmp TPred, ?, ?), (cmp FPred, ?, ?) -->
5107 // select ?, (cmp InvTPred, ?, ?), (cmp InvFPred, ?, ?)
5108 // not (select ?, (cmp TPred, ?, ?), true -->
5109 // select ?, (cmp InvTPred, ?, ?), false
5110 if (auto *Sel = dyn_cast<SelectInst>(NotOp)) {
5111 Value *TV = Sel->getTrueValue();
5112 Value *FV = Sel->getFalseValue();
5113 auto *CmpT = dyn_cast<CmpInst>(TV);
5114 auto *CmpF = dyn_cast<CmpInst>(FV);
5115 bool InvertibleT = (CmpT && CmpT->hasOneUse()) || isa<Constant>(TV);
5116 bool InvertibleF = (CmpF && CmpF->hasOneUse()) || isa<Constant>(FV);
5117 if (InvertibleT && InvertibleF) {
5118 if (CmpT)
5119 CmpT->setPredicate(CmpT->getInversePredicate());
5120 else
5121 Sel->setTrueValue(ConstantExpr::getNot(cast<Constant>(TV)));
5122 if (CmpF)
5123 CmpF->setPredicate(CmpF->getInversePredicate());
5124 else
5125 Sel->setFalseValue(ConstantExpr::getNot(cast<Constant>(FV)));
5126 return replaceInstUsesWith(I, Sel);
5127 }
5128 }
5129 }
5130
5131 if (Instruction *NewXor = foldNotXor(I, Builder))
5132 return NewXor;
5133
5134 // TODO: Could handle multi-use better by checking if all uses of NotOp (other
5135 // than I) can be inverted.
5136 if (Value *R = getFreelyInverted(NotOp, NotOp->hasOneUse(), &Builder))
5137 return replaceInstUsesWith(I, R);
5138
5139 return nullptr;
5140}
5141
5142// FIXME: We use commutative matchers (m_c_*) for some, but not all, matches
5143// here. We should standardize that construct where it is needed or choose some
5144// other way to ensure that commutated variants of patterns are not missed.
5146 if (Value *V = simplifyXorInst(I.getOperand(0), I.getOperand(1),
5147 SQ.getWithInstruction(&I)))
5148 return replaceInstUsesWith(I, V);
5149
5151 return &I;
5152
5154 return X;
5155
5157 return Phi;
5158
5159 if (Instruction *NewXor = foldXorToXor(I, Builder))
5160 return NewXor;
5161
5162 // (A&B)^(A&C) -> A&(B^C) etc
5164 return replaceInstUsesWith(I, V);
5165
5166 // See if we can simplify any instructions used by the instruction whose sole
5167 // purpose is to compute bits we don't care about.
5169 return &I;
5170
5171 if (Instruction *R = foldNot(I))
5172 return R;
5173
5175 return R;
5176
5177 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
5178 Value *X, *Y, *M;
5179
5180 // (X | Y) ^ M -> (X ^ M) ^ Y
5181 // (X | Y) ^ M -> (Y ^ M) ^ X
5183 m_Value(M)))) {
5184 if (Value *XorAC = simplifyXorInst(X, M, SQ.getWithInstruction(&I)))
5185 return BinaryOperator::CreateXor(XorAC, Y);
5186
5187 if (Value *XorBC = simplifyXorInst(Y, M, SQ.getWithInstruction(&I)))
5188 return BinaryOperator::CreateXor(XorBC, X);
5189 }
5190
5191 // Fold (X & M) ^ (Y & ~M) -> (X & M) | (Y & ~M)
5192 // This it a special case in haveNoCommonBitsSet, but the computeKnownBits
5193 // calls in there are unnecessary as SimplifyDemandedInstructionBits should
5194 // have already taken care of those cases.
5195 if (match(&I, m_c_Xor(m_c_And(m_Not(m_Value(M)), m_Value()),
5196 m_c_And(m_Deferred(M), m_Value())))) {
5198 return BinaryOperator::CreateDisjointOr(Op0, Op1);
5199 else
5200 return BinaryOperator::CreateOr(Op0, Op1);
5201 }
5202
5204 return Xor;
5205
5206 Constant *C1;
5207 if (match(Op1, m_Constant(C1))) {
5208 Constant *C2;
5209
5210 if (match(Op0, m_OneUse(m_Or(m_Value(X), m_ImmConstant(C2)))) &&
5211 match(C1, m_ImmConstant())) {
5212 // (X | C2) ^ C1 --> (X & ~C2) ^ (C1^C2)
5215 Value *And = Builder.CreateAnd(
5217 return BinaryOperator::CreateXor(
5219 }
5220
5221 // Use DeMorgan and reassociation to eliminate a 'not' op.
5222 if (match(Op0, m_OneUse(m_Or(m_Not(m_Value(X)), m_Constant(C2))))) {
5223 // (~X | C2) ^ C1 --> ((X & ~C2) ^ -1) ^ C1 --> (X & ~C2) ^ ~C1
5224 Value *And = Builder.CreateAnd(X, ConstantExpr::getNot(C2));
5225 return BinaryOperator::CreateXor(And, ConstantExpr::getNot(C1));
5226 }
5227 if (match(Op0, m_OneUse(m_And(m_Not(m_Value(X)), m_Constant(C2))))) {
5228 // (~X & C2) ^ C1 --> ((X | ~C2) ^ -1) ^ C1 --> (X | ~C2) ^ ~C1
5229 Value *Or = Builder.CreateOr(X, ConstantExpr::getNot(C2));
5230 return BinaryOperator::CreateXor(Or, ConstantExpr::getNot(C1));
5231 }
5232
5233 // Convert xor ([trunc] (ashr X, BW-1)), C =>
5234 // select(X >s -1, C, ~C)
5235 // The ashr creates "AllZeroOrAllOne's", which then optionally inverses the
5236 // constant depending on whether this input is less than 0.
5237 const APInt *CA;
5238 if (match(Op0, m_OneUse(m_TruncOrSelf(
5239 m_AShr(m_Value(X), m_APIntAllowPoison(CA))))) &&
5240 *CA == X->getType()->getScalarSizeInBits() - 1 &&
5241 !match(C1, m_AllOnes())) {
5242 assert(!C1->isZeroValue() && "Unexpected xor with 0");
5243 Value *IsNotNeg = Builder.CreateIsNotNeg(X);
5244 return SelectInst::Create(IsNotNeg, Op1, Builder.CreateNot(Op1));
5245 }
5246 }
5247
5248 Type *Ty = I.getType();
5249 {
5250 const APInt *RHSC;
5251 if (match(Op1, m_APInt(RHSC))) {
5252 Value *X;
5253 const APInt *C;
5254 // (C - X) ^ signmaskC --> (C + signmaskC) - X
5255 if (RHSC->isSignMask() && match(Op0, m_Sub(m_APInt(C), m_Value(X))))
5256 return BinaryOperator::CreateSub(ConstantInt::get(Ty, *C + *RHSC), X);
5257
5258 // (X + C) ^ signmaskC --> X + (C + signmaskC)
5259 if (RHSC->isSignMask() && match(Op0, m_Add(m_Value(X), m_APInt(C))))
5260 return BinaryOperator::CreateAdd(X, ConstantInt::get(Ty, *C + *RHSC));
5261
5262 // (X | C) ^ RHSC --> X ^ (C ^ RHSC) iff X & C == 0
5263 if (match(Op0, m_Or(m_Value(X), m_APInt(C))) &&
5264 MaskedValueIsZero(X, *C, &I))
5265 return BinaryOperator::CreateXor(X, ConstantInt::get(Ty, *C ^ *RHSC));
5266
5267 // When X is a power-of-two or zero and zero input is poison:
5268 // ctlz(i32 X) ^ 31 --> cttz(X)
5269 // cttz(i32 X) ^ 31 --> ctlz(X)
5270 auto *II = dyn_cast<IntrinsicInst>(Op0);
5271 if (II && II->hasOneUse() && *RHSC == Ty->getScalarSizeInBits() - 1) {
5272 Intrinsic::ID IID = II->getIntrinsicID();
5273 if ((IID == Intrinsic::ctlz || IID == Intrinsic::cttz) &&
5274 match(II->getArgOperand(1), m_One()) &&
5275 isKnownToBeAPowerOfTwo(II->getArgOperand(0), /*OrZero */ true)) {
5276 IID = (IID == Intrinsic::ctlz) ? Intrinsic::cttz : Intrinsic::ctlz;
5277 Function *F =
5278 Intrinsic::getOrInsertDeclaration(II->getModule(), IID, Ty);
5279 return CallInst::Create(F, {II->getArgOperand(0), Builder.getTrue()});
5280 }
5281 }
5282
5283 // If RHSC is inverting the remaining bits of shifted X,
5284 // canonicalize to a 'not' before the shift to help SCEV and codegen:
5285 // (X << C) ^ RHSC --> ~X << C
5286 if (match(Op0, m_OneUse(m_Shl(m_Value(X), m_APInt(C)))) &&
5287 *RHSC == APInt::getAllOnes(Ty->getScalarSizeInBits()).shl(*C)) {
5288 Value *NotX = Builder.CreateNot(X);
5289 return BinaryOperator::CreateShl(NotX, ConstantInt::get(Ty, *C));
5290 }
5291 // (X >>u C) ^ RHSC --> ~X >>u C
5292 if (match(Op0, m_OneUse(m_LShr(m_Value(X), m_APInt(C)))) &&
5293 *RHSC == APInt::getAllOnes(Ty->getScalarSizeInBits()).lshr(*C)) {
5294 Value *NotX = Builder.CreateNot(X);
5295 return BinaryOperator::CreateLShr(NotX, ConstantInt::get(Ty, *C));
5296 }
5297 // TODO: We could handle 'ashr' here as well. That would be matching
5298 // a 'not' op and moving it before the shift. Doing that requires
5299 // preventing the inverse fold in canShiftBinOpWithConstantRHS().
5300 }
5301
5302 // If we are XORing the sign bit of a floating-point value, convert
5303 // this to fneg, then cast back to integer.
5304 //
5305 // This is generous interpretation of noimplicitfloat, this is not a true
5306 // floating-point operation.
5307 //
5308 // Assumes any IEEE-represented type has the sign bit in the high bit.
5309 // TODO: Unify with APInt matcher. This version allows undef unlike m_APInt
5310 Value *CastOp;
5311 if (match(Op0, m_ElementWiseBitCast(m_Value(CastOp))) &&
5312 match(Op1, m_SignMask()) &&
5313 !Builder.GetInsertBlock()->getParent()->hasFnAttribute(
5314 Attribute::NoImplicitFloat)) {
5315 Type *EltTy = CastOp->getType()->getScalarType();
5316 if (EltTy->isFloatingPointTy() &&
5318 Value *FNeg = Builder.CreateFNeg(CastOp);
5319 return new BitCastInst(FNeg, I.getType());
5320 }
5321 }
5322 }
5323
5324 // FIXME: This should not be limited to scalar (pull into APInt match above).
5325 {
5326 Value *X;
5327 ConstantInt *C1, *C2, *C3;
5328 // ((X^C1) >> C2) ^ C3 -> (X>>C2) ^ ((C1>>C2)^C3)
5329 if (match(Op1, m_ConstantInt(C3)) &&
5331 m_ConstantInt(C2))) &&
5332 Op0->hasOneUse()) {
5333 // fold (C1 >> C2) ^ C3
5334 APInt FoldConst = C1->getValue().lshr(C2->getValue());
5335 FoldConst ^= C3->getValue();
5336 // Prepare the two operands.
5337 auto *Opnd0 = Builder.CreateLShr(X, C2);
5338 Opnd0->takeName(Op0);
5339 return BinaryOperator::CreateXor(Opnd0, ConstantInt::get(Ty, FoldConst));
5340 }
5341 }
5342
5343 if (Instruction *FoldedLogic = foldBinOpIntoSelectOrPhi(I))
5344 return FoldedLogic;
5345
5346 // Y ^ (X | Y) --> X & ~Y
5347 // Y ^ (Y | X) --> X & ~Y
5348 if (match(Op1, m_OneUse(m_c_Or(m_Value(X), m_Specific(Op0)))))
5349 return BinaryOperator::CreateAnd(X, Builder.CreateNot(Op0));
5350 // (X | Y) ^ Y --> X & ~Y
5351 // (Y | X) ^ Y --> X & ~Y
5352 if (match(Op0, m_OneUse(m_c_Or(m_Value(X), m_Specific(Op1)))))
5353 return BinaryOperator::CreateAnd(X, Builder.CreateNot(Op1));
5354
5355 // Y ^ (X & Y) --> ~X & Y
5356 // Y ^ (Y & X) --> ~X & Y
5357 if (match(Op1, m_OneUse(m_c_And(m_Value(X), m_Specific(Op0)))))
5358 return BinaryOperator::CreateAnd(Op0, Builder.CreateNot(X));
5359 // (X & Y) ^ Y --> ~X & Y
5360 // (Y & X) ^ Y --> ~X & Y
5361 // Canonical form is (X & C) ^ C; don't touch that.
5362 // TODO: A 'not' op is better for analysis and codegen, but demanded bits must
5363 // be fixed to prefer that (otherwise we get infinite looping).
5364 if (!match(Op1, m_Constant()) &&
5365 match(Op0, m_OneUse(m_c_And(m_Value(X), m_Specific(Op1)))))
5366 return BinaryOperator::CreateAnd(Op1, Builder.CreateNot(X));
5367
5368 Value *A, *B, *C;
5369 // (A ^ B) ^ (A | C) --> (~A & C) ^ B -- There are 4 commuted variants.
5372 return BinaryOperator::CreateXor(
5373 Builder.CreateAnd(Builder.CreateNot(A), C), B);
5374
5375 // (A ^ B) ^ (B | C) --> (~B & C) ^ A -- There are 4 commuted variants.
5378 return BinaryOperator::CreateXor(
5379 Builder.CreateAnd(Builder.CreateNot(B), C), A);
5380
5381 // (A & B) ^ (A ^ B) -> (A | B)
5382 if (match(Op0, m_And(m_Value(A), m_Value(B))) &&
5384 return BinaryOperator::CreateOr(A, B);
5385 // (A ^ B) ^ (A & B) -> (A | B)
5386 if (match(Op0, m_Xor(m_Value(A), m_Value(B))) &&
5388 return BinaryOperator::CreateOr(A, B);
5389
5390 // (A & ~B) ^ ~A -> ~(A & B)
5391 // (~B & A) ^ ~A -> ~(A & B)
5392 if (match(Op0, m_c_And(m_Value(A), m_Not(m_Value(B)))) &&
5393 match(Op1, m_Not(m_Specific(A))))
5394 return BinaryOperator::CreateNot(Builder.CreateAnd(A, B));
5395
5396 // (~A & B) ^ A --> A | B -- There are 4 commuted variants.
5398 return BinaryOperator::CreateOr(A, B);
5399
5400 // (~A | B) ^ A --> ~(A & B)
5401 if (match(Op0, m_OneUse(m_c_Or(m_Not(m_Specific(Op1)), m_Value(B)))))
5402 return BinaryOperator::CreateNot(Builder.CreateAnd(Op1, B));
5403
5404 // A ^ (~A | B) --> ~(A & B)
5405 if (match(Op1, m_OneUse(m_c_Or(m_Not(m_Specific(Op0)), m_Value(B)))))
5406 return BinaryOperator::CreateNot(Builder.CreateAnd(Op0, B));
5407
5408 // (A | B) ^ (A | C) --> (B ^ C) & ~A -- There are 4 commuted variants.
5409 // TODO: Loosen one-use restriction if common operand is a constant.
5410 Value *D;
5411 if (match(Op0, m_OneUse(m_Or(m_Value(A), m_Value(B)))) &&
5412 match(Op1, m_OneUse(m_Or(m_Value(C), m_Value(D))))) {
5413 if (B == C || B == D)
5414 std::swap(A, B);
5415 if (A == C)
5416 std::swap(C, D);
5417 if (A == D) {
5418 Value *NotA = Builder.CreateNot(A);
5419 return BinaryOperator::CreateAnd(Builder.CreateXor(B, C), NotA);
5420 }
5421 }
5422
5423 // (A & B) ^ (A | C) --> A ? ~B : C -- There are 4 commuted variants.
5424 if (I.getType()->isIntOrIntVectorTy(1) &&
5427 bool NeedFreeze = isa<SelectInst>(Op0) && isa<SelectInst>(Op1) && B == D;
5428 if (B == C || B == D)
5429 std::swap(A, B);
5430 if (A == C)
5431 std::swap(C, D);
5432 if (A == D) {
5433 if (NeedFreeze)
5434 A = Builder.CreateFreeze(A);
5435 Value *NotB = Builder.CreateNot(B);
5436 return SelectInst::Create(A, NotB, C);
5437 }
5438 }
5439
5440 if (auto *LHS = dyn_cast<ICmpInst>(I.getOperand(0)))
5441 if (auto *RHS = dyn_cast<ICmpInst>(I.getOperand(1)))
5442 if (Value *V = foldXorOfICmps(LHS, RHS, I))
5443 return replaceInstUsesWith(I, V);
5444
5445 if (Instruction *CastedXor = foldCastedBitwiseLogic(I))
5446 return CastedXor;
5447
5448 if (Instruction *Abs = canonicalizeAbs(I, Builder))
5449 return Abs;
5450
5451 // Otherwise, if all else failed, try to hoist the xor-by-constant:
5452 // (X ^ C) ^ Y --> (X ^ Y) ^ C
5453 // Just like we do in other places, we completely avoid the fold
5454 // for constantexprs, at least to avoid endless combine loop.
5456 m_ImmConstant(C1))),
5457 m_Value(Y))))
5458 return BinaryOperator::CreateXor(Builder.CreateXor(X, Y), C1);
5459
5461 return R;
5462
5463 if (Instruction *Canonicalized = canonicalizeLogicFirst(I, Builder))
5464 return Canonicalized;
5465
5466 if (Instruction *Folded = foldLogicOfIsFPClass(I, Op0, Op1))
5467 return Folded;
5468
5469 if (Instruction *Folded = canonicalizeConditionalNegationViaMathToSelect(I))
5470 return Folded;
5471
5472 if (Instruction *Res = foldBinOpOfDisplacedShifts(I))
5473 return Res;
5474
5476 return Res;
5477
5478 return nullptr;
5479}
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.
ap_match< APInt > m_APInt(const APInt *&Res)
Match a ConstantInt or splatted ConstantVector, binding the specified pointer to the contained APInt.
BinaryOp_match< LHS, RHS, Instruction::And, true > m_c_And(const LHS &L, const RHS &R)
Matches an And with LHS and RHS in either order.
CastInst_match< OpTy, TruncInst > m_Trunc(const OpTy &Op)
Matches Trunc.
BinaryOp_match< LHS, RHS, Instruction::Xor > m_Xor(const LHS &L, const RHS &R)
ap_match< APInt > m_APIntAllowPoison(const APInt *&Res)
Match APInt while allowing poison in splat vector constants.
OverflowingBinaryOp_match< LHS, RHS, Instruction::Sub, OverflowingBinaryOperator::NoSignedWrap > m_NSWSub(const LHS &L, const RHS &R)
specific_intval< false > m_SpecificInt(const APInt &V)
Match a specific integer value or vector with all elements equal to the value.
match_combine_or< CastInst_match< OpTy, ZExtInst >, OpTy > m_ZExtOrSelf(const OpTy &Op)
bool match(Val *V, const Pattern &P)
cst_pred_ty< is_shifted_mask > m_ShiftedMask()
bind_ty< Instruction > m_Instruction(Instruction *&I)
Match an instruction, capturing it if we match.
cstfp_pred_ty< is_any_zero_fp > m_AnyZeroFP()
Match a floating-point negative zero or positive zero.
specificval_ty m_Specific(const Value *V)
Match if we have a specific specified value.
DisjointOr_match< LHS, RHS > m_DisjointOr(const LHS &L, const RHS &R)
constantexpr_match m_ConstantExpr()
Match a constant expression or a constant that contains a constant expression.
specific_intval< true > m_SpecificIntAllowPoison(const APInt &V)
ap_match< APFloat > m_APFloatAllowPoison(const APFloat *&Res)
Match APFloat while allowing poison in splat vector constants.
CmpClass_match< LHS, RHS, ICmpInst, true > m_c_ICmp(CmpPredicate &Pred, const LHS &L, const RHS &R)
Matches an ICmp with a predicate over LHS and RHS in either order.
TwoOps_match< Val_t, Idx_t, Instruction::ExtractElement > m_ExtractElt(const Val_t &Val, const Idx_t &Idx)
Matches ExtractElementInst.
cst_pred_ty< is_nonnegative > m_NonNegative()
Match an integer or vector of non-negative values.
class_match< ConstantInt > m_ConstantInt()
Match an arbitrary ConstantInt and ignore it.
cst_pred_ty< is_one > m_One()
Match an integer 1 or a vector with all elements equal to 1.
IntrinsicID_match m_Intrinsic()
Match intrinsic calls like this: m_Intrinsic<Intrinsic::fabs>(m_Value(X))
ThreeOps_match< Cond, LHS, RHS, Instruction::Select > m_Select(const Cond &C, const LHS &L, const RHS &R)
Matches SelectInst.
match_combine_or< CastInst_match< OpTy, SExtInst >, OpTy > m_SExtOrSelf(const OpTy &Op)
ExtractValue_match< Ind, Val_t > m_ExtractValue(const Val_t &V)
Match a single index ExtractValue instruction.
BinOpPred_match< LHS, RHS, is_logical_shift_op > m_LogicalShift(const LHS &L, const RHS &R)
Matches logical shift operations.
ShiftLike_match< LHS, Instruction::Shl > m_ShlOrSelf(const LHS &L, uint64_t &R)
Matches shl L, ConstShAmt or L itself (R will be set to zero in this case).
bind_ty< WithOverflowInst > m_WithOverflowInst(WithOverflowInst *&I)
Match a with overflow intrinsic, capturing it if we match.
BinaryOp_match< LHS, RHS, Instruction::Xor, true > m_c_Xor(const LHS &L, const RHS &R)
Matches an Xor with LHS and RHS in either order.
SpecificCmpClass_match< LHS, RHS, CmpInst > m_SpecificCmp(CmpPredicate MatchPred, const LHS &L, const RHS &R)
BinaryOp_match< LHS, RHS, Instruction::Mul > m_Mul(const LHS &L, const RHS &R)
deferredval_ty< Value > m_Deferred(Value *const &V)
Like m_Specific(), but works if the specific value to match is determined as part of the same match()...
auto m_LogicalOr()
Matches L || R where L and R are arbitrary values.
TwoOps_match< V1_t, V2_t, Instruction::ShuffleVector > m_Shuffle(const V1_t &v1, const V2_t &v2)
Matches ShuffleVectorInst independently of mask value.
SpecificCmpClass_match< LHS, RHS, ICmpInst > m_SpecificICmp(CmpPredicate MatchPred, const LHS &L, const RHS &R)
CastInst_match< OpTy, ZExtInst > m_ZExt(const OpTy &Op)
Matches ZExt.
class_match< CmpInst > m_Cmp()
Matches any compare instruction and ignore it.
cst_pred_ty< is_negated_power2 > m_NegatedPower2()
Match a integer or vector negated power-of-2.
match_immconstant_ty m_ImmConstant()
Match an arbitrary immediate Constant and ignore it.
DisjointOr_match< LHS, RHS, true > m_c_DisjointOr(const LHS &L, const RHS &R)
BinaryOp_match< LHS, RHS, Instruction::Add, true > m_c_Add(const LHS &L, const RHS &R)
Matches a Add with LHS and RHS in either order.
SpecificCmpClass_match< LHS, RHS, FCmpInst > m_SpecificFCmp(CmpPredicate MatchPred, const LHS &L, const RHS &R)
match_combine_or< BinaryOp_match< LHS, RHS, Instruction::Add >, DisjointOr_match< LHS, RHS > > m_AddLike(const LHS &L, const RHS &R)
Match either "add" or "or disjoint".
CastOperator_match< OpTy, Instruction::BitCast > m_BitCast(const OpTy &Op)
Matches BitCast.
match_combine_or< match_combine_or< MaxMin_match< ICmpInst, LHS, RHS, smax_pred_ty, true >, MaxMin_match< ICmpInst, LHS, RHS, smin_pred_ty, true > >, match_combine_or< MaxMin_match< ICmpInst, LHS, RHS, umax_pred_ty, true >, MaxMin_match< ICmpInst, LHS, RHS, umin_pred_ty, true > > > m_c_MaxOrMin(const LHS &L, const RHS &R)
match_combine_or< CastInst_match< OpTy, SExtInst >, NNegZExt_match< OpTy > > m_SExtLike(const OpTy &Op)
Match either "sext" or "zext nneg".
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:644
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:3734
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:560
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:872
#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:108
APInt getMaxValue() const
Return the maximal unsigned value possible given these KnownBits.
Definition KnownBits.h:145
Matching combinators.
const DataLayout & DL
const Instruction * CxtI
const DominatorTree * DT
SimplifyQuery getWithInstruction(const Instruction *I) const
AssumptionCache * AC