mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 20:51:52 +01:00
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 llvm-svn: 232827
This commit is contained in:
parent
a59519abd4
commit
2edc60752a
@ -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;
|
||||
|
22
test/Transforms/Inline/store-sroa.ll
Normal file
22
test/Transforms/Inline/store-sroa.ll
Normal 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
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user