Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[DA] Improve dump to show source and sink of the dependence
Summary: The current da printer shows the dependence without indicating which instructions are being considered as the src vs dst. It also silently ignores call instructions, despite the fact that they create confused dependence edges to other memory instructions. This patch addresses these two issues plus a couple of minor non-functional improvements. Authored By: bmahjour Reviewer: dmgreen, fhahn, philip.pfaffe, chandlerc Reviewed By: dmgreen, fhahn Tags: #llvm Differential Revision: https://reviews.llvm.org/D71088
- Loading branch information
Showing
2 changed files
with
57 additions
and
10 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,50 @@ | ||
; RUN: opt < %s -disable-output "-passes=print<da>" -aa-pipeline=basic-aa 2>&1 \ | ||
; RUN: | FileCheck %s | ||
|
||
;; Test to make sure the dump shows the src and dst | ||
;; instructions (including call instructions). | ||
;; | ||
;; void bar(float * restrict A); | ||
;; void foo(float * restrict A, int n) { | ||
;; for (int i = 0; i < n; i++) { | ||
;; A[i] = i; | ||
;; bar(A); | ||
;; } | ||
;; } | ||
|
||
; CHECK-LABEL: foo | ||
|
||
; CHECK: Src: store float %conv, float* %arrayidx, align 4 --> Dst: store float %conv, float* %arrayidx, align 4 | ||
; CHECK-NEXT: da analyze - none! | ||
; CHECK-NEXT: Src: store float %conv, float* %arrayidx, align 4 --> Dst: call void @bar(float* %A) | ||
; CHECK-NEXT: da analyze - confused! | ||
; CHECK-NEXT: Src: call void @bar(float* %A) --> Dst: call void @bar(float* %A) | ||
; CHECK-NEXT: da analyze - confused! | ||
|
||
define void @foo(float* noalias %A, i32 signext %n) { | ||
entry: | ||
%cmp1 = icmp slt i32 0, %n | ||
br i1 %cmp1, label %for.body.lr.ph, label %for.end | ||
|
||
for.body.lr.ph: ; preds = %entry | ||
br label %for.body | ||
|
||
for.body: ; preds = %for.body.lr.ph, %for.body | ||
%i.02 = phi i32 [ 0, %for.body.lr.ph ], [ %inc, %for.body ] | ||
%conv = sitofp i32 %i.02 to float | ||
%idxprom = zext i32 %i.02 to i64 | ||
%arrayidx = getelementptr inbounds float, float* %A, i64 %idxprom | ||
store float %conv, float* %arrayidx, align 4 | ||
call void @bar(float* %A) #3 | ||
%inc = add nuw nsw i32 %i.02, 1 | ||
%cmp = icmp slt i32 %inc, %n | ||
br i1 %cmp, label %for.body, label %for.cond.for.end_crit_edge | ||
|
||
for.cond.for.end_crit_edge: ; preds = %for.body | ||
br label %for.end | ||
|
||
for.end: ; preds = %for.cond.for.end_crit_edge, %entry | ||
ret void | ||
} | ||
|
||
declare void @bar(float*) |