[unwindv2] error: Epilog offset is too large for Unwind v2
- Dominant language
- LLVM
- Stars
- 40.5k
- Forks
- 18.7k
- PR merge metrics
- PR metrics pending
Description
https://godbolt.org/z/qbTzqMxqP
```llvm
target datalayout = "e-m:w-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "x86_64-pc-windows-gnu"
define void @a(ptr %0, i1 %1, <22 x i1> %2, <6 x i1> %3, ptr %4, ptr %5, ptr %6, ptr %7, ptr %8, ptr %9, ptr %10, ptr %11, ptr %12, ptr %13, i1 %14, ptr %15, ptr %16, i1 %.not, i1 %17, ptr %18, ptr %19, ptr %20, ptr %21, ptr %22, ptr %23, ptr %24, ptr %25, ptr %26, ptr %27, ptr %28, ptr %29, ptr %30, ptr %31, ptr %32, ptr %33, ptr %34, ptr %35, ptr %36, ptr %37, i1 %38, i1 %39) uwtable {
br i1 %1, label %43, label %41
41: ; preds = %42, %41, %40
store <2 x float> zeroinitializer, ptr %5, align 4
call void @llvm.memset.p0.i64(ptr %6, i8 0, i64 24, i1 false)
call void @llvm.memset.p0.i64(ptr %0, i8 0, i64 36, i1 false)
store <2 x float> zeroinitializer, ptr %9, align 8
call void @llvm.memset.p0.i64(ptr %10, i8 0, i64 1036, i1 false)
call void @llvm.memset.p0.i64(ptr %4, i8 0, i64 1084, i1 false)
call void @llvm.memset.p0.i64(ptr %12, i8 0, i64 512, i1 false)
call void @llvm.memcpy.p0.p0.i64(ptr %4, ptr %12, i64 152, i1 false)
br i1 %14, label %41, label %42
42: ; preds = %41
store <3 x float> zeroinitializer, ptr %0, align 16
br label %41
43: ; preds = %40
br i1 %.not, label %50, label %44
44: ; preds = %43
br i1 %14, label %49, label %45
45: ; preds = %47, %45, %44
%46 = phi ptr [ null, %45 ], [ null, %47 ], [ %0, %44 ]
store <2 x float> zeroinitializer, ptr %4, align 4
store i8 0, ptr %7, align 1
store i8 0, ptr %21, align 16
store i32 0, ptr %19, align 16
call void @llvm.masked.store.v22f32.p0(<22 x float> zeroinitializer, ptr null, <22 x i1> %2)
call void @llvm.masked.store.v6f32.p0(<6 x float> zeroinitializer, ptr null, <6 x i1> %3)
store i8 0, ptr %5, align 4
store i32 0, ptr %8, align 4
store <4 x float> zeroinitializer, ptr %13, align 8
store i32 0, ptr %26, align 8
store <2 x float> splat (float 1.000000e+00), ptr %10, align 4
call void @llvm.memset.p0.i64(ptr %0, i8 0, i64 24, i1 false)
store <2 x float> zeroinitializer, ptr %15, align 4
store i8 0, ptr %4, align 1
store <2 x float> zeroinitializer, ptr %0, align 8
call void @llvm.memset.p0.i64(ptr %32, i8 0, i64 1036, i1 false)
call void @llvm.memset.p0.i64(ptr %9, i8 0, i64 1084, i1 false)
call void @llvm.memset.p0.i64(ptr %32, i8 0, i64 512, i1 false)
call void @llvm.memcpy.p0.p0.i64(ptr %0, ptr %16, i64 152, i1 false)
br i1 %39, label %45, label %47
47: ; preds = %45
store <3 x float> splat (float +qnan), ptr %4, align 16
%48 = getelementptr i8, ptr %46, i64 2932
store <3 x float> splat (float 1.000000e+00), ptr %48, align 4
store float 0.000000e+00, ptr %6, align 16
store i8 0, ptr %11, align 4
br label %45
49: ; preds = %44
ret void
50: ; preds = %56, %55, %54, %50, %43
%51 = phi ptr [ null, %50 ], [ null, %56 ], [ null, %55 ], [ null, %54 ], [ %0, %43 ]
store <3 x float> zeroinitializer, ptr %36, align 16
store i8 0, ptr %12, align 4
store float 0.000000e+00, ptr %0, align 4
store i8 0, ptr %28, align 16
store <3 x float> zeroinitializer, ptr %35, align 4
store i8 0, ptr %29, align 16
store float 0.000000e+00, ptr %25, align 16
store i8 0, ptr %33, align 4
store i32 0, ptr %34, align 4
store <4 x float> zeroinitializer, ptr %4, align 8
%52 = getelementptr i8, ptr %37, i64 232
store <2 x float> zeroinitializer, ptr %52, align 8
%53 = getelementptr i8, ptr %51, i64 2368
call void @llvm.memset.p0.i64(ptr %53, i8 0, i64 512, i1 false)
call void @llvm.memcpy.p0.p0.i64(ptr %4, ptr %0, i64 152, i1 false)
br i1 %38, label %50, label %54
54: ; preds = %50
store float 0.000000e+00, ptr %30, align 16
store i32 0, ptr %27, align 4
call void @llvm.memset.p0.i64(ptr align 8 %29, i8 0, i64 200, i1 false)
br i1 %17, label %50, label %55
55: ; preds = %54
store <3 x float> zeroinitializer, ptr %23, align 16
store i8 0, ptr %20, align 4
store float 0.000000e+00, ptr %0, align 4
store i32 0, ptr %24, align 16
store <3 x float> splat (float 1.000000e+00), ptr %26, align 4
store i8 0, ptr %21, align 16
store float 0.000000e+00, ptr %0, align 16
store i8 0, ptr %0, align 4
store i32 0, ptr %0, align 4
call void @llvm.memset.p0.i64(ptr %31, i8 0, i64 200, i1 false)
store <3 x float> zeroinitializer, ptr %11, align 16
store i8 0, ptr %22, align 4
store float 0.000000e+00, ptr %5, align 4
store i8 0, ptr %0, align 16
store i32 0, ptr %29, align 16
store <3 x float> splat (float 1.000000e+00), ptr %31, align 4
store i8 0, ptr %26, align 16
store float 0.000000e+00, ptr %27, align 16
store i8 0, ptr %15, align 4
store i32 0, ptr %8, align 4
call void @llvm.memset.p0.i64(ptr %18, i8 0, i64 200, i1 false)
br i1 %14, label %50, label %56
56: ; preds = %55
store <3 x float> zeroinitializer, ptr %4, align 16
store i8 0, ptr %20, align 4
store float 0.000000e+00, ptr %19, align 4
store i8 0, ptr %18, align 16
store i32 0, ptr %4, align 16
store <3 x float> zeroinitializer, ptr %0, align 4
store float 0.000000e+00, ptr %7, align 16
call void @llvm.memset.p0.i64(ptr %13, i8 0, i64 200, i1 false)
br label %50
}
!llvm.module.flags = !{!0}
!0 = !{i32 2, !"winx64-eh-unwind", i32 1}
```
`clang -O3 --target=x86_64-pc-windows-gnu -mllvm -enable-ext-tsp-block-placement -march=znver5 -c reduced.ll`
```
:0: error: Epilog offset is too large for Unwind v2 in a
error: cannot compile inline asm
:0: error: expected relocatable expression
error: cannot compile inline asm
2 errors generated.
```
cc @dpaoliello
Contributor guide
Research direction
Start with the reduced LLVM IR reproducer in the issue, especially function a and the !"winx64-eh-unwind" module flag. Run the provided clang command for x86_64-pc-windows-gnu with Unwind v2 enabled, then trace the source of the “Epilog offset is too large” diagnostic. Done means the reproducer no longer emits this error and compiles successfully.
Written by the indexing model from the issue text.
Assessment
- Domain
- compilers
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 48/100