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