Skip to content

Suboptimal code generation for if-then-else #85

Description

@mskvortsov
int g(int);
int h(int);
int foo(int v) {
  if (v < 0)
    return g(7);
  return h(13);
}

define dso_local i257 @foo(i257 %v) local_unnamed_addr #0 {
entry:
  %cmp = icmp slt i257 %v, 0
  br i1 %cmp, label %if.then, label %if.end

if.then:                                          ; preds = %entry
  %call = tail call i257 @g(i257 7) #2
  br label %return

if.end:                                           ; preds = %entry
  %call1 = tail call i257 @h(i257 13) #2
  br label %return

return:                                           ; preds = %if.end, %if.then
  %retval.0 = phi i257 [ %call, %if.then ], [ %call1, %if.end ]
  ret i257 %retval.0
}

foo:                                    ; @foo
; %bb.0:                                ; %entry
                                        ; { %5 | - }
  PUSHINT 0                       ; >%21 = CONST_I257 i257 0
                                        ; { %5 | %21 | - }
  LESS                            ; >%6 = SLT %5, %21
                                        ; { %6 | - }
  PUSH  c0                      ; >%3 = PUSHC i257 0
                                        ; { %6 | %3 | - }
  PUSHCONT                        ; >%17 = PUSHCONT_MBB %bb.3, 0
                                        ; { %6 | %3 | %17 | - }
  {
; %bb.3:                                ; %return
                                        ; { %3 | %18 | - }
    SWAP                          ; { %18 | %3 | - }
    POP c0                      ; { %18 | - }
                                        ; fallthrough return

  }
  PUSHCONT                        ; >%20 = PUSHCONT_MBB %bb.1, 0
                                        ; { %6 | %3 | %17 | %20 | - }
  {
; %bb.1:                                ; %if.then
                                        ; { %3 | %17 | - }
    PUSHINT 7               ; >%23 = CONST_I257 i257 7
                                        ; { %3 | %17 | %23 | - }
    CALL  $g$                     ; >%18 = CALL_1_INT @g, %23
                                        ; { %3 | %17 | %18 | - }
    SWAP                          ; { %3 | %18 | %17 | - }
    JMPX                          ; { %3 | %18 | %17 | - } => { %3 | %18 | - }
  }
  ROLLREV 2                       ; { %6 | %20 | %3 | %17 | - }
  ROLL  3                       ; { %20 | %3 | %17 | %6 | - }
  ROLL  3                       ; { %3 | %17 | %6 | %20 | - }
  IFJMP                           ; { %3 | %17 | %6 | %20 | - } => { %3 | %17 | - }
; %bb.2:                                ; %if.end
                                        ; { %3 | %17 | - }
  PUSHINT 13                      ; >%22 = CONST_I257 i257 13
                                        ; { %3 | %17 | %22 | - }
  CALL  $h$                     ; >%18 = CALL_1_INT @h, %22
                                        ; { %3 | %17 | %18 | - }
  SWAP                            ; { %3 | %18 | %17 | - }
  JMPX                            ; { %3 | %18 | %17 | - } => { %3 | %18 | - }

An ideal output would be

PUSHINT 0
LESS
PUSHCONT { PUSHINT 13 CALL $h$ }
PUSHCONT { PUSHINT  7 CALL $g$ }
IFELSE

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions