Skip to content

Commit d9e0f95

Browse files
[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 00a4083 commit d9e0f95

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

0 commit comments

Comments
 (0)