TVM-Compiler icon indicating copy to clipboard operation
TVM-Compiler copied to clipboard

Suboptimal code generation for if-then-else

Open mskvortsov opened this issue 5 years ago • 0 comments

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

mskvortsov avatar Jan 15 '20 09:01 mskvortsov