]> granicus.if.org Git - llvm/commit
Remove readnone from invariant.group.barrier
authorPiotr Padlewski <piotr.padlewski@gmail.com>
Wed, 12 Apr 2017 20:45:12 +0000 (20:45 +0000)
committerPiotr Padlewski <piotr.padlewski@gmail.com>
Wed, 12 Apr 2017 20:45:12 +0000 (20:45 +0000)
commit6f93f61542cfd56435978e714cfabde7495dd02e
treeda7e83305dd7a5d91088f1d0b7aacc004441c4e7
parent4f344492bbb010ebec77fee3a1deca07cc9864ac
Remove readnone from invariant.group.barrier

Summary:
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()

Reviewers: chandlerc, dberlin, hfinkel

Subscribers: llvm-commits, rsmith, amharc

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@300101 91177308-0d34-0410-b5e6-96231b3b80d8
include/llvm/IR/Intrinsics.td
test/Analysis/MemorySSA/invariant-groups.ll
test/Other/invariant.group.barrier.ll [new file with mode: 0644]