blob: 150f1657b9c21dbd0281bec539ad575bd191645c [file] [log] [blame]
Arnold Schwaighofere972d032013-05-05 01:54:46 +00001//===---- llvm/unittest/IR/PatternMatch.cpp - PatternMatch unit tests ----===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "llvm/ADT/STLExtras.h"
11#include "llvm/Analysis/ValueTracking.h"
12#include "llvm/IR/BasicBlock.h"
13#include "llvm/IR/Constants.h"
14#include "llvm/IR/DataLayout.h"
15#include "llvm/IR/DerivedTypes.h"
Chandler Carruth4603e96a2014-01-05 02:07:20 +000016#include "llvm/IR/Function.h"
Arnold Schwaighofere972d032013-05-05 01:54:46 +000017#include "llvm/IR/IRBuilder.h"
Chandler Carruth4603e96a2014-01-05 02:07:20 +000018#include "llvm/IR/Instructions.h"
Arnold Schwaighofere972d032013-05-05 01:54:46 +000019#include "llvm/IR/LLVMContext.h"
20#include "llvm/IR/MDBuilder.h"
Chandler Carruth4603e96a2014-01-05 02:07:20 +000021#include "llvm/IR/Module.h"
Arnold Schwaighofere972d032013-05-05 01:54:46 +000022#include "llvm/IR/Operator.h"
Chandler Carruth4603e96a2014-01-05 02:07:20 +000023#include "llvm/IR/Type.h"
Arnold Schwaighofere972d032013-05-05 01:54:46 +000024#include "llvm/Support/NoFolder.h"
25#include "llvm/Support/PatternMatch.h"
26#include "gtest/gtest.h"
27
Chandler Carruth4603e96a2014-01-05 02:07:20 +000028using namespace llvm;
Arnold Schwaighofere972d032013-05-05 01:54:46 +000029using namespace llvm::PatternMatch;
30
Arnold Schwaighofere972d032013-05-05 01:54:46 +000031namespace {
32
Chandler Carruth4603e96a2014-01-05 02:07:20 +000033struct PatternMatchTest : ::testing::Test {
34 LLVMContext Ctx;
35 OwningPtr<Module> M;
36 Function *F;
37 BasicBlock *BB;
Chandler Carruth91f4e602014-01-05 02:23:11 +000038 IRBuilder<true, NoFolder> IRB;
Arnold Schwaighofere972d032013-05-05 01:54:46 +000039
Chandler Carruth4603e96a2014-01-05 02:07:20 +000040 PatternMatchTest()
41 : M(new Module("PatternMatchTestModule", Ctx)),
42 F(Function::Create(
43 FunctionType::get(Type::getVoidTy(Ctx), /* IsVarArg */ false),
44 Function::ExternalLinkage, "f", M.get())),
Chandler Carruth91f4e602014-01-05 02:23:11 +000045 BB(BasicBlock::Create(Ctx, "entry", F)), IRB(BB) {}
Chandler Carruth4603e96a2014-01-05 02:07:20 +000046};
Arnold Schwaighofere972d032013-05-05 01:54:46 +000047
Chandler Carruth4603e96a2014-01-05 02:07:20 +000048TEST_F(PatternMatchTest, FloatingPointOrderedMin) {
Chandler Carruth91f4e602014-01-05 02:23:11 +000049 Type *FltTy = IRB.getFloatTy();
Arnold Schwaighofere972d032013-05-05 01:54:46 +000050 Value *L = ConstantFP::get(FltTy, 1.0);
51 Value *R = ConstantFP::get(FltTy, 2.0);
Chandler Carruth4603e96a2014-01-05 02:07:20 +000052 Value *MatchL, *MatchR;
Arnold Schwaighofere972d032013-05-05 01:54:46 +000053
54 // Test OLT.
Chandler Carruth91f4e602014-01-05 02:23:11 +000055 EXPECT_TRUE(m_OrdFMin(m_Value(MatchL), m_Value(MatchR))
56 .match(IRB.CreateSelect(IRB.CreateFCmpOLT(L, R), L, R)));
Chandler Carruth4603e96a2014-01-05 02:07:20 +000057 EXPECT_EQ(L, MatchL);
58 EXPECT_EQ(R, MatchR);
Arnold Schwaighofere972d032013-05-05 01:54:46 +000059
60 // Test OLE.
Chandler Carruth91f4e602014-01-05 02:23:11 +000061 EXPECT_TRUE(m_OrdFMin(m_Value(MatchL), m_Value(MatchR))
62 .match(IRB.CreateSelect(IRB.CreateFCmpOLE(L, R), L, R)));
Chandler Carruth4603e96a2014-01-05 02:07:20 +000063 EXPECT_EQ(L, MatchL);
64 EXPECT_EQ(R, MatchR);
Arnold Schwaighofere972d032013-05-05 01:54:46 +000065
66 // Test no match on OGE.
Chandler Carruth91f4e602014-01-05 02:23:11 +000067 EXPECT_FALSE(m_OrdFMin(m_Value(MatchL), m_Value(MatchR))
68 .match(IRB.CreateSelect(IRB.CreateFCmpOGE(L, R), L, R)));
Arnold Schwaighofere972d032013-05-05 01:54:46 +000069
70 // Test no match on OGT.
Chandler Carruth91f4e602014-01-05 02:23:11 +000071 EXPECT_FALSE(m_OrdFMin(m_Value(MatchL), m_Value(MatchR))
72 .match(IRB.CreateSelect(IRB.CreateFCmpOGT(L, R), L, R)));
Arnold Schwaighofere972d032013-05-05 01:54:46 +000073
74 // Test match on OGE with inverted select.
Chandler Carruth91f4e602014-01-05 02:23:11 +000075 EXPECT_TRUE(m_OrdFMin(m_Value(MatchL), m_Value(MatchR))
76 .match(IRB.CreateSelect(IRB.CreateFCmpOGE(L, R), R, L)));
Chandler Carruth4603e96a2014-01-05 02:07:20 +000077 EXPECT_EQ(L, MatchL);
78 EXPECT_EQ(R, MatchR);
Arnold Schwaighofere972d032013-05-05 01:54:46 +000079
80 // Test match on OGT with inverted select.
Chandler Carruth91f4e602014-01-05 02:23:11 +000081 EXPECT_TRUE(m_OrdFMin(m_Value(MatchL), m_Value(MatchR))
82 .match(IRB.CreateSelect(IRB.CreateFCmpOGT(L, R), R, L)));
Chandler Carruth4603e96a2014-01-05 02:07:20 +000083 EXPECT_EQ(L, MatchL);
84 EXPECT_EQ(R, MatchR);
Arnold Schwaighofere972d032013-05-05 01:54:46 +000085}
86
Chandler Carruth4603e96a2014-01-05 02:07:20 +000087TEST_F(PatternMatchTest, FloatingPointOrderedMax) {
Chandler Carruth91f4e602014-01-05 02:23:11 +000088 Type *FltTy = IRB.getFloatTy();
Arnold Schwaighofere972d032013-05-05 01:54:46 +000089 Value *L = ConstantFP::get(FltTy, 1.0);
90 Value *R = ConstantFP::get(FltTy, 2.0);
Chandler Carruth4603e96a2014-01-05 02:07:20 +000091 Value *MatchL, *MatchR;
Arnold Schwaighofere972d032013-05-05 01:54:46 +000092
93 // Test OGT.
Chandler Carruth91f4e602014-01-05 02:23:11 +000094 EXPECT_TRUE(m_OrdFMax(m_Value(MatchL), m_Value(MatchR))
95 .match(IRB.CreateSelect(IRB.CreateFCmpOGT(L, R), L, R)));
Chandler Carruth4603e96a2014-01-05 02:07:20 +000096 EXPECT_EQ(L, MatchL);
97 EXPECT_EQ(R, MatchR);
Arnold Schwaighofere972d032013-05-05 01:54:46 +000098
99 // Test OGE.
Chandler Carruth91f4e602014-01-05 02:23:11 +0000100 EXPECT_TRUE(m_OrdFMax(m_Value(MatchL), m_Value(MatchR))
101 .match(IRB.CreateSelect(IRB.CreateFCmpOGE(L, R), L, R)));
Chandler Carruth4603e96a2014-01-05 02:07:20 +0000102 EXPECT_EQ(L, MatchL);
103 EXPECT_EQ(R, MatchR);
Arnold Schwaighofere972d032013-05-05 01:54:46 +0000104
105 // Test no match on OLE.
Chandler Carruth91f4e602014-01-05 02:23:11 +0000106 EXPECT_FALSE(m_OrdFMax(m_Value(MatchL), m_Value(MatchR))
107 .match(IRB.CreateSelect(IRB.CreateFCmpOLE(L, R), L, R)));
Arnold Schwaighofere972d032013-05-05 01:54:46 +0000108
109 // Test no match on OLT.
Chandler Carruth91f4e602014-01-05 02:23:11 +0000110 EXPECT_FALSE(m_OrdFMax(m_Value(MatchL), m_Value(MatchR))
111 .match(IRB.CreateSelect(IRB.CreateFCmpOLT(L, R), L, R)));
Arnold Schwaighofere972d032013-05-05 01:54:46 +0000112
113 // Test match on OLE with inverted select.
Chandler Carruth91f4e602014-01-05 02:23:11 +0000114 EXPECT_TRUE(m_OrdFMax(m_Value(MatchL), m_Value(MatchR))
115 .match(IRB.CreateSelect(IRB.CreateFCmpOLE(L, R), R, L)));
Chandler Carruth4603e96a2014-01-05 02:07:20 +0000116 EXPECT_EQ(L, MatchL);
117 EXPECT_EQ(R, MatchR);
Arnold Schwaighofere972d032013-05-05 01:54:46 +0000118
119 // Test match on OLT with inverted select.
Chandler Carruth91f4e602014-01-05 02:23:11 +0000120 EXPECT_TRUE(m_OrdFMax(m_Value(MatchL), m_Value(MatchR))
121 .match(IRB.CreateSelect(IRB.CreateFCmpOLT(L, R), R, L)));
Arnold Schwaighofere972d032013-05-05 01:54:46 +0000122 EXPECT_EQ(L, MatchL);
123 EXPECT_EQ(R, MatchR);
Arnold Schwaighofere972d032013-05-05 01:54:46 +0000124}
125
Chandler Carruth4603e96a2014-01-05 02:07:20 +0000126TEST_F(PatternMatchTest, FloatingPointUnorderedMin) {
Chandler Carruth91f4e602014-01-05 02:23:11 +0000127 Type *FltTy = IRB.getFloatTy();
Arnold Schwaighofere972d032013-05-05 01:54:46 +0000128 Value *L = ConstantFP::get(FltTy, 1.0);
129 Value *R = ConstantFP::get(FltTy, 2.0);
Chandler Carruth4603e96a2014-01-05 02:07:20 +0000130 Value *MatchL, *MatchR;
Arnold Schwaighofere972d032013-05-05 01:54:46 +0000131
132 // Test ULT.
Chandler Carruth91f4e602014-01-05 02:23:11 +0000133 EXPECT_TRUE(m_UnordFMin(m_Value(MatchL), m_Value(MatchR))
134 .match(IRB.CreateSelect(IRB.CreateFCmpULT(L, R), L, R)));
Chandler Carruth4603e96a2014-01-05 02:07:20 +0000135 EXPECT_EQ(L, MatchL);
136 EXPECT_EQ(R, MatchR);
Arnold Schwaighofere972d032013-05-05 01:54:46 +0000137
138 // Test ULE.
Chandler Carruth91f4e602014-01-05 02:23:11 +0000139 EXPECT_TRUE(m_UnordFMin(m_Value(MatchL), m_Value(MatchR))
140 .match(IRB.CreateSelect(IRB.CreateFCmpULE(L, R), L, R)));
Chandler Carruth4603e96a2014-01-05 02:07:20 +0000141 EXPECT_EQ(L, MatchL);
142 EXPECT_EQ(R, MatchR);
Arnold Schwaighofere972d032013-05-05 01:54:46 +0000143
144 // Test no match on UGE.
Chandler Carruth91f4e602014-01-05 02:23:11 +0000145 EXPECT_FALSE(m_UnordFMin(m_Value(MatchL), m_Value(MatchR))
146 .match(IRB.CreateSelect(IRB.CreateFCmpUGE(L, R), L, R)));
Arnold Schwaighofere972d032013-05-05 01:54:46 +0000147
148 // Test no match on UGT.
Chandler Carruth91f4e602014-01-05 02:23:11 +0000149 EXPECT_FALSE(m_UnordFMin(m_Value(MatchL), m_Value(MatchR))
150 .match(IRB.CreateSelect(IRB.CreateFCmpUGT(L, R), L, R)));
Arnold Schwaighofere972d032013-05-05 01:54:46 +0000151
152 // Test match on UGE with inverted select.
Chandler Carruth91f4e602014-01-05 02:23:11 +0000153 EXPECT_TRUE(m_UnordFMin(m_Value(MatchL), m_Value(MatchR))
154 .match(IRB.CreateSelect(IRB.CreateFCmpUGE(L, R), R, L)));
Chandler Carruth4603e96a2014-01-05 02:07:20 +0000155 EXPECT_EQ(L, MatchL);
156 EXPECT_EQ(R, MatchR);
Arnold Schwaighofere972d032013-05-05 01:54:46 +0000157
158 // Test match on UGT with inverted select.
Chandler Carruth91f4e602014-01-05 02:23:11 +0000159 EXPECT_TRUE(m_UnordFMin(m_Value(MatchL), m_Value(MatchR))
160 .match(IRB.CreateSelect(IRB.CreateFCmpUGT(L, R), R, L)));
Chandler Carruth4603e96a2014-01-05 02:07:20 +0000161 EXPECT_EQ(L, MatchL);
162 EXPECT_EQ(R, MatchR);
Arnold Schwaighofere972d032013-05-05 01:54:46 +0000163}
164
Chandler Carruth4603e96a2014-01-05 02:07:20 +0000165TEST_F(PatternMatchTest, FloatingPointUnorderedMax) {
Chandler Carruth91f4e602014-01-05 02:23:11 +0000166 Type *FltTy = IRB.getFloatTy();
Arnold Schwaighofere972d032013-05-05 01:54:46 +0000167 Value *L = ConstantFP::get(FltTy, 1.0);
168 Value *R = ConstantFP::get(FltTy, 2.0);
Chandler Carruth4603e96a2014-01-05 02:07:20 +0000169 Value *MatchL, *MatchR;
Arnold Schwaighofere972d032013-05-05 01:54:46 +0000170
171 // Test UGT.
Chandler Carruth91f4e602014-01-05 02:23:11 +0000172 EXPECT_TRUE(m_UnordFMax(m_Value(MatchL), m_Value(MatchR))
173 .match(IRB.CreateSelect(IRB.CreateFCmpUGT(L, R), L, R)));
Chandler Carruth4603e96a2014-01-05 02:07:20 +0000174 EXPECT_EQ(L, MatchL);
175 EXPECT_EQ(R, MatchR);
Arnold Schwaighofere972d032013-05-05 01:54:46 +0000176
177 // Test UGE.
Chandler Carruth91f4e602014-01-05 02:23:11 +0000178 EXPECT_TRUE(m_UnordFMax(m_Value(MatchL), m_Value(MatchR))
179 .match(IRB.CreateSelect(IRB.CreateFCmpUGE(L, R), L, R)));
Chandler Carruth4603e96a2014-01-05 02:07:20 +0000180 EXPECT_EQ(L, MatchL);
181 EXPECT_EQ(R, MatchR);
Arnold Schwaighofere972d032013-05-05 01:54:46 +0000182
183 // Test no match on ULE.
Chandler Carruth91f4e602014-01-05 02:23:11 +0000184 EXPECT_FALSE(m_UnordFMax(m_Value(MatchL), m_Value(MatchR))
185 .match(IRB.CreateSelect(IRB.CreateFCmpULE(L, R), L, R)));
Arnold Schwaighofere972d032013-05-05 01:54:46 +0000186
187 // Test no match on ULT.
Chandler Carruth91f4e602014-01-05 02:23:11 +0000188 EXPECT_FALSE(m_UnordFMax(m_Value(MatchL), m_Value(MatchR))
189 .match(IRB.CreateSelect(IRB.CreateFCmpULT(L, R), L, R)));
Arnold Schwaighofere972d032013-05-05 01:54:46 +0000190
191 // Test match on ULE with inverted select.
Chandler Carruth91f4e602014-01-05 02:23:11 +0000192 EXPECT_TRUE(m_UnordFMax(m_Value(MatchL), m_Value(MatchR))
193 .match(IRB.CreateSelect(IRB.CreateFCmpULE(L, R), R, L)));
Chandler Carruth4603e96a2014-01-05 02:07:20 +0000194 EXPECT_EQ(L, MatchL);
195 EXPECT_EQ(R, MatchR);
Arnold Schwaighofere972d032013-05-05 01:54:46 +0000196
197 // Test match on ULT with inverted select.
Chandler Carruth91f4e602014-01-05 02:23:11 +0000198 EXPECT_TRUE(m_UnordFMax(m_Value(MatchL), m_Value(MatchR))
199 .match(IRB.CreateSelect(IRB.CreateFCmpULT(L, R), R, L)));
Chandler Carruth4603e96a2014-01-05 02:07:20 +0000200 EXPECT_EQ(L, MatchL);
201 EXPECT_EQ(R, MatchR);
Arnold Schwaighofere972d032013-05-05 01:54:46 +0000202}
203
Chandler Carruthc77d50a2014-01-05 03:28:29 +0000204TEST_F(PatternMatchTest, OverflowingBinOps) {
205 Value *L = IRB.getInt32(1);
206 Value *R = IRB.getInt32(2);
207 Value *MatchL, *MatchR;
208
209 EXPECT_TRUE(
210 m_NSWAdd(m_Value(MatchL), m_Value(MatchR)).match(IRB.CreateNSWAdd(L, R)));
211 EXPECT_EQ(L, MatchL);
212 EXPECT_EQ(R, MatchR);
213 MatchL = MatchR = 0;
214 EXPECT_TRUE(
215 m_NSWSub(m_Value(MatchL), m_Value(MatchR)).match(IRB.CreateNSWSub(L, R)));
216 EXPECT_EQ(L, MatchL);
217 EXPECT_EQ(R, MatchR);
218 MatchL = MatchR = 0;
219 EXPECT_TRUE(
220 m_NSWMul(m_Value(MatchL), m_Value(MatchR)).match(IRB.CreateNSWMul(L, R)));
221 EXPECT_EQ(L, MatchL);
222 EXPECT_EQ(R, MatchR);
223 MatchL = MatchR = 0;
224 EXPECT_TRUE(m_NSWShl(m_Value(MatchL), m_Value(MatchR)).match(
225 IRB.CreateShl(L, R, "", /* NUW */ false, /* NSW */ true)));
226 EXPECT_EQ(L, MatchL);
227 EXPECT_EQ(R, MatchR);
228
229 EXPECT_TRUE(
230 m_NUWAdd(m_Value(MatchL), m_Value(MatchR)).match(IRB.CreateNUWAdd(L, R)));
231 EXPECT_EQ(L, MatchL);
232 EXPECT_EQ(R, MatchR);
233 MatchL = MatchR = 0;
234 EXPECT_TRUE(
235 m_NUWSub(m_Value(MatchL), m_Value(MatchR)).match(IRB.CreateNUWSub(L, R)));
236 EXPECT_EQ(L, MatchL);
237 EXPECT_EQ(R, MatchR);
238 MatchL = MatchR = 0;
239 EXPECT_TRUE(
240 m_NUWMul(m_Value(MatchL), m_Value(MatchR)).match(IRB.CreateNUWMul(L, R)));
241 EXPECT_EQ(L, MatchL);
242 EXPECT_EQ(R, MatchR);
243 MatchL = MatchR = 0;
244 EXPECT_TRUE(m_NUWShl(m_Value(MatchL), m_Value(MatchR)).match(
245 IRB.CreateShl(L, R, "", /* NUW */ true, /* NSW */ false)));
246 EXPECT_EQ(L, MatchL);
247 EXPECT_EQ(R, MatchR);
248
249 EXPECT_FALSE(m_NSWAdd(m_Value(), m_Value()).match(IRB.CreateAdd(L, R)));
250 EXPECT_FALSE(m_NSWAdd(m_Value(), m_Value()).match(IRB.CreateNUWAdd(L, R)));
251 EXPECT_FALSE(m_NSWAdd(m_Value(), m_Value()).match(IRB.CreateNSWSub(L, R)));
252 EXPECT_FALSE(m_NSWSub(m_Value(), m_Value()).match(IRB.CreateSub(L, R)));
253 EXPECT_FALSE(m_NSWSub(m_Value(), m_Value()).match(IRB.CreateNUWSub(L, R)));
254 EXPECT_FALSE(m_NSWSub(m_Value(), m_Value()).match(IRB.CreateNSWAdd(L, R)));
255 EXPECT_FALSE(m_NSWMul(m_Value(), m_Value()).match(IRB.CreateMul(L, R)));
256 EXPECT_FALSE(m_NSWMul(m_Value(), m_Value()).match(IRB.CreateNUWMul(L, R)));
257 EXPECT_FALSE(m_NSWMul(m_Value(), m_Value()).match(IRB.CreateNSWAdd(L, R)));
258 EXPECT_FALSE(m_NSWShl(m_Value(), m_Value()).match(IRB.CreateShl(L, R)));
259 EXPECT_FALSE(m_NSWShl(m_Value(), m_Value()).match(
260 IRB.CreateShl(L, R, "", /* NUW */ true, /* NSW */ false)));
261 EXPECT_FALSE(m_NSWShl(m_Value(), m_Value()).match(IRB.CreateNSWAdd(L, R)));
262
263 EXPECT_FALSE(m_NUWAdd(m_Value(), m_Value()).match(IRB.CreateAdd(L, R)));
264 EXPECT_FALSE(m_NUWAdd(m_Value(), m_Value()).match(IRB.CreateNSWAdd(L, R)));
265 EXPECT_FALSE(m_NUWAdd(m_Value(), m_Value()).match(IRB.CreateNUWSub(L, R)));
266 EXPECT_FALSE(m_NUWSub(m_Value(), m_Value()).match(IRB.CreateSub(L, R)));
267 EXPECT_FALSE(m_NUWSub(m_Value(), m_Value()).match(IRB.CreateNSWSub(L, R)));
268 EXPECT_FALSE(m_NUWSub(m_Value(), m_Value()).match(IRB.CreateNUWAdd(L, R)));
269 EXPECT_FALSE(m_NUWMul(m_Value(), m_Value()).match(IRB.CreateMul(L, R)));
270 EXPECT_FALSE(m_NUWMul(m_Value(), m_Value()).match(IRB.CreateNSWMul(L, R)));
271 EXPECT_FALSE(m_NUWMul(m_Value(), m_Value()).match(IRB.CreateNUWAdd(L, R)));
272 EXPECT_FALSE(m_NUWShl(m_Value(), m_Value()).match(IRB.CreateShl(L, R)));
273 EXPECT_FALSE(m_NUWShl(m_Value(), m_Value()).match(
274 IRB.CreateShl(L, R, "", /* NUW */ false, /* NSW */ true)));
275 EXPECT_FALSE(m_NUWShl(m_Value(), m_Value()).match(IRB.CreateNUWAdd(L, R)));
276}
277
Arnold Schwaighofere972d032013-05-05 01:54:46 +0000278} // anonymous namespace.