1e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer//===---- llvm/unittest/IR/PatternMatch.cpp - PatternMatch unit tests ----===//
2e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer//
3e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer//                     The LLVM Compiler Infrastructure
4e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer//
5e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer// This file is distributed under the University of Illinois Open Source
6e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer// License. See LICENSE.TXT for details.
7e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer//
8e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer//===----------------------------------------------------------------------===//
9e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer
10e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer#include "llvm/ADT/STLExtras.h"
11e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer#include "llvm/Analysis/ValueTracking.h"
12e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer#include "llvm/IR/BasicBlock.h"
13e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer#include "llvm/IR/Constants.h"
14e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer#include "llvm/IR/DataLayout.h"
15e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer#include "llvm/IR/DerivedTypes.h"
16e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer#include "llvm/IR/Instructions.h"
17e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer#include "llvm/IR/IRBuilder.h"
18e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer#include "llvm/IR/LLVMContext.h"
19e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer#include "llvm/IR/MDBuilder.h"
20e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer#include "llvm/IR/Operator.h"
21e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer#include "llvm/Support/NoFolder.h"
22e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer#include "llvm/Support/PatternMatch.h"
23e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer#include "gtest/gtest.h"
24e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer
25e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighoferusing namespace llvm::PatternMatch;
26e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer
27e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofernamespace llvm {
28e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofernamespace {
29e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer
30e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer/// Ordered floating point minimum/maximum tests.
31e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer
32e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighoferstatic void m_OrdFMin_expect_match_and_delete(Value *Cmp, Value *Select,
33e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer                                              Value *L, Value *R) {
34e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  Value *MatchL, *MatchR;
35e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  EXPECT_TRUE(m_OrdFMin(m_Value(MatchL), m_Value(MatchR)).match(Select));
36e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  EXPECT_EQ(L, MatchL);
37e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  EXPECT_EQ(R, MatchR);
38e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  delete Select;
39e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  delete Cmp;
40e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer}
41e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer
42e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighoferstatic void m_OrdFMin_expect_nomatch_and_delete(Value *Cmp, Value *Select,
43e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer                                                Value *L, Value *R) {
44e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  Value *MatchL, *MatchR;
45e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  EXPECT_FALSE(m_OrdFMin(m_Value(MatchL), m_Value(MatchR)).match(Select));
46e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  delete Select;
47e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  delete Cmp;
48e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer}
49e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer
50e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighoferstatic void m_OrdFMax_expect_match_and_delete(Value *Cmp, Value *Select,
51e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer                                              Value *L, Value *R) {
52e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  Value *MatchL, *MatchR;
53e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  EXPECT_TRUE(m_OrdFMax(m_Value(MatchL), m_Value(MatchR)).match(Select));
54e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  EXPECT_EQ(L, MatchL);
55e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  EXPECT_EQ(R, MatchR);
56e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  delete Select;
57e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  delete Cmp;
58e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer}
59e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer
60e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighoferstatic void m_OrdFMax_expect_nomatch_and_delete(Value *Cmp, Value *Select,
61e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer                                                Value *L, Value *R) {
62e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  Value *MatchL, *MatchR;
63e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  EXPECT_FALSE(m_OrdFMax(m_Value(MatchL), m_Value(MatchR)).match(Select));
64e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  delete Select;
65e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  delete Cmp;
66e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer}
67e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer
68e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer
69e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer
70e79d92c592d75e210dbe3abe1a975e859d17e953Arnold SchwaighoferTEST(PatternMatchTest, FloatingPointOrderedMin) {
71e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  LLVMContext &C(getGlobalContext());
72e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  IRBuilder<true, NoFolder> Builder(C);
73e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer
74e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  Type *FltTy = Builder.getFloatTy();
75e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  Value *L = ConstantFP::get(FltTy, 1.0);
76e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  Value *R = ConstantFP::get(FltTy, 2.0);
77e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer
78e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  // Test OLT.
79e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  Value *Cmp = Builder.CreateFCmpOLT(L, R);
80e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  Value *Select = Builder.CreateSelect(Cmp, L, R);
81e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  m_OrdFMin_expect_match_and_delete(Cmp, Select, L, R);
82e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer
83e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  // Test OLE.
84e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  Cmp = Builder.CreateFCmpOLE(L, R);
85e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  Select = Builder.CreateSelect(Cmp, L, R);
86e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  m_OrdFMin_expect_match_and_delete(Cmp, Select, L, R);
87e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer
88e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  // Test no match on OGE.
89e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  Cmp = Builder.CreateFCmpOGE(L, R);
90e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  Select = Builder.CreateSelect(Cmp, L, R);
91e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  m_OrdFMin_expect_nomatch_and_delete(Cmp, Select, L, R);
92e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer
93e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  // Test no match on OGT.
94e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  Cmp = Builder.CreateFCmpOGT(L, R);
95e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  Select = Builder.CreateSelect(Cmp, L, R);
96e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  m_OrdFMin_expect_nomatch_and_delete(Cmp, Select, L, R);
97e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer
98e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  // Test match on OGE with inverted select.
99e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  Cmp = Builder.CreateFCmpOGE(L, R);
100e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  Select = Builder.CreateSelect(Cmp, R, L);
101e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  m_OrdFMin_expect_match_and_delete(Cmp, Select, L, R);
102e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer
103e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  // Test match on OGT with inverted select.
104e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  Cmp = Builder.CreateFCmpOGT(L, R);
105e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  Select = Builder.CreateSelect(Cmp, R, L);
106e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  m_OrdFMin_expect_match_and_delete(Cmp, Select, L, R);
107e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer}
108e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer
109e79d92c592d75e210dbe3abe1a975e859d17e953Arnold SchwaighoferTEST(PatternMatchTest, FloatingPointOrderedMax) {
110e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  LLVMContext &C(getGlobalContext());
111e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  IRBuilder<true, NoFolder> Builder(C);
112e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer
113e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  Type *FltTy = Builder.getFloatTy();
114e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  Value *L = ConstantFP::get(FltTy, 1.0);
115e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  Value *R = ConstantFP::get(FltTy, 2.0);
116e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer
117e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  // Test OGT.
118e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  Value *Cmp = Builder.CreateFCmpOGT(L, R);
119e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  Value *Select = Builder.CreateSelect(Cmp, L, R);
120e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  m_OrdFMax_expect_match_and_delete(Cmp, Select, L, R);
121e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer
122e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  // Test OGE.
123e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  Cmp = Builder.CreateFCmpOGE(L, R);
124e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  Select = Builder.CreateSelect(Cmp, L, R);
125e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  m_OrdFMax_expect_match_and_delete(Cmp, Select, L, R);
126e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer
127e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  // Test no match on OLE.
128e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  Cmp = Builder.CreateFCmpOLE(L, R);
129e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  Select = Builder.CreateSelect(Cmp, L, R);
130e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  m_OrdFMax_expect_nomatch_and_delete(Cmp, Select, L, R);
131e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer
132e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  // Test no match on OLT.
133e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  Cmp = Builder.CreateFCmpOLT(L, R);
134e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  Select = Builder.CreateSelect(Cmp, L, R);
135e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  m_OrdFMax_expect_nomatch_and_delete(Cmp, Select, L, R);
136e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer
137e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  // Test match on OLE with inverted select.
138e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  Cmp = Builder.CreateFCmpOLE(L, R);
139e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  Select = Builder.CreateSelect(Cmp, R, L);
140e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  m_OrdFMax_expect_match_and_delete(Cmp, Select, L, R);
141e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer
142e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  // Test match on OLT with inverted select.
143e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  Cmp = Builder.CreateFCmpOLT(L, R);
144e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  Select = Builder.CreateSelect(Cmp, R, L);
145e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  m_OrdFMax_expect_match_and_delete(Cmp, Select, L, R);
146e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer}
147e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer
148e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer/// Unordered floating point minimum/maximum tests.
149e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer
150e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighoferstatic void m_UnordFMin_expect_match_and_delete(Value *Cmp, Value *Select,
151e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer                                              Value *L, Value *R) {
152e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  Value *MatchL, *MatchR;
153e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  EXPECT_TRUE(m_UnordFMin(m_Value(MatchL), m_Value(MatchR)).match(Select));
154e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  EXPECT_EQ(L, MatchL);
155e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  EXPECT_EQ(R, MatchR);
156e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  delete Select;
157e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  delete Cmp;
158e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer}
159e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer
160e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighoferstatic void m_UnordFMin_expect_nomatch_and_delete(Value *Cmp, Value *Select,
161e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer                                                Value *L, Value *R) {
162e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  Value *MatchL, *MatchR;
163e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  EXPECT_FALSE(m_UnordFMin(m_Value(MatchL), m_Value(MatchR)).match(Select));
164e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  delete Select;
165e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  delete Cmp;
166e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer}
167e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer
168e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighoferstatic void m_UnordFMax_expect_match_and_delete(Value *Cmp, Value *Select,
169e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer                                              Value *L, Value *R) {
170e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  Value *MatchL, *MatchR;
171e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  EXPECT_TRUE(m_UnordFMax(m_Value(MatchL), m_Value(MatchR)).match(Select));
172e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  EXPECT_EQ(L, MatchL);
173e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  EXPECT_EQ(R, MatchR);
174e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  delete Select;
175e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  delete Cmp;
176e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer}
177e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer
178e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighoferstatic void m_UnordFMax_expect_nomatch_and_delete(Value *Cmp, Value *Select,
179e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer                                                Value *L, Value *R) {
180e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  Value *MatchL, *MatchR;
181e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  EXPECT_FALSE(m_UnordFMax(m_Value(MatchL), m_Value(MatchR)).match(Select));
182e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  delete Select;
183e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  delete Cmp;
184e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer}
185e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer
186e79d92c592d75e210dbe3abe1a975e859d17e953Arnold SchwaighoferTEST(PatternMatchTest, FloatingPointUnorderedMin) {
187e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  LLVMContext &C(getGlobalContext());
188e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  IRBuilder<true, NoFolder> Builder(C);
189e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer
190e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  Type *FltTy = Builder.getFloatTy();
191e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  Value *L = ConstantFP::get(FltTy, 1.0);
192e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  Value *R = ConstantFP::get(FltTy, 2.0);
193e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer
194e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  // Test ULT.
195e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  Value *Cmp = Builder.CreateFCmpULT(L, R);
196e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  Value *Select = Builder.CreateSelect(Cmp, L, R);
197e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  m_UnordFMin_expect_match_and_delete(Cmp, Select, L, R);
198e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer
199e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  // Test ULE.
200e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  Cmp = Builder.CreateFCmpULE(L, R);
201e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  Select = Builder.CreateSelect(Cmp, L, R);
202e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  m_UnordFMin_expect_match_and_delete(Cmp, Select, L, R);
203e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer
204e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  // Test no match on UGE.
205e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  Cmp = Builder.CreateFCmpUGE(L, R);
206e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  Select = Builder.CreateSelect(Cmp, L, R);
207e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  m_UnordFMin_expect_nomatch_and_delete(Cmp, Select, L, R);
208e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer
209e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  // Test no match on UGT.
210e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  Cmp = Builder.CreateFCmpUGT(L, R);
211e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  Select = Builder.CreateSelect(Cmp, L, R);
212e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  m_UnordFMin_expect_nomatch_and_delete(Cmp, Select, L, R);
213e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer
214e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  // Test match on UGE with inverted select.
215e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  Cmp = Builder.CreateFCmpUGE(L, R);
216e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  Select = Builder.CreateSelect(Cmp, R, L);
217e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  m_UnordFMin_expect_match_and_delete(Cmp, Select, L, R);
218e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer
219e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  // Test match on UGT with inverted select.
220e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  Cmp = Builder.CreateFCmpUGT(L, R);
221e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  Select = Builder.CreateSelect(Cmp, R, L);
222e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  m_UnordFMin_expect_match_and_delete(Cmp, Select, L, R);
223e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer}
224e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer
225e79d92c592d75e210dbe3abe1a975e859d17e953Arnold SchwaighoferTEST(PatternMatchTest, FloatingPointUnorderedMax) {
226e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  LLVMContext &C(getGlobalContext());
227e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  IRBuilder<true, NoFolder> Builder(C);
228e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer
229e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  Type *FltTy = Builder.getFloatTy();
230e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  Value *L = ConstantFP::get(FltTy, 1.0);
231e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  Value *R = ConstantFP::get(FltTy, 2.0);
232e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer
233e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  // Test UGT.
234e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  Value *Cmp = Builder.CreateFCmpUGT(L, R);
235e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  Value *Select = Builder.CreateSelect(Cmp, L, R);
236e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  m_UnordFMax_expect_match_and_delete(Cmp, Select, L, R);
237e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer
238e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  // Test UGE.
239e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  Cmp = Builder.CreateFCmpUGE(L, R);
240e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  Select = Builder.CreateSelect(Cmp, L, R);
241e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  m_UnordFMax_expect_match_and_delete(Cmp, Select, L, R);
242e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer
243e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  // Test no match on ULE.
244e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  Cmp = Builder.CreateFCmpULE(L, R);
245e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  Select = Builder.CreateSelect(Cmp, L, R);
246e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  m_UnordFMax_expect_nomatch_and_delete(Cmp, Select, L, R);
247e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer
248e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  // Test no match on ULT.
249e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  Cmp = Builder.CreateFCmpULT(L, R);
250e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  Select = Builder.CreateSelect(Cmp, L, R);
251e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  m_UnordFMax_expect_nomatch_and_delete(Cmp, Select, L, R);
252e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer
253e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  // Test match on ULE with inverted select.
254e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  Cmp = Builder.CreateFCmpULE(L, R);
255e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  Select = Builder.CreateSelect(Cmp, R, L);
256e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  m_UnordFMax_expect_match_and_delete(Cmp, Select, L, R);
257e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer
258e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  // Test match on ULT with inverted select.
259e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  Cmp = Builder.CreateFCmpULT(L, R);
260e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  Select = Builder.CreateSelect(Cmp, R, L);
261e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  m_UnordFMax_expect_match_and_delete(Cmp, Select, L, R);
262e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer}
263e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer
264e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer} // anonymous namespace.
265e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer} // llvm namespace.
266