diff --git a/llvm/lib/CodeGen/GlobalISel/InlineAsmLowering.cpp b/llvm/lib/CodeGen/GlobalISel/InlineAsmLowering.cpp index f695a2daf6b2c..2927b075fc360 100644 --- a/llvm/lib/CodeGen/GlobalISel/InlineAsmLowering.cpp +++ b/llvm/lib/CodeGen/GlobalISel/InlineAsmLowering.cpp @@ -657,7 +657,18 @@ bool InlineAsmLowering::lowerAsmOperandForConstraint( switch (ConstraintLetter) { default: return false; + case 's': // Integer immediate not known at compile time + if (const auto *GV = dyn_cast(Val)) { + Ops.push_back(MachineOperand::CreateGA(GV, /*Offset=*/0)); + return true; + } + return false; case 'i': // Simple Integer or Relocatable Constant + if (const auto *GV = dyn_cast(Val)) { + Ops.push_back(MachineOperand::CreateGA(GV, /*Offset=*/0)); + return true; + } + [[fallthrough]]; case 'n': // immediate integer with a known value. if (ConstantInt *CI = dyn_cast(Val)) { assert(CI->getBitWidth() <= 64 && diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/irtranslator-inline-asm.ll b/llvm/test/CodeGen/AArch64/GlobalISel/irtranslator-inline-asm.ll index 8597ceb9ed87a..2a490bc7d3d1c 100644 --- a/llvm/test/CodeGen/AArch64/GlobalISel/irtranslator-inline-asm.ll +++ b/llvm/test/CodeGen/AArch64/GlobalISel/irtranslator-inline-asm.ll @@ -183,6 +183,25 @@ define void @test_input_imm() { ret void } +@var = global i64 0, align 8 +define void @test_immediate_constraint_sym() { + ; CHECK-LABEL: name: test_immediate_constraint_sym + ; CHECK: bb.1 (%ir-block.0): + ; CHECK-NEXT: INLINEASM &"#TEST $0", 9 /* sideeffect mayload attdialect */, 13 /* imm */, @var + ; CHECK-NEXT: RET_ReallyLR + call void asm sideeffect "#TEST $0", "i"(ptr @var) + ret void +} + +define void @test_s_constraint() { + ; CHECK-LABEL: name: test_s_constraint + ; CHECK: bb.1 (%ir-block.0): + ; CHECK-NEXT: INLINEASM &"#TEST $0", 9 /* sideeffect mayload attdialect */, 13 /* imm */, @var + ; CHECK-NEXT: RET_ReallyLR + call void asm sideeffect "#TEST $0", "s"(ptr @var) + ret void +} + define zeroext i8 @test_input_register(ptr %src) nounwind { ; CHECK-LABEL: name: test_input_register ; CHECK: bb.1.entry: