Skip to content

Commit d1b9c55

Browse files
vishruth-thimmaiahlanza
authored andcommitted
[CIR] Adds support for __sync_lock_release (#1983)
Adds support for the __sync_lock_release builtin. Signed-off-by: vishruth-thimmaiah <vishruththimmaiah@gmail.com>
1 parent 1f3ef67 commit d1b9c55

File tree

2 files changed

+109
-2
lines changed

2 files changed

+109
-2
lines changed

clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2132,8 +2132,19 @@ RValue CIRGenFunction::emitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
21322132
case Builtin::BI__sync_lock_release_2:
21332133
case Builtin::BI__sync_lock_release_4:
21342134
case Builtin::BI__sync_lock_release_8:
2135-
case Builtin::BI__sync_lock_release_16:
2136-
llvm_unreachable("BI__sync_lock_release_1 like NYI");
2135+
case Builtin::BI__sync_lock_release_16: {
2136+
Address ptr = checkAtomicAlignment(*this, E);
2137+
QualType elTy = E->getArg(0)->getType()->getPointeeType();
2138+
2139+
auto iTy =
2140+
cir::IntType::get(&getMLIRContext(), getContext().getTypeSize(elTy),
2141+
elTy->isSignedIntegerType());
2142+
auto store = builder.createStore(
2143+
getLoc(E->getSourceRange()),
2144+
builder.getNullValue(iTy, getLoc(E->getBeginLoc())), ptr);
2145+
store.setAtomic(cir::MemOrder::Release);
2146+
return RValue::get(nullptr);
2147+
}
21372148

21382149
case Builtin::BI__sync_synchronize:
21392150
llvm_unreachable("BI__sync_synchronize NYI");

clang/test/CIR/CodeGen/atomic.cpp

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1366,3 +1366,99 @@ void swap(unsigned short* a, short b) {
13661366
void swap(unsigned char* a, char b) {
13671367
unsigned char c = __sync_swap(a, b);
13681368
}
1369+
1370+
// CHECK-LABEL: @_Z12lock_releasePi
1371+
// CHECK: cir.store align(4) atomic(release) {{.*}}, {{.*}} : !s32i, !cir.ptr<!s32i>
1372+
1373+
// LLVM-LABEL: @_Z12lock_releasePi
1374+
// LLVM: store atomic i32 0, ptr {{.*}} release, align 4
1375+
1376+
// OGCG-LABEL: @_Z12lock_releasePi
1377+
// OGCG: store atomic i32 0, ptr {{.*}} release, align 4
1378+
void lock_release(int* a) {
1379+
__sync_lock_release(a);
1380+
}
1381+
1382+
// CHECK-LABEL: @_Z12lock_releasePl
1383+
// CHECK: cir.store align(8) atomic(release) {{.*}}, {{.*}} : !s64i, !cir.ptr<!s64i>
1384+
1385+
// LLVM-LABEL: @_Z12lock_releasePl
1386+
// LLVM: store atomic i64 0, ptr {{.*}} release, align 8
1387+
1388+
// OGCG-LABEL: @_Z12lock_releasePl
1389+
// OGCG: store atomic i64 0, ptr {{.*}} release, align 8
1390+
void lock_release(long* a) {
1391+
__sync_lock_release(a);
1392+
}
1393+
1394+
// CHECK-LABEL: @_Z12lock_releasePs
1395+
// CHECK: cir.store align(2) atomic(release) {{.*}}, {{.*}} : !s16i, !cir.ptr<!s16i>
1396+
1397+
// LLVM-LABEL: @_Z12lock_releasePs
1398+
// LLVM: store atomic i16 0, ptr {{.*}} release, align 2
1399+
1400+
// OGCG-LABEL: @_Z12lock_releasePs
1401+
// OGCG: store atomic i16 0, ptr {{.*}} release, align 2
1402+
void lock_release(short* a) {
1403+
__sync_lock_release(a);
1404+
}
1405+
1406+
// CHECK-LABEL: @_Z12lock_releasePc
1407+
// CHECK: cir.store align(1) atomic(release) {{.*}}, {{.*}} : !s8i, !cir.ptr<!s8i>
1408+
1409+
// LLVM-LABEL: @_Z12lock_releasePc
1410+
// LLVM: store atomic i8 0, ptr {{.*}} release, align 1
1411+
1412+
// OGCG-LABEL: @_Z12lock_releasePc
1413+
// OGCG: store atomic i8 0, ptr {{.*}} release, align 1
1414+
void lock_release(char* a) {
1415+
__sync_lock_release(a);
1416+
}
1417+
1418+
// CHECK-LABEL: @_Z12lock_releasePj
1419+
// CHECK: cir.store align(4) atomic(release) {{.*}}, {{.*}} : !u32i, !cir.ptr<!u32i>
1420+
1421+
// LLVM-LABEL: @_Z12lock_releasePj
1422+
// LLVM: store atomic i32 0, ptr {{.*}} release, align 4
1423+
1424+
// OGCG-LABEL: @_Z12lock_releasePj
1425+
// OGCG: store atomic i32 0, ptr {{.*}} release, align 4
1426+
void lock_release(unsigned int* a) {
1427+
__sync_lock_release(a);
1428+
}
1429+
1430+
// CHECK-LABEL: @_Z12lock_releasePm
1431+
// CHECK: cir.store align(8) atomic(release) {{.*}}, {{.*}} : !u64i, !cir.ptr<!u64i>
1432+
1433+
// LLVM-LABEL: @_Z12lock_releasePm
1434+
// LLVM: store atomic i64 0, ptr {{.*}} release, align 8
1435+
1436+
// OGCG-LABEL: @_Z12lock_releasePm
1437+
// OGCG: store atomic i64 0, ptr {{.*}} release, align 8
1438+
void lock_release(unsigned long* a) {
1439+
__sync_lock_release(a);
1440+
}
1441+
1442+
// CHECK-LABEL: @_Z12lock_releasePt
1443+
// CHECK: cir.store align(2) atomic(release) {{.*}}, {{.*}} : !u16i, !cir.ptr<!u16i>
1444+
1445+
// LLVM-LABEL: @_Z12lock_releasePt
1446+
// LLVM: store atomic i16 0, ptr {{.*}} release, align 2
1447+
1448+
// OGCG-LABEL: @_Z12lock_releasePt
1449+
// OGCG: store atomic i16 0, ptr {{.*}} release, align 2
1450+
void lock_release(unsigned short* a) {
1451+
__sync_lock_release(a);
1452+
}
1453+
1454+
// CHECK-LABEL: @_Z12lock_releasePh
1455+
// CHECK: cir.store align(1) atomic(release) {{.*}}, {{.*}} : !u8i, !cir.ptr<!u8i>
1456+
1457+
// LLVM-LABEL: @_Z12lock_releasePh
1458+
// LLVM: store atomic i8 0, ptr {{.*}} release, align 1
1459+
1460+
// OGCG-LABEL: @_Z12lock_releasePh
1461+
// OGCG: store atomic i8 0, ptr {{.*}} release, align 1
1462+
void lock_release(unsigned char* a) {
1463+
__sync_lock_release(a);
1464+
}

0 commit comments

Comments
 (0)