Basic blocks and compilers

Christian Christmann <>
7 Jan 2006 21:44:36 -0500

          From comp.compilers

Related articles
Basic blocks and compilers (Christian Christmann) (2006-01-07)
Re: Basic blocks and compilers (George Neuner) (2006-01-09)
Re: Basic blocks and compilers ( (2006-01-09)
Re: Basic blocks and compilers (2006-01-09)
Re: Basic blocks and compilers (Hans-Peter Diettrich) (2006-01-09)
Re: Basic blocks and compilers (Paolo Bonzini) (2006-01-09)
Re: Basic blocks and compilers (Ken Rose) (2006-01-09)
[2 later articles]
| List of all articles for this month |

From: Christian Christmann <>
Newsgroups: comp.compilers
Date: 7 Jan 2006 21:44:36 -0500
Organization: Arcor
Keywords: analysis, question
Posted-Date: 07 Jan 2006 21:44:36 EST


I'm using the tricore-gcc v2.8.1 to generate code for my Infineon
TriCore DSP. Analyzing the generated code (compiled with -O0), I
noticed a strange behavior of the compiler. (My questions do not
concern a specific processor but more the theory behind the assembly

Here is the code for a simple C function "loopfunc" that is
called from the main function (not included):

                .file "for.c"
                # Generated by gcc 2.8.1 for TRICORE (generic)
                .section .text
                .align 1
                .global loopfunc
                .type loopfunc,@function
                # arg_overflow_area = 0, pretend = 0
                # frame_size = 12, outgoing_args_size = 0
                # f_size = 16, frame_pointer_needed = 0
                # pool_size = 0
                sub.a %SP, 16 # allocate space for locals
                st.w [%a10] 12, %d4
                mov %d1, 0
                st.w [%a10] 8, %d1
                ld.w %d15, [%a10] 8
                ld.w %d0, [%a10] 12
                jlt %d15, %d0, .L5
                j .L3
                ld.w %d15, [%a10] 4
                add %d0, %d15, 1
                st.w [%a10] 4, %d0
                ld.w %d15, [%a10] 8
                add %d0, %d15, 1
                st.w [%a10] 8, %d0
                j .L2
                ld.w %d15, [%a10] 4
                mov %d2, %d15
                j .L1
                .align 1
                .global main
                .type main,@function

I don't understand why the compiler
1) is not spliting basic block .L2 into two blocks where
the second block just contains the instruction "j .L3".
I though that each re-direction of the control flow imposes the
creation of a new basic block (like .L4 and .L3). The instuction
"jlt %d15, %d0, .L5" can possibly direct the program flow to .L5 and
thus, in my opinion, the basic block should end here.
2) splits block .L5 and .L4? There are no
calls to label .L4, so, according to my understanding, all instructions
of blocks .L5 and .L4 should be held in one block.

Might these two points be bugs or do the authors of the tricore-gcc
have a different definition of basic blocks?

I would be very glad if you could shed some light on my questions.

Thank you.


Post a followup to this message

Return to the comp.compilers page.
Search the comp.compilers archives again.