[LLVMbugs] [Bug 5979] New: msp430 backend: incorrect conditional jump

bugzilla-daemon at cs.uiuc.edu bugzilla-daemon at cs.uiuc.edu
Fri Jan 8 12:24:37 PST 2010


           Summary: msp430 backend: incorrect conditional jump
           Product: new-bugs
           Version: trunk
          Platform: PC
        OS/Version: All
            Status: NEW
          Severity: normal
          Priority: P2
         Component: new bugs
        AssignedTo: unassignedbugs at nondot.org
        ReportedBy: ransford at cs.umass.edu
                CC: asl at math.spbu.ru, llvmbugs at cs.uiuc.edu

Created an attachment (id=4014)
 --> (http://llvm.org/bugs/attachment.cgi?id=4014)
Tiny test case

Given this C code:

% cat tiny.c
int main (void) {
    int i;
    for (i = 0; i < 100; ++i) {

In LLVM IR, the loop header looks like this:

for.cond:                                         ; preds = %for.inc, %entry
  %tmp = load i16* %i                             ; <i16> [#uses=1]
  %cmp = icmp slt i16 %tmp, 100                   ; <i1> [#uses=1]
  br i1 %cmp, label %for.body, label %for.end

... which says "go to %for.body if %i < 100, else go to %for.end -- this is
correct. However, run that IR through llc -march=msp430 and you get this
incorrect MSP430 code:

; BB#0:                                                     ; %entry
        sub.w   #4, r1
        mov.w   #0, 2(r1)
        mov.w   #0, 0(r1)
.LBB1_1:                                                    ; %for.cond
                                                            ; Loop Depth 1
                                                            ; Loop Header
                                                            ; Inner Loop
        cmp.w   #99, 0(r1)
        jl      .LBB1_3
; BB#2:                                                     ; %for.body
                                                            ; Loop Depth 1
                                                            ; Loop Header is
                                                            ; Inner Loop
        add.w   #1, 0(r1)
        jmp     .LBB1_1
.LBB1_3:                                                    ; %for.end
        mov.w   2(r1), r15
        add.w   #4, r1
        .size   main, .-main

The conditional branch goes the wrong way! Of course 0 < 99, so the loop body
(BB#2) never gets executed.

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