[llvm] r355222 - [InstCombine] Extend saturating idempotent atomicrmw transform to FP

Philip Reames via llvm-commits llvm-commits at lists.llvm.org
Fri Mar 1 11:50:36 PST 2019


Author: reames
Date: Fri Mar  1 11:50:36 2019
New Revision: 355222

URL: http://llvm.org/viewvc/llvm-project?rev=355222&view=rev
Log:
[InstCombine] Extend saturating idempotent atomicrmw transform to FP

I'm assuming that the nan propogation logic for InstructonSimplify's handling of fadd and fsub is correct, and applying the same to atomicrmw.

Differential Revision: https://reviews.llvm.org/D58836


Modified:
    llvm/trunk/lib/Transforms/InstCombine/InstCombineAtomicRMW.cpp
    llvm/trunk/test/Transforms/InstCombine/atomicrmw.ll

Modified: llvm/trunk/lib/Transforms/InstCombine/InstCombineAtomicRMW.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineAtomicRMW.cpp?rev=355222&r1=355221&r2=355222&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/InstCombine/InstCombineAtomicRMW.cpp (original)
+++ llvm/trunk/lib/Transforms/InstCombine/InstCombineAtomicRMW.cpp Fri Mar  1 11:50:36 2019
@@ -57,15 +57,23 @@ bool isIdempotentRMW(AtomicRMWInst& RMWI
 }
 
 /// Return true if the given instruction always produces a value in memory
-/// equivelent to its value operand.
+/// equivalent to its value operand.
 bool isSaturating(AtomicRMWInst& RMWI) {
+  if (auto CF = dyn_cast<ConstantFP>(RMWI.getValOperand()))
+    switch(RMWI.getOperation()) {
+    case AtomicRMWInst::FAdd:
+    case AtomicRMWInst::FSub:
+      return CF->isNaN();
+    default:
+      return false;
+    };
+
   auto C = dyn_cast<ConstantInt>(RMWI.getValOperand());
   if(!C)
     return false;
 
   switch(RMWI.getOperation()) {
   default:
-    // TODO: fadd, fsub w/Nan
     return false;
   case AtomicRMWInst::Xchg:
     return true;

Modified: llvm/trunk/test/Transforms/InstCombine/atomicrmw.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/atomicrmw.ll?rev=355222&r1=355221&r2=355222&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/InstCombine/atomicrmw.ll (original)
+++ llvm/trunk/test/Transforms/InstCombine/atomicrmw.ll Fri Mar  1 11:50:36 2019
@@ -214,7 +214,7 @@ define i8 @sat_max_smax_char(i8* %addr)
 }
 
 ; CHECK-LABEL: sat_fadd_nan
-; CHECK-NEXT: %res = atomicrmw fadd double* %addr, double 0x7FF00000FFFFFFFF release
+; CHECK-NEXT: %res = atomicrmw xchg double* %addr, double 0x7FF00000FFFFFFFF release
 ; CHECK-NEXT: ret double %res
 define double @sat_fadd_nan(double* %addr) {
   %res = atomicrmw fadd double* %addr, double 0x7FF00000FFFFFFFF release
@@ -222,7 +222,7 @@ define double @sat_fadd_nan(double* %add
 }
 
 ; CHECK-LABEL: sat_fsub_nan
-; CHECK-NEXT: %res = atomicrmw fsub double* %addr, double 0x7FF00000FFFFFFFF release
+; CHECK-NEXT: %res = atomicrmw xchg double* %addr, double 0x7FF00000FFFFFFFF release
 ; CHECK-NEXT: ret double %res
 define double @sat_fsub_nan(double* %addr) {
   %res = atomicrmw fsub double* %addr, double 0x7FF00000FFFFFFFF release
@@ -230,7 +230,7 @@ define double @sat_fsub_nan(double* %add
 }
 
 ; CHECK-LABEL: sat_fsub_nan_unused
-; CHECK-NEXT: atomicrmw fsub double* %addr, double 0x7FF00000FFFFFFFF monotonic
+; CHECK-NEXT: store atomic double 0x7FF00000FFFFFFFF, double* %addr monotonic, align 8
 ; CHECK-NEXT: ret void
 define void @sat_fsub_nan_unused(double* %addr) {
   atomicrmw fsub double* %addr, double 0x7FF00000FFFFFFFF monotonic




More information about the llvm-commits mailing list