; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6 ; RUN: llc --mtriple=loongarch64 -O3 < %s | FileCheck %s --check-prefix=DEFAULT ; RUN: llc --mtriple=loongarch64 -O3 -loongarch-disable-reloc-sched < %s | FileCheck %s --check-prefix=NOSCHED @g = external global i32 define i32 @boundary_test(i32 %a, i32 %b) { ; DEFAULT-LABEL: boundary_test: ; DEFAULT: # %bb.0: # %entry ; DEFAULT-NEXT: pcalau12i $a2, %got_pc_hi20(g) ; DEFAULT-NEXT: ld.d $a2, $a2, %got_pc_lo12(g) ; DEFAULT-NEXT: mul.d $a3, $a0, $a1 ; DEFAULT-NEXT: ld.w $a2, $a2, 0 ; DEFAULT-NEXT: addi.w $a1, $a1, 0 ; DEFAULT-NEXT: addi.w $a0, $a0, 0 ; DEFAULT-NEXT: div.w $a0, $a0, $a1 ; DEFAULT-NEXT: add.d $a0, $a3, $a0 ; DEFAULT-NEXT: add.w $a0, $a0, $a2 ; DEFAULT-NEXT: ret ; ; NOSCHED-LABEL: boundary_test: ; NOSCHED: # %bb.0: # %entry ; NOSCHED-NEXT: mul.d $a2, $a0, $a1 ; NOSCHED-NEXT: pcalau12i $a3, %got_pc_hi20(g) ; NOSCHED-NEXT: ld.d $a3, $a3, %got_pc_lo12(g) ; NOSCHED-NEXT: ld.w $a3, $a3, 0 ; NOSCHED-NEXT: addi.w $a1, $a1, 0 ; NOSCHED-NEXT: addi.w $a0, $a0, 0 ; NOSCHED-NEXT: div.w $a0, $a0, $a1 ; NOSCHED-NEXT: add.d $a0, $a2, $a0 ; NOSCHED-NEXT: add.w $a0, $a0, $a3 ; NOSCHED-NEXT: ret entry: ; Mul is fast, but without scheduling boundary it might be scheduled after the long latency load address setup %x = mul i32 %a, %b ; Load global (pcalau12i) - this has target flags so it becomes a boundary with -loongarch-disable-reloc-sched %v = load i32, ptr @g ; Div is slow %y = sdiv i32 %a, %b %s1 = add i32 %x, %y %s2 = add i32 %s1, %v ret i32 %s2 }