[llvm] MachineTraceMetrics: add test for depth, height calculation (PR #73324)

Ramkumar Ramachandra via llvm-commits llvm-commits at lists.llvm.org
Fri Nov 24 04:54:48 PST 2023


https://github.com/artagnon created https://github.com/llvm/llvm-project/pull/73324

MTM's depth and height calculation is untested, and wrong in several places that involve PHIs or load-stores. Add a test under the RISC-V target to document this behavior. A follow-up could potentially fix the calculation in MTM.

>From 7da7fa262383efa7171d85de8301d1954e4b67b6 Mon Sep 17 00:00:00 2001
From: Ramkumar Ramachandra <Ramkumar.Ramachandra at imgtec.com>
Date: Fri, 24 Nov 2023 12:39:39 +0000
Subject: [PATCH] MachineTraceMetrics: add test for depth, height calculation

MTM's depth and height calculation is untested, and wrong in several
places that involve PHIs or load-stores. Add a test under the RISC-V
target to document this behavior. A follow-up could potentially fix the
calculation in MTM.
---
 .../machine-trace-metrics-depth-height.ll     | 177 ++++++++++++++++++
 1 file changed, 177 insertions(+)
 create mode 100644 llvm/test/CodeGen/RISCV/machine-trace-metrics-depth-height.ll

diff --git a/llvm/test/CodeGen/RISCV/machine-trace-metrics-depth-height.ll b/llvm/test/CodeGen/RISCV/machine-trace-metrics-depth-height.ll
new file mode 100644
index 000000000000000..da6c15a5845d55a
--- /dev/null
+++ b/llvm/test/CodeGen/RISCV/machine-trace-metrics-depth-height.ll
@@ -0,0 +1,177 @@
+; RUN: llc -mtriple=riscv64 -mattr=+m,+v -debug-only=machine-trace-metrics %s -o /dev/null 2>&1 | FileCheck %s
+
+ at heap_ptr = global ptr null, align 8
+ at heap_end = global ptr null, align 8
+ at heap_requested = global i64 0, align 8
+
+define ptr @mtm_depth_height(ptr %ptr, i64 %size) {
+; CHECK:      Computing MinInstr trace through [[BB1:%bb.[0-9]+]]
+; CHECK-NEXT:   pred for [[BB0:%bb.[0-9]+]]: null
+; CHECK-NEXT:   pred for [[BB1]]: [[BB0]]
+; CHECK-NEXT:   succ for [[BB10:%bb.[0-9]+]]: null
+; CHECK-NEXT:   succ for [[BB14:%bb.[0-9]+]]: [[BB10]]
+; CHECK-NEXT:   succ for [[BB15:%bb.[0-9]+]]: [[BB10]]
+; CHECK-NEXT:   succ for [[BB9:%bb.[0-9]+]]: null
+; CHECK-NEXT:   succ for [[BB8:%bb.[0-9]+]]: [[BB9]]
+; CHECK-NEXT:   succ for [[BB16:%bb.[0-9]+]]: [[BB8]]
+; CHECK-NEXT:   succ for [[BB17:%bb.[0-9]+]]: [[BB8]]
+; CHECK-NEXT:   succ for [[BB6:%bb.[0-9]+]]: null
+; CHECK-NEXT:   succ for [[BB5:%bb.[0-9]+]]: [[BB6]]
+; CHECK-NEXT:   succ for [[BB4:%bb.[0-9]+]]: [[BB5]]
+; CHECK-NEXT:   succ for [[BB12:%bb.[0-9]+]]: [[BB16]]
+; CHECK-NEXT:   succ for [[BB11:%bb.[0-9]+]]: [[BB12]]
+; CHECK-NEXT:   succ for [[BB3:%bb.[0-9]+]]: [[BB11]]
+; CHECK-NEXT:   succ for [[BB2:%bb.[0-9]+]]: [[BB15]]
+; CHECK-NEXT:   succ for [[BB1]]: [[BB14]]
+; CHECK-EMPTY:
+; CHECK-NEXT: Depths for [[BB0]]:
+; CHECK-NEXT:       0 Instructions
+; CHECK-NEXT: 0	[[R22:%[0-9]+]]:gpr = COPY [[X11:\$x[0-9]+]]
+; CHECK-NEXT: 0	[[R21:%[0-9]+]]:gpr = COPY [[X10:\$x[0-9]+]]
+; CHECK-NEXT: 0	[[R24:%[0-9]+]]:gpr = SLTIU [[R21]]:gpr, 1
+; CHECK-NEXT: 0	[[R25:%[0-9]+]]:gpr = SLTIU [[R22]]:gpr, 1
+; CHECK-NEXT: 1	[[R26:%[0-9]+]]:gpr = OR killed [[R24]]:gpr
+; CHECK-NEXT: 2	BEQ killed [[R26]]:gpr, [[X0:\$x[0-9]+]], [[BB1]]
+; CHECK-EMPTY:
+; CHECK-NEXT: Depths for [[BB1]]:
+; CHECK-NEXT:       4 Instructions
+; CHECK-NEXT: 0	[[R29:%[0-9]+]]:gpr = LUI target-flags(riscv-hi) @heap_ptr
+; CHECK-NEXT: 1	[[R0:%[0-9]+]]:gpr = LD [[R29]]:gpr, target-flags(riscv-lo) @heap_ptr 
+; CHECK-NEXT: 5	[[R30:%[0-9]+]]:gpr = ADD [[R0]]:gpr, [[R22]]:gpr
+; CHECK-NEXT: 0	[[R31:%[0-9]+]]:gpr = LUI target-flags(riscv-hi) @heap_requested
+; CHECK-NEXT: 1	[[R32:%[0-9]+]]:gpr = LD [[R31]]:gpr, target-flags(riscv-lo) @heap_requested 
+; CHECK-NEXT: 5	[[R33:%[0-9]+]]:gpr = ADD killed [[R32]]:gpr, [[R22]]:gpr
+; CHECK-NEXT: 6	[[R34:%[0-9]+]]:gpr = ANDI [[R30]]:gpr, 7
+; CHECK-NEXT: 7	[[R35:%[0-9]+]]:gpr = SLTIU [[R34]]:gpr, 1
+; CHECK-NEXT: 0	[[R36:%[0-9]+]]:gpr = ADDI [[X0]], 8
+; CHECK-NEXT: 7	[[R37:%[0-9]+]]:gpr = nuw nsw SUB killed [[R36]]:gpr, [[R34]]:gpr
+; CHECK-NEXT: 8	[[R38:%[0-9]+]]:gpr = ADDI killed [[R35]]:gpr, -1
+; CHECK-NEXT: 9	[[R39:%[0-9]+]]:gpr = AND killed [[R38]]:gpr, killed [[R37]]:gpr
+; CHECK-NEXT: 10	[[R40:%[0-9]+]]:gpr = ADD killed [[R33]]:gpr, [[R39]]:gpr
+; CHECK-NEXT: 10	[[R1:%[0-9]+]]:gpr = ADD [[R30]]:gpr, [[R39:%[0-9]+]]:gpr
+; CHECK-NEXT: 11	SD killed [[R40]]:gpr, [[R31]]:gpr, target-flags(riscv-lo) @heap_requested 
+; CHECK-NEXT: 0	[[R41:%[0-9]+]]:gpr = LUI target-flags(riscv-hi) @heap_end
+; CHECK-NEXT: 1	[[R42:%[0-9]+]]:gpr = LD killed [[R41]]:gpr, target-flags(riscv-lo) @heap_end 
+; CHECK-NEXT: 11	BGEU killed [[R42]]:gpr, [[R1]]:gpr, [[BB2]]
+; CHECK-NEXT: Heights for [[BB10]]:
+; CHECK-NEXT:       1 Instructions
+; CHECK-NEXT: 0	PseudoRET implicit [[X10]]
+; CHECK-NEXT: 0	[[X10]] = COPY [[R20:%[0-9]+]]:gpr
+; CHECK-NEXT: 0	[[R20]]:gpr = PHI [[R23:%[0-9]+]]:gpr, [[BB13:%bb.[0-9]+]], [[R28:%[0-9]+]]:gpr, [[BB14]], [[R44:%[0-9]+]]:gpr, [[BB15]], [[R0]]:gpr, [[BB7:%bb.[0-9]+]], [[R0]]:gpr, [[BB9]]
+; CHECK-NEXT: [[BB10]] Live-ins:
+; CHECK-NEXT: Heights for [[BB14]]:
+; CHECK-NEXT:       2 Instructions
+; CHECK-NEXT: pred	0	[[R20]]:gpr = PHI [[R23]]:gpr, [[BB13]], [[R28]]:gpr, [[BB14]], [[R44]]:gpr, [[BB15]], [[R0]]:gpr, [[BB7]], [[R0]]:gpr, [[BB9]]
+; CHECK-NEXT: 0	PseudoBR [[BB10]]
+; CHECK-NEXT: 0	[[R28]]:gpr = COPY [[R43:%[0-9]+]]:gpr
+; CHECK-NEXT: 0	[[R43]]:gpr = COPY [[X0]]
+; CHECK-NEXT: [[BB14]] Live-ins: X0 at 0
+; CHECK-NEXT: Heights for [[BB1]]:
+; CHECK-NEXT:      20 Instructions
+; CHECK-NEXT: 11	0	BGEU killed [[R42]]:gpr, [[R1]]:gpr, [[BB2]]
+; CHECK-NEXT: 11	4	[[R42]]:gpr = LD killed [[R41]]:gpr, target-flags(riscv-lo) @heap_end 
+; CHECK-NEXT: 11	5	[[R41]]:gpr = LUI target-flags(riscv-hi) @heap_end
+; CHECK-NEXT: 11	0	SD killed [[R40]]:gpr, [[R31]]:gpr, target-flags(riscv-lo) @heap_requested 
+; CHECK-NEXT: 11	1	[[R1]]:gpr = ADD [[R30]]:gpr, [[R39]]:gpr
+; CHECK-NEXT: 11	1	[[R40]]:gpr = ADD killed [[R33]]:gpr, [[R39]]:gpr
+; CHECK-NEXT: 11	2	[[R39]]:gpr = AND killed [[R38]]:gpr, killed [[R37]]:gpr
+; CHECK-NEXT: 11	3	[[R38]]:gpr = ADDI killed [[R35]]:gpr, -1
+; CHECK-NEXT: 11	3	[[R37]]:gpr = nuw nsw SUB killed [[R36]]:gpr, [[R34]]:gpr
+; CHECK-NEXT: 11	4	[[R36]]:gpr = ADDI [[X0]], 8
+; CHECK-NEXT: 11	4	[[R35]]:gpr = SLTIU [[R34]]:gpr, 1
+; CHECK-NEXT: 11	5	[[R34]]:gpr = ANDI [[R30]]:gpr, 7
+; CHECK-NEXT: 11	2	[[R33]]:gpr = ADD killed [[R32]]:gpr, [[R22]]:gpr
+; CHECK-NEXT: 11	6	[[R32]]:gpr = LD [[R31]]:gpr, target-flags(riscv-lo) @heap_requested 
+; CHECK-NEXT: 11	7	[[R31]]:gpr = LUI target-flags(riscv-hi) @heap_requested
+; CHECK-NEXT: 11	6	[[R30]]:gpr = ADD [[R0]]:gpr, [[R22]]:gpr
+; CHECK-NEXT: 11	10	[[R0]]:gpr = LD [[R29]]:gpr, target-flags(riscv-lo) @heap_ptr 
+; CHECK-NEXT: 11	11	[[R29]]:gpr = LUI target-flags(riscv-hi) @heap_ptr
+; CHECK-NEXT: [[BB1]] Live-ins: [[R22]]@6 X0 at 4
+; CHECK-NEXT: Critical path: 11
+entry:
+  %ptrint = ptrtoint ptr %ptr to i64
+  %cmp = icmp eq ptr %ptr, null
+  %cmp.i = icmp eq i64 %size, 0
+  %or.cond = or i1 %cmp, %cmp.i
+  br i1 %or.cond, label %return, label %if.end
+
+if.end:                                          ; preds = %entry
+  %0 = load ptr, ptr @heap_ptr, align 8
+  %1 = ptrtoint ptr %0 to i64
+  %add.ptr = getelementptr inbounds i8, ptr %0, i64 %size
+  %2 = load i64, ptr @heap_requested, align 8
+  %add = add i64 %2, %size
+  %3 = ptrtoint ptr %add.ptr to i64
+  %rem = and i64 %3, 7
+  %cmp.eq = icmp eq i64 %rem, 0
+  %sub = sub nuw nsw i64 8, %rem
+  %sel = select i1 %cmp.eq, i64 0, i64 %sub
+  %storemerge = add i64 %add, %sel
+  %next_heap_ptr = getelementptr inbounds i8, ptr %add.ptr, i64 %sel
+  store i64 %storemerge, ptr @heap_requested, align 8
+  %4 = load ptr, ptr @heap_end, align 8
+  %cmp.ugt = icmp ugt ptr %next_heap_ptr, %4
+  br i1 %cmp.ugt, label %return, label %exit
+
+exit:                                            ; preds = %if.end
+  store ptr %next_heap_ptr, ptr @heap_ptr, align 8
+  %cmp.not = icmp eq ptr %0, null
+  br i1 %cmp.not, label %return, label %ph
+
+ph:                                              ; preds = %exit
+  %5 = tail call i64 @llvm.vscale.i64()
+  %6 = shl nuw nsw i64 %5, 4
+  %7 = tail call i64 @llvm.umax.i64(i64 %6, i64 32)
+  %min.iters.check = icmp ugt i64 %7, %size
+  br i1 %min.iters.check, label %for.ph, label %vector.memcheck
+
+vector.memcheck:                                  ; preds = %ph
+  %8 = tail call i64 @llvm.vscale.i64()
+  %9 = shl nuw nsw i64 %8, 4
+  %10 = sub i64 %1, %ptrint
+  %diff.check = icmp ult i64 %10, %9
+  br i1 %diff.check, label %for.ph, label %vector.ph
+
+vector.ph:                                        ; preds = %vector.memcheck
+  %11 = tail call i64 @llvm.vscale.i64()
+  %.neg = mul nsw i64 %11, -16
+  %n.vec = and i64 %.neg, %size
+  %12 = tail call i64 @llvm.vscale.i64()
+  %13 = shl nuw nsw i64 %12, 4
+  br label %vector.body
+
+vector.body:                                      ; preds = %vector.body, %vector.ph
+  %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]
+  %14 = getelementptr inbounds i8, ptr %ptr, i64 %index
+  %wide.load = load <vscale x 16 x i8>, ptr %14, align 1
+  %15 = getelementptr inbounds i8, ptr %0, i64 %index
+  store <vscale x 16 x i8> %wide.load, ptr %15, align 1
+  %index.next = add nuw i64 %index, %13
+  %16 = icmp eq i64 %index.next, %n.vec
+  br i1 %16, label %middle.block, label %vector.body
+
+middle.block:                                     ; preds = %vector.body
+  %cmp.n = icmp eq i64 %n.vec, %size
+  br i1 %cmp.n, label %return, label %for.ph
+
+for.ph:                                           ; preds = %vector.memcheck, %ph, %middle.block
+  %i.ph = phi i64 [ 0, %vector.memcheck ], [ 0, %ph ], [ %n.vec, %middle.block ]
+  br label %for.body
+
+for.body:                                         ; preds = %for.ph, %for.body
+  %i = phi i64 [ %inc, %for.body ], [ %i.ph, %for.ph ]
+  %arrayidx = getelementptr inbounds i8, ptr %ptr, i64 %i
+  %17 = load i8, ptr %arrayidx, align 1
+  %arrayidx.st = getelementptr inbounds i8, ptr %0, i64 %i
+  store i8 %17, ptr %arrayidx.st, align 1
+  %inc = add nuw i64 %i, 1
+  %exitcond.not = icmp eq i64 %inc, %size
+  br i1 %exitcond.not, label %return, label %for.body
+
+return:                                           ; preds = %for.body, %middle.block, %if.end, %exit, %entry
+  %retval = phi ptr [ null, %entry ], [ null, %exit ], [ null, %if.end ], [ %0, %middle.block ], [ %0, %for.body ]
+  ret ptr %retval
+}
+
+declare i64 @llvm.vscale.i64()
+declare i64 @llvm.umax.i64(i64, i64)



More information about the llvm-commits mailing list