[PATCH] D31531: Remove readnone from invariant.group.barrier

Piotr Padlewski via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Mar 31 05:57:29 PDT 2017


Prazek created this revision.

Readnone attribute would cause CSE of two barriers with
the same argument, which is invalid by example:

  struct Base {
        virtual int foo() { return 42; }
  };
  
  struct Derived1 : Base {
        int foo() override { return 50; }
  };
  
  struct Derived2 : Base {
        int foo() override { return 100; }
  };
  
  void foo() {
      Base *x = new Base{};
      new (x) Derived1{};
      int a = std::launder(x)->foo();
      new (x) Derived2{};
      int b = std::launder(x)->foo();
  }

Here 2 calls of std::launder will produce @llvm.invariant.group.barrier,
which would be merged into one call, causing devirtualization
to devirtualize second call into Derived1::foo() instead of
Derived2::foo()


https://reviews.llvm.org/D31531

Files:
  include/llvm/IR/Intrinsics.td
  test/Transforms/EarlyCSE/invariant.group.barrier.ll
  test/Transforms/Util/MemorySSA/invariant-groups.ll

-------------- next part --------------
A non-text attachment was scrubbed...
Name: D31531.93623.patch
Type: text/x-patch
Size: 5576 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170331/d16a06e6/attachment.bin>


More information about the llvm-commits mailing list