[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:
parent
fd34ba53e3
commit
60f0b51485
|
@ -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))
|
||||
|
|
|
@ -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
|
||||
}
|
Loading…
Reference in New Issue