mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-13 09:33:50 +00:00
LegalizeDAG: Respect the result of TLI.getBooleanContents() when expanding SETCC
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@176695 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
3ef5383b35
commit
03abf2f2aa
@ -3632,8 +3632,20 @@ void SelectionDAGLegalize::ExpandNode(SDNode *Node) {
|
||||
// Otherwise, SETCC for the given comparison type must be completely
|
||||
// illegal; expand it into a SELECT_CC.
|
||||
EVT VT = Node->getValueType(0);
|
||||
int TrueValue;
|
||||
switch(TLI.getBooleanContents(VT.isVector())) {
|
||||
default: assert(!"Unhandled BooleanContent value");
|
||||
case TargetLowering::ZeroOrOneBooleanContent:
|
||||
case TargetLowering::UndefinedBooleanContent:
|
||||
TrueValue = 1;
|
||||
break;
|
||||
case TargetLowering::ZeroOrNegativeOneBooleanContent:
|
||||
TrueValue = -1;
|
||||
break;
|
||||
}
|
||||
Tmp1 = DAG.getNode(ISD::SELECT_CC, dl, VT, Tmp1, Tmp2,
|
||||
DAG.getConstant(1, VT), DAG.getConstant(0, VT), Tmp3);
|
||||
DAG.getConstant(TrueValue, VT), DAG.getConstant(0, VT),
|
||||
Tmp3);
|
||||
Results.push_back(Tmp1);
|
||||
break;
|
||||
}
|
||||
|
26
test/CodeGen/R600/legalizedag-bug-expand-setcc.ll
Normal file
26
test/CodeGen/R600/legalizedag-bug-expand-setcc.ll
Normal file
@ -0,0 +1,26 @@
|
||||
; RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s
|
||||
|
||||
; This tests a bug where LegalizeDAG was not checking the target's
|
||||
; BooleanContents value and always using one for true, when expanding
|
||||
; setcc to select_cc.
|
||||
;
|
||||
; This bug caused the icmp IR instruction to be expanded to two machine
|
||||
; instructions, when only one is needed.
|
||||
;
|
||||
|
||||
; CHECK: @setcc_expand
|
||||
; CHECK: SET
|
||||
; CHECK-NOT: CND
|
||||
define void @setcc_expand(i32 addrspace(1)* %out, i32 %in) {
|
||||
entry:
|
||||
%0 = icmp eq i32 %in, 5
|
||||
br i1 %0, label %IF, label %ENDIF
|
||||
IF:
|
||||
%1 = getelementptr i32 addrspace(1)* %out, i32 1
|
||||
store i32 0, i32 addrspace(1)* %1
|
||||
br label %ENDIF
|
||||
|
||||
ENDIF:
|
||||
store i32 0, i32 addrspace(1)* %out
|
||||
ret void
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user