From 12a70396449f106867a1bab3772ad11b433ae50b Mon Sep 17 00:00:00 2001 From: Matthias Braun Date: Mon, 13 Apr 2015 17:16:33 +0000 Subject: [PATCH] DAGCombiner: Fix crash in select(select) opt. In case of different types used for the condition of the selects the select(select) -> select(and) normalisation cannot be performed. See also: http://reviews.llvm.org/D7622 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@234763 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/SelectionDAG/DAGCombiner.cpp | 4 ++-- test/CodeGen/Mips/dagcombine_crash.ll | 21 +++++++++++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 test/CodeGen/Mips/dagcombine_crash.ll diff --git a/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index 37263ff78a8..14449502ee2 100644 --- a/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -4881,7 +4881,7 @@ SDValue DAGCombiner::visitSELECT(SDNode *N) { SDValue N1_0 = N1->getOperand(0); SDValue N1_1 = N1->getOperand(1); SDValue N1_2 = N1->getOperand(2); - if (N1_2 == N2) { + if (N1_2 == N2 && N0.getValueType() == N1_0.getValueType()) { // Create the actual and node if we can generate good code for it. if (!TLI.shouldNormalizeToSelectSequence(*DAG.getContext(), VT)) { SDValue And = DAG.getNode(ISD::AND, SDLoc(N), N0.getValueType(), @@ -4900,7 +4900,7 @@ SDValue DAGCombiner::visitSELECT(SDNode *N) { SDValue N2_0 = N2->getOperand(0); SDValue N2_1 = N2->getOperand(1); SDValue N2_2 = N2->getOperand(2); - if (N2_1 == N1) { + if (N2_1 == N1 && N0.getValueType() == N2_0.getValueType()) { // Create the actual or node if we can generate good code for it. if (!TLI.shouldNormalizeToSelectSequence(*DAG.getContext(), VT)) { SDValue Or = DAG.getNode(ISD::OR, SDLoc(N), N0.getValueType(), diff --git a/test/CodeGen/Mips/dagcombine_crash.ll b/test/CodeGen/Mips/dagcombine_crash.ll new file mode 100644 index 00000000000..1fdf09b26dd --- /dev/null +++ b/test/CodeGen/Mips/dagcombine_crash.ll @@ -0,0 +1,21 @@ +; RUN: llc -o - %s +; The selection DAG select(select()) normalisation crashed for different types +; on the condition inputs. +target datalayout = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64" +target triple = "mips--" + +define i64 @foobar(double %a) #0 { +entry: + %0 = bitcast double %a to i64 + %trunc = trunc i64 %0 to i32 + %and = and i32 %trunc, 32767 + %sub = add nsw i32 %and, -16383 + %cmp = icmp ugt i32 %and, 16382 + %and5 = and i32 %trunc, 32768 + %tobool = icmp eq i32 %and5, 0 + %or = and i1 %cmp, %tobool + %cmp6 = icmp ugt i32 %sub, 64 + %sext = sext i1 %cmp6 to i64 + %retval.0 = select i1 %or, i64 %sext, i64 0 + ret i64 %retval.0 +} -- 2.34.1