[llvm] r267111 - [EarlyCSE] Take the intersection of flags on instructions

Mikael Holmén via llvm-commits llvm-commits at lists.llvm.org
Fri Apr 22 06:49:35 PDT 2016


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
>


More information about the llvm-commits mailing list