[llvm] r234763 - DAGCombiner: Fix crash in select(select) opt.
Matthias Braun
matze at braunis.de
Mon Apr 13 10:16:33 PDT 2015
Author: matze
Date: Mon Apr 13 12:16:33 2015
New Revision: 234763
URL: http://llvm.org/viewvc/llvm-project?rev=234763&view=rev
Log:
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
Added:
llvm/trunk/test/CodeGen/Mips/dagcombine_crash.ll
Modified:
llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
Modified: llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp?rev=234763&r1=234762&r2=234763&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp (original)
+++ llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Mon Apr 13 12:16:33 2015
@@ -4881,7 +4881,7 @@ SDValue DAGCombiner::visitSELECT(SDNode
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
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(),
Added: llvm/trunk/test/CodeGen/Mips/dagcombine_crash.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Mips/dagcombine_crash.ll?rev=234763&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/Mips/dagcombine_crash.ll (added)
+++ llvm/trunk/test/CodeGen/Mips/dagcombine_crash.ll Mon Apr 13 12:16:33 2015
@@ -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
+}
More information about the llvm-commits
mailing list