40 lines · plain
1; RUN: opt < %s -passes=lower-atomic -S | FileCheck %s2 3define i8 @cmpswap() {4; CHECK-LABEL: @cmpswap(5 %i = alloca i86 %pair = cmpxchg ptr %i, i8 0, i8 42 monotonic monotonic7 %j = extractvalue { i8, i1 } %pair, 08; CHECK: [[OLDVAL:%[a-z0-9]+]] = load i8, ptr [[ADDR:%[a-z0-9]+]]9; CHECK-NEXT: [[SAME:%[a-z0-9]+]] = icmp eq i8 [[OLDVAL]], 010; CHECK-NEXT: [[TO_STORE:%[a-z0-9]+]] = select i1 [[SAME]], i8 42, i8 [[OLDVAL]]11; CHECK-NEXT: store i8 [[TO_STORE]], ptr [[ADDR]]12; CHECK-NEXT: [[TMP:%[a-z0-9]+]] = insertvalue { i8, i1 } poison, i8 [[OLDVAL]], 013; CHECK-NEXT: [[RES:%[a-z0-9]+]] = insertvalue { i8, i1 } [[TMP]], i1 [[SAME]], 114; CHECK-NEXT: [[VAL:%[a-z0-9]+]] = extractvalue { i8, i1 } [[RES]], 015 ret i8 %j16; CHECK: ret i8 [[VAL]]17}18 19 20define i8 @swap() {21; CHECK-LABEL: @swap(22 %i = alloca i823 %j = atomicrmw xchg ptr %i, i8 42 monotonic24; CHECK: [[INST:%[a-z0-9]+]] = load25; CHECK-NEXT: store26 ret i8 %j27; CHECK: ret i8 [[INST]]28}29 30 31define i8 @swap_optnone() noinline optnone {32; CHECK-LABEL: @swap_optnone(33 %i = alloca i834 %j = atomicrmw xchg ptr %i, i8 42 monotonic35; CHECK: [[INST:%[a-z0-9]+]] = load36; CHECK-NEXT: store37 ret i8 %j38; CHECK: ret i8 [[INST]]39}40