diff options
author | Alexander Richardson <arichardson.kde@gmail.com> | 2018-08-23 09:25:17 +0000 |
---|---|---|
committer | Alexander Richardson <arichardson.kde@gmail.com> | 2018-08-23 09:25:17 +0000 |
commit | 6bcf2ba2f0fff179602fd60b5e0127cd20fc907e (patch) | |
tree | e75d5473ea23982ba49e0c6ee1b24fd35b57dd8f /llvm/test | |
parent | ba9eee5fadf1114d5ed422ce80dca50099057933 (diff) | |
download | bcm5719-llvm-6bcf2ba2f0fff179602fd60b5e0127cd20fc907e.tar.gz bcm5719-llvm-6bcf2ba2f0fff179602fd60b5e0127cd20fc907e.zip |
Allow creating llvm::Function in non-zero address spaces
Most users won't have to worry about this as all of the
'getOrInsertFunction' functions on Module will default to the program
address space.
An overload has been added to Function::Create to abstract away the
details for most callers.
This is based on https://reviews.llvm.org/D37054 but without the changes to
make passing a Module to Function::Create() mandatory. I have also added
some more tests and fixed the LLParser to accept call instructions for
types in the program address space.
Reviewed By: bjope
Differential Revision: https://reviews.llvm.org/D47541
llvm-svn: 340519
Diffstat (limited to 'llvm/test')
7 files changed, 176 insertions, 17 deletions
diff --git a/llvm/test/Assembler/call-nonzero-program-addrspace-2.ll b/llvm/test/Assembler/call-nonzero-program-addrspace-2.ll index ed8546c61c8..cde546e0ceb 100644 --- a/llvm/test/Assembler/call-nonzero-program-addrspace-2.ll +++ b/llvm/test/Assembler/call-nonzero-program-addrspace-2.ll @@ -1,11 +1,22 @@ -; RUN: llvm-as %s -data-layout=P200 -o /dev/null ; RUN: not llvm-as %s -o /dev/null 2>&1 | FileCheck %s +; RUN: llvm-as %s -data-layout=P42 -o - | llvm-dis - -o - | FileCheck %s -check-prefix PROGAS42 ; Check that numbered variables in a nonzero program address space 200 can be used in a call instruction -define i8 @test_unnamed(i8(i32)*, i8(i32) addrspace(200)*) { - %first = call i8 %0(i32 0) ; this is fine - %second = call i8 %1(i32 0) ; this is also fine if it's the program AS - ; CHECK: call-nonzero-program-addrspace-2.ll:[[@LINE-1]]:21: error: '%1' defined with type 'i8 (i32) addrspace(200)*' +define i8 @test_unnamed(i8(i32)*, i8(i32) addrspace(42)*) { + ; Calls with explicit address spaces are fine: + call addrspace(0) i8 %0(i32 0) + call addrspace(42) i8 %1(i32 0) + ; this call is fine if the program address space is 42 + call i8 %1(i32 0) + ; CHECK: call-nonzero-program-addrspace-2.ll:[[@LINE-1]]:11: error: '%1' defined with type 'i8 (i32) addrspace(42)*' but expected 'i8 (i32)*' ret i8 0 } + +; PROGAS42: target datalayout = "P42" +; PROGAS42: define i8 @test_unnamed(i8 (i32)*, i8 (i32) addrspace(42)*) addrspace(42) { +; PROGAS42-NEXT: %3 = call addrspace(0) i8 %0(i32 0) +; PROGAS42-NEXT: %4 = call addrspace(42) i8 %1(i32 0) +; PROGAS42-NEXT: %5 = call addrspace(42) i8 %1(i32 0) +; PROGAS42-NEXT: ret i8 0 +; PROGAS42-NEXT: } diff --git a/llvm/test/Assembler/call-nonzero-program-addrspace.ll b/llvm/test/Assembler/call-nonzero-program-addrspace.ll index 1d1a224212d..111ef0ccefe 100644 --- a/llvm/test/Assembler/call-nonzero-program-addrspace.ll +++ b/llvm/test/Assembler/call-nonzero-program-addrspace.ll @@ -1,13 +1,23 @@ -; RUN: llvm-as %s -data-layout=P200 -o /dev/null ; RUN: not llvm-as %s -o /dev/null 2>&1 | FileCheck %s +; RUN: llvm-as %s -data-layout=P42 -o - | llvm-dis - -o - | FileCheck %s -check-prefix PROGAS42 -; Check that variables in a nonzero program address space 200 can be used in a call instruction +; Check that variables in a nonzero program address space 42 can be used in a call instruction -define i8 @test(i8(i32)* %fnptr0, i8(i32) addrspace(200)* %fnptr200) { - %first = call i8 %fnptr0(i32 0) ; this is fine - %second = call i8 %fnptr200(i32 0) ; this is also fine if it's the program AS - ; CHECK: call-nonzero-program-addrspace.ll:[[@LINE-1]]:21: error: '%fnptr200' defined with type 'i8 (i32) addrspace(200)*' +define i8 @test(i8(i32)* %fnptr0, i8(i32) addrspace(42)* %fnptr42) { + %explicit_as_0 = call addrspace(0) i8 %fnptr0(i32 0) + %explicit_as_42 = call addrspace(42) i8 %fnptr42(i32 0) + ; Calling %fnptr42 without an explicit addrspace() in the call instruction is only okay if the program AS is 42 + %call_no_as = call i8 %fnptr42(i32 0) + ; CHECK: call-nonzero-program-addrspace.ll:[[@LINE-1]]:25: error: '%fnptr42' defined with type 'i8 (i32) addrspace(42)*' but expected 'i8 (i32)*' ret i8 0 } -declare i32 @__gxx_personality_v0(...) +; PROGAS42: target datalayout = "P42" +; PROGAS42: define i8 @test(i8 (i32)* %fnptr0, i8 (i32) addrspace(42)* %fnptr42) addrspace(42) { +; Print addrspace(0) since the program address space is non-zero: +; PROGAS42-NEXT: %explicit_as_0 = call addrspace(0) i8 %fnptr0(i32 0) +; Also print addrspace(42) since we always print non-zero addrspace: +; PROGAS42-NEXT: %explicit_as_42 = call addrspace(42) i8 %fnptr42(i32 0) +; PROGAS42-NEXT: %call_no_as = call addrspace(42) i8 %fnptr42(i32 0) +; PROGAS42-NEXT: ret i8 0 +; PROGAS42-NEXT: } diff --git a/llvm/test/Assembler/invoke-nonzero-program-addrspace.ll b/llvm/test/Assembler/invoke-nonzero-program-addrspace.ll index 443884590d6..a3f70aec30d 100644 --- a/llvm/test/Assembler/invoke-nonzero-program-addrspace.ll +++ b/llvm/test/Assembler/invoke-nonzero-program-addrspace.ll @@ -1,12 +1,15 @@ -; RUN: llvm-as %s -data-layout=P200 -o /dev/null ; RUN: not llvm-as %s -o /dev/null 2>&1 | FileCheck %s +; RUN: llvm-as %s -data-layout=P200 -o - | llvm-dis - -o - | FileCheck %s -check-prefix PROGAS200 + ; Check that variables in a nonzero program address space 200 can be used in a invoke instruction -define i8 @test_invoke(i8(i32)* %fnptr0, i8(i32) addrspace(200)* %fnptr200) personality i32 (...)* @__gxx_personality_v0 { - %first = invoke i8 %fnptr0(i32 0) to label %ok unwind label %lpad ; this is fine - %second = invoke i8 %fnptr200(i32 0) to label %ok unwind label %lpad ; this is also fine if it's the program AS - ; CHECK: invoke-nonzero-program-addrspace.ll:[[@LINE-1]]:23: error: '%fnptr200' defined with type 'i8 (i32) addrspace(200)*' +define i8 @test_invoke(i8(i32)* %fnptr0, i8(i32) addrspace(200)* %fnptr200) personality i32 (...) addrspace(200)* @__gxx_personality_v0 { + %explicit_as_0 = invoke addrspace(0) i8 %fnptr0(i32 0) to label %ok unwind label %lpad + %explicit_as_42 = invoke addrspace(200) i8 %fnptr200(i32 0) to label %ok unwind label %lpad + ; The following is only okay if the program address space is 200: + %no_as = invoke i8 %fnptr200(i32 0) to label %ok unwind label %lpad + ; CHECK: invoke-nonzero-program-addrspace.ll:[[@LINE-1]]:22: error: '%fnptr200' defined with type 'i8 (i32) addrspace(200)*' but expected 'i8 (i32)*' ok: ret i8 0 lpad: @@ -16,3 +19,12 @@ lpad: } declare i32 @__gxx_personality_v0(...) + + +; PROGAS200: target datalayout = "P200" +; PROGAS200: define i8 @test_invoke(i8 (i32)* %fnptr0, i8 (i32) addrspace(200)* %fnptr200) addrspace(200) personality i32 (...) addrspace(200)* @__gxx_personality_v0 { +; PROGAS200: %explicit_as_0 = invoke addrspace(0) i8 %fnptr0(i32 0) +; PROGAS200: %explicit_as_42 = invoke addrspace(200) i8 %fnptr200(i32 0) +; PROGAS200: %no_as = invoke addrspace(200) i8 %fnptr200(i32 0) +; PROGAS200: ret i8 0 +; PROGAS200: } diff --git a/llvm/test/Bitcode/function-address-space-fwd-decl.ll b/llvm/test/Bitcode/function-address-space-fwd-decl.ll new file mode 100644 index 00000000000..f10c2287e4b --- /dev/null +++ b/llvm/test/Bitcode/function-address-space-fwd-decl.ll @@ -0,0 +1,39 @@ +; Verify that forward declarations from call instructions work even with non-zero AS +; RUN: llvm-as %s -o - | llvm-dis - | FileCheck %s + +define void @call_named() { +entry: + %0 = tail call addrspace(40) i32 @named(i16* null) + ; CHECK: %0 = tail call addrspace(40) i32 @named(i16* null) + ret void +} + +define void @call_numbered() { +entry: + %0 = tail call addrspace(40) i32 @0(i16* null) + ; CHECK: %0 = tail call addrspace(40) i32 @0(i16* null) + ret void +} + + +define i32 @invoked() personality i8* null { +entry: + %0 = invoke addrspace(40) i32 @foo() to label %l1 unwind label %lpad + ; CHECK: invoke addrspace(40) i32 @foo() +l1: + br label %return +lpad: + %1 = landingpad { i8*, i32 } + catch i8* null + catch i8* null + ret i32 0 +return: + ret i32 0 +} + +declare i32 @foo() addrspace(40) +; CHECK: declare i32 @foo() addrspace(40) +declare i32 @named(i16* nocapture) addrspace(40) +; CHECK: declare i32 @named(i16* nocapture) addrspace(40) +declare i32 @0(i16*) addrspace(40) +; CHECK: declare i32 @0(i16*) addrspace(40) diff --git a/llvm/test/Bitcode/function-default-address-spaces.ll b/llvm/test/Bitcode/function-default-address-spaces.ll new file mode 100644 index 00000000000..e008f43501a --- /dev/null +++ b/llvm/test/Bitcode/function-default-address-spaces.ll @@ -0,0 +1,35 @@ +; RUN: llvm-as %s -o - | llvm-dis - | FileCheck %s -check-prefixes CHECK,PROG-AS0 +; RUN: llvm-as -data-layout "P200" %s -o - | llvm-dis | FileCheck %s -check-prefixes CHECK,PROG-AS200 +; RUN: not llvm-as -data-layout "P123456789" %s -o /dev/null 2>&1 | FileCheck %s -check-prefix BAD-DATALAYOUT +; BAD-DATALAYOUT: LLVM ERROR: Invalid address space, must be a 24-bit integer + +; PROG-AS0-NOT: target datalayout +; PROG-AS200: target datalayout = "P200" + +; Check that a function declaration without an address space (i.e. AS0) does not +; have the addrspace() attribute printed if it is address space zero and it is +; equal to the program address space. + +; PROG-AS0: define void @no_as() { +; PROG-AS200: define void @no_as() addrspace(200) { +define void @no_as() { + ret void +} + +; A function with an explicit addrspace should only have the addrspace printed +; if it is non-zero or if the module has a nonzero datalayout +; PROG-AS0: define void @explit_as0() { +; PROG-AS200: define void @explit_as0() addrspace(0) { +define void @explit_as0() addrspace(0) { + ret void +} + +; CHECK: define void @explit_as200() addrspace(200) { +define void @explit_as200() addrspace(200) { + ret void +} + +; CHECK: define void @explicit_as3() addrspace(3) { +define void @explicit_as3() addrspace(3) { + ret void +} diff --git a/llvm/test/Bitcode/function-nonzero-address-spaces-types.ll b/llvm/test/Bitcode/function-nonzero-address-spaces-types.ll new file mode 100644 index 00000000000..6ef53e5e47f --- /dev/null +++ b/llvm/test/Bitcode/function-nonzero-address-spaces-types.ll @@ -0,0 +1,23 @@ +; Verify that we accept calls to variables in the program AS: +; RUN: llvm-as -data-layout "P40" %s -o - | llvm-dis - | FileCheck %s +; CHECK: target datalayout = "P40" + +; We should get a sensible error for a non-program address call: +; RUN: not llvm-as -data-layout "P39" %s -o /dev/null 2>&1 | FileCheck %s -check-prefix ERR-AS39 +; ERR-AS39: error: '%0' defined with type 'i16 (i16) addrspace(40)*' but expected 'i16 (i16) addrspace(39)*' + +; And also if we don't set a custom program address space: +; RUN: not llvm-as %s -o /dev/null 2>&1 | FileCheck %s -check-prefix ERR-AS0 +; ERR-AS0: error: '%0' defined with type 'i16 (i16) addrspace(40)*' but expected 'i16 (i16)*' + +%fun1 = type i16 (i16) +%funptr1 = type %fun1 addrspace(40)* + +@fun_ptr = global %funptr1 @fun + +define i16 @fun(i16 %arg) addrspace(40) { +entry: + %0 = load %funptr1, %funptr1* @fun_ptr + %result = call i16 %0(i16 %arg) + ret i16 %result +} diff --git a/llvm/test/Bitcode/function-nonzero-address-spaces.ll b/llvm/test/Bitcode/function-nonzero-address-spaces.ll new file mode 100644 index 00000000000..54f6735f50a --- /dev/null +++ b/llvm/test/Bitcode/function-nonzero-address-spaces.ll @@ -0,0 +1,29 @@ +; Verify that we accept calls to variables in the program AS: +; RUN: llvm-as -data-layout "P40" %s -o - | llvm-dis - | FileCheck %s +; CHECK: target datalayout = "P40" + +; We should get a sensible error for a non-program address call: +; RUN: not llvm-as -data-layout "P39" %s -o /dev/null 2>&1 | FileCheck %s -check-prefix ERR-AS39 +; ERR-AS39: error: '%fnptr' defined with type 'void (i16) addrspace(40)*' but expected 'void (i16) addrspace(39)*' + +; And also if we don't set a custom program address space: +; RUN: not llvm-as %s -o /dev/null 2>&1 | FileCheck %s -check-prefix ERR-AS0 +; ERR-AS0: error: '%fnptr' defined with type 'void (i16) addrspace(40)*' but expected 'void (i16)*' + +define void @f_named(i16 %n, void (i16) addrspace(40)* %f) addrspace(40) { +entry: + %f.addr = alloca void (i16) addrspace(40)*, align 1 + store void (i16) addrspace(40)* %f, void (i16) addrspace(40)** %f.addr + %fnptr = load void (i16) addrspace(40)*, void (i16) addrspace(40)** %f.addr + call void %fnptr(i16 8) + ret void +} + +define void @f_numbered(i16 %n, void (i16) addrspace(40)* %f) addrspace(40){ +entry: + %f.addr = alloca void (i16) addrspace(40)*, align 1 + store void (i16) addrspace(40)* %f, void (i16) addrspace(40)** %f.addr + %0 = load void (i16) addrspace(40)*, void (i16) addrspace(40)** %f.addr + call void %0(i16 8) + ret void +} |