Index: lib/CodeGen/GlobalISel/IRTranslator.cpp =================================================================== --- lib/CodeGen/GlobalISel/IRTranslator.cpp +++ lib/CodeGen/GlobalISel/IRTranslator.cpp @@ -516,10 +516,6 @@ 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 @@ 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; } } Index: test/CodeGen/AArch64/GlobalISel/translate-gep.ll =================================================================== --- test/CodeGen/AArch64/GlobalISel/translate-gep.ll +++ test/CodeGen/AArch64/GlobalISel/translate-gep.ll @@ -2,6 +2,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 ; CHECK: [[BASE:%[0-9]+]]:_(p0) = COPY %x0