diff options
author | Aditya Nandakumar <aditya_nandakumar@apple.com> | 2018-01-05 02:56:28 +0000 |
---|---|---|
committer | Aditya Nandakumar <aditya_nandakumar@apple.com> | 2018-01-05 02:56:28 +0000 |
commit | 5710c44eeec52e719f7db5e83b22590e7cf1a94d (patch) | |
tree | 787757a98f6382be70548ad8f109f5adc87bafc9 /llvm | |
parent | c910aa67b3f44cef292f6e4c48cf1eede2e7a82b (diff) | |
download | bcm5719-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.cpp | 19 | ||||
-rw-r--r-- | llvm/test/CodeGen/AArch64/GlobalISel/translate-gep.ll | 9 |
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 |