309 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 32; RUN: opt -mtriple=amdgcn-amd-amdhsa -mcpu=gfx90a -S -passes=separate-const-offset-from-gep < %s | FileCheck %s3 4define void @inboundsPossiblyNegative(ptr %in.ptr, i64 %in.idx1) {5; CHECK-LABEL: define void @inboundsPossiblyNegative(6; CHECK-SAME: ptr [[IN_PTR:%.*]], i64 [[IN_IDX1:%.*]]) #[[ATTR0:[0-9]+]] {7; CHECK-NEXT: entry:8; CHECK-NEXT: [[TMP0:%.*]] = getelementptr <2 x i8>, ptr [[IN_PTR]], i64 [[IN_IDX1]]9; CHECK-NEXT: [[TMP1:%.*]] = getelementptr <2 x i8>, ptr [[TMP0]], i64 110; CHECK-NEXT: ret void11;12entry:13 %const1 = getelementptr inbounds <2 x i8>, ptr %in.ptr, i64 114 %idx1 = getelementptr inbounds <2 x i8>, ptr %const1, i64 %in.idx115 ret void16}17 18define void @inboundsNonNegative_nonCanonical(ptr %in.ptr, i32 %in.idx1) {19; CHECK-LABEL: define void @inboundsNonNegative_nonCanonical(20; CHECK-SAME: ptr [[IN_PTR:%.*]], i32 [[IN_IDX1:%.*]]) #[[ATTR0]] {21; CHECK-NEXT: entry:22; CHECK-NEXT: [[IN_IDX1_NNEG1:%.*]] = and i32 [[IN_IDX1]], 214748364723; CHECK-NEXT: [[IN_IDX1_NNEG:%.*]] = sext i32 [[IN_IDX1_NNEG1]] to i6424; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds <2 x i8>, ptr [[IN_PTR]], i64 [[IN_IDX1_NNEG]]25; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds <2 x i8>, ptr [[TMP0]], i32 126; CHECK-NEXT: ret void27;28entry:29 %in.idx1.nneg = and i32 %in.idx1, 214748364730 %const1 = getelementptr inbounds <2 x i8>, ptr %in.ptr, i32 131 %idx1 = getelementptr inbounds <2 x i8>, ptr %const1, i32 %in.idx1.nneg32 ret void33}34 35define void @inboundsNonNegative(ptr %in.ptr, i64 %in.idx1) {36; CHECK-LABEL: define void @inboundsNonNegative(37; CHECK-SAME: ptr [[IN_PTR:%.*]], i64 [[IN_IDX1:%.*]]) #[[ATTR0]] {38; CHECK-NEXT: entry:39; CHECK-NEXT: [[IDXPROM:%.*]] = and i64 [[IN_IDX1]], 922337203685477580740; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds <2 x i8>, ptr [[IN_PTR]], i64 [[IDXPROM]]41; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds <2 x i8>, ptr [[TMP0]], i64 142; CHECK-NEXT: ret void43;44entry:45 %in.idx1.nneg = and i64 %in.idx1, 922337203685477580746 %const1 = getelementptr inbounds <2 x i8>, ptr %in.ptr, i64 147 %idx1 = getelementptr inbounds <2 x i8>, ptr %const1, i64 %in.idx1.nneg48 ret void49}50 51define void @inboundsNonchained(ptr %in.ptr, i64 %in.idx1) {52; CHECK-LABEL: define void @inboundsNonchained(53; CHECK-SAME: ptr [[IN_PTR:%.*]], i64 [[IN_IDX1:%.*]]) #[[ATTR0]] {54; CHECK-NEXT: entry:55; CHECK-NEXT: [[IDXPROM:%.*]] = and i64 [[IN_IDX1]], 922337203685477580756; CHECK-NEXT: [[TMP0:%.*]] = getelementptr <2 x i8>, ptr [[IN_PTR]], i64 [[IDXPROM]]57; CHECK-NEXT: [[TMP1:%.*]] = getelementptr <2 x i8>, ptr [[TMP0]], i64 158; CHECK-NEXT: ret void59;60entry:61 %in.idx1.nneg = and i64 %in.idx1, 922337203685477580762 %const1 = getelementptr inbounds <2 x i8>, ptr %in.ptr, i64 163 %idx1 = getelementptr <2 x i8>, ptr %const1, i64 %in.idx1.nneg64 ret void65}66 67define void @inboundsNonNegativeType_i16i8(ptr %in.ptr, i64 %in.idx1) {68; CHECK-LABEL: define void @inboundsNonNegativeType_i16i8(69; CHECK-SAME: ptr [[IN_PTR:%.*]], i64 [[IN_IDX1:%.*]]) #[[ATTR0]] {70; CHECK-NEXT: entry:71; CHECK-NEXT: [[IDXPROM:%.*]] = and i64 [[IN_IDX1]], 922337203685477580772; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[IN_PTR]], i64 [[IDXPROM]]73; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i16, ptr [[TMP0]], i64 102474; CHECK-NEXT: ret void75;76entry:77 %in.idx1.nneg = and i64 %in.idx1, 922337203685477580778 %const1 = getelementptr inbounds i16, ptr %in.ptr, i64 102479 %idx1 = getelementptr inbounds i8, ptr %const1, i64 %in.idx1.nneg80 ret void81}82 83define void @inboundsNonNegative_i8i16(ptr %in.ptr, i64 %in.idx1) {84; CHECK-LABEL: define void @inboundsNonNegative_i8i16(85; CHECK-SAME: ptr [[IN_PTR:%.*]], i64 [[IN_IDX1:%.*]]) #[[ATTR0]] {86; CHECK-NEXT: entry:87; CHECK-NEXT: [[IDXPROM:%.*]] = and i64 [[IN_IDX1]], 922337203685477580788; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds i16, ptr [[IN_PTR]], i64 [[IDXPROM]]89; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr [[TMP0]], i64 102490; CHECK-NEXT: ret void91;92entry:93 %in.idx1.nneg = and i64 %in.idx1, 922337203685477580794 %const1 = getelementptr inbounds i8, ptr %in.ptr, i64 102495 %idx1 = getelementptr inbounds i16, ptr %const1, i64 %in.idx1.nneg96 ret void97}98 99define void @inboundsNonchained_first(ptr %in.ptr, i64 %in.idx1) {100; CHECK-LABEL: define void @inboundsNonchained_first(101; CHECK-SAME: ptr [[IN_PTR:%.*]], i64 [[IN_IDX1:%.*]]) #[[ATTR0]] {102; CHECK-NEXT: entry:103; CHECK-NEXT: [[IN_IDX1_NNEG:%.*]] = and i64 [[IN_IDX1]], 9223372036854775807104; CHECK-NEXT: [[TMP0:%.*]] = getelementptr i32, ptr [[IN_PTR]], i64 [[IN_IDX1_NNEG]]105; CHECK-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr [[TMP0]], i64 1024106; CHECK-NEXT: ret void107;108entry:109 %in.idx1.nneg = and i64 %in.idx1, 9223372036854775807110 %const1 = getelementptr inbounds i8, ptr %in.ptr, i64 1024111 %idx1 = getelementptr i32, ptr %const1, i64 %in.idx1.nneg112 ret void113}114 115define void @inboundsNonchained_second(ptr %in.ptr, i64 %in.idx1) {116; CHECK-LABEL: define void @inboundsNonchained_second(117; CHECK-SAME: ptr [[IN_PTR:%.*]], i64 [[IN_IDX1:%.*]]) #[[ATTR0]] {118; CHECK-NEXT: entry:119; CHECK-NEXT: [[IN_IDX1_NNEG:%.*]] = and i64 [[IN_IDX1]], 9223372036854775807120; CHECK-NEXT: [[TMP0:%.*]] = getelementptr i64, ptr [[IN_PTR]], i64 [[IN_IDX1_NNEG]]121; CHECK-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr [[TMP0]], i64 1024122; CHECK-NEXT: ret void123;124entry:125 %in.idx1.nneg = and i64 %in.idx1, 9223372036854775807126 %const1 = getelementptr i8, ptr %in.ptr, i64 1024127 %idx1 = getelementptr inbounds i64, ptr %const1, i64 %in.idx1.nneg128 ret void129}130 131define void @notInbounds(ptr %in.ptr, i64 %in.idx1) {132; CHECK-LABEL: define void @notInbounds(133; CHECK-SAME: ptr [[IN_PTR:%.*]], i64 [[IN_IDX1:%.*]]) #[[ATTR0]] {134; CHECK-NEXT: entry:135; CHECK-NEXT: [[IN_IDX1_NNEG:%.*]] = and i64 [[IN_IDX1]], 9223372036854775807136; CHECK-NEXT: [[TMP0:%.*]] = getelementptr i128, ptr [[IN_PTR]], i64 [[IN_IDX1_NNEG]]137; CHECK-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr [[TMP0]], i64 1024138; CHECK-NEXT: ret void139;140entry:141 %in.idx1.nneg = and i64 %in.idx1, 9223372036854775807142 %const1 = getelementptr i8, ptr %in.ptr, i64 1024143 %idx1 = getelementptr i128, ptr %const1, i64 %in.idx1.nneg144 ret void145}146 147define void @vectorType1(ptr %in.ptr, i64 %in.idx1) {148; CHECK-LABEL: define void @vectorType1(149; CHECK-SAME: ptr [[IN_PTR:%.*]], i64 [[IN_IDX1:%.*]]) #[[ATTR0]] {150; CHECK-NEXT: entry:151; CHECK-NEXT: [[IN_IDX1_NNEG:%.*]] = and i64 [[IN_IDX1]], 2147483647152; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds <2 x i8>, ptr [[IN_PTR]], i64 [[IN_IDX1_NNEG]]153; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds <4 x i8>, ptr [[TMP0]], i32 3154; CHECK-NEXT: ret void155;156entry:157 %in.idx1.nneg = and i64 %in.idx1, 2147483647158 %const1 = getelementptr inbounds <4 x i8>, ptr %in.ptr, i32 3159 %idx1 = getelementptr inbounds <2 x i8>, ptr %const1, i64 %in.idx1.nneg160 ret void161}162 163define void @vectorType2(ptr %in.ptr, i64 %in.idx1) {164; CHECK-LABEL: define void @vectorType2(165; CHECK-SAME: ptr [[IN_PTR:%.*]], i64 [[IN_IDX1:%.*]]) #[[ATTR0]] {166; CHECK-NEXT: entry:167; CHECK-NEXT: [[IN_IDX1_NNEG:%.*]] = and i64 [[IN_IDX1]], 2147483647168; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds <4 x half>, ptr [[IN_PTR]], i64 [[IN_IDX1_NNEG]]169; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds <4 x i8>, ptr [[TMP0]], i32 1170; CHECK-NEXT: ret void171;172entry:173 %in.idx1.nneg = and i64 %in.idx1, 2147483647174 %const1 = getelementptr inbounds <4 x i8>, ptr %in.ptr, i32 1175 %idx1 = getelementptr inbounds <4 x half>, ptr %const1, i64 %in.idx1.nneg176 ret void177}178 179define void @vectorType3(ptr %in.ptr, i64 %in.idx1) {180; CHECK-LABEL: define void @vectorType3(181; CHECK-SAME: ptr [[IN_PTR:%.*]], i64 [[IN_IDX1:%.*]]) #[[ATTR0]] {182; CHECK-NEXT: entry:183; CHECK-NEXT: [[IN_IDX1_NNEG:%.*]] = and i64 [[IN_IDX1]], 2147483647184; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds ptr, ptr [[IN_PTR]], i64 [[IN_IDX1_NNEG]]185; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds <4 x ptr>, ptr [[TMP0]], i32 1186; CHECK-NEXT: ret void187;188entry:189 %in.idx1.nneg = and i64 %in.idx1, 2147483647190 %const1 = getelementptr inbounds <4 x ptr>, ptr %in.ptr, i32 1191 %idx1 = getelementptr inbounds ptr, ptr %const1, i64 %in.idx1.nneg192 ret void193}194 195define void @vectorType4(ptr %in.ptr, i64 %in.idx1) {196; CHECK-LABEL: define void @vectorType4(197; CHECK-SAME: ptr [[IN_PTR:%.*]], i64 [[IN_IDX1:%.*]]) #[[ATTR0]] {198; CHECK-NEXT: entry:199; CHECK-NEXT: [[IN_IDX1_NNEG:%.*]] = and i64 [[IN_IDX1]], 2147483647200; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds <8 x ptr addrspace(1)>, ptr [[IN_PTR]], i64 [[IN_IDX1_NNEG]]201; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds <4 x ptr>, ptr [[TMP0]], i32 3202; CHECK-NEXT: ret void203;204entry:205 %in.idx1.nneg = and i64 %in.idx1, 2147483647206 %const1 = getelementptr inbounds <4 x ptr>, ptr %in.ptr, i32 3207 %idx1 = getelementptr inbounds <8 x ptr addrspace(1)>, ptr %const1, i64 %in.idx1.nneg208 ret void209}210 211 212define void @ptrType(ptr %in.ptr, i64 %in.idx1) {213; CHECK-LABEL: define void @ptrType(214; CHECK-SAME: ptr [[IN_PTR:%.*]], i64 [[IN_IDX1:%.*]]) #[[ATTR0]] {215; CHECK-NEXT: entry:216; CHECK-NEXT: [[IN_IDX1_NNEG:%.*]] = and i64 [[IN_IDX1]], 2147483647217; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds ptr, ptr [[IN_PTR]], i64 [[IN_IDX1_NNEG]]218; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds ptr addrspace(2), ptr [[TMP0]], i32 1219; CHECK-NEXT: ret void220;221entry:222 %in.idx1.nneg = and i64 %in.idx1, 2147483647223 %const1 = getelementptr inbounds ptr addrspace(2), ptr %in.ptr, i32 1224 %idx1 = getelementptr inbounds ptr, ptr %const1, i64 %in.idx1.nneg225 ret void226}227 228define void @ptrType2(ptr %in.ptr, i64 %in.idx1) {229; CHECK-LABEL: define void @ptrType2(230; CHECK-SAME: ptr [[IN_PTR:%.*]], i64 [[IN_IDX1:%.*]]) #[[ATTR0]] {231; CHECK-NEXT: entry:232; CHECK-NEXT: [[IN_IDX1_NNEG:%.*]] = and i64 [[IN_IDX1]], 2147483647233; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds i64, ptr [[IN_PTR]], i64 [[IN_IDX1_NNEG]]234; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds ptr addrspace(3), ptr [[TMP0]], i32 3235; CHECK-NEXT: ret void236;237entry:238 %in.idx1.nneg = and i64 %in.idx1, 2147483647239 %const1 = getelementptr inbounds ptr addrspace(3), ptr %in.ptr, i32 3240 %idx1 = getelementptr inbounds i64, ptr %const1, i64 %in.idx1.nneg241 ret void242}243 244define void @ptrType3(ptr %in.ptr, i64 %in.idx1) {245; CHECK-LABEL: define void @ptrType3(246; CHECK-SAME: ptr [[IN_PTR:%.*]], i64 [[IN_IDX1:%.*]]) #[[ATTR0]] {247; CHECK-NEXT: entry:248; CHECK-NEXT: [[IN_IDX1_NNEG:%.*]] = and i64 [[IN_IDX1]], 2147483647249; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds i16, ptr [[IN_PTR]], i64 [[IN_IDX1_NNEG]]250; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds ptr addrspace(7), ptr [[TMP0]], i32 3251; CHECK-NEXT: ret void252;253entry:254 %in.idx1.nneg = and i64 %in.idx1, 2147483647255 %const1 = getelementptr inbounds ptr addrspace(7), ptr %in.ptr, i32 3256 %idx1 = getelementptr inbounds i16, ptr %const1, i64 %in.idx1.nneg257 ret void258}259 260define void @addrspace1(ptr addrspace(1) %in.ptr, i64 %in.idx1) {261; CHECK-LABEL: define void @addrspace1(262; CHECK-SAME: ptr addrspace(1) [[IN_PTR:%.*]], i64 [[IN_IDX1:%.*]]) #[[ATTR0]] {263; CHECK-NEXT: entry:264; CHECK-NEXT: [[IN_IDX1_NNEG:%.*]] = and i64 [[IN_IDX1]], 9223372036854775807265; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds i128, ptr addrspace(1) [[IN_PTR]], i64 [[IN_IDX1_NNEG]]266; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr addrspace(1) [[TMP0]], i64 1024267; CHECK-NEXT: ret void268;269entry:270 %in.idx1.nneg = and i64 %in.idx1, 9223372036854775807271 %const1 = getelementptr inbounds i8, ptr addrspace(1) %in.ptr, i64 1024272 %idx1 = getelementptr inbounds i128, ptr addrspace(1) %const1, i64 %in.idx1.nneg273 ret void274}275 276define void @addrspace3(ptr addrspace(3) %in.ptr, i64 %in.idx1) {277; CHECK-LABEL: define void @addrspace3(278; CHECK-SAME: ptr addrspace(3) [[IN_PTR:%.*]], i64 [[IN_IDX1:%.*]]) #[[ATTR0]] {279; CHECK-NEXT: entry:280; CHECK-NEXT: [[IN_IDX1_NNEG:%.*]] = and i64 [[IN_IDX1]], 9223372036854775807281; CHECK-NEXT: [[IDXPROM:%.*]] = trunc i64 [[IN_IDX1_NNEG]] to i32282; CHECK-NEXT: [[TMP0:%.*]] = getelementptr i128, ptr addrspace(3) [[IN_PTR]], i32 [[IDXPROM]]283; CHECK-NEXT: [[IDX11:%.*]] = getelementptr i8, ptr addrspace(3) [[TMP0]], i32 1024284; CHECK-NEXT: ret void285;286entry:287 %in.idx1.nneg = and i64 %in.idx1, 9223372036854775807288 %const1 = getelementptr inbounds i8, ptr addrspace(3) %in.ptr, i64 1024289 %idx1 = getelementptr inbounds i128, ptr addrspace(3) %const1, i64 %in.idx1.nneg290 ret void291}292 293define void @addrspace7(ptr addrspace(7) %in.ptr, i64 %in.idx1) {294; CHECK-LABEL: define void @addrspace7(295; CHECK-SAME: ptr addrspace(7) [[IN_PTR:%.*]], i64 [[IN_IDX1:%.*]]) #[[ATTR0]] {296; CHECK-NEXT: entry:297; CHECK-NEXT: [[IN_IDX1_NNEG:%.*]] = and i64 [[IN_IDX1]], 9223372036854775807298; CHECK-NEXT: [[IDXPROM:%.*]] = trunc i64 [[IN_IDX1_NNEG]] to i32299; CHECK-NEXT: [[TMP0:%.*]] = getelementptr i128, ptr addrspace(7) [[IN_PTR]], i32 [[IDXPROM]]300; CHECK-NEXT: [[IDX11:%.*]] = getelementptr i8, ptr addrspace(7) [[TMP0]], i32 1024301; CHECK-NEXT: ret void302;303entry:304 %in.idx1.nneg = and i64 %in.idx1, 9223372036854775807305 %const1 = getelementptr inbounds i8, ptr addrspace(7) %in.ptr, i64 1024306 %idx1 = getelementptr inbounds i128, ptr addrspace(7) %const1, i64 %in.idx1.nneg307 ret void308}309