[PATCH] D120133: [instsimplify] Assume storage for byval args doesn't overlap allocas, globals, or other byval args
Philip Reames via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Fri Feb 18 08:32:49 PST 2022
reames updated this revision to Diff 409943.
reames added a comment.
Address review comments
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D120133/new/
https://reviews.llvm.org/D120133
Files:
llvm/lib/Analysis/InstructionSimplify.cpp
llvm/test/Transforms/InstSimplify/compare.ll
Index: llvm/test/Transforms/InstSimplify/compare.ll
===================================================================
--- llvm/test/Transforms/InstSimplify/compare.ll
+++ llvm/test/Transforms/InstSimplify/compare.ll
@@ -2737,11 +2737,10 @@
ret i1 %res
}
-; TODO: Never equal
+; Never equal
define i1 @byval_args_inequal(i32* byval(i32) %a, i32* byval(i32) %b) {
; CHECK-LABEL: @byval_args_inequal(
-; CHECK-NEXT: [[RES:%.*]] = icmp ne i32* [[A:%.*]], [[B:%.*]]
-; CHECK-NEXT: ret i1 [[RES]]
+; CHECK-NEXT: ret i1 true
;
%res = icmp ne i32* %a, %b
ret i1 %res
@@ -2759,12 +2758,10 @@
ret i1 %res
}
-; TODO: Never equal
+; Never equal
define i1 @test_byval_alloca_inequal(i32* byval(i32) %a) {
; CHECK-LABEL: @test_byval_alloca_inequal(
-; CHECK-NEXT: [[B:%.*]] = alloca i32, align 4
-; CHECK-NEXT: [[RES:%.*]] = icmp ne i32* [[A:%.*]], [[B]]
-; CHECK-NEXT: ret i1 [[RES]]
+; CHECK-NEXT: ret i1 true
;
%b = alloca i32
%res = icmp ne i32* %a, %b
@@ -2812,11 +2809,10 @@
}
-; TODO: Never equal
+; Never equal
define i1 @test_byval_global_inequal(i32* byval(i32) %a) {
; CHECK-LABEL: @test_byval_global_inequal(
-; CHECK-NEXT: [[RES:%.*]] = icmp ne i32* [[A:%.*]], @B
-; CHECK-NEXT: ret i1 [[RES]]
+; CHECK-NEXT: ret i1 true
;
%b = alloca i32
%res = icmp ne i32* %a, @B
Index: llvm/lib/Analysis/InstructionSimplify.cpp
===================================================================
--- llvm/lib/Analysis/InstructionSimplify.cpp
+++ llvm/lib/Analysis/InstructionSimplify.cpp
@@ -2533,6 +2533,19 @@
// So, we'll assume that two non-empty allocas have different addresses
// for now.
//
+
+ auto isByValArg = [](const Value *V) {
+ const Argument *A = dyn_cast<Argument>(V);
+ return A && A->hasByValAttr();
+ };
+
+ // Byval args are backed by store which does not overlap with each other,
+ // allocas, or globals.
+ if (isByValArg(V1))
+ return isa<AllocaInst>(V2) || isa<GlobalVariable>(V2) || isByValArg(V2);
+ if (isByValArg(V2))
+ return isa<AllocaInst>(V1) || isa<GlobalVariable>(V1) || isByValArg(V1);
+
return isa<AllocaInst>(V1) &&
(isa<AllocaInst>(V2) || isa<GlobalVariable>(V2));
}
@@ -2637,8 +2650,12 @@
uint64_t LHSSize, RHSSize;
ObjectSizeOpts Opts;
Opts.EvalMode = ObjectSizeOpts::Mode::Min;
- Opts.NullIsUnknownSize =
- NullPointerIsDefined(cast<AllocaInst>(LHS)->getFunction());
+ auto *F = [](Value *V) {
+ if (auto *I = dyn_cast<Instruction>(V))
+ return I->getFunction();
+ return cast<Argument>(V)->getParent();
+ }(LHS);
+ Opts.NullIsUnknownSize = NullPointerIsDefined(F);
if (getObjectSize(LHS, LHSSize, DL, TLI, Opts) &&
getObjectSize(RHS, RHSSize, DL, TLI, Opts) &&
!LHSOffset.isNegative() && !RHSOffset.isNegative() &&
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D120133.409943.patch
Type: text/x-patch
Size: 2858 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20220218/137636c3/attachment.bin>
More information about the llvm-commits
mailing list