mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-11-03 14:21:30 +00:00 
			
		
		
		
	Enable the tail call optimization when the caller returns undef.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@88737 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
		@@ -4376,6 +4376,10 @@ isInTailCallPosition(const Instruction *I, Attributes CalleeRetAttr,
 | 
			
		||||
  // what the call's return type is.
 | 
			
		||||
  if (!Ret || Ret->getNumOperands() == 0) return true;
 | 
			
		||||
 | 
			
		||||
  // If the return value is undef, it doesn't matter what the call's
 | 
			
		||||
  // return type is.
 | 
			
		||||
  if (isa<UndefValue>(Ret->getOperand(0))) return true;
 | 
			
		||||
 | 
			
		||||
  // Conservatively require the attributes of the call to match those of
 | 
			
		||||
  // the return. Ignore noalias because it doesn't affect the call sequence.
 | 
			
		||||
  unsigned CallerRetAttr = F->getAttributes().getRetAttributes();
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
; RUN: llc < %s -march=x86 -tailcallopt | grep TAILCALL | count 3
 | 
			
		||||
; RUN: llc < %s -march=x86 -tailcallopt | grep TAILCALL | count 4
 | 
			
		||||
define fastcc i32 @tailcallee(i32 %a1, i32 %a2, i32 %a3, i32 %a4) {
 | 
			
		||||
entry:
 | 
			
		||||
	ret i32 %a3
 | 
			
		||||
@@ -23,3 +23,10 @@ define fastcc i8* @alias_caller() nounwind {
 | 
			
		||||
  %p = tail call fastcc noalias i8* @noalias_callee()
 | 
			
		||||
  ret i8* %p
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
declare fastcc i32 @i32_callee()
 | 
			
		||||
 | 
			
		||||
define fastcc i32 @ret_undef() nounwind {
 | 
			
		||||
  %p = tail call fastcc i32 @i32_callee()
 | 
			
		||||
  ret i32 undef
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user