Skip to content

Commit 26ea983

Browse files
[Verifier] Allow undef/poison in entry_values expressions.
This patch relaxes the verifier when it checks whether an OP_entry_value has a valid Value associated with it. We now allow undef/poison values as well, since those may be introduced naturally through optimization. Differential Revision: https://reviews.llvm.org/D158101
1 parent 8aa038a commit 26ea983

File tree

2 files changed

+12
-4
lines changed

2 files changed

+12
-4
lines changed

llvm/lib/IR/Verifier.cpp

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6403,12 +6403,16 @@ void Verifier::verifyNotEntryValue(const DbgVariableIntrinsic &I) {
64036403
if (!E || !E->isValid())
64046404
return;
64056405

6406-
// We allow EntryValues for swift async arguments, as they have an
6407-
// ABI-guarantee to be turned into a specific register.
6408-
if (isa<ValueAsMetadata>(I.getRawLocation()))
6409-
if (auto *ArgLoc = dyn_cast_or_null<Argument>(I.getVariableLocationOp(0));
6406+
if (isa<ValueAsMetadata>(I.getRawLocation())) {
6407+
Value *VarValue = I.getVariableLocationOp(0);
6408+
if (isa<UndefValue>(VarValue) || isa<PoisonValue>(VarValue))
6409+
return;
6410+
// We allow EntryValues for swift async arguments, as they have an
6411+
// ABI-guarantee to be turned into a specific register.
6412+
if (auto *ArgLoc = dyn_cast_or_null<Argument>(VarValue);
64106413
ArgLoc && ArgLoc->hasAttribute(Attribute::SwiftAsync))
64116414
return;
6415+
}
64126416

64136417
CheckDI(!E->isEntryValue(),
64146418
"Entry values are only allowed in MIR unless they target a "

llvm/test/Verifier/diexpression-entry-value-llvm-ir.ll

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,18 @@
11
; RUN: llvm-as -disable-output <%s 2>&1| FileCheck %s
22

3+
; CHECK-NOT: llvm.dbg.value
34
; CHECK: Entry values are only allowed in MIR unless they target a swiftasync Argument
45
; CHECK: call void @llvm.dbg.value(metadata i32 %param, metadata !{{.*}}, metadata !DIExpression(DW_OP_LLVM_entry_value, 1))
56
; CHECK-NOT: llvm.dbg.value
7+
; CHECK-NOT: Entry values are only allowed
68
; CHECK: warning: ignoring invalid debug info
79

810
define void @foo(i32 %param, ptr swiftasync %ok_param) !dbg !4 {
911
entry:
1012
call void @llvm.dbg.value(metadata i32 %param, metadata !8, metadata !DIExpression(DW_OP_LLVM_entry_value, 1)), !dbg !9
1113
call void @llvm.dbg.value(metadata ptr %ok_param, metadata !8, metadata !DIExpression(DW_OP_LLVM_entry_value, 1)), !dbg !9
14+
call void @llvm.dbg.value(metadata ptr poison, metadata !8, metadata !DIExpression(DW_OP_LLVM_entry_value, 1)), !dbg !9
15+
call void @llvm.dbg.value(metadata ptr undef, metadata !8, metadata !DIExpression(DW_OP_LLVM_entry_value, 1)), !dbg !9
1216
ret void
1317
}
1418

0 commit comments

Comments
 (0)