mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-11-04 05:17:07 +00:00 
			
		
		
		
	Bugfix for 229954
Before calling Function::getGC to test for enablement, we need to make sure there's actually a GC at all via Function::hasGC. Otherwise, we'd crash on functions without a GC. Thankfully, this only mattered if you manually scheduled the pass, but still, oops. :( git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@230040 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
		@@ -1911,8 +1911,11 @@ static bool insertParsePoints(Function &F, DominatorTree &DT, Pass *P,
 | 
				
			|||||||
/// point of this function is as an extension point for custom logic.
 | 
					/// point of this function is as an extension point for custom logic.
 | 
				
			||||||
static bool shouldRewriteStatepointsIn(Function &F) {
 | 
					static bool shouldRewriteStatepointsIn(Function &F) {
 | 
				
			||||||
  // TODO: This should check the GCStrategy
 | 
					  // TODO: This should check the GCStrategy
 | 
				
			||||||
 | 
					  if (F.hasGC()) {
 | 
				
			||||||
    const std::string StatepointExampleName("statepoint-example");
 | 
					    const std::string StatepointExampleName("statepoint-example");
 | 
				
			||||||
    return StatepointExampleName == F.getGC();
 | 
					    return StatepointExampleName == F.getGC();
 | 
				
			||||||
 | 
					  } else
 | 
				
			||||||
 | 
					    return false;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool RewriteStatepointsForGC::runOnFunction(Function &F) {
 | 
					bool RewriteStatepointsForGC::runOnFunction(Function &F) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -74,4 +74,15 @@ merge:
 | 
				
			|||||||
  ret i8 addrspace(1)* %obj
 | 
					  ret i8 addrspace(1)* %obj
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					; When run over a function which doesn't opt in, should do nothing!
 | 
				
			||||||
 | 
					define i8 addrspace(1)* @test5(i8 addrspace(1)* %obj) {
 | 
				
			||||||
 | 
					; CHECK-LABEL: @test5
 | 
				
			||||||
 | 
					; CHECK-LABEL: entry:
 | 
				
			||||||
 | 
					; CHECK-NEXT: gc.statepoint
 | 
				
			||||||
 | 
					; CHECK-NOT: %obj.relocated = call coldcc i8 addrspace(1)*
 | 
				
			||||||
 | 
					entry:
 | 
				
			||||||
 | 
					  call i32 (void ()*, i32, i32, ...)* @llvm.experimental.gc.statepoint.p0f_isVoidf(void ()* @foo, i32 0, i32 0, i32 5, i32 0, i32 -1, i32 0, i32 0, i32 0)
 | 
				
			||||||
 | 
					  ret i8 addrspace(1)* %obj
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
declare i32 @llvm.experimental.gc.statepoint.p0f_isVoidf(void ()*, i32, i32, ...)
 | 
					declare i32 @llvm.experimental.gc.statepoint.p0f_isVoidf(void ()*, i32, i32, ...)
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user