14a3c2ba8SDavid Blaikie; RUN: opt -aa-pipeline=basic-aa -passes=dot-ddg -dot-ddg-filename-prefix=%t < %s 2>&1 > /dev/null 24a3c2ba8SDavid Blaikie; RUN: FileCheck %s -input-file=%t.foo.for.body.dot 34a3c2ba8SDavid Blaikie; RUN: opt -aa-pipeline=basic-aa -passes=dot-ddg -dot-ddg-filename-prefix=%t -dot-ddg-only < %s 2>&1 > /dev/null 44a3c2ba8SDavid Blaikie; RUN: FileCheck %s -input-file=%t.foo.for.body.dot -check-prefix=CHECK-ONLY 5573d5782SBardia Mahjour 6573d5782SBardia Mahjourtarget datalayout = "e-m:e-i64:64-n32:64-v256:256:256-v512:512:512" 7573d5782SBardia Mahjour 8573d5782SBardia Mahjour; Test the dot graph printer for a non-trivial DDG graph generated from 9573d5782SBardia Mahjour; the following test case. In particular it tests that pi-blocks are 10573d5782SBardia Mahjour; printed properly and that multiple memory dependencies on a single edge 11573d5782SBardia Mahjour; are shown in the full dot graph. 12573d5782SBardia Mahjour; 13*7cf55817SMatt Arsenault; void foo(ptr restrict A, ptr restrict B, int n) { 14573d5782SBardia Mahjour; for (int i = 0; i < n; i++) { 15573d5782SBardia Mahjour; A[i] = A[i] + B[i]; 16573d5782SBardia Mahjour; B[i+1] = A[i] + 1; 17573d5782SBardia Mahjour; } 18573d5782SBardia Mahjour; } 19573d5782SBardia Mahjour 20573d5782SBardia Mahjour 21573d5782SBardia Mahjour; CHECK: digraph "DDG for 'foo.for.body'" 22573d5782SBardia Mahjour; CHECK-NEXT: label="DDG for 'foo.for.body'"; 23573d5782SBardia Mahjour; CHECK: {{Node0x.*}} [shape=record,label="{\<kind:root\>\nroot\n}"] 24573d5782SBardia Mahjour; CHECK: {{Node0x.*}} -> {{Node0x.*}}[label="[rooted]"] 25573d5782SBardia Mahjour; CHECK-COUNT-6: {{Node0x.*}} -> {{Node0x.*}}[label="[def-use]"] 26573d5782SBardia Mahjour; CHECK-NOT: {{Node0x.*}} -> {{Node0x.*}}[label="[def-use]"] 27*7cf55817SMatt Arsenault; CHECK: [shape=record,label="{\<kind:single-instruction\>\n %arrayidx10 = getelementptr inbounds float, ptr %B, i64 %indvars.iv.next\n}"]; 28*7cf55817SMatt Arsenault; CHECK: [shape=record,label="{\<kind:multi-instruction\>\n %arrayidx = getelementptr inbounds float, ptr %A, i64 %indvars.iv\n %0 = load float, ptr %arrayidx, align 4\n}"]; 29573d5782SBardia Mahjour; CHECK: {{Node0x.*}} -> {{Node0x.*}}[label="[consistent anti [0|<]!, consistent input [0|<]!]"] 30*7cf55817SMatt Arsenault; CHECK: [shape=record,label="{\<kind:pi-block\>\n--- start of nodes in pi-block ---\n\<kind:single-instruction\>\n %1 = load float, ptr %arrayidx2, align 4\n\n\<kind:single-instruction\>\n %add = fadd fast float %0, %1\n\n\<kind:single-instruction\>\n store float %add, ptr %arrayidx4, align 4\n\n\<kind:multi-instruction\>\n %2 = load float, ptr %arrayidx6, align 4\n %add7 = fadd fast float %2, 1.000000e+00\n\n\<kind:single-instruction\>\n store float %add7, ptr %arrayidx10, align 4\n--- end of nodes in pi-block ---\n}"]; 31573d5782SBardia Mahjour 32573d5782SBardia Mahjour; CHECK-ONLY: digraph "DDG for 'foo.for.body'" 33573d5782SBardia Mahjour; CHECK-ONLY-NEXT: label="DDG for 'foo.for.body'"; 34573d5782SBardia Mahjour; CHECK-ONLY: [shape=record,label="{pi-block\nwith\n2 nodes\n}"]; 35573d5782SBardia Mahjour; CHECK-ONLY-COUNT-6: {{Node0x.*}} -> {{Node0x.*}}[label="[def-use]"]; 36573d5782SBardia Mahjour; CHECK-NOT: {{Node0x.*}} -> {{Node0x.*}}[label="[def-use]"]; 37*7cf55817SMatt Arsenault; CHECK-ONLY: [shape=record,label="{ %arrayidx10 = getelementptr inbounds float, ptr %B, i64 %indvars.iv.next\n}"]; 38*7cf55817SMatt Arsenault; CHECK-ONLY: [shape=record,label="{ %arrayidx = getelementptr inbounds float, ptr %A, i64 %indvars.iv\n %0 = load float, ptr %arrayidx, align 4\n}"]; 39573d5782SBardia Mahjour; CHECK-ONLY: {{Node0x.*}} -> {{Node0x.*}}[label="[memory]"] 40573d5782SBardia Mahjour; CHECK-ONLY: [shape=record,label="{pi-block\nwith\n5 nodes\n}"]; 41573d5782SBardia Mahjour 42*7cf55817SMatt Arsenaultdefine void @foo(ptr noalias %A, ptr noalias %B, i32 signext %n) { 43573d5782SBardia Mahjourentry: 44573d5782SBardia Mahjour %cmp1 = icmp sgt i32 %n, 0 45573d5782SBardia Mahjour br i1 %cmp1, label %for.body.preheader, label %for.end 46573d5782SBardia Mahjour 47573d5782SBardia Mahjourfor.body.preheader: ; preds = %entry 48573d5782SBardia Mahjour %wide.trip.count = zext i32 %n to i64 49573d5782SBardia Mahjour br label %for.body 50573d5782SBardia Mahjour 51573d5782SBardia Mahjourfor.body: ; preds = %for.body.preheader, %for.body 52573d5782SBardia Mahjour %indvars.iv = phi i64 [ 0, %for.body.preheader ], [ %indvars.iv.next, %for.body ] 53*7cf55817SMatt Arsenault %arrayidx = getelementptr inbounds float, ptr %A, i64 %indvars.iv 54*7cf55817SMatt Arsenault %0 = load float, ptr %arrayidx, align 4 55*7cf55817SMatt Arsenault %arrayidx2 = getelementptr inbounds float, ptr %B, i64 %indvars.iv 56*7cf55817SMatt Arsenault %1 = load float, ptr %arrayidx2, align 4 57573d5782SBardia Mahjour %add = fadd fast float %0, %1 58*7cf55817SMatt Arsenault %arrayidx4 = getelementptr inbounds float, ptr %A, i64 %indvars.iv 59*7cf55817SMatt Arsenault store float %add, ptr %arrayidx4, align 4 60*7cf55817SMatt Arsenault %arrayidx6 = getelementptr inbounds float, ptr %A, i64 %indvars.iv 61*7cf55817SMatt Arsenault %2 = load float, ptr %arrayidx6, align 4 62573d5782SBardia Mahjour %add7 = fadd fast float %2, 1.000000e+00 63573d5782SBardia Mahjour %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 64*7cf55817SMatt Arsenault %arrayidx10 = getelementptr inbounds float, ptr %B, i64 %indvars.iv.next 65*7cf55817SMatt Arsenault store float %add7, ptr %arrayidx10, align 4 66573d5782SBardia Mahjour %exitcond = icmp ne i64 %indvars.iv.next, %wide.trip.count 67573d5782SBardia Mahjour br i1 %exitcond, label %for.body, label %for.end.loopexit 68573d5782SBardia Mahjour 69573d5782SBardia Mahjourfor.end.loopexit: ; preds = %for.body 70573d5782SBardia Mahjour br label %for.end 71573d5782SBardia Mahjour 72573d5782SBardia Mahjourfor.end: ; preds = %for.end.loopexit, %entry 73573d5782SBardia Mahjour ret void 74573d5782SBardia Mahjour} 75