<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Generator" content="Microsoft Word 14 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
{font-family:Tahoma;
panose-1:2 11 6 4 3 5 4 4 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0cm;
margin-bottom:.0001pt;
font-size:12.0pt;
font-family:"Times New Roman","serif";}
a:link, span.MsoHyperlink
{mso-style-priority:99;
color:blue;
text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
{mso-style-priority:99;
color:purple;
text-decoration:underline;}
p.MsoAcetate, li.MsoAcetate, div.MsoAcetate
{mso-style-priority:99;
mso-style-link:"Balloon Text Char";
margin:0cm;
margin-bottom:.0001pt;
font-size:8.0pt;
font-family:"Tahoma","sans-serif";}
span.EmailStyle17
{mso-style-type:personal-reply;
font-family:"Calibri","sans-serif";
color:windowtext;}
span.BalloonTextChar
{mso-style-name:"Balloon Text Char";
mso-style-priority:99;
mso-style-link:"Balloon Text";
font-family:"Tahoma","sans-serif";
mso-fareast-language:EN-GB;}
.MsoChpDefault
{mso-style-type:export-only;
font-family:"Calibri","sans-serif";
mso-fareast-language:EN-US;}
@page WordSection1
{size:612.0pt 792.0pt;
margin:72.0pt 72.0pt 72.0pt 72.0pt;}
div.WordSection1
{page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-GB" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif"">Thanks. I'll try to get the failing output if I see it again.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif""><o:p> </o:p></span></p>
<div style="border:none;border-left:solid blue 1.5pt;padding:0cm 0cm 0cm 4.0pt">
<div>
<div style="border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0cm 0cm 0cm">
<p class="MsoNormal"><b><span lang="EN-US" style="font-size:10.0pt;font-family:"Tahoma","sans-serif"">From:</span></b><span lang="EN-US" style="font-size:10.0pt;font-family:"Tahoma","sans-serif""> David Majnemer [mailto:david.majnemer@gmail.com]
<br>
<b>Sent:</b> 22 April 2016 15:20<br>
<b>To:</b> Mikael Holmén<br>
<b>Cc:</b> Daniel Sanders; llvm-commits@lists.llvm.org<br>
<b>Subject:</b> Re: [llvm] r267111 - [EarlyCSE] Take the intersection of flags on instructions<o:p></o:p></span></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<p class="MsoNormal">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.<o:p></o:p></p>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">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.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Thanks.<o:p></o:p></p>
</div>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<p class="MsoNormal">On Fri, Apr 22, 2016 at 10:06 AM, David Majnemer <<a href="mailto:david.majnemer@gmail.com" target="_blank">david.majnemer@gmail.com</a>> wrote:<o:p></o:p></p>
<p class="MsoNormal">Thanks, taking a look.<o:p></o:p></p>
<div>
<div>
<p class="MsoNormal"><br>
<br>
On Friday, April 22, 2016, Mikael Holmén <<a href="mailto:mikael.holmen@ericsson.com" target="_blank">mikael.holmen@ericsson.com</a>> wrote:<o:p></o:p></p>
<p class="MsoNormal">Same thing is happening to me.<br>
<br>
Transforms/EarlyCSE/basic.ll<br>
<br>
is failing quite randomly now and then with:<br>
<br>
Command Output (stderr):<br>
--<br>
/repo/uabelho/dev-master/test/Transforms/EarlyCSE/basic.ll:31:16: error: expected string not found in input<br>
; CHECK-NEXT: %G = add nuw i32 %C, %C<br>
^<br>
<stdin>:14:23: note: scanning from here<br>
store volatile i32 %E, i32* %P<br>
^<br>
<stdin>:15:3: note: possible intended match here<br>
store volatile i32 %E, i32* %P<br>
^<br>
<br>
Regards,<br>
Mikael<br>
<br>
On 04/22/2016 03:22 PM, Daniel Sanders via llvm-commits wrote:<o:p></o:p></p>
<p class="MsoNormal" style="margin-bottom:12.0pt">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.<o:p></o:p></p>
<p class="MsoNormal" style="margin-bottom:12.0pt">-----Original Message-----<br>
From: llvm-dev [mailto:llvm-dev-bounces@lists.llvm.org] On Behalf Of Daniel<br>
Sanders via llvm-dev<br>
Sent: 22 April 2016 11:36<br>
To: David Majnemer; llvm-dev@lists.llvm.org<br>
Subject: Re: [llvm-dev] [llvm] r267111 - [EarlyCSE] Take the intersection of<br>
flags on instructions<br>
<br>
Hi David,<br>
<br>
When I reverted r267098 in r267127, one of the EarlyCSE tests failed on a<br>
couple builders (<a href="http://lab.llvm.org:8011/builders/llvm-hexagon-" target="_blank">http://lab.llvm.org:8011/builders/llvm-hexagon-</a><br>
elf/builds/28174, <a href="http://lab.llvm.org:8011/builders/llvm-clang-lld-x86_64-" target="_blank">
http://lab.llvm.org:8011/builders/llvm-clang-lld-x86_64-</a><br>
scei-ps4-ubuntu-fast/builds/11173). Going by the logs it was CSE'ing two adds<br>
where one had the nuw flag and one didn't. The failures disappeared by<br>
themselves in the next build but I thought I should mention it anyway.<o:p></o:p></p>
<p class="MsoNormal">-----Original Message-----<br>
From: llvm-commits [mailto:llvm-commits-bounces@lists.llvm.org] On<o:p></o:p></p>
<p class="MsoNormal">Behalf<o:p></o:p></p>
<p class="MsoNormal" style="margin-bottom:12.0pt">Of David Majnemer via llvm-commits<br>
Sent: 22 April 2016 07:38<br>
To: llvm-commits@lists.llvm.org<br>
Subject: [llvm] r267111 - [EarlyCSE] Take the intersection of flags on<br>
instructions<br>
<br>
Author: majnemer<br>
Date: Fri Apr 22 01:37:45 2016<br>
New Revision: 267111<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=267111&view=rev" target="_blank">
http://llvm.org/viewvc/llvm-project?rev=267111&view=rev</a><br>
Log:<br>
[EarlyCSE] Take the intersection of flags on instructions<br>
<br>
EarlyCSE had inconsistent behavior with regards to flag'd instructions:<br>
- In some cases, it would pessimize if the available instruction had<br>
different flags by not performing CSE.<br>
- In other cases, it would miscompile if it replaced an instruction<br>
which had no flags with an instruction which has flags.<br>
<br>
Fix this by being more consistent with our flag handling by utilizing<br>
andIRFlags.<br>
<br>
Added:<br>
llvm/trunk/test/Transforms/EarlyCSE/flags.ll<br>
Modified:<br>
llvm/trunk/include/llvm/IR/InstrTypes.h<br>
llvm/trunk/include/llvm/IR/Instruction.h<br>
llvm/trunk/include/llvm/IR/Operator.h<br>
llvm/trunk/lib/IR/Instruction.cpp<br>
llvm/trunk/lib/IR/Instructions.cpp<br>
llvm/trunk/lib/Transforms/Scalar/EarlyCSE.cpp<br>
<br>
Modified: llvm/trunk/include/llvm/IR/InstrTypes.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-" target="_blank">http://llvm.org/viewvc/llvm-</a><o:p></o:p></p>
<p class="MsoNormal">project/llvm/trunk/include/llvm/IR/InstrTypes.h?rev=267111&r1=267110&r2<o:p></o:p></p>
<p class="MsoNormal" style="margin-bottom:12.0pt">=267111&view=diff<o:p></o:p></p>
<p class="MsoNormal">==========================================================<o:p></o:p></p>
<p class="MsoNormal">====================<br>
--- llvm/trunk/include/llvm/IR/InstrTypes.h (original)<br>
+++ llvm/trunk/include/llvm/IR/InstrTypes.h Fri Apr 22 01:37:45 2016<br>
@@ -535,35 +535,6 @@ public:<br>
///<br>
bool swapOperands();<br>
<br>
- /// Set or clear the nsw flag on this instruction, which must be an<o:p></o:p></p>
<p class="MsoNormal">operator<o:p></o:p></p>
<p class="MsoNormal">- /// which supports this flag. See LangRef.html for the meaning of this<o:p></o:p></p>
<p class="MsoNormal">flag.<o:p></o:p></p>
<p class="MsoNormal">- void setHasNoUnsignedWrap(bool b = true);<br>
-<br>
- /// Set or clear the nsw flag on this instruction, which must be an<o:p></o:p></p>
<p class="MsoNormal">operator<o:p></o:p></p>
<p class="MsoNormal">- /// which supports this flag. See LangRef.html for the meaning of this<o:p></o:p></p>
<p class="MsoNormal">flag.<o:p></o:p></p>
<p class="MsoNormal">- void setHasNoSignedWrap(bool b = true);<br>
-<br>
- /// Set or clear the exact flag on this instruction, which must be an<o:p></o:p></p>
<p class="MsoNormal">operator<o:p></o:p></p>
<p class="MsoNormal">- /// which supports this flag. See LangRef.html for the meaning of this<o:p></o:p></p>
<p class="MsoNormal">flag.<o:p></o:p></p>
<p class="MsoNormal" style="margin-bottom:12.0pt">- void setIsExact(bool b = true);<br>
-<br>
- /// Determine whether the no unsigned wrap flag is set.<br>
- bool hasNoUnsignedWrap() const;<br>
-<br>
- /// Determine whether the no signed wrap flag is set.<br>
- bool hasNoSignedWrap() const;<br>
-<br>
- /// Determine whether the exact flag is set.<br>
- bool isExact() const;<br>
-<br>
- /// Convenience method to copy supported wrapping, exact, and fast-<br>
math flags<br>
- /// from V to this instruction.<br>
- void copyIRFlags(const Value *V);<br>
-<br>
- /// Logical 'and' of any supported wrapping, exact, and fast-math flags of<br>
- /// V and this instruction.<br>
- void andIRFlags(const Value *V);<br>
-<br>
// Methods for support type inquiry through isa, cast, and dyn_cast:<br>
static inline bool classof(const Instruction *I) {<br>
return I->isBinaryOp();<br>
<br>
Modified: llvm/trunk/include/llvm/IR/Instruction.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-" target="_blank">http://llvm.org/viewvc/llvm-</a><o:p></o:p></p>
<p class="MsoNormal">project/llvm/trunk/include/llvm/IR/Instruction.h?rev=267111&r1=267110&r2<o:p></o:p></p>
<p class="MsoNormal" style="margin-bottom:12.0pt">=267111&view=diff<o:p></o:p></p>
<p class="MsoNormal">==========================================================<o:p></o:p></p>
<p class="MsoNormal">====================<br>
--- llvm/trunk/include/llvm/IR/Instruction.h (original)<br>
+++ llvm/trunk/include/llvm/IR/Instruction.h Fri Apr 22 01:37:45 2016<br>
@@ -223,6 +223,27 @@ public:<br>
/// Return the debug location for this node as a DebugLoc.<br>
const DebugLoc &getDebugLoc() const { return DbgLoc; }<br>
<br>
+ /// Set or clear the nsw flag on this instruction, which must be an<o:p></o:p></p>
<p class="MsoNormal">operator<o:p></o:p></p>
<p class="MsoNormal">+ /// which supports this flag. See LangRef.html for the meaning of this<o:p></o:p></p>
<p class="MsoNormal">flag.<o:p></o:p></p>
<p class="MsoNormal">+ void setHasNoUnsignedWrap(bool b = true);<br>
+<br>
+ /// Set or clear the nsw flag on this instruction, which must be an<o:p></o:p></p>
<p class="MsoNormal">operator<o:p></o:p></p>
<p class="MsoNormal">+ /// which supports this flag. See LangRef.html for the meaning of this<o:p></o:p></p>
<p class="MsoNormal">flag.<o:p></o:p></p>
<p class="MsoNormal">+ void setHasNoSignedWrap(bool b = true);<br>
+<br>
+ /// Set or clear the exact flag on this instruction, which must be an<br>
operator<br>
+ /// which supports this flag. See LangRef.html for the meaning of this<o:p></o:p></p>
<p class="MsoNormal">flag.<o:p></o:p></p>
<p class="MsoNormal">+ void setIsExact(bool b = true);<br>
+<br>
+ /// Determine whether the no unsigned wrap flag is set.<br>
+ bool hasNoUnsignedWrap() const;<br>
+<br>
+ /// Determine whether the no signed wrap flag is set.<br>
+ bool hasNoSignedWrap() const;<br>
+<br>
+ /// Determine whether the exact flag is set.<br>
+ bool isExact() const;<br>
+<br>
/// Set or clear the unsafe-algebra flag on this instruction, which must be<o:p></o:p></p>
<p class="MsoNormal">an<o:p></o:p></p>
<p class="MsoNormal"> /// operator which supports this flag. See LangRef.html for the meaning<o:p></o:p></p>
<p class="MsoNormal">of<o:p></o:p></p>
<p class="MsoNormal" style="margin-bottom:12.0pt"> /// this flag.<br>
@@ -281,6 +302,14 @@ public:<br>
/// Copy I's fast-math flags<br>
void copyFastMathFlags(const Instruction *I);<br>
<br>
+ /// Convenience method to copy supported wrapping, exact, and fast-<br>
math flags<br>
+ /// from V to this instruction.<br>
+ void copyIRFlags(const Value *V);<br>
+<br>
+ /// Logical 'and' of any supported wrapping, exact, and fast-math flags of<br>
+ /// V and this instruction.<br>
+ void andIRFlags(const Value *V);<br>
+<br>
private:<br>
/// Return true if we have an entry in the on-the-side metadata hash.<br>
bool hasMetadataHashEntry() const {<br>
<br>
Modified: llvm/trunk/include/llvm/IR/Operator.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-" target="_blank">http://llvm.org/viewvc/llvm-</a><o:p></o:p></p>
<p class="MsoNormal">project/llvm/trunk/include/llvm/IR/Operator.h?rev=267111&r1=267110&r2=<o:p></o:p></p>
<p class="MsoNormal" style="margin-bottom:12.0pt">267111&view=diff<o:p></o:p></p>
<p class="MsoNormal">==========================================================<o:p></o:p></p>
<p class="MsoNormal" style="margin-bottom:12.0pt">====================<br>
--- llvm/trunk/include/llvm/IR/Operator.h (original)<br>
+++ llvm/trunk/include/llvm/IR/Operator.h Fri Apr 22 01:37:45 2016<br>
@@ -79,7 +79,7 @@ public:<br>
};<br>
<br>
private:<br>
- friend class BinaryOperator;<br>
+ friend class Instruction;<br>
friend class ConstantExpr;<br>
void setHasNoUnsignedWrap(bool B) {<br>
SubclassOptionalData =<br>
@@ -130,7 +130,7 @@ public:<br>
};<br>
<br>
private:<br>
- friend class BinaryOperator;<br>
+ friend class Instruction;<br>
friend class ConstantExpr;<br>
void setIsExact(bool B) {<br>
SubclassOptionalData = (SubclassOptionalData & ~IsExact) | (B * IsExact);<br>
<br>
Modified: llvm/trunk/lib/IR/Instruction.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-" target="_blank">http://llvm.org/viewvc/llvm-</a><o:p></o:p></p>
<p class="MsoNormal">project/llvm/trunk/lib/IR/Instruction.cpp?rev=267111&r1=267110&r2=26711<o:p></o:p></p>
<p class="MsoNormal" style="margin-bottom:12.0pt">1&view=diff<o:p></o:p></p>
<p class="MsoNormal">==========================================================<o:p></o:p></p>
<p class="MsoNormal">====================<br>
--- llvm/trunk/lib/IR/Instruction.cpp (original)<br>
+++ llvm/trunk/lib/IR/Instruction.cpp Fri Apr 22 01:37:45 2016<br>
@@ -96,6 +96,30 @@ void Instruction::moveBefore(Instruction<br>
MovePos->getIterator(), getParent()->getInstList(), getIterator());<br>
}<br>
<br>
+void Instruction::setHasNoUnsignedWrap(bool b) {<br>
+ cast<OverflowingBinaryOperator>(this)->setHasNoUnsignedWrap(b);<br>
+}<br>
+<br>
+void Instruction::setHasNoSignedWrap(bool b) {<br>
+ cast<OverflowingBinaryOperator>(this)->setHasNoSignedWrap(b);<br>
+}<br>
+<br>
+void Instruction::setIsExact(bool b) {<br>
+ cast<PossiblyExactOperator>(this)->setIsExact(b);<br>
+}<br>
+<br>
+bool Instruction::hasNoUnsignedWrap() const {<br>
+ return cast<OverflowingBinaryOperator>(this)->hasNoUnsignedWrap();<br>
+}<br>
+<br>
+bool Instruction::hasNoSignedWrap() const {<br>
+ return cast<OverflowingBinaryOperator>(this)->hasNoSignedWrap();<br>
+}<br>
+<br>
+bool Instruction::isExact() const {<br>
+ return cast<PossiblyExactOperator>(this)->isExact();<br>
+}<br>
+<br>
/// Set or clear the unsafe-algebra flag on this instruction, which must be<o:p></o:p></p>
<p class="MsoNormal">an<o:p></o:p></p>
<p class="MsoNormal"> /// operator which supports this flag. See LangRef.html for the meaning of<br>
this<br>
/// flag.<br>
@@ -190,6 +214,37 @@ void Instruction::copyFastMathFlags(cons<br>
copyFastMathFlags(I->getFastMathFlags());<br>
}<br>
<br>
+void Instruction::copyIRFlags(const Value *V) {<br>
+ // Copy the wrapping flags.<br>
+ if (auto *OB = dyn_cast<OverflowingBinaryOperator>(V)) {<br>
+ setHasNoSignedWrap(OB->hasNoSignedWrap());<br>
+ setHasNoUnsignedWrap(OB->hasNoUnsignedWrap());<br>
+ }<br>
+<br>
+ // Copy the exact flag.<br>
+ if (auto *PE = dyn_cast<PossiblyExactOperator>(V))<br>
+ setIsExact(PE->isExact());<br>
+<br>
+ // Copy the fast-math flags.<br>
+ if (auto *FP = dyn_cast<FPMathOperator>(V))<br>
+ copyFastMathFlags(FP->getFastMathFlags());<br>
+}<br>
+<br>
+void Instruction::andIRFlags(const Value *V) {<br>
+ if (auto *OB = dyn_cast<OverflowingBinaryOperator>(V)) {<br>
+ setHasNoSignedWrap(hasNoSignedWrap() & OB-<br>
hasNoSignedWrap());<br>
+ setHasNoUnsignedWrap(hasNoUnsignedWrap() & OB-<o:p></o:p></p>
<p class="MsoNormal">hasNoUnsignedWrap());<o:p></o:p></p>
<p class="MsoNormal" style="margin-bottom:12.0pt">+ }<br>
+<br>
+ if (auto *PE = dyn_cast<PossiblyExactOperator>(V))<br>
+ setIsExact(isExact() & PE->isExact());<br>
+<br>
+ if (auto *FP = dyn_cast<FPMathOperator>(V)) {<br>
+ FastMathFlags FM = getFastMathFlags();<br>
+ FM &= FP->getFastMathFlags();<br>
+ copyFastMathFlags(FM);<br>
+ }<br>
+}<br>
<br>
const char *Instruction::getOpcodeName(unsigned OpCode) {<br>
switch (OpCode) {<br>
<br>
Modified: llvm/trunk/lib/IR/Instructions.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-" target="_blank">http://llvm.org/viewvc/llvm-</a><o:p></o:p></p>
<p class="MsoNormal">project/llvm/trunk/lib/IR/Instructions.cpp?rev=267111&r1=267110&r2=26711<o:p></o:p></p>
<p class="MsoNormal" style="margin-bottom:12.0pt">1&view=diff<o:p></o:p></p>
<p class="MsoNormal">==========================================================<o:p></o:p></p>
<p class="MsoNormal">====================<br>
--- llvm/trunk/lib/IR/Instructions.cpp (original)<br>
+++ llvm/trunk/lib/IR/Instructions.cpp Fri Apr 22 01:37:45 2016<br>
@@ -2201,62 +2201,6 @@ bool BinaryOperator::swapOperands() {<br>
return false;<br>
}<br>
<br>
-void BinaryOperator::setHasNoUnsignedWrap(bool b) {<br>
- cast<OverflowingBinaryOperator>(this)->setHasNoUnsignedWrap(b);<br>
-}<br>
-<br>
-void BinaryOperator::setHasNoSignedWrap(bool b) {<br>
- cast<OverflowingBinaryOperator>(this)->setHasNoSignedWrap(b);<br>
-}<br>
-<br>
-void BinaryOperator::setIsExact(bool b) {<br>
- cast<PossiblyExactOperator>(this)->setIsExact(b);<br>
-}<br>
-<br>
-bool BinaryOperator::hasNoUnsignedWrap() const {<br>
- return cast<OverflowingBinaryOperator>(this)->hasNoUnsignedWrap();<br>
-}<br>
-<br>
-bool BinaryOperator::hasNoSignedWrap() const {<br>
- return cast<OverflowingBinaryOperator>(this)->hasNoSignedWrap();<br>
-}<br>
-<br>
-bool BinaryOperator::isExact() const {<br>
- return cast<PossiblyExactOperator>(this)->isExact();<br>
-}<br>
-<br>
-void BinaryOperator::copyIRFlags(const Value *V) {<br>
- // Copy the wrapping flags.<br>
- if (auto *OB = dyn_cast<OverflowingBinaryOperator>(V)) {<br>
- setHasNoSignedWrap(OB->hasNoSignedWrap());<br>
- setHasNoUnsignedWrap(OB->hasNoUnsignedWrap());<br>
- }<br>
-<br>
- // Copy the exact flag.<br>
- if (auto *PE = dyn_cast<PossiblyExactOperator>(V))<br>
- setIsExact(PE->isExact());<br>
-<br>
- // Copy the fast-math flags.<br>
- if (auto *FP = dyn_cast<FPMathOperator>(V))<br>
- copyFastMathFlags(FP->getFastMathFlags());<br>
-}<br>
-<br>
-void BinaryOperator::andIRFlags(const Value *V) {<br>
- if (auto *OB = dyn_cast<OverflowingBinaryOperator>(V)) {<br>
- setHasNoSignedWrap(hasNoSignedWrap() & OB->hasNoSignedWrap());<br>
- setHasNoUnsignedWrap(hasNoUnsignedWrap() & OB-<o:p></o:p></p>
<p class="MsoNormal">hasNoUnsignedWrap());<o:p></o:p></p>
<p class="MsoNormal" style="margin-bottom:12.0pt">- }<br>
-<br>
- if (auto *PE = dyn_cast<PossiblyExactOperator>(V))<br>
- setIsExact(isExact() & PE->isExact());<br>
-<br>
- if (auto *FP = dyn_cast<FPMathOperator>(V)) {<br>
- FastMathFlags FM = getFastMathFlags();<br>
- FM &= FP->getFastMathFlags();<br>
- copyFastMathFlags(FM);<br>
- }<br>
-}<br>
-<br>
<br>
//===----------------------------------------------------------------------===//<br>
// FPMathOperator Class<br>
<br>
Modified: llvm/trunk/lib/Transforms/Scalar/EarlyCSE.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-" target="_blank">http://llvm.org/viewvc/llvm-</a><o:p></o:p></p>
<p class="MsoNormal">project/llvm/trunk/lib/Transforms/Scalar/EarlyCSE.cpp?rev=267111&r1=2671<o:p></o:p></p>
<p class="MsoNormal" style="margin-bottom:12.0pt">10&r2=267111&view=diff<o:p></o:p></p>
<p class="MsoNormal">==========================================================<o:p></o:p></p>
<p class="MsoNormal">====================<br>
--- llvm/trunk/lib/Transforms/Scalar/EarlyCSE.cpp (original)<br>
+++ llvm/trunk/lib/Transforms/Scalar/EarlyCSE.cpp Fri Apr 22 01:37:45 2016<br>
@@ -153,7 +153,7 @@ bool DenseMapInfo<SimpleValue>::isEqual(<br>
<br>
if (LHSI->getOpcode() != RHSI->getOpcode())<br>
return false;<br>
- if (LHSI->isIdenticalTo(RHSI))<br>
+ if (LHSI->isIdenticalToWhenDefined(RHSI))<br>
return true;<br>
<br>
// If we're not strictly identical, we still might be a commutable instruction<br>
@@ -165,15 +165,6 @@ bool DenseMapInfo<SimpleValue>::isEqual(<br>
"same opcode, but different instruction type?");<br>
BinaryOperator *RHSBinOp = cast<BinaryOperator>(RHSI);<br>
<br>
- // Check overflow attributes<br>
- if (isa<OverflowingBinaryOperator>(LHSBinOp)) {<br>
- assert(isa<OverflowingBinaryOperator>(RHSBinOp) &&<br>
- "same opcode, but different operator type?");<br>
- if (LHSBinOp->hasNoUnsignedWrap() != RHSBinOp-<o:p></o:p></p>
<p class="MsoNormal">hasNoUnsignedWrap() ||<o:p></o:p></p>
<p class="MsoNormal" style="margin-bottom:12.0pt">- LHSBinOp->hasNoSignedWrap() != RHSBinOp->hasNoSignedWrap())<br>
- return false;<br>
- }<br>
-<br>
// Commuted equality<br>
return LHSBinOp->getOperand(0) == RHSBinOp->getOperand(1) &&<br>
LHSBinOp->getOperand(1) == RHSBinOp->getOperand(0);<br>
@@ -584,6 +575,8 @@ bool EarlyCSE::processNode(DomTreeNode *<br>
// See if the instruction has an available value. If so, use it.<br>
if (Value *V = AvailableValues.lookup(Inst)) {<br>
DEBUG(dbgs() << "EarlyCSE CSE: " << *Inst << " to: " << *V << '\n');<br>
+ if (auto *I = dyn_cast<Instruction>(V))<br>
+ I->andIRFlags(Inst);<br>
Inst->replaceAllUsesWith(V);<br>
Inst->eraseFromParent();<br>
Changed = true;<br>
<br>
Added: llvm/trunk/test/Transforms/EarlyCSE/flags.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-" target="_blank">http://llvm.org/viewvc/llvm-</a><o:p></o:p></p>
<p class="MsoNormal">project/llvm/trunk/test/Transforms/EarlyCSE/flags.ll?rev=267111&view=aut<o:p></o:p></p>
<p class="MsoNormal" style="margin-bottom:12.0pt">o<o:p></o:p></p>
<p class="MsoNormal">==========================================================<o:p></o:p></p>
<p class="MsoNormal">====================<br>
--- llvm/trunk/test/Transforms/EarlyCSE/flags.ll (added)<br>
+++ llvm/trunk/test/Transforms/EarlyCSE/flags.ll Fri Apr 22 01:37:45 2016<br>
@@ -0,0 +1,18 @@<br>
+; RUN: opt -early-cse -S < %s | FileCheck %s<br>
+<br>
+declare void @use(i1)<br>
+<br>
+define void @test1(float %x, float %y) {<br>
+entry:<br>
+ %cmp1 = fcmp nnan oeq float %y, %x<br>
+ %cmp2 = fcmp oeq float %x, %y<br>
+ call void @use(i1 %cmp1)<br>
+ call void @use(i1 %cmp2)<br>
+ ret void<br>
+}<br>
+<br>
+; CHECK-LABEL: define void @test1(<br>
+; CHECK: %[[cmp:.*]] = fcmp oeq float %y, %x<br>
+; CHECK-NEXT: call void @use(i1 %[[cmp]])<br>
+; CHECK-NEXT: call void @use(i1 %[[cmp]])<br>
+; CHECK-NEXT: ret void<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><o:p></o:p></p>
<p class="MsoNormal">_______________________________________________<br>
LLVM Developers mailing list<br>
<a href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a><o:p></o:p></p>
<p class="MsoNormal" style="margin-bottom:12.0pt">_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><o:p></o:p></p>
</div>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</div>
</div>
</body>
</html>