@@ -63,3 +63,35 @@ int load_volatile_local_const_int() {
63
63
// MEM2REG-NEXT: cir.call @_Z8blackboxRVKi(%[[#x_slot]]) : (!cir.ptr<!s32i>) -> ()
64
64
// MEM2REG-NEXT: %{{.+}} = cir.load volatile %[[#x_slot]] : !cir.ptr<!s32i>, !s32i
65
65
// 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