mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-10-30 16:17:05 +00:00 
			
		
		
		
	Make use of the END. facility on all files > 1K so that we aren't wasting CPU cycles searching for RUN: lines that we'll never find. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@36059 91177308-0d34-0410-b5e6-96231b3b80d8
		
			
				
	
	
		
			77 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			LLVM
		
	
	
	
	
	
			
		
		
	
	
			77 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			LLVM
		
	
	
	
	
	
| ; The %A getelementptr instruction should be eliminated here
 | |
| 
 | |
| ; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | \
 | |
| ; RUN:    grep -v %B | not grep getelementptr
 | |
| ; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | grep foo1
 | |
| ; END.
 | |
| 
 | |
| %Global = constant [10 x sbyte] c"helloworld"
 | |
| 
 | |
| implementation
 | |
| 
 | |
| int *%foo1(int* %I) { ; Test noop elimination
 | |
| 	%A = getelementptr int* %I, long 0
 | |
| 	ret int * %A
 | |
| }
 | |
| 
 | |
| int* %foo2(int* %I) {  ; Test noop elimination
 | |
| 	%A = getelementptr int* %I
 | |
| 	ret int* %A
 | |
| }
 | |
| int* %foo3(int * %I) { ; Test that two array indexing geps fold
 | |
| 	%A = getelementptr int* %I, long 17
 | |
| 	%B = getelementptr int* %A, long 4
 | |
| 	ret int* %B
 | |
| }
 | |
| 
 | |
| int* %foo4({int} *%I) { ; Test that two getelementptr insts fold
 | |
| 	%A = getelementptr {int}* %I, long 1
 | |
| 	%B = getelementptr {int}* %A, long 0, uint 0
 | |
| 	ret int* %B
 | |
| }
 | |
| 
 | |
| void %foo5(sbyte %B) {
 | |
| 	; This should be turned into a constexpr instead of being an instruction
 | |
| 	%A = getelementptr [10 x sbyte]* %Global, long 0, long 4
 | |
| 	store sbyte %B, sbyte* %A
 | |
| 	ret void
 | |
| }
 | |
| 
 | |
| int* %foo6() {
 | |
| 	%M = malloc [4 x int]
 | |
| 	%A = getelementptr [4 x int]* %M, long 0, long 0
 | |
| 	%B = getelementptr int* %A, long 2
 | |
| 	ret int* %B
 | |
| }
 | |
| 
 | |
| int* %foo7(int* %I, long %C, long %D) {
 | |
| 	%A = getelementptr int* %I, long %C
 | |
| 	%B = getelementptr int* %A, long %D
 | |
| 	ret int* %B
 | |
| }
 | |
| 
 | |
| sbyte* %foo8([10 x int]* %X) {
 | |
| 	%A = getelementptr [10 x int]* %X, long 0, long 0   ;; Fold into the cast.
 | |
| 	%B = cast int* %A to sbyte*
 | |
| 	ret sbyte * %B
 | |
| }
 | |
| 
 | |
| int %test9() {
 | |
| 	%A = getelementptr {int, double}* null, int 0, uint 1
 | |
| 	%B = cast double* %A to int
 | |
| 	ret int %B
 | |
| }
 | |
| 
 | |
| bool %test10({int, int} * %x, {int, int} * %y) {
 | |
|         %tmp.1 = getelementptr {int,int}* %x, int 0, uint 1
 | |
|         %tmp.3 = getelementptr {int,int}* %y, int 0, uint 1
 | |
|         %tmp.4 = seteq int* %tmp.1, %tmp.3    ;; seteq x, y
 | |
|         ret bool %tmp.4
 | |
| }
 | |
| 
 | |
| bool %test11({int,int} *%X) {
 | |
| 	%P = getelementptr {int,int}* %X, int 0, uint 0
 | |
| 	%Q = seteq int* %P, null
 | |
| 	ret bool %Q
 | |
| }
 |