xref: /aosp_15_r20/external/llvm/unittests/IR/PatternMatch.cpp (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker //===---- llvm/unittest/IR/PatternMatch.cpp - PatternMatch unit tests ----===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker //                     The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker 
10*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/STLExtras.h"
11*9880d681SAndroid Build Coastguard Worker #include "llvm/Analysis/ValueTracking.h"
12*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/BasicBlock.h"
13*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Constants.h"
14*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/DataLayout.h"
15*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/DerivedTypes.h"
16*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Function.h"
17*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/IRBuilder.h"
18*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Instructions.h"
19*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/LLVMContext.h"
20*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/MDBuilder.h"
21*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Module.h"
22*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/NoFolder.h"
23*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Operator.h"
24*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/PatternMatch.h"
25*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Type.h"
26*9880d681SAndroid Build Coastguard Worker #include "gtest/gtest.h"
27*9880d681SAndroid Build Coastguard Worker 
28*9880d681SAndroid Build Coastguard Worker using namespace llvm;
29*9880d681SAndroid Build Coastguard Worker using namespace llvm::PatternMatch;
30*9880d681SAndroid Build Coastguard Worker 
31*9880d681SAndroid Build Coastguard Worker namespace {
32*9880d681SAndroid Build Coastguard Worker 
33*9880d681SAndroid Build Coastguard Worker struct PatternMatchTest : ::testing::Test {
34*9880d681SAndroid Build Coastguard Worker   LLVMContext Ctx;
35*9880d681SAndroid Build Coastguard Worker   std::unique_ptr<Module> M;
36*9880d681SAndroid Build Coastguard Worker   Function *F;
37*9880d681SAndroid Build Coastguard Worker   BasicBlock *BB;
38*9880d681SAndroid Build Coastguard Worker   IRBuilder<NoFolder> IRB;
39*9880d681SAndroid Build Coastguard Worker 
PatternMatchTest__anon134a02d90111::PatternMatchTest40*9880d681SAndroid Build Coastguard Worker   PatternMatchTest()
41*9880d681SAndroid Build Coastguard Worker       : M(new Module("PatternMatchTestModule", Ctx)),
42*9880d681SAndroid Build Coastguard Worker         F(Function::Create(
43*9880d681SAndroid Build Coastguard Worker             FunctionType::get(Type::getVoidTy(Ctx), /* IsVarArg */ false),
44*9880d681SAndroid Build Coastguard Worker             Function::ExternalLinkage, "f", M.get())),
45*9880d681SAndroid Build Coastguard Worker         BB(BasicBlock::Create(Ctx, "entry", F)), IRB(BB) {}
46*9880d681SAndroid Build Coastguard Worker };
47*9880d681SAndroid Build Coastguard Worker 
TEST_F(PatternMatchTest,OneUse)48*9880d681SAndroid Build Coastguard Worker TEST_F(PatternMatchTest, OneUse) {
49*9880d681SAndroid Build Coastguard Worker   // Build up a little tree of values:
50*9880d681SAndroid Build Coastguard Worker   //
51*9880d681SAndroid Build Coastguard Worker   //   One  = (1 + 2) + 42
52*9880d681SAndroid Build Coastguard Worker   //   Two  = One + 42
53*9880d681SAndroid Build Coastguard Worker   //   Leaf = (Two + 8) + (Two + 13)
54*9880d681SAndroid Build Coastguard Worker   Value *One = IRB.CreateAdd(IRB.CreateAdd(IRB.getInt32(1), IRB.getInt32(2)),
55*9880d681SAndroid Build Coastguard Worker                              IRB.getInt32(42));
56*9880d681SAndroid Build Coastguard Worker   Value *Two = IRB.CreateAdd(One, IRB.getInt32(42));
57*9880d681SAndroid Build Coastguard Worker   Value *Leaf = IRB.CreateAdd(IRB.CreateAdd(Two, IRB.getInt32(8)),
58*9880d681SAndroid Build Coastguard Worker                               IRB.CreateAdd(Two, IRB.getInt32(13)));
59*9880d681SAndroid Build Coastguard Worker   Value *V;
60*9880d681SAndroid Build Coastguard Worker 
61*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(m_OneUse(m_Value(V)).match(One));
62*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(One, V);
63*9880d681SAndroid Build Coastguard Worker 
64*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(m_OneUse(m_Value()).match(Two));
65*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(m_OneUse(m_Value()).match(Leaf));
66*9880d681SAndroid Build Coastguard Worker }
67*9880d681SAndroid Build Coastguard Worker 
TEST_F(PatternMatchTest,FloatingPointOrderedMin)68*9880d681SAndroid Build Coastguard Worker TEST_F(PatternMatchTest, FloatingPointOrderedMin) {
69*9880d681SAndroid Build Coastguard Worker   Type *FltTy = IRB.getFloatTy();
70*9880d681SAndroid Build Coastguard Worker   Value *L = ConstantFP::get(FltTy, 1.0);
71*9880d681SAndroid Build Coastguard Worker   Value *R = ConstantFP::get(FltTy, 2.0);
72*9880d681SAndroid Build Coastguard Worker   Value *MatchL, *MatchR;
73*9880d681SAndroid Build Coastguard Worker 
74*9880d681SAndroid Build Coastguard Worker   // Test OLT.
75*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(m_OrdFMin(m_Value(MatchL), m_Value(MatchR))
76*9880d681SAndroid Build Coastguard Worker                   .match(IRB.CreateSelect(IRB.CreateFCmpOLT(L, R), L, R)));
77*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(L, MatchL);
78*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(R, MatchR);
79*9880d681SAndroid Build Coastguard Worker 
80*9880d681SAndroid Build Coastguard Worker   // Test OLE.
81*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(m_OrdFMin(m_Value(MatchL), m_Value(MatchR))
82*9880d681SAndroid Build Coastguard Worker                   .match(IRB.CreateSelect(IRB.CreateFCmpOLE(L, R), L, R)));
83*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(L, MatchL);
84*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(R, MatchR);
85*9880d681SAndroid Build Coastguard Worker 
86*9880d681SAndroid Build Coastguard Worker   // Test no match on OGE.
87*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(m_OrdFMin(m_Value(MatchL), m_Value(MatchR))
88*9880d681SAndroid Build Coastguard Worker                    .match(IRB.CreateSelect(IRB.CreateFCmpOGE(L, R), L, R)));
89*9880d681SAndroid Build Coastguard Worker 
90*9880d681SAndroid Build Coastguard Worker   // Test no match on OGT.
91*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(m_OrdFMin(m_Value(MatchL), m_Value(MatchR))
92*9880d681SAndroid Build Coastguard Worker                    .match(IRB.CreateSelect(IRB.CreateFCmpOGT(L, R), L, R)));
93*9880d681SAndroid Build Coastguard Worker 
94*9880d681SAndroid Build Coastguard Worker   // Test match on OGE with inverted select.
95*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(m_OrdFMin(m_Value(MatchL), m_Value(MatchR))
96*9880d681SAndroid Build Coastguard Worker                   .match(IRB.CreateSelect(IRB.CreateFCmpOGE(L, R), R, L)));
97*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(L, MatchL);
98*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(R, MatchR);
99*9880d681SAndroid Build Coastguard Worker 
100*9880d681SAndroid Build Coastguard Worker   // Test match on OGT with inverted select.
101*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(m_OrdFMin(m_Value(MatchL), m_Value(MatchR))
102*9880d681SAndroid Build Coastguard Worker                   .match(IRB.CreateSelect(IRB.CreateFCmpOGT(L, R), R, L)));
103*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(L, MatchL);
104*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(R, MatchR);
105*9880d681SAndroid Build Coastguard Worker }
106*9880d681SAndroid Build Coastguard Worker 
TEST_F(PatternMatchTest,FloatingPointOrderedMax)107*9880d681SAndroid Build Coastguard Worker TEST_F(PatternMatchTest, FloatingPointOrderedMax) {
108*9880d681SAndroid Build Coastguard Worker   Type *FltTy = IRB.getFloatTy();
109*9880d681SAndroid Build Coastguard Worker   Value *L = ConstantFP::get(FltTy, 1.0);
110*9880d681SAndroid Build Coastguard Worker   Value *R = ConstantFP::get(FltTy, 2.0);
111*9880d681SAndroid Build Coastguard Worker   Value *MatchL, *MatchR;
112*9880d681SAndroid Build Coastguard Worker 
113*9880d681SAndroid Build Coastguard Worker   // Test OGT.
114*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(m_OrdFMax(m_Value(MatchL), m_Value(MatchR))
115*9880d681SAndroid Build Coastguard Worker                   .match(IRB.CreateSelect(IRB.CreateFCmpOGT(L, R), L, R)));
116*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(L, MatchL);
117*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(R, MatchR);
118*9880d681SAndroid Build Coastguard Worker 
119*9880d681SAndroid Build Coastguard Worker   // Test OGE.
120*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(m_OrdFMax(m_Value(MatchL), m_Value(MatchR))
121*9880d681SAndroid Build Coastguard Worker                   .match(IRB.CreateSelect(IRB.CreateFCmpOGE(L, R), L, R)));
122*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(L, MatchL);
123*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(R, MatchR);
124*9880d681SAndroid Build Coastguard Worker 
125*9880d681SAndroid Build Coastguard Worker   // Test no match on OLE.
126*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(m_OrdFMax(m_Value(MatchL), m_Value(MatchR))
127*9880d681SAndroid Build Coastguard Worker                    .match(IRB.CreateSelect(IRB.CreateFCmpOLE(L, R), L, R)));
128*9880d681SAndroid Build Coastguard Worker 
129*9880d681SAndroid Build Coastguard Worker   // Test no match on OLT.
130*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(m_OrdFMax(m_Value(MatchL), m_Value(MatchR))
131*9880d681SAndroid Build Coastguard Worker                    .match(IRB.CreateSelect(IRB.CreateFCmpOLT(L, R), L, R)));
132*9880d681SAndroid Build Coastguard Worker 
133*9880d681SAndroid Build Coastguard Worker   // Test match on OLE with inverted select.
134*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(m_OrdFMax(m_Value(MatchL), m_Value(MatchR))
135*9880d681SAndroid Build Coastguard Worker                   .match(IRB.CreateSelect(IRB.CreateFCmpOLE(L, R), R, L)));
136*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(L, MatchL);
137*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(R, MatchR);
138*9880d681SAndroid Build Coastguard Worker 
139*9880d681SAndroid Build Coastguard Worker   // Test match on OLT with inverted select.
140*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(m_OrdFMax(m_Value(MatchL), m_Value(MatchR))
141*9880d681SAndroid Build Coastguard Worker                   .match(IRB.CreateSelect(IRB.CreateFCmpOLT(L, R), R, L)));
142*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(L, MatchL);
143*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(R, MatchR);
144*9880d681SAndroid Build Coastguard Worker }
145*9880d681SAndroid Build Coastguard Worker 
TEST_F(PatternMatchTest,FloatingPointUnorderedMin)146*9880d681SAndroid Build Coastguard Worker TEST_F(PatternMatchTest, FloatingPointUnorderedMin) {
147*9880d681SAndroid Build Coastguard Worker   Type *FltTy = IRB.getFloatTy();
148*9880d681SAndroid Build Coastguard Worker   Value *L = ConstantFP::get(FltTy, 1.0);
149*9880d681SAndroid Build Coastguard Worker   Value *R = ConstantFP::get(FltTy, 2.0);
150*9880d681SAndroid Build Coastguard Worker   Value *MatchL, *MatchR;
151*9880d681SAndroid Build Coastguard Worker 
152*9880d681SAndroid Build Coastguard Worker   // Test ULT.
153*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(m_UnordFMin(m_Value(MatchL), m_Value(MatchR))
154*9880d681SAndroid Build Coastguard Worker                   .match(IRB.CreateSelect(IRB.CreateFCmpULT(L, R), L, R)));
155*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(L, MatchL);
156*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(R, MatchR);
157*9880d681SAndroid Build Coastguard Worker 
158*9880d681SAndroid Build Coastguard Worker   // Test ULE.
159*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(m_UnordFMin(m_Value(MatchL), m_Value(MatchR))
160*9880d681SAndroid Build Coastguard Worker                   .match(IRB.CreateSelect(IRB.CreateFCmpULE(L, R), L, R)));
161*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(L, MatchL);
162*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(R, MatchR);
163*9880d681SAndroid Build Coastguard Worker 
164*9880d681SAndroid Build Coastguard Worker   // Test no match on UGE.
165*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(m_UnordFMin(m_Value(MatchL), m_Value(MatchR))
166*9880d681SAndroid Build Coastguard Worker                    .match(IRB.CreateSelect(IRB.CreateFCmpUGE(L, R), L, R)));
167*9880d681SAndroid Build Coastguard Worker 
168*9880d681SAndroid Build Coastguard Worker   // Test no match on UGT.
169*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(m_UnordFMin(m_Value(MatchL), m_Value(MatchR))
170*9880d681SAndroid Build Coastguard Worker                    .match(IRB.CreateSelect(IRB.CreateFCmpUGT(L, R), L, R)));
171*9880d681SAndroid Build Coastguard Worker 
172*9880d681SAndroid Build Coastguard Worker   // Test match on UGE with inverted select.
173*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(m_UnordFMin(m_Value(MatchL), m_Value(MatchR))
174*9880d681SAndroid Build Coastguard Worker                   .match(IRB.CreateSelect(IRB.CreateFCmpUGE(L, R), R, L)));
175*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(L, MatchL);
176*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(R, MatchR);
177*9880d681SAndroid Build Coastguard Worker 
178*9880d681SAndroid Build Coastguard Worker   // Test match on UGT with inverted select.
179*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(m_UnordFMin(m_Value(MatchL), m_Value(MatchR))
180*9880d681SAndroid Build Coastguard Worker                   .match(IRB.CreateSelect(IRB.CreateFCmpUGT(L, R), R, L)));
181*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(L, MatchL);
182*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(R, MatchR);
183*9880d681SAndroid Build Coastguard Worker }
184*9880d681SAndroid Build Coastguard Worker 
TEST_F(PatternMatchTest,FloatingPointUnorderedMax)185*9880d681SAndroid Build Coastguard Worker TEST_F(PatternMatchTest, FloatingPointUnorderedMax) {
186*9880d681SAndroid Build Coastguard Worker   Type *FltTy = IRB.getFloatTy();
187*9880d681SAndroid Build Coastguard Worker   Value *L = ConstantFP::get(FltTy, 1.0);
188*9880d681SAndroid Build Coastguard Worker   Value *R = ConstantFP::get(FltTy, 2.0);
189*9880d681SAndroid Build Coastguard Worker   Value *MatchL, *MatchR;
190*9880d681SAndroid Build Coastguard Worker 
191*9880d681SAndroid Build Coastguard Worker   // Test UGT.
192*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(m_UnordFMax(m_Value(MatchL), m_Value(MatchR))
193*9880d681SAndroid Build Coastguard Worker                   .match(IRB.CreateSelect(IRB.CreateFCmpUGT(L, R), L, R)));
194*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(L, MatchL);
195*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(R, MatchR);
196*9880d681SAndroid Build Coastguard Worker 
197*9880d681SAndroid Build Coastguard Worker   // Test UGE.
198*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(m_UnordFMax(m_Value(MatchL), m_Value(MatchR))
199*9880d681SAndroid Build Coastguard Worker                   .match(IRB.CreateSelect(IRB.CreateFCmpUGE(L, R), L, R)));
200*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(L, MatchL);
201*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(R, MatchR);
202*9880d681SAndroid Build Coastguard Worker 
203*9880d681SAndroid Build Coastguard Worker   // Test no match on ULE.
204*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(m_UnordFMax(m_Value(MatchL), m_Value(MatchR))
205*9880d681SAndroid Build Coastguard Worker                    .match(IRB.CreateSelect(IRB.CreateFCmpULE(L, R), L, R)));
206*9880d681SAndroid Build Coastguard Worker 
207*9880d681SAndroid Build Coastguard Worker   // Test no match on ULT.
208*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(m_UnordFMax(m_Value(MatchL), m_Value(MatchR))
209*9880d681SAndroid Build Coastguard Worker                    .match(IRB.CreateSelect(IRB.CreateFCmpULT(L, R), L, R)));
210*9880d681SAndroid Build Coastguard Worker 
211*9880d681SAndroid Build Coastguard Worker   // Test match on ULE with inverted select.
212*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(m_UnordFMax(m_Value(MatchL), m_Value(MatchR))
213*9880d681SAndroid Build Coastguard Worker                   .match(IRB.CreateSelect(IRB.CreateFCmpULE(L, R), R, L)));
214*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(L, MatchL);
215*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(R, MatchR);
216*9880d681SAndroid Build Coastguard Worker 
217*9880d681SAndroid Build Coastguard Worker   // Test match on ULT with inverted select.
218*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(m_UnordFMax(m_Value(MatchL), m_Value(MatchR))
219*9880d681SAndroid Build Coastguard Worker                   .match(IRB.CreateSelect(IRB.CreateFCmpULT(L, R), R, L)));
220*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(L, MatchL);
221*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(R, MatchR);
222*9880d681SAndroid Build Coastguard Worker }
223*9880d681SAndroid Build Coastguard Worker 
TEST_F(PatternMatchTest,OverflowingBinOps)224*9880d681SAndroid Build Coastguard Worker TEST_F(PatternMatchTest, OverflowingBinOps) {
225*9880d681SAndroid Build Coastguard Worker   Value *L = IRB.getInt32(1);
226*9880d681SAndroid Build Coastguard Worker   Value *R = IRB.getInt32(2);
227*9880d681SAndroid Build Coastguard Worker   Value *MatchL, *MatchR;
228*9880d681SAndroid Build Coastguard Worker 
229*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(
230*9880d681SAndroid Build Coastguard Worker       m_NSWAdd(m_Value(MatchL), m_Value(MatchR)).match(IRB.CreateNSWAdd(L, R)));
231*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(L, MatchL);
232*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(R, MatchR);
233*9880d681SAndroid Build Coastguard Worker   MatchL = MatchR = nullptr;
234*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(
235*9880d681SAndroid Build Coastguard Worker       m_NSWSub(m_Value(MatchL), m_Value(MatchR)).match(IRB.CreateNSWSub(L, R)));
236*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(L, MatchL);
237*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(R, MatchR);
238*9880d681SAndroid Build Coastguard Worker   MatchL = MatchR = nullptr;
239*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(
240*9880d681SAndroid Build Coastguard Worker       m_NSWMul(m_Value(MatchL), m_Value(MatchR)).match(IRB.CreateNSWMul(L, R)));
241*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(L, MatchL);
242*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(R, MatchR);
243*9880d681SAndroid Build Coastguard Worker   MatchL = MatchR = nullptr;
244*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(m_NSWShl(m_Value(MatchL), m_Value(MatchR)).match(
245*9880d681SAndroid Build Coastguard Worker       IRB.CreateShl(L, R, "", /* NUW */ false, /* NSW */ true)));
246*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(L, MatchL);
247*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(R, MatchR);
248*9880d681SAndroid Build Coastguard Worker 
249*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(
250*9880d681SAndroid Build Coastguard Worker       m_NUWAdd(m_Value(MatchL), m_Value(MatchR)).match(IRB.CreateNUWAdd(L, R)));
251*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(L, MatchL);
252*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(R, MatchR);
253*9880d681SAndroid Build Coastguard Worker   MatchL = MatchR = nullptr;
254*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(
255*9880d681SAndroid Build Coastguard Worker       m_NUWSub(m_Value(MatchL), m_Value(MatchR)).match(IRB.CreateNUWSub(L, R)));
256*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(L, MatchL);
257*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(R, MatchR);
258*9880d681SAndroid Build Coastguard Worker   MatchL = MatchR = nullptr;
259*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(
260*9880d681SAndroid Build Coastguard Worker       m_NUWMul(m_Value(MatchL), m_Value(MatchR)).match(IRB.CreateNUWMul(L, R)));
261*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(L, MatchL);
262*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(R, MatchR);
263*9880d681SAndroid Build Coastguard Worker   MatchL = MatchR = nullptr;
264*9880d681SAndroid Build Coastguard Worker   EXPECT_TRUE(m_NUWShl(m_Value(MatchL), m_Value(MatchR)).match(
265*9880d681SAndroid Build Coastguard Worker       IRB.CreateShl(L, R, "", /* NUW */ true, /* NSW */ false)));
266*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(L, MatchL);
267*9880d681SAndroid Build Coastguard Worker   EXPECT_EQ(R, MatchR);
268*9880d681SAndroid Build Coastguard Worker 
269*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(m_NSWAdd(m_Value(), m_Value()).match(IRB.CreateAdd(L, R)));
270*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(m_NSWAdd(m_Value(), m_Value()).match(IRB.CreateNUWAdd(L, R)));
271*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(m_NSWAdd(m_Value(), m_Value()).match(IRB.CreateNSWSub(L, R)));
272*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(m_NSWSub(m_Value(), m_Value()).match(IRB.CreateSub(L, R)));
273*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(m_NSWSub(m_Value(), m_Value()).match(IRB.CreateNUWSub(L, R)));
274*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(m_NSWSub(m_Value(), m_Value()).match(IRB.CreateNSWAdd(L, R)));
275*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(m_NSWMul(m_Value(), m_Value()).match(IRB.CreateMul(L, R)));
276*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(m_NSWMul(m_Value(), m_Value()).match(IRB.CreateNUWMul(L, R)));
277*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(m_NSWMul(m_Value(), m_Value()).match(IRB.CreateNSWAdd(L, R)));
278*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(m_NSWShl(m_Value(), m_Value()).match(IRB.CreateShl(L, R)));
279*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(m_NSWShl(m_Value(), m_Value()).match(
280*9880d681SAndroid Build Coastguard Worker       IRB.CreateShl(L, R, "", /* NUW */ true, /* NSW */ false)));
281*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(m_NSWShl(m_Value(), m_Value()).match(IRB.CreateNSWAdd(L, R)));
282*9880d681SAndroid Build Coastguard Worker 
283*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(m_NUWAdd(m_Value(), m_Value()).match(IRB.CreateAdd(L, R)));
284*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(m_NUWAdd(m_Value(), m_Value()).match(IRB.CreateNSWAdd(L, R)));
285*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(m_NUWAdd(m_Value(), m_Value()).match(IRB.CreateNUWSub(L, R)));
286*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(m_NUWSub(m_Value(), m_Value()).match(IRB.CreateSub(L, R)));
287*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(m_NUWSub(m_Value(), m_Value()).match(IRB.CreateNSWSub(L, R)));
288*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(m_NUWSub(m_Value(), m_Value()).match(IRB.CreateNUWAdd(L, R)));
289*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(m_NUWMul(m_Value(), m_Value()).match(IRB.CreateMul(L, R)));
290*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(m_NUWMul(m_Value(), m_Value()).match(IRB.CreateNSWMul(L, R)));
291*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(m_NUWMul(m_Value(), m_Value()).match(IRB.CreateNUWAdd(L, R)));
292*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(m_NUWShl(m_Value(), m_Value()).match(IRB.CreateShl(L, R)));
293*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(m_NUWShl(m_Value(), m_Value()).match(
294*9880d681SAndroid Build Coastguard Worker       IRB.CreateShl(L, R, "", /* NUW */ false, /* NSW */ true)));
295*9880d681SAndroid Build Coastguard Worker   EXPECT_FALSE(m_NUWShl(m_Value(), m_Value()).match(IRB.CreateNUWAdd(L, R)));
296*9880d681SAndroid Build Coastguard Worker }
297*9880d681SAndroid Build Coastguard Worker 
298*9880d681SAndroid Build Coastguard Worker } // anonymous namespace.
299