brintos

brintos / llvm-project-archived public Read only

0
0
Text · 15.8 KiB · 42a4619 Raw
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