forked from OSchip/llvm-project
stub out a new libanalysis "instruction simplify" interface that
takes decimated instructions and applies identities to them. This is pretty minimal at this point, but I plan to pull some instcombine logic out into these and similar routines. llvm-svn: 86613
This commit is contained in:
parent
e213db84cb
commit
084a1b5581
|
@ -0,0 +1,37 @@
|
|||
//===-- InstructionSimplify.h - Fold instructions into simpler forms ------===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// This file declares routines for folding instructions into simpler forms that
|
||||
// do not require creating new instructions. For example, this does constant
|
||||
// folding, and can handle identities like (X&0)->0.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef LLVM_ANALYSIS_INSTRUCTIONSIMPLIFY_H
|
||||
#define LLVM_ANALYSIS_INSTRUCTIONSIMPLIFY_H
|
||||
|
||||
namespace llvm {
|
||||
class Value;
|
||||
class TargetData;
|
||||
|
||||
/// SimplifyCompare - Given operands for a CmpInst, see if we can
|
||||
/// fold the result. If not, this returns null.
|
||||
Value *SimplifyCompare(unsigned Predicate, Value *LHS, Value *RHS,
|
||||
const TargetData *TD = 0);
|
||||
|
||||
|
||||
/// SimplifyBinOp - Given operands for a BinaryOperator, see if we can
|
||||
/// fold the result. If not, this returns null.
|
||||
Value *SimplifyBinOp(unsigned Opcode, Value *LHS, Value *RHS,
|
||||
const TargetData *TD = 0);
|
||||
|
||||
} // end namespace llvm
|
||||
|
||||
#endif
|
||||
|
|
@ -15,6 +15,7 @@ add_llvm_library(LLVMAnalysis
|
|||
IVUsers.cpp
|
||||
InlineCost.cpp
|
||||
InstCount.cpp
|
||||
InstructionSimplify.cpp
|
||||
Interval.cpp
|
||||
IntervalPartition.cpp
|
||||
LibCallAliasAnalysis.cpp
|
||||
|
|
|
@ -0,0 +1,57 @@
|
|||
//===- InstructionSimplify.cpp - Fold instruction operands ----------------===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// This file implements routines for folding instructions into simpler forms
|
||||
// that do not require creating new instructions. For example, this does
|
||||
// constant folding, and can handle identities like (X&0)->0.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "llvm/Analysis/InstructionSimplify.h"
|
||||
#include "llvm/Analysis/ConstantFolding.h"
|
||||
#include "llvm/Instructions.h"
|
||||
using namespace llvm;
|
||||
|
||||
|
||||
/// SimplifyBinOp - Given operands for a BinaryOperator, see if we can
|
||||
/// fold the result. If not, this returns null.
|
||||
Value *llvm::SimplifyBinOp(unsigned Opcode, Value *LHS, Value *RHS,
|
||||
const TargetData *TD) {
|
||||
if (Constant *CLHS = dyn_cast<Constant>(LHS))
|
||||
if (Constant *CRHS = dyn_cast<Constant>(RHS)) {
|
||||
Constant *COps[] = {CLHS, CRHS};
|
||||
return ConstantFoldInstOperands(Opcode, LHS->getType(), COps, 2, TD);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/// SimplifyCompare - Given operands for a CmpInst, see if we can
|
||||
/// fold the result.
|
||||
Value *llvm::SimplifyCompare(unsigned Predicate, Value *LHS, Value *RHS,
|
||||
const TargetData *TD) {
|
||||
CmpInst::Predicate Pred = (CmpInst::Predicate)Predicate;
|
||||
|
||||
if (Constant *CLHS = dyn_cast<Constant>(LHS))
|
||||
if (Constant *CRHS = dyn_cast<Constant>(RHS)) {
|
||||
Constant *COps[] = {CLHS, CRHS};
|
||||
return ConstantFoldCompareInstOperands(Pred, COps, 2, TD);
|
||||
}
|
||||
|
||||
// If this is an integer compare and the LHS and RHS are the same, fold it.
|
||||
if (LHS == RHS)
|
||||
if (isa<IntegerType>(LHS->getType()) || isa<PointerType>(LHS->getType())) {
|
||||
if (ICmpInst::isTrueWhenEqual(Pred))
|
||||
return ConstantInt::getTrue(LHS->getContext());
|
||||
else
|
||||
return ConstantInt::getFalse(LHS->getContext());
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
Reference in New Issue