170 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py2; RUN: opt -disable-output "-passes=print<scalar-evolution>" < %s 2>&1 | FileCheck %s3 4define ptr @pointer_align_down(ptr %obj) {5; CHECK-LABEL: 'pointer_align_down'6; CHECK-NEXT: Classifying expressions for: @pointer_align_down7; CHECK-NEXT: %i = ptrtoint ptr %obj to i648; CHECK-NEXT: --> (ptrtoint ptr %obj to i64) U: full-set S: full-set9; CHECK-NEXT: %i2 = and i64 %i, 1510; CHECK-NEXT: --> (zext i4 (trunc i64 (ptrtoint ptr %obj to i64) to i4) to i64) U: [0,16) S: [0,16)11; CHECK-NEXT: %i3 = sub nsw i64 0, %i212; CHECK-NEXT: --> (-1 * (zext i4 (trunc i64 (ptrtoint ptr %obj to i64) to i4) to i64))<nsw> U: [-15,1) S: [-15,1)13; CHECK-NEXT: %i4 = getelementptr i8, ptr %obj, i64 %i314; CHECK-NEXT: --> ((-1 * (zext i4 (trunc i64 (ptrtoint ptr %obj to i64) to i4) to i64))<nsw> + %obj) U: full-set S: full-set15; CHECK-NEXT: Determining loop execution counts for: @pointer_align_down16;17 %i = ptrtoint ptr %obj to i6418 %i2 = and i64 %i, 1519 %i3 = sub nsw i64 0, %i220 %i4 = getelementptr i8, ptr %obj, i64 %i321 ret ptr %i422}23 24define ptr @pointer_align_down_different_donor(ptr %obj_to_align, ptr %obj_donor) {25; CHECK-LABEL: 'pointer_align_down_different_donor'26; CHECK-NEXT: Classifying expressions for: @pointer_align_down_different_donor27; CHECK-NEXT: %i = ptrtoint ptr %obj_donor to i6428; CHECK-NEXT: --> (ptrtoint ptr %obj_donor to i64) U: full-set S: full-set29; CHECK-NEXT: %i2 = and i64 %i, 1530; CHECK-NEXT: --> (zext i4 (trunc i64 (ptrtoint ptr %obj_donor to i64) to i4) to i64) U: [0,16) S: [0,16)31; CHECK-NEXT: %i3 = sub nsw i64 0, %i232; CHECK-NEXT: --> (-1 * (zext i4 (trunc i64 (ptrtoint ptr %obj_donor to i64) to i4) to i64))<nsw> U: [-15,1) S: [-15,1)33; CHECK-NEXT: %i4 = getelementptr i8, ptr %obj_to_align, i64 %i334; 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-set35; CHECK-NEXT: Determining loop execution counts for: @pointer_align_down_different_donor36;37 %i = ptrtoint ptr %obj_donor to i6438 %i2 = and i64 %i, 1539 %i3 = sub nsw i64 0, %i240 %i4 = getelementptr i8, ptr %obj_to_align, i64 %i341 ret ptr %i442}43 44define ptr @pointer_align_up(ptr noundef %obj) {45; CHECK-LABEL: 'pointer_align_up'46; CHECK-NEXT: Classifying expressions for: @pointer_align_up47; CHECK-NEXT: %intptr = ptrtoint ptr %obj to i6448; CHECK-NEXT: --> (ptrtoint ptr %obj to i64) U: full-set S: full-set49; CHECK-NEXT: %over_boundary = add i64 %intptr, 1550; CHECK-NEXT: --> (15 + (ptrtoint ptr %obj to i64)) U: full-set S: full-set51; CHECK-NEXT: %aligned_intptr = and i64 %over_boundary, -1652; CHECK-NEXT: --> (16 * ((15 + (ptrtoint ptr %obj to i64)) /u 16))<nuw> U: [0,-15) S: [-9223372036854775808,9223372036854775793)53; CHECK-NEXT: %diff = sub i64 %aligned_intptr, %intptr54; CHECK-NEXT: --> ((16 * ((15 + (ptrtoint ptr %obj to i64)) /u 16))<nuw> + (-1 * (ptrtoint ptr %obj to i64))) U: full-set S: full-set55; CHECK-NEXT: %aligned_result = getelementptr i8, ptr %obj, i64 %diff56; CHECK-NEXT: --> ((16 * ((15 + (ptrtoint ptr %obj to i64)) /u 16))<nuw> + (-1 * (ptrtoint ptr %obj to i64)) + %obj) U: full-set S: full-set57; CHECK-NEXT: Determining loop execution counts for: @pointer_align_up58;59 %intptr = ptrtoint ptr %obj to i6460 %over_boundary = add i64 %intptr, 1561 %aligned_intptr = and i64 %over_boundary, -1662 %diff = sub i64 %aligned_intptr, %intptr63 %aligned_result = getelementptr i8, ptr %obj, i64 %diff64 ret ptr %aligned_result65}66 67define ptr @pointer_align_up_different_donor(ptr noundef %obj_to_align, ptr %obj_donor) {68; CHECK-LABEL: 'pointer_align_up_different_donor'69; CHECK-NEXT: Classifying expressions for: @pointer_align_up_different_donor70; CHECK-NEXT: %intptr = ptrtoint ptr %obj_donor to i6471; CHECK-NEXT: --> (ptrtoint ptr %obj_donor to i64) U: full-set S: full-set72; CHECK-NEXT: %over_boundary = add i64 %intptr, 1573; CHECK-NEXT: --> (15 + (ptrtoint ptr %obj_donor to i64)) U: full-set S: full-set74; CHECK-NEXT: %aligned_intptr = and i64 %over_boundary, -1675; CHECK-NEXT: --> (16 * ((15 + (ptrtoint ptr %obj_donor to i64)) /u 16))<nuw> U: [0,-15) S: [-9223372036854775808,9223372036854775793)76; CHECK-NEXT: %diff = sub i64 %aligned_intptr, %intptr77; 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-set78; CHECK-NEXT: %aligned_result = getelementptr i8, ptr %obj_to_align, i64 %diff79; 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-set80; CHECK-NEXT: Determining loop execution counts for: @pointer_align_up_different_donor81;82 %intptr = ptrtoint ptr %obj_donor to i6483 %over_boundary = add i64 %intptr, 1584 %aligned_intptr = and i64 %over_boundary, -1685 %diff = sub i64 %aligned_intptr, %intptr86 %aligned_result = getelementptr i8, ptr %obj_to_align, i64 %diff87 ret ptr %aligned_result88}89 90define ptr @pointer_align_up_with_select(ptr %obj) {91; CHECK-LABEL: 'pointer_align_up_with_select'92; CHECK-NEXT: Classifying expressions for: @pointer_align_up_with_select93; CHECK-NEXT: %i = ptrtoint ptr %obj to i6494; CHECK-NEXT: --> (ptrtoint ptr %obj to i64) U: full-set S: full-set95; CHECK-NEXT: %i2 = and i64 %i, 1596; CHECK-NEXT: --> (zext i4 (trunc i64 (ptrtoint ptr %obj to i64) to i4) to i64) U: [0,16) S: [0,16)97; CHECK-NEXT: %i4 = sub nsw i64 0, %i298; CHECK-NEXT: --> (-1 * (zext i4 (trunc i64 (ptrtoint ptr %obj to i64) to i4) to i64))<nsw> U: [-15,1) S: [-15,1)99; CHECK-NEXT: %i5 = getelementptr i8, ptr %obj, i64 %i4100; CHECK-NEXT: --> ((-1 * (zext i4 (trunc i64 (ptrtoint ptr %obj to i64) to i4) to i64))<nsw> + %obj) U: full-set S: full-set101; CHECK-NEXT: %i6 = getelementptr i8, ptr %i5, i64 16102; CHECK-NEXT: --> (16 + (-1 * (zext i4 (trunc i64 (ptrtoint ptr %obj to i64) to i4) to i64))<nsw> + %obj) U: full-set S: full-set103; CHECK-NEXT: %i7 = select i1 %i3, ptr %obj, ptr %i6104; CHECK-NEXT: --> %i7 U: full-set S: full-set105; CHECK-NEXT: Determining loop execution counts for: @pointer_align_up_with_select106;107 %i = ptrtoint ptr %obj to i64108 %i2 = and i64 %i, 15109 %i3 = icmp eq i64 %i2, 0110 %i4 = sub nsw i64 0, %i2111 %i5 = getelementptr i8, ptr %obj, i64 %i4112 %i6 = getelementptr i8, ptr %i5, i64 16113 %i7 = select i1 %i3, ptr %obj, ptr %i6114 ret ptr %i7115}116 117define ptr @pointer_align_up_with_select_different_donor(ptr %obj_to_align, ptr %obj_donor) {118; CHECK-LABEL: 'pointer_align_up_with_select_different_donor'119; CHECK-NEXT: Classifying expressions for: @pointer_align_up_with_select_different_donor120; CHECK-NEXT: %i = ptrtoint ptr %obj_donor to i64121; CHECK-NEXT: --> (ptrtoint ptr %obj_donor to i64) U: full-set S: full-set122; CHECK-NEXT: %i2 = and i64 %i, 15123; CHECK-NEXT: --> (zext i4 (trunc i64 (ptrtoint ptr %obj_donor to i64) to i4) to i64) U: [0,16) S: [0,16)124; CHECK-NEXT: %i4 = sub nsw i64 0, %i2125; CHECK-NEXT: --> (-1 * (zext i4 (trunc i64 (ptrtoint ptr %obj_donor to i64) to i4) to i64))<nsw> U: [-15,1) S: [-15,1)126; CHECK-NEXT: %i5 = getelementptr i8, ptr %obj_to_align, i64 %i4127; 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-set128; CHECK-NEXT: %i6 = getelementptr i8, ptr %i5, i64 16129; 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-set130; CHECK-NEXT: %i7 = select i1 %i3, ptr %obj_to_align, ptr %i6131; CHECK-NEXT: --> %i7 U: full-set S: full-set132; CHECK-NEXT: Determining loop execution counts for: @pointer_align_up_with_select_different_donor133;134 %i = ptrtoint ptr %obj_donor to i64135 %i2 = and i64 %i, 15136 %i3 = icmp eq i64 %i2, 0137 %i4 = sub nsw i64 0, %i2138 %i5 = getelementptr i8, ptr %obj_to_align, i64 %i4139 %i6 = getelementptr i8, ptr %i5, i64 16140 %i7 = select i1 %i3, ptr %obj_to_align, ptr %i6141 ret ptr %i7142}143 144define ptr @pointer_align_up_with_select_different_objects_bad(ptr %first_obj, ptr %second_obj, ptr %obj_donor) {145; CHECK-LABEL: 'pointer_align_up_with_select_different_objects_bad'146; CHECK-NEXT: Classifying expressions for: @pointer_align_up_with_select_different_objects_bad147; CHECK-NEXT: %i = ptrtoint ptr %obj_donor to i64148; CHECK-NEXT: --> (ptrtoint ptr %obj_donor to i64) U: full-set S: full-set149; CHECK-NEXT: %i2 = and i64 %i, 15150; CHECK-NEXT: --> (zext i4 (trunc i64 (ptrtoint ptr %obj_donor to i64) to i4) to i64) U: [0,16) S: [0,16)151; CHECK-NEXT: %i4 = sub nsw i64 0, %i2152; CHECK-NEXT: --> (-1 * (zext i4 (trunc i64 (ptrtoint ptr %obj_donor to i64) to i4) to i64))<nsw> U: [-15,1) S: [-15,1)153; CHECK-NEXT: %i5 = getelementptr i8, ptr %second_obj, i64 %i4154; 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-set155; CHECK-NEXT: %i6 = getelementptr i8, ptr %i5, i64 16156; 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-set157; CHECK-NEXT: %i7 = select i1 %i3, ptr %first_obj, ptr %i6158; CHECK-NEXT: --> %i7 U: full-set S: full-set159; CHECK-NEXT: Determining loop execution counts for: @pointer_align_up_with_select_different_objects_bad160;161 %i = ptrtoint ptr %obj_donor to i64162 %i2 = and i64 %i, 15163 %i3 = icmp eq i64 %i2, 0164 %i4 = sub nsw i64 0, %i2165 %i5 = getelementptr i8, ptr %second_obj, i64 %i4166 %i6 = getelementptr i8, ptr %i5, i64 16167 %i7 = select i1 %i3, ptr %first_obj, ptr %i6168 ret ptr %i7169}170