blob: 110eadedd4d6e976b223865d044169f0b7b38099 [file] [edit]
; RUN: not llvm-as -disable-output < %s 2>&1 | FileCheck %s
declare void @foo(ptr)
declare void @llvm.memcpy.p0.p0.i64(ptr noalias writeonly, ptr noalias readonly, i64, i1 immarg)
; CHECK: !mem.cache_hint is only valid on memory operations
define void @non_memory_op(i32 %x, i32 %y) {
%z = add i32 %x, %y, !mem.cache_hint !{i32 0, !{!"nvvm.l1_eviction", !"first"}}
ret void
}
; CHECK: !mem.cache_hint must have even number of operands
define void @odd_top_level_operands(ptr %p) {
%v = load i32, ptr %p, !mem.cache_hint !{i32 0}
ret void
}
; CHECK: !mem.cache_hint must alternate between i32 operand numbers and metadata hint nodes
define void @operand_no_not_integer(ptr %p) {
%v = load i32, ptr %p, !mem.cache_hint !{!"zero", !{!"nvvm.l1_eviction", !"first"}}
ret void
}
; CHECK: !mem.cache_hint operand number must be non-negative
define void @operand_no_negative(ptr %p) {
%v = load i32, ptr %p, !mem.cache_hint !{i32 -1, !{!"nvvm.l1_eviction", !"first"}}
ret void
}
; CHECK: !mem.cache_hint is not supported on non-intrinsic calls
define void @non_intrinsic_call(ptr %p) {
call void @foo(ptr %p), !mem.cache_hint !{i32 0, !{!"nvvm.l1_eviction", !"first"}}
ret void
}
; CHECK: !mem.cache_hint operand number must refer to a pointer operand
define void @operand_no_not_pointer(ptr %d, ptr %s) {
call void @llvm.memcpy.p0.p0.i64(ptr %d, ptr %s, i64 8, i1 false), !mem.cache_hint !{i32 2, !{!"nvvm.l1_eviction", !"first"}}
ret void
}
; CHECK: !mem.cache_hint operand number must refer to a pointer operand
define void @store_operand_no_is_value(ptr %p) {
store i32 0, ptr %p, !mem.cache_hint !{i32 0, !{!"nvvm.l1_eviction", !"first"}}
ret void
}
; CHECK: !mem.cache_hint operand number is out of range
define void @operand_no_out_of_range(ptr %p) {
%v = load i32, ptr %p, !mem.cache_hint !{i32 1, !{!"nvvm.l1_eviction", !"first"}}
ret void
}
; CHECK: !mem.cache_hint contains duplicate operand number
define void @duplicate_operand_no(ptr %p) {
call void @llvm.memcpy.p0.p0.i64(ptr %p, ptr %p, i64 8, i1 false), !mem.cache_hint !{
i32 0, !{!"nvvm.l1_eviction", !"first"},
i32 0, !{!"nvvm.l1_eviction", !"last"}}
ret void
}
; CHECK: !mem.cache_hint operand numbers must be in increasing order
define void @operand_no_not_increasing(ptr %d, ptr %s) {
call void @llvm.memcpy.p0.p0.i64(ptr %d, ptr %s, i64 8, i1 false), !mem.cache_hint !{
i32 1, !{!"nvvm.l1_eviction", !"first"},
i32 0, !{!"nvvm.l1_eviction", !"last"}}
ret void
}
; CHECK: !mem.cache_hint must alternate between i32 operand numbers and metadata hint nodes
define void @hint_node_not_mdnode(ptr %p) {
%v = load i32, ptr %p, !mem.cache_hint !{i32 0, !"not_a_node"}
ret void
}
; CHECK: !mem.cache_hint hint node must have even number of operands
define void @hint_node_odd_operands(ptr %p) {
%v = load i32, ptr %p, !mem.cache_hint !{i32 0, !{!"nvvm.l1_eviction"}}
ret void
}
; CHECK: !mem.cache_hint key must be a string
define void @key_not_string(ptr %p) {
%v = load i32, ptr %p, !mem.cache_hint !{i32 0, !{i32 0, !"first"}}
ret void
}
; CHECK: !mem.cache_hint value must be a string or integer
define void @value_not_string_or_integer(ptr %p) {
%v = load i32, ptr %p, !mem.cache_hint !{i32 0, !{!"nvvm.l1_eviction", !{}}}
ret void
}
; CHECK: !mem.cache_hint hint node contains duplicate key
define void @duplicate_key(ptr %p) {
%v = load i32, ptr %p, !mem.cache_hint !{i32 0, !{
!"nvvm.l1_eviction", !"first",
!"nvvm.l1_eviction", !"last"}}
ret void
}