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