mirror of
https://github.com/RPCS3/llvm.git
synced 2026-07-01 21:04:04 -04:00
6e8fb99b69
This indicates an intrinsic parameter is required to be a constant, and should not be replaced with a non-constant value. Add the attribute to all AMDGPU and generic intrinsics that comments indicate it should apply to. I scanned other target intrinsics, but I don't see any obvious comments indicating which arguments are intended to be only immediates. This breaks one questionable testcase for the autoupgrade. I'm unclear on whether the autoupgrade is supposed to really handle declarations which were never valid. The verifier fails because the attributes now refer to a parameter past the end of the argument list. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@355981 91177308-0d34-0410-b5e6-96231b3b80d8
79 lines
4.3 KiB
LLVM
79 lines
4.3 KiB
LLVM
; RUN: not opt -verify < %s 2>&1 | FileCheck %s
|
|
|
|
define void @test_memcpy(i8* %P, i8* %Q, i32 %A, i32 %E) {
|
|
; CHECK: immarg operand has non-immediate parameter
|
|
; CHECK: i32 %E
|
|
; CHECK-NEXT: call void @llvm.memcpy.element.unordered.atomic.p0i8.p0i8.i32(i8* align 4 %P, i8* align 4 %Q, i32 1, i32 %E)
|
|
call void @llvm.memcpy.element.unordered.atomic.p0i8.p0i8.i32(i8* align 4 %P, i8* align 4 %Q, i32 1, i32 %E)
|
|
|
|
; CHECK: element size of the element-wise atomic memory intrinsic must be a power of 2
|
|
call void @llvm.memcpy.element.unordered.atomic.p0i8.p0i8.i32(i8* align 4 %P, i8* align 4 %Q, i32 1, i32 3)
|
|
|
|
; CHECK: constant length must be a multiple of the element size in the element-wise atomic memory intrinsic
|
|
call void @llvm.memcpy.element.unordered.atomic.p0i8.p0i8.i32(i8* align 4 %P, i8* align 4 %Q, i32 7, i32 4)
|
|
|
|
; CHECK: incorrect alignment of the destination argument
|
|
call void @llvm.memcpy.element.unordered.atomic.p0i8.p0i8.i32(i8* %P, i8* align 4 %Q, i32 1, i32 1)
|
|
; CHECK: incorrect alignment of the destination argument
|
|
call void @llvm.memcpy.element.unordered.atomic.p0i8.p0i8.i32(i8* align 1 %P, i8* align 4 %Q, i32 4, i32 4)
|
|
|
|
; CHECK: incorrect alignment of the source argument
|
|
call void @llvm.memcpy.element.unordered.atomic.p0i8.p0i8.i32(i8* align 4 %P, i8* %Q, i32 1, i32 1)
|
|
; CHECK: incorrect alignment of the source argument
|
|
call void @llvm.memcpy.element.unordered.atomic.p0i8.p0i8.i32(i8* align 4 %P, i8* align 1 %Q, i32 4, i32 4)
|
|
|
|
ret void
|
|
}
|
|
|
|
declare void @llvm.memcpy.element.unordered.atomic.p0i8.p0i8.i32(i8* nocapture, i8* nocapture, i32, i32) nounwind
|
|
|
|
define void @test_memmove(i8* %P, i8* %Q, i32 %A, i32 %E) {
|
|
; CHECK: immarg operand has non-immediate parameter
|
|
; CHECK-NEXT: i32 %E
|
|
; CHECK-NEXT: call void @llvm.memmove.element.unordered.atomic.p0i8.p0i8.i32(i8* align 4 %P, i8* align 4 %Q, i32 1, i32 %E)
|
|
call void @llvm.memmove.element.unordered.atomic.p0i8.p0i8.i32(i8* align 4 %P, i8* align 4 %Q, i32 1, i32 %E)
|
|
|
|
; CHECK: element size of the element-wise atomic memory intrinsic must be a power of 2
|
|
call void @llvm.memmove.element.unordered.atomic.p0i8.p0i8.i32(i8* align 4 %P, i8* align 4 %Q, i32 1, i32 3)
|
|
|
|
; CHECK: constant length must be a multiple of the element size in the element-wise atomic memory intrinsic
|
|
call void @llvm.memmove.element.unordered.atomic.p0i8.p0i8.i32(i8* align 4 %P, i8* align 4 %Q, i32 7, i32 4)
|
|
|
|
; CHECK: incorrect alignment of the destination argument
|
|
call void @llvm.memmove.element.unordered.atomic.p0i8.p0i8.i32(i8* %P, i8* align 4 %Q, i32 1, i32 1)
|
|
; CHECK: incorrect alignment of the destination argument
|
|
call void @llvm.memmove.element.unordered.atomic.p0i8.p0i8.i32(i8* align 1 %P, i8* align 4 %Q, i32 4, i32 4)
|
|
|
|
; CHECK: incorrect alignment of the source argument
|
|
call void @llvm.memmove.element.unordered.atomic.p0i8.p0i8.i32(i8* align 4 %P, i8* %Q, i32 1, i32 1)
|
|
; CHECK: incorrect alignment of the source argument
|
|
call void @llvm.memmove.element.unordered.atomic.p0i8.p0i8.i32(i8* align 4 %P, i8* align 1 %Q, i32 4, i32 4)
|
|
|
|
ret void
|
|
}
|
|
|
|
declare void @llvm.memmove.element.unordered.atomic.p0i8.p0i8.i32(i8* nocapture, i8* nocapture, i32, i32) nounwind
|
|
|
|
define void @test_memset(i8* %P, i8 %V, i32 %A, i32 %E) {
|
|
; CHECK: immarg operand has non-immediate parameter
|
|
; CHECK: i32 %E
|
|
; CHECK: call void @llvm.memset.element.unordered.atomic.p0i8.i32(i8* align 4 %P, i8 %V, i32 1, i32 %E)
|
|
call void @llvm.memset.element.unordered.atomic.p0i8.i32(i8* align 4 %P, i8 %V, i32 1, i32 %E)
|
|
|
|
; CHECK: element size of the element-wise atomic memory intrinsic must be a power of 2
|
|
call void @llvm.memset.element.unordered.atomic.p0i8.i32(i8* align 4 %P, i8 %V, i32 1, i32 3)
|
|
|
|
; CHECK: constant length must be a multiple of the element size in the element-wise atomic memory intrinsic
|
|
call void @llvm.memset.element.unordered.atomic.p0i8.i32(i8* align 4 %P, i8 %V, i32 7, i32 4)
|
|
|
|
; CHECK: incorrect alignment of the destination argument
|
|
call void @llvm.memset.element.unordered.atomic.p0i8.i32(i8* %P, i8 %V, i32 1, i32 1)
|
|
; CHECK: incorrect alignment of the destination argument
|
|
call void @llvm.memset.element.unordered.atomic.p0i8.i32(i8* align 1 %P, i8 %V, i32 4, i32 4)
|
|
|
|
ret void
|
|
}
|
|
declare void @llvm.memset.element.unordered.atomic.p0i8.i32(i8* nocapture, i8, i32, i32) nounwind
|
|
|
|
; CHECK: input module is broken!
|