[Hexagon] Skip byval arguments when checking parameter attributes
authorKrzysztof Parzyszek <kparzysz@codeaurora.org>
Thu, 11 Aug 2016 18:15:16 +0000 (18:15 +0000)
committerKrzysztof Parzyszek <kparzysz@codeaurora.org>
Thu, 11 Aug 2016 18:15:16 +0000 (18:15 +0000)
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

llvm/lib/Target/Hexagon/HexagonBitTracker.cpp
llvm/test/CodeGen/Hexagon/bit-skip-byval.ll [new file with mode: 0644]

index 25a8da7..1f45acc 100644 (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))
diff --git a/llvm/test/CodeGen/Hexagon/bit-skip-byval.ll b/llvm/test/CodeGen/Hexagon/bit-skip-byval.ll
new file mode 100644 (file)
index 0000000..d6c1aad
--- /dev/null
@@ -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
+}