mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-11-04 05:17:07 +00:00 
			
		
		
		
	X86: Optimize address mode matching for FRAME_ALLOC_RECOVER nodes
We know that the absolute symbol will be less than 2GB and thus will always fit. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@231389 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
		@@ -95,6 +95,7 @@ std::string SDNode::getOperationName(const SelectionDAG *G) const {
 | 
				
			|||||||
  case ISD::GLOBAL_OFFSET_TABLE:        return "GLOBAL_OFFSET_TABLE";
 | 
					  case ISD::GLOBAL_OFFSET_TABLE:        return "GLOBAL_OFFSET_TABLE";
 | 
				
			||||||
  case ISD::RETURNADDR:                 return "RETURNADDR";
 | 
					  case ISD::RETURNADDR:                 return "RETURNADDR";
 | 
				
			||||||
  case ISD::FRAMEADDR:                  return "FRAMEADDR";
 | 
					  case ISD::FRAMEADDR:                  return "FRAMEADDR";
 | 
				
			||||||
 | 
					  case ISD::FRAME_ALLOC_RECOVER:        return "FRAME_ALLOC_RECOVER";
 | 
				
			||||||
  case ISD::READ_REGISTER:              return "READ_REGISTER";
 | 
					  case ISD::READ_REGISTER:              return "READ_REGISTER";
 | 
				
			||||||
  case ISD::WRITE_REGISTER:             return "WRITE_REGISTER";
 | 
					  case ISD::WRITE_REGISTER:             return "WRITE_REGISTER";
 | 
				
			||||||
  case ISD::FRAME_TO_ARGS_OFFSET:       return "FRAME_TO_ARGS_OFFSET";
 | 
					  case ISD::FRAME_TO_ARGS_OFFSET:       return "FRAME_TO_ARGS_OFFSET";
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1004,6 +1004,15 @@ bool X86DAGToDAGISel::MatchAddressRecursively(SDValue N, X86ISelAddressMode &AM,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  switch (N.getOpcode()) {
 | 
					  switch (N.getOpcode()) {
 | 
				
			||||||
  default: break;
 | 
					  default: break;
 | 
				
			||||||
 | 
					  case ISD::FRAME_ALLOC_RECOVER: {
 | 
				
			||||||
 | 
					    if (!AM.hasSymbolicDisplacement())
 | 
				
			||||||
 | 
					      if (const auto *ESNode = dyn_cast<ExternalSymbolSDNode>(N.getOperand(0)))
 | 
				
			||||||
 | 
					        if (ESNode->getOpcode() == ISD::TargetExternalSymbol) {
 | 
				
			||||||
 | 
					          AM.ES = ESNode->getSymbol();
 | 
				
			||||||
 | 
					          return false;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    break;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
  case ISD::Constant: {
 | 
					  case ISD::Constant: {
 | 
				
			||||||
    uint64_t Val = cast<ConstantSDNode>(N)->getSExtValue();
 | 
					    uint64_t Val = cast<ConstantSDNode>(N)->getSExtValue();
 | 
				
			||||||
    if (!FoldOffsetIntoAddress(Val, AM))
 | 
					    if (!FoldOffsetIntoAddress(Val, AM))
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -16,20 +16,20 @@ define void @print_framealloc_from_fp(i8* %fp) {
 | 
				
			|||||||
  %b = bitcast i8* %b.i8 to i32*
 | 
					  %b = bitcast i8* %b.i8 to i32*
 | 
				
			||||||
  %b.val = load i32, i32* %b
 | 
					  %b.val = load i32, i32* %b
 | 
				
			||||||
  call i32 (i8*, ...)* @printf(i8* getelementptr ([10 x i8]* @str, i32 0, i32 0), i32 %b.val)
 | 
					  call i32 (i8*, ...)* @printf(i8* getelementptr ([10 x i8]* @str, i32 0, i32 0), i32 %b.val)
 | 
				
			||||||
 | 
					  store i32 42, i32* %b
 | 
				
			||||||
  ret void
 | 
					  ret void
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
; CHECK-LABEL: print_framealloc_from_fp:
 | 
					; CHECK-LABEL: print_framealloc_from_fp:
 | 
				
			||||||
; CHECK: movq %rcx, %[[parent_fp:[a-z]+]]
 | 
					; CHECK: movq %rcx, %[[parent_fp:[a-z]+]]
 | 
				
			||||||
; CHECK: movabsq $.Lalloc_func$frame_escape_0, %[[offs:[a-z]+]]
 | 
					; CHECK: movl .Lalloc_func$frame_escape_0(%[[parent_fp]]), %edx
 | 
				
			||||||
; CHECK: movl (%[[parent_fp]],%[[offs]]), %edx
 | 
					 | 
				
			||||||
; CHECK: leaq {{.*}}(%rip), %[[str:[a-z]+]]
 | 
					; CHECK: leaq {{.*}}(%rip), %[[str:[a-z]+]]
 | 
				
			||||||
; CHECK: movq %[[str]], %rcx
 | 
					; CHECK: movq %[[str]], %rcx
 | 
				
			||||||
; CHECK: callq printf
 | 
					; CHECK: callq printf
 | 
				
			||||||
; CHECK: movabsq $.Lalloc_func$frame_escape_1, %[[offs:[a-z]+]]
 | 
					; CHECK: movl .Lalloc_func$frame_escape_1(%[[parent_fp]]), %edx
 | 
				
			||||||
; CHECK: movl (%[[parent_fp]],%[[offs]]), %edx
 | 
					 | 
				
			||||||
; CHECK: movq %[[str]], %rcx
 | 
					; CHECK: movq %[[str]], %rcx
 | 
				
			||||||
; CHECK: callq printf
 | 
					; CHECK: callq printf
 | 
				
			||||||
 | 
					; CHECK: movl    $42, .Lalloc_func$frame_escape_1(%[[parent_fp]])
 | 
				
			||||||
; CHECK: retq
 | 
					; CHECK: retq
 | 
				
			||||||
 | 
					
 | 
				
			||||||
define void @alloc_func() {
 | 
					define void @alloc_func() {
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user