diff options
-rw-r--r-- | llvm/lib/Target/Hexagon/HexagonBitTracker.cpp | 4 | ||||
-rw-r--r-- | llvm/test/CodeGen/Hexagon/bit-skip-byval.ll | 11 |
2 files changed, 14 insertions, 1 deletions
diff --git a/llvm/lib/Target/Hexagon/HexagonBitTracker.cpp b/llvm/lib/Target/Hexagon/HexagonBitTracker.cpp index 25a8da7560b..1f45accb931 100644 --- a/llvm/lib/Target/Hexagon/HexagonBitTracker.cpp +++ b/llvm/lib/Target/Hexagon/HexagonBitTracker.cpp @@ -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)) diff --git a/llvm/test/CodeGen/Hexagon/bit-skip-byval.ll b/llvm/test/CodeGen/Hexagon/bit-skip-byval.ll new file mode 100644 index 00000000000..d6c1aad9400 --- /dev/null +++ b/llvm/test/CodeGen/Hexagon/bit-skip-byval.ll @@ -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 +} |