[InstCombine] fix foldSPFofSPF() to handle vector splats

llvm-svn: 285345
This commit is contained in:
Sanjay Patel 2016-10-27 21:19:40 +00:00
parent 20e3021a2f
commit fc59e659b5
2 changed files with 23 additions and 29 deletions

View File

@ -678,31 +678,27 @@ Instruction *InstCombiner::foldSPFofSPF(Instruction *Inner,
} }
if (SPF1 == SPF2) { if (SPF1 == SPF2) {
if (ConstantInt *CB = dyn_cast<ConstantInt>(B)) { const APInt *CB, *CC;
if (ConstantInt *CC = dyn_cast<ConstantInt>(C)) { if (match(B, m_APInt(CB)) && match(C, m_APInt(CC))) {
const APInt &ACB = CB->getValue();
const APInt &ACC = CC->getValue();
// MIN(MIN(A, 23), 97) -> MIN(A, 23) // MIN(MIN(A, 23), 97) -> MIN(A, 23)
// MAX(MAX(A, 97), 23) -> MAX(A, 97) // MAX(MAX(A, 97), 23) -> MAX(A, 97)
if ((SPF1 == SPF_UMIN && ACB.ule(ACC)) || if ((SPF1 == SPF_UMIN && CB->ule(*CC)) ||
(SPF1 == SPF_SMIN && ACB.sle(ACC)) || (SPF1 == SPF_SMIN && CB->sle(*CC)) ||
(SPF1 == SPF_UMAX && ACB.uge(ACC)) || (SPF1 == SPF_UMAX && CB->uge(*CC)) ||
(SPF1 == SPF_SMAX && ACB.sge(ACC))) (SPF1 == SPF_SMAX && CB->sge(*CC)))
return replaceInstUsesWith(Outer, Inner); return replaceInstUsesWith(Outer, Inner);
// MIN(MIN(A, 97), 23) -> MIN(A, 23) // MIN(MIN(A, 97), 23) -> MIN(A, 23)
// MAX(MAX(A, 23), 97) -> MAX(A, 97) // MAX(MAX(A, 23), 97) -> MAX(A, 97)
if ((SPF1 == SPF_UMIN && ACB.ugt(ACC)) || if ((SPF1 == SPF_UMIN && CB->ugt(*CC)) ||
(SPF1 == SPF_SMIN && ACB.sgt(ACC)) || (SPF1 == SPF_SMIN && CB->sgt(*CC)) ||
(SPF1 == SPF_UMAX && ACB.ult(ACC)) || (SPF1 == SPF_UMAX && CB->ult(*CC)) ||
(SPF1 == SPF_SMAX && ACB.slt(ACC))) { (SPF1 == SPF_SMAX && CB->slt(*CC))) {
Outer.replaceUsesOfWith(Inner, A); Outer.replaceUsesOfWith(Inner, A);
return &Outer; return &Outer;
} }
} }
} }
}
// ABS(ABS(X)) -> ABS(X) // ABS(ABS(X)) -> ABS(X)
// NABS(NABS(X)) -> NABS(X) // NABS(NABS(X)) -> NABS(X)

View File

@ -1300,14 +1300,11 @@ define i32 @test68(i32 %x) {
ret i32 %retval ret i32 %retval
} }
; FIXME - vector neglect
define <2 x i32> @test68vec(<2 x i32> %x) { define <2 x i32> @test68vec(<2 x i32> %x) {
; CHECK-LABEL: @test68vec( ; CHECK-LABEL: @test68vec(
; CHECK-NEXT: [[CMP:%.*]] = icmp sgt <2 x i32> %x, <i32 11, i32 11> ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt <2 x i32> %x, <i32 11, i32 11>
; CHECK-NEXT: [[COND:%.*]] = select <2 x i1> [[CMP]], <2 x i32> <i32 11, i32 11>, <2 x i32> %x ; CHECK-NEXT: [[COND:%.*]] = select <2 x i1> [[CMP]], <2 x i32> <i32 11, i32 11>, <2 x i32> %x
; CHECK-NEXT: [[CMP3:%.*]] = icmp sgt <2 x i32> [[COND]], <i32 92, i32 92> ; CHECK-NEXT: ret <2 x i32> [[COND]]
; CHECK-NEXT: [[RETVAL:%.*]] = select <2 x i1> [[CMP3]], <2 x i32> <i32 92, i32 92>, <2 x i32> [[COND]]
; CHECK-NEXT: ret <2 x i32> [[RETVAL]]
; ;
%cmp = icmp slt <2 x i32> <i32 11, i32 11>, %x %cmp = icmp slt <2 x i32> <i32 11, i32 11>, %x
%cond = select <2 x i1> %cmp, <2 x i32> <i32 11, i32 11>, <2 x i32> %x %cond = select <2 x i1> %cmp, <2 x i32> <i32 11, i32 11>, <2 x i32> %x
@ -1372,13 +1369,14 @@ define i32 @test72(i32 %x) {
ret i32 %retval ret i32 %retval
} }
; FIXME - vector neglect ; FIXME - vector neglect: FoldOrOfICmps()
define <2 x i32> @test72vec(<2 x i32> %x) { define <2 x i32> @test72vec(<2 x i32> %x) {
; CHECK-LABEL: @test72vec( ; CHECK-LABEL: @test72vec(
; CHECK-NEXT: [[CMP:%.*]] = icmp sgt <2 x i32> %x, <i32 92, i32 92> ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt <2 x i32> %x, <i32 92, i32 92>
; CHECK-NEXT: [[COND:%.*]] = select <2 x i1> [[CMP]], <2 x i32> <i32 92, i32 92>, <2 x i32> %x ; CHECK-NEXT: [[CMP31:%.*]] = icmp sgt <2 x i32> %x, <i32 11, i32 11>
; CHECK-NEXT: [[CMP3:%.*]] = icmp sgt <2 x i32> [[COND]], <i32 11, i32 11> ; CHECK-NEXT: [[CMP3:%.*]] = or <2 x i1> [[CMP]], [[CMP31:%.*]]
; CHECK-NEXT: [[RETVAL:%.*]] = select <2 x i1> [[CMP3]], <2 x i32> <i32 11, i32 11>, <2 x i32> [[COND]] ; CHECK-NEXT: [[RETVAL:%.*]] = select <2 x i1> [[CMP3]], <2 x i32> <i32 11, i32 11>, <2 x i32> %x
; CHECK-NEXT: ret <2 x i32> [[RETVAL]] ; CHECK-NEXT: ret <2 x i32> [[RETVAL]]
; ;
%cmp = icmp sgt <2 x i32> %x, <i32 92, i32 92> %cmp = icmp sgt <2 x i32> %x, <i32 92, i32 92>