[llvm] fd20eb5 - [NFC][SCEV] Tests with modellable pointer `select`s

Roman Lebedev via llvm-commits llvm-commits at lists.llvm.org
Thu Apr 28 16:38:42 PDT 2022


Author: Roman Lebedev
Date: 2022-04-29T02:37:05+03:00
New Revision: fd20eb55f1b62d90e4cc45438a5be993256c1f3a

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

LOG: [NFC][SCEV] Tests with modellable pointer `select`s

Added: 
    llvm/test/Analysis/ScalarEvolution/pointer-rounding.ll
    llvm/test/Analysis/ScalarEvolution/pointer-select.ll

Modified: 
    

Removed: 
    


################################################################################
diff  --git a/llvm/test/Analysis/ScalarEvolution/pointer-rounding.ll b/llvm/test/Analysis/ScalarEvolution/pointer-rounding.ll
new file mode 100644
index 000000000000..6d6143367756
--- /dev/null
+++ b/llvm/test/Analysis/ScalarEvolution/pointer-rounding.ll
@@ -0,0 +1,169 @@
+; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py
+; RUN: opt -disable-output "-passes=print<scalar-evolution>" < %s 2>&1 | FileCheck %s
+
+define ptr @pointer_align_down(ptr %obj) {
+; CHECK-LABEL: 'pointer_align_down'
+; CHECK-NEXT:  Classifying expressions for: @pointer_align_down
+; CHECK-NEXT:    %i = ptrtoint ptr %obj to i64
+; CHECK-NEXT:    --> (ptrtoint ptr %obj to i64) U: full-set S: full-set
+; CHECK-NEXT:    %i2 = and i64 %i, 15
+; CHECK-NEXT:    --> (zext i4 (trunc i64 (ptrtoint ptr %obj to i64) to i4) to i64) U: [0,16) S: [0,16)
+; CHECK-NEXT:    %i3 = sub nsw i64 0, %i2
+; CHECK-NEXT:    --> (-1 * (zext i4 (trunc i64 (ptrtoint ptr %obj to i64) to i4) to i64))<nsw> U: [-15,1) S: [-15,1)
+; CHECK-NEXT:    %i4 = getelementptr i8, ptr %obj, i64 %i3
+; CHECK-NEXT:    --> ((-1 * (zext i4 (trunc i64 (ptrtoint ptr %obj to i64) to i4) to i64))<nsw> + %obj) U: full-set S: full-set
+; CHECK-NEXT:  Determining loop execution counts for: @pointer_align_down
+;
+  %i = ptrtoint ptr %obj to i64
+  %i2 = and i64 %i, 15
+  %i3 = sub nsw i64 0, %i2
+  %i4 = getelementptr i8, ptr %obj, i64 %i3
+  ret ptr %i4
+}
+
+define ptr @pointer_align_down_
diff erent_donor(ptr %obj_to_align, ptr %obj_donor) {
+; CHECK-LABEL: 'pointer_align_down_
diff erent_donor'
+; CHECK-NEXT:  Classifying expressions for: @pointer_align_down_
diff erent_donor
+; CHECK-NEXT:    %i = ptrtoint ptr %obj_donor to i64
+; CHECK-NEXT:    --> (ptrtoint ptr %obj_donor to i64) U: full-set S: full-set
+; CHECK-NEXT:    %i2 = and i64 %i, 15
+; CHECK-NEXT:    --> (zext i4 (trunc i64 (ptrtoint ptr %obj_donor to i64) to i4) to i64) U: [0,16) S: [0,16)
+; CHECK-NEXT:    %i3 = sub nsw i64 0, %i2
+; CHECK-NEXT:    --> (-1 * (zext i4 (trunc i64 (ptrtoint ptr %obj_donor to i64) to i4) to i64))<nsw> U: [-15,1) S: [-15,1)
+; CHECK-NEXT:    %i4 = getelementptr i8, ptr %obj_to_align, i64 %i3
+; CHECK-NEXT:    --> ((-1 * (zext i4 (trunc i64 (ptrtoint ptr %obj_donor to i64) to i4) to i64))<nsw> + %obj_to_align) U: full-set S: full-set
+; CHECK-NEXT:  Determining loop execution counts for: @pointer_align_down_
diff erent_donor
+;
+  %i = ptrtoint ptr %obj_donor to i64
+  %i2 = and i64 %i, 15
+  %i3 = sub nsw i64 0, %i2
+  %i4 = getelementptr i8, ptr %obj_to_align, i64 %i3
+  ret ptr %i4
+}
+
+define ptr @pointer_align_up(ptr noundef %obj) {
+; CHECK-LABEL: 'pointer_align_up'
+; CHECK-NEXT:  Classifying expressions for: @pointer_align_up
+; CHECK-NEXT:    %intptr = ptrtoint ptr %obj to i64
+; CHECK-NEXT:    --> (ptrtoint ptr %obj to i64) U: full-set S: full-set
+; CHECK-NEXT:    %over_boundary = add i64 %intptr, 15
+; CHECK-NEXT:    --> (15 + (ptrtoint ptr %obj to i64)) U: full-set S: full-set
+; CHECK-NEXT:    %aligned_intptr = and i64 %over_boundary, -16
+; CHECK-NEXT:    --> (16 * ((15 + (ptrtoint ptr %obj to i64)) /u 16))<nuw> U: [0,-15) S: [-9223372036854775808,9223372036854775793)
+; CHECK-NEXT:    %
diff  = sub i64 %aligned_intptr, %intptr
+; CHECK-NEXT:    --> ((16 * ((15 + (ptrtoint ptr %obj to i64)) /u 16))<nuw> + (-1 * (ptrtoint ptr %obj to i64))) U: full-set S: full-set
+; CHECK-NEXT:    %aligned_result = getelementptr i8, ptr %obj, i64 %
diff 
+; CHECK-NEXT:    --> ((16 * ((15 + (ptrtoint ptr %obj to i64)) /u 16))<nuw> + (-1 * (ptrtoint ptr %obj to i64)) + %obj) U: full-set S: full-set
+; CHECK-NEXT:  Determining loop execution counts for: @pointer_align_up
+;
+  %intptr = ptrtoint ptr %obj to i64
+  %over_boundary = add i64 %intptr, 15
+  %aligned_intptr = and i64 %over_boundary, -16
+  %
diff  = sub i64 %aligned_intptr, %intptr
+  %aligned_result = getelementptr i8, ptr %obj, i64 %
diff 
+  ret ptr %aligned_result
+}
+
+define ptr @pointer_align_up_
diff erent_donor(ptr noundef %obj_to_align, ptr %obj_donor) {
+; CHECK-LABEL: 'pointer_align_up_
diff erent_donor'
+; CHECK-NEXT:  Classifying expressions for: @pointer_align_up_
diff erent_donor
+; CHECK-NEXT:    %intptr = ptrtoint ptr %obj_donor to i64
+; CHECK-NEXT:    --> (ptrtoint ptr %obj_donor to i64) U: full-set S: full-set
+; CHECK-NEXT:    %over_boundary = add i64 %intptr, 15
+; CHECK-NEXT:    --> (15 + (ptrtoint ptr %obj_donor to i64)) U: full-set S: full-set
+; CHECK-NEXT:    %aligned_intptr = and i64 %over_boundary, -16
+; CHECK-NEXT:    --> (16 * ((15 + (ptrtoint ptr %obj_donor to i64)) /u 16))<nuw> U: [0,-15) S: [-9223372036854775808,9223372036854775793)
+; CHECK-NEXT:    %
diff  = sub i64 %aligned_intptr, %intptr
+; CHECK-NEXT:    --> ((16 * ((15 + (ptrtoint ptr %obj_donor to i64)) /u 16))<nuw> + (-1 * (ptrtoint ptr %obj_donor to i64))) U: full-set S: full-set
+; CHECK-NEXT:    %aligned_result = getelementptr i8, ptr %obj_to_align, i64 %
diff 
+; CHECK-NEXT:    --> ((16 * ((15 + (ptrtoint ptr %obj_donor to i64)) /u 16))<nuw> + (-1 * (ptrtoint ptr %obj_donor to i64)) + %obj_to_align) U: full-set S: full-set
+; CHECK-NEXT:  Determining loop execution counts for: @pointer_align_up_
diff erent_donor
+;
+  %intptr = ptrtoint ptr %obj_donor to i64
+  %over_boundary = add i64 %intptr, 15
+  %aligned_intptr = and i64 %over_boundary, -16
+  %
diff  = sub i64 %aligned_intptr, %intptr
+  %aligned_result = getelementptr i8, ptr %obj_to_align, i64 %
diff 
+  ret ptr %aligned_result
+}
+
+define ptr @pointer_align_up_with_select(ptr %obj) {
+; CHECK-LABEL: 'pointer_align_up_with_select'
+; CHECK-NEXT:  Classifying expressions for: @pointer_align_up_with_select
+; CHECK-NEXT:    %i = ptrtoint ptr %obj to i64
+; CHECK-NEXT:    --> (ptrtoint ptr %obj to i64) U: full-set S: full-set
+; CHECK-NEXT:    %i2 = and i64 %i, 15
+; CHECK-NEXT:    --> (zext i4 (trunc i64 (ptrtoint ptr %obj to i64) to i4) to i64) U: [0,16) S: [0,16)
+; CHECK-NEXT:    %i4 = sub nsw i64 0, %i2
+; CHECK-NEXT:    --> (-1 * (zext i4 (trunc i64 (ptrtoint ptr %obj to i64) to i4) to i64))<nsw> U: [-15,1) S: [-15,1)
+; CHECK-NEXT:    %i5 = getelementptr i8, ptr %obj, i64 %i4
+; CHECK-NEXT:    --> ((-1 * (zext i4 (trunc i64 (ptrtoint ptr %obj to i64) to i4) to i64))<nsw> + %obj) U: full-set S: full-set
+; CHECK-NEXT:    %i6 = getelementptr i8, ptr %i5, i64 16
+; CHECK-NEXT:    --> (16 + (-1 * (zext i4 (trunc i64 (ptrtoint ptr %obj to i64) to i4) to i64))<nsw> + %obj) U: full-set S: full-set
+; CHECK-NEXT:    %i7 = select i1 %i3, ptr %obj, ptr %i6
+; CHECK-NEXT:    --> %i7 U: full-set S: full-set
+; CHECK-NEXT:  Determining loop execution counts for: @pointer_align_up_with_select
+;
+  %i = ptrtoint ptr %obj to i64
+  %i2 = and i64 %i, 15
+  %i3 = icmp eq i64 %i2, 0
+  %i4 = sub nsw i64 0, %i2
+  %i5 = getelementptr i8, ptr %obj, i64 %i4
+  %i6 = getelementptr i8, ptr %i5, i64 16
+  %i7 = select i1 %i3, ptr %obj, ptr %i6
+  ret ptr %i7
+}
+
+define ptr @pointer_align_up_with_select_
diff erent_donor(ptr %obj_to_align, ptr %obj_donor) {
+; CHECK-LABEL: 'pointer_align_up_with_select_
diff erent_donor'
+; CHECK-NEXT:  Classifying expressions for: @pointer_align_up_with_select_
diff erent_donor
+; CHECK-NEXT:    %i = ptrtoint ptr %obj_donor to i64
+; CHECK-NEXT:    --> (ptrtoint ptr %obj_donor to i64) U: full-set S: full-set
+; CHECK-NEXT:    %i2 = and i64 %i, 15
+; CHECK-NEXT:    --> (zext i4 (trunc i64 (ptrtoint ptr %obj_donor to i64) to i4) to i64) U: [0,16) S: [0,16)
+; CHECK-NEXT:    %i4 = sub nsw i64 0, %i2
+; CHECK-NEXT:    --> (-1 * (zext i4 (trunc i64 (ptrtoint ptr %obj_donor to i64) to i4) to i64))<nsw> U: [-15,1) S: [-15,1)
+; CHECK-NEXT:    %i5 = getelementptr i8, ptr %obj_to_align, i64 %i4
+; CHECK-NEXT:    --> ((-1 * (zext i4 (trunc i64 (ptrtoint ptr %obj_donor to i64) to i4) to i64))<nsw> + %obj_to_align) U: full-set S: full-set
+; CHECK-NEXT:    %i6 = getelementptr i8, ptr %i5, i64 16
+; CHECK-NEXT:    --> (16 + (-1 * (zext i4 (trunc i64 (ptrtoint ptr %obj_donor to i64) to i4) to i64))<nsw> + %obj_to_align) U: full-set S: full-set
+; CHECK-NEXT:    %i7 = select i1 %i3, ptr %obj_to_align, ptr %i6
+; CHECK-NEXT:    --> %i7 U: full-set S: full-set
+; CHECK-NEXT:  Determining loop execution counts for: @pointer_align_up_with_select_
diff erent_donor
+;
+  %i = ptrtoint ptr %obj_donor to i64
+  %i2 = and i64 %i, 15
+  %i3 = icmp eq i64 %i2, 0
+  %i4 = sub nsw i64 0, %i2
+  %i5 = getelementptr i8, ptr %obj_to_align, i64 %i4
+  %i6 = getelementptr i8, ptr %i5, i64 16
+  %i7 = select i1 %i3, ptr %obj_to_align, ptr %i6
+  ret ptr %i7
+}
+
+define ptr @pointer_align_up_with_select_
diff erent_objects_bad(ptr %first_obj, ptr %second_obj, ptr %obj_donor) {
+; CHECK-LABEL: 'pointer_align_up_with_select_
diff erent_objects_bad'
+; CHECK-NEXT:  Classifying expressions for: @pointer_align_up_with_select_
diff erent_objects_bad
+; CHECK-NEXT:    %i = ptrtoint ptr %obj_donor to i64
+; CHECK-NEXT:    --> (ptrtoint ptr %obj_donor to i64) U: full-set S: full-set
+; CHECK-NEXT:    %i2 = and i64 %i, 15
+; CHECK-NEXT:    --> (zext i4 (trunc i64 (ptrtoint ptr %obj_donor to i64) to i4) to i64) U: [0,16) S: [0,16)
+; CHECK-NEXT:    %i4 = sub nsw i64 0, %i2
+; CHECK-NEXT:    --> (-1 * (zext i4 (trunc i64 (ptrtoint ptr %obj_donor to i64) to i4) to i64))<nsw> U: [-15,1) S: [-15,1)
+; CHECK-NEXT:    %i5 = getelementptr i8, ptr %second_obj, i64 %i4
+; CHECK-NEXT:    --> ((-1 * (zext i4 (trunc i64 (ptrtoint ptr %obj_donor to i64) to i4) to i64))<nsw> + %second_obj) U: full-set S: full-set
+; CHECK-NEXT:    %i6 = getelementptr i8, ptr %i5, i64 16
+; CHECK-NEXT:    --> (16 + (-1 * (zext i4 (trunc i64 (ptrtoint ptr %obj_donor to i64) to i4) to i64))<nsw> + %second_obj) U: full-set S: full-set
+; CHECK-NEXT:    %i7 = select i1 %i3, ptr %first_obj, ptr %i6
+; CHECK-NEXT:    --> %i7 U: full-set S: full-set
+; CHECK-NEXT:  Determining loop execution counts for: @pointer_align_up_with_select_
diff erent_objects_bad
+;
+  %i = ptrtoint ptr %obj_donor to i64
+  %i2 = and i64 %i, 15
+  %i3 = icmp eq i64 %i2, 0
+  %i4 = sub nsw i64 0, %i2
+  %i5 = getelementptr i8, ptr %second_obj, i64 %i4
+  %i6 = getelementptr i8, ptr %i5, i64 16
+  %i7 = select i1 %i3, ptr %first_obj, ptr %i6
+  ret ptr %i7
+}

diff  --git a/llvm/test/Analysis/ScalarEvolution/pointer-select.ll b/llvm/test/Analysis/ScalarEvolution/pointer-select.ll
new file mode 100644
index 000000000000..d09b06bf0cc3
--- /dev/null
+++ b/llvm/test/Analysis/ScalarEvolution/pointer-select.ll
@@ -0,0 +1,247 @@
+; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py
+; RUN: opt -disable-output "-passes=print<scalar-evolution>" < %s 2>&1 | FileCheck %s
+
+define ptr @pointer_select_two_objects(i1 %cond, ptr %first_obj, ptr %second_obj) {
+; CHECK-LABEL: 'pointer_select_two_objects'
+; CHECK-NEXT:  Classifying expressions for: @pointer_select_two_objects
+; CHECK-NEXT:    %r = select i1 %cond, ptr %first_obj, ptr %second_obj
+; CHECK-NEXT:    --> %r U: full-set S: full-set
+; CHECK-NEXT:  Determining loop execution counts for: @pointer_select_two_objects
+;
+  %r = select i1 %cond, ptr %first_obj, ptr %second_obj
+  ret ptr %r
+}
+
+;--
+
+define ptr @pointer_select_same_object_constant_offsets(i1 %cond, ptr %obj) {
+; CHECK-LABEL: 'pointer_select_same_object_constant_offsets'
+; CHECK-NEXT:  Classifying expressions for: @pointer_select_same_object_constant_offsets
+; CHECK-NEXT:    %true_ptr = getelementptr i8, ptr %obj, i64 42
+; CHECK-NEXT:    --> (42 + %obj) U: full-set S: full-set
+; CHECK-NEXT:    %false_ptr = getelementptr i8, ptr %obj, i64 24
+; CHECK-NEXT:    --> (24 + %obj) U: full-set S: full-set
+; CHECK-NEXT:    %r = select i1 %cond, ptr %true_ptr, ptr %false_ptr
+; CHECK-NEXT:    --> %r U: full-set S: full-set
+; CHECK-NEXT:  Determining loop execution counts for: @pointer_select_same_object_constant_offsets
+;
+  %true_ptr = getelementptr i8, ptr %obj, i64 42
+  %false_ptr = getelementptr i8, ptr %obj, i64 24
+  %r = select i1 %cond, ptr %true_ptr, ptr %false_ptr
+  ret ptr %r
+}
+
+define ptr @pointer_select_same_object_variable_offsets(i1 %cond, ptr %obj, i64 %true_off, i64 %false_off) {
+; CHECK-LABEL: 'pointer_select_same_object_variable_offsets'
+; CHECK-NEXT:  Classifying expressions for: @pointer_select_same_object_variable_offsets
+; CHECK-NEXT:    %true_ptr = getelementptr i8, ptr %obj, i64 %true_off
+; CHECK-NEXT:    --> (%true_off + %obj) U: full-set S: full-set
+; CHECK-NEXT:    %false_ptr = getelementptr i8, ptr %obj, i64 %false_off
+; CHECK-NEXT:    --> (%false_off + %obj) U: full-set S: full-set
+; CHECK-NEXT:    %r = select i1 %cond, ptr %true_ptr, ptr %false_ptr
+; CHECK-NEXT:    --> %r U: full-set S: full-set
+; CHECK-NEXT:  Determining loop execution counts for: @pointer_select_same_object_variable_offsets
+;
+  %true_ptr = getelementptr i8, ptr %obj, i64 %true_off
+  %false_ptr = getelementptr i8, ptr %obj, i64 %false_off
+  %r = select i1 %cond, ptr %true_ptr, ptr %false_ptr
+  ret ptr %r
+}
+
+define ptr @pointer_select_same_object_constant_offset_vs_variable_offset(i1 %cond, ptr %obj, i64 %false_off) {
+; CHECK-LABEL: 'pointer_select_same_object_constant_offset_vs_variable_offset'
+; CHECK-NEXT:  Classifying expressions for: @pointer_select_same_object_constant_offset_vs_variable_offset
+; CHECK-NEXT:    %true_ptr = getelementptr i8, ptr %obj, i64 42
+; CHECK-NEXT:    --> (42 + %obj) U: full-set S: full-set
+; CHECK-NEXT:    %false_ptr = getelementptr i8, ptr %obj, i64 %false_off
+; CHECK-NEXT:    --> (%false_off + %obj) U: full-set S: full-set
+; CHECK-NEXT:    %r = select i1 %cond, ptr %true_ptr, ptr %false_ptr
+; CHECK-NEXT:    --> %r U: full-set S: full-set
+; CHECK-NEXT:  Determining loop execution counts for: @pointer_select_same_object_constant_offset_vs_variable_offset
+;
+  %true_ptr = getelementptr i8, ptr %obj, i64 42
+  %false_ptr = getelementptr i8, ptr %obj, i64 %false_off
+  %r = select i1 %cond, ptr %true_ptr, ptr %false_ptr
+  ret ptr %r
+}
+
+define ptr @pointer_select_same_object_variable_offset_vs_constant_offset(i1 %cond, ptr %obj, i64 %true_off) {
+; CHECK-LABEL: 'pointer_select_same_object_variable_offset_vs_constant_offset'
+; CHECK-NEXT:  Classifying expressions for: @pointer_select_same_object_variable_offset_vs_constant_offset
+; CHECK-NEXT:    %true_ptr = getelementptr i8, ptr %obj, i64 %true_off
+; CHECK-NEXT:    --> (%true_off + %obj) U: full-set S: full-set
+; CHECK-NEXT:    %false_ptr = getelementptr i8, ptr %obj, i64 42
+; CHECK-NEXT:    --> (42 + %obj) U: full-set S: full-set
+; CHECK-NEXT:    %r = select i1 %cond, ptr %true_ptr, ptr %false_ptr
+; CHECK-NEXT:    --> %r U: full-set S: full-set
+; CHECK-NEXT:  Determining loop execution counts for: @pointer_select_same_object_variable_offset_vs_constant_offset
+;
+  %true_ptr = getelementptr i8, ptr %obj, i64 %true_off
+  %false_ptr = getelementptr i8, ptr %obj, i64 42
+  %r = select i1 %cond, ptr %true_ptr, ptr %false_ptr
+  ret ptr %r
+}
+
+;--
+
+define ptr @pointer_select_same_object_with_constant_base_offset__constant_offsets(i1 %cond, ptr %obj.base) {
+; CHECK-LABEL: 'pointer_select_same_object_with_constant_base_offset__constant_offsets'
+; CHECK-NEXT:  Classifying expressions for: @pointer_select_same_object_with_constant_base_offset__constant_offsets
+; CHECK-NEXT:    %obj = getelementptr i8, ptr %obj.base, i64 12
+; CHECK-NEXT:    --> (12 + %obj.base) U: full-set S: full-set
+; CHECK-NEXT:    %true_ptr = getelementptr i8, ptr %obj, i64 42
+; CHECK-NEXT:    --> (54 + %obj.base) U: full-set S: full-set
+; CHECK-NEXT:    %false_ptr = getelementptr i8, ptr %obj, i64 24
+; CHECK-NEXT:    --> (36 + %obj.base) U: full-set S: full-set
+; CHECK-NEXT:    %r = select i1 %cond, ptr %true_ptr, ptr %false_ptr
+; CHECK-NEXT:    --> %r U: full-set S: full-set
+; CHECK-NEXT:  Determining loop execution counts for: @pointer_select_same_object_with_constant_base_offset__constant_offsets
+;
+  %obj = getelementptr i8, ptr %obj.base, i64 12
+  %true_ptr = getelementptr i8, ptr %obj, i64 42
+  %false_ptr = getelementptr i8, ptr %obj, i64 24
+  %r = select i1 %cond, ptr %true_ptr, ptr %false_ptr
+  ret ptr %r
+}
+
+define ptr @pointer_select_same_object_with_constant_base_offset__variable_offsets(i1 %cond, ptr %obj.base, i64 %true_off, i64 %false_off) {
+; CHECK-LABEL: 'pointer_select_same_object_with_constant_base_offset__variable_offsets'
+; CHECK-NEXT:  Classifying expressions for: @pointer_select_same_object_with_constant_base_offset__variable_offsets
+; CHECK-NEXT:    %obj = getelementptr i8, ptr %obj.base, i64 12
+; CHECK-NEXT:    --> (12 + %obj.base) U: full-set S: full-set
+; CHECK-NEXT:    %true_ptr = getelementptr i8, ptr %obj, i64 %true_off
+; CHECK-NEXT:    --> (12 + %true_off + %obj.base) U: full-set S: full-set
+; CHECK-NEXT:    %false_ptr = getelementptr i8, ptr %obj, i64 %false_off
+; CHECK-NEXT:    --> (12 + %false_off + %obj.base) U: full-set S: full-set
+; CHECK-NEXT:    %r = select i1 %cond, ptr %true_ptr, ptr %false_ptr
+; CHECK-NEXT:    --> %r U: full-set S: full-set
+; CHECK-NEXT:  Determining loop execution counts for: @pointer_select_same_object_with_constant_base_offset__variable_offsets
+;
+  %obj = getelementptr i8, ptr %obj.base, i64 12
+  %true_ptr = getelementptr i8, ptr %obj, i64 %true_off
+  %false_ptr = getelementptr i8, ptr %obj, i64 %false_off
+  %r = select i1 %cond, ptr %true_ptr, ptr %false_ptr
+  ret ptr %r
+}
+
+define ptr @pointer_select_same_object_with_constant_base_offset__constant_offset_vs_variable_offset(i1 %cond, ptr %obj.base, i64 %false_off) {
+; CHECK-LABEL: 'pointer_select_same_object_with_constant_base_offset__constant_offset_vs_variable_offset'
+; CHECK-NEXT:  Classifying expressions for: @pointer_select_same_object_with_constant_base_offset__constant_offset_vs_variable_offset
+; CHECK-NEXT:    %obj = getelementptr i8, ptr %obj.base, i64 12
+; CHECK-NEXT:    --> (12 + %obj.base) U: full-set S: full-set
+; CHECK-NEXT:    %true_ptr = getelementptr i8, ptr %obj, i64 42
+; CHECK-NEXT:    --> (54 + %obj.base) U: full-set S: full-set
+; CHECK-NEXT:    %false_ptr = getelementptr i8, ptr %obj, i64 %false_off
+; CHECK-NEXT:    --> (12 + %false_off + %obj.base) U: full-set S: full-set
+; CHECK-NEXT:    %r = select i1 %cond, ptr %true_ptr, ptr %false_ptr
+; CHECK-NEXT:    --> %r U: full-set S: full-set
+; CHECK-NEXT:  Determining loop execution counts for: @pointer_select_same_object_with_constant_base_offset__constant_offset_vs_variable_offset
+;
+  %obj = getelementptr i8, ptr %obj.base, i64 12
+  %true_ptr = getelementptr i8, ptr %obj, i64 42
+  %false_ptr = getelementptr i8, ptr %obj, i64 %false_off
+  %r = select i1 %cond, ptr %true_ptr, ptr %false_ptr
+  ret ptr %r
+}
+
+define ptr @pointer_select_same_object_with_constant_base_offset__variable_offset_vs_constant_offset(i1 %cond, ptr %obj.base, i64 %true_off) {
+; CHECK-LABEL: 'pointer_select_same_object_with_constant_base_offset__variable_offset_vs_constant_offset'
+; CHECK-NEXT:  Classifying expressions for: @pointer_select_same_object_with_constant_base_offset__variable_offset_vs_constant_offset
+; CHECK-NEXT:    %obj = getelementptr i8, ptr %obj.base, i64 12
+; CHECK-NEXT:    --> (12 + %obj.base) U: full-set S: full-set
+; CHECK-NEXT:    %true_ptr = getelementptr i8, ptr %obj, i64 %true_off
+; CHECK-NEXT:    --> (12 + %true_off + %obj.base) U: full-set S: full-set
+; CHECK-NEXT:    %false_ptr = getelementptr i8, ptr %obj, i64 42
+; CHECK-NEXT:    --> (54 + %obj.base) U: full-set S: full-set
+; CHECK-NEXT:    %r = select i1 %cond, ptr %true_ptr, ptr %false_ptr
+; CHECK-NEXT:    --> %r U: full-set S: full-set
+; CHECK-NEXT:  Determining loop execution counts for: @pointer_select_same_object_with_constant_base_offset__variable_offset_vs_constant_offset
+;
+  %obj = getelementptr i8, ptr %obj.base, i64 12
+  %true_ptr = getelementptr i8, ptr %obj, i64 %true_off
+  %false_ptr = getelementptr i8, ptr %obj, i64 42
+  %r = select i1 %cond, ptr %true_ptr, ptr %false_ptr
+  ret ptr %r
+}
+
+;--
+
+define ptr @pointer_select_same_object_with_variable_base_offset__constant_offsets(i1 %cond, ptr %obj.base, i64 %base_offset) {
+; CHECK-LABEL: 'pointer_select_same_object_with_variable_base_offset__constant_offsets'
+; CHECK-NEXT:  Classifying expressions for: @pointer_select_same_object_with_variable_base_offset__constant_offsets
+; CHECK-NEXT:    %obj = getelementptr i8, ptr %obj.base, i64 %base_offset
+; CHECK-NEXT:    --> (%base_offset + %obj.base) U: full-set S: full-set
+; CHECK-NEXT:    %true_ptr = getelementptr i8, ptr %obj, i64 42
+; CHECK-NEXT:    --> (42 + %base_offset + %obj.base) U: full-set S: full-set
+; CHECK-NEXT:    %false_ptr = getelementptr i8, ptr %obj, i64 24
+; CHECK-NEXT:    --> (24 + %base_offset + %obj.base) U: full-set S: full-set
+; CHECK-NEXT:    %r = select i1 %cond, ptr %true_ptr, ptr %false_ptr
+; CHECK-NEXT:    --> %r U: full-set S: full-set
+; CHECK-NEXT:  Determining loop execution counts for: @pointer_select_same_object_with_variable_base_offset__constant_offsets
+;
+  %obj = getelementptr i8, ptr %obj.base, i64 %base_offset
+  %true_ptr = getelementptr i8, ptr %obj, i64 42
+  %false_ptr = getelementptr i8, ptr %obj, i64 24
+  %r = select i1 %cond, ptr %true_ptr, ptr %false_ptr
+  ret ptr %r
+}
+
+define ptr @pointer_select_same_object_with_variable_base_offset__variable_offsets(i1 %cond, ptr %obj.base, i64 %base_offset, i64 %true_off, i64 %false_off) {
+; CHECK-LABEL: 'pointer_select_same_object_with_variable_base_offset__variable_offsets'
+; CHECK-NEXT:  Classifying expressions for: @pointer_select_same_object_with_variable_base_offset__variable_offsets
+; CHECK-NEXT:    %obj = getelementptr i8, ptr %obj.base, i64 %base_offset
+; CHECK-NEXT:    --> (%base_offset + %obj.base) U: full-set S: full-set
+; CHECK-NEXT:    %true_ptr = getelementptr i8, ptr %obj, i64 %true_off
+; CHECK-NEXT:    --> (%base_offset + %true_off + %obj.base) U: full-set S: full-set
+; CHECK-NEXT:    %false_ptr = getelementptr i8, ptr %obj, i64 %false_off
+; CHECK-NEXT:    --> (%base_offset + %false_off + %obj.base) U: full-set S: full-set
+; CHECK-NEXT:    %r = select i1 %cond, ptr %true_ptr, ptr %false_ptr
+; CHECK-NEXT:    --> %r U: full-set S: full-set
+; CHECK-NEXT:  Determining loop execution counts for: @pointer_select_same_object_with_variable_base_offset__variable_offsets
+;
+  %obj = getelementptr i8, ptr %obj.base, i64 %base_offset
+  %true_ptr = getelementptr i8, ptr %obj, i64 %true_off
+  %false_ptr = getelementptr i8, ptr %obj, i64 %false_off
+  %r = select i1 %cond, ptr %true_ptr, ptr %false_ptr
+  ret ptr %r
+}
+
+define ptr @pointer_select_same_object_with_variable_base_offset__constant_offset_vs_variable_offset(i1 %cond, ptr %obj.base, i64 %base_offset, i64 %false_off) {
+; CHECK-LABEL: 'pointer_select_same_object_with_variable_base_offset__constant_offset_vs_variable_offset'
+; CHECK-NEXT:  Classifying expressions for: @pointer_select_same_object_with_variable_base_offset__constant_offset_vs_variable_offset
+; CHECK-NEXT:    %obj = getelementptr i8, ptr %obj.base, i64 %base_offset
+; CHECK-NEXT:    --> (%base_offset + %obj.base) U: full-set S: full-set
+; CHECK-NEXT:    %true_ptr = getelementptr i8, ptr %obj, i64 42
+; CHECK-NEXT:    --> (42 + %base_offset + %obj.base) U: full-set S: full-set
+; CHECK-NEXT:    %false_ptr = getelementptr i8, ptr %obj, i64 %false_off
+; CHECK-NEXT:    --> (%base_offset + %false_off + %obj.base) U: full-set S: full-set
+; CHECK-NEXT:    %r = select i1 %cond, ptr %true_ptr, ptr %false_ptr
+; CHECK-NEXT:    --> %r U: full-set S: full-set
+; CHECK-NEXT:  Determining loop execution counts for: @pointer_select_same_object_with_variable_base_offset__constant_offset_vs_variable_offset
+;
+  %obj = getelementptr i8, ptr %obj.base, i64 %base_offset
+  %true_ptr = getelementptr i8, ptr %obj, i64 42
+  %false_ptr = getelementptr i8, ptr %obj, i64 %false_off
+  %r = select i1 %cond, ptr %true_ptr, ptr %false_ptr
+  ret ptr %r
+}
+
+define ptr @pointer_select_same_object_with_variable_base_offset__variable_offset_vs_constant_offset(i1 %cond, ptr %obj.base, i64 %base_offset, i64 %true_off) {
+; CHECK-LABEL: 'pointer_select_same_object_with_variable_base_offset__variable_offset_vs_constant_offset'
+; CHECK-NEXT:  Classifying expressions for: @pointer_select_same_object_with_variable_base_offset__variable_offset_vs_constant_offset
+; CHECK-NEXT:    %obj = getelementptr i8, ptr %obj.base, i64 %base_offset
+; CHECK-NEXT:    --> (%base_offset + %obj.base) U: full-set S: full-set
+; CHECK-NEXT:    %true_ptr = getelementptr i8, ptr %obj, i64 %true_off
+; CHECK-NEXT:    --> (%base_offset + %true_off + %obj.base) U: full-set S: full-set
+; CHECK-NEXT:    %false_ptr = getelementptr i8, ptr %obj, i64 42
+; CHECK-NEXT:    --> (42 + %base_offset + %obj.base) U: full-set S: full-set
+; CHECK-NEXT:    %r = select i1 %cond, ptr %true_ptr, ptr %false_ptr
+; CHECK-NEXT:    --> %r U: full-set S: full-set
+; CHECK-NEXT:  Determining loop execution counts for: @pointer_select_same_object_with_variable_base_offset__variable_offset_vs_constant_offset
+;
+  %obj = getelementptr i8, ptr %obj.base, i64 %base_offset
+  %true_ptr = getelementptr i8, ptr %obj, i64 %true_off
+  %false_ptr = getelementptr i8, ptr %obj, i64 42
+  %r = select i1 %cond, ptr %true_ptr, ptr %false_ptr
+  ret ptr %r
+}


        


More information about the llvm-commits mailing list