Value *Op1;
ConstantInt *CI;
if (match(V, m_NUWAdd(m_Value(Op0), m_ConstantInt(CI))) &&
- !CI->uge(MaxConstraintValue))
- return {{int(CI->getZExtValue()), nullptr}, {1, Op0}};
+ !CI->uge(MaxConstraintValue)) {
+ auto Res = decompose(Op0, Preconditions, IsSigned);
+ Res[0].Coefficient += int(CI->getZExtValue());
+ return Res;
+ }
if (match(V, m_Add(m_Value(Op0), m_ConstantInt(CI))) && CI->isNegative() &&
CanUseSExt(CI)) {
Preconditions.emplace_back(
CmpInst::ICMP_UGE, Op0,
ConstantInt::get(Op0->getType(), CI->getSExtValue() * -1));
- return {{CI->getSExtValue(), nullptr}, {1, Op0}};
+ auto Res = decompose(Op0, Preconditions, IsSigned);
+ Res[0].Coefficient += int(CI->getSExtValue());
+ return Res;
+ }
+ if (match(V, m_NUWAdd(m_Value(Op0), m_Value(Op1)))) {
+ auto Res = decompose(Op0, Preconditions, IsSigned);
+ auto D1 = decompose(Op1, Preconditions, IsSigned);
+ Res[0].Coefficient += D1[0].Coefficient;
+ append_range(Res, drop_begin(D1));
+ return Res;
}
- if (match(V, m_NUWAdd(m_Value(Op0), m_Value(Op1))))
- return {{0, nullptr}, {1, Op0}, {1, Op1}};
if (match(V, m_NUWSub(m_Value(Op0), m_ConstantInt(CI))) && CanUseSExt(CI))
return {{-1 * CI->getSExtValue(), nullptr}, {1, Op0}};
; CHECK-NEXT: br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
; CHECK: if.then:
; CHECK-NEXT: [[T:%.*]] = icmp ule i8 [[N]], 1
-; CHECK-NEXT: ret i1 [[T]]
+; CHECK-NEXT: ret i1 true
; CHECK: if.end:
; CHECK-NEXT: [[F:%.*]] = icmp ule i8 [[N]], 1
; CHECK-NEXT: ret i1 [[F]]
; CHECK-NEXT: br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
; CHECK: if.then:
; CHECK-NEXT: [[T:%.*]] = icmp ule i8 [[N]], 2
-; CHECK-NEXT: ret i1 [[T]]
+; CHECK-NEXT: ret i1 true
; CHECK: if.end:
; CHECK-NEXT: [[F:%.*]] = icmp ule i8 [[N]], 2
; CHECK-NEXT: ret i1 [[F]]
; CHECK-NEXT: [[ADD_2:%.*]] = add nuw i8 [[ADD_1]], 2
; CHECK-NEXT: [[T_1:%.*]] = icmp uge i8 [[ADD_2]], 13
; CHECK-NEXT: [[C_1:%.*]] = icmp uge i8 [[ADD_2]], 14
-; CHECK-NEXT: [[RES_1:%.*]] = xor i1 [[T_1]], [[C_1]]
+; CHECK-NEXT: [[RES_1:%.*]] = xor i1 true, [[C_1]]
; CHECK-NEXT: ret i1 [[RES_1]]
;
entry:
; CHECK-NEXT: [[ADD_3:%.*]] = add nuw i8 [[ADD_2]], [[A]]
; CHECK-NEXT: [[T_1:%.*]] = icmp uge i8 [[ADD_3]], 18
; CHECK-NEXT: [[C_1:%.*]] = icmp uge i8 [[ADD_3]], 19
-; CHECK-NEXT: [[RES_1:%.*]] = xor i1 [[T_1]], [[C_1]]
+; CHECK-NEXT: [[RES_1:%.*]] = xor i1 true, [[C_1]]
; CHECK-NEXT: ret i1 [[RES_1]]
;
entry:
; CHECK-NEXT: [[ADD_3:%.*]] = add nuw i8 [[ADD_2]], [[A]]
; CHECK-NEXT: [[T_1:%.*]] = icmp uge i8 [[ADD_3]], 18
; CHECK-NEXT: [[C_1:%.*]] = icmp uge i8 [[ADD_3]], 19
-; CHECK-NEXT: [[RES_1:%.*]] = xor i1 [[T_1]], [[C_1]]
+; CHECK-NEXT: [[RES_1:%.*]] = xor i1 true, [[C_1]]
; CHECK-NEXT: ret i1 [[RES_1]]
;
entry:
; CHECK-NEXT: [[ADD_3:%.*]] = add nuw i8 [[ADD_2]], 10
; CHECK-NEXT: [[T_1:%.*]] = icmp uge i8 [[ADD_3]], 23
; CHECK-NEXT: [[C_1:%.*]] = icmp uge i8 [[ADD_3]], 24
-; CHECK-NEXT: [[RES_1:%.*]] = xor i1 [[T_1]], [[C_1]]
+; CHECK-NEXT: [[RES_1:%.*]] = xor i1 true, [[C_1]]
; CHECK-NEXT: ret i1 [[RES_1]]
;
entry:
; CHECK-NEXT: [[ADD:%.*]] = add nuw i8 [[SUB_1]], 10
; CHECK-NEXT: [[T_1:%.*]] = icmp uge i8 [[ADD]], 10
; CHECK-NEXT: [[T_2:%.*]] = icmp ule i8 [[ADD]], 10
-; CHECK-NEXT: [[RES_1:%.*]] = xor i1 [[T_1]], [[T_2]]
+; CHECK-NEXT: [[RES_1:%.*]] = xor i1 true, true
; CHECK-NEXT: [[F_1:%.*]] = icmp ult i8 [[ADD]], 10
-; CHECK-NEXT: [[RES_2:%.*]] = xor i1 [[RES_1]], [[F_1]]
+; CHECK-NEXT: [[RES_2:%.*]] = xor i1 [[RES_1]], false
; CHECK-NEXT: ret i1 [[RES_2]]
;
entry:
; CHECK-NEXT: [[SUB_1:%.*]] = add i8 [[ADD]], -1
; CHECK-NEXT: [[T_1:%.*]] = icmp uge i8 [[SUB_1]], 10
; CHECK-NEXT: [[T_2:%.*]] = icmp ule i8 [[SUB_1]], 10
-; CHECK-NEXT: [[RES_1:%.*]] = xor i1 [[T_1]], [[T_2]]
+; CHECK-NEXT: [[RES_1:%.*]] = xor i1 true, true
; CHECK-NEXT: [[F_1:%.*]] = icmp ult i8 [[SUB_1]], 10
-; CHECK-NEXT: [[RES_2:%.*]] = xor i1 [[RES_1]], [[F_1]]
+; CHECK-NEXT: [[RES_2:%.*]] = xor i1 [[RES_1]], false
; CHECK-NEXT: ret i1 [[RES_2]]
;
entry: