Skip to content

Commit 46ca7b5

Browse files
committed
cmd/internal/obj: stop removing NOPs from instruction stream
This has already been done for s390x, ppc64. This CL is for all the other architectures. Fixes #40796 Change-Id: Idd1816e057df63022d47e99fa06617811d8c8489 Reviewed-on: https://go-review.googlesource.com/c/go/+/248684 Run-TryBot: Cherry Zhang <[email protected]> TryBot-Result: Gobot Gobot <[email protected]> Reviewed-by: Cherry Zhang <[email protected]>
1 parent b0cc02e commit 46ca7b5

File tree

6 files changed

+14
-123
lines changed

6 files changed

+14
-123
lines changed

src/cmd/internal/obj/arm/asm5.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -327,6 +327,9 @@ var optab = []Optab{
327327
{obj.APCDATA, C_LCON, C_NONE, C_LCON, 0, 0, 0, 0, 0, 0},
328328
{obj.AFUNCDATA, C_LCON, C_NONE, C_ADDR, 0, 0, 0, 0, 0, 0},
329329
{obj.ANOP, C_NONE, C_NONE, C_NONE, 0, 0, 0, 0, 0, 0},
330+
{obj.ANOP, C_LCON, C_NONE, C_NONE, 0, 0, 0, 0, 0, 0}, // nop variants, see #40689
331+
{obj.ANOP, C_REG, C_NONE, C_NONE, 0, 0, 0, 0, 0, 0},
332+
{obj.ANOP, C_FREG, C_NONE, C_NONE, 0, 0, 0, 0, 0, 0},
330333
{obj.ADUFFZERO, C_NONE, C_NONE, C_SBRA, 5, 4, 0, 0, 0, 0}, // same as ABL
331334
{obj.ADUFFCOPY, C_NONE, C_NONE, C_SBRA, 5, 4, 0, 0, 0, 0}, // same as ABL
332335
{obj.AXXX, C_NONE, C_NONE, C_NONE, 0, 4, 0, 0, 0, 0},

src/cmd/internal/obj/arm/obj5.go

Lines changed: 0 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -276,67 +276,21 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) {
276276

277277
/*
278278
* find leaf subroutines
279-
* strip NOPs
280-
* expand RET
281-
* expand BECOME pseudo
282279
*/
283-
var q1 *obj.Prog
284-
var q *obj.Prog
285280
for p := cursym.Func.Text; p != nil; p = p.Link {
286281
switch p.As {
287282
case obj.ATEXT:
288283
p.Mark |= LEAF
289284

290-
case obj.ARET:
291-
break
292-
293285
case ADIV, ADIVU, AMOD, AMODU:
294-
q = p
295286
cursym.Func.Text.Mark &^= LEAF
296-
continue
297-
298-
case obj.ANOP:
299-
q1 = p.Link
300-
q.Link = q1 /* q is non-nop */
301-
if q1 != nil {
302-
q1.Mark |= p.Mark
303-
}
304-
continue
305287

306288
case ABL,
307289
ABX,
308290
obj.ADUFFZERO,
309291
obj.ADUFFCOPY:
310292
cursym.Func.Text.Mark &^= LEAF
311-
fallthrough
312-
313-
case AB,
314-
ABEQ,
315-
ABNE,
316-
ABCS,
317-
ABHS,
318-
ABCC,
319-
ABLO,
320-
ABMI,
321-
ABPL,
322-
ABVS,
323-
ABVC,
324-
ABHI,
325-
ABLS,
326-
ABGE,
327-
ABLT,
328-
ABGT,
329-
ABLE:
330-
q1 = p.Pcond
331-
if q1 != nil {
332-
for q1.As == obj.ANOP {
333-
q1 = q1.Link
334-
p.Pcond = q1
335-
}
336-
}
337293
}
338-
339-
q = p
340294
}
341295

342296
var q2 *obj.Prog

src/cmd/internal/obj/arm64/asm7.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -837,6 +837,9 @@ var optab = []Optab{
837837
{obj.APCDATA, C_VCON, C_NONE, C_NONE, C_VCON, 0, 0, 0, 0, 0},
838838
{obj.AFUNCDATA, C_VCON, C_NONE, C_NONE, C_ADDR, 0, 0, 0, 0, 0},
839839
{obj.ANOP, C_NONE, C_NONE, C_NONE, C_NONE, 0, 0, 0, 0, 0},
840+
{obj.ANOP, C_LCON, C_NONE, C_NONE, C_NONE, 0, 0, 0, 0, 0}, // nop variants, see #40689
841+
{obj.ANOP, C_REG, C_NONE, C_NONE, C_NONE, 0, 0, 0, 0, 0},
842+
{obj.ANOP, C_VREG, C_NONE, C_NONE, C_NONE, 0, 0, 0, 0, 0},
840843
{obj.ADUFFZERO, C_NONE, C_NONE, C_NONE, C_SBRA, 5, 4, 0, 0, 0}, // same as AB/ABL
841844
{obj.ADUFFCOPY, C_NONE, C_NONE, C_NONE, C_SBRA, 5, 4, 0, 0, 0}, // same as AB/ABL
842845
{obj.APCALIGN, C_LCON, C_NONE, C_NONE, C_NONE, 0, 0, 0, 0, 0}, // align code

src/cmd/internal/obj/arm64/obj7.go

Lines changed: 2 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -468,73 +468,21 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) {
468468

469469
/*
470470
* find leaf subroutines
471-
* strip NOPs
472-
* expand RET
473471
*/
474-
q := (*obj.Prog)(nil)
475-
var q1 *obj.Prog
476472
for p := c.cursym.Func.Text; p != nil; p = p.Link {
477473
switch p.As {
478474
case obj.ATEXT:
479475
p.Mark |= LEAF
480476

481-
case obj.ARET:
482-
break
483-
484-
case obj.ANOP:
485-
if p.Link != nil {
486-
q1 = p.Link
487-
q.Link = q1 /* q is non-nop */
488-
q1.Mark |= p.Mark
489-
}
490-
continue
491-
492477
case ABL,
493478
obj.ADUFFZERO,
494479
obj.ADUFFCOPY:
495480
c.cursym.Func.Text.Mark &^= LEAF
496-
fallthrough
497-
498-
case ACBNZ,
499-
ACBZ,
500-
ACBNZW,
501-
ACBZW,
502-
ATBZ,
503-
ATBNZ,
504-
AB,
505-
ABEQ,
506-
ABNE,
507-
ABCS,
508-
ABHS,
509-
ABCC,
510-
ABLO,
511-
ABMI,
512-
ABPL,
513-
ABVS,
514-
ABVC,
515-
ABHI,
516-
ABLS,
517-
ABGE,
518-
ABLT,
519-
ABGT,
520-
ABLE,
521-
AADR, /* strange */
522-
AADRP:
523-
q1 = p.Pcond
524-
525-
if q1 != nil {
526-
for q1.As == obj.ANOP {
527-
q1 = q1.Link
528-
p.Pcond = q1
529-
}
530-
}
531-
532-
break
533481
}
534-
535-
q = p
536482
}
537483

484+
var q *obj.Prog
485+
var q1 *obj.Prog
538486
var retjmp *obj.LSym
539487
for p := c.cursym.Func.Text; p != nil; p = p.Link {
540488
o := p.As

src/cmd/internal/obj/mips/asm0.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -391,6 +391,9 @@ var optab = []Optab{
391391
{obj.APCDATA, C_LCON, C_NONE, C_LCON, 0, 0, 0, 0, 0},
392392
{obj.AFUNCDATA, C_SCON, C_NONE, C_ADDR, 0, 0, 0, 0, 0},
393393
{obj.ANOP, C_NONE, C_NONE, C_NONE, 0, 0, 0, 0, 0},
394+
{obj.ANOP, C_LCON, C_NONE, C_NONE, 0, 0, 0, 0, 0}, // nop variants, see #40689
395+
{obj.ANOP, C_REG, C_NONE, C_NONE, 0, 0, 0, 0, 0},
396+
{obj.ANOP, C_FREG, C_NONE, C_NONE, 0, 0, 0, 0, 0},
394397
{obj.ADUFFZERO, C_NONE, C_NONE, C_LBRA, 11, 4, 0, 0, 0}, // same as AJMP
395398
{obj.ADUFFCOPY, C_NONE, C_NONE, C_LBRA, 11, 4, 0, 0, 0}, // same as AJMP
396399

src/cmd/internal/obj/mips/obj0.go

Lines changed: 3 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -158,19 +158,14 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) {
158158

159159
/*
160160
* find leaf subroutines
161-
* strip NOPs
162161
* expand RET
163162
* expand BECOME pseudo
164163
*/
165164

166-
var q *obj.Prog
167-
var q1 *obj.Prog
168165
for p := c.cursym.Func.Text; p != nil; p = p.Link {
169166
switch p.As {
170167
/* too hard, just leave alone */
171168
case obj.ATEXT:
172-
q = p
173-
174169
p.Mark |= LABEL | LEAF | SYNC
175170
if p.Link != nil {
176171
p.Link.Mark |= LABEL
@@ -179,7 +174,6 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) {
179174
/* too hard, just leave alone */
180175
case AMOVW,
181176
AMOVV:
182-
q = p
183177
if p.To.Type == obj.TYPE_REG && p.To.Reg >= REG_SPECIAL {
184178
p.Mark |= LABEL | SYNC
185179
break
@@ -195,11 +189,9 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) {
195189
ATLBWI,
196190
ATLBP,
197191
ATLBR:
198-
q = p
199192
p.Mark |= LABEL | SYNC
200193

201194
case ANOR:
202-
q = p
203195
if p.To.Type == obj.TYPE_REG {
204196
if p.To.Reg == REGZERO {
205197
p.Mark |= LABEL | SYNC
@@ -235,8 +227,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) {
235227
} else {
236228
p.Mark |= BRANCH
237229
}
238-
q = p
239-
q1 = p.Pcond
230+
q1 := p.Pcond
240231
if q1 != nil {
241232
for q1.As == obj.ANOP {
242233
q1 = q1.Link
@@ -254,24 +245,11 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) {
254245
if q1 != nil {
255246
q1.Mark |= LABEL
256247
}
257-
continue
258248

259249
case ARET:
260-
q = p
261250
if p.Link != nil {
262251
p.Link.Mark |= LABEL
263252
}
264-
continue
265-
266-
case obj.ANOP:
267-
q1 = p.Link
268-
q.Link = q1 /* q is non-nop */
269-
q1.Mark |= p.Mark
270-
continue
271-
272-
default:
273-
q = p
274-
continue
275253
}
276254
}
277255

@@ -284,6 +262,8 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) {
284262
mov = AMOVW
285263
}
286264

265+
var q *obj.Prog
266+
var q1 *obj.Prog
287267
autosize := int32(0)
288268
var p1 *obj.Prog
289269
var p2 *obj.Prog

0 commit comments

Comments
 (0)