mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 03:33:20 +01:00
Added instcombine for 'MIN(MIN(A, 27), 93)' and 'MAX(MAX(A, 93), 27)'
MIN(MIN(A, 23), 97) -> MIN(A, 23) MAX(MAX(A, 97), 23) -> MAX(A, 97) Differential Revision: http://reviews.llvm.org/D3629 llvm-svn: 208849
This commit is contained in:
parent
de41090110
commit
74c9400378
@ -683,11 +683,27 @@ Instruction *InstCombiner::FoldSPFofSPF(Instruction *Inner,
|
||||
return ReplaceInstUsesWith(Outer, C);
|
||||
}
|
||||
|
||||
// TODO: MIN(MIN(A, 23), 97)
|
||||
// MIN(MIN(A, 23), 97) -> MIN(A, 23)
|
||||
// MAX(MAX(A, 97), 23) -> MAX(A, 97)
|
||||
if (SPF1 == SPF2) {
|
||||
if (ConstantInt *CB = dyn_cast<ConstantInt>(B)) {
|
||||
if (ConstantInt *CC = dyn_cast<ConstantInt>(C)) {
|
||||
APInt ACB = CB->getValue();
|
||||
APInt ACC = CC->getValue();
|
||||
if ((SPF1 == SPF_UMIN && ACB.ule(ACC)) ||
|
||||
(SPF1 == SPF_SMIN && ACB.sle(ACC)) ||
|
||||
(SPF1 == SPF_UMAX && ACB.uge(ACC)) ||
|
||||
(SPF1 == SPF_SMAX && ACB.sge(ACC)))
|
||||
return ReplaceInstUsesWith(Outer, Inner);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: MIN(MIN(A, 97), 23) -> MIN(A, 23)
|
||||
// TODO: MAX(MAX(A, 23), 97) -> MAX(A, 97)
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
|
||||
/// foldSelectICmpAnd - If one of the constants is zero (we know they can't
|
||||
/// both be) and we have an icmp instruction with zero, and we have an 'and'
|
||||
/// with the non-constant value and a power of two we can turn the select
|
||||
|
@ -1085,3 +1085,51 @@ define i32 @test67(i16 %x) {
|
||||
; CHECK: lshr exact i32 %2, 1
|
||||
; CHECK: xor i32 %3, 42
|
||||
}
|
||||
|
||||
; SMIN(SMIN(X, 11), 92) -> SMIN(X, 11)
|
||||
define i32 @test68(i32 %x) {
|
||||
entry:
|
||||
%cmp = icmp slt i32 11, %x
|
||||
%cond = select i1 %cmp, i32 11, i32 %x
|
||||
%cmp3 = icmp slt i32 92, %cond
|
||||
%retval = select i1 %cmp3, i32 92, i32 %cond
|
||||
ret i32 %retval
|
||||
; CHECK-LABEL: @test68(
|
||||
; CHECK: ret i32 %cond
|
||||
}
|
||||
|
||||
; MIN(MIN(X, 24), 83) -> MIN(X, 24)
|
||||
define i32 @test69(i32 %x) {
|
||||
entry:
|
||||
%cmp = icmp ult i32 24, %x
|
||||
%cond = select i1 %cmp, i32 24, i32 %x
|
||||
%cmp3 = icmp ult i32 83, %cond
|
||||
%retval = select i1 %cmp3, i32 83, i32 %cond
|
||||
ret i32 %retval
|
||||
; CHECK-LABEL: @test69(
|
||||
; CHECK: ret i32 %cond
|
||||
}
|
||||
|
||||
; SMAX(SMAX(X, 75), 36) -> SMAX(X, 75)
|
||||
define i32 @test70(i32 %x) {
|
||||
entry:
|
||||
%cmp = icmp slt i32 %x, 75
|
||||
%cond = select i1 %cmp, i32 75, i32 %x
|
||||
%cmp3 = icmp slt i32 %cond, 36
|
||||
%retval = select i1 %cmp3, i32 36, i32 %cond
|
||||
ret i32 %retval
|
||||
; CHECK-LABEL: @test70(
|
||||
; CHECK: ret i32 %cond
|
||||
}
|
||||
|
||||
; MAX(MAX(X, 68), 47) -> MAX(X, 68)
|
||||
define i32 @test71(i32 %x) {
|
||||
entry:
|
||||
%cmp = icmp ult i32 %x, 68
|
||||
%cond = select i1 %cmp, i32 68, i32 %x
|
||||
%cmp3 = icmp ult i32 %cond, 47
|
||||
%retval = select i1 %cmp3, i32 47, i32 %cond
|
||||
ret i32 %retval
|
||||
; CHECK-LABEL: @test71(
|
||||
; CHECK: ret i32 %cond
|
||||
}
|
Loading…
Reference in New Issue
Block a user