From a564159d85ead67f5bea1d6fda1b7e261db23825 Mon Sep 17 00:00:00 2001 From: Louis Gerbarg Date: Mon, 16 Jun 2014 17:35:40 +0000 Subject: 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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@211040 91177308-0d34-0410-b5e6-96231b3b80d8 --- test/CodeGen/X86/x86-64-static-relo-movl.ll | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 test/CodeGen/X86/x86-64-static-relo-movl.ll (limited to 'test/CodeGen') diff --git a/test/CodeGen/X86/x86-64-static-relo-movl.ll b/test/CodeGen/X86/x86-64-static-relo-movl.ll new file mode 100644 index 0000000000..b184df4619 --- /dev/null +++ b/test/CodeGen/X86/x86-64-static-relo-movl.ll @@ -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] + +@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) -- cgit v1.2.3