mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 20:23:11 +01:00
948b602c7f
Summary: This fixes the memory leak in bec37c3fc766a7b97f8c52c181c325fd47b75259 and re-delivers the reverted patch. In this patch the DDG DAG is sorted topologically to put the nodes in the graph in the order that would satisfy all dependencies. This helps transformations that would like to generate code based on the DDG. Since the DDG is a DAG a reverse-post-order traversal would give us the topological ordering. This patch also sorts the basic blocks passed to the builder based on program order to ensure that the dependencies are computed in the correct direction. Authored By: bmahjour Reviewer: Meinersbur, fhahn, myhsu, xtian, dmgreen, kbarton, jdoerfert Reviewed By: Meinersbur Subscribers: ychen, arphaman, simoll, a.elovikov, mgorny, hiraditya, jfb, wuzish, llvm-commits, jsji, Whitney, etiotto, ppc-slack Tags: #llvm Differential Revision: https://reviews.llvm.org/D70609
50 lines
1.8 KiB
LLVM
50 lines
1.8 KiB
LLVM
; RUN: opt < %s -disable-output "-passes=print<ddg>" 2>&1 | FileCheck %s
|
|
|
|
; CHECK-LABEL: 'DDG' for loop 'test1.for.body':
|
|
|
|
; CHECK: Node Address:[[ROOT:0x[0-9a-f]*]]:root
|
|
; CHECK-NEXT: Edges:
|
|
; CHECK-NEXT: [rooted] to [[N1:0x[0-9a-f]*]]
|
|
; CHECK-NEXT: [rooted] to [[N2:0x[0-9a-f]*]]
|
|
|
|
; CHECK: Node Address:[[N2]]:pi-block
|
|
; CHECK: %i1.02 = phi i64 [ 0, %for.body.lr.ph ], [ %inc, %test1.for.body ]
|
|
|
|
; CHECK: Node Address:[[N1]]:pi-block
|
|
; CHECK: %i2.03 = phi i64 [ 0, %for.body.lr.ph ], [ %inc2, %test1.for.body ]
|
|
|
|
;; // Two separate components in the graph. Root node must link to both.
|
|
;; void test1(unsigned long n, float * restrict a, float * restrict b) {
|
|
;; for (unsigned long i1 = 0, i2 = 0; i1 < n; i1++, i2++) {
|
|
;; a[i1] = 1;
|
|
;; b[i2] = -1;
|
|
;; }
|
|
;; }
|
|
|
|
define void @test1(i64 %n, float* noalias %a, float* noalias %b) {
|
|
entry:
|
|
%cmp1 = icmp ult i64 0, %n
|
|
br i1 %cmp1, label %for.body.lr.ph, label %for.end
|
|
|
|
for.body.lr.ph: ; preds = %entry
|
|
br label %test1.for.body
|
|
|
|
test1.for.body: ; preds = %for.body.lr.ph, %test1.for.body
|
|
%i2.03 = phi i64 [ 0, %for.body.lr.ph ], [ %inc2, %test1.for.body ]
|
|
%i1.02 = phi i64 [ 0, %for.body.lr.ph ], [ %inc, %test1.for.body ]
|
|
%arrayidx = getelementptr inbounds float, float* %a, i64 %i1.02
|
|
store float 1.000000e+00, float* %arrayidx, align 4
|
|
%arrayidx1 = getelementptr inbounds float, float* %b, i64 %i2.03
|
|
store float -1.000000e+00, float* %arrayidx1, align 4
|
|
%inc = add i64 %i1.02, 1
|
|
%inc2 = add i64 %i2.03, 1
|
|
%cmp = icmp ult i64 %inc, %n
|
|
br i1 %cmp, label %test1.for.body, label %for.cond.for.end_crit_edge
|
|
|
|
for.cond.for.end_crit_edge: ; preds = %test1.for.body
|
|
br label %for.end
|
|
|
|
for.end: ; preds = %for.cond.for.end_crit_edge, %entry
|
|
ret void
|
|
}
|