-
Notifications
You must be signed in to change notification settings - Fork 11k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add some shortcuts in LazyValueInfo to reduce compile time of Correla…
…ted Value Propagation. The patch is to partially fix PR10584. Correlated Value Propagation queries LVI to check non-null for pointer params of each callsite. If we know the def of param is an alloca instruction, we know it is non-null and can return early from LVI. Similarly, CVP queries LVI to check whether pointer for each mem access is constant. If the def of the pointer is an alloca instruction, we know it is not a constant pointer. These shortcuts can reduce the cost of CVP significantly. Differential Revision: https://reviews.llvm.org/D18066 llvm-svn: 281586
- Loading branch information
Showing
2 changed files
with
77 additions
and
0 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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,48 @@ | ||
; RUN: opt -S -correlated-propagation -debug-only=lazy-value-info <%s 2>&1 | FileCheck %s | ||
; | ||
; Shortcut in Correlated Value Propagation ensures not to take Lazy Value Info | ||
; analysis for %a.i and %tmp because %a.i is defined by alloca and %tmp is | ||
; defined by alloca + bitcast. We know the ret value of alloca is nonnull. | ||
; | ||
; CHECK-NOT: LVI Getting edge value %a.i = alloca i64, align 8 at 'for.body' | ||
; CHECK-NOT: LVI Getting edge value %tmp = bitcast i64* %a.i to i8* from 'for.cond' to 'for.body' | ||
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" | ||
target triple = "x86_64-unknown-linux-gnu" | ||
|
||
@.str = private unnamed_addr constant [8 x i8] c"a = %l\0A\00", align 1 | ||
|
||
; Function Attrs: argmemonly nounwind | ||
declare void @llvm.lifetime.start(i64, i8* nocapture) | ||
|
||
declare void @hoo(i64*) | ||
|
||
declare i32 @printf(i8* nocapture readonly, ...) | ||
|
||
; Function Attrs: argmemonly nounwind | ||
declare void @llvm.lifetime.end(i64, i8* nocapture) | ||
|
||
define void @goo(i32 %N, i64* %b) { | ||
entry: | ||
%a.i = alloca i64, align 8 | ||
%tmp = bitcast i64* %a.i to i8* | ||
%c = getelementptr inbounds i64, i64* %b, i64 0 | ||
br label %for.cond | ||
|
||
for.cond: ; preds = %for.body, %entry | ||
%i.0 = phi i32 [ 0, %entry ], [ %inc, %for.body ] | ||
%cmp = icmp slt i32 %i.0, %N | ||
br i1 %cmp, label %for.body, label %for.end | ||
|
||
for.body: ; preds = %for.cond | ||
call void @llvm.lifetime.start(i64 8, i8* %tmp) | ||
call void @hoo(i64* %a.i) | ||
call void @hoo(i64* %c) | ||
%tmp1 = load volatile i64, i64* %a.i, align 8 | ||
%call.i = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str, i64 0, i64 0), i64 %tmp1) | ||
call void @llvm.lifetime.end(i64 8, i8* %tmp) | ||
%inc = add nsw i32 %i.0, 1 | ||
br label %for.cond | ||
|
||
for.end: ; preds = %for.cond | ||
ret void | ||
} |