llvm / llvm-project

The LLVM Project is a collection of modular and reusable compiler and toolchain technologies.
http://llvm.org
Other
28.42k stars 11.74k forks source link

want -fomit-frame-pointer by default on PowerPC #40439

Closed d87e03ad-66e0-4df6-b842-06bd799460e6 closed 5 years ago

d87e03ad-66e0-4df6-b842-06bd799460e6 commented 5 years ago
Bugzilla Link 41094
Resolution FIXED
Resolved on Jul 11, 2019 19:16
Version trunk
OS OpenBSD
Attachments default -fomit-frame-pointer for PowerPC
CC @MaskRay,@zygoloid

Extended Description

Right now, when clang targets PowerPC with optimizations, clang defaults to -fomit-frame-pointer for Linux and NetBSD, but not for other targets. The attached patch (for llvm-project.git master) changes the default to -fomit-frame-pointer for all PowerPC targets.

I want this because I am targeting 32-bit PowerPC OpenBSD, where gcc already uses -fomit-frame-pointer by default. All targets except Darwin have a similar System V ELF ABI, so if -fomit-frame-pointer works for Linux and NetBSD, it would probably work for FreeBSD and OpenBSD. (It might work for Darwin, but "Darwin is no longer supported for PowerPC" in llvm's PPCTargetMachine.) The frame pointer r31, when it exists, is almost always an extra copy of the stack pointer r1.

Consider this code: void nothing(void) {}

clang -target powerpc-openbsd -O3 -S nothing.c now emits

    stwu 1, -16(1)  # allocate stack frame
    stw 31, 12(1)   # save old r31
    mr 31, 1        # set frame pointer r31 = stack pointer r1
    lwz 31, 12(1)   # restore old r31
    addi 1, 1, 16   # free stack frame
    blr             # return

With -fomit-frame-pointer or with the patch, clang emits only

    blr

Beware that -fno-omit-frame-pointer doesn't work; this patch doesn't fix that. In the near future, I will backport the patch to clang 7 and compile more code.

MaskRay commented 5 years ago

I think this is just the gcc default, it doesn't have the OS-varying behavior. Fixed by r365862