| ; 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 | |
| } | |