[Inliner] Propagate SROA analysis through invariant group intrinsics

SROA can handle invariant group intrinsics, let the inliner know that
for better heuristics when the intrinsics are present.

This fixes size issues in a couple files when turning on
-fstrict-vtable-pointers in Chrome.

Reviewed By: rnk, mtrofin

Differential Revision: https://reviews.llvm.org/D100249
This commit is contained in:
Arthur Eubanks 2021-04-10 11:59:04 -07:00
parent 0a92aff721
commit 269b335bd7
2 changed files with 31 additions and 0 deletions

View File

@ -1884,6 +1884,11 @@ bool CallAnalyzer::visitCallBase(CallBase &Call) {
case Intrinsic::vastart:
InitsVargArgs = true;
return false;
case Intrinsic::launder_invariant_group:
case Intrinsic::strip_invariant_group:
if (auto *SROAArg = getSROAArgForValueOrNull(II->getOperand(0)))
SROAArgValues[II] = SROAArg;
return true;
}
}

View File

@ -0,0 +1,26 @@
; RUN: opt -passes='print<inline-cost>' -disable-output %s 2>&1 | FileCheck %s
; SROA analysis should yield non-zero savings for allocas passed through invariant group intrinsics
; CHECK: SROACostSavings: 10
declare i8* @llvm.launder.invariant.group.p0i8(i8*)
declare i8* @llvm.strip.invariant.group.p0i8(i8*)
declare void @b()
define i32 @f() {
%a = alloca i32
%r = call i32 @g(i32* %a)
ret i32 %r
}
define i32 @g(i32* %a) {
%a_i8 = bitcast i32* %a to i8*
%a_inv_i8 = call i8* @llvm.launder.invariant.group.p0i8(i8* %a_i8)
%a_inv = bitcast i8* %a_inv_i8 to i32*
%i1 = load i32, i32* %a_inv
%i2 = load i32, i32* %a_inv
%i3 = add i32 %i1, %i2
%t = call i8* @llvm.strip.invariant.group.p0i8(i8* %a_inv_i8)
ret i32 %i3
}