[llvm] [NewGVN] Improve SelfLookup optimization to ensure termination (PR #82162)

via llvm-commits llvm-commits at lists.llvm.org
Sat Aug 10 03:53:16 PDT 2024


https://github.com/ManuelJBrito updated https://github.com/llvm/llvm-project/pull/82162

>From 27ef9edeff7522c6c5ab2b226cb11e3e7d02caeb Mon Sep 17 00:00:00 2001
From: ManuelJBrito <manuel.brito at tecnico.ulisboa.pt>
Date: Sat, 17 Feb 2024 12:27:23 +0000
Subject: [PATCH] Disable selfLookup

---
 llvm/lib/Transforms/Scalar/NewGVN.cpp  |  2 +-
 llvm/test/Transforms/NewGVN/pr31613.ll |  7 ++-
 llvm/test/Transforms/NewGVN/pr32403.ll |  3 +-
 llvm/test/Transforms/NewGVN/pr33820.ll | 79 ++++++++++++++++++++++++++
 llvm/test/Transforms/NewGVN/pr60439.ll | 33 +++++++++++
 5 files changed, 120 insertions(+), 4 deletions(-)
 create mode 100644 llvm/test/Transforms/NewGVN/pr33820.ll
 create mode 100644 llvm/test/Transforms/NewGVN/pr60439.ll

diff --git a/llvm/lib/Transforms/Scalar/NewGVN.cpp b/llvm/lib/Transforms/Scalar/NewGVN.cpp
index fc0b31c433962d..b9437851259db0 100644
--- a/llvm/lib/Transforms/Scalar/NewGVN.cpp
+++ b/llvm/lib/Transforms/Scalar/NewGVN.cpp
@@ -1037,7 +1037,7 @@ PHIExpression *NewGVN::createPHIExpression(ArrayRef<ValPair> PHIOperands,
       return false;
     OriginalOpsConstant = OriginalOpsConstant && isa<Constant>(P.first);
     HasBackedge = HasBackedge || isBackedge(BB, PHIBlock);
-    return lookupOperandLeader(P.first) != I;
+    return true;
   });
   std::transform(Filtered.begin(), Filtered.end(), op_inserter(E),
                  [&](const ValPair &P) -> Value * {
diff --git a/llvm/test/Transforms/NewGVN/pr31613.ll b/llvm/test/Transforms/NewGVN/pr31613.ll
index 0bcf86a5711189..98ae95189dee17 100644
--- a/llvm/test/Transforms/NewGVN/pr31613.ll
+++ b/llvm/test/Transforms/NewGVN/pr31613.ll
@@ -13,15 +13,18 @@ define void @foo() {
 ; CHECK-NEXT:    [[TMP:%.*]] = phi i32 [ 0, [[BB:%.*]] ], [ 1, [[BB18:%.*]] ]
 ; CHECK-NEXT:    br label [[BB2:%.*]]
 ; CHECK:       bb2:
+; CHECK-NEXT:    [[TMP3:%.*]] = phi i32 [ [[TMP]], [[BB1]] ], [ [[TMP8:%.*]], [[BB9:%.*]] ]
 ; CHECK-NEXT:    br label [[BB4:%.*]]
 ; CHECK:       bb4:
+; CHECK-NEXT:    [[TMP5:%.*]] = phi i32 [ [[TMP3]], [[BB2]] ], [ [[TMP8]], [[BB14:%.*]] ]
 ; CHECK-NEXT:    br i1 undef, label [[BB18]], label [[BB7:%.*]]
 ; CHECK:       bb7:
-; CHECK-NEXT:    br label [[BB9:%.*]]
+; CHECK-NEXT:    [[TMP8]] = phi i32 [ [[TMP8]], [[BB16:%.*]] ], [ [[TMP5]], [[BB4]] ]
+; CHECK-NEXT:    br label [[BB9]]
 ; CHECK:       bb9:
 ; CHECK-NEXT:    br i1 undef, label [[BB2]], label [[BB11:%.*]]
 ; CHECK:       bb11:
-; CHECK-NEXT:    br i1 undef, label [[BB16:%.*]], label [[BB14:%.*]]
+; CHECK-NEXT:    br i1 undef, label [[BB16]], label [[BB14]]
 ; CHECK:       bb14:
 ; CHECK-NEXT:    br label [[BB4]]
 ; CHECK:       bb16:
diff --git a/llvm/test/Transforms/NewGVN/pr32403.ll b/llvm/test/Transforms/NewGVN/pr32403.ll
index 90a2907d02ca77..c0ed9688ebb04e 100644
--- a/llvm/test/Transforms/NewGVN/pr32403.ll
+++ b/llvm/test/Transforms/NewGVN/pr32403.ll
@@ -17,7 +17,8 @@ define void @reorder_ref_pic_list() local_unnamed_addr {
 ; CHECK-NEXT:    [[INC_I:%.*]] = add nsw i32 [[REFIDXLX_0]], 1
 ; CHECK-NEXT:    br label [[FOR_BODY8_I:%.*]]
 ; CHECK:       for.body8.i:
-; CHECK-NEXT:    br i1 undef, label [[FOR_INC24_I:%.*]], label [[IF_THEN17_I:%.*]]
+; CHECK-NEXT:    [[NIDX_052_I:%.*]] = phi i32 [ [[INC_I]], [[IF_THEN13]] ], [ [[NIDX_052_I]], [[FOR_INC24_I:%.*]] ]
+; CHECK-NEXT:    br i1 undef, label [[FOR_INC24_I]], label [[IF_THEN17_I:%.*]]
 ; CHECK:       if.then17.i:
 ; CHECK-NEXT:    br label [[FOR_INC24_I]]
 ; CHECK:       for.inc24.i:
diff --git a/llvm/test/Transforms/NewGVN/pr33820.ll b/llvm/test/Transforms/NewGVN/pr33820.ll
new file mode 100644
index 00000000000000..e8a8bc99c9d1dd
--- /dev/null
+++ b/llvm/test/Transforms/NewGVN/pr33820.ll
@@ -0,0 +1,79 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 3
+; RUN: opt -S < %s -passes=newgvn | FileCheck %s
+
+define void @hoge(i1 %c1, i1 %c2, i1 %c3, i1 %c4) {
+; CHECK-LABEL: define void @hoge(
+; CHECK-SAME: i1 [[C1:%.*]], i1 [[C2:%.*]], i1 [[C3:%.*]], i1 [[C4:%.*]]) {
+; CHECK-NEXT:  bb:
+; CHECK-NEXT:    br label [[BB1:%.*]]
+; CHECK:       bb1:
+; CHECK-NEXT:    [[TMP:%.*]] = phi i8 [ [[TMP3:%.*]], [[BB12:%.*]] ], [ 0, [[BB:%.*]] ]
+; CHECK-NEXT:    br i1 [[C1]], label [[BB2:%.*]], label [[BB13:%.*]]
+; CHECK:       bb2:
+; CHECK-NEXT:    [[TMP3]] = phi i8 [ [[TMP]], [[BB1]] ], [ [[TMP5:%.*]], [[BB4:%.*]] ]
+; CHECK-NEXT:    br i1 [[C2]], label [[BB12]], label [[BB4]]
+; CHECK:       bb4:
+; CHECK-NEXT:    [[TMP5]] = phi i8 [ [[TMP3]], [[BB2]] ], [ [[TMP7:%.*]], [[BB11:%.*]] ]
+; CHECK-NEXT:    br i1 false, label [[BB6:%.*]], label [[BB2]]
+; CHECK:       bb6:
+; CHECK-NEXT:    [[TMP7]] = phi i8 [ poison, [[BB4]] ], [ [[TMP10:%.*]], [[BB9:%.*]] ]
+; CHECK-NEXT:    br i1 [[C3]], label [[BB11]], label [[BB8:%.*]]
+; CHECK:       bb8:
+; CHECK-NEXT:    br i1 true, label [[BB8]], label [[BB9]]
+; CHECK:       bb9:
+; CHECK-NEXT:    [[TMP10]] = phi i8 [ [[TMP16:%.*]], [[BB15:%.*]] ], [ poison, [[BB8]] ]
+; CHECK-NEXT:    br label [[BB6]]
+; CHECK:       bb11:
+; CHECK-NEXT:    br label [[BB4]]
+; CHECK:       bb12:
+; CHECK-NEXT:    br label [[BB1]]
+; CHECK:       bb13:
+; CHECK-NEXT:    br i1 [[C4]], label [[BB14:%.*]], label [[BB15]]
+; CHECK:       bb14:
+; CHECK-NEXT:    br label [[BB15]]
+; CHECK:       bb15:
+; CHECK-NEXT:    [[TMP16]] = phi i8 [ [[TMP]], [[BB13]] ], [ 9, [[BB14]] ]
+; CHECK-NEXT:    br label [[BB9]]
+;
+bb:
+br label %bb1
+
+bb1: ; preds = %bb12, %bb
+%tmp = phi i8 [ %tmp3, %bb12 ], [ 0, %bb ]
+br i1 %c1, label %bb2, label %bb13
+
+bb2: ; preds = %bb4, %bb1
+%tmp3 = phi i8 [ %tmp, %bb1 ], [ %tmp5, %bb4 ]
+br i1 %c2, label %bb12, label %bb4
+
+bb4: ; preds = %bb11, %bb2
+%tmp5 = phi i8 [ %tmp3, %bb2 ], [ %tmp7, %bb11 ]
+br i1 false, label %bb6, label %bb2
+
+bb6: ; preds = %bb9, %bb4
+%tmp7 = phi i8 [ %tmp5, %bb4 ], [ %tmp10, %bb9 ]
+br i1 %c3, label %bb11, label %bb8
+
+bb8: ; preds = %bb8, %bb6
+br i1 true, label %bb8, label %bb9
+
+bb9: ; preds = %bb15, %bb8
+%tmp10 = phi i8 [ %tmp16, %bb15 ], [ %tmp7, %bb8 ]
+br label %bb6
+
+bb11: ; preds = %bb6
+br label %bb4
+
+bb12: ; preds = %bb2
+br label %bb1
+
+bb13: ; preds = %bb1
+br i1 %c4, label %bb14, label %bb15
+
+bb14: ; preds = %bb13
+br label %bb15
+
+bb15: ; preds = %bb14, %bb13
+%tmp16 = phi i8 [ %tmp, %bb13 ], [ 9, %bb14 ]
+br label %bb9
+}
diff --git a/llvm/test/Transforms/NewGVN/pr60439.ll b/llvm/test/Transforms/NewGVN/pr60439.ll
new file mode 100644
index 00000000000000..858d39c24cd872
--- /dev/null
+++ b/llvm/test/Transforms/NewGVN/pr60439.ll
@@ -0,0 +1,33 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 3
+; RUN: opt -S < %s -passes=newgvn | FileCheck %s
+define i32 @function_1(i1 %arg, i1 %bc ) {
+; CHECK-LABEL: define i32 @function_1(
+; CHECK-SAME: i1 [[ARG:%.*]], i1 [[BC:%.*]]) {
+; CHECK-NEXT:  entry_1:
+; CHECK-NEXT:    br i1 [[BC]], label [[BB_5:%.*]], label [[BB_6:%.*]]
+; CHECK:       bb_5:
+; CHECK-NEXT:    br label [[BB_6]]
+; CHECK:       bb_6:
+; CHECK-NEXT:    [[A:%.*]] = phi i1 [ [[ARG]], [[BB_5]] ], [ [[A]], [[BB_4:%.*]] ], [ true, [[ENTRY_1:%.*]] ]
+; CHECK-NEXT:    [[C:%.*]] = phi i1 [ [[ARG]], [[BB_5]] ], [ [[C]], [[BB_4]] ], [ true, [[ENTRY_1]] ]
+; CHECK-NEXT:    br label [[BB_4]]
+; CHECK:       bb_4:
+; CHECK-NEXT:    br i1 [[ARG]], label [[BB_6]], label [[BB_4]]
+;
+entry_1:
+  br i1 %bc, label %bb_5, label %bb_6
+
+bb_5:
+  br label %bb_6
+
+bb_6:
+  %a = phi i1 [ %arg, %bb_5 ], [ %a.1, %bb_4 ], [ 1, %entry_1 ]
+  %c = phi i1 [ %arg, %bb_5 ], [ %c.1, %bb_4 ], [ 1, %entry_1 ]
+  br label %bb_4
+
+
+bb_4:
+  %a.1 = phi i1  [ %a.1, %bb_4 ], [ %a, %bb_6 ]
+  %c.1 = phi i1 [ %c.1, %bb_4 ], [ %c, %bb_6 ]
+  br i1 %arg, label %bb_6, label %bb_4
+}



More information about the llvm-commits mailing list