1; RUN: opt < %s -passes=lower-atomic -S | FileCheck %s 2 3define i8 @add() { 4; CHECK-LABEL: @add( 5 %i = alloca i8 6 %j = atomicrmw add ptr %i, i8 42 monotonic 7; CHECK: [[INST:%[a-z0-9]+]] = load 8; CHECK-NEXT: add 9; CHECK-NEXT: store 10 ret i8 %j 11; CHECK: ret i8 [[INST]] 12} 13 14define i8 @nand() { 15; CHECK-LABEL: @nand( 16 %i = alloca i8 17 %j = atomicrmw nand ptr %i, i8 42 monotonic 18; CHECK: [[INST:%[a-z0-9]+]] = load 19; CHECK-NEXT: and 20; CHECK-NEXT: xor 21; CHECK-NEXT: store 22 ret i8 %j 23; CHECK: ret i8 [[INST]] 24} 25 26define i8 @min() { 27; CHECK-LABEL: @min( 28 %i = alloca i8 29 %j = atomicrmw min ptr %i, i8 42 monotonic 30; CHECK: [[INST:%[a-z0-9]+]] = load 31; CHECK-NEXT: icmp 32; CHECK-NEXT: select 33; CHECK-NEXT: store 34 ret i8 %j 35; CHECK: ret i8 [[INST]] 36} 37 38define float @fadd() { 39; CHECK-LABEL: @fadd( 40 %i = alloca float 41 %j = atomicrmw fadd ptr %i, float 42.0 monotonic 42; CHECK: [[INST:%[a-z0-9]+]] = load 43; CHECK-NEXT: fadd 44; CHECK-NEXT: store 45 ret float %j 46; CHECK: ret float [[INST]] 47} 48 49define float @fsub() { 50; CHECK-LABEL: @fsub( 51 %i = alloca float 52 %j = atomicrmw fsub ptr %i, float 42.0 monotonic 53; CHECK: [[INST:%[a-z0-9]+]] = load 54; CHECK-NEXT: fsub 55; CHECK-NEXT: store 56 ret float %j 57; CHECK: ret float [[INST]] 58} 59 60define float @fmax() { 61; CHECK-LABEL: @fmax( 62 %i = alloca float 63 %j = atomicrmw fmax ptr %i, float 42.0 monotonic 64; CHECK: [[INST:%[a-z0-9]+]] = load 65; CHECK-NEXT: call float @llvm.maxnum.f32 66; CHECK-NEXT: store 67 ret float %j 68; CHECK: ret float [[INST]] 69} 70 71define float @fmin() { 72; CHECK-LABEL: @fmin( 73 %i = alloca float 74 %j = atomicrmw fmin ptr %i, float 42.0 monotonic 75; CHECK: [[INST:%[a-z0-9]+]] = load 76; CHECK-NEXT: call float @llvm.minnum.f32 77; CHECK-NEXT: store 78 ret float %j 79; CHECK: ret float [[INST]] 80} 81