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"
1636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/Function.h"
17e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer#include "llvm/IR/IRBuilder.h"
1836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/Instructions.h"
19e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer#include "llvm/IR/LLVMContext.h"
20e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer#include "llvm/IR/MDBuilder.h"
2136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/Module.h"
2236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/NoFolder.h"
23e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer#include "llvm/IR/Operator.h"
2436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/PatternMatch.h"
2536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/Type.h"
26e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer#include "gtest/gtest.h"
27e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer
2836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesusing namespace llvm;
29e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighoferusing namespace llvm::PatternMatch;
30e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer
31e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofernamespace {
32e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer
3336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesstruct PatternMatchTest : ::testing::Test {
3436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  LLVMContext Ctx;
3536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  std::unique_ptr<Module> M;
3636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  Function *F;
3736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  BasicBlock *BB;
3836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  IRBuilder<true, NoFolder> IRB;
3936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
4036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  PatternMatchTest()
4136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      : M(new Module("PatternMatchTestModule", Ctx)),
4236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines        F(Function::Create(
4336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines            FunctionType::get(Type::getVoidTy(Ctx), /* IsVarArg */ false),
4436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines            Function::ExternalLinkage, "f", M.get())),
4536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines        BB(BasicBlock::Create(Ctx, "entry", F)), IRB(BB) {}
4636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines};
4736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
4836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesTEST_F(PatternMatchTest, OneUse) {
4936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // Build up a little tree of values:
5036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  //
5136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  //   One  = (1 + 2) + 42
5236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  //   Two  = One + 42
5336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  //   Leaf = (Two + 8) + (Two + 13)
5436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  Value *One = IRB.CreateAdd(IRB.CreateAdd(IRB.getInt32(1), IRB.getInt32(2)),
5536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                             IRB.getInt32(42));
5636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  Value *Two = IRB.CreateAdd(One, IRB.getInt32(42));
5736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  Value *Leaf = IRB.CreateAdd(IRB.CreateAdd(Two, IRB.getInt32(8)),
5836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                              IRB.CreateAdd(Two, IRB.getInt32(13)));
5936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  Value *V;
6036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
6136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_TRUE(m_OneUse(m_Value(V)).match(One));
6236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_EQ(One, V);
6336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
6436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_FALSE(m_OneUse(m_Value()).match(Two));
6536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_FALSE(m_OneUse(m_Value()).match(Leaf));
66e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer}
67e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer
6836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesTEST_F(PatternMatchTest, FloatingPointOrderedMin) {
6936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  Type *FltTy = IRB.getFloatTy();
70e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  Value *L = ConstantFP::get(FltTy, 1.0);
71e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  Value *R = ConstantFP::get(FltTy, 2.0);
7236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  Value *MatchL, *MatchR;
73e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer
74e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  // Test OLT.
7536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_TRUE(m_OrdFMin(m_Value(MatchL), m_Value(MatchR))
7636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                  .match(IRB.CreateSelect(IRB.CreateFCmpOLT(L, R), L, R)));
7736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_EQ(L, MatchL);
7836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_EQ(R, MatchR);
79e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer
80e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  // Test OLE.
8136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_TRUE(m_OrdFMin(m_Value(MatchL), m_Value(MatchR))
8236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                  .match(IRB.CreateSelect(IRB.CreateFCmpOLE(L, R), L, R)));
8336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_EQ(L, MatchL);
8436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_EQ(R, MatchR);
85e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer
86e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  // Test no match on OGE.
8736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_FALSE(m_OrdFMin(m_Value(MatchL), m_Value(MatchR))
8836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                   .match(IRB.CreateSelect(IRB.CreateFCmpOGE(L, R), L, R)));
89e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer
90e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  // Test no match on OGT.
9136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_FALSE(m_OrdFMin(m_Value(MatchL), m_Value(MatchR))
9236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                   .match(IRB.CreateSelect(IRB.CreateFCmpOGT(L, R), L, R)));
93e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer
94e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  // Test match on OGE with inverted select.
9536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_TRUE(m_OrdFMin(m_Value(MatchL), m_Value(MatchR))
9636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                  .match(IRB.CreateSelect(IRB.CreateFCmpOGE(L, R), R, L)));
9736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_EQ(L, MatchL);
9836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_EQ(R, MatchR);
99e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer
100e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  // Test match on OGT with inverted select.
10136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_TRUE(m_OrdFMin(m_Value(MatchL), m_Value(MatchR))
10236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                  .match(IRB.CreateSelect(IRB.CreateFCmpOGT(L, R), R, L)));
10336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_EQ(L, MatchL);
10436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_EQ(R, MatchR);
105e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer}
106e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer
10736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesTEST_F(PatternMatchTest, FloatingPointOrderedMax) {
10836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  Type *FltTy = IRB.getFloatTy();
109e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  Value *L = ConstantFP::get(FltTy, 1.0);
110e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  Value *R = ConstantFP::get(FltTy, 2.0);
11136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  Value *MatchL, *MatchR;
112e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer
113e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  // Test OGT.
11436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_TRUE(m_OrdFMax(m_Value(MatchL), m_Value(MatchR))
11536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                  .match(IRB.CreateSelect(IRB.CreateFCmpOGT(L, R), L, R)));
11636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_EQ(L, MatchL);
11736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_EQ(R, MatchR);
118e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer
119e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  // Test OGE.
12036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_TRUE(m_OrdFMax(m_Value(MatchL), m_Value(MatchR))
12136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                  .match(IRB.CreateSelect(IRB.CreateFCmpOGE(L, R), L, R)));
12236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_EQ(L, MatchL);
12336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_EQ(R, MatchR);
124e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer
125e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  // Test no match on OLE.
12636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_FALSE(m_OrdFMax(m_Value(MatchL), m_Value(MatchR))
12736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                   .match(IRB.CreateSelect(IRB.CreateFCmpOLE(L, R), L, R)));
128e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer
129e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  // Test no match on OLT.
13036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_FALSE(m_OrdFMax(m_Value(MatchL), m_Value(MatchR))
13136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                   .match(IRB.CreateSelect(IRB.CreateFCmpOLT(L, R), L, R)));
132e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer
133e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  // Test match on OLE with inverted select.
13436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_TRUE(m_OrdFMax(m_Value(MatchL), m_Value(MatchR))
13536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                  .match(IRB.CreateSelect(IRB.CreateFCmpOLE(L, R), R, L)));
136e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  EXPECT_EQ(L, MatchL);
137e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  EXPECT_EQ(R, MatchR);
138e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer
13936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // Test match on OLT with inverted select.
14036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_TRUE(m_OrdFMax(m_Value(MatchL), m_Value(MatchR))
14136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                  .match(IRB.CreateSelect(IRB.CreateFCmpOLT(L, R), R, L)));
142e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  EXPECT_EQ(L, MatchL);
143e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  EXPECT_EQ(R, MatchR);
144e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer}
145e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer
14636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesTEST_F(PatternMatchTest, FloatingPointUnorderedMin) {
14736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  Type *FltTy = IRB.getFloatTy();
148e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  Value *L = ConstantFP::get(FltTy, 1.0);
149e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  Value *R = ConstantFP::get(FltTy, 2.0);
15036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  Value *MatchL, *MatchR;
151e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer
152e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  // Test ULT.
15336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_TRUE(m_UnordFMin(m_Value(MatchL), m_Value(MatchR))
15436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                  .match(IRB.CreateSelect(IRB.CreateFCmpULT(L, R), L, R)));
15536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_EQ(L, MatchL);
15636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_EQ(R, MatchR);
157e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer
158e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  // Test ULE.
15936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_TRUE(m_UnordFMin(m_Value(MatchL), m_Value(MatchR))
16036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                  .match(IRB.CreateSelect(IRB.CreateFCmpULE(L, R), L, R)));
16136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_EQ(L, MatchL);
16236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_EQ(R, MatchR);
163e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer
164e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  // Test no match on UGE.
16536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_FALSE(m_UnordFMin(m_Value(MatchL), m_Value(MatchR))
16636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                   .match(IRB.CreateSelect(IRB.CreateFCmpUGE(L, R), L, R)));
167e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer
168e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  // Test no match on UGT.
16936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_FALSE(m_UnordFMin(m_Value(MatchL), m_Value(MatchR))
17036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                   .match(IRB.CreateSelect(IRB.CreateFCmpUGT(L, R), L, R)));
171e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer
172e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  // Test match on UGE with inverted select.
17336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_TRUE(m_UnordFMin(m_Value(MatchL), m_Value(MatchR))
17436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                  .match(IRB.CreateSelect(IRB.CreateFCmpUGE(L, R), R, L)));
17536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_EQ(L, MatchL);
17636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_EQ(R, MatchR);
177e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer
178e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  // Test match on UGT with inverted select.
17936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_TRUE(m_UnordFMin(m_Value(MatchL), m_Value(MatchR))
18036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                  .match(IRB.CreateSelect(IRB.CreateFCmpUGT(L, R), R, L)));
18136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_EQ(L, MatchL);
18236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_EQ(R, MatchR);
183e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer}
184e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer
18536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesTEST_F(PatternMatchTest, FloatingPointUnorderedMax) {
18636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  Type *FltTy = IRB.getFloatTy();
187e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  Value *L = ConstantFP::get(FltTy, 1.0);
188e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  Value *R = ConstantFP::get(FltTy, 2.0);
18936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  Value *MatchL, *MatchR;
190e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer
191e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  // Test UGT.
19236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_TRUE(m_UnordFMax(m_Value(MatchL), m_Value(MatchR))
19336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                  .match(IRB.CreateSelect(IRB.CreateFCmpUGT(L, R), L, R)));
19436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_EQ(L, MatchL);
19536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_EQ(R, MatchR);
196e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer
197e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  // Test UGE.
19836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_TRUE(m_UnordFMax(m_Value(MatchL), m_Value(MatchR))
19936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                  .match(IRB.CreateSelect(IRB.CreateFCmpUGE(L, R), L, R)));
20036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_EQ(L, MatchL);
20136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_EQ(R, MatchR);
202e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer
203e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  // Test no match on ULE.
20436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_FALSE(m_UnordFMax(m_Value(MatchL), m_Value(MatchR))
20536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                   .match(IRB.CreateSelect(IRB.CreateFCmpULE(L, R), L, R)));
206e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer
207e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  // Test no match on ULT.
20836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_FALSE(m_UnordFMax(m_Value(MatchL), m_Value(MatchR))
20936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                   .match(IRB.CreateSelect(IRB.CreateFCmpULT(L, R), L, R)));
210e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer
211e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  // Test match on ULE with inverted select.
21236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_TRUE(m_UnordFMax(m_Value(MatchL), m_Value(MatchR))
21336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                  .match(IRB.CreateSelect(IRB.CreateFCmpULE(L, R), R, L)));
21436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_EQ(L, MatchL);
21536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_EQ(R, MatchR);
216e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer
217e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer  // Test match on ULT with inverted select.
21836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_TRUE(m_UnordFMax(m_Value(MatchL), m_Value(MatchR))
21936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                  .match(IRB.CreateSelect(IRB.CreateFCmpULT(L, R), R, L)));
22036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_EQ(L, MatchL);
22136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_EQ(R, MatchR);
22236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
22336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
22436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesTEST_F(PatternMatchTest, OverflowingBinOps) {
22536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  Value *L = IRB.getInt32(1);
22636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  Value *R = IRB.getInt32(2);
22736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  Value *MatchL, *MatchR;
22836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
22936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_TRUE(
23036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      m_NSWAdd(m_Value(MatchL), m_Value(MatchR)).match(IRB.CreateNSWAdd(L, R)));
23136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_EQ(L, MatchL);
23236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_EQ(R, MatchR);
233cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  MatchL = MatchR = nullptr;
23436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_TRUE(
23536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      m_NSWSub(m_Value(MatchL), m_Value(MatchR)).match(IRB.CreateNSWSub(L, R)));
23636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_EQ(L, MatchL);
23736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_EQ(R, MatchR);
238cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  MatchL = MatchR = nullptr;
23936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_TRUE(
24036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      m_NSWMul(m_Value(MatchL), m_Value(MatchR)).match(IRB.CreateNSWMul(L, R)));
24136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_EQ(L, MatchL);
24236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_EQ(R, MatchR);
243cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  MatchL = MatchR = nullptr;
24436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_TRUE(m_NSWShl(m_Value(MatchL), m_Value(MatchR)).match(
24536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      IRB.CreateShl(L, R, "", /* NUW */ false, /* NSW */ true)));
24636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_EQ(L, MatchL);
24736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_EQ(R, MatchR);
24836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
24936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_TRUE(
25036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      m_NUWAdd(m_Value(MatchL), m_Value(MatchR)).match(IRB.CreateNUWAdd(L, R)));
25136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_EQ(L, MatchL);
25236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_EQ(R, MatchR);
253cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  MatchL = MatchR = nullptr;
25436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_TRUE(
25536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      m_NUWSub(m_Value(MatchL), m_Value(MatchR)).match(IRB.CreateNUWSub(L, R)));
25636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_EQ(L, MatchL);
25736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_EQ(R, MatchR);
258cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  MatchL = MatchR = nullptr;
25936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_TRUE(
26036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      m_NUWMul(m_Value(MatchL), m_Value(MatchR)).match(IRB.CreateNUWMul(L, R)));
26136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_EQ(L, MatchL);
26236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_EQ(R, MatchR);
263cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  MatchL = MatchR = nullptr;
26436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_TRUE(m_NUWShl(m_Value(MatchL), m_Value(MatchR)).match(
26536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      IRB.CreateShl(L, R, "", /* NUW */ true, /* NSW */ false)));
26636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_EQ(L, MatchL);
26736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_EQ(R, MatchR);
26836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
26936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_FALSE(m_NSWAdd(m_Value(), m_Value()).match(IRB.CreateAdd(L, R)));
27036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_FALSE(m_NSWAdd(m_Value(), m_Value()).match(IRB.CreateNUWAdd(L, R)));
27136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_FALSE(m_NSWAdd(m_Value(), m_Value()).match(IRB.CreateNSWSub(L, R)));
27236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_FALSE(m_NSWSub(m_Value(), m_Value()).match(IRB.CreateSub(L, R)));
27336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_FALSE(m_NSWSub(m_Value(), m_Value()).match(IRB.CreateNUWSub(L, R)));
27436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_FALSE(m_NSWSub(m_Value(), m_Value()).match(IRB.CreateNSWAdd(L, R)));
27536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_FALSE(m_NSWMul(m_Value(), m_Value()).match(IRB.CreateMul(L, R)));
27636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_FALSE(m_NSWMul(m_Value(), m_Value()).match(IRB.CreateNUWMul(L, R)));
27736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_FALSE(m_NSWMul(m_Value(), m_Value()).match(IRB.CreateNSWAdd(L, R)));
27836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_FALSE(m_NSWShl(m_Value(), m_Value()).match(IRB.CreateShl(L, R)));
27936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_FALSE(m_NSWShl(m_Value(), m_Value()).match(
28036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      IRB.CreateShl(L, R, "", /* NUW */ true, /* NSW */ false)));
28136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_FALSE(m_NSWShl(m_Value(), m_Value()).match(IRB.CreateNSWAdd(L, R)));
28236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
28336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_FALSE(m_NUWAdd(m_Value(), m_Value()).match(IRB.CreateAdd(L, R)));
28436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_FALSE(m_NUWAdd(m_Value(), m_Value()).match(IRB.CreateNSWAdd(L, R)));
28536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_FALSE(m_NUWAdd(m_Value(), m_Value()).match(IRB.CreateNUWSub(L, R)));
28636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_FALSE(m_NUWSub(m_Value(), m_Value()).match(IRB.CreateSub(L, R)));
28736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_FALSE(m_NUWSub(m_Value(), m_Value()).match(IRB.CreateNSWSub(L, R)));
28836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_FALSE(m_NUWSub(m_Value(), m_Value()).match(IRB.CreateNUWAdd(L, R)));
28936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_FALSE(m_NUWMul(m_Value(), m_Value()).match(IRB.CreateMul(L, R)));
29036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_FALSE(m_NUWMul(m_Value(), m_Value()).match(IRB.CreateNSWMul(L, R)));
29136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_FALSE(m_NUWMul(m_Value(), m_Value()).match(IRB.CreateNUWAdd(L, R)));
29236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_FALSE(m_NUWShl(m_Value(), m_Value()).match(IRB.CreateShl(L, R)));
29336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_FALSE(m_NUWShl(m_Value(), m_Value()).match(
29436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      IRB.CreateShl(L, R, "", /* NUW */ false, /* NSW */ true)));
29536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EXPECT_FALSE(m_NUWShl(m_Value(), m_Value()).match(IRB.CreateNUWAdd(L, R)));
296e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer}
297e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer
298e79d92c592d75e210dbe3abe1a975e859d17e953Arnold Schwaighofer} // anonymous namespace.
299