1b5fa3574SMax Kazantsev; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py 2b5fa3574SMax Kazantsev; RUN: opt -S -disable-output "-passes=print<scalar-evolution>" < %s 2>&1 | FileCheck %s 3b5fa3574SMax Kazantsev 4b5fa3574SMax Kazantsev; TODO: Make sure that zext(umin(x, y)) has same SCEV as umin(zext(x), zext(y)). 5b5fa3574SMax Kazantsev; Equality proof: https://alive2.llvm.org/ce/z/vdsvmp 6b5fa3574SMax Kazantsevdefine i1 @test_umin(i32 %x, i32 %y) { 7b5fa3574SMax Kazantsev; CHECK-LABEL: 'test_umin' 8b5fa3574SMax Kazantsev; CHECK-NEXT: Classifying expressions for: @test_umin 9b5fa3574SMax Kazantsev; CHECK-NEXT: %umin_x_y = select i1 %cmp_x_y, i32 %x, i32 %y 10b5fa3574SMax Kazantsev; CHECK-NEXT: --> (%x umin %y) U: full-set S: full-set 11b5fa3574SMax Kazantsev; CHECK-NEXT: %zext_umin_x_y = zext i32 %umin_x_y to i64 12*5fe915bbSMax Kazantsev; CHECK-NEXT: --> ((zext i32 %x to i64) umin (zext i32 %y to i64)) U: [0,4294967296) S: [0,4294967296) 13b5fa3574SMax Kazantsev; CHECK-NEXT: %zext_x = zext i32 %x to i64 14b5fa3574SMax Kazantsev; CHECK-NEXT: --> (zext i32 %x to i64) U: [0,4294967296) S: [0,4294967296) 15b5fa3574SMax Kazantsev; CHECK-NEXT: %zext_y = zext i32 %y to i64 16b5fa3574SMax Kazantsev; CHECK-NEXT: --> (zext i32 %y to i64) U: [0,4294967296) S: [0,4294967296) 17b5fa3574SMax Kazantsev; CHECK-NEXT: %umin_zext_x_zext_y = select i1 %cmp_zext_x_zext_y, i64 %zext_x, i64 %zext_y 18b5fa3574SMax Kazantsev; CHECK-NEXT: --> ((zext i32 %x to i64) umin (zext i32 %y to i64)) U: [0,4294967296) S: [0,4294967296) 19b5fa3574SMax Kazantsev; CHECK-NEXT: Determining loop execution counts for: @test_umin 20b5fa3574SMax Kazantsev; 21b5fa3574SMax Kazantsev %cmp_x_y = icmp ult i32 %x, %y 22b5fa3574SMax Kazantsev %umin_x_y = select i1 %cmp_x_y, i32 %x, i32 %y 23b5fa3574SMax Kazantsev %zext_umin_x_y = zext i32 %umin_x_y to i64 24b5fa3574SMax Kazantsev 25b5fa3574SMax Kazantsev %zext_x = zext i32 %x to i64 26b5fa3574SMax Kazantsev %zext_y = zext i32 %y to i64 27b5fa3574SMax Kazantsev %cmp_zext_x_zext_y = icmp ult i64 %zext_x, %zext_y 28b5fa3574SMax Kazantsev %umin_zext_x_zext_y = select i1 %cmp_zext_x_zext_y, i64 %zext_x, i64 %zext_y 29b5fa3574SMax Kazantsev 30b5fa3574SMax Kazantsev %they_are_same = icmp eq i64 %zext_umin_x_y, %umin_zext_x_zext_y 31b5fa3574SMax Kazantsev ret i1 %they_are_same 32b5fa3574SMax Kazantsev} 33b5fa3574SMax Kazantsev 34b5fa3574SMax Kazantsev; TODO: Make sure that zext(umax(x, y)) has same SCEV as umax(zext(x), zext(y)). 35b5fa3574SMax Kazantsev; Equality proof: https://alive2.llvm.org/ce/z/5JHgxZ 36b5fa3574SMax Kazantsevdefine i1 @test_umax(i32 %x, i32 %y) { 37b5fa3574SMax Kazantsev; CHECK-LABEL: 'test_umax' 38b5fa3574SMax Kazantsev; CHECK-NEXT: Classifying expressions for: @test_umax 39b5fa3574SMax Kazantsev; CHECK-NEXT: %umax_x_y = select i1 %cmp_x_y, i32 %y, i32 %x 40b5fa3574SMax Kazantsev; CHECK-NEXT: --> (%x umax %y) U: full-set S: full-set 41b5fa3574SMax Kazantsev; CHECK-NEXT: %zext_umax_x_y = zext i32 %umax_x_y to i64 42*5fe915bbSMax Kazantsev; CHECK-NEXT: --> ((zext i32 %x to i64) umax (zext i32 %y to i64)) U: [0,4294967296) S: [0,4294967296) 43b5fa3574SMax Kazantsev; CHECK-NEXT: %zext_x = zext i32 %x to i64 44b5fa3574SMax Kazantsev; CHECK-NEXT: --> (zext i32 %x to i64) U: [0,4294967296) S: [0,4294967296) 45b5fa3574SMax Kazantsev; CHECK-NEXT: %zext_y = zext i32 %y to i64 46b5fa3574SMax Kazantsev; CHECK-NEXT: --> (zext i32 %y to i64) U: [0,4294967296) S: [0,4294967296) 47b5fa3574SMax Kazantsev; CHECK-NEXT: %umax_zext_x_zext_y = select i1 %cmp_zext_x_zext_y, i64 %zext_y, i64 %zext_x 48b5fa3574SMax Kazantsev; CHECK-NEXT: --> ((zext i32 %x to i64) umax (zext i32 %y to i64)) U: [0,4294967296) S: [0,4294967296) 49b5fa3574SMax Kazantsev; CHECK-NEXT: Determining loop execution counts for: @test_umax 50b5fa3574SMax Kazantsev; 51b5fa3574SMax Kazantsev %cmp_x_y = icmp ult i32 %x, %y 52b5fa3574SMax Kazantsev %umax_x_y = select i1 %cmp_x_y, i32 %y, i32 %x 53b5fa3574SMax Kazantsev %zext_umax_x_y = zext i32 %umax_x_y to i64 54b5fa3574SMax Kazantsev 55b5fa3574SMax Kazantsev %zext_x = zext i32 %x to i64 56b5fa3574SMax Kazantsev %zext_y = zext i32 %y to i64 57b5fa3574SMax Kazantsev %cmp_zext_x_zext_y = icmp ult i64 %zext_x, %zext_y 58b5fa3574SMax Kazantsev %umax_zext_x_zext_y = select i1 %cmp_zext_x_zext_y, i64 %zext_y, i64 %zext_x 59b5fa3574SMax Kazantsev 60b5fa3574SMax Kazantsev %they_are_same = icmp eq i64 %zext_umax_x_y, %umax_zext_x_zext_y 61b5fa3574SMax Kazantsev ret i1 %they_are_same 62b5fa3574SMax Kazantsev} 63b5fa3574SMax Kazantsev 64b5fa3574SMax Kazantsev; TODO: Make sure that sext(smin(x, y)) has same SCEV as smin(sext(x), sext(y)). 65b5fa3574SMax Kazantsev; Equality proof: https://alive2.llvm.org/ce/z/HhYHzR 66b5fa3574SMax Kazantsevdefine i1 @test_smin(i32 %x, i32 %y) { 67b5fa3574SMax Kazantsev; CHECK-LABEL: 'test_smin' 68b5fa3574SMax Kazantsev; CHECK-NEXT: Classifying expressions for: @test_smin 69b5fa3574SMax Kazantsev; CHECK-NEXT: %smin_x_y = select i1 %cmp_x_y, i32 %x, i32 %y 70b5fa3574SMax Kazantsev; CHECK-NEXT: --> (%x smin %y) U: full-set S: full-set 71b5fa3574SMax Kazantsev; CHECK-NEXT: %sext_smin_x_y = sext i32 %smin_x_y to i64 72*5fe915bbSMax Kazantsev; CHECK-NEXT: --> ((sext i32 %x to i64) smin (sext i32 %y to i64)) U: [-2147483648,2147483648) S: [-2147483648,2147483648) 73b5fa3574SMax Kazantsev; CHECK-NEXT: %sext_x = sext i32 %x to i64 74b5fa3574SMax Kazantsev; CHECK-NEXT: --> (sext i32 %x to i64) U: [-2147483648,2147483648) S: [-2147483648,2147483648) 75b5fa3574SMax Kazantsev; CHECK-NEXT: %sext_y = sext i32 %y to i64 76b5fa3574SMax Kazantsev; CHECK-NEXT: --> (sext i32 %y to i64) U: [-2147483648,2147483648) S: [-2147483648,2147483648) 77b5fa3574SMax Kazantsev; CHECK-NEXT: %smin_sext_x_sext_y = select i1 %cmp_sext_x_sext_y, i64 %sext_x, i64 %sext_y 78b5fa3574SMax Kazantsev; CHECK-NEXT: --> ((sext i32 %x to i64) smin (sext i32 %y to i64)) U: [-2147483648,2147483648) S: [-2147483648,2147483648) 79b5fa3574SMax Kazantsev; CHECK-NEXT: Determining loop execution counts for: @test_smin 80b5fa3574SMax Kazantsev; 81b5fa3574SMax Kazantsev %cmp_x_y = icmp slt i32 %x, %y 82b5fa3574SMax Kazantsev %smin_x_y = select i1 %cmp_x_y, i32 %x, i32 %y 83b5fa3574SMax Kazantsev %sext_smin_x_y = sext i32 %smin_x_y to i64 84b5fa3574SMax Kazantsev 85b5fa3574SMax Kazantsev %sext_x = sext i32 %x to i64 86b5fa3574SMax Kazantsev %sext_y = sext i32 %y to i64 87b5fa3574SMax Kazantsev %cmp_sext_x_sext_y = icmp slt i64 %sext_x, %sext_y 88b5fa3574SMax Kazantsev %smin_sext_x_sext_y = select i1 %cmp_sext_x_sext_y, i64 %sext_x, i64 %sext_y 89b5fa3574SMax Kazantsev 90b5fa3574SMax Kazantsev %they_are_same = icmp eq i64 %sext_smin_x_y, %smin_sext_x_sext_y 91b5fa3574SMax Kazantsev ret i1 %they_are_same 92b5fa3574SMax Kazantsev} 93b5fa3574SMax Kazantsev 94b5fa3574SMax Kazantsev; TODO: Make sure that sext(smax(x, y)) has same SCEV as smax(sext(x), sext(y)). 95b5fa3574SMax Kazantsev; Equality proof: https://alive2.llvm.org/ce/z/uou_u- 96b5fa3574SMax Kazantsevdefine i1 @test_smax(i32 %x, i32 %y) { 97b5fa3574SMax Kazantsev; CHECK-LABEL: 'test_smax' 98b5fa3574SMax Kazantsev; CHECK-NEXT: Classifying expressions for: @test_smax 99b5fa3574SMax Kazantsev; CHECK-NEXT: %smax_x_y = select i1 %cmp_x_y, i32 %y, i32 %x 100b5fa3574SMax Kazantsev; CHECK-NEXT: --> (%x smax %y) U: full-set S: full-set 101b5fa3574SMax Kazantsev; CHECK-NEXT: %sext_smax_x_y = sext i32 %smax_x_y to i64 102*5fe915bbSMax Kazantsev; CHECK-NEXT: --> ((sext i32 %x to i64) smax (sext i32 %y to i64)) U: [-2147483648,2147483648) S: [-2147483648,2147483648) 103b5fa3574SMax Kazantsev; CHECK-NEXT: %sext_x = sext i32 %x to i64 104b5fa3574SMax Kazantsev; CHECK-NEXT: --> (sext i32 %x to i64) U: [-2147483648,2147483648) S: [-2147483648,2147483648) 105b5fa3574SMax Kazantsev; CHECK-NEXT: %sext_y = sext i32 %y to i64 106b5fa3574SMax Kazantsev; CHECK-NEXT: --> (sext i32 %y to i64) U: [-2147483648,2147483648) S: [-2147483648,2147483648) 107b5fa3574SMax Kazantsev; CHECK-NEXT: %smax_sext_x_sext_y = select i1 %cmp_sext_x_sext_y, i64 %sext_y, i64 %sext_x 108b5fa3574SMax Kazantsev; CHECK-NEXT: --> ((sext i32 %x to i64) smax (sext i32 %y to i64)) U: [-2147483648,2147483648) S: [-2147483648,2147483648) 109b5fa3574SMax Kazantsev; CHECK-NEXT: Determining loop execution counts for: @test_smax 110b5fa3574SMax Kazantsev; 111b5fa3574SMax Kazantsev %cmp_x_y = icmp slt i32 %x, %y 112b5fa3574SMax Kazantsev %smax_x_y = select i1 %cmp_x_y, i32 %y, i32 %x 113b5fa3574SMax Kazantsev %sext_smax_x_y = sext i32 %smax_x_y to i64 114b5fa3574SMax Kazantsev 115b5fa3574SMax Kazantsev %sext_x = sext i32 %x to i64 116b5fa3574SMax Kazantsev %sext_y = sext i32 %y to i64 117b5fa3574SMax Kazantsev %cmp_sext_x_sext_y = icmp slt i64 %sext_x, %sext_y 118b5fa3574SMax Kazantsev %smax_sext_x_sext_y = select i1 %cmp_sext_x_sext_y, i64 %sext_y, i64 %sext_x 119b5fa3574SMax Kazantsev 120b5fa3574SMax Kazantsev %they_are_same = icmp eq i64 %sext_smax_x_y, %smax_sext_x_sext_y 121b5fa3574SMax Kazantsev ret i1 %they_are_same 122b5fa3574SMax Kazantsev} 1233c83bbd3SMax Kazantsev 1243c83bbd3SMax Kazantsev; TODO: Make sure that zext(umin_seq(x, y)) has same SCEV as umin_seq(zext(x), zext(y)). 1253c83bbd3SMax Kazantsev; Equality proof: https://alive2.llvm.org/ce/z/X8kaNx 1263c83bbd3SMax Kazantsevdefine i1 @test_umin_seq(i1 %x, i1 %y) { 1273c83bbd3SMax Kazantsev; CHECK-LABEL: 'test_umin_seq' 1283c83bbd3SMax Kazantsev; CHECK-NEXT: Classifying expressions for: @test_umin_seq 1293c83bbd3SMax Kazantsev; CHECK-NEXT: %x_umin_seq_y = select i1 %x, i1 %y, i1 false 1303c83bbd3SMax Kazantsev; CHECK-NEXT: --> (%x umin_seq %y) U: full-set S: full-set 1313c83bbd3SMax Kazantsev; CHECK-NEXT: %zext_x_umin_seq_y = zext i1 %x_umin_seq_y to i64 132*5fe915bbSMax Kazantsev; CHECK-NEXT: --> ((zext i1 %x to i64) umin_seq (zext i1 %y to i64)) U: [0,2) S: [0,2) 1333c83bbd3SMax Kazantsev; CHECK-NEXT: %zext_x = zext i1 %x to i64 1343c83bbd3SMax Kazantsev; CHECK-NEXT: --> (zext i1 %x to i64) U: [0,2) S: [0,2) 1353c83bbd3SMax Kazantsev; CHECK-NEXT: %zext_y = zext i1 %y to i64 1363c83bbd3SMax Kazantsev; CHECK-NEXT: --> (zext i1 %y to i64) U: [0,2) S: [0,2) 1373c83bbd3SMax Kazantsev; CHECK-NEXT: %umin_zext_x_zext_y = select i1 %cmp_zext_x_zext_y, i64 %zext_x, i64 %zext_y 1383c83bbd3SMax Kazantsev; CHECK-NEXT: --> ((zext i1 %x to i64) umin (zext i1 %y to i64)) U: [0,2) S: [0,2) 1393c83bbd3SMax Kazantsev; CHECK-NEXT: %umin_seq_zext_x_xext_y = select i1 %zext_x_is_0, i64 0, i64 %umin_zext_x_zext_y 1403c83bbd3SMax Kazantsev; CHECK-NEXT: --> ((zext i1 %x to i64) umin_seq (zext i1 %y to i64)) U: [0,2) S: [0,2) 1413c83bbd3SMax Kazantsev; CHECK-NEXT: Determining loop execution counts for: @test_umin_seq 1423c83bbd3SMax Kazantsev; 1433c83bbd3SMax Kazantsev %x_umin_seq_y = select i1 %x, i1 %y, i1 false 1443c83bbd3SMax Kazantsev %zext_x_umin_seq_y = zext i1 %x_umin_seq_y to i64 1453c83bbd3SMax Kazantsev 1463c83bbd3SMax Kazantsev %zext_x = zext i1 %x to i64 1473c83bbd3SMax Kazantsev %zext_y = zext i1 %y to i64 1483c83bbd3SMax Kazantsev %zext_x_is_0 = icmp eq i64 %zext_x, 0 1493c83bbd3SMax Kazantsev %cmp_zext_x_zext_y = icmp ult i64 %zext_x, %zext_y 1503c83bbd3SMax Kazantsev %umin_zext_x_zext_y = select i1 %cmp_zext_x_zext_y, i64 %zext_x, i64 %zext_y 1513c83bbd3SMax Kazantsev %umin_seq_zext_x_xext_y = select i1 %zext_x_is_0, i64 0, i64 %umin_zext_x_zext_y 1523c83bbd3SMax Kazantsev 1533c83bbd3SMax Kazantsev %they_are_same = icmp eq i64 %zext_x_umin_seq_y, %umin_seq_zext_x_xext_y 1543c83bbd3SMax Kazantsev ret i1 %they_are_same 1553c83bbd3SMax Kazantsev} 156