diff options
| author | Matt Arsenault <Matthew.Arsenault@amd.com> | 2019-03-14 13:46:14 +0000 |
|---|---|---|
| committer | Matt Arsenault <Matthew.Arsenault@amd.com> | 2019-03-14 13:46:14 +0000 |
| commit | 4e3e4016bf4be7cb1c916ffb184b3eefc57b7ceb (patch) | |
| tree | e9a6ee838b5fb6990ca14fdece0ef533d2691f46 /llvm/test/Verifier | |
| parent | 3a31b3f6e8f3de936da9b2f06deabadf1c60358c (diff) | |
| download | bcm5719-llvm-4e3e4016bf4be7cb1c916ffb184b3eefc57b7ceb.tar.gz bcm5719-llvm-4e3e4016bf4be7cb1c916ffb184b3eefc57b7ceb.zip | |
ARM: Add ImmArg to intrinsics
I found these by asserting in clang for any GCCBuiltin that doesn't
require mangling and requires a constant for the builtin. This means
that intrinsics are missing which don't use GCCBuiltin, don't have
builtins defined in clang, or were missing the constant annotation in
the builtin definition.
llvm-svn: 356144
Diffstat (limited to 'llvm/test/Verifier')
| -rw-r--r-- | llvm/test/Verifier/ARM/intrinsic-immarg.ll | 102 | ||||
| -rw-r--r-- | llvm/test/Verifier/ARM/lit.local.cfg | 2 |
2 files changed, 104 insertions, 0 deletions
diff --git a/llvm/test/Verifier/ARM/intrinsic-immarg.ll b/llvm/test/Verifier/ARM/intrinsic-immarg.ll new file mode 100644 index 00000000000..b578c6d7619 --- /dev/null +++ b/llvm/test/Verifier/ARM/intrinsic-immarg.ll @@ -0,0 +1,102 @@ +; RUN: not llvm-as %s -o /dev/null 2>&1 | FileCheck %s + +declare void @llvm.arm.cdp(i32, i32, i32, i32, i32, i32) nounwind + +define void @cdp(i32 %a) #0 { + ; CHECK: immarg operand has non-immediate parameter + ; CHECK-NEXT: %load = load i32, i32* %a.addr, align 4 + ; CHECK-NEXT: call void @llvm.arm.cdp(i32 %load, i32 2, i32 3, i32 4, i32 5, i32 6) + %a.addr = alloca i32, align 4 + store i32 %a, i32* %a.addr, align 4 + %load = load i32, i32* %a.addr, align 4 + call void @llvm.arm.cdp(i32 %load, i32 2, i32 3, i32 4, i32 5, i32 6) + ret void +} + +declare void @llvm.arm.cdp2(i32, i32, i32, i32, i32, i32) nounwind +define void @cdp2(i32 %a) #0 { + ; CHECK: immarg operand has non-immediate parameter + ; CHECK-NEXT: %load = load i32, i32* %a.addr, align 4 + ; CHECK-NEXT: call void @llvm.arm.cdp2(i32 %load, i32 2, i32 3, i32 4, i32 5, i32 6) + %a.addr = alloca i32, align 4 + store i32 %a, i32* %a.addr, align 4 + %load = load i32, i32* %a.addr, align 4 + call void @llvm.arm.cdp2(i32 %load, i32 2, i32 3, i32 4, i32 5, i32 6) + ret void +} + +declare { i32, i32 } @llvm.arm.mrrc(i32, i32, i32) nounwind +define void @mrrc(i32 %arg0, i32 %arg1, i32 %arg2) #0 { + ; CHECK: immarg operand has non-immediate parameter + ; CHECK-NEXT: i32 %arg0 + ; CHECK-NEXT: %ret0 = call { i32, i32 } @llvm.arm.mrrc(i32 %arg0, i32 0, i32 0) + %ret0 = call { i32, i32 } @llvm.arm.mrrc(i32 %arg0, i32 0, i32 0) + + ; CHECK: immarg operand has non-immediate parameter + ; CHECK-NEXT: i32 %arg1 + ; CHECK-NEXT: %ret1 = call { i32, i32 } @llvm.arm.mrrc(i32 0, i32 %arg1, i32 0) + %ret1 = call { i32, i32 } @llvm.arm.mrrc(i32 0, i32 %arg1, i32 0) + + ; CHECK: immarg operand has non-immediate parameter + ; CHECK-NEXT: i32 %arg2 + ; CHECK-NEXT: %ret2 = call { i32, i32 } @llvm.arm.mrrc(i32 0, i32 0, i32 %arg2) + %ret2 = call { i32, i32 } @llvm.arm.mrrc(i32 0, i32 0, i32 %arg2) + ret void +} + +declare { i32, i32 } @llvm.arm.mrrc2(i32, i32, i32) nounwind +define void @mrrc2(i32 %arg0, i32 %arg1, i32 %arg2) #0 { + ; CHECK: immarg operand has non-immediate parameter + ; CHECK-NEXT: i32 %arg0 + ; CHECK-NEXT: %ret0 = call { i32, i32 } @llvm.arm.mrrc2(i32 %arg0, i32 0, i32 0) + %ret0 = call { i32, i32 } @llvm.arm.mrrc2(i32 %arg0, i32 0, i32 0) + + ; CHECK: immarg operand has non-immediate parameter + ; CHECK-NEXT: i32 %arg1 + ; CHECK-NEXT: %ret1 = call { i32, i32 } @llvm.arm.mrrc2(i32 0, i32 %arg1, i32 0) + %ret1 = call { i32, i32 } @llvm.arm.mrrc2(i32 0, i32 %arg1, i32 0) + + ; CHECK: immarg operand has non-immediate parameter + ; CHECK-NEXT: i32 %arg2 + ; CHECK-NEXT: %ret2 = call { i32, i32 } @llvm.arm.mrrc2(i32 0, i32 0, i32 %arg2) + %ret2 = call { i32, i32 } @llvm.arm.mrrc2(i32 0, i32 0, i32 %arg2) + ret void +} + +declare void @llvm.arm.mcrr(i32, i32, i32, i32, i32) nounwind +define void @mcrr(i32 %arg0, i32 %arg1, i32 %arg2, i32 %arg3, i32 %arg4) { + ; CHECK: immarg operand has non-immediate parameter + ; CHECK-NEXT: i32 %arg0 + ; CHECK-NEXT: call void @llvm.arm.mcrr(i32 %arg0, i32 1, i32 2, i32 3, i32 4) + call void @llvm.arm.mcrr(i32 %arg0, i32 1, i32 2, i32 3, i32 4) + + ; CHECK: immarg operand has non-immediate parameter + ; CHECK-NEXT: i32 %arg1 + ; CHECK-NEXT: call void @llvm.arm.mcrr(i32 0, i32 %arg1, i32 2, i32 3, i32 4) + call void @llvm.arm.mcrr(i32 0, i32 %arg1, i32 2, i32 3, i32 4) + + ; CHECK: immarg operand has non-immediate parameter + ; CHECK-NEXT: i32 %arg4 + ; CHECK-NEXT: call void @llvm.arm.mcrr(i32 0, i32 1, i32 2, i32 3, i32 %arg4) + call void @llvm.arm.mcrr(i32 0, i32 1, i32 2, i32 3, i32 %arg4) + ret void +} + +declare void @llvm.arm.mcrr2(i32, i32, i32, i32, i32) nounwind +define void @mcrr2(i32 %arg0, i32 %arg1, i32 %arg2, i32 %arg3, i32 %arg4) { + ; CHECK: immarg operand has non-immediate parameter + ; CHECK-NEXT: i32 %arg0 + ; CHECK-NEXT: call void @llvm.arm.mcrr2(i32 %arg0, i32 1, i32 2, i32 3, i32 4) + call void @llvm.arm.mcrr2(i32 %arg0, i32 1, i32 2, i32 3, i32 4) + + ; CHECK: immarg operand has non-immediate parameter + ; CHECK-NEXT: i32 %arg1 + ; CHECK-NEXT: call void @llvm.arm.mcrr2(i32 0, i32 %arg1, i32 2, i32 3, i32 4) + call void @llvm.arm.mcrr2(i32 0, i32 %arg1, i32 2, i32 3, i32 4) + + ; CHECK: immarg operand has non-immediate parameter + ; CHECK-NEXT: i32 %arg4 + ; CHECK-NEXT: call void @llvm.arm.mcrr2(i32 0, i32 1, i32 2, i32 3, i32 %arg4) + call void @llvm.arm.mcrr2(i32 0, i32 1, i32 2, i32 3, i32 %arg4) + ret void +} diff --git a/llvm/test/Verifier/ARM/lit.local.cfg b/llvm/test/Verifier/ARM/lit.local.cfg new file mode 100644 index 00000000000..236e1d34416 --- /dev/null +++ b/llvm/test/Verifier/ARM/lit.local.cfg @@ -0,0 +1,2 @@ +if not 'ARM' in config.root.targets: + config.unsupported = True |

