auto *OBO0 = cast<OverflowingBinaryOperator>(Op0);
auto *OBO1 = cast<OverflowingBinaryOperator>(Op1);
bool PropagateNSW = I.hasNoSignedWrap() && OBO0->hasNoSignedWrap() &&
- OBO1->hasNoSignedWrap();
+ OBO1->hasNoSignedWrap() && BitWidth > 2;
bool PropagateNUW = I.hasNoUnsignedWrap() && OBO0->hasNoUnsignedWrap() &&
- OBO1->hasNoUnsignedWrap();
+ OBO1->hasNoUnsignedWrap() && BitWidth > 1;
Value *Add = Builder.CreateAdd(X, Y, "add", PropagateNUW, PropagateNSW);
Value *Sub = Builder.CreateSub(X, Y, "sub", PropagateNUW, PropagateNSW);
Value *Mul = Builder.CreateMul(Add, Sub, "", PropagateNUW, PropagateNSW);
ret i1 %r
}
-; FIXME: It is not correct to propagate nsw.
+; It is not correct to propagate nsw.
+; TODO: This should reduce more.
define i2 @diff_of_squares_nsw_i2(i2 %x, i2 %y) {
; CHECK-LABEL: @diff_of_squares_nsw_i2(
-; CHECK-NEXT: [[ADD:%.*]] = add nsw i2 [[X:%.*]], [[Y:%.*]]
-; CHECK-NEXT: [[SUB:%.*]] = sub nsw i2 [[X]], [[Y]]
-; CHECK-NEXT: [[R:%.*]] = mul nsw i2 [[ADD]], [[SUB]]
+; CHECK-NEXT: [[ADD:%.*]] = add i2 [[X:%.*]], [[Y:%.*]]
+; CHECK-NEXT: [[SUB:%.*]] = sub i2 [[X]], [[Y]]
+; CHECK-NEXT: [[R:%.*]] = mul i2 [[ADD]], [[SUB]]
; CHECK-NEXT: ret i2 [[R]]
;
%x2 = mul nsw i2 %x, %x