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:
Tom Stellard 2013-03-08 15:37:02 +00:00
parent 3ef5383b35
commit 03abf2f2aa
2 changed files with 39 additions and 1 deletions

View File

@ -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;
}

View 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
}