[LLVMbugs] [Bug 6603] New: msp430 backend: wrong addressing mode for 'br' instruction

bugzilla-daemon at llvm.org bugzilla-daemon at llvm.org
Fri Mar 12 15:57:22 PST 2010


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

           Summary: msp430 backend: wrong addressing mode for 'br'
                    instruction
           Product: new-bugs
           Version: unspecified
          Platform: PC
        OS/Version: Linux
            Status: NEW
          Severity: normal
          Priority: P
         Component: new bugs
        AssignedTo: unassignedbugs at nondot.org
        ReportedBy: pagariya at cs.utah.edu
                CC: llvmbugs at cs.uiuc.edu, regehr at cs.utah.edu


Created an attachment (id=4501)
 --> (http://llvm.org/bugs/attachment.cgi?id=4501)
Test case

Bug:
llvm assembly that contains the branch instruction 'br' uses the indexed
addressing mode, instead of direct mode which is intended.

Description:
Let there be a branch from label A to label B. The code would be:
.L_A
  br #.L_B

...
Some code that doesn't fit in the offset range of absolute jump. Hence branch
instruction is used.
...

.L_B
  mov #0, r15
  ret

The msp430x1xx user guide specifies 7 addressing modes for 'br' instruction.
The relevant ones are:

1. BR #EXEC 
;Branch to label EXEC or direct branch (e.g. #0A4h)
; Core instruction MOV @PC+,PC

2. BR EXEC 
; Branch to the address contained in EXEC
; Core instruction MOV X(PC),PC
; Indirect address

3. BR &EXEC 
; Branch to the address contained in absolute
; address EXEC
; Core instruction MOV X(0),PC
; Indirect address

In the above example, we want to branch to a label (direct addressing mode) and
hence we should use the first addressing mode (br #EXEC). For the same purpose,
llvm generates code that uses second addressing mode (br EXEC).

Branch instructions are emulated as: br dst -> mov.w dst, pc

The llvm generated code gets translated to 
mov.w $off(PC), PC
Here offset is an integer corresponding to the jump offset. 

What actually happens: PC = mem[PC + offset]
Desired instruction: PC = PC + offset

Fix: Labels for branch instruction should be prefixed with '#' to make it
direct addressing mode.

I am attaching all the relevant files. The test case is fairly big (55 lines)
because 'br' instruction is generated only when the offset is huge. It
shouldn't be a problem for this bug though.

Cmd line options:

pagariya at aleph:~/tmp$ clang -ccc-host-triple msp430-elf
-I/home/pagariya/res-pagariya/llvm-msp430/msp430/include -nostdinc -v -O0 -S
foo.c
clang version 1.1 (trunk 184)
Target: msp430-elf-
Thread model: posix
 "/uusoc/facility/res/embed/users/pagariya/llvm-msp430/bin/clang" -cc1 -triple
msp430-elf- -S -disable-free -main-file-name foo.c -mrelocation-model static
-mdisable-fp-elim -mconstructor-aliases -v -nostdinc -resource-dir
/uusoc/facility/res/embed/users/pagariya/llvm-msp430/lib/clang/1.1
-I/home/pagariya/res-pagariya/llvm-msp430/msp430/include -O0 -fmessage-length
102 -fgnu-runtime -fdiagnostics-show-option -fcolor-diagnostics -o foo.s -x c
foo.c
clang -cc1 version 1.1 based upon llvm 2.7svn hosted on i386-pc-linux-gnu
#include "..." search starts here:
#include <...> search starts here:
 /home/pagariya/res-pagariya/llvm-msp430/msp430/include
 /uusoc/facility/res/embed/users/pagariya/llvm-msp430/lib/clang/1.1/include
End of search list.

pagariya at aleph:~/tmp$ clang -ccc-host-triple msp430-elf
-L/home/pagariya/res-pagariya/llvm-msp430/lib/msp430
-L/home/pagariya/res-pagariya/llvm-msp430/msp430/lib
-L/home/pagariya/res-pagariya/llvm-msp430/lib/gcc-lib/msp430/3.2.3
-Wl,-m,msp430x1611 -o foo.elf
/home/pagariya/res-pagariya/llvm-msp430/msp430/lib/crt430x1611.o foo-asm.s
-lgcc -v
clang version 1.1 (trunk 184)
Target: msp430-elf-
Thread model: posix
 "/uusoc/facility/res/embed/users/pagariya/llvm-msp430/bin/msp430-as" -o
/tmp/cc-tgCJbV.o foo-asm.s
 "/uusoc/facility/res/embed/users/pagariya/llvm-msp430/bin/msp430-ld" -o
foo.elf -L/home/pagariya/res-pagariya/llvm-msp430/lib/msp430
-L/home/pagariya/res-pagariya/llvm-msp430/msp430/lib
-L/home/pagariya/res-pagariya/llvm-msp430/lib/gcc-lib/msp430/3.2.3 -m
msp430x1611 /home/pagariya/res-pagariya/llvm-msp430/msp430/lib/crt430x1611.o
/tmp/cc-tgCJbV.o -lgcc -L../lib/ -lcompiler_rt.Generic -lc

pagariya at aleph:~/tmp$ uname -a
Linux aleph 2.6.24-24-generic #1 SMP Fri Sep 18 16:49:39 UTC 2009 i686
GNU/Linux

-- 
Configure bugmail: http://llvm.org/bugs/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are on the CC list for the bug.



More information about the llvm-bugs mailing list