xref: /llvm-project/llvm/test/Analysis/ScalarEvolution/extract-highbits-sameconstmask.ll (revision 50153213c80286c6c91da4612aaf234cc6438c63)
142a1ff11SRoman Lebedev; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py
29adbb5cbSArthur Eubanks; RUN: opt -S -disable-output "-passes=print<scalar-evolution>" < %s 2>&1 | FileCheck %s
342a1ff11SRoman Lebedev
442a1ff11SRoman Lebedev; The obvious case.
542a1ff11SRoman Lebedevdefine i32 @div(i32 %val) nounwind {
642a1ff11SRoman Lebedev; CHECK-LABEL: 'div'
742a1ff11SRoman Lebedev; CHECK-NEXT:  Classifying expressions for: @div
842a1ff11SRoman Lebedev; CHECK-NEXT:    %tmp1 = udiv i32 %val, 16
942a1ff11SRoman Lebedev; CHECK-NEXT:    --> (%val /u 16) U: [0,268435456) S: [0,268435456)
1042a1ff11SRoman Lebedev; CHECK-NEXT:    %tmp2 = mul i32 %tmp1, 16
118550fb38SNikita Popov; CHECK-NEXT:    --> (16 * (%val /u 16))<nuw> U: [0,-15) S: [-2147483648,2147483633)
1242a1ff11SRoman Lebedev; CHECK-NEXT:  Determining loop execution counts for: @div
1342a1ff11SRoman Lebedev;
1442a1ff11SRoman Lebedev  %tmp1 = udiv i32 %val, 16
1542a1ff11SRoman Lebedev  %tmp2 = mul i32 %tmp1, 16
1642a1ff11SRoman Lebedev  ret i32 %tmp2
1742a1ff11SRoman Lebedev}
1842a1ff11SRoman Lebedev
1942a1ff11SRoman Lebedevdefine i32 @sdiv(i32 %val) nounwind {
2042a1ff11SRoman Lebedev; CHECK-LABEL: 'sdiv'
2142a1ff11SRoman Lebedev; CHECK-NEXT:  Classifying expressions for: @sdiv
2242a1ff11SRoman Lebedev; CHECK-NEXT:    %tmp1 = sdiv i32 %val, 16
23*4a5edea1SPhilip Reames; CHECK-NEXT:    --> %tmp1 U: [-134217728,134217728) S: [-134217728,134217728)
2442a1ff11SRoman Lebedev; CHECK-NEXT:    %tmp2 = mul i32 %tmp1, 16
25a064622bSTim Shen; CHECK-NEXT:    --> (16 * %tmp1)<nsw> U: [0,-15) S: [-2147483648,2147483633)
2642a1ff11SRoman Lebedev; CHECK-NEXT:  Determining loop execution counts for: @sdiv
2742a1ff11SRoman Lebedev;
2842a1ff11SRoman Lebedev  %tmp1 = sdiv i32 %val, 16
2942a1ff11SRoman Lebedev  %tmp2 = mul i32 %tmp1, 16
3042a1ff11SRoman Lebedev  ret i32 %tmp2
3142a1ff11SRoman Lebedev}
3242a1ff11SRoman Lebedev
3342a1ff11SRoman Lebedev; Or, it could be a number of equivalent patterns with mask:
3442a1ff11SRoman Lebedev;   b) x &  (-1 << nbits)
3542a1ff11SRoman Lebedev;   d) x >> nbits << nbits
3642a1ff11SRoman Lebedev
3742a1ff11SRoman Lebedevdefine i32 @mask_b(i32 %val) nounwind {
3842a1ff11SRoman Lebedev; CHECK-LABEL: 'mask_b'
3942a1ff11SRoman Lebedev; CHECK-NEXT:  Classifying expressions for: @mask_b
4042a1ff11SRoman Lebedev; CHECK-NEXT:    %masked = and i32 %val, -16
418550fb38SNikita Popov; CHECK-NEXT:    --> (16 * (%val /u 16))<nuw> U: [0,-15) S: [-2147483648,2147483633)
4242a1ff11SRoman Lebedev; CHECK-NEXT:  Determining loop execution counts for: @mask_b
4342a1ff11SRoman Lebedev;
4442a1ff11SRoman Lebedev  %masked = and i32 %val, -16
4542a1ff11SRoman Lebedev  ret i32 %masked
4642a1ff11SRoman Lebedev}
4742a1ff11SRoman Lebedev
4842a1ff11SRoman Lebedevdefine i32 @mask_d(i32 %val) nounwind {
4942a1ff11SRoman Lebedev; CHECK-LABEL: 'mask_d'
5042a1ff11SRoman Lebedev; CHECK-NEXT:  Classifying expressions for: @mask_d
5142a1ff11SRoman Lebedev; CHECK-NEXT:    %lowbitscleared = lshr i32 %val, 4
5242a1ff11SRoman Lebedev; CHECK-NEXT:    --> (%val /u 16) U: [0,268435456) S: [0,268435456)
5342a1ff11SRoman Lebedev; CHECK-NEXT:    %masked = shl i32 %lowbitscleared, 4
548550fb38SNikita Popov; CHECK-NEXT:    --> (16 * (%val /u 16))<nuw> U: [0,-15) S: [-2147483648,2147483633)
5542a1ff11SRoman Lebedev; CHECK-NEXT:  Determining loop execution counts for: @mask_d
5642a1ff11SRoman Lebedev;
5742a1ff11SRoman Lebedev  %lowbitscleared = lshr i32 %val, 4
5842a1ff11SRoman Lebedev  %masked = shl i32 %lowbitscleared, 4
5942a1ff11SRoman Lebedev  ret i32 %masked
6042a1ff11SRoman Lebedev}
61