diff options
author | Sanjay Patel <spatel@rotateright.com> | 2015-09-25 23:21:38 +0000 |
---|---|---|
committer | Sanjay Patel <spatel@rotateright.com> | 2015-09-25 23:21:38 +0000 |
commit | e1b09caaafc32398cdbbd62a77619162ec975707 (patch) | |
tree | 4786832f470ce09511f1d55555bcdf31be8d928c /llvm/lib/Analysis/ScalarEvolution.cpp | |
parent | 15ea016346d90d52d7ae308a1259da39af1f0dbd (diff) | |
download | bcm5719-llvm-e1b09caaafc32398cdbbd62a77619162ec975707.tar.gz bcm5719-llvm-e1b09caaafc32398cdbbd62a77619162ec975707.zip |
[InstCombine] match De Morgan's Law hidden by zext ops (PR22723)
This is a fix for PR22723:
https://llvm.org/bugs/show_bug.cgi?id=22723
My first attempt at this was to change what I thought was the root problem:
xor (zext i1 X to i32), 1 --> zext (xor i1 X, true) to i32
...but we create the opposite pattern in InstCombiner::visitZExt(), so infinite loop!
My next idea was to fix the matchIfNot() implementation in PatternMatch, but that would
mean potentially returning a different size for the match than what was input. I think
this would require all users of m_Not to check the size of the returned match, so I
abandoned that idea.
I settled on just fixing the exact case presented in the PR. This patch does allow the
2 functions in PR22723 to compile identically (x86):
bool test(bool x, bool y) { return !x | !y; }
bool test(bool x, bool y) { return !x || !y; }
...
andb %sil, %dil
xorb $1, %dil
movb %dil, %al
retq
Differential Revision: http://reviews.llvm.org/D12705
llvm-svn: 248634
Diffstat (limited to 'llvm/lib/Analysis/ScalarEvolution.cpp')
0 files changed, 0 insertions, 0 deletions