[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