mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-11-03 14:21:30 +00:00 
			
		
		
		
	If the first argument to a function is a 'this' argument and the second has the sret attribute, the ArgumentPromotion pass may promote the 'this' argument to more than one argument, violating the IR constraint that 'sret' may only be applied to the first or second argument. Although this IR constraint is arguably unnecessary, it highlighted the fact that ArgPromotion does not need to preserve this attribute. Dropping the attribute reduces register pressure in the backend by avoiding the register copy required by sret. Because sret implies noalias, we also replace the former with the latter. Differential Revision: http://reviews.llvm.org/D10353 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@239488 91177308-0d34-0410-b5e6-96231b3b80d8
		
			
				
	
	
		
			29 lines
		
	
	
		
			916 B
		
	
	
	
		
			LLVM
		
	
	
	
	
	
			
		
		
	
	
			29 lines
		
	
	
		
			916 B
		
	
	
	
		
			LLVM
		
	
	
	
	
	
; RUN: opt < %s -argpromotion -S | FileCheck %s
 | 
						|
 | 
						|
target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
 | 
						|
target triple = "x86_64-pc-windows-msvc"
 | 
						|
 | 
						|
; CHECK: define internal void @add(i32 %[[THIS1:.*]], i32 %[[THIS2:.*]], i32* noalias %[[SR:.*]])
 | 
						|
define internal void @add({i32, i32}* %this, i32* sret %r) {
 | 
						|
  %ap = getelementptr {i32, i32}, {i32, i32}* %this, i32 0, i32 0
 | 
						|
  %bp = getelementptr {i32, i32}, {i32, i32}* %this, i32 0, i32 1
 | 
						|
  %a = load i32, i32* %ap
 | 
						|
  %b = load i32, i32* %bp
 | 
						|
  ; CHECK: %[[AB:.*]] = add i32 %[[THIS1]], %[[THIS2]]
 | 
						|
  %ab = add i32 %a, %b
 | 
						|
  ; CHECK: store i32 %[[AB]], i32* %[[SR]]
 | 
						|
  store i32 %ab, i32* %r
 | 
						|
  ret void
 | 
						|
}
 | 
						|
 | 
						|
; CHECK: define void @f()
 | 
						|
define void @f() {
 | 
						|
  ; CHECK: %[[R:.*]] = alloca i32
 | 
						|
  %r = alloca i32
 | 
						|
  %pair = alloca {i32, i32}
 | 
						|
 | 
						|
  ; CHECK: call void @add(i32 %{{.*}}, i32 %{{.*}}, i32* noalias %[[R]])
 | 
						|
  call void @add({i32, i32}* %pair, i32* sret %r)
 | 
						|
  ret void
 | 
						|
}
 |