1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt -S -mtriple=powerpc64-unknown-unknown -passes=atomic-expand %s | FileCheck %s 3 4define float @test_atomicrmw_fadd_f32(ptr %ptr, float %value) { 5; CHECK-LABEL: @test_atomicrmw_fadd_f32( 6; CHECK-NEXT: call void @llvm.ppc.sync() 7; CHECK-NEXT: [[TMP1:%.*]] = load float, ptr [[PTR:%.*]], align 4 8; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]] 9; CHECK: atomicrmw.start: 10; CHECK-NEXT: [[LOADED:%.*]] = phi float [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP5:%.*]], [[ATOMICRMW_START]] ] 11; CHECK-NEXT: [[NEW:%.*]] = fadd float [[LOADED]], [[VALUE:%.*]] 12; CHECK-NEXT: [[TMP2:%.*]] = bitcast float [[NEW]] to i32 13; CHECK-NEXT: [[TMP3:%.*]] = bitcast float [[LOADED]] to i32 14; CHECK-NEXT: [[TMP4:%.*]] = cmpxchg ptr [[PTR]], i32 [[TMP3]], i32 [[TMP2]] monotonic monotonic, align 4 15; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP4]], 1 16; CHECK-NEXT: [[NEWLOADED:%.*]] = extractvalue { i32, i1 } [[TMP4]], 0 17; CHECK-NEXT: [[TMP5]] = bitcast i32 [[NEWLOADED]] to float 18; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]] 19; CHECK: atomicrmw.end: 20; CHECK-NEXT: call void @llvm.ppc.lwsync() 21; CHECK-NEXT: ret float [[TMP5]] 22; 23 %res = atomicrmw fadd ptr %ptr, float %value seq_cst 24 ret float %res 25} 26 27define float @test_atomicrmw_fsub_f32(ptr %ptr, float %value) { 28; CHECK-LABEL: @test_atomicrmw_fsub_f32( 29; CHECK-NEXT: call void @llvm.ppc.sync() 30; CHECK-NEXT: [[TMP1:%.*]] = load float, ptr [[PTR:%.*]], align 4 31; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]] 32; CHECK: atomicrmw.start: 33; CHECK-NEXT: [[LOADED:%.*]] = phi float [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP5:%.*]], [[ATOMICRMW_START]] ] 34; CHECK-NEXT: [[NEW:%.*]] = fsub float [[LOADED]], [[VALUE:%.*]] 35; CHECK-NEXT: [[TMP2:%.*]] = bitcast float [[NEW]] to i32 36; CHECK-NEXT: [[TMP3:%.*]] = bitcast float [[LOADED]] to i32 37; CHECK-NEXT: [[TMP4:%.*]] = cmpxchg ptr [[PTR]], i32 [[TMP3]], i32 [[TMP2]] monotonic monotonic, align 4 38; CHECK-NEXT: [[SUCCESS:%.*]] = extractvalue { i32, i1 } [[TMP4]], 1 39; CHECK-NEXT: [[NEWLOADED:%.*]] = extractvalue { i32, i1 } [[TMP4]], 0 40; CHECK-NEXT: [[TMP5]] = bitcast i32 [[NEWLOADED]] to float 41; CHECK-NEXT: br i1 [[SUCCESS]], label [[ATOMICRMW_END:%.*]], label [[ATOMICRMW_START]] 42; CHECK: atomicrmw.end: 43; CHECK-NEXT: call void @llvm.ppc.lwsync() 44; CHECK-NEXT: ret float [[TMP5]] 45; 46 %res = atomicrmw fsub ptr %ptr, float %value seq_cst 47 ret float %res 48} 49 50