171 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple powerpc64le-unknown-linux | FileCheck %s3; RUN: llc < %s -mtriple powerpc64le-unknown-linux -debug-only=machine-scheduler \4; RUN: 2>&1 | FileCheck %s --check-prefix=LOG5; REQUIRES: asserts6 7define double @in_nostrict(double %a, double %b, double %c, double %d) {8; CHECK-LABEL: in_nostrict:9; CHECK: # %bb.0: # %entry10; CHECK-NEXT: mffs 011; CHECK-NEXT: xsdivdp 1, 1, 212; CHECK-NEXT: xsadddp 1, 1, 313; CHECK-NEXT: xsadddp 0, 1, 014; CHECK-NEXT: mtfsf 255, 415; CHECK-NEXT: xsdivdp 1, 3, 416; CHECK-NEXT: xsadddp 1, 1, 217; CHECK-NEXT: xsadddp 1, 0, 118; CHECK-NEXT: blr19;20; LOG: *** MI Scheduling ***21; LOG-NEXT: in_nostrict:%bb.0 entry22; LOG: ExitSU: MTFSF 255, %{{[0-9]+}}:f8rc, 0, 023; LOG: *** MI Scheduling ***24; LOG-NEXT: in_nostrict:%bb.0 entry25; LOG: ExitSU: %{{[0-9]+}}:f8rc = MFFS implicit $rm26;27; LOG: *** MI Scheduling ***28; LOG-NEXT: in_nostrict:%bb.0 entry29; LOG: ExitSU: MTFSF 255, renamable $f{{[0-9]+}}, 0, 030entry:31 %0 = tail call double @llvm.ppc.readflm()32 %1 = fdiv double %a, %b33 %2 = fadd double %1, %c34 %3 = fadd double %2, %035 call double @llvm.ppc.setflm(double %d)36 %5 = fdiv double %c, %d37 %6 = fadd double %5, %b38 %7 = fadd double %3, %639 ret double %740}41 42define double @in_strict(double %a, double %b, double %c, double %d) #0 {43; CHECK-LABEL: in_strict:44; CHECK: # %bb.0: # %entry45; CHECK-NEXT: mffs 046; CHECK-NEXT: xsdivdp 1, 1, 247; CHECK-NEXT: xsadddp 1, 1, 348; CHECK-NEXT: xsadddp 0, 1, 049; CHECK-NEXT: mtfsf 255, 450; CHECK-NEXT: xsdivdp 1, 3, 451; CHECK-NEXT: xsadddp 1, 1, 252; CHECK-NEXT: xsadddp 1, 0, 153; CHECK-NEXT: blr54;55; LOG: ***** MI Scheduling *****56; LOG-NEXT: in_strict:%bb.0 entry57; LOG: ExitSU: MTFSF 255, %{{[0-9]+}}:f8rc, 0, 058; LOG: ***** MI Scheduling *****59; LOG-NEXT: in_strict:%bb.0 entry60; LOG: ExitSU: %{{[0-9]+}}:f8rc = MFFS implicit $rm61;62; LOG: ***** MI Scheduling *****63; LOG-NEXT: in_strict:%bb.0 entry64; LOG: ExitSU: MTFSF 255, renamable $f{{[0-9]+}}, 0, 065entry:66 %0 = tail call double @llvm.ppc.readflm()67 %1 = call double @llvm.experimental.constrained.fdiv.f64(double %a, double %b, metadata !"round.dynamic", metadata !"fpexcept.strict") #068 %2 = call double @llvm.experimental.constrained.fadd.f64(double %1, double %c, metadata !"round.dynamic", metadata !"fpexcept.strict") #069 %3 = call double @llvm.experimental.constrained.fadd.f64(double %2, double %0, metadata !"round.dynamic", metadata !"fpexcept.strict") #070 call double @llvm.ppc.setflm(double %d)71 %5 = call double @llvm.experimental.constrained.fdiv.f64(double %c, double %d, metadata !"round.dynamic", metadata !"fpexcept.strict") #072 %6 = call double @llvm.experimental.constrained.fadd.f64(double %5, double %b, metadata !"round.dynamic", metadata !"fpexcept.strict") #073 %7 = call double @llvm.experimental.constrained.fadd.f64(double %3, double %6, metadata !"round.dynamic", metadata !"fpexcept.strict") #074 ret double %775}76 77define void @cse_nomerge(ptr %f1, ptr %f2, double %f3) #0 {78; CHECK-LABEL: cse_nomerge:79; CHECK: # %bb.0: # %entry80; CHECK-NEXT: mflr 081; CHECK-NEXT: .cfi_def_cfa_offset 6482; CHECK-NEXT: .cfi_offset lr, 1683; CHECK-NEXT: .cfi_offset r30, -2484; CHECK-NEXT: .cfi_offset f31, -885; CHECK-NEXT: std 30, -24(1) # 8-byte Folded Spill86; CHECK-NEXT: stfd 31, -8(1) # 8-byte Folded Spill87; CHECK-NEXT: stdu 1, -64(1)88; CHECK-NEXT: std 0, 80(1)89; CHECK-NEXT: fmr 31, 190; CHECK-NEXT: mr 30, 491; CHECK-NEXT: mffs 092; CHECK-NEXT: stfd 0, 0(3)93; CHECK-NEXT: bl effect_func94; CHECK-NEXT: nop95; CHECK-NEXT: mffs 096; CHECK-NEXT: stfd 0, 0(30)97; CHECK-NEXT: mtfsf 255, 3198; CHECK-NEXT: addi 1, 1, 6499; CHECK-NEXT: ld 0, 16(1)100; CHECK-NEXT: lfd 31, -8(1) # 8-byte Folded Reload101; CHECK-NEXT: ld 30, -24(1) # 8-byte Folded Reload102; CHECK-NEXT: mtlr 0103; CHECK-NEXT: blr104entry:105 %0 = call double @llvm.ppc.readflm()106 store double %0, ptr %f1, align 8107 call void @effect_func()108 %1 = call double @llvm.ppc.readflm()109 store double %1, ptr %f2, align 8110 %2 = call contract double @llvm.ppc.setflm(double %f3)111 ret void112}113 114define void @cse_nomerge_readonly(ptr %f1, ptr %f2, double %f3) #0 {115; CHECK-LABEL: cse_nomerge_readonly:116; CHECK: # %bb.0: # %entry117; CHECK-NEXT: mflr 0118; CHECK-NEXT: .cfi_def_cfa_offset 64119; CHECK-NEXT: .cfi_offset lr, 16120; CHECK-NEXT: .cfi_offset r30, -24121; CHECK-NEXT: .cfi_offset f31, -8122; CHECK-NEXT: std 30, -24(1) # 8-byte Folded Spill123; CHECK-NEXT: stfd 31, -8(1) # 8-byte Folded Spill124; CHECK-NEXT: stdu 1, -64(1)125; CHECK-NEXT: std 0, 80(1)126; CHECK-NEXT: fmr 31, 1127; CHECK-NEXT: mr 30, 4128; CHECK-NEXT: mffs 0129; CHECK-NEXT: stfd 0, 0(3)130; CHECK-NEXT: bl readonly_func131; CHECK-NEXT: nop132; CHECK-NEXT: mffs 0133; CHECK-NEXT: stfd 0, 0(30)134; CHECK-NEXT: mtfsf 255, 31135; CHECK-NEXT: addi 1, 1, 64136; CHECK-NEXT: ld 0, 16(1)137; CHECK-NEXT: lfd 31, -8(1) # 8-byte Folded Reload138; CHECK-NEXT: ld 30, -24(1) # 8-byte Folded Reload139; CHECK-NEXT: mtlr 0140; CHECK-NEXT: blr141entry:142 %0 = call double @llvm.ppc.readflm()143 store double %0, ptr %f1, align 8144 call void @readonly_func()145 %1 = call double @llvm.ppc.readflm()146 store double %1, ptr %f2, align 8147 %2 = call contract double @llvm.ppc.setflm(double %f3)148 ret void149}150 151define double @mffsl() {152; CHECK-LABEL: mffsl:153; CHECK: # %bb.0: # %entry154; CHECK-NEXT: mffsl 1155; CHECK-NEXT: blr156entry:157 %x = call double @llvm.ppc.mffsl()158 ret double %x159}160 161declare void @effect_func()162declare void @readonly_func() #1163declare double @llvm.ppc.mffsl()164declare double @llvm.ppc.readflm()165declare double @llvm.ppc.setflm(double)166declare double @llvm.experimental.constrained.fadd.f64(double, double, metadata, metadata)167declare double @llvm.experimental.constrained.fdiv.f64(double, double, metadata, metadata)168 169attributes #0 = { strictfp }170attributes #1 = { readonly }171