[llvm] 9135137 - [llvm-diff] Precommit: Add loop test case with forward reference
Jannik Silvanus via llvm-commits
llvm-commits at lists.llvm.org
Thu Nov 3 01:24:32 PDT 2022
Author: Jannik Silvanus
Date: 2022-11-03T09:22:47+01:00
New Revision: 9135137718bbb8322dc42a1026ce3f843bbeacc6
URL: https://github.com/llvm/llvm-project/commit/9135137718bbb8322dc42a1026ce3f843bbeacc6
DIFF: https://github.com/llvm/llvm-project/commit/9135137718bbb8322dc42a1026ce3f843bbeacc6.diff
LOG: [llvm-diff] Precommit: Add loop test case with forward reference
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.
Differential Revision: https://reviews.llvm.org/D137262
Added:
llvm/test/tools/llvm-diff/loop.ll
Modified:
Removed:
################################################################################
diff --git a/llvm/test/tools/llvm-
diff /loop.ll b/llvm/test/tools/llvm-
diff /loop.ll
new file mode 100644
index 0000000000000..8c50bc616d5cf
--- /dev/null
+++ b/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
diff erent 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
diff ing 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 %BB0
+
+END:
+ ; Equivalence of the ret depends on equivalence of %var.
+ ; Even if %var
diff ers, we do not report a
diff here, because
+ ; this is an indirect
diff caused by another
diff .
+ ret i32 %var
+}
More information about the llvm-commits
mailing list