[PATCH] D140909: llvm-reduce: Fix assertion on blockaddress during function reduction
Matt Arsenault via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue Jan 3 14:32:52 PST 2023
arsenm updated this revision to Diff 486092.
arsenm added a comment.
Re-merge test. The weird behavior shows up with any other unused function present, I think because the removal logic special cases unused functions
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D140909/new/
https://reviews.llvm.org/D140909
Files:
llvm/test/tools/llvm-reduce/reduce-functions-blockaddress.ll
llvm/tools/llvm-reduce/deltas/ReduceFunctions.cpp
llvm/tools/llvm-reduce/deltas/Utils.cpp
llvm/tools/llvm-reduce/deltas/Utils.h
Index: llvm/tools/llvm-reduce/deltas/Utils.h
===================================================================
--- llvm/tools/llvm-reduce/deltas/Utils.h
+++ llvm/tools/llvm-reduce/deltas/Utils.h
@@ -23,6 +23,7 @@
Value *getDefaultValue(Type *T);
bool hasAliasUse(Function &F);
+bool hasAliasOrBlockAddressUse(Function &F);
} // namespace llvm
Index: llvm/tools/llvm-reduce/deltas/Utils.cpp
===================================================================
--- llvm/tools/llvm-reduce/deltas/Utils.cpp
+++ llvm/tools/llvm-reduce/deltas/Utils.cpp
@@ -32,3 +32,9 @@
return isa<GlobalAlias>(U) || isa<GlobalIFunc>(U);
});
}
+
+bool llvm::hasAliasOrBlockAddressUse(Function &F) {
+ return any_of(F.users(), [](User *U) {
+ return isa<GlobalAlias, GlobalIFunc, BlockAddress>(U);
+ });
+}
Index: llvm/tools/llvm-reduce/deltas/ReduceFunctions.cpp
===================================================================
--- llvm/tools/llvm-reduce/deltas/ReduceFunctions.cpp
+++ llvm/tools/llvm-reduce/deltas/ReduceFunctions.cpp
@@ -32,7 +32,10 @@
// Intrinsics don't have function bodies that are useful to
// reduce. Additionally, intrinsics may have additional operand
// constraints. But, do drop intrinsics that are not referenced.
- if ((!F.isIntrinsic() || F.use_empty()) && !hasAliasUse(F) &&
+
+ // TODO: Could handle aliases and blockaddresses, we just need to replace
+ // those users.
+ if ((!F.isIntrinsic() || F.use_empty()) && !hasAliasOrBlockAddressUse(F) &&
!O.shouldKeep())
FuncsToRemove.insert(&F);
}
Index: llvm/test/tools/llvm-reduce/reduce-functions-blockaddress.ll
===================================================================
--- /dev/null
+++ llvm/test/tools/llvm-reduce/reduce-functions-blockaddress.ll
@@ -0,0 +1,48 @@
+; RUN: llvm-reduce --delta-passes=functions --test FileCheck --test-arg --check-prefixes=INTERESTING --test-arg %s --test-arg --input-file %s -o %t
+; RUN: FileCheck --check-prefixes=RESULT --input-file=%t %s
+
+; Make sure we don't crash on blockaddress
+; TODO: Should be able to replace the blockaddresses with null too
+
+; INTERESTING: @blockaddr.table
+; INTERESTING: @blockaddr.table.addrspacecast
+
+; RESULT: @blockaddr.table = private unnamed_addr constant [2 x ptr] [ptr blockaddress(@foo, %L1), ptr blockaddress(@foo, %L2)]
+; RESULT: @blockaddr.table.addrspacecast = private unnamed_addr constant [2 x ptr addrspace(1)] [ptr addrspace(1) addrspacecast (ptr blockaddress(@foo_addrspacecast, %L1) to ptr addrspace(1)), ptr addrspace(1) addrspacecast (ptr blockaddress(@foo_addrspacecast, %L2) to ptr addrspace(1))]
+
+ at blockaddr.table = private unnamed_addr constant [2 x ptr] [ptr blockaddress(@foo, %L1), ptr blockaddress(@foo, %L2)]
+
+ at blockaddr.table.addrspacecast = private unnamed_addr constant [2 x ptr addrspace(1)] [
+ ptr addrspace(1) addrspacecast (ptr blockaddress(@foo_addrspacecast, %L1) to ptr addrspace(1)),
+ ptr addrspace(1) addrspacecast (ptr blockaddress(@foo_addrspacecast, %L2) to ptr addrspace(1))
+]
+
+; RESULT: define i32 @foo(
+define i32 @foo(i64 %arg0) {
+entry:
+ %gep = getelementptr inbounds [2 x ptr], ptr @blockaddr.table, i64 0, i64 %arg0
+ %load = load ptr, ptr %gep, align 8
+ indirectbr ptr %load, [label %L2, label %L1]
+
+L1:
+ %phi = phi i32 [ 1, %L2 ], [ 2, %entry ]
+ ret i32 %phi
+
+L2:
+ br label %L1
+}
+
+; RESULT: define i32 @foo_addrspacecast(
+define i32 @foo_addrspacecast(i64 %arg0) {
+entry:
+ %gep = getelementptr inbounds [2 x ptr addrspace(1)], ptr @blockaddr.table.addrspacecast, i64 0, i64 %arg0
+ %load = load ptr addrspace(1), ptr %gep, align 8
+ indirectbr ptr addrspace(1) %load, [label %L2, label %L1]
+
+L1:
+ %phi = phi i32 [ 1, %L2 ], [ 2, %entry ]
+ ret i32 %phi
+
+L2:
+ br label %L1
+}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D140909.486092.patch
Type: text/x-patch
Size: 3796 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20230103/d0bf981c/attachment.bin>
More information about the llvm-commits
mailing list