Skip to content

Commit

Permalink
[X86ISelLowering] permit BlockAddressSDNode "i" constraints for PIC
Browse files Browse the repository at this point in the history
When building 32b x86 code as PIC, the existing handling of "i"
constraints is conservative since generally we have to go through the
GOT to find references to functions.

But generally, BlockAddresses from C code refer to the Function in the
current TU.  Permit BlockAddresses to be used with the "i" constraint
for those cases.

I regressed this in
commit 4edb998 ("[SelectionDAG] treat X constrained labels as i for asm")

Fixes: #53868

Reviewed By: efriedma, MaskRay

Differential Revision: https://reviews.llvm.org/D119905

(cherry picked from commit 027c16b)
  • Loading branch information
nickdesaulniers authored and tstellar committed Mar 1, 2022
1 parent d245bcf commit 41d4f89
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 2 deletions.
5 changes: 3 additions & 2 deletions llvm/lib/Target/X86/X86ISelLowering.cpp
Expand Up @@ -54599,8 +54599,9 @@ void X86TargetLowering::LowerAsmOperandForConstraint(SDValue Op,

// In any sort of PIC mode addresses need to be computed at runtime by
// adding in a register or some sort of table lookup. These can't
// be used as immediates.
if (Subtarget.isPICStyleGOT() || Subtarget.isPICStyleStubPIC())
// be used as immediates. BlockAddresses are fine though.
if ((Subtarget.isPICStyleGOT() || Subtarget.isPICStyleStubPIC()) &&
!isa<BlockAddressSDNode>(Op))
return;

// If we are in non-pic codegen mode, we allow the address of a global (with
Expand Down
38 changes: 38 additions & 0 deletions llvm/test/CodeGen/X86/inline-asm-pic.ll
Expand Up @@ -18,3 +18,41 @@ entry:
tail call void asm "mov $1,%gs:$0", "=*m,ri,~{dirflag},~{fpsr},~{flags}"(i8** elementtype(i8*) inttoptr (i32 152 to i8**), i8* bitcast (i8** @main_q to i8*)) nounwind
ret void
}

; The intent of this test is to ensure that we handle blockaddress' correctly
; with "i" constraints for -m32 -fPIC.

define void @x() {
; CHECK-LABEL: x:
; CHECK: ## %bb.0:
; CHECK-NEXT: ## InlineAsm Start
; CHECK-NEXT: ## Ltmp0
; CHECK-EMPTY:
; CHECK-NEXT: ## InlineAsm End
; CHECK-NEXT: ## %bb.2: ## %return
; CHECK-NEXT: retl
; CHECK-NEXT: Ltmp0: ## Block address taken
; CHECK-NEXT: LBB1_1: ## %overflow
; CHECK-NEXT: retl
callbr void asm "# ${0:l}\0A", "i"(i8* blockaddress(@x, %overflow))
to label %return [label %overflow]

overflow:
br label %return

return:
ret void
}

; Test unusual case of blockaddress from @x in @y's asm.
define void @y() {
; CHECK-LABEL: y:
; CHECK: ## %bb.0:
; CHECK-NEXT: ## InlineAsm Start
; CHECK-NEXT: ## Ltmp0
; CHECK-EMPTY:
; CHECK-NEXT: ## InlineAsm End
; CHECK-NEXT: retl
call void asm "# ${0:l}\0A", "i"(i8* blockaddress(@x, %overflow))
ret void
}

0 comments on commit 41d4f89

Please sign in to comment.