Files
clang-p2996/llvm/test/Transforms/LoopUnrollAndJam/se-forget.ll
Joshua Cao 50be285944 [LoopUnrollAndJam] Forget scalar evolution dispositions. Do no explicitly forget subloop.
Fixes https://github.com/llvm/llvm-project/issues/58454

Scalar evolution dispositions need to be forgotten to pass verification.

We do not need to forget the subloop since it is automatically forgotten
when forgetting the parent loop.

Differential Revision: https://reviews.llvm.org/D140953
2023-01-04 19:35:50 -08:00

126 lines
7.8 KiB
LLVM

; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
; RUN: opt "-passes=print<scalar-evolution>,loop-unroll-and-jam" -verify-scev -S < %s | FileCheck %s
; Checks that we forget scalar evolution loops and dispositions, which allows
; scalar evolution to verify successfully. `print<scalar-evolution>` is needed
; to populate SCEV caches.
target datalayout = "e-m:e-i64:64-p:64:64-n32:64-S128-v256:256:256-v512:512:512"
define dso_local void @main() {
; CHECK-LABEL: @main(
; CHECK-NEXT: entry:
; CHECK-NEXT: [[X:%.*]] = alloca [216 x float], align 4
; CHECK-NEXT: [[Y:%.*]] = alloca [216 x float], align 4
; CHECK-NEXT: [[X_IX_DIM_0:%.*]] = getelementptr i8, ptr [[X]], i64 -52
; CHECK-NEXT: [[Y_IX_DIM_0:%.*]] = getelementptr i8, ptr [[Y]], i64 -52
; CHECK-NEXT: br label [[OUTER_HEADER:%.*]]
; CHECK: outer.header:
; CHECK-NEXT: [[X_IX_DIM_1:%.*]] = getelementptr i8, ptr [[X_IX_DIM_0]], i64 20
; CHECK-NEXT: [[Y_IX_DIM_1:%.*]] = getelementptr i8, ptr [[Y_IX_DIM_0]], i64 4
; CHECK-NEXT: [[X_IX_DIM_1_1:%.*]] = getelementptr i8, ptr [[X_IX_DIM_0]], i64 20
; CHECK-NEXT: [[Y_IX_DIM_1_1:%.*]] = getelementptr i8, ptr [[Y_IX_DIM_0]], i64 8
; CHECK-NEXT: [[X_IX_DIM_1_2:%.*]] = getelementptr i8, ptr [[X_IX_DIM_0]], i64 20
; CHECK-NEXT: [[Y_IX_DIM_1_2:%.*]] = getelementptr i8, ptr [[Y_IX_DIM_0]], i64 12
; CHECK-NEXT: [[X_IX_DIM_1_3:%.*]] = getelementptr i8, ptr [[X_IX_DIM_0]], i64 20
; CHECK-NEXT: [[Y_IX_DIM_1_3:%.*]] = getelementptr i8, ptr [[Y_IX_DIM_0]], i64 16
; CHECK-NEXT: [[X_IX_DIM_1_4:%.*]] = getelementptr i8, ptr [[X_IX_DIM_0]], i64 20
; CHECK-NEXT: [[Y_IX_DIM_1_4:%.*]] = getelementptr i8, ptr [[Y_IX_DIM_0]], i64 20
; CHECK-NEXT: [[X_IX_DIM_1_5:%.*]] = getelementptr i8, ptr [[X_IX_DIM_0]], i64 20
; CHECK-NEXT: [[Y_IX_DIM_1_5:%.*]] = getelementptr i8, ptr [[Y_IX_DIM_0]], i64 24
; CHECK-NEXT: br label [[INNER:%.*]]
; CHECK: inner:
; CHECK-NEXT: [[INNER_IV_1:%.*]] = phi i64 [ 1, [[OUTER_HEADER]] ], [ 0, [[INNER]] ]
; CHECK-NEXT: [[INNER_IV:%.*]] = phi i64 [ 1, [[OUTER_HEADER]] ], [ [[INNER_IV_NEXT:%.*]], [[INNER]] ]
; CHECK-NEXT: [[INNER_IV_1_1:%.*]] = phi i64 [ 1, [[OUTER_HEADER]] ], [ 0, [[INNER]] ]
; CHECK-NEXT: [[INNER_IV_11:%.*]] = phi i64 [ 1, [[OUTER_HEADER]] ], [ [[INNER_IV_NEXT_1:%.*]], [[INNER]] ]
; CHECK-NEXT: [[INNER_IV_1_2:%.*]] = phi i64 [ 1, [[OUTER_HEADER]] ], [ 0, [[INNER]] ]
; CHECK-NEXT: [[INNER_IV_2:%.*]] = phi i64 [ 1, [[OUTER_HEADER]] ], [ [[INNER_IV_NEXT_2:%.*]], [[INNER]] ]
; CHECK-NEXT: [[INNER_IV_1_3:%.*]] = phi i64 [ 1, [[OUTER_HEADER]] ], [ 0, [[INNER]] ]
; CHECK-NEXT: [[INNER_IV_3:%.*]] = phi i64 [ 1, [[OUTER_HEADER]] ], [ [[INNER_IV_NEXT_3:%.*]], [[INNER]] ]
; CHECK-NEXT: [[INNER_IV_1_4:%.*]] = phi i64 [ 1, [[OUTER_HEADER]] ], [ 0, [[INNER]] ]
; CHECK-NEXT: [[INNER_IV_4:%.*]] = phi i64 [ 1, [[OUTER_HEADER]] ], [ [[INNER_IV_NEXT_4:%.*]], [[INNER]] ]
; CHECK-NEXT: [[INNER_IV_1_5:%.*]] = phi i64 [ 1, [[OUTER_HEADER]] ], [ 0, [[INNER]] ]
; CHECK-NEXT: [[INNER_IV_5:%.*]] = phi i64 [ 1, [[OUTER_HEADER]] ], [ [[INNER_IV_NEXT_5:%.*]], [[INNER]] ]
; CHECK-NEXT: [[_IX_X_LEN:%.*]] = mul nuw nsw i64 [[INNER_IV_1]], 144
; CHECK-NEXT: [[X_IX_DIM_2:%.*]] = getelementptr i8, ptr [[X_IX_DIM_1]], i64 [[_IX_X_LEN]]
; CHECK-NEXT: [[Y_IX_DIM_2:%.*]] = getelementptr i8, ptr [[Y_IX_DIM_1]], i64 [[_IX_X_LEN]]
; CHECK-NEXT: [[_VAL_Y:%.*]] = load float, ptr [[Y_IX_DIM_2]], align 4
; CHECK-NEXT: store float [[_VAL_Y]], ptr [[X_IX_DIM_2]], align 8
; CHECK-NEXT: [[INNER_IV_NEXT]] = add nuw nsw i64 [[INNER_IV]], 1
; CHECK-NEXT: [[_IX_X_LEN_12:%.*]] = mul nuw nsw i64 [[INNER_IV_1_1]], 144
; CHECK-NEXT: [[X_IX_DIM_2_1:%.*]] = getelementptr i8, ptr [[X_IX_DIM_1_1]], i64 [[_IX_X_LEN_12]]
; CHECK-NEXT: [[Y_IX_DIM_2_1:%.*]] = getelementptr i8, ptr [[Y_IX_DIM_1_1]], i64 [[_IX_X_LEN_12]]
; CHECK-NEXT: [[_VAL_Y_1:%.*]] = load float, ptr [[Y_IX_DIM_2_1]], align 4
; CHECK-NEXT: store float [[_VAL_Y_1]], ptr [[X_IX_DIM_2_1]], align 8
; CHECK-NEXT: [[INNER_IV_NEXT_1]] = add nuw nsw i64 [[INNER_IV_11]], 1
; CHECK-NEXT: [[_IX_X_LEN_2:%.*]] = mul nuw nsw i64 [[INNER_IV_1_2]], 144
; CHECK-NEXT: [[X_IX_DIM_2_2:%.*]] = getelementptr i8, ptr [[X_IX_DIM_1_2]], i64 [[_IX_X_LEN_2]]
; CHECK-NEXT: [[Y_IX_DIM_2_2:%.*]] = getelementptr i8, ptr [[Y_IX_DIM_1_2]], i64 [[_IX_X_LEN_2]]
; CHECK-NEXT: [[_VAL_Y_2:%.*]] = load float, ptr [[Y_IX_DIM_2_2]], align 4
; CHECK-NEXT: store float [[_VAL_Y_2]], ptr [[X_IX_DIM_2_2]], align 8
; CHECK-NEXT: [[INNER_IV_NEXT_2]] = add nuw nsw i64 [[INNER_IV_2]], 1
; CHECK-NEXT: [[_IX_X_LEN_3:%.*]] = mul nuw nsw i64 [[INNER_IV_1_3]], 144
; CHECK-NEXT: [[X_IX_DIM_2_3:%.*]] = getelementptr i8, ptr [[X_IX_DIM_1_3]], i64 [[_IX_X_LEN_3]]
; CHECK-NEXT: [[Y_IX_DIM_2_3:%.*]] = getelementptr i8, ptr [[Y_IX_DIM_1_3]], i64 [[_IX_X_LEN_3]]
; CHECK-NEXT: [[_VAL_Y_3:%.*]] = load float, ptr [[Y_IX_DIM_2_3]], align 4
; CHECK-NEXT: store float [[_VAL_Y_3]], ptr [[X_IX_DIM_2_3]], align 8
; CHECK-NEXT: [[INNER_IV_NEXT_3]] = add nuw nsw i64 [[INNER_IV_3]], 1
; CHECK-NEXT: [[_IX_X_LEN_4:%.*]] = mul nuw nsw i64 [[INNER_IV_1_4]], 144
; CHECK-NEXT: [[X_IX_DIM_2_4:%.*]] = getelementptr i8, ptr [[X_IX_DIM_1_4]], i64 [[_IX_X_LEN_4]]
; CHECK-NEXT: [[Y_IX_DIM_2_4:%.*]] = getelementptr i8, ptr [[Y_IX_DIM_1_4]], i64 [[_IX_X_LEN_4]]
; CHECK-NEXT: [[_VAL_Y_4:%.*]] = load float, ptr [[Y_IX_DIM_2_4]], align 4
; CHECK-NEXT: store float [[_VAL_Y_4]], ptr [[X_IX_DIM_2_4]], align 8
; CHECK-NEXT: [[INNER_IV_NEXT_4]] = add nuw nsw i64 [[INNER_IV_4]], 1
; CHECK-NEXT: [[_IX_X_LEN_5:%.*]] = mul nuw nsw i64 [[INNER_IV_1_5]], 144
; CHECK-NEXT: [[X_IX_DIM_2_5:%.*]] = getelementptr i8, ptr [[X_IX_DIM_1_5]], i64 [[_IX_X_LEN_5]]
; CHECK-NEXT: [[Y_IX_DIM_2_5:%.*]] = getelementptr i8, ptr [[Y_IX_DIM_1_5]], i64 [[_IX_X_LEN_5]]
; CHECK-NEXT: [[_VAL_Y_5:%.*]] = load float, ptr [[Y_IX_DIM_2_5]], align 4
; CHECK-NEXT: store float [[_VAL_Y_5]], ptr [[X_IX_DIM_2_5]], align 8
; CHECK-NEXT: [[INNER_IV_NEXT_5]] = add nuw nsw i64 [[INNER_IV_5]], 1
; CHECK-NEXT: [[EXITCOND_NOT_5:%.*]] = icmp eq i64 [[INNER_IV_NEXT_5]], 7
; CHECK-NEXT: br i1 [[EXITCOND_NOT_5]], label [[OUTER_LATCH:%.*]], label [[INNER]]
; CHECK: outer.latch:
; CHECK-NEXT: br label [[EXIT:%.*]]
; CHECK: exit:
; CHECK-NEXT: ret void
;
entry:
%x = alloca [216 x float], align 4
%y = alloca [216 x float], align 4
%x_ix_dim_0 = getelementptr i8, ptr %x, i64 -52
%y_ix_dim_0 = getelementptr i8, ptr %y, i64 -52
br label %outer.header
outer.header: ; preds = %outer.latch, %entry
%outer.iv = phi i64 [ 1, %entry ], [ %outer.iv.next, %outer.latch ]
%_ix_x_len.1 = shl nuw nsw i64 %outer.iv, 2
%x_ix_dim_1 = getelementptr i8, ptr %x_ix_dim_0, i64 20
%y_ix_dim_1 = getelementptr i8, ptr %y_ix_dim_0, i64 %_ix_x_len.1
br label %inner
inner: ; preds = %inner, %outer.header
%inner.iv.1 = phi i64 [ 1, %outer.header ], [ 0, %inner ]
%inner.iv = phi i64 [ 1, %outer.header ], [ %inner.iv.next, %inner ]
%_ix_x_len = mul nuw nsw i64 %inner.iv.1, 144
%x_ix_dim_2 = getelementptr i8, ptr %x_ix_dim_1, i64 %_ix_x_len
%y_ix_dim_2 = getelementptr i8, ptr %y_ix_dim_1, i64 %_ix_x_len
%_val_y = load float, ptr %y_ix_dim_2, align 4
%_add_tmp = fadd fast float %_val_y, 0.000000e+00
store float %_add_tmp, ptr %x_ix_dim_2, align 8
%inner.iv.next = add nuw nsw i64 %inner.iv, 1
%exitcond.not = icmp eq i64 %inner.iv.next, 7
br i1 %exitcond.not, label %outer.latch, label %inner
outer.latch: ; preds = %inner
%outer.iv.next = add nuw nsw i64 %outer.iv, 1
%exitcond.not.1 = icmp eq i64 %outer.iv.next, 7
br i1 %exitcond.not.1, label %exit, label %outer.header, !llvm.loop !1
exit: ; preds = %outer.latch
ret void
}
!1 = distinct !{!1, !2}
!2 = !{!"llvm.loop.unroll_and_jam.enable"}