[llvm] r267111 - [EarlyCSE] Take the intersection of flags on instructions
David Majnemer via llvm-commits
llvm-commits at lists.llvm.org
Fri Apr 22 07:20:11 PDT 2016
Despite my best efforts, I couldn't reproduce this issue. However,
inspection of the code yielded something suspicious and was fixed
in r267153. Please let me know if you still have problems.
If you *do* have problems, please post a copy of the failing output of
-early-cse so that I can figure out what is going wrong.
Thanks.
On Fri, Apr 22, 2016 at 10:06 AM, David Majnemer <david.majnemer at gmail.com>
wrote:
> Thanks, taking a look.
>
>
> On Friday, April 22, 2016, Mikael Holmén <mikael.holmen at ericsson.com>
> wrote:
>
>> Same thing is happening to me.
>>
>> Transforms/EarlyCSE/basic.ll
>>
>> is failing quite randomly now and then with:
>>
>> Command Output (stderr):
>> --
>> /repo/uabelho/dev-master/test/Transforms/EarlyCSE/basic.ll:31:16: error:
>> expected string not found in input
>> ; CHECK-NEXT: %G = add nuw i32 %C, %C
>> ^
>> <stdin>:14:23: note: scanning from here
>> store volatile i32 %E, i32* %P
>> ^
>> <stdin>:15:3: note: possible intended match here
>> store volatile i32 %E, i32* %P
>> ^
>>
>> Regards,
>> Mikael
>>
>> On 04/22/2016 03:22 PM, Daniel Sanders via llvm-commits wrote:
>>
>>> Resent to the correct mailing list. Outlook makes me re-add the list on
>>> every reply and I didn't notice I'd autocompleted to the wrong one.
>>>
>>> -----Original Message-----
>>>> From: llvm-dev [mailto:llvm-dev-bounces at lists.llvm.org] On Behalf Of
>>>> Daniel
>>>> Sanders via llvm-dev
>>>> Sent: 22 April 2016 11:36
>>>> To: David Majnemer; llvm-dev at lists.llvm.org
>>>> Subject: Re: [llvm-dev] [llvm] r267111 - [EarlyCSE] Take the
>>>> intersection of
>>>> flags on instructions
>>>>
>>>> Hi David,
>>>>
>>>> When I reverted r267098 in r267127, one of the EarlyCSE tests failed on
>>>> a
>>>> couple builders (http://lab.llvm.org:8011/builders/llvm-hexagon-
>>>> elf/builds/28174,
>>>> http://lab.llvm.org:8011/builders/llvm-clang-lld-x86_64-
>>>> scei-ps4-ubuntu-fast/builds/11173). Going by the logs it was CSE'ing
>>>> two adds
>>>> where one had the nuw flag and one didn't. The failures disappeared by
>>>> themselves in the next build but I thought I should mention it anyway.
>>>>
>>>> -----Original Message-----
>>>>> From: llvm-commits [mailto:llvm-commits-bounces at lists.llvm.org] On
>>>>>
>>>> Behalf
>>>>
>>>>> Of David Majnemer via llvm-commits
>>>>> Sent: 22 April 2016 07:38
>>>>> To: llvm-commits at lists.llvm.org
>>>>> Subject: [llvm] r267111 - [EarlyCSE] Take the intersection of flags on
>>>>> instructions
>>>>>
>>>>> Author: majnemer
>>>>> Date: Fri Apr 22 01:37:45 2016
>>>>> New Revision: 267111
>>>>>
>>>>> URL: http://llvm.org/viewvc/llvm-project?rev=267111&view=rev
>>>>> Log:
>>>>> [EarlyCSE] Take the intersection of flags on instructions
>>>>>
>>>>> EarlyCSE had inconsistent behavior with regards to flag'd instructions:
>>>>> - In some cases, it would pessimize if the available instruction had
>>>>> different flags by not performing CSE.
>>>>> - In other cases, it would miscompile if it replaced an instruction
>>>>> which had no flags with an instruction which has flags.
>>>>>
>>>>> Fix this by being more consistent with our flag handling by utilizing
>>>>> andIRFlags.
>>>>>
>>>>> Added:
>>>>> llvm/trunk/test/Transforms/EarlyCSE/flags.ll
>>>>> Modified:
>>>>> llvm/trunk/include/llvm/IR/InstrTypes.h
>>>>> llvm/trunk/include/llvm/IR/Instruction.h
>>>>> llvm/trunk/include/llvm/IR/Operator.h
>>>>> llvm/trunk/lib/IR/Instruction.cpp
>>>>> llvm/trunk/lib/IR/Instructions.cpp
>>>>> llvm/trunk/lib/Transforms/Scalar/EarlyCSE.cpp
>>>>>
>>>>> Modified: llvm/trunk/include/llvm/IR/InstrTypes.h
>>>>> URL: http://llvm.org/viewvc/llvm-
>>>>>
>>>>> project/llvm/trunk/include/llvm/IR/InstrTypes.h?rev=267111&r1=267110&r2
>>>>
>>>>> =267111&view=diff
>>>>>
>>>>> ==========================================================
>>>>
>>>>> ====================
>>>>> --- llvm/trunk/include/llvm/IR/InstrTypes.h (original)
>>>>> +++ llvm/trunk/include/llvm/IR/InstrTypes.h Fri Apr 22 01:37:45 2016
>>>>> @@ -535,35 +535,6 @@ public:
>>>>> ///
>>>>> bool swapOperands();
>>>>>
>>>>> - /// Set or clear the nsw flag on this instruction, which must be an
>>>>>
>>>> operator
>>>>
>>>>> - /// which supports this flag. See LangRef.html for the meaning of
>>>>> this
>>>>>
>>>> flag.
>>>>
>>>>> - void setHasNoUnsignedWrap(bool b = true);
>>>>> -
>>>>> - /// Set or clear the nsw flag on this instruction, which must be an
>>>>>
>>>> operator
>>>>
>>>>> - /// which supports this flag. See LangRef.html for the meaning of
>>>>> this
>>>>>
>>>> flag.
>>>>
>>>>> - void setHasNoSignedWrap(bool b = true);
>>>>> -
>>>>> - /// Set or clear the exact flag on this instruction, which must be
>>>>> an
>>>>>
>>>> operator
>>>>
>>>>> - /// which supports this flag. See LangRef.html for the meaning of
>>>>> this
>>>>>
>>>> flag.
>>>>
>>>>> - void setIsExact(bool b = true);
>>>>> -
>>>>> - /// Determine whether the no unsigned wrap flag is set.
>>>>> - bool hasNoUnsignedWrap() const;
>>>>> -
>>>>> - /// Determine whether the no signed wrap flag is set.
>>>>> - bool hasNoSignedWrap() const;
>>>>> -
>>>>> - /// Determine whether the exact flag is set.
>>>>> - bool isExact() const;
>>>>> -
>>>>> - /// Convenience method to copy supported wrapping, exact, and fast-
>>>>> math flags
>>>>> - /// from V to this instruction.
>>>>> - void copyIRFlags(const Value *V);
>>>>> -
>>>>> - /// Logical 'and' of any supported wrapping, exact, and fast-math
>>>>> flags of
>>>>> - /// V and this instruction.
>>>>> - void andIRFlags(const Value *V);
>>>>> -
>>>>> // Methods for support type inquiry through isa, cast, and
>>>>> dyn_cast:
>>>>> static inline bool classof(const Instruction *I) {
>>>>> return I->isBinaryOp();
>>>>>
>>>>> Modified: llvm/trunk/include/llvm/IR/Instruction.h
>>>>> URL: http://llvm.org/viewvc/llvm-
>>>>>
>>>>>
>>>> project/llvm/trunk/include/llvm/IR/Instruction.h?rev=267111&r1=267110&r2
>>>>
>>>>> =267111&view=diff
>>>>>
>>>>> ==========================================================
>>>>
>>>>> ====================
>>>>> --- llvm/trunk/include/llvm/IR/Instruction.h (original)
>>>>> +++ llvm/trunk/include/llvm/IR/Instruction.h Fri Apr 22 01:37:45 2016
>>>>> @@ -223,6 +223,27 @@ public:
>>>>> /// Return the debug location for this node as a DebugLoc.
>>>>> const DebugLoc &getDebugLoc() const { return DbgLoc; }
>>>>>
>>>>> + /// Set or clear the nsw flag on this instruction, which must be an
>>>>>
>>>> operator
>>>>
>>>>> + /// which supports this flag. See LangRef.html for the meaning of
>>>>> this
>>>>>
>>>> flag.
>>>>
>>>>> + void setHasNoUnsignedWrap(bool b = true);
>>>>> +
>>>>> + /// Set or clear the nsw flag on this instruction, which must be an
>>>>>
>>>> operator
>>>>
>>>>> + /// which supports this flag. See LangRef.html for the meaning of
>>>>> this
>>>>>
>>>> flag.
>>>>
>>>>> + void setHasNoSignedWrap(bool b = true);
>>>>> +
>>>>> + /// Set or clear the exact flag on this instruction, which must be
>>>>> an
>>>>> operator
>>>>> + /// which supports this flag. See LangRef.html for the meaning of
>>>>> this
>>>>>
>>>> flag.
>>>>
>>>>> + void setIsExact(bool b = true);
>>>>> +
>>>>> + /// Determine whether the no unsigned wrap flag is set.
>>>>> + bool hasNoUnsignedWrap() const;
>>>>> +
>>>>> + /// Determine whether the no signed wrap flag is set.
>>>>> + bool hasNoSignedWrap() const;
>>>>> +
>>>>> + /// Determine whether the exact flag is set.
>>>>> + bool isExact() const;
>>>>> +
>>>>> /// Set or clear the unsafe-algebra flag on this instruction,
>>>>> which must be
>>>>>
>>>> an
>>>>
>>>>> /// operator which supports this flag. See LangRef.html for the
>>>>> meaning
>>>>>
>>>> of
>>>>
>>>>> /// this flag.
>>>>> @@ -281,6 +302,14 @@ public:
>>>>> /// Copy I's fast-math flags
>>>>> void copyFastMathFlags(const Instruction *I);
>>>>>
>>>>> + /// Convenience method to copy supported wrapping, exact, and fast-
>>>>> math flags
>>>>> + /// from V to this instruction.
>>>>> + void copyIRFlags(const Value *V);
>>>>> +
>>>>> + /// Logical 'and' of any supported wrapping, exact, and fast-math
>>>>> flags of
>>>>> + /// V and this instruction.
>>>>> + void andIRFlags(const Value *V);
>>>>> +
>>>>> private:
>>>>> /// Return true if we have an entry in the on-the-side metadata
>>>>> hash.
>>>>> bool hasMetadataHashEntry() const {
>>>>>
>>>>> Modified: llvm/trunk/include/llvm/IR/Operator.h
>>>>> URL: http://llvm.org/viewvc/llvm-
>>>>>
>>>>> project/llvm/trunk/include/llvm/IR/Operator.h?rev=267111&r1=267110&r2=
>>>>
>>>>> 267111&view=diff
>>>>>
>>>>> ==========================================================
>>>>
>>>>> ====================
>>>>> --- llvm/trunk/include/llvm/IR/Operator.h (original)
>>>>> +++ llvm/trunk/include/llvm/IR/Operator.h Fri Apr 22 01:37:45 2016
>>>>> @@ -79,7 +79,7 @@ public:
>>>>> };
>>>>>
>>>>> private:
>>>>> - friend class BinaryOperator;
>>>>> + friend class Instruction;
>>>>> friend class ConstantExpr;
>>>>> void setHasNoUnsignedWrap(bool B) {
>>>>> SubclassOptionalData =
>>>>> @@ -130,7 +130,7 @@ public:
>>>>> };
>>>>>
>>>>> private:
>>>>> - friend class BinaryOperator;
>>>>> + friend class Instruction;
>>>>> friend class ConstantExpr;
>>>>> void setIsExact(bool B) {
>>>>> SubclassOptionalData = (SubclassOptionalData & ~IsExact) | (B *
>>>>> IsExact);
>>>>>
>>>>> Modified: llvm/trunk/lib/IR/Instruction.cpp
>>>>> URL: http://llvm.org/viewvc/llvm-
>>>>>
>>>>> project/llvm/trunk/lib/IR/Instruction.cpp?rev=267111&r1=267110&r2=26711
>>>>
>>>>> 1&view=diff
>>>>>
>>>>> ==========================================================
>>>>
>>>>> ====================
>>>>> --- llvm/trunk/lib/IR/Instruction.cpp (original)
>>>>> +++ llvm/trunk/lib/IR/Instruction.cpp Fri Apr 22 01:37:45 2016
>>>>> @@ -96,6 +96,30 @@ void Instruction::moveBefore(Instruction
>>>>> MovePos->getIterator(), getParent()->getInstList(),
>>>>> getIterator());
>>>>> }
>>>>>
>>>>> +void Instruction::setHasNoUnsignedWrap(bool b) {
>>>>> + cast<OverflowingBinaryOperator>(this)->setHasNoUnsignedWrap(b);
>>>>> +}
>>>>> +
>>>>> +void Instruction::setHasNoSignedWrap(bool b) {
>>>>> + cast<OverflowingBinaryOperator>(this)->setHasNoSignedWrap(b);
>>>>> +}
>>>>> +
>>>>> +void Instruction::setIsExact(bool b) {
>>>>> + cast<PossiblyExactOperator>(this)->setIsExact(b);
>>>>> +}
>>>>> +
>>>>> +bool Instruction::hasNoUnsignedWrap() const {
>>>>> + return cast<OverflowingBinaryOperator>(this)->hasNoUnsignedWrap();
>>>>> +}
>>>>> +
>>>>> +bool Instruction::hasNoSignedWrap() const {
>>>>> + return cast<OverflowingBinaryOperator>(this)->hasNoSignedWrap();
>>>>> +}
>>>>> +
>>>>> +bool Instruction::isExact() const {
>>>>> + return cast<PossiblyExactOperator>(this)->isExact();
>>>>> +}
>>>>> +
>>>>> /// Set or clear the unsafe-algebra flag on this instruction, which
>>>>> must be
>>>>>
>>>> an
>>>>
>>>>> /// operator which supports this flag. See LangRef.html for the
>>>>> meaning of
>>>>> this
>>>>> /// flag.
>>>>> @@ -190,6 +214,37 @@ void Instruction::copyFastMathFlags(cons
>>>>> copyFastMathFlags(I->getFastMathFlags());
>>>>> }
>>>>>
>>>>> +void Instruction::copyIRFlags(const Value *V) {
>>>>> + // Copy the wrapping flags.
>>>>> + if (auto *OB = dyn_cast<OverflowingBinaryOperator>(V)) {
>>>>> + setHasNoSignedWrap(OB->hasNoSignedWrap());
>>>>> + setHasNoUnsignedWrap(OB->hasNoUnsignedWrap());
>>>>> + }
>>>>> +
>>>>> + // Copy the exact flag.
>>>>> + if (auto *PE = dyn_cast<PossiblyExactOperator>(V))
>>>>> + setIsExact(PE->isExact());
>>>>> +
>>>>> + // Copy the fast-math flags.
>>>>> + if (auto *FP = dyn_cast<FPMathOperator>(V))
>>>>> + copyFastMathFlags(FP->getFastMathFlags());
>>>>> +}
>>>>> +
>>>>> +void Instruction::andIRFlags(const Value *V) {
>>>>> + if (auto *OB = dyn_cast<OverflowingBinaryOperator>(V)) {
>>>>> + setHasNoSignedWrap(hasNoSignedWrap() & OB-
>>>>> hasNoSignedWrap());
>>>>> + setHasNoUnsignedWrap(hasNoUnsignedWrap() & OB-
>>>>>
>>>>>> hasNoUnsignedWrap());
>>>>>>
>>>>> + }
>>>>> +
>>>>> + if (auto *PE = dyn_cast<PossiblyExactOperator>(V))
>>>>> + setIsExact(isExact() & PE->isExact());
>>>>> +
>>>>> + if (auto *FP = dyn_cast<FPMathOperator>(V)) {
>>>>> + FastMathFlags FM = getFastMathFlags();
>>>>> + FM &= FP->getFastMathFlags();
>>>>> + copyFastMathFlags(FM);
>>>>> + }
>>>>> +}
>>>>>
>>>>> const char *Instruction::getOpcodeName(unsigned OpCode) {
>>>>> switch (OpCode) {
>>>>>
>>>>> Modified: llvm/trunk/lib/IR/Instructions.cpp
>>>>> URL: http://llvm.org/viewvc/llvm-
>>>>>
>>>>>
>>>> project/llvm/trunk/lib/IR/Instructions.cpp?rev=267111&r1=267110&r2=26711
>>>>
>>>>> 1&view=diff
>>>>>
>>>>> ==========================================================
>>>>
>>>>> ====================
>>>>> --- llvm/trunk/lib/IR/Instructions.cpp (original)
>>>>> +++ llvm/trunk/lib/IR/Instructions.cpp Fri Apr 22 01:37:45 2016
>>>>> @@ -2201,62 +2201,6 @@ bool BinaryOperator::swapOperands() {
>>>>> return false;
>>>>> }
>>>>>
>>>>> -void BinaryOperator::setHasNoUnsignedWrap(bool b) {
>>>>> - cast<OverflowingBinaryOperator>(this)->setHasNoUnsignedWrap(b);
>>>>> -}
>>>>> -
>>>>> -void BinaryOperator::setHasNoSignedWrap(bool b) {
>>>>> - cast<OverflowingBinaryOperator>(this)->setHasNoSignedWrap(b);
>>>>> -}
>>>>> -
>>>>> -void BinaryOperator::setIsExact(bool b) {
>>>>> - cast<PossiblyExactOperator>(this)->setIsExact(b);
>>>>> -}
>>>>> -
>>>>> -bool BinaryOperator::hasNoUnsignedWrap() const {
>>>>> - return cast<OverflowingBinaryOperator>(this)->hasNoUnsignedWrap();
>>>>> -}
>>>>> -
>>>>> -bool BinaryOperator::hasNoSignedWrap() const {
>>>>> - return cast<OverflowingBinaryOperator>(this)->hasNoSignedWrap();
>>>>> -}
>>>>> -
>>>>> -bool BinaryOperator::isExact() const {
>>>>> - return cast<PossiblyExactOperator>(this)->isExact();
>>>>> -}
>>>>> -
>>>>> -void BinaryOperator::copyIRFlags(const Value *V) {
>>>>> - // Copy the wrapping flags.
>>>>> - if (auto *OB = dyn_cast<OverflowingBinaryOperator>(V)) {
>>>>> - setHasNoSignedWrap(OB->hasNoSignedWrap());
>>>>> - setHasNoUnsignedWrap(OB->hasNoUnsignedWrap());
>>>>> - }
>>>>> -
>>>>> - // Copy the exact flag.
>>>>> - if (auto *PE = dyn_cast<PossiblyExactOperator>(V))
>>>>> - setIsExact(PE->isExact());
>>>>> -
>>>>> - // Copy the fast-math flags.
>>>>> - if (auto *FP = dyn_cast<FPMathOperator>(V))
>>>>> - copyFastMathFlags(FP->getFastMathFlags());
>>>>> -}
>>>>> -
>>>>> -void BinaryOperator::andIRFlags(const Value *V) {
>>>>> - if (auto *OB = dyn_cast<OverflowingBinaryOperator>(V)) {
>>>>> - setHasNoSignedWrap(hasNoSignedWrap() & OB->hasNoSignedWrap());
>>>>> - setHasNoUnsignedWrap(hasNoUnsignedWrap() & OB-
>>>>>
>>>>>> hasNoUnsignedWrap());
>>>>>>
>>>>> - }
>>>>> -
>>>>> - if (auto *PE = dyn_cast<PossiblyExactOperator>(V))
>>>>> - setIsExact(isExact() & PE->isExact());
>>>>> -
>>>>> - if (auto *FP = dyn_cast<FPMathOperator>(V)) {
>>>>> - FastMathFlags FM = getFastMathFlags();
>>>>> - FM &= FP->getFastMathFlags();
>>>>> - copyFastMathFlags(FM);
>>>>> - }
>>>>> -}
>>>>> -
>>>>>
>>>>>
>>>>> //===----------------------------------------------------------------------===//
>>>>> // FPMathOperator Class
>>>>>
>>>>> Modified: llvm/trunk/lib/Transforms/Scalar/EarlyCSE.cpp
>>>>> URL: http://llvm.org/viewvc/llvm-
>>>>>
>>>>>
>>>> project/llvm/trunk/lib/Transforms/Scalar/EarlyCSE.cpp?rev=267111&r1=2671
>>>>
>>>>> 10&r2=267111&view=diff
>>>>>
>>>>> ==========================================================
>>>>
>>>>> ====================
>>>>> --- llvm/trunk/lib/Transforms/Scalar/EarlyCSE.cpp (original)
>>>>> +++ llvm/trunk/lib/Transforms/Scalar/EarlyCSE.cpp Fri Apr 22 01:37:45
>>>>> 2016
>>>>> @@ -153,7 +153,7 @@ bool DenseMapInfo<SimpleValue>::isEqual(
>>>>>
>>>>> if (LHSI->getOpcode() != RHSI->getOpcode())
>>>>> return false;
>>>>> - if (LHSI->isIdenticalTo(RHSI))
>>>>> + if (LHSI->isIdenticalToWhenDefined(RHSI))
>>>>> return true;
>>>>>
>>>>> // If we're not strictly identical, we still might be a commutable
>>>>> instruction
>>>>> @@ -165,15 +165,6 @@ bool DenseMapInfo<SimpleValue>::isEqual(
>>>>> "same opcode, but different instruction type?");
>>>>> BinaryOperator *RHSBinOp = cast<BinaryOperator>(RHSI);
>>>>>
>>>>> - // Check overflow attributes
>>>>> - if (isa<OverflowingBinaryOperator>(LHSBinOp)) {
>>>>> - assert(isa<OverflowingBinaryOperator>(RHSBinOp) &&
>>>>> - "same opcode, but different operator type?");
>>>>> - if (LHSBinOp->hasNoUnsignedWrap() != RHSBinOp-
>>>>>
>>>>>> hasNoUnsignedWrap() ||
>>>>>>
>>>>> - LHSBinOp->hasNoSignedWrap() != RHSBinOp->hasNoSignedWrap())
>>>>> - return false;
>>>>> - }
>>>>> -
>>>>> // Commuted equality
>>>>> return LHSBinOp->getOperand(0) == RHSBinOp->getOperand(1) &&
>>>>> LHSBinOp->getOperand(1) == RHSBinOp->getOperand(0);
>>>>> @@ -584,6 +575,8 @@ bool EarlyCSE::processNode(DomTreeNode *
>>>>> // See if the instruction has an available value. If so, use
>>>>> it.
>>>>> if (Value *V = AvailableValues.lookup(Inst)) {
>>>>> DEBUG(dbgs() << "EarlyCSE CSE: " << *Inst << " to: " << *V
>>>>> << '\n');
>>>>> + if (auto *I = dyn_cast<Instruction>(V))
>>>>> + I->andIRFlags(Inst);
>>>>> Inst->replaceAllUsesWith(V);
>>>>> Inst->eraseFromParent();
>>>>> Changed = true;
>>>>>
>>>>> Added: llvm/trunk/test/Transforms/EarlyCSE/flags.ll
>>>>> URL: http://llvm.org/viewvc/llvm-
>>>>>
>>>>>
>>>> project/llvm/trunk/test/Transforms/EarlyCSE/flags.ll?rev=267111&view=aut
>>>>
>>>>> o
>>>>>
>>>>> ==========================================================
>>>>
>>>>> ====================
>>>>> --- llvm/trunk/test/Transforms/EarlyCSE/flags.ll (added)
>>>>> +++ llvm/trunk/test/Transforms/EarlyCSE/flags.ll Fri Apr 22 01:37:45
>>>>> 2016
>>>>> @@ -0,0 +1,18 @@
>>>>> +; RUN: opt -early-cse -S < %s | FileCheck %s
>>>>> +
>>>>> +declare void @use(i1)
>>>>> +
>>>>> +define void @test1(float %x, float %y) {
>>>>> +entry:
>>>>> + %cmp1 = fcmp nnan oeq float %y, %x
>>>>> + %cmp2 = fcmp oeq float %x, %y
>>>>> + call void @use(i1 %cmp1)
>>>>> + call void @use(i1 %cmp2)
>>>>> + ret void
>>>>> +}
>>>>> +
>>>>> +; CHECK-LABEL: define void @test1(
>>>>> +; CHECK: %[[cmp:.*]] = fcmp oeq float %y, %x
>>>>> +; CHECK-NEXT: call void @use(i1 %[[cmp]])
>>>>> +; CHECK-NEXT: call void @use(i1 %[[cmp]])
>>>>> +; CHECK-NEXT: ret void
>>>>>
>>>>>
>>>>> _______________________________________________
>>>>> llvm-commits mailing list
>>>>> llvm-commits at lists.llvm.org
>>>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>>>>>
>>>> _______________________________________________
>>>> LLVM Developers mailing list
>>>> llvm-dev at lists.llvm.org
>>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>>>>
>>> _______________________________________________
>>> llvm-commits mailing list
>>> llvm-commits at lists.llvm.org
>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>>>
>>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160422/039fa08f/attachment.html>
More information about the llvm-commits
mailing list