[llvm] 1b86867 - llvm-reduce: Fix losing callsite attributes when removing arguments (#133407)

via llvm-commits llvm-commits at lists.llvm.org
Fri Mar 28 09:21:00 PDT 2025


Author: Matt Arsenault
Date: 2025-03-28T23:20:56+07:00
New Revision: 1b86867ab3ccf731863043718d53700535e0fb21

URL: https://github.com/llvm/llvm-project/commit/1b86867ab3ccf731863043718d53700535e0fb21
DIFF: https://github.com/llvm/llvm-project/commit/1b86867ab3ccf731863043718d53700535e0fb21.diff

LOG: llvm-reduce: Fix losing callsite attributes when removing arguments (#133407)

The attribute APIs make this cumbersome. There seem to be missing
overloads using AttrBuilder for the function attrs. Plus there doesn't
seem to be a direct way to set the function attrs on the call.

Added: 
    llvm/test/tools/llvm-reduce/remove-argument-preserve-attributes.ll

Modified: 
    llvm/test/tools/llvm-reduce/reduce-arguments-x86_intrcc.ll
    llvm/tools/llvm-reduce/deltas/ReduceArguments.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/test/tools/llvm-reduce/reduce-arguments-x86_intrcc.ll b/llvm/test/tools/llvm-reduce/reduce-arguments-x86_intrcc.ll
index 50aac3cce32fa..7589835f0c0fe 100644
--- a/llvm/test/tools/llvm-reduce/reduce-arguments-x86_intrcc.ll
+++ b/llvm/test/tools/llvm-reduce/reduce-arguments-x86_intrcc.ll
@@ -20,7 +20,7 @@ declare x86_intrcc void @extern_decl(ptr byval(i32), i32, i32)
 
 ; INTERESTING-LABEL: void @callsite(
 ; INTERESTING: call
-; REDUCED: call x86_intrcc void @func(ptr %k, i32 %other.keep)
+; REDUCED: call x86_intrcc void @func(ptr byval(i32) %k, i32 %other.keep)
 define void @callsite(ptr %k, i32 %other.keep, i32 %other.drop) {
   call x86_intrcc void @func(ptr byval(i32) %k, i32 %other.keep, i32 %other.drop)
   ret void

diff  --git a/llvm/test/tools/llvm-reduce/remove-argument-preserve-attributes.ll b/llvm/test/tools/llvm-reduce/remove-argument-preserve-attributes.ll
new file mode 100644
index 0000000000000..0491dec983438
--- /dev/null
+++ b/llvm/test/tools/llvm-reduce/remove-argument-preserve-attributes.ll
@@ -0,0 +1,55 @@
+; Check that when removing arguments, existing callsite attributes are preserved
+
+; RUN: llvm-reduce --abort-on-invalid-reduction --delta-passes=arguments --test FileCheck --test-arg --check-prefixes=INTERESTING --test-arg %s --test-arg --input-file %s -o %t
+; RUN: FileCheck --check-prefixes=RESULT %s < %t
+
+; INTERESTING-LABEL: define void @callee0(
+define void @callee0(ptr %interesting0, ptr %interesting1, i32 %uninteresting2) {
+  ret void
+}
+
+; INTERESTING-LABEL: define void @callee1(
+define void @callee1(ptr byval(i64) %interesting0, ptr %interesting1, i32 %uninteresting2) {
+  ret void
+}
+
+; INTERESTING-LABEL: define void @caller0(
+
+; INTERESTING: byval
+; INTERESTING-SAME: "some-attr"
+
+; INTERESTING: byval
+; INTERESTING-SAME: "more-attr"
+
+; RESULT-LABEL: define void @caller0(ptr %val0) {
+; RESULT: call void @callee0(ptr byval(i32) %val0, ptr "some-attr" %alloca0) #0
+; RESULT: call void @callee1(ptr byval(i64) %alloca1, ptr "more-attr" %alloca1) #1
+define void @caller0(ptr %val0, i32 %val1) {
+  %alloca0 = alloca i32
+  %alloca1 = alloca i64
+  call void @callee0(ptr byval(i32) %val0, ptr "some-attr" %alloca0, i32 %val1) nounwind memory(none) "a-func-attr"
+  call void @callee1(ptr byval(i64) %alloca1, ptr "more-attr" %alloca1, i32 9) "val-func-attr="="something"
+  ret void
+}
+
+; RESULT-LABEL: define ptr @callee2() {
+; RESULT-NEXT: ret ptr null
+define ptr @callee2(ptr %val0, i32 %b) {
+  store i32 %b, ptr %val0
+  ret ptr %val0
+}
+
+; Make sure ret attributes are preserved
+; INTERESTING: define ptr @caller1(
+; INTERESTING: call
+
+; RESULT-LABEL: define ptr @caller1() {
+; RESULT: %ret = call align 4 "ret-attr" ptr @callee2()
+
+define ptr @caller1(ptr %val0, i32 %val1) {
+  %ret = call align 4 "ret-attr" ptr @callee2(ptr %val0, i32 %val1)
+  ret ptr %ret
+}
+
+; RESULT: attributes #0 = { nounwind memory(none) "a-func-attr" }
+; RESULT: attributes #1 = { "val-func-attr="="something" }

diff  --git a/llvm/tools/llvm-reduce/deltas/ReduceArguments.cpp b/llvm/tools/llvm-reduce/deltas/ReduceArguments.cpp
index 134801fef020b..ec2699a990311 100644
--- a/llvm/tools/llvm-reduce/deltas/ReduceArguments.cpp
+++ b/llvm/tools/llvm-reduce/deltas/ReduceArguments.cpp
@@ -39,6 +39,8 @@ static bool callingConvRequiresArgument(const Function &F,
 /// Goes over OldF calls and replaces them with a call to NewF
 static void replaceFunctionCalls(Function &OldF, Function &NewF,
                                  const std::set<int> &ArgIndexesToKeep) {
+  LLVMContext &Ctx = OldF.getContext();
+
   const auto &Users = OldF.users();
   for (auto I = Users.begin(), E = Users.end(); I != E; )
     if (auto *CI = dyn_cast<CallInst>(*I++)) {
@@ -47,12 +49,30 @@ static void replaceFunctionCalls(Function &OldF, Function &NewF,
       if (CI->getCalledFunction() != &OldF)
         continue;
       SmallVector<Value *, 8> Args;
-      for (auto ArgI = CI->arg_begin(), E = CI->arg_end(); ArgI != E; ++ArgI)
-        if (ArgIndexesToKeep.count(ArgI - CI->arg_begin()))
+      SmallVector<AttrBuilder, 8> ArgAttrs;
+
+      for (auto ArgI = CI->arg_begin(), E = CI->arg_end(); ArgI != E; ++ArgI) {
+        unsigned ArgIdx = ArgI - CI->arg_begin();
+        if (ArgIndexesToKeep.count(ArgIdx)) {
           Args.push_back(*ArgI);
+          ArgAttrs.emplace_back(Ctx, CI->getParamAttributes(ArgIdx));
+        }
+      }
 
+      // FIXME: Losing bundles, fast math flags and metadata
       CallInst *NewCI = CallInst::Create(&NewF, Args);
       NewCI->setCallingConv(NewF.getCallingConv());
+
+      AttrBuilder CallSiteAttrs(Ctx, CI->getAttributes().getFnAttrs());
+      NewCI->setAttributes(
+          AttributeList::get(Ctx, AttributeList::FunctionIndex, CallSiteAttrs));
+      NewCI->addRetAttrs(AttrBuilder(Ctx, CI->getRetAttributes()));
+
+      unsigned AttrIdx = 0;
+      for (auto ArgI = NewCI->arg_begin(), E = NewCI->arg_end(); ArgI != E;
+           ++ArgI, ++AttrIdx)
+        NewCI->addParamAttrs(AttrIdx, ArgAttrs[AttrIdx]);
+
       if (!CI->use_empty())
         CI->replaceAllUsesWith(NewCI);
       ReplaceInstWithInst(CI, NewCI);


        


More information about the llvm-commits mailing list