[llvm-bugs] [Bug 34896] New: Invalid vldmia/vsdmia encoding
via llvm-bugs
llvm-bugs at lists.llvm.org
Mon Oct 9 17:18:07 PDT 2017
https://bugs.llvm.org/show_bug.cgi?id=34896
Bug ID: 34896
Summary: Invalid vldmia/vsdmia encoding
Product: libraries
Version: trunk
Hardware: PC
OS: Linux
Status: NEW
Severity: enhancement
Priority: P
Component: Backend: ARM
Assignee: unassignedbugs at nondot.org
Reporter: yyc1992 at gmail.com
CC: llvm-bugs at lists.llvm.org
The ARM instruction vldmia and vstmia can can technically encode register
ranges that are invalid (unpredictable). (only up to 16 within 0-31 are
allowed). However, it seems that LLVM can emit invalid ones for certain code
due to load-store optimizations.
The IR to reproduce is
```
target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
target triple = "armv7l-unknown-linux-gnueabihf"
define void @f(<34 x double> addrspace(10)* %p0, <34 x double>* %p1) {
L10:
%v = load <34 x double>, <34 x double> addrspace(10)* %p0, align 16
store <34 x double> %v, <34 x double>* %p1, align 16
ret void
}
```
When running with `neon` diabled (important, doesn't show up with neon
enabled!!!)
```
% llc -mattr=-neon l.ll -o -
.text
.syntax unified
.eabi_attribute 67, "2.09" @ Tag_conformance
.eabi_attribute 6, 10 @ Tag_CPU_arch
.eabi_attribute 7, 65 @ Tag_CPU_arch_profile
.eabi_attribute 8, 1 @ Tag_ARM_ISA_use
.eabi_attribute 9, 2 @ Tag_THUMB_ISA_use
.fpu vfpv3
.eabi_attribute 34, 1 @ Tag_CPU_unaligned_access
.eabi_attribute 17, 1 @ Tag_ABI_PCS_GOT_use
.eabi_attribute 20, 1 @ Tag_ABI_FP_denormal
.eabi_attribute 21, 1 @ Tag_ABI_FP_exceptions
.eabi_attribute 23, 3 @ Tag_ABI_FP_number_model
.eabi_attribute 24, 1 @ Tag_ABI_align_needed
.eabi_attribute 25, 1 @ Tag_ABI_align_preserved
.eabi_attribute 28, 1 @ Tag_ABI_VFP_args
.eabi_attribute 38, 1 @ Tag_ABI_FP_16bit_format
.eabi_attribute 14, 0 @ Tag_ABI_PCS_R9_use
.file "l.ll"
.globl f @ -- Begin function f
.p2align 2
.type f,%function
.code 32 @ @f
f:
.fnstart
@ BB#0: @ %L10
.vsave {d8, d9, d10, d11, d12, d13, d14, d15}
vpush {d8, d9, d10, d11, d12, d13, d14, d15}
.pad #16
sub sp, sp, #16
vldr d16, [r0]
add r2, r0, #16
vldr d17, [r0, #264]
vstr d16, [sp, #8] @ 8-byte Spill
vldr d16, [r0, #8]
vstr d16, [sp] @ 8-byte Spill
vldmia r2, {d19, d20, d21, d22, d23, d24, d25, d26, d27, d28, d29,
d30, d31}
add r2, r0, #120
vldmia r2, {d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12,
d13, d14, d15, d16}
vldr d18, [r0, #256]
add r0, r1, #64
vstr d18, [r1, #256]
vstr d17, [r1, #264]
vstmia r0, {d25, d26, d27, d28, d29, d30, d31}
add r0, r1, #120
vstmia r0, {d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12,
d13, d14, d15, d16}
add r0, r1, #16
vldr d16, [sp, #8] @ 8-byte Reload
vstr d16, [r1]
vldr d16, [sp] @ 8-byte Reload
vstr d16, [r1, #8]
vstmia r0, {d19, d20, d21, d22, d23, d24}
add sp, sp, #16
vpop {d8, d9, d10, d11, d12, d13, d14, d15}
bx lr
.Lfunc_end0:
.size f, .Lfunc_end0-f
.fnend
@ -- End function
.section ".note.GNU-stack","",%progbits
.eabi_attribute 30, 1 @ Tag_ABI_optimization_goals
```
Notice that the `vstmia r0, {d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11,
d12, d13, d14, d15, d16}` and `vldmia r2, {d0, d1, d2, d3, d4, d5, d6, d7, d8,
d9, d10, d11, d12, d13, d14, d15, d16}` are encodable but are not valid on
current ARM architectures since they each have 17 vector/floating point
registers.
The instruction is created by `ARMLoadStoreOpt::CreateLoadStoreMulti` which
took a input register list of a large size. Not sure if the caller or this
function is to be blamed...
--
You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20171010/fe5f4fe4/attachment.html>
More information about the llvm-bugs
mailing list