474 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 42; RUN: opt < %s -S -passes=instcombine | FileCheck %s3 4declare void @use64(i64)5declare void @useptr(ptr)6 7define ptr @test_zero(ptr %base, i64 %a) {8; CHECK-LABEL: define ptr @test_zero(9; CHECK-SAME: ptr [[BASE:%.*]], i64 [[A:%.*]]) {10; CHECK-NEXT: entry:11; CHECK-NEXT: [[P2:%.*]] = getelementptr i32, ptr [[BASE]], i64 [[A]]12; CHECK-NEXT: ret ptr [[P2]]13;14entry:15 %p1 = getelementptr i8, ptr %base, i64 -416 %index = add i64 %a, 117 %p2 = getelementptr i32, ptr %p1, i64 %index18 ret ptr %p219}20 21define ptr @test_nonzero(ptr %base, i64 %a) {22; CHECK-LABEL: define ptr @test_nonzero(23; CHECK-SAME: ptr [[BASE:%.*]], i64 [[A:%.*]]) {24; CHECK-NEXT: entry:25; CHECK-NEXT: [[TMP0:%.*]] = getelementptr i8, ptr [[BASE]], i64 426; CHECK-NEXT: [[P2:%.*]] = getelementptr i32, ptr [[TMP0]], i64 [[A]]27; CHECK-NEXT: ret ptr [[P2]]28;29entry:30 %p1 = getelementptr i8, ptr %base, i64 -431 %index = add i64 %a, 232 %p2 = getelementptr i32, ptr %p1, i64 %index33 ret ptr %p234}35 36define ptr @test_or_disjoint(ptr %base, i64 %a) {37; CHECK-LABEL: define ptr @test_or_disjoint(38; CHECK-SAME: ptr [[BASE:%.*]], i64 [[A:%.*]]) {39; CHECK-NEXT: entry:40; CHECK-NEXT: [[P2:%.*]] = getelementptr i32, ptr [[BASE]], i64 [[A]]41; CHECK-NEXT: ret ptr [[P2]]42;43entry:44 %p1 = getelementptr i8, ptr %base, i64 -445 %index = or disjoint i64 %a, 146 %p2 = getelementptr i32, ptr %p1, i64 %index47 ret ptr %p248}49 50define ptr @test_zero_multiuse_index(ptr %base, i64 %a) {51; CHECK-LABEL: define ptr @test_zero_multiuse_index(52; CHECK-SAME: ptr [[BASE:%.*]], i64 [[A:%.*]]) {53; CHECK-NEXT: entry:54; CHECK-NEXT: [[INDEX:%.*]] = add i64 [[A]], 155; CHECK-NEXT: call void @use64(i64 [[INDEX]])56; CHECK-NEXT: [[P2:%.*]] = getelementptr i32, ptr [[BASE]], i64 [[A]]57; CHECK-NEXT: ret ptr [[P2]]58;59entry:60 %p1 = getelementptr i8, ptr %base, i64 -461 %index = add i64 %a, 162 call void @use64(i64 %index)63 %p2 = getelementptr i32, ptr %p1, i64 %index64 ret ptr %p265}66 67define ptr @test_zero_multiuse_ptr(ptr %base, i64 %a) {68; CHECK-LABEL: define ptr @test_zero_multiuse_ptr(69; CHECK-SAME: ptr [[BASE:%.*]], i64 [[A:%.*]]) {70; CHECK-NEXT: entry:71; CHECK-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[BASE]], i64 -472; CHECK-NEXT: call void @useptr(ptr [[P1]])73; CHECK-NEXT: [[P2:%.*]] = getelementptr i32, ptr [[BASE]], i64 [[A]]74; CHECK-NEXT: ret ptr [[P2]]75;76entry:77 %p1 = getelementptr i8, ptr %base, i64 -478 call void @useptr(ptr %p1)79 %index = add i64 %a, 180 %p2 = getelementptr i32, ptr %p1, i64 %index81 ret ptr %p282}83 84define ptr @test_zero_sext_add_nsw(ptr %base, i32 %a) {85; CHECK-LABEL: define ptr @test_zero_sext_add_nsw(86; CHECK-SAME: ptr [[BASE:%.*]], i32 [[A:%.*]]) {87; CHECK-NEXT: entry:88; CHECK-NEXT: [[TMP0:%.*]] = sext i32 [[A]] to i6489; CHECK-NEXT: [[P2:%.*]] = getelementptr i32, ptr [[BASE]], i64 [[TMP0]]90; CHECK-NEXT: ret ptr [[P2]]91;92entry:93 %p1 = getelementptr i8, ptr %base, i64 -494 %index = add nsw i32 %a, 195 %p2 = getelementptr i32, ptr %p1, i32 %index96 ret ptr %p297}98 99define ptr @test_zero_trunc_add(ptr %base, i128 %a) {100; CHECK-LABEL: define ptr @test_zero_trunc_add(101; CHECK-SAME: ptr [[BASE:%.*]], i128 [[A:%.*]]) {102; CHECK-NEXT: entry:103; CHECK-NEXT: [[TMP0:%.*]] = trunc i128 [[A]] to i64104; CHECK-NEXT: [[P2:%.*]] = getelementptr i32, ptr [[BASE]], i64 [[TMP0]]105; CHECK-NEXT: ret ptr [[P2]]106;107entry:108 %p1 = getelementptr i8, ptr %base, i64 -4109 %index = add i128 %a, 1110 %p2 = getelementptr i32, ptr %p1, i128 %index111 ret ptr %p2112}113 114define ptr @test_non_i8(ptr %base, i64 %a) {115; CHECK-LABEL: define ptr @test_non_i8(116; CHECK-SAME: ptr [[BASE:%.*]], i64 [[A:%.*]]) {117; CHECK-NEXT: entry:118; CHECK-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[BASE]], i64 -4119; CHECK-NEXT: [[TMP0:%.*]] = getelementptr i32, ptr [[P1]], i64 [[A]]120; CHECK-NEXT: ret ptr [[TMP0]]121;122entry:123 %p1 = getelementptr i16, ptr %base, i64 -4124 %index = add i64 %a, 1125 %p2 = getelementptr i32, ptr %p1, i64 %index126 ret ptr %p2127}128 129define ptr @test_non_const(ptr %base, i64 %a, i64 %b) {130; CHECK-LABEL: define ptr @test_non_const(131; CHECK-SAME: ptr [[BASE:%.*]], i64 [[A:%.*]], i64 [[B:%.*]]) {132; CHECK-NEXT: entry:133; CHECK-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[BASE]], i64 [[B]]134; CHECK-NEXT: [[TMP0:%.*]] = getelementptr i32, ptr [[P1]], i64 [[A]]135; CHECK-NEXT: [[P2:%.*]] = getelementptr i8, ptr [[TMP0]], i64 4136; CHECK-NEXT: ret ptr [[P2]]137;138entry:139 %p1 = getelementptr i8, ptr %base, i64 %b140 %index = add i64 %a, 1141 %p2 = getelementptr i32, ptr %p1, i64 %index142 ret ptr %p2143}144 145define ptr @test_too_many_indices(ptr %base, i64 %a, i64 %b) {146; CHECK-LABEL: define ptr @test_too_many_indices(147; CHECK-SAME: ptr [[BASE:%.*]], i64 [[A:%.*]], i64 [[B:%.*]]) {148; CHECK-NEXT: entry:149; CHECK-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[BASE]], i64 [[B]]150; CHECK-NEXT: [[TMP0:%.*]] = getelementptr i8, ptr [[P1]], i64 36151; CHECK-NEXT: [[P2:%.*]] = getelementptr i32, ptr [[TMP0]], i64 [[A]]152; CHECK-NEXT: ret ptr [[P2]]153;154entry:155 %p1 = getelementptr i8, ptr %base, i64 %b156 %index = add i64 %a, 1157 %p2 = getelementptr [8 x i32], ptr %p1, i64 1, i64 %index158 ret ptr %p2159}160 161define ptr @test_wrong_op(ptr %base, i64 %a) {162; CHECK-LABEL: define ptr @test_wrong_op(163; CHECK-SAME: ptr [[BASE:%.*]], i64 [[A:%.*]]) {164; CHECK-NEXT: entry:165; CHECK-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[BASE]], i64 -4166; CHECK-NEXT: [[INDEX:%.*]] = xor i64 [[A]], 1167; CHECK-NEXT: [[P2:%.*]] = getelementptr i32, ptr [[P1]], i64 [[INDEX]]168; CHECK-NEXT: ret ptr [[P2]]169;170entry:171 %p1 = getelementptr i8, ptr %base, i64 -4172 %index = xor i64 %a, 1173 %p2 = getelementptr i32, ptr %p1, i64 %index174 ret ptr %p2175}176 177define ptr @test_sext_add_without_nsw(ptr %base, i32 %a) {178; CHECK-LABEL: define ptr @test_sext_add_without_nsw(179; CHECK-SAME: ptr [[BASE:%.*]], i32 [[A:%.*]]) {180; CHECK-NEXT: entry:181; CHECK-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[BASE]], i64 -4182; CHECK-NEXT: [[INDEX:%.*]] = add i32 [[A]], 1183; CHECK-NEXT: [[TMP0:%.*]] = sext i32 [[INDEX]] to i64184; CHECK-NEXT: [[P2:%.*]] = getelementptr i32, ptr [[P1]], i64 [[TMP0]]185; CHECK-NEXT: ret ptr [[P2]]186;187entry:188 %p1 = getelementptr i8, ptr %base, i64 -4189 %index = add i32 %a, 1190 %p2 = getelementptr i32, ptr %p1, i32 %index191 ret ptr %p2192}193 194define ptr @test_or_without_disjoint(ptr %base, i64 %a) {195; CHECK-LABEL: define ptr @test_or_without_disjoint(196; CHECK-SAME: ptr [[BASE:%.*]], i64 [[A:%.*]]) {197; CHECK-NEXT: entry:198; CHECK-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[BASE]], i64 -4199; CHECK-NEXT: [[INDEX:%.*]] = or i64 [[A]], 1200; CHECK-NEXT: [[P2:%.*]] = getelementptr i32, ptr [[P1]], i64 [[INDEX]]201; CHECK-NEXT: ret ptr [[P2]]202;203entry:204 %p1 = getelementptr i8, ptr %base, i64 -4205 %index = or i64 %a, 1206 %p2 = getelementptr i32, ptr %p1, i64 %index207 ret ptr %p2208}209 210define ptr @test_smul_overflow(ptr %base, i64 %a) {211; CHECK-LABEL: define ptr @test_smul_overflow(212; CHECK-SAME: ptr [[BASE:%.*]], i64 [[A:%.*]]) {213; CHECK-NEXT: entry:214; CHECK-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[BASE]], i64 -12215; CHECK-NEXT: [[TMP0:%.*]] = getelementptr i32, ptr [[P1]], i64 [[A]]216; CHECK-NEXT: ret ptr [[TMP0]]217;218entry:219 %p1 = getelementptr i8, ptr %base, i64 -4220 %index = add i64 %a, 9223372036854775806221 %p2 = getelementptr i32, ptr %p1, i64 %index222 ret ptr %p2223}224 225define ptr @test_sadd_overflow(ptr %base, i64 %a) {226; CHECK-LABEL: define ptr @test_sadd_overflow(227; CHECK-SAME: ptr [[BASE:%.*]], i64 [[A:%.*]]) {228; CHECK-NEXT: entry:229; CHECK-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[BASE]], i64 -9223372036854775808230; CHECK-NEXT: [[TMP0:%.*]] = getelementptr i32, ptr [[P1]], i64 [[A]]231; CHECK-NEXT: ret ptr [[TMP0]]232;233entry:234 %p1 = getelementptr i8, ptr %base, i64 9223372036854775804235 %index = add i64 %a, 1236 %p2 = getelementptr i32, ptr %p1, i64 %index237 ret ptr %p2238}239 240define ptr @test_nonzero_multiuse_index(ptr %base, i64 %a) {241; CHECK-LABEL: define ptr @test_nonzero_multiuse_index(242; CHECK-SAME: ptr [[BASE:%.*]], i64 [[A:%.*]]) {243; CHECK-NEXT: entry:244; CHECK-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[BASE]], i64 -4245; CHECK-NEXT: [[INDEX:%.*]] = add i64 [[A]], 2246; CHECK-NEXT: call void @use64(i64 [[INDEX]])247; CHECK-NEXT: [[P2:%.*]] = getelementptr i32, ptr [[P1]], i64 [[INDEX]]248; CHECK-NEXT: ret ptr [[P2]]249;250entry:251 %p1 = getelementptr i8, ptr %base, i64 -4252 %index = add i64 %a, 2253 call void @use64(i64 %index)254 %p2 = getelementptr i32, ptr %p1, i64 %index255 ret ptr %p2256}257 258define ptr @test_nonzero_multiuse_ptr(ptr %base, i64 %a) {259; CHECK-LABEL: define ptr @test_nonzero_multiuse_ptr(260; CHECK-SAME: ptr [[BASE:%.*]], i64 [[A:%.*]]) {261; CHECK-NEXT: entry:262; CHECK-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[BASE]], i64 -4263; CHECK-NEXT: call void @useptr(ptr [[P1]])264; CHECK-NEXT: [[TMP0:%.*]] = getelementptr i32, ptr [[P1]], i64 [[A]]265; CHECK-NEXT: [[P2:%.*]] = getelementptr i8, ptr [[TMP0]], i64 8266; CHECK-NEXT: ret ptr [[P2]]267;268entry:269 %p1 = getelementptr i8, ptr %base, i64 -4270 call void @useptr(ptr %p1)271 %index = add i64 %a, 2272 %p2 = getelementptr i32, ptr %p1, i64 %index273 ret ptr %p2274}275 276define ptr @test_scalable(ptr %base, i64 %a) {277; CHECK-LABEL: define ptr @test_scalable(278; CHECK-SAME: ptr [[BASE:%.*]], i64 [[A:%.*]]) {279; CHECK-NEXT: entry:280; CHECK-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[BASE]], i64 -4281; CHECK-NEXT: [[INDEX:%.*]] = add i64 [[A]], 1282; CHECK-NEXT: [[TMP0:%.*]] = call i64 @llvm.vscale.i64()283; CHECK-NEXT: [[TMP1:%.*]] = shl nuw i64 [[TMP0]], 4284; CHECK-NEXT: [[P2_IDX:%.*]] = mul i64 [[INDEX]], [[TMP1]]285; CHECK-NEXT: [[P2:%.*]] = getelementptr i8, ptr [[P1]], i64 [[P2_IDX]]286; CHECK-NEXT: ret ptr [[P2]]287;288entry:289 %p1 = getelementptr i8, ptr %base, i64 -4290 %index = add i64 %a, 1291 %p2 = getelementptr <vscale x 4 x i32>, ptr %p1, i64 %index292 ret ptr %p2293}294 295define ptr @test_all_nuw(ptr %base, i64 %a) {296; CHECK-LABEL: define ptr @test_all_nuw(297; CHECK-SAME: ptr [[BASE:%.*]], i64 [[A:%.*]]) {298; CHECK-NEXT: entry:299; CHECK-NEXT: [[TMP0:%.*]] = getelementptr nuw i8, ptr [[BASE]], i64 9300; CHECK-NEXT: [[P2:%.*]] = getelementptr nuw i32, ptr [[TMP0]], i64 [[A]]301; CHECK-NEXT: ret ptr [[P2]]302;303entry:304 %p1 = getelementptr nuw i8, ptr %base, i64 1305 %index = add nuw i64 %a, 2306 %p2 = getelementptr nuw i32, ptr %p1, i64 %index307 ret ptr %p2308}309 310define ptr @test_all_partial_nuw1(ptr %base, i64 %a) {311; CHECK-LABEL: define ptr @test_all_partial_nuw1(312; CHECK-SAME: ptr [[BASE:%.*]], i64 [[A:%.*]]) {313; CHECK-NEXT: entry:314; CHECK-NEXT: [[TMP0:%.*]] = getelementptr i8, ptr [[BASE]], i64 9315; CHECK-NEXT: [[P2:%.*]] = getelementptr i32, ptr [[TMP0]], i64 [[A]]316; CHECK-NEXT: ret ptr [[P2]]317;318entry:319 %p1 = getelementptr i8, ptr %base, i64 1320 %index = add nuw i64 %a, 2321 %p2 = getelementptr nuw i32, ptr %p1, i64 %index322 ret ptr %p2323}324 325define ptr @test_all_partial_nuw2(ptr %base, i64 %a) {326; CHECK-LABEL: define ptr @test_all_partial_nuw2(327; CHECK-SAME: ptr [[BASE:%.*]], i64 [[A:%.*]]) {328; CHECK-NEXT: entry:329; CHECK-NEXT: [[TMP0:%.*]] = getelementptr i8, ptr [[BASE]], i64 9330; CHECK-NEXT: [[P2:%.*]] = getelementptr i32, ptr [[TMP0]], i64 [[A]]331; CHECK-NEXT: ret ptr [[P2]]332;333entry:334 %p1 = getelementptr nuw i8, ptr %base, i64 1335 %index = add i64 %a, 2336 %p2 = getelementptr nuw i32, ptr %p1, i64 %index337 ret ptr %p2338}339 340define ptr @test_all_partial_nuw3(ptr %base, i64 %a) {341; CHECK-LABEL: define ptr @test_all_partial_nuw3(342; CHECK-SAME: ptr [[BASE:%.*]], i64 [[A:%.*]]) {343; CHECK-NEXT: entry:344; CHECK-NEXT: [[TMP0:%.*]] = getelementptr i8, ptr [[BASE]], i64 9345; CHECK-NEXT: [[P2:%.*]] = getelementptr i32, ptr [[TMP0]], i64 [[A]]346; CHECK-NEXT: ret ptr [[P2]]347;348entry:349 %p1 = getelementptr nuw i8, ptr %base, i64 1350 %index = add nuw i64 %a, 2351 %p2 = getelementptr i32, ptr %p1, i64 %index352 ret ptr %p2353}354 355define ptr @test_all_nuw_disjoint(ptr %base, i64 %a) {356; CHECK-LABEL: define ptr @test_all_nuw_disjoint(357; CHECK-SAME: ptr [[BASE:%.*]], i64 [[A:%.*]]) {358; CHECK-NEXT: entry:359; CHECK-NEXT: [[TMP0:%.*]] = getelementptr nuw i8, ptr [[BASE]], i64 9360; CHECK-NEXT: [[P2:%.*]] = getelementptr nuw i32, ptr [[TMP0]], i64 [[A]]361; CHECK-NEXT: ret ptr [[P2]]362;363entry:364 %p1 = getelementptr nuw i8, ptr %base, i64 1365 %index = or disjoint i64 %a, 2366 %p2 = getelementptr nuw i32, ptr %p1, i64 %index367 ret ptr %p2368}369 370define ptr @test_all_inbounds_nuw(ptr %base, i64 %a) {371; CHECK-LABEL: define ptr @test_all_inbounds_nuw(372; CHECK-SAME: ptr [[BASE:%.*]], i64 [[A:%.*]]) {373; CHECK-NEXT: entry:374; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds nuw i8, ptr [[BASE]], i64 9375; CHECK-NEXT: [[P2:%.*]] = getelementptr inbounds nuw i32, ptr [[TMP0]], i64 [[A]]376; CHECK-NEXT: ret ptr [[P2]]377;378entry:379 %p1 = getelementptr inbounds nuw i8, ptr %base, i64 1380 %index = add nuw i64 %a, 2381 %p2 = getelementptr inbounds nuw i32, ptr %p1, i64 %index382 ret ptr %p2383}384 385define ptr @test_all_partial_inbounds1(ptr %base, i64 %a) {386; CHECK-LABEL: define ptr @test_all_partial_inbounds1(387; CHECK-SAME: ptr [[BASE:%.*]], i64 [[A:%.*]]) {388; CHECK-NEXT: entry:389; CHECK-NEXT: [[TMP0:%.*]] = getelementptr nuw i8, ptr [[BASE]], i64 9390; CHECK-NEXT: [[P2:%.*]] = getelementptr nuw i32, ptr [[TMP0]], i64 [[A]]391; CHECK-NEXT: ret ptr [[P2]]392;393entry:394 %p1 = getelementptr nuw i8, ptr %base, i64 1395 %index = add nuw i64 %a, 2396 %p2 = getelementptr inbounds nuw i32, ptr %p1, i64 %index397 ret ptr %p2398}399 400define ptr @test_all_partial_inbounds2(ptr %base, i64 %a) {401; CHECK-LABEL: define ptr @test_all_partial_inbounds2(402; CHECK-SAME: ptr [[BASE:%.*]], i64 [[A:%.*]]) {403; CHECK-NEXT: entry:404; CHECK-NEXT: [[TMP0:%.*]] = getelementptr nuw i8, ptr [[BASE]], i64 9405; CHECK-NEXT: [[P2:%.*]] = getelementptr nuw i32, ptr [[TMP0]], i64 [[A]]406; CHECK-NEXT: ret ptr [[P2]]407;408entry:409 %p1 = getelementptr inbounds nuw i8, ptr %base, i64 1410 %index = add nuw i64 %a, 2411 %p2 = getelementptr nuw i32, ptr %p1, i64 %index412 ret ptr %p2413}414 415define ptr @test_all_inbounds_partial_nuw1(ptr %base, i64 %a) {416; CHECK-LABEL: define ptr @test_all_inbounds_partial_nuw1(417; CHECK-SAME: ptr [[BASE:%.*]], i64 [[A:%.*]]) {418; CHECK-NEXT: entry:419; CHECK-NEXT: [[TMP0:%.*]] = getelementptr i8, ptr [[BASE]], i64 7420; CHECK-NEXT: [[P2:%.*]] = getelementptr i32, ptr [[TMP0]], i64 [[A]]421; CHECK-NEXT: ret ptr [[P2]]422;423entry:424 %p1 = getelementptr inbounds i8, ptr %base, i64 -1425 %index = add nuw i64 %a, 2426 %p2 = getelementptr inbounds nuw i32, ptr %p1, i64 %index427 ret ptr %p2428}429 430define ptr @test_all_inbounds_partial_nuw2(ptr %base, i64 %a) {431; CHECK-LABEL: define ptr @test_all_inbounds_partial_nuw2(432; CHECK-SAME: ptr [[BASE:%.*]], i64 [[A:%.*]]) {433; CHECK-NEXT: entry:434; CHECK-NEXT: [[TMP0:%.*]] = getelementptr i8, ptr [[BASE]], i64 9435; CHECK-NEXT: [[P2:%.*]] = getelementptr i32, ptr [[TMP0]], i64 [[A]]436; CHECK-NEXT: ret ptr [[P2]]437;438entry:439 %p1 = getelementptr inbounds nuw i8, ptr %base, i64 1440 %index = add nuw i64 %a, 2441 %p2 = getelementptr inbounds i32, ptr %p1, i64 %index442 ret ptr %p2443}444 445define ptr @test_all_inbounds_partial_nuw3(ptr %base, i64 %a) {446; CHECK-LABEL: define ptr @test_all_inbounds_partial_nuw3(447; CHECK-SAME: ptr [[BASE:%.*]], i64 [[A:%.*]]) {448; CHECK-NEXT: entry:449; CHECK-NEXT: [[TMP0:%.*]] = getelementptr i8, ptr [[BASE]], i64 9450; CHECK-NEXT: [[P2:%.*]] = getelementptr i32, ptr [[TMP0]], i64 [[A]]451; CHECK-NEXT: ret ptr [[P2]]452;453entry:454 %p1 = getelementptr inbounds nuw i8, ptr %base, i64 1455 %index = add i64 %a, 2456 %p2 = getelementptr inbounds nuw i32, ptr %p1, i64 %index457 ret ptr %p2458}459 460define ptr @test_all_nusw_nuw(ptr %base, i64 %a) {461; CHECK-LABEL: define ptr @test_all_nusw_nuw(462; CHECK-SAME: ptr [[BASE:%.*]], i64 [[A:%.*]]) {463; CHECK-NEXT: entry:464; CHECK-NEXT: [[TMP0:%.*]] = getelementptr nuw i8, ptr [[BASE]], i64 9465; CHECK-NEXT: [[P2:%.*]] = getelementptr nuw i32, ptr [[TMP0]], i64 [[A]]466; CHECK-NEXT: ret ptr [[P2]]467;468entry:469 %p1 = getelementptr nusw nuw i8, ptr %base, i64 1470 %index = add nsw nuw i64 %a, 2471 %p2 = getelementptr nusw nuw i32, ptr %p1, i64 %index472 ret ptr %p2473}474