Skip to content

Commit

Permalink
Revert "[AMDGPU] Temporarily disabled immarg check in verifier"
Browse files Browse the repository at this point in the history
This reverts commit bdffb53.

Change-Id: I02920b12d1b994cbb72742f3b4c0e76fb06b8a97
  • Loading branch information
dstutt committed Feb 5, 2020
1 parent fc8ae3c commit f455871
Show file tree
Hide file tree
Showing 9 changed files with 724 additions and 28 deletions.
3 changes: 1 addition & 2 deletions llvm/lib/IR/Verifier.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2931,8 +2931,7 @@ void Verifier::visitCallBase(CallBase &Call) {
Call.getArgOperand(i), Call);
}

// Temporarily disabled this check until LLPC has been fixed.
if (0 && Call.paramHasAttr(i, Attribute::ImmArg)) {
if (Call.paramHasAttr(i, Attribute::ImmArg)) {
Value *ArgVal = Call.getArgOperand(i);
Assert(isa<ConstantInt>(ArgVal) || isa<ConstantFP>(ArgVal),
"immarg operand has non-immediate parameter", ArgVal, Call);
Expand Down
111 changes: 111 additions & 0 deletions llvm/test/Verifier/ARM/intrinsic-immarg.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
; 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
}

declare i32 @llvm.arm.space(i32, i32) nounwind
define i32 @space(i32 %arg0, i32 %arg1) {
; CHECK: immarg operand has non-immediate parameter
; CHECK-NEXT: i32 %arg0
; CHECK-NEXT: call i32 @llvm.arm.space(i32 %arg0, i32 %arg1)
%space = call i32 @llvm.arm.space(i32 %arg0, i32 %arg1)
ret i32 %space
}
82 changes: 82 additions & 0 deletions llvm/test/Verifier/Mips/intrinsic-immarg.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
; RUN: not llvm-as %s -o /dev/null 2>&1 | FileCheck %s

define void @ld_b(<16 x i8> * %ptr, i8 * %ldptr, i32 %offset) {
; CHECK: immarg operand has non-immediate parameter
; CHECK-NEXT: i32 %offset
; CHECK-NEXT: %a = call <16 x i8> @llvm.mips.ld.b(i8* %ldptr, i32 %offset)
%a = call <16 x i8> @llvm.mips.ld.b(i8* %ldptr, i32 %offset)
store <16 x i8> %a, <16 x i8> * %ptr, align 16
ret void
}

define void @st_b(<16 x i8> * %ptr, i8 * %ldptr, i32 %offset, i8 * %stptr) {
; CHECK: immarg operand has non-immediate parameter
; CHECK-NEXT: i32 %offset
; CHECK-NEXT: call void @llvm.mips.st.b(<16 x i8> %a, i8* %stptr, i32 %offset)
%a = call <16 x i8> @llvm.mips.ld.b(i8* %ldptr, i32 0)
call void @llvm.mips.st.b(<16 x i8> %a, i8* %stptr, i32 %offset)
ret void
}

define void @ld_w(<4 x i32> * %ptr, i8 * %ldptr, i32 %offset) {
; CHECK: immarg operand has non-immediate parameter
; CHECK-NEXT: i32 %offset
; CHECK-NEXT: %a = call <4 x i32> @llvm.mips.ld.w(i8* %ldptr, i32 %offset)
%a = call <4 x i32> @llvm.mips.ld.w(i8* %ldptr, i32 %offset)
store <4 x i32> %a, <4 x i32> * %ptr, align 16
ret void
}

define void @st_w(<8 x i16> * %ptr, i8 * %ldptr, i32 %offset, i8 * %stptr) {
; CHECK: immarg operand has non-immediate parameter
; CHECK-NEXT: i32 %offset
; CHECK-NEXT: call void @llvm.mips.st.w(<4 x i32> %a, i8* %stptr, i32 %offset)
%a = call <4 x i32> @llvm.mips.ld.w(i8* %ldptr, i32 0)
call void @llvm.mips.st.w(<4 x i32> %a, i8* %stptr, i32 %offset)
ret void
}

define void @ld_h(<8 x i16> * %ptr, i8 * %ldptr, i32 %offset) {
; CHECK: immarg operand has non-immediate parameter
; CHECK-NEXT: i32 %offset
; CHECK-NEXT: %a = call <8 x i16> @llvm.mips.ld.h(i8* %ldptr, i32 %offset)
%a = call <8 x i16> @llvm.mips.ld.h(i8* %ldptr, i32 %offset)
store <8 x i16> %a, <8 x i16> * %ptr, align 16
ret void
}

define void @st_h(<8 x i16> * %ptr, i8 * %ldptr, i32 %offset, i8 * %stptr) {
; CHECK: immarg operand has non-immediate parameter
; CHECK-NEXT: i32 %offset
; CHECK-NEXT: call void @llvm.mips.st.h(<8 x i16> %a, i8* %stptr, i32 %offset)
%a = call <8 x i16> @llvm.mips.ld.h(i8* %ldptr, i32 0)
call void @llvm.mips.st.h(<8 x i16> %a, i8* %stptr, i32 %offset)
ret void
}

define void @ld_d(<2 x i64> * %ptr, i8 * %ldptr, i32 %offset) {
; CHECK: immarg operand has non-immediate parameter
; CHECK-NEXT: i32 %offset
; CHECK-NEXT: %a = call <2 x i64> @llvm.mips.ld.d(i8* %ldptr, i32 %offset)
%a = call <2 x i64> @llvm.mips.ld.d(i8* %ldptr, i32 %offset)
store <2 x i64> %a, <2 x i64> * %ptr, align 16
ret void
}

define void @st_d(<2 x i64> * %ptr, i8 * %ldptr, i32 %offset, i8 * %stptr) {
; CHECK: immarg operand has non-immediate parameter
; CHECK-NEXT: i32 %offset
; CHECK-NEXT: call void @llvm.mips.st.d(<2 x i64> %a, i8* %stptr, i32 %offset)
%a = call <2 x i64> @llvm.mips.ld.d(i8* %ldptr, i32 0)
call void @llvm.mips.st.d(<2 x i64> %a, i8* %stptr, i32 %offset)
ret void
}

declare <16 x i8> @llvm.mips.ld.b(i8*, i32)
declare <8 x i16> @llvm.mips.ld.h(i8*, i32)
declare <4 x i32> @llvm.mips.ld.w(i8*, i32)
declare <2 x i64> @llvm.mips.ld.d(i8*, i32)
declare void @llvm.mips.st.b(<16 x i8>, i8*, i32)
declare void @llvm.mips.st.h(<8 x i16>, i8*, i32)
declare void @llvm.mips.st.w(<4 x i32>, i8*, i32)
declare void @llvm.mips.st.d(<2 x i64>, i8*, i32)
Loading

0 comments on commit f455871

Please sign in to comment.