xref: /aosp_15_r20/external/clang/test/CodeGen/pr27892.c (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -triple x86_64-linux-gnu -fms-extensions %s -emit-llvm -o - | FileCheck %s
2*67e74705SXin Li 
test1(long * p)3*67e74705SXin Li long test1(long *p) {
4*67e74705SXin Li   return _InterlockedIncrement(p);
5*67e74705SXin Li }
6*67e74705SXin Li // CHECK-DAG: define i64 @test1(
7*67e74705SXin Li // CHECK:   %[[p_addr:.*]] = alloca i64*, align 8
8*67e74705SXin Li // CHECK:   store i64* %p, i64** %[[p_addr]], align 8
9*67e74705SXin Li // CHECK:   %[[p_load:.*]] = load i64*, i64** %[[p_addr]], align 8
10*67e74705SXin Li // CHECK:   %[[atomic_add:.*]] = atomicrmw volatile add i64* %[[p_load]], i64 1 seq_cst
11*67e74705SXin Li // CHECK:   %[[res:.*]] = add i64 %[[atomic_add]], 1
12*67e74705SXin Li // CHECK:   ret i64 %[[res]]
13*67e74705SXin Li 
test2(long * p)14*67e74705SXin Li long test2(long *p) {
15*67e74705SXin Li   return _InterlockedDecrement(p);
16*67e74705SXin Li }
17*67e74705SXin Li // CHECK-DAG: define i64 @test2(
18*67e74705SXin Li // CHECK:   %[[p_addr:.*]] = alloca i64*, align 8
19*67e74705SXin Li // CHECK:   store i64* %p, i64** %[[p_addr]], align 8
20*67e74705SXin Li // CHECK:   %[[p_load:.*]] = load i64*, i64** %[[p_addr]], align 8
21*67e74705SXin Li // CHECK:   %[[atomic_sub:.*]] = atomicrmw volatile sub i64* %[[p_load]], i64 1 seq_cst
22*67e74705SXin Li // CHECK:   %[[res:.*]] = sub i64 %[[atomic_sub]], 1
23*67e74705SXin Li // CHECK:   ret i64 %[[res]]
24