From 65aac0f8e350f36808f685459195d2ae99e8949f Mon Sep 17 00:00:00 2001 From: David Xu Date: Thu, 11 Sep 2014 05:10:28 +0000 Subject: [PATCH] Build correct vector filled with undef nodes git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@217570 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/SelectionDAG/DAGCombiner.cpp | 24 ++++++++++--- test/CodeGen/AArch64/aarch64_tree_tests.ll | 42 ++++++++++++++++++++++ 2 files changed, 62 insertions(+), 4 deletions(-) create mode 100644 test/CodeGen/AArch64/aarch64_tree_tests.ll diff --git a/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index b21181c3985..156d0a36930 100644 --- a/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -2664,9 +2664,17 @@ SDValue DAGCombiner::visitAND(SDNode *N) { // fold (and x, 0) -> 0, vector edition if (ISD::isBuildVectorAllZeros(N0.getNode())) - return N0; + // do not return N0, because undef node may exist in N0 + return DAG.getConstant( + APInt::getNullValue( + N0.getValueType().getScalarType().getSizeInBits()), + N0.getValueType()); if (ISD::isBuildVectorAllZeros(N1.getNode())) - return N1; + // do not return N1, because undef node may exist in N1 + return DAG.getConstant( + APInt::getNullValue( + N1.getValueType().getScalarType().getSizeInBits()), + N1.getValueType()); // fold (and x, -1) -> x, vector edition if (ISD::isBuildVectorAllOnes(N0.getNode())) @@ -3312,9 +3320,17 @@ SDValue DAGCombiner::visitOR(SDNode *N) { // fold (or x, -1) -> -1, vector edition if (ISD::isBuildVectorAllOnes(N0.getNode())) - return N0; + // do not return N0, because undef node may exist in N0 + return DAG.getConstant( + APInt::getAllOnesValue( + N0.getValueType().getScalarType().getSizeInBits()), + N0.getValueType()); if (ISD::isBuildVectorAllOnes(N1.getNode())) - return N1; + // do not return N1, because undef node may exist in N1 + return DAG.getConstant( + APInt::getAllOnesValue( + N1.getValueType().getScalarType().getSizeInBits()), + N1.getValueType()); // fold (or (shuf A, V_0, MA), (shuf B, V_0, MB)) -> (shuf A, B, Mask1) // fold (or (shuf A, V_0, MA), (shuf B, V_0, MB)) -> (shuf B, A, Mask2) diff --git a/test/CodeGen/AArch64/aarch64_tree_tests.ll b/test/CodeGen/AArch64/aarch64_tree_tests.ll new file mode 100644 index 00000000000..08e506a66d5 --- /dev/null +++ b/test/CodeGen/AArch64/aarch64_tree_tests.ll @@ -0,0 +1,42 @@ +; RUN: llc < %s | FileCheck %s + +; ModuleID = 'aarch64_tree_tests.bc' +target datalayout = "e-m:e-i64:64-i128:128-n32:64-S128" +target triple = "arm64--linux-gnu" + +; CHECK-LABLE: @aarch64_tree_tests_and +; CHECK: .hword 32768 +; CHECK: .hword 32767 +; CHECK: .hword 4664 +; CHECK: .hword 32767 +; CHECK: .hword 32768 +; CHECK: .hword 32768 +; CHECK: .hword 0 +; CHECK: .hword 0 + +; Function Attrs: nounwind readnone +define <8 x i16> @aarch64_tree_tests_and(<8 x i16> %a) { +entry: + %and = and <8 x i16> , %a + %ret = add <8 x i16> %and, + ret <8 x i16> %ret +} + +; CHECK-LABLE: @aarch64_tree_tests_or +; CHECK: .hword 32768 +; CHECK: .hword 32766 +; CHECK: .hword 4664 +; CHECK: .hword 32766 +; CHECK: .hword 32768 +; CHECK: .hword 32768 +; CHECK: .hword 65535 +; CHECK: .hword 65535 + +; Function Attrs: nounwind readnone +define <8 x i16> @aarch64_tree_tests_or(<8 x i16> %a) { +entry: + %or = or <8 x i16> , %a + %ret = add <8 x i16> %or, + ret <8 x i16> %ret +} + -- 2.34.1