[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