[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