[PATCH] D137262: [llvm-diff] Precommit: Add loop test case with forward reference

Jannik Silvanus via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Nov 2 08:51:45 PDT 2022


jsilvanus created this revision.
Herald added a project: All.
jsilvanus requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.

Diffing phi nodes was recently added to llvm-diff.
However, there currently is a limitation where equivalent values
cannot be detected as such, leading to false positive diff reports.

If a phi node refers a value defined in a basic block dominated by
the current basic block, for example a phi node in a loop header referring
a value defined in the loop body, we cannot prove equivalence of the referred
values, because the basic block containing the variable definition has
not yet been processed.

This commit adds a test case showing this behavior, serving as a precommit
for an upcoming fix of the above.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D137262

Files:
  llvm/test/tools/llvm-diff/loop.ll


Index: llvm/test/tools/llvm-diff/loop.ll
===================================================================
--- /dev/null
+++ llvm/test/tools/llvm-diff/loop.ll
@@ -0,0 +1,49 @@
+; Diff file with itself
+; Due to a current limitation in llvm-diff, a diff is reported here.
+; RUN: not llvm-diff %s %s 2>&1 | FileCheck --check-prefix=SAME-FILE %s
+
+; Replace %newvar1 with %newvar2 in the phi node. This can only
+; be detected to be different once BB1 has been processed.
+; RUN: rm -f %t.ll
+; RUN: cat %s | sed -e 's/ %newvar1, %BB1 / %newvar2, %BB1 /' > %t.ll
+; RUN: not llvm-diff %s %t.ll 2>&1 | FileCheck --check-prefix DIFFERENT-VAR %s
+
+; SAME-FILE:      in function func:
+; SAME-FILE-NEXT:   in block %BB0:
+; SAME-FILE-NEXT:     >   %var = phi i32 [ 0, %ENTRY ], [ %newvar1, %BB1 ]
+; SAME-FILE-NEXT:     >   %cnd = icmp eq i32 %var, 0
+; SAME-FILE-NEXT:     >   br i1 %cnd, label %BB1, label %END
+; SAME-FILE-NEXT:     <   %var = phi i32 [ 0, %ENTRY ], [ %newvar1, %BB1 ]
+; SAME-FILE-NEXT:     <   %cnd = icmp eq i32 %var, 0
+; SAME-FILE-NEXT:     <   br i1 %cnd, label %BB1, label %END
+
+; DIFFERENT-VAR:      in function func:
+; DIFFERENT-VAR-NEXT:   in block %BB0:
+; DIFFERENT-VAR-NEXT:     >   %var = phi i32 [ 0, %ENTRY ], [ %newvar2, %BB1 ]
+; DIFFERENT-VAR-NEXT:     >   %cnd = icmp eq i32 %var, 0
+; DIFFERENT-VAR-NEXT:     >   br i1 %cnd, label %BB1, label %END
+; DIFFERENT-VAR-NEXT:     <   %var = phi i32 [ 0, %ENTRY ], [ %newvar1, %BB1 ]
+; DIFFERENT-VAR-NEXT:     <   %cnd = icmp eq i32 %var, 0
+; DIFFERENT-VAR-NEXT:     <   br i1 %cnd, label %BB1, label %END
+define i32 @func() {
+ENTRY:
+  br label %BB0
+
+BB0:
+  ; When diffing this phi node, we need to detect whether
+  ; %newvar1 is equivalent, which is not known until BB1 has been processed.
+  %var = phi i32 [ 0, %ENTRY ], [ %newvar1, %BB1 ]
+  %cnd = icmp eq i32 %var, 0
+  br i1 %cnd, label %BB1, label %END
+
+BB1:
+  %newvar1 = add i32 %var, 1
+  %newvar2 = add i32 %var, 2
+  br label %BB1
+
+END:
+  ; Equivalence of the ret depends on equivalence of %var.
+  ; Even if %var differs, we do not report a diff here, because
+  ; this is an indirect diff caused by another diff.
+  ret i32 %var
+}


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D137262.472634.patch
Type: text/x-patch
Size: 2197 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20221102/3a0bb476/attachment.bin>


More information about the llvm-commits mailing list