[PATCH] D84432: [IPSCCP] Drop argmemonly after replacing pointer argument.
Florian Hahn via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Fri Jul 24 02:16:58 PDT 2020
fhahn updated this revision to Diff 280375.
fhahn marked an inline comment as done.
fhahn added a comment.
Also drop callsite argmemonly/inaccessiblemem_or_argmemonly attributes
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D84432/new/
https://reviews.llvm.org/D84432
Files:
llvm/lib/Transforms/Scalar/SCCP.cpp
llvm/test/Transforms/SCCP/ipscp-drop-argmemonly.ll
Index: llvm/test/Transforms/SCCP/ipscp-drop-argmemonly.ll
===================================================================
--- llvm/test/Transforms/SCCP/ipscp-drop-argmemonly.ll
+++ llvm/test/Transforms/SCCP/ipscp-drop-argmemonly.ll
@@ -11,7 +11,7 @@
; Here the pointer argument %arg will be replaced by a constant. We need to
; drop argmemonly.
define internal void @ptrarg.1(i32* %arg, i32 %val) argmemonly nounwind {
-; CHECK: Function Attrs: argmemonly nounwind
+; CHECK: Function Attrs: nounwind
; CHECK-LABEL: @ptrarg.1(
; CHECK-NEXT: store i32 10, i32* @g, align 4
; CHECK-NEXT: ret void
@@ -59,7 +59,7 @@
; Here the pointer argument %arg will be replaced by a constant. We need to
; drop inaccessiblemem_or_argmemonly.
define internal void @ptrarg.3(i32* %arg, i32 %val) inaccessiblemem_or_argmemonly nounwind {
-; CHECK: Function Attrs: inaccessiblemem_or_argmemonly nounwind
+; CHECK: Function Attrs: nounwind
; CHECK-LABEL: @ptrarg.3(
; CHECK-NEXT: store i32 10, i32* @g, align 4
; CHECK-NEXT: ret void
@@ -107,7 +107,7 @@
; Here the pointer argument %arg will be replaced by a constant. We need to
; drop inaccessiblemem_or_argmemonly.
define internal void @ptrarg.5(i32* %arg, i32 %val) argmemonly inaccessiblemem_or_argmemonly nounwind {
-; CHECK: Function Attrs: argmemonly inaccessiblemem_or_argmemonly nounwind
+; CHECK: Function Attrs: nounwind
; CHECK-LABEL: @ptrarg.5(
; CHECK-NEXT: store i32 10, i32* @g, align 4
; CHECK-NEXT: ret void
@@ -143,9 +143,9 @@
define i32 @caller.6.cs.attributes(i32 %n) {
; CHECK-LABEL: @caller.6.cs.attributes(
; CHECK-NEXT: store i32 1, i32* @g, align 4
-; CHECK-NEXT: tail call void @ptrarg.5(i32* @g, i32 10) [[ARGMEMONLY_INACCESSIBLEMEM_OR_ARGMEMONLY_NOUNWIND:#[0-9]+]]
-; CHECK-NEXT: tail call void @ptrarg.5(i32* @g, i32 10) [[INACCESSIBLEMEM_OR_ARGMEMONLY_NOUNWIND:#[0-9]+]]
-; CHECK-NEXT: tail call void @ptrarg.5(i32* @g, i32 10) [[ARGMEMONLY_NOUNWIND:#[0-9]+]]
+; CHECK-NEXT: tail call void @ptrarg.5(i32* @g, i32 10) [[NOUNWIND:#[0-9]+]]
+; CHECK-NEXT: tail call void @ptrarg.5(i32* @g, i32 10) [[NOUNWIND:#[0-9]+]]
+; CHECK-NEXT: tail call void @ptrarg.5(i32* @g, i32 10) [[NOUNWIND:#[0-9]+]]
; CHECK-NEXT: tail call void @ptrarg.5(i32* @g, i32 10) [[NOUNWIND:#[0-9]+]]
; CHECK-NEXT: [[G_VAL:%.*]] = load i32, i32* @g, align 4
; CHECK-NEXT: ret i32 [[G_VAL]]
@@ -159,7 +159,4 @@
ret i32 %g.val
}
-; CHECK-DAG: [[ARGMEMONLY_INACCESSIBLEMEM_OR_ARGMEMONLY_NOUNWIND]] = { argmemonly inaccessiblemem_or_argmemonly nounwind }
-; CHECK-DAG: [[INACCESSIBLEMEM_OR_ARGMEMONLY_NOUNWIND]] = { inaccessiblemem_or_argmemonly nounwind }
-; CHECK-DAG: [[ARGMEMONLY_NOUNWIND]] = { argmemonly nounwind }
-; CHECK-DAG: [[NOUNWIND]] = { nounwind }
+; CHECK: [[NOUNWIND]] = { nounwind }
Index: llvm/lib/Transforms/Scalar/SCCP.cpp
===================================================================
--- llvm/lib/Transforms/Scalar/SCCP.cpp
+++ llvm/lib/Transforms/Scalar/SCCP.cpp
@@ -1911,15 +1911,35 @@
SmallVector<BasicBlock *, 512> BlocksToErase;
- if (Solver.isBlockExecutable(&F.front()))
- for (Function::arg_iterator AI = F.arg_begin(), E = F.arg_end(); AI != E;
- ++AI) {
- if (!AI->use_empty() && tryToReplaceWithConstant(Solver, &*AI)) {
+ if (Solver.isBlockExecutable(&F.front())) {
+ bool ReplacedPointerArg = false;
+ for (Argument &Arg : F.args()) {
+ if (!Arg.use_empty() && tryToReplaceWithConstant(Solver, &Arg)) {
+ ReplacedPointerArg |= Arg.getType()->isPointerTy();
++IPNumArgsElimed;
- continue;
}
}
+ // If we replaced an argument, the argmemonly and
+ // inaccessiblemem_or_argmemonly attributes do not hold any longer. Remove
+ // them from both the function and callsites.
+ if (ReplacedPointerArg) {
+ SmallVector<Attribute::AttrKind, 2> AttributesToRemove = {
+ Attribute::ArgMemOnly, Attribute::InaccessibleMemOrArgMemOnly};
+ for (auto Attr : AttributesToRemove)
+ F.removeFnAttr(Attr);
+
+ for (User *U : F.users()) {
+ auto *CB = dyn_cast<CallBase>(U);
+ if (!CB || CB->getCalledFunction() != &F)
+ continue;
+
+ for (auto Attr : AttributesToRemove)
+ CB->removeAttribute(AttributeList::FunctionIndex, Attr);
+ }
+ }
+ }
+
SmallPtrSet<Value *, 32> InsertedValues;
for (BasicBlock &BB : F) {
if (!Solver.isBlockExecutable(&BB)) {
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D84432.280375.patch
Type: text/x-patch
Size: 4524 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200724/a0981407/attachment.bin>
More information about the llvm-commits
mailing list