From 8979e3f69b73e4dabe527dcfd0bb1471e68bf081 Mon Sep 17 00:00:00 2001 From: Wei Mi Date: Fri, 20 Mar 2015 18:33:12 +0000 Subject: [PATCH] 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 --- lib/Analysis/IPA/InlineCost.cpp | 4 ++-- test/Transforms/Inline/store-sroa.ll | 22 ++++++++++++++++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 test/Transforms/Inline/store-sroa.ll diff --git a/lib/Analysis/IPA/InlineCost.cpp b/lib/Analysis/IPA/InlineCost.cpp index 5a9abec6a2e..eeb3b87382e 100644 --- a/lib/Analysis/IPA/InlineCost.cpp +++ b/lib/Analysis/IPA/InlineCost.cpp @@ -621,7 +621,7 @@ bool CallAnalyzer::visitBinaryOperator(BinaryOperator &I) { bool CallAnalyzer::visitLoad(LoadInst &I) { Value *SROAArg; DenseMap::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::iterator CostIt; - if (lookupSROAArgAndCost(I.getOperand(0), SROAArg, CostIt)) { + if (lookupSROAArgAndCost(I.getPointerOperand(), SROAArg, CostIt)) { if (I.isSimple()) { accumulateSROACost(CostIt, InlineConstants::InstrCost); return true; diff --git a/test/Transforms/Inline/store-sroa.ll b/test/Transforms/Inline/store-sroa.ll new file mode 100644 index 00000000000..6b1ca964d33 --- /dev/null +++ b/test/Transforms/Inline/store-sroa.ll @@ -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 +}