Skip to content
This repository was archived by the owner on Feb 5, 2019. It is now read-only.

Commit 09d2d44

Browse files
author
Aditya Nandakumar
committed
[GISel]: Don't create G_MUL with 1 during translation of GEP
When element size is 1, it's just wasteful to create MUL with 1. https://reviews.llvm.org/D41738 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@321857 91177308-0d34-0410-b5e6-96231b3b80d8
1 parent 9b3761c commit 09d2d44

File tree

2 files changed

+21
-7
lines changed

2 files changed

+21
-7
lines changed

lib/CodeGen/GlobalISel/IRTranslator.cpp

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -516,22 +516,27 @@ bool IRTranslator::translateGetElementPtr(const User &U,
516516
Offset = 0;
517517
}
518518

519-
// N = N + Idx * ElementSize;
520-
unsigned ElementSizeReg =
521-
getOrCreateVReg(*ConstantInt::get(OffsetIRTy, ElementSize));
522-
523519
unsigned IdxReg = getOrCreateVReg(*Idx);
524520
if (MRI->getType(IdxReg) != OffsetTy) {
525521
unsigned NewIdxReg = MRI->createGenericVirtualRegister(OffsetTy);
526522
MIRBuilder.buildSExtOrTrunc(NewIdxReg, IdxReg);
527523
IdxReg = NewIdxReg;
528524
}
529525

530-
unsigned OffsetReg = MRI->createGenericVirtualRegister(OffsetTy);
531-
MIRBuilder.buildMul(OffsetReg, ElementSizeReg, IdxReg);
526+
// N = N + Idx * ElementSize;
527+
// Avoid doing it for ElementSize of 1.
528+
unsigned GepOffsetReg;
529+
if (ElementSize != 1) {
530+
unsigned ElementSizeReg =
531+
getOrCreateVReg(*ConstantInt::get(OffsetIRTy, ElementSize));
532+
533+
GepOffsetReg = MRI->createGenericVirtualRegister(OffsetTy);
534+
MIRBuilder.buildMul(GepOffsetReg, ElementSizeReg, IdxReg);
535+
} else
536+
GepOffsetReg = IdxReg;
532537

533538
unsigned NewBaseReg = MRI->createGenericVirtualRegister(PtrTy);
534-
MIRBuilder.buildGEP(NewBaseReg, BaseReg, OffsetReg);
539+
MIRBuilder.buildGEP(NewBaseReg, BaseReg, GepOffsetReg);
535540
BaseReg = NewBaseReg;
536541
}
537542
}

test/CodeGen/AArch64/GlobalISel/translate-gep.ll

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,15 @@
33

44
%type = type [4 x {i8, i32}]
55

6+
define i8* @translate_element_size1(i64 %arg) {
7+
; CHECK-LABEL: name: translate_element_size1
8+
; CHECK: [[OFFSET:%[0-9]+]]:_(s64) = COPY %x0
9+
; CHECK: [[BASE:%[0-9]+]]:_(p0) = G_CONSTANT i64 0
10+
; CHECK: [[GEP:%[0-9]+]]:_(p0) = G_GEP [[BASE]], [[OFFSET]]
11+
%tmp = getelementptr i8, i8* null, i64 %arg
12+
ret i8* %tmp
13+
}
14+
615
define %type* @first_offset_const(%type* %addr) {
716

817
; CHECK-LABEL: name: first_offset_const

0 commit comments

Comments
 (0)