TVM-Compiler
TVM-Compiler copied to clipboard
Suboptimal code generation for if-then-else
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