[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