Files
clang-p2996/llvm/test/CodeGen/ARM/large-stack.ll
John Brawn 1b12b1a335 [ARM] Restructure MOVi32imm expansion to not do pointless instructions
The expansion of the various MOVi32imm pseudo-instructions works by
splitting the operand into components (either halfwords or bytes) and
emitting instructions to combine those components into the final
result. When the operand is an immediate with some components being
zero this can result in pointless instructions that just add zero.

Avoid this by restructuring things so that a separate function handles
splitting the operand into components, then don't emit the component
if it is a zero immediate. This is straightforward for movw/movt,
where we just don't emit the movt if it's zero, but the thumb1
expansion using mov/add/lsl is more complex, as even when we don't
emit a given byte we still need to get the shift correct.

Differential Revision: https://reviews.llvm.org/D154943
2023-07-19 13:56:36 +01:00

51 lines
1.6 KiB
LLVM

; RUN: llc -mtriple=arm-eabi %s -o /dev/null
; RUN: llc -mtriple=thumbv6m-eabi -mattr=+execute-only %s -o - -filetype=obj | \
; RUN: llvm-objdump -d --no-leading-addr --no-show-raw-insn - | FileCheck %s
define void @test1() {
; CHECK-LABEL: <test1>:
;; are we using correct prologue immediate materialization pattern for
;; execute only
; CHECK: sub sp, #0x100
%tmp = alloca [ 64 x i32 ] , align 4
ret void
}
define void @test2() {
; CHECK-LABEL: <test2>:
;; are we using correct prologue immediate materialization pattern for
;; execute-only
; CHECK: movs [[REG:r[0-9]+]], #0xff
; CHECK-NEXT: lsls [[REG]], [[REG]], #0x8
; CHECK-NEXT: adds [[REG]], #0xff
; CHECK-NEXT: lsls [[REG]], [[REG]], #0x8
; CHECK-NEXT: adds [[REG]], #0xef
; CHECK-NEXT: lsls [[REG]], [[REG]], #0x8
; CHECK-NEXT: adds [[REG]], #0xb8
%tmp = alloca [ 4168 x i8 ] , align 4
ret void
}
define i32 @test3() {
;; are we using correct prologue immediate materialization pattern for
;; execute-only
; CHECK-LABEL: <test3>:
; CHECK: movs [[REG:r[0-9]+]], #0xcf
; CHECK-NEXT: lsls [[REG]], [[REG]], #0x8
; CHECK-NEXT: adds [[REG]], #0xff
; CHECK-NEXT: lsls [[REG]], [[REG]], #0x8
; CHECK-NEXT: adds [[REG]], #0xff
; CHECK-NEXT: lsls [[REG]], [[REG]], #0x8
; CHECK-NEXT: adds [[REG]], #0xf0
%retval = alloca i32, align 4
%tmp = alloca i32, align 4
%a = alloca [u0x30000001 x i8], align 16
store i32 0, ptr %tmp
;; are we choosing correct store/tSTRspi pattern for execute-only
; CHECK: movs [[REG:r[0-9]+]], #0x30
; CHECK-NEXT: lsls [[REG]], [[REG]], #0x18
; CHECK-NEXT: adds [[REG]], #0x8
%tmp1 = load i32, ptr %tmp
ret i32 %tmp1
}