[llvm] r176695 - LegalizeDAG: Respect the result of TLI.getBooleanContents() when expanding SETCC
Tom Stellard
thomas.stellard at amd.com
Fri Mar 8 07:37:02 PST 2013
Author: tstellar
Date: Fri Mar 8 09:37:02 2013
New Revision: 176695
URL: http://llvm.org/viewvc/llvm-project?rev=176695&view=rev
Log:
LegalizeDAG: Respect the result of TLI.getBooleanContents() when expanding SETCC
Added:
llvm/trunk/test/CodeGen/R600/legalizedag-bug-expand-setcc.ll
Modified:
llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
Modified: llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp?rev=176695&r1=176694&r2=176695&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp (original)
+++ llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Fri Mar 8 09:37:02 2013
@@ -3632,8 +3632,20 @@ void SelectionDAGLegalize::ExpandNode(SD
// 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;
}
Added: llvm/trunk/test/CodeGen/R600/legalizedag-bug-expand-setcc.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/R600/legalizedag-bug-expand-setcc.ll?rev=176695&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/R600/legalizedag-bug-expand-setcc.ll (added)
+++ llvm/trunk/test/CodeGen/R600/legalizedag-bug-expand-setcc.ll Fri Mar 8 09:37:02 2013
@@ -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
+}
More information about the llvm-commits
mailing list