mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-14 16:33:28 +00:00
InstSimplify: Handle some simple tautological comparisons
This handles cases where we are comparing a masked value against itself. The analysis could be further improved by making it recursive but such expense is not currently justified. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@222716 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
25efc8dbce
commit
044b644f54
@ -2477,6 +2477,40 @@ static Value *SimplifyICmpInst(unsigned Predicate, Value *LHS, Value *RHS,
|
||||
}
|
||||
}
|
||||
|
||||
// icmp pred (or X, Y), X
|
||||
if (LBO && match(LBO, m_CombineOr(m_Or(m_Value(), m_Specific(RHS)),
|
||||
m_Or(m_Specific(RHS), m_Value())))) {
|
||||
if (Pred == ICmpInst::ICMP_ULT)
|
||||
return getFalse(ITy);
|
||||
if (Pred == ICmpInst::ICMP_UGE)
|
||||
return getTrue(ITy);
|
||||
}
|
||||
// icmp pred X, (or X, Y)
|
||||
if (RBO && match(RBO, m_CombineOr(m_Or(m_Value(), m_Specific(LHS)),
|
||||
m_Or(m_Specific(LHS), m_Value())))) {
|
||||
if (Pred == ICmpInst::ICMP_ULE)
|
||||
return getTrue(ITy);
|
||||
if (Pred == ICmpInst::ICMP_UGT)
|
||||
return getFalse(ITy);
|
||||
}
|
||||
|
||||
// icmp pred (and X, Y), X
|
||||
if (LBO && match(LBO, m_CombineOr(m_And(m_Value(), m_Specific(RHS)),
|
||||
m_And(m_Specific(RHS), m_Value())))) {
|
||||
if (Pred == ICmpInst::ICMP_UGT)
|
||||
return getFalse(ITy);
|
||||
if (Pred == ICmpInst::ICMP_ULE)
|
||||
return getTrue(ITy);
|
||||
}
|
||||
// icmp pred X, (and X, Y)
|
||||
if (RBO && match(RBO, m_CombineOr(m_And(m_Value(), m_Specific(LHS)),
|
||||
m_And(m_Specific(LHS), m_Value())))) {
|
||||
if (Pred == ICmpInst::ICMP_UGE)
|
||||
return getTrue(ITy);
|
||||
if (Pred == ICmpInst::ICMP_ULT)
|
||||
return getFalse(ITy);
|
||||
}
|
||||
|
||||
// 0 - (zext X) pred C
|
||||
if (!CmpInst::isUnsigned(Pred) && match(LHS, m_Neg(m_ZExt(m_Value())))) {
|
||||
if (ConstantInt *RHSC = dyn_cast<ConstantInt>(RHS)) {
|
||||
|
@ -1100,3 +1100,67 @@ define i1 @icmp_shl_1_V_ne_31(i32 %V) {
|
||||
; CHECK-LABEL: @icmp_shl_1_V_ne_31(
|
||||
; CHECK-NEXT: ret i1 true
|
||||
}
|
||||
|
||||
define i1 @tautological1(i32 %A, i32 %B) {
|
||||
%C = and i32 %A, %B
|
||||
%D = icmp ugt i32 %C, %A
|
||||
ret i1 %D
|
||||
; CHECK-LABEL: @tautological1(
|
||||
; CHECK: ret i1 false
|
||||
}
|
||||
|
||||
define i1 @tautological2(i32 %A, i32 %B) {
|
||||
%C = and i32 %A, %B
|
||||
%D = icmp ule i32 %C, %A
|
||||
ret i1 %D
|
||||
; CHECK-LABEL: @tautological2(
|
||||
; CHECK: ret i1 true
|
||||
}
|
||||
|
||||
define i1 @tautological3(i32 %A, i32 %B) {
|
||||
%C = or i32 %A, %B
|
||||
%D = icmp ule i32 %A, %C
|
||||
ret i1 %D
|
||||
; CHECK-LABEL: @tautological3(
|
||||
; CHECK: ret i1 true
|
||||
}
|
||||
|
||||
define i1 @tautological4(i32 %A, i32 %B) {
|
||||
%C = or i32 %A, %B
|
||||
%D = icmp ugt i32 %A, %C
|
||||
ret i1 %D
|
||||
; CHECK-LABEL: @tautological4(
|
||||
; CHECK: ret i1 false
|
||||
}
|
||||
|
||||
define i1 @tautological5(i32 %A, i32 %B) {
|
||||
%C = or i32 %A, %B
|
||||
%D = icmp ult i32 %C, %A
|
||||
ret i1 %D
|
||||
; CHECK-LABEL: @tautological5(
|
||||
; CHECK: ret i1 false
|
||||
}
|
||||
|
||||
define i1 @tautological6(i32 %A, i32 %B) {
|
||||
%C = or i32 %A, %B
|
||||
%D = icmp uge i32 %C, %A
|
||||
ret i1 %D
|
||||
; CHECK-LABEL: @tautological6(
|
||||
; CHECK: ret i1 true
|
||||
}
|
||||
|
||||
define i1 @tautological7(i32 %A, i32 %B) {
|
||||
%C = and i32 %A, %B
|
||||
%D = icmp uge i32 %A, %C
|
||||
ret i1 %D
|
||||
; CHECK-LABEL: @tautological7(
|
||||
; CHECK: ret i1 true
|
||||
}
|
||||
|
||||
define i1 @tautological8(i32 %A, i32 %B) {
|
||||
%C = and i32 %A, %B
|
||||
%D = icmp ult i32 %A, %C
|
||||
ret i1 %D
|
||||
; CHECK-LABEL: @tautological8(
|
||||
; CHECK: ret i1 false
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user