Skip to content

Commit

Permalink
Initial commit
Browse files Browse the repository at this point in the history
Added tests
  • Loading branch information
Sh0g0-1758 committed Mar 22, 2024
1 parent e54af60 commit 39a4a12
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 7 deletions.
21 changes: 14 additions & 7 deletions llvm/lib/Transforms/InstCombine/InstructionCombining.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2889,9 +2889,12 @@ Instruction *InstCombinerImpl::visitGetElementPtrInst(GetElementPtrInst &GEP) {
// Try to replace ADD + GEP with GEP + GEP.
Value *Idx1, *Idx2;
if (match(GEP.getOperand(1),
m_OneUse(m_Add(m_Value(Idx1), m_Value(Idx2))))) {
m_OneUse(m_AddLike(m_Value(Idx1), m_Value(Idx2))))) {
// %idx = add i64 %idx1, %idx2
// %gep = getelementptr i32, ptr %ptr, i64 %idx
// or
// %idx = or disjoint i64 %idx1, %idx2
// %gep = getelementptr i32, ptr %ptr, i64 %idx
// as:
// %newptr = getelementptr i32, ptr %ptr, i64 %idx1
// %newgep = getelementptr i32, ptr %newptr, i64 %idx2
Expand All @@ -2901,14 +2904,18 @@ Instruction *InstCombinerImpl::visitGetElementPtrInst(GetElementPtrInst &GEP) {
Idx2);
}
ConstantInt *C;
if (match(GEP.getOperand(1), m_OneUse(m_SExtLike(m_OneUse(m_NSWAdd(
if (match(GEP.getOperand(1), m_OneUse(m_SExtLike(m_OneUse(m_NSWAddLike(
m_Value(Idx1), m_ConstantInt(C))))))) {
// %add = add nsw i32 %idx1, idx2
// %sidx = sext i32 %add to i64
// %gep = getelementptr i32, ptr %ptr, i64 %sidx
// %add = add nsw i32 %idx1, %idx2
// %sidx = sext i32 %add to i64
// %gep = getelementptr i32, ptr %ptr, i64 %sidx
// or
// %disjointOr = or disjoint i32 %idx1, %idx2
// %sidx = sext i32 %disjointOr to i64
// %gep = getelementptr i32, ptr %ptr, i64 %sidx
// as:
// %newptr = getelementptr i32, ptr %ptr, i32 %idx1
// %newgep = getelementptr i32, ptr %newptr, i32 idx2
// %newptr = getelementptr i32, ptr %ptr, i32 %idx1
// %newgep = getelementptr i32, ptr %newptr, i32 idx2
auto *NewPtr = Builder.CreateGEP(
GEP.getResultElementType(), GEP.getPointerOperand(),
Builder.CreateSExt(Idx1, GEP.getOperand(1)->getType()));
Expand Down
21 changes: 21 additions & 0 deletions llvm/test/Transforms/InstCombine/gep-disjoint.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
; RUN: opt < %s -passes=instcombine -S | FileCheck %s

; test that when offset is know while indexing arrays
; folding optimization takes place on the addition which gets folded into an OR

target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"

define ptr @test(ptr %arr, i32 %conv) {
; CHECK-LABEL: define ptr @test(
; CHECK-SAME: ptr [[ARR:%.*]], i32 [[CONV:%.*]]) {
; CHECK-NEXT: [[TMP1:%.*]] = sext i32 [[CONV]] to i64
; CHECK-NEXT: [[TMP2:%.*]] = getelementptr i8, ptr [[ARR]], i64 [[TMP1]]
; CHECK-NEXT: [[ARRAYIDX9:%.*]] = getelementptr i8, ptr [[TMP2]], i64 1
; CHECK-NEXT: ret ptr [[ARRAYIDX9]]
;
%or7 = or disjoint i32 %conv, 1
%idxprom8 = zext nneg i32 %or7 to i64
%arrayidx9 = getelementptr i8, ptr %arr, i64 %idxprom8
ret ptr %arrayidx9
}

0 comments on commit 39a4a12

Please sign in to comment.