[PATCH] [InstCombine] Don't propagate nsw for A*B+A*C => A*(B+C).

David Majnemer david.majnemer at gmail.com
Fri May 8 23:28:36 PDT 2015


================
Comment at: test/Transforms/InstCombine/add2.ll:209-213
@@ -208,7 +208,7 @@
 define i16 @add_nsw_mul_nsw(i16 %x) {
  %add1 = add nsw i16 %x, %x
  %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: ret i16 %add2
----------------
This transform is correct, would it be hard to keep it from breaking?

================
Comment at: test/Transforms/InstCombine/add2.ll:218-222
@@ -217,7 +217,7 @@
 define i16 @mul_add_to_mul_1(i16 %x) {
  %mul1 = mul nsw i16 %x, 8
  %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: ret i16 %add2
----------------
Yep.  This transform would give us back poison if '8' were replaced with '32767'.  However, it is safe to do `(%x *nsw C) + %x` => `%x *nsw (C+1)` if we know that `(C != ((1 << (width(%x) - 1)) - 1))`

================
Comment at: test/Transforms/InstCombine/add2.ll:246-261
@@ -245,18 +245,18 @@
 define i16 @mul_add_to_mul_4(i16 %a) {
  %mul1 = mul nsw i16 %a, 2
  %mul2 = mul nsw i16 %a, 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
 }
 
 define i16 @mul_add_to_mul_5(i16 %a) {
  %mul1 = mul nsw i16 %a, 3
  %mul2 = mul nsw i16 %a, 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: ret i16 %add
----------------
A *nsw B+A *nsw C => A *nsw (B+C) is safe when `((B + C) != -(1 << (width(%a) - 1)))`  How hard would this be to implement?

http://reviews.llvm.org/D9629

EMAIL PREFERENCES
  http://reviews.llvm.org/settings/panel/emailpreferences/






More information about the llvm-commits mailing list