[PATCH] DAGCombiner: Respect the result of TLI.getBooleanContents() when expanding SETCC
Tom Stellard
tom at stellard.net
Thu Feb 28 12:48:46 PST 2013
On Thu, Feb 28, 2013 at 05:29:10PM +0100, Duncan Sands wrote:
> Hi Tom, this is OK with a testcase.
>
Hi Duncan,
Here is an updated patch with a test case for R600.
-Tom
> Ciao, Duncan.
>
> On 28/02/13 00:16, Tom Stellard wrote:
> > From: Tom Stellard <thomas.stellard at amd.com>
> >
> > ---
> > lib/CodeGen/SelectionDAG/LegalizeDAG.cpp | 14 +++++++++++++-
> > 1 files changed, 13 insertions(+), 1 deletions(-)
> >
> > diff --git a/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp b/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
> > index f085e44..743a9da 100644
> > --- a/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
> > +++ b/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
> > @@ -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;
> > }
> >
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
-------------- next part --------------
>From 433570da10c7aca49f44680bf348e3aa13029d86 Mon Sep 17 00:00:00 2001
From: Tom Stellard <thomas.stellard at amd.com>
Date: Wed, 27 Feb 2013 18:08:46 -0500
Subject: [PATCH 2/7] LegalizeDAG: Respect the result of
TLI.getBooleanContents() when expanding SETCC
---
lib/CodeGen/SelectionDAG/LegalizeDAG.cpp | 14 ++++++++++-
test/CodeGen/R600/legalizedag-bug-expand-setcc.ll | 26 +++++++++++++++++++++
2 files changed, 39 insertions(+), 1 deletions(-)
create mode 100644 test/CodeGen/R600/legalizedag-bug-expand-setcc.ll
diff --git a/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp b/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
index f085e44..743a9da 100644
--- a/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
+++ b/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
@@ -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;
}
diff --git a/test/CodeGen/R600/legalizedag-bug-expand-setcc.ll b/test/CodeGen/R600/legalizedag-bug-expand-setcc.ll
new file mode 100644
index 0000000..1aae7f9
--- /dev/null
+++ b/test/CodeGen/R600/legalizedag-bug-expand-setcc.ll
@@ -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
+}
--
1.7.8.6
More information about the llvm-commits
mailing list