28 lines
		
	
	
		
			856 B
		
	
	
	
		
			LLVM
		
	
	
	
			
		
		
	
	
			28 lines
		
	
	
		
			856 B
		
	
	
	
		
			LLVM
		
	
	
	
| ; RUN: opt -S -globals-aa -functionattrs < %s | FileCheck %s
 | |
| ; RUN: opt -S -O3 < %s | FileCheck %s
 | |
| 
 | |
| ; Apart from checking for the direct cause of the bug, we also check
 | |
| ; if any problematic aliasing rules have accidentally snuck into -O3.
 | |
| ;
 | |
| ; Since the "abc" operand bundle is not a special operand bundle that
 | |
| ; LLVM knows about, all of the stores and loads in @test below have to
 | |
| ; stay.
 | |
| 
 | |
| declare void @foo() readnone
 | |
| 
 | |
| ; CHECK-LABEL: define i8* @test(i8* %p)
 | |
| ; CHECK:   %a = alloca i8*, align 8
 | |
| ; CHECK:   store i8* %p, i8** %a, align 8
 | |
| ; CHECK:   call void @foo() [ "abc"(i8** %a) ]
 | |
| ; CHECK:   %reload = load i8*, i8** %a, align 8
 | |
| ; CHECK:   ret i8* %reload
 | |
| ; CHECK: }
 | |
| 
 | |
| define i8* @test(i8* %p) {
 | |
|   %a = alloca i8*, align 8
 | |
|   store i8* %p, i8** %a, align 8
 | |
|   call void @foo() ["abc" (i8** %a)]
 | |
|   %reload = load i8*, i8** %a, align 8
 | |
|   ret i8* %reload
 | |
| }
 |