Skip to content

Commit

Permalink
[AArch64] Disable loop alignment for Windows targets (#67894)
Browse files Browse the repository at this point in the history
This should fix #66912. When emitting SEH unwind info, we need to be
able to calculate the exact length of functions before alignments are
fixed. Until that limitation is overcome, just disable all loop
alignment on Windows targets.

(cherry picked from commit 6ae36c012728a274a78a771e4506681732f85a6d)
  • Loading branch information
mstorsjo authored and tru committed Oct 10, 2023
1 parent 69c8c96 commit 1090b91
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 1 deletion.
3 changes: 3 additions & 0 deletions llvm/lib/MC/MCWin64EH.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1402,6 +1402,9 @@ static void ARM64EmitUnwindInfo(MCStreamer &streamer, WinEH::FrameInfo *info,
// here, but we'd have to emit the pdata, the xdata header, and the
// epilogue scopes later, since they depend on whether the we need to
// split the unwind data.
//
// If this is fixed, remove code in AArch64ISelLowering.cpp that
// disables loop alignment on Windows.
RawFuncLength = GetAbsDifference(streamer, info->FuncletOrFuncEnd,
info->Begin);
}
Expand Down
7 changes: 6 additions & 1 deletion llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1033,7 +1033,12 @@ AArch64TargetLowering::AArch64TargetLowering(const TargetMachine &TM,
// Set required alignment.
setMinFunctionAlignment(Align(4));
// Set preferred alignments.
setPrefLoopAlignment(STI.getPrefLoopAlignment());

// Don't align loops on Windows. The SEH unwind info generation needs to
// know the exact length of functions before the alignments have been
// expanded.
if (!Subtarget->isTargetWindows())
setPrefLoopAlignment(STI.getPrefLoopAlignment());
setMaxBytesForAlignment(STI.getMaxBytesForLoopAlignment());
setPrefFunctionAlignment(STI.getPrefFunctionAlignment());

Expand Down
21 changes: 21 additions & 0 deletions llvm/test/CodeGen/AArch64/sched-loop-align.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
; RUN: llc < %s -mtriple=aarch64-windows | FileCheck %s --check-prefix=WINDOWS
; RUN: llc < %s -mtriple=aarch64-linux | FileCheck %s --check-prefix=LINUX

define dso_local void @b() #0 {
entry:
br label %for.cond

for.cond:
tail call void @a()
br label %for.cond
}

declare dso_local void @a(...)

attributes #0 = { noreturn nounwind uwtable "tune-cpu"="cortex-a53" }

; LINUX-LABEL: b:
; LINUX: .p2align 4

; WINDOWS-LABEL: b:
; WINDOWS-NOT: .p2align

0 comments on commit 1090b91

Please sign in to comment.