Skip to content

Commit a5f0feb

Browse files
committed
add const attribute for allocas for local reference variables
1 parent 7da6e68 commit a5f0feb

14 files changed

+60
-19
lines changed

clang/lib/CIR/CodeGen/CIRGenFunction.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -308,7 +308,7 @@ mlir::LogicalResult CIRGenFunction::declare(const Decl *var, QualType ty,
308308
auto allocaOp = cast<mlir::cir::AllocaOp>(addr.getDefiningOp());
309309
if (isParam)
310310
allocaOp.setInitAttr(mlir::UnitAttr::get(builder.getContext()));
311-
if (ty.isConstQualified())
311+
if (ty->isReferenceType() || ty.isConstQualified())
312312
allocaOp.setConstantAttr(mlir::UnitAttr::get(builder.getContext()));
313313

314314
symbolTable.insert(var, addr);
@@ -328,7 +328,7 @@ mlir::LogicalResult CIRGenFunction::declare(Address addr, const Decl *var,
328328
auto allocaOp = cast<mlir::cir::AllocaOp>(addrVal.getDefiningOp());
329329
if (isParam)
330330
allocaOp.setInitAttr(mlir::UnitAttr::get(builder.getContext()));
331-
if (ty.isConstQualified())
331+
if (ty->isReferenceType() || ty.isConstQualified())
332332
allocaOp.setConstantAttr(mlir::UnitAttr::get(builder.getContext()));
333333

334334
symbolTable.insert(var, addrVal);

clang/test/CIR/CodeGen/assign-operator.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ struct String {
1616
//
1717
// CHECK: cir.func linkonce_odr @_ZN10StringViewC2ERK6String
1818
// CHECK: %0 = cir.alloca !cir.ptr<!ty_StringView>, !cir.ptr<!cir.ptr<!ty_StringView>>, ["this", init] {alignment = 8 : i64}
19-
// CHECK: %1 = cir.alloca !cir.ptr<!ty_String>, !cir.ptr<!cir.ptr<!ty_String>>, ["s", init] {alignment = 8 : i64}
19+
// CHECK: %1 = cir.alloca !cir.ptr<!ty_String>, !cir.ptr<!cir.ptr<!ty_String>>, ["s", init, const] {alignment = 8 : i64}
2020
// CHECK: cir.store %arg0, %0 : !cir.ptr<!ty_StringView>
2121
// CHECK: cir.store %arg1, %1 : !cir.ptr<!ty_String>
2222
// CHECK: %2 = cir.load %0 : !cir.ptr<!cir.ptr<!ty_StringView>>
@@ -47,7 +47,7 @@ struct String {
4747
//
4848
// CHECK: cir.func linkonce_odr @_ZN10StringViewaSEOS_
4949
// CHECK: %0 = cir.alloca !cir.ptr<!ty_StringView>, !cir.ptr<!cir.ptr<!ty_StringView>>, ["this", init] {alignment = 8 : i64}
50-
// CHECK: %1 = cir.alloca !cir.ptr<!ty_StringView>, !cir.ptr<!cir.ptr<!ty_StringView>>, ["", init] {alignment = 8 : i64}
50+
// CHECK: %1 = cir.alloca !cir.ptr<!ty_StringView>, !cir.ptr<!cir.ptr<!ty_StringView>>, ["", init, const] {alignment = 8 : i64}
5151
// CHECK: %2 = cir.alloca !cir.ptr<!ty_StringView>, !cir.ptr<!cir.ptr<!ty_StringView>>, ["__retval"] {alignment = 8 : i64}
5252
// CHECK: cir.store %arg0, %0 : !cir.ptr<!ty_StringView>
5353
// CHECK: cir.store %arg1, %1 : !cir.ptr<!ty_StringView>

clang/test/CIR/CodeGen/bitfields.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ void store_field() {
4343
}
4444

4545
// CHECK: cir.func @_Z10load_field
46-
// CHECK: [[TMP0:%.*]] = cir.alloca !cir.ptr<!ty_S>, !cir.ptr<!cir.ptr<!ty_S>>, ["s", init]
46+
// CHECK: [[TMP0:%.*]] = cir.alloca !cir.ptr<!ty_S>, !cir.ptr<!cir.ptr<!ty_S>>, ["s", init, const]
4747
// CHECK: [[TMP1:%.*]] = cir.load [[TMP0]] : !cir.ptr<!cir.ptr<!ty_S>>, !cir.ptr<!ty_S>
4848
// CHECK: [[TMP2:%.*]] = cir.get_member [[TMP1]][1] {name = "d"} : !cir.ptr<!ty_S> -> !cir.ptr<!cir.array<!u8i x 3>>
4949
// CHECK: [[TMP3:%.*]] = cir.get_bitfield(#bfi_d, [[TMP2]] : !cir.ptr<!cir.array<!u8i x 3>>) -> !s32i

clang/test/CIR/CodeGen/cond.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ min(const unsigned long& __a, const unsigned long& __b) {
1111
}
1212

1313
// CHECK: cir.func @_Z3minRKmS0_(%arg0: !cir.ptr<!u64i>
14-
// CHECK: %0 = cir.alloca !cir.ptr<!u64i>, !cir.ptr<!cir.ptr<!u64i>>, ["__a", init] {alignment = 8 : i64}
15-
// CHECK: %1 = cir.alloca !cir.ptr<!u64i>, !cir.ptr<!cir.ptr<!u64i>>, ["__b", init] {alignment = 8 : i64}
14+
// CHECK: %0 = cir.alloca !cir.ptr<!u64i>, !cir.ptr<!cir.ptr<!u64i>>, ["__a", init, const] {alignment = 8 : i64}
15+
// CHECK: %1 = cir.alloca !cir.ptr<!u64i>, !cir.ptr<!cir.ptr<!u64i>>, ["__b", init, const] {alignment = 8 : i64}
1616
// CHECK: %2 = cir.alloca !cir.ptr<!u64i>, !cir.ptr<!cir.ptr<!u64i>>, ["__retval"] {alignment = 8 : i64}
1717
// CHECK: cir.store %arg0, %0 : !cir.ptr<!u64i>, !cir.ptr<!cir.ptr<!u64i>>
1818
// CHECK: cir.store %arg1, %1 : !cir.ptr<!u64i>, !cir.ptr<!cir.ptr<!u64i>>

clang/test/CIR/CodeGen/const-alloca.cpp

+9
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,15 @@ void local_constexpr_int() {
2727
// CHECK: %{{.+}} = cir.alloca !s32i, !cir.ptr<!s32i>, ["x", init, const]
2828
// CHECK: }
2929

30+
void local_reference() {
31+
int x = 0;
32+
int &r = x;
33+
}
34+
35+
// CHECK-LABEL: @_Z15local_referencev
36+
// CHECK: %{{.+}} = cir.alloca !cir.ptr<!s32i>, !cir.ptr<!cir.ptr<!s32i>>, ["r", init, const]
37+
// CHECK: }
38+
3039
struct Foo {
3140
int a;
3241
int b;

clang/test/CIR/CodeGen/coro-task.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -275,8 +275,8 @@ folly::coro::Task<int> byRef(const std::string& s) {
275275

276276
// FIXME: this could be less redundant than two allocas + reloads
277277
// CHECK: cir.func coroutine @_Z5byRefRKSt6string(%arg0: !cir.ptr<![[StdString]]> {{.*}} ![[IntTask]] extra{{.*}}{
278-
// CHECK: %[[#AllocaParam:]] = cir.alloca !cir.ptr<![[StdString]]>, {{.*}} ["s", init]
279-
// CHECK: %[[#AllocaFnUse:]] = cir.alloca !cir.ptr<![[StdString]]>, {{.*}} ["s", init]
278+
// CHECK: %[[#AllocaParam:]] = cir.alloca !cir.ptr<![[StdString]]>, {{.*}} ["s", init, const]
279+
// CHECK: %[[#AllocaFnUse:]] = cir.alloca !cir.ptr<![[StdString]]>, {{.*}} ["s", init, const]
280280

281281
folly::coro::Task<void> silly_coro() {
282282
std::optional<folly::coro::Task<int>> task;

clang/test/CIR/CodeGen/ctor-member-lvalue-to-rvalue.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ struct String {
77
String(const String &s) : size{s.size} {}
88
// CHECK: cir.func linkonce_odr @_ZN6StringC2ERKS_
99
// CHECK: %0 = cir.alloca !cir.ptr<!ty_String>, !cir.ptr<!cir.ptr<!ty_String>>, ["this", init] {alignment = 8 : i64}
10-
// CHECK: %1 = cir.alloca !cir.ptr<!ty_String>, !cir.ptr<!cir.ptr<!ty_String>>, ["s", init] {alignment = 8 : i64}
10+
// CHECK: %1 = cir.alloca !cir.ptr<!ty_String>, !cir.ptr<!cir.ptr<!ty_String>>, ["s", init, const] {alignment = 8 : i64}
1111
// CHECK: cir.store %arg0, %0
1212
// CHECK: cir.store %arg1, %1
1313
// CHECK: %2 = cir.load %0

clang/test/CIR/CodeGen/derived-to-base.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ void vcall(C1 &c1) {
109109
}
110110

111111
// CHECK: cir.func @_Z5vcallR2C1(%arg0: !cir.ptr<!ty_C1_>
112-
// CHECK: %0 = cir.alloca !cir.ptr<!ty_C1_>, !cir.ptr<!cir.ptr<!ty_C1_>>, ["c1", init] {alignment = 8 : i64}
112+
// CHECK: %0 = cir.alloca !cir.ptr<!ty_C1_>, !cir.ptr<!cir.ptr<!ty_C1_>>, ["c1", init, const] {alignment = 8 : i64}
113113
// CHECK: %1 = cir.alloca !ty_buffy, !cir.ptr<!ty_buffy>, ["b"] {alignment = 8 : i64}
114114
// CHECK: %2 = cir.alloca !s32i, !cir.ptr<!s32i>, ["e"] {alignment = 4 : i64}
115115
// CHECK: %3 = cir.alloca !ty_buffy, !cir.ptr<!ty_buffy>, ["agg.tmp0"] {alignment = 8 : i64}

clang/test/CIR/CodeGen/lvalue-refs.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ struct String {
77
void split(String &S) {}
88

99
// CHECK: cir.func @_Z5splitR6String(%arg0: !cir.ptr<!ty_String>
10-
// CHECK: %0 = cir.alloca !cir.ptr<!ty_String>, !cir.ptr<!cir.ptr<!ty_String>>, ["S", init]
10+
// CHECK: %0 = cir.alloca !cir.ptr<!ty_String>, !cir.ptr<!cir.ptr<!ty_String>>, ["S", init, const]
1111

1212
void foo() {
1313
String s;

clang/test/CIR/CodeGen/new.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ void m(int a, int b) {
1212
}
1313

1414
// CHECK: cir.func linkonce_odr @_ZSt11make_sharedI1SJRiS1_EESt10shared_ptrIT_EDpOT0_(
15-
// CHECK: %0 = cir.alloca !cir.ptr<!s32i>, !cir.ptr<!cir.ptr<!s32i>>, ["args", init] {alignment = 8 : i64}
16-
// CHECK: %1 = cir.alloca !cir.ptr<!s32i>, !cir.ptr<!cir.ptr<!s32i>>, ["args", init] {alignment = 8 : i64}
15+
// CHECK: %0 = cir.alloca !cir.ptr<!s32i>, !cir.ptr<!cir.ptr<!s32i>>, ["args", init, const] {alignment = 8 : i64}
16+
// CHECK: %1 = cir.alloca !cir.ptr<!s32i>, !cir.ptr<!cir.ptr<!s32i>>, ["args", init, const] {alignment = 8 : i64}
1717
// CHECK: %2 = cir.alloca !ty_std3A3Ashared_ptr3CS3E, !cir.ptr<!ty_std3A3Ashared_ptr3CS3E>, ["__retval"] {alignment = 1 : i64}
1818
// CHECK: cir.store %arg0, %0 : !cir.ptr<!s32i>, !cir.ptr<!cir.ptr<!s32i>>
1919
// CHECK: cir.store %arg1, %1 : !cir.ptr<!s32i>, !cir.ptr<!cir.ptr<!s32i>>

clang/test/CIR/CodeGen/rangefor.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,10 @@ void init(unsigned numImages) {
3333
// CHECK: %3 = cir.cast(integral, %2 : !u32i), !u64i
3434
// CHECK: cir.call @_ZNSt6vectorI6tripleEC1Em(%1, %3) : (!cir.ptr<![[VEC]]>, !u64i) -> ()
3535
// CHECK: cir.scope {
36-
// CHECK: %4 = cir.alloca !cir.ptr<![[VEC]]>, !cir.ptr<!cir.ptr<![[VEC]]>>, ["__range1", init] {alignment = 8 : i64}
36+
// CHECK: %4 = cir.alloca !cir.ptr<![[VEC]]>, !cir.ptr<!cir.ptr<![[VEC]]>>, ["__range1", init, const] {alignment = 8 : i64}
3737
// CHECK: %5 = cir.alloca ![[VEC_IT]], !cir.ptr<![[VEC_IT]]>, ["__begin1", init] {alignment = 8 : i64}
3838
// CHECK: %6 = cir.alloca ![[VEC_IT]], !cir.ptr<![[VEC_IT]]>, ["__end1", init] {alignment = 8 : i64}
39-
// CHECK: %7 = cir.alloca !cir.ptr<!ty_triple>, !cir.ptr<!cir.ptr<!ty_triple>>, ["image", init] {alignment = 8 : i64}
39+
// CHECK: %7 = cir.alloca !cir.ptr<!ty_triple>, !cir.ptr<!cir.ptr<!ty_triple>>, ["image", init, const] {alignment = 8 : i64}
4040
// CHECK: cir.store %1, %4 : !cir.ptr<![[VEC]]>, !cir.ptr<!cir.ptr<![[VEC]]>>
4141
// CHECK: %8 = cir.load %4 : !cir.ptr<!cir.ptr<![[VEC]]>>, !cir.ptr<![[VEC]]>
4242
// CHECK: %9 = cir.call @_ZNSt6vectorI6tripleE5beginEv(%8) : (!cir.ptr<![[VEC]]>) -> ![[VEC_IT]]

clang/test/CIR/CodeGen/return.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ int &ret0(int &x) {
55
}
66

77
// CHECK: cir.func @_Z4ret0Ri
8-
// CHECK: %0 = cir.alloca !cir.ptr<!s32i>, !cir.ptr<!cir.ptr<!s32i>>, ["x", init] {alignment = 8 : i64}
8+
// CHECK: %0 = cir.alloca !cir.ptr<!s32i>, !cir.ptr<!cir.ptr<!s32i>>, ["x", init, const] {alignment = 8 : i64}
99
// CHECK: %1 = cir.alloca !cir.ptr<!s32i>, !cir.ptr<!cir.ptr<!s32i>>, ["__retval"] {alignment = 8 : i64}
1010
// CHECK: cir.store %arg0, %0 : !cir.ptr<!s32i>, !cir.ptr<!cir.ptr<!s32i>>
1111
// CHECK: %2 = cir.load %0 : !cir.ptr<!cir.ptr<!s32i>>, !cir.ptr<!s32i>

clang/test/CIR/CodeGen/temporary-materialization.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ int test() {
1111
// CHECK: cir.func @_Z4testv()
1212
// CHECK-NEXT: %{{.+}} = cir.alloca !s32i, !cir.ptr<!s32i>, ["__retval"] {alignment = 4 : i64}
1313
// CHECK-NEXT: %[[#TEMP_SLOT:]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["ref.tmp0", init] {alignment = 4 : i64}
14-
// CHECK-NEXT: %[[#x:]] = cir.alloca !cir.ptr<!s32i>, !cir.ptr<!cir.ptr<!s32i>>, ["x", init] {alignment = 8 : i64}
14+
// CHECK-NEXT: %[[#x:]] = cir.alloca !cir.ptr<!s32i>, !cir.ptr<!cir.ptr<!s32i>>, ["x", init, const] {alignment = 8 : i64}
1515
// CHECK-NEXT: cir.scope {
1616
// CHECK-NEXT: %[[#TEMP_VALUE:]] = cir.call @_Z8make_intv() : () -> !s32i
1717
// CHECK-NEXT: cir.store %[[#TEMP_VALUE]], %[[#TEMP_SLOT]] : !s32i, !cir.ptr<!s32i>
@@ -33,7 +33,7 @@ int test_scoped() {
3333
// CHECK-NEXT: %{{.+}} = cir.alloca !s32i, !cir.ptr<!s32i>, ["x", init] {alignment = 4 : i64}
3434
// CHECK: cir.scope {
3535
// CHECK-NEXT: %[[#TEMP_SLOT:]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["ref.tmp0", init] {alignment = 4 : i64}
36-
// CHECK-NEXT: %[[#y:]] = cir.alloca !cir.ptr<!s32i>, !cir.ptr<!cir.ptr<!s32i>>, ["y", init] {alignment = 8 : i64}
36+
// CHECK-NEXT: %[[#y:]] = cir.alloca !cir.ptr<!s32i>, !cir.ptr<!cir.ptr<!s32i>>, ["y", init, const] {alignment = 8 : i64}
3737
// CHECK-NEXT: cir.scope {
3838
// CHECK-NEXT: %[[#TEMP_VALUE:]] = cir.call @_Z8make_intv() : () -> !s32i
3939
// CHECK-NEXT: cir.store %[[#TEMP_VALUE]], %[[#TEMP_SLOT]] : !s32i, !cir.ptr<!s32i>

clang/test/CIR/Transforms/const-load-elimination.cpp

+32
Original file line numberDiff line numberDiff line change
@@ -63,3 +63,35 @@ int load_volatile_local_const_int() {
6363
// MEM2REG-NEXT: cir.call @_Z8blackboxRVKi(%[[#x_slot]]) : (!cir.ptr<!s32i>) -> ()
6464
// MEM2REG-NEXT: %{{.+}} = cir.load volatile %[[#x_slot]] : !cir.ptr<!s32i>, !s32i
6565
// MEM2REG: }
66+
67+
void load_local_reference() {
68+
int x = produce_int();
69+
int &r = x;
70+
blackbox(r);
71+
r = produce_int();
72+
blackbox(r);
73+
}
74+
75+
// CHECK-LABEL: @_Z20load_local_referencev
76+
// CHECK-NEXT: %[[#x_slot:]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["x", init] {alignment = 4 : i64}
77+
// CHECK-NEXT: %[[#r_slot:]] = cir.alloca !cir.ptr<!s32i>, !cir.ptr<!cir.ptr<!s32i>>, ["r", init, const] {alignment = 8 : i64}
78+
// CHECK-NEXT: %[[#x_1:]] = cir.call @_Z11produce_intv() : () -> !s32i
79+
// CHECK-NEXT: cir.store %[[#x_1]], %[[#x_slot]] : !s32i, !cir.ptr<!s32i>
80+
// CHECK-NEXT: cir.store %[[#x_slot]], %[[#r_slot]] : !cir.ptr<!s32i>, !cir.ptr<!cir.ptr<!s32i>>
81+
// CHECK-NEXT: cir.call @_Z8blackboxRKi(%[[#x_slot]]) : (!cir.ptr<!s32i>) -> ()
82+
// CHECK-NEXT: %[[#x_2:]] = cir.call @_Z11produce_intv() : () -> !s32i
83+
// CHECK-NEXT: cir.store %[[#x_2]], %[[#x_slot]] : !s32i, !cir.ptr<!s32i>
84+
// CHECK-NEXT: cir.call @_Z8blackboxRKi(%[[#x_slot]]) : (!cir.ptr<!s32i>) -> ()
85+
// CHECK-NEXT: cir.return
86+
// CHECK-NEXT: }
87+
88+
// CHECK-LABEL: @_Z20load_local_referencev
89+
// CHECK-NEXT: %[[#x_slot:]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["x", init] {alignment = 4 : i64}
90+
// CHECK-NEXT: %[[#x_1:]] = cir.call @_Z11produce_intv() : () -> !s32i
91+
// CHECK-NEXT: cir.store %[[#x_1]], %[[#x_slot]] : !s32i, !cir.ptr<!s32i>
92+
// CHECK-NEXT: cir.call @_Z8blackboxRKi(%[[#x_slot]]) : (!cir.ptr<!s32i>) -> ()
93+
// CHECK-NEXT: %[[#x_2:]] = cir.call @_Z11produce_intv() : () -> !s32i
94+
// CHECK-NEXT: cir.store %[[#x_2]], %[[#x_slot]] : !s32i, !cir.ptr<!s32i>
95+
// CHECK-NEXT: cir.call @_Z8blackboxRKi(%[[#x_slot]]) : (!cir.ptr<!s32i>) -> ()
96+
// CHECK-NEXT: cir.return
97+
// CHECK-NEXT: }

0 commit comments

Comments
 (0)