# [LLVMbugs] [Bug 1909] New: Serious tail merging pessimization

bugzilla-daemon at cs.uiuc.edu bugzilla-daemon at cs.uiuc.edu
Sat Jan 12 11:52:21 PST 2008

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

Summary: Serious tail merging pessimization
Product: libraries
Version: 2.1
Platform: PC
OS/Version: All
Status: NEW
Keywords: code-quality
Severity: normal
Priority: P2
Component: Common Code Generator Code
AssignedTo: unassignedbugs at nondot.org
ReportedBy: sabre at nondot.org
CC: dalej at apple.com, llvmbugs at cs.uiuc.edu

Consider:

#include <stdio.h>
#include <stdlib.h>

#define MIN(a,b) ((a)<(b)?(a):(b))
#define MAX(a,b) ((a)>(b)?(a):(b))
void minmax(float result[8]) {
float min_x, max_x, min_y, max_y;

min_x = MIN(result[0], MIN(result[2], MIN(result[4], result[6])));
max_x = MAX(result[0], MAX(result[2], MAX(result[4], result[6])));
min_y = MIN(result[1], MIN(result[3], MIN(result[5], result[7])));
max_y = MAX(result[1], MAX(result[3], MAX(result[5], result[7])));

printf("transformed bounds: (%.2f, %.2f), (%.2f, %.2f)\n", min_x, min_y,
max_x, max_y);
}

Without tail merging, we get ugly code.  With tail merging, we get aweful code
:)  It seems to be merging lots of "single instructions", yielding code like
this:

LBB1_53:        # bb
ucomiss %xmm3, %xmm1
jmp     LBB1_2  # bb21
LBB1_54:        # bb128
ucomiss %xmm1, %xmm3
jmp     LBB1_15 # bb136
LBB1_55:        # bb243
ucomiss %xmm3, %xmm1
jmp     LBB1_28 # bb251
LBB1_56:        # bb358
ucomiss %xmm1, %xmm3
jmp     LBB1_41 # bb366
LBB1_57:        # bb395
ucomiss %xmm0, %xmm2
jmp     LBB1_44 # bb385
LBB1_58:        # bb425.bb456_crit_edge
movl    %edi, %eax
jmp     LBB1_52 # bb456
...

at the end of the function.  If this is what is happening, it should be fixed.
Saving a single instruction isn't worthwhile because we have to add the jump,
and this makes code potentially slower.

--
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.

```