[AArch64 NEON] Fix invalid constant used in vselect condition.
authorKevin Qin <Kevin.Qin@arm.com>
Mon, 6 Jan 2014 02:26:10 +0000 (02:26 +0000)
committerKevin Qin <Kevin.Qin@arm.com>
Mon, 6 Jan 2014 02:26:10 +0000 (02:26 +0000)
commit5cd73c9e0a7af4047df073fb5395fe111ea627f6
treefae4dc3091205a54dbe442efe2cad702c273ffd0
parent63c6b45a5aa86e8279b1582ef79416a59cec3ab0
[AArch64 NEON] Fix invalid constant used in vselect condition.

There is a wrong assumption that the vector element type and the
type of each ConstantSDNode in the build_vector were the same.
However, when promoting the integer operand of a legally typed
build_vector, the operand type and the vector element type do not
need to be the same
(See method 'DAGTypeLegalizer::PromoteIntOp_BUILD_VECTOR' in
LegalizeIntegerTypes.cpp).

  in AArch64 backend, the following dag sequence:

  C0: i1 = Constant<0>
  C1: i1 = Constant<-1>
  V: v8i1 = BUILD_VECTOR C1, C1, C0, C0, C0, C0, C0, C0

  is type-legalized into:

  NewC0: i32 = Constant<0>
  NewC1: i32 = Constant<1>
  V: v8i8 = BUILD_VECTOR NewC1, NewC1, NewC0, NewC0, NewC0, NewC0, NewC0, NewC0

Forcing a getZeroExtend to VTBits to ensure that the new constant
is correctly.

llvm-svn: 198582
llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
llvm/test/CodeGen/AArch64/neon-bitwise-instructions.ll