Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[SCEV] Try to reuse existing value during SCEV expansion
Current SCEV expansion will expand SCEV as a sequence of operations and doesn't utilize the value already existed. This will introduce redundent computation which may not be cleaned up throughly by following optimizations. This patch introduces an ExprValueMap which is a map from SCEV to the set of equal values with the same SCEV. When a SCEV is expanded, the set of values is checked and reused whenever possible before generating a sequence of operations. Differential Revision: http://reviews.llvm.org/D12090 llvm-svn: 259662
- Loading branch information
Showing
12 changed files
with
205 additions
and
30 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
38 changes: 38 additions & 0 deletions
38
llvm/test/Analysis/ScalarEvolution/scev-expander-existing-value.ll
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
; RUN: opt < %s -loop-vectorize -force-vector-width=4 -verify-scev-maps -S |FileCheck %s | ||
|
||
; SCEV expansion uses existing value when the SCEV has no AddRec expr. | ||
; CHECK: select | ||
; CHECK-NOT: select | ||
|
||
@a = common global [1000 x i16] zeroinitializer, align 16 | ||
|
||
define i32 @foo(i32 %x, i32 %y) { | ||
entry: | ||
%cmp = icmp slt i32 %x, %y | ||
%cond = select i1 %cmp, i32 %x, i32 %y | ||
%cmp1.10 = icmp sgt i32 %cond, 0 | ||
br i1 %cmp1.10, label %for.body.lr.ph, label %for.end | ||
|
||
for.body.lr.ph: ; preds = %entry | ||
%tmp = sext i32 %cond to i64 | ||
br label %for.body | ||
|
||
for.body: ; preds = %for.body, %for.body.lr.ph | ||
%indvars.iv = phi i64 [ 0, %for.body.lr.ph ], [ %indvars.iv.next, %for.body ] | ||
%total.011 = phi i32 [ 0, %for.body.lr.ph ], [ %add, %for.body ] | ||
%arrayidx = getelementptr inbounds [1000 x i16], [1000 x i16]* @a, i64 0, i64 %indvars.iv | ||
%tmp1 = load i16, i16* %arrayidx, align 2 | ||
%conv = sext i16 %tmp1 to i32 | ||
%add = add nsw i32 %conv, %total.011 | ||
%indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 | ||
%cmp1 = icmp slt i64 %indvars.iv.next, %tmp | ||
br i1 %cmp1, label %for.body, label %for.end.loopexit | ||
|
||
for.end.loopexit: ; preds = %for.body | ||
%add.lcssa = phi i32 [ %add, %for.body ] | ||
br label %for.end | ||
|
||
for.end: ; preds = %for.end.loopexit, %entry | ||
%total.0.lcssa = phi i32 [ 0, %entry ], [ %add.lcssa, %for.end.loopexit ] | ||
ret i32 %total.0.lcssa | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.