[llvm] r320516 - [Hexagon] Fix wrong order of operands for vmux

Krzysztof Parzyszek via llvm-commits llvm-commits at lists.llvm.org
Tue Dec 12 11:32:41 PST 2017


Author: kparzysz
Date: Tue Dec 12 11:32:41 2017
New Revision: 320516

URL: http://llvm.org/viewvc/llvm-project?rev=320516&view=rev
Log:
[Hexagon] Fix wrong order of operands for vmux

Shuffle generation uses vmux to collapse vectors resulting from two
individual shuffles into one. The indexes of the elements selected
from the first operand were indicated by 0xFF in the constant vector
used in the compare instruction, but the compare (veqb) set the bits
corresponding to the 0x00 elements, thus inverting the selection.

Reverse the order of operands to vmux to get the correct output.

Added:
    llvm/trunk/test/CodeGen/Hexagon/autohvx/vmux-order.ll
Modified:
    llvm/trunk/lib/Target/Hexagon/HexagonISelDAGToDAGHVX.cpp

Modified: llvm/trunk/lib/Target/Hexagon/HexagonISelDAGToDAGHVX.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Hexagon/HexagonISelDAGToDAGHVX.cpp?rev=320516&r1=320515&r2=320516&view=diff
==============================================================================
--- llvm/trunk/lib/Target/Hexagon/HexagonISelDAGToDAGHVX.cpp (original)
+++ llvm/trunk/lib/Target/Hexagon/HexagonISelDAGToDAGHVX.cpp Tue Dec 12 11:32:41 2017
@@ -1147,7 +1147,7 @@ OpRef HvxSelector::vmuxs(ArrayRef<uint8_
   SDValue B = getVectorConstant(Bytes, dl);
   Results.push(Hexagon::V6_vd0, ByteTy, {});
   Results.push(Hexagon::V6_veqb, BoolTy, {OpRef(B), OpRef::res(-1)});
-  Results.push(Hexagon::V6_vmux, ByteTy, {OpRef::res(-1), Va, Vb});
+  Results.push(Hexagon::V6_vmux, ByteTy, {OpRef::res(-1), Vb, Va});
   return OpRef::res(Results.top());
 }
 

Added: llvm/trunk/test/CodeGen/Hexagon/autohvx/vmux-order.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Hexagon/autohvx/vmux-order.ll?rev=320516&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/Hexagon/autohvx/vmux-order.ll (added)
+++ llvm/trunk/test/CodeGen/Hexagon/autohvx/vmux-order.ll Tue Dec 12 11:32:41 2017
@@ -0,0 +1,15 @@
+; RUN: llc -march=hexagon < %s | FileCheck %s
+
+; The generated code isn't great, the vdeltas are no-ops (controls are all 0).
+; Check for the correct order of vmux operands as is, when the code improves
+; fix the checking as well.
+
+; CHECK-DAG: v[[V0:[0-9]+]] = vdelta(v0,v{{[0-9]+}})
+; CHECK-DAG: v[[V1:[0-9]+]] = vdelta(v1,v{{[0-9]+}})
+; CHECK: vmux(q{{[0-3]+}},v[[V1]],v[[V0]])
+define <16 x i32> @fred(<16 x i32> %v0, <16 x i32> %v1) #0 {
+  %p = shufflevector <16 x i32> %v0, <16 x i32> %v1, <16 x i32> <i32 0,i32 17,i32 2,i32 19,i32 4,i32 21,i32 6,i32 23,i32 8,i32 25,i32 10,i32 27,i32 12,i32 29,i32 14,i32 31>
+  ret <16 x i32> %p
+}
+
+attributes #0 = { nounwind readnone "target-cpu"="hexagonv60" "target-features"="+hvx,+hvx-length64b" }




More information about the llvm-commits mailing list