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