Skip to content

Commit 6a5906d

Browse files
committed
handle inbounds
1 parent d1497fe commit 6a5906d

File tree

2 files changed

+109
-1
lines changed

2 files changed

+109
-1
lines changed

llvm/lib/Transforms/InstCombine/InstructionCombining.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2655,8 +2655,11 @@ static Instruction *canonicalizeGEPOfConstGEPI8(GetElementPtrInst &GEP,
26552655
GEPNoWrapFlags Flags = GEPNoWrapFlags::none();
26562656
if (GEP.hasNoUnsignedWrap() &&
26572657
cast<GEPOperator>(Src)->hasNoUnsignedWrap() &&
2658-
match(GEP.getOperand(1), m_NUWAddLike(m_Value(), m_Value())))
2658+
match(GEP.getOperand(1), m_NUWAddLike(m_Value(), m_Value()))) {
26592659
Flags |= GEPNoWrapFlags::noUnsignedWrap();
2660+
if (GEP.isInBounds() && cast<GEPOperator>(Src)->isInBounds())
2661+
Flags |= GEPNoWrapFlags::inBounds();
2662+
}
26602663

26612664
Value *GEPConst =
26622665
IC.Builder.CreatePtrAdd(Base, IC.Builder.getInt(NewOffset), "", Flags);

llvm/test/Transforms/InstCombine/gepofconstgepi8.ll

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -368,3 +368,108 @@ entry:
368368
%p2 = getelementptr nuw i32, ptr %p1, i64 %index
369369
ret ptr %p2
370370
}
371+
372+
define ptr @test_all_inbounds_nuw(ptr %base, i64 %a) {
373+
; CHECK-LABEL: define ptr @test_all_inbounds_nuw(
374+
; CHECK-SAME: ptr [[BASE:%.*]], i64 [[A:%.*]]) {
375+
; CHECK-NEXT: entry:
376+
; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds nuw i8, ptr [[BASE]], i64 9
377+
; CHECK-NEXT: [[P2:%.*]] = getelementptr inbounds nuw i32, ptr [[TMP0]], i64 [[A]]
378+
; CHECK-NEXT: ret ptr [[P2]]
379+
;
380+
entry:
381+
%p1 = getelementptr inbounds nuw i8, ptr %base, i64 1
382+
%index = add nuw i64 %a, 2
383+
%p2 = getelementptr inbounds nuw i32, ptr %p1, i64 %index
384+
ret ptr %p2
385+
}
386+
387+
define ptr @test_all_partial_inbounds1(ptr %base, i64 %a) {
388+
; CHECK-LABEL: define ptr @test_all_partial_inbounds1(
389+
; CHECK-SAME: ptr [[BASE:%.*]], i64 [[A:%.*]]) {
390+
; CHECK-NEXT: entry:
391+
; CHECK-NEXT: [[TMP0:%.*]] = getelementptr nuw i8, ptr [[BASE]], i64 9
392+
; CHECK-NEXT: [[P2:%.*]] = getelementptr nuw i32, ptr [[TMP0]], i64 [[A]]
393+
; CHECK-NEXT: ret ptr [[P2]]
394+
;
395+
entry:
396+
%p1 = getelementptr nuw i8, ptr %base, i64 1
397+
%index = add nuw i64 %a, 2
398+
%p2 = getelementptr inbounds nuw i32, ptr %p1, i64 %index
399+
ret ptr %p2
400+
}
401+
402+
define ptr @test_all_partial_inbounds2(ptr %base, i64 %a) {
403+
; CHECK-LABEL: define ptr @test_all_partial_inbounds2(
404+
; CHECK-SAME: ptr [[BASE:%.*]], i64 [[A:%.*]]) {
405+
; CHECK-NEXT: entry:
406+
; CHECK-NEXT: [[TMP0:%.*]] = getelementptr nuw i8, ptr [[BASE]], i64 9
407+
; CHECK-NEXT: [[P2:%.*]] = getelementptr nuw i32, ptr [[TMP0]], i64 [[A]]
408+
; CHECK-NEXT: ret ptr [[P2]]
409+
;
410+
entry:
411+
%p1 = getelementptr inbounds nuw i8, ptr %base, i64 1
412+
%index = add nuw i64 %a, 2
413+
%p2 = getelementptr nuw i32, ptr %p1, i64 %index
414+
ret ptr %p2
415+
}
416+
417+
define ptr @test_all_inbounds_partial_nuw1(ptr %base, i64 %a) {
418+
; CHECK-LABEL: define ptr @test_all_inbounds_partial_nuw1(
419+
; CHECK-SAME: ptr [[BASE:%.*]], i64 [[A:%.*]]) {
420+
; CHECK-NEXT: entry:
421+
; CHECK-NEXT: [[TMP0:%.*]] = getelementptr i8, ptr [[BASE]], i64 7
422+
; CHECK-NEXT: [[P2:%.*]] = getelementptr i32, ptr [[TMP0]], i64 [[A]]
423+
; CHECK-NEXT: ret ptr [[P2]]
424+
;
425+
entry:
426+
%p1 = getelementptr inbounds i8, ptr %base, i64 -1
427+
%index = add nuw i64 %a, 2
428+
%p2 = getelementptr inbounds nuw i32, ptr %p1, i64 %index
429+
ret ptr %p2
430+
}
431+
432+
define ptr @test_all_inbounds_partial_nuw2(ptr %base, i64 %a) {
433+
; CHECK-LABEL: define ptr @test_all_inbounds_partial_nuw2(
434+
; CHECK-SAME: ptr [[BASE:%.*]], i64 [[A:%.*]]) {
435+
; CHECK-NEXT: entry:
436+
; CHECK-NEXT: [[TMP0:%.*]] = getelementptr i8, ptr [[BASE]], i64 9
437+
; CHECK-NEXT: [[P2:%.*]] = getelementptr i32, ptr [[TMP0]], i64 [[A]]
438+
; CHECK-NEXT: ret ptr [[P2]]
439+
;
440+
entry:
441+
%p1 = getelementptr inbounds nuw i8, ptr %base, i64 1
442+
%index = add nuw i64 %a, 2
443+
%p2 = getelementptr inbounds i32, ptr %p1, i64 %index
444+
ret ptr %p2
445+
}
446+
447+
define ptr @test_all_inbounds_partial_nuw3(ptr %base, i64 %a) {
448+
; CHECK-LABEL: define ptr @test_all_inbounds_partial_nuw3(
449+
; CHECK-SAME: ptr [[BASE:%.*]], i64 [[A:%.*]]) {
450+
; CHECK-NEXT: entry:
451+
; CHECK-NEXT: [[TMP0:%.*]] = getelementptr i8, ptr [[BASE]], i64 9
452+
; CHECK-NEXT: [[P2:%.*]] = getelementptr i32, ptr [[TMP0]], i64 [[A]]
453+
; CHECK-NEXT: ret ptr [[P2]]
454+
;
455+
entry:
456+
%p1 = getelementptr inbounds nuw i8, ptr %base, i64 1
457+
%index = add i64 %a, 2
458+
%p2 = getelementptr inbounds nuw i32, ptr %p1, i64 %index
459+
ret ptr %p2
460+
}
461+
462+
define ptr @test_all_nusw_nuw(ptr %base, i64 %a) {
463+
; CHECK-LABEL: define ptr @test_all_nusw_nuw(
464+
; CHECK-SAME: ptr [[BASE:%.*]], i64 [[A:%.*]]) {
465+
; CHECK-NEXT: entry:
466+
; CHECK-NEXT: [[TMP0:%.*]] = getelementptr nuw i8, ptr [[BASE]], i64 9
467+
; CHECK-NEXT: [[P2:%.*]] = getelementptr nuw i32, ptr [[TMP0]], i64 [[A]]
468+
; CHECK-NEXT: ret ptr [[P2]]
469+
;
470+
entry:
471+
%p1 = getelementptr nusw nuw i8, ptr %base, i64 1
472+
%index = add nsw nuw i64 %a, 2
473+
%p2 = getelementptr nusw nuw i32, ptr %p1, i64 %index
474+
ret ptr %p2
475+
}

0 commit comments

Comments
 (0)