<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">Thanks, Chad! I committed the testcase in r228432, since there is no other feedback yet, and it’s better to have the test in place.<div class=""><div class=""><br class=""></div><div class="">Thanks,</div><div class="">Michael</div><div class=""><br class=""><div><blockquote type="cite" class=""><div class="">On Feb 10, 2015, at 11:36 AM, Chad Rosier <<a href="mailto:mcrosier@codeaurora.org" class="">mcrosier@codeaurora.org</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">Chandler may have a few suggestions, but the test LGTM.</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">Chad</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><blockquote type="cite" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">Hi Chandler, Chad,<br class=""><br class="">Could you please take a look at the attached testcase?<br class=""><br class=""><br class=""><br class="">Is it ok to commit it?<br class=""><br class="">Thanks,<br class="">Michael<br class=""><br class=""><blockquote type="cite" class="">On Feb 6, 2015, at 12:23 PM, Michael Zolotukhin <<a href="mailto:mzolotukhin@apple.com" class="">mzolotukhin@apple.com</a>><br class="">wrote:<br class=""><br class=""><blockquote type="cite" class="">On Feb 6, 2015, at 12:10 PM, Chad Rosier <<a href="mailto:mcrosier@codeaurora.org" class="">mcrosier@codeaurora.org</a><br class=""><<a href="mailto:mcrosier@codeaurora.org" class="">mailto:mcrosier@codeaurora.org</a>>> wrote:<br class=""><br class="">testcase?<br class=""></blockquote>I’ll follow up shortly with that.<br class=""><br class="">Thanks,<br class="">Michael<br class=""><br class=""><blockquote type="cite" class=""><br class=""><blockquote type="cite" class="">Author: mzolotukhin<br class="">Date: Fri Feb  6 14:02:51 2015<br class="">New Revision: 228432<br class=""><br class="">URL:<span class="Apple-converted-space"> </span><a href="http://llvm.org/viewvc/llvm-project?rev=228432&view=rev" class="">http://llvm.org/viewvc/llvm-project?rev=228432&view=rev</a><br class="">Log:<br class="">[InstSimplify] Add SimplifyFPBinOp function.<br class=""><br class="">It is a variation of SimplifyBinOp, but it takes into account<br class="">FastMathFlags.<br class=""><br class="">It is needed in inliner and loop-unroller to accurately predict the<br class="">transformation's outcome (previously we dropped the flags and were too<br class="">conservative in some cases).<br class=""><br class="">Example:<br class="">float foo(float *a, float b) {<br class="">float r;<br class="">if (a[1] * b)<br class="">r = /* a lot of expensive computations */;<br class="">else<br class="">r = 1;<br class="">return r;<br class="">}<br class="">float boo(float *a) {<br class="">return foo(a, 0.0);<br class="">}<br class=""><br class="">Without this patch, we don't inline 'foo' into 'boo'.<br class=""><br class="">Modified:<br class=""> llvm/trunk/include/llvm/Analysis/InstructionSimplify.h<br class=""> llvm/trunk/lib/Analysis/IPA/InlineCost.cpp<br class=""> llvm/trunk/lib/Analysis/InstructionSimplify.cpp<br class=""> llvm/trunk/lib/Transforms/Scalar/LoopUnrollPass.cpp<br class=""><br class="">Modified: llvm/trunk/include/llvm/Analysis/InstructionSimplify.h<br class="">URL:<br class=""><a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/InstructionSimplify.h?rev=228432&r1=228431&r2=228432&view=diff" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/InstructionSimplify.h?rev=228432&r1=228431&r2=228432&view=diff</a><br class="">==============================================================================<br class="">--- llvm/trunk/include/llvm/Analysis/InstructionSimplify.h (original)<br class="">+++ llvm/trunk/include/llvm/Analysis/InstructionSimplify.h Fri Feb  6<br class="">14:02:51 2015<br class="">@@ -277,6 +277,17 @@ namespace llvm {<br class="">                     const DominatorTree *DT = nullptr,<br class="">                     AssumptionCache *AC = nullptr,<br class="">                     const Instruction *CxtI = nullptr);<br class="">+  /// SimplifyFPBinOp - Given operands for a BinaryOperator, see if<br class="">we<br class="">can<br class="">+  /// fold the result.  If not, this returns null.<br class="">+  /// In contrast to SimplifyBinOp, try to use FastMathFlag when<br class="">folding<br class="">the<br class="">+  /// result. In case we don't need FastMathFlags, simply fall to<br class="">SimplifyBinOp.<br class="">+  Value *SimplifyFPBinOp(unsigned Opcode, Value *LHS, Value *RHS,<br class="">+                         const FastMathFlags &FMF,<br class="">+                         const DataLayout *TD = nullptr,<br class="">+                         const TargetLibraryInfo *TLI = nullptr,<br class="">+                         const DominatorTree *DT = nullptr,<br class="">+                         AssumptionCache *AC = nullptr,<br class="">+                         const Instruction *CxtI = nullptr);<br class=""><br class="">/// \brief Given a function and iterators over arguments, see if we<br class="">can<br class="">fold<br class="">/// the result.<br class=""><br class="">Modified: llvm/trunk/lib/Analysis/IPA/InlineCost.cpp<br class="">URL:<br class=""><a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/IPA/InlineCost.cpp?rev=228432&r1=228431&r2=228432&view=diff" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/IPA/InlineCost.cpp?rev=228432&r1=228431&r2=228432&view=diff</a><br class="">==============================================================================<br class="">--- llvm/trunk/lib/Analysis/IPA/InlineCost.cpp (original)<br class="">+++ llvm/trunk/lib/Analysis/IPA/InlineCost.cpp Fri Feb  6 14:02:51<br class="">2015<br class="">@@ -601,7 +601,13 @@ bool CallAnalyzer::visitBinaryOperator(B<br class="">if (!isa<Constant>(RHS))<br class="">  if (Constant *SimpleRHS = SimplifiedValues.lookup(RHS))<br class="">    RHS = SimpleRHS;<br class="">-  Value *SimpleV = SimplifyBinOp(I.getOpcode(), LHS, RHS, DL);<br class="">+  Value *SimpleV = nullptr;<br class="">+  if (auto FI = dyn_cast<FPMathOperator>(&I))<br class="">+    SimpleV =<br class="">+        SimplifyFPBinOp(I.getOpcode(), LHS, RHS,<br class="">FI->getFastMathFlags(),<br class="">DL);<br class="">+  else<br class="">+    SimpleV = SimplifyBinOp(I.getOpcode(), LHS, RHS, DL);<br class="">+<br class="">if (Constant *C = dyn_cast_or_null<Constant>(SimpleV)) {<br class="">  SimplifiedValues[&I] = C;<br class="">  return true;<br class=""><br class="">Modified: llvm/trunk/lib/Analysis/InstructionSimplify.cpp<br class="">URL:<br class=""><a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/InstructionSimplify.cpp?rev=228432&r1=228431&r2=228432&view=diff" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/InstructionSimplify.cpp?rev=228432&r1=228431&r2=228432&view=diff</a><br class="">==============================================================================<br class="">--- llvm/trunk/lib/Analysis/InstructionSimplify.cpp (original)<br class="">+++ llvm/trunk/lib/Analysis/InstructionSimplify.cpp Fri Feb  6<br class="">14:02:51<br class="">2015<br class="">@@ -61,6 +61,8 @@ struct Query {<br class="">static Value *SimplifyAndInst(Value *, Value *, const Query &,<br class="">unsigned);<br class="">static Value *SimplifyBinOp(unsigned, Value *, Value *, const Query &,<br class="">                          unsigned);<br class="">+static Value *SimplifyFPBinOp(unsigned, Value *, Value *, const<br class="">FastMathFlags &,<br class="">+                              const Query &, unsigned);<br class="">static Value *SimplifyCmpInst(unsigned, Value *, Value *, const Query<br class="">&,<br class="">                            unsigned);<br class="">static Value *SimplifyOrInst(Value *, Value *, const Query &,<br class="">unsigned);<br class="">@@ -3465,6 +3467,25 @@ static Value *SimplifyBinOp(unsigned Opc<br class="">}<br class="">}<br class=""><br class="">+/// SimplifyFPBinOp - Given operands for a BinaryOperator, see if we<br class="">can<br class="">+/// fold the result.  If not, this returns null.<br class="">+/// In contrast to SimplifyBinOp, try to use FastMathFlag when<br class="">folding<br class="">the<br class="">+/// result. In case we don't need FastMathFlags, simply fall to<br class="">SimplifyBinOp.<br class="">+static Value *SimplifyFPBinOp(unsigned Opcode, Value *LHS, Value<br class="">*RHS,<br class="">+                              const FastMathFlags &FMF, const Query<br class="">&Q,<br class="">+                              unsigned MaxRecurse) {<br class="">+  switch (Opcode) {<br class="">+  case Instruction::FAdd:<br class="">+    return SimplifyFAddInst(LHS, RHS, FMF, Q, MaxRecurse);<br class="">+  case Instruction::FSub:<br class="">+    return SimplifyFSubInst(LHS, RHS, FMF, Q, MaxRecurse);<br class="">+  case Instruction::FMul:<br class="">+    return SimplifyFMulInst(LHS, RHS, FMF, Q, MaxRecurse);<br class="">+  default:<br class="">+    return SimplifyBinOp(Opcode, LHS, RHS, Q, MaxRecurse);<br class="">+  }<br class="">+}<br class="">+<br class="">Value *llvm::SimplifyBinOp(unsigned Opcode, Value *LHS, Value *RHS,<br class="">                         const DataLayout *DL, const<br class="">TargetLibraryInfo<br class="">*TLI,<br class="">                         const DominatorTree *DT, AssumptionCache<br class="">*AC,<br class="">@@ -3473,6 +3494,15 @@ Value *llvm::SimplifyBinOp(unsigned Opco<br class="">                       RecursionLimit);<br class="">}<br class=""><br class="">+Value *llvm::SimplifyFPBinOp(unsigned Opcode, Value *LHS, Value *RHS,<br class="">+                             const FastMathFlags &FMF, const<br class="">DataLayout<br class="">*DL,<br class="">+                             const TargetLibraryInfo *TLI,<br class="">+                             const DominatorTree *DT, AssumptionCache<br class="">*AC,<br class="">+                             const Instruction *CxtI) {<br class="">+  return ::SimplifyFPBinOp(Opcode, LHS, RHS, FMF, Query(DL, TLI, DT,<br class="">AC,<br class="">CxtI),<br class="">+                           RecursionLimit);<br class="">+}<br class="">+<br class="">/// SimplifyCmpInst - Given operands for a CmpInst, see if we can<br class="">/// fold the result.<br class="">static Value *SimplifyCmpInst(unsigned Predicate, Value *LHS, Value<br class="">*RHS,<br class=""><br class="">Modified: llvm/trunk/lib/Transforms/Scalar/LoopUnrollPass.cpp<br class="">URL:<br class=""><a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopUnrollPass.cpp?rev=228432&r1=228431&r2=228432&view=diff" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopUnrollPass.cpp?rev=228432&r1=228431&r2=228432&view=diff</a><br class="">==============================================================================<br class="">--- llvm/trunk/lib/Transforms/Scalar/LoopUnrollPass.cpp (original)<br class="">+++ llvm/trunk/lib/Transforms/Scalar/LoopUnrollPass.cpp Fri Feb  6<br class="">14:02:51 2015<br class="">@@ -311,7 +311,12 @@ class UnrollAnalyzer : public InstVisito<br class="">  if (!isa<Constant>(RHS))<br class="">    if (Constant *SimpleRHS = SimplifiedValues.lookup(RHS))<br class="">      RHS = SimpleRHS;<br class="">-    Value *SimpleV = SimplifyBinOp(I.getOpcode(), LHS, RHS);<br class="">+    Value *SimpleV = nullptr;<br class="">+    if (auto FI = dyn_cast<FPMathOperator>(&I))<br class="">+      SimpleV =<br class="">+          SimplifyFPBinOp(I.getOpcode(), LHS, RHS,<br class="">FI->getFastMathFlags());<br class="">+    else<br class="">+      SimpleV = SimplifyBinOp(I.getOpcode(), LHS, RHS);<br class=""><br class="">  if (SimpleV && CountedInsns.insert(&I).second)<br class="">    NumberOfOptimizedInstructions += TTI.getUserCost(&I);<br class=""><br class=""><br class="">_______________________________________________<br class="">llvm-commits mailing list<br class=""><a href="mailto:llvm-commits@cs.uiuc.edu" class="">llvm-commits@cs.uiuc.edu</a><br class=""><a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" class="">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br class=""><br class=""></blockquote><br class=""><br class=""></blockquote><br class=""><br class="">_______________________________________________<br class="">llvm-commits mailing list<br class=""><a href="mailto:llvm-commits@cs.uiuc.edu" class="">llvm-commits@cs.uiuc.edu</a><span class="Apple-converted-space"> </span><<a href="mailto:llvm-commits@cs.uiuc.edu" class="">mailto:llvm-commits@cs.uiuc.edu</a>><br class=""><a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" class="">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br class=""><<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" class="">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a>></blockquote></blockquote></div></blockquote></div><br class=""></div></div></body></html>