142 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py2; RUN: opt -S -disable-output "-passes=print<scalar-evolution>" < %s 2>&1 | FileCheck %s3 4; The obvious case.5define i32 @udiv_biggerLshr(i32 %val) nounwind {6; CHECK-LABEL: 'udiv_biggerLshr'7; CHECK-NEXT: Classifying expressions for: @udiv_biggerLshr8; CHECK-NEXT: %tmp1 = udiv i32 %val, 649; CHECK-NEXT: --> (%val /u 64) U: [0,67108864) S: [0,67108864)10; CHECK-NEXT: %tmp2 = mul i32 %tmp1, 1611; CHECK-NEXT: --> (16 * (%val /u 64))<nuw><nsw> U: [0,1073741809) S: [0,1073741809)12; CHECK-NEXT: Determining loop execution counts for: @udiv_biggerLshr13;14 %tmp1 = udiv i32 %val, 6415 %tmp2 = mul i32 %tmp1, 1616 ret i32 %tmp217}18 19define i32 @udiv_biggerShl(i32 %val) nounwind {20; CHECK-LABEL: 'udiv_biggerShl'21; CHECK-NEXT: Classifying expressions for: @udiv_biggerShl22; CHECK-NEXT: %tmp1 = udiv i32 %val, 1623; CHECK-NEXT: --> (%val /u 16) U: [0,268435456) S: [0,268435456)24; CHECK-NEXT: %tmp2 = mul i32 %tmp1, 6425; CHECK-NEXT: --> (64 * (%val /u 16)) U: [0,-63) S: [-2147483648,2147483585)26; CHECK-NEXT: Determining loop execution counts for: @udiv_biggerShl27;28 %tmp1 = udiv i32 %val, 1629 %tmp2 = mul i32 %tmp1, 6430 ret i32 %tmp231}32 33; Or, it could have been transformed to shifts34 35define i32 @shifty_biggerLshr(i32 %val) {36; CHECK-LABEL: 'shifty_biggerLshr'37; CHECK-NEXT: Classifying expressions for: @shifty_biggerLshr38; CHECK-NEXT: %tmp1 = lshr i32 %val, 639; CHECK-NEXT: --> (%val /u 64) U: [0,67108864) S: [0,67108864)40; CHECK-NEXT: %tmp2 = shl i32 %tmp1, 441; CHECK-NEXT: --> (16 * (%val /u 64))<nuw><nsw> U: [0,1073741809) S: [0,1073741809)42; CHECK-NEXT: Determining loop execution counts for: @shifty_biggerLshr43;44 %tmp1 = lshr i32 %val, 645 %tmp2 = shl i32 %tmp1, 446 ret i32 %tmp247}48 49define i32 @shifty_biggerLshr_lshrexact(i32 %val) {50; CHECK-LABEL: 'shifty_biggerLshr_lshrexact'51; CHECK-NEXT: Classifying expressions for: @shifty_biggerLshr_lshrexact52; CHECK-NEXT: %tmp1 = lshr exact i32 %val, 653; CHECK-NEXT: --> (%val /u 64) U: [0,67108864) S: [0,67108864)54; CHECK-NEXT: %tmp2 = shl i32 %tmp1, 455; CHECK-NEXT: --> (16 * (%val /u 64))<nuw><nsw> U: [0,1073741809) S: [0,1073741809)56; CHECK-NEXT: Determining loop execution counts for: @shifty_biggerLshr_lshrexact57;58 %tmp1 = lshr exact i32 %val, 659 %tmp2 = shl i32 %tmp1, 460 ret i32 %tmp261}62 63define i32 @shifty_biggerShr(i32 %val) {64; CHECK-LABEL: 'shifty_biggerShr'65; CHECK-NEXT: Classifying expressions for: @shifty_biggerShr66; CHECK-NEXT: %tmp1 = lshr i32 %val, 467; CHECK-NEXT: --> (%val /u 16) U: [0,268435456) S: [0,268435456)68; CHECK-NEXT: %tmp2 = shl i32 %tmp1, 669; CHECK-NEXT: --> (64 * (%val /u 16)) U: [0,-63) S: [-2147483648,2147483585)70; CHECK-NEXT: Determining loop execution counts for: @shifty_biggerShr71;72 %tmp1 = lshr i32 %val, 473 %tmp2 = shl i32 %tmp1, 674 ret i32 %tmp275}76 77define i32 @shifty_biggerShr_lshrexact(i32 %val) {78; CHECK-LABEL: 'shifty_biggerShr_lshrexact'79; CHECK-NEXT: Classifying expressions for: @shifty_biggerShr_lshrexact80; CHECK-NEXT: %tmp1 = lshr exact i32 %val, 481; CHECK-NEXT: --> (%val /u 16) U: [0,268435456) S: [0,268435456)82; CHECK-NEXT: %tmp2 = shl i32 %tmp1, 683; CHECK-NEXT: --> (64 * (%val /u 16)) U: [0,-63) S: [-2147483648,2147483585)84; CHECK-NEXT: Determining loop execution counts for: @shifty_biggerShr_lshrexact85;86 %tmp1 = lshr exact i32 %val, 487 %tmp2 = shl i32 %tmp1, 688 ret i32 %tmp289}90 91; Or, further folded into mask variant.92 93define i32 @masky_biggerLshr(i32 %val) {94; CHECK-LABEL: 'masky_biggerLshr'95; CHECK-NEXT: Classifying expressions for: @masky_biggerLshr96; CHECK-NEXT: %tmp1 = lshr i32 %val, 297; CHECK-NEXT: --> (%val /u 4) U: [0,1073741824) S: [0,1073741824)98; CHECK-NEXT: %tmp2 = and i32 %tmp1, -1699; CHECK-NEXT: --> (16 * (%val /u 64))<nuw><nsw> U: [0,1073741809) S: [0,1073741809)100; CHECK-NEXT: Determining loop execution counts for: @masky_biggerLshr101;102 %tmp1 = lshr i32 %val, 2103 %tmp2 = and i32 %tmp1, -16104 ret i32 %tmp2105}106 107define i32 @masky_biggerLshr_lshrexact(i32 %val) {108; CHECK-LABEL: 'masky_biggerLshr_lshrexact'109; CHECK-NEXT: Classifying expressions for: @masky_biggerLshr_lshrexact110; CHECK-NEXT: %tmp1 = lshr exact i32 %val, 2111; CHECK-NEXT: --> (%val /u 4) U: [0,1073741824) S: [0,1073741824)112; CHECK-NEXT: Determining loop execution counts for: @masky_biggerLshr_lshrexact113;114 %tmp1 = lshr exact i32 %val, 2115 ret i32 %tmp1116}117 118define i32 @masky_biggerShr(i32 %val) {119; CHECK-LABEL: 'masky_biggerShr'120; CHECK-NEXT: Classifying expressions for: @masky_biggerShr121; CHECK-NEXT: %tmp1 = shl i32 %val, 2122; CHECK-NEXT: --> (4 * %val) U: [0,-3) S: [-2147483648,2147483645)123; CHECK-NEXT: %tmp2 = and i32 %tmp1, -64124; CHECK-NEXT: --> (64 * (zext i26 (trunc i32 (%val /u 16) to i26) to i32))<nuw> U: [0,-63) S: [-2147483648,2147483585)125; CHECK-NEXT: Determining loop execution counts for: @masky_biggerShr126;127 %tmp1 = shl i32 %val, 2128 %tmp2 = and i32 %tmp1, -64129 ret i32 %tmp2130}131 132define i32 @masky_biggerShr_lshrexact(i32 %val) {133; CHECK-LABEL: 'masky_biggerShr_lshrexact'134; CHECK-NEXT: Classifying expressions for: @masky_biggerShr_lshrexact135; CHECK-NEXT: %tmp1 = shl i32 %val, 2136; CHECK-NEXT: --> (4 * %val) U: [0,-3) S: [-2147483648,2147483645)137; CHECK-NEXT: Determining loop execution counts for: @masky_biggerShr_lshrexact138;139 %tmp1 = shl i32 %val, 2140 ret i32 %tmp1141}142