This transformation doesn't actually use any of the internal state of
LSR and recomputes all information from SCEV. Splitting it out makes
it easier to test.
Note that long term I would like to write a version of this transform
which *is* integrated with LSR's solver, but if that happens, we'll
just delete the extra pass.
Integration wise, I switched from using TTI to using a pass configuration
variable. This seems slightly more idiomatic, and means we don't run
the extra logic on any target other than RISCV.
44 lines
1.8 KiB
LLVM
44 lines
1.8 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
|
|
; RUN: opt -S -passes=loop-reduce,loop-term-fold -mtriple=riscv64-unknown-linux-gnu < %s | FileCheck %s
|
|
|
|
define void @test(ptr %p, i8 %arg, i32 %start) {
|
|
; CHECK-LABEL: define void @test(
|
|
; CHECK-SAME: ptr [[P:%.*]], i8 [[ARG:%.*]], i32 [[START:%.*]]) {
|
|
; CHECK-NEXT: entry:
|
|
; CHECK-NEXT: [[CONV:%.*]] = zext i8 [[ARG]] to i32
|
|
; CHECK-NEXT: [[SHR:%.*]] = lshr i32 [[CONV]], 1
|
|
; CHECK-NEXT: [[TMP0:%.*]] = add i32 [[START]], [[SHR]]
|
|
; CHECK-NEXT: [[TMP1:%.*]] = add i32 [[TMP0]], 1
|
|
; CHECK-NEXT: br label [[FOR_BODY:%.*]]
|
|
; CHECK: for.body:
|
|
; CHECK-NEXT: [[ADD810:%.*]] = phi i32 [ [[START]], [[ENTRY:%.*]] ], [ [[ADD:%.*]], [[FOR_BODY]] ]
|
|
; CHECK-NEXT: [[IDXPROM2:%.*]] = zext i32 [[ADD810]] to i64
|
|
; CHECK-NEXT: [[ARRAYIDX3:%.*]] = getelementptr i8, ptr [[P]], i64 [[IDXPROM2]]
|
|
; CHECK-NEXT: [[V:%.*]] = load i8, ptr [[ARRAYIDX3]], align 1
|
|
; CHECK-NEXT: [[ADD]] = add i32 [[ADD810]], 1
|
|
; CHECK-NEXT: [[LSR_FOLD_TERM_COND_REPLACED_TERM_COND:%.*]] = icmp eq i32 [[ADD]], [[TMP1]]
|
|
; CHECK-NEXT: br i1 [[LSR_FOLD_TERM_COND_REPLACED_TERM_COND]], label [[EXIT:%.*]], label [[FOR_BODY]]
|
|
; CHECK: exit:
|
|
; CHECK-NEXT: ret void
|
|
;
|
|
entry:
|
|
%conv = zext i8 %arg to i32
|
|
%shr = lshr i32 %conv, 1
|
|
%wide.trip.count = zext nneg i32 %shr to i64
|
|
br label %for.body
|
|
|
|
for.body:
|
|
%indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
|
|
%add810 = phi i32 [ %start, %entry ], [ %add, %for.body ]
|
|
%idxprom2 = zext i32 %add810 to i64
|
|
%arrayidx3 = getelementptr i8, ptr %p, i64 %idxprom2
|
|
%v = load i8, ptr %arrayidx3, align 1
|
|
%add = add i32 %add810, 1
|
|
%indvars.iv.next = add i64 %indvars.iv, 1
|
|
%exitcond.not = icmp eq i64 %indvars.iv, %wide.trip.count
|
|
br i1 %exitcond.not, label %exit, label %for.body
|
|
|
|
exit:
|
|
ret void
|
|
}
|