| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6 | |
| ; RUN: opt -S -passes=separate-const-offset-from-gep -verify-each < %s | FileCheck %s --check-prefix=SPLIT | |
| ; RUN: opt -S -passes='separate-const-offset-from-gep<lower-gep>' -verify-each < %s | FileCheck %s --check-prefix=LOWER | |
| target datalayout = "e-p:32:32" | |
| ; An extracted constant that truncates to zero still simplifies the index. | |
| define ptr @trunc_add_zero_offset(ptr %base, i64 %x) { | |
| ; SPLIT-LABEL: define ptr @trunc_add_zero_offset( | |
| ; SPLIT-SAME: ptr [[BASE:%.*]], i64 [[X:%.*]]) { | |
| ; SPLIT-NEXT: [[TMP1:%.*]] = trunc i64 [[X]] to i32 | |
| ; SPLIT-NEXT: [[P:%.*]] = getelementptr i8, ptr [[BASE]], i32 [[TMP1]] | |
| ; SPLIT-NEXT: ret ptr [[P]] | |
| ; | |
| ; LOWER-LABEL: define ptr @trunc_add_zero_offset( | |
| ; LOWER-SAME: ptr [[BASE:%.*]], i64 [[X:%.*]]) { | |
| ; LOWER-NEXT: [[TMP1:%.*]] = trunc i64 [[X]] to i32 | |
| ; LOWER-NEXT: [[UGLYGEP:%.*]] = getelementptr i8, ptr [[BASE]], i32 [[TMP1]] | |
| ; LOWER-NEXT: ret ptr [[UGLYGEP]] | |
| ; | |
| %add = add i64 %x, 4294967296 | |
| %index = trunc i64 %add to i32 | |
| %p = getelementptr i8, ptr %base, i32 %index | |
| ret ptr %p | |
| } | |
| ; Keep a successful extraction from the RHS even when its offset is zero. | |
| define ptr @sub_trunc_add_zero_offset(ptr %base, i64 %x, i32 %y) { | |
| ; SPLIT-LABEL: define ptr @sub_trunc_add_zero_offset( | |
| ; SPLIT-SAME: ptr [[BASE:%.*]], i64 [[X:%.*]], i32 [[Y:%.*]]) { | |
| ; SPLIT-NEXT: [[TMP1:%.*]] = trunc i64 [[X]] to i32 | |
| ; SPLIT-NEXT: [[INDEX2:%.*]] = sub i32 [[Y]], [[TMP1]] | |
| ; SPLIT-NEXT: [[P:%.*]] = getelementptr i8, ptr [[BASE]], i32 [[INDEX2]] | |
| ; SPLIT-NEXT: ret ptr [[P]] | |
| ; | |
| ; LOWER-LABEL: define ptr @sub_trunc_add_zero_offset( | |
| ; LOWER-SAME: ptr [[BASE:%.*]], i64 [[X:%.*]], i32 [[Y:%.*]]) { | |
| ; LOWER-NEXT: [[TMP1:%.*]] = trunc i64 [[X]] to i32 | |
| ; LOWER-NEXT: [[INDEX2:%.*]] = sub i32 [[Y]], [[TMP1]] | |
| ; LOWER-NEXT: [[UGLYGEP:%.*]] = getelementptr i8, ptr [[BASE]], i32 [[INDEX2]] | |
| ; LOWER-NEXT: ret ptr [[UGLYGEP]] | |
| ; | |
| %add = add i64 %x, 4294967296 | |
| %trunc = trunc i64 %add to i32 | |
| %index = sub i32 %y, %trunc | |
| %p = getelementptr i8, ptr %base, i32 %index | |
| ret ptr %p | |
| } | |
| ; Zero offset extraction also works for an inbounds GEP. | |
| define ptr @sub_trunc_add_zero_offset_inbounds(ptr %base, i64 %x, i32 %y) { | |
| ; SPLIT-LABEL: define ptr @sub_trunc_add_zero_offset_inbounds( | |
| ; SPLIT-SAME: ptr [[BASE:%.*]], i64 [[X:%.*]], i32 [[Y:%.*]]) { | |
| ; SPLIT-NEXT: [[TMP1:%.*]] = trunc i64 [[X]] to i32 | |
| ; SPLIT-NEXT: [[INDEX2:%.*]] = sub i32 [[Y]], [[TMP1]] | |
| ; SPLIT-NEXT: [[P:%.*]] = getelementptr i8, ptr [[BASE]], i32 [[INDEX2]] | |
| ; SPLIT-NEXT: ret ptr [[P]] | |
| ; | |
| ; LOWER-LABEL: define ptr @sub_trunc_add_zero_offset_inbounds( | |
| ; LOWER-SAME: ptr [[BASE:%.*]], i64 [[X:%.*]], i32 [[Y:%.*]]) { | |
| ; LOWER-NEXT: [[TMP1:%.*]] = trunc i64 [[X]] to i32 | |
| ; LOWER-NEXT: [[INDEX2:%.*]] = sub i32 [[Y]], [[TMP1]] | |
| ; LOWER-NEXT: [[UGLYGEP:%.*]] = getelementptr i8, ptr [[BASE]], i32 [[INDEX2]] | |
| ; LOWER-NEXT: ret ptr [[UGLYGEP]] | |
| ; | |
| %add = add i64 %x, 4294967296 | |
| %trunc = trunc i64 %add to i32 | |
| %index = sub i32 %y, %trunc | |
| %p = getelementptr inbounds i8, ptr %base, i32 %index | |
| ret ptr %p | |
| } |