[PATCH] D117995: [ValueTracking] Add support for X*X self-multiplication

Simon Pilgrim via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Sun Jan 23 10:08:24 PST 2022


RKSimon created this revision.
RKSimon added reviewers: spatel, foad, lebedev.ri, nikic.
Herald added a subscriber: hiraditya.
RKSimon requested review of this revision.
Herald added a project: LLVM.

D108992 <https://reviews.llvm.org/D108992> added KnownBits handling for 'Quadratic Reciprocity' self-multiplication patterns (bit[1] == 0).

This patch adds selfmultiply handling to value tracking so demanded bits patterns can make use of it.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D117995

Files:
  llvm/lib/Analysis/ValueTracking.cpp
  llvm/test/Analysis/ScalarEvolution/solve-quadratic-overflow.ll
  llvm/test/Transforms/InstCombine/mul-masked-bits.ll


Index: llvm/test/Transforms/InstCombine/mul-masked-bits.ll
===================================================================
--- llvm/test/Transforms/InstCombine/mul-masked-bits.ll
+++ llvm/test/Transforms/InstCombine/mul-masked-bits.ll
@@ -22,10 +22,7 @@
 
 define i1 @PR48683(i32 %x) {
 ; CHECK-LABEL: @PR48683(
-; CHECK-NEXT:    [[A:%.*]] = mul i32 [[X:%.*]], [[X]]
-; CHECK-NEXT:    [[B:%.*]] = and i32 [[A]], 2
-; CHECK-NEXT:    [[C:%.*]] = icmp ne i32 [[B]], 0
-; CHECK-NEXT:    ret i1 [[C]]
+; CHECK-NEXT:    ret i1 false
 ;
   %a = mul i32 %x, %x
   %b = and i32 %a, 2
@@ -35,10 +32,7 @@
 
 define <4 x i1> @PR48683_vec(<4 x i32> %x) {
 ; CHECK-LABEL: @PR48683_vec(
-; CHECK-NEXT:    [[A:%.*]] = mul <4 x i32> [[X:%.*]], [[X]]
-; CHECK-NEXT:    [[B:%.*]] = and <4 x i32> [[A]], <i32 2, i32 2, i32 2, i32 2>
-; CHECK-NEXT:    [[C:%.*]] = icmp ne <4 x i32> [[B]], zeroinitializer
-; CHECK-NEXT:    ret <4 x i1> [[C]]
+; CHECK-NEXT:    ret <4 x i1> zeroinitializer
 ;
   %a = mul <4 x i32> %x, %x
   %b = and <4 x i32> %a, <i32 2, i32 2, i32 2, i32 2>
Index: llvm/test/Analysis/ScalarEvolution/solve-quadratic-overflow.ll
===================================================================
--- llvm/test/Analysis/ScalarEvolution/solve-quadratic-overflow.ll
+++ llvm/test/Analysis/ScalarEvolution/solve-quadratic-overflow.ll
@@ -12,11 +12,11 @@
 ; CHECK-NEXT:   %v3 = mul i16 %v2, %v2
 ; CHECK-NEXT:   -->  {1,+,3,+,2}<%b1> U: full-set S: full-set         Exits: 0               LoopDispositions: { %b1: Computable }
 ; CHECK-NEXT:   %v5 = phi i16 [ %v2, %b1 ]
-; CHECK-NEXT:   -->  %v5 U: [-256,0) S: [-256,0)
+; CHECK-NEXT:   -->  %v5 U: [-256,0) S: [-256,0)  -->  -256 U: [-256,-255) S: [-256,-255)
 ; CHECK-NEXT:   %v6 = phi i16 [ %v3, %b1 ]
-; CHECK-NEXT:   -->  %v6 U: full-set S: full-set
+; CHECK-NEXT:   -->  %v6 U: [0,-2) S: [0,-2)  -->  0 U: [0,1) S: [0,1)
 ; CHECK-NEXT:   %v7 = sext i16 %v5 to i32
-; CHECK-NEXT:   -->  (sext i16 %v5 to i32) U: [-256,0) S: [-256,0)
+; CHECK-NEXT:   -->  (sext i16 %v5 to i32) U: [-256,0) S: [-256,0)  -->  -256 U: [-256,-255) S: [-256,-255)
 ; CHECK-NEXT: Determining loop execution counts for: @f0
 ; CHECK-NEXT: Loop %b1: backedge-taken count is 255
 ; CHECK-NEXT: Loop %b1: max backedge-taken count is 255
Index: llvm/lib/Analysis/ValueTracking.cpp
===================================================================
--- llvm/lib/Analysis/ValueTracking.cpp
+++ llvm/lib/Analysis/ValueTracking.cpp
@@ -451,7 +451,8 @@
     }
   }
 
-  Known = KnownBits::mul(Known, Known2);
+  bool SelfMultiply = Op0 == Op1;
+  Known = KnownBits::mul(Known, Known2, SelfMultiply);
 
   // Only make use of no-wrap flags if we failed to compute the sign bit
   // directly.  This matters if the multiplication always overflows, in


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D117995.402348.patch
Type: text/x-patch
Size: 2769 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20220123/cf07f8b6/attachment.bin>


More information about the llvm-commits mailing list