Skip to content

Commit 3a37bb5

Browse files
authored
Merge pull request #18961 from shajrawi/c_begin_access
2 parents 1cf7135 + 55652f1 commit 3a37bb5

File tree

3 files changed

+66
-1
lines changed

3 files changed

+66
-1
lines changed
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
struct BitfieldOne {
2+
unsigned a;
3+
unsigned : 0;
4+
struct Nested {
5+
float x;
6+
unsigned y : 15;
7+
unsigned z : 8;
8+
} b;
9+
int c : 5;
10+
int d : 7;
11+
int e : 13;
12+
int f : 15;
13+
int g : 8;
14+
int h : 2;
15+
float i;
16+
int j : 3;
17+
int k : 4;
18+
unsigned long long l;
19+
unsigned m;
20+
};
21+
22+
struct BitfieldOne createBitfieldOne(void);
23+
void consumeBitfieldOne(struct BitfieldOne one);
24+
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
module c_layout { header "c_layout.h" }

test/SILOptimizer/access_enforcement_opts.sil

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1-
// RUN: %target-sil-opt -access-enforcement-opts -assume-parsing-unqualified-ownership-sil %s | %FileCheck %s
1+
// RUN: %target-sil-opt -access-enforcement-opts -I %S/Inputs/abi -assume-parsing-unqualified-ownership-sil %s | %FileCheck %s
22

33
sil_stage canonical
44

55
import Builtin
66
import Swift
77
import SwiftShims
8+
import c_layout
9+
810

911
struct X {
1012
@sil_stored var i: Int64 { get set }
@@ -1266,6 +1268,44 @@ bb5:
12661268
return %16 : $()
12671269
}
12681270

1271+
class RefElemClass {
1272+
var x : BitfieldOne
1273+
var y : Int32
1274+
init()
1275+
}
1276+
1277+
// CHECK-LABEL: sil @ref_elem_c : $@convention(thin) (RefElemClass) -> () {
1278+
// CHECK: [[GLOBAL:%.*]] = global_addr @globalX : $*X
1279+
// CHECK-NEXT: [[BEGIN:%.*]] = begin_access [read] [dynamic] [no_nested_conflict] [[GLOBAL]] : $*X
1280+
// CHECK-NEXT: load [[BEGIN]] : $*X
1281+
// CHECK-NEXT: end_access [[BEGIN]] : $*X
1282+
// CHECK-NEXT: [[REFX:%.*]] = ref_element_addr %0 : $RefElemClass, #RefElemClass.x
1283+
// CHECK-NEXT: [[REFY:%.*]] = ref_element_addr %0 : $RefElemClass, #RefElemClass.y
1284+
// CHECK-NEXT: [[BEGINX:%.*]] = begin_access [modify] [dynamic] [[REFX]] : $*BitfieldOne
1285+
// CHECK: [[BEGINY:%.*]] = begin_access [modify] [dynamic] [no_nested_conflict] [[REFY]] : $*Int32
1286+
// CHECK-NEXT: end_access [[BEGINX]] : $*BitfieldOne
1287+
// CHECK-NEXT: end_access [[BEGINY]] : $*Int32
1288+
// CHECK-LABEL: } // end sil function 'ref_elem_c'
1289+
1290+
sil @ref_elem_c : $@convention(thin) (RefElemClass) -> () {
1291+
bb0(%0 : $RefElemClass):
1292+
%b0 = global_addr @globalX: $*X
1293+
%1 = begin_access [read] [dynamic] %b0 : $*X
1294+
%2 = load %1 : $*X
1295+
end_access %1 : $*X
1296+
%x = ref_element_addr %0 : $RefElemClass, #RefElemClass.x
1297+
%y = ref_element_addr %0 : $RefElemClass, #RefElemClass.y
1298+
%b1 = begin_access [modify] [dynamic] %x : $*BitfieldOne
1299+
%u0 = function_ref @globalAddressor : $@convention(thin) () -> Builtin.RawPointer
1300+
%u1 = apply %u0() : $@convention(thin) () -> Builtin.RawPointer
1301+
end_access %b1 : $*BitfieldOne
1302+
%b2 = begin_access [modify] [dynamic] %y : $*Int32
1303+
%b3 = begin_access [modify] [dynamic] %x : $*BitfieldOne
1304+
end_access %b3 : $*BitfieldOne
1305+
end_access %b2 : $*Int32
1306+
%10 = tuple ()
1307+
return %10 : $()
1308+
}
12691309

12701310
// public func testStronglyConnectedComponent() {
12711311
// During the merge optimization,

0 commit comments

Comments
 (0)