mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-04-16 06:30:13 +00:00
[InstCombine] fix foldSPFofSPF() to handle vector splats
llvm-svn: 285345
This commit is contained in:
parent
20e3021a2f
commit
fc59e659b5
@ -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)
|
||||||
|
@ -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>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user