[PATCH] D155638: [llvm-reduce] Reduce function calling convention

Arthur Eubanks via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Jul 18 13:36:22 PDT 2023


aeubanks created this revision.
aeubanks added a reviewer: arsenm.
Herald added a project: All.
aeubanks requested review of this revision.
Herald added subscribers: llvm-commits, wdng.
Herald added a project: LLVM.

Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D155638

Files:
  llvm/test/tools/llvm-reduce/reduce-calling-convention.ll
  llvm/tools/llvm-reduce/deltas/ReduceFunctionBodies.cpp


Index: llvm/tools/llvm-reduce/deltas/ReduceFunctionBodies.cpp
===================================================================
--- llvm/tools/llvm-reduce/deltas/ReduceFunctionBodies.cpp
+++ llvm/tools/llvm-reduce/deltas/ReduceFunctionBodies.cpp
@@ -14,6 +14,7 @@
 #include "ReduceFunctionBodies.h"
 #include "Delta.h"
 #include "Utils.h"
+#include "llvm/IR/CallingConv.h"
 #include "llvm/IR/GlobalValue.h"
 #include "llvm/IR/Instructions.h"
 
@@ -37,6 +38,18 @@
                "Reducing Function Bodies");
 }
 
+static bool shouldReduceCallingConvention(Function &F) {
+  // The CCC is very lenient, so most calling conventions should be able to be
+  // changed to it.
+  switch (F.getCallingConv()) {
+  case CallingConv::C:
+  case CallingConv::AMDGPU_CS_Chain:
+    return false;
+  default:
+    return true;
+  }
+}
+
 static void reduceFunctionData(Oracle &O, ReducerWorkItem &WorkItem) {
   for (Function &F : WorkItem.getModule()) {
     if (F.hasPersonalityFn()) {
@@ -54,6 +67,17 @@
 
     if (F.hasPrologueData() && !O.shouldKeep())
       F.setPrologueData(nullptr);
+
+    if (shouldReduceCallingConvention(F) && !O.shouldKeep()) {
+      // Update callee calling conventions to avoid UB when possible.
+      for (Use &U : F.uses()) {
+        if (auto *CB = dyn_cast<CallBase>(U.getUser())) {
+          if (&CB->getCalledOperandUse() == &U)
+            CB->setCallingConv(CallingConv::C);
+        }
+      }
+      F.setCallingConv(CallingConv::C);
+    }
   }
 }
 
Index: llvm/test/tools/llvm-reduce/reduce-calling-convention.ll
===================================================================
--- /dev/null
+++ llvm/test/tools/llvm-reduce/reduce-calling-convention.ll
@@ -0,0 +1,32 @@
+; Test that llvm-reduce can remove function calling conventions.
+;
+; RUN: llvm-reduce --abort-on-invalid-reduction --delta-passes=function-data --test FileCheck --test-arg --check-prefixes=CHECK-INTERESTINGNESS --test-arg %s --test-arg --input-file %s -o %t
+; RUN: FileCheck --check-prefix=CHECK-FINAL --implicit-check-not=fastcc %s < %t
+
+; CHECK-INTERESTINGNESS: declare
+; CHECK-INTERESTINGNESS-SAME: void @f
+
+; CHECK-FINAL: declare void @f()
+
+declare void @f()
+
+; CHECK-INTERESTINGNESS: declare
+; CHECK-INTERESTINGNESS-SAME: void @amdgpu
+
+; CHECK-FINAL: declare amdgpu_cs_chain void @amdgpu()
+
+declare amdgpu_cs_chain void @amdgpu()
+
+; CHECK-INTERESTINGNESS: declare
+; CHECK-INTERESTINGNESS-SAME: void @g
+
+; CHECK-FINAL: declare void @g()
+
+declare fastcc void @g()
+
+; CHECK-FINAL: define void @callg()
+; CHECK-FINAL: call void @g()
+define void @callg() {
+  call fastcc void @g()
+  ret void
+}


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D155638.541713.patch
Type: text/x-patch
Size: 2639 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20230718/c3c4619b/attachment.bin>


More information about the llvm-commits mailing list