[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