Correctly estimate SROA savings for store operands in inline cost analysis.

When estimating SROA savings, we want to see if an address is derived
off an alloca in the caller. For store instructions, operand 1 is the
address operand, but the current code uses operand 0.  Use
getPointerOperand for loads and stores to fix this.

Patch by Easwaran Raman.
http://reviews.llvm.org/D8425


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@232827 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Wei Mi 2015-03-20 18:33:12 +00:00
parent e7cec1e853
commit 8979e3f69b
2 changed files with 24 additions and 2 deletions

View File

@ -621,7 +621,7 @@ bool CallAnalyzer::visitBinaryOperator(BinaryOperator &I) {
bool CallAnalyzer::visitLoad(LoadInst &I) {
Value *SROAArg;
DenseMap<Value *, int>::iterator CostIt;
if (lookupSROAArgAndCost(I.getOperand(0), SROAArg, CostIt)) {
if (lookupSROAArgAndCost(I.getPointerOperand(), SROAArg, CostIt)) {
if (I.isSimple()) {
accumulateSROACost(CostIt, InlineConstants::InstrCost);
return true;
@ -636,7 +636,7 @@ bool CallAnalyzer::visitLoad(LoadInst &I) {
bool CallAnalyzer::visitStore(StoreInst &I) {
Value *SROAArg;
DenseMap<Value *, int>::iterator CostIt;
if (lookupSROAArgAndCost(I.getOperand(0), SROAArg, CostIt)) {
if (lookupSROAArgAndCost(I.getPointerOperand(), SROAArg, CostIt)) {
if (I.isSimple()) {
accumulateSROACost(CostIt, InlineConstants::InstrCost);
return true;

View File

@ -0,0 +1,22 @@
; RUN: opt -S -O2 -inline-threshold=1 < %s | FileCheck %s
%class.A = type { i32 }
define void @_Z3barP1A(%class.A* %a) #0 {
entry:
%a1 = getelementptr inbounds %class.A, %class.A* %a, i64 0, i32 0
%0 = load i32, i32* %a1, align 4
%add = add nsw i32 %0, 10
store i32 %add, i32* %a1, align 4
ret void
}
define void @_Z3foov() #0 {
; CHECK-LABEL: @_Z3foov(
; CHECK-NOT: call void @_Z3barP1A
; CHECK: ret
entry:
%a = alloca %class.A, align 4
call void @_Z3barP1A(%class.A* %a)
ret void
}