llvm / llvm/llvm-project

[unwindv2] error: Epilog offset is too large for Unwind v2

Open
#210,295 5 comments 0 reactions 0 assignees View on GitHub
platform:windows
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

Open the contributing 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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.