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); 233c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen 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); 238c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen 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); 243c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen 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); 253c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen 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); 258c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen 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); 263c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen 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