blob: 4d187158f81256d9e103297364d9a10831e46c9f [file] [edit]
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
; RUN: opt -S -mtriple=msp430 -passes='require<libcall-lowering-info>,atomic-expand' %s | FileCheck %s
; The ordering argument is a C int, which is 16 bits on msp430.
define i8 @load_i8(ptr %p) {
; CHECK-LABEL: define i8 @load_i8(
; CHECK-SAME: ptr [[P:%.*]]) {
; CHECK-NEXT: [[TMP1:%.*]] = call zeroext i8 @__atomic_load_1(ptr [[P]], i16 5)
; CHECK-NEXT: ret i8 [[TMP1]]
;
%v = load atomic i8, ptr %p seq_cst, align 1
ret i8 %v
}
define void @store_i16(ptr %p, i16 %v) {
; CHECK-LABEL: define void @store_i16(
; CHECK-SAME: ptr [[P:%.*]], i16 [[V:%.*]]) {
; CHECK-NEXT: call void @__atomic_store_2(ptr [[P]], i16 [[V]], i16 3)
; CHECK-NEXT: ret void
;
store atomic i16 %v, ptr %p release, align 2
ret void
}
define i16 @rmw_add_i16(ptr %p, i16 %v) {
; CHECK-LABEL: define i16 @rmw_add_i16(
; CHECK-SAME: ptr [[P:%.*]], i16 [[V:%.*]]) {
; CHECK-NEXT: [[TMP1:%.*]] = call i16 @__atomic_fetch_add_2(ptr [[P]], i16 [[V]], i16 2)
; CHECK-NEXT: ret i16 [[TMP1]]
;
%r = atomicrmw add ptr %p, i16 %v acquire, align 2
ret i16 %r
}
define { i16, i1 } @cmpxchg_i16(ptr %p, i16 %cmp, i16 %new) {
; CHECK-LABEL: define { i16, i1 } @cmpxchg_i16(
; CHECK-SAME: ptr [[P:%.*]], i16 [[CMP:%.*]], i16 [[NEW:%.*]]) {
; CHECK-NEXT: [[TMP1:%.*]] = alloca i16, align 2
; CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr [[TMP1]])
; CHECK-NEXT: store i16 [[CMP]], ptr [[TMP1]], align 2
; CHECK-NEXT: [[TMP2:%.*]] = call zeroext i1 @__atomic_compare_exchange_2(ptr [[P]], ptr [[TMP1]], i16 [[NEW]], i16 4, i16 0)
; CHECK-NEXT: [[TMP3:%.*]] = load i16, ptr [[TMP1]], align 2
; CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr [[TMP1]])
; CHECK-NEXT: [[TMP4:%.*]] = insertvalue { i16, i1 } poison, i16 [[TMP3]], 0
; CHECK-NEXT: [[TMP5:%.*]] = insertvalue { i16, i1 } [[TMP4]], i1 [[TMP2]], 1
; CHECK-NEXT: ret { i16, i1 } [[TMP5]]
;
%r = cmpxchg ptr %p, i16 %cmp, i16 %new acq_rel monotonic, align 2
ret { i16, i1 } %r
}
define i32 @load_i32_unaligned(ptr %p) {
; CHECK-LABEL: define i32 @load_i32_unaligned(
; CHECK-SAME: ptr [[P:%.*]]) {
; CHECK-NEXT: [[TMP1:%.*]] = alloca i32, align 2
; CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr [[TMP1]])
; CHECK-NEXT: call void @__atomic_load(i16 4, ptr [[P]], ptr [[TMP1]], i16 5)
; CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr [[TMP1]], align 2
; CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr [[TMP1]])
; CHECK-NEXT: ret i32 [[TMP2]]
;
%v = load atomic i32, ptr %p seq_cst, align 1
ret i32 %v
}