diff options
| author | Sanjay Patel <spatel@rotateright.com> | 2016-07-08 20:53:29 +0000 |
|---|---|---|
| committer | Sanjay Patel <spatel@rotateright.com> | 2016-07-08 20:53:29 +0000 |
| commit | f4a08ede03894dad4a3d364e876e366f68d09fb6 (patch) | |
| tree | 68789602480c99c459279d4f257815410cb1f03a | |
| parent | 297a0e67b648f322c67c4be90acb7f6542c4c631 (diff) | |
| download | bcm5719-llvm-f4a08ede03894dad4a3d364e876e366f68d09fb6.tar.gz bcm5719-llvm-f4a08ede03894dad4a3d364e876e366f68d09fb6.zip | |
[InstCombine] don't form select from logic ops if it's unlikely that we'll eliminate any ops
llvm-svn: 274926
| -rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp | 39 | ||||
| -rw-r--r-- | llvm/test/Transforms/InstCombine/logical-select.ll | 4 |
2 files changed, 23 insertions, 20 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp b/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp index eadf0bf67a4..3865572e816 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp @@ -2222,23 +2222,28 @@ Instruction *InstCombiner::visitOr(BinaryOperator &I) { } } - // (Cond & C) | (~Cond & D) -> Cond ? C : D, and commuted variants. - if (Value *V = matchSelectFromAndOr(A, C, B, D, *Builder)) - return replaceInstUsesWith(I, V); - if (Value *V = matchSelectFromAndOr(A, C, D, B, *Builder)) - return replaceInstUsesWith(I, V); - if (Value *V = matchSelectFromAndOr(C, A, B, D, *Builder)) - return replaceInstUsesWith(I, V); - if (Value *V = matchSelectFromAndOr(C, A, D, B, *Builder)) - return replaceInstUsesWith(I, V); - if (Value *V = matchSelectFromAndOr(B, D, A, C, *Builder)) - return replaceInstUsesWith(I, V); - if (Value *V = matchSelectFromAndOr(B, D, C, A, *Builder)) - return replaceInstUsesWith(I, V); - if (Value *V = matchSelectFromAndOr(D, B, A, C, *Builder)) - return replaceInstUsesWith(I, V); - if (Value *V = matchSelectFromAndOr(D, B, C, A, *Builder)) - return replaceInstUsesWith(I, V); + // Don't try to form a select if it's unlikely that we'll get rid of at + // least one of the operands. A select is generally more expensive than the + // 'or' that it is replacing. + if (Op0->hasOneUse() || Op1->hasOneUse()) { + // (Cond & C) | (~Cond & D) -> Cond ? C : D, and commuted variants. + if (Value *V = matchSelectFromAndOr(A, C, B, D, *Builder)) + return replaceInstUsesWith(I, V); + if (Value *V = matchSelectFromAndOr(A, C, D, B, *Builder)) + return replaceInstUsesWith(I, V); + if (Value *V = matchSelectFromAndOr(C, A, B, D, *Builder)) + return replaceInstUsesWith(I, V); + if (Value *V = matchSelectFromAndOr(C, A, D, B, *Builder)) + return replaceInstUsesWith(I, V); + if (Value *V = matchSelectFromAndOr(B, D, A, C, *Builder)) + return replaceInstUsesWith(I, V); + if (Value *V = matchSelectFromAndOr(B, D, C, A, *Builder)) + return replaceInstUsesWith(I, V); + if (Value *V = matchSelectFromAndOr(D, B, A, C, *Builder)) + return replaceInstUsesWith(I, V); + if (Value *V = matchSelectFromAndOr(D, B, C, A, *Builder)) + return replaceInstUsesWith(I, V); + } // ((A&~B)|(~A&B)) -> A^B if ((match(C, m_Not(m_Specific(D))) && diff --git a/llvm/test/Transforms/InstCombine/logical-select.ll b/llvm/test/Transforms/InstCombine/logical-select.ll index 86fa8f0fbcb..190cb653e2a 100644 --- a/llvm/test/Transforms/InstCombine/logical-select.ll +++ b/llvm/test/Transforms/InstCombine/logical-select.ll @@ -300,10 +300,8 @@ define i1 @bools_multi_uses2(i1 %a, i1 %b, i1 %c) { ; CHECK-NEXT: [[NOT:%.*]] = xor i1 %c, true ; CHECK-NEXT: [[AND1:%.*]] = and i1 [[NOT]], %a ; CHECK-NEXT: [[AND2:%.*]] = and i1 %c, %b -; CHECK-NEXT: [[TMP1:%.*]] = select i1 %c, i1 %b, i1 %a ; CHECK-NEXT: [[ADD:%.*]] = xor i1 [[AND1]], [[AND2]] -; CHECK-NEXT: [[AND3:%.*]] = and i1 [[TMP1]], [[ADD]] -; CHECK-NEXT: ret i1 [[AND3]] +; CHECK-NEXT: ret i1 [[ADD]] ; %not = xor i1 %c, -1 %and1 = and i1 %not, %a |

