124 lines · plain
1; RUN: opt < %s -passes=lower-atomic -S | FileCheck %s2 3define i8 @add() {4; CHECK-LABEL: @add(5 %i = alloca i86 %j = atomicrmw add ptr %i, i8 42 monotonic7; CHECK: [[INST:%[a-z0-9]+]] = load8; CHECK-NEXT: add9; CHECK-NEXT: store10 ret i8 %j11; CHECK: ret i8 [[INST]]12}13 14define i8 @nand() {15; CHECK-LABEL: @nand(16 %i = alloca i817 %j = atomicrmw nand ptr %i, i8 42 monotonic18; CHECK: [[INST:%[a-z0-9]+]] = load19; CHECK-NEXT: and20; CHECK-NEXT: xor21; CHECK-NEXT: store22 ret i8 %j23; CHECK: ret i8 [[INST]]24}25 26define i8 @min() {27; CHECK-LABEL: @min(28 %i = alloca i829 %j = atomicrmw min ptr %i, i8 42 monotonic30; CHECK: [[INST:%[a-z0-9]+]] = load31; CHECK-NEXT: icmp32; CHECK-NEXT: select33; CHECK-NEXT: store34 ret i8 %j35; CHECK: ret i8 [[INST]]36}37 38define float @fadd() {39; CHECK-LABEL: @fadd(40 %i = alloca float41 %j = atomicrmw fadd ptr %i, float 42.0 monotonic42; CHECK: [[INST:%[a-z0-9]+]] = load43; CHECK-NEXT: fadd44; CHECK-NEXT: store45 ret float %j46; CHECK: ret float [[INST]]47}48 49define float @fsub() {50; CHECK-LABEL: @fsub(51 %i = alloca float52 %j = atomicrmw fsub ptr %i, float 42.0 monotonic53; CHECK: [[INST:%[a-z0-9]+]] = load54; CHECK-NEXT: fsub55; CHECK-NEXT: store56 ret float %j57; CHECK: ret float [[INST]]58}59 60define float @fmax() {61; CHECK-LABEL: @fmax(62 %i = alloca float63 %j = atomicrmw fmax ptr %i, float 42.0 monotonic64; CHECK: [[INST:%[a-z0-9]+]] = load65; CHECK-NEXT: call float @llvm.maxnum.f3266; CHECK-NEXT: store67 ret float %j68; CHECK: ret float [[INST]]69}70 71define float @fmin() {72; CHECK-LABEL: @fmin(73 %i = alloca float74 %j = atomicrmw fmin ptr %i, float 42.0 monotonic75; CHECK: [[INST:%[a-z0-9]+]] = load76; CHECK-NEXT: call float @llvm.minnum.f3277; CHECK-NEXT: store78 ret float %j79; CHECK: ret float [[INST]]80}81 82define float @fmaximum() {83; CHECK-LABEL: @fmaximum(84 %i = alloca float85 %j = atomicrmw fmaximum ptr %i, float 42.0 monotonic86; CHECK: [[INST:%[a-z0-9]+]] = load87; CHECK-NEXT: call float @llvm.maximum.f3288; CHECK-NEXT: store89 ret float %j90; CHECK: ret float [[INST]]91}92 93define float @fminimum() {94; CHECK-LABEL: @fminimum(95 %i = alloca float96 %j = atomicrmw fminimum ptr %i, float 42.0 monotonic97; CHECK: [[INST:%[a-z0-9]+]] = load98; CHECK-NEXT: call float @llvm.minimum.f3299; CHECK-NEXT: store100 ret float %j101; CHECK: ret float [[INST]]102}103 104define <2 x half> @fmaximum_2xhalf(<2 x half> %val) {105; CHECK-LABEL: @fmaximum_2xhalf(106 %i = alloca <2 x half>, align 4107 %j = atomicrmw fmaximum ptr %i, <2 x half> %val monotonic108; CHECK: [[INST:%[a-z0-9]+]] = load109; CHECK-NEXT: call <2 x half> @llvm.maximum.v2f16110; CHECK-NEXT: store111 ret <2 x half> %j112}113 114define <2 x half> @fminimum_2xhalf(<2 x half> %val) {115; CHECK-LABEL: @fminimum_2xhalf(116 %i = alloca <2 x half>, align 4117 %j = atomicrmw fminimum ptr %i, <2 x half> %val monotonic118; CHECK: [[INST:%[a-z0-9]+]] = load119; CHECK-NEXT: call <2 x half> @llvm.minimum.v2f16120; CHECK-NEXT: store121 ret <2 x half> %j122}123 124