From eddd5be1df060e3b6f6a10bf8e84f262fc59a446 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 6 Jan 2022 15:02:45 +0100 Subject: [PATCH] [BitCode] Autoupgrade inline asm elementtype attribute This is the autoupgrade part of D116531. If old bitcode is missing the elementtype attribute for indirect inline asm constraints, automatically add it. As usual, this only works when upgrading in typed mode, we haven't figured out upgrade in opaque mode yet. --- llvm/lib/Bitcode/Reader/BitcodeReader.cpp | 32 +++++++++++++++--- .../Bitcode/upgrade-inline-asm-elementtype.ll | 30 ++++++++++++++++ .../upgrade-inline-asm-elementtype.ll.bc | Bin 0 -> 1416 bytes 3 files changed, 58 insertions(+), 4 deletions(-) create mode 100644 llvm/test/Bitcode/upgrade-inline-asm-elementtype.ll create mode 100644 llvm/test/Bitcode/upgrade-inline-asm-elementtype.ll.bc diff --git a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp index 93b3dbf525f1..879ebfbd2979 100644 --- a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp +++ b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp @@ -3923,6 +3923,25 @@ void BitcodeReader::propagateAttributeTypes(CallBase *CB, } } + if (CB->isInlineAsm()) { + const InlineAsm *IA = cast(CB->getCalledOperand()); + unsigned ArgNo = 0; + for (const InlineAsm::ConstraintInfo &CI : IA->ParseConstraints()) { + bool HasArg = CI.Type == InlineAsm::isInput || + (CI.Type == InlineAsm::isOutput && CI.isIndirect); + if (!HasArg) + continue; + + if (CI.isIndirect && !CB->getAttributes().getParamElementType(ArgNo)) { + Type *ElemTy = ArgsTys[ArgNo]->getPointerElementType(); + CB->addParamAttr( + ArgNo, Attribute::get(Context, Attribute::ElementType, ElemTy)); + } + + ArgNo++; + } + } + switch (CB->getIntrinsicID()) { case Intrinsic::preserve_array_access_index: case Intrinsic::preserve_struct_access_index: @@ -4826,15 +4845,18 @@ Error BitcodeReader::parseFunctionBody(Function *F) { return error("Insufficient operands to call"); SmallVector Args; + SmallVector ArgsTys; // Read the fixed params. for (unsigned i = 0, e = FTy->getNumParams(); i != e; ++i, ++OpNum) { + Value *Arg; if (FTy->getParamType(i)->isLabelTy()) - Args.push_back(getBasicBlock(Record[OpNum])); + Arg = getBasicBlock(Record[OpNum]); else - Args.push_back(getValue(Record, OpNum, NextValueNo, - FTy->getParamType(i))); - if (!Args.back()) + Arg = getValue(Record, OpNum, NextValueNo, FTy->getParamType(i)); + if (!Arg) return error("Invalid record"); + Args.push_back(Arg); + ArgsTys.push_back(Arg->getType()); } // Read type/value pairs for varargs params. @@ -4847,6 +4869,7 @@ Error BitcodeReader::parseFunctionBody(Function *F) { if (getValueTypePair(Record, OpNum, NextValueNo, Op)) return error("Invalid record"); Args.push_back(Op); + ArgsTys.push_back(Op->getType()); } } @@ -4857,6 +4880,7 @@ Error BitcodeReader::parseFunctionBody(Function *F) { cast(I)->setCallingConv( static_cast((0x7ff & CCInfo) >> bitc::CALL_CCONV)); cast(I)->setAttributes(PAL); + propagateAttributeTypes(cast(I), ArgsTys); break; } case bitc::FUNC_CODE_INST_UNREACHABLE: // UNREACHABLE diff --git a/llvm/test/Bitcode/upgrade-inline-asm-elementtype.ll b/llvm/test/Bitcode/upgrade-inline-asm-elementtype.ll new file mode 100644 index 000000000000..5658103fbc80 --- /dev/null +++ b/llvm/test/Bitcode/upgrade-inline-asm-elementtype.ll @@ -0,0 +1,30 @@ +; RUN: llvm-dis < %s.bc | FileCheck %s + +; CHECK: call void asm "", "=*rm,r"(i32* elementtype(i32) %p1, i32* %p2) +define void @test_call(i32* %p1, i32* %p2) { + call void asm "", "=*rm,r"(i32* %p1, i32* %p2) + ret void +} + +; CHECK: invoke void asm "", "=*rm,r"(i32* elementtype(i32) %p1, i32* %p2) +define void @test_invoke(i32* %p1, i32* %p2) personality i8* null { + invoke void asm "", "=*rm,r"(i32* %p1, i32* %p2) + to label %cont unwind label %lpad + +lpad: + %lp = landingpad i32 + cleanup + ret void + +cont: + ret void +} + +; CHECK: callbr void asm "", "=*rm,r"(i32* elementtype(i32) %p1, i32* %p2) +define void @test_callbr(i32* %p1, i32* %p2) { + callbr void asm "", "=*rm,r"(i32* %p1, i32* %p2) + to label %cont [] + +cont: + ret void +} diff --git a/llvm/test/Bitcode/upgrade-inline-asm-elementtype.ll.bc b/llvm/test/Bitcode/upgrade-inline-asm-elementtype.ll.bc new file mode 100644 index 0000000000000000000000000000000000000000..db0c3c33f11320be34e2e4d39e932efd29df1ee3 GIT binary patch literal 1416 zcmZ`(aZDRk7=PC*y&IHw#~@p~-JN%XDI%G-vc=YG4fNQk5oZ^T!DMDFG8~SugEdf? zGcDJ7EY?_%#r}Z_B>Tht#}K^Ca6{Vss)csAMzEN5ZxLzd%%8MI=tCy&NQpN_J1U%{?X_ZucgUyA36+i8wK&}{ zVrom1S1Ne<@DTqa=J3XBHPtnV{U1&q8|LTI2=@XH07R=}54nwRJq&~ws*<#@7YX}w z*7KJV0dLzezN&37V8@b`057hKkUuk+_h1vfSZZ#@z%HQ~Qp;mUj(mGguHo$nX=`i` z_%7DsTWUS1H(4)#bzeYWKx-WtVdk<-dj;khlASRqJo*a zJA-@DvL}vvGU0egAo}P83b;Qw~@lAD; z1d6H~C9p-a|2_}%0qWk0WrL?~i_~qN`o|BuXt*juq&`@&{J8>ie)veN{39P^Qc?C+ zc4uB-?+EOiz@isi6P{`3zm#TV&ou5DRb82u8T9&y>;Q_>r}ZfW0GCmX38=${ zk+*sG*LL!=QnW4jqZS0p&GJ+IZ}NcL<3;}BY0-?0?}F$OOa literal 0 HcmV?d00001