[llvm] 21c6c43 - [NFC][SCEV] Add tests for umin_seq recognition with interfering zext's

Roman Lebedev via llvm-commits llvm-commits at lists.llvm.org
Wed Feb 16 11:16:12 PST 2022


Author: Roman Lebedev
Date: 2022-02-16T22:16:01+03:00
New Revision: 21c6c43e6feaf3e9d079c94ee0027e197076c1cf

URL: https://github.com/llvm/llvm-project/commit/21c6c43e6feaf3e9d079c94ee0027e197076c1cf
DIFF: https://github.com/llvm/llvm-project/commit/21c6c43e6feaf3e9d079c94ee0027e197076c1cf.diff

LOG: [NFC][SCEV] Add tests for umin_seq recognition with interfering zext's

Added: 
    

Modified: 
    llvm/test/Analysis/ScalarEvolution/logical-operations.ll

Removed: 
    


################################################################################
diff  --git a/llvm/test/Analysis/ScalarEvolution/logical-operations.ll b/llvm/test/Analysis/ScalarEvolution/logical-operations.ll
index 682d99c2e349d..85144defae360 100644
--- a/llvm/test/Analysis/ScalarEvolution/logical-operations.ll
+++ b/llvm/test/Analysis/ScalarEvolution/logical-operations.ll
@@ -646,6 +646,191 @@ define i32 @umin_seq_a_b_c_d(i32 %a, i32 %b, i32 %c, i32 %d) {
   ret i32 %r
 }
 
+define i32 @umin_seq_x_y_zext_both(i8 %x.narrow, i32 %y) {
+; CHECK-LABEL: 'umin_seq_x_y_zext_both'
+; CHECK-NEXT:  Classifying expressions for: @umin_seq_x_y_zext_both
+; CHECK-NEXT:    %x = zext i8 %x.narrow to i32
+; CHECK-NEXT:    --> (zext i8 %x.narrow to i32) U: [0,256) S: [0,256)
+; CHECK-NEXT:    %umin = call i32 @llvm.umin.i32(i32 %y, i32 %x)
+; CHECK-NEXT:    --> ((zext i8 %x.narrow to i32) umin %y) U: [0,256) S: [0,256)
+; CHECK-NEXT:    %r = select i1 %x.is.zero, i32 0, i32 %umin
+; CHECK-NEXT:    --> ((zext i8 %x.narrow to i32) umin_seq %y) U: [0,256) S: [0,256)
+; CHECK-NEXT:  Determining loop execution counts for: @umin_seq_x_y_zext_both
+;
+  %x = zext i8 %x.narrow to i32
+  %umin = call i32 @llvm.umin(i32 %y, i32 %x)
+  %x.is.zero = icmp eq i32 %x, 0
+  %r = select i1 %x.is.zero, i32 0, i32 %umin
+  ret i32 %r
+}
+
+define i32 @umin_seq_x_y_zext_in_umin(i8 %x.narrow, i32 %y) {
+; CHECK-LABEL: 'umin_seq_x_y_zext_in_umin'
+; CHECK-NEXT:  Classifying expressions for: @umin_seq_x_y_zext_in_umin
+; CHECK-NEXT:    %x = zext i8 %x.narrow to i32
+; CHECK-NEXT:    --> (zext i8 %x.narrow to i32) U: [0,256) S: [0,256)
+; CHECK-NEXT:    %umin = call i32 @llvm.umin.i32(i32 %y, i32 %x)
+; CHECK-NEXT:    --> ((zext i8 %x.narrow to i32) umin %y) U: [0,256) S: [0,256)
+; CHECK-NEXT:    %r = select i1 %x.is.zero, i32 0, i32 %umin
+; CHECK-NEXT:    --> %r U: [0,256) S: [0,256)
+; CHECK-NEXT:  Determining loop execution counts for: @umin_seq_x_y_zext_in_umin
+;
+  %x = zext i8 %x.narrow to i32
+  %umin = call i32 @llvm.umin(i32 %y, i32 %x)
+  %x.is.zero = icmp eq i8 %x.narrow, 0
+  %r = select i1 %x.is.zero, i32 0, i32 %umin
+  ret i32 %r
+}
+
+define i8 @umin_seq_x_y_zext_in_iszero(i8 %x, i8 %y) {
+; CHECK-LABEL: 'umin_seq_x_y_zext_in_iszero'
+; CHECK-NEXT:  Classifying expressions for: @umin_seq_x_y_zext_in_iszero
+; CHECK-NEXT:    %x.wide = zext i8 %x to i32
+; CHECK-NEXT:    --> (zext i8 %x to i32) U: [0,256) S: [0,256)
+; CHECK-NEXT:    %umin = call i8 @llvm.umin.i8(i8 %y, i8 %x)
+; CHECK-NEXT:    --> (%x umin %y) U: full-set S: full-set
+; CHECK-NEXT:    %r = select i1 %x.is.zero, i8 0, i8 %umin
+; CHECK-NEXT:    --> %r U: full-set S: full-set
+; CHECK-NEXT:  Determining loop execution counts for: @umin_seq_x_y_zext_in_iszero
+;
+  %x.wide = zext i8 %x to i32
+  %umin = call i8 @llvm.umin.i8(i8 %y, i8 %x)
+  %x.is.zero = icmp eq i32 %x.wide, 0
+  %r = select i1 %x.is.zero, i8 0, i8 %umin
+  ret i8 %r
+}
+
+define i32 @umin_seq_x_y_zext_of_umin(i8 %x, i8 %y) {
+; CHECK-LABEL: 'umin_seq_x_y_zext_of_umin'
+; CHECK-NEXT:  Classifying expressions for: @umin_seq_x_y_zext_of_umin
+; CHECK-NEXT:    %umin.narrow = call i8 @llvm.umin.i8(i8 %y, i8 %x)
+; CHECK-NEXT:    --> (%x umin %y) U: full-set S: full-set
+; CHECK-NEXT:    %umin = zext i8 %umin.narrow to i32
+; CHECK-NEXT:    --> (zext i8 (%x umin %y) to i32) U: [0,256) S: [0,256)
+; CHECK-NEXT:    %r = select i1 %x.is.zero, i32 0, i32 %umin
+; CHECK-NEXT:    --> %r U: [0,256) S: [0,256)
+; CHECK-NEXT:  Determining loop execution counts for: @umin_seq_x_y_zext_of_umin
+;
+  %umin.narrow = call i8 @llvm.umin.i8(i8 %y, i8 %x)
+  %umin = zext i8 %umin.narrow to i32
+  %x.is.zero = icmp eq i8 %x, 0
+  %r = select i1 %x.is.zero, i32 0, i32 %umin
+  ret i32 %r
+}
+
+define i32 @umin_seq_x_y_sext_both(i8 %x.narrow, i32 %y) {
+; CHECK-LABEL: 'umin_seq_x_y_sext_both'
+; CHECK-NEXT:  Classifying expressions for: @umin_seq_x_y_sext_both
+; CHECK-NEXT:    %x = sext i8 %x.narrow to i32
+; CHECK-NEXT:    --> (sext i8 %x.narrow to i32) U: [-128,128) S: [-128,128)
+; CHECK-NEXT:    %umin = call i32 @llvm.umin.i32(i32 %y, i32 %x)
+; CHECK-NEXT:    --> ((sext i8 %x.narrow to i32) umin %y) U: full-set S: full-set
+; CHECK-NEXT:    %r = select i1 %x.is.zero, i32 0, i32 %umin
+; CHECK-NEXT:    --> ((sext i8 %x.narrow to i32) umin_seq %y) U: full-set S: full-set
+; CHECK-NEXT:  Determining loop execution counts for: @umin_seq_x_y_sext_both
+;
+  %x = sext i8 %x.narrow to i32
+  %umin = call i32 @llvm.umin(i32 %y, i32 %x)
+  %x.is.zero = icmp eq i32 %x, 0
+  %r = select i1 %x.is.zero, i32 0, i32 %umin
+  ret i32 %r
+}
+
+define i32 @umin_seq_x_y_sext_in_umin(i8 %x.narrow, i32 %y) {
+; CHECK-LABEL: 'umin_seq_x_y_sext_in_umin'
+; CHECK-NEXT:  Classifying expressions for: @umin_seq_x_y_sext_in_umin
+; CHECK-NEXT:    %x = sext i8 %x.narrow to i32
+; CHECK-NEXT:    --> (sext i8 %x.narrow to i32) U: [-128,128) S: [-128,128)
+; CHECK-NEXT:    %umin = call i32 @llvm.umin.i32(i32 %y, i32 %x)
+; CHECK-NEXT:    --> ((sext i8 %x.narrow to i32) umin %y) U: full-set S: full-set
+; CHECK-NEXT:    %r = select i1 %x.is.zero, i32 0, i32 %umin
+; CHECK-NEXT:    --> %r U: full-set S: full-set
+; CHECK-NEXT:  Determining loop execution counts for: @umin_seq_x_y_sext_in_umin
+;
+  %x = sext i8 %x.narrow to i32
+  %umin = call i32 @llvm.umin(i32 %y, i32 %x)
+  %x.is.zero = icmp eq i8 %x.narrow, 0
+  %r = select i1 %x.is.zero, i32 0, i32 %umin
+  ret i32 %r
+}
+
+define i8 @umin_seq_x_y_sext_in_iszero(i8 %x, i8 %y) {
+; CHECK-LABEL: 'umin_seq_x_y_sext_in_iszero'
+; CHECK-NEXT:  Classifying expressions for: @umin_seq_x_y_sext_in_iszero
+; CHECK-NEXT:    %x.wide = sext i8 %x to i32
+; CHECK-NEXT:    --> (sext i8 %x to i32) U: [-128,128) S: [-128,128)
+; CHECK-NEXT:    %umin = call i8 @llvm.umin.i8(i8 %y, i8 %x)
+; CHECK-NEXT:    --> (%x umin %y) U: full-set S: full-set
+; CHECK-NEXT:    %r = select i1 %x.is.zero, i8 0, i8 %umin
+; CHECK-NEXT:    --> %r U: full-set S: full-set
+; CHECK-NEXT:  Determining loop execution counts for: @umin_seq_x_y_sext_in_iszero
+;
+  %x.wide = sext i8 %x to i32
+  %umin = call i8 @llvm.umin.i8(i8 %y, i8 %x)
+  %x.is.zero = icmp eq i32 %x.wide, 0
+  %r = select i1 %x.is.zero, i8 0, i8 %umin
+  ret i8 %r
+}
+
+define i32 @umin_seq_x_y_sext_of_umin(i8 %x, i8 %y) {
+; CHECK-LABEL: 'umin_seq_x_y_sext_of_umin'
+; CHECK-NEXT:  Classifying expressions for: @umin_seq_x_y_sext_of_umin
+; CHECK-NEXT:    %umin.narrow = call i8 @llvm.umin.i8(i8 %y, i8 %x)
+; CHECK-NEXT:    --> (%x umin %y) U: full-set S: full-set
+; CHECK-NEXT:    %umin = sext i8 %umin.narrow to i32
+; CHECK-NEXT:    --> (sext i8 (%x umin %y) to i32) U: [-128,128) S: [-128,128)
+; CHECK-NEXT:    %r = select i1 %x.is.zero, i32 0, i32 %umin
+; CHECK-NEXT:    --> %r U: [-128,128) S: [-128,128)
+; CHECK-NEXT:  Determining loop execution counts for: @umin_seq_x_y_sext_of_umin
+;
+  %umin.narrow = call i8 @llvm.umin.i8(i8 %y, i8 %x)
+  %umin = sext i8 %umin.narrow to i32
+  %x.is.zero = icmp eq i8 %x, 0
+  %r = select i1 %x.is.zero, i32 0, i32 %umin
+  ret i32 %r
+}
+
+define i32 @umin_seq_x_y_zext_vs_sext(i8 %x.narrow, i32 %y) {
+; CHECK-LABEL: 'umin_seq_x_y_zext_vs_sext'
+; CHECK-NEXT:  Classifying expressions for: @umin_seq_x_y_zext_vs_sext
+; CHECK-NEXT:    %x.zext = zext i8 %x.narrow to i32
+; CHECK-NEXT:    --> (zext i8 %x.narrow to i32) U: [0,256) S: [0,256)
+; CHECK-NEXT:    %x.sext = sext i8 %x.narrow to i32
+; CHECK-NEXT:    --> (sext i8 %x.narrow to i32) U: [-128,128) S: [-128,128)
+; CHECK-NEXT:    %umin = call i32 @llvm.umin.i32(i32 %y, i32 %x.zext)
+; CHECK-NEXT:    --> ((zext i8 %x.narrow to i32) umin %y) U: [0,256) S: [0,256)
+; CHECK-NEXT:    %r = select i1 %x.is.zero, i32 0, i32 %umin
+; CHECK-NEXT:    --> %r U: [0,256) S: [0,256)
+; CHECK-NEXT:  Determining loop execution counts for: @umin_seq_x_y_zext_vs_sext
+;
+  %x.zext = zext i8 %x.narrow to i32
+  %x.sext = sext i8 %x.narrow to i32
+  %umin = call i32 @llvm.umin(i32 %y, i32 %x.zext)
+  %x.is.zero = icmp eq i32 %x.sext, 0
+  %r = select i1 %x.is.zero, i32 0, i32 %umin
+  ret i32 %r
+}
+define i32 @umin_seq_x_y_sext_vs_zext(i8 %x.narrow, i32 %y) {
+; CHECK-LABEL: 'umin_seq_x_y_sext_vs_zext'
+; CHECK-NEXT:  Classifying expressions for: @umin_seq_x_y_sext_vs_zext
+; CHECK-NEXT:    %x.zext = zext i8 %x.narrow to i32
+; CHECK-NEXT:    --> (zext i8 %x.narrow to i32) U: [0,256) S: [0,256)
+; CHECK-NEXT:    %x.sext = sext i8 %x.narrow to i32
+; CHECK-NEXT:    --> (sext i8 %x.narrow to i32) U: [-128,128) S: [-128,128)
+; CHECK-NEXT:    %umin = call i32 @llvm.umin.i32(i32 %y, i32 %x.sext)
+; CHECK-NEXT:    --> ((sext i8 %x.narrow to i32) umin %y) U: full-set S: full-set
+; CHECK-NEXT:    %r = select i1 %x.is.zero, i32 0, i32 %umin
+; CHECK-NEXT:    --> %r U: full-set S: full-set
+; CHECK-NEXT:  Determining loop execution counts for: @umin_seq_x_y_sext_vs_zext
+;
+  %x.zext = zext i8 %x.narrow to i32
+  %x.sext = sext i8 %x.narrow to i32
+  %umin = call i32 @llvm.umin(i32 %y, i32 %x.sext)
+  %x.is.zero = icmp eq i32 %x.zext, 0
+  %r = select i1 %x.is.zero, i32 0, i32 %umin
+  ret i32 %r
+}
+
 define i32 @select_x_or_zero_expanded(i1 %c, i32 %x) {
 ; CHECK-LABEL: 'select_x_or_zero_expanded'
 ; CHECK-NEXT:  Classifying expressions for: @select_x_or_zero_expanded
@@ -756,6 +941,11 @@ define i32 @select_constant_or_y_expanded(i1 %c, i32 %y) {
   ret i32 %r
 }
 
+declare i8 @llvm.umin.i8(i8, i8)
+declare i8 @llvm.umax.i8(i8, i8)
+declare i8 @llvm.smin.i8(i8, i8)
+declare i8 @llvm.smax.i8(i8, i8)
+
 declare i32 @llvm.umin(i32, i32)
 declare i32 @llvm.umax(i32, i32)
 declare i32 @llvm.smin(i32, i32)


        


More information about the llvm-commits mailing list