[llvm] r234763 - DAGCombiner: Fix crash in select(select) opt.

Quentin Colombet qcolombet at apple.com
Mon Apr 13 10:54:58 PDT 2015


> On Apr 13, 2015, at 10:48 AM, Matthias Braun <matze at braunis.de> wrote:
> 
> But the intended check here is that the compiler doesn't crash. Why would I add an additional FileCheck?

Because just “not crashing” does not mean we do the right thing :).

-Quentin

> 
> - Matthias
> 
>> On Apr 13, 2015, at 10:45 AM, Quentin Colombet <qcolombet at apple.com> wrote:
>> 
>> Hi Matthias,
>> 
>> 
>>> On Apr 13, 2015, at 10:16 AM, Matthias Braun <matze at braunis.de> wrote:
>>> 
>>> 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
>> 
>> Please add some, even trivial, check lines.
>> 
>> Thanks,
>> -Quentin
>> 
>>> +; 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
>>> +}
>>> 
>>> 
>>> _______________________________________________
>>> llvm-commits mailing list
>>> llvm-commits at cs.uiuc.edu
>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>> 
>> 
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
> 





More information about the llvm-commits mailing list