mirror of
				https://github.com/golang/go.git
				synced 2025-10-31 16:50:58 +00:00 
			
		
		
		
	cmd/compile: always mark atColumn1 results as statements
In 31618, we end up comparing the is-stmt-ness of positions to repurpose real instructions as inline marks. If the is-stmt-ness doesn't match, we end up not being able to remove the inline mark. Always use statement-full positions to do the matching, so we always find a match if there is one. Also always use positions that are statements for inline marks. Fixes #31618 Change-Id: Idaf39bdb32fa45238d5cd52973cadf4504f947d5 Reviewed-on: https://go-review.googlesource.com/c/go/+/173324 Run-TryBot: Keith Randall <khr@golang.org> Reviewed-by: David Chase <drchase@google.com>
This commit is contained in:
		
							parent
							
								
									a152dd0438
								
							
						
					
					
						commit
						fd788a86b6
					
				
					 4 changed files with 25 additions and 2 deletions
				
			
		|  | @ -1055,7 +1055,7 @@ func mkinlcall(n, fn *Node, maxCost int32) *Node { | ||||||
| 	// to put a breakpoint. Not sure if that's really necessary or not | 	// to put a breakpoint. Not sure if that's really necessary or not | ||||||
| 	// (in which case it could go at the end of the function instead). | 	// (in which case it could go at the end of the function instead). | ||||||
| 	inlMark := nod(OINLMARK, nil, nil) | 	inlMark := nod(OINLMARK, nil, nil) | ||||||
| 	inlMark.Pos = n.Pos.WithDefaultStmt() | 	inlMark.Pos = n.Pos.WithIsStmt() | ||||||
| 	inlMark.Xoffset = int64(newIndex) | 	inlMark.Xoffset = int64(newIndex) | ||||||
| 	ninit.Append(inlMark) | 	ninit.Append(inlMark) | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -5369,6 +5369,7 @@ func genssa(f *ssa.Func, pp *Progs) { | ||||||
| 				// We found an instruction with the same source position as | 				// We found an instruction with the same source position as | ||||||
| 				// some of the inline marks. | 				// some of the inline marks. | ||||||
| 				// Use this instruction instead. | 				// Use this instruction instead. | ||||||
|  | 				p.Pos = p.Pos.WithIsStmt() // promote position to a statement | ||||||
| 				pp.curfn.Func.lsym.Func.AddInlMark(p, inlMarks[m]) | 				pp.curfn.Func.lsym.Func.AddInlMark(p, inlMarks[m]) | ||||||
| 				// Make the inline mark a real nop, so it doesn't generate any code. | 				// Make the inline mark a real nop, so it doesn't generate any code. | ||||||
| 				m.As = obj.ANOP | 				m.As = obj.ANOP | ||||||
|  |  | ||||||
|  | @ -445,5 +445,5 @@ func (x lico) lineNumberHTML() string { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (x lico) atColumn1() lico { | func (x lico) atColumn1() lico { | ||||||
| 	return makeLico(x.Line(), 1) | (x & (isStmtMask | xlogueMask)) | 	return makeLico(x.Line(), 1).withIsStmt() | ||||||
| } | } | ||||||
|  |  | ||||||
							
								
								
									
										22
									
								
								test/codegen/issue31618.go
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								test/codegen/issue31618.go
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,22 @@ | ||||||
|  | // asmcheck | ||||||
|  | 
 | ||||||
|  | // Copyright 2019 The Go Authors. All rights reserved. | ||||||
|  | // Use of this source code is governed by a BSD-style | ||||||
|  | // license that can be found in the LICENSE file. | ||||||
|  | 
 | ||||||
|  | package codegen | ||||||
|  | 
 | ||||||
|  | // Make sure we remove both inline marks in the following code. | ||||||
|  | // Both +5 and +6 should map to real instructions, which can | ||||||
|  | // be used as inline marks instead of explicit nops. | ||||||
|  | func f(x int) int { | ||||||
|  | 	// amd64:-"XCHGL" | ||||||
|  | 	x = g(x) + 5 | ||||||
|  | 	// amd64:-"XCHGL" | ||||||
|  | 	x = g(x) + 6 | ||||||
|  | 	return x | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func g(x int) int { | ||||||
|  | 	return x >> 3 | ||||||
|  | } | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Keith Randall
						Keith Randall