[llvm-commits] [llvm] r86613 - in /llvm/trunk: include/llvm/Analysis/InstructionSimplify.h lib/Analysis/CMakeLists.txt lib/Analysis/InstructionSimplify.cpp
Nick Lewycky
nlewycky at google.com
Mon Nov 9 15:17:27 PST 2009
2009/11/9 Chris Lattner <sabre at nondot.org>
> Author: lattner
> Date: Mon Nov 9 16:57:59 2009
> New Revision: 86613
>
> URL: http://llvm.org/viewvc/llvm-project?rev=86613&view=rev
> Log:
> 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.
>
> Added:
> llvm/trunk/include/llvm/Analysis/InstructionSimplify.h
> llvm/trunk/lib/Analysis/InstructionSimplify.cpp
> Modified:
> llvm/trunk/lib/Analysis/CMakeLists.txt
>
> Added: llvm/trunk/include/llvm/Analysis/InstructionSimplify.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/InstructionSimplify.h?rev=86613&view=auto
>
>
> ==============================================================================
> --- llvm/trunk/include/llvm/Analysis/InstructionSimplify.h (added)
> +++ llvm/trunk/include/llvm/Analysis/InstructionSimplify.h Mon Nov 9
> 16:57:59 2009
> @@ -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
> +
>
> Modified: llvm/trunk/lib/Analysis/CMakeLists.txt
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/CMakeLists.txt?rev=86613&r1=86612&r2=86613&view=diff
>
>
> ==============================================================================
> --- llvm/trunk/lib/Analysis/CMakeLists.txt (original)
> +++ llvm/trunk/lib/Analysis/CMakeLists.txt Mon Nov 9 16:57:59 2009
> @@ -15,6 +15,7 @@
> IVUsers.cpp
> InlineCost.cpp
> InstCount.cpp
> + InstructionSimplify.cpp
> Interval.cpp
> IntervalPartition.cpp
> LibCallAliasAnalysis.cpp
>
> Added: llvm/trunk/lib/Analysis/InstructionSimplify.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/InstructionSimplify.cpp?rev=86613&view=auto
>
>
> ==============================================================================
> --- llvm/trunk/lib/Analysis/InstructionSimplify.cpp (added)
> +++ llvm/trunk/lib/Analysis/InstructionSimplify.cpp Mon Nov 9 16:57:59
> 2009
> @@ -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());
> + }
>
There's an CmpInst::isTrueWhenEqual and CmpInst::isFalseWhenEqual, both of
which work on icmp and fcmp. Please use that instead, adding support for
floats in the process!
Nick
> + return 0;
> +}
> +
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20091109/48444335/attachment.html>
More information about the llvm-commits
mailing list