https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90255
Richard Earnshaw <rearnsha at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |ramana.radhakrishnan at arm dot co | |m, vmakarov at redhat dot com, | |wdijkstr at arm dot com --- Comment #1 from Richard Earnshaw <rearnsha at gcc dot gnu.org> --- [committed too early] It looks like a 64-bit constant 0 is held over a function call when the code could just initialize the registers directly. Code before commit: main: @ Function supports interworking. @ args = 0, pretend = 0, frame = 24 @ frame_needed = 0, uses_anonymous_args = 0 push {r4, r5, r6, r7, r8, r9, r10, lr} // 8 registers saved. ldr r3, [r1] ldr r5, .L14 cmp r0, #4 mov r4, r1 str r3, [r5] sub sp, sp, #48 // 48 bytes stack space blne usage .L2: ldmib r4, {r6, r8} ldr r1, .L14+4 mov r0, r6 add r2, sp, #28 ldr r7, [r4, #12] bl sscanf cmp r0, #1 beq .L3 ldr r3, .L14+8 ldr r0, [r3] mov r3, r6 ldr r2, [r5] ldr r1, .L14+12 .L12: ldr r0, [r0, #8] bl fprintf mov r0, #1 .L13: bl exit .L3: mov r0, r8 ldr r1, .L14+16 add r2, sp, #44 bl sscanf cmp r0, #1 beq .L4 ldr r3, .L14+8 ldr r2, [r5] ldr r0, [r3] ldr r1, .L14+20 mov r3, r8 b .L12 .L4: mov r0, r7 ldr r1, .L14+24 bl fopen subs r4, r0, #0 bne .L5 ldr r3, .L14+8 ldr r2, [r5] ldr r0, [r3] ldr r1, .L14+28 mov r3, r7 b .L12 .L5: mov r1, r4 ldr r0, .L14+32 bl fputs mov r5, #0 mov r8, #1065353216 ldr r9, .L14+36 .L6: ldr r10, [sp, #28] cmp r10, r5 bgt .L7 mov r0, r4 bl fclose mov r0, #0 b .L13 .L7: mov r0, r5 bl __aeabi_i2d mov r6, r0 mov r0, r10 mov r7, r1 bl __aeabi_i2d mov r2, r0 mov r3, r1 mov r0, r6 mov r1, r7 bl __aeabi_ddiv mov r2, #0 mov r3, #0 bl __aeabi_dadd bl __aeabi_d2f mov r6, r0 mov r3, r0 add r2, sp, #40 add r1, sp, #36 add r0, sp, #32 str r8, [sp, #4] @ float str r8, [sp] @ float bl dyeHSVtoRGB mov r0, r6 bl __aeabi_f2d ldr r10, [sp, #44] @ float mov r6, r0 mov r7, r1 mov r0, r10 ldr r1, [sp, #40] @ float bl __aeabi_fmul bl __aeabi_f2d str r0, [sp, #16] str r1, [sp, #20] ldr r1, [sp, #36] @ float mov r0, r10 bl __aeabi_fmul bl __aeabi_f2d str r0, [sp, #8] str r1, [sp, #12] ldr r1, [sp, #32] @ float mov r0, r10 bl __aeabi_fmul bl __aeabi_f2d mov r2, r6 stm sp, {r0-r1} mov r3, r7 mov r1, r9 mov r0, r4 bl fprintf add r5, r5, #1 b .L6 after r 266385 main: @ Function supports interworking. @ args = 0, pretend = 0, frame = 32 @ frame_needed = 0, uses_anonymous_args = 0 push {r4, r5, r6, r7, r8, r9, r10, fp, lr} // 9 regs saved ldr r3, [r1] ldr r5, .L14 cmp r0, #4 mov r4, r1 str r3, [r5] sub sp, sp, #60 // 60 bytes stack space blne usage .L2: ldmib r4, {r6, r8} ldr r1, .L14+4 mov r0, r6 add r2, sp, #36 ldr r7, [r4, #12] bl sscanf cmp r0, #1 beq .L3 ldr r3, .L14+8 ldr r0, [r3] mov r3, r6 ldr r2, [r5] ldr r1, .L14+12 .L12: ldr r0, [r0, #8] bl fprintf mov r0, #1 .L13: bl exit .L3: mov r0, r8 ldr r1, .L14+16 add r2, sp, #52 bl sscanf cmp r0, #1 beq .L4 ldr r3, .L14+8 ldr r2, [r5] ldr r0, [r3] ldr r1, .L14+20 mov r3, r8 b .L12 .L4: mov r0, r7 ldr r1, .L14+24 bl fopen subs r4, r0, #0 bne .L5 ldr r3, .L14+8 ldr r2, [r5] ldr r0, [r3] ldr r1, .L14+28 mov r3, r7 b .L12 .L5: mov r1, r4 ldr r0, .L14+32 bl fputs mov r5, #0 mov r8, #0 // Additional register initialization mov r9, #0 // Additional register initialization mov r10, #1065353216 ldr fp, .L14+36 .L6: ldr r3, [sp, #36] cmp r3, r5 bgt .L7 mov r0, r4 bl fclose mov r0, #0 b .L13 .L7: mov r0, r5 str r3, [sp, #24] bl __aeabi_i2d ldr r3, [sp, #24] mov r6, r0 mov r0, r3 mov r7, r1 bl __aeabi_i2d mov r2, r0 mov r3, r1 mov r0, r6 mov r1, r7 bl __aeabi_ddiv mov r2, r8 // r8,r9 are never changed, and always 0, just use immediate value mov r3, r9 bl __aeabi_dadd bl __aeabi_d2f mov r6, r0 mov r3, r0 add r2, sp, #48 add r1, sp, #44 add r0, sp, #40 str r10, [sp, #4] @ float str r10, [sp] @ float bl dyeHSVtoRGB mov r0, r6 bl __aeabi_f2d mov r2, r0 mov r3, r1 ldr r7, [sp, #52] @ float ldr r1, [sp, #48] @ float mov r0, r7 str r2, [sp, #24] str r3, [sp, #28] bl __aeabi_fmul bl __aeabi_f2d str r0, [sp, #16] str r1, [sp, #20] ldr r1, [sp, #44] @ float mov r0, r7 bl __aeabi_fmul bl __aeabi_f2d str r0, [sp, #8] str r1, [sp, #12] ldr r1, [sp, #40] @ float mov r0, r7 bl __aeabi_fmul bl __aeabi_f2d add r3, sp, #24 ldmia r3, {r2-r3} stm sp, {r0-r1} mov r1, fp mov r0, r4 bl fprintf add r5, r5, #1 b .L6