mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 11:42:57 +01:00
SelectionDAG: Add sext_inreg optimizations
v2: use dyn_cast fixup comments v3: use cast Reviewed-by: Matt Arsenault <arsenm2@gmail.com> Signed-off-by: Jan Vesely <jan.vesely@rutgers.edu> llvm-svn: 220044
This commit is contained in:
parent
86aabae168
commit
31f817808d
@ -1680,6 +1680,17 @@ SDValue DAGCombiner::visitADD(SDNode *N) {
|
||||
return DAG.getNode(ISD::SUB, DL, VT, N1, ZExt);
|
||||
}
|
||||
|
||||
// add X, (sextinreg Y i1) -> sub X, (and Y 1)
|
||||
if (N1.getOpcode() == ISD::SIGN_EXTEND_INREG) {
|
||||
VTSDNode *TN = cast<VTSDNode>(N1.getOperand(1));
|
||||
if (TN->getVT() == MVT::i1) {
|
||||
SDLoc DL(N);
|
||||
SDValue ZExt = DAG.getNode(ISD::AND, DL, VT, N1.getOperand(0),
|
||||
DAG.getConstant(1, VT));
|
||||
return DAG.getNode(ISD::SUB, DL, VT, N0, ZExt);
|
||||
}
|
||||
}
|
||||
|
||||
return SDValue();
|
||||
}
|
||||
|
||||
@ -1845,6 +1856,17 @@ SDValue DAGCombiner::visitSUB(SDNode *N) {
|
||||
VT);
|
||||
}
|
||||
|
||||
// sub X, (sextinreg Y i1) -> add X, (and Y 1)
|
||||
if (N1.getOpcode() == ISD::SIGN_EXTEND_INREG) {
|
||||
VTSDNode *TN = cast<VTSDNode>(N1.getOperand(1));
|
||||
if (TN->getVT() == MVT::i1) {
|
||||
SDLoc DL(N);
|
||||
SDValue ZExt = DAG.getNode(ISD::AND, DL, VT, N1.getOperand(0),
|
||||
DAG.getConstant(1, VT));
|
||||
return DAG.getNode(ISD::ADD, DL, VT, N0, ZExt);
|
||||
}
|
||||
}
|
||||
|
||||
return SDValue();
|
||||
}
|
||||
|
||||
|
26
test/CodeGen/R600/sext-eliminate.ll
Normal file
26
test/CodeGen/R600/sext-eliminate.ll
Normal file
@ -0,0 +1,26 @@
|
||||
; RUN: llc -march=r600 -mcpu=cypress -verify-machineinstrs < %s | FileCheck -check-prefix=EG -check-prefix=FUNC %s
|
||||
|
||||
|
||||
; FUNC-LABEL: {{^}}sext_in_reg_i1_i32_add:
|
||||
|
||||
; EG: MEM_{{.*}} STORE_{{.*}} [[RES:T[0-9]+\.[XYZW]]], [[ADDR:T[0-9]+.[XYZW]]]
|
||||
; EG: SUB_INT {{[* ]*}}[[RES]]
|
||||
; EG-NOT: BFE
|
||||
define void @sext_in_reg_i1_i32_add(i32 addrspace(1)* %out, i1 %a, i32 %b) {
|
||||
%sext = sext i1 %a to i32
|
||||
%res = add i32 %b, %sext
|
||||
store i32 %res, i32 addrspace(1)* %out
|
||||
ret void
|
||||
}
|
||||
|
||||
; FUNC-LABEL: {{^}}sext_in_reg_i1_i32_sub:
|
||||
|
||||
; EG: MEM_{{.*}} STORE_{{.*}} [[RES:T[0-9]+\.[XYZW]]], [[ADDR:T[0-9]+.[XYZW]]]
|
||||
; EG: ADD_INT {{[* ]*}}[[RES]]
|
||||
; EG-NOT: BFE
|
||||
define void @sext_in_reg_i1_i32_sub(i32 addrspace(1)* %out, i1 %a, i32 %b) {
|
||||
%sext = sext i1 %a to i32
|
||||
%res = sub i32 %b, %sext
|
||||
store i32 %res, i32 addrspace(1)* %out
|
||||
ret void
|
||||
}
|
Loading…
Reference in New Issue
Block a user