[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