Skip to content

Commit

Permalink
[SCEV] Remove premature assert. PR46786
Browse files Browse the repository at this point in the history
This assert was added to verify assumption that GEP's SCEV will be of pointer type,
basing on fact that it should be a SCEVAddExpr with (at least) last operand being
pointer. Two notes:
- GEP's SCEV does not have to be a SCEVAddExpr after all simplifications;
- In current state, GEP's SCEV does not have to have at least one pointer operands
  (all of them can become int during the transforms).

However, we might want to be at a point where it is true. We are currently removing
this assert and will try to enumerate the cases where "is pointer" notion might be
lost during the transforms. When all of them are fixed, we can return it.

Differential Revision: https://reviews.llvm.org/D84294
Reviewed By: lebedev.ri

(cherry picked from commit b96114c)
  • Loading branch information
xortator authored and zmodem committed Jul 23, 2020
1 parent 2f1aff8 commit 9c48156
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 4 deletions.
5 changes: 1 addition & 4 deletions llvm/lib/Analysis/ScalarEvolution.cpp
Expand Up @@ -3317,10 +3317,7 @@ ScalarEvolution::getGEPExpr(GEPOperator *GEP,
}

// Add the total offset from all the GEP indices to the base.
auto *GEPExpr = getAddExpr(BaseExpr, TotalOffset, Wrap);
assert(BaseExpr->getType() == GEPExpr->getType() &&
"GEP should not change type mid-flight.");
return GEPExpr;
return getAddExpr(BaseExpr, TotalOffset, Wrap);
}

std::tuple<SCEV *, FoldingSetNodeID, void *>
Expand Down
37 changes: 37 additions & 0 deletions llvm/test/Analysis/ScalarEvolution/pr46786.ll
@@ -0,0 +1,37 @@
; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py
; RUN: opt < %s -analyze -enable-new-pm=0 -scalar-evolution | FileCheck %s
; RUN: opt < %s -disable-output "-passes=print<scalar-evolution>" 2>&1 | FileCheck %s

source_filename = "input.cpp"
target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128"

; Function Attrs: nofree
define i8* @FSE_decompress_usingDTable(i8* %arg, i32 %arg1, i32 %arg2, i32 %arg3) local_unnamed_addr #0 {
; CHECK-LABEL: 'FSE_decompress_usingDTable'
; CHECK-NEXT: Classifying expressions for: @FSE_decompress_usingDTable
; CHECK-NEXT: %i = getelementptr inbounds i8, i8* %arg, i32 %arg2
; CHECK-NEXT: --> (%arg2 + %arg)<nsw> U: full-set S: full-set
; CHECK-NEXT: %i4 = sub nsw i32 0, %arg1
; CHECK-NEXT: --> (-1 * %arg1) U: full-set S: full-set
; CHECK-NEXT: %i5 = getelementptr inbounds i8, i8* %i, i32 %i4
; CHECK-NEXT: --> ((-1 * %arg1) + %arg2 + %arg) U: full-set S: full-set
; CHECK-NEXT: %i7 = select i1 %i6, i32 %arg2, i32 %arg1
; CHECK-NEXT: --> ((-1 * %arg) + (((-1 * %arg1) + %arg2 + %arg) umin %arg) + %arg1) U: full-set S: full-set
; CHECK-NEXT: %i8 = sub i32 %arg3, %i7
; CHECK-NEXT: --> ((-1 * (((-1 * %arg1) + %arg2 + %arg) umin %arg)) + (-1 * %arg1) + %arg3 + %arg) U: full-set S: full-set
; CHECK-NEXT: %i9 = getelementptr inbounds i8, i8* %arg, i32 %i8
; CHECK-NEXT: --> ((2 * %arg) + (-1 * (((-1 * %arg1) + %arg2 + %arg) umin %arg)) + (-1 * %arg1) + %arg3) U: full-set S: full-set
; CHECK-NEXT: Determining loop execution counts for: @FSE_decompress_usingDTable
;
bb:
%i = getelementptr inbounds i8, i8* %arg, i32 %arg2
%i4 = sub nsw i32 0, %arg1
%i5 = getelementptr inbounds i8, i8* %i, i32 %i4
%i6 = icmp ult i8* %i5, %arg
%i7 = select i1 %i6, i32 %arg2, i32 %arg1
%i8 = sub i32 %arg3, %i7
%i9 = getelementptr inbounds i8, i8* %arg, i32 %i8
ret i8* %i9
}

attributes #0 = { nofree }

0 comments on commit 9c48156

Please sign in to comment.