[llvm] r211040 - Fix illegal relocations in X86FastISel

David Blaikie dblaikie at gmail.com
Mon Jun 16 15:28:05 PDT 2014


Through no fault of its own, this patch caused some GDB 7.5 tests to
start passing (best guess currently is due to the fallback to SelDAG
we kept track of the constant a bit better). I've un-XFAILed them in
211063.

- David

On Mon, Jun 16, 2014 at 10:35 AM, Louis Gerbarg <lgg at apple.com> wrote:
> Author: louis
> Date: Mon Jun 16 12:35:40 2014
> New Revision: 211040
>
> URL: http://llvm.org/viewvc/llvm-project?rev=211040&view=rev
> Log:
> Fix illegal relocations in X86FastISel
>
> On x86_86  the lea instruction can only use a 32 bit immediate value. When
> the code is compiled statically the RIP register is not used, meaning the
> immediate is all that can be used for the relocation, which is not sufficient
> in the case of targets more than +/- 2GB away. This patch bails out of fast
> isel in those cases and reverts to DAG which does the right thing.
>
> Test case included.
>
> Added:
>     llvm/trunk/test/CodeGen/X86/x86-64-static-relo-movl.ll
> Modified:
>     llvm/trunk/lib/Target/X86/X86FastISel.cpp
>     llvm/trunk/test/DebugInfo/X86/debug-loc-asan.ll
>
> Modified: llvm/trunk/lib/Target/X86/X86FastISel.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86FastISel.cpp?rev=211040&r1=211039&r2=211040&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/X86/X86FastISel.cpp (original)
> +++ llvm/trunk/lib/Target/X86/X86FastISel.cpp Mon Jun 16 12:35:40 2014
> @@ -2709,6 +2709,10 @@ unsigned X86FastISel::TargetMaterializeC
>
>    // Materialize addresses with LEA instructions.
>    if (isa<GlobalValue>(C)) {
> +    //LEA can only handle 32 bit immediates
> +    if (TM.getRelocationModel() == Reloc::Static && Subtarget->is64Bit())
> +      return false;
> +
>      X86AddressMode AM;
>      if (X86SelectAddress(C, AM)) {
>        // If the expression is just a basereg, then we're done, otherwise we need
>
> Added: llvm/trunk/test/CodeGen/X86/x86-64-static-relo-movl.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/x86-64-static-relo-movl.ll?rev=211040&view=auto
> ==============================================================================
> --- llvm/trunk/test/CodeGen/X86/x86-64-static-relo-movl.ll (added)
> +++ llvm/trunk/test/CodeGen/X86/x86-64-static-relo-movl.ll Mon Jun 16 12:35:40 2014
> @@ -0,0 +1,24 @@
> +; RUN: llc -mtriple=x86_64-pc-win32-macho -relocation-model=static -O0 < %s | FileCheck %s
> +
> +; Ensure that we don't generate a movl and not a lea for a static relocation
> +; when compiling for 64 bit.
> +
> +%struct.MatchInfo = type [64 x i64]
> +
> + at NO_MATCH = internal constant %struct.MatchInfo zeroinitializer, align 8
> +
> +define void @setup() {
> +  %pending = alloca %struct.MatchInfo, align 8
> +  %t = bitcast %struct.MatchInfo* %pending to i8*
> +  call void @llvm.memcpy.p0i8.p0i8.i64(i8* %t, i8* bitcast (%struct.MatchInfo* @NO_MATCH to i8*), i64 512, i32 8, i1 false)
> +  %u = getelementptr inbounds %struct.MatchInfo* %pending, i32 0, i32 2
> +  %v = load i64* %u, align 8
> +  br label %done
> +done:
> +  ret void
> +
> +  ; CHECK: movl $_NO_MATCH, {{.*}}
> +}
> +
> +; Function Attrs: nounwind
> +declare void @llvm.memcpy.p0i8.p0i8.i64(i8*, i8*, i64, i32, i1)
>
> Modified: llvm/trunk/test/DebugInfo/X86/debug-loc-asan.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/X86/debug-loc-asan.ll?rev=211040&r1=211039&r2=211040&view=diff
> ==============================================================================
> --- llvm/trunk/test/DebugInfo/X86/debug-loc-asan.ll (original)
> +++ llvm/trunk/test/DebugInfo/X86/debug-loc-asan.ll Mon Jun 16 12:35:40 2014
> @@ -10,10 +10,10 @@
>  ; with "clang++ -S -emit-llvm -fsanitize=address -O0 -g test.cc"
>
>  ; First, argument variable "y" resides in %rdi:
> -; CHECK: DEBUG_VALUE: bar:y <- RDI
> +; CHECK: DEBUG_VALUE: bar:y <- RDX
>
>  ; Then its address is stored in a location on a stack:
> -; CHECK: movq %rdi, [[OFFSET:[0-9]+]](%rsp)
> +; CHECK: movq %rdx, [[OFFSET:[0-9]+]](%rsp)
>  ; CHECK-NEXT: [[START_LABEL:.Ltmp[0-9]+]]
>  ; CHECK-NEXT: DEBUG_VALUE: bar:y <- [RSP+[[OFFSET]]]
>  ; This location should be valid until the end of the function.
> @@ -26,7 +26,7 @@
>  ; CHECK-NEXT: .quad .Lset{{[0-9]+}}
>  ; CHECK-NEXT: .Lset{{[0-9]+}} = [[START_LABEL]]-.Lfunc_begin0
>  ; CHECK-NEXT: .quad .Lset{{[0-9]+}}
> -; CHECK: DW_OP_reg5
> +; CHECK: DW_OP_reg1
>
>  ; Then it's addressed via %rsp:
>  ; CHECK:      .Lset{{[0-9]+}} = [[START_LABEL]]-.Lfunc_begin0
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits



More information about the llvm-commits mailing list