15a1d8505SYingwei Zheng; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4 25a1d8505SYingwei Zheng; RUN: opt < %s -S -passes=instcombine | FileCheck %s 35a1d8505SYingwei Zheng 45a1d8505SYingwei Zhengdeclare void @use64(i64) 55a1d8505SYingwei Zhengdeclare void @useptr(ptr) 65a1d8505SYingwei Zheng 75a1d8505SYingwei Zhengdefine ptr @test_zero(ptr %base, i64 %a) { 85a1d8505SYingwei Zheng; CHECK-LABEL: define ptr @test_zero( 95a1d8505SYingwei Zheng; CHECK-SAME: ptr [[BASE:%.*]], i64 [[A:%.*]]) { 105a1d8505SYingwei Zheng; CHECK-NEXT: entry: 115a1d8505SYingwei Zheng; CHECK-NEXT: [[P2:%.*]] = getelementptr i32, ptr [[BASE]], i64 [[A]] 125a1d8505SYingwei Zheng; CHECK-NEXT: ret ptr [[P2]] 135a1d8505SYingwei Zheng; 145a1d8505SYingwei Zhengentry: 155a1d8505SYingwei Zheng %p1 = getelementptr i8, ptr %base, i64 -4 165a1d8505SYingwei Zheng %index = add i64 %a, 1 175a1d8505SYingwei Zheng %p2 = getelementptr i32, ptr %p1, i64 %index 185a1d8505SYingwei Zheng ret ptr %p2 195a1d8505SYingwei Zheng} 205a1d8505SYingwei Zheng 215a1d8505SYingwei Zhengdefine ptr @test_nonzero(ptr %base, i64 %a) { 225a1d8505SYingwei Zheng; CHECK-LABEL: define ptr @test_nonzero( 235a1d8505SYingwei Zheng; CHECK-SAME: ptr [[BASE:%.*]], i64 [[A:%.*]]) { 245a1d8505SYingwei Zheng; CHECK-NEXT: entry: 255a1d8505SYingwei Zheng; CHECK-NEXT: [[TMP0:%.*]] = getelementptr i8, ptr [[BASE]], i64 4 265a1d8505SYingwei Zheng; CHECK-NEXT: [[P2:%.*]] = getelementptr i32, ptr [[TMP0]], i64 [[A]] 275a1d8505SYingwei Zheng; CHECK-NEXT: ret ptr [[P2]] 285a1d8505SYingwei Zheng; 295a1d8505SYingwei Zhengentry: 305a1d8505SYingwei Zheng %p1 = getelementptr i8, ptr %base, i64 -4 315a1d8505SYingwei Zheng %index = add i64 %a, 2 325a1d8505SYingwei Zheng %p2 = getelementptr i32, ptr %p1, i64 %index 335a1d8505SYingwei Zheng ret ptr %p2 345a1d8505SYingwei Zheng} 355a1d8505SYingwei Zheng 365a1d8505SYingwei Zhengdefine ptr @test_or_disjoint(ptr %base, i64 %a) { 375a1d8505SYingwei Zheng; CHECK-LABEL: define ptr @test_or_disjoint( 385a1d8505SYingwei Zheng; CHECK-SAME: ptr [[BASE:%.*]], i64 [[A:%.*]]) { 395a1d8505SYingwei Zheng; CHECK-NEXT: entry: 405a1d8505SYingwei Zheng; CHECK-NEXT: [[P2:%.*]] = getelementptr i32, ptr [[BASE]], i64 [[A]] 415a1d8505SYingwei Zheng; CHECK-NEXT: ret ptr [[P2]] 425a1d8505SYingwei Zheng; 435a1d8505SYingwei Zhengentry: 445a1d8505SYingwei Zheng %p1 = getelementptr i8, ptr %base, i64 -4 455a1d8505SYingwei Zheng %index = or disjoint i64 %a, 1 465a1d8505SYingwei Zheng %p2 = getelementptr i32, ptr %p1, i64 %index 475a1d8505SYingwei Zheng ret ptr %p2 485a1d8505SYingwei Zheng} 495a1d8505SYingwei Zheng 505a1d8505SYingwei Zhengdefine ptr @test_zero_multiuse_index(ptr %base, i64 %a) { 515a1d8505SYingwei Zheng; CHECK-LABEL: define ptr @test_zero_multiuse_index( 525a1d8505SYingwei Zheng; CHECK-SAME: ptr [[BASE:%.*]], i64 [[A:%.*]]) { 535a1d8505SYingwei Zheng; CHECK-NEXT: entry: 545a1d8505SYingwei Zheng; CHECK-NEXT: [[INDEX:%.*]] = add i64 [[A]], 1 555a1d8505SYingwei Zheng; CHECK-NEXT: call void @use64(i64 [[INDEX]]) 565a1d8505SYingwei Zheng; CHECK-NEXT: [[P2:%.*]] = getelementptr i32, ptr [[BASE]], i64 [[A]] 575a1d8505SYingwei Zheng; CHECK-NEXT: ret ptr [[P2]] 585a1d8505SYingwei Zheng; 595a1d8505SYingwei Zhengentry: 605a1d8505SYingwei Zheng %p1 = getelementptr i8, ptr %base, i64 -4 615a1d8505SYingwei Zheng %index = add i64 %a, 1 625a1d8505SYingwei Zheng call void @use64(i64 %index) 635a1d8505SYingwei Zheng %p2 = getelementptr i32, ptr %p1, i64 %index 645a1d8505SYingwei Zheng ret ptr %p2 655a1d8505SYingwei Zheng} 665a1d8505SYingwei Zheng 675a1d8505SYingwei Zhengdefine ptr @test_zero_multiuse_ptr(ptr %base, i64 %a) { 685a1d8505SYingwei Zheng; CHECK-LABEL: define ptr @test_zero_multiuse_ptr( 695a1d8505SYingwei Zheng; CHECK-SAME: ptr [[BASE:%.*]], i64 [[A:%.*]]) { 705a1d8505SYingwei Zheng; CHECK-NEXT: entry: 715a1d8505SYingwei Zheng; CHECK-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[BASE]], i64 -4 725a1d8505SYingwei Zheng; CHECK-NEXT: call void @useptr(ptr [[P1]]) 735a1d8505SYingwei Zheng; CHECK-NEXT: [[P2:%.*]] = getelementptr i32, ptr [[BASE]], i64 [[A]] 745a1d8505SYingwei Zheng; CHECK-NEXT: ret ptr [[P2]] 755a1d8505SYingwei Zheng; 765a1d8505SYingwei Zhengentry: 775a1d8505SYingwei Zheng %p1 = getelementptr i8, ptr %base, i64 -4 785a1d8505SYingwei Zheng call void @useptr(ptr %p1) 795a1d8505SYingwei Zheng %index = add i64 %a, 1 805a1d8505SYingwei Zheng %p2 = getelementptr i32, ptr %p1, i64 %index 815a1d8505SYingwei Zheng ret ptr %p2 825a1d8505SYingwei Zheng} 835a1d8505SYingwei Zheng 845a1d8505SYingwei Zhengdefine ptr @test_zero_sext_add_nsw(ptr %base, i32 %a) { 855a1d8505SYingwei Zheng; CHECK-LABEL: define ptr @test_zero_sext_add_nsw( 865a1d8505SYingwei Zheng; CHECK-SAME: ptr [[BASE:%.*]], i32 [[A:%.*]]) { 875a1d8505SYingwei Zheng; CHECK-NEXT: entry: 885a1d8505SYingwei Zheng; CHECK-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[BASE]], i64 -4 895a1d8505SYingwei Zheng; CHECK-NEXT: [[TMP0:%.*]] = sext i32 [[A]] to i64 905a1d8505SYingwei Zheng; CHECK-NEXT: [[TMP1:%.*]] = getelementptr i32, ptr [[P1]], i64 [[TMP0]] 915a1d8505SYingwei Zheng; CHECK-NEXT: [[P2:%.*]] = getelementptr i8, ptr [[TMP1]], i64 4 925a1d8505SYingwei Zheng; CHECK-NEXT: ret ptr [[P2]] 935a1d8505SYingwei Zheng; 945a1d8505SYingwei Zhengentry: 955a1d8505SYingwei Zheng %p1 = getelementptr i8, ptr %base, i64 -4 965a1d8505SYingwei Zheng %index = add nsw i32 %a, 1 975a1d8505SYingwei Zheng %p2 = getelementptr i32, ptr %p1, i32 %index 985a1d8505SYingwei Zheng ret ptr %p2 995a1d8505SYingwei Zheng} 1005a1d8505SYingwei Zheng 1015a1d8505SYingwei Zhengdefine ptr @test_zero_trunc_add(ptr %base, i128 %a) { 1025a1d8505SYingwei Zheng; CHECK-LABEL: define ptr @test_zero_trunc_add( 1035a1d8505SYingwei Zheng; CHECK-SAME: ptr [[BASE:%.*]], i128 [[A:%.*]]) { 1045a1d8505SYingwei Zheng; CHECK-NEXT: entry: 1055a1d8505SYingwei Zheng; CHECK-NEXT: [[TMP0:%.*]] = trunc i128 [[A]] to i64 1065a1d8505SYingwei Zheng; CHECK-NEXT: [[P2:%.*]] = getelementptr i32, ptr [[BASE]], i64 [[TMP0]] 1075a1d8505SYingwei Zheng; CHECK-NEXT: ret ptr [[P2]] 1085a1d8505SYingwei Zheng; 1095a1d8505SYingwei Zhengentry: 1105a1d8505SYingwei Zheng %p1 = getelementptr i8, ptr %base, i64 -4 1115a1d8505SYingwei Zheng %index = add i128 %a, 1 1125a1d8505SYingwei Zheng %p2 = getelementptr i32, ptr %p1, i128 %index 1135a1d8505SYingwei Zheng ret ptr %p2 1145a1d8505SYingwei Zheng} 1155a1d8505SYingwei Zheng 1165a1d8505SYingwei Zhengdefine ptr @test_non_i8(ptr %base, i64 %a) { 1175a1d8505SYingwei Zheng; CHECK-LABEL: define ptr @test_non_i8( 1185a1d8505SYingwei Zheng; CHECK-SAME: ptr [[BASE:%.*]], i64 [[A:%.*]]) { 1195a1d8505SYingwei Zheng; CHECK-NEXT: entry: 1205a1d8505SYingwei Zheng; CHECK-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[BASE]], i64 -4 1215a1d8505SYingwei Zheng; CHECK-NEXT: [[TMP0:%.*]] = getelementptr i32, ptr [[P1]], i64 [[A]] 1225a1d8505SYingwei Zheng; CHECK-NEXT: ret ptr [[TMP0]] 1235a1d8505SYingwei Zheng; 1245a1d8505SYingwei Zhengentry: 1255a1d8505SYingwei Zheng %p1 = getelementptr i16, ptr %base, i64 -4 1265a1d8505SYingwei Zheng %index = add i64 %a, 1 1275a1d8505SYingwei Zheng %p2 = getelementptr i32, ptr %p1, i64 %index 1285a1d8505SYingwei Zheng ret ptr %p2 1295a1d8505SYingwei Zheng} 1305a1d8505SYingwei Zheng 1315a1d8505SYingwei Zhengdefine ptr @test_non_const(ptr %base, i64 %a, i64 %b) { 1325a1d8505SYingwei Zheng; CHECK-LABEL: define ptr @test_non_const( 1335a1d8505SYingwei Zheng; CHECK-SAME: ptr [[BASE:%.*]], i64 [[A:%.*]], i64 [[B:%.*]]) { 1345a1d8505SYingwei Zheng; CHECK-NEXT: entry: 1355a1d8505SYingwei Zheng; CHECK-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[BASE]], i64 [[B]] 1365a1d8505SYingwei Zheng; CHECK-NEXT: [[TMP0:%.*]] = getelementptr i32, ptr [[P1]], i64 [[A]] 1375a1d8505SYingwei Zheng; CHECK-NEXT: [[P2:%.*]] = getelementptr i8, ptr [[TMP0]], i64 4 1385a1d8505SYingwei Zheng; CHECK-NEXT: ret ptr [[P2]] 1395a1d8505SYingwei Zheng; 1405a1d8505SYingwei Zhengentry: 1415a1d8505SYingwei Zheng %p1 = getelementptr i8, ptr %base, i64 %b 1425a1d8505SYingwei Zheng %index = add i64 %a, 1 1435a1d8505SYingwei Zheng %p2 = getelementptr i32, ptr %p1, i64 %index 1445a1d8505SYingwei Zheng ret ptr %p2 1455a1d8505SYingwei Zheng} 1465a1d8505SYingwei Zheng 1475a1d8505SYingwei Zhengdefine ptr @test_too_many_indices(ptr %base, i64 %a, i64 %b) { 1485a1d8505SYingwei Zheng; CHECK-LABEL: define ptr @test_too_many_indices( 1495a1d8505SYingwei Zheng; CHECK-SAME: ptr [[BASE:%.*]], i64 [[A:%.*]], i64 [[B:%.*]]) { 1505a1d8505SYingwei Zheng; CHECK-NEXT: entry: 1515a1d8505SYingwei Zheng; CHECK-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[BASE]], i64 [[B]] 1525a1d8505SYingwei Zheng; CHECK-NEXT: [[INDEX:%.*]] = add i64 [[A]], 1 1535a1d8505SYingwei Zheng; CHECK-NEXT: [[P2:%.*]] = getelementptr [8 x i32], ptr [[P1]], i64 1, i64 [[INDEX]] 1545a1d8505SYingwei Zheng; CHECK-NEXT: ret ptr [[P2]] 1555a1d8505SYingwei Zheng; 1565a1d8505SYingwei Zhengentry: 1575a1d8505SYingwei Zheng %p1 = getelementptr i8, ptr %base, i64 %b 1585a1d8505SYingwei Zheng %index = add i64 %a, 1 1595a1d8505SYingwei Zheng %p2 = getelementptr [8 x i32], ptr %p1, i64 1, i64 %index 1605a1d8505SYingwei Zheng ret ptr %p2 1615a1d8505SYingwei Zheng} 1625a1d8505SYingwei Zheng 1635a1d8505SYingwei Zhengdefine ptr @test_wrong_op(ptr %base, i64 %a) { 1645a1d8505SYingwei Zheng; CHECK-LABEL: define ptr @test_wrong_op( 1655a1d8505SYingwei Zheng; CHECK-SAME: ptr [[BASE:%.*]], i64 [[A:%.*]]) { 1665a1d8505SYingwei Zheng; CHECK-NEXT: entry: 1675a1d8505SYingwei Zheng; CHECK-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[BASE]], i64 -4 1685a1d8505SYingwei Zheng; CHECK-NEXT: [[INDEX:%.*]] = xor i64 [[A]], 1 1695a1d8505SYingwei Zheng; CHECK-NEXT: [[P2:%.*]] = getelementptr i32, ptr [[P1]], i64 [[INDEX]] 1705a1d8505SYingwei Zheng; CHECK-NEXT: ret ptr [[P2]] 1715a1d8505SYingwei Zheng; 1725a1d8505SYingwei Zhengentry: 1735a1d8505SYingwei Zheng %p1 = getelementptr i8, ptr %base, i64 -4 1745a1d8505SYingwei Zheng %index = xor i64 %a, 1 1755a1d8505SYingwei Zheng %p2 = getelementptr i32, ptr %p1, i64 %index 1765a1d8505SYingwei Zheng ret ptr %p2 1775a1d8505SYingwei Zheng} 1785a1d8505SYingwei Zheng 1795a1d8505SYingwei Zhengdefine ptr @test_sext_add_without_nsw(ptr %base, i32 %a) { 1805a1d8505SYingwei Zheng; CHECK-LABEL: define ptr @test_sext_add_without_nsw( 1815a1d8505SYingwei Zheng; CHECK-SAME: ptr [[BASE:%.*]], i32 [[A:%.*]]) { 1825a1d8505SYingwei Zheng; CHECK-NEXT: entry: 1835a1d8505SYingwei Zheng; CHECK-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[BASE]], i64 -4 1845a1d8505SYingwei Zheng; CHECK-NEXT: [[INDEX:%.*]] = add i32 [[A]], 1 1855a1d8505SYingwei Zheng; CHECK-NEXT: [[TMP0:%.*]] = sext i32 [[INDEX]] to i64 1865a1d8505SYingwei Zheng; CHECK-NEXT: [[P2:%.*]] = getelementptr i32, ptr [[P1]], i64 [[TMP0]] 1875a1d8505SYingwei Zheng; CHECK-NEXT: ret ptr [[P2]] 1885a1d8505SYingwei Zheng; 1895a1d8505SYingwei Zhengentry: 1905a1d8505SYingwei Zheng %p1 = getelementptr i8, ptr %base, i64 -4 1915a1d8505SYingwei Zheng %index = add i32 %a, 1 1925a1d8505SYingwei Zheng %p2 = getelementptr i32, ptr %p1, i32 %index 1935a1d8505SYingwei Zheng ret ptr %p2 1945a1d8505SYingwei Zheng} 1955a1d8505SYingwei Zheng 1965a1d8505SYingwei Zhengdefine ptr @test_or_without_disjoint(ptr %base, i64 %a) { 1975a1d8505SYingwei Zheng; CHECK-LABEL: define ptr @test_or_without_disjoint( 1985a1d8505SYingwei Zheng; CHECK-SAME: ptr [[BASE:%.*]], i64 [[A:%.*]]) { 1995a1d8505SYingwei Zheng; CHECK-NEXT: entry: 2005a1d8505SYingwei Zheng; CHECK-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[BASE]], i64 -4 2015a1d8505SYingwei Zheng; CHECK-NEXT: [[INDEX:%.*]] = or i64 [[A]], 1 2025a1d8505SYingwei Zheng; CHECK-NEXT: [[P2:%.*]] = getelementptr i32, ptr [[P1]], i64 [[INDEX]] 2035a1d8505SYingwei Zheng; CHECK-NEXT: ret ptr [[P2]] 2045a1d8505SYingwei Zheng; 2055a1d8505SYingwei Zhengentry: 2065a1d8505SYingwei Zheng %p1 = getelementptr i8, ptr %base, i64 -4 2075a1d8505SYingwei Zheng %index = or i64 %a, 1 2085a1d8505SYingwei Zheng %p2 = getelementptr i32, ptr %p1, i64 %index 2095a1d8505SYingwei Zheng ret ptr %p2 2105a1d8505SYingwei Zheng} 2115a1d8505SYingwei Zheng 2125a1d8505SYingwei Zhengdefine ptr @test_smul_overflow(ptr %base, i64 %a) { 2135a1d8505SYingwei Zheng; CHECK-LABEL: define ptr @test_smul_overflow( 2145a1d8505SYingwei Zheng; CHECK-SAME: ptr [[BASE:%.*]], i64 [[A:%.*]]) { 2155a1d8505SYingwei Zheng; CHECK-NEXT: entry: 2165a1d8505SYingwei Zheng; CHECK-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[BASE]], i64 -12 2175a1d8505SYingwei Zheng; CHECK-NEXT: [[TMP0:%.*]] = getelementptr i32, ptr [[P1]], i64 [[A]] 2185a1d8505SYingwei Zheng; CHECK-NEXT: ret ptr [[TMP0]] 2195a1d8505SYingwei Zheng; 2205a1d8505SYingwei Zhengentry: 2215a1d8505SYingwei Zheng %p1 = getelementptr i8, ptr %base, i64 -4 2225a1d8505SYingwei Zheng %index = add i64 %a, 9223372036854775806 2235a1d8505SYingwei Zheng %p2 = getelementptr i32, ptr %p1, i64 %index 2245a1d8505SYingwei Zheng ret ptr %p2 2255a1d8505SYingwei Zheng} 2265a1d8505SYingwei Zheng 2275a1d8505SYingwei Zhengdefine ptr @test_sadd_overflow(ptr %base, i64 %a) { 2285a1d8505SYingwei Zheng; CHECK-LABEL: define ptr @test_sadd_overflow( 2295a1d8505SYingwei Zheng; CHECK-SAME: ptr [[BASE:%.*]], i64 [[A:%.*]]) { 2305a1d8505SYingwei Zheng; CHECK-NEXT: entry: 2315a1d8505SYingwei Zheng; CHECK-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[BASE]], i64 -9223372036854775808 2325a1d8505SYingwei Zheng; CHECK-NEXT: [[TMP0:%.*]] = getelementptr i32, ptr [[P1]], i64 [[A]] 2335a1d8505SYingwei Zheng; CHECK-NEXT: ret ptr [[TMP0]] 2345a1d8505SYingwei Zheng; 2355a1d8505SYingwei Zhengentry: 2365a1d8505SYingwei Zheng %p1 = getelementptr i8, ptr %base, i64 9223372036854775804 2375a1d8505SYingwei Zheng %index = add i64 %a, 1 2385a1d8505SYingwei Zheng %p2 = getelementptr i32, ptr %p1, i64 %index 2395a1d8505SYingwei Zheng ret ptr %p2 2405a1d8505SYingwei Zheng} 2415a1d8505SYingwei Zheng 2425a1d8505SYingwei Zhengdefine ptr @test_nonzero_multiuse_index(ptr %base, i64 %a) { 2435a1d8505SYingwei Zheng; CHECK-LABEL: define ptr @test_nonzero_multiuse_index( 2445a1d8505SYingwei Zheng; CHECK-SAME: ptr [[BASE:%.*]], i64 [[A:%.*]]) { 2455a1d8505SYingwei Zheng; CHECK-NEXT: entry: 2465a1d8505SYingwei Zheng; CHECK-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[BASE]], i64 -4 2475a1d8505SYingwei Zheng; CHECK-NEXT: [[INDEX:%.*]] = add i64 [[A]], 2 2485a1d8505SYingwei Zheng; CHECK-NEXT: call void @use64(i64 [[INDEX]]) 2495a1d8505SYingwei Zheng; CHECK-NEXT: [[P2:%.*]] = getelementptr i32, ptr [[P1]], i64 [[INDEX]] 2505a1d8505SYingwei Zheng; CHECK-NEXT: ret ptr [[P2]] 2515a1d8505SYingwei Zheng; 2525a1d8505SYingwei Zhengentry: 2535a1d8505SYingwei Zheng %p1 = getelementptr i8, ptr %base, i64 -4 2545a1d8505SYingwei Zheng %index = add i64 %a, 2 2555a1d8505SYingwei Zheng call void @use64(i64 %index) 2565a1d8505SYingwei Zheng %p2 = getelementptr i32, ptr %p1, i64 %index 2575a1d8505SYingwei Zheng ret ptr %p2 2585a1d8505SYingwei Zheng} 2595a1d8505SYingwei Zheng 2605a1d8505SYingwei Zhengdefine ptr @test_nonzero_multiuse_ptr(ptr %base, i64 %a) { 2615a1d8505SYingwei Zheng; CHECK-LABEL: define ptr @test_nonzero_multiuse_ptr( 2625a1d8505SYingwei Zheng; CHECK-SAME: ptr [[BASE:%.*]], i64 [[A:%.*]]) { 2635a1d8505SYingwei Zheng; CHECK-NEXT: entry: 2645a1d8505SYingwei Zheng; CHECK-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[BASE]], i64 -4 2655a1d8505SYingwei Zheng; CHECK-NEXT: call void @useptr(ptr [[P1]]) 2665a1d8505SYingwei Zheng; CHECK-NEXT: [[TMP0:%.*]] = getelementptr i32, ptr [[P1]], i64 [[A]] 2675a1d8505SYingwei Zheng; CHECK-NEXT: [[P2:%.*]] = getelementptr i8, ptr [[TMP0]], i64 8 2685a1d8505SYingwei Zheng; CHECK-NEXT: ret ptr [[P2]] 2695a1d8505SYingwei Zheng; 2705a1d8505SYingwei Zhengentry: 2715a1d8505SYingwei Zheng %p1 = getelementptr i8, ptr %base, i64 -4 2725a1d8505SYingwei Zheng call void @useptr(ptr %p1) 2735a1d8505SYingwei Zheng %index = add i64 %a, 2 2745a1d8505SYingwei Zheng %p2 = getelementptr i32, ptr %p1, i64 %index 2755a1d8505SYingwei Zheng ret ptr %p2 2765a1d8505SYingwei Zheng} 2775a1d8505SYingwei Zheng 2785a1d8505SYingwei Zhengdefine ptr @test_scalable(ptr %base, i64 %a) { 2795a1d8505SYingwei Zheng; CHECK-LABEL: define ptr @test_scalable( 2805a1d8505SYingwei Zheng; CHECK-SAME: ptr [[BASE:%.*]], i64 [[A:%.*]]) { 2815a1d8505SYingwei Zheng; CHECK-NEXT: entry: 2825a1d8505SYingwei Zheng; CHECK-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[BASE]], i64 -4 283*74aa1abfSNikita Popov; CHECK-NEXT: [[INDEX:%.*]] = add i64 [[A]], 1 284*74aa1abfSNikita Popov; CHECK-NEXT: [[TMP0:%.*]] = call i64 @llvm.vscale.i64() 285*74aa1abfSNikita Popov; CHECK-NEXT: [[TMP1:%.*]] = shl i64 [[TMP0]], 4 286*74aa1abfSNikita Popov; CHECK-NEXT: [[P2_IDX:%.*]] = mul i64 [[INDEX]], [[TMP1]] 287*74aa1abfSNikita Popov; CHECK-NEXT: [[P2:%.*]] = getelementptr i8, ptr [[P1]], i64 [[P2_IDX]] 2885a1d8505SYingwei Zheng; CHECK-NEXT: ret ptr [[P2]] 2895a1d8505SYingwei Zheng; 2905a1d8505SYingwei Zhengentry: 2915a1d8505SYingwei Zheng %p1 = getelementptr i8, ptr %base, i64 -4 2925a1d8505SYingwei Zheng %index = add i64 %a, 1 2935a1d8505SYingwei Zheng %p2 = getelementptr <vscale x 4 x i32>, ptr %p1, i64 %index 2945a1d8505SYingwei Zheng ret ptr %p2 2955a1d8505SYingwei Zheng} 296