[PATCH] D88800: [AtomicExpand] Avoid creating an unnamed libcall

Alexander Richardson via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Sun Oct 4 12:18:25 PDT 2020


arichardson created this revision.
arichardson added a reviewer: arsenm.
Herald added subscribers: llvm-commits, kerbowa, luismarques, s.egerton, lenary, PkmX, jfb, simoncook, hiraditya, tpr, nhaehnle, jvesely.
Herald added a project: LLVM.
arichardson requested review of this revision.
Herald added a subscriber: wdng.

I recently modified this pass to better support CHERI-RISC-V and while
doing so I noticed that this pass was calling M->getOrInsertFunction()
with the result of TLI->getLibcallName(RTLibType). However, AMDGPU fills
the libcalls array with nullptr, so this creates an anonymous function
instead. This patch changes expandAtomicOpToLibcall to return false in
case the libcall does not exist and changes the assert() in the callees to
a report_fatal_error instead.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D88800

Files:
  llvm/lib/CodeGen/AtomicExpandPass.cpp
  llvm/test/Transforms/AtomicExpand/AMDGPU/unaligned-atomic.ll


Index: llvm/test/Transforms/AtomicExpand/AMDGPU/unaligned-atomic.ll
===================================================================
--- llvm/test/Transforms/AtomicExpand/AMDGPU/unaligned-atomic.ll
+++ llvm/test/Transforms/AtomicExpand/AMDGPU/unaligned-atomic.ll
@@ -1,8 +1,6 @@
-; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
-; RUN: opt -S -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -atomic-expand %s | FileCheck -check-prefix=GCN %s
-
-; FIXME: This should not introduce a libcall, much less one to an
-; anonymous function.
+; RUN: not --crash opt -S -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -atomic-expand %s 2>&1 | FileCheck %s
+; The AtomicExpand pass cannot handle missing libcalls (yet) so reports a fatal error.
+; CHECK: LLVM ERROR: expandAtomicOpToLibcall() shouldn't fail for Load
 
 define i32 @atomic_load_global_align1(i32 addrspace(1)* %ptr) {
 ; GCN-LABEL: @atomic_load_global_align1(
Index: llvm/lib/CodeGen/AtomicExpandPass.cpp
===================================================================
--- llvm/lib/CodeGen/AtomicExpandPass.cpp
+++ llvm/lib/CodeGen/AtomicExpandPass.cpp
@@ -1507,8 +1507,8 @@
   bool expanded = expandAtomicOpToLibcall(
       I, Size, I->getAlign(), I->getPointerOperand(), nullptr, nullptr,
       I->getOrdering(), AtomicOrdering::NotAtomic, Libcalls);
-  (void)expanded;
-  assert(expanded && "expandAtomicOpToLibcall shouldn't fail tor Load");
+  if (!expanded)
+    report_fatal_error("expandAtomicOpToLibcall() shouldn't fail for Load");
 }
 
 void AtomicExpand::expandAtomicStoreToLibcall(StoreInst *I) {
@@ -1520,8 +1520,8 @@
   bool expanded = expandAtomicOpToLibcall(
       I, Size, I->getAlign(), I->getPointerOperand(), I->getValueOperand(),
       nullptr, I->getOrdering(), AtomicOrdering::NotAtomic, Libcalls);
-  (void)expanded;
-  assert(expanded && "expandAtomicOpToLibcall shouldn't fail tor Store");
+  if (!expanded)
+    report_fatal_error("expandAtomicOpToLibcall() shouldn't fail for Store");
 }
 
 void AtomicExpand::expandAtomicCASToLibcall(AtomicCmpXchgInst *I) {
@@ -1535,8 +1535,8 @@
       I, Size, I->getAlign(), I->getPointerOperand(), I->getNewValOperand(),
       I->getCompareOperand(), I->getSuccessOrdering(), I->getFailureOrdering(),
       Libcalls);
-  (void)expanded;
-  assert(expanded && "expandAtomicOpToLibcall shouldn't fail tor CAS");
+  if (!expanded)
+    report_fatal_error("expandAtomicOpToLibcall() shouldn't fail for CAS");
 }
 
 static ArrayRef<RTLIB::Libcall> GetRMWLibcall(AtomicRMWInst::BinOp Op) {
@@ -1685,6 +1685,11 @@
     return false;
   }
 
+  if (!TLI->getLibcallName(RTLibType)) {
+    // This target does not implement the requested atomic libcall so give up.
+    return false;
+  }
+
   // Build up the function call. There's two kinds. First, the sized
   // variants.  These calls are going to be one of the following (with
   // N=1,2,4,8,16):


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D88800.296067.patch
Type: text/x-patch
Size: 2890 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20201004/0d82c596/attachment.bin>


More information about the llvm-commits mailing list