mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-03-01 01:30:36 +00:00
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
This commit is contained in:
parent
332adac427
commit
12a7039644
@ -4881,7 +4881,7 @@ SDValue DAGCombiner::visitSELECT(SDNode *N) {
|
|||||||
SDValue N1_0 = N1->getOperand(0);
|
SDValue N1_0 = N1->getOperand(0);
|
||||||
SDValue N1_1 = N1->getOperand(1);
|
SDValue N1_1 = N1->getOperand(1);
|
||||||
SDValue N1_2 = N1->getOperand(2);
|
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.
|
// Create the actual and node if we can generate good code for it.
|
||||||
if (!TLI.shouldNormalizeToSelectSequence(*DAG.getContext(), VT)) {
|
if (!TLI.shouldNormalizeToSelectSequence(*DAG.getContext(), VT)) {
|
||||||
SDValue And = DAG.getNode(ISD::AND, SDLoc(N), N0.getValueType(),
|
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_0 = N2->getOperand(0);
|
||||||
SDValue N2_1 = N2->getOperand(1);
|
SDValue N2_1 = N2->getOperand(1);
|
||||||
SDValue N2_2 = N2->getOperand(2);
|
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.
|
// Create the actual or node if we can generate good code for it.
|
||||||
if (!TLI.shouldNormalizeToSelectSequence(*DAG.getContext(), VT)) {
|
if (!TLI.shouldNormalizeToSelectSequence(*DAG.getContext(), VT)) {
|
||||||
SDValue Or = DAG.getNode(ISD::OR, SDLoc(N), N0.getValueType(),
|
SDValue Or = DAG.getNode(ISD::OR, SDLoc(N), N0.getValueType(),
|
||||||
|
21
test/CodeGen/Mips/dagcombine_crash.ll
Normal file
21
test/CodeGen/Mips/dagcombine_crash.ll
Normal file
@ -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
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user