InstructionSimplify.cpp revision 9dbb42944c4d7caddab21016b24cca31019a3faf
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" 189f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner#include "llvm/Instructions.h" 199f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattnerusing namespace llvm; 209f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner 219f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner 229f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner/// SimplifyBinOp - Given operands for a BinaryOperator, see if we can 239f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner/// fold the result. If not, this returns null. 249f3c25aeb3df77a336693308dc0f19a4983c99afChris LattnerValue *llvm::SimplifyBinOp(unsigned Opcode, Value *LHS, Value *RHS, 259f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner const TargetData *TD) { 269f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner if (Constant *CLHS = dyn_cast<Constant>(LHS)) 279f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner if (Constant *CRHS = dyn_cast<Constant>(RHS)) { 289f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner Constant *COps[] = {CLHS, CRHS}; 299f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner return ConstantFoldInstOperands(Opcode, LHS->getType(), COps, 2, TD); 309f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner } 319f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner return 0; 329f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner} 339f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner 349f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner 359dbb42944c4d7caddab21016b24cca31019a3fafChris Lattner/// SimplifyICmpInst - Given operands for an ICmpInst, see if we can 369dbb42944c4d7caddab21016b24cca31019a3fafChris Lattner/// fold the result. If not, this returns null. 379dbb42944c4d7caddab21016b24cca31019a3fafChris LattnerValue *llvm::SimplifyICmpInst(unsigned Predicate, Value *LHS, Value *RHS, 389dbb42944c4d7caddab21016b24cca31019a3fafChris Lattner const TargetData *TD) { 399f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner CmpInst::Predicate Pred = (CmpInst::Predicate)Predicate; 409dbb42944c4d7caddab21016b24cca31019a3fafChris Lattner assert(CmpInst::isIntPredicate(Pred) && "Not an integer compare!"); 419f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner 429f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner if (Constant *CLHS = dyn_cast<Constant>(LHS)) 438f73deaa8732a556046bf4ac6207be55972e3b74Chris Lattner if (Constant *CRHS = dyn_cast<Constant>(RHS)) 448f73deaa8732a556046bf4ac6207be55972e3b74Chris Lattner return ConstantFoldCompareInstOperands(Pred, CLHS, CRHS, TD); 459f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner 469f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner // If this is an integer compare and the LHS and RHS are the same, fold it. 479f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner if (LHS == RHS) 489dbb42944c4d7caddab21016b24cca31019a3fafChris Lattner if (ICmpInst::isTrueWhenEqual(Pred)) 499dbb42944c4d7caddab21016b24cca31019a3fafChris Lattner return ConstantInt::getTrue(LHS->getContext()); 509dbb42944c4d7caddab21016b24cca31019a3fafChris Lattner else 519dbb42944c4d7caddab21016b24cca31019a3fafChris Lattner return ConstantInt::getFalse(LHS->getContext()); 529dbb42944c4d7caddab21016b24cca31019a3fafChris Lattner 539dbb42944c4d7caddab21016b24cca31019a3fafChris Lattner return 0; 549dbb42944c4d7caddab21016b24cca31019a3fafChris Lattner} 559dbb42944c4d7caddab21016b24cca31019a3fafChris Lattner 569dbb42944c4d7caddab21016b24cca31019a3fafChris Lattner/// SimplifyFCmpInst - Given operands for an FCmpInst, see if we can 579dbb42944c4d7caddab21016b24cca31019a3fafChris Lattner/// fold the result. If not, this returns null. 589dbb42944c4d7caddab21016b24cca31019a3fafChris LattnerValue *llvm::SimplifyFCmpInst(unsigned Predicate, Value *LHS, Value *RHS, 599dbb42944c4d7caddab21016b24cca31019a3fafChris Lattner const TargetData *TD) { 609dbb42944c4d7caddab21016b24cca31019a3fafChris Lattner CmpInst::Predicate Pred = (CmpInst::Predicate)Predicate; 619dbb42944c4d7caddab21016b24cca31019a3fafChris Lattner assert(CmpInst::isFPPredicate(Pred) && "Not an FP compare!"); 629dbb42944c4d7caddab21016b24cca31019a3fafChris Lattner 639dbb42944c4d7caddab21016b24cca31019a3fafChris Lattner if (Constant *CLHS = dyn_cast<Constant>(LHS)) 649dbb42944c4d7caddab21016b24cca31019a3fafChris Lattner if (Constant *CRHS = dyn_cast<Constant>(RHS)) 659dbb42944c4d7caddab21016b24cca31019a3fafChris Lattner return ConstantFoldCompareInstOperands(Pred, CLHS, CRHS, TD); 669dbb42944c4d7caddab21016b24cca31019a3fafChris Lattner 679f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner return 0; 689f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner} 699f3c25aeb3df77a336693308dc0f19a4983c99afChris Lattner 709dbb42944c4d7caddab21016b24cca31019a3fafChris Lattner 719dbb42944c4d7caddab21016b24cca31019a3fafChris Lattner 729dbb42944c4d7caddab21016b24cca31019a3fafChris Lattner/// SimplifyCmpInst - Given operands for a CmpInst, see if we can 739dbb42944c4d7caddab21016b24cca31019a3fafChris Lattner/// fold the result. 749dbb42944c4d7caddab21016b24cca31019a3fafChris LattnerValue *llvm::SimplifyCmpInst(unsigned Predicate, Value *LHS, Value *RHS, 759dbb42944c4d7caddab21016b24cca31019a3fafChris Lattner const TargetData *TD) { 769dbb42944c4d7caddab21016b24cca31019a3fafChris Lattner if (CmpInst::isIntPredicate((CmpInst::Predicate)Predicate)) 779dbb42944c4d7caddab21016b24cca31019a3fafChris Lattner return SimplifyICmpInst(Predicate, LHS, RHS, TD); 789dbb42944c4d7caddab21016b24cca31019a3fafChris Lattner return SimplifyFCmpInst(Predicate, LHS, RHS, TD); 799dbb42944c4d7caddab21016b24cca31019a3fafChris Lattner} 809dbb42944c4d7caddab21016b24cca31019a3fafChris Lattner 81