public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug target/56441] New: [ARM Thumb] generated asm code produces "branch out of range" error in gas with -O1 -mcpu=cortex-m3
@ 2013-02-25 8:25 gnugcc at emblocks dot org
2013-02-25 8:31 ` [Bug target/56441] " gnugcc at emblocks dot org
` (11 more replies)
0 siblings, 12 replies; 13+ messages in thread
From: gnugcc at emblocks dot org @ 2013-02-25 8:25 UTC (permalink / raw)
To: gcc-bugs
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56441
Bug #: 56441
Summary: [ARM Thumb] generated asm code produces "branch out of
range" error in gas with -O1 -mcpu=cortex-m3
Classification: Unclassified
Product: gcc
Version: 4.7.3
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: target
AssignedTo: unassigned@gcc.gnu.org
ReportedBy: gnugcc@emblocks.org
Already applied patch 43961.
Only with -O1 (other optimizations levels are going well).
The .LVL137 (cbnz) is giving the error.
snippet:
strb r4, [r0, #30]
.LVL136:
.loc 1 2362 0
ldrb r1, [r1, #15] @ zero_extendqisi2
.LVL137:
cbnz r1, .L35
.LVL138:
.loc 1 2366 0
mov r1, #30
b .L6
.LVL139:
^ permalink raw reply [flat|nested] 13+ messages in thread
* [Bug target/56441] [ARM Thumb] generated asm code produces "branch out of range" error in gas with -O1 -mcpu=cortex-m3
2013-02-25 8:25 [Bug target/56441] New: [ARM Thumb] generated asm code produces "branch out of range" error in gas with -O1 -mcpu=cortex-m3 gnugcc at emblocks dot org
@ 2013-02-25 8:31 ` gnugcc at emblocks dot org
2013-02-25 9:14 ` jakub at gcc dot gnu.org
` (10 subsequent siblings)
11 siblings, 0 replies; 13+ messages in thread
From: gnugcc at emblocks dot org @ 2013-02-25 8:31 UTC (permalink / raw)
To: gcc-bugs
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56441
--- Comment #1 from gnugcc at emblocks dot org 2013-02-25 08:31:31 UTC ---
@ ..\..\src\samba\smblib.c:2362
.loc 1 2362 0
@(insn 688 1291 1292 45 (set (reg:SI 1 r1 [orig:698 MEM[(const unsigned char
*)name_10(D) + 15B] ] [698])
@ (zero_extend:SI (mem:QI (plus:SI (reg/v/f:SI 1 r1 [orig:454 name ]
[454])
@ (const_int 15 [0xf])) [0 MEM[(const unsigned char
*)name_10(D) + 15B]+0 S1 A8]))) ..\..\src\samba\smblib.c:2362 735
{thumb2_zero_extendqisi2_v6}
@ (nil))
ldrb r1, [r1, #15] @ zero_extendqisi2 @ 688
thumb2_zero_extendqisi2_v6/2 [length = 4]
.LVL137:
@ SUCC: 66 [95.5%] 48 [4.5%] (fallthru)
@(jump_insn 690 689 1296 45 (parallel [
@ (set (pc)
@ (if_then_else (ne (reg:SI 1 r1 [orig:698 MEM[(const unsigned
char *)name_10(D) + 15B] ] [698])
@ (const_int 0 [0]))
@ (label_ref 721)
@ (pc)))
@ (clobber (reg:CC 24 cc))
@ ]) ..\..\src\samba\smblib.c:2362 753 {*thumb2_cbnz}
@ (expr_list:REG_DEAD (reg:SI 1 r1 [orig:698 MEM[(const unsigned char
*)name_10(D) + 15B] ] [698])
@ (expr_list:REG_UNUSED (reg:CC 24 cc)
@ (expr_list:REG_BR_PROB (const_int 9550 [0x254e])
@ (nil))))
@ -> 721)
cbnz r1, .L35 @ 690 *thumb2_cbnz/1 [length = 2]
.LVL138:
@ BLOCK 48 freq:6 seq:16
@ PRED: 45 [4.5%] (fallthru)
@ ..\..\src\samba\smblib.c:2366
.loc 1 2366 0
@(insn 38 851 1049 48 (set (reg/v:SI 1 r1 [orig:212 j ] [212])
@ (const_int 30 [0x1e])) ..\..\src\samba\smblib.c:2366 714
{*thumb2_movsi_insn}
@ (expr_list:REG_EQUAL (const_int 30 [0x1e])
@ (nil)))
mov r1, #30 @ 38 *thumb2_movsi_insn/2 [length = 4]
@ SUCC: 63 [100.0%]
@(jump_insn 1049 38 1050 48 (set (pc)
@ (label_ref 691)) 236 {*arm_jump}
@ (nil)
@ -> 691)
b .L6 @ 1049 *arm_jump [length = 2]
^ permalink raw reply [flat|nested] 13+ messages in thread
* [Bug target/56441] [ARM Thumb] generated asm code produces "branch out of range" error in gas with -O1 -mcpu=cortex-m3
2013-02-25 8:25 [Bug target/56441] New: [ARM Thumb] generated asm code produces "branch out of range" error in gas with -O1 -mcpu=cortex-m3 gnugcc at emblocks dot org
2013-02-25 8:31 ` [Bug target/56441] " gnugcc at emblocks dot org
@ 2013-02-25 9:14 ` jakub at gcc dot gnu.org
2013-02-25 11:36 ` gnugcc at emblocks dot org
` (9 subsequent siblings)
11 siblings, 0 replies; 13+ messages in thread
From: jakub at gcc dot gnu.org @ 2013-02-25 9:14 UTC (permalink / raw)
To: gcc-bugs
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56441
Jakub Jelinek <jakub at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|UNCONFIRMED |WAITING
Last reconfirmed| |2013-02-25
CC| |jakub at gcc dot gnu.org
Ever Confirmed|0 |1
--- Comment #2 from Jakub Jelinek <jakub at gcc dot gnu.org> 2013-02-25 09:14:17 UTC ---
You need to provide preprocessed testcase, see http://gcc.gnu.org/bugs.html for
details.
^ permalink raw reply [flat|nested] 13+ messages in thread
* [Bug target/56441] [ARM Thumb] generated asm code produces "branch out of range" error in gas with -O1 -mcpu=cortex-m3
2013-02-25 8:25 [Bug target/56441] New: [ARM Thumb] generated asm code produces "branch out of range" error in gas with -O1 -mcpu=cortex-m3 gnugcc at emblocks dot org
2013-02-25 8:31 ` [Bug target/56441] " gnugcc at emblocks dot org
2013-02-25 9:14 ` jakub at gcc dot gnu.org
@ 2013-02-25 11:36 ` gnugcc at emblocks dot org
2013-02-25 11:41 ` gnugcc at emblocks dot org
` (8 subsequent siblings)
11 siblings, 0 replies; 13+ messages in thread
From: gnugcc at emblocks dot org @ 2013-02-25 11:36 UTC (permalink / raw)
To: gcc-bugs
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56441
--- Comment #3 from gnugcc at emblocks dot org 2013-02-25 11:35:53 UTC ---
The "Reporting Bugs" manual isn't taht clear.
It says
"What we need:
the preprocessed file (*.i*) that triggers the bug, generated by adding
-save-temps to the complete compilation command, or, in the case of a bug
report for the GNAT front end, a complete set of source files (see below)."
And below:
"What we do not want:
Assembly files (*.s) produced by the compiler, or any binary files, such as
object files, executables, core files, or precompiled header files"
But the issue is according my first quick looks:
The computed length (all the lengths from cbnz to label) = 124 and should fit.
However
b .L6 @ 1049 *arm_jump [length = 2]
This is set at a length of 2 but it assembles always as a b.w (at least in
thumb mode) which has a length of 4.
If I need to provide other stuff, please let me know.
Regards
^ permalink raw reply [flat|nested] 13+ messages in thread
* [Bug target/56441] [ARM Thumb] generated asm code produces "branch out of range" error in gas with -O1 -mcpu=cortex-m3
2013-02-25 8:25 [Bug target/56441] New: [ARM Thumb] generated asm code produces "branch out of range" error in gas with -O1 -mcpu=cortex-m3 gnugcc at emblocks dot org
` (2 preceding siblings ...)
2013-02-25 11:36 ` gnugcc at emblocks dot org
@ 2013-02-25 11:41 ` gnugcc at emblocks dot org
2013-02-25 13:15 ` gnugcc at emblocks dot org
` (7 subsequent siblings)
11 siblings, 0 replies; 13+ messages in thread
From: gnugcc at emblocks dot org @ 2013-02-25 11:41 UTC (permalink / raw)
To: gcc-bugs
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56441
--- Comment #4 from gnugcc at emblocks dot org 2013-02-25 11:40:45 UTC ---
Created attachment 29534
--> http://gcc.gnu.org/bugzilla/attachment.cgi?id=29534
This file shows/reproduce the error
^ permalink raw reply [flat|nested] 13+ messages in thread
* [Bug target/56441] [ARM Thumb] generated asm code produces "branch out of range" error in gas with -O1 -mcpu=cortex-m3
2013-02-25 8:25 [Bug target/56441] New: [ARM Thumb] generated asm code produces "branch out of range" error in gas with -O1 -mcpu=cortex-m3 gnugcc at emblocks dot org
` (3 preceding siblings ...)
2013-02-25 11:41 ` gnugcc at emblocks dot org
@ 2013-02-25 13:15 ` gnugcc at emblocks dot org
2013-02-25 16:48 ` gnugcc at emblocks dot org
` (6 subsequent siblings)
11 siblings, 0 replies; 13+ messages in thread
From: gnugcc at emblocks dot org @ 2013-02-25 13:15 UTC (permalink / raw)
To: gcc-bugs
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56441
--- Comment #5 from gnugcc at emblocks dot org 2013-02-25 13:14:46 UTC ---
Could it be that in the file arm.md concerning the following snippet:
(define_insn "*arm_jump"
[(set (pc)
(label_ref (match_operand 0 "" "")))]
"TARGET_32BIT"
"*
{
if (arm_ccfsm_state == 1 || arm_ccfsm_state == 2)
{
arm_ccfsm_state += 2;
return \"\";
}
return \"b%?\\t%l0\";
}
"
[(set_attr "predicable" "yes")
(set (attr "length")
(if_then_else
(and (match_test "TARGET_THUMB2")
(and (ge (minus (match_dup 0) (pc)) (const_int -2044))
(le (minus (match_dup 0) (pc)) (const_int 2048))))
(const_int 2)
(const_int 4)))]
)
the (match_test "TARGET_THUMB2") must be replaced by
(and (not(match_test "TARGET_THUMB2"))
same for
- "*arm_cond_branch"
- "*arm_cond_branch_reversed"
the assembler always uses b.w even if the branch is only 10 bytes away.
Regards
^ permalink raw reply [flat|nested] 13+ messages in thread
* [Bug target/56441] [ARM Thumb] generated asm code produces "branch out of range" error in gas with -O1 -mcpu=cortex-m3
2013-02-25 8:25 [Bug target/56441] New: [ARM Thumb] generated asm code produces "branch out of range" error in gas with -O1 -mcpu=cortex-m3 gnugcc at emblocks dot org
` (4 preceding siblings ...)
2013-02-25 13:15 ` gnugcc at emblocks dot org
@ 2013-02-25 16:48 ` gnugcc at emblocks dot org
2013-02-26 9:06 ` gnugcc at emblocks dot org
` (5 subsequent siblings)
11 siblings, 0 replies; 13+ messages in thread
From: gnugcc at emblocks dot org @ 2013-02-25 16:48 UTC (permalink / raw)
To: gcc-bugs
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56441
--- Comment #6 from gnugcc at emblocks dot org 2013-02-25 16:47:51 UTC ---
The work-around is working but it is not the correct way.
I'm cheating that a branch is always 4 bytes in Thumb2 (which is actually the
case with the broken assembler).
I can't assemble " b <label>" without getting " b.w <label>" in Thumb 2. So a
2bytes branch isn't possible right now.
Binutils version 2.22.0 and 2.23.1.
^ permalink raw reply [flat|nested] 13+ messages in thread
* [Bug target/56441] [ARM Thumb] generated asm code produces "branch out of range" error in gas with -O1 -mcpu=cortex-m3
2013-02-25 8:25 [Bug target/56441] New: [ARM Thumb] generated asm code produces "branch out of range" error in gas with -O1 -mcpu=cortex-m3 gnugcc at emblocks dot org
` (5 preceding siblings ...)
2013-02-25 16:48 ` gnugcc at emblocks dot org
@ 2013-02-26 9:06 ` gnugcc at emblocks dot org
2013-02-26 17:02 ` rearnsha at gcc dot gnu.org
` (4 subsequent siblings)
11 siblings, 0 replies; 13+ messages in thread
From: gnugcc at emblocks dot org @ 2013-02-26 9:06 UTC (permalink / raw)
To: gcc-bugs
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56441
--- Comment #7 from gnugcc at emblocks dot org 2013-02-26 09:05:36 UTC ---
I was looking completely wrong, the arm_addsi3 is acting wrong.
The "add%?\\t%0, %1, %2" for "=l,%0,Py" is set at a length of 2.
(first entry in the list)
However the "ADD r6,r6, #65" is a thumb2 instruction which is 4 bytes and not
2.
An "ADDS r6,r6,#65" will go right because this is a thumb instruction of 2
bytes.
Same for the first "SUB" in the same list.
So I end up with a miscalculation of 2bytes.
Perhaps it's better to make it conservative and always use length of 4.
I guess that this isn't the right way but I have put un-predicables in front of
the predicable counter parts with the right length of 4.
^ permalink raw reply [flat|nested] 13+ messages in thread
* [Bug target/56441] [ARM Thumb] generated asm code produces "branch out of range" error in gas with -O1 -mcpu=cortex-m3
2013-02-25 8:25 [Bug target/56441] New: [ARM Thumb] generated asm code produces "branch out of range" error in gas with -O1 -mcpu=cortex-m3 gnugcc at emblocks dot org
` (6 preceding siblings ...)
2013-02-26 9:06 ` gnugcc at emblocks dot org
@ 2013-02-26 17:02 ` rearnsha at gcc dot gnu.org
2013-02-26 17:03 ` rearnsha at gcc dot gnu.org
` (3 subsequent siblings)
11 siblings, 0 replies; 13+ messages in thread
From: rearnsha at gcc dot gnu.org @ 2013-02-26 17:02 UTC (permalink / raw)
To: gcc-bugs
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56441
--- Comment #8 from Richard Earnshaw <rearnsha at gcc dot gnu.org> 2013-02-26 17:01:36 UTC ---
Please use an open (non-proprietory) file format for attaching files. I don't
have access to RAR format.
^ permalink raw reply [flat|nested] 13+ messages in thread
* [Bug target/56441] [ARM Thumb] generated asm code produces "branch out of range" error in gas with -O1 -mcpu=cortex-m3
2013-02-25 8:25 [Bug target/56441] New: [ARM Thumb] generated asm code produces "branch out of range" error in gas with -O1 -mcpu=cortex-m3 gnugcc at emblocks dot org
` (7 preceding siblings ...)
2013-02-26 17:02 ` rearnsha at gcc dot gnu.org
@ 2013-02-26 17:03 ` rearnsha at gcc dot gnu.org
2013-02-26 17:25 ` gnugcc at emblocks dot org
` (2 subsequent siblings)
11 siblings, 0 replies; 13+ messages in thread
From: rearnsha at gcc dot gnu.org @ 2013-02-26 17:03 UTC (permalink / raw)
To: gcc-bugs
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56441
--- Comment #9 from Richard Earnshaw <rearnsha at gcc dot gnu.org> 2013-02-26 17:03:10 UTC ---
(In reply to comment #7)
> I was looking completely wrong, the arm_addsi3 is acting wrong.
>
> The "add%?\\t%0, %1, %2" for "=l,%0,Py" is set at a length of 2.
> (first entry in the list)
>
> However the "ADD r6,r6, #65" is a thumb2 instruction which is 4 bytes and not
> 2.
>
> An "ADDS r6,r6,#65" will go right because this is a thumb instruction of 2
> bytes.
>
> Same for the first "SUB" in the same list.
>
> So I end up with a miscalculation of 2bytes.
>
> Perhaps it's better to make it conservative and always use length of 4.
>
>
> I guess that this isn't the right way but I have put un-predicables in front of
> the predicable counter parts with the right length of 4.
This doesn't make sense. arm_addsi3 in my copy of the sources doesn't use the
Py constraint.
Exactly what version of GCC are you using?
^ permalink raw reply [flat|nested] 13+ messages in thread
* [Bug target/56441] [ARM Thumb] generated asm code produces "branch out of range" error in gas with -O1 -mcpu=cortex-m3
2013-02-25 8:25 [Bug target/56441] New: [ARM Thumb] generated asm code produces "branch out of range" error in gas with -O1 -mcpu=cortex-m3 gnugcc at emblocks dot org
` (8 preceding siblings ...)
2013-02-26 17:03 ` rearnsha at gcc dot gnu.org
@ 2013-02-26 17:25 ` gnugcc at emblocks dot org
2013-02-26 17:51 ` gnugcc at emblocks dot org
2013-03-05 7:07 ` rearnsha at gcc dot gnu.org
11 siblings, 0 replies; 13+ messages in thread
From: gnugcc at emblocks dot org @ 2013-02-26 17:25 UTC (permalink / raw)
To: gcc-bugs
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56441
--- Comment #10 from gnugcc at emblocks dot org 2013-02-26 17:24:52 UTC ---
The ARM branch, sorry I see now that the trunk is different.
Arm branch:
;; The r/r/k alternative is required when reloading the address
;; (plus (reg rN) (reg sp)) into (reg rN). In this case reload will
;; put the duplicated register first, and not try the commutative version.
(define_insn_and_split "*arm_addsi3"
[(set (match_operand:SI 0 "s_register_operand" "=l, r, k,r,r, k, l,
r, k,r, k, r")
(plus:SI (match_operand:SI 1 "s_register_operand" "%0, rk,k,r,rk,k, 0,
rk,k,rk,k, rk")
(match_operand:SI 2 "reg_or_int_operand" "Py,rI,rI,k,Pj,Pj,Pv,L,
L,PJ,PJ,?n")))]
"TARGET_32BIT"
"@
add%?\\t%0, %1, %2
add%?\\t%0, %1, %2
add%?\\t%0, %1, %2
add%?\\t%0, %2, %1
addw%?\\t%0, %1, %2
addw%?\\t%0, %1, %2
sub%?\\t%0, %1, #%n2
sub%?\\t%0, %1, #%n2
sub%?\\t%0, %1, #%n2
subw%?\\t%0, %1, #%n2
subw%?\\t%0, %1, #%n2
#"
"TARGET_32BIT
&& GET_CODE (operands[2]) == CONST_INT
&& !const_ok_for_op (INTVAL (operands[2]), PLUS)
&& (reload_completed || !arm_eliminable_register (operands[1]))"
[(clobber (const_int 0))]
"
arm_split_constant (PLUS, SImode, curr_insn,
INTVAL (operands[2]), operands[0],
operands[1], 0);
DONE;
"
[(set_attr "length" "2,4,4,4,4,4,2,4,4,4,4,16")
(set_attr "predicable" "yes")
(set_attr "arch" "t2,*,*,*,t2,t2,t2,*,*,t2,t2,*")]
)
I saw that all the short's are handled in the thumb2.md (thumb2_addsi_short)
and the trunk has also one 2 byte length entry in the arm_addsi3. I will check
that one.
Sorry again!
^ permalink raw reply [flat|nested] 13+ messages in thread
* [Bug target/56441] [ARM Thumb] generated asm code produces "branch out of range" error in gas with -O1 -mcpu=cortex-m3
2013-02-25 8:25 [Bug target/56441] New: [ARM Thumb] generated asm code produces "branch out of range" error in gas with -O1 -mcpu=cortex-m3 gnugcc at emblocks dot org
` (9 preceding siblings ...)
2013-02-26 17:25 ` gnugcc at emblocks dot org
@ 2013-02-26 17:51 ` gnugcc at emblocks dot org
2013-03-05 7:07 ` rearnsha at gcc dot gnu.org
11 siblings, 0 replies; 13+ messages in thread
From: gnugcc at emblocks dot org @ 2013-02-26 17:51 UTC (permalink / raw)
To: gcc-bugs
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56441
--- Comment #11 from gnugcc at emblocks dot org 2013-02-26 17:51:16 UTC ---
Richard, you can close this one.
I'm leaving the ARM-branch and are moving to the head of branch 4.7.
Sorry for the inconveniences, I thought that the ARM branch would be the most
suitable for ARM but I discovered that that relationship isn't that obvious.
At least I learned today a little of the GCC internals.
Sorry again.
Gerard
^ permalink raw reply [flat|nested] 13+ messages in thread
* [Bug target/56441] [ARM Thumb] generated asm code produces "branch out of range" error in gas with -O1 -mcpu=cortex-m3
2013-02-25 8:25 [Bug target/56441] New: [ARM Thumb] generated asm code produces "branch out of range" error in gas with -O1 -mcpu=cortex-m3 gnugcc at emblocks dot org
` (10 preceding siblings ...)
2013-02-26 17:51 ` gnugcc at emblocks dot org
@ 2013-03-05 7:07 ` rearnsha at gcc dot gnu.org
11 siblings, 0 replies; 13+ messages in thread
From: rearnsha at gcc dot gnu.org @ 2013-03-05 7:07 UTC (permalink / raw)
To: gcc-bugs
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56441
Richard Earnshaw <rearnsha at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|WAITING |RESOLVED
Resolution| |WORKSFORME
--- Comment #12 from Richard Earnshaw <rearnsha at gcc dot gnu.org> 2013-03-05 07:06:40 UTC ---
Closed at user request
^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2013-03-05 7:07 UTC | newest]
Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-02-25 8:25 [Bug target/56441] New: [ARM Thumb] generated asm code produces "branch out of range" error in gas with -O1 -mcpu=cortex-m3 gnugcc at emblocks dot org
2013-02-25 8:31 ` [Bug target/56441] " gnugcc at emblocks dot org
2013-02-25 9:14 ` jakub at gcc dot gnu.org
2013-02-25 11:36 ` gnugcc at emblocks dot org
2013-02-25 11:41 ` gnugcc at emblocks dot org
2013-02-25 13:15 ` gnugcc at emblocks dot org
2013-02-25 16:48 ` gnugcc at emblocks dot org
2013-02-26 9:06 ` gnugcc at emblocks dot org
2013-02-26 17:02 ` rearnsha at gcc dot gnu.org
2013-02-26 17:03 ` rearnsha at gcc dot gnu.org
2013-02-26 17:25 ` gnugcc at emblocks dot org
2013-02-26 17:51 ` gnugcc at emblocks dot org
2013-03-05 7:07 ` rearnsha at gcc dot gnu.org
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).