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