mirror of
https://github.com/RPCS3/llvm.git
synced 2025-05-17 19:06:09 +00:00

This enables da-delinearize in Dependence Analysis for delinearizing array accesses into multiple dimensions. This can help to increase the power of Dependence analysis on multi-dimensional arrays and prevent having to fall back to the slower and less accurate MIV tests. It adds static checks on the bounds of the arrays to ensure that one dimension doesn't overflow into another, and brings our code in line with our tests. Differential Revision: https://reviews.llvm.org/D45872 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@335217 91177308-0d34-0410-b5e6-96231b3b80d8
303 lines
13 KiB
LLVM
303 lines
13 KiB
LLVM
; RUN: opt < %s -analyze -basicaa -da | FileCheck %s
|
|
|
|
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
|
|
target triple = "x86_64-apple-macosx10.6.0"
|
|
|
|
|
|
;; for (long int i = 0; i < 50; i++)
|
|
;; for (long int j = 0; j < 50; j++)
|
|
;; for (long int k = 0; k < 50; k++)
|
|
;; for (long int l = 0; l < 50; l++) {
|
|
;; A[n][i][j + k] = i;
|
|
;; *B++ = A[10][i + 10][2*j - l];
|
|
|
|
define void @sep0([100 x [100 x i32]]* %A, i32* %B, i32 %n) nounwind uwtable ssp {
|
|
entry:
|
|
br label %for.cond1.preheader
|
|
|
|
; CHECK: da analyze - output [= * * S]!
|
|
; CHECK: da analyze - flow [* * * *|<]!
|
|
; CHECK: da analyze - confused!
|
|
; CHECK: da analyze - input [* * S *]!
|
|
; CHECK: da analyze - confused!
|
|
; CHECK: da analyze - none!
|
|
|
|
for.cond1.preheader: ; preds = %entry, %for.inc22
|
|
%B.addr.08 = phi i32* [ %B, %entry ], [ %scevgep11, %for.inc22 ]
|
|
%i.07 = phi i64 [ 0, %entry ], [ %inc23, %for.inc22 ]
|
|
br label %for.cond4.preheader
|
|
|
|
for.cond4.preheader: ; preds = %for.cond1.preheader, %for.inc19
|
|
%B.addr.16 = phi i32* [ %B.addr.08, %for.cond1.preheader ], [ %scevgep9, %for.inc19 ]
|
|
%j.05 = phi i64 [ 0, %for.cond1.preheader ], [ %inc20, %for.inc19 ]
|
|
br label %for.cond7.preheader
|
|
|
|
for.cond7.preheader: ; preds = %for.cond4.preheader, %for.inc16
|
|
%B.addr.24 = phi i32* [ %B.addr.16, %for.cond4.preheader ], [ %scevgep, %for.inc16 ]
|
|
%k.03 = phi i64 [ 0, %for.cond4.preheader ], [ %inc17, %for.inc16 ]
|
|
br label %for.body9
|
|
|
|
for.body9: ; preds = %for.cond7.preheader, %for.body9
|
|
%l.02 = phi i64 [ 0, %for.cond7.preheader ], [ %inc, %for.body9 ]
|
|
%B.addr.31 = phi i32* [ %B.addr.24, %for.cond7.preheader ], [ %incdec.ptr, %for.body9 ]
|
|
%conv = trunc i64 %i.07 to i32
|
|
%add = add nsw i64 %j.05, %k.03
|
|
%idxprom = sext i32 %n to i64
|
|
%arrayidx11 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* %A, i64 %idxprom, i64 %i.07, i64 %add
|
|
store i32 %conv, i32* %arrayidx11, align 4
|
|
%mul = shl nsw i64 %j.05, 1
|
|
%sub = sub nsw i64 %mul, %l.02
|
|
%add12 = add nsw i64 %i.07, 10
|
|
%arrayidx15 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* %A, i64 10, i64 %add12, i64 %sub
|
|
%0 = load i32, i32* %arrayidx15, align 4
|
|
%incdec.ptr = getelementptr inbounds i32, i32* %B.addr.31, i64 1
|
|
store i32 %0, i32* %B.addr.31, align 4
|
|
%inc = add nsw i64 %l.02, 1
|
|
%exitcond = icmp ne i64 %inc, 50
|
|
br i1 %exitcond, label %for.body9, label %for.inc16
|
|
|
|
for.inc16: ; preds = %for.body9
|
|
%scevgep = getelementptr i32, i32* %B.addr.24, i64 50
|
|
%inc17 = add nsw i64 %k.03, 1
|
|
%exitcond10 = icmp ne i64 %inc17, 50
|
|
br i1 %exitcond10, label %for.cond7.preheader, label %for.inc19
|
|
|
|
for.inc19: ; preds = %for.inc16
|
|
%scevgep9 = getelementptr i32, i32* %B.addr.16, i64 2500
|
|
%inc20 = add nsw i64 %j.05, 1
|
|
%exitcond12 = icmp ne i64 %inc20, 50
|
|
br i1 %exitcond12, label %for.cond4.preheader, label %for.inc22
|
|
|
|
for.inc22: ; preds = %for.inc19
|
|
%scevgep11 = getelementptr i32, i32* %B.addr.08, i64 125000
|
|
%inc23 = add nsw i64 %i.07, 1
|
|
%exitcond13 = icmp ne i64 %inc23, 50
|
|
br i1 %exitcond13, label %for.cond1.preheader, label %for.end24
|
|
|
|
for.end24: ; preds = %for.inc22
|
|
ret void
|
|
}
|
|
|
|
|
|
;; for (long int i = 0; i < 50; i++)
|
|
;; for (long int j = 0; j < 50; j++)
|
|
;; for (long int k = 0; k < 50; k++)
|
|
;; for (long int l = 0; l < 50; l++) {
|
|
;; A[i][i][j + k] = i;
|
|
;; *B++ = A[10][i + 10][2*j - l];
|
|
|
|
define void @sep1([100 x [100 x i32]]* %A, i32* %B, i32 %n) nounwind uwtable ssp {
|
|
entry:
|
|
br label %for.cond1.preheader
|
|
|
|
; CHECK: da analyze - output [= * * S]!
|
|
; CHECK: da analyze - flow [* * * *|<]!
|
|
; CHECK: da analyze - confused!
|
|
; CHECK: da analyze - input [* * S *]!
|
|
; CHECK: da analyze - confused!
|
|
; CHECK: da analyze - none!
|
|
|
|
for.cond1.preheader: ; preds = %entry, %for.inc22
|
|
%B.addr.08 = phi i32* [ %B, %entry ], [ %scevgep11, %for.inc22 ]
|
|
%i.07 = phi i64 [ 0, %entry ], [ %inc23, %for.inc22 ]
|
|
br label %for.cond4.preheader
|
|
|
|
for.cond4.preheader: ; preds = %for.cond1.preheader, %for.inc19
|
|
%B.addr.16 = phi i32* [ %B.addr.08, %for.cond1.preheader ], [ %scevgep9, %for.inc19 ]
|
|
%j.05 = phi i64 [ 0, %for.cond1.preheader ], [ %inc20, %for.inc19 ]
|
|
br label %for.cond7.preheader
|
|
|
|
for.cond7.preheader: ; preds = %for.cond4.preheader, %for.inc16
|
|
%B.addr.24 = phi i32* [ %B.addr.16, %for.cond4.preheader ], [ %scevgep, %for.inc16 ]
|
|
%k.03 = phi i64 [ 0, %for.cond4.preheader ], [ %inc17, %for.inc16 ]
|
|
br label %for.body9
|
|
|
|
for.body9: ; preds = %for.cond7.preheader, %for.body9
|
|
%l.02 = phi i64 [ 0, %for.cond7.preheader ], [ %inc, %for.body9 ]
|
|
%B.addr.31 = phi i32* [ %B.addr.24, %for.cond7.preheader ], [ %incdec.ptr, %for.body9 ]
|
|
%conv = trunc i64 %i.07 to i32
|
|
%add = add nsw i64 %j.05, %k.03
|
|
%arrayidx11 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* %A, i64 %i.07, i64 %i.07, i64 %add
|
|
store i32 %conv, i32* %arrayidx11, align 4
|
|
%mul = shl nsw i64 %j.05, 1
|
|
%sub = sub nsw i64 %mul, %l.02
|
|
%add12 = add nsw i64 %i.07, 10
|
|
%arrayidx15 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* %A, i64 10, i64 %add12, i64 %sub
|
|
%0 = load i32, i32* %arrayidx15, align 4
|
|
%incdec.ptr = getelementptr inbounds i32, i32* %B.addr.31, i64 1
|
|
store i32 %0, i32* %B.addr.31, align 4
|
|
%inc = add nsw i64 %l.02, 1
|
|
%exitcond = icmp ne i64 %inc, 50
|
|
br i1 %exitcond, label %for.body9, label %for.inc16
|
|
|
|
for.inc16: ; preds = %for.body9
|
|
%scevgep = getelementptr i32, i32* %B.addr.24, i64 50
|
|
%inc17 = add nsw i64 %k.03, 1
|
|
%exitcond10 = icmp ne i64 %inc17, 50
|
|
br i1 %exitcond10, label %for.cond7.preheader, label %for.inc19
|
|
|
|
for.inc19: ; preds = %for.inc16
|
|
%scevgep9 = getelementptr i32, i32* %B.addr.16, i64 2500
|
|
%inc20 = add nsw i64 %j.05, 1
|
|
%exitcond12 = icmp ne i64 %inc20, 50
|
|
br i1 %exitcond12, label %for.cond4.preheader, label %for.inc22
|
|
|
|
for.inc22: ; preds = %for.inc19
|
|
%scevgep11 = getelementptr i32, i32* %B.addr.08, i64 125000
|
|
%inc23 = add nsw i64 %i.07, 1
|
|
%exitcond13 = icmp ne i64 %inc23, 50
|
|
br i1 %exitcond13, label %for.cond1.preheader, label %for.end24
|
|
|
|
for.end24: ; preds = %for.inc22
|
|
ret void
|
|
}
|
|
|
|
|
|
;; for (long int i = 0; i < 50; i++)
|
|
;; for (long int j = 0; j < 50; j++)
|
|
;; for (long int k = 0; k < 50; k++)
|
|
;; for (long int l = 0; l < 50; l++) {
|
|
;; A[i][i][i + k][l] = i;
|
|
;; *B++ = A[10][i + 10][j + k][l + 10];
|
|
|
|
define void @sep2([100 x [100 x [100 x i32]]]* %A, i32* %B, i32 %n) nounwind uwtable ssp {
|
|
entry:
|
|
br label %for.cond1.preheader
|
|
|
|
; CHECK: da analyze - output [= S = =]!
|
|
; CHECK: da analyze - flow [* * * <>]!
|
|
; CHECK: da analyze - confused!
|
|
; CHECK: da analyze - input [= * * *]!
|
|
; CHECK: da analyze - confused!
|
|
; CHECK: da analyze - none!
|
|
|
|
for.cond1.preheader: ; preds = %entry, %for.inc26
|
|
%B.addr.08 = phi i32* [ %B, %entry ], [ %scevgep11, %for.inc26 ]
|
|
%i.07 = phi i64 [ 0, %entry ], [ %inc27, %for.inc26 ]
|
|
br label %for.cond4.preheader
|
|
|
|
for.cond4.preheader: ; preds = %for.cond1.preheader, %for.inc23
|
|
%B.addr.16 = phi i32* [ %B.addr.08, %for.cond1.preheader ], [ %scevgep9, %for.inc23 ]
|
|
%j.05 = phi i64 [ 0, %for.cond1.preheader ], [ %inc24, %for.inc23 ]
|
|
br label %for.cond7.preheader
|
|
|
|
for.cond7.preheader: ; preds = %for.cond4.preheader, %for.inc20
|
|
%B.addr.24 = phi i32* [ %B.addr.16, %for.cond4.preheader ], [ %scevgep, %for.inc20 ]
|
|
%k.03 = phi i64 [ 0, %for.cond4.preheader ], [ %inc21, %for.inc20 ]
|
|
br label %for.body9
|
|
|
|
for.body9: ; preds = %for.cond7.preheader, %for.body9
|
|
%l.02 = phi i64 [ 0, %for.cond7.preheader ], [ %inc, %for.body9 ]
|
|
%B.addr.31 = phi i32* [ %B.addr.24, %for.cond7.preheader ], [ %incdec.ptr, %for.body9 ]
|
|
%conv = trunc i64 %i.07 to i32
|
|
%add = add nsw i64 %i.07, %k.03
|
|
%arrayidx12 = getelementptr inbounds [100 x [100 x [100 x i32]]], [100 x [100 x [100 x i32]]]* %A, i64 %i.07, i64 %i.07, i64 %add, i64 %l.02
|
|
store i32 %conv, i32* %arrayidx12, align 4
|
|
%add13 = add nsw i64 %l.02, 10
|
|
%add14 = add nsw i64 %j.05, %k.03
|
|
%add15 = add nsw i64 %i.07, 10
|
|
%arrayidx19 = getelementptr inbounds [100 x [100 x [100 x i32]]], [100 x [100 x [100 x i32]]]* %A, i64 10, i64 %add15, i64 %add14, i64 %add13
|
|
%0 = load i32, i32* %arrayidx19, align 4
|
|
%incdec.ptr = getelementptr inbounds i32, i32* %B.addr.31, i64 1
|
|
store i32 %0, i32* %B.addr.31, align 4
|
|
%inc = add nsw i64 %l.02, 1
|
|
%exitcond = icmp ne i64 %inc, 50
|
|
br i1 %exitcond, label %for.body9, label %for.inc20
|
|
|
|
for.inc20: ; preds = %for.body9
|
|
%scevgep = getelementptr i32, i32* %B.addr.24, i64 50
|
|
%inc21 = add nsw i64 %k.03, 1
|
|
%exitcond10 = icmp ne i64 %inc21, 50
|
|
br i1 %exitcond10, label %for.cond7.preheader, label %for.inc23
|
|
|
|
for.inc23: ; preds = %for.inc20
|
|
%scevgep9 = getelementptr i32, i32* %B.addr.16, i64 2500
|
|
%inc24 = add nsw i64 %j.05, 1
|
|
%exitcond12 = icmp ne i64 %inc24, 50
|
|
br i1 %exitcond12, label %for.cond4.preheader, label %for.inc26
|
|
|
|
for.inc26: ; preds = %for.inc23
|
|
%scevgep11 = getelementptr i32, i32* %B.addr.08, i64 125000
|
|
%inc27 = add nsw i64 %i.07, 1
|
|
%exitcond13 = icmp ne i64 %inc27, 50
|
|
br i1 %exitcond13, label %for.cond1.preheader, label %for.end28
|
|
|
|
for.end28: ; preds = %for.inc26
|
|
ret void
|
|
}
|
|
|
|
|
|
;; for (long int i = 0; i < 50; i++)
|
|
;; for (long int j = 0; j < 50; j++)
|
|
;; for (long int k = 0; k < 50; k++)
|
|
;; for (long int l = 0; l < 50; l++) {
|
|
;; A[i][i][i + k][l + k] = i;
|
|
;; *B++ = A[10][i + 10][j + k][l + 10];
|
|
|
|
define void @sep3([100 x [100 x [100 x i32]]]* %A, i32* %B, i32 %n) nounwind uwtable ssp {
|
|
entry:
|
|
br label %for.cond1.preheader
|
|
|
|
; CHECK: da analyze - output [= S = =]!
|
|
; CHECK: da analyze - flow [* * * *|<]!
|
|
; CHECK: da analyze - confused!
|
|
; CHECK: da analyze - input [= * * *]!
|
|
; CHECK: da analyze - confused!
|
|
; CHECK: da analyze - none!
|
|
|
|
for.cond1.preheader: ; preds = %entry, %for.inc27
|
|
%B.addr.08 = phi i32* [ %B, %entry ], [ %scevgep11, %for.inc27 ]
|
|
%i.07 = phi i64 [ 0, %entry ], [ %inc28, %for.inc27 ]
|
|
br label %for.cond4.preheader
|
|
|
|
for.cond4.preheader: ; preds = %for.cond1.preheader, %for.inc24
|
|
%B.addr.16 = phi i32* [ %B.addr.08, %for.cond1.preheader ], [ %scevgep9, %for.inc24 ]
|
|
%j.05 = phi i64 [ 0, %for.cond1.preheader ], [ %inc25, %for.inc24 ]
|
|
br label %for.cond7.preheader
|
|
|
|
for.cond7.preheader: ; preds = %for.cond4.preheader, %for.inc21
|
|
%B.addr.24 = phi i32* [ %B.addr.16, %for.cond4.preheader ], [ %scevgep, %for.inc21 ]
|
|
%k.03 = phi i64 [ 0, %for.cond4.preheader ], [ %inc22, %for.inc21 ]
|
|
br label %for.body9
|
|
|
|
for.body9: ; preds = %for.cond7.preheader, %for.body9
|
|
%l.02 = phi i64 [ 0, %for.cond7.preheader ], [ %inc, %for.body9 ]
|
|
%B.addr.31 = phi i32* [ %B.addr.24, %for.cond7.preheader ], [ %incdec.ptr, %for.body9 ]
|
|
%conv = trunc i64 %i.07 to i32
|
|
%add = add nsw i64 %l.02, %k.03
|
|
%add10 = add nsw i64 %i.07, %k.03
|
|
%arrayidx13 = getelementptr inbounds [100 x [100 x [100 x i32]]], [100 x [100 x [100 x i32]]]* %A, i64 %i.07, i64 %i.07, i64 %add10, i64 %add
|
|
store i32 %conv, i32* %arrayidx13, align 4
|
|
%add14 = add nsw i64 %l.02, 10
|
|
%add15 = add nsw i64 %j.05, %k.03
|
|
%add16 = add nsw i64 %i.07, 10
|
|
%arrayidx20 = getelementptr inbounds [100 x [100 x [100 x i32]]], [100 x [100 x [100 x i32]]]* %A, i64 10, i64 %add16, i64 %add15, i64 %add14
|
|
%0 = load i32, i32* %arrayidx20, align 4
|
|
%incdec.ptr = getelementptr inbounds i32, i32* %B.addr.31, i64 1
|
|
store i32 %0, i32* %B.addr.31, align 4
|
|
%inc = add nsw i64 %l.02, 1
|
|
%exitcond = icmp ne i64 %inc, 50
|
|
br i1 %exitcond, label %for.body9, label %for.inc21
|
|
|
|
for.inc21: ; preds = %for.body9
|
|
%scevgep = getelementptr i32, i32* %B.addr.24, i64 50
|
|
%inc22 = add nsw i64 %k.03, 1
|
|
%exitcond10 = icmp ne i64 %inc22, 50
|
|
br i1 %exitcond10, label %for.cond7.preheader, label %for.inc24
|
|
|
|
for.inc24: ; preds = %for.inc21
|
|
%scevgep9 = getelementptr i32, i32* %B.addr.16, i64 2500
|
|
%inc25 = add nsw i64 %j.05, 1
|
|
%exitcond12 = icmp ne i64 %inc25, 50
|
|
br i1 %exitcond12, label %for.cond4.preheader, label %for.inc27
|
|
|
|
for.inc27: ; preds = %for.inc24
|
|
%scevgep11 = getelementptr i32, i32* %B.addr.08, i64 125000
|
|
%inc28 = add nsw i64 %i.07, 1
|
|
%exitcond13 = icmp ne i64 %inc28, 50
|
|
br i1 %exitcond13, label %for.cond1.preheader, label %for.end29
|
|
|
|
for.end29: ; preds = %for.inc27
|
|
ret void
|
|
}
|