diff --git a/llvm/lib/Analysis/InstructionSimplify.cpp b/llvm/lib/Analysis/InstructionSimplify.cpp --- a/llvm/lib/Analysis/InstructionSimplify.cpp +++ b/llvm/lib/Analysis/InstructionSimplify.cpp @@ -2555,7 +2555,19 @@ // // So, we'll assume that two non-empty allocas have different addresses // for now. - return isa(V1) && + auto isByValArg = [](const Value *V) { + const Argument *A = dyn_cast(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(V2) || isa(V2) || isByValArg(V2); + if (isByValArg(V2)) + return isa(V1) || isa(V1) || isByValArg(V1); + + return isa(V1) && (isa(V2) || isa(V2)); } @@ -2659,8 +2671,12 @@ uint64_t LHSSize, RHSSize; ObjectSizeOpts Opts; Opts.EvalMode = ObjectSizeOpts::Mode::Min; - Opts.NullIsUnknownSize = - NullPointerIsDefined(cast(LHS)->getFunction()); + auto *F = [](Value *V) { + if (auto *I = dyn_cast(V)) + return I->getFunction(); + return cast(V)->getParent(); + }(LHS); + Opts.NullIsUnknownSize = NullPointerIsDefined(F); if (getObjectSize(LHS, LHSSize, DL, TLI, Opts) && getObjectSize(RHS, RHSSize, DL, TLI, Opts) && !LHSOffset.isNegative() && !RHSOffset.isNegative() && diff --git a/llvm/test/Transforms/InstSimplify/compare.ll b/llvm/test/Transforms/InstSimplify/compare.ll --- a/llvm/test/Transforms/InstSimplify/compare.ll +++ b/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