116 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -S -mtriple=powerpc64-unknown-unknown -passes=atomic-expand %s | FileCheck %s3 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 48; CHECK-NEXT: br label [[ATOMICRMW_START:%.*]]9; CHECK: atomicrmw.start:10; CHECK-NEXT: %loaded = phi float [ [[TMP1]], [[TMP0:%.*]] ], [ [[TMP5:%.*]], %cmpxchg.end ]11; CHECK-NEXT: %new = fadd float %loaded, %value12; CHECK-NEXT: [[TMP2:%.*]] = bitcast float %new to i3213; CHECK-NEXT: [[TMP3:%.*]] = bitcast float %loaded to i3214; CHECK-NEXT: br label %cmpxchg.start15; CHECK-EMPTY:16; CHECK-NEXT: cmpxchg.start: ; preds = %cmpxchg.trystore, %atomicrmw.start17; CHECK-NEXT: %larx = call i32 @llvm.ppc.lwarx(ptr %ptr)18; CHECK-NEXT: %should_store = icmp eq i32 %larx, [[TMP3]]19; CHECK-NEXT: br i1 %should_store, label %cmpxchg.fencedstore, label %cmpxchg.nostore20; CHECK-EMPTY:21; CHECK-NEXT: cmpxchg.fencedstore: ; preds = %cmpxchg.start22; CHECK-NEXT: br label %cmpxchg.trystore23; CHECK-EMPTY:24; CHECK-NEXT: cmpxchg.trystore: ; preds = %cmpxchg.fencedstore25; CHECK-NEXT: %loaded.trystore = phi i32 [ %larx, %cmpxchg.fencedstore ]26; CHECK-NEXT: %stcx = call i32 @llvm.ppc.stwcx(ptr %ptr, i32 [[TMP2]])27; CHECK-NEXT: [[TMP4:%.*]] = xor i32 %stcx, 128; CHECK-NEXT: %success1 = icmp eq i32 [[TMP4]], 029; CHECK-NEXT: br i1 %success1, label %cmpxchg.success, label %cmpxchg.start30; CHECK-EMPTY:31; CHECK-NEXT: cmpxchg.releasedload: ; No predecessors!32; CHECK-NEXT: unreachable33; CHECK-EMPTY:34; CHECK-NEXT: cmpxchg.success: ; preds = %cmpxchg.trystore35; CHECK-NEXT: br label %cmpxchg.end36; CHECK-EMPTY:37; CHECK-NEXT: cmpxchg.nostore: ; preds = %cmpxchg.start38; CHECK-NEXT: %loaded.nostore = phi i32 [ %larx, %cmpxchg.start ]39; CHECK-NEXT: br label %cmpxchg.failure40; CHECK-EMPTY:41; CHECK-NEXT: cmpxchg.failure: ; preds = %cmpxchg.nostore42; CHECK-NEXT: %loaded.failure = phi i32 [ %loaded.nostore, %cmpxchg.nostore ]43; CHECK-NEXT: br label %cmpxchg.end44; CHECK-EMPTY:45; CHECK-NEXT: cmpxchg.end: ; preds = %cmpxchg.failure, %cmpxchg.success46; CHECK-NEXT: %loaded.exit = phi i32 [ %loaded.trystore, %cmpxchg.success ], [ %loaded.failure, %cmpxchg.failure ]47; CHECK-NEXT: %success2 = phi i1 [ true, %cmpxchg.success ], [ false, %cmpxchg.failure ]48; CHECK-NEXT: [[TMP5:%.*]] = bitcast i32 %loaded.exit to float49; CHECK-NEXT: br i1 %success2, label %atomicrmw.end, label %atomicrmw.start50; CHECK-EMPTY:51; CHECK-NEXT: atomicrmw.end: ; preds = %cmpxchg.end52; CHECK-NEXT: call void @llvm.ppc.lwsync()53; CHECK-NEXT: ret float [[TMP5]]54; CHECK-NEXT: }55 %res = atomicrmw fadd ptr %ptr, float %value seq_cst56 ret float %res57}58 59define float @test_atomicrmw_fsub_f32(ptr %ptr, float %value) {60; CHECK-LABEL: @test_atomicrmw_fsub_f32(61; CHECK-NEXT: call void @llvm.ppc.sync()62; CHECK-NEXT: [[TMP1:%.*]] = load float, ptr [[PTR:%.*]], align 463; CHECK-NEXT: br label %atomicrmw.start 64; CHECK-EMPTY:65; CHECK-NEXT: atomicrmw.start:66; CHECK-NEXT: %loaded = phi float [ [[TMP1]], %0 ], [ [[TMP5:%.*]], %cmpxchg.end ]67; CHECK-NEXT: %new = fsub float %loaded, %value68; CHECK-NEXT: [[TMP2:%.*]] = bitcast float %new to i3269; CHECK-NEXT: [[TMP3:%.*]] = bitcast float %loaded to i3270; CHECK-NEXT: br label %cmpxchg.start71; CHECK-EMPTY:72; CHECK-NEXT: cmpxchg.start:73; CHECK-NEXT: %larx = call i32 @llvm.ppc.lwarx(ptr %ptr)74; CHECK-NEXT: %should_store = icmp eq i32 %larx, [[TMP3]]75; CHECK-NEXT: br i1 %should_store, label %cmpxchg.fencedstore, label %cmpxchg.nostore76; CHECK-EMPTY:77; CHECK-NEXT: cmpxchg.fencedstore: ; preds = %cmpxchg.start78; CHECK-NEXT: br label %cmpxchg.trystore79; CHECK-EMPTY:80; CHECK-NEXT: cmpxchg.trystore: ; preds = %cmpxchg.fencedstore81; CHECK-NEXT: %loaded.trystore = phi i32 [ %larx, %cmpxchg.fencedstore ]82; CHECK-NEXT: %stcx = call i32 @llvm.ppc.stwcx(ptr %ptr, i32 %2)83; CHECK-NEXT: [[TMP4:%.*]] = xor i32 %stcx, 184; CHECK-NEXT: %success1 = icmp eq i32 [[TMP4]], 085; CHECK-NEXT: br i1 %success1, label %cmpxchg.success, label %cmpxchg.start86; CHECK-EMPTY:87; CHECK-NEXT: cmpxchg.releasedload: ; No predecessors!88; CHECK-NEXT: unreachable89; CHECK-EMPTY:90; CHECK-NEXT: cmpxchg.success: ; preds = %cmpxchg.trystore91; CHECK-NEXT: br label %cmpxchg.end92; CHECK-EMPTY:93; CHECK-NEXT: cmpxchg.nostore: ; preds = %cmpxchg.start94; CHECK-NEXT: %loaded.nostore = phi i32 [ %larx, %cmpxchg.start ]95; CHECK-NEXT: br label %cmpxchg.failure96; CHECK-EMPTY:97; CHECK-NEXT: cmpxchg.failure: ; preds = %cmpxchg.nostore98; CHECK-NEXT: %loaded.failure = phi i32 [ %loaded.nostore, %cmpxchg.nostore ]99; CHECK-NEXT: br label %cmpxchg.end100; CHECK-EMPTY:101; CHECK-NEXT: cmpxchg.end: ; preds = %cmpxchg.failure, %cmpxchg.success102; CHECK-NEXT: %loaded.exit = phi i32 [ %loaded.trystore, %cmpxchg.success ], [ %loaded.failure, %cmpxchg.failure ]103; CHECK-NEXT: %success2 = phi i1 [ true, %cmpxchg.success ], [ false, %cmpxchg.failure ]104; CHECK-NEXT: [[TMP5]] = bitcast i32 %loaded.exit to float105; CHECK-NEXT: br i1 %success2, label %atomicrmw.end, label %atomicrmw.start106; CHECK-EMPTY:107; CHECK-NEXT: atomicrmw.end: ; preds = %cmpxchg.end108; CHECK-NEXT: call void @llvm.ppc.lwsync()109; CHECK-NEXT: ret float [[TMP5]]110; CHECK-NEXT: }111 112%res = atomicrmw fsub ptr %ptr, float %value seq_cst113 ret float %res114}115 116