[LLVMbugs] [Bug 19565] New: [aarch32] Some predicated assembler instructions are not valid in thumb mode

bugzilla-daemon at llvm.org bugzilla-daemon at llvm.org
Fri Apr 25 13:35:14 PDT 2014


http://llvm.org/bugs/show_bug.cgi?id=19565

            Bug ID: 19565
           Summary: [aarch32] Some predicated assembler instructions are
                    not valid in thumb mode
           Product: tools
           Version: trunk
          Hardware: PC
                OS: Windows NT
            Status: NEW
          Severity: normal
          Priority: P
         Component: llc
          Assignee: unassignedbugs at nondot.org
          Reporter: ssijaric at codeaurora.org
                CC: llvmbugs at cs.uiuc.edu
    Classification: Unclassified

Created attachment 12444
  --> http://llvm.org/bugs/attachment.cgi?id=12444&action=edit
ll file for reproducing the issue

Running

llc a.ll -march=thumb -mcpu=cortex-a53 -mattr=+thumb2

produces

...
@ BB#0:                                 @ %entry
        subs    r0, r0, r1
        it      mi
        rsbsmi  r0, r0, #0  <=== not valid, should be rsbmi
        bx      lr
.Ltmp0:
...

Running the GNU assembler on a.s results in:

a.s: Assembler messages:
a.s:30: Warning: it blocks containing wide Thumb instructions are deprecated in
ARMv8

This behaviour is due to the changed flow for Aarch32, where it runs
Thumb2SizeReduce before If Conversion due to the partial IT block deprecation.

Incoming into Thumb2SizeReduce, we have:

# *** IR Dump After Post-RA pseudo instruction expansion pass ***:
# Machine code for function func: Post SSA
Function Live Ins: %R0 in %vreg0, %R1 in %vreg1

BB#0: derived from LLVM BB %entry
    Live Ins: %R0 %R1
        %R0<def> = t2SUBrr %R0<kill>, %R1<kill>, pred:14, pred:%noreg,
opt:%CPSR<def>
        t2Bcc <BB#2>, pred:5, pred:%CPSR
    Successors according to CFG: BB#1 BB#2

BB#1: derived from LLVM BB %entry
    Live Ins: %R0
    Predecessors according to CFG: BB#0
        %R0<def> = t2RSBri %R0<kill>, 0, pred:14, pred:%noreg, opt:%noreg
    Successors according to CFG: BB#2

BB#2: derived from LLVM BB %entry
    Live Ins: %R0
    Predecessors according to CFG: BB#1 BB#0
        tBX_RET pred:14, pred:%noreg, %R0<imp-use>



And Thumb2SizeReduce will result in:

Converted 32-bit: %R0<def> = t2RSBri %R0<kill>, 0, pred:14, pred:%noreg,
opt:%noreg
       to 16-bit: %R0<def>, %CPSR<def,dead> = tRSB %R0<kill>, pred:14,
pred:%noreg

Since the t2RSBri is not predicated, the corresponding 16-bit instruction must
set the CPSR, and is marked as such.  If Conversion produces

# *** IR Dump After If Converter ***:
# Machine code for function func: Post SSA
Function Live Ins: %R0 in %vreg0, %R1 in %vreg1

BB#0: derived from LLVM BB %entry
    Live Ins: %R0 %R1
        %R0<def>, %CPSR<def> = tSUBrr %R0<kill>, %R1<kill>, pred:14,
pred:%noreg
        %R0<def>, %CPSR<def,dead> = tRSB %R0<kill>, pred:4, pred:%CPSR,
%R0<imp-use,undef>, %CPSR<imp-use,undef>
        tBX_RET pred:14, pred:%noreg, %R0<imp-use>

# End machine code for function func.

So, tRSB is predicated and sets the CPSR. The logic in isV8EligibleForIT gets
around this by checking if CPSR is dead for a set of instructions that may end
up inside the IT block on ARMv8.  tRSB will end up in the IT block as:

BB#0: derived from LLVM BB %entry
    Live Ins: %R0 %R1
        %R0<def>, %CPSR<def> = tSUBrr %R0<kill>, %R1<kill>, pred:14,
pred:%noreg
        t2IT 4, 8, %ITSTATE<imp-def>
        %R0<def>, %CPSR<def,dead> = tRSB %R0<kill>, pred:4, pred:%CPSR,
%R0<imp-use,undef>, %CPSR<imp-use,undef>, %ITSTATE<imp-use,kill>
        tBX_RET pred:14, pred:%noreg, %R0<imp-use,kill>

# End machine code for function func.

Due to the presence of CPSR, the 's' modifier will be appended to rsb when the
.s file is generated, resulting in rsbsmi.

-- 
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/20140425/234e7678/attachment.html>


More information about the llvm-bugs mailing list