[llvm] LAA: fix logic for MaxTargetVectorWidth (PR #125487)
Ramkumar Ramachandra via llvm-commits
llvm-commits at lists.llvm.org
Wed Feb 12 02:52:03 PST 2025
https://github.com/artagnon updated https://github.com/llvm/llvm-project/pull/125487
>From f904685ef6e3603364118d745547cc51f1636824 Mon Sep 17 00:00:00 2001
From: Ramkumar Ramachandra <ramkumar.ramachandra at codasip.com>
Date: Mon, 3 Feb 2025 11:59:38 +0000
Subject: [PATCH 1/2] LAA: fix logic for MaxTargetVectorWidth
Use TargetTransformInfo::enableScalableVectorization to choose Fixed
register bitwidth.
---
llvm/lib/Analysis/LoopAccessAnalysis.cpp | 18 +-
.../multiple-strides-rt-memory-checks.ll | 60 ++-
.../non-constant-distance-backward.ll | 468 +++++++++++++-----
3 files changed, 391 insertions(+), 155 deletions(-)
diff --git a/llvm/lib/Analysis/LoopAccessAnalysis.cpp b/llvm/lib/Analysis/LoopAccessAnalysis.cpp
index 3202ba81be78e..d24a48da8c589 100644
--- a/llvm/lib/Analysis/LoopAccessAnalysis.cpp
+++ b/llvm/lib/Analysis/LoopAccessAnalysis.cpp
@@ -2999,20 +2999,12 @@ LoopAccessInfo::LoopAccessInfo(Loop *L, ScalarEvolution *SE,
: PSE(std::make_unique<PredicatedScalarEvolution>(*SE, *L)),
PtrRtChecking(nullptr), TheLoop(L) {
unsigned MaxTargetVectorWidthInBits = std::numeric_limits<unsigned>::max();
- if (TTI) {
- TypeSize FixedWidth =
- TTI->getRegisterBitWidth(TargetTransformInfo::RGK_FixedWidthVector);
- if (FixedWidth.isNonZero()) {
- // Scale the vector width by 2 as rough estimate to also consider
- // interleaving.
- MaxTargetVectorWidthInBits = FixedWidth.getFixedValue() * 2;
- }
+ if (TTI && !TTI->enableScalableVectorization())
+ // Scale the vector width by 2 as rough estimate to also consider
+ // interleaving.
+ MaxTargetVectorWidthInBits =
+ TTI->getRegisterBitWidth(TargetTransformInfo::RGK_FixedWidthVector) * 2;
- TypeSize ScalableWidth =
- TTI->getRegisterBitWidth(TargetTransformInfo::RGK_ScalableVector);
- if (ScalableWidth.isNonZero())
- MaxTargetVectorWidthInBits = std::numeric_limits<unsigned>::max();
- }
DepChecker = std::make_unique<MemoryDepChecker>(*PSE, L, SymbolicStrides,
MaxTargetVectorWidthInBits);
PtrRtChecking = std::make_unique<RuntimePointerChecking>(*DepChecker, SE);
diff --git a/llvm/test/Analysis/LoopAccessAnalysis/multiple-strides-rt-memory-checks.ll b/llvm/test/Analysis/LoopAccessAnalysis/multiple-strides-rt-memory-checks.ll
index cb50b2c75ccb7..20fc0bea43b71 100644
--- a/llvm/test/Analysis/LoopAccessAnalysis/multiple-strides-rt-memory-checks.ll
+++ b/llvm/test/Analysis/LoopAccessAnalysis/multiple-strides-rt-memory-checks.ll
@@ -1,10 +1,11 @@
+; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 5
; RUN: opt -passes='print<access-info>' -disable-output < %s 2>&1 | FileCheck %s
; This is the test case from PR26314.
-; When we were retrying dependence checking with memchecks only,
-; the loop-invariant access in the inner loop was incorrectly determined to be wrapping
+; When we were retrying dependence checking with memchecks only,
+; the loop-invariant access in the inner loop was incorrectly determined to be wrapping
; because it was not strided in the inner loop.
-
+
; #define Z 32
; typedef struct s {
; int v1[Z];
@@ -21,19 +22,52 @@
; }
; }
-; CHECK: function 'Test':
-; CHECK: .inner:
-; CHECK-NEXT: Memory dependences are safe with run-time checks
-; CHECK-NEXT: Dependences:
-; CHECK-NEXT: Run-time memory checks:
-; CHECK: Check 0:
-; CHECK: Check 1:
-
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
%struct.s = type { [32 x i32], [32 x i32], [32 x [32 x i32]] }
define void @Test(ptr nocapture %obj, i64 %z) #0 {
+; CHECK-LABEL: 'Test'
+; CHECK-NEXT: .inner:
+; CHECK-NEXT: Memory dependences are safe with a maximum safe vector width of 2048 bits with run-time checks
+; CHECK-NEXT: Dependences:
+; CHECK-NEXT: Run-time memory checks:
+; CHECK-NEXT: Check 0:
+; CHECK-NEXT: Comparing group ([[GRP1:0x[0-9a-f]+]]):
+; CHECK-NEXT: %6 = getelementptr inbounds %struct.s, ptr %obj, i64 0, i32 2, i64 %i, i64 %j
+; CHECK-NEXT: Against group ([[GRP2:0x[0-9a-f]+]]):
+; CHECK-NEXT: %2 = getelementptr inbounds %struct.s, ptr %obj, i64 0, i32 0, i64 %j
+; CHECK-NEXT: Check 1:
+; CHECK-NEXT: Comparing group ([[GRP1]]):
+; CHECK-NEXT: %6 = getelementptr inbounds %struct.s, ptr %obj, i64 0, i32 2, i64 %i, i64 %j
+; CHECK-NEXT: Against group ([[GRP3:0x[0-9a-f]+]]):
+; CHECK-NEXT: %1 = getelementptr inbounds %struct.s, ptr %obj, i64 0, i32 1, i64 %i
+; CHECK-NEXT: Grouped accesses:
+; CHECK-NEXT: Group [[GRP1]]:
+; CHECK-NEXT: (Low: {(256 + %obj)<nuw>,+,128}<nuw><%.outer.preheader> High: {(256 + (4 * %z) + %obj),+,128}<nw><%.outer.preheader>)
+; CHECK-NEXT: Member: {{\{\{}}(256 + %obj)<nuw>,+,128}<nuw><%.outer.preheader>,+,4}<nuw><%.inner>
+; CHECK-NEXT: Group [[GRP2]]:
+; CHECK-NEXT: (Low: %obj High: ((4 * %z) + %obj))
+; CHECK-NEXT: Member: {%obj,+,4}<nuw><%.inner>
+; CHECK-NEXT: Group [[GRP3]]:
+; CHECK-NEXT: (Low: {(128 + %obj)<nuw>,+,4}<nuw><%.outer.preheader> High: {(132 + %obj),+,4}<nw><%.outer.preheader>)
+; CHECK-NEXT: Member: {(128 + %obj)<nuw>,+,4}<nuw><%.outer.preheader>
+; CHECK-EMPTY:
+; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
+; CHECK-NEXT: SCEV assumptions:
+; CHECK-EMPTY:
+; CHECK-NEXT: Expressions re-written:
+; CHECK-NEXT: .outer.preheader:
+; CHECK-NEXT: Report: loop is not the innermost loop
+; CHECK-NEXT: Dependences:
+; CHECK-NEXT: Run-time memory checks:
+; CHECK-NEXT: Grouped accesses:
+; CHECK-EMPTY:
+; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
+; CHECK-NEXT: SCEV assumptions:
+; CHECK-EMPTY:
+; CHECK-NEXT: Expressions re-written:
+;
br label %.outer.preheader
@@ -44,7 +78,7 @@ define void @Test(ptr nocapture %obj, i64 %z) #0 {
.exit:
ret void
-
+
.outer:
%i.next = add nuw nsw i64 %i, 1
%exitcond.outer = icmp eq i64 %i.next, 32
@@ -59,7 +93,7 @@ define void @Test(ptr nocapture %obj, i64 %z) #0 {
%6 = getelementptr inbounds %struct.s, ptr %obj, i64 0, i32 2, i64 %i, i64 %j
%7 = load i32, ptr %6
%8 = add nsw i32 %5, %7
- store i32 %8, ptr %6
+ store i32 %8, ptr %6
%j.next = add nuw nsw i64 %j, 1
%exitcond.inner = icmp eq i64 %j.next, %z
br i1 %exitcond.inner, label %.outer, label %.inner
diff --git a/llvm/test/Analysis/LoopAccessAnalysis/non-constant-distance-backward.ll b/llvm/test/Analysis/LoopAccessAnalysis/non-constant-distance-backward.ll
index 0058135a30d67..e03872e00efb4 100644
--- a/llvm/test/Analysis/LoopAccessAnalysis/non-constant-distance-backward.ll
+++ b/llvm/test/Analysis/LoopAccessAnalysis/non-constant-distance-backward.ll
@@ -1,7 +1,7 @@
; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 4
-; RUN: opt -passes='print<access-info>' -disable-output %s 2>&1 | FileCheck --check-prefixes=COMMON,MAXLEN %s
-; RUN: opt -passes='print<access-info>' -disable-output -mtriple=arm64-apple-macosx %s 2>&1 | FileCheck --check-prefixes=COMMON,VW128 %s
-; RUN: opt -passes='print<access-info>' -disable-output -mtriple=arm64-apple-macosx -mattr=+sve %s 2>&1 | FileCheck --check-prefixes=COMMON,MAXLEN %s
+; RUN: opt -passes='print<access-info>' -disable-output %s 2>&1 | FileCheck %s
+; RUN: opt -passes='print<access-info>' -disable-output -mtriple=arm64-apple-macosx %s 2>&1 | FileCheck --check-prefixes=VW128 %s
+; RUN: opt -passes='print<access-info>' -disable-output -mtriple=arm64-apple-macosx -mattr=+sve %s 2>&1 | FileCheck --check-prefixes=MAXLEN %s
; REQUIRES: aarch64-registered-target
@@ -10,38 +10,104 @@ target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128"
; If the dependence distance is not a constant, whether it gets identified as backwards or unknown depends on the minimum distance and the target's vector length.
define void @backward_min_distance_8(ptr %A, i64 %N) {
-; COMMON-LABEL: 'backward_min_distance_8'
-; COMMON-NEXT: loop:
-; COMMON-NEXT: Memory dependences are safe with run-time checks
-; COMMON-NEXT: Dependences:
-; COMMON-NEXT: Run-time memory checks:
-; COMMON-NEXT: Check 0:
-; COMMON-NEXT: Comparing group ([[GRP1:0x[0-9a-f]+]]):
-; COMMON-NEXT: %gep.off.iv = getelementptr inbounds i8, ptr %gep.off, i64 %iv
-; COMMON-NEXT: Against group ([[GRP2:0x[0-9a-f]+]]):
-; COMMON-NEXT: %gep = getelementptr inbounds i8, ptr %A, i64 %iv
-; COMMON-NEXT: Grouped accesses:
-; COMMON-NEXT: Group [[GRP1]]:
-; COMMON-NEXT: (Low: {(1 + %A)<nuw>,+,1}<nuw><%outer.header> High: {(257 + %A),+,1}<nw><%outer.header>)
-; COMMON-NEXT: Member: {{\{\{}}(1 + %A)<nuw>,+,1}<nuw><%outer.header>,+,1}<nuw><%loop>
-; COMMON-NEXT: Group [[GRP2]]:
-; COMMON-NEXT: (Low: %A High: (256 + %A))
-; COMMON-NEXT: Member: {%A,+,1}<nuw><%loop>
-; COMMON-EMPTY:
-; COMMON-NEXT: Non vectorizable stores to invariant address were not found in loop.
-; COMMON-NEXT: SCEV assumptions:
-; COMMON-EMPTY:
-; COMMON-NEXT: Expressions re-written:
-; COMMON-NEXT: outer.header:
-; COMMON-NEXT: Report: loop is not the innermost loop
-; COMMON-NEXT: Dependences:
-; COMMON-NEXT: Run-time memory checks:
-; COMMON-NEXT: Grouped accesses:
-; COMMON-EMPTY:
-; COMMON-NEXT: Non vectorizable stores to invariant address were not found in loop.
-; COMMON-NEXT: SCEV assumptions:
-; COMMON-EMPTY:
-; COMMON-NEXT: Expressions re-written:
+; CHECK-LABEL: 'backward_min_distance_8'
+; CHECK-NEXT: loop:
+; CHECK-NEXT: Memory dependences are safe with run-time checks
+; CHECK-NEXT: Dependences:
+; CHECK-NEXT: Run-time memory checks:
+; CHECK-NEXT: Check 0:
+; CHECK-NEXT: Comparing group ([[GRP1:0x[0-9a-f]+]]):
+; CHECK-NEXT: %gep.off.iv = getelementptr inbounds i8, ptr %gep.off, i64 %iv
+; CHECK-NEXT: Against group ([[GRP2:0x[0-9a-f]+]]):
+; CHECK-NEXT: %gep = getelementptr inbounds i8, ptr %A, i64 %iv
+; CHECK-NEXT: Grouped accesses:
+; CHECK-NEXT: Group [[GRP1]]:
+; CHECK-NEXT: (Low: {(1 + %A)<nuw>,+,1}<nuw><%outer.header> High: {(257 + %A),+,1}<nw><%outer.header>)
+; CHECK-NEXT: Member: {{\{\{}}(1 + %A)<nuw>,+,1}<nuw><%outer.header>,+,1}<nuw><%loop>
+; CHECK-NEXT: Group [[GRP2]]:
+; CHECK-NEXT: (Low: %A High: (256 + %A))
+; CHECK-NEXT: Member: {%A,+,1}<nuw><%loop>
+; CHECK-EMPTY:
+; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
+; CHECK-NEXT: SCEV assumptions:
+; CHECK-EMPTY:
+; CHECK-NEXT: Expressions re-written:
+; CHECK-NEXT: outer.header:
+; CHECK-NEXT: Report: loop is not the innermost loop
+; CHECK-NEXT: Dependences:
+; CHECK-NEXT: Run-time memory checks:
+; CHECK-NEXT: Grouped accesses:
+; CHECK-EMPTY:
+; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
+; CHECK-NEXT: SCEV assumptions:
+; CHECK-EMPTY:
+; CHECK-NEXT: Expressions re-written:
+;
+; VW128-LABEL: 'backward_min_distance_8'
+; VW128-NEXT: loop:
+; VW128-NEXT: Memory dependences are safe with run-time checks
+; VW128-NEXT: Dependences:
+; VW128-NEXT: Run-time memory checks:
+; VW128-NEXT: Check 0:
+; VW128-NEXT: Comparing group ([[GRP3:0x[0-9a-f]+]]):
+; VW128-NEXT: %gep.off.iv = getelementptr inbounds i8, ptr %gep.off, i64 %iv
+; VW128-NEXT: Against group ([[GRP4:0x[0-9a-f]+]]):
+; VW128-NEXT: %gep = getelementptr inbounds i8, ptr %A, i64 %iv
+; VW128-NEXT: Grouped accesses:
+; VW128-NEXT: Group [[GRP3]]:
+; VW128-NEXT: (Low: {(1 + %A)<nuw>,+,1}<nuw><%outer.header> High: {(257 + %A),+,1}<nw><%outer.header>)
+; VW128-NEXT: Member: {{\{\{}}(1 + %A)<nuw>,+,1}<nuw><%outer.header>,+,1}<nuw><%loop>
+; VW128-NEXT: Group [[GRP4]]:
+; VW128-NEXT: (Low: %A High: (256 + %A))
+; VW128-NEXT: Member: {%A,+,1}<nuw><%loop>
+; VW128-EMPTY:
+; VW128-NEXT: Non vectorizable stores to invariant address were not found in loop.
+; VW128-NEXT: SCEV assumptions:
+; VW128-EMPTY:
+; VW128-NEXT: Expressions re-written:
+; VW128-NEXT: outer.header:
+; VW128-NEXT: Report: loop is not the innermost loop
+; VW128-NEXT: Dependences:
+; VW128-NEXT: Run-time memory checks:
+; VW128-NEXT: Grouped accesses:
+; VW128-EMPTY:
+; VW128-NEXT: Non vectorizable stores to invariant address were not found in loop.
+; VW128-NEXT: SCEV assumptions:
+; VW128-EMPTY:
+; VW128-NEXT: Expressions re-written:
+;
+; MAXLEN-LABEL: 'backward_min_distance_8'
+; MAXLEN-NEXT: loop:
+; MAXLEN-NEXT: Memory dependences are safe with run-time checks
+; MAXLEN-NEXT: Dependences:
+; MAXLEN-NEXT: Run-time memory checks:
+; MAXLEN-NEXT: Check 0:
+; MAXLEN-NEXT: Comparing group ([[GRP5:0x[0-9a-f]+]]):
+; MAXLEN-NEXT: %gep.off.iv = getelementptr inbounds i8, ptr %gep.off, i64 %iv
+; MAXLEN-NEXT: Against group ([[GRP6:0x[0-9a-f]+]]):
+; MAXLEN-NEXT: %gep = getelementptr inbounds i8, ptr %A, i64 %iv
+; MAXLEN-NEXT: Grouped accesses:
+; MAXLEN-NEXT: Group [[GRP5]]:
+; MAXLEN-NEXT: (Low: {(1 + %A)<nuw>,+,1}<nuw><%outer.header> High: {(257 + %A),+,1}<nw><%outer.header>)
+; MAXLEN-NEXT: Member: {{\{\{}}(1 + %A)<nuw>,+,1}<nuw><%outer.header>,+,1}<nuw><%loop>
+; MAXLEN-NEXT: Group [[GRP6]]:
+; MAXLEN-NEXT: (Low: %A High: (256 + %A))
+; MAXLEN-NEXT: Member: {%A,+,1}<nuw><%loop>
+; MAXLEN-EMPTY:
+; MAXLEN-NEXT: Non vectorizable stores to invariant address were not found in loop.
+; MAXLEN-NEXT: SCEV assumptions:
+; MAXLEN-EMPTY:
+; MAXLEN-NEXT: Expressions re-written:
+; MAXLEN-NEXT: outer.header:
+; MAXLEN-NEXT: Report: loop is not the innermost loop
+; MAXLEN-NEXT: Dependences:
+; MAXLEN-NEXT: Run-time memory checks:
+; MAXLEN-NEXT: Grouped accesses:
+; MAXLEN-EMPTY:
+; MAXLEN-NEXT: Non vectorizable stores to invariant address were not found in loop.
+; MAXLEN-NEXT: SCEV assumptions:
+; MAXLEN-EMPTY:
+; MAXLEN-NEXT: Expressions re-written:
;
entry:
br label %outer.header
@@ -72,38 +138,97 @@ exit:
}
define void @backward_min_distance_120(ptr %A, i64 %N) {
-; COMMON-LABEL: 'backward_min_distance_120'
-; COMMON-NEXT: loop:
-; COMMON-NEXT: Memory dependences are safe with run-time checks
-; COMMON-NEXT: Dependences:
-; COMMON-NEXT: Run-time memory checks:
-; COMMON-NEXT: Check 0:
-; COMMON-NEXT: Comparing group ([[GRP3:0x[0-9a-f]+]]):
-; COMMON-NEXT: %gep.off.iv = getelementptr inbounds i8, ptr %gep.off, i64 %iv
-; COMMON-NEXT: Against group ([[GRP4:0x[0-9a-f]+]]):
-; COMMON-NEXT: %gep = getelementptr inbounds i8, ptr %A, i64 %iv
-; COMMON-NEXT: Grouped accesses:
-; COMMON-NEXT: Group [[GRP3]]:
-; COMMON-NEXT: (Low: {(15 + %A)<nuw>,+,1}<nuw><%outer.header> High: {(271 + %A),+,1}<nw><%outer.header>)
-; COMMON-NEXT: Member: {{\{\{}}(15 + %A)<nuw>,+,1}<nuw><%outer.header>,+,1}<nuw><%loop>
-; COMMON-NEXT: Group [[GRP4]]:
-; COMMON-NEXT: (Low: %A High: (256 + %A))
-; COMMON-NEXT: Member: {%A,+,1}<nuw><%loop>
-; COMMON-EMPTY:
-; COMMON-NEXT: Non vectorizable stores to invariant address were not found in loop.
-; COMMON-NEXT: SCEV assumptions:
-; COMMON-EMPTY:
-; COMMON-NEXT: Expressions re-written:
-; COMMON-NEXT: outer.header:
-; COMMON-NEXT: Report: loop is not the innermost loop
-; COMMON-NEXT: Dependences:
-; COMMON-NEXT: Run-time memory checks:
-; COMMON-NEXT: Grouped accesses:
-; COMMON-EMPTY:
-; COMMON-NEXT: Non vectorizable stores to invariant address were not found in loop.
-; COMMON-NEXT: SCEV assumptions:
-; COMMON-EMPTY:
-; COMMON-NEXT: Expressions re-written:
+; CHECK-LABEL: 'backward_min_distance_120'
+; CHECK-NEXT: loop:
+; CHECK-NEXT: Memory dependences are safe with a maximum safe vector width of 120 bits
+; CHECK-NEXT: Dependences:
+; CHECK-NEXT: BackwardVectorizable:
+; CHECK-NEXT: %l = load i8, ptr %gep, align 4 ->
+; CHECK-NEXT: store i8 %add, ptr %gep.off.iv, align 4
+; CHECK-EMPTY:
+; CHECK-NEXT: Run-time memory checks:
+; CHECK-NEXT: Grouped accesses:
+; CHECK-EMPTY:
+; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
+; CHECK-NEXT: SCEV assumptions:
+; CHECK-EMPTY:
+; CHECK-NEXT: Expressions re-written:
+; CHECK-NEXT: outer.header:
+; CHECK-NEXT: Report: loop is not the innermost loop
+; CHECK-NEXT: Dependences:
+; CHECK-NEXT: Run-time memory checks:
+; CHECK-NEXT: Grouped accesses:
+; CHECK-EMPTY:
+; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
+; CHECK-NEXT: SCEV assumptions:
+; CHECK-EMPTY:
+; CHECK-NEXT: Expressions re-written:
+;
+; VW128-LABEL: 'backward_min_distance_120'
+; VW128-NEXT: loop:
+; VW128-NEXT: Memory dependences are safe with run-time checks
+; VW128-NEXT: Dependences:
+; VW128-NEXT: Run-time memory checks:
+; VW128-NEXT: Check 0:
+; VW128-NEXT: Comparing group ([[GRP7:0x[0-9a-f]+]]):
+; VW128-NEXT: %gep.off.iv = getelementptr inbounds i8, ptr %gep.off, i64 %iv
+; VW128-NEXT: Against group ([[GRP8:0x[0-9a-f]+]]):
+; VW128-NEXT: %gep = getelementptr inbounds i8, ptr %A, i64 %iv
+; VW128-NEXT: Grouped accesses:
+; VW128-NEXT: Group [[GRP7]]:
+; VW128-NEXT: (Low: {(15 + %A)<nuw>,+,1}<nuw><%outer.header> High: {(271 + %A),+,1}<nw><%outer.header>)
+; VW128-NEXT: Member: {{\{\{}}(15 + %A)<nuw>,+,1}<nuw><%outer.header>,+,1}<nuw><%loop>
+; VW128-NEXT: Group [[GRP8]]:
+; VW128-NEXT: (Low: %A High: (256 + %A))
+; VW128-NEXT: Member: {%A,+,1}<nuw><%loop>
+; VW128-EMPTY:
+; VW128-NEXT: Non vectorizable stores to invariant address were not found in loop.
+; VW128-NEXT: SCEV assumptions:
+; VW128-EMPTY:
+; VW128-NEXT: Expressions re-written:
+; VW128-NEXT: outer.header:
+; VW128-NEXT: Report: loop is not the innermost loop
+; VW128-NEXT: Dependences:
+; VW128-NEXT: Run-time memory checks:
+; VW128-NEXT: Grouped accesses:
+; VW128-EMPTY:
+; VW128-NEXT: Non vectorizable stores to invariant address were not found in loop.
+; VW128-NEXT: SCEV assumptions:
+; VW128-EMPTY:
+; VW128-NEXT: Expressions re-written:
+;
+; MAXLEN-LABEL: 'backward_min_distance_120'
+; MAXLEN-NEXT: loop:
+; MAXLEN-NEXT: Memory dependences are safe with run-time checks
+; MAXLEN-NEXT: Dependences:
+; MAXLEN-NEXT: Run-time memory checks:
+; MAXLEN-NEXT: Check 0:
+; MAXLEN-NEXT: Comparing group ([[GRP9:0x[0-9a-f]+]]):
+; MAXLEN-NEXT: %gep.off.iv = getelementptr inbounds i8, ptr %gep.off, i64 %iv
+; MAXLEN-NEXT: Against group ([[GRP10:0x[0-9a-f]+]]):
+; MAXLEN-NEXT: %gep = getelementptr inbounds i8, ptr %A, i64 %iv
+; MAXLEN-NEXT: Grouped accesses:
+; MAXLEN-NEXT: Group [[GRP9]]:
+; MAXLEN-NEXT: (Low: {(15 + %A)<nuw>,+,1}<nuw><%outer.header> High: {(271 + %A),+,1}<nw><%outer.header>)
+; MAXLEN-NEXT: Member: {{\{\{}}(15 + %A)<nuw>,+,1}<nuw><%outer.header>,+,1}<nuw><%loop>
+; MAXLEN-NEXT: Group [[GRP10]]:
+; MAXLEN-NEXT: (Low: %A High: (256 + %A))
+; MAXLEN-NEXT: Member: {%A,+,1}<nuw><%loop>
+; MAXLEN-EMPTY:
+; MAXLEN-NEXT: Non vectorizable stores to invariant address were not found in loop.
+; MAXLEN-NEXT: SCEV assumptions:
+; MAXLEN-EMPTY:
+; MAXLEN-NEXT: Expressions re-written:
+; MAXLEN-NEXT: outer.header:
+; MAXLEN-NEXT: Report: loop is not the innermost loop
+; MAXLEN-NEXT: Dependences:
+; MAXLEN-NEXT: Run-time memory checks:
+; MAXLEN-NEXT: Grouped accesses:
+; MAXLEN-EMPTY:
+; MAXLEN-NEXT: Non vectorizable stores to invariant address were not found in loop.
+; MAXLEN-NEXT: SCEV assumptions:
+; MAXLEN-EMPTY:
+; MAXLEN-NEXT: Expressions re-written:
;
entry:
br label %outer.header
@@ -134,38 +259,97 @@ exit:
}
define void @backward_min_distance_128(ptr %A, i64 %N) {
-; COMMON-LABEL: 'backward_min_distance_128'
-; COMMON-NEXT: loop:
-; COMMON-NEXT: Memory dependences are safe with run-time checks
-; COMMON-NEXT: Dependences:
-; COMMON-NEXT: Run-time memory checks:
-; COMMON-NEXT: Check 0:
-; COMMON-NEXT: Comparing group ([[GRP13:0x[0-9a-f]+]]):
-; COMMON-NEXT: %gep.off.iv = getelementptr inbounds i8, ptr %gep.off, i64 %iv
-; COMMON-NEXT: Against group ([[GRP14:0x[0-9a-f]+]]):
-; COMMON-NEXT: %gep = getelementptr inbounds i8, ptr %A, i64 %iv
-; COMMON-NEXT: Grouped accesses:
-; COMMON-NEXT: Group [[GRP13]]:
-; COMMON-NEXT: (Low: {(16 + %A)<nuw>,+,1}<nuw><%outer.header> High: {(272 + %A),+,1}<nw><%outer.header>)
-; COMMON-NEXT: Member: {{\{\{}}(16 + %A)<nuw>,+,1}<nuw><%outer.header>,+,1}<nuw><%loop>
-; COMMON-NEXT: Group [[GRP14]]:
-; COMMON-NEXT: (Low: %A High: (256 + %A))
-; COMMON-NEXT: Member: {%A,+,1}<nuw><%loop>
-; COMMON-EMPTY:
-; COMMON-NEXT: Non vectorizable stores to invariant address were not found in loop.
-; COMMON-NEXT: SCEV assumptions:
-; COMMON-EMPTY:
-; COMMON-NEXT: Expressions re-written:
-; COMMON-NEXT: outer.header:
-; COMMON-NEXT: Report: loop is not the innermost loop
-; COMMON-NEXT: Dependences:
-; COMMON-NEXT: Run-time memory checks:
-; COMMON-NEXT: Grouped accesses:
-; COMMON-EMPTY:
-; COMMON-NEXT: Non vectorizable stores to invariant address were not found in loop.
-; COMMON-NEXT: SCEV assumptions:
-; COMMON-EMPTY:
-; COMMON-NEXT: Expressions re-written:
+; CHECK-LABEL: 'backward_min_distance_128'
+; CHECK-NEXT: loop:
+; CHECK-NEXT: Memory dependences are safe with a maximum safe vector width of 128 bits
+; CHECK-NEXT: Dependences:
+; CHECK-NEXT: BackwardVectorizable:
+; CHECK-NEXT: %l = load i8, ptr %gep, align 4 ->
+; CHECK-NEXT: store i8 %add, ptr %gep.off.iv, align 4
+; CHECK-EMPTY:
+; CHECK-NEXT: Run-time memory checks:
+; CHECK-NEXT: Grouped accesses:
+; CHECK-EMPTY:
+; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
+; CHECK-NEXT: SCEV assumptions:
+; CHECK-EMPTY:
+; CHECK-NEXT: Expressions re-written:
+; CHECK-NEXT: outer.header:
+; CHECK-NEXT: Report: loop is not the innermost loop
+; CHECK-NEXT: Dependences:
+; CHECK-NEXT: Run-time memory checks:
+; CHECK-NEXT: Grouped accesses:
+; CHECK-EMPTY:
+; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
+; CHECK-NEXT: SCEV assumptions:
+; CHECK-EMPTY:
+; CHECK-NEXT: Expressions re-written:
+;
+; VW128-LABEL: 'backward_min_distance_128'
+; VW128-NEXT: loop:
+; VW128-NEXT: Memory dependences are safe with run-time checks
+; VW128-NEXT: Dependences:
+; VW128-NEXT: Run-time memory checks:
+; VW128-NEXT: Check 0:
+; VW128-NEXT: Comparing group ([[GRP11:0x[0-9a-f]+]]):
+; VW128-NEXT: %gep.off.iv = getelementptr inbounds i8, ptr %gep.off, i64 %iv
+; VW128-NEXT: Against group ([[GRP12:0x[0-9a-f]+]]):
+; VW128-NEXT: %gep = getelementptr inbounds i8, ptr %A, i64 %iv
+; VW128-NEXT: Grouped accesses:
+; VW128-NEXT: Group [[GRP11]]:
+; VW128-NEXT: (Low: {(16 + %A)<nuw>,+,1}<nuw><%outer.header> High: {(272 + %A),+,1}<nw><%outer.header>)
+; VW128-NEXT: Member: {{\{\{}}(16 + %A)<nuw>,+,1}<nuw><%outer.header>,+,1}<nuw><%loop>
+; VW128-NEXT: Group [[GRP12]]:
+; VW128-NEXT: (Low: %A High: (256 + %A))
+; VW128-NEXT: Member: {%A,+,1}<nuw><%loop>
+; VW128-EMPTY:
+; VW128-NEXT: Non vectorizable stores to invariant address were not found in loop.
+; VW128-NEXT: SCEV assumptions:
+; VW128-EMPTY:
+; VW128-NEXT: Expressions re-written:
+; VW128-NEXT: outer.header:
+; VW128-NEXT: Report: loop is not the innermost loop
+; VW128-NEXT: Dependences:
+; VW128-NEXT: Run-time memory checks:
+; VW128-NEXT: Grouped accesses:
+; VW128-EMPTY:
+; VW128-NEXT: Non vectorizable stores to invariant address were not found in loop.
+; VW128-NEXT: SCEV assumptions:
+; VW128-EMPTY:
+; VW128-NEXT: Expressions re-written:
+;
+; MAXLEN-LABEL: 'backward_min_distance_128'
+; MAXLEN-NEXT: loop:
+; MAXLEN-NEXT: Memory dependences are safe with run-time checks
+; MAXLEN-NEXT: Dependences:
+; MAXLEN-NEXT: Run-time memory checks:
+; MAXLEN-NEXT: Check 0:
+; MAXLEN-NEXT: Comparing group ([[GRP13:0x[0-9a-f]+]]):
+; MAXLEN-NEXT: %gep.off.iv = getelementptr inbounds i8, ptr %gep.off, i64 %iv
+; MAXLEN-NEXT: Against group ([[GRP14:0x[0-9a-f]+]]):
+; MAXLEN-NEXT: %gep = getelementptr inbounds i8, ptr %A, i64 %iv
+; MAXLEN-NEXT: Grouped accesses:
+; MAXLEN-NEXT: Group [[GRP13]]:
+; MAXLEN-NEXT: (Low: {(16 + %A)<nuw>,+,1}<nuw><%outer.header> High: {(272 + %A),+,1}<nw><%outer.header>)
+; MAXLEN-NEXT: Member: {{\{\{}}(16 + %A)<nuw>,+,1}<nuw><%outer.header>,+,1}<nuw><%loop>
+; MAXLEN-NEXT: Group [[GRP14]]:
+; MAXLEN-NEXT: (Low: %A High: (256 + %A))
+; MAXLEN-NEXT: Member: {%A,+,1}<nuw><%loop>
+; MAXLEN-EMPTY:
+; MAXLEN-NEXT: Non vectorizable stores to invariant address were not found in loop.
+; MAXLEN-NEXT: SCEV assumptions:
+; MAXLEN-EMPTY:
+; MAXLEN-NEXT: Expressions re-written:
+; MAXLEN-NEXT: outer.header:
+; MAXLEN-NEXT: Report: loop is not the innermost loop
+; MAXLEN-NEXT: Dependences:
+; MAXLEN-NEXT: Run-time memory checks:
+; MAXLEN-NEXT: Grouped accesses:
+; MAXLEN-EMPTY:
+; MAXLEN-NEXT: Non vectorizable stores to invariant address were not found in loop.
+; MAXLEN-NEXT: SCEV assumptions:
+; MAXLEN-EMPTY:
+; MAXLEN-NEXT: Expressions re-written:
;
entry:
br label %outer.header
@@ -196,21 +380,73 @@ exit:
}
define void @backward_min_distance_256(ptr %A, i64 %N) {
+; CHECK-LABEL: 'backward_min_distance_256'
+; CHECK-NEXT: loop:
+; CHECK-NEXT: Memory dependences are safe with a maximum safe vector width of 256 bits
+; CHECK-NEXT: Dependences:
+; CHECK-NEXT: BackwardVectorizable:
+; CHECK-NEXT: %l = load i8, ptr %gep, align 4 ->
+; CHECK-NEXT: store i8 %add, ptr %gep.off.iv, align 4
+; CHECK-EMPTY:
+; CHECK-NEXT: Run-time memory checks:
+; CHECK-NEXT: Grouped accesses:
+; CHECK-EMPTY:
+; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
+; CHECK-NEXT: SCEV assumptions:
+; CHECK-EMPTY:
+; CHECK-NEXT: Expressions re-written:
+; CHECK-NEXT: outer.header:
+; CHECK-NEXT: Report: loop is not the innermost loop
+; CHECK-NEXT: Dependences:
+; CHECK-NEXT: Run-time memory checks:
+; CHECK-NEXT: Grouped accesses:
+; CHECK-EMPTY:
+; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
+; CHECK-NEXT: SCEV assumptions:
+; CHECK-EMPTY:
+; CHECK-NEXT: Expressions re-written:
+;
+; VW128-LABEL: 'backward_min_distance_256'
+; VW128-NEXT: loop:
+; VW128-NEXT: Memory dependences are safe with a maximum safe vector width of 256 bits
+; VW128-NEXT: Dependences:
+; VW128-NEXT: BackwardVectorizable:
+; VW128-NEXT: %l = load i8, ptr %gep, align 4 ->
+; VW128-NEXT: store i8 %add, ptr %gep.off.iv, align 4
+; VW128-EMPTY:
+; VW128-NEXT: Run-time memory checks:
+; VW128-NEXT: Grouped accesses:
+; VW128-EMPTY:
+; VW128-NEXT: Non vectorizable stores to invariant address were not found in loop.
+; VW128-NEXT: SCEV assumptions:
+; VW128-EMPTY:
+; VW128-NEXT: Expressions re-written:
+; VW128-NEXT: outer.header:
+; VW128-NEXT: Report: loop is not the innermost loop
+; VW128-NEXT: Dependences:
+; VW128-NEXT: Run-time memory checks:
+; VW128-NEXT: Grouped accesses:
+; VW128-EMPTY:
+; VW128-NEXT: Non vectorizable stores to invariant address were not found in loop.
+; VW128-NEXT: SCEV assumptions:
+; VW128-EMPTY:
+; VW128-NEXT: Expressions re-written:
+;
; MAXLEN-LABEL: 'backward_min_distance_256'
; MAXLEN-NEXT: loop:
; MAXLEN-NEXT: Memory dependences are safe with run-time checks
; MAXLEN-NEXT: Dependences:
; MAXLEN-NEXT: Run-time memory checks:
; MAXLEN-NEXT: Check 0:
-; MAXLEN-NEXT: Comparing group ([[GRP17:0x[0-9a-f]+]]):
+; MAXLEN-NEXT: Comparing group ([[GRP15:0x[0-9a-f]+]]):
; MAXLEN-NEXT: %gep.off.iv = getelementptr inbounds i8, ptr %gep.off, i64 %iv
-; MAXLEN-NEXT: Against group ([[GRP18:0x[0-9a-f]+]]):
+; MAXLEN-NEXT: Against group ([[GRP16:0x[0-9a-f]+]]):
; MAXLEN-NEXT: %gep = getelementptr inbounds i8, ptr %A, i64 %iv
; MAXLEN-NEXT: Grouped accesses:
-; MAXLEN-NEXT: Group [[GRP17]]:
+; MAXLEN-NEXT: Group [[GRP15]]:
; MAXLEN-NEXT: (Low: {(32 + %A)<nuw>,+,1}<nuw><%outer.header> High: {(288 + %A),+,1}<nw><%outer.header>)
; MAXLEN-NEXT: Member: {{\{\{}}(32 + %A)<nuw>,+,1}<nuw><%outer.header>,+,1}<nuw><%loop>
-; MAXLEN-NEXT: Group [[GRP18]]:
+; MAXLEN-NEXT: Group [[GRP16]]:
; MAXLEN-NEXT: (Low: %A High: (256 + %A))
; MAXLEN-NEXT: Member: {%A,+,1}<nuw><%loop>
; MAXLEN-EMPTY:
@@ -229,32 +465,6 @@ define void @backward_min_distance_256(ptr %A, i64 %N) {
; MAXLEN-EMPTY:
; MAXLEN-NEXT: Expressions re-written:
;
-; VW128-LABEL: 'backward_min_distance_256'
-; VW128-NEXT: loop:
-; VW128-NEXT: Memory dependences are safe with a maximum safe vector width of 256 bits
-; VW128-NEXT: Dependences:
-; VW128-NEXT: BackwardVectorizable:
-; VW128-NEXT: %l = load i8, ptr %gep, align 4 ->
-; VW128-NEXT: store i8 %add, ptr %gep.off.iv, align 4
-; VW128-EMPTY:
-; VW128-NEXT: Run-time memory checks:
-; VW128-NEXT: Grouped accesses:
-; VW128-EMPTY:
-; VW128-NEXT: Non vectorizable stores to invariant address were not found in loop.
-; VW128-NEXT: SCEV assumptions:
-; VW128-EMPTY:
-; VW128-NEXT: Expressions re-written:
-; VW128-NEXT: outer.header:
-; VW128-NEXT: Report: loop is not the innermost loop
-; VW128-NEXT: Dependences:
-; VW128-NEXT: Run-time memory checks:
-; VW128-NEXT: Grouped accesses:
-; VW128-EMPTY:
-; VW128-NEXT: Non vectorizable stores to invariant address were not found in loop.
-; VW128-NEXT: SCEV assumptions:
-; VW128-EMPTY:
-; VW128-NEXT: Expressions re-written:
-;
entry:
br label %outer.header
>From cd3e2621ebac8716a972bb9bf6b3364c5315855e Mon Sep 17 00:00:00 2001
From: Ramkumar Ramachandra <ramkumar.ramachandra at codasip.com>
Date: Wed, 12 Feb 2025 10:44:06 +0000
Subject: [PATCH 2/2] LAA: manually put in COMMON lines; UTC bug
---
.../non-constant-distance-backward.ll | 143 +++++-------------
1 file changed, 41 insertions(+), 102 deletions(-)
diff --git a/llvm/test/Analysis/LoopAccessAnalysis/non-constant-distance-backward.ll b/llvm/test/Analysis/LoopAccessAnalysis/non-constant-distance-backward.ll
index e03872e00efb4..f939680aa279d 100644
--- a/llvm/test/Analysis/LoopAccessAnalysis/non-constant-distance-backward.ll
+++ b/llvm/test/Analysis/LoopAccessAnalysis/non-constant-distance-backward.ll
@@ -1,7 +1,12 @@
-; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 4
-; RUN: opt -passes='print<access-info>' -disable-output %s 2>&1 | FileCheck %s
-; RUN: opt -passes='print<access-info>' -disable-output -mtriple=arm64-apple-macosx %s 2>&1 | FileCheck --check-prefixes=VW128 %s
-; RUN: opt -passes='print<access-info>' -disable-output -mtriple=arm64-apple-macosx -mattr=+sve %s 2>&1 | FileCheck --check-prefixes=MAXLEN %s
+; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 5
+; RUN: opt -passes='print<access-info>' -disable-output %s 2>&1 \
+; RUN: | FileCheck %s --check-prefixes=COMMON,CHECK
+; RUN: opt -passes='print<access-info>' -disable-output \
+; RUN: -mtriple=arm64-apple-macosx %s 2>&1 \
+; RUN: | FileCheck %s --check-prefixes=COMMON,VW128
+; RUN: opt -passes='print<access-info>' -disable-output \
+; RUN: -mtriple=arm64-apple-macosx -mattr=+sve %s 2>&1 \
+; RUN: | FileCheck %s --check-prefixes=COMMON,MAXLEN
; REQUIRES: aarch64-registered-target
@@ -10,104 +15,38 @@ target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128"
; If the dependence distance is not a constant, whether it gets identified as backwards or unknown depends on the minimum distance and the target's vector length.
define void @backward_min_distance_8(ptr %A, i64 %N) {
-; CHECK-LABEL: 'backward_min_distance_8'
-; CHECK-NEXT: loop:
-; CHECK-NEXT: Memory dependences are safe with run-time checks
-; CHECK-NEXT: Dependences:
-; CHECK-NEXT: Run-time memory checks:
-; CHECK-NEXT: Check 0:
-; CHECK-NEXT: Comparing group ([[GRP1:0x[0-9a-f]+]]):
-; CHECK-NEXT: %gep.off.iv = getelementptr inbounds i8, ptr %gep.off, i64 %iv
-; CHECK-NEXT: Against group ([[GRP2:0x[0-9a-f]+]]):
-; CHECK-NEXT: %gep = getelementptr inbounds i8, ptr %A, i64 %iv
-; CHECK-NEXT: Grouped accesses:
-; CHECK-NEXT: Group [[GRP1]]:
-; CHECK-NEXT: (Low: {(1 + %A)<nuw>,+,1}<nuw><%outer.header> High: {(257 + %A),+,1}<nw><%outer.header>)
-; CHECK-NEXT: Member: {{\{\{}}(1 + %A)<nuw>,+,1}<nuw><%outer.header>,+,1}<nuw><%loop>
-; CHECK-NEXT: Group [[GRP2]]:
-; CHECK-NEXT: (Low: %A High: (256 + %A))
-; CHECK-NEXT: Member: {%A,+,1}<nuw><%loop>
-; CHECK-EMPTY:
-; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
-; CHECK-NEXT: SCEV assumptions:
-; CHECK-EMPTY:
-; CHECK-NEXT: Expressions re-written:
-; CHECK-NEXT: outer.header:
-; CHECK-NEXT: Report: loop is not the innermost loop
-; CHECK-NEXT: Dependences:
-; CHECK-NEXT: Run-time memory checks:
-; CHECK-NEXT: Grouped accesses:
-; CHECK-EMPTY:
-; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
-; CHECK-NEXT: SCEV assumptions:
-; CHECK-EMPTY:
-; CHECK-NEXT: Expressions re-written:
-;
-; VW128-LABEL: 'backward_min_distance_8'
-; VW128-NEXT: loop:
-; VW128-NEXT: Memory dependences are safe with run-time checks
-; VW128-NEXT: Dependences:
-; VW128-NEXT: Run-time memory checks:
-; VW128-NEXT: Check 0:
-; VW128-NEXT: Comparing group ([[GRP3:0x[0-9a-f]+]]):
-; VW128-NEXT: %gep.off.iv = getelementptr inbounds i8, ptr %gep.off, i64 %iv
-; VW128-NEXT: Against group ([[GRP4:0x[0-9a-f]+]]):
-; VW128-NEXT: %gep = getelementptr inbounds i8, ptr %A, i64 %iv
-; VW128-NEXT: Grouped accesses:
-; VW128-NEXT: Group [[GRP3]]:
-; VW128-NEXT: (Low: {(1 + %A)<nuw>,+,1}<nuw><%outer.header> High: {(257 + %A),+,1}<nw><%outer.header>)
-; VW128-NEXT: Member: {{\{\{}}(1 + %A)<nuw>,+,1}<nuw><%outer.header>,+,1}<nuw><%loop>
-; VW128-NEXT: Group [[GRP4]]:
-; VW128-NEXT: (Low: %A High: (256 + %A))
-; VW128-NEXT: Member: {%A,+,1}<nuw><%loop>
-; VW128-EMPTY:
-; VW128-NEXT: Non vectorizable stores to invariant address were not found in loop.
-; VW128-NEXT: SCEV assumptions:
-; VW128-EMPTY:
-; VW128-NEXT: Expressions re-written:
-; VW128-NEXT: outer.header:
-; VW128-NEXT: Report: loop is not the innermost loop
-; VW128-NEXT: Dependences:
-; VW128-NEXT: Run-time memory checks:
-; VW128-NEXT: Grouped accesses:
-; VW128-EMPTY:
-; VW128-NEXT: Non vectorizable stores to invariant address were not found in loop.
-; VW128-NEXT: SCEV assumptions:
-; VW128-EMPTY:
-; VW128-NEXT: Expressions re-written:
-;
-; MAXLEN-LABEL: 'backward_min_distance_8'
-; MAXLEN-NEXT: loop:
-; MAXLEN-NEXT: Memory dependences are safe with run-time checks
-; MAXLEN-NEXT: Dependences:
-; MAXLEN-NEXT: Run-time memory checks:
-; MAXLEN-NEXT: Check 0:
-; MAXLEN-NEXT: Comparing group ([[GRP5:0x[0-9a-f]+]]):
-; MAXLEN-NEXT: %gep.off.iv = getelementptr inbounds i8, ptr %gep.off, i64 %iv
-; MAXLEN-NEXT: Against group ([[GRP6:0x[0-9a-f]+]]):
-; MAXLEN-NEXT: %gep = getelementptr inbounds i8, ptr %A, i64 %iv
-; MAXLEN-NEXT: Grouped accesses:
-; MAXLEN-NEXT: Group [[GRP5]]:
-; MAXLEN-NEXT: (Low: {(1 + %A)<nuw>,+,1}<nuw><%outer.header> High: {(257 + %A),+,1}<nw><%outer.header>)
-; MAXLEN-NEXT: Member: {{\{\{}}(1 + %A)<nuw>,+,1}<nuw><%outer.header>,+,1}<nuw><%loop>
-; MAXLEN-NEXT: Group [[GRP6]]:
-; MAXLEN-NEXT: (Low: %A High: (256 + %A))
-; MAXLEN-NEXT: Member: {%A,+,1}<nuw><%loop>
-; MAXLEN-EMPTY:
-; MAXLEN-NEXT: Non vectorizable stores to invariant address were not found in loop.
-; MAXLEN-NEXT: SCEV assumptions:
-; MAXLEN-EMPTY:
-; MAXLEN-NEXT: Expressions re-written:
-; MAXLEN-NEXT: outer.header:
-; MAXLEN-NEXT: Report: loop is not the innermost loop
-; MAXLEN-NEXT: Dependences:
-; MAXLEN-NEXT: Run-time memory checks:
-; MAXLEN-NEXT: Grouped accesses:
-; MAXLEN-EMPTY:
-; MAXLEN-NEXT: Non vectorizable stores to invariant address were not found in loop.
-; MAXLEN-NEXT: SCEV assumptions:
-; MAXLEN-EMPTY:
-; MAXLEN-NEXT: Expressions re-written:
+; COMMON-LABEL: 'backward_min_distance_8'
+; COMMON-NEXT: loop:
+; COMMON-NEXT: Memory dependences are safe with run-time checks
+; COMMON-NEXT: Dependences:
+; COMMON-NEXT: Run-time memory checks:
+; COMMON-NEXT: Check 0:
+; COMMON-NEXT: Comparing group ([[GRP1:0x[0-9a-f]+]]):
+; COMMON-NEXT: %gep.off.iv = getelementptr inbounds i8, ptr %gep.off, i64 %iv
+; COMMON-NEXT: Against group ([[GRP2:0x[0-9a-f]+]]):
+; COMMON-NEXT: %gep = getelementptr inbounds i8, ptr %A, i64 %iv
+; COMMON-NEXT: Grouped accesses:
+; COMMON-NEXT: Group [[GRP1]]:
+; COMMON-NEXT: (Low: {(1 + %A)<nuw>,+,1}<nuw><%outer.header> High: {(257 + %A),+,1}<nw><%outer.header>)
+; COMMON-NEXT: Member: {{\{\{}}(1 + %A)<nuw>,+,1}<nuw><%outer.header>,+,1}<nuw><%loop>
+; COMMON-NEXT: Group [[GRP2]]:
+; COMMON-NEXT: (Low: %A High: (256 + %A))
+; COMMON-NEXT: Member: {%A,+,1}<nuw><%loop>
+; COMMON-EMPTY:
+; COMMON-NEXT: Non vectorizable stores to invariant address were not found in loop.
+; COMMON-NEXT: SCEV assumptions:
+; COMMON-EMPTY:
+; COMMON-NEXT: Expressions re-written:
+; COMMON-NEXT: outer.header:
+; COMMON-NEXT: Report: loop is not the innermost loop
+; COMMON-NEXT: Dependences:
+; COMMON-NEXT: Run-time memory checks:
+; COMMON-NEXT: Grouped accesses:
+; COMMON-EMPTY:
+; COMMON-NEXT: Non vectorizable stores to invariant address were not found in loop.
+; COMMON-NEXT: SCEV assumptions:
+; COMMON-EMPTY:
+; COMMON-NEXT: Expressions re-written:
;
entry:
br label %outer.header
More information about the llvm-commits
mailing list