[llvm] r366069 - [PatternMatch] Implement matching code for LibFunc

Ilya Biryukov via llvm-commits llvm-commits at lists.llvm.org
Mon Jul 15 09:53:20 PDT 2019


Sorry about the confusion, there is no circular dependency (Analysis does
not depend on IR).
But that does seem to be a layering violation to depend on a header from
Analysis in IR. (looking at LLVMBuild.txt files).

Also agree it would be great to enforce this, but sending emails seems to
be the best thing we can do to the date.

On Mon, Jul 15, 2019 at 6:51 PM Roman Lebedev <lebedev.ri at gmail.com> wrote:

> It would be *really* good to have a public bot with such config..
> (and one with -DBUILD_SHARED_LIBS=ON too, unless it was already added
> recently)
>
> Roman.
>
> On Mon, Jul 15, 2019 at 7:44 PM Ilya Biryukov via llvm-commits
> <llvm-commits at lists.llvm.org> wrote:
> >
> > Reverted in r366081 to unbreak our integrate.
> > Sorry about the inconvenience.
> >
> > On Mon, Jul 15, 2019 at 6:35 PM Ilya Biryukov <ibiryukov at google.com>
> wrote:
> >>
> >> Hi Dmitry,
> >>
> >> This code introduces a layering violation (Analysis already depends on
> IR, therefore IR cannot depend on Analysis.
> >> Is there a way to quickly fix this?
> >>
> >> If not, I would have to revert this in order to fix our build.
> >>
> >> On Mon, Jul 15, 2019 at 4:47 PM Dmitry Venikov via llvm-commits <
> llvm-commits at lists.llvm.org> wrote:
> >>>
> >>> Author: quolyk
> >>> Date: Mon Jul 15 07:47:45 2019
> >>> New Revision: 366069
> >>>
> >>> URL: http://llvm.org/viewvc/llvm-project?rev=366069&view=rev
> >>> Log:
> >>> [PatternMatch] Implement matching code for LibFunc
> >>>
> >>> Summary: Provides m_LibFunc pattern that can be used to match LibFuncs.
> >>>
> >>> Reviewers: spatel, hfinkel, efriedma, lebedev.ri
> >>>
> >>> Reviewed By: lebedev.ri
> >>>
> >>> Subscribers: lebedev.ri, llvm-commits
> >>>
> >>> Tags: #llvm
> >>>
> >>> Differential Revision: https://reviews.llvm.org/D42047
> >>>
> >>> Modified:
> >>>     llvm/trunk/include/llvm/IR/PatternMatch.h
> >>>     llvm/trunk/unittests/IR/PatternMatch.cpp
> >>>
> >>> Modified: llvm/trunk/include/llvm/IR/PatternMatch.h
> >>> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/PatternMatch.h?rev=366069&r1=366068&r2=366069&view=diff
> >>>
> ==============================================================================
> >>> --- llvm/trunk/include/llvm/IR/PatternMatch.h (original)
> >>> +++ llvm/trunk/include/llvm/IR/PatternMatch.h Mon Jul 15 07:47:45 2019
> >>> @@ -30,6 +30,7 @@
> >>>
> >>>  #include "llvm/ADT/APFloat.h"
> >>>  #include "llvm/ADT/APInt.h"
> >>> +#include "llvm/Analysis/TargetLibraryInfo.h"
> >>>  #include "llvm/IR/Constant.h"
> >>>  #include "llvm/IR/Constants.h"
> >>>  #include "llvm/IR/InstrTypes.h"
> >>> @@ -1812,6 +1813,57 @@ template <typename Val_t> inline Signum_
> >>>    return Signum_match<Val_t>(V);
> >>>  }
> >>>
> >>> +/// \brief LibFunc matchers.
> >>> +struct LibFunc_match {
> >>> +  LibFunc F;
> >>> +  TargetLibraryInfo TLI;
> >>> +
> >>> +  LibFunc_match(LibFunc Func, TargetLibraryInfo TargetLI)
> >>> +  : F(Func), TLI(TargetLI) {}
> >>> +
> >>> +  template <typename OpTy> bool match(OpTy *V) {
> >>> +    LibFunc LF;
> >>> +    if (const auto *CI = dyn_cast<CallInst>(V))
> >>> +      if (!CI->isNoBuiltin() && CI->getCalledFunction() &&
> >>> +          TLI.getLibFunc(*CI->getCalledFunction(), LF) &&
> >>> +          LF == F && TLI.has(LF))
> >>> +        return true;
> >>> +    return false;
> >>> +  }
> >>> +};
> >>> +
> >>> +/// LibFunc matches are combinations of Name matchers, and argument
> >>> +/// matchers.
> >>> +template <typename T0 = void, typename T1 = void, typename T2 = void>
> >>> +struct m_LibFunc_Ty;
> >>> +template <typename T0> struct m_LibFunc_Ty<T0> {
> >>> +  using Ty = match_combine_and<LibFunc_match, Argument_match<T0>>;
> >>> +};
> >>> +template <typename T0, typename T1> struct m_LibFunc_Ty<T0, T1> {
> >>> +  using Ty =
> >>> +  match_combine_and<typename m_LibFunc_Ty<T0>::Ty,
> >>> +  Argument_match<T1>>;
> >>> +};
> >>> +
> >>> +/// \brief Match LibFunc calls like this:
> >>> +/// m_LibFunc<LibFunc_tan>(m_Value(X))
> >>> +template <LibFunc F>
> >>> +inline LibFunc_match m_LibFunc(TargetLibraryInfo TLI) {
> >>> +  return LibFunc_match(F, TLI);
> >>> +}
> >>> +
> >>> +template <LibFunc F, typename T0>
> >>> +inline typename m_LibFunc_Ty<T0>::Ty
> >>> +m_LibFunc(const TargetLibraryInfo TLI, const T0 &Op0) {
> >>> +  return m_CombineAnd(m_LibFunc<F>(TLI), m_Argument<0>(Op0));
> >>> +}
> >>> +
> >>> +template <LibFunc F, typename T0, typename T1>
> >>> +inline typename m_LibFunc_Ty<T0, T1>::Ty
> >>> +m_LibFunc(const TargetLibraryInfo TLI, const T0 &Op0, const T1 &Op1) {
> >>> +  return m_CombineAnd(m_LibFunc<F>(TLI, Op0), m_Argument<1>(Op1));
> >>> +}
> >>> +
> >>>  } // end namespace PatternMatch
> >>>  } // end namespace llvm
> >>>
> >>>
> >>> Modified: llvm/trunk/unittests/IR/PatternMatch.cpp
> >>> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/IR/PatternMatch.cpp?rev=366069&r1=366068&r2=366069&view=diff
> >>>
> ==============================================================================
> >>> --- llvm/trunk/unittests/IR/PatternMatch.cpp (original)
> >>> +++ llvm/trunk/unittests/IR/PatternMatch.cpp Mon Jul 15 07:47:45 2019
> >>> @@ -35,13 +35,15 @@ struct PatternMatchTest : ::testing::Tes
> >>>    Function *F;
> >>>    BasicBlock *BB;
> >>>    IRBuilder<NoFolder> IRB;
> >>> +  TargetLibraryInfoImpl TLII;
> >>> +  TargetLibraryInfo TLI;
> >>>
> >>>    PatternMatchTest()
> >>>        : M(new Module("PatternMatchTestModule", Ctx)),
> >>>          F(Function::Create(
> >>>              FunctionType::get(Type::getVoidTy(Ctx), /* IsVarArg */
> false),
> >>>              Function::ExternalLinkage, "f", M.get())),
> >>> -        BB(BasicBlock::Create(Ctx, "entry", F)), IRB(BB) {}
> >>> +        BB(BasicBlock::Create(Ctx, "entry", F)), IRB(BB), TLI(TLII) {}
> >>>  };
> >>>
> >>>  TEST_F(PatternMatchTest, OneUse) {
> >>> @@ -1008,6 +1010,40 @@ TEST_F(PatternMatchTest, FloatingPointFN
> >>>    EXPECT_FALSE(match(V3, m_FNeg(m_Value(Match))));
> >>>  }
> >>>
> >>> +TEST_F(PatternMatchTest, LibFunc) {
> >>> +  Type *FltTy = IRB.getFloatTy();
> >>> +  Value *One = ConstantFP::get(FltTy, 1.0);
> >>> +  Value *Two = ConstantFP::get(FltTy, 2.0);
> >>> +  Value *MatchOne, *MatchTwo;
> >>> +
> >>> +  StringRef TanName = TLI.getName(LibFunc_tan);
> >>> +  FunctionCallee TanCallee = M->getOrInsertFunction(TanName, FltTy,
> FltTy);
> >>> +  CallInst *Tan = IRB.CreateCall(TanCallee, One, TanName);
> >>> +
> >>> +  StringRef PowName = TLI.getName(LibFunc_pow);
> >>> +  FunctionCallee PowCallee = M->getOrInsertFunction(PowName, FltTy,
> FltTy, FltTy);
> >>> +  CallInst *Pow = IRB.CreateCall(PowCallee, {One, Two}, PowName);
> >>> +
> >>> +  EXPECT_TRUE(match(Tan, m_LibFunc<LibFunc_tan>(TLI)));
> >>> +  EXPECT_FALSE(match(Tan, m_LibFunc<LibFunc_pow>(TLI)));
> >>> +  EXPECT_FALSE(match(Pow, m_LibFunc<LibFunc_tan>(TLI)));
> >>> +
> >>> +  EXPECT_TRUE(match(Tan, m_LibFunc<LibFunc_tan>(TLI,
> m_Value(MatchOne))));
> >>> +  EXPECT_EQ(One, MatchOne);
> >>> +  EXPECT_FALSE(match(Tan, m_LibFunc<LibFunc_sin>(TLI, m_Value())));
> >>> +
> >>> +  EXPECT_TRUE(match(Pow, m_LibFunc<LibFunc_pow>(TLI,
> m_Value(MatchOne),
> >>> +                                                m_Value(MatchTwo))));
> >>> +  EXPECT_EQ(One, MatchOne);
> >>> +  EXPECT_EQ(Two, MatchTwo);
> >>> +  EXPECT_FALSE(match(Pow, m_LibFunc<LibFunc_fminf>(TLI, m_Value(),
> m_Value())));
> >>> +
> >>> +  TLII.disableAllFunctions();
> >>> +  EXPECT_FALSE(match(Tan, m_LibFunc<LibFunc_tan>(TLI)));
> >>> +  EXPECT_FALSE(match(Tan, m_LibFunc<LibFunc_tan>(TLI, m_Value())));
> >>> +  EXPECT_FALSE(match(Pow, m_LibFunc<LibFunc_pow>(TLI, m_Value(),
> m_Value())));
> >>> +}
> >>> +
> >>>  template <typename T> struct MutableConstTest : PatternMatchTest { };
> >>>
> >>>  typedef ::testing::Types<std::tuple<Value*, Instruction*>,
> >>>
> >>>
> >>> _______________________________________________
> >>> llvm-commits mailing list
> >>> llvm-commits at lists.llvm.org
> >>> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
> >>
> >>
> >>
> >> --
> >> Regards,
> >> Ilya Biryukov
> >
> >
> >
> > --
> > Regards,
> > Ilya Biryukov
> > _______________________________________________
> > llvm-commits mailing list
> > llvm-commits at lists.llvm.org
> > https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>


-- 
Regards,
Ilya Biryukov
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190715/591c64f4/attachment.html>


More information about the llvm-commits mailing list