[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