1f7247d50SLiqinWeng; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 3 2f7247d50SLiqinWeng; RUN: opt < %s -passes=instcombine -S | FileCheck %s 3f7247d50SLiqinWeng 4f7247d50SLiqinWengdefine void @test(ptr %ptr, i32 %a, i32 %b) { 5f7247d50SLiqinWeng; CHECK-LABEL: define void @test( 6f7247d50SLiqinWeng; CHECK-SAME: ptr [[PTR:%.*]], i32 [[A:%.*]], i32 [[B:%.*]]) { 7f7247d50SLiqinWeng; CHECK-NEXT: entry: 8f7247d50SLiqinWeng; CHECK-NEXT: [[TMP0:%.*]] = sext i32 [[A]] to i64 9f7247d50SLiqinWeng; CHECK-NEXT: [[TMP1:%.*]] = getelementptr i32, ptr [[PTR]], i64 [[TMP0]] 1090ba3309SNikita Popov; CHECK-NEXT: [[GEP:%.*]] = getelementptr i8, ptr [[TMP1]], i64 40 11f7247d50SLiqinWeng; CHECK-NEXT: store i32 [[B]], ptr [[GEP]], align 4 12f7247d50SLiqinWeng; CHECK-NEXT: ret void 13f7247d50SLiqinWeng; 14f7247d50SLiqinWengentry: 15f7247d50SLiqinWeng %add = add nsw i32 %a, 10 16f7247d50SLiqinWeng %idx = sext i32 %add to i64 17f7247d50SLiqinWeng %gep = getelementptr inbounds i32, ptr %ptr, i64 %idx 18f7247d50SLiqinWeng store i32 %b, ptr %gep 19f7247d50SLiqinWeng ret void 20f7247d50SLiqinWeng} 21f7247d50SLiqinWeng 22f7247d50SLiqinWengdefine i32 @test_add_res_moreoneuse(ptr %ptr, i32 %a, i32 %b) { 23f7247d50SLiqinWeng; CHECK-LABEL: define i32 @test_add_res_moreoneuse( 24f7247d50SLiqinWeng; CHECK-SAME: ptr [[PTR:%.*]], i32 [[A:%.*]], i32 [[B:%.*]]) { 25f7247d50SLiqinWeng; CHECK-NEXT: entry: 26f7247d50SLiqinWeng; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[A]], 5 27f7247d50SLiqinWeng; CHECK-NEXT: [[IDX:%.*]] = sext i32 [[ADD]] to i64 28f7247d50SLiqinWeng; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds i32, ptr [[PTR]], i64 [[IDX]] 29f7247d50SLiqinWeng; CHECK-NEXT: store i32 [[B]], ptr [[GEP]], align 4 30f7247d50SLiqinWeng; CHECK-NEXT: ret i32 [[ADD]] 31f7247d50SLiqinWeng; 32f7247d50SLiqinWengentry: 33f7247d50SLiqinWeng %add = add nsw i32 %a, 5 34f7247d50SLiqinWeng %idx = sext i32 %add to i64 35f7247d50SLiqinWeng %gep = getelementptr inbounds i32, ptr %ptr, i64 %idx 36f7247d50SLiqinWeng store i32 %b, ptr %gep 37f7247d50SLiqinWeng ret i32 %add 38f7247d50SLiqinWeng} 39f7247d50SLiqinWeng 40f7247d50SLiqinWengdefine void @test_addop_nonsw_flag(ptr %ptr, i32 %a, i32 %b) { 41f7247d50SLiqinWeng; CHECK-LABEL: define void @test_addop_nonsw_flag( 42f7247d50SLiqinWeng; CHECK-SAME: ptr [[PTR:%.*]], i32 [[A:%.*]], i32 [[B:%.*]]) { 43f7247d50SLiqinWeng; CHECK-NEXT: entry: 44f7247d50SLiqinWeng; CHECK-NEXT: [[ADD:%.*]] = add i32 [[A]], 10 45f7247d50SLiqinWeng; CHECK-NEXT: [[IDX:%.*]] = sext i32 [[ADD]] to i64 46f7247d50SLiqinWeng; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds i32, ptr [[PTR]], i64 [[IDX]] 47f7247d50SLiqinWeng; CHECK-NEXT: store i32 [[B]], ptr [[GEP]], align 4 48f7247d50SLiqinWeng; CHECK-NEXT: ret void 49f7247d50SLiqinWeng; 50f7247d50SLiqinWengentry: 51f7247d50SLiqinWeng %add = add i32 %a, 10 52f7247d50SLiqinWeng %idx = sext i32 %add to i64 53f7247d50SLiqinWeng %gep = getelementptr inbounds i32, ptr %ptr, i64 %idx 54f7247d50SLiqinWeng store i32 %b, ptr %gep 55f7247d50SLiqinWeng ret void 56f7247d50SLiqinWeng} 57f7247d50SLiqinWeng 58f7247d50SLiqinWengdefine void @test_add_op2_not_constant(ptr %ptr, i32 %a, i32 %b) { 59f7247d50SLiqinWeng; CHECK-LABEL: define void @test_add_op2_not_constant( 60f7247d50SLiqinWeng; CHECK-SAME: ptr [[PTR:%.*]], i32 [[A:%.*]], i32 [[B:%.*]]) { 61f7247d50SLiqinWeng; CHECK-NEXT: entry: 62f7247d50SLiqinWeng; CHECK-NEXT: [[ADD:%.*]] = add i32 [[A]], [[B]] 63f7247d50SLiqinWeng; CHECK-NEXT: [[IDX:%.*]] = sext i32 [[ADD]] to i64 64f7247d50SLiqinWeng; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds i32, ptr [[PTR]], i64 [[IDX]] 65f7247d50SLiqinWeng; CHECK-NEXT: store i32 [[B]], ptr [[GEP]], align 4 66f7247d50SLiqinWeng; CHECK-NEXT: ret void 67f7247d50SLiqinWeng; 68f7247d50SLiqinWengentry: 69f7247d50SLiqinWeng %add = add i32 %a, %b 70f7247d50SLiqinWeng %idx = sext i32 %add to i64 71f7247d50SLiqinWeng %gep = getelementptr inbounds i32, ptr %ptr, i64 %idx 72f7247d50SLiqinWeng store i32 %b, ptr %gep 73f7247d50SLiqinWeng ret void 74f7247d50SLiqinWeng} 754d711243SNikita Popov 764d711243SNikita Popovdefine void @test_zext_nneg(ptr %ptr, i32 %a, i32 %b) { 774d711243SNikita Popov; CHECK-LABEL: define void @test_zext_nneg( 784d711243SNikita Popov; CHECK-SAME: ptr [[PTR:%.*]], i32 [[A:%.*]], i32 [[B:%.*]]) { 794d711243SNikita Popov; CHECK-NEXT: entry: 80b8df88b4SNikita Popov; CHECK-NEXT: [[TMP0:%.*]] = sext i32 [[A]] to i64 81b8df88b4SNikita Popov; CHECK-NEXT: [[TMP1:%.*]] = getelementptr i32, ptr [[PTR]], i64 [[TMP0]] 8290ba3309SNikita Popov; CHECK-NEXT: [[GEP:%.*]] = getelementptr i8, ptr [[TMP1]], i64 40 834d711243SNikita Popov; CHECK-NEXT: store i32 [[B]], ptr [[GEP]], align 4 844d711243SNikita Popov; CHECK-NEXT: ret void 854d711243SNikita Popov; 864d711243SNikita Popoventry: 874d711243SNikita Popov %add = add nsw i32 %a, 10 884d711243SNikita Popov %idx = zext nneg i32 %add to i64 894d711243SNikita Popov %gep = getelementptr inbounds i32, ptr %ptr, i64 %idx 904d711243SNikita Popov store i32 %b, ptr %gep 914d711243SNikita Popov ret void 924d711243SNikita Popov} 934d711243SNikita Popov 944d711243SNikita Popovdefine void @test_zext_missing_nneg(ptr %ptr, i32 %a, i32 %b) { 954d711243SNikita Popov; CHECK-LABEL: define void @test_zext_missing_nneg( 964d711243SNikita Popov; CHECK-SAME: ptr [[PTR:%.*]], i32 [[A:%.*]], i32 [[B:%.*]]) { 974d711243SNikita Popov; CHECK-NEXT: entry: 984d711243SNikita Popov; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[A]], 10 994d711243SNikita Popov; CHECK-NEXT: [[IDX:%.*]] = zext i32 [[ADD]] to i64 100*462cb3cdSNikita Popov; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds nuw i32, ptr [[PTR]], i64 [[IDX]] 1014d711243SNikita Popov; CHECK-NEXT: store i32 [[B]], ptr [[GEP]], align 4 1024d711243SNikita Popov; CHECK-NEXT: ret void 1034d711243SNikita Popov; 1044d711243SNikita Popoventry: 1054d711243SNikita Popov %add = add nsw i32 %a, 10 1064d711243SNikita Popov %idx = zext i32 %add to i64 1074d711243SNikita Popov %gep = getelementptr inbounds i32, ptr %ptr, i64 %idx 1084d711243SNikita Popov store i32 %b, ptr %gep 1094d711243SNikita Popov ret void 1104d711243SNikita Popov} 111c8edf11dSNikita Popov 112c8edf11dSNikita Popovdefine ptr @gep_inbounds_add_nsw_nonneg(ptr %ptr, i64 %a, i64 %b) { 113c8edf11dSNikita Popov; CHECK-LABEL: define ptr @gep_inbounds_add_nsw_nonneg( 114c8edf11dSNikita Popov; CHECK-SAME: ptr [[PTR:%.*]], i64 [[A:%.*]], i64 [[B:%.*]]) { 115c8edf11dSNikita Popov; CHECK-NEXT: [[A_NNEG:%.*]] = icmp sgt i64 [[A]], -1 116c8edf11dSNikita Popov; CHECK-NEXT: call void @llvm.assume(i1 [[A_NNEG]]) 117c8edf11dSNikita Popov; CHECK-NEXT: [[B_NNEG:%.*]] = icmp sgt i64 [[B]], -1 118c8edf11dSNikita Popov; CHECK-NEXT: call void @llvm.assume(i1 [[B_NNEG]]) 119*462cb3cdSNikita Popov; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw i32, ptr [[PTR]], i64 [[A]] 120*462cb3cdSNikita Popov; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds nuw i32, ptr [[TMP1]], i64 [[B]] 121c8edf11dSNikita Popov; CHECK-NEXT: ret ptr [[GEP]] 122c8edf11dSNikita Popov; 123c8edf11dSNikita Popov %a.nneg = icmp sgt i64 %a, -1 124c8edf11dSNikita Popov call void @llvm.assume(i1 %a.nneg) 125c8edf11dSNikita Popov %b.nneg = icmp sgt i64 %b, -1 126c8edf11dSNikita Popov call void @llvm.assume(i1 %b.nneg) 127c8edf11dSNikita Popov %add = add nsw i64 %a, %b 128c8edf11dSNikita Popov %gep = getelementptr inbounds i32, ptr %ptr, i64 %add 129c8edf11dSNikita Popov ret ptr %gep 130c8edf11dSNikita Popov} 131c8edf11dSNikita Popov 132c8edf11dSNikita Popovdefine ptr @gep_inbounds_add_nsw_not_nonneg1(ptr %ptr, i64 %a, i64 %b) { 133c8edf11dSNikita Popov; CHECK-LABEL: define ptr @gep_inbounds_add_nsw_not_nonneg1( 134c8edf11dSNikita Popov; CHECK-SAME: ptr [[PTR:%.*]], i64 [[A:%.*]], i64 [[B:%.*]]) { 135c8edf11dSNikita Popov; CHECK-NEXT: [[A_NNEG:%.*]] = icmp sgt i64 [[A]], -1 136c8edf11dSNikita Popov; CHECK-NEXT: call void @llvm.assume(i1 [[A_NNEG]]) 137c8edf11dSNikita Popov; CHECK-NEXT: [[TMP1:%.*]] = getelementptr i32, ptr [[PTR]], i64 [[A]] 138c8edf11dSNikita Popov; CHECK-NEXT: [[GEP:%.*]] = getelementptr i32, ptr [[TMP1]], i64 [[B]] 139c8edf11dSNikita Popov; CHECK-NEXT: ret ptr [[GEP]] 140c8edf11dSNikita Popov; 141c8edf11dSNikita Popov %a.nneg = icmp sgt i64 %a, -1 142c8edf11dSNikita Popov call void @llvm.assume(i1 %a.nneg) 143c8edf11dSNikita Popov %add = add nsw i64 %a, %b 144c8edf11dSNikita Popov %gep = getelementptr inbounds i32, ptr %ptr, i64 %add 145c8edf11dSNikita Popov ret ptr %gep 146c8edf11dSNikita Popov} 147c8edf11dSNikita Popov 148c8edf11dSNikita Popovdefine ptr @gep_inbounds_add_nsw_not_nonneg2(ptr %ptr, i64 %a, i64 %b) { 149c8edf11dSNikita Popov; CHECK-LABEL: define ptr @gep_inbounds_add_nsw_not_nonneg2( 150c8edf11dSNikita Popov; CHECK-SAME: ptr [[PTR:%.*]], i64 [[A:%.*]], i64 [[B:%.*]]) { 151c8edf11dSNikita Popov; CHECK-NEXT: [[B_NNEG:%.*]] = icmp sgt i64 [[B]], -1 152c8edf11dSNikita Popov; CHECK-NEXT: call void @llvm.assume(i1 [[B_NNEG]]) 153c8edf11dSNikita Popov; CHECK-NEXT: [[TMP1:%.*]] = getelementptr i32, ptr [[PTR]], i64 [[A]] 154c8edf11dSNikita Popov; CHECK-NEXT: [[GEP:%.*]] = getelementptr i32, ptr [[TMP1]], i64 [[B]] 155c8edf11dSNikita Popov; CHECK-NEXT: ret ptr [[GEP]] 156c8edf11dSNikita Popov; 157c8edf11dSNikita Popov %b.nneg = icmp sgt i64 %b, -1 158c8edf11dSNikita Popov call void @llvm.assume(i1 %b.nneg) 159c8edf11dSNikita Popov %add = add nsw i64 %a, %b 160c8edf11dSNikita Popov %gep = getelementptr inbounds i32, ptr %ptr, i64 %add 161c8edf11dSNikita Popov ret ptr %gep 162c8edf11dSNikita Popov} 163c8edf11dSNikita Popov 164c8edf11dSNikita Popovdefine ptr @gep_not_inbounds_add_nsw_nonneg(ptr %ptr, i64 %a, i64 %b) { 165c8edf11dSNikita Popov; CHECK-LABEL: define ptr @gep_not_inbounds_add_nsw_nonneg( 166c8edf11dSNikita Popov; CHECK-SAME: ptr [[PTR:%.*]], i64 [[A:%.*]], i64 [[B:%.*]]) { 167c8edf11dSNikita Popov; CHECK-NEXT: [[A_NNEG:%.*]] = icmp sgt i64 [[A]], -1 168c8edf11dSNikita Popov; CHECK-NEXT: call void @llvm.assume(i1 [[A_NNEG]]) 169c8edf11dSNikita Popov; CHECK-NEXT: [[B_NNEG:%.*]] = icmp sgt i64 [[B]], -1 170c8edf11dSNikita Popov; CHECK-NEXT: call void @llvm.assume(i1 [[B_NNEG]]) 171c8edf11dSNikita Popov; CHECK-NEXT: [[TMP1:%.*]] = getelementptr i32, ptr [[PTR]], i64 [[A]] 172c8edf11dSNikita Popov; CHECK-NEXT: [[GEP:%.*]] = getelementptr i32, ptr [[TMP1]], i64 [[B]] 173c8edf11dSNikita Popov; CHECK-NEXT: ret ptr [[GEP]] 174c8edf11dSNikita Popov; 175c8edf11dSNikita Popov %a.nneg = icmp sgt i64 %a, -1 176c8edf11dSNikita Popov call void @llvm.assume(i1 %a.nneg) 177c8edf11dSNikita Popov %b.nneg = icmp sgt i64 %b, -1 178c8edf11dSNikita Popov call void @llvm.assume(i1 %b.nneg) 179c8edf11dSNikita Popov %add = add nsw i64 %a, %b 180c8edf11dSNikita Popov %gep = getelementptr i32, ptr %ptr, i64 %add 181c8edf11dSNikita Popov ret ptr %gep 182c8edf11dSNikita Popov} 183c8edf11dSNikita Popov 184c8edf11dSNikita Popovdefine ptr @gep_inbounds_add_not_nsw_nonneg(ptr %ptr, i64 %a, i64 %b) { 185c8edf11dSNikita Popov; CHECK-LABEL: define ptr @gep_inbounds_add_not_nsw_nonneg( 186c8edf11dSNikita Popov; CHECK-SAME: ptr [[PTR:%.*]], i64 [[A:%.*]], i64 [[B:%.*]]) { 187c8edf11dSNikita Popov; CHECK-NEXT: [[A_NNEG:%.*]] = icmp sgt i64 [[A]], -1 188c8edf11dSNikita Popov; CHECK-NEXT: call void @llvm.assume(i1 [[A_NNEG]]) 189c8edf11dSNikita Popov; CHECK-NEXT: [[B_NNEG:%.*]] = icmp sgt i64 [[B]], -1 190c8edf11dSNikita Popov; CHECK-NEXT: call void @llvm.assume(i1 [[B_NNEG]]) 191c8edf11dSNikita Popov; CHECK-NEXT: [[TMP1:%.*]] = getelementptr i32, ptr [[PTR]], i64 [[A]] 192c8edf11dSNikita Popov; CHECK-NEXT: [[GEP:%.*]] = getelementptr i32, ptr [[TMP1]], i64 [[B]] 193c8edf11dSNikita Popov; CHECK-NEXT: ret ptr [[GEP]] 194c8edf11dSNikita Popov; 195c8edf11dSNikita Popov %a.nneg = icmp sgt i64 %a, -1 196c8edf11dSNikita Popov call void @llvm.assume(i1 %a.nneg) 197c8edf11dSNikita Popov %b.nneg = icmp sgt i64 %b, -1 198c8edf11dSNikita Popov call void @llvm.assume(i1 %b.nneg) 199c8edf11dSNikita Popov %add = add i64 %a, %b 200c8edf11dSNikita Popov %gep = getelementptr inbounds i32, ptr %ptr, i64 %add 201c8edf11dSNikita Popov ret ptr %gep 202c8edf11dSNikita Popov} 203c8edf11dSNikita Popov 204c8edf11dSNikita Popovdefine ptr @gep_inbounds_sext_add_nonneg(ptr %ptr, i32 %a) { 205c8edf11dSNikita Popov; CHECK-LABEL: define ptr @gep_inbounds_sext_add_nonneg( 206c8edf11dSNikita Popov; CHECK-SAME: ptr [[PTR:%.*]], i32 [[A:%.*]]) { 207c8edf11dSNikita Popov; CHECK-NEXT: [[A_NNEG:%.*]] = icmp sgt i32 [[A]], -1 208c8edf11dSNikita Popov; CHECK-NEXT: call void @llvm.assume(i1 [[A_NNEG]]) 209c8edf11dSNikita Popov; CHECK-NEXT: [[TMP1:%.*]] = zext nneg i32 [[A]] to i64 210*462cb3cdSNikita Popov; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds nuw i32, ptr [[PTR]], i64 [[TMP1]] 211*462cb3cdSNikita Popov; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds nuw i8, ptr [[TMP2]], i64 40 212c8edf11dSNikita Popov; CHECK-NEXT: ret ptr [[GEP]] 213c8edf11dSNikita Popov; 214c8edf11dSNikita Popov %a.nneg = icmp sgt i32 %a, -1 215c8edf11dSNikita Popov call void @llvm.assume(i1 %a.nneg) 216c8edf11dSNikita Popov %add = add nsw i32 %a, 10 217c8edf11dSNikita Popov %idx = sext i32 %add to i64 218c8edf11dSNikita Popov %gep = getelementptr inbounds i32, ptr %ptr, i64 %idx 219c8edf11dSNikita Popov ret ptr %gep 220c8edf11dSNikita Popov} 221c8edf11dSNikita Popov 222c8edf11dSNikita Popovdefine ptr @gep_inbounds_sext_add_not_nonneg_1(ptr %ptr, i32 %a) { 223c8edf11dSNikita Popov; CHECK-LABEL: define ptr @gep_inbounds_sext_add_not_nonneg_1( 224c8edf11dSNikita Popov; CHECK-SAME: ptr [[PTR:%.*]], i32 [[A:%.*]]) { 225c8edf11dSNikita Popov; CHECK-NEXT: [[A_NNEG:%.*]] = icmp sgt i32 [[A]], -1 226c8edf11dSNikita Popov; CHECK-NEXT: call void @llvm.assume(i1 [[A_NNEG]]) 227c8edf11dSNikita Popov; CHECK-NEXT: [[TMP1:%.*]] = zext nneg i32 [[A]] to i64 228c8edf11dSNikita Popov; CHECK-NEXT: [[TMP2:%.*]] = getelementptr i32, ptr [[PTR]], i64 [[TMP1]] 229c8edf11dSNikita Popov; CHECK-NEXT: [[GEP:%.*]] = getelementptr i8, ptr [[TMP2]], i64 -40 230c8edf11dSNikita Popov; CHECK-NEXT: ret ptr [[GEP]] 231c8edf11dSNikita Popov; 232c8edf11dSNikita Popov %a.nneg = icmp sgt i32 %a, -1 233c8edf11dSNikita Popov call void @llvm.assume(i1 %a.nneg) 234c8edf11dSNikita Popov %add = add nsw i32 %a, -10 235c8edf11dSNikita Popov %idx = sext i32 %add to i64 236c8edf11dSNikita Popov %gep = getelementptr inbounds i32, ptr %ptr, i64 %idx 237c8edf11dSNikita Popov ret ptr %gep 238c8edf11dSNikita Popov} 239c8edf11dSNikita Popov 240c8edf11dSNikita Popovdefine ptr @gep_inbounds_sext_add_not_nonneg_2(ptr %ptr, i32 %a) { 241c8edf11dSNikita Popov; CHECK-LABEL: define ptr @gep_inbounds_sext_add_not_nonneg_2( 242c8edf11dSNikita Popov; CHECK-SAME: ptr [[PTR:%.*]], i32 [[A:%.*]]) { 243c8edf11dSNikita Popov; CHECK-NEXT: [[TMP1:%.*]] = sext i32 [[A]] to i64 244c8edf11dSNikita Popov; CHECK-NEXT: [[TMP2:%.*]] = getelementptr i32, ptr [[PTR]], i64 [[TMP1]] 245c8edf11dSNikita Popov; CHECK-NEXT: [[GEP:%.*]] = getelementptr i8, ptr [[TMP2]], i64 40 246c8edf11dSNikita Popov; CHECK-NEXT: ret ptr [[GEP]] 247c8edf11dSNikita Popov; 248c8edf11dSNikita Popov %add = add nsw i32 %a, 10 249c8edf11dSNikita Popov %idx = sext i32 %add to i64 250c8edf11dSNikita Popov %gep = getelementptr inbounds i32, ptr %ptr, i64 %idx 251c8edf11dSNikita Popov ret ptr %gep 252c8edf11dSNikita Popov} 253c8edf11dSNikita Popov 254c8edf11dSNikita Popovdefine ptr @gep_not_inbounds_sext_add_nonneg(ptr %ptr, i32 %a) { 255c8edf11dSNikita Popov; CHECK-LABEL: define ptr @gep_not_inbounds_sext_add_nonneg( 256c8edf11dSNikita Popov; CHECK-SAME: ptr [[PTR:%.*]], i32 [[A:%.*]]) { 257c8edf11dSNikita Popov; CHECK-NEXT: [[A_NNEG:%.*]] = icmp sgt i32 [[A]], -1 258c8edf11dSNikita Popov; CHECK-NEXT: call void @llvm.assume(i1 [[A_NNEG]]) 259c8edf11dSNikita Popov; CHECK-NEXT: [[TMP1:%.*]] = zext nneg i32 [[A]] to i64 260c8edf11dSNikita Popov; CHECK-NEXT: [[TMP2:%.*]] = getelementptr i32, ptr [[PTR]], i64 [[TMP1]] 261c8edf11dSNikita Popov; CHECK-NEXT: [[GEP:%.*]] = getelementptr i8, ptr [[TMP2]], i64 40 262c8edf11dSNikita Popov; CHECK-NEXT: ret ptr [[GEP]] 263c8edf11dSNikita Popov; 264c8edf11dSNikita Popov %a.nneg = icmp sgt i32 %a, -1 265c8edf11dSNikita Popov call void @llvm.assume(i1 %a.nneg) 266c8edf11dSNikita Popov %add = add nsw i32 %a, 10 267c8edf11dSNikita Popov %idx = sext i32 %add to i64 268c8edf11dSNikita Popov %gep = getelementptr i32, ptr %ptr, i64 %idx 269c8edf11dSNikita Popov ret ptr %gep 270c8edf11dSNikita Popov} 271