Index: lib/Transforms/InstCombine/InstructionCombining.cpp =================================================================== --- lib/Transforms/InstCombine/InstructionCombining.cpp +++ lib/Transforms/InstCombine/InstructionCombining.cpp @@ -501,25 +501,6 @@ if (SimplifiedInst) { ++NumFactor; SimplifiedInst->takeName(&I); - - // Check if we can add NSW flag to SimplifiedInst. If so, set NSW flag. - // TODO: Check for NUW. - if (BinaryOperator *BO = dyn_cast(SimplifiedInst)) { - if (isa(SimplifiedInst)) { - bool HasNSW = false; - if (isa(&I)) - HasNSW = I.hasNoSignedWrap(); - - if (BinaryOperator *Op0 = dyn_cast(LHS)) - if (isa(Op0)) - HasNSW &= Op0->hasNoSignedWrap(); - - if (BinaryOperator *Op1 = dyn_cast(RHS)) - if (isa(Op1)) - HasNSW &= Op1->hasNoSignedWrap(); - BO->setHasNoSignedWrap(HasNSW); - } - } } return SimplifiedInst; } Index: test/Transforms/InstCombine/add2.ll =================================================================== --- test/Transforms/InstCombine/add2.ll +++ test/Transforms/InstCombine/add2.ll @@ -210,7 +210,7 @@ %add2 = add nsw i16 %add1, %x ret i16 %add2 ; CHECK-LABEL: @add_nsw_mul_nsw( -; CHECK-NEXT: %add2 = mul nsw i16 %x, 3 +; CHECK-NEXT: %add2 = mul i16 %x, 3 ; CHECK-NEXT: ret i16 %add2 } @@ -219,7 +219,7 @@ %add2 = add nsw i16 %x, %mul1 ret i16 %add2 ; CHECK-LABEL: @mul_add_to_mul_1( -; CHECK-NEXT: %add2 = mul nsw i16 %x, 9 +; CHECK-NEXT: %add2 = mul i16 %x, 9 ; CHECK-NEXT: ret i16 %add2 } @@ -228,7 +228,7 @@ %add2 = add nsw i16 %mul1, %x ret i16 %add2 ; CHECK-LABEL: @mul_add_to_mul_2( -; CHECK-NEXT: %add2 = mul nsw i16 %x, 9 +; CHECK-NEXT: %add2 = mul i16 %x, 9 ; CHECK-NEXT: ret i16 %add2 } @@ -248,7 +248,7 @@ %add = add nsw i16 %mul1, %mul2 ret i16 %add ; CHECK-LABEL: @mul_add_to_mul_4( -; CHECK-NEXT: %add = mul nsw i16 %a, 9 +; CHECK-NEXT: %add = mul i16 %a, 9 ; CHECK-NEXT: ret i16 %add } @@ -258,7 +258,7 @@ %add = add nsw i16 %mul1, %mul2 ret i16 %add ; CHECK-LABEL: @mul_add_to_mul_5( -; CHECK-NEXT: %add = mul nsw i16 %a, 10 +; CHECK-NEXT: %add = mul i16 %a, 10 ; CHECK-NEXT: ret i16 %add } @@ -269,7 +269,7 @@ ret i32 %add ; CHECK-LABEL: @mul_add_to_mul_6( ; CHECK-NEXT: %mul1 = mul nsw i32 %x, %y -; CHECK-NEXT: %add = mul nsw i32 %mul1, 6 +; CHECK-NEXT: %add = mul i32 %mul1, 6 ; CHECK-NEXT: ret i32 %add } @@ -353,3 +353,17 @@ ; CHECK-NEXT: add nuw nsw i32 %x, %y ; CHECK-NEXT: ret i32 } + + +; A *nsw B + A *nsw C != A *nsw (B + C) +; e.g. A = -1, B = 1, C = INT_SMAX + +define i8 @add_of_mul(i8 %x, i8 %y, i8 %z) { +; CHECK-LABEL: @add_of_mul( + entry: + %mA = mul nsw i8 %x, %y + %mB = mul nsw i8 %x, %z +; CHECK: %sum = mul i8 + %sum = add nsw i8 %mA, %mB + ret i8 %sum +}