|
| 1 | +; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py |
| 2 | +; RUN: opt -disable-output -passes="print<scalar-evolution>" < %s 2>&1 | FileCheck %s |
| 3 | + |
| 4 | +define i32 @test_expr_with_constant_1(i32 %x) { |
| 5 | +; CHECK-LABEL: 'test_expr_with_constant_1' |
| 6 | +; CHECK-NEXT: Classifying expressions for: @test_expr_with_constant_1 |
| 7 | +; CHECK-NEXT: %smax = tail call i32 @llvm.smax.i32(i32 %x, i32 1) |
| 8 | +; CHECK-NEXT: --> (1 smax %x) U: [1,-2147483648) S: [1,-2147483648) |
| 9 | +; CHECK-NEXT: %add = add nsw i32 %smax, -1 |
| 10 | +; CHECK-NEXT: --> (-1 + (1 smax %x))<nsw> U: [0,2147483647) S: [0,2147483647) |
| 11 | +; CHECK-NEXT: %udiv = udiv i32 %add, %x |
| 12 | +; CHECK-NEXT: --> 0 U: [0,1) S: [0,1) |
| 13 | +; CHECK-NEXT: Determining loop execution counts for: @test_expr_with_constant_1 |
| 14 | +; |
| 15 | +entry: |
| 16 | + %smax = tail call i32 @llvm.smax.i32(i32 %x, i32 1) |
| 17 | + %add = add nsw i32 %smax, -1 |
| 18 | + %udiv = udiv i32 %add, %x |
| 19 | + ret i32 %udiv |
| 20 | +} |
| 21 | + |
| 22 | +; Non-1 constant: (-2 + (2 smax %x)) /u %x |
| 23 | +define i32 @test_expr_with_constant_2(i32 %x) { |
| 24 | +; CHECK-LABEL: 'test_expr_with_constant_2' |
| 25 | +; CHECK-NEXT: Classifying expressions for: @test_expr_with_constant_2 |
| 26 | +; CHECK-NEXT: %smax = tail call i32 @llvm.smax.i32(i32 %x, i32 2) |
| 27 | +; CHECK-NEXT: --> (2 smax %x) U: [2,-2147483648) S: [2,-2147483648) |
| 28 | +; CHECK-NEXT: %add = add nsw i32 %smax, -2 |
| 29 | +; CHECK-NEXT: --> (-2 + (2 smax %x))<nsw> U: [0,2147483646) S: [0,2147483646) |
| 30 | +; CHECK-NEXT: %udiv = udiv i32 %add, %x |
| 31 | +; CHECK-NEXT: --> 0 U: [0,1) S: [0,1) |
| 32 | +; CHECK-NEXT: Determining loop execution counts for: @test_expr_with_constant_2 |
| 33 | +; |
| 34 | +entry: |
| 35 | + %smax = tail call i32 @llvm.smax.i32(i32 %x, i32 2) |
| 36 | + %add = add nsw i32 %smax, -2 |
| 37 | + %udiv = udiv i32 %add, %x |
| 38 | + ret i32 %udiv |
| 39 | +} |
| 40 | + |
| 41 | +; Negative test, constants mismatch: (-3 + (2 smax %x)) /u %x |
| 42 | +define i32 @test_expr_mismatch_constants(i32 %x) { |
| 43 | +; CHECK-LABEL: 'test_expr_mismatch_constants' |
| 44 | +; CHECK-NEXT: Classifying expressions for: @test_expr_mismatch_constants |
| 45 | +; CHECK-NEXT: %smax = tail call i32 @llvm.smax.i32(i32 %x, i32 2) |
| 46 | +; CHECK-NEXT: --> (2 smax %x) U: [2,-2147483648) S: [2,-2147483648) |
| 47 | +; CHECK-NEXT: %add = add nsw i32 %smax, -3 |
| 48 | +; CHECK-NEXT: --> (-3 + (2 smax %x))<nsw> U: [-1,2147483645) S: [-1,2147483645) |
| 49 | +; CHECK-NEXT: %udiv = udiv i32 %add, %x |
| 50 | +; CHECK-NEXT: --> ((-3 + (2 smax %x))<nsw> /u %x) U: full-set S: full-set |
| 51 | +; CHECK-NEXT: Determining loop execution counts for: @test_expr_mismatch_constants |
| 52 | +; |
| 53 | +entry: |
| 54 | + %smax = tail call i32 @llvm.smax.i32(i32 %x, i32 2) |
| 55 | + %add = add nsw i32 %smax, -3 |
| 56 | + %udiv = udiv i32 %add, %x |
| 57 | + ret i32 %udiv |
| 58 | +} |
| 59 | + |
| 60 | +; Negative constant: (3 + (-3 smax %x)) /u %x |
| 61 | +define i32 @test_expr_negative_constant(i32 %x) { |
| 62 | +; CHECK-LABEL: 'test_expr_negative_constant' |
| 63 | +; CHECK-NEXT: Classifying expressions for: @test_expr_negative_constant |
| 64 | +; CHECK-NEXT: %smax = tail call i32 @llvm.smax.i32(i32 %x, i32 -3) |
| 65 | +; CHECK-NEXT: --> (-3 smax %x) U: [-3,-2147483648) S: [-3,-2147483648) |
| 66 | +; CHECK-NEXT: %add = add nsw i32 %smax, 3 |
| 67 | +; CHECK-NEXT: --> (3 + (-3 smax %x)) U: [0,-2147483645) S: [0,-2147483645) |
| 68 | +; CHECK-NEXT: %udiv = udiv i32 %add, %x |
| 69 | +; CHECK-NEXT: --> ((3 + (-3 smax %x)) /u %x) U: [0,-2147483645) S: [0,-2147483645) |
| 70 | +; CHECK-NEXT: Determining loop execution counts for: @test_expr_negative_constant |
| 71 | +; |
| 72 | +entry: |
| 73 | + %smax = tail call i32 @llvm.smax.i32(i32 %x, i32 -3) |
| 74 | + %add = add nsw i32 %smax, 3 |
| 75 | + %udiv = udiv i32 %add, %x |
| 76 | + ret i32 %udiv |
| 77 | +} |
| 78 | + |
| 79 | +; Negative signed minimum value. |
| 80 | +define i8 @text_expr_with_constant_signed_min(i8 %x) { |
| 81 | +; CHECK-LABEL: 'text_expr_with_constant_signed_min' |
| 82 | +; CHECK-NEXT: Classifying expressions for: @text_expr_with_constant_signed_min |
| 83 | +; CHECK-NEXT: %smax = tail call i8 @llvm.smax.i8(i8 %x, i8 -128) |
| 84 | +; CHECK-NEXT: --> %x U: full-set S: full-set |
| 85 | +; CHECK-NEXT: %add = add nsw i8 %smax, -128 |
| 86 | +; CHECK-NEXT: --> (-128 + %x) U: full-set S: full-set |
| 87 | +; CHECK-NEXT: %udiv = udiv i8 %add, %x |
| 88 | +; CHECK-NEXT: --> ((-128 + %x) /u %x) U: full-set S: full-set |
| 89 | +; CHECK-NEXT: Determining loop execution counts for: @text_expr_with_constant_signed_min |
| 90 | +; |
| 91 | +entry: |
| 92 | + %smax = tail call i8 @llvm.smax.i8(i8 %x, i8 128) |
| 93 | + %add = add nsw i8 %smax, -128 |
| 94 | + %udiv = udiv i8 %add, %x |
| 95 | + ret i8 %udiv |
| 96 | +} |
0 commit comments