InstructionSimplify.cpp revision 40d8c28b27377199b7465ba2c5a2c59c6fd12fa9
19f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner//===- InstructionSimplify.cpp - Fold instruction operands ----------------===// 29f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner// 39f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner// The LLVM Compiler Infrastructure 49f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner// 59f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner// This file is distributed under the University of Illinois Open Source 69f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner// License. See LICENSE.TXT for details. 79f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner// 89f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner//===----------------------------------------------------------------------===// 99f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner// 109f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner// This file implements routines for folding instructions into simpler forms 119f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner// that do not require creating new instructions. For example, this does 129f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner// constant folding, and can handle identities like (X&0)->0. 139f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner// 149f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner//===----------------------------------------------------------------------===// 159f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner 169f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner#include "llvm/Analysis/InstructionSimplify.h" 179f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner#include "llvm/Analysis/ConstantFolding.h" 1840d8c28b27377199b7465ba2c5a2c59c6fd12fa9Chris Lattner#include "llvm/Support/ValueHandle.h" 199f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner#include "llvm/Instructions.h" 20d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner#include "llvm/Support/PatternMatch.h" 219f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattnerusing namespace llvm; 22d06094f0682f2ede03caff4892b1a57469896d48Chris Lattnerusing namespace llvm::PatternMatch; 239f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner 24d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner/// SimplifyAndInst - Given operands for an And, see if we can 25d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner/// fold the result. If not, this returns null. 26d06094f0682f2ede03caff4892b1a57469896d48Chris LattnerValue *llvm::SimplifyAndInst(Value *Op0, Value *Op1, 27d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner const TargetData *TD) { 28d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner if (Constant *CLHS = dyn_cast<Constant>(Op0)) { 29d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner if (Constant *CRHS = dyn_cast<Constant>(Op1)) { 30d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner Constant *Ops[] = { CLHS, CRHS }; 31d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner return ConstantFoldInstOperands(Instruction::And, CLHS->getType(), 32d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner Ops, 2, TD); 33d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner } 34d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner 35d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner // Canonicalize the constant to the RHS. 36d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner std::swap(Op0, Op1); 37d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner } 38d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner 39d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner // X & undef -> 0 40d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner if (isa<UndefValue>(Op1)) 41d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner return Constant::getNullValue(Op0->getType()); 42d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner 43d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner // X & X = X 44d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner if (Op0 == Op1) 45d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner return Op0; 46d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner 47d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner // X & <0,0> = <0,0> 48d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner if (isa<ConstantAggregateZero>(Op1)) 49d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner return Op1; 50d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner 51d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner // X & <-1,-1> = X 52d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner if (ConstantVector *CP = dyn_cast<ConstantVector>(Op1)) 53d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner if (CP->isAllOnesValue()) 54d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner return Op0; 55d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner 56d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner if (ConstantInt *Op1CI = dyn_cast<ConstantInt>(Op1)) { 57d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner // X & 0 = 0 58d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner if (Op1CI->isZero()) 59d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner return Op1CI; 60d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner // X & -1 = X 61d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner if (Op1CI->isAllOnesValue()) 62d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner return Op0; 63d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner } 64d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner 65d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner // A & ~A = ~A & A = 0 66d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner Value *A, *B; 6770ce6d0819ffd5822bb176fffe94bcf29a1deda4Chris Lattner if ((match(Op0, m_Not(m_Value(A))) && A == Op1) || 6870ce6d0819ffd5822bb176fffe94bcf29a1deda4Chris Lattner (match(Op1, m_Not(m_Value(A))) && A == Op0)) 69d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner return Constant::getNullValue(Op0->getType()); 70d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner 71d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner // (A | ?) & A = A 72d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner if (match(Op0, m_Or(m_Value(A), m_Value(B))) && 73d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner (A == Op1 || B == Op1)) 74d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner return Op1; 75d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner 76d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner // A & (A | ?) = A 77d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner if (match(Op1, m_Or(m_Value(A), m_Value(B))) && 78d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner (A == Op0 || B == Op0)) 79d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner return Op0; 80d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner 81d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner return 0; 82d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner} 839f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner 84d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner/// SimplifyOrInst - Given operands for an Or, see if we can 859f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner/// fold the result. If not, this returns null. 86d06094f0682f2ede03caff4892b1a57469896d48Chris LattnerValue *llvm::SimplifyOrInst(Value *Op0, Value *Op1, 87d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner const TargetData *TD) { 88d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner if (Constant *CLHS = dyn_cast<Constant>(Op0)) { 89d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner if (Constant *CRHS = dyn_cast<Constant>(Op1)) { 90d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner Constant *Ops[] = { CLHS, CRHS }; 91d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner return ConstantFoldInstOperands(Instruction::Or, CLHS->getType(), 92d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner Ops, 2, TD); 93d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner } 94d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner 95d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner // Canonicalize the constant to the RHS. 96d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner std::swap(Op0, Op1); 97d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner } 98d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner 99d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner // X | undef -> -1 100d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner if (isa<UndefValue>(Op1)) 101d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner return Constant::getAllOnesValue(Op0->getType()); 102d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner 103d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner // X | X = X 104d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner if (Op0 == Op1) 105d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner return Op0; 106d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner 107d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner // X | <0,0> = X 108d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner if (isa<ConstantAggregateZero>(Op1)) 109d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner return Op0; 110d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner 111d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner // X | <-1,-1> = <-1,-1> 112d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner if (ConstantVector *CP = dyn_cast<ConstantVector>(Op1)) 113d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner if (CP->isAllOnesValue()) 114d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner return Op1; 115d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner 116d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner if (ConstantInt *Op1CI = dyn_cast<ConstantInt>(Op1)) { 117d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner // X | 0 = X 118d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner if (Op1CI->isZero()) 119d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner return Op0; 120d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner // X | -1 = -1 121d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner if (Op1CI->isAllOnesValue()) 122d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner return Op1CI; 123d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner } 124d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner 125d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner // A | ~A = ~A | A = -1 126d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner Value *A, *B; 12770ce6d0819ffd5822bb176fffe94bcf29a1deda4Chris Lattner if ((match(Op0, m_Not(m_Value(A))) && A == Op1) || 12870ce6d0819ffd5822bb176fffe94bcf29a1deda4Chris Lattner (match(Op1, m_Not(m_Value(A))) && A == Op0)) 129d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner return Constant::getAllOnesValue(Op0->getType()); 130d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner 131d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner // (A & ?) | A = A 132d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner if (match(Op0, m_And(m_Value(A), m_Value(B))) && 133d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner (A == Op1 || B == Op1)) 134d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner return Op1; 135d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner 136d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner // A | (A & ?) = A 137d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner if (match(Op1, m_And(m_Value(A), m_Value(B))) && 138d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner (A == Op0 || B == Op0)) 139d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner return Op0; 140d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner 1419f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner return 0; 1429f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner} 1439f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner 144d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner 145d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner 146d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner 147210c5d4880b525e064088b6fec713260128c16ebChris Lattnerstatic const Type *GetCompareTy(Value *Op) { 148210c5d4880b525e064088b6fec713260128c16ebChris Lattner return CmpInst::makeCmpResultType(Op->getType()); 149210c5d4880b525e064088b6fec713260128c16ebChris Lattner} 150210c5d4880b525e064088b6fec713260128c16ebChris Lattner 1519f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner 1529dbb42944c4d7caddab21016b24cca31019a3fafChris Lattner/// SimplifyICmpInst - Given operands for an ICmpInst, see if we can 1539dbb42944c4d7caddab21016b24cca31019a3fafChris Lattner/// fold the result. If not, this returns null. 1549dbb42944c4d7caddab21016b24cca31019a3fafChris LattnerValue *llvm::SimplifyICmpInst(unsigned Predicate, Value *LHS, Value *RHS, 1559dbb42944c4d7caddab21016b24cca31019a3fafChris Lattner const TargetData *TD) { 1569f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner CmpInst::Predicate Pred = (CmpInst::Predicate)Predicate; 1579dbb42944c4d7caddab21016b24cca31019a3fafChris Lattner assert(CmpInst::isIntPredicate(Pred) && "Not an integer compare!"); 1589f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner 159d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner if (Constant *CLHS = dyn_cast<Constant>(LHS)) { 1608f73deaa8732a556046bf4ac6207be55972e3b74Chris Lattner if (Constant *CRHS = dyn_cast<Constant>(RHS)) 1618f73deaa8732a556046bf4ac6207be55972e3b74Chris Lattner return ConstantFoldCompareInstOperands(Pred, CLHS, CRHS, TD); 162d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner 163d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner // If we have a constant, make sure it is on the RHS. 164d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner std::swap(LHS, RHS); 165d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner Pred = CmpInst::getSwappedPredicate(Pred); 166d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner } 1679f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner 168210c5d4880b525e064088b6fec713260128c16ebChris Lattner // ITy - This is the return type of the compare we're considering. 169210c5d4880b525e064088b6fec713260128c16ebChris Lattner const Type *ITy = GetCompareTy(LHS); 170210c5d4880b525e064088b6fec713260128c16ebChris Lattner 171210c5d4880b525e064088b6fec713260128c16ebChris Lattner // icmp X, X -> true/false 1729f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner if (LHS == RHS) 173210c5d4880b525e064088b6fec713260128c16ebChris Lattner return ConstantInt::get(ITy, CmpInst::isTrueWhenEqual(Pred)); 174210c5d4880b525e064088b6fec713260128c16ebChris Lattner 175210c5d4880b525e064088b6fec713260128c16ebChris Lattner if (isa<UndefValue>(RHS)) // X icmp undef -> undef 176210c5d4880b525e064088b6fec713260128c16ebChris Lattner return UndefValue::get(ITy); 177210c5d4880b525e064088b6fec713260128c16ebChris Lattner 178210c5d4880b525e064088b6fec713260128c16ebChris Lattner // icmp <global/alloca*/null>, <global/alloca*/null> - Global/Stack value 179210c5d4880b525e064088b6fec713260128c16ebChris Lattner // addresses never equal each other! We already know that Op0 != Op1. 180210c5d4880b525e064088b6fec713260128c16ebChris Lattner if ((isa<GlobalValue>(LHS) || isa<AllocaInst>(LHS) || 181210c5d4880b525e064088b6fec713260128c16ebChris Lattner isa<ConstantPointerNull>(LHS)) && 182210c5d4880b525e064088b6fec713260128c16ebChris Lattner (isa<GlobalValue>(RHS) || isa<AllocaInst>(RHS) || 183210c5d4880b525e064088b6fec713260128c16ebChris Lattner isa<ConstantPointerNull>(RHS))) 184210c5d4880b525e064088b6fec713260128c16ebChris Lattner return ConstantInt::get(ITy, CmpInst::isFalseWhenEqual(Pred)); 185210c5d4880b525e064088b6fec713260128c16ebChris Lattner 186210c5d4880b525e064088b6fec713260128c16ebChris Lattner // See if we are doing a comparison with a constant. 187210c5d4880b525e064088b6fec713260128c16ebChris Lattner if (ConstantInt *CI = dyn_cast<ConstantInt>(RHS)) { 188210c5d4880b525e064088b6fec713260128c16ebChris Lattner // If we have an icmp le or icmp ge instruction, turn it into the 189210c5d4880b525e064088b6fec713260128c16ebChris Lattner // appropriate icmp lt or icmp gt instruction. This allows us to rely on 190210c5d4880b525e064088b6fec713260128c16ebChris Lattner // them being folded in the code below. 191210c5d4880b525e064088b6fec713260128c16ebChris Lattner switch (Pred) { 192210c5d4880b525e064088b6fec713260128c16ebChris Lattner default: break; 193210c5d4880b525e064088b6fec713260128c16ebChris Lattner case ICmpInst::ICMP_ULE: 194210c5d4880b525e064088b6fec713260128c16ebChris Lattner if (CI->isMaxValue(false)) // A <=u MAX -> TRUE 195210c5d4880b525e064088b6fec713260128c16ebChris Lattner return ConstantInt::getTrue(CI->getContext()); 196210c5d4880b525e064088b6fec713260128c16ebChris Lattner break; 197210c5d4880b525e064088b6fec713260128c16ebChris Lattner case ICmpInst::ICMP_SLE: 198210c5d4880b525e064088b6fec713260128c16ebChris Lattner if (CI->isMaxValue(true)) // A <=s MAX -> TRUE 199210c5d4880b525e064088b6fec713260128c16ebChris Lattner return ConstantInt::getTrue(CI->getContext()); 200210c5d4880b525e064088b6fec713260128c16ebChris Lattner break; 201210c5d4880b525e064088b6fec713260128c16ebChris Lattner case ICmpInst::ICMP_UGE: 202210c5d4880b525e064088b6fec713260128c16ebChris Lattner if (CI->isMinValue(false)) // A >=u MIN -> TRUE 203210c5d4880b525e064088b6fec713260128c16ebChris Lattner return ConstantInt::getTrue(CI->getContext()); 204210c5d4880b525e064088b6fec713260128c16ebChris Lattner break; 205210c5d4880b525e064088b6fec713260128c16ebChris Lattner case ICmpInst::ICMP_SGE: 206210c5d4880b525e064088b6fec713260128c16ebChris Lattner if (CI->isMinValue(true)) // A >=s MIN -> TRUE 207210c5d4880b525e064088b6fec713260128c16ebChris Lattner return ConstantInt::getTrue(CI->getContext()); 208210c5d4880b525e064088b6fec713260128c16ebChris Lattner break; 209210c5d4880b525e064088b6fec713260128c16ebChris Lattner } 210210c5d4880b525e064088b6fec713260128c16ebChris Lattner } 211210c5d4880b525e064088b6fec713260128c16ebChris Lattner 212210c5d4880b525e064088b6fec713260128c16ebChris Lattner 2139dbb42944c4d7caddab21016b24cca31019a3fafChris Lattner return 0; 2149dbb42944c4d7caddab21016b24cca31019a3fafChris Lattner} 2159dbb42944c4d7caddab21016b24cca31019a3fafChris Lattner 2169dbb42944c4d7caddab21016b24cca31019a3fafChris Lattner/// SimplifyFCmpInst - Given operands for an FCmpInst, see if we can 2179dbb42944c4d7caddab21016b24cca31019a3fafChris Lattner/// fold the result. If not, this returns null. 2189dbb42944c4d7caddab21016b24cca31019a3fafChris LattnerValue *llvm::SimplifyFCmpInst(unsigned Predicate, Value *LHS, Value *RHS, 2199dbb42944c4d7caddab21016b24cca31019a3fafChris Lattner const TargetData *TD) { 2209dbb42944c4d7caddab21016b24cca31019a3fafChris Lattner CmpInst::Predicate Pred = (CmpInst::Predicate)Predicate; 2219dbb42944c4d7caddab21016b24cca31019a3fafChris Lattner assert(CmpInst::isFPPredicate(Pred) && "Not an FP compare!"); 2229dbb42944c4d7caddab21016b24cca31019a3fafChris Lattner 223d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner if (Constant *CLHS = dyn_cast<Constant>(LHS)) { 2249dbb42944c4d7caddab21016b24cca31019a3fafChris Lattner if (Constant *CRHS = dyn_cast<Constant>(RHS)) 2259dbb42944c4d7caddab21016b24cca31019a3fafChris Lattner return ConstantFoldCompareInstOperands(Pred, CLHS, CRHS, TD); 226d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner 227d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner // If we have a constant, make sure it is on the RHS. 228d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner std::swap(LHS, RHS); 229d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner Pred = CmpInst::getSwappedPredicate(Pred); 230d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner } 2319dbb42944c4d7caddab21016b24cca31019a3fafChris Lattner 232210c5d4880b525e064088b6fec713260128c16ebChris Lattner // Fold trivial predicates. 233210c5d4880b525e064088b6fec713260128c16ebChris Lattner if (Pred == FCmpInst::FCMP_FALSE) 234210c5d4880b525e064088b6fec713260128c16ebChris Lattner return ConstantInt::get(GetCompareTy(LHS), 0); 235210c5d4880b525e064088b6fec713260128c16ebChris Lattner if (Pred == FCmpInst::FCMP_TRUE) 236210c5d4880b525e064088b6fec713260128c16ebChris Lattner return ConstantInt::get(GetCompareTy(LHS), 1); 237210c5d4880b525e064088b6fec713260128c16ebChris Lattner 238210c5d4880b525e064088b6fec713260128c16ebChris Lattner if (isa<UndefValue>(RHS)) // fcmp pred X, undef -> undef 239210c5d4880b525e064088b6fec713260128c16ebChris Lattner return UndefValue::get(GetCompareTy(LHS)); 240210c5d4880b525e064088b6fec713260128c16ebChris Lattner 241210c5d4880b525e064088b6fec713260128c16ebChris Lattner // fcmp x,x -> true/false. Not all compares are foldable. 242210c5d4880b525e064088b6fec713260128c16ebChris Lattner if (LHS == RHS) { 243210c5d4880b525e064088b6fec713260128c16ebChris Lattner if (CmpInst::isTrueWhenEqual(Pred)) 244210c5d4880b525e064088b6fec713260128c16ebChris Lattner return ConstantInt::get(GetCompareTy(LHS), 1); 245210c5d4880b525e064088b6fec713260128c16ebChris Lattner if (CmpInst::isFalseWhenEqual(Pred)) 246210c5d4880b525e064088b6fec713260128c16ebChris Lattner return ConstantInt::get(GetCompareTy(LHS), 0); 247210c5d4880b525e064088b6fec713260128c16ebChris Lattner } 248210c5d4880b525e064088b6fec713260128c16ebChris Lattner 249210c5d4880b525e064088b6fec713260128c16ebChris Lattner // Handle fcmp with constant RHS 250210c5d4880b525e064088b6fec713260128c16ebChris Lattner if (Constant *RHSC = dyn_cast<Constant>(RHS)) { 251210c5d4880b525e064088b6fec713260128c16ebChris Lattner // If the constant is a nan, see if we can fold the comparison based on it. 252210c5d4880b525e064088b6fec713260128c16ebChris Lattner if (ConstantFP *CFP = dyn_cast<ConstantFP>(RHSC)) { 253210c5d4880b525e064088b6fec713260128c16ebChris Lattner if (CFP->getValueAPF().isNaN()) { 254210c5d4880b525e064088b6fec713260128c16ebChris Lattner if (FCmpInst::isOrdered(Pred)) // True "if ordered and foo" 255210c5d4880b525e064088b6fec713260128c16ebChris Lattner return ConstantInt::getFalse(CFP->getContext()); 256210c5d4880b525e064088b6fec713260128c16ebChris Lattner assert(FCmpInst::isUnordered(Pred) && 257210c5d4880b525e064088b6fec713260128c16ebChris Lattner "Comparison must be either ordered or unordered!"); 258210c5d4880b525e064088b6fec713260128c16ebChris Lattner // True if unordered. 259210c5d4880b525e064088b6fec713260128c16ebChris Lattner return ConstantInt::getTrue(CFP->getContext()); 260210c5d4880b525e064088b6fec713260128c16ebChris Lattner } 261210c5d4880b525e064088b6fec713260128c16ebChris Lattner } 262210c5d4880b525e064088b6fec713260128c16ebChris Lattner } 263210c5d4880b525e064088b6fec713260128c16ebChris Lattner 2649f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner return 0; 2659f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner} 2669f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner 267d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner//=== Helper functions for higher up the class hierarchy. 2689dbb42944c4d7caddab21016b24cca31019a3fafChris Lattner 269d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner/// SimplifyBinOp - Given operands for a BinaryOperator, see if we can 270d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner/// fold the result. If not, this returns null. 271d06094f0682f2ede03caff4892b1a57469896d48Chris LattnerValue *llvm::SimplifyBinOp(unsigned Opcode, Value *LHS, Value *RHS, 272d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner const TargetData *TD) { 273d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner switch (Opcode) { 274d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner case Instruction::And: return SimplifyAndInst(LHS, RHS, TD); 275d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner case Instruction::Or: return SimplifyOrInst(LHS, RHS, TD); 276d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner default: 277d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner if (Constant *CLHS = dyn_cast<Constant>(LHS)) 278d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner if (Constant *CRHS = dyn_cast<Constant>(RHS)) { 279d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner Constant *COps[] = {CLHS, CRHS}; 280d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner return ConstantFoldInstOperands(Opcode, LHS->getType(), COps, 2, TD); 281d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner } 282d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner return 0; 283d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner } 284d06094f0682f2ede03caff4892b1a57469896d48Chris Lattner} 2859dbb42944c4d7caddab21016b24cca31019a3fafChris Lattner 2869dbb42944c4d7caddab21016b24cca31019a3fafChris Lattner/// SimplifyCmpInst - Given operands for a CmpInst, see if we can 2879dbb42944c4d7caddab21016b24cca31019a3fafChris Lattner/// fold the result. 2889dbb42944c4d7caddab21016b24cca31019a3fafChris LattnerValue *llvm::SimplifyCmpInst(unsigned Predicate, Value *LHS, Value *RHS, 2899dbb42944c4d7caddab21016b24cca31019a3fafChris Lattner const TargetData *TD) { 2909dbb42944c4d7caddab21016b24cca31019a3fafChris Lattner if (CmpInst::isIntPredicate((CmpInst::Predicate)Predicate)) 2919dbb42944c4d7caddab21016b24cca31019a3fafChris Lattner return SimplifyICmpInst(Predicate, LHS, RHS, TD); 2929dbb42944c4d7caddab21016b24cca31019a3fafChris Lattner return SimplifyFCmpInst(Predicate, LHS, RHS, TD); 2939dbb42944c4d7caddab21016b24cca31019a3fafChris Lattner} 2949dbb42944c4d7caddab21016b24cca31019a3fafChris Lattner 295e34537856a544c83513e390ac9552a8bc3823346Chris Lattner 296e34537856a544c83513e390ac9552a8bc3823346Chris Lattner/// SimplifyInstruction - See if we can compute a simplified version of this 297e34537856a544c83513e390ac9552a8bc3823346Chris Lattner/// instruction. If not, this returns null. 298e34537856a544c83513e390ac9552a8bc3823346Chris LattnerValue *llvm::SimplifyInstruction(Instruction *I, const TargetData *TD) { 299e34537856a544c83513e390ac9552a8bc3823346Chris Lattner switch (I->getOpcode()) { 300e34537856a544c83513e390ac9552a8bc3823346Chris Lattner default: 301e34537856a544c83513e390ac9552a8bc3823346Chris Lattner return ConstantFoldInstruction(I, TD); 302e34537856a544c83513e390ac9552a8bc3823346Chris Lattner case Instruction::And: 303e34537856a544c83513e390ac9552a8bc3823346Chris Lattner return SimplifyAndInst(I->getOperand(0), I->getOperand(1), TD); 304e34537856a544c83513e390ac9552a8bc3823346Chris Lattner case Instruction::Or: 305e34537856a544c83513e390ac9552a8bc3823346Chris Lattner return SimplifyOrInst(I->getOperand(0), I->getOperand(1), TD); 306e34537856a544c83513e390ac9552a8bc3823346Chris Lattner case Instruction::ICmp: 307e34537856a544c83513e390ac9552a8bc3823346Chris Lattner return SimplifyICmpInst(cast<ICmpInst>(I)->getPredicate(), 308e34537856a544c83513e390ac9552a8bc3823346Chris Lattner I->getOperand(0), I->getOperand(1), TD); 309e34537856a544c83513e390ac9552a8bc3823346Chris Lattner case Instruction::FCmp: 310e34537856a544c83513e390ac9552a8bc3823346Chris Lattner return SimplifyFCmpInst(cast<FCmpInst>(I)->getPredicate(), 311e34537856a544c83513e390ac9552a8bc3823346Chris Lattner I->getOperand(0), I->getOperand(1), TD); 312e34537856a544c83513e390ac9552a8bc3823346Chris Lattner } 313e34537856a544c83513e390ac9552a8bc3823346Chris Lattner} 314e34537856a544c83513e390ac9552a8bc3823346Chris Lattner 31540d8c28b27377199b7465ba2c5a2c59c6fd12fa9Chris Lattner/// ReplaceAndSimplifyAllUses - Perform From->replaceAllUsesWith(To) and then 31640d8c28b27377199b7465ba2c5a2c59c6fd12fa9Chris Lattner/// delete the From instruction. In addition to a basic RAUW, this does a 31740d8c28b27377199b7465ba2c5a2c59c6fd12fa9Chris Lattner/// recursive simplification of the newly formed instructions. This catches 31840d8c28b27377199b7465ba2c5a2c59c6fd12fa9Chris Lattner/// things where one simplification exposes other opportunities. This only 31940d8c28b27377199b7465ba2c5a2c59c6fd12fa9Chris Lattner/// simplifies and deletes scalar operations, it does not change the CFG. 32040d8c28b27377199b7465ba2c5a2c59c6fd12fa9Chris Lattner/// 32140d8c28b27377199b7465ba2c5a2c59c6fd12fa9Chris Lattnervoid llvm::ReplaceAndSimplifyAllUses(Instruction *From, Value *To, 32240d8c28b27377199b7465ba2c5a2c59c6fd12fa9Chris Lattner const TargetData *TD) { 32340d8c28b27377199b7465ba2c5a2c59c6fd12fa9Chris Lattner assert(From != To && "ReplaceAndSimplifyAllUses(X,X) is not valid!"); 32440d8c28b27377199b7465ba2c5a2c59c6fd12fa9Chris Lattner 32540d8c28b27377199b7465ba2c5a2c59c6fd12fa9Chris Lattner // FromHandle - This keeps a weakvh on the from value so that we can know if 32640d8c28b27377199b7465ba2c5a2c59c6fd12fa9Chris Lattner // it gets deleted out from under us in a recursive simplification. 32740d8c28b27377199b7465ba2c5a2c59c6fd12fa9Chris Lattner WeakVH FromHandle(From); 32840d8c28b27377199b7465ba2c5a2c59c6fd12fa9Chris Lattner 32940d8c28b27377199b7465ba2c5a2c59c6fd12fa9Chris Lattner while (!From->use_empty()) { 33040d8c28b27377199b7465ba2c5a2c59c6fd12fa9Chris Lattner // Update the instruction to use the new value. 33140d8c28b27377199b7465ba2c5a2c59c6fd12fa9Chris Lattner Use &U = From->use_begin().getUse(); 33240d8c28b27377199b7465ba2c5a2c59c6fd12fa9Chris Lattner Instruction *User = cast<Instruction>(U.getUser()); 33340d8c28b27377199b7465ba2c5a2c59c6fd12fa9Chris Lattner U = To; 33440d8c28b27377199b7465ba2c5a2c59c6fd12fa9Chris Lattner 33540d8c28b27377199b7465ba2c5a2c59c6fd12fa9Chris Lattner // See if we can simplify it. 33640d8c28b27377199b7465ba2c5a2c59c6fd12fa9Chris Lattner if (Value *V = SimplifyInstruction(User, TD)) { 33740d8c28b27377199b7465ba2c5a2c59c6fd12fa9Chris Lattner // Recursively simplify this. 33840d8c28b27377199b7465ba2c5a2c59c6fd12fa9Chris Lattner ReplaceAndSimplifyAllUses(User, V, TD); 33940d8c28b27377199b7465ba2c5a2c59c6fd12fa9Chris Lattner 34040d8c28b27377199b7465ba2c5a2c59c6fd12fa9Chris Lattner // If the recursive simplification ended up revisiting and deleting 'From' 34140d8c28b27377199b7465ba2c5a2c59c6fd12fa9Chris Lattner // then we're done. 34240d8c28b27377199b7465ba2c5a2c59c6fd12fa9Chris Lattner if (FromHandle == 0) 34340d8c28b27377199b7465ba2c5a2c59c6fd12fa9Chris Lattner return; 34440d8c28b27377199b7465ba2c5a2c59c6fd12fa9Chris Lattner } 34540d8c28b27377199b7465ba2c5a2c59c6fd12fa9Chris Lattner } 34640d8c28b27377199b7465ba2c5a2c59c6fd12fa9Chris Lattner From->eraseFromParent(); 34740d8c28b27377199b7465ba2c5a2c59c6fd12fa9Chris Lattner} 34840d8c28b27377199b7465ba2c5a2c59c6fd12fa9Chris Lattner 349