[llvm] 1202f55 - [OpaquePtr] Make atomicrmw work with opaque pointers

Arthur Eubanks via llvm-commits llvm-commits at lists.llvm.org
Tue May 25 20:20:45 PDT 2021


Author: Arthur Eubanks
Date: 2021-05-25T20:16:21-07:00
New Revision: 1202f559bdeebb62dbba29ee05ffafbfecd57d92

URL: https://github.com/llvm/llvm-project/commit/1202f559bdeebb62dbba29ee05ffafbfecd57d92
DIFF: https://github.com/llvm/llvm-project/commit/1202f559bdeebb62dbba29ee05ffafbfecd57d92.diff

LOG: [OpaquePtr] Make atomicrmw work with opaque pointers

FullTy is only necessary when we need to figure out what type an
instruction works with given a pointer's pointee type. However, we just
end up using the value operand's type, so FullTy isn't necessary.

Reviewed By: dblaikie

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

Added: 
    llvm/test/Assembler/atomicrmw.ll

Modified: 
    llvm/lib/AsmParser/LLParser.cpp
    llvm/lib/Bitcode/Reader/BitcodeReader.cpp
    llvm/lib/IR/Instructions.cpp
    llvm/test/Assembler/opaque-ptr.ll
    llvm/test/Verifier/opaque-ptr.ll

Removed: 
    


################################################################################
diff  --git a/llvm/lib/AsmParser/LLParser.cpp b/llvm/lib/AsmParser/LLParser.cpp
index b6ee81a12e29d..91599e2496892 100644
--- a/llvm/lib/AsmParser/LLParser.cpp
+++ b/llvm/lib/AsmParser/LLParser.cpp
@@ -7671,7 +7671,8 @@ int LLParser::parseAtomicRMW(Instruction *&Inst, PerFunctionState &PFS) {
     return tokError("atomicrmw cannot be unordered");
   if (!Ptr->getType()->isPointerTy())
     return error(PtrLoc, "atomicrmw operand must be a pointer");
-  if (cast<PointerType>(Ptr->getType())->getElementType() != Val->getType())
+  if (!cast<PointerType>(Ptr->getType())
+           ->isOpaqueOrPointeeTypeMatches(Val->getType()))
     return error(ValLoc, "atomicrmw value and pointer type do not match");
 
   if (Operation == AtomicRMWInst::Xchg) {

diff  --git a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp
index ad85066d54766..58b1b2b1f0817 100644
--- a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp
+++ b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp
@@ -5251,9 +5251,11 @@ Error BitcodeReader::parseFunctionBody(Function *F) {
         if (popValue(Record, OpNum, NextValueNo,
                      getPointerElementFlatType(FullTy), Val))
           return error("Invalid record");
+        FullTy = getPointerElementFlatType(FullTy);
       } else {
         if (getValueTypePair(Record, OpNum, NextValueNo, Val))
           return error("Invalid record");
+        FullTy = Val->getType();
       }
 
       if (!(NumRecords == (OpNum + 4) || NumRecords == (OpNum + 5)))
@@ -5286,7 +5288,6 @@ Error BitcodeReader::parseFunctionBody(Function *F) {
             Align(TheModule->getDataLayout().getTypeStoreSize(Val->getType()));
 
       I = new AtomicRMWInst(Operation, Ptr, Val, *Alignment, Ordering, SSID);
-      FullTy = getPointerElementFlatType(FullTy);
       cast<AtomicRMWInst>(I)->setVolatile(IsVol);
 
       InstructionList.push_back(I);

diff  --git a/llvm/lib/IR/Instructions.cpp b/llvm/lib/IR/Instructions.cpp
index 08f9e8e726c32..f1df5001c134b 100644
--- a/llvm/lib/IR/Instructions.cpp
+++ b/llvm/lib/IR/Instructions.cpp
@@ -1602,9 +1602,9 @@ void AtomicRMWInst::Init(BinOp Operation, Value *Ptr, Value *Val,
          "All operands must be non-null!");
   assert(getOperand(0)->getType()->isPointerTy() &&
          "Ptr must have pointer type!");
-  assert(getOperand(1)->getType() ==
-         cast<PointerType>(getOperand(0)->getType())->getElementType()
-         && "Ptr must be a pointer to Val type!");
+  assert(cast<PointerType>(getOperand(0)->getType())
+             ->isOpaqueOrPointeeTypeMatches(getOperand(1)->getType()) &&
+         "Ptr must be a pointer to Val type!");
   assert(Ordering != AtomicOrdering::NotAtomic &&
          "AtomicRMW instructions must be atomic!");
 }

diff  --git a/llvm/test/Assembler/atomicrmw.ll b/llvm/test/Assembler/atomicrmw.ll
new file mode 100644
index 0000000000000..fcf63e8b1119c
--- /dev/null
+++ b/llvm/test/Assembler/atomicrmw.ll
@@ -0,0 +1,18 @@
+; RUN: llvm-as %s -o - | llvm-dis | FileCheck %s
+
+; Make sure that we can parse an atomicrmw with an operand defined later in the function.
+
+; CHECK: @f
+; CHECK: atomicrmw
+define void @f() {
+  entry:
+    br label %def
+
+  use:
+    %x = atomicrmw add i32* undef, i32 %y monotonic
+    ret void
+
+  def:
+    %y = add i32 undef, undef
+    br i1 undef, label %use, label %use
+}

diff  --git a/llvm/test/Assembler/opaque-ptr.ll b/llvm/test/Assembler/opaque-ptr.ll
index 86ff1cd5d9299..b3b35631188ed 100644
--- a/llvm/test/Assembler/opaque-ptr.ll
+++ b/llvm/test/Assembler/opaque-ptr.ll
@@ -56,3 +56,11 @@ define void @cmpxchg(ptr %p, i32 %a, i32 %b) {
     %val_success = cmpxchg ptr %p, i32 %a, i32 %b acq_rel monotonic
     ret void
 }
+
+; CHECK: define void @atomicrmw(ptr %a, i32 %i)
+; CHECK:     %b = atomicrmw add ptr %a, i32 %i acquire
+; CHECK:     ret void
+define void @atomicrmw(ptr %a, i32 %i) {
+    %b = atomicrmw add ptr %a, i32 %i acquire
+    ret void
+}

diff  --git a/llvm/test/Verifier/opaque-ptr.ll b/llvm/test/Verifier/opaque-ptr.ll
index 1fd1b3a8a1715..322544471a56f 100644
--- a/llvm/test/Verifier/opaque-ptr.ll
+++ b/llvm/test/Verifier/opaque-ptr.ll
@@ -17,3 +17,9 @@ define void @cmpxchg(ptr %p, i32 %a, i32 %b) {
     %val_success = cmpxchg ptr %p, i32 %a, i32 %b acq_rel monotonic
     ret void
 }
+
+; CHECK: @atomicrmw
+define void @atomicrmw(ptr %a, i32 %i) {
+    %b = atomicrmw add ptr %a, i32 %i acquire
+    ret void
+}


        


More information about the llvm-commits mailing list