This is a follow-up PR to #181804. While working on the stacked PRs, I encountered some noisy diffs in the CHECK lines that don't change the meaning of the tests. To avoid such changes and make the review easier, this patch updates the UTC version. It also renames some BBs to suppress warnings emitted by UTC.
280 lines
14 KiB
LLVM
280 lines
14 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
|
|
; RUN: opt < %s -passes=loop-interchange -cache-line-size=4 -loop-interchange-threshold=-100 -verify-dom-info -verify-loop-info -verify-scev -verify-loop-lcssa -S | FileCheck %s
|
|
|
|
; Make sure the loops are in LCSSA form after loop interchange,
|
|
; and loop interchange does not hit assertion errors and crash.
|
|
|
|
target triple = "x86_64-unknown-linux-gnu"
|
|
|
|
@b = external global [512 x [4 x i32]], align 1
|
|
@c = external global [2 x [4 x i32]], align 1
|
|
@d = external global [1024 x [512 x [4 x i32]]], align 1
|
|
|
|
define void @test1() {
|
|
; CHECK-LABEL: define void @test1() {
|
|
; CHECK-NEXT: [[ENTRY:.*:]]
|
|
; CHECK-NEXT: br label %[[FOR_COND37_PREHEADER_PREHEADER:.*]]
|
|
; CHECK: [[FOR_COND33_PREHEADER_PREHEADER:.*]]:
|
|
; CHECK-NEXT: br label %[[FOR_COND33_PREHEADER:.*]]
|
|
; CHECK: [[FOR_COND33_PREHEADER]]:
|
|
; CHECK-NEXT: [[I_011:%.*]] = phi i16 [ [[INC69:%.*]], %[[FOR_END67:.*]] ], [ 0, %[[FOR_COND33_PREHEADER_PREHEADER]] ]
|
|
; CHECK-NEXT: br label %[[FOR_BODY42_SPLIT1:.*]]
|
|
; CHECK: [[FOR_BODY42_PREHEADER:.*]]:
|
|
; CHECK-NEXT: br label %[[FOR_BODY42:.*]]
|
|
; CHECK: [[FOR_COND37_PREHEADER_PREHEADER]]:
|
|
; CHECK-NEXT: br label %[[FOR_COND37_PREHEADER:.*]]
|
|
; CHECK: [[FOR_COND37_PREHEADER]]:
|
|
; CHECK-NEXT: [[J_010:%.*]] = phi i16 [ [[INC66:%.*]], %[[FOR_END64:.*]] ], [ 0, %[[FOR_COND37_PREHEADER_PREHEADER]] ]
|
|
; CHECK-NEXT: br label %[[FOR_BODY42_PREHEADER]]
|
|
; CHECK: [[FOR_BODY42]]:
|
|
; CHECK-NEXT: [[K_09:%.*]] = phi i16 [ [[TMP1:%.*]], %[[FOR_BODY42_SPLIT:.*]] ], [ -512, %[[FOR_BODY42_PREHEADER]] ]
|
|
; CHECK-NEXT: br label %[[FOR_COND33_PREHEADER_PREHEADER]]
|
|
; CHECK: [[FOR_BODY42_SPLIT1]]:
|
|
; CHECK-NEXT: [[SUB51:%.*]] = add nsw i16 [[K_09]], 512
|
|
; CHECK-NEXT: [[ARRAYIDX55:%.*]] = getelementptr inbounds [512 x [4 x i32]], ptr @b, i16 0, i16 [[SUB51]], i16 [[J_010]]
|
|
; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[ARRAYIDX55]], align 1
|
|
; CHECK-NEXT: [[ADD61:%.*]] = add i32 undef, undef
|
|
; CHECK-NEXT: [[INC63:%.*]] = add nsw i16 [[K_09]], 1
|
|
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i16 [[K_09]], 42
|
|
; CHECK-NEXT: br label %[[FOR_END67]]
|
|
; CHECK: [[FOR_BODY42_SPLIT]]:
|
|
; CHECK-NEXT: [[ADD61_LCSSA:%.*]] = phi i32 [ [[ADD61]], %[[FOR_END67]] ]
|
|
; CHECK-NEXT: [[TMP1]] = add nsw i16 [[K_09]], 1
|
|
; CHECK-NEXT: [[TMP2:%.*]] = icmp slt i16 [[K_09]], 42
|
|
; CHECK-NEXT: br i1 [[TMP2]], label %[[FOR_BODY42]], label %[[FOR_END64]]
|
|
; CHECK: [[FOR_END64]]:
|
|
; CHECK-NEXT: [[ADD61_LCSSA_LCSSA:%.*]] = phi i32 [ [[ADD61_LCSSA]], %[[FOR_BODY42_SPLIT]] ]
|
|
; CHECK-NEXT: store i32 [[ADD61_LCSSA_LCSSA]], ptr undef, align 1
|
|
; CHECK-NEXT: [[INC66]] = add nuw nsw i16 [[J_010]], 1
|
|
; CHECK-NEXT: [[CMP2:%.*]] = icmp slt i16 [[J_010]], 43
|
|
; CHECK-NEXT: br i1 [[CMP2]], label %[[FOR_COND37_PREHEADER]], label %[[FOR_COND75_PREHEADER:.*]]
|
|
; CHECK: [[FOR_END67]]:
|
|
; CHECK-NEXT: [[INC69]] = add nuw nsw i16 [[I_011]], 1
|
|
; CHECK-NEXT: [[EXITCOND13_NOT:%.*]] = icmp eq i16 [[INC69]], 2
|
|
; CHECK-NEXT: br i1 [[EXITCOND13_NOT]], label %[[FOR_BODY42_SPLIT]], label %[[FOR_COND33_PREHEADER]]
|
|
; CHECK: [[FOR_COND75_PREHEADER]]:
|
|
; CHECK-NEXT: br label %[[FOR_COND75:.*]]
|
|
; CHECK: [[FOR_COND75]]:
|
|
; CHECK-NEXT: br label %[[FOR_COND75]]
|
|
;
|
|
entry:
|
|
br label %for.cond33.preheader
|
|
|
|
for.cond33.preheader: ; preds = %for.end67, %entry
|
|
%i.011 = phi i16 [ 0, %entry ], [ %inc69, %for.end67 ]
|
|
br label %for.cond37.preheader
|
|
|
|
for.cond37.preheader: ; preds = %for.end64, %for.cond33.preheader
|
|
%j.010 = phi i16 [ 0, %for.cond33.preheader ], [ %inc66, %for.end64 ]
|
|
br label %for.body42
|
|
|
|
for.body42: ; preds = %for.body42, %for.cond37.preheader
|
|
%k.09 = phi i16 [ -512, %for.cond37.preheader ], [ %inc63, %for.body42 ]
|
|
%sub51 = add nsw i16 %k.09, 512
|
|
%arrayidx55 = getelementptr inbounds [512 x [4 x i32]], ptr @b, i16 0, i16 %sub51, i16 %j.010
|
|
%0 = load i32, ptr %arrayidx55, align 1
|
|
%add61 = add i32 undef, undef
|
|
%inc63 = add nsw i16 %k.09, 1
|
|
%cmp = icmp slt i16 %k.09, 42
|
|
br i1 %cmp, label %for.body42, label %for.end64
|
|
|
|
for.end64: ; preds = %for.body42
|
|
store i32 %add61, ptr undef, align 1
|
|
%inc66 = add nuw nsw i16 %j.010, 1
|
|
%cmp2 = icmp slt i16 %j.010, 43
|
|
br i1 %cmp2, label %for.cond37.preheader, label %for.end67
|
|
|
|
for.end67: ; preds = %for.end64
|
|
%inc69 = add nuw nsw i16 %i.011, 1
|
|
%exitcond13.not = icmp eq i16 %inc69, 2
|
|
br i1 %exitcond13.not, label %for.cond75, label %for.cond33.preheader
|
|
|
|
for.cond75: ; preds = %for.cond75, %for.end67
|
|
br label %for.cond75
|
|
}
|
|
|
|
; Make sure that we split the phi nodes in the middle loop header
|
|
; into a separate basic block to avoid the situation where use of
|
|
; the outermost indvar appears before its def after interchanging
|
|
; the outermost and the middle loop. Otherwise loop interchange
|
|
; would crash.
|
|
|
|
define void @test2() {
|
|
; CHECK-LABEL: define void @test2() {
|
|
; CHECK-NEXT: [[ENTRY:.*:]]
|
|
; CHECK-NEXT: br label %[[FOR_COND33_PREHEADER:.*]]
|
|
; CHECK: [[FOR_COND33_PREHEADER_PREHEADER:.*]]:
|
|
; CHECK-NEXT: br label %[[FOR_COND33_PREHEADER1:.*]]
|
|
; CHECK: [[FOR_COND33_PREHEADER1]]:
|
|
; CHECK-NEXT: [[I_166:%.*]] = phi i16 [ [[INC69:%.*]], %[[FOR_INC68:.*]] ], [ 0, %[[FOR_COND33_PREHEADER_PREHEADER]] ]
|
|
; CHECK-NEXT: [[ARRAYIDX60:%.*]] = getelementptr inbounds [2 x [4 x i32]], ptr @c, i16 0, i16 [[I_166]], i16 [[J_165:%.*]]
|
|
; CHECK-NEXT: br label %[[VECTOR_BODY85_SPLIT1:.*]]
|
|
; CHECK: [[FOR_COND33_PREHEADER]]:
|
|
; CHECK-NEXT: br label %[[FOR_COND37_PREHEADER:.*]]
|
|
; CHECK: [[FOR_COND37_PREHEADER]]:
|
|
; CHECK-NEXT: [[J_165]] = phi i16 [ [[INC66:%.*]], %[[MIDDLE_BLOCK80:.*]] ], [ 0, %[[FOR_COND33_PREHEADER]] ]
|
|
; CHECK-NEXT: br label %[[VECTOR_BODY85:.*]]
|
|
; CHECK: [[VECTOR_BODY85]]:
|
|
; CHECK-NEXT: br label %[[VECTOR_BODY86:.*]]
|
|
; CHECK: [[VECTOR_BODY86]]:
|
|
; CHECK-NEXT: [[INDEX86:%.*]] = phi i16 [ 0, %[[VECTOR_BODY85]] ], [ [[TMP5:%.*]], %[[VECTOR_BODY85_SPLIT:.*]] ]
|
|
; CHECK-NEXT: br label %[[FOR_COND33_PREHEADER_PREHEADER]]
|
|
; CHECK: [[VECTOR_BODY85_SPLIT1]]:
|
|
; CHECK-NEXT: [[TMP0:%.*]] = or disjoint i16 [[INDEX86]], 2
|
|
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds [512 x [4 x i32]], ptr @b, i16 0, i16 [[TMP0]], i16 [[J_165]]
|
|
; CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr [[TMP1]], align 1
|
|
; CHECK-NEXT: [[TMP3:%.*]] = add nuw i16 [[INDEX86]], 4
|
|
; CHECK-NEXT: [[CMP2:%.*]] = icmp slt i16 [[INDEX86]], 42
|
|
; CHECK-NEXT: br label %[[FOR_INC68]]
|
|
; CHECK: [[VECTOR_BODY85_SPLIT]]:
|
|
; CHECK-NEXT: [[TMP5]] = add nuw i16 [[INDEX86]], 4
|
|
; CHECK-NEXT: [[TMP4:%.*]] = icmp slt i16 [[INDEX86]], 42
|
|
; CHECK-NEXT: br i1 [[TMP4]], label %[[VECTOR_BODY86]], label %[[MIDDLE_BLOCK80]]
|
|
; CHECK: [[MIDDLE_BLOCK80]]:
|
|
; CHECK-NEXT: [[INC66]] = add nuw nsw i16 [[J_165]], 1
|
|
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i16 [[INC66]], 42
|
|
; CHECK-NEXT: br i1 [[CMP]], label %[[FOR_COND37_PREHEADER]], label %[[FOR_COND75_PREHEADER:.*]]
|
|
; CHECK: [[FOR_INC68]]:
|
|
; CHECK-NEXT: [[INC69]] = add nuw nsw i16 [[I_166]], 1
|
|
; CHECK-NEXT: [[EXITCOND77_NOT:%.*]] = icmp slt i16 [[INC69]], 24
|
|
; CHECK-NEXT: br i1 [[EXITCOND77_NOT]], label %[[FOR_COND33_PREHEADER1]], label %[[VECTOR_BODY85_SPLIT]]
|
|
; CHECK: [[FOR_COND75_PREHEADER]]:
|
|
; CHECK-NEXT: unreachable
|
|
;
|
|
entry:
|
|
br label %for.cond33.preheader
|
|
|
|
for.cond33.preheader: ; preds = %for.inc68, %entry
|
|
%i.166 = phi i16 [ %inc69, %for.inc68 ], [ 0, %entry ]
|
|
br label %for.cond37.preheader
|
|
|
|
for.cond37.preheader: ; preds = %middle.block80, %for.cond33.preheader
|
|
%j.165 = phi i16 [ 0, %for.cond33.preheader ], [ %inc66, %middle.block80 ]
|
|
%arrayidx60 = getelementptr inbounds [2 x [4 x i32]], ptr @c, i16 0, i16 %i.166, i16 %j.165
|
|
br label %vector.body85
|
|
|
|
vector.body85: ; preds = %vector.body85, %for.cond37.preheader
|
|
%index86 = phi i16 [ 0, %for.cond37.preheader ], [ %index.next87, %vector.body85 ]
|
|
%0 = or disjoint i16 %index86, 2
|
|
%1 = getelementptr inbounds [512 x [4 x i32]], ptr @b, i16 0, i16 %0, i16 %j.165
|
|
%2 = load i32, ptr %1, align 1
|
|
%index.next87 = add nuw i16 %index86, 4
|
|
%cmp2 = icmp slt i16 %index86, 42
|
|
br i1 %cmp2, label %vector.body85, label %middle.block80
|
|
|
|
middle.block80: ; preds = %vector.body85
|
|
%inc66 = add nuw nsw i16 %j.165, 1
|
|
%cmp = icmp slt i16 %inc66, 42
|
|
br i1 %cmp, label %for.cond37.preheader, label %for.inc68
|
|
|
|
for.inc68: ; preds = %middle.block80
|
|
%inc69 = add nuw nsw i16 %i.166, 1
|
|
%exitcond77.not = icmp slt i16 %inc69, 24
|
|
br i1 %exitcond77.not, label %for.cond33.preheader, label %for.cond75.preheader
|
|
|
|
for.cond75.preheader: ; preds = %for.inc68
|
|
unreachable
|
|
}
|
|
|
|
; Same as test1, but with a third index on the GEP
|
|
define void @test3() {
|
|
; CHECK-LABEL: define void @test3() {
|
|
; CHECK-NEXT: [[ENTRY:.*:]]
|
|
; CHECK-NEXT: br label %[[FOR_COND37_PREHEADER_PREHEADER:.*]]
|
|
; CHECK: [[FOR_COND33_PREHEADER_PREHEADER:.*]]:
|
|
; CHECK-NEXT: br label %[[FOR_COND33_PREHEADER:.*]]
|
|
; CHECK: [[FOR_COND33_PREHEADER]]:
|
|
; CHECK-NEXT: [[I_011:%.*]] = phi i16 [ [[INC69:%.*]], %[[FOR_END67:.*]] ], [ 0, %[[FOR_COND33_PREHEADER_PREHEADER]] ]
|
|
; CHECK-NEXT: br label %[[FOR_BODY42_SPLIT1:.*]]
|
|
; CHECK: [[FOR_BODY42_PREHEADER:.*]]:
|
|
; CHECK-NEXT: br label %[[FOR_BODY42:.*]]
|
|
; CHECK: [[FOR_COND38_PREHEADER_PREHEADER:.*]]:
|
|
; CHECK-NEXT: br label %[[FOR_COND38_PREHEADER:.*]]
|
|
; CHECK: [[FOR_COND37_PREHEADER_PREHEADER]]:
|
|
; CHECK-NEXT: br label %[[FOR_COND37_PREHEADER:.*]]
|
|
; CHECK: [[FOR_COND37_PREHEADER]]:
|
|
; CHECK-NEXT: [[J_010:%.*]] = phi i16 [ [[INC66:%.*]], %[[FOR_END64:.*]] ], [ 0, %[[FOR_COND37_PREHEADER_PREHEADER]] ]
|
|
; CHECK-NEXT: br label %[[FOR_COND38_PREHEADER_PREHEADER]]
|
|
; CHECK: [[FOR_COND38_PREHEADER]]:
|
|
; CHECK-NEXT: [[K_010:%.*]] = phi i16 [ [[INC67:%.*]], %[[FOR_END65:.*]] ], [ 0, %[[FOR_COND38_PREHEADER_PREHEADER]] ]
|
|
; CHECK-NEXT: br label %[[FOR_BODY42_PREHEADER]]
|
|
; CHECK: [[FOR_BODY42]]:
|
|
; CHECK-NEXT: [[K_09:%.*]] = phi i16 [ [[TMP3:%.*]], %[[FOR_BODY42_SPLIT:.*]] ], [ -512, %[[FOR_BODY42_PREHEADER]] ]
|
|
; CHECK-NEXT: br label %[[FOR_COND33_PREHEADER_PREHEADER]]
|
|
; CHECK: [[FOR_BODY42_SPLIT1]]:
|
|
; CHECK-NEXT: [[SUB51:%.*]] = add nsw i16 [[K_09]], 512
|
|
; CHECK-NEXT: [[ARRAYIDX55:%.*]] = getelementptr inbounds [1024 x [512 x [4 x i32]]], ptr @d, i16 0, i16 [[SUB51]], i16 [[J_010]], i16 [[K_010]]
|
|
; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[ARRAYIDX55]], align 1
|
|
; CHECK-NEXT: [[ADD61:%.*]] = add i32 undef, undef
|
|
; CHECK-NEXT: [[TMP1:%.*]] = add nsw i16 [[K_09]], 1
|
|
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i16 [[K_09]], 42
|
|
; CHECK-NEXT: br label %[[FOR_END67]]
|
|
; CHECK: [[FOR_BODY42_SPLIT]]:
|
|
; CHECK-NEXT: [[ADD61_LCSSA:%.*]] = phi i32 [ [[ADD61]], %[[FOR_END67]] ]
|
|
; CHECK-NEXT: [[TMP3]] = add nsw i16 [[K_09]], 1
|
|
; CHECK-NEXT: [[TMP2:%.*]] = icmp slt i16 [[K_09]], 42
|
|
; CHECK-NEXT: br i1 [[TMP2]], label %[[FOR_BODY42]], label %[[FOR_END65]]
|
|
; CHECK: [[FOR_END65]]:
|
|
; CHECK-NEXT: [[ADD61_LCSSA_LCSSA:%.*]] = phi i32 [ [[ADD61_LCSSA]], %[[FOR_BODY42_SPLIT]] ]
|
|
; CHECK-NEXT: store i32 [[ADD61_LCSSA_LCSSA]], ptr undef, align 1
|
|
; CHECK-NEXT: [[INC67]] = add nuw nsw i16 [[K_010]], 1
|
|
; CHECK-NEXT: [[CMP3:%.*]] = icmp slt i16 [[K_010]], 44
|
|
; CHECK-NEXT: br i1 [[CMP3]], label %[[FOR_COND38_PREHEADER]], label %[[FOR_END64]]
|
|
; CHECK: [[FOR_END64]]:
|
|
; CHECK-NEXT: [[INC66]] = add nuw nsw i16 [[J_010]], 1
|
|
; CHECK-NEXT: [[CMP2:%.*]] = icmp slt i16 [[J_010]], 43
|
|
; CHECK-NEXT: br i1 [[CMP2]], label %[[FOR_COND37_PREHEADER]], label %[[FOR_COND75_PREHEADER:.*]]
|
|
; CHECK: [[FOR_END67]]:
|
|
; CHECK-NEXT: [[INC69]] = add nuw nsw i16 [[I_011]], 1
|
|
; CHECK-NEXT: [[EXITCOND13_NOT:%.*]] = icmp eq i16 [[INC69]], 2
|
|
; CHECK-NEXT: br i1 [[EXITCOND13_NOT]], label %[[FOR_BODY42_SPLIT]], label %[[FOR_COND33_PREHEADER]]
|
|
; CHECK: [[FOR_COND75_PREHEADER]]:
|
|
; CHECK-NEXT: br label %[[FOR_COND75:.*]]
|
|
; CHECK: [[FOR_COND75]]:
|
|
; CHECK-NEXT: br label %[[FOR_COND75]]
|
|
;
|
|
entry:
|
|
br label %for.cond33.preheader
|
|
|
|
for.cond33.preheader: ; preds = %for.end67, %entry
|
|
%i.011 = phi i16 [ 0, %entry ], [ %inc69, %for.end67 ]
|
|
br label %for.cond37.preheader
|
|
|
|
for.cond37.preheader: ; preds = %for.end64, %for.cond33.preheader
|
|
%j.010 = phi i16 [ 0, %for.cond33.preheader ], [ %inc66, %for.end64 ]
|
|
br label %for.cond38.preheader
|
|
|
|
for.cond38.preheader: ; preds = %for.end65, %for.cond37.preheader
|
|
%k.010 = phi i16 [ 0, %for.cond37.preheader ], [ %inc67, %for.end65 ]
|
|
br label %for.body42
|
|
|
|
for.body42: ; preds = %for.body42, %for.cond38.preheader
|
|
%k.09 = phi i16 [ -512, %for.cond38.preheader ], [ %inc63, %for.body42 ]
|
|
%sub51 = add nsw i16 %k.09, 512
|
|
%arrayidx55 = getelementptr inbounds [1024 x [512 x [4 x i32]]], ptr @d, i16 0, i16 %sub51, i16 %j.010, i16 %k.010
|
|
%0 = load i32, ptr %arrayidx55, align 1
|
|
%add61 = add i32 undef, undef
|
|
%inc63 = add nsw i16 %k.09, 1
|
|
%cmp = icmp slt i16 %k.09, 42
|
|
br i1 %cmp, label %for.body42, label %for.end65
|
|
|
|
for.end65: ; preds = %for.body42
|
|
store i32 %add61, ptr undef, align 1
|
|
%inc67 = add nuw nsw i16 %k.010, 1
|
|
%cmp3 = icmp slt i16 %k.010, 44
|
|
br i1 %cmp3, label %for.cond38.preheader, label %for.end64
|
|
|
|
for.end64: ; preds = %for.end65
|
|
%inc66 = add nuw nsw i16 %j.010, 1
|
|
%cmp2 = icmp slt i16 %j.010, 43
|
|
br i1 %cmp2, label %for.cond37.preheader, label %for.end67
|
|
|
|
for.end67: ; preds = %for.end64
|
|
%inc69 = add nuw nsw i16 %i.011, 1
|
|
%exitcond13.not = icmp eq i16 %inc69, 2
|
|
br i1 %exitcond13.not, label %for.cond75, label %for.cond33.preheader
|
|
|
|
for.cond75: ; preds = %for.cond75, %for.end67
|
|
br label %for.cond75
|
|
}
|