Skip to content

Commit 0658bab

Browse files
committed
[SCEV] Infer flags from add/gep in any block
This patch removes a compile time restriction from isSCEVExprNeverPoison. We've strengthened our ability to reason about flags on scopes other than addrecs, and this bailout prevents us from using it. The comment is also suspect as well in that we're in the middle of constructing a SCEV for I. As such, we're going to visit all operands *anyways*. Differential Revision: https://reviews.llvm.org/D111186
1 parent 2ced9a4 commit 0658bab

File tree

4 files changed

+15
-30
lines changed

4 files changed

+15
-30
lines changed

llvm/lib/Analysis/ScalarEvolution.cpp

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6645,16 +6645,6 @@ bool ScalarEvolution::isGuaranteedToTransferExecutionTo(const Instruction *A,
66456645

66466646

66476647
bool ScalarEvolution::isSCEVExprNeverPoison(const Instruction *I) {
6648-
// Here we check that I is in the header of the innermost loop containing I,
6649-
// since we only deal with instructions in the loop header. The actual loop we
6650-
// need to check later will come from an add recurrence, but getting that
6651-
// requires computing the SCEV of the operands, which can be expensive. This
6652-
// check we can do cheaply to rule out some cases early.
6653-
Loop *InnermostContainingLoop = LI.getLoopFor(I->getParent());
6654-
if (InnermostContainingLoop == nullptr ||
6655-
InnermostContainingLoop->getHeader() != I->getParent())
6656-
return false;
6657-
66586648
// Only proceed if we can prove that I does not yield poison.
66596649
if (!programUndefinedIfPoison(I))
66606650
return false;

llvm/test/Analysis/DependenceAnalysis/Preliminary.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -623,7 +623,7 @@ entry:
623623

624624
; CHECK-LABEL: p9
625625
; CHECK: da analyze - none!
626-
; CHECK: da analyze - flow [|<]!
626+
; CHECK: da analyze - none!
627627
; CHECK: da analyze - confused!
628628
; CHECK: da analyze - none!
629629
; CHECK: da analyze - confused!

llvm/test/Analysis/ScalarEvolution/flags-from-poison.ll

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1628,9 +1628,9 @@ define noundef i32 @add-basic(i32 %a, i32 %b) {
16281628
; CHECK-LABEL: 'add-basic'
16291629
; CHECK-NEXT: Classifying expressions for: @add-basic
16301630
; CHECK-NEXT: %res = add nuw nsw i32 %a, %b
1631-
; CHECK-NEXT: --> (%a + %b) U: full-set S: full-set
1631+
; CHECK-NEXT: --> (%a + %b)<nuw><nsw> U: full-set S: full-set
16321632
; CHECK-NEXT: %res2 = udiv i32 255, %res
1633-
; CHECK-NEXT: --> (255 /u (%a + %b)) U: [0,256) S: [0,256)
1633+
; CHECK-NEXT: --> (255 /u (%a + %b)<nuw><nsw>) U: [0,256) S: [0,256)
16341634
; CHECK-NEXT: Determining loop execution counts for: @add-basic
16351635
;
16361636
%res = add nuw nsw i32 %a, %b
@@ -1656,9 +1656,9 @@ define noundef i32 @mul-basic(i32 %a, i32 %b) {
16561656
; CHECK-LABEL: 'mul-basic'
16571657
; CHECK-NEXT: Classifying expressions for: @mul-basic
16581658
; CHECK-NEXT: %res = mul nuw nsw i32 %a, %b
1659-
; CHECK-NEXT: --> (%a * %b) U: full-set S: full-set
1659+
; CHECK-NEXT: --> (%a * %b)<nuw><nsw> U: full-set S: full-set
16601660
; CHECK-NEXT: %res2 = udiv i32 255, %res
1661-
; CHECK-NEXT: --> (255 /u (%a * %b)) U: [0,256) S: [0,256)
1661+
; CHECK-NEXT: --> (255 /u (%a * %b)<nuw><nsw>) U: [0,256) S: [0,256)
16621662
; CHECK-NEXT: Determining loop execution counts for: @mul-basic
16631663
;
16641664
%res = mul nuw nsw i32 %a, %b

llvm/test/Transforms/SLPVectorizer/X86/consecutive-access.ll

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,6 @@ target triple = "x86_64-apple-macosx10.9.0"
88
@C = common global [2000 x float] zeroinitializer, align 16
99
@D = common global [2000 x float] zeroinitializer, align 16
1010

11-
; Currently SCEV isn't smart enough to figure out that accesses
12-
; A[3*i], A[3*i+1] and A[3*i+2] are consecutive, but in future
13-
; that would hopefully be fixed. For now, check that this isn't
14-
; vectorized.
1511
; Function Attrs: nounwind ssp uwtable
1612
define void @foo_3double(i32 %u) #0 {
1713
; CHECK-LABEL: @foo_3double(
@@ -21,26 +17,25 @@ define void @foo_3double(i32 %u) #0 {
2117
; CHECK-NEXT: [[MUL:%.*]] = mul nsw i32 [[U]], 3
2218
; CHECK-NEXT: [[IDXPROM:%.*]] = sext i32 [[MUL]] to i64
2319
; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [2000 x double], [2000 x double]* @A, i32 0, i64 [[IDXPROM]]
24-
; CHECK-NEXT: [[TMP0:%.*]] = load double, double* [[ARRAYIDX]], align 8
2520
; CHECK-NEXT: [[ARRAYIDX4:%.*]] = getelementptr inbounds [2000 x double], [2000 x double]* @B, i32 0, i64 [[IDXPROM]]
26-
; CHECK-NEXT: [[TMP1:%.*]] = load double, double* [[ARRAYIDX4]], align 8
27-
; CHECK-NEXT: [[ADD5:%.*]] = fadd double [[TMP0]], [[TMP1]]
28-
; CHECK-NEXT: store double [[ADD5]], double* [[ARRAYIDX]], align 8
2921
; CHECK-NEXT: [[ADD11:%.*]] = add nsw i32 [[MUL]], 1
3022
; CHECK-NEXT: [[IDXPROM12:%.*]] = sext i32 [[ADD11]] to i64
3123
; CHECK-NEXT: [[ARRAYIDX13:%.*]] = getelementptr inbounds [2000 x double], [2000 x double]* @A, i32 0, i64 [[IDXPROM12]]
32-
; CHECK-NEXT: [[TMP2:%.*]] = load double, double* [[ARRAYIDX13]], align 8
24+
; CHECK-NEXT: [[TMP0:%.*]] = bitcast double* [[ARRAYIDX]] to <2 x double>*
25+
; CHECK-NEXT: [[TMP1:%.*]] = load <2 x double>, <2 x double>* [[TMP0]], align 8
3326
; CHECK-NEXT: [[ARRAYIDX17:%.*]] = getelementptr inbounds [2000 x double], [2000 x double]* @B, i32 0, i64 [[IDXPROM12]]
34-
; CHECK-NEXT: [[TMP3:%.*]] = load double, double* [[ARRAYIDX17]], align 8
35-
; CHECK-NEXT: [[ADD18:%.*]] = fadd double [[TMP2]], [[TMP3]]
36-
; CHECK-NEXT: store double [[ADD18]], double* [[ARRAYIDX13]], align 8
27+
; CHECK-NEXT: [[TMP2:%.*]] = bitcast double* [[ARRAYIDX4]] to <2 x double>*
28+
; CHECK-NEXT: [[TMP3:%.*]] = load <2 x double>, <2 x double>* [[TMP2]], align 8
29+
; CHECK-NEXT: [[TMP4:%.*]] = fadd <2 x double> [[TMP1]], [[TMP3]]
30+
; CHECK-NEXT: [[TMP5:%.*]] = bitcast double* [[ARRAYIDX]] to <2 x double>*
31+
; CHECK-NEXT: store <2 x double> [[TMP4]], <2 x double>* [[TMP5]], align 8
3732
; CHECK-NEXT: [[ADD24:%.*]] = add nsw i32 [[MUL]], 2
3833
; CHECK-NEXT: [[IDXPROM25:%.*]] = sext i32 [[ADD24]] to i64
3934
; CHECK-NEXT: [[ARRAYIDX26:%.*]] = getelementptr inbounds [2000 x double], [2000 x double]* @A, i32 0, i64 [[IDXPROM25]]
40-
; CHECK-NEXT: [[TMP4:%.*]] = load double, double* [[ARRAYIDX26]], align 8
35+
; CHECK-NEXT: [[TMP6:%.*]] = load double, double* [[ARRAYIDX26]], align 8
4136
; CHECK-NEXT: [[ARRAYIDX30:%.*]] = getelementptr inbounds [2000 x double], [2000 x double]* @B, i32 0, i64 [[IDXPROM25]]
42-
; CHECK-NEXT: [[TMP5:%.*]] = load double, double* [[ARRAYIDX30]], align 8
43-
; CHECK-NEXT: [[ADD31:%.*]] = fadd double [[TMP4]], [[TMP5]]
37+
; CHECK-NEXT: [[TMP7:%.*]] = load double, double* [[ARRAYIDX30]], align 8
38+
; CHECK-NEXT: [[ADD31:%.*]] = fadd double [[TMP6]], [[TMP7]]
4439
; CHECK-NEXT: store double [[ADD31]], double* [[ARRAYIDX26]], align 8
4540
; CHECK-NEXT: ret void
4641
;

0 commit comments

Comments
 (0)