mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-03 13:31:05 +00:00
ARM cost model: Penalize insertelement into D subregisters
Swift has a renaming dependency if we load into D subregisters. We don't have a way of distinguishing between insertelement operations of values from loads and other values. Therefore, we are pessimistic for now (The performance problem showed up in example 14 of gcc-loops). radar://13096933 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@174300 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
4b5dbaa96a
commit
a7ad84851b
@ -117,6 +117,7 @@ public:
|
|||||||
unsigned getCastInstrCost(unsigned Opcode, Type *Dst,
|
unsigned getCastInstrCost(unsigned Opcode, Type *Dst,
|
||||||
Type *Src) const;
|
Type *Src) const;
|
||||||
|
|
||||||
|
unsigned getVectorInstrCost(unsigned Opcode, Type *Val, unsigned Index) const;
|
||||||
/// @}
|
/// @}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -197,3 +198,15 @@ unsigned ARMTTI::getCastInstrCost(unsigned Opcode, Type *Dst,
|
|||||||
|
|
||||||
return TargetTransformInfo::getCastInstrCost(Opcode, Dst, Src);
|
return TargetTransformInfo::getCastInstrCost(Opcode, Dst, Src);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsigned ARMTTI::getVectorInstrCost(unsigned Opcode, Type *ValTy,
|
||||||
|
unsigned Index) const {
|
||||||
|
// Penalize inserting into an D-subregister.
|
||||||
|
if (ST->isSwift() &&
|
||||||
|
Opcode == Instruction::InsertElement &&
|
||||||
|
ValTy->isVectorTy() &&
|
||||||
|
ValTy->getScalarSizeInBits() <= 32)
|
||||||
|
return 2;
|
||||||
|
|
||||||
|
return TargetTransformInfo::getVectorInstrCost(Opcode, ValTy, Index);
|
||||||
|
}
|
||||||
|
46
test/Analysis/CostModel/ARM/insertelement.ll
Normal file
46
test/Analysis/CostModel/ARM/insertelement.ll
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
; RUN: opt -cost-model -analyze -mtriple=thumbv7-apple-ios6.0.0 -mcpu=swift < %s | FileCheck %s
|
||||||
|
|
||||||
|
target datalayout = "e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:32:64-v128:32:128-a0:0:32-n32-S32"
|
||||||
|
target triple = "thumbv7-apple-ios6.0.0"
|
||||||
|
|
||||||
|
; Multiple insert elements from loads into d subregisters are expensive on swift
|
||||||
|
; due to renaming constraints.
|
||||||
|
%T_i8v = type <8 x i8>
|
||||||
|
%T_i8 = type i8
|
||||||
|
; CHECK: insertelement_i8
|
||||||
|
define void @insertelement_i8(%T_i8* %saddr,
|
||||||
|
%T_i8v* %vaddr) {
|
||||||
|
%v0 = load %T_i8v* %vaddr
|
||||||
|
%v1 = load %T_i8* %saddr
|
||||||
|
;CHECK: estimated cost of 2 for {{.*}} insertelement <8 x i8>
|
||||||
|
%v2 = insertelement %T_i8v %v0, %T_i8 %v1, i32 1
|
||||||
|
store %T_i8v %v2, %T_i8v* %vaddr
|
||||||
|
ret void
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
%T_i16v = type <4 x i16>
|
||||||
|
%T_i16 = type i16
|
||||||
|
; CHECK: insertelement_i16
|
||||||
|
define void @insertelement_i16(%T_i16* %saddr,
|
||||||
|
%T_i16v* %vaddr) {
|
||||||
|
%v0 = load %T_i16v* %vaddr
|
||||||
|
%v1 = load %T_i16* %saddr
|
||||||
|
;CHECK: estimated cost of 2 for {{.*}} insertelement <4 x i16>
|
||||||
|
%v2 = insertelement %T_i16v %v0, %T_i16 %v1, i32 1
|
||||||
|
store %T_i16v %v2, %T_i16v* %vaddr
|
||||||
|
ret void
|
||||||
|
}
|
||||||
|
|
||||||
|
%T_i32v = type <2 x i32>
|
||||||
|
%T_i32 = type i32
|
||||||
|
; CHECK: insertelement_i32
|
||||||
|
define void @insertelement_i32(%T_i32* %saddr,
|
||||||
|
%T_i32v* %vaddr) {
|
||||||
|
%v0 = load %T_i32v* %vaddr
|
||||||
|
%v1 = load %T_i32* %saddr
|
||||||
|
;CHECK: estimated cost of 2 for {{.*}} insertelement <2 x i32>
|
||||||
|
%v2 = insertelement %T_i32v %v0, %T_i32 %v1, i32 1
|
||||||
|
store %T_i32v %v2, %T_i32v* %vaddr
|
||||||
|
ret void
|
||||||
|
}
|
6
test/Analysis/CostModel/ARM/lit.local.cfg
Normal file
6
test/Analysis/CostModel/ARM/lit.local.cfg
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
config.suffixes = ['.ll', '.c', '.cpp']
|
||||||
|
|
||||||
|
targets = set(config.root.targets_to_build.split())
|
||||||
|
if not 'ARM' in targets:
|
||||||
|
config.unsupported = True
|
||||||
|
|
Loading…
Reference in New Issue
Block a user