[Hexagon] Skip byval arguments when checking parameter attributes

From the point of view of register assignment, byval parameters are
ignored: a byval parameter is not going to be assigned to a register,
and it will not affect the assignments of subsequent parameters.
When matching registers with parameters in the bit tracker, make sure
to skip byval parameters before advancing the registers.

llvm-svn: 278375
This commit is contained in:
Krzysztof Parzyszek 2016-08-11 18:15:16 +00:00
parent fd34ba53e3
commit 60f0b51485
2 changed files with 14 additions and 1 deletions

View File

@ -60,13 +60,15 @@ HexagonEvaluator::HexagonEvaluator(const HexagonRegisterInfo &tri,
// Module::AnyPointerSize.
if (Width == 0 || Width > 64)
break;
AttributeSet Attrs = F.getAttributes();
if (Attrs.hasAttribute(AttrIdx, Attribute::ByVal))
continue;
InPhysReg = getNextPhysReg(InPhysReg, Width);
if (!InPhysReg)
break;
InVirtReg = getVirtRegFor(InPhysReg);
if (!InVirtReg)
continue;
AttributeSet Attrs = F.getAttributes();
if (Attrs.hasAttribute(AttrIdx, Attribute::SExt))
VRX.insert(std::make_pair(InVirtReg, ExtType(ExtType::SExt, Width)));
else if (Attrs.hasAttribute(AttrIdx, Attribute::ZExt))

View File

@ -0,0 +1,11 @@
; RUN: llc -march=hexagon < %s | FileCheck %s
;
; Either and or zxtb.
; CHECK: r0 = and(r1, #255)
%struct.t0 = type { i32 }
define i32 @foo(%struct.t0* byval align 8 %s, i8 zeroext %t, i8 %u) #0 {
%a = zext i8 %u to i32
ret i32 %a
}