diff --git a/llvm/lib/Target/X86/X86FixupLEAs.cpp b/llvm/lib/Target/X86/X86FixupLEAs.cpp index ceafbf177352a..beeebf42dfe81 100644 --- a/llvm/lib/Target/X86/X86FixupLEAs.cpp +++ b/llvm/lib/Target/X86/X86FixupLEAs.cpp @@ -341,7 +341,8 @@ static inline bool hasInefficientLEABaseReg(const MachineOperand &Base, } static inline bool hasLEAOffset(const MachineOperand &Offset) { - return (Offset.isImm() && Offset.getImm() != 0) || Offset.isGlobal(); + return (Offset.isImm() && Offset.getImm() != 0) || Offset.isGlobal() || + Offset.isBlockAddress(); } static inline unsigned getADDrrFromLEA(unsigned LEAOpcode) { diff --git a/llvm/test/CodeGen/X86/lea-fixup-blockaddress.mir b/llvm/test/CodeGen/X86/lea-fixup-blockaddress.mir new file mode 100644 index 0000000000000..14134e268613b --- /dev/null +++ b/llvm/test/CodeGen/X86/lea-fixup-blockaddress.mir @@ -0,0 +1,30 @@ +# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 3 +# RUN: llc -mtriple=i386-unknown-linux-gnu -mattr=slow-3ops-lea -run-pass x86-fixup-LEAs -o - %s | FileCheck %s + +--- | + define i32 @square(i32 %0) local_unnamed_addr { + %blub = getelementptr i8, ptr blockaddress(@square, %2), i32 %0 + indirectbr ptr %blub, [label %2] + + 2: + ret i32 0 + } + +--- +name: square +body: | + ; CHECK-LABEL: name: square + ; CHECK: bb.0: + ; CHECK-NEXT: renamable $eax = LEA32r renamable $ebx, 1, renamable $ebp, 0, $noreg + ; CHECK-NEXT: $eax = ADD32ri $eax, target-flags(x86-gotoff) blockaddress(@square, %ir-block.1), implicit-def $eflags + ; CHECK-NEXT: JMP32r killed renamable $eax + ; CHECK-NEXT: {{ $}} + ; CHECK-NEXT: bb.1 (%ir-block.1, ir-block-address-taken %ir-block.1): + ; CHECK-NEXT: RET 0 + bb.0: + renamable $eax = LEA32r renamable $ebp, 1, renamable $ebx, target-flags(x86-gotoff) blockaddress(@square, %ir-block.1), $noreg + JMP32r killed renamable $eax + + bb.1 (%ir-block.1, ir-block-address-taken %ir-block.1): + RET 0 +...