summaryrefslogtreecommitdiffstats
path: root/llvm
diff options
context:
space:
mode:
authorAditya Nandakumar <aditya_nandakumar@apple.com>2018-01-05 02:56:28 +0000
committerAditya Nandakumar <aditya_nandakumar@apple.com>2018-01-05 02:56:28 +0000
commit5710c44eeec52e719f7db5e83b22590e7cf1a94d (patch)
tree787757a98f6382be70548ad8f109f5adc87bafc9 /llvm
parentc910aa67b3f44cef292f6e4c48cf1eede2e7a82b (diff)
downloadbcm5719-llvm-5710c44eeec52e719f7db5e83b22590e7cf1a94d.tar.gz
bcm5719-llvm-5710c44eeec52e719f7db5e83b22590e7cf1a94d.zip
[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 llvm-svn: 321857
Diffstat (limited to 'llvm')
-rw-r--r--llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp19
-rw-r--r--llvm/test/CodeGen/AArch64/GlobalISel/translate-gep.ll9
2 files changed, 21 insertions, 7 deletions
diff --git a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
index 705d4ded5b5..7f1e18291c0 100644
--- a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
+++ b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
@@ -516,10 +516,6 @@ bool IRTranslator::translateGetElementPtr(const User &U,
Offset = 0;
}
- // N = N + Idx * ElementSize;
- unsigned ElementSizeReg =
- getOrCreateVReg(*ConstantInt::get(OffsetIRTy, ElementSize));
-
unsigned IdxReg = getOrCreateVReg(*Idx);
if (MRI->getType(IdxReg) != OffsetTy) {
unsigned NewIdxReg = MRI->createGenericVirtualRegister(OffsetTy);
@@ -527,11 +523,20 @@ bool IRTranslator::translateGetElementPtr(const User &U,
IdxReg = NewIdxReg;
}
- unsigned OffsetReg = MRI->createGenericVirtualRegister(OffsetTy);
- MIRBuilder.buildMul(OffsetReg, ElementSizeReg, IdxReg);
+ // N = N + Idx * ElementSize;
+ // Avoid doing it for ElementSize of 1.
+ unsigned GepOffsetReg;
+ if (ElementSize != 1) {
+ unsigned ElementSizeReg =
+ getOrCreateVReg(*ConstantInt::get(OffsetIRTy, ElementSize));
+
+ GepOffsetReg = MRI->createGenericVirtualRegister(OffsetTy);
+ MIRBuilder.buildMul(GepOffsetReg, ElementSizeReg, IdxReg);
+ } else
+ GepOffsetReg = IdxReg;
unsigned NewBaseReg = MRI->createGenericVirtualRegister(PtrTy);
- MIRBuilder.buildGEP(NewBaseReg, BaseReg, OffsetReg);
+ MIRBuilder.buildGEP(NewBaseReg, BaseReg, GepOffsetReg);
BaseReg = NewBaseReg;
}
}
diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/translate-gep.ll b/llvm/test/CodeGen/AArch64/GlobalISel/translate-gep.ll
index 4b69575079a..8318e9e2ef0 100644
--- a/llvm/test/CodeGen/AArch64/GlobalISel/translate-gep.ll
+++ b/llvm/test/CodeGen/AArch64/GlobalISel/translate-gep.ll
@@ -3,6 +3,15 @@
%type = type [4 x {i8, i32}]
+define i8* @translate_element_size1(i64 %arg) {
+; CHECK-LABEL: name: translate_element_size1
+; CHECK: [[OFFSET:%[0-9]+]]:_(s64) = COPY %x0
+; CHECK: [[BASE:%[0-9]+]]:_(p0) = G_CONSTANT i64 0
+; CHECK: [[GEP:%[0-9]+]]:_(p0) = G_GEP [[BASE]], [[OFFSET]]
+ %tmp = getelementptr i8, i8* null, i64 %arg
+ ret i8* %tmp
+}
+
define %type* @first_offset_const(%type* %addr) {
; CHECK-LABEL: name: first_offset_const
OpenPOWER on IntegriCloud