We added a new post-isel CTRLoop pass in D122125. That pass will expand the hardware loop related intrinsic to CTR loop or normal loop based on the loop context. So we don't need to conservatively check the CTR clobber now on the IR level. Reviewed By: lkail Differential Revision: https://reviews.llvm.org/D135847
60 lines
1.8 KiB
LLVM
60 lines
1.8 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
|
; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-unknown < %s | \
|
|
; RUN: FileCheck %s --implicit-check-not=mtctr --implicit-check-not=bdnz
|
|
$test = comdat any
|
|
|
|
; No CTR loop due to frem (since it is always a call).
|
|
define void @test() nounwind comdat {
|
|
; CHECK-LABEL: test:
|
|
; CHECK: # %bb.0:
|
|
; CHECK-NEXT: mflr 0
|
|
; CHECK-NEXT: std 29, -24(1) # 8-byte Folded Spill
|
|
; CHECK-NEXT: std 30, -16(1) # 8-byte Folded Spill
|
|
; CHECK-NEXT: stdu 1, -64(1)
|
|
; CHECK-NEXT: std 0, 80(1)
|
|
; CHECK-NEXT: ld 3, 0(3)
|
|
; CHECK-NEXT: ld 30, 32(1)
|
|
; CHECK-NEXT: sub 4, 3, 30
|
|
; CHECK-NEXT: cmpld 4, 3
|
|
; CHECK-NEXT: iselgt 3, 0, 4
|
|
; CHECK-NEXT: addi 29, 3, 1
|
|
; CHECK-NEXT: .p2align 4
|
|
; CHECK-NEXT: .LBB0_1: # %forcond
|
|
; CHECK-NEXT: #
|
|
; CHECK-NEXT: addi 29, 29, -1
|
|
; CHECK-NEXT: cmpldi 29, 0
|
|
; CHECK-NEXT: bc 4, 1, .LBB0_3
|
|
; CHECK-NEXT: # %bb.2: # %bounds.ok
|
|
; CHECK-NEXT: #
|
|
; CHECK-NEXT: lfs 2, 0(3)
|
|
; CHECK-NEXT: xxlxor 1, 1, 1
|
|
; CHECK-NEXT: bl fmodf
|
|
; CHECK-NEXT: nop
|
|
; CHECK-NEXT: addi 30, 30, 1
|
|
; CHECK-NEXT: stfs 1, 0(3)
|
|
; CHECK-NEXT: b .LBB0_1
|
|
; CHECK-NEXT: .LBB0_3: # %bounds.fail
|
|
; CHECK-NEXT: std 30, 32(1)
|
|
%pos = alloca i64, align 8
|
|
br label %forcond
|
|
|
|
forcond: ; preds = %bounds.ok, %0
|
|
%1 = load i64, ptr %pos
|
|
%.len1 = load i64, ptr undef
|
|
%bounds.cmp = icmp ult i64 %1, %.len1
|
|
br i1 %bounds.cmp, label %bounds.ok, label %bounds.fail
|
|
|
|
bounds.ok: ; preds = %forcond
|
|
%2 = load float, ptr undef
|
|
%3 = frem float 0.000000e+00, %2
|
|
store float %3, ptr undef
|
|
%4 = load i64, ptr %pos
|
|
%5 = add i64 %4, 1
|
|
store i64 %5, ptr %pos
|
|
br label %forcond
|
|
|
|
bounds.fail: ; preds = %forcond
|
|
unreachable
|
|
}
|
|
|