44 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			LLVM
		
	
	
	
			
		
		
	
	
			44 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			LLVM
		
	
	
	
; RUN: opt < %s -basicaa -dse -S | FileCheck %s
 | 
						|
 | 
						|
declare noalias i8* @malloc(i64) "malloc-like"
 | 
						|
 | 
						|
declare void @foo()
 | 
						|
declare void @bar(i8*)
 | 
						|
 | 
						|
define void @test() {
 | 
						|
  %obj = call i8* @malloc(i64 8)
 | 
						|
  store i8 0, i8* %obj
 | 
						|
  ; don't remove store. %obj should be treated like it will be read by the @foo.
 | 
						|
  ; CHECK: store i8 0, i8* %obj
 | 
						|
  call void @foo() ["deopt" (i8* %obj)]
 | 
						|
  ret void
 | 
						|
}
 | 
						|
 | 
						|
define void @test1() {
 | 
						|
  %obj = call i8* @malloc(i64 8)
 | 
						|
  store i8 0, i8* %obj
 | 
						|
  ; CHECK: store i8 0, i8* %obj
 | 
						|
  call void @bar(i8* nocapture %obj)
 | 
						|
  ret void
 | 
						|
}
 | 
						|
 | 
						|
define void @test2() {
 | 
						|
  %obj = call i8* @malloc(i64 8)
 | 
						|
  store i8 0, i8* %obj
 | 
						|
  ; CHECK-NOT: store i8 0, i8* %obj
 | 
						|
  call void @foo()
 | 
						|
  ret void
 | 
						|
}
 | 
						|
 | 
						|
define void @test3() {
 | 
						|
  ; CHECK-LABEL: @test3(
 | 
						|
  %s = alloca i64
 | 
						|
  ; Verify that this first store is not considered killed by the second one
 | 
						|
  ; since it could be observed from the deopt continuation.
 | 
						|
  ; CHECK: store i64 1, i64* %s
 | 
						|
  store i64 1, i64* %s
 | 
						|
  call void @foo() [ "deopt"(i64* %s) ]
 | 
						|
  store i64 0, i64* %s
 | 
						|
  ret void
 | 
						|
}
 |