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