Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[LSR] don't attempt to promote ephemeral values to indvars
Summary: This at least saves compile time. I also encountered a case where ephemeral values affect whether other variables are promoted, causing performance issues. It may be a bug in LSR, but I didn't manage to reduce it yet. Anyhow, I believe it's in general not worth considering ephemeral values in LSR. Reviewers: atrick, hfinkel Subscribers: llvm-commits Differential Revision: http://reviews.llvm.org/D11115 llvm-svn: 242011
- Loading branch information
Jingyue Wu
committed
Jul 13, 2015
1 parent
8dadce7
commit 9a92d4f
Showing
3 changed files
with
63 additions
and
2 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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
; RUN: opt < %s -loop-reduce -S | FileCheck %s | ||
|
||
target datalayout = "e-i64:64-v16:16-v32:32-n16:32:64" | ||
|
||
; for (int i = 0; i < n; ++i) { | ||
; use(i * 5 + 3); | ||
; // i * a + b is ephemeral and shouldn't be promoted by LSR | ||
; __builtin_assume(i * a + b >= 0); | ||
; } | ||
define void @ephemeral(i32 %a, i32 %b, i32 %n) { | ||
; CHECK-LABEL: @ephemeral( | ||
entry: | ||
br label %loop | ||
|
||
loop: | ||
%i = phi i32 [ 0, %entry ], [ %inc, %loop ] | ||
; Only i and i * 5 + 3 should be indvars, not i * a + b. | ||
; CHECK: phi i32 | ||
; CHECK: phi i32 | ||
; CHECK-NOT: phi i32 | ||
%inc = add nsw i32 %i, 1 | ||
%exitcond = icmp eq i32 %inc, %n | ||
|
||
%0 = mul nsw i32 %i, 5 | ||
%1 = add nsw i32 %0, 3 | ||
call void @use(i32 %1) | ||
|
||
%2 = mul nsw i32 %i, %a | ||
%3 = add nsw i32 %2, %b | ||
%4 = icmp sgt i32 %3, -1 | ||
call void @llvm.assume(i1 %4) | ||
|
||
br i1 %exitcond, label %exit, label %loop | ||
|
||
exit: | ||
ret void | ||
} | ||
|
||
declare void @use(i32) | ||
|
||
declare void @llvm.assume(i1) |