Skip to content

Commit 1db2baa

Browse files
committed
[CIR] Upstream emitAndUpdateRetAlloca
1 parent 9e1eaff commit 1db2baa

File tree

3 files changed

+51
-16
lines changed

3 files changed

+51
-16
lines changed

clang/lib/CIR/CodeGen/CIRGenFunction.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,16 @@ void CIRGenFunction::startFunction(GlobalDecl gd, QualType returnType,
195195
mlir::Location fnBodyBegin = getLoc(fd->getBody()->getBeginLoc());
196196
builder.CIRBaseBuilderTy::createStore(fnBodyBegin, paramVal, addrVal);
197197
}
198+
198199
assert(builder.getInsertionBlock() && "Should be valid");
200+
201+
auto fnEndLoc = getLoc(fd->getBody()->getEndLoc());
202+
203+
// When the current function is not void, create an address to store the
204+
// result value.
205+
if (fnRetCIRTy.has_value())
206+
emitAndUpdateRetAlloca(fnRetQualTy, fnEndLoc,
207+
getContext().getTypeAlignInChars(fnRetQualTy));
199208
}
200209

201210
void CIRGenFunction::finishFunction(SourceLocation endLoc) {}
@@ -213,6 +222,11 @@ mlir::LogicalResult CIRGenFunction::emitFunctionBody(const clang::Stmt *body) {
213222
cir::FuncOp CIRGenFunction::generateCode(clang::GlobalDecl gd, cir::FuncOp fn,
214223
cir::FuncType funcType) {
215224
const auto funcDecl = cast<FunctionDecl>(gd.getDecl());
225+
fnRetQualTy = funcDecl->getReturnType();
226+
if (!fnRetQualTy->isVoidType()) {
227+
fnRetCIRTy = convertType(fnRetQualTy);
228+
}
229+
216230
SourceLocation loc = funcDecl->getLocation();
217231
Stmt *body = funcDecl->getBody();
218232
SourceRange bodyRange =
@@ -312,4 +326,12 @@ LValue CIRGenFunction::emitLValue(const Expr *e) {
312326
}
313327
}
314328

329+
void CIRGenFunction::emitAndUpdateRetAlloca(QualType ty, mlir::Location loc,
330+
CharUnits alignment) {
331+
if (ty->isVoidType()) {
332+
return;
333+
}
334+
335+
emitAlloca("__retval", convertType(ty), loc, alignment);
336+
}
315337
} // namespace clang::CIRGen

clang/lib/CIR/CodeGen/CIRGenFunction.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ class CIRGenFunction : public CIRGenTypeCache {
4949

5050
public:
5151
clang::QualType fnRetTy;
52+
clang::QualType fnRetQualTy;
53+
std::optional<mlir::Type> fnRetCIRTy;
5254

5355
/// This is the current function or global initializer that is generated code
5456
/// for.
@@ -101,6 +103,9 @@ class CIRGenFunction : public CIRGenTypeCache {
101103
clang::QualType ty, mlir::Location loc,
102104
clang::CharUnits alignment, bool isParam = false);
103105

106+
void emitAndUpdateRetAlloca(clang::QualType ty, mlir::Location loc,
107+
clang::CharUnits alignment);
108+
104109
public:
105110
mlir::Value emitAlloca(llvm::StringRef name, mlir::Type ty,
106111
mlir::Location loc, clang::CharUnits alignment);

clang/test/CIR/func-simple.cpp

Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,9 @@ void voidret() { return; }
1313

1414
int intfunc() { return 42; }
1515
// CHECK: cir.func @intfunc() -> !cir.int<s, 32> {
16-
// CHECK: %0 = cir.const #cir.int<42> : !cir.int<s, 32>
17-
// CHECK: cir.return %0 : !cir.int<s, 32>
16+
// CHECK: %0 = cir.alloca !cir.int<s, 32>, !cir.ptr<!cir.int<s, 32>>, ["__retval"] {alignment = 4 : i64}
17+
// CHECK: %1 = cir.const #cir.int<42> : !cir.int<s, 32>
18+
// CHECK: cir.return %1 : !cir.int<s, 32>
1819
// CHECK: }
1920

2021
int scopes() {
@@ -25,47 +26,54 @@ int scopes() {
2526
}
2627
}
2728
// CHECK: cir.func @scopes() -> !cir.int<s, 32> {
29+
// CHECK: %0 = cir.alloca !cir.int<s, 32>, !cir.ptr<!cir.int<s, 32>>, ["__retval"] {alignment = 4 : i64}
2830
// CHECK: cir.scope {
2931
// CHECK: cir.scope {
30-
// CHECK: %0 = cir.const #cir.int<99> : !cir.int<s, 32>
31-
// CHECK: cir.return %0 : !cir.int<s, 32>
32+
// CHECK: %1 = cir.const #cir.int<99> : !cir.int<s, 32>
33+
// CHECK: cir.return %1 : !cir.int<s, 32>
3234
// CHECK: }
3335
// CHECK: }
3436
// CHECK: cir.trap
3537
// CHECK: }
3638

3739
long longfunc() { return 42l; }
3840
// CHECK: cir.func @longfunc() -> !cir.int<s, 64>
39-
// CHECK: %0 = cir.const #cir.int<42> : !cir.int<s, 64>
40-
// CHECK: cir.return %0 : !cir.int<s, 64>
41+
// CHECK: %0 = cir.alloca !cir.int<s, 64>, !cir.ptr<!cir.int<s, 64>>, ["__retval"] {alignment = 8 : i64}
42+
// CHECK: %1 = cir.const #cir.int<42> : !cir.int<s, 64>
43+
// CHECK: cir.return %1 : !cir.int<s, 64>
4144
// CHECK: }
4245

4346
unsigned unsignedfunc() { return 42u; }
4447
// CHECK: cir.func @unsignedfunc() -> !cir.int<u, 32>
45-
// CHECK: %0 = cir.const #cir.int<42> : !cir.int<u, 32>
46-
// CHECK: cir.return %0 : !cir.int<u, 32>
48+
// CHECK: %0 = cir.alloca !cir.int<u, 32>, !cir.ptr<!cir.int<u, 32>>, ["__retval"] {alignment = 4 : i64}
49+
// CHECK: %1 = cir.const #cir.int<42> : !cir.int<u, 32>
50+
// CHECK: cir.return %1 : !cir.int<u, 32>
4751
// CHECK: }
4852

4953
unsigned long long ullfunc() { return 42ull; }
5054
// CHECK: cir.func @ullfunc() -> !cir.int<u, 64>
51-
// CHECK: %0 = cir.const #cir.int<42> : !cir.int<u, 64>
52-
// CHECK: cir.return %0 : !cir.int<u, 64>
55+
// CHECK: %0 = cir.alloca !cir.int<u, 64>, !cir.ptr<!cir.int<u, 64>>, ["__retval"] {alignment = 8 : i64}
56+
// CHECK: %1 = cir.const #cir.int<42> : !cir.int<u, 64>
57+
// CHECK: cir.return %1 : !cir.int<u, 64>
5358
// CHECK: }
5459

5560
bool boolfunc() { return true; }
5661
// CHECK: cir.func @boolfunc() -> !cir.bool {
57-
// CHECK: %0 = cir.const #true
58-
// CHECK: cir.return %0 : !cir.bool
62+
// CHECK: %0 = cir.alloca !cir.bool, !cir.ptr<!cir.bool>, ["__retval"] {alignment = 1 : i64}
63+
// CHECK: %1 = cir.const #true
64+
// CHECK: cir.return %1 : !cir.bool
5965
// CHECK: }
6066

6167
float floatfunc() { return 42.42f; }
6268
// CHECK: cir.func @floatfunc() -> !cir.float {
63-
// CHECK: %0 = cir.const #cir.fp<4.242
64-
// CHECK: cir.return %0 : !cir.float
69+
// CHECK: %0 = cir.alloca !cir.float, !cir.ptr<!cir.float>, ["__retval"] {alignment = 4 : i64}
70+
// CHECK: %1 = cir.const #cir.fp<4.242
71+
// CHECK: cir.return %1 : !cir.float
6572
// CHECK: }
6673

6774
double doublefunc() { return 42.42; }
6875
// CHECK: cir.func @doublefunc() -> !cir.double {
69-
// CHECK: %0 = cir.const #cir.fp<4.242
70-
// CHECK: cir.return %0 : !cir.double
76+
// CHECK: %0 = cir.alloca !cir.double, !cir.ptr<!cir.double>, ["__retval"] {alignment = 8 : i64}
77+
// CHECK: %1 = cir.const #cir.fp<4.242
78+
// CHECK: cir.return %1 : !cir.double
7179
// CHECK: }

0 commit comments

Comments
 (0)