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