blob: 779784cf00b5ce49edbeaa4227c2ad9d7eee69a2 [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;
38 IRBuilder<true, NoFolder> Builder;
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())),
45 BB(BasicBlock::Create(Ctx, "entry", F)), Builder(BB) {}
46};
Arnold Schwaighofere972d032013-05-05 01:54:46 +000047
Chandler Carruth4603e96a2014-01-05 02:07:20 +000048TEST_F(PatternMatchTest, FloatingPointOrderedMin) {
Arnold Schwaighofere972d032013-05-05 01:54:46 +000049 Type *FltTy = Builder.getFloatTy();
50 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 Carruth4603e96a2014-01-05 02:07:20 +000055 EXPECT_TRUE(m_OrdFMin(m_Value(MatchL), m_Value(MatchR)).match(
56 Builder.CreateSelect(Builder.CreateFCmpOLT(L, R), L, R)));
57 EXPECT_EQ(L, MatchL);
58 EXPECT_EQ(R, MatchR);
Arnold Schwaighofere972d032013-05-05 01:54:46 +000059
60 // Test OLE.
Chandler Carruth4603e96a2014-01-05 02:07:20 +000061 EXPECT_TRUE(m_OrdFMin(m_Value(MatchL), m_Value(MatchR)).match(
62 Builder.CreateSelect(Builder.CreateFCmpOLE(L, R), L, R)));
63 EXPECT_EQ(L, MatchL);
64 EXPECT_EQ(R, MatchR);
Arnold Schwaighofere972d032013-05-05 01:54:46 +000065
66 // Test no match on OGE.
Chandler Carruth4603e96a2014-01-05 02:07:20 +000067 EXPECT_FALSE(m_OrdFMin(m_Value(MatchL), m_Value(MatchR)).match(
68 Builder.CreateSelect(Builder.CreateFCmpOGE(L, R), L, R)));
Arnold Schwaighofere972d032013-05-05 01:54:46 +000069
70 // Test no match on OGT.
Chandler Carruth4603e96a2014-01-05 02:07:20 +000071 EXPECT_FALSE(m_OrdFMin(m_Value(MatchL), m_Value(MatchR)).match(
72 Builder.CreateSelect(Builder.CreateFCmpOGT(L, R), L, R)));
Arnold Schwaighofere972d032013-05-05 01:54:46 +000073
74 // Test match on OGE with inverted select.
Chandler Carruth4603e96a2014-01-05 02:07:20 +000075 EXPECT_TRUE(m_OrdFMin(m_Value(MatchL), m_Value(MatchR)).match(
76 Builder.CreateSelect(Builder.CreateFCmpOGE(L, R), R, L)));
77 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 Carruth4603e96a2014-01-05 02:07:20 +000081 EXPECT_TRUE(m_OrdFMin(m_Value(MatchL), m_Value(MatchR)).match(
82 Builder.CreateSelect(Builder.CreateFCmpOGT(L, R), R, L)));
83 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) {
Arnold Schwaighofere972d032013-05-05 01:54:46 +000088 Type *FltTy = Builder.getFloatTy();
89 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 Carruth4603e96a2014-01-05 02:07:20 +000094 EXPECT_TRUE(m_OrdFMax(m_Value(MatchL), m_Value(MatchR)).match(
95 Builder.CreateSelect(Builder.CreateFCmpOGT(L, R), L, R)));
96 EXPECT_EQ(L, MatchL);
97 EXPECT_EQ(R, MatchR);
Arnold Schwaighofere972d032013-05-05 01:54:46 +000098
99 // Test OGE.
Chandler Carruth4603e96a2014-01-05 02:07:20 +0000100 EXPECT_TRUE(m_OrdFMax(m_Value(MatchL), m_Value(MatchR)).match(
101 Builder.CreateSelect(Builder.CreateFCmpOGE(L, R), L, R)));
102 EXPECT_EQ(L, MatchL);
103 EXPECT_EQ(R, MatchR);
Arnold Schwaighofere972d032013-05-05 01:54:46 +0000104
105 // Test no match on OLE.
Chandler Carruth4603e96a2014-01-05 02:07:20 +0000106 EXPECT_FALSE(m_OrdFMax(m_Value(MatchL), m_Value(MatchR)).match(
107 Builder.CreateSelect(Builder.CreateFCmpOLE(L, R), L, R)));
Arnold Schwaighofere972d032013-05-05 01:54:46 +0000108
109 // Test no match on OLT.
Chandler Carruth4603e96a2014-01-05 02:07:20 +0000110 EXPECT_FALSE(m_OrdFMax(m_Value(MatchL), m_Value(MatchR)).match(
111 Builder.CreateSelect(Builder.CreateFCmpOLT(L, R), L, R)));
Arnold Schwaighofere972d032013-05-05 01:54:46 +0000112
113 // Test match on OLE with inverted select.
Chandler Carruth4603e96a2014-01-05 02:07:20 +0000114 EXPECT_TRUE(m_OrdFMax(m_Value(MatchL), m_Value(MatchR)).match(
115 Builder.CreateSelect(Builder.CreateFCmpOLE(L, R), R, L)));
116 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 Carruth4603e96a2014-01-05 02:07:20 +0000120 EXPECT_TRUE(m_OrdFMax(m_Value(MatchL), m_Value(MatchR)).match(
121 Builder.CreateSelect(Builder.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) {
Arnold Schwaighofere972d032013-05-05 01:54:46 +0000127 Type *FltTy = Builder.getFloatTy();
128 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 Carruth4603e96a2014-01-05 02:07:20 +0000133 EXPECT_TRUE(m_UnordFMin(m_Value(MatchL), m_Value(MatchR)).match(
134 Builder.CreateSelect(Builder.CreateFCmpULT(L, R), L, R)));
135 EXPECT_EQ(L, MatchL);
136 EXPECT_EQ(R, MatchR);
Arnold Schwaighofere972d032013-05-05 01:54:46 +0000137
138 // Test ULE.
Chandler Carruth4603e96a2014-01-05 02:07:20 +0000139 EXPECT_TRUE(m_UnordFMin(m_Value(MatchL), m_Value(MatchR)).match(
140 Builder.CreateSelect(Builder.CreateFCmpULE(L, R), L, R)));
141 EXPECT_EQ(L, MatchL);
142 EXPECT_EQ(R, MatchR);
Arnold Schwaighofere972d032013-05-05 01:54:46 +0000143
144 // Test no match on UGE.
Chandler Carruth4603e96a2014-01-05 02:07:20 +0000145 EXPECT_FALSE(m_UnordFMin(m_Value(MatchL), m_Value(MatchR)).match(
146 Builder.CreateSelect(Builder.CreateFCmpUGE(L, R), L, R)));
Arnold Schwaighofere972d032013-05-05 01:54:46 +0000147
148 // Test no match on UGT.
Chandler Carruth4603e96a2014-01-05 02:07:20 +0000149 EXPECT_FALSE(m_UnordFMin(m_Value(MatchL), m_Value(MatchR)).match(
150 Builder.CreateSelect(Builder.CreateFCmpUGT(L, R), L, R)));
Arnold Schwaighofere972d032013-05-05 01:54:46 +0000151
152 // Test match on UGE with inverted select.
Chandler Carruth4603e96a2014-01-05 02:07:20 +0000153 EXPECT_TRUE(m_UnordFMin(m_Value(MatchL), m_Value(MatchR)).match(
154 Builder.CreateSelect(Builder.CreateFCmpUGE(L, R), R, L)));
155 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 Carruth4603e96a2014-01-05 02:07:20 +0000159 EXPECT_TRUE(m_UnordFMin(m_Value(MatchL), m_Value(MatchR)).match(
160 Builder.CreateSelect(Builder.CreateFCmpUGT(L, R), R, L)));
161 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) {
Arnold Schwaighofere972d032013-05-05 01:54:46 +0000166 Type *FltTy = Builder.getFloatTy();
167 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 Carruth4603e96a2014-01-05 02:07:20 +0000172 EXPECT_TRUE(m_UnordFMax(m_Value(MatchL), m_Value(MatchR)).match(
173 Builder.CreateSelect(Builder.CreateFCmpUGT(L, R), L, R)));
174 EXPECT_EQ(L, MatchL);
175 EXPECT_EQ(R, MatchR);
Arnold Schwaighofere972d032013-05-05 01:54:46 +0000176
177 // Test UGE.
Chandler Carruth4603e96a2014-01-05 02:07:20 +0000178 EXPECT_TRUE(m_UnordFMax(m_Value(MatchL), m_Value(MatchR)).match(
179 Builder.CreateSelect(Builder.CreateFCmpUGE(L, R), L, R)));
180 EXPECT_EQ(L, MatchL);
181 EXPECT_EQ(R, MatchR);
Arnold Schwaighofere972d032013-05-05 01:54:46 +0000182
183 // Test no match on ULE.
Chandler Carruth4603e96a2014-01-05 02:07:20 +0000184 EXPECT_FALSE(m_UnordFMax(m_Value(MatchL), m_Value(MatchR)).match(
185 Builder.CreateSelect(Builder.CreateFCmpULE(L, R), L, R)));
Arnold Schwaighofere972d032013-05-05 01:54:46 +0000186
187 // Test no match on ULT.
Chandler Carruth4603e96a2014-01-05 02:07:20 +0000188 EXPECT_FALSE(m_UnordFMax(m_Value(MatchL), m_Value(MatchR)).match(
189 Builder.CreateSelect(Builder.CreateFCmpULT(L, R), L, R)));
Arnold Schwaighofere972d032013-05-05 01:54:46 +0000190
191 // Test match on ULE with inverted select.
Chandler Carruth4603e96a2014-01-05 02:07:20 +0000192 EXPECT_TRUE(m_UnordFMax(m_Value(MatchL), m_Value(MatchR)).match(
193 Builder.CreateSelect(Builder.CreateFCmpULE(L, R), R, L)));
194 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 Carruth4603e96a2014-01-05 02:07:20 +0000198 EXPECT_TRUE(m_UnordFMax(m_Value(MatchL), m_Value(MatchR)).match(
199 Builder.CreateSelect(Builder.CreateFCmpULT(L, R), R, L)));
200 EXPECT_EQ(L, MatchL);
201 EXPECT_EQ(R, MatchR);
Arnold Schwaighofere972d032013-05-05 01:54:46 +0000202}
203
204} // anonymous namespace.