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
105 lines
4.4 KiB
LLVM
105 lines
4.4 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
|
; RUN: opt -hardware-loops -S -verify-loop-lcssa %s | FileCheck %s
|
|
|
|
target datalayout = "E-m:e-i64:64-n32:64"
|
|
target triple = "ppc64-unknown-linux-elf"
|
|
|
|
declare i1 @cond() readnone
|
|
|
|
; Make sure we do not crash on the test.
|
|
|
|
define void @test() {
|
|
; CHECK-LABEL: @test(
|
|
; CHECK-NEXT: entry:
|
|
; CHECK-NEXT: br label [[WHILE_COND:%.*]]
|
|
; CHECK: while.cond:
|
|
; CHECK-NEXT: br label [[FOR_BODY:%.*]]
|
|
; CHECK: for.body:
|
|
; CHECK-NEXT: br label [[FOR_INC:%.*]]
|
|
; CHECK: for.inc:
|
|
; CHECK-NEXT: [[C_0:%.*]] = call i1 @cond()
|
|
; CHECK-NEXT: br i1 [[C_0]], label [[WHILE_COND25_PREHEADER:%.*]], label [[FOR_BODY]]
|
|
; CHECK: while.cond25.preheader:
|
|
; CHECK-NEXT: call void @llvm.set.loop.iterations.i64(i64 51)
|
|
; CHECK-NEXT: br label [[WHILE_COND25:%.*]]
|
|
; CHECK: while.cond25:
|
|
; CHECK-NEXT: [[INDVAR:%.*]] = phi i64 [ 0, [[WHILE_COND25_PREHEADER]] ], [ [[INDVAR_NEXT:%.*]], [[LAND_RHS:%.*]] ]
|
|
; CHECK-NEXT: [[INDVARS_IV349:%.*]] = phi i64 [ [[INDVARS_IV_NEXT350:%.*]], [[LAND_RHS]] ], [ 50, [[WHILE_COND25_PREHEADER]] ]
|
|
; CHECK-NEXT: [[TMP0:%.*]] = call i1 @llvm.loop.decrement.i64(i64 1)
|
|
; CHECK-NEXT: br i1 [[TMP0]], label [[LAND_RHS]], label [[WHILE_END187:%.*]]
|
|
; CHECK: land.rhs:
|
|
; CHECK-NEXT: [[INDVARS_IV_NEXT350]] = add nsw i64 [[INDVARS_IV349]], -1
|
|
; CHECK-NEXT: [[C_1:%.*]] = call i1 @cond()
|
|
; CHECK-NEXT: [[INDVAR_NEXT]] = add i64 [[INDVAR]], 1
|
|
; CHECK-NEXT: br i1 [[C_1]], label [[WHILE_COND25]], label [[WHILE_END:%.*]]
|
|
; CHECK: while.end:
|
|
; CHECK-NEXT: [[INDVAR_LCSSA1:%.*]] = phi i64 [ [[INDVAR]], [[LAND_RHS]] ]
|
|
; CHECK-NEXT: [[C_2:%.*]] = call i1 @cond()
|
|
; CHECK-NEXT: br i1 [[C_2]], label [[WHILE_END187]], label [[WHILE_COND35_PREHEADER:%.*]]
|
|
; CHECK: while.cond35.preheader:
|
|
; CHECK-NEXT: [[TMP1:%.*]] = mul nsw i64 [[INDVAR_LCSSA1]], -1
|
|
; CHECK-NEXT: [[TMP2:%.*]] = add i64 [[TMP1]], 51
|
|
; CHECK-NEXT: call void @llvm.set.loop.iterations.i64(i64 [[TMP2]])
|
|
; CHECK-NEXT: br label [[WHILE_COND35:%.*]]
|
|
; CHECK: while.cond35:
|
|
; CHECK-NEXT: [[TMP3:%.*]] = call i1 @llvm.loop.decrement.i64(i64 1)
|
|
; CHECK-NEXT: br i1 [[TMP3]], label [[LAND_RHS37:%.*]], label [[IF_END51:%.*]]
|
|
; CHECK: land.rhs37:
|
|
; CHECK-NEXT: br label [[WHILE_COND35]]
|
|
; CHECK: if.end51:
|
|
; CHECK-NEXT: br label [[WHILE_COND_BACKEDGE:%.*]]
|
|
; CHECK: while.cond.backedge:
|
|
; CHECK-NEXT: br label [[WHILE_COND]]
|
|
; CHECK: while.end187:
|
|
; CHECK-NEXT: ret void
|
|
;
|
|
entry:
|
|
br label %while.cond
|
|
|
|
while.cond: ; preds = %while.cond.backedge, %entry
|
|
br label %for.body
|
|
|
|
for.body: ; preds = %for.inc, %while.cond
|
|
br label %for.inc
|
|
|
|
for.inc: ; preds = %for.body
|
|
%c.0 = call i1 @cond()
|
|
br i1 %c.0, label %while.cond25, label %for.body
|
|
|
|
while.cond25: ; preds = %land.rhs, %for.inc
|
|
%indvars.iv349 = phi i64 [ %indvars.iv.next350, %land.rhs ], [ 50, %for.inc ]
|
|
%cmp26.not = icmp eq i64 %indvars.iv349, 0
|
|
br i1 %cmp26.not, label %while.end187, label %land.rhs
|
|
|
|
land.rhs: ; preds = %while.cond25
|
|
%indvars.iv.next350 = add nsw i64 %indvars.iv349, -1
|
|
%c.1 = call i1 @cond()
|
|
br i1 %c.1, label %while.cond25, label %while.end
|
|
|
|
while.end: ; preds = %land.rhs
|
|
%c.2 = call i1 @cond()
|
|
br i1 %c.2, label %while.end187, label %while.cond35.preheader
|
|
|
|
while.cond35.preheader: ; preds = %while.end
|
|
%0 = and i64 %indvars.iv349, 4294967295
|
|
br label %while.cond35
|
|
|
|
while.cond35: ; preds = %land.rhs37, %while.cond35.preheader
|
|
%indvars.iv351 = phi i64 [ %0, %while.cond35.preheader ], [ %indvars.iv.next352, %land.rhs37 ]
|
|
%cmp36 = icmp sgt i64 %indvars.iv351, 0
|
|
br i1 %cmp36, label %land.rhs37, label %if.end51
|
|
|
|
land.rhs37: ; preds = %while.cond35
|
|
%indvars.iv.next352 = add nsw i64 %indvars.iv351, -1
|
|
br label %while.cond35
|
|
|
|
if.end51: ; preds = %while.cond35
|
|
br label %while.cond.backedge
|
|
|
|
while.cond.backedge: ; preds = %if.end51
|
|
br label %while.cond
|
|
|
|
while.end187: ; preds = %while.end, %while.cond25
|
|
ret void
|
|
}
|