mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-24 22:24:54 +00:00
Added inst-combine for 'MIN(MIN(A, 97), 23)' and 'MAX(MAX(A, 23), 97)'
This removes TODO added in r208849 [http://reviews.llvm.org/D3629] MIN(MIN(A, 97), 23) -> MIN(A, 23) MAX(MAX(A, 23), 97) -> MAX(A, 97) Differential Revision: http://reviews.llvm.org/D3785 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@209110 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -651,24 +651,32 @@ Instruction *InstCombiner::FoldSPFofSPF(Instruction *Inner,
|
||||
return ReplaceInstUsesWith(Outer, C);
|
||||
}
|
||||
|
||||
// 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();
|
||||
|
||||
// MIN(MIN(A, 23), 97) -> MIN(A, 23)
|
||||
// MAX(MAX(A, 97), 23) -> MAX(A, 97)
|
||||
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);
|
||||
|
||||
// MIN(MIN(A, 97), 23) -> MIN(A, 23)
|
||||
// MAX(MAX(A, 23), 97) -> MAX(A, 97)
|
||||
if ((SPF1 == SPF_UMIN && ACB.ugt(ACC)) ||
|
||||
(SPF1 == SPF_SMIN && ACB.sgt(ACC)) ||
|
||||
(SPF1 == SPF_UMAX && ACB.ult(ACC)) ||
|
||||
(SPF1 == SPF_SMAX && ACB.slt(ACC))) {
|
||||
Outer.replaceUsesOfWith(Inner, A);
|
||||
return &Outer;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: MIN(MIN(A, 97), 23) -> MIN(A, 23)
|
||||
// TODO: MAX(MAX(A, 23), 97) -> MAX(A, 97)
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user