diff options
| author | Sanjay Patel <spatel@rotateright.com> | 2018-10-04 21:36:50 +0000 |
|---|---|---|
| committer | Sanjay Patel <spatel@rotateright.com> | 2018-10-04 21:36:50 +0000 |
| commit | 3436dc29239d4b78f8042f431afec9d322faebe6 (patch) | |
| tree | a5e0f4975cde1fd68d3c0129dd2d1f1d6503cbcf /llvm/lib | |
| parent | e122f94fa045582c6e3d7ea78632df447e84d435 (diff) | |
| download | bcm5719-llvm-3436dc29239d4b78f8042f431afec9d322faebe6.tar.gz bcm5719-llvm-3436dc29239d4b78f8042f431afec9d322faebe6.zip | |
[InstCombine] drop poison flags in SimplifyVectorDemandedElts
We established the (unfortunately complicated) rules for UB/poison
propagation with vector ops in:
D48893
D48987
D49047
It's clear from the affected tests that we are potentially creating
poison where none existed before the transforms. For add/sub/mul,
the answer is simple: just drop the flags because the extra undef
vector lanes are generally more valuable for analysis and codegen.
llvm-svn: 343819
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp b/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp index f8b57eeb388..936daa828a5 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp @@ -1592,8 +1592,11 @@ Value *InstCombiner::SimplifyDemandedVectorElts(Value *V, APInt DemandedElts, simplifyAndSetOp(I, 0, DemandedElts, UndefElts); simplifyAndSetOp(I, 1, DemandedElts, UndefElts2); - // TODO: If this is a potentially poison-producing instruction, we need - // to drop the wrapping/exact flags? + // Any change to an instruction with potential poison must clear those flags + // because we can not guarantee those constraints now. Other analysis may + // determine that it is safe to re-apply the flags. + if (MadeChange) + BO->dropPoisonGeneratingFlags(); // Output elements are undefined if both are undefined. Consider things // like undef & 0. The result is known zero, not undef. |

