[llvm] r360421 - SelectionDAG: accommodate atomic floating stores.

Tim Northover via llvm-commits llvm-commits at lists.llvm.org
Fri May 10 04:23:05 PDT 2019


Author: tnorthover
Date: Fri May 10 04:23:04 2019
New Revision: 360421

URL: http://llvm.org/viewvc/llvm-project?rev=360421&view=rev
Log:
SelectionDAG: accommodate atomic floating stores.

We were applying a pointer truncation to floating types, which crashed LLVM.
That is Not A Good Thing(TM).

Modified:
    llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
    llvm/trunk/test/CodeGen/NVPTX/load-store.ll

Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp?rev=360421&r1=360420&r2=360421&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp (original)
+++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp Fri May 10 04:23:04 2019
@@ -4717,7 +4717,10 @@ void SelectionDAGBuilder::visitAtomicSto
                             MemVT.getStoreSize(), I.getAlignment(), AAMDNodes(),
                             nullptr, SSID, Ordering);
 
-  SDValue Val = DAG.getPtrExtOrTrunc(getValue(I.getValueOperand()), dl, MemVT);
+  SDValue Val = getValue(I.getValueOperand());
+  if (Val.getValueType() != MemVT)
+    Val = DAG.getPtrExtOrTrunc(Val, dl, MemVT);
+
   SDValue OutChain = DAG.getAtomic(ISD::ATOMIC_STORE, dl, MemVT, InChain,
                                    getValue(I.getPointerOperand()), Val, MMO);
 

Modified: llvm/trunk/test/CodeGen/NVPTX/load-store.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/NVPTX/load-store.ll?rev=360421&r1=360420&r2=360421&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/NVPTX/load-store.ll (original)
+++ llvm/trunk/test/CodeGen/NVPTX/load-store.ll Fri May 10 04:23:04 2019
@@ -59,7 +59,7 @@ define void @volatile(i8* %a, i16* %b, i
 }
 
 ; CHECK-LABEL: monotonic
-define void @monotonic(i8* %a, i16* %b, i32* %c, i64* %d) local_unnamed_addr {
+define void @monotonic(i8* %a, i16* %b, i32* %c, i64* %d, float* %e) local_unnamed_addr {
   ; CHECK: ld.volatile.u8 %rs{{[0-9]+}}, [%rd{{[0-9]+}}]
   %a.load = load atomic i8, i8* %a monotonic, align 1
   %a.add = add i8 %a.load, 1
@@ -84,5 +84,11 @@ define void @monotonic(i8* %a, i16* %b,
   ; CHECK: st.volatile.u64 [%rd{{[0-9]+}}], %rd{{[0-9]+}}
   store atomic i64 %d.add, i64* %d monotonic, align 8
 
+  ; CHECK: ld.volatile.f32 %f{{[0-9]+}}, [%rd{{[0-9]+}}]
+  %e.load = load atomic float, float* %e monotonic, align 4
+  %e.add = fadd float %e.load, 1.0
+  ; CHECK: st.volatile.f32 [%rd{{[0-9]+}}], %f{{[0-9]+}}
+  store atomic float %e.add, float* %e monotonic, align 4
+
   ret void
 }




More information about the llvm-commits mailing list