summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Analysis/LoopUnrollAnalyzer.cpp
diff options
context:
space:
mode:
authorRoman Lebedev <lebedev.ri@gmail.com>2019-09-19 17:25:19 +0000
committerRoman Lebedev <lebedev.ri@gmail.com>2019-09-19 17:25:19 +0000
commit7a67ed579520993fcd5ee9442db536ae4100bc23 (patch)
tree8050c38b179033728dc24aa6a5df633b08391614 /llvm/lib/Analysis/LoopUnrollAnalyzer.cpp
parente2f9bc3b11baebbdd91ba0ae2faf30d39071ca54 (diff)
downloadbcm5719-llvm-7a67ed579520993fcd5ee9442db536ae4100bc23.tar.gz
bcm5719-llvm-7a67ed579520993fcd5ee9442db536ae4100bc23.zip
[InstCombine] Simplify @llvm.usub.with.overflow+non-zero check (PR43251)
Summary: This is again motivated by D67122 sanitizer check enhancement. That patch seemingly worsens `-fsanitize=pointer-overflow` overhead from 25% to 50%, which strongly implies missing folds. In this particular case, given ``` char* test(char& base, unsigned long offset) { return &base - offset; } ``` it will end up producing something like https://godbolt.org/z/luGEju which after optimizations reduces down to roughly ``` declare void @use64(i64) define i1 @test(i8* dereferenceable(1) %base, i64 %offset) { %base_int = ptrtoint i8* %base to i64 %adjusted = sub i64 %base_int, %offset call void @use64(i64 %adjusted) %not_null = icmp ne i64 %adjusted, 0 %no_underflow = icmp ule i64 %adjusted, %base_int %no_underflow_and_not_null = and i1 %not_null, %no_underflow ret i1 %no_underflow_and_not_null } ``` Without D67122 there was no `%not_null`, and in this particular case we can "get rid of it", by merging two checks: Here we are checking: `Base u>= Offset && (Base u- Offset) != 0`, but that is simply `Base u> Offset` Alive proofs: https://rise4fun.com/Alive/QOs The `@llvm.usub.with.overflow` pattern itself is not handled here because this is the main pattern, that we currently consider canonical. https://bugs.llvm.org/show_bug.cgi?id=43251 Reviewers: spatel, nikic, xbolva00, majnemer Reviewed By: xbolva00, majnemer Subscribers: vsk, majnemer, xbolva00, hiraditya, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D67356 llvm-svn: 372341
Diffstat (limited to 'llvm/lib/Analysis/LoopUnrollAnalyzer.cpp')
0 files changed, 0 insertions, 0 deletions
OpenPOWER on IntegriCloud