[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