[llvm] [LLVM] Change IRBuilder::CreateAggregateRet to accept an ArrayRef (PR #186605)
via llvm-commits
llvm-commits at lists.llvm.org
Sat Mar 14 12:09:55 PDT 2026
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-llvm-ir
Author: Rahul Joshi (jurahul)
<details>
<summary>Changes</summary>
Change `IRBuilder::CreateAggregateRet()` to accept an `ArrayRef` instead of a pointer and size, and extend IRBuilder unit test to exercise it.
---
Full diff: https://github.com/llvm/llvm-project/pull/186605.diff
3 Files Affected:
- (modified) llvm/include/llvm/IR/IRBuilder.h (+6-7)
- (modified) llvm/lib/IR/Core.cpp (+1-1)
- (modified) llvm/unittests/IR/IRBuilderTest.cpp (+21)
``````````diff
diff --git a/llvm/include/llvm/IR/IRBuilder.h b/llvm/include/llvm/IR/IRBuilder.h
index b0bf40304fc5d..028d1e26b730c 100644
--- a/llvm/include/llvm/IR/IRBuilder.h
+++ b/llvm/include/llvm/IR/IRBuilder.h
@@ -1176,17 +1176,16 @@ class IRBuilderBase {
return Insert(ReturnInst::Create(Context, V));
}
- /// Create a sequence of N insertvalue instructions,
- /// with one Value from the retVals array each, that build a aggregate
- /// return value one value at a time, and a ret instruction to return
- /// the resulting aggregate value.
+ /// Create a sequence of N insertvalue instructions, with one Value from the
+ /// RetVals array each, that build a aggregate return value one value at a
+ /// time, and a ret instruction to return the resulting aggregate value.
///
/// This is a convenience function for code that uses aggregate return values
/// as a vehicle for having multiple return values.
- ReturnInst *CreateAggregateRet(Value *const *retVals, unsigned N) {
+ ReturnInst *CreateAggregateRet(ArrayRef<Value *> RetVals) {
Value *V = PoisonValue::get(getCurrentFunctionReturnType());
- for (unsigned i = 0; i != N; ++i)
- V = CreateInsertValue(V, retVals[i], i, "mrv");
+ for (size_t i = 0, N = RetVals.size(); i != N; ++i)
+ V = CreateInsertValue(V, RetVals[i], i, "mrv");
return Insert(ReturnInst::Create(Context, V));
}
diff --git a/llvm/lib/IR/Core.cpp b/llvm/lib/IR/Core.cpp
index 65add3415b3bf..f54e885968fcb 100644
--- a/llvm/lib/IR/Core.cpp
+++ b/llvm/lib/IR/Core.cpp
@@ -3486,7 +3486,7 @@ LLVMValueRef LLVMBuildRet(LLVMBuilderRef B, LLVMValueRef V) {
LLVMValueRef LLVMBuildAggregateRet(LLVMBuilderRef B, LLVMValueRef *RetVals,
unsigned N) {
- return wrap(unwrap(B)->CreateAggregateRet(unwrap(RetVals), N));
+ return wrap(unwrap(B)->CreateAggregateRet({unwrap(RetVals), N}));
}
LLVMValueRef LLVMBuildBr(LLVMBuilderRef B, LLVMBasicBlockRef Dest) {
diff --git a/llvm/unittests/IR/IRBuilderTest.cpp b/llvm/unittests/IR/IRBuilderTest.cpp
index 21daa5967108c..8c4daf56bbfa4 100644
--- a/llvm/unittests/IR/IRBuilderTest.cpp
+++ b/llvm/unittests/IR/IRBuilderTest.cpp
@@ -1415,4 +1415,25 @@ TEST_F(IRBuilderTest, finalizeSubprogram) {
EXPECT_EQ(BarSP->getRetainedNodes()[0], Type);
EXPECT_TRUE(FooSP->getRetainedNodes().empty());
}
+
+TEST_F(IRBuilderTest, CreateAggregateRet) {
+ IRBuilder<> Builder(BB);
+ // Terminate the function/block created in SetUp.
+ Builder.CreateRetVoid();
+
+ Type *AggType =
+ StructType::create(Ctx, {Builder.getInt8Ty(), Builder.getInt64Ty()});
+ ConstantInt *RV0 = Builder.getInt8(5);
+ ConstantInt *RV1 = Builder.getInt64(55);
+
+ FunctionType *FTy = FunctionType::get(AggType, /*isVarArg=*/false);
+
+ Function *F1 =
+ Function::Create(FTy, Function::ExternalLinkage, "F2", M.get());
+ BasicBlock *CalleeBB = BasicBlock::Create(Ctx, "", F1);
+ IRBuilder<> CalleeBuilder(CalleeBB);
+ CalleeBuilder.CreateAggregateRet({RV0, RV1});
+
+ EXPECT_FALSE(verifyModule(*M));
+}
}
``````````
</details>
https://github.com/llvm/llvm-project/pull/186605
More information about the llvm-commits
mailing list