[llvm] bd6d41f - [NFC][SCEV] Add some more ptrtoint/PR46786 -related tests

Roman Lebedev via llvm-commits llvm-commits at lists.llvm.org
Sat Oct 17 11:23:12 PDT 2020


Author: Roman Lebedev
Date: 2020-10-17T21:04:44+03:00
New Revision: bd6d41f52e5655af3db28095c7574bae6b0cd788

URL: https://github.com/llvm/llvm-project/commit/bd6d41f52e5655af3db28095c7574bae6b0cd788
DIFF: https://github.com/llvm/llvm-project/commit/bd6d41f52e5655af3db28095c7574bae6b0cd788.diff

LOG: [NFC][SCEV] Add some more ptrtoint/PR46786 -related tests

Added: 
    llvm/test/Analysis/ScalarEvolution/ashr.ll

Modified: 
    llvm/test/Analysis/ScalarEvolution/ptrtoint.ll

Removed: 
    


################################################################################
diff  --git a/llvm/test/Analysis/ScalarEvolution/ashr.ll b/llvm/test/Analysis/ScalarEvolution/ashr.ll
new file mode 100644
index 000000000000..15e17468ce09
--- /dev/null
+++ b/llvm/test/Analysis/ScalarEvolution/ashr.ll
@@ -0,0 +1,73 @@
+; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py
+; RUN: opt < %s --data-layout="e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" -S -analyze -enable-new-pm=0 -scalar-evolution | FileCheck --check-prefixes=ALL,X64 %s
+; RUN: opt < %s --data-layout="e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" -S -disable-output "-passes=print<scalar-evolution>" 2>&1 | FileCheck --check-prefixes=ALL,X64 %s
+; RUN: opt < %s --data-layout="e-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-f64:32:64-f80:32-n8:16:32-S128" -S -analyze -enable-new-pm=0 -scalar-evolution | FileCheck --check-prefixes=ALL,X32 %s
+; RUN: opt < %s --data-layout="e-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-f64:32:64-f80:32-n8:16:32-S128" -S -disable-output "-passes=print<scalar-evolution>" 2>&1 | FileCheck --check-prefixes=ALL,X32 %s
+
+; In general, we can't deal with ashr.
+define i32 @t0(i32 %x, i32 %y) {
+; ALL-LABEL: 't0'
+; ALL-NEXT:  Classifying expressions for: @t0
+; ALL-NEXT:    %i0 = ashr i32 %x, %y
+; ALL-NEXT:    --> %i0 U: full-set S: full-set
+; ALL-NEXT:  Determining loop execution counts for: @t0
+;
+  %i0 = ashr i32 %x, %y
+  ret i32 %i0
+}
+; Not even if we know it's exact
+define i32 @t1(i32 %x, i32 %y) {
+; ALL-LABEL: 't1'
+; ALL-NEXT:  Classifying expressions for: @t1
+; ALL-NEXT:    %i0 = ashr exact i32 %x, %y
+; ALL-NEXT:    --> %i0 U: full-set S: full-set
+; ALL-NEXT:  Determining loop execution counts for: @t1
+;
+  %i0 = ashr exact i32 %x, %y
+  ret i32 %i0
+}
+; Not even if the shift amount is a constant.
+define i32 @t2(i32 %x, i32 %y) {
+; ALL-LABEL: 't2'
+; ALL-NEXT:  Classifying expressions for: @t2
+; ALL-NEXT:    %i0 = ashr i32 %x, 4
+; ALL-NEXT:    --> %i0 U: full-set S: [-134217728,134217728)
+; ALL-NEXT:  Determining loop execution counts for: @t2
+;
+  %i0 = ashr i32 %x, 4
+  ret i32 %i0
+}
+; However, if it's a constant AND the shift is exact, we can model it!
+define i32 @t3(i32 %x, i32 %y) {
+; ALL-LABEL: 't3'
+; ALL-NEXT:  Classifying expressions for: @t3
+; ALL-NEXT:    %i0 = ashr exact i32 %x, 4
+; ALL-NEXT:    --> %i0 U: full-set S: [-134217728,134217728)
+; ALL-NEXT:  Determining loop execution counts for: @t3
+;
+  %i0 = ashr exact i32 %x, 4
+  ret i32 %i0
+}
+; As long as the shift amount is in-bounds
+define i32 @t4(i32 %x, i32 %y) {
+; ALL-LABEL: 't4'
+; ALL-NEXT:  Classifying expressions for: @t4
+; ALL-NEXT:    %i0 = ashr exact i32 %x, 32
+; ALL-NEXT:    --> %i0 U: full-set S: full-set
+; ALL-NEXT:  Determining loop execution counts for: @t4
+;
+  %i0 = ashr exact i32 %x, 32
+  ret i32 %i0
+}
+
+; One more test, just to see that we model constant correctly
+define i32 @t5(i32 %x, i32 %y) {
+; ALL-LABEL: 't5'
+; ALL-NEXT:  Classifying expressions for: @t5
+; ALL-NEXT:    %i0 = ashr exact i32 %x, 5
+; ALL-NEXT:    --> %i0 U: full-set S: [-67108864,67108864)
+; ALL-NEXT:  Determining loop execution counts for: @t5
+;
+  %i0 = ashr exact i32 %x, 5
+  ret i32 %i0
+}

diff  --git a/llvm/test/Analysis/ScalarEvolution/ptrtoint.ll b/llvm/test/Analysis/ScalarEvolution/ptrtoint.ll
index e3e9330e241f..3e556345a516 100644
--- a/llvm/test/Analysis/ScalarEvolution/ptrtoint.ll
+++ b/llvm/test/Analysis/ScalarEvolution/ptrtoint.ll
@@ -237,3 +237,174 @@ define void @ptrtoint_of_bitcast_of_gep(i8* %in, i64* %out0) {
   store i64 %p0, i64* %out0
   ret void
 }
+
+; void pr46786_c26_char(char* start, char *end, char *other) {
+;   for (char* cur = start; cur != end; ++cur)
+;     other[cur - start] += *cur;
+; }
+define void @pr46786_c26_char(i8* %arg, i8* %arg1, i8* %arg2) {
+; X64-LABEL: 'pr46786_c26_char'
+; X64-NEXT:  Classifying expressions for: @pr46786_c26_char
+; X64-NEXT:    %i4 = ptrtoint i8* %arg to i64
+; X64-NEXT:    --> %i4 U: full-set S: full-set
+; X64-NEXT:    %i7 = phi i8* [ %arg, %bb3 ], [ %i14, %bb6 ]
+; X64-NEXT:    --> {%arg,+,1}<nuw><%bb6> U: full-set S: full-set Exits: (-1 + %arg1) LoopDispositions: { %bb6: Computable }
+; X64-NEXT:    %i8 = load i8, i8* %i7, align 1
+; X64-NEXT:    --> %i8 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %bb6: Variant }
+; X64-NEXT:    %i9 = ptrtoint i8* %i7 to i64
+; X64-NEXT:    --> %i9 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %bb6: Variant }
+; X64-NEXT:    %i10 = sub i64 %i9, %i4
+; X64-NEXT:    --> ((-1 * %i4) + %i9) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %bb6: Variant }
+; X64-NEXT:    %i11 = getelementptr inbounds i8, i8* %arg2, i64 %i10
+; X64-NEXT:    --> ((-1 * %i4) + %i9 + %arg2) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %bb6: Variant }
+; X64-NEXT:    %i12 = load i8, i8* %i11, align 1
+; X64-NEXT:    --> %i12 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %bb6: Variant }
+; X64-NEXT:    %i13 = add i8 %i12, %i8
+; X64-NEXT:    --> (%i12 + %i8) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %bb6: Variant }
+; X64-NEXT:    %i14 = getelementptr inbounds i8, i8* %i7, i64 1
+; X64-NEXT:    --> {(1 + %arg)<nsw>,+,1}<nuw><%bb6> U: full-set S: full-set Exits: %arg1 LoopDispositions: { %bb6: Computable }
+; X64-NEXT:  Determining loop execution counts for: @pr46786_c26_char
+; X64-NEXT:  Loop %bb6: backedge-taken count is (-1 + (-1 * %arg) + %arg1)
+; X64-NEXT:  Loop %bb6: max backedge-taken count is -2
+; X64-NEXT:  Loop %bb6: Predicated backedge-taken count is (-1 + (-1 * %arg) + %arg1)
+; X64-NEXT:   Predicates:
+; X64:       Loop %bb6: Trip multiple is 1
+;
+; X32-LABEL: 'pr46786_c26_char'
+; X32-NEXT:  Classifying expressions for: @pr46786_c26_char
+; X32-NEXT:    %i4 = ptrtoint i8* %arg to i64
+; X32-NEXT:    --> %i4 U: [0,4294967296) S: [-4294967296,4294967296)
+; X32-NEXT:    %i7 = phi i8* [ %arg, %bb3 ], [ %i14, %bb6 ]
+; X32-NEXT:    --> {%arg,+,1}<nuw><%bb6> U: full-set S: full-set Exits: (-1 + %arg1) LoopDispositions: { %bb6: Computable }
+; X32-NEXT:    %i8 = load i8, i8* %i7, align 1
+; X32-NEXT:    --> %i8 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %bb6: Variant }
+; X32-NEXT:    %i9 = ptrtoint i8* %i7 to i64
+; X32-NEXT:    --> %i9 U: [0,4294967296) S: [-4294967296,4294967296) Exits: <<Unknown>> LoopDispositions: { %bb6: Variant }
+; X32-NEXT:    %i10 = sub i64 %i9, %i4
+; X32-NEXT:    --> ((-1 * %i4)<nsw> + %i9) U: [-4294967295,4294967296) S: [-8589934591,8589934592) Exits: <<Unknown>> LoopDispositions: { %bb6: Variant }
+; X32-NEXT:    %i11 = getelementptr inbounds i8, i8* %arg2, i64 %i10
+; X32-NEXT:    --> ((trunc i64 %i9 to i32) + (-1 * (trunc i64 %i4 to i32)) + %arg2) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %bb6: Variant }
+; X32-NEXT:    %i12 = load i8, i8* %i11, align 1
+; X32-NEXT:    --> %i12 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %bb6: Variant }
+; X32-NEXT:    %i13 = add i8 %i12, %i8
+; X32-NEXT:    --> (%i12 + %i8) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %bb6: Variant }
+; X32-NEXT:    %i14 = getelementptr inbounds i8, i8* %i7, i64 1
+; X32-NEXT:    --> {(1 + %arg)<nsw>,+,1}<nuw><%bb6> U: full-set S: full-set Exits: %arg1 LoopDispositions: { %bb6: Computable }
+; X32-NEXT:  Determining loop execution counts for: @pr46786_c26_char
+; X32-NEXT:  Loop %bb6: backedge-taken count is (-1 + (-1 * %arg) + %arg1)
+; X32-NEXT:  Loop %bb6: max backedge-taken count is -2
+; X32-NEXT:  Loop %bb6: Predicated backedge-taken count is (-1 + (-1 * %arg) + %arg1)
+; X32-NEXT:   Predicates:
+; X32:       Loop %bb6: Trip multiple is 1
+;
+  %i = icmp eq i8* %arg, %arg1
+  br i1 %i, label %bb5, label %bb3
+
+bb3:
+  %i4 = ptrtoint i8* %arg to i64
+  br label %bb6
+
+bb6:
+  %i7 = phi i8* [ %arg, %bb3 ], [ %i14, %bb6 ]
+  %i8 = load i8, i8* %i7
+  %i9 = ptrtoint i8* %i7 to i64
+  %i10 = sub i64 %i9, %i4
+  %i11 = getelementptr inbounds i8, i8* %arg2, i64 %i10
+  %i12 = load i8, i8* %i11
+  %i13 = add i8 %i12, %i8
+  store i8 %i13, i8* %i11
+  %i14 = getelementptr inbounds i8, i8* %i7, i64 1
+  %i15 = icmp eq i8* %i14, %arg1
+  br i1 %i15, label %bb5, label %bb6
+
+bb5:
+  ret void
+}
+
+; void pr46786_c26_int(int* start, int *end, int *other) {
+;   for (int* cur = start; cur != end; ++cur)
+;     other[cur - start] += *cur;
+; }
+define void @pr46786_c26_int(i32* %arg, i32* %arg1, i32* %arg2) {
+; X64-LABEL: 'pr46786_c26_int'
+; X64-NEXT:  Classifying expressions for: @pr46786_c26_int
+; X64-NEXT:    %i4 = ptrtoint i32* %arg to i64
+; X64-NEXT:    --> %i4 U: full-set S: full-set
+; X64-NEXT:    %i7 = phi i32* [ %arg, %bb3 ], [ %i15, %bb6 ]
+; X64-NEXT:    --> {%arg,+,4}<nuw><%bb6> U: full-set S: full-set Exits: ((4 * ((-4 + (-1 * %arg) + %arg1) /u 4))<nuw> + %arg) LoopDispositions: { %bb6: Computable }
+; X64-NEXT:    %i8 = load i32, i32* %i7, align 4
+; X64-NEXT:    --> %i8 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %bb6: Variant }
+; X64-NEXT:    %i9 = ptrtoint i32* %i7 to i64
+; X64-NEXT:    --> %i9 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %bb6: Variant }
+; X64-NEXT:    %i10 = sub i64 %i9, %i4
+; X64-NEXT:    --> ((-1 * %i4) + %i9) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %bb6: Variant }
+; X64-NEXT:    %i11 = ashr exact i64 %i10, 2
+; X64-NEXT:    --> %i11 U: full-set S: [-2305843009213693952,2305843009213693952) Exits: <<Unknown>> LoopDispositions: { %bb6: Variant }
+; X64-NEXT:    %i12 = getelementptr inbounds i32, i32* %arg2, i64 %i11
+; X64-NEXT:    --> ((4 * %i11)<nsw> + %arg2)<nsw> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %bb6: Variant }
+; X64-NEXT:    %i13 = load i32, i32* %i12, align 4
+; X64-NEXT:    --> %i13 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %bb6: Variant }
+; X64-NEXT:    %i14 = add nsw i32 %i13, %i8
+; X64-NEXT:    --> (%i13 + %i8) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %bb6: Variant }
+; X64-NEXT:    %i15 = getelementptr inbounds i32, i32* %i7, i64 1
+; X64-NEXT:    --> {(4 + %arg)<nsw>,+,4}<nuw><%bb6> U: full-set S: full-set Exits: (4 + (4 * ((-4 + (-1 * %arg) + %arg1) /u 4))<nuw> + %arg) LoopDispositions: { %bb6: Computable }
+; X64-NEXT:  Determining loop execution counts for: @pr46786_c26_int
+; X64-NEXT:  Loop %bb6: backedge-taken count is ((-4 + (-1 * %arg) + %arg1) /u 4)
+; X64-NEXT:  Loop %bb6: max backedge-taken count is 4611686018427387903
+; X64-NEXT:  Loop %bb6: Predicated backedge-taken count is ((-4 + (-1 * %arg) + %arg1) /u 4)
+; X64-NEXT:   Predicates:
+; X64:       Loop %bb6: Trip multiple is 1
+;
+; X32-LABEL: 'pr46786_c26_int'
+; X32-NEXT:  Classifying expressions for: @pr46786_c26_int
+; X32-NEXT:    %i4 = ptrtoint i32* %arg to i64
+; X32-NEXT:    --> %i4 U: [0,4294967296) S: [-4294967296,4294967296)
+; X32-NEXT:    %i7 = phi i32* [ %arg, %bb3 ], [ %i15, %bb6 ]
+; X32-NEXT:    --> {%arg,+,4}<nuw><%bb6> U: full-set S: full-set Exits: ((4 * ((-4 + (-1 * %arg) + %arg1) /u 4))<nuw> + %arg) LoopDispositions: { %bb6: Computable }
+; X32-NEXT:    %i8 = load i32, i32* %i7, align 4
+; X32-NEXT:    --> %i8 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %bb6: Variant }
+; X32-NEXT:    %i9 = ptrtoint i32* %i7 to i64
+; X32-NEXT:    --> %i9 U: [0,4294967296) S: [-4294967296,4294967296) Exits: <<Unknown>> LoopDispositions: { %bb6: Variant }
+; X32-NEXT:    %i10 = sub i64 %i9, %i4
+; X32-NEXT:    --> ((-1 * %i4)<nsw> + %i9) U: [-4294967295,4294967296) S: [-8589934591,8589934592) Exits: <<Unknown>> LoopDispositions: { %bb6: Variant }
+; X32-NEXT:    %i11 = ashr exact i64 %i10, 2
+; X32-NEXT:    --> %i11 U: full-set S: [-2147483648,2147483648) Exits: <<Unknown>> LoopDispositions: { %bb6: Variant }
+; X32-NEXT:    %i12 = getelementptr inbounds i32, i32* %arg2, i64 %i11
+; X32-NEXT:    --> ((4 * (trunc i64 %i11 to i32))<nsw> + %arg2)<nsw> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %bb6: Variant }
+; X32-NEXT:    %i13 = load i32, i32* %i12, align 4
+; X32-NEXT:    --> %i13 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %bb6: Variant }
+; X32-NEXT:    %i14 = add nsw i32 %i13, %i8
+; X32-NEXT:    --> (%i13 + %i8) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %bb6: Variant }
+; X32-NEXT:    %i15 = getelementptr inbounds i32, i32* %i7, i64 1
+; X32-NEXT:    --> {(4 + %arg)<nsw>,+,4}<nuw><%bb6> U: full-set S: full-set Exits: (4 + (4 * ((-4 + (-1 * %arg) + %arg1) /u 4))<nuw> + %arg) LoopDispositions: { %bb6: Computable }
+; X32-NEXT:  Determining loop execution counts for: @pr46786_c26_int
+; X32-NEXT:  Loop %bb6: backedge-taken count is ((-4 + (-1 * %arg) + %arg1) /u 4)
+; X32-NEXT:  Loop %bb6: max backedge-taken count is 1073741823
+; X32-NEXT:  Loop %bb6: Predicated backedge-taken count is ((-4 + (-1 * %arg) + %arg1) /u 4)
+; X32-NEXT:   Predicates:
+; X32:       Loop %bb6: Trip multiple is 1
+;
+  %i = icmp eq i32* %arg, %arg1
+  br i1 %i, label %bb5, label %bb3
+
+bb3:
+  %i4 = ptrtoint i32* %arg to i64
+  br label %bb6
+
+bb6:
+  %i7 = phi i32* [ %arg, %bb3 ], [ %i15, %bb6 ]
+  %i8 = load i32, i32* %i7
+  %i9 = ptrtoint i32* %i7 to i64
+  %i10 = sub i64 %i9, %i4
+  %i11 = ashr exact i64 %i10, 2
+  %i12 = getelementptr inbounds i32, i32* %arg2, i64 %i11
+  %i13 = load i32, i32* %i12
+  %i14 = add nsw i32 %i13, %i8
+  store i32 %i14, i32* %i12
+  %i15 = getelementptr inbounds i32, i32* %i7, i64 1
+  %i16 = icmp eq i32* %i15, %arg1
+  br i1 %i16, label %bb5, label %bb6
+
+bb5:
+  ret void
+}


        


More information about the llvm-commits mailing list