diff options
| author | Michael Ilseman <milseman@apple.com> | 2012-12-13 03:13:36 +0000 | 
|---|---|---|
| committer | Michael Ilseman <milseman@apple.com> | 2012-12-13 03:13:36 +0000 | 
| commit | 536cc32ba051fbadeb0f6929b0270427330e4152 (patch) | |
| tree | e3cfe19955fb92f1ca1f9084ec394c280eda678c /llvm/lib/Transforms | |
| parent | cf6d6317cc59d8d6cac9b600a265d06d5a513885 (diff) | |
| download | bcm5719-llvm-536cc32ba051fbadeb0f6929b0270427330e4152.tar.gz bcm5719-llvm-536cc32ba051fbadeb0f6929b0270427330e4152.zip | |
Pattern matching code for intrinsics.
Provides m_Argument that allows matching against a CallSite's specified argument. Provides m_Intrinsic pattern that can be templatized over the intrinsic id and bind/match arguments similarly to other pattern matchers. Implementations provided for 0 to 4 arguments, though it's very simple to extend for more. Also provides example template specialization for bswap (m_BSwap) and example of code cleanup for its use.
llvm-svn: 170091
Diffstat (limited to 'llvm/lib/Transforms')
| -rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp | 32 | 
1 files changed, 17 insertions, 15 deletions
| diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp index 8cd9409f5e0..ba4a57329d5 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp @@ -16,9 +16,11 @@  #include "llvm/Analysis/MemoryBuiltins.h"  #include "llvm/DataLayout.h"  #include "llvm/Support/CallSite.h" +#include "llvm/Support/PatternMatch.h"  #include "llvm/Transforms/Utils/BuildLibCalls.h"  #include "llvm/Transforms/Utils/Local.h"  using namespace llvm; +using namespace PatternMatch;  STATISTIC(NumSimplified, "Number of library calls simplified"); @@ -276,25 +278,25 @@ Instruction *InstCombiner::visitCallInst(CallInst &CI) {        return ReplaceInstUsesWith(CI, ConstantInt::get(CI.getType(), Size));      return 0;    } -  case Intrinsic::bswap: +  case Intrinsic::bswap: { +    Value *IIOperand = II->getArgOperand(0); +    Value *X = 0; +      // bswap(bswap(x)) -> x -    if (IntrinsicInst *Operand = dyn_cast<IntrinsicInst>(II->getArgOperand(0))) -      if (Operand->getIntrinsicID() == Intrinsic::bswap) -        return ReplaceInstUsesWith(CI, Operand->getArgOperand(0)); +    if (match(IIOperand, m_BSwap(m_Value(X)))) +        return ReplaceInstUsesWith(CI, X);      // bswap(trunc(bswap(x))) -> trunc(lshr(x, c)) -    if (TruncInst *TI = dyn_cast<TruncInst>(II->getArgOperand(0))) { -      if (IntrinsicInst *Operand = dyn_cast<IntrinsicInst>(TI->getOperand(0))) -        if (Operand->getIntrinsicID() == Intrinsic::bswap) { -          unsigned C = Operand->getType()->getPrimitiveSizeInBits() - -                       TI->getType()->getPrimitiveSizeInBits(); -          Value *CV = ConstantInt::get(Operand->getType(), C); -          Value *V = Builder->CreateLShr(Operand->getArgOperand(0), CV); -          return new TruncInst(V, TI->getType()); -        } +    if (match(IIOperand, m_Trunc(m_BSwap(m_Value(X))))) { +      unsigned C = X->getType()->getPrimitiveSizeInBits() - +        IIOperand->getType()->getPrimitiveSizeInBits(); +      Value *CV = ConstantInt::get(X->getType(), C); +      Value *V = Builder->CreateLShr(X, CV); +      return new TruncInst(V, IIOperand->getType());      } -      break; +  } +    case Intrinsic::powi:      if (ConstantInt *Power = dyn_cast<ConstantInt>(II->getArgOperand(1))) {        // powi(x, 0) -> 1.0 @@ -693,7 +695,7 @@ Instruction *InstCombiner::visitCallInst(CallInst &CI) {          if (Splat->isOne()) {            if (Zext)              return CastInst::CreateZExtOrBitCast(Arg0, II->getType()); -          // else     +          // else            return CastInst::CreateSExtOrBitCast(Arg0, II->getType());          }        } | 

