Bug Summary

File:src/gnu/usr.bin/clang/libLLVM/../../../llvm/llvm/lib/Transforms/InstCombine/InstCombineShifts.cpp
Warning:line 262, column 10
2nd function call argument is an uninitialized value

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -cc1 -triple amd64-unknown-openbsd7.0 -analyze -disable-free -disable-llvm-verifier -discard-value-names -main-file-name InstCombineShifts.cpp -analyzer-store=region -analyzer-opt-analyze-nested-blocks -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=cplusplus -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -mrelocation-model pic -pic-level 1 -fhalf-no-semantic-interposition -mframe-pointer=all -relaxed-aliasing -fno-rounding-math -mconstructor-aliases -munwind-tables -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -fcoverage-compilation-dir=/usr/src/gnu/usr.bin/clang/libLLVM/obj -resource-dir /usr/local/lib/clang/13.0.0 -I /usr/src/gnu/usr.bin/clang/libLLVM/../../../llvm/llvm/include/llvm/Transforms -I /usr/src/gnu/usr.bin/clang/libLLVM/obj/../include/llvm/AMDGPU -I /usr/src/gnu/usr.bin/clang/libLLVM/../../../llvm/llvm/lib/Target/AMDGPU -I /usr/src/gnu/usr.bin/clang/libLLVM/obj/../include/llvm/AMDGPU -I /usr/src/gnu/usr.bin/clang/libLLVM/../../../llvm/llvm/lib/Target/AMDGPU -I /usr/src/gnu/usr.bin/clang/libLLVM/obj/../include/llvm/AMDGPU -I /usr/src/gnu/usr.bin/clang/libLLVM/../../../llvm/llvm/lib/Target/AMDGPU -I /usr/src/gnu/usr.bin/clang/libLLVM/obj/../include/llvm/AMDGPU -I /usr/src/gnu/usr.bin/clang/libLLVM/../../../llvm/llvm/lib/Target/AMDGPU -I /usr/src/gnu/usr.bin/clang/libLLVM/obj/../include/llvm/AMDGPU -I /usr/src/gnu/usr.bin/clang/libLLVM/../../../llvm/llvm/lib/Target/AMDGPU -I /usr/src/gnu/usr.bin/clang/libLLVM/obj/../include/llvm/AMDGPU -I /usr/src/gnu/usr.bin/clang/libLLVM/../../../llvm/llvm/lib/Target/AMDGPU -I /usr/src/gnu/usr.bin/clang/libLLVM/../../../llvm/llvm/include/llvm/Analysis -I /usr/src/gnu/usr.bin/clang/libLLVM/../../../llvm/llvm/include/llvm/ASMParser -I /usr/src/gnu/usr.bin/clang/libLLVM/../../../llvm/llvm/include/llvm/BinaryFormat -I /usr/src/gnu/usr.bin/clang/libLLVM/../../../llvm/llvm/include/llvm/Bitcode -I /usr/src/gnu/usr.bin/clang/libLLVM/../../../llvm/llvm/include/llvm/Bitcode -I /usr/src/gnu/usr.bin/clang/libLLVM/../../../llvm/llvm/include/llvm/Bitstream -I /usr/src/gnu/usr.bin/clang/libLLVM/../../../llvm/llvm/include/llvm/Transforms -I /include/llvm/CodeGen -I /include/llvm/CodeGen/PBQP -I /usr/src/gnu/usr.bin/clang/libLLVM/obj/../include/llvm/IR -I /usr/src/gnu/usr.bin/clang/libLLVM/../../../llvm/llvm/include/llvm/IR -I /usr/src/gnu/usr.bin/clang/libLLVM/../../../llvm/llvm/include/llvm/Transforms -I /usr/src/gnu/usr.bin/clang/libLLVM/../../../llvm/llvm/include/llvm/Transforms/Coroutines -I /usr/src/gnu/usr.bin/clang/libLLVM/../../../llvm/llvm/include/llvm/ProfileData/Coverage -I /usr/src/gnu/usr.bin/clang/libLLVM/../../../llvm/llvm/include/llvm/DebugInfo/CodeView -I /usr/src/gnu/usr.bin/clang/libLLVM/../../../llvm/llvm/include/llvm/DebugInfo/DWARF -I /usr/src/gnu/usr.bin/clang/libLLVM/../../../llvm/llvm/include/llvm/DebugInfo -I /usr/src/gnu/usr.bin/clang/libLLVM/../../../llvm/llvm/include/llvm/DebugInfo/MSF -I /usr/src/gnu/usr.bin/clang/libLLVM/../../../llvm/llvm/include/llvm/DebugInfo/PDB -I /usr/src/gnu/usr.bin/clang/libLLVM/../../../llvm/llvm/include/llvm/Demangle -I /usr/src/gnu/usr.bin/clang/libLLVM/../../../llvm/llvm/include/llvm/ExecutionEngine -I /usr/src/gnu/usr.bin/clang/libLLVM/../../../llvm/llvm/include/llvm/ExecutionEngine/JITLink -I /usr/src/gnu/usr.bin/clang/libLLVM/../../../llvm/llvm/include/llvm/ExecutionEngine/Orc -I /usr/src/gnu/usr.bin/clang/libLLVM/../../../llvm/llvm/include/llvm/Frontend -I /usr/src/gnu/usr.bin/clang/libLLVM/../../../llvm/llvm/include/llvm/Frontend/OpenACC -I /usr/src/gnu/usr.bin/clang/libLLVM/../../../llvm/llvm/include/llvm/Frontend -I /usr/src/gnu/usr.bin/clang/libLLVM/../../../llvm/llvm/include/llvm/Frontend/OpenMP -I /include/llvm/CodeGen/GlobalISel -I /usr/src/gnu/usr.bin/clang/libLLVM/../../../llvm/llvm/include/llvm/IRReader -I /usr/src/gnu/usr.bin/clang/libLLVM/../../../llvm/llvm/include/llvm/Transforms -I /usr/src/gnu/usr.bin/clang/libLLVM/../../../llvm/llvm/include/llvm/Transforms/InstCombine -I /usr/src/gnu/usr.bin/clang/libLLVM/obj/../include/llvm/Transforms/InstCombine -I /usr/src/gnu/usr.bin/clang/libLLVM/../../../llvm/llvm/include/llvm/Transforms -I /usr/src/gnu/usr.bin/clang/libLLVM/../../../llvm/llvm/include/llvm/LTO -I /usr/src/gnu/usr.bin/clang/libLLVM/../../../llvm/llvm/include/llvm/Linker -I /usr/src/gnu/usr.bin/clang/libLLVM/../../../llvm/llvm/include/llvm/MC -I /usr/src/gnu/usr.bin/clang/libLLVM/../../../llvm/llvm/include/llvm/MC/MCParser -I /include/llvm/CodeGen/MIRParser -I /usr/src/gnu/usr.bin/clang/libLLVM/../../../llvm/llvm/include/llvm/Transforms -I /usr/src/gnu/usr.bin/clang/libLLVM/../../../llvm/llvm/include/llvm/Object -I /usr/src/gnu/usr.bin/clang/libLLVM/../../../llvm/llvm/include/llvm/Option -I /usr/src/gnu/usr.bin/clang/libLLVM/../../../llvm/llvm/include/llvm/Passes -I /usr/src/gnu/usr.bin/clang/libLLVM/../../../llvm/llvm/include/llvm/ -I /usr/src/gnu/usr.bin/clang/libLLVM/../../../llvm/llvm/include/llvm/ProfileData -I /usr/src/gnu/usr.bin/clang/libLLVM/../../../llvm/llvm/include/llvm/Transforms -I /usr/src/gnu/usr.bin/clang/libLLVM/../../../llvm/llvm/include/llvm/Transforms/Scalar -I /usr/src/gnu/usr.bin/clang/libLLVM/../../../llvm/llvm/include/llvm/ADT -I /usr/src/gnu/usr.bin/clang/libLLVM/../../../llvm/llvm/include/llvm/Support -I /usr/src/gnu/usr.bin/clang/libLLVM/../../../llvm/llvm/include/llvm/DebugInfo/Symbolize -I /usr/src/gnu/usr.bin/clang/libLLVM/../../../llvm/llvm/include/llvm/Target -I /usr/src/gnu/usr.bin/clang/libLLVM/../../../llvm/llvm/include/llvm/Transforms -I /usr/src/gnu/usr.bin/clang/libLLVM/../../../llvm/llvm/include/llvm/Transforms/Utils -I /usr/src/gnu/usr.bin/clang/libLLVM/../../../llvm/llvm/include/llvm/Transforms -I /usr/src/gnu/usr.bin/clang/libLLVM/../../../llvm/llvm/include/llvm/Transforms/Vectorize -I /usr/src/gnu/usr.bin/clang/libLLVM/obj/../include/llvm/X86 -I /usr/src/gnu/usr.bin/clang/libLLVM/../../../llvm/llvm/lib/Target/X86 -I /usr/src/gnu/usr.bin/clang/libLLVM/obj/../include/llvm/X86 -I /usr/src/gnu/usr.bin/clang/libLLVM/../../../llvm/llvm/lib/Target/X86 -I /usr/src/gnu/usr.bin/clang/libLLVM/obj/../include/llvm/X86 -I /usr/src/gnu/usr.bin/clang/libLLVM/../../../llvm/llvm/lib/Target/X86 -I /usr/src/gnu/usr.bin/clang/libLLVM/obj/../include/llvm/X86 -I /usr/src/gnu/usr.bin/clang/libLLVM/../../../llvm/llvm/lib/Target/X86 -I /usr/src/gnu/usr.bin/clang/libLLVM/obj/../include/llvm/X86 -I /usr/src/gnu/usr.bin/clang/libLLVM/../../../llvm/llvm/lib/Target/X86 -I /usr/src/gnu/usr.bin/clang/libLLVM/../../../llvm/llvm/include/llvm/Transforms -I /usr/src/gnu/usr.bin/clang/libLLVM/../../../llvm/llvm/include/llvm/Transforms/IPO -I /usr/src/gnu/usr.bin/clang/libLLVM/../../../llvm/llvm/include -I /usr/src/gnu/usr.bin/clang/libLLVM/../include -I /usr/src/gnu/usr.bin/clang/libLLVM/obj -I /usr/src/gnu/usr.bin/clang/libLLVM/obj/../include -D NDEBUG -D __STDC_LIMIT_MACROS -D __STDC_CONSTANT_MACROS -D __STDC_FORMAT_MACROS -D LLVM_PREFIX="/usr" -D PIC -internal-isystem /usr/include/c++/v1 -internal-isystem /usr/local/lib/clang/13.0.0/include -internal-externc-isystem /usr/include -O2 -Wno-unused-parameter -Wwrite-strings -Wno-missing-field-initializers -Wno-long-long -Wno-comment -std=c++14 -fdeprecated-macro -fdebug-compilation-dir=/usr/src/gnu/usr.bin/clang/libLLVM/obj -ferror-limit 19 -fvisibility-inlines-hidden -fwrapv -D_RET_PROTECTOR -ret-protector -fno-rtti -fgnuc-version=4.2.1 -vectorize-loops -vectorize-slp -fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-valloc -fno-builtin-free -fno-builtin-strdup -fno-builtin-strndup -analyzer-output=html -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /home/ben/Projects/vmm/scan-build/2022-01-12-194120-40624-1 -x c++ /usr/src/gnu/usr.bin/clang/libLLVM/../../../llvm/llvm/lib/Transforms/InstCombine/InstCombineShifts.cpp

/usr/src/gnu/usr.bin/clang/libLLVM/../../../llvm/llvm/lib/Transforms/InstCombine/InstCombineShifts.cpp

1//===- InstCombineShifts.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 visitShl, visitLShr, and visitAShr functions.
10//
11//===----------------------------------------------------------------------===//
12
13#include "InstCombineInternal.h"
14#include "llvm/Analysis/ConstantFolding.h"
15#include "llvm/Analysis/InstructionSimplify.h"
16#include "llvm/IR/IntrinsicInst.h"
17#include "llvm/IR/PatternMatch.h"
18#include "llvm/Transforms/InstCombine/InstCombiner.h"
19using namespace llvm;
20using namespace PatternMatch;
21
22#define DEBUG_TYPE"instcombine" "instcombine"
23
24bool canTryToConstantAddTwoShiftAmounts(Value *Sh0, Value *ShAmt0, Value *Sh1,
25 Value *ShAmt1) {
26 // We have two shift amounts from two different shifts. The types of those
27 // shift amounts may not match. If that's the case let's bailout now..
28 if (ShAmt0->getType() != ShAmt1->getType())
29 return false;
30
31 // As input, we have the following pattern:
32 // Sh0 (Sh1 X, Q), K
33 // We want to rewrite that as:
34 // Sh x, (Q+K) iff (Q+K) u< bitwidth(x)
35 // While we know that originally (Q+K) would not overflow
36 // (because 2 * (N-1) u<= iN -1), we have looked past extensions of
37 // shift amounts. so it may now overflow in smaller bitwidth.
38 // To ensure that does not happen, we need to ensure that the total maximal
39 // shift amount is still representable in that smaller bit width.
40 unsigned MaximalPossibleTotalShiftAmount =
41 (Sh0->getType()->getScalarSizeInBits() - 1) +
42 (Sh1->getType()->getScalarSizeInBits() - 1);
43 APInt MaximalRepresentableShiftAmount =
44 APInt::getAllOnesValue(ShAmt0->getType()->getScalarSizeInBits());
45 return MaximalRepresentableShiftAmount.uge(MaximalPossibleTotalShiftAmount);
46}
47
48// Given pattern:
49// (x shiftopcode Q) shiftopcode K
50// we should rewrite it as
51// x shiftopcode (Q+K) iff (Q+K) u< bitwidth(x) and
52//
53// This is valid for any shift, but they must be identical, and we must be
54// careful in case we have (zext(Q)+zext(K)) and look past extensions,
55// (Q+K) must not overflow or else (Q+K) u< bitwidth(x) is bogus.
56//
57// AnalyzeForSignBitExtraction indicates that we will only analyze whether this
58// pattern has any 2 right-shifts that sum to 1 less than original bit width.
59Value *InstCombinerImpl::reassociateShiftAmtsOfTwoSameDirectionShifts(
60 BinaryOperator *Sh0, const SimplifyQuery &SQ,
61 bool AnalyzeForSignBitExtraction) {
62 // Look for a shift of some instruction, ignore zext of shift amount if any.
63 Instruction *Sh0Op0;
64 Value *ShAmt0;
65 if (!match(Sh0,
66 m_Shift(m_Instruction(Sh0Op0), m_ZExtOrSelf(m_Value(ShAmt0)))))
67 return nullptr;
68
69 // If there is a truncation between the two shifts, we must make note of it
70 // and look through it. The truncation imposes additional constraints on the
71 // transform.
72 Instruction *Sh1;
73 Value *Trunc = nullptr;
74 match(Sh0Op0,
75 m_CombineOr(m_CombineAnd(m_Trunc(m_Instruction(Sh1)), m_Value(Trunc)),
76 m_Instruction(Sh1)));
77
78 // Inner shift: (x shiftopcode ShAmt1)
79 // Like with other shift, ignore zext of shift amount if any.
80 Value *X, *ShAmt1;
81 if (!match(Sh1, m_Shift(m_Value(X), m_ZExtOrSelf(m_Value(ShAmt1)))))
82 return nullptr;
83
84 // Verify that it would be safe to try to add those two shift amounts.
85 if (!canTryToConstantAddTwoShiftAmounts(Sh0, ShAmt0, Sh1, ShAmt1))
86 return nullptr;
87
88 // We are only looking for signbit extraction if we have two right shifts.
89 bool HadTwoRightShifts = match(Sh0, m_Shr(m_Value(), m_Value())) &&
90 match(Sh1, m_Shr(m_Value(), m_Value()));
91 // ... and if it's not two right-shifts, we know the answer already.
92 if (AnalyzeForSignBitExtraction && !HadTwoRightShifts)
93 return nullptr;
94
95 // The shift opcodes must be identical, unless we are just checking whether
96 // this pattern can be interpreted as a sign-bit-extraction.
97 Instruction::BinaryOps ShiftOpcode = Sh0->getOpcode();
98 bool IdenticalShOpcodes = Sh0->getOpcode() == Sh1->getOpcode();
99 if (!IdenticalShOpcodes && !AnalyzeForSignBitExtraction)
100 return nullptr;
101
102 // If we saw truncation, we'll need to produce extra instruction,
103 // and for that one of the operands of the shift must be one-use,
104 // unless of course we don't actually plan to produce any instructions here.
105 if (Trunc && !AnalyzeForSignBitExtraction &&
106 !match(Sh0, m_c_BinOp(m_OneUse(m_Value()), m_Value())))
107 return nullptr;
108
109 // Can we fold (ShAmt0+ShAmt1) ?
110 auto *NewShAmt = dyn_cast_or_null<Constant>(
111 SimplifyAddInst(ShAmt0, ShAmt1, /*isNSW=*/false, /*isNUW=*/false,
112 SQ.getWithInstruction(Sh0)));
113 if (!NewShAmt)
114 return nullptr; // Did not simplify.
115 unsigned NewShAmtBitWidth = NewShAmt->getType()->getScalarSizeInBits();
116 unsigned XBitWidth = X->getType()->getScalarSizeInBits();
117 // Is the new shift amount smaller than the bit width of inner/new shift?
118 if (!match(NewShAmt, m_SpecificInt_ICMP(ICmpInst::Predicate::ICMP_ULT,
119 APInt(NewShAmtBitWidth, XBitWidth))))
120 return nullptr; // FIXME: could perform constant-folding.
121
122 // If there was a truncation, and we have a right-shift, we can only fold if
123 // we are left with the original sign bit. Likewise, if we were just checking
124 // that this is a sighbit extraction, this is the place to check it.
125 // FIXME: zero shift amount is also legal here, but we can't *easily* check
126 // more than one predicate so it's not really worth it.
127 if (HadTwoRightShifts && (Trunc || AnalyzeForSignBitExtraction)) {
128 // If it's not a sign bit extraction, then we're done.
129 if (!match(NewShAmt,
130 m_SpecificInt_ICMP(ICmpInst::Predicate::ICMP_EQ,
131 APInt(NewShAmtBitWidth, XBitWidth - 1))))
132 return nullptr;
133 // If it is, and that was the question, return the base value.
134 if (AnalyzeForSignBitExtraction)
135 return X;
136 }
137
138 assert(IdenticalShOpcodes && "Should not get here with different shifts.")((void)0);
139
140 // All good, we can do this fold.
141 NewShAmt = ConstantExpr::getZExtOrBitCast(NewShAmt, X->getType());
142
143 BinaryOperator *NewShift = BinaryOperator::Create(ShiftOpcode, X, NewShAmt);
144
145 // The flags can only be propagated if there wasn't a trunc.
146 if (!Trunc) {
147 // If the pattern did not involve trunc, and both of the original shifts
148 // had the same flag set, preserve the flag.
149 if (ShiftOpcode == Instruction::BinaryOps::Shl) {
150 NewShift->setHasNoUnsignedWrap(Sh0->hasNoUnsignedWrap() &&
151 Sh1->hasNoUnsignedWrap());
152 NewShift->setHasNoSignedWrap(Sh0->hasNoSignedWrap() &&
153 Sh1->hasNoSignedWrap());
154 } else {
155 NewShift->setIsExact(Sh0->isExact() && Sh1->isExact());
156 }
157 }
158
159 Instruction *Ret = NewShift;
160 if (Trunc) {
161 Builder.Insert(NewShift);
162 Ret = CastInst::Create(Instruction::Trunc, NewShift, Sh0->getType());
163 }
164
165 return Ret;
166}
167
168// If we have some pattern that leaves only some low bits set, and then performs
169// left-shift of those bits, if none of the bits that are left after the final
170// shift are modified by the mask, we can omit the mask.
171//
172// There are many variants to this pattern:
173// a) (x & ((1 << MaskShAmt) - 1)) << ShiftShAmt
174// b) (x & (~(-1 << MaskShAmt))) << ShiftShAmt
175// c) (x & (-1 >> MaskShAmt)) << ShiftShAmt
176// d) (x & ((-1 << MaskShAmt) >> MaskShAmt)) << ShiftShAmt
177// e) ((x << MaskShAmt) l>> MaskShAmt) << ShiftShAmt
178// f) ((x << MaskShAmt) a>> MaskShAmt) << ShiftShAmt
179// All these patterns can be simplified to just:
180// x << ShiftShAmt
181// iff:
182// a,b) (MaskShAmt+ShiftShAmt) u>= bitwidth(x)
183// c,d,e,f) (ShiftShAmt-MaskShAmt) s>= 0 (i.e. ShiftShAmt u>= MaskShAmt)
184static Instruction *
185dropRedundantMaskingOfLeftShiftInput(BinaryOperator *OuterShift,
186 const SimplifyQuery &Q,
187 InstCombiner::BuilderTy &Builder) {
188 assert(OuterShift->getOpcode() == Instruction::BinaryOps::Shl &&((void)0)
189 "The input must be 'shl'!")((void)0);
190
191 Value *Masked, *ShiftShAmt;
8
'ShiftShAmt' declared without an initial value
192 match(OuterShift,
193 m_Shift(m_Value(Masked), m_ZExtOrSelf(m_Value(ShiftShAmt))));
9
Calling 'm_Value'
13
Returning from 'm_Value'
14
Calling 'm_ZExtOrSelf<llvm::PatternMatch::bind_ty<llvm::Value>>'
22
Returning from 'm_ZExtOrSelf<llvm::PatternMatch::bind_ty<llvm::Value>>'
23
Calling 'm_Shift<llvm::PatternMatch::bind_ty<llvm::Value>, llvm::PatternMatch::match_combine_or<llvm::PatternMatch::CastClass_match<llvm::PatternMatch::bind_ty<llvm::Value>, 39>, llvm::PatternMatch::bind_ty<llvm::Value>>>'
25
Returning from 'm_Shift<llvm::PatternMatch::bind_ty<llvm::Value>, llvm::PatternMatch::match_combine_or<llvm::PatternMatch::CastClass_match<llvm::PatternMatch::bind_ty<llvm::Value>, 39>, llvm::PatternMatch::bind_ty<llvm::Value>>>'
194
195 // *If* there is a truncation between an outer shift and a possibly-mask,
196 // then said truncation *must* be one-use, else we can't perform the fold.
197 Value *Trunc;
198 if (match(Masked, m_CombineAnd(m_Trunc(m_Value(Masked)), m_Value(Trunc))) &&
26
Taking false branch
199 !Trunc->hasOneUse())
200 return nullptr;
201
202 Type *NarrowestTy = OuterShift->getType();
203 Type *WidestTy = Masked->getType();
204 bool HadTrunc = WidestTy != NarrowestTy;
27
Assuming 'WidestTy' is equal to 'NarrowestTy'
205
206 // The mask must be computed in a type twice as wide to ensure
207 // that no bits are lost if the sum-of-shifts is wider than the base type.
208 Type *ExtendedTy = WidestTy->getExtendedType();
209
210 Value *MaskShAmt;
211
212 // ((1 << MaskShAmt) - 1)
213 auto MaskA = m_Add(m_Shl(m_One(), m_Value(MaskShAmt)), m_AllOnes());
214 // (~(-1 << maskNbits))
215 auto MaskB = m_Xor(m_Shl(m_AllOnes(), m_Value(MaskShAmt)), m_AllOnes());
216 // (-1 >> MaskShAmt)
217 auto MaskC = m_Shr(m_AllOnes(), m_Value(MaskShAmt));
218 // ((-1 << MaskShAmt) >> MaskShAmt)
219 auto MaskD =
220 m_Shr(m_Shl(m_AllOnes(), m_Value(MaskShAmt)), m_Deferred(MaskShAmt));
221
222 Value *X;
223 Constant *NewMask;
224
225 if (match(Masked, m_c_And(m_CombineOr(MaskA, MaskB), m_Value(X)))) {
28
Calling 'match<llvm::Value, llvm::PatternMatch::BinaryOp_match<llvm::PatternMatch::match_combine_or<llvm::PatternMatch::BinaryOp_match<llvm::PatternMatch::BinaryOp_match<llvm::PatternMatch::cstval_pred_ty<llvm::PatternMatch::is_one, llvm::ConstantInt>, llvm::PatternMatch::bind_ty<llvm::Value>, 25, false>, llvm::PatternMatch::cstval_pred_ty<llvm::PatternMatch::is_all_ones, llvm::ConstantInt>, 13, false>, llvm::PatternMatch::BinaryOp_match<llvm::PatternMatch::BinaryOp_match<llvm::PatternMatch::cstval_pred_ty<llvm::PatternMatch::is_all_ones, llvm::ConstantInt>, llvm::PatternMatch::bind_ty<llvm::Value>, 25, false>, llvm::PatternMatch::cstval_pred_ty<llvm::PatternMatch::is_all_ones, llvm::ConstantInt>, 30, false>>, llvm::PatternMatch::bind_ty<llvm::Value>, 28, true>>'
36
Returning from 'match<llvm::Value, llvm::PatternMatch::BinaryOp_match<llvm::PatternMatch::match_combine_or<llvm::PatternMatch::BinaryOp_match<llvm::PatternMatch::BinaryOp_match<llvm::PatternMatch::cstval_pred_ty<llvm::PatternMatch::is_one, llvm::ConstantInt>, llvm::PatternMatch::bind_ty<llvm::Value>, 25, false>, llvm::PatternMatch::cstval_pred_ty<llvm::PatternMatch::is_all_ones, llvm::ConstantInt>, 13, false>, llvm::PatternMatch::BinaryOp_match<llvm::PatternMatch::BinaryOp_match<llvm::PatternMatch::cstval_pred_ty<llvm::PatternMatch::is_all_ones, llvm::ConstantInt>, llvm::PatternMatch::bind_ty<llvm::Value>, 25, false>, llvm::PatternMatch::cstval_pred_ty<llvm::PatternMatch::is_all_ones, llvm::ConstantInt>, 30, false>>, llvm::PatternMatch::bind_ty<llvm::Value>, 28, true>>'
37
Taking false branch
226 // Peek through an optional zext of the shift amount.
227 match(MaskShAmt, m_ZExtOrSelf(m_Value(MaskShAmt)));
228
229 // Verify that it would be safe to try to add those two shift amounts.
230 if (!canTryToConstantAddTwoShiftAmounts(OuterShift, ShiftShAmt, Masked,
231 MaskShAmt))
232 return nullptr;
233
234 // Can we simplify (MaskShAmt+ShiftShAmt) ?
235 auto *SumOfShAmts = dyn_cast_or_null<Constant>(SimplifyAddInst(
236 MaskShAmt, ShiftShAmt, /*IsNSW=*/false, /*IsNUW=*/false, Q));
237 if (!SumOfShAmts)
238 return nullptr; // Did not simplify.
239 // In this pattern SumOfShAmts correlates with the number of low bits
240 // that shall remain in the root value (OuterShift).
241
242 // An extend of an undef value becomes zero because the high bits are never
243 // completely unknown. Replace the the `undef` shift amounts with final
244 // shift bitwidth to ensure that the value remains undef when creating the
245 // subsequent shift op.
246 SumOfShAmts = Constant::replaceUndefsWith(
247 SumOfShAmts, ConstantInt::get(SumOfShAmts->getType()->getScalarType(),
248 ExtendedTy->getScalarSizeInBits()));
249 auto *ExtendedSumOfShAmts = ConstantExpr::getZExt(SumOfShAmts, ExtendedTy);
250 // And compute the mask as usual: ~(-1 << (SumOfShAmts))
251 auto *ExtendedAllOnes = ConstantExpr::getAllOnesValue(ExtendedTy);
252 auto *ExtendedInvertedMask =
253 ConstantExpr::getShl(ExtendedAllOnes, ExtendedSumOfShAmts);
254 NewMask = ConstantExpr::getNot(ExtendedInvertedMask);
255 } else if (match(Masked, m_c_And(m_CombineOr(MaskC, MaskD), m_Value(X))) ||
38
Taking true branch
256 match(Masked, m_Shr(m_Shl(m_Value(X), m_Value(MaskShAmt)),
257 m_Deferred(MaskShAmt)))) {
258 // Peek through an optional zext of the shift amount.
259 match(MaskShAmt, m_ZExtOrSelf(m_Value(MaskShAmt)));
260
261 // Verify that it would be safe to try to add those two shift amounts.
262 if (!canTryToConstantAddTwoShiftAmounts(OuterShift, ShiftShAmt, Masked,
39
2nd function call argument is an uninitialized value
263 MaskShAmt))
264 return nullptr;
265
266 // Can we simplify (ShiftShAmt-MaskShAmt) ?
267 auto *ShAmtsDiff = dyn_cast_or_null<Constant>(SimplifySubInst(
268 ShiftShAmt, MaskShAmt, /*IsNSW=*/false, /*IsNUW=*/false, Q));
269 if (!ShAmtsDiff)
270 return nullptr; // Did not simplify.
271 // In this pattern ShAmtsDiff correlates with the number of high bits that
272 // shall be unset in the root value (OuterShift).
273
274 // An extend of an undef value becomes zero because the high bits are never
275 // completely unknown. Replace the the `undef` shift amounts with negated
276 // bitwidth of innermost shift to ensure that the value remains undef when
277 // creating the subsequent shift op.
278 unsigned WidestTyBitWidth = WidestTy->getScalarSizeInBits();
279 ShAmtsDiff = Constant::replaceUndefsWith(
280 ShAmtsDiff, ConstantInt::get(ShAmtsDiff->getType()->getScalarType(),
281 -WidestTyBitWidth));
282 auto *ExtendedNumHighBitsToClear = ConstantExpr::getZExt(
283 ConstantExpr::getSub(ConstantInt::get(ShAmtsDiff->getType(),
284 WidestTyBitWidth,
285 /*isSigned=*/false),
286 ShAmtsDiff),
287 ExtendedTy);
288 // And compute the mask as usual: (-1 l>> (NumHighBitsToClear))
289 auto *ExtendedAllOnes = ConstantExpr::getAllOnesValue(ExtendedTy);
290 NewMask =
291 ConstantExpr::getLShr(ExtendedAllOnes, ExtendedNumHighBitsToClear);
292 } else
293 return nullptr; // Don't know anything about this pattern.
294
295 NewMask = ConstantExpr::getTrunc(NewMask, NarrowestTy);
296
297 // Does this mask has any unset bits? If not then we can just not apply it.
298 bool NeedMask = !match(NewMask, m_AllOnes());
299
300 // If we need to apply a mask, there are several more restrictions we have.
301 if (NeedMask) {
302 // The old masking instruction must go away.
303 if (!Masked->hasOneUse())
304 return nullptr;
305 // The original "masking" instruction must not have been`ashr`.
306 if (match(Masked, m_AShr(m_Value(), m_Value())))
307 return nullptr;
308 }
309
310 // If we need to apply truncation, let's do it first, since we can.
311 // We have already ensured that the old truncation will go away.
312 if (HadTrunc)
313 X = Builder.CreateTrunc(X, NarrowestTy);
314
315 // No 'NUW'/'NSW'! We no longer know that we won't shift-out non-0 bits.
316 // We didn't change the Type of this outermost shift, so we can just do it.
317 auto *NewShift = BinaryOperator::Create(OuterShift->getOpcode(), X,
318 OuterShift->getOperand(1));
319 if (!NeedMask)
320 return NewShift;
321
322 Builder.Insert(NewShift);
323 return BinaryOperator::Create(Instruction::And, NewShift, NewMask);
324}
325
326/// If we have a shift-by-constant of a bitwise logic op that itself has a
327/// shift-by-constant operand with identical opcode, we may be able to convert
328/// that into 2 independent shifts followed by the logic op. This eliminates a
329/// a use of an intermediate value (reduces dependency chain).
330static Instruction *foldShiftOfShiftedLogic(BinaryOperator &I,
331 InstCombiner::BuilderTy &Builder) {
332 assert(I.isShift() && "Expected a shift as input")((void)0);
333 auto *LogicInst = dyn_cast<BinaryOperator>(I.getOperand(0));
334 if (!LogicInst || !LogicInst->isBitwiseLogicOp() || !LogicInst->hasOneUse())
335 return nullptr;
336
337 Constant *C0, *C1;
338 if (!match(I.getOperand(1), m_Constant(C1)))
339 return nullptr;
340
341 Instruction::BinaryOps ShiftOpcode = I.getOpcode();
342 Type *Ty = I.getType();
343
344 // Find a matching one-use shift by constant. The fold is not valid if the sum
345 // of the shift values equals or exceeds bitwidth.
346 // TODO: Remove the one-use check if the other logic operand (Y) is constant.
347 Value *X, *Y;
348 auto matchFirstShift = [&](Value *V) {
349 BinaryOperator *BO;
350 APInt Threshold(Ty->getScalarSizeInBits(), Ty->getScalarSizeInBits());
351 return match(V, m_BinOp(BO)) && BO->getOpcode() == ShiftOpcode &&
352 match(V, m_OneUse(m_Shift(m_Value(X), m_Constant(C0)))) &&
353 match(ConstantExpr::getAdd(C0, C1),
354 m_SpecificInt_ICMP(ICmpInst::ICMP_ULT, Threshold));
355 };
356
357 // Logic ops are commutative, so check each operand for a match.
358 if (matchFirstShift(LogicInst->getOperand(0)))
359 Y = LogicInst->getOperand(1);
360 else if (matchFirstShift(LogicInst->getOperand(1)))
361 Y = LogicInst->getOperand(0);
362 else
363 return nullptr;
364
365 // shift (logic (shift X, C0), Y), C1 -> logic (shift X, C0+C1), (shift Y, C1)
366 Constant *ShiftSumC = ConstantExpr::getAdd(C0, C1);
367 Value *NewShift1 = Builder.CreateBinOp(ShiftOpcode, X, ShiftSumC);
368 Value *NewShift2 = Builder.CreateBinOp(ShiftOpcode, Y, I.getOperand(1));
369 return BinaryOperator::Create(LogicInst->getOpcode(), NewShift1, NewShift2);
370}
371
372Instruction *InstCombinerImpl::commonShiftTransforms(BinaryOperator &I) {
373 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
374 assert(Op0->getType() == Op1->getType())((void)0);
375
376 // If the shift amount is a one-use `sext`, we can demote it to `zext`.
377 Value *Y;
378 if (match(Op1, m_OneUse(m_SExt(m_Value(Y))))) {
379 Value *NewExt = Builder.CreateZExt(Y, I.getType(), Op1->getName());
380 return BinaryOperator::Create(I.getOpcode(), Op0, NewExt);
381 }
382
383 // See if we can fold away this shift.
384 if (SimplifyDemandedInstructionBits(I))
385 return &I;
386
387 // Try to fold constant and into select arguments.
388 if (isa<Constant>(Op0))
389 if (SelectInst *SI = dyn_cast<SelectInst>(Op1))
390 if (Instruction *R = FoldOpIntoSelect(I, SI))
391 return R;
392
393 if (Constant *CUI = dyn_cast<Constant>(Op1))
394 if (Instruction *Res = FoldShiftByConstant(Op0, CUI, I))
395 return Res;
396
397 if (auto *NewShift = cast_or_null<Instruction>(
398 reassociateShiftAmtsOfTwoSameDirectionShifts(&I, SQ)))
399 return NewShift;
400
401 // (C1 shift (A add C2)) -> (C1 shift C2) shift A)
402 // iff A and C2 are both positive.
403 Value *A;
404 Constant *C;
405 if (match(Op0, m_Constant()) && match(Op1, m_Add(m_Value(A), m_Constant(C))))
406 if (isKnownNonNegative(A, DL, 0, &AC, &I, &DT) &&
407 isKnownNonNegative(C, DL, 0, &AC, &I, &DT))
408 return BinaryOperator::Create(
409 I.getOpcode(), Builder.CreateBinOp(I.getOpcode(), Op0, C), A);
410
411 // X shift (A srem C) -> X shift (A and (C - 1)) iff C is a power of 2.
412 // Because shifts by negative values (which could occur if A were negative)
413 // are undefined.
414 if (Op1->hasOneUse() && match(Op1, m_SRem(m_Value(A), m_Constant(C))) &&
415 match(C, m_Power2())) {
416 // FIXME: Should this get moved into SimplifyDemandedBits by saying we don't
417 // demand the sign bit (and many others) here??
418 Constant *Mask = ConstantExpr::getSub(C, ConstantInt::get(I.getType(), 1));
419 Value *Rem = Builder.CreateAnd(A, Mask, Op1->getName());
420 return replaceOperand(I, 1, Rem);
421 }
422
423 if (Instruction *Logic = foldShiftOfShiftedLogic(I, Builder))
424 return Logic;
425
426 return nullptr;
427}
428
429/// Return true if we can simplify two logical (either left or right) shifts
430/// that have constant shift amounts: OuterShift (InnerShift X, C1), C2.
431static bool canEvaluateShiftedShift(unsigned OuterShAmt, bool IsOuterShl,
432 Instruction *InnerShift,
433 InstCombinerImpl &IC, Instruction *CxtI) {
434 assert(InnerShift->isLogicalShift() && "Unexpected instruction type")((void)0);
435
436 // We need constant scalar or constant splat shifts.
437 const APInt *InnerShiftConst;
438 if (!match(InnerShift->getOperand(1), m_APInt(InnerShiftConst)))
439 return false;
440
441 // Two logical shifts in the same direction:
442 // shl (shl X, C1), C2 --> shl X, C1 + C2
443 // lshr (lshr X, C1), C2 --> lshr X, C1 + C2
444 bool IsInnerShl = InnerShift->getOpcode() == Instruction::Shl;
445 if (IsInnerShl == IsOuterShl)
446 return true;
447
448 // Equal shift amounts in opposite directions become bitwise 'and':
449 // lshr (shl X, C), C --> and X, C'
450 // shl (lshr X, C), C --> and X, C'
451 if (*InnerShiftConst == OuterShAmt)
452 return true;
453
454 // If the 2nd shift is bigger than the 1st, we can fold:
455 // lshr (shl X, C1), C2 --> and (shl X, C1 - C2), C3
456 // shl (lshr X, C1), C2 --> and (lshr X, C1 - C2), C3
457 // but it isn't profitable unless we know the and'd out bits are already zero.
458 // Also, check that the inner shift is valid (less than the type width) or
459 // we'll crash trying to produce the bit mask for the 'and'.
460 unsigned TypeWidth = InnerShift->getType()->getScalarSizeInBits();
461 if (InnerShiftConst->ugt(OuterShAmt) && InnerShiftConst->ult(TypeWidth)) {
462 unsigned InnerShAmt = InnerShiftConst->getZExtValue();
463 unsigned MaskShift =
464 IsInnerShl ? TypeWidth - InnerShAmt : InnerShAmt - OuterShAmt;
465 APInt Mask = APInt::getLowBitsSet(TypeWidth, OuterShAmt) << MaskShift;
466 if (IC.MaskedValueIsZero(InnerShift->getOperand(0), Mask, 0, CxtI))
467 return true;
468 }
469
470 return false;
471}
472
473/// See if we can compute the specified value, but shifted logically to the left
474/// or right by some number of bits. This should return true if the expression
475/// can be computed for the same cost as the current expression tree. This is
476/// used to eliminate extraneous shifting from things like:
477/// %C = shl i128 %A, 64
478/// %D = shl i128 %B, 96
479/// %E = or i128 %C, %D
480/// %F = lshr i128 %E, 64
481/// where the client will ask if E can be computed shifted right by 64-bits. If
482/// this succeeds, getShiftedValue() will be called to produce the value.
483static bool canEvaluateShifted(Value *V, unsigned NumBits, bool IsLeftShift,
484 InstCombinerImpl &IC, Instruction *CxtI) {
485 // We can always evaluate constants shifted.
486 if (isa<Constant>(V))
487 return true;
488
489 Instruction *I = dyn_cast<Instruction>(V);
490 if (!I) return false;
491
492 // We can't mutate something that has multiple uses: doing so would
493 // require duplicating the instruction in general, which isn't profitable.
494 if (!I->hasOneUse()) return false;
495
496 switch (I->getOpcode()) {
497 default: return false;
498 case Instruction::And:
499 case Instruction::Or:
500 case Instruction::Xor:
501 // Bitwise operators can all arbitrarily be arbitrarily evaluated shifted.
502 return canEvaluateShifted(I->getOperand(0), NumBits, IsLeftShift, IC, I) &&
503 canEvaluateShifted(I->getOperand(1), NumBits, IsLeftShift, IC, I);
504
505 case Instruction::Shl:
506 case Instruction::LShr:
507 return canEvaluateShiftedShift(NumBits, IsLeftShift, I, IC, CxtI);
508
509 case Instruction::Select: {
510 SelectInst *SI = cast<SelectInst>(I);
511 Value *TrueVal = SI->getTrueValue();
512 Value *FalseVal = SI->getFalseValue();
513 return canEvaluateShifted(TrueVal, NumBits, IsLeftShift, IC, SI) &&
514 canEvaluateShifted(FalseVal, NumBits, IsLeftShift, IC, SI);
515 }
516 case Instruction::PHI: {
517 // We can change a phi if we can change all operands. Note that we never
518 // get into trouble with cyclic PHIs here because we only consider
519 // instructions with a single use.
520 PHINode *PN = cast<PHINode>(I);
521 for (Value *IncValue : PN->incoming_values())
522 if (!canEvaluateShifted(IncValue, NumBits, IsLeftShift, IC, PN))
523 return false;
524 return true;
525 }
526 }
527}
528
529/// Fold OuterShift (InnerShift X, C1), C2.
530/// See canEvaluateShiftedShift() for the constraints on these instructions.
531static Value *foldShiftedShift(BinaryOperator *InnerShift, unsigned OuterShAmt,
532 bool IsOuterShl,
533 InstCombiner::BuilderTy &Builder) {
534 bool IsInnerShl = InnerShift->getOpcode() == Instruction::Shl;
535 Type *ShType = InnerShift->getType();
536 unsigned TypeWidth = ShType->getScalarSizeInBits();
537
538 // We only accept shifts-by-a-constant in canEvaluateShifted().
539 const APInt *C1;
540 match(InnerShift->getOperand(1), m_APInt(C1));
541 unsigned InnerShAmt = C1->getZExtValue();
542
543 // Change the shift amount and clear the appropriate IR flags.
544 auto NewInnerShift = [&](unsigned ShAmt) {
545 InnerShift->setOperand(1, ConstantInt::get(ShType, ShAmt));
546 if (IsInnerShl) {
547 InnerShift->setHasNoUnsignedWrap(false);
548 InnerShift->setHasNoSignedWrap(false);
549 } else {
550 InnerShift->setIsExact(false);
551 }
552 return InnerShift;
553 };
554
555 // Two logical shifts in the same direction:
556 // shl (shl X, C1), C2 --> shl X, C1 + C2
557 // lshr (lshr X, C1), C2 --> lshr X, C1 + C2
558 if (IsInnerShl == IsOuterShl) {
559 // If this is an oversized composite shift, then unsigned shifts get 0.
560 if (InnerShAmt + OuterShAmt >= TypeWidth)
561 return Constant::getNullValue(ShType);
562
563 return NewInnerShift(InnerShAmt + OuterShAmt);
564 }
565
566 // Equal shift amounts in opposite directions become bitwise 'and':
567 // lshr (shl X, C), C --> and X, C'
568 // shl (lshr X, C), C --> and X, C'
569 if (InnerShAmt == OuterShAmt) {
570 APInt Mask = IsInnerShl
571 ? APInt::getLowBitsSet(TypeWidth, TypeWidth - OuterShAmt)
572 : APInt::getHighBitsSet(TypeWidth, TypeWidth - OuterShAmt);
573 Value *And = Builder.CreateAnd(InnerShift->getOperand(0),
574 ConstantInt::get(ShType, Mask));
575 if (auto *AndI = dyn_cast<Instruction>(And)) {
576 AndI->moveBefore(InnerShift);
577 AndI->takeName(InnerShift);
578 }
579 return And;
580 }
581
582 assert(InnerShAmt > OuterShAmt &&((void)0)
583 "Unexpected opposite direction logical shift pair")((void)0);
584
585 // In general, we would need an 'and' for this transform, but
586 // canEvaluateShiftedShift() guarantees that the masked-off bits are not used.
587 // lshr (shl X, C1), C2 --> shl X, C1 - C2
588 // shl (lshr X, C1), C2 --> lshr X, C1 - C2
589 return NewInnerShift(InnerShAmt - OuterShAmt);
590}
591
592/// When canEvaluateShifted() returns true for an expression, this function
593/// inserts the new computation that produces the shifted value.
594static Value *getShiftedValue(Value *V, unsigned NumBits, bool isLeftShift,
595 InstCombinerImpl &IC, const DataLayout &DL) {
596 // We can always evaluate constants shifted.
597 if (Constant *C = dyn_cast<Constant>(V)) {
598 if (isLeftShift)
599 return IC.Builder.CreateShl(C, NumBits);
600 else
601 return IC.Builder.CreateLShr(C, NumBits);
602 }
603
604 Instruction *I = cast<Instruction>(V);
605 IC.addToWorklist(I);
606
607 switch (I->getOpcode()) {
608 default: llvm_unreachable("Inconsistency with CanEvaluateShifted")__builtin_unreachable();
609 case Instruction::And:
610 case Instruction::Or:
611 case Instruction::Xor:
612 // Bitwise operators can all arbitrarily be arbitrarily evaluated shifted.
613 I->setOperand(
614 0, getShiftedValue(I->getOperand(0), NumBits, isLeftShift, IC, DL));
615 I->setOperand(
616 1, getShiftedValue(I->getOperand(1), NumBits, isLeftShift, IC, DL));
617 return I;
618
619 case Instruction::Shl:
620 case Instruction::LShr:
621 return foldShiftedShift(cast<BinaryOperator>(I), NumBits, isLeftShift,
622 IC.Builder);
623
624 case Instruction::Select:
625 I->setOperand(
626 1, getShiftedValue(I->getOperand(1), NumBits, isLeftShift, IC, DL));
627 I->setOperand(
628 2, getShiftedValue(I->getOperand(2), NumBits, isLeftShift, IC, DL));
629 return I;
630 case Instruction::PHI: {
631 // We can change a phi if we can change all operands. Note that we never
632 // get into trouble with cyclic PHIs here because we only consider
633 // instructions with a single use.
634 PHINode *PN = cast<PHINode>(I);
635 for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i)
636 PN->setIncomingValue(i, getShiftedValue(PN->getIncomingValue(i), NumBits,
637 isLeftShift, IC, DL));
638 return PN;
639 }
640 }
641}
642
643// If this is a bitwise operator or add with a constant RHS we might be able
644// to pull it through a shift.
645static bool canShiftBinOpWithConstantRHS(BinaryOperator &Shift,
646 BinaryOperator *BO) {
647 switch (BO->getOpcode()) {
648 default:
649 return false; // Do not perform transform!
650 case Instruction::Add:
651 return Shift.getOpcode() == Instruction::Shl;
652 case Instruction::Or:
653 case Instruction::And:
654 return true;
655 case Instruction::Xor:
656 // Do not change a 'not' of logical shift because that would create a normal
657 // 'xor'. The 'not' is likely better for analysis, SCEV, and codegen.
658 return !(Shift.isLogicalShift() && match(BO, m_Not(m_Value())));
659 }
660}
661
662Instruction *InstCombinerImpl::FoldShiftByConstant(Value *Op0, Constant *Op1,
663 BinaryOperator &I) {
664 bool isLeftShift = I.getOpcode() == Instruction::Shl;
665
666 const APInt *Op1C;
667 if (!match(Op1, m_APInt(Op1C)))
668 return nullptr;
669
670 // See if we can propagate this shift into the input, this covers the trivial
671 // cast of lshr(shl(x,c1),c2) as well as other more complex cases.
672 if (I.getOpcode() != Instruction::AShr &&
673 canEvaluateShifted(Op0, Op1C->getZExtValue(), isLeftShift, *this, &I)) {
674 LLVM_DEBUG(do { } while (false)
675 dbgs() << "ICE: GetShiftedValue propagating shift through expression"do { } while (false)
676 " to eliminate shift:\n IN: "do { } while (false)
677 << *Op0 << "\n SH: " << I << "\n")do { } while (false);
678
679 return replaceInstUsesWith(
680 I, getShiftedValue(Op0, Op1C->getZExtValue(), isLeftShift, *this, DL));
681 }
682
683 // See if we can simplify any instructions used by the instruction whose sole
684 // purpose is to compute bits we don't care about.
685 Type *Ty = I.getType();
686 unsigned TypeBits = Ty->getScalarSizeInBits();
687 assert(!Op1C->uge(TypeBits) &&((void)0)
688 "Shift over the type width should have been removed already")((void)0);
689
690 if (Instruction *FoldedShift = foldBinOpIntoSelectOrPhi(I))
691 return FoldedShift;
692
693 // Fold shift2(trunc(shift1(x,c1)), c2) -> trunc(shift2(shift1(x,c1),c2))
694 if (auto *TI = dyn_cast<TruncInst>(Op0)) {
695 // If 'shift2' is an ashr, we would have to get the sign bit into a funny
696 // place. Don't try to do this transformation in this case. Also, we
697 // require that the input operand is a shift-by-constant so that we have
698 // confidence that the shifts will get folded together. We could do this
699 // xform in more cases, but it is unlikely to be profitable.
700 const APInt *TrShiftAmt;
701 if (I.isLogicalShift() &&
702 match(TI->getOperand(0), m_Shift(m_Value(), m_APInt(TrShiftAmt)))) {
703 auto *TrOp = cast<Instruction>(TI->getOperand(0));
704 Type *SrcTy = TrOp->getType();
705
706 // Okay, we'll do this xform. Make the shift of shift.
707 Constant *ShAmt = ConstantExpr::getZExt(Op1, SrcTy);
708 // (shift2 (shift1 & 0x00FF), c2)
709 Value *NSh = Builder.CreateBinOp(I.getOpcode(), TrOp, ShAmt, I.getName());
710
711 // For logical shifts, the truncation has the effect of making the high
712 // part of the register be zeros. Emulate this by inserting an AND to
713 // clear the top bits as needed. This 'and' will usually be zapped by
714 // other xforms later if dead.
715 unsigned SrcSize = SrcTy->getScalarSizeInBits();
716 Constant *MaskV =
717 ConstantInt::get(SrcTy, APInt::getLowBitsSet(SrcSize, TypeBits));
718
719 // The mask we constructed says what the trunc would do if occurring
720 // between the shifts. We want to know the effect *after* the second
721 // shift. We know that it is a logical shift by a constant, so adjust the
722 // mask as appropriate.
723 MaskV = ConstantExpr::get(I.getOpcode(), MaskV, ShAmt);
724 // shift1 & 0x00FF
725 Value *And = Builder.CreateAnd(NSh, MaskV, TI->getName());
726 // Return the value truncated to the interesting size.
727 return new TruncInst(And, Ty);
728 }
729 }
730
731 if (Op0->hasOneUse()) {
732 if (BinaryOperator *Op0BO = dyn_cast<BinaryOperator>(Op0)) {
733 // Turn ((X >> C) + Y) << C -> (X + (Y << C)) & (~0 << C)
734 Value *V1;
735 const APInt *CC;
736 switch (Op0BO->getOpcode()) {
737 default: break;
738 case Instruction::Add:
739 case Instruction::And:
740 case Instruction::Or:
741 case Instruction::Xor: {
742 // These operators commute.
743 // Turn (Y + (X >> C)) << C -> (X + (Y << C)) & (~0 << C)
744 if (isLeftShift && Op0BO->getOperand(1)->hasOneUse() &&
745 match(Op0BO->getOperand(1), m_Shr(m_Value(V1),
746 m_Specific(Op1)))) {
747 Value *YS = // (Y << C)
748 Builder.CreateShl(Op0BO->getOperand(0), Op1, Op0BO->getName());
749 // (X + (Y << C))
750 Value *X = Builder.CreateBinOp(Op0BO->getOpcode(), YS, V1,
751 Op0BO->getOperand(1)->getName());
752 unsigned Op1Val = Op1C->getLimitedValue(TypeBits);
753 APInt Bits = APInt::getHighBitsSet(TypeBits, TypeBits - Op1Val);
754 Constant *Mask = ConstantInt::get(Ty, Bits);
755 return BinaryOperator::CreateAnd(X, Mask);
756 }
757
758 // Turn (Y + ((X >> C) & CC)) << C -> ((X & (CC << C)) + (Y << C))
759 Value *Op0BOOp1 = Op0BO->getOperand(1);
760 if (isLeftShift && Op0BOOp1->hasOneUse() &&
761 match(Op0BOOp1, m_And(m_OneUse(m_Shr(m_Value(V1), m_Specific(Op1))),
762 m_APInt(CC)))) {
763 Value *YS = // (Y << C)
764 Builder.CreateShl(Op0BO->getOperand(0), Op1, Op0BO->getName());
765 // X & (CC << C)
766 Value *XM = Builder.CreateAnd(
767 V1, ConstantExpr::getShl(ConstantInt::get(Ty, *CC), Op1),
768 V1->getName() + ".mask");
769 return BinaryOperator::Create(Op0BO->getOpcode(), YS, XM);
770 }
771 LLVM_FALLTHROUGH[[gnu::fallthrough]];
772 }
773
774 case Instruction::Sub: {
775 // Turn ((X >> C) + Y) << C -> (X + (Y << C)) & (~0 << C)
776 if (isLeftShift && Op0BO->getOperand(0)->hasOneUse() &&
777 match(Op0BO->getOperand(0), m_Shr(m_Value(V1),
778 m_Specific(Op1)))) {
779 Value *YS = // (Y << C)
780 Builder.CreateShl(Op0BO->getOperand(1), Op1, Op0BO->getName());
781 // (X + (Y << C))
782 Value *X = Builder.CreateBinOp(Op0BO->getOpcode(), V1, YS,
783 Op0BO->getOperand(0)->getName());
784 unsigned Op1Val = Op1C->getLimitedValue(TypeBits);
785 APInt Bits = APInt::getHighBitsSet(TypeBits, TypeBits - Op1Val);
786 Constant *Mask = ConstantInt::get(Ty, Bits);
787 return BinaryOperator::CreateAnd(X, Mask);
788 }
789
790 // Turn (((X >> C)&CC) + Y) << C -> (X + (Y << C)) & (CC << C)
791 if (isLeftShift && Op0BO->getOperand(0)->hasOneUse() &&
792 match(Op0BO->getOperand(0),
793 m_And(m_OneUse(m_Shr(m_Value(V1), m_Specific(Op1))),
794 m_APInt(CC)))) {
795 Value *YS = // (Y << C)
796 Builder.CreateShl(Op0BO->getOperand(1), Op1, Op0BO->getName());
797 // X & (CC << C)
798 Value *XM = Builder.CreateAnd(
799 V1, ConstantExpr::getShl(ConstantInt::get(Ty, *CC), Op1),
800 V1->getName() + ".mask");
801 return BinaryOperator::Create(Op0BO->getOpcode(), XM, YS);
802 }
803
804 break;
805 }
806 }
807
808 // If the operand is a bitwise operator with a constant RHS, and the
809 // shift is the only use, we can pull it out of the shift.
810 const APInt *Op0C;
811 if (match(Op0BO->getOperand(1), m_APInt(Op0C))) {
812 if (canShiftBinOpWithConstantRHS(I, Op0BO)) {
813 Constant *NewRHS = ConstantExpr::get(I.getOpcode(),
814 cast<Constant>(Op0BO->getOperand(1)), Op1);
815
816 Value *NewShift =
817 Builder.CreateBinOp(I.getOpcode(), Op0BO->getOperand(0), Op1);
818 NewShift->takeName(Op0BO);
819
820 return BinaryOperator::Create(Op0BO->getOpcode(), NewShift,
821 NewRHS);
822 }
823 }
824
825 // If the operand is a subtract with a constant LHS, and the shift
826 // is the only use, we can pull it out of the shift.
827 // This folds (shl (sub C1, X), C2) -> (sub (C1 << C2), (shl X, C2))
828 if (isLeftShift && Op0BO->getOpcode() == Instruction::Sub &&
829 match(Op0BO->getOperand(0), m_APInt(Op0C))) {
830 Constant *NewRHS = ConstantExpr::get(I.getOpcode(),
831 cast<Constant>(Op0BO->getOperand(0)), Op1);
832
833 Value *NewShift = Builder.CreateShl(Op0BO->getOperand(1), Op1);
834 NewShift->takeName(Op0BO);
835
836 return BinaryOperator::CreateSub(NewRHS, NewShift);
837 }
838 }
839
840 // If we have a select that conditionally executes some binary operator,
841 // see if we can pull it the select and operator through the shift.
842 //
843 // For example, turning:
844 // shl (select C, (add X, C1), X), C2
845 // Into:
846 // Y = shl X, C2
847 // select C, (add Y, C1 << C2), Y
848 Value *Cond;
849 BinaryOperator *TBO;
850 Value *FalseVal;
851 if (match(Op0, m_Select(m_Value(Cond), m_OneUse(m_BinOp(TBO)),
852 m_Value(FalseVal)))) {
853 const APInt *C;
854 if (!isa<Constant>(FalseVal) && TBO->getOperand(0) == FalseVal &&
855 match(TBO->getOperand(1), m_APInt(C)) &&
856 canShiftBinOpWithConstantRHS(I, TBO)) {
857 Constant *NewRHS = ConstantExpr::get(I.getOpcode(),
858 cast<Constant>(TBO->getOperand(1)), Op1);
859
860 Value *NewShift =
861 Builder.CreateBinOp(I.getOpcode(), FalseVal, Op1);
862 Value *NewOp = Builder.CreateBinOp(TBO->getOpcode(), NewShift,
863 NewRHS);
864 return SelectInst::Create(Cond, NewOp, NewShift);
865 }
866 }
867
868 BinaryOperator *FBO;
869 Value *TrueVal;
870 if (match(Op0, m_Select(m_Value(Cond), m_Value(TrueVal),
871 m_OneUse(m_BinOp(FBO))))) {
872 const APInt *C;
873 if (!isa<Constant>(TrueVal) && FBO->getOperand(0) == TrueVal &&
874 match(FBO->getOperand(1), m_APInt(C)) &&
875 canShiftBinOpWithConstantRHS(I, FBO)) {
876 Constant *NewRHS = ConstantExpr::get(I.getOpcode(),
877 cast<Constant>(FBO->getOperand(1)), Op1);
878
879 Value *NewShift =
880 Builder.CreateBinOp(I.getOpcode(), TrueVal, Op1);
881 Value *NewOp = Builder.CreateBinOp(FBO->getOpcode(), NewShift,
882 NewRHS);
883 return SelectInst::Create(Cond, NewShift, NewOp);
884 }
885 }
886 }
887
888 return nullptr;
889}
890
891Instruction *InstCombinerImpl::visitShl(BinaryOperator &I) {
892 const SimplifyQuery Q = SQ.getWithInstruction(&I);
893
894 if (Value *V = SimplifyShlInst(I.getOperand(0), I.getOperand(1),
1
Assuming 'V' is null
2
Taking false branch
895 I.hasNoSignedWrap(), I.hasNoUnsignedWrap(), Q))
896 return replaceInstUsesWith(I, V);
897
898 if (Instruction *X = foldVectorBinop(I))
3
Assuming 'X' is null
4
Taking false branch
899 return X;
900
901 if (Instruction *V = commonShiftTransforms(I))
5
Assuming 'V' is null
6
Taking false branch
902 return V;
903
904 if (Instruction *V = dropRedundantMaskingOfLeftShiftInput(&I, Q, Builder))
7
Calling 'dropRedundantMaskingOfLeftShiftInput'
905 return V;
906
907 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
908 Type *Ty = I.getType();
909 unsigned BitWidth = Ty->getScalarSizeInBits();
910
911 const APInt *ShAmtAPInt;
912 if (match(Op1, m_APInt(ShAmtAPInt))) {
913 unsigned ShAmt = ShAmtAPInt->getZExtValue();
914
915 // shl (zext X), ShAmt --> zext (shl X, ShAmt)
916 // This is only valid if X would have zeros shifted out.
917 Value *X;
918 if (match(Op0, m_OneUse(m_ZExt(m_Value(X))))) {
919 unsigned SrcWidth = X->getType()->getScalarSizeInBits();
920 if (ShAmt < SrcWidth &&
921 MaskedValueIsZero(X, APInt::getHighBitsSet(SrcWidth, ShAmt), 0, &I))
922 return new ZExtInst(Builder.CreateShl(X, ShAmt), Ty);
923 }
924
925 // (X >> C) << C --> X & (-1 << C)
926 if (match(Op0, m_Shr(m_Value(X), m_Specific(Op1)))) {
927 APInt Mask(APInt::getHighBitsSet(BitWidth, BitWidth - ShAmt));
928 return BinaryOperator::CreateAnd(X, ConstantInt::get(Ty, Mask));
929 }
930
931 const APInt *ShOp1;
932 if (match(Op0, m_Exact(m_Shr(m_Value(X), m_APInt(ShOp1)))) &&
933 ShOp1->ult(BitWidth)) {
934 unsigned ShrAmt = ShOp1->getZExtValue();
935 if (ShrAmt < ShAmt) {
936 // If C1 < C2: (X >>?,exact C1) << C2 --> X << (C2 - C1)
937 Constant *ShiftDiff = ConstantInt::get(Ty, ShAmt - ShrAmt);
938 auto *NewShl = BinaryOperator::CreateShl(X, ShiftDiff);
939 NewShl->setHasNoUnsignedWrap(I.hasNoUnsignedWrap());
940 NewShl->setHasNoSignedWrap(I.hasNoSignedWrap());
941 return NewShl;
942 }
943 if (ShrAmt > ShAmt) {
944 // If C1 > C2: (X >>?exact C1) << C2 --> X >>?exact (C1 - C2)
945 Constant *ShiftDiff = ConstantInt::get(Ty, ShrAmt - ShAmt);
946 auto *NewShr = BinaryOperator::Create(
947 cast<BinaryOperator>(Op0)->getOpcode(), X, ShiftDiff);
948 NewShr->setIsExact(true);
949 return NewShr;
950 }
951 }
952
953 if (match(Op0, m_OneUse(m_Shr(m_Value(X), m_APInt(ShOp1)))) &&
954 ShOp1->ult(BitWidth)) {
955 unsigned ShrAmt = ShOp1->getZExtValue();
956 if (ShrAmt < ShAmt) {
957 // If C1 < C2: (X >>? C1) << C2 --> X << (C2 - C1) & (-1 << C2)
958 Constant *ShiftDiff = ConstantInt::get(Ty, ShAmt - ShrAmt);
959 auto *NewShl = BinaryOperator::CreateShl(X, ShiftDiff);
960 NewShl->setHasNoUnsignedWrap(I.hasNoUnsignedWrap());
961 NewShl->setHasNoSignedWrap(I.hasNoSignedWrap());
962 Builder.Insert(NewShl);
963 APInt Mask(APInt::getHighBitsSet(BitWidth, BitWidth - ShAmt));
964 return BinaryOperator::CreateAnd(NewShl, ConstantInt::get(Ty, Mask));
965 }
966 if (ShrAmt > ShAmt) {
967 // If C1 > C2: (X >>? C1) << C2 --> X >>? (C1 - C2) & (-1 << C2)
968 Constant *ShiftDiff = ConstantInt::get(Ty, ShrAmt - ShAmt);
969 auto *OldShr = cast<BinaryOperator>(Op0);
970 auto *NewShr =
971 BinaryOperator::Create(OldShr->getOpcode(), X, ShiftDiff);
972 NewShr->setIsExact(OldShr->isExact());
973 Builder.Insert(NewShr);
974 APInt Mask(APInt::getHighBitsSet(BitWidth, BitWidth - ShAmt));
975 return BinaryOperator::CreateAnd(NewShr, ConstantInt::get(Ty, Mask));
976 }
977 }
978
979 if (match(Op0, m_Shl(m_Value(X), m_APInt(ShOp1))) && ShOp1->ult(BitWidth)) {
980 unsigned AmtSum = ShAmt + ShOp1->getZExtValue();
981 // Oversized shifts are simplified to zero in InstSimplify.
982 if (AmtSum < BitWidth)
983 // (X << C1) << C2 --> X << (C1 + C2)
984 return BinaryOperator::CreateShl(X, ConstantInt::get(Ty, AmtSum));
985 }
986
987 // If the shifted-out value is known-zero, then this is a NUW shift.
988 if (!I.hasNoUnsignedWrap() &&
989 MaskedValueIsZero(Op0, APInt::getHighBitsSet(BitWidth, ShAmt), 0, &I)) {
990 I.setHasNoUnsignedWrap();
991 return &I;
992 }
993
994 // If the shifted-out value is all signbits, then this is a NSW shift.
995 if (!I.hasNoSignedWrap() && ComputeNumSignBits(Op0, 0, &I) > ShAmt) {
996 I.setHasNoSignedWrap();
997 return &I;
998 }
999 }
1000
1001 // Transform (x >> y) << y to x & (-1 << y)
1002 // Valid for any type of right-shift.
1003 Value *X;
1004 if (match(Op0, m_OneUse(m_Shr(m_Value(X), m_Specific(Op1))))) {
1005 Constant *AllOnes = ConstantInt::getAllOnesValue(Ty);
1006 Value *Mask = Builder.CreateShl(AllOnes, Op1);
1007 return BinaryOperator::CreateAnd(Mask, X);
1008 }
1009
1010 Constant *C1;
1011 if (match(Op1, m_Constant(C1))) {
1012 Constant *C2;
1013 Value *X;
1014 // (C2 << X) << C1 --> (C2 << C1) << X
1015 if (match(Op0, m_OneUse(m_Shl(m_Constant(C2), m_Value(X)))))
1016 return BinaryOperator::CreateShl(ConstantExpr::getShl(C2, C1), X);
1017
1018 // (X * C2) << C1 --> X * (C2 << C1)
1019 if (match(Op0, m_Mul(m_Value(X), m_Constant(C2))))
1020 return BinaryOperator::CreateMul(X, ConstantExpr::getShl(C2, C1));
1021
1022 // shl (zext i1 X), C1 --> select (X, 1 << C1, 0)
1023 if (match(Op0, m_ZExt(m_Value(X))) && X->getType()->isIntOrIntVectorTy(1)) {
1024 auto *NewC = ConstantExpr::getShl(ConstantInt::get(Ty, 1), C1);
1025 return SelectInst::Create(X, NewC, ConstantInt::getNullValue(Ty));
1026 }
1027 }
1028
1029 // (1 << (C - x)) -> ((1 << C) >> x) if C is bitwidth - 1
1030 if (match(Op0, m_One()) &&
1031 match(Op1, m_Sub(m_SpecificInt(BitWidth - 1), m_Value(X))))
1032 return BinaryOperator::CreateLShr(
1033 ConstantInt::get(Ty, APInt::getSignMask(BitWidth)), X);
1034
1035 return nullptr;
1036}
1037
1038Instruction *InstCombinerImpl::visitLShr(BinaryOperator &I) {
1039 if (Value *V = SimplifyLShrInst(I.getOperand(0), I.getOperand(1), I.isExact(),
1040 SQ.getWithInstruction(&I)))
1041 return replaceInstUsesWith(I, V);
1042
1043 if (Instruction *X = foldVectorBinop(I))
1044 return X;
1045
1046 if (Instruction *R = commonShiftTransforms(I))
1047 return R;
1048
1049 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
1050 Type *Ty = I.getType();
1051 const APInt *ShAmtAPInt;
1052 if (match(Op1, m_APInt(ShAmtAPInt))) {
1053 unsigned ShAmt = ShAmtAPInt->getZExtValue();
1054 unsigned BitWidth = Ty->getScalarSizeInBits();
1055 auto *II = dyn_cast<IntrinsicInst>(Op0);
1056 if (II && isPowerOf2_32(BitWidth) && Log2_32(BitWidth) == ShAmt &&
1057 (II->getIntrinsicID() == Intrinsic::ctlz ||
1058 II->getIntrinsicID() == Intrinsic::cttz ||
1059 II->getIntrinsicID() == Intrinsic::ctpop)) {
1060 // ctlz.i32(x)>>5 --> zext(x == 0)
1061 // cttz.i32(x)>>5 --> zext(x == 0)
1062 // ctpop.i32(x)>>5 --> zext(x == -1)
1063 bool IsPop = II->getIntrinsicID() == Intrinsic::ctpop;
1064 Constant *RHS = ConstantInt::getSigned(Ty, IsPop ? -1 : 0);
1065 Value *Cmp = Builder.CreateICmpEQ(II->getArgOperand(0), RHS);
1066 return new ZExtInst(Cmp, Ty);
1067 }
1068
1069 Value *X;
1070 const APInt *ShOp1;
1071 if (match(Op0, m_Shl(m_Value(X), m_APInt(ShOp1))) && ShOp1->ult(BitWidth)) {
1072 if (ShOp1->ult(ShAmt)) {
1073 unsigned ShlAmt = ShOp1->getZExtValue();
1074 Constant *ShiftDiff = ConstantInt::get(Ty, ShAmt - ShlAmt);
1075 if (cast<BinaryOperator>(Op0)->hasNoUnsignedWrap()) {
1076 // (X <<nuw C1) >>u C2 --> X >>u (C2 - C1)
1077 auto *NewLShr = BinaryOperator::CreateLShr(X, ShiftDiff);
1078 NewLShr->setIsExact(I.isExact());
1079 return NewLShr;
1080 }
1081 // (X << C1) >>u C2 --> (X >>u (C2 - C1)) & (-1 >> C2)
1082 Value *NewLShr = Builder.CreateLShr(X, ShiftDiff, "", I.isExact());
1083 APInt Mask(APInt::getLowBitsSet(BitWidth, BitWidth - ShAmt));
1084 return BinaryOperator::CreateAnd(NewLShr, ConstantInt::get(Ty, Mask));
1085 }
1086 if (ShOp1->ugt(ShAmt)) {
1087 unsigned ShlAmt = ShOp1->getZExtValue();
1088 Constant *ShiftDiff = ConstantInt::get(Ty, ShlAmt - ShAmt);
1089 if (cast<BinaryOperator>(Op0)->hasNoUnsignedWrap()) {
1090 // (X <<nuw C1) >>u C2 --> X <<nuw (C1 - C2)
1091 auto *NewShl = BinaryOperator::CreateShl(X, ShiftDiff);
1092 NewShl->setHasNoUnsignedWrap(true);
1093 return NewShl;
1094 }
1095 // (X << C1) >>u C2 --> X << (C1 - C2) & (-1 >> C2)
1096 Value *NewShl = Builder.CreateShl(X, ShiftDiff);
1097 APInt Mask(APInt::getLowBitsSet(BitWidth, BitWidth - ShAmt));
1098 return BinaryOperator::CreateAnd(NewShl, ConstantInt::get(Ty, Mask));
1099 }
1100 assert(*ShOp1 == ShAmt)((void)0);
1101 // (X << C) >>u C --> X & (-1 >>u C)
1102 APInt Mask(APInt::getLowBitsSet(BitWidth, BitWidth - ShAmt));
1103 return BinaryOperator::CreateAnd(X, ConstantInt::get(Ty, Mask));
1104 }
1105
1106 if (match(Op0, m_OneUse(m_ZExt(m_Value(X)))) &&
1107 (!Ty->isIntegerTy() || shouldChangeType(Ty, X->getType()))) {
1108 assert(ShAmt < X->getType()->getScalarSizeInBits() &&((void)0)
1109 "Big shift not simplified to zero?")((void)0);
1110 // lshr (zext iM X to iN), C --> zext (lshr X, C) to iN
1111 Value *NewLShr = Builder.CreateLShr(X, ShAmt);
1112 return new ZExtInst(NewLShr, Ty);
1113 }
1114
1115 if (match(Op0, m_SExt(m_Value(X))) &&
1116 (!Ty->isIntegerTy() || shouldChangeType(Ty, X->getType()))) {
1117 // Are we moving the sign bit to the low bit and widening with high zeros?
1118 unsigned SrcTyBitWidth = X->getType()->getScalarSizeInBits();
1119 if (ShAmt == BitWidth - 1) {
1120 // lshr (sext i1 X to iN), N-1 --> zext X to iN
1121 if (SrcTyBitWidth == 1)
1122 return new ZExtInst(X, Ty);
1123
1124 // lshr (sext iM X to iN), N-1 --> zext (lshr X, M-1) to iN
1125 if (Op0->hasOneUse()) {
1126 Value *NewLShr = Builder.CreateLShr(X, SrcTyBitWidth - 1);
1127 return new ZExtInst(NewLShr, Ty);
1128 }
1129 }
1130
1131 // lshr (sext iM X to iN), N-M --> zext (ashr X, min(N-M, M-1)) to iN
1132 if (ShAmt == BitWidth - SrcTyBitWidth && Op0->hasOneUse()) {
1133 // The new shift amount can't be more than the narrow source type.
1134 unsigned NewShAmt = std::min(ShAmt, SrcTyBitWidth - 1);
1135 Value *AShr = Builder.CreateAShr(X, NewShAmt);
1136 return new ZExtInst(AShr, Ty);
1137 }
1138 }
1139
1140 Value *Y;
1141 if (ShAmt == BitWidth - 1) {
1142 // lshr i32 or(X,-X), 31 --> zext (X != 0)
1143 if (match(Op0, m_OneUse(m_c_Or(m_Neg(m_Value(X)), m_Deferred(X)))))
1144 return new ZExtInst(Builder.CreateIsNotNull(X), Ty);
1145
1146 // lshr i32 (X -nsw Y), 31 --> zext (X < Y)
1147 if (match(Op0, m_OneUse(m_NSWSub(m_Value(X), m_Value(Y)))))
1148 return new ZExtInst(Builder.CreateICmpSLT(X, Y), Ty);
1149
1150 // Check if a number is negative and odd:
1151 // lshr i32 (srem X, 2), 31 --> and (X >> 31), X
1152 if (match(Op0, m_OneUse(m_SRem(m_Value(X), m_SpecificInt(2))))) {
1153 Value *Signbit = Builder.CreateLShr(X, ShAmt);
1154 return BinaryOperator::CreateAnd(Signbit, X);
1155 }
1156 }
1157
1158 if (match(Op0, m_LShr(m_Value(X), m_APInt(ShOp1)))) {
1159 unsigned AmtSum = ShAmt + ShOp1->getZExtValue();
1160 // Oversized shifts are simplified to zero in InstSimplify.
1161 if (AmtSum < BitWidth)
1162 // (X >>u C1) >>u C2 --> X >>u (C1 + C2)
1163 return BinaryOperator::CreateLShr(X, ConstantInt::get(Ty, AmtSum));
1164 }
1165
1166 // Look for a "splat" mul pattern - it replicates bits across each half of
1167 // a value, so a right shift is just a mask of the low bits:
1168 // lshr i32 (mul nuw X, Pow2+1), 16 --> and X, Pow2-1
1169 // TODO: Generalize to allow more than just half-width shifts?
1170 const APInt *MulC;
1171 if (match(Op0, m_NUWMul(m_Value(X), m_APInt(MulC))) &&
1172 ShAmt * 2 == BitWidth && (*MulC - 1).isPowerOf2() &&
1173 MulC->logBase2() == ShAmt)
1174 return BinaryOperator::CreateAnd(X, ConstantInt::get(Ty, *MulC - 2));
1175
1176 // If the shifted-out value is known-zero, then this is an exact shift.
1177 if (!I.isExact() &&
1178 MaskedValueIsZero(Op0, APInt::getLowBitsSet(BitWidth, ShAmt), 0, &I)) {
1179 I.setIsExact();
1180 return &I;
1181 }
1182 }
1183
1184 // Transform (x << y) >> y to x & (-1 >> y)
1185 Value *X;
1186 if (match(Op0, m_OneUse(m_Shl(m_Value(X), m_Specific(Op1))))) {
1187 Constant *AllOnes = ConstantInt::getAllOnesValue(Ty);
1188 Value *Mask = Builder.CreateLShr(AllOnes, Op1);
1189 return BinaryOperator::CreateAnd(Mask, X);
1190 }
1191
1192 return nullptr;
1193}
1194
1195Instruction *
1196InstCombinerImpl::foldVariableSignZeroExtensionOfVariableHighBitExtract(
1197 BinaryOperator &OldAShr) {
1198 assert(OldAShr.getOpcode() == Instruction::AShr &&((void)0)
1199 "Must be called with arithmetic right-shift instruction only.")((void)0);
1200
1201 // Check that constant C is a splat of the element-wise bitwidth of V.
1202 auto BitWidthSplat = [](Constant *C, Value *V) {
1203 return match(
1204 C, m_SpecificInt_ICMP(ICmpInst::Predicate::ICMP_EQ,
1205 APInt(C->getType()->getScalarSizeInBits(),
1206 V->getType()->getScalarSizeInBits())));
1207 };
1208
1209 // It should look like variable-length sign-extension on the outside:
1210 // (Val << (bitwidth(Val)-Nbits)) a>> (bitwidth(Val)-Nbits)
1211 Value *NBits;
1212 Instruction *MaybeTrunc;
1213 Constant *C1, *C2;
1214 if (!match(&OldAShr,
1215 m_AShr(m_Shl(m_Instruction(MaybeTrunc),
1216 m_ZExtOrSelf(m_Sub(m_Constant(C1),
1217 m_ZExtOrSelf(m_Value(NBits))))),
1218 m_ZExtOrSelf(m_Sub(m_Constant(C2),
1219 m_ZExtOrSelf(m_Deferred(NBits)))))) ||
1220 !BitWidthSplat(C1, &OldAShr) || !BitWidthSplat(C2, &OldAShr))
1221 return nullptr;
1222
1223 // There may or may not be a truncation after outer two shifts.
1224 Instruction *HighBitExtract;
1225 match(MaybeTrunc, m_TruncOrSelf(m_Instruction(HighBitExtract)));
1226 bool HadTrunc = MaybeTrunc != HighBitExtract;
1227
1228 // And finally, the innermost part of the pattern must be a right-shift.
1229 Value *X, *NumLowBitsToSkip;
1230 if (!match(HighBitExtract, m_Shr(m_Value(X), m_Value(NumLowBitsToSkip))))
1231 return nullptr;
1232
1233 // Said right-shift must extract high NBits bits - C0 must be it's bitwidth.
1234 Constant *C0;
1235 if (!match(NumLowBitsToSkip,
1236 m_ZExtOrSelf(
1237 m_Sub(m_Constant(C0), m_ZExtOrSelf(m_Specific(NBits))))) ||
1238 !BitWidthSplat(C0, HighBitExtract))
1239 return nullptr;
1240
1241 // Since the NBits is identical for all shifts, if the outermost and
1242 // innermost shifts are identical, then outermost shifts are redundant.
1243 // If we had truncation, do keep it though.
1244 if (HighBitExtract->getOpcode() == OldAShr.getOpcode())
1245 return replaceInstUsesWith(OldAShr, MaybeTrunc);
1246
1247 // Else, if there was a truncation, then we need to ensure that one
1248 // instruction will go away.
1249 if (HadTrunc && !match(&OldAShr, m_c_BinOp(m_OneUse(m_Value()), m_Value())))
1250 return nullptr;
1251
1252 // Finally, bypass two innermost shifts, and perform the outermost shift on
1253 // the operands of the innermost shift.
1254 Instruction *NewAShr =
1255 BinaryOperator::Create(OldAShr.getOpcode(), X, NumLowBitsToSkip);
1256 NewAShr->copyIRFlags(HighBitExtract); // We can preserve 'exact'-ness.
1257 if (!HadTrunc)
1258 return NewAShr;
1259
1260 Builder.Insert(NewAShr);
1261 return TruncInst::CreateTruncOrBitCast(NewAShr, OldAShr.getType());
1262}
1263
1264Instruction *InstCombinerImpl::visitAShr(BinaryOperator &I) {
1265 if (Value *V = SimplifyAShrInst(I.getOperand(0), I.getOperand(1), I.isExact(),
1266 SQ.getWithInstruction(&I)))
1267 return replaceInstUsesWith(I, V);
1268
1269 if (Instruction *X = foldVectorBinop(I))
1270 return X;
1271
1272 if (Instruction *R = commonShiftTransforms(I))
1273 return R;
1274
1275 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
1276 Type *Ty = I.getType();
1277 unsigned BitWidth = Ty->getScalarSizeInBits();
1278 const APInt *ShAmtAPInt;
1279 if (match(Op1, m_APInt(ShAmtAPInt)) && ShAmtAPInt->ult(BitWidth)) {
1280 unsigned ShAmt = ShAmtAPInt->getZExtValue();
1281
1282 // If the shift amount equals the difference in width of the destination
1283 // and source scalar types:
1284 // ashr (shl (zext X), C), C --> sext X
1285 Value *X;
1286 if (match(Op0, m_Shl(m_ZExt(m_Value(X)), m_Specific(Op1))) &&
1287 ShAmt == BitWidth - X->getType()->getScalarSizeInBits())
1288 return new SExtInst(X, Ty);
1289
1290 // We can't handle (X << C1) >>s C2. It shifts arbitrary bits in. However,
1291 // we can handle (X <<nsw C1) >>s C2 since it only shifts in sign bits.
1292 const APInt *ShOp1;
1293 if (match(Op0, m_NSWShl(m_Value(X), m_APInt(ShOp1))) &&
1294 ShOp1->ult(BitWidth)) {
1295 unsigned ShlAmt = ShOp1->getZExtValue();
1296 if (ShlAmt < ShAmt) {
1297 // (X <<nsw C1) >>s C2 --> X >>s (C2 - C1)
1298 Constant *ShiftDiff = ConstantInt::get(Ty, ShAmt - ShlAmt);
1299 auto *NewAShr = BinaryOperator::CreateAShr(X, ShiftDiff);
1300 NewAShr->setIsExact(I.isExact());
1301 return NewAShr;
1302 }
1303 if (ShlAmt > ShAmt) {
1304 // (X <<nsw C1) >>s C2 --> X <<nsw (C1 - C2)
1305 Constant *ShiftDiff = ConstantInt::get(Ty, ShlAmt - ShAmt);
1306 auto *NewShl = BinaryOperator::Create(Instruction::Shl, X, ShiftDiff);
1307 NewShl->setHasNoSignedWrap(true);
1308 return NewShl;
1309 }
1310 }
1311
1312 if (match(Op0, m_AShr(m_Value(X), m_APInt(ShOp1))) &&
1313 ShOp1->ult(BitWidth)) {
1314 unsigned AmtSum = ShAmt + ShOp1->getZExtValue();
1315 // Oversized arithmetic shifts replicate the sign bit.
1316 AmtSum = std::min(AmtSum, BitWidth - 1);
1317 // (X >>s C1) >>s C2 --> X >>s (C1 + C2)
1318 return BinaryOperator::CreateAShr(X, ConstantInt::get(Ty, AmtSum));
1319 }
1320
1321 if (match(Op0, m_OneUse(m_SExt(m_Value(X)))) &&
1322 (Ty->isVectorTy() || shouldChangeType(Ty, X->getType()))) {
1323 // ashr (sext X), C --> sext (ashr X, C')
1324 Type *SrcTy = X->getType();
1325 ShAmt = std::min(ShAmt, SrcTy->getScalarSizeInBits() - 1);
1326 Value *NewSh = Builder.CreateAShr(X, ConstantInt::get(SrcTy, ShAmt));
1327 return new SExtInst(NewSh, Ty);
1328 }
1329
1330 if (ShAmt == BitWidth - 1) {
1331 // ashr i32 or(X,-X), 31 --> sext (X != 0)
1332 if (match(Op0, m_OneUse(m_c_Or(m_Neg(m_Value(X)), m_Deferred(X)))))
1333 return new SExtInst(Builder.CreateIsNotNull(X), Ty);
1334
1335 // ashr i32 (X -nsw Y), 31 --> sext (X < Y)
1336 Value *Y;
1337 if (match(Op0, m_OneUse(m_NSWSub(m_Value(X), m_Value(Y)))))
1338 return new SExtInst(Builder.CreateICmpSLT(X, Y), Ty);
1339 }
1340
1341 // If the shifted-out value is known-zero, then this is an exact shift.
1342 if (!I.isExact() &&
1343 MaskedValueIsZero(Op0, APInt::getLowBitsSet(BitWidth, ShAmt), 0, &I)) {
1344 I.setIsExact();
1345 return &I;
1346 }
1347 }
1348
1349 if (Instruction *R = foldVariableSignZeroExtensionOfVariableHighBitExtract(I))
1350 return R;
1351
1352 // See if we can turn a signed shr into an unsigned shr.
1353 if (MaskedValueIsZero(Op0, APInt::getSignMask(BitWidth), 0, &I))
1354 return BinaryOperator::CreateLShr(Op0, Op1);
1355
1356 // ashr (xor %x, -1), %y --> xor (ashr %x, %y), -1
1357 Value *X;
1358 if (match(Op0, m_OneUse(m_Not(m_Value(X))))) {
1359 // Note that we must drop 'exact'-ness of the shift!
1360 // Note that we can't keep undef's in -1 vector constant!
1361 auto *NewAShr = Builder.CreateAShr(X, Op1, Op0->getName() + ".not");
1362 return BinaryOperator::CreateNot(NewAShr);
1363 }
1364
1365 return nullptr;
1366}

/usr/src/gnu/usr.bin/clang/libLLVM/../../../llvm/llvm/include/llvm/IR/PatternMatch.h

1//===- PatternMatch.h - Match on the LLVM IR --------------------*- C++ -*-===//
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 provides a simple and efficient mechanism for performing general
10// tree-based pattern matches on the LLVM IR. The power of these routines is
11// that it allows you to write concise patterns that are expressive and easy to
12// understand. The other major advantage of this is that it allows you to
13// trivially capture/bind elements in the pattern to variables. For example,
14// you can do something like this:
15//
16// Value *Exp = ...
17// Value *X, *Y; ConstantInt *C1, *C2; // (X & C1) | (Y & C2)
18// if (match(Exp, m_Or(m_And(m_Value(X), m_ConstantInt(C1)),
19// m_And(m_Value(Y), m_ConstantInt(C2))))) {
20// ... Pattern is matched and variables are bound ...
21// }
22//
23// This is primarily useful to things like the instruction combiner, but can
24// also be useful for static analysis tools or code generators.
25//
26//===----------------------------------------------------------------------===//
27
28#ifndef LLVM_IR_PATTERNMATCH_H
29#define LLVM_IR_PATTERNMATCH_H
30
31#include "llvm/ADT/APFloat.h"
32#include "llvm/ADT/APInt.h"
33#include "llvm/IR/Constant.h"
34#include "llvm/IR/Constants.h"
35#include "llvm/IR/DataLayout.h"
36#include "llvm/IR/InstrTypes.h"
37#include "llvm/IR/Instruction.h"
38#include "llvm/IR/Instructions.h"
39#include "llvm/IR/IntrinsicInst.h"
40#include "llvm/IR/Intrinsics.h"
41#include "llvm/IR/Operator.h"
42#include "llvm/IR/Value.h"
43#include "llvm/Support/Casting.h"
44#include <cstdint>
45
46namespace llvm {
47namespace PatternMatch {
48
49template <typename Val, typename Pattern> bool match(Val *V, const Pattern &P) {
50 return const_cast<Pattern &>(P).match(V);
29
Calling 'BinaryOp_match::match'
34
Returning from 'BinaryOp_match::match'
35
Returning zero, which participates in a condition later
51}
52
53template <typename Pattern> bool match(ArrayRef<int> Mask, const Pattern &P) {
54 return const_cast<Pattern &>(P).match(Mask);
55}
56
57template <typename SubPattern_t> struct OneUse_match {
58 SubPattern_t SubPattern;
59
60 OneUse_match(const SubPattern_t &SP) : SubPattern(SP) {}
61
62 template <typename OpTy> bool match(OpTy *V) {
63 return V->hasOneUse() && SubPattern.match(V);
64 }
65};
66
67template <typename T> inline OneUse_match<T> m_OneUse(const T &SubPattern) {
68 return SubPattern;
69}
70
71template <typename Class> struct class_match {
72 template <typename ITy> bool match(ITy *V) { return isa<Class>(V); }
73};
74
75/// Match an arbitrary value and ignore it.
76inline class_match<Value> m_Value() { return class_match<Value>(); }
77
78/// Match an arbitrary unary operation and ignore it.
79inline class_match<UnaryOperator> m_UnOp() {
80 return class_match<UnaryOperator>();
81}
82
83/// Match an arbitrary binary operation and ignore it.
84inline class_match<BinaryOperator> m_BinOp() {
85 return class_match<BinaryOperator>();
86}
87
88/// Matches any compare instruction and ignore it.
89inline class_match<CmpInst> m_Cmp() { return class_match<CmpInst>(); }
90
91struct undef_match {
92 static bool check(const Value *V) {
93 if (isa<UndefValue>(V))
94 return true;
95
96 const auto *CA = dyn_cast<ConstantAggregate>(V);
97 if (!CA)
98 return false;
99
100 SmallPtrSet<const ConstantAggregate *, 8> Seen;
101 SmallVector<const ConstantAggregate *, 8> Worklist;
102
103 // Either UndefValue, PoisonValue, or an aggregate that only contains
104 // these is accepted by matcher.
105 // CheckValue returns false if CA cannot satisfy this constraint.
106 auto CheckValue = [&](const ConstantAggregate *CA) {
107 for (const Value *Op : CA->operand_values()) {
108 if (isa<UndefValue>(Op))
109 continue;
110
111 const auto *CA = dyn_cast<ConstantAggregate>(Op);
112 if (!CA)
113 return false;
114 if (Seen.insert(CA).second)
115 Worklist.emplace_back(CA);
116 }
117
118 return true;
119 };
120
121 if (!CheckValue(CA))
122 return false;
123
124 while (!Worklist.empty()) {
125 if (!CheckValue(Worklist.pop_back_val()))
126 return false;
127 }
128 return true;
129 }
130 template <typename ITy> bool match(ITy *V) { return check(V); }
131};
132
133/// Match an arbitrary undef constant. This matches poison as well.
134/// If this is an aggregate and contains a non-aggregate element that is
135/// neither undef nor poison, the aggregate is not matched.
136inline auto m_Undef() { return undef_match(); }
137
138/// Match an arbitrary poison constant.
139inline class_match<PoisonValue> m_Poison() { return class_match<PoisonValue>(); }
140
141/// Match an arbitrary Constant and ignore it.
142inline class_match<Constant> m_Constant() { return class_match<Constant>(); }
143
144/// Match an arbitrary ConstantInt and ignore it.
145inline class_match<ConstantInt> m_ConstantInt() {
146 return class_match<ConstantInt>();
147}
148
149/// Match an arbitrary ConstantFP and ignore it.
150inline class_match<ConstantFP> m_ConstantFP() {
151 return class_match<ConstantFP>();
152}
153
154/// Match an arbitrary ConstantExpr and ignore it.
155inline class_match<ConstantExpr> m_ConstantExpr() {
156 return class_match<ConstantExpr>();
157}
158
159/// Match an arbitrary basic block value and ignore it.
160inline class_match<BasicBlock> m_BasicBlock() {
161 return class_match<BasicBlock>();
162}
163
164/// Inverting matcher
165template <typename Ty> struct match_unless {
166 Ty M;
167
168 match_unless(const Ty &Matcher) : M(Matcher) {}
169
170 template <typename ITy> bool match(ITy *V) { return !M.match(V); }
171};
172
173/// Match if the inner matcher does *NOT* match.
174template <typename Ty> inline match_unless<Ty> m_Unless(const Ty &M) {
175 return match_unless<Ty>(M);
176}
177
178/// Matching combinators
179template <typename LTy, typename RTy> struct match_combine_or {
180 LTy L;
181 RTy R;
182
183 match_combine_or(const LTy &Left, const RTy &Right) : L(Left), R(Right) {}
184
185 template <typename ITy> bool match(ITy *V) {
186 if (L.match(V))
187 return true;
188 if (R.match(V))
189 return true;
190 return false;
191 }
192};
193
194template <typename LTy, typename RTy> struct match_combine_and {
195 LTy L;
196 RTy R;
197
198 match_combine_and(const LTy &Left, const RTy &Right) : L(Left), R(Right) {}
199
200 template <typename ITy> bool match(ITy *V) {
201 if (L.match(V))
202 if (R.match(V))
203 return true;
204 return false;
205 }
206};
207
208/// Combine two pattern matchers matching L || R
209template <typename LTy, typename RTy>
210inline match_combine_or<LTy, RTy> m_CombineOr(const LTy &L, const RTy &R) {
211 return match_combine_or<LTy, RTy>(L, R);
19
Returning without writing to 'L.Op.VR'
212}
213
214/// Combine two pattern matchers matching L && R
215template <typename LTy, typename RTy>
216inline match_combine_and<LTy, RTy> m_CombineAnd(const LTy &L, const RTy &R) {
217 return match_combine_and<LTy, RTy>(L, R);
218}
219
220struct apint_match {
221 const APInt *&Res;
222 bool AllowUndef;
223
224 apint_match(const APInt *&Res, bool AllowUndef)
225 : Res(Res), AllowUndef(AllowUndef) {}
226
227 template <typename ITy> bool match(ITy *V) {
228 if (auto *CI = dyn_cast<ConstantInt>(V)) {
229 Res = &CI->getValue();
230 return true;
231 }
232 if (V->getType()->isVectorTy())
233 if (const auto *C = dyn_cast<Constant>(V))
234 if (auto *CI = dyn_cast_or_null<ConstantInt>(
235 C->getSplatValue(AllowUndef))) {
236 Res = &CI->getValue();
237 return true;
238 }
239 return false;
240 }
241};
242// Either constexpr if or renaming ConstantFP::getValueAPF to
243// ConstantFP::getValue is needed to do it via single template
244// function for both apint/apfloat.
245struct apfloat_match {
246 const APFloat *&Res;
247 bool AllowUndef;
248
249 apfloat_match(const APFloat *&Res, bool AllowUndef)
250 : Res(Res), AllowUndef(AllowUndef) {}
251
252 template <typename ITy> bool match(ITy *V) {
253 if (auto *CI = dyn_cast<ConstantFP>(V)) {
254 Res = &CI->getValueAPF();
255 return true;
256 }
257 if (V->getType()->isVectorTy())
258 if (const auto *C = dyn_cast<Constant>(V))
259 if (auto *CI = dyn_cast_or_null<ConstantFP>(
260 C->getSplatValue(AllowUndef))) {
261 Res = &CI->getValueAPF();
262 return true;
263 }
264 return false;
265 }
266};
267
268/// Match a ConstantInt or splatted ConstantVector, binding the
269/// specified pointer to the contained APInt.
270inline apint_match m_APInt(const APInt *&Res) {
271 // Forbid undefs by default to maintain previous behavior.
272 return apint_match(Res, /* AllowUndef */ false);
273}
274
275/// Match APInt while allowing undefs in splat vector constants.
276inline apint_match m_APIntAllowUndef(const APInt *&Res) {
277 return apint_match(Res, /* AllowUndef */ true);
278}
279
280/// Match APInt while forbidding undefs in splat vector constants.
281inline apint_match m_APIntForbidUndef(const APInt *&Res) {
282 return apint_match(Res, /* AllowUndef */ false);
283}
284
285/// Match a ConstantFP or splatted ConstantVector, binding the
286/// specified pointer to the contained APFloat.
287inline apfloat_match m_APFloat(const APFloat *&Res) {
288 // Forbid undefs by default to maintain previous behavior.
289 return apfloat_match(Res, /* AllowUndef */ false);
290}
291
292/// Match APFloat while allowing undefs in splat vector constants.
293inline apfloat_match m_APFloatAllowUndef(const APFloat *&Res) {
294 return apfloat_match(Res, /* AllowUndef */ true);
295}
296
297/// Match APFloat while forbidding undefs in splat vector constants.
298inline apfloat_match m_APFloatForbidUndef(const APFloat *&Res) {
299 return apfloat_match(Res, /* AllowUndef */ false);
300}
301
302template <int64_t Val> struct constantint_match {
303 template <typename ITy> bool match(ITy *V) {
304 if (const auto *CI = dyn_cast<ConstantInt>(V)) {
305 const APInt &CIV = CI->getValue();
306 if (Val >= 0)
307 return CIV == static_cast<uint64_t>(Val);
308 // If Val is negative, and CI is shorter than it, truncate to the right
309 // number of bits. If it is larger, then we have to sign extend. Just
310 // compare their negated values.
311 return -CIV == -Val;
312 }
313 return false;
314 }
315};
316
317/// Match a ConstantInt with a specific value.
318template <int64_t Val> inline constantint_match<Val> m_ConstantInt() {
319 return constantint_match<Val>();
320}
321
322/// This helper class is used to match constant scalars, vector splats,
323/// and fixed width vectors that satisfy a specified predicate.
324/// For fixed width vector constants, undefined elements are ignored.
325template <typename Predicate, typename ConstantVal>
326struct cstval_pred_ty : public Predicate {
327 template <typename ITy> bool match(ITy *V) {
328 if (const auto *CV = dyn_cast<ConstantVal>(V))
329 return this->isValue(CV->getValue());
330 if (const auto *VTy = dyn_cast<VectorType>(V->getType())) {
331 if (const auto *C = dyn_cast<Constant>(V)) {
332 if (const auto *CV = dyn_cast_or_null<ConstantVal>(C->getSplatValue()))
333 return this->isValue(CV->getValue());
334
335 // Number of elements of a scalable vector unknown at compile time
336 auto *FVTy = dyn_cast<FixedVectorType>(VTy);
337 if (!FVTy)
338 return false;
339
340 // Non-splat vector constant: check each element for a match.
341 unsigned NumElts = FVTy->getNumElements();
342 assert(NumElts != 0 && "Constant vector with no elements?")((void)0);
343 bool HasNonUndefElements = false;
344 for (unsigned i = 0; i != NumElts; ++i) {
345 Constant *Elt = C->getAggregateElement(i);
346 if (!Elt)
347 return false;
348 if (isa<UndefValue>(Elt))
349 continue;
350 auto *CV = dyn_cast<ConstantVal>(Elt);
351 if (!CV || !this->isValue(CV->getValue()))
352 return false;
353 HasNonUndefElements = true;
354 }
355 return HasNonUndefElements;
356 }
357 }
358 return false;
359 }
360};
361
362/// specialization of cstval_pred_ty for ConstantInt
363template <typename Predicate>
364using cst_pred_ty = cstval_pred_ty<Predicate, ConstantInt>;
365
366/// specialization of cstval_pred_ty for ConstantFP
367template <typename Predicate>
368using cstfp_pred_ty = cstval_pred_ty<Predicate, ConstantFP>;
369
370/// This helper class is used to match scalar and vector constants that
371/// satisfy a specified predicate, and bind them to an APInt.
372template <typename Predicate> struct api_pred_ty : public Predicate {
373 const APInt *&Res;
374
375 api_pred_ty(const APInt *&R) : Res(R) {}
376
377 template <typename ITy> bool match(ITy *V) {
378 if (const auto *CI = dyn_cast<ConstantInt>(V))
379 if (this->isValue(CI->getValue())) {
380 Res = &CI->getValue();
381 return true;
382 }
383 if (V->getType()->isVectorTy())
384 if (const auto *C = dyn_cast<Constant>(V))
385 if (auto *CI = dyn_cast_or_null<ConstantInt>(C->getSplatValue()))
386 if (this->isValue(CI->getValue())) {
387 Res = &CI->getValue();
388 return true;
389 }
390
391 return false;
392 }
393};
394
395/// This helper class is used to match scalar and vector constants that
396/// satisfy a specified predicate, and bind them to an APFloat.
397/// Undefs are allowed in splat vector constants.
398template <typename Predicate> struct apf_pred_ty : public Predicate {
399 const APFloat *&Res;
400
401 apf_pred_ty(const APFloat *&R) : Res(R) {}
402
403 template <typename ITy> bool match(ITy *V) {
404 if (const auto *CI = dyn_cast<ConstantFP>(V))
405 if (this->isValue(CI->getValue())) {
406 Res = &CI->getValue();
407 return true;
408 }
409 if (V->getType()->isVectorTy())
410 if (const auto *C = dyn_cast<Constant>(V))
411 if (auto *CI = dyn_cast_or_null<ConstantFP>(
412 C->getSplatValue(/* AllowUndef */ true)))
413 if (this->isValue(CI->getValue())) {
414 Res = &CI->getValue();
415 return true;
416 }
417
418 return false;
419 }
420};
421
422///////////////////////////////////////////////////////////////////////////////
423//
424// Encapsulate constant value queries for use in templated predicate matchers.
425// This allows checking if constants match using compound predicates and works
426// with vector constants, possibly with relaxed constraints. For example, ignore
427// undef values.
428//
429///////////////////////////////////////////////////////////////////////////////
430
431struct is_any_apint {
432 bool isValue(const APInt &C) { return true; }
433};
434/// Match an integer or vector with any integral constant.
435/// For vectors, this includes constants with undefined elements.
436inline cst_pred_ty<is_any_apint> m_AnyIntegralConstant() {
437 return cst_pred_ty<is_any_apint>();
438}
439
440struct is_all_ones {
441 bool isValue(const APInt &C) { return C.isAllOnesValue(); }
442};
443/// Match an integer or vector with all bits set.
444/// For vectors, this includes constants with undefined elements.
445inline cst_pred_ty<is_all_ones> m_AllOnes() {
446 return cst_pred_ty<is_all_ones>();
447}
448
449struct is_maxsignedvalue {
450 bool isValue(const APInt &C) { return C.isMaxSignedValue(); }
451};
452/// Match an integer or vector with values having all bits except for the high
453/// bit set (0x7f...).
454/// For vectors, this includes constants with undefined elements.
455inline cst_pred_ty<is_maxsignedvalue> m_MaxSignedValue() {
456 return cst_pred_ty<is_maxsignedvalue>();
457}
458inline api_pred_ty<is_maxsignedvalue> m_MaxSignedValue(const APInt *&V) {
459 return V;
460}
461
462struct is_negative {
463 bool isValue(const APInt &C) { return C.isNegative(); }
464};
465/// Match an integer or vector of negative values.
466/// For vectors, this includes constants with undefined elements.
467inline cst_pred_ty<is_negative> m_Negative() {
468 return cst_pred_ty<is_negative>();
469}
470inline api_pred_ty<is_negative> m_Negative(const APInt *&V) {
471 return V;
472}
473
474struct is_nonnegative {
475 bool isValue(const APInt &C) { return C.isNonNegative(); }
476};
477/// Match an integer or vector of non-negative values.
478/// For vectors, this includes constants with undefined elements.
479inline cst_pred_ty<is_nonnegative> m_NonNegative() {
480 return cst_pred_ty<is_nonnegative>();
481}
482inline api_pred_ty<is_nonnegative> m_NonNegative(const APInt *&V) {
483 return V;
484}
485
486struct is_strictlypositive {
487 bool isValue(const APInt &C) { return C.isStrictlyPositive(); }
488};
489/// Match an integer or vector of strictly positive values.
490/// For vectors, this includes constants with undefined elements.
491inline cst_pred_ty<is_strictlypositive> m_StrictlyPositive() {
492 return cst_pred_ty<is_strictlypositive>();
493}
494inline api_pred_ty<is_strictlypositive> m_StrictlyPositive(const APInt *&V) {
495 return V;
496}
497
498struct is_nonpositive {
499 bool isValue(const APInt &C) { return C.isNonPositive(); }
500};
501/// Match an integer or vector of non-positive values.
502/// For vectors, this includes constants with undefined elements.
503inline cst_pred_ty<is_nonpositive> m_NonPositive() {
504 return cst_pred_ty<is_nonpositive>();
505}
506inline api_pred_ty<is_nonpositive> m_NonPositive(const APInt *&V) { return V; }
507
508struct is_one {
509 bool isValue(const APInt &C) { return C.isOneValue(); }
510};
511/// Match an integer 1 or a vector with all elements equal to 1.
512/// For vectors, this includes constants with undefined elements.
513inline cst_pred_ty<is_one> m_One() {
514 return cst_pred_ty<is_one>();
515}
516
517struct is_zero_int {
518 bool isValue(const APInt &C) { return C.isNullValue(); }
519};
520/// Match an integer 0 or a vector with all elements equal to 0.
521/// For vectors, this includes constants with undefined elements.
522inline cst_pred_ty<is_zero_int> m_ZeroInt() {
523 return cst_pred_ty<is_zero_int>();
524}
525
526struct is_zero {
527 template <typename ITy> bool match(ITy *V) {
528 auto *C = dyn_cast<Constant>(V);
529 // FIXME: this should be able to do something for scalable vectors
530 return C && (C->isNullValue() || cst_pred_ty<is_zero_int>().match(C));
531 }
532};
533/// Match any null constant or a vector with all elements equal to 0.
534/// For vectors, this includes constants with undefined elements.
535inline is_zero m_Zero() {
536 return is_zero();
537}
538
539struct is_power2 {
540 bool isValue(const APInt &C) { return C.isPowerOf2(); }
541};
542/// Match an integer or vector power-of-2.
543/// For vectors, this includes constants with undefined elements.
544inline cst_pred_ty<is_power2> m_Power2() {
545 return cst_pred_ty<is_power2>();
546}
547inline api_pred_ty<is_power2> m_Power2(const APInt *&V) {
548 return V;
549}
550
551struct is_negated_power2 {
552 bool isValue(const APInt &C) { return (-C).isPowerOf2(); }
553};
554/// Match a integer or vector negated power-of-2.
555/// For vectors, this includes constants with undefined elements.
556inline cst_pred_ty<is_negated_power2> m_NegatedPower2() {
557 return cst_pred_ty<is_negated_power2>();
558}
559inline api_pred_ty<is_negated_power2> m_NegatedPower2(const APInt *&V) {
560 return V;
561}
562
563struct is_power2_or_zero {
564 bool isValue(const APInt &C) { return !C || C.isPowerOf2(); }
565};
566/// Match an integer or vector of 0 or power-of-2 values.
567/// For vectors, this includes constants with undefined elements.
568inline cst_pred_ty<is_power2_or_zero> m_Power2OrZero() {
569 return cst_pred_ty<is_power2_or_zero>();
570}
571inline api_pred_ty<is_power2_or_zero> m_Power2OrZero(const APInt *&V) {
572 return V;
573}
574
575struct is_sign_mask {
576 bool isValue(const APInt &C) { return C.isSignMask(); }
577};
578/// Match an integer or vector with only the sign bit(s) set.
579/// For vectors, this includes constants with undefined elements.
580inline cst_pred_ty<is_sign_mask> m_SignMask() {
581 return cst_pred_ty<is_sign_mask>();
582}
583
584struct is_lowbit_mask {
585 bool isValue(const APInt &C) { return C.isMask(); }
586};
587/// Match an integer or vector with only the low bit(s) set.
588/// For vectors, this includes constants with undefined elements.
589inline cst_pred_ty<is_lowbit_mask> m_LowBitMask() {
590 return cst_pred_ty<is_lowbit_mask>();
591}
592
593struct icmp_pred_with_threshold {
594 ICmpInst::Predicate Pred;
595 const APInt *Thr;
596 bool isValue(const APInt &C) {
597 switch (Pred) {
598 case ICmpInst::Predicate::ICMP_EQ:
599 return C.eq(*Thr);
600 case ICmpInst::Predicate::ICMP_NE:
601 return C.ne(*Thr);
602 case ICmpInst::Predicate::ICMP_UGT:
603 return C.ugt(*Thr);
604 case ICmpInst::Predicate::ICMP_UGE:
605 return C.uge(*Thr);
606 case ICmpInst::Predicate::ICMP_ULT:
607 return C.ult(*Thr);
608 case ICmpInst::Predicate::ICMP_ULE:
609 return C.ule(*Thr);
610 case ICmpInst::Predicate::ICMP_SGT:
611 return C.sgt(*Thr);
612 case ICmpInst::Predicate::ICMP_SGE:
613 return C.sge(*Thr);
614 case ICmpInst::Predicate::ICMP_SLT:
615 return C.slt(*Thr);
616 case ICmpInst::Predicate::ICMP_SLE:
617 return C.sle(*Thr);
618 default:
619 llvm_unreachable("Unhandled ICmp predicate")__builtin_unreachable();
620 }
621 }
622};
623/// Match an integer or vector with every element comparing 'pred' (eg/ne/...)
624/// to Threshold. For vectors, this includes constants with undefined elements.
625inline cst_pred_ty<icmp_pred_with_threshold>
626m_SpecificInt_ICMP(ICmpInst::Predicate Predicate, const APInt &Threshold) {
627 cst_pred_ty<icmp_pred_with_threshold> P;
628 P.Pred = Predicate;
629 P.Thr = &Threshold;
630 return P;
631}
632
633struct is_nan {
634 bool isValue(const APFloat &C) { return C.isNaN(); }
635};
636/// Match an arbitrary NaN constant. This includes quiet and signalling nans.
637/// For vectors, this includes constants with undefined elements.
638inline cstfp_pred_ty<is_nan> m_NaN() {
639 return cstfp_pred_ty<is_nan>();
640}
641
642struct is_nonnan {
643 bool isValue(const APFloat &C) { return !C.isNaN(); }
644};
645/// Match a non-NaN FP constant.
646/// For vectors, this includes constants with undefined elements.
647inline cstfp_pred_ty<is_nonnan> m_NonNaN() {
648 return cstfp_pred_ty<is_nonnan>();
649}
650
651struct is_inf {
652 bool isValue(const APFloat &C) { return C.isInfinity(); }
653};
654/// Match a positive or negative infinity FP constant.
655/// For vectors, this includes constants with undefined elements.
656inline cstfp_pred_ty<is_inf> m_Inf() {
657 return cstfp_pred_ty<is_inf>();
658}
659
660struct is_noninf {
661 bool isValue(const APFloat &C) { return !C.isInfinity(); }
662};
663/// Match a non-infinity FP constant, i.e. finite or NaN.
664/// For vectors, this includes constants with undefined elements.
665inline cstfp_pred_ty<is_noninf> m_NonInf() {
666 return cstfp_pred_ty<is_noninf>();
667}
668
669struct is_finite {
670 bool isValue(const APFloat &C) { return C.isFinite(); }
671};
672/// Match a finite FP constant, i.e. not infinity or NaN.
673/// For vectors, this includes constants with undefined elements.
674inline cstfp_pred_ty<is_finite> m_Finite() {
675 return cstfp_pred_ty<is_finite>();
676}
677inline apf_pred_ty<is_finite> m_Finite(const APFloat *&V) { return V; }
678
679struct is_finitenonzero {
680 bool isValue(const APFloat &C) { return C.isFiniteNonZero(); }
681};
682/// Match a finite non-zero FP constant.
683/// For vectors, this includes constants with undefined elements.
684inline cstfp_pred_ty<is_finitenonzero> m_FiniteNonZero() {
685 return cstfp_pred_ty<is_finitenonzero>();
686}
687inline apf_pred_ty<is_finitenonzero> m_FiniteNonZero(const APFloat *&V) {
688 return V;
689}
690
691struct is_any_zero_fp {
692 bool isValue(const APFloat &C) { return C.isZero(); }
693};
694/// Match a floating-point negative zero or positive zero.
695/// For vectors, this includes constants with undefined elements.
696inline cstfp_pred_ty<is_any_zero_fp> m_AnyZeroFP() {
697 return cstfp_pred_ty<is_any_zero_fp>();
698}
699
700struct is_pos_zero_fp {
701 bool isValue(const APFloat &C) { return C.isPosZero(); }
702};
703/// Match a floating-point positive zero.
704/// For vectors, this includes constants with undefined elements.
705inline cstfp_pred_ty<is_pos_zero_fp> m_PosZeroFP() {
706 return cstfp_pred_ty<is_pos_zero_fp>();
707}
708
709struct is_neg_zero_fp {
710 bool isValue(const APFloat &C) { return C.isNegZero(); }
711};
712/// Match a floating-point negative zero.
713/// For vectors, this includes constants with undefined elements.
714inline cstfp_pred_ty<is_neg_zero_fp> m_NegZeroFP() {
715 return cstfp_pred_ty<is_neg_zero_fp>();
716}
717
718struct is_non_zero_fp {
719 bool isValue(const APFloat &C) { return C.isNonZero(); }
720};
721/// Match a floating-point non-zero.
722/// For vectors, this includes constants with undefined elements.
723inline cstfp_pred_ty<is_non_zero_fp> m_NonZeroFP() {
724 return cstfp_pred_ty<is_non_zero_fp>();
725}
726
727///////////////////////////////////////////////////////////////////////////////
728
729template <typename Class> struct bind_ty {
730 Class *&VR;
731
732 bind_ty(Class *&V) : VR(V) {}
733
734 template <typename ITy> bool match(ITy *V) {
735 if (auto *CV = dyn_cast<Class>(V)) {
736 VR = CV;
737 return true;
738 }
739 return false;
740 }
741};
742
743/// Match a value, capturing it if we match.
744inline bind_ty<Value> m_Value(Value *&V) { return V; }
10
Calling constructor for 'bind_ty<llvm::Value>'
11
Returning from constructor for 'bind_ty<llvm::Value>'
12
Returning without writing to 'V'
745inline bind_ty<const Value> m_Value(const Value *&V) { return V; }
746
747/// Match an instruction, capturing it if we match.
748inline bind_ty<Instruction> m_Instruction(Instruction *&I) { return I; }
749/// Match a unary operator, capturing it if we match.
750inline bind_ty<UnaryOperator> m_UnOp(UnaryOperator *&I) { return I; }
751/// Match a binary operator, capturing it if we match.
752inline bind_ty<BinaryOperator> m_BinOp(BinaryOperator *&I) { return I; }
753/// Match a with overflow intrinsic, capturing it if we match.
754inline bind_ty<WithOverflowInst> m_WithOverflowInst(WithOverflowInst *&I) { return I; }
755inline bind_ty<const WithOverflowInst>
756m_WithOverflowInst(const WithOverflowInst *&I) {
757 return I;
758}
759
760/// Match a Constant, capturing the value if we match.
761inline bind_ty<Constant> m_Constant(Constant *&C) { return C; }
762
763/// Match a ConstantInt, capturing the value if we match.
764inline bind_ty<ConstantInt> m_ConstantInt(ConstantInt *&CI) { return CI; }
765
766/// Match a ConstantFP, capturing the value if we match.
767inline bind_ty<ConstantFP> m_ConstantFP(ConstantFP *&C) { return C; }
768
769/// Match a ConstantExpr, capturing the value if we match.
770inline bind_ty<ConstantExpr> m_ConstantExpr(ConstantExpr *&C) { return C; }
771
772/// Match a basic block value, capturing it if we match.
773inline bind_ty<BasicBlock> m_BasicBlock(BasicBlock *&V) { return V; }
774inline bind_ty<const BasicBlock> m_BasicBlock(const BasicBlock *&V) {
775 return V;
776}
777
778/// Match an arbitrary immediate Constant and ignore it.
779inline match_combine_and<class_match<Constant>,
780 match_unless<class_match<ConstantExpr>>>
781m_ImmConstant() {
782 return m_CombineAnd(m_Constant(), m_Unless(m_ConstantExpr()));
783}
784
785/// Match an immediate Constant, capturing the value if we match.
786inline match_combine_and<bind_ty<Constant>,
787 match_unless<class_match<ConstantExpr>>>
788m_ImmConstant(Constant *&C) {
789 return m_CombineAnd(m_Constant(C), m_Unless(m_ConstantExpr()));
790}
791
792/// Match a specified Value*.
793struct specificval_ty {
794 const Value *Val;
795
796 specificval_ty(const Value *V) : Val(V) {}
797
798 template <typename ITy> bool match(ITy *V) { return V == Val; }
799};
800
801/// Match if we have a specific specified value.
802inline specificval_ty m_Specific(const Value *V) { return V; }
803
804/// Stores a reference to the Value *, not the Value * itself,
805/// thus can be used in commutative matchers.
806template <typename Class> struct deferredval_ty {
807 Class *const &Val;
808
809 deferredval_ty(Class *const &V) : Val(V) {}
810
811 template <typename ITy> bool match(ITy *const V) { return V == Val; }
812};
813
814/// Like m_Specific(), but works if the specific value to match is determined
815/// as part of the same match() expression. For example:
816/// m_Add(m_Value(X), m_Specific(X)) is incorrect, because m_Specific() will
817/// bind X before the pattern match starts.
818/// m_Add(m_Value(X), m_Deferred(X)) is correct, and will check against
819/// whichever value m_Value(X) populated.
820inline deferredval_ty<Value> m_Deferred(Value *const &V) { return V; }
821inline deferredval_ty<const Value> m_Deferred(const Value *const &V) {
822 return V;
823}
824
825/// Match a specified floating point value or vector of all elements of
826/// that value.
827struct specific_fpval {
828 double Val;
829
830 specific_fpval(double V) : Val(V) {}
831
832 template <typename ITy> bool match(ITy *V) {
833 if (const auto *CFP = dyn_cast<ConstantFP>(V))
834 return CFP->isExactlyValue(Val);
835 if (V->getType()->isVectorTy())
836 if (const auto *C = dyn_cast<Constant>(V))
837 if (auto *CFP = dyn_cast_or_null<ConstantFP>(C->getSplatValue()))
838 return CFP->isExactlyValue(Val);
839 return false;
840 }
841};
842
843/// Match a specific floating point value or vector with all elements
844/// equal to the value.
845inline specific_fpval m_SpecificFP(double V) { return specific_fpval(V); }
846
847/// Match a float 1.0 or vector with all elements equal to 1.0.
848inline specific_fpval m_FPOne() { return m_SpecificFP(1.0); }
849
850struct bind_const_intval_ty {
851 uint64_t &VR;
852
853 bind_const_intval_ty(uint64_t &V) : VR(V) {}
854
855 template <typename ITy> bool match(ITy *V) {
856 if (const auto *CV = dyn_cast<ConstantInt>(V))
857 if (CV->getValue().ule(UINT64_MAX0xffffffffffffffffULL)) {
858 VR = CV->getZExtValue();
859 return true;
860 }
861 return false;
862 }
863};
864
865/// Match a specified integer value or vector of all elements of that
866/// value.
867template <bool AllowUndefs>
868struct specific_intval {
869 APInt Val;
870
871 specific_intval(APInt V) : Val(std::move(V)) {}
872
873 template <typename ITy> bool match(ITy *V) {
874 const auto *CI = dyn_cast<ConstantInt>(V);
875 if (!CI && V->getType()->isVectorTy())
876 if (const auto *C = dyn_cast<Constant>(V))
877 CI = dyn_cast_or_null<ConstantInt>(C->getSplatValue(AllowUndefs));
878
879 return CI && APInt::isSameValue(CI->getValue(), Val);
880 }
881};
882
883/// Match a specific integer value or vector with all elements equal to
884/// the value.
885inline specific_intval<false> m_SpecificInt(APInt V) {
886 return specific_intval<false>(std::move(V));
887}
888
889inline specific_intval<false> m_SpecificInt(uint64_t V) {
890 return m_SpecificInt(APInt(64, V));
891}
892
893inline specific_intval<true> m_SpecificIntAllowUndef(APInt V) {
894 return specific_intval<true>(std::move(V));
895}
896
897inline specific_intval<true> m_SpecificIntAllowUndef(uint64_t V) {
898 return m_SpecificIntAllowUndef(APInt(64, V));
899}
900
901/// Match a ConstantInt and bind to its value. This does not match
902/// ConstantInts wider than 64-bits.
903inline bind_const_intval_ty m_ConstantInt(uint64_t &V) { return V; }
904
905/// Match a specified basic block value.
906struct specific_bbval {
907 BasicBlock *Val;
908
909 specific_bbval(BasicBlock *Val) : Val(Val) {}
910
911 template <typename ITy> bool match(ITy *V) {
912 const auto *BB = dyn_cast<BasicBlock>(V);
913 return BB && BB == Val;
914 }
915};
916
917/// Match a specific basic block value.
918inline specific_bbval m_SpecificBB(BasicBlock *BB) {
919 return specific_bbval(BB);
920}
921
922/// A commutative-friendly version of m_Specific().
923inline deferredval_ty<BasicBlock> m_Deferred(BasicBlock *const &BB) {
924 return BB;
925}
926inline deferredval_ty<const BasicBlock>
927m_Deferred(const BasicBlock *const &BB) {
928 return BB;
929}
930
931//===----------------------------------------------------------------------===//
932// Matcher for any binary operator.
933//
934template <typename LHS_t, typename RHS_t, bool Commutable = false>
935struct AnyBinaryOp_match {
936 LHS_t L;
937 RHS_t R;
938
939 // The evaluation order is always stable, regardless of Commutability.
940 // The LHS is always matched first.
941 AnyBinaryOp_match(const LHS_t &LHS, const RHS_t &RHS) : L(LHS), R(RHS) {}
942
943 template <typename OpTy> bool match(OpTy *V) {
944 if (auto *I = dyn_cast<BinaryOperator>(V))
945 return (L.match(I->getOperand(0)) && R.match(I->getOperand(1))) ||
946 (Commutable && L.match(I->getOperand(1)) &&
947 R.match(I->getOperand(0)));
948 return false;
949 }
950};
951
952template <typename LHS, typename RHS>
953inline AnyBinaryOp_match<LHS, RHS> m_BinOp(const LHS &L, const RHS &R) {
954 return AnyBinaryOp_match<LHS, RHS>(L, R);
955}
956
957//===----------------------------------------------------------------------===//
958// Matcher for any unary operator.
959// TODO fuse unary, binary matcher into n-ary matcher
960//
961template <typename OP_t> struct AnyUnaryOp_match {
962 OP_t X;
963
964 AnyUnaryOp_match(const OP_t &X) : X(X) {}
965
966 template <typename OpTy> bool match(OpTy *V) {
967 if (auto *I = dyn_cast<UnaryOperator>(V))
968 return X.match(I->getOperand(0));
969 return false;
970 }
971};
972
973template <typename OP_t> inline AnyUnaryOp_match<OP_t> m_UnOp(const OP_t &X) {
974 return AnyUnaryOp_match<OP_t>(X);
975}
976
977//===----------------------------------------------------------------------===//
978// Matchers for specific binary operators.
979//
980
981template <typename LHS_t, typename RHS_t, unsigned Opcode,
982 bool Commutable = false>
983struct BinaryOp_match {
984 LHS_t L;
985 RHS_t R;
986
987 // The evaluation order is always stable, regardless of Commutability.
988 // The LHS is always matched first.
989 BinaryOp_match(const LHS_t &LHS, const RHS_t &RHS) : L(LHS), R(RHS) {}
990
991 template <typename OpTy> bool match(OpTy *V) {
992 if (V->getValueID() == Value::InstructionVal + Opcode) {
30
Assuming the condition is true
31
Taking true branch
993 auto *I = cast<BinaryOperator>(V);
32
'V' is a 'BinaryOperator'
994 return (L.match(I->getOperand(0)) && R.match(I->getOperand(1))) ||
33
Returning zero, which participates in a condition later
995 (Commutable && L.match(I->getOperand(1)) &&
996 R.match(I->getOperand(0)));
997 }
998 if (auto *CE = dyn_cast<ConstantExpr>(V))
999 return CE->getOpcode() == Opcode &&
1000 ((L.match(CE->getOperand(0)) && R.match(CE->getOperand(1))) ||
1001 (Commutable && L.match(CE->getOperand(1)) &&
1002 R.match(CE->getOperand(0))));
1003 return false;
1004 }
1005};
1006
1007template <typename LHS, typename RHS>
1008inline BinaryOp_match<LHS, RHS, Instruction::Add> m_Add(const LHS &L,
1009 const RHS &R) {
1010 return BinaryOp_match<LHS, RHS, Instruction::Add>(L, R);
1011}
1012
1013template <typename LHS, typename RHS>
1014inline BinaryOp_match<LHS, RHS, Instruction::FAdd> m_FAdd(const LHS &L,
1015 const RHS &R) {
1016 return BinaryOp_match<LHS, RHS, Instruction::FAdd>(L, R);
1017}
1018
1019template <typename LHS, typename RHS>
1020inline BinaryOp_match<LHS, RHS, Instruction::Sub> m_Sub(const LHS &L,
1021 const RHS &R) {
1022 return BinaryOp_match<LHS, RHS, Instruction::Sub>(L, R);
1023}
1024
1025template <typename LHS, typename RHS>
1026inline BinaryOp_match<LHS, RHS, Instruction::FSub> m_FSub(const LHS &L,
1027 const RHS &R) {
1028 return BinaryOp_match<LHS, RHS, Instruction::FSub>(L, R);
1029}
1030
1031template <typename Op_t> struct FNeg_match {
1032 Op_t X;
1033
1034 FNeg_match(const Op_t &Op) : X(Op) {}
1035 template <typename OpTy> bool match(OpTy *V) {
1036 auto *FPMO = dyn_cast<FPMathOperator>(V);
1037 if (!FPMO) return false;
1038
1039 if (FPMO->getOpcode() == Instruction::FNeg)
1040 return X.match(FPMO->getOperand(0));
1041
1042 if (FPMO->getOpcode() == Instruction::FSub) {
1043 if (FPMO->hasNoSignedZeros()) {
1044 // With 'nsz', any zero goes.
1045 if (!cstfp_pred_ty<is_any_zero_fp>().match(FPMO->getOperand(0)))
1046 return false;
1047 } else {
1048 // Without 'nsz', we need fsub -0.0, X exactly.
1049 if (!cstfp_pred_ty<is_neg_zero_fp>().match(FPMO->getOperand(0)))
1050 return false;
1051 }
1052
1053 return X.match(FPMO->getOperand(1));
1054 }
1055
1056 return false;
1057 }
1058};
1059
1060/// Match 'fneg X' as 'fsub -0.0, X'.
1061template <typename OpTy>
1062inline FNeg_match<OpTy>
1063m_FNeg(const OpTy &X) {
1064 return FNeg_match<OpTy>(X);
1065}
1066
1067/// Match 'fneg X' as 'fsub +-0.0, X'.
1068template <typename RHS>
1069inline BinaryOp_match<cstfp_pred_ty<is_any_zero_fp>, RHS, Instruction::FSub>
1070m_FNegNSZ(const RHS &X) {
1071 return m_FSub(m_AnyZeroFP(), X);
1072}
1073
1074template <typename LHS, typename RHS>
1075inline BinaryOp_match<LHS, RHS, Instruction::Mul> m_Mul(const LHS &L,
1076 const RHS &R) {
1077 return BinaryOp_match<LHS, RHS, Instruction::Mul>(L, R);
1078}
1079
1080template <typename LHS, typename RHS>
1081inline BinaryOp_match<LHS, RHS, Instruction::FMul> m_FMul(const LHS &L,
1082 const RHS &R) {
1083 return BinaryOp_match<LHS, RHS, Instruction::FMul>(L, R);
1084}
1085
1086template <typename LHS, typename RHS>
1087inline BinaryOp_match<LHS, RHS, Instruction::UDiv> m_UDiv(const LHS &L,
1088 const RHS &R) {
1089 return BinaryOp_match<LHS, RHS, Instruction::UDiv>(L, R);
1090}
1091
1092template <typename LHS, typename RHS>
1093inline BinaryOp_match<LHS, RHS, Instruction::SDiv> m_SDiv(const LHS &L,
1094 const RHS &R) {
1095 return BinaryOp_match<LHS, RHS, Instruction::SDiv>(L, R);
1096}
1097
1098template <typename LHS, typename RHS>
1099inline BinaryOp_match<LHS, RHS, Instruction::FDiv> m_FDiv(const LHS &L,
1100 const RHS &R) {
1101 return BinaryOp_match<LHS, RHS, Instruction::FDiv>(L, R);
1102}
1103
1104template <typename LHS, typename RHS>
1105inline BinaryOp_match<LHS, RHS, Instruction::URem> m_URem(const LHS &L,
1106 const RHS &R) {
1107 return BinaryOp_match<LHS, RHS, Instruction::URem>(L, R);
1108}
1109
1110template <typename LHS, typename RHS>
1111inline BinaryOp_match<LHS, RHS, Instruction::SRem> m_SRem(const LHS &L,
1112 const RHS &R) {
1113 return BinaryOp_match<LHS, RHS, Instruction::SRem>(L, R);
1114}
1115
1116template <typename LHS, typename RHS>
1117inline BinaryOp_match<LHS, RHS, Instruction::FRem> m_FRem(const LHS &L,
1118 const RHS &R) {
1119 return BinaryOp_match<LHS, RHS, Instruction::FRem>(L, R);
1120}
1121
1122template <typename LHS, typename RHS>
1123inline BinaryOp_match<LHS, RHS, Instruction::And> m_And(const LHS &L,
1124 const RHS &R) {
1125 return BinaryOp_match<LHS, RHS, Instruction::And>(L, R);
1126}
1127
1128template <typename LHS, typename RHS>
1129inline BinaryOp_match<LHS, RHS, Instruction::Or> m_Or(const LHS &L,
1130 const RHS &R) {
1131 return BinaryOp_match<LHS, RHS, Instruction::Or>(L, R);
1132}
1133
1134template <typename LHS, typename RHS>
1135inline BinaryOp_match<LHS, RHS, Instruction::Xor> m_Xor(const LHS &L,
1136 const RHS &R) {
1137 return BinaryOp_match<LHS, RHS, Instruction::Xor>(L, R);
1138}
1139
1140template <typename LHS, typename RHS>
1141inline BinaryOp_match<LHS, RHS, Instruction::Shl> m_Shl(const LHS &L,
1142 const RHS &R) {
1143 return BinaryOp_match<LHS, RHS, Instruction::Shl>(L, R);
1144}
1145
1146template <typename LHS, typename RHS>
1147inline BinaryOp_match<LHS, RHS, Instruction::LShr> m_LShr(const LHS &L,
1148 const RHS &R) {
1149 return BinaryOp_match<LHS, RHS, Instruction::LShr>(L, R);
1150}
1151
1152template <typename LHS, typename RHS>
1153inline BinaryOp_match<LHS, RHS, Instruction::AShr> m_AShr(const LHS &L,
1154 const RHS &R) {
1155 return BinaryOp_match<LHS, RHS, Instruction::AShr>(L, R);
1156}
1157
1158template <typename LHS_t, typename RHS_t, unsigned Opcode,
1159 unsigned WrapFlags = 0>
1160struct OverflowingBinaryOp_match {
1161 LHS_t L;
1162 RHS_t R;
1163
1164 OverflowingBinaryOp_match(const LHS_t &LHS, const RHS_t &RHS)
1165 : L(LHS), R(RHS) {}
1166
1167 template <typename OpTy> bool match(OpTy *V) {
1168 if (auto *Op = dyn_cast<OverflowingBinaryOperator>(V)) {
1169 if (Op->getOpcode() != Opcode)
1170 return false;
1171 if ((WrapFlags & OverflowingBinaryOperator::NoUnsignedWrap) &&
1172 !Op->hasNoUnsignedWrap())
1173 return false;
1174 if ((WrapFlags & OverflowingBinaryOperator::NoSignedWrap) &&
1175 !Op->hasNoSignedWrap())
1176 return false;
1177 return L.match(Op->getOperand(0)) && R.match(Op->getOperand(1));
1178 }
1179 return false;
1180 }
1181};
1182
1183template <typename LHS, typename RHS>
1184inline OverflowingBinaryOp_match<LHS, RHS, Instruction::Add,
1185 OverflowingBinaryOperator::NoSignedWrap>
1186m_NSWAdd(const LHS &L, const RHS &R) {
1187 return OverflowingBinaryOp_match<LHS, RHS, Instruction::Add,
1188 OverflowingBinaryOperator::NoSignedWrap>(
1189 L, R);
1190}
1191template <typename LHS, typename RHS>
1192inline OverflowingBinaryOp_match<LHS, RHS, Instruction::Sub,
1193 OverflowingBinaryOperator::NoSignedWrap>
1194m_NSWSub(const LHS &L, const RHS &R) {
1195 return OverflowingBinaryOp_match<LHS, RHS, Instruction::Sub,
1196 OverflowingBinaryOperator::NoSignedWrap>(
1197 L, R);
1198}
1199template <typename LHS, typename RHS>
1200inline OverflowingBinaryOp_match<LHS, RHS, Instruction::Mul,
1201 OverflowingBinaryOperator::NoSignedWrap>
1202m_NSWMul(const LHS &L, const RHS &R) {
1203 return OverflowingBinaryOp_match<LHS, RHS, Instruction::Mul,
1204 OverflowingBinaryOperator::NoSignedWrap>(
1205 L, R);
1206}
1207template <typename LHS, typename RHS>
1208inline OverflowingBinaryOp_match<LHS, RHS, Instruction::Shl,
1209 OverflowingBinaryOperator::NoSignedWrap>
1210m_NSWShl(const LHS &L, const RHS &R) {
1211 return OverflowingBinaryOp_match<LHS, RHS, Instruction::Shl,
1212 OverflowingBinaryOperator::NoSignedWrap>(
1213 L, R);
1214}
1215
1216template <typename LHS, typename RHS>
1217inline OverflowingBinaryOp_match<LHS, RHS, Instruction::Add,
1218 OverflowingBinaryOperator::NoUnsignedWrap>
1219m_NUWAdd(const LHS &L, const RHS &R) {
1220 return OverflowingBinaryOp_match<LHS, RHS, Instruction::Add,
1221 OverflowingBinaryOperator::NoUnsignedWrap>(
1222 L, R);
1223}
1224template <typename LHS, typename RHS>
1225inline OverflowingBinaryOp_match<LHS, RHS, Instruction::Sub,
1226 OverflowingBinaryOperator::NoUnsignedWrap>
1227m_NUWSub(const LHS &L, const RHS &R) {
1228 return OverflowingBinaryOp_match<LHS, RHS, Instruction::Sub,
1229 OverflowingBinaryOperator::NoUnsignedWrap>(
1230 L, R);
1231}
1232template <typename LHS, typename RHS>
1233inline OverflowingBinaryOp_match<LHS, RHS, Instruction::Mul,
1234 OverflowingBinaryOperator::NoUnsignedWrap>
1235m_NUWMul(const LHS &L, const RHS &R) {
1236 return OverflowingBinaryOp_match<LHS, RHS, Instruction::Mul,
1237 OverflowingBinaryOperator::NoUnsignedWrap>(
1238 L, R);
1239}
1240template <typename LHS, typename RHS>
1241inline OverflowingBinaryOp_match<LHS, RHS, Instruction::Shl,
1242 OverflowingBinaryOperator::NoUnsignedWrap>
1243m_NUWShl(const LHS &L, const RHS &R) {
1244 return OverflowingBinaryOp_match<LHS, RHS, Instruction::Shl,
1245 OverflowingBinaryOperator::NoUnsignedWrap>(
1246 L, R);
1247}
1248
1249//===----------------------------------------------------------------------===//
1250// Class that matches a group of binary opcodes.
1251//
1252template <typename LHS_t, typename RHS_t, typename Predicate>
1253struct BinOpPred_match : Predicate {
1254 LHS_t L;
1255 RHS_t R;
1256
1257 BinOpPred_match(const LHS_t &LHS, const RHS_t &RHS) : L(LHS), R(RHS) {}
1258
1259 template <typename OpTy> bool match(OpTy *V) {
1260 if (auto *I = dyn_cast<Instruction>(V))
1261 return this->isOpType(I->getOpcode()) && L.match(I->getOperand(0)) &&
1262 R.match(I->getOperand(1));
1263 if (auto *CE = dyn_cast<ConstantExpr>(V))
1264 return this->isOpType(CE->getOpcode()) && L.match(CE->getOperand(0)) &&
1265 R.match(CE->getOperand(1));
1266 return false;
1267 }
1268};
1269
1270struct is_shift_op {
1271 bool isOpType(unsigned Opcode) { return Instruction::isShift(Opcode); }
1272};
1273
1274struct is_right_shift_op {
1275 bool isOpType(unsigned Opcode) {
1276 return Opcode == Instruction::LShr || Opcode == Instruction::AShr;
1277 }
1278};
1279
1280struct is_logical_shift_op {
1281 bool isOpType(unsigned Opcode) {
1282 return Opcode == Instruction::LShr || Opcode == Instruction::Shl;
1283 }
1284};
1285
1286struct is_bitwiselogic_op {
1287 bool isOpType(unsigned Opcode) {
1288 return Instruction::isBitwiseLogicOp(Opcode);
1289 }
1290};
1291
1292struct is_idiv_op {
1293 bool isOpType(unsigned Opcode) {
1294 return Opcode == Instruction::SDiv || Opcode == Instruction::UDiv;
1295 }
1296};
1297
1298struct is_irem_op {
1299 bool isOpType(unsigned Opcode) {
1300 return Opcode == Instruction::SRem || Opcode == Instruction::URem;
1301 }
1302};
1303
1304/// Matches shift operations.
1305template <typename LHS, typename RHS>
1306inline BinOpPred_match<LHS, RHS, is_shift_op> m_Shift(const LHS &L,
1307 const RHS &R) {
1308 return BinOpPred_match<LHS, RHS, is_shift_op>(L, R);
24
Returning without writing to 'R.R.VR'
1309}
1310
1311/// Matches logical shift operations.
1312template <typename LHS, typename RHS>
1313inline BinOpPred_match<LHS, RHS, is_right_shift_op> m_Shr(const LHS &L,
1314 const RHS &R) {
1315 return BinOpPred_match<LHS, RHS, is_right_shift_op>(L, R);
1316}
1317
1318/// Matches logical shift operations.
1319template <typename LHS, typename RHS>
1320inline BinOpPred_match<LHS, RHS, is_logical_shift_op>
1321m_LogicalShift(const LHS &L, const RHS &R) {
1322 return BinOpPred_match<LHS, RHS, is_logical_shift_op>(L, R);
1323}
1324
1325/// Matches bitwise logic operations.
1326template <typename LHS, typename RHS>
1327inline BinOpPred_match<LHS, RHS, is_bitwiselogic_op>
1328m_BitwiseLogic(const LHS &L, const RHS &R) {
1329 return BinOpPred_match<LHS, RHS, is_bitwiselogic_op>(L, R);
1330}
1331
1332/// Matches integer division operations.
1333template <typename LHS, typename RHS>
1334inline BinOpPred_match<LHS, RHS, is_idiv_op> m_IDiv(const LHS &L,
1335 const RHS &R) {
1336 return BinOpPred_match<LHS, RHS, is_idiv_op>(L, R);
1337}
1338
1339/// Matches integer remainder operations.
1340template <typename LHS, typename RHS>
1341inline BinOpPred_match<LHS, RHS, is_irem_op> m_IRem(const LHS &L,
1342 const RHS &R) {
1343 return BinOpPred_match<LHS, RHS, is_irem_op>(L, R);
1344}
1345
1346//===----------------------------------------------------------------------===//
1347// Class that matches exact binary ops.
1348//
1349template <typename SubPattern_t> struct Exact_match {
1350 SubPattern_t SubPattern;
1351
1352 Exact_match(const SubPattern_t &SP) : SubPattern(SP) {}
1353
1354 template <typename OpTy> bool match(OpTy *V) {
1355 if (auto *PEO = dyn_cast<PossiblyExactOperator>(V))
1356 return PEO->isExact() && SubPattern.match(V);
1357 return false;
1358 }
1359};
1360
1361template <typename T> inline Exact_match<T> m_Exact(const T &SubPattern) {
1362 return SubPattern;
1363}
1364
1365//===----------------------------------------------------------------------===//
1366// Matchers for CmpInst classes
1367//
1368
1369template <typename LHS_t, typename RHS_t, typename Class, typename PredicateTy,
1370 bool Commutable = false>
1371struct CmpClass_match {
1372 PredicateTy &Predicate;
1373 LHS_t L;
1374 RHS_t R;
1375
1376 // The evaluation order is always stable, regardless of Commutability.
1377 // The LHS is always matched first.
1378 CmpClass_match(PredicateTy &Pred, const LHS_t &LHS, const RHS_t &RHS)
1379 : Predicate(Pred), L(LHS), R(RHS) {}
1380
1381 template <typename OpTy> bool match(OpTy *V) {
1382 if (auto *I = dyn_cast<Class>(V)) {
1383 if (L.match(I->getOperand(0)) && R.match(I->getOperand(1))) {
1384 Predicate = I->getPredicate();
1385 return true;
1386 } else if (Commutable && L.match(I->getOperand(1)) &&
1387 R.match(I->getOperand(0))) {
1388 Predicate = I->getSwappedPredicate();
1389 return true;
1390 }
1391 }
1392 return false;
1393 }
1394};
1395
1396template <typename LHS, typename RHS>
1397inline CmpClass_match<LHS, RHS, CmpInst, CmpInst::Predicate>
1398m_Cmp(CmpInst::Predicate &Pred, const LHS &L, const RHS &R) {
1399 return CmpClass_match<LHS, RHS, CmpInst, CmpInst::Predicate>(Pred, L, R);
1400}
1401
1402template <typename LHS, typename RHS>
1403inline CmpClass_match<LHS, RHS, ICmpInst, ICmpInst::Predicate>
1404m_ICmp(ICmpInst::Predicate &Pred, const LHS &L, const RHS &R) {
1405 return CmpClass_match<LHS, RHS, ICmpInst, ICmpInst::Predicate>(Pred, L, R);
1406}
1407
1408template <typename LHS, typename RHS>
1409inline CmpClass_match<LHS, RHS, FCmpInst, FCmpInst::Predicate>
1410m_FCmp(FCmpInst::Predicate &Pred, const LHS &L, const RHS &R) {
1411 return CmpClass_match<LHS, RHS, FCmpInst, FCmpInst::Predicate>(Pred, L, R);
1412}
1413
1414//===----------------------------------------------------------------------===//
1415// Matchers for instructions with a given opcode and number of operands.
1416//
1417
1418/// Matches instructions with Opcode and three operands.
1419template <typename T0, unsigned Opcode> struct OneOps_match {
1420 T0 Op1;
1421
1422 OneOps_match(const T0 &Op1) : Op1(Op1) {}
1423
1424 template <typename OpTy> bool match(OpTy *V) {
1425 if (V->getValueID() == Value::InstructionVal + Opcode) {
1426 auto *I = cast<Instruction>(V);
1427 return Op1.match(I->getOperand(0));
1428 }
1429 return false;
1430 }
1431};
1432
1433/// Matches instructions with Opcode and three operands.
1434template <typename T0, typename T1, unsigned Opcode> struct TwoOps_match {
1435 T0 Op1;
1436 T1 Op2;
1437
1438 TwoOps_match(const T0 &Op1, const T1 &Op2) : Op1(Op1), Op2(Op2) {}
1439
1440 template <typename OpTy> bool match(OpTy *V) {
1441 if (V->getValueID() == Value::InstructionVal + Opcode) {
1442 auto *I = cast<Instruction>(V);
1443 return Op1.match(I->getOperand(0)) && Op2.match(I->getOperand(1));
1444 }
1445 return false;
1446 }
1447};
1448
1449/// Matches instructions with Opcode and three operands.
1450template <typename T0, typename T1, typename T2, unsigned Opcode>
1451struct ThreeOps_match {
1452 T0 Op1;
1453 T1 Op2;
1454 T2 Op3;
1455
1456 ThreeOps_match(const T0 &Op1, const T1 &Op2, const T2 &Op3)
1457 : Op1(Op1), Op2(Op2), Op3(Op3) {}
1458
1459 template <typename OpTy> bool match(OpTy *V) {
1460 if (V->getValueID() == Value::InstructionVal + Opcode) {
1461 auto *I = cast<Instruction>(V);
1462 return Op1.match(I->getOperand(0)) && Op2.match(I->getOperand(1)) &&
1463 Op3.match(I->getOperand(2));
1464 }
1465 return false;
1466 }
1467};
1468
1469/// Matches SelectInst.
1470template <typename Cond, typename LHS, typename RHS>
1471inline ThreeOps_match<Cond, LHS, RHS, Instruction::Select>
1472m_Select(const Cond &C, const LHS &L, const RHS &R) {
1473 return ThreeOps_match<Cond, LHS, RHS, Instruction::Select>(C, L, R);
1474}
1475
1476/// This matches a select of two constants, e.g.:
1477/// m_SelectCst<-1, 0>(m_Value(V))
1478template <int64_t L, int64_t R, typename Cond>
1479inline ThreeOps_match<Cond, constantint_match<L>, constantint_match<R>,
1480 Instruction::Select>
1481m_SelectCst(const Cond &C) {
1482 return m_Select(C, m_ConstantInt<L>(), m_ConstantInt<R>());
1483}
1484
1485/// Matches FreezeInst.
1486template <typename OpTy>
1487inline OneOps_match<OpTy, Instruction::Freeze> m_Freeze(const OpTy &Op) {
1488 return OneOps_match<OpTy, Instruction::Freeze>(Op);
1489}
1490
1491/// Matches InsertElementInst.
1492template <typename Val_t, typename Elt_t, typename Idx_t>
1493inline ThreeOps_match<Val_t, Elt_t, Idx_t, Instruction::InsertElement>
1494m_InsertElt(const Val_t &Val, const Elt_t &Elt, const Idx_t &Idx) {
1495 return ThreeOps_match<Val_t, Elt_t, Idx_t, Instruction::InsertElement>(
1496 Val, Elt, Idx);
1497}
1498
1499/// Matches ExtractElementInst.
1500template <typename Val_t, typename Idx_t>
1501inline TwoOps_match<Val_t, Idx_t, Instruction::ExtractElement>
1502m_ExtractElt(const Val_t &Val, const Idx_t &Idx) {
1503 return TwoOps_match<Val_t, Idx_t, Instruction::ExtractElement>(Val, Idx);
1504}
1505
1506/// Matches shuffle.
1507template <typename T0, typename T1, typename T2> struct Shuffle_match {
1508 T0 Op1;
1509 T1 Op2;
1510 T2 Mask;
1511
1512 Shuffle_match(const T0 &Op1, const T1 &Op2, const T2 &Mask)
1513 : Op1(Op1), Op2(Op2), Mask(Mask) {}
1514
1515 template <typename OpTy> bool match(OpTy *V) {
1516 if (auto *I = dyn_cast<ShuffleVectorInst>(V)) {
1517 return Op1.match(I->getOperand(0)) && Op2.match(I->getOperand(1)) &&
1518 Mask.match(I->getShuffleMask());
1519 }
1520 return false;
1521 }
1522};
1523
1524struct m_Mask {
1525 ArrayRef<int> &MaskRef;
1526 m_Mask(ArrayRef<int> &MaskRef) : MaskRef(MaskRef) {}
1527 bool match(ArrayRef<int> Mask) {
1528 MaskRef = Mask;
1529 return true;
1530 }
1531};
1532
1533struct m_ZeroMask {
1534 bool match(ArrayRef<int> Mask) {
1535 return all_of(Mask, [](int Elem) { return Elem == 0 || Elem == -1; });
1536 }
1537};
1538
1539struct m_SpecificMask {
1540 ArrayRef<int> &MaskRef;
1541 m_SpecificMask(ArrayRef<int> &MaskRef) : MaskRef(MaskRef) {}
1542 bool match(ArrayRef<int> Mask) { return MaskRef == Mask; }
1543};
1544
1545struct m_SplatOrUndefMask {
1546 int &SplatIndex;
1547 m_SplatOrUndefMask(int &SplatIndex) : SplatIndex(SplatIndex) {}
1548 bool match(ArrayRef<int> Mask) {
1549 auto First = find_if(Mask, [](int Elem) { return Elem != -1; });
1550 if (First == Mask.end())
1551 return false;
1552 SplatIndex = *First;
1553 return all_of(Mask,
1554 [First](int Elem) { return Elem == *First || Elem == -1; });
1555 }
1556};
1557
1558/// Matches ShuffleVectorInst independently of mask value.
1559template <typename V1_t, typename V2_t>
1560inline TwoOps_match<V1_t, V2_t, Instruction::ShuffleVector>
1561m_Shuffle(const V1_t &v1, const V2_t &v2) {
1562 return TwoOps_match<V1_t, V2_t, Instruction::ShuffleVector>(v1, v2);
1563}
1564
1565template <typename V1_t, typename V2_t, typename Mask_t>
1566inline Shuffle_match<V1_t, V2_t, Mask_t>
1567m_Shuffle(const V1_t &v1, const V2_t &v2, const Mask_t &mask) {
1568 return Shuffle_match<V1_t, V2_t, Mask_t>(v1, v2, mask);
1569}
1570
1571/// Matches LoadInst.
1572template <typename OpTy>
1573inline OneOps_match<OpTy, Instruction::Load> m_Load(const OpTy &Op) {
1574 return OneOps_match<OpTy, Instruction::Load>(Op);
1575}
1576
1577/// Matches StoreInst.
1578template <typename ValueOpTy, typename PointerOpTy>
1579inline TwoOps_match<ValueOpTy, PointerOpTy, Instruction::Store>
1580m_Store(const ValueOpTy &ValueOp, const PointerOpTy &PointerOp) {
1581 return TwoOps_match<ValueOpTy, PointerOpTy, Instruction::Store>(ValueOp,
1582 PointerOp);
1583}
1584
1585//===----------------------------------------------------------------------===//
1586// Matchers for CastInst classes
1587//
1588
1589template <typename Op_t, unsigned Opcode> struct CastClass_match {
1590 Op_t Op;
1591
1592 CastClass_match(const Op_t &OpMatch) : Op(OpMatch) {}
1593
1594 template <typename OpTy> bool match(OpTy *V) {
1595 if (auto *O = dyn_cast<Operator>(V))
1596 return O->getOpcode() == Opcode && Op.match(O->getOperand(0));
1597 return false;
1598 }
1599};
1600
1601/// Matches BitCast.
1602template <typename OpTy>
1603inline CastClass_match<OpTy, Instruction::BitCast> m_BitCast(const OpTy &Op) {
1604 return CastClass_match<OpTy, Instruction::BitCast>(Op);
1605}
1606
1607/// Matches PtrToInt.
1608template <typename OpTy>
1609inline CastClass_match<OpTy, Instruction::PtrToInt> m_PtrToInt(const OpTy &Op) {
1610 return CastClass_match<OpTy, Instruction::PtrToInt>(Op);
1611}
1612
1613/// Matches IntToPtr.
1614template <typename OpTy>
1615inline CastClass_match<OpTy, Instruction::IntToPtr> m_IntToPtr(const OpTy &Op) {
1616 return CastClass_match<OpTy, Instruction::IntToPtr>(Op);
1617}
1618
1619/// Matches Trunc.
1620template <typename OpTy>
1621inline CastClass_match<OpTy, Instruction::Trunc> m_Trunc(const OpTy &Op) {
1622 return CastClass_match<OpTy, Instruction::Trunc>(Op);
1623}
1624
1625template <typename OpTy>
1626inline match_combine_or<CastClass_match<OpTy, Instruction::Trunc>, OpTy>
1627m_TruncOrSelf(const OpTy &Op) {
1628 return m_CombineOr(m_Trunc(Op), Op);
1629}
1630
1631/// Matches SExt.
1632template <typename OpTy>
1633inline CastClass_match<OpTy, Instruction::SExt> m_SExt(const OpTy &Op) {
1634 return CastClass_match<OpTy, Instruction::SExt>(Op);
1635}
1636
1637/// Matches ZExt.
1638template <typename OpTy>
1639inline CastClass_match<OpTy, Instruction::ZExt> m_ZExt(const OpTy &Op) {
1640 return CastClass_match<OpTy, Instruction::ZExt>(Op);
16
Returning without writing to 'Op.VR'
1641}
1642
1643template <typename OpTy>
1644inline match_combine_or<CastClass_match<OpTy, Instruction::ZExt>, OpTy>
1645m_ZExtOrSelf(const OpTy &Op) {
1646 return m_CombineOr(m_ZExt(Op), Op);
15
Calling 'm_ZExt<llvm::PatternMatch::bind_ty<llvm::Value>>'
17
Returning from 'm_ZExt<llvm::PatternMatch::bind_ty<llvm::Value>>'
18
Calling 'm_CombineOr<llvm::PatternMatch::CastClass_match<llvm::PatternMatch::bind_ty<llvm::Value>, 39>, llvm::PatternMatch::bind_ty<llvm::Value>>'
20
Returning from 'm_CombineOr<llvm::PatternMatch::CastClass_match<llvm::PatternMatch::bind_ty<llvm::Value>, 39>, llvm::PatternMatch::bind_ty<llvm::Value>>'
21
Returning without writing to 'Op.VR'
1647}
1648
1649template <typename OpTy>
1650inline match_combine_or<CastClass_match<OpTy, Instruction::SExt>, OpTy>
1651m_SExtOrSelf(const OpTy &Op) {
1652 return m_CombineOr(m_SExt(Op), Op);
1653}
1654
1655template <typename OpTy>
1656inline match_combine_or<CastClass_match<OpTy, Instruction::ZExt>,
1657 CastClass_match<OpTy, Instruction::SExt>>
1658m_ZExtOrSExt(const OpTy &Op) {
1659 return m_CombineOr(m_ZExt(Op), m_SExt(Op));
1660}
1661
1662template <typename OpTy>
1663inline match_combine_or<
1664 match_combine_or<CastClass_match<OpTy, Instruction::ZExt>,
1665 CastClass_match<OpTy, Instruction::SExt>>,
1666 OpTy>
1667m_ZExtOrSExtOrSelf(const OpTy &Op) {
1668 return m_CombineOr(m_ZExtOrSExt(Op), Op);
1669}
1670
1671template <typename OpTy>
1672inline CastClass_match<OpTy, Instruction::UIToFP> m_UIToFP(const OpTy &Op) {
1673 return CastClass_match<OpTy, Instruction::UIToFP>(Op);
1674}
1675
1676template <typename OpTy>
1677inline CastClass_match<OpTy, Instruction::SIToFP> m_SIToFP(const OpTy &Op) {
1678 return CastClass_match<OpTy, Instruction::SIToFP>(Op);
1679}
1680
1681template <typename OpTy>
1682inline CastClass_match<OpTy, Instruction::FPToUI> m_FPToUI(const OpTy &Op) {
1683 return CastClass_match<OpTy, Instruction::FPToUI>(Op);
1684}
1685
1686template <typename OpTy>
1687inline CastClass_match<OpTy, Instruction::FPToSI> m_FPToSI(const OpTy &Op) {
1688 return CastClass_match<OpTy, Instruction::FPToSI>(Op);
1689}
1690
1691template <typename OpTy>
1692inline CastClass_match<OpTy, Instruction::FPTrunc> m_FPTrunc(const OpTy &Op) {
1693 return CastClass_match<OpTy, Instruction::FPTrunc>(Op);
1694}
1695
1696template <typename OpTy>
1697inline CastClass_match<OpTy, Instruction::FPExt> m_FPExt(const OpTy &Op) {
1698 return CastClass_match<OpTy, Instruction::FPExt>(Op);
1699}
1700
1701//===----------------------------------------------------------------------===//
1702// Matchers for control flow.
1703//
1704
1705struct br_match {
1706 BasicBlock *&Succ;
1707
1708 br_match(BasicBlock *&Succ) : Succ(Succ) {}
1709
1710 template <typename OpTy> bool match(OpTy *V) {
1711 if (auto *BI = dyn_cast<BranchInst>(V))
1712 if (BI->isUnconditional()) {
1713 Succ = BI->getSuccessor(0);
1714 return true;
1715 }
1716 return false;
1717 }
1718};
1719
1720inline br_match m_UnconditionalBr(BasicBlock *&Succ) { return br_match(Succ); }
1721
1722template <typename Cond_t, typename TrueBlock_t, typename FalseBlock_t>
1723struct brc_match {
1724 Cond_t Cond;
1725 TrueBlock_t T;
1726 FalseBlock_t F;
1727
1728 brc_match(const Cond_t &C, const TrueBlock_t &t, const FalseBlock_t &f)
1729 : Cond(C), T(t), F(f) {}
1730
1731 template <typename OpTy> bool match(OpTy *V) {
1732 if (auto *BI = dyn_cast<BranchInst>(V))
1733 if (BI->isConditional() && Cond.match(BI->getCondition()))
1734 return T.match(BI->getSuccessor(0)) && F.match(BI->getSuccessor(1));
1735 return false;
1736 }
1737};
1738
1739template <typename Cond_t>
1740inline brc_match<Cond_t, bind_ty<BasicBlock>, bind_ty<BasicBlock>>
1741m_Br(const Cond_t &C, BasicBlock *&T, BasicBlock *&F) {
1742 return brc_match<Cond_t, bind_ty<BasicBlock>, bind_ty<BasicBlock>>(
1743 C, m_BasicBlock(T), m_BasicBlock(F));
1744}
1745
1746template <typename Cond_t, typename TrueBlock_t, typename FalseBlock_t>
1747inline brc_match<Cond_t, TrueBlock_t, FalseBlock_t>
1748m_Br(const Cond_t &C, const TrueBlock_t &T, const FalseBlock_t &F) {
1749 return brc_match<Cond_t, TrueBlock_t, FalseBlock_t>(C, T, F);
1750}
1751
1752//===----------------------------------------------------------------------===//
1753// Matchers for max/min idioms, eg: "select (sgt x, y), x, y" -> smax(x,y).
1754//
1755
1756template <typename CmpInst_t, typename LHS_t, typename RHS_t, typename Pred_t,
1757 bool Commutable = false>
1758struct MaxMin_match {
1759 using PredType = Pred_t;
1760 LHS_t L;
1761 RHS_t R;
1762
1763 // The evaluation order is always stable, regardless of Commutability.
1764 // The LHS is always matched first.
1765 MaxMin_match(const LHS_t &LHS, const RHS_t &RHS) : L(LHS), R(RHS) {}
1766
1767 template <typename OpTy> bool match(OpTy *V) {
1768 if (auto *II = dyn_cast<IntrinsicInst>(V)) {
1769 Intrinsic::ID IID = II->getIntrinsicID();
1770 if ((IID == Intrinsic::smax && Pred_t::match(ICmpInst::ICMP_SGT)) ||
1771 (IID == Intrinsic::smin && Pred_t::match(ICmpInst::ICMP_SLT)) ||
1772 (IID == Intrinsic::umax && Pred_t::match(ICmpInst::ICMP_UGT)) ||
1773 (IID == Intrinsic::umin && Pred_t::match(ICmpInst::ICMP_ULT))) {
1774 Value *LHS = II->getOperand(0), *RHS = II->getOperand(1);
1775 return (L.match(LHS) && R.match(RHS)) ||
1776 (Commutable && L.match(RHS) && R.match(LHS));
1777 }
1778 }
1779 // Look for "(x pred y) ? x : y" or "(x pred y) ? y : x".
1780 auto *SI = dyn_cast<SelectInst>(V);
1781 if (!SI)
1782 return false;
1783 auto *Cmp = dyn_cast<CmpInst_t>(SI->getCondition());
1784 if (!Cmp)
1785 return false;
1786 // At this point we have a select conditioned on a comparison. Check that
1787 // it is the values returned by the select that are being compared.
1788 auto *TrueVal = SI->getTrueValue();
1789 auto *FalseVal = SI->getFalseValue();
1790 auto *LHS = Cmp->getOperand(0);
1791 auto *RHS = Cmp->getOperand(1);
1792 if ((TrueVal != LHS || FalseVal != RHS) &&
1793 (TrueVal != RHS || FalseVal != LHS))
1794 return false;
1795 typename CmpInst_t::Predicate Pred =
1796 LHS == TrueVal ? Cmp->getPredicate() : Cmp->getInversePredicate();
1797 // Does "(x pred y) ? x : y" represent the desired max/min operation?
1798 if (!Pred_t::match(Pred))
1799 return false;
1800 // It does! Bind the operands.
1801 return (L.match(LHS) && R.match(RHS)) ||
1802 (Commutable && L.match(RHS) && R.match(LHS));
1803 }
1804};
1805
1806/// Helper class for identifying signed max predicates.
1807struct smax_pred_ty {
1808 static bool match(ICmpInst::Predicate Pred) {
1809 return Pred == CmpInst::ICMP_SGT || Pred == CmpInst::ICMP_SGE;
1810 }
1811};
1812
1813/// Helper class for identifying signed min predicates.
1814struct smin_pred_ty {
1815 static bool match(ICmpInst::Predicate Pred) {
1816 return Pred == CmpInst::ICMP_SLT || Pred == CmpInst::ICMP_SLE;
1817 }
1818};
1819
1820/// Helper class for identifying unsigned max predicates.
1821struct umax_pred_ty {
1822 static bool match(ICmpInst::Predicate Pred) {
1823 return Pred == CmpInst::ICMP_UGT || Pred == CmpInst::ICMP_UGE;
1824 }
1825};
1826
1827/// Helper class for identifying unsigned min predicates.
1828struct umin_pred_ty {
1829 static bool match(ICmpInst::Predicate Pred) {
1830 return Pred == CmpInst::ICMP_ULT || Pred == CmpInst::ICMP_ULE;
1831 }
1832};
1833
1834/// Helper class for identifying ordered max predicates.
1835struct ofmax_pred_ty {
1836 static bool match(FCmpInst::Predicate Pred) {
1837 return Pred == CmpInst::FCMP_OGT || Pred == CmpInst::FCMP_OGE;
1838 }
1839};
1840
1841/// Helper class for identifying ordered min predicates.
1842struct ofmin_pred_ty {
1843 static bool match(FCmpInst::Predicate Pred) {
1844 return Pred == CmpInst::FCMP_OLT || Pred == CmpInst::FCMP_OLE;
1845 }
1846};
1847
1848/// Helper class for identifying unordered max predicates.
1849struct ufmax_pred_ty {
1850 static bool match(FCmpInst::Predicate Pred) {
1851 return Pred == CmpInst::FCMP_UGT || Pred == CmpInst::FCMP_UGE;
1852 }
1853};
1854
1855/// Helper class for identifying unordered min predicates.
1856struct ufmin_pred_ty {
1857 static bool match(FCmpInst::Predicate Pred) {
1858 return Pred == CmpInst::FCMP_ULT || Pred == CmpInst::FCMP_ULE;
1859 }
1860};
1861
1862template <typename LHS, typename RHS>
1863inline MaxMin_match<ICmpInst, LHS, RHS, smax_pred_ty> m_SMax(const LHS &L,
1864 const RHS &R) {
1865 return MaxMin_match<ICmpInst, LHS, RHS, smax_pred_ty>(L, R);
1866}
1867
1868template <typename LHS, typename RHS>
1869inline MaxMin_match<ICmpInst, LHS, RHS, smin_pred_ty> m_SMin(const LHS &L,
1870 const RHS &R) {
1871 return MaxMin_match<ICmpInst, LHS, RHS, smin_pred_ty>(L, R);
1872}
1873
1874template <typename LHS, typename RHS>
1875inline MaxMin_match<ICmpInst, LHS, RHS, umax_pred_ty> m_UMax(const LHS &L,
1876 const RHS &R) {
1877 return MaxMin_match<ICmpInst, LHS, RHS, umax_pred_ty>(L, R);
1878}
1879
1880template <typename LHS, typename RHS>
1881inline MaxMin_match<ICmpInst, LHS, RHS, umin_pred_ty> m_UMin(const LHS &L,
1882 const RHS &R) {
1883 return MaxMin_match<ICmpInst, LHS, RHS, umin_pred_ty>(L, R);
1884}
1885
1886template <typename LHS, typename RHS>
1887inline match_combine_or<
1888 match_combine_or<MaxMin_match<ICmpInst, LHS, RHS, smax_pred_ty>,
1889 MaxMin_match<ICmpInst, LHS, RHS, smin_pred_ty>>,
1890 match_combine_or<MaxMin_match<ICmpInst, LHS, RHS, umax_pred_ty>,
1891 MaxMin_match<ICmpInst, LHS, RHS, umin_pred_ty>>>
1892m_MaxOrMin(const LHS &L, const RHS &R) {
1893 return m_CombineOr(m_CombineOr(m_SMax(L, R), m_SMin(L, R)),
1894 m_CombineOr(m_UMax(L, R), m_UMin(L, R)));
1895}
1896
1897/// Match an 'ordered' floating point maximum function.
1898/// Floating point has one special value 'NaN'. Therefore, there is no total
1899/// order. However, if we can ignore the 'NaN' value (for example, because of a
1900/// 'no-nans-float-math' flag) a combination of a fcmp and select has 'maximum'
1901/// semantics. In the presence of 'NaN' we have to preserve the original
1902/// select(fcmp(ogt/ge, L, R), L, R) semantics matched by this predicate.
1903///
1904/// max(L, R) iff L and R are not NaN
1905/// m_OrdFMax(L, R) = R iff L or R are NaN
1906template <typename LHS, typename RHS>
1907inline MaxMin_match<FCmpInst, LHS, RHS, ofmax_pred_ty> m_OrdFMax(const LHS &L,
1908 const RHS &R) {
1909 return MaxMin_match<FCmpInst, LHS, RHS, ofmax_pred_ty>(L, R);
1910}
1911
1912/// Match an 'ordered' floating point minimum function.
1913/// Floating point has one special value 'NaN'. Therefore, there is no total
1914/// order. However, if we can ignore the 'NaN' value (for example, because of a
1915/// 'no-nans-float-math' flag) a combination of a fcmp and select has 'minimum'
1916/// semantics. In the presence of 'NaN' we have to preserve the original
1917/// select(fcmp(olt/le, L, R), L, R) semantics matched by this predicate.
1918///
1919/// min(L, R) iff L and R are not NaN
1920/// m_OrdFMin(L, R) = R iff L or R are NaN
1921template <typename LHS, typename RHS>
1922inline MaxMin_match<FCmpInst, LHS, RHS, ofmin_pred_ty> m_OrdFMin(const LHS &L,
1923 const RHS &R) {
1924 return MaxMin_match<FCmpInst, LHS, RHS, ofmin_pred_ty>(L, R);
1925}
1926
1927/// Match an 'unordered' floating point maximum function.
1928/// Floating point has one special value 'NaN'. Therefore, there is no total
1929/// order. However, if we can ignore the 'NaN' value (for example, because of a
1930/// 'no-nans-float-math' flag) a combination of a fcmp and select has 'maximum'
1931/// semantics. In the presence of 'NaN' we have to preserve the original
1932/// select(fcmp(ugt/ge, L, R), L, R) semantics matched by this predicate.
1933///
1934/// max(L, R) iff L and R are not NaN
1935/// m_UnordFMax(L, R) = L iff L or R are NaN
1936template <typename LHS, typename RHS>
1937inline MaxMin_match<FCmpInst, LHS, RHS, ufmax_pred_ty>
1938m_UnordFMax(const LHS &L, const RHS &R) {
1939 return MaxMin_match<FCmpInst, LHS, RHS, ufmax_pred_ty>(L, R);
1940}
1941
1942/// Match an 'unordered' floating point minimum function.
1943/// Floating point has one special value 'NaN'. Therefore, there is no total
1944/// order. However, if we can ignore the 'NaN' value (for example, because of a
1945/// 'no-nans-float-math' flag) a combination of a fcmp and select has 'minimum'
1946/// semantics. In the presence of 'NaN' we have to preserve the original
1947/// select(fcmp(ult/le, L, R), L, R) semantics matched by this predicate.
1948///
1949/// min(L, R) iff L and R are not NaN
1950/// m_UnordFMin(L, R) = L iff L or R are NaN
1951template <typename LHS, typename RHS>
1952inline MaxMin_match<FCmpInst, LHS, RHS, ufmin_pred_ty>
1953m_UnordFMin(const LHS &L, const RHS &R) {
1954 return MaxMin_match<FCmpInst, LHS, RHS, ufmin_pred_ty>(L, R);
1955}
1956
1957//===----------------------------------------------------------------------===//
1958// Matchers for overflow check patterns: e.g. (a + b) u< a, (a ^ -1) <u b
1959// Note that S might be matched to other instructions than AddInst.
1960//
1961
1962template <typename LHS_t, typename RHS_t, typename Sum_t>
1963struct UAddWithOverflow_match {
1964 LHS_t L;
1965 RHS_t R;
1966 Sum_t S;
1967
1968 UAddWithOverflow_match(const LHS_t &L, const RHS_t &R, const Sum_t &S)
1969 : L(L), R(R), S(S) {}
1970
1971 template <typename OpTy> bool match(OpTy *V) {
1972 Value *ICmpLHS, *ICmpRHS;
1973 ICmpInst::Predicate Pred;
1974 if (!m_ICmp(Pred, m_Value(ICmpLHS), m_Value(ICmpRHS)).match(V))
1975 return false;
1976
1977 Value *AddLHS, *AddRHS;
1978 auto AddExpr = m_Add(m_Value(AddLHS), m_Value(AddRHS));
1979
1980 // (a + b) u< a, (a + b) u< b
1981 if (Pred == ICmpInst::ICMP_ULT)
1982 if (AddExpr.match(ICmpLHS) && (ICmpRHS == AddLHS || ICmpRHS == AddRHS))
1983 return L.match(AddLHS) && R.match(AddRHS) && S.match(ICmpLHS);
1984
1985 // a >u (a + b), b >u (a + b)
1986 if (Pred == ICmpInst::ICMP_UGT)
1987 if (AddExpr.match(ICmpRHS) && (ICmpLHS == AddLHS || ICmpLHS == AddRHS))
1988 return L.match(AddLHS) && R.match(AddRHS) && S.match(ICmpRHS);
1989
1990 Value *Op1;
1991 auto XorExpr = m_OneUse(m_Xor(m_Value(Op1), m_AllOnes()));
1992 // (a ^ -1) <u b
1993 if (Pred == ICmpInst::ICMP_ULT) {
1994 if (XorExpr.match(ICmpLHS))
1995 return L.match(Op1) && R.match(ICmpRHS) && S.match(ICmpLHS);
1996 }
1997 // b > u (a ^ -1)
1998 if (Pred == ICmpInst::ICMP_UGT) {
1999 if (XorExpr.match(ICmpRHS))
2000 return L.match(Op1) && R.match(ICmpLHS) && S.match(ICmpRHS);
2001 }
2002
2003 // Match special-case for increment-by-1.
2004 if (Pred == ICmpInst::ICMP_EQ) {
2005 // (a + 1) == 0
2006 // (1 + a) == 0
2007 if (AddExpr.match(ICmpLHS) && m_ZeroInt().match(ICmpRHS) &&
2008 (m_One().match(AddLHS) || m_One().match(AddRHS)))
2009 return L.match(AddLHS) && R.match(AddRHS) && S.match(ICmpLHS);
2010 // 0 == (a + 1)
2011 // 0 == (1 + a)
2012 if (m_ZeroInt().match(ICmpLHS) && AddExpr.match(ICmpRHS) &&
2013 (m_One().match(AddLHS) || m_One().match(AddRHS)))
2014 return L.match(AddLHS) && R.match(AddRHS) && S.match(ICmpRHS);
2015 }
2016
2017 return false;
2018 }
2019};
2020
2021/// Match an icmp instruction checking for unsigned overflow on addition.
2022///
2023/// S is matched to the addition whose result is being checked for overflow, and
2024/// L and R are matched to the LHS and RHS of S.
2025template <typename LHS_t, typename RHS_t, typename Sum_t>
2026UAddWithOverflow_match<LHS_t, RHS_t, Sum_t>
2027m_UAddWithOverflow(const LHS_t &L, const RHS_t &R, const Sum_t &S) {
2028 return UAddWithOverflow_match<LHS_t, RHS_t, Sum_t>(L, R, S);
2029}
2030
2031template <typename Opnd_t> struct Argument_match {
2032 unsigned OpI;
2033 Opnd_t Val;
2034
2035 Argument_match(unsigned OpIdx, const Opnd_t &V) : OpI(OpIdx), Val(V) {}
2036
2037 template <typename OpTy> bool match(OpTy *V) {
2038 // FIXME: Should likely be switched to use `CallBase`.
2039 if (const auto *CI = dyn_cast<CallInst>(V))
2040 return Val.match(CI->getArgOperand(OpI));
2041 return false;
2042 }
2043};
2044
2045/// Match an argument.
2046template <unsigned OpI, typename Opnd_t>
2047inline Argument_match<Opnd_t> m_Argument(const Opnd_t &Op) {
2048 return Argument_match<Opnd_t>(OpI, Op);
2049}
2050
2051/// Intrinsic matchers.
2052struct IntrinsicID_match {
2053 unsigned ID;
2054
2055 IntrinsicID_match(Intrinsic::ID IntrID) : ID(IntrID) {}
2056
2057 template <typename OpTy> bool match(OpTy *V) {
2058 if (const auto *CI = dyn_cast<CallInst>(V))
2059 if (const auto *F = CI->getCalledFunction())
2060 return F->getIntrinsicID() == ID;
2061 return false;
2062 }
2063};
2064
2065/// Intrinsic matches are combinations of ID matchers, and argument
2066/// matchers. Higher arity matcher are defined recursively in terms of and-ing
2067/// them with lower arity matchers. Here's some convenient typedefs for up to
2068/// several arguments, and more can be added as needed
2069template <typename T0 = void, typename T1 = void, typename T2 = void,
2070 typename T3 = void, typename T4 = void, typename T5 = void,
2071 typename T6 = void, typename T7 = void, typename T8 = void,
2072 typename T9 = void, typename T10 = void>
2073struct m_Intrinsic_Ty;
2074template <typename T0> struct m_Intrinsic_Ty<T0> {
2075 using Ty = match_combine_and<IntrinsicID_match, Argument_match<T0>>;
2076};
2077template <typename T0, typename T1> struct m_Intrinsic_Ty<T0, T1> {
2078 using Ty =
2079 match_combine_and<typename m_Intrinsic_Ty<T0>::Ty, Argument_match<T1>>;
2080};
2081template <typename T0, typename T1, typename T2>
2082struct m_Intrinsic_Ty<T0, T1, T2> {
2083 using Ty =
2084 match_combine_and<typename m_Intrinsic_Ty<T0, T1>::Ty,
2085 Argument_match<T2>>;
2086};
2087template <typename T0, typename T1, typename T2, typename T3>
2088struct m_Intrinsic_Ty<T0, T1, T2, T3> {
2089 using Ty =
2090 match_combine_and<typename m_Intrinsic_Ty<T0, T1, T2>::Ty,
2091 Argument_match<T3>>;
2092};
2093
2094template <typename T0, typename T1, typename T2, typename T3, typename T4>
2095struct m_Intrinsic_Ty<T0, T1, T2, T3, T4> {
2096 using Ty = match_combine_and<typename m_Intrinsic_Ty<T0, T1, T2, T3>::Ty,
2097 Argument_match<T4>>;
2098};
2099
2100template <typename T0, typename T1, typename T2, typename T3, typename T4, typename T5>
2101struct m_Intrinsic_Ty<T0, T1, T2, T3, T4, T5> {
2102 using Ty = match_combine_and<typename m_Intrinsic_Ty<T0, T1, T2, T3, T4>::Ty,
2103 Argument_match<T5>>;
2104};
2105
2106/// Match intrinsic calls like this:
2107/// m_Intrinsic<Intrinsic::fabs>(m_Value(X))
2108template <Intrinsic::ID IntrID> inline IntrinsicID_match m_Intrinsic() {
2109 return IntrinsicID_match(IntrID);
2110}
2111
2112/// Matches MaskedLoad Intrinsic.
2113template <typename Opnd0, typename Opnd1, typename Opnd2, typename Opnd3>
2114inline typename m_Intrinsic_Ty<Opnd0, Opnd1, Opnd2, Opnd3>::Ty
2115m_MaskedLoad(const Opnd0 &Op0, const Opnd1 &Op1, const Opnd2 &Op2,
2116 const Opnd3 &Op3) {
2117 return m_Intrinsic<Intrinsic::masked_load>(Op0, Op1, Op2, Op3);
2118}
2119
2120template <Intrinsic::ID IntrID, typename T0>
2121inline typename m_Intrinsic_Ty<T0>::Ty m_Intrinsic(const T0 &Op0) {
2122 return m_CombineAnd(m_Intrinsic<IntrID>(), m_Argument<0>(Op0));
2123}
2124
2125template <Intrinsic::ID IntrID, typename T0, typename T1>
2126inline typename m_Intrinsic_Ty<T0, T1>::Ty m_Intrinsic(const T0 &Op0,
2127 const T1 &Op1) {
2128 return m_CombineAnd(m_Intrinsic<IntrID>(Op0), m_Argument<1>(Op1));
2129}
2130
2131template <Intrinsic::ID IntrID, typename T0, typename T1, typename T2>
2132inline typename m_Intrinsic_Ty<T0, T1, T2>::Ty
2133m_Intrinsic(const T0 &Op0, const T1 &Op1, const T2 &Op2) {
2134 return m_CombineAnd(m_Intrinsic<IntrID>(Op0, Op1), m_Argument<2>(Op2));
2135}
2136
2137template <Intrinsic::ID IntrID, typename T0, typename T1, typename T2,
2138 typename T3>
2139inline typename m_Intrinsic_Ty<T0, T1, T2, T3>::Ty
2140m_Intrinsic(const T0 &Op0, const T1 &Op1, const T2 &Op2, const T3 &Op3) {
2141 return m_CombineAnd(m_Intrinsic<IntrID>(Op0, Op1, Op2), m_Argument<3>(Op3));
2142}
2143
2144template <Intrinsic::ID IntrID, typename T0, typename T1, typename T2,
2145 typename T3, typename T4>
2146inline typename m_Intrinsic_Ty<T0, T1, T2, T3, T4>::Ty
2147m_Intrinsic(const T0 &Op0, const T1 &Op1, const T2 &Op2, const T3 &Op3,
2148 const T4 &Op4) {
2149 return m_CombineAnd(m_Intrinsic<IntrID>(Op0, Op1, Op2, Op3),
2150 m_Argument<4>(Op4));
2151}
2152
2153template <Intrinsic::ID IntrID, typename T0, typename T1, typename T2,
2154 typename T3, typename T4, typename T5>
2155inline typename m_Intrinsic_Ty<T0, T1, T2, T3, T4, T5>::Ty
2156m_Intrinsic(const T0 &Op0, const T1 &Op1, const T2 &Op2, const T3 &Op3,
2157 const T4 &Op4, const T5 &Op5) {
2158 return m_CombineAnd(m_Intrinsic<IntrID>(Op0, Op1, Op2, Op3, Op4),
2159 m_Argument<5>(Op5));
2160}
2161
2162// Helper intrinsic matching specializations.
2163template <typename Opnd0>
2164inline typename m_Intrinsic_Ty<Opnd0>::Ty m_BitReverse(const Opnd0 &Op0) {
2165 return m_Intrinsic<Intrinsic::bitreverse>(Op0);
2166}
2167
2168template <typename Opnd0>
2169inline typename m_Intrinsic_Ty<Opnd0>::Ty m_BSwap(const Opnd0 &Op0) {
2170 return m_Intrinsic<Intrinsic::bswap>(Op0);
2171}
2172
2173template <typename Opnd0>
2174inline typename m_Intrinsic_Ty<Opnd0>::Ty m_FAbs(const Opnd0 &Op0) {
2175 return m_Intrinsic<Intrinsic::fabs>(Op0);
2176}
2177
2178template <typename Opnd0>
2179inline typename m_Intrinsic_Ty<Opnd0>::Ty m_FCanonicalize(const Opnd0 &Op0) {
2180 return m_Intrinsic<Intrinsic::canonicalize>(Op0);
2181}
2182
2183template <typename Opnd0, typename Opnd1>
2184inline typename m_Intrinsic_Ty<Opnd0, Opnd1>::Ty m_FMin(const Opnd0 &Op0,
2185 const Opnd1 &Op1) {
2186 return m_Intrinsic<Intrinsic::minnum>(Op0, Op1);
2187}
2188
2189template <typename Opnd0, typename Opnd1>
2190inline typename m_Intrinsic_Ty<Opnd0, Opnd1>::Ty m_FMax(const Opnd0 &Op0,
2191 const Opnd1 &Op1) {
2192 return m_Intrinsic<Intrinsic::maxnum>(Op0, Op1);
2193}
2194
2195template <typename Opnd0, typename Opnd1, typename Opnd2>
2196inline typename m_Intrinsic_Ty<Opnd0, Opnd1, Opnd2>::Ty
2197m_FShl(const Opnd0 &Op0, const Opnd1 &Op1, const Opnd2 &Op2) {
2198 return m_Intrinsic<Intrinsic::fshl>(Op0, Op1, Op2);
2199}
2200
2201template <typename Opnd0, typename Opnd1, typename Opnd2>
2202inline typename m_Intrinsic_Ty<Opnd0, Opnd1, Opnd2>::Ty
2203m_FShr(const Opnd0 &Op0, const Opnd1 &Op1, const Opnd2 &Op2) {
2204 return m_Intrinsic<Intrinsic::fshr>(Op0, Op1, Op2);
2205}
2206
2207//===----------------------------------------------------------------------===//
2208// Matchers for two-operands operators with the operators in either order
2209//
2210
2211/// Matches a BinaryOperator with LHS and RHS in either order.
2212template <typename LHS, typename RHS>
2213inline AnyBinaryOp_match<LHS, RHS, true> m_c_BinOp(const LHS &L, const RHS &R) {
2214 return AnyBinaryOp_match<LHS, RHS, true>(L, R);
2215}
2216
2217/// Matches an ICmp with a predicate over LHS and RHS in either order.
2218/// Swaps the predicate if operands are commuted.
2219template <typename LHS, typename RHS>
2220inline CmpClass_match<LHS, RHS, ICmpInst, ICmpInst::Predicate, true>
2221m_c_ICmp(ICmpInst::Predicate &Pred, const LHS &L, const RHS &R) {
2222 return CmpClass_match<LHS, RHS, ICmpInst, ICmpInst::Predicate, true>(Pred, L,
2223 R);
2224}
2225
2226/// Matches a Add with LHS and RHS in either order.
2227template <typename LHS, typename RHS>
2228inline BinaryOp_match<LHS, RHS, Instruction::Add, true> m_c_Add(const LHS &L,
2229 const RHS &R) {
2230 return BinaryOp_match<LHS, RHS, Instruction::Add, true>(L, R);
2231}
2232
2233/// Matches a Mul with LHS and RHS in either order.
2234template <typename LHS, typename RHS>
2235inline BinaryOp_match<LHS, RHS, Instruction::Mul, true> m_c_Mul(const LHS &L,
2236 const RHS &R) {
2237 return BinaryOp_match<LHS, RHS, Instruction::Mul, true>(L, R);
2238}
2239
2240/// Matches an And with LHS and RHS in either order.
2241template <typename LHS, typename RHS>
2242inline BinaryOp_match<LHS, RHS, Instruction::And, true> m_c_And(const LHS &L,
2243 const RHS &R) {
2244 return BinaryOp_match<LHS, RHS, Instruction::And, true>(L, R);
2245}
2246
2247/// Matches an Or with LHS and RHS in either order.
2248template <typename LHS, typename RHS>
2249inline BinaryOp_match<LHS, RHS, Instruction::Or, true> m_c_Or(const LHS &L,
2250 const RHS &R) {
2251 return BinaryOp_match<LHS, RHS, Instruction::Or, true>(L, R);
2252}
2253
2254/// Matches an Xor with LHS and RHS in either order.
2255template <typename LHS, typename RHS>
2256inline BinaryOp_match<LHS, RHS, Instruction::Xor, true> m_c_Xor(const LHS &L,
2257 const RHS &R) {
2258 return BinaryOp_match<LHS, RHS, Instruction::Xor, true>(L, R);
2259}
2260
2261/// Matches a 'Neg' as 'sub 0, V'.
2262template <typename ValTy>
2263inline BinaryOp_match<cst_pred_ty<is_zero_int>, ValTy, Instruction::Sub>
2264m_Neg(const ValTy &V) {
2265 return m_Sub(m_ZeroInt(), V);
2266}
2267
2268/// Matches a 'Neg' as 'sub nsw 0, V'.
2269template <typename ValTy>
2270inline OverflowingBinaryOp_match<cst_pred_ty<is_zero_int>, ValTy,
2271 Instruction::Sub,
2272 OverflowingBinaryOperator::NoSignedWrap>
2273m_NSWNeg(const ValTy &V) {
2274 return m_NSWSub(m_ZeroInt(), V);
2275}
2276
2277/// Matches a 'Not' as 'xor V, -1' or 'xor -1, V'.
2278template <typename ValTy>
2279inline BinaryOp_match<ValTy, cst_pred_ty<is_all_ones>, Instruction::Xor, true>
2280m_Not(const ValTy &V) {
2281 return m_c_Xor(V, m_AllOnes());
2282}
2283
2284/// Matches an SMin with LHS and RHS in either order.
2285template <typename LHS, typename RHS>
2286inline MaxMin_match<ICmpInst, LHS, RHS, smin_pred_ty, true>
2287m_c_SMin(const LHS &L, const RHS &R) {
2288 return MaxMin_match<ICmpInst, LHS, RHS, smin_pred_ty, true>(L, R);
2289}
2290/// Matches an SMax with LHS and RHS in either order.
2291template <typename LHS, typename RHS>
2292inline MaxMin_match<ICmpInst, LHS, RHS, smax_pred_ty, true>
2293m_c_SMax(const LHS &L, const RHS &R) {
2294 return MaxMin_match<ICmpInst, LHS, RHS, smax_pred_ty, true>(L, R);
2295}
2296/// Matches a UMin with LHS and RHS in either order.
2297template <typename LHS, typename RHS>
2298inline MaxMin_match<ICmpInst, LHS, RHS, umin_pred_ty, true>
2299m_c_UMin(const LHS &L, const RHS &R) {
2300 return MaxMin_match<ICmpInst, LHS, RHS, umin_pred_ty, true>(L, R);
2301}
2302/// Matches a UMax with LHS and RHS in either order.
2303template <typename LHS, typename RHS>
2304inline MaxMin_match<ICmpInst, LHS, RHS, umax_pred_ty, true>
2305m_c_UMax(const LHS &L, const RHS &R) {
2306 return MaxMin_match<ICmpInst, LHS, RHS, umax_pred_ty, true>(L, R);
2307}
2308
2309template <typename LHS, typename RHS>
2310inline match_combine_or<
2311 match_combine_or<MaxMin_match<ICmpInst, LHS, RHS, smax_pred_ty, true>,
2312 MaxMin_match<ICmpInst, LHS, RHS, smin_pred_ty, true>>,
2313 match_combine_or<MaxMin_match<ICmpInst, LHS, RHS, umax_pred_ty, true>,
2314 MaxMin_match<ICmpInst, LHS, RHS, umin_pred_ty, true>>>
2315m_c_MaxOrMin(const LHS &L, const RHS &R) {
2316 return m_CombineOr(m_CombineOr(m_c_SMax(L, R), m_c_SMin(L, R)),
2317 m_CombineOr(m_c_UMax(L, R), m_c_UMin(L, R)));
2318}
2319
2320/// Matches FAdd with LHS and RHS in either order.
2321template <typename LHS, typename RHS>
2322inline BinaryOp_match<LHS, RHS, Instruction::FAdd, true>
2323m_c_FAdd(const LHS &L, const RHS &R) {
2324 return BinaryOp_match<LHS, RHS, Instruction::FAdd, true>(L, R);
2325}
2326
2327/// Matches FMul with LHS and RHS in either order.
2328template <typename LHS, typename RHS>
2329inline BinaryOp_match<LHS, RHS, Instruction::FMul, true>
2330m_c_FMul(const LHS &L, const RHS &R) {
2331 return BinaryOp_match<LHS, RHS, Instruction::FMul, true>(L, R);
2332}
2333
2334template <typename Opnd_t> struct Signum_match {
2335 Opnd_t Val;
2336 Signum_match(const Opnd_t &V) : Val(V) {}
2337
2338 template <typename OpTy> bool match(OpTy *V) {
2339 unsigned TypeSize = V->getType()->getScalarSizeInBits();
2340 if (TypeSize == 0)
2341 return false;
2342
2343 unsigned ShiftWidth = TypeSize - 1;
2344 Value *OpL = nullptr, *OpR = nullptr;
2345
2346 // This is the representation of signum we match:
2347 //
2348 // signum(x) == (x >> 63) | (-x >>u 63)
2349 //
2350 // An i1 value is its own signum, so it's correct to match
2351 //
2352 // signum(x) == (x >> 0) | (-x >>u 0)
2353 //
2354 // for i1 values.
2355
2356 auto LHS = m_AShr(m_Value(OpL), m_SpecificInt(ShiftWidth));
2357 auto RHS = m_LShr(m_Neg(m_Value(OpR)), m_SpecificInt(ShiftWidth));
2358 auto Signum = m_Or(LHS, RHS);
2359
2360 return Signum.match(V) && OpL == OpR && Val.match(OpL);
2361 }
2362};
2363
2364/// Matches a signum pattern.
2365///
2366/// signum(x) =
2367/// x > 0 -> 1
2368/// x == 0 -> 0
2369/// x < 0 -> -1
2370template <typename Val_t> inline Signum_match<Val_t> m_Signum(const Val_t &V) {
2371 return Signum_match<Val_t>(V);
2372}
2373
2374template <int Ind, typename Opnd_t> struct ExtractValue_match {
2375 Opnd_t Val;
2376 ExtractValue_match(const Opnd_t &V) : Val(V) {}
2377
2378 template <typename OpTy> bool match(OpTy *V) {
2379 if (auto *I = dyn_cast<ExtractValueInst>(V)) {
2380 // If Ind is -1, don't inspect indices
2381 if (Ind != -1 &&
2382 !(I->getNumIndices() == 1 && I->getIndices()[0] == (unsigned)Ind))
2383 return false;
2384 return Val.match(I->getAggregateOperand());
2385 }
2386 return false;
2387 }
2388};
2389
2390/// Match a single index ExtractValue instruction.
2391/// For example m_ExtractValue<1>(...)
2392template <int Ind, typename Val_t>
2393inline ExtractValue_match<Ind, Val_t> m_ExtractValue(const Val_t &V) {
2394 return ExtractValue_match<Ind, Val_t>(V);
2395}
2396
2397/// Match an ExtractValue instruction with any index.
2398/// For example m_ExtractValue(...)
2399template <typename Val_t>
2400inline ExtractValue_match<-1, Val_t> m_ExtractValue(const Val_t &V) {
2401 return ExtractValue_match<-1, Val_t>(V);
2402}
2403
2404/// Matcher for a single index InsertValue instruction.
2405template <int Ind, typename T0, typename T1> struct InsertValue_match {
2406 T0 Op0;
2407 T1 Op1;
2408
2409 InsertValue_match(const T0 &Op0, const T1 &Op1) : Op0(Op0), Op1(Op1) {}
2410
2411 template <typename OpTy> bool match(OpTy *V) {
2412 if (auto *I = dyn_cast<InsertValueInst>(V)) {
2413 return Op0.match(I->getOperand(0)) && Op1.match(I->getOperand(1)) &&
2414 I->getNumIndices() == 1 && Ind == I->getIndices()[0];
2415 }
2416 return false;
2417 }
2418};
2419
2420/// Matches a single index InsertValue instruction.
2421template <int Ind, typename Val_t, typename Elt_t>
2422inline InsertValue_match<Ind, Val_t, Elt_t> m_InsertValue(const Val_t &Val,
2423 const Elt_t &Elt) {
2424 return InsertValue_match<Ind, Val_t, Elt_t>(Val, Elt);
2425}
2426
2427/// Matches patterns for `vscale`. This can either be a call to `llvm.vscale` or
2428/// the constant expression
2429/// `ptrtoint(gep <vscale x 1 x i8>, <vscale x 1 x i8>* null, i32 1>`
2430/// under the right conditions determined by DataLayout.
2431struct VScaleVal_match {
2432 const DataLayout &DL;
2433 VScaleVal_match(const DataLayout &DL) : DL(DL) {}
2434
2435 template <typename ITy> bool match(ITy *V) {
2436 if (m_Intrinsic<Intrinsic::vscale>().match(V))
2437 return true;
2438
2439 Value *Ptr;
2440 if (m_PtrToInt(m_Value(Ptr)).match(V)) {
2441 if (auto *GEP = dyn_cast<GEPOperator>(Ptr)) {
2442 auto *DerefTy = GEP->getSourceElementType();
2443 if (GEP->getNumIndices() == 1 && isa<ScalableVectorType>(DerefTy) &&
2444 m_Zero().match(GEP->getPointerOperand()) &&
2445 m_SpecificInt(1).match(GEP->idx_begin()->get()) &&
2446 DL.getTypeAllocSizeInBits(DerefTy).getKnownMinSize() == 8)
2447 return true;
2448 }
2449 }
2450
2451 return false;
2452 }
2453};
2454
2455inline VScaleVal_match m_VScale(const DataLayout &DL) {
2456 return VScaleVal_match(DL);
2457}
2458
2459template <typename LHS, typename RHS, unsigned Opcode>
2460struct LogicalOp_match {
2461 LHS L;
2462 RHS R;
2463
2464 LogicalOp_match(const LHS &L, const RHS &R) : L(L), R(R) {}
2465
2466 template <typename T> bool match(T *V) {
2467 if (auto *I = dyn_cast<Instruction>(V)) {
2468 if (!I->getType()->isIntOrIntVectorTy(1))
2469 return false;
2470
2471 if (I->getOpcode() == Opcode && L.match(I->getOperand(0)) &&
2472 R.match(I->getOperand(1)))
2473 return true;
2474
2475 if (auto *SI = dyn_cast<SelectInst>(I)) {
2476 if (Opcode == Instruction::And) {
2477 if (const auto *C = dyn_cast<Constant>(SI->getFalseValue()))
2478 if (C->isNullValue() && L.match(SI->getCondition()) &&
2479 R.match(SI->getTrueValue()))
2480 return true;
2481 } else {
2482 assert(Opcode == Instruction::Or)((void)0);
2483 if (const auto *C = dyn_cast<Constant>(SI->getTrueValue()))
2484 if (C->isOneValue() && L.match(SI->getCondition()) &&
2485 R.match(SI->getFalseValue()))
2486 return true;
2487 }
2488 }
2489 }
2490
2491 return false;
2492 }
2493};
2494
2495/// Matches L && R either in the form of L & R or L ? R : false.
2496/// Note that the latter form is poison-blocking.
2497template <typename LHS, typename RHS>
2498inline LogicalOp_match<LHS, RHS, Instruction::And>
2499m_LogicalAnd(const LHS &L, const RHS &R) {
2500 return LogicalOp_match<LHS, RHS, Instruction::And>(L, R);
2501}
2502
2503/// Matches L && R where L and R are arbitrary values.
2504inline auto m_LogicalAnd() { return m_LogicalAnd(m_Value(), m_Value()); }
2505
2506/// Matches L || R either in the form of L | R or L ? true : R.
2507/// Note that the latter form is poison-blocking.
2508template <typename LHS, typename RHS>
2509inline LogicalOp_match<LHS, RHS, Instruction::Or>
2510m_LogicalOr(const LHS &L, const RHS &R) {
2511 return LogicalOp_match<LHS, RHS, Instruction::Or>(L, R);
2512}
2513
2514/// Matches L || R where L and R are arbitrary values.
2515inline auto m_LogicalOr() {
2516 return m_LogicalOr(m_Value(), m_Value());
2517}
2518
2519} // end namespace PatternMatch
2520} // end namespace llvm
2521
2522#endif // LLVM_IR_PATTERNMATCH_H