| ; RUN: opt < %s -passes=lower-atomic -S | FileCheck %s |
| |
| define i8 @add() { |
| ; CHECK-LABEL: @add( |
| %i = alloca i8 |
| %j = atomicrmw add ptr %i, i8 42 monotonic |
| ; CHECK: [[INST:%[a-z0-9]+]] = load |
| ; CHECK-NEXT: add |
| ; CHECK-NEXT: store |
| ret i8 %j |
| ; CHECK: ret i8 [[INST]] |
| } |
| |
| define i8 @nand() { |
| ; CHECK-LABEL: @nand( |
| %i = alloca i8 |
| %j = atomicrmw nand ptr %i, i8 42 monotonic |
| ; CHECK: [[INST:%[a-z0-9]+]] = load |
| ; CHECK-NEXT: and |
| ; CHECK-NEXT: xor |
| ; CHECK-NEXT: store |
| ret i8 %j |
| ; CHECK: ret i8 [[INST]] |
| } |
| |
| define i8 @min() { |
| ; CHECK-LABEL: @min( |
| %i = alloca i8 |
| %j = atomicrmw min ptr %i, i8 42 monotonic |
| ; CHECK: [[INST:%[a-z0-9]+]] = load |
| ; CHECK-NEXT: icmp |
| ; CHECK-NEXT: select |
| ; CHECK-NEXT: store |
| ret i8 %j |
| ; CHECK: ret i8 [[INST]] |
| } |
| |
| define float @fadd() { |
| ; CHECK-LABEL: @fadd( |
| %i = alloca float |
| %j = atomicrmw fadd ptr %i, float 42.0 monotonic |
| ; CHECK: [[INST:%[a-z0-9]+]] = load |
| ; CHECK-NEXT: fadd |
| ; CHECK-NEXT: store |
| ret float %j |
| ; CHECK: ret float [[INST]] |
| } |
| |
| define float @fsub() { |
| ; CHECK-LABEL: @fsub( |
| %i = alloca float |
| %j = atomicrmw fsub ptr %i, float 42.0 monotonic |
| ; CHECK: [[INST:%[a-z0-9]+]] = load |
| ; CHECK-NEXT: fsub |
| ; CHECK-NEXT: store |
| ret float %j |
| ; CHECK: ret float [[INST]] |
| } |
| |
| define float @fmax() { |
| ; CHECK-LABEL: @fmax( |
| %i = alloca float |
| %j = atomicrmw fmax ptr %i, float 42.0 monotonic |
| ; CHECK: [[INST:%[a-z0-9]+]] = load |
| ; CHECK-NEXT: call float @llvm.maxnum.f32 |
| ; CHECK-NEXT: store |
| ret float %j |
| ; CHECK: ret float [[INST]] |
| } |
| |
| define float @fmin() { |
| ; CHECK-LABEL: @fmin( |
| %i = alloca float |
| %j = atomicrmw fmin ptr %i, float 42.0 monotonic |
| ; CHECK: [[INST:%[a-z0-9]+]] = load |
| ; CHECK-NEXT: call float @llvm.minnum.f32 |
| ; CHECK-NEXT: store |
| ret float %j |
| ; CHECK: ret float [[INST]] |
| } |
| |
| define float @fmaximum() { |
| ; CHECK-LABEL: @fmaximum( |
| %i = alloca float |
| %j = atomicrmw fmaximum ptr %i, float 42.0 monotonic |
| ; CHECK: [[INST:%[a-z0-9]+]] = load |
| ; CHECK-NEXT: call float @llvm.maximum.f32 |
| ; CHECK-NEXT: store |
| ret float %j |
| ; CHECK: ret float [[INST]] |
| } |
| |
| define float @fminimum() { |
| ; CHECK-LABEL: @fminimum( |
| %i = alloca float |
| %j = atomicrmw fminimum ptr %i, float 42.0 monotonic |
| ; CHECK: [[INST:%[a-z0-9]+]] = load |
| ; CHECK-NEXT: call float @llvm.minimum.f32 |
| ; CHECK-NEXT: store |
| ret float %j |
| ; CHECK: ret float [[INST]] |
| } |
| |
| define <2 x half> @fmaximum_2xhalf(<2 x half> %val) { |
| ; CHECK-LABEL: @fmaximum_2xhalf( |
| %i = alloca <2 x half>, align 4 |
| %j = atomicrmw fmaximum ptr %i, <2 x half> %val monotonic |
| ; CHECK: [[INST:%[a-z0-9]+]] = load |
| ; CHECK-NEXT: call <2 x half> @llvm.maximum.v2f16 |
| ; CHECK-NEXT: store |
| ret <2 x half> %j |
| } |
| |
| define <2 x half> @fminimum_2xhalf(<2 x half> %val) { |
| ; CHECK-LABEL: @fminimum_2xhalf( |
| %i = alloca <2 x half>, align 4 |
| %j = atomicrmw fminimum ptr %i, <2 x half> %val monotonic |
| ; CHECK: [[INST:%[a-z0-9]+]] = load |
| ; CHECK-NEXT: call <2 x half> @llvm.minimum.v2f16 |
| ; CHECK-NEXT: store |
| ret <2 x half> %j |
| } |
| |