[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 10:13:33 PST 2023
arsenm created this revision.
arsenm added reviewers: regehr, aeubanks, lebedev.ri.
Herald added a project: All.
arsenm requested review of this revision.
Herald added a subscriber: wdng.
Herald added a project: LLVM.
Just avoid crashing for now, we should be able to replace the blockaddresses
themselves.
BlockAddress::handleOperandChangeImpl assumes it can cast to Function.
The verifier seems nonexistent and the langref isn't particularly explicit
on what's allowed as a blockaddress operand. As far as I can tell bugpoint
isn't doing anything to handle this.
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,36 @@
+; 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, %L1) to ptr addrspace(1)), ptr addrspace(1) addrspacecast (ptr blockaddress(@foo, %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, %L1) to ptr addrspace(1)),
+ ptr addrspace(1) addrspacecast (ptr blockaddress(@foo, %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
+}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D140909.486019.patch
Type: text/x-patch
Size: 3334 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20230103/981561f1/attachment.bin>
More information about the llvm-commits
mailing list