mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-11-04 05:17:07 +00:00 
			
		
		
		
	weak variable are compiled by different compilers, such as GCC and LLVM, while LLVM may increase the alignment to the preferred alignment there is no reason to think that GCC will use anything more than the ABI alignment. Since it is the GCC version that might end up in the final program (as the linkage is weak), it is wrong to increase the alignment of loads from the global up to the preferred alignment as the alignment might only be the ABI alignment. Increasing alignment up to the ABI alignment might be OK, but I'm not totally convinced that it is. It seems better to just leave the alignment of weak globals alone. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@145413 91177308-0d34-0410-b5e6-96231b3b80d8
		
			
				
	
	
		
			30 lines
		
	
	
		
			647 B
		
	
	
	
		
			LLVM
		
	
	
	
	
	
			
		
		
	
	
			30 lines
		
	
	
		
			647 B
		
	
	
	
		
			LLVM
		
	
	
	
	
	
; RUN: opt < %s -instcombine -S | FileCheck %s
 | 
						|
 | 
						|
; Don't assume that external global variables or those with weak linkage have
 | 
						|
; their preferred alignment. They may only have the ABI minimum alignment.
 | 
						|
 | 
						|
; CHECK: %s = shl i64 %a, 3
 | 
						|
; CHECK: %r = or i64 %s, ptrtoint (i32* @A to i64)
 | 
						|
; CHECK: %q = add i64 %r, 1
 | 
						|
; CHECK: ret i64 %q
 | 
						|
 | 
						|
target datalayout = "-i32:8:32"
 | 
						|
 | 
						|
@A = external global i32
 | 
						|
@B = weak_odr global i32 0
 | 
						|
 | 
						|
define i64 @foo(i64 %a) {
 | 
						|
  %t = ptrtoint i32* @A to i64
 | 
						|
  %s = shl i64 %a, 3
 | 
						|
  %r = or i64 %t, %s
 | 
						|
  %q = add i64 %r, 1
 | 
						|
  ret i64 %q
 | 
						|
}
 | 
						|
 | 
						|
define i32 @bar() {
 | 
						|
; CHECK: @bar
 | 
						|
  %r = load i32* @B, align 1
 | 
						|
; CHECK: align 1
 | 
						|
  ret i32 %r
 | 
						|
}
 |