mirror of
https://github.com/RPCS3/llvm.git
synced 2026-07-19 23:23:38 -04:00
[InstCombine] make ((X & C) ^ C) form consistent for vectors
It would be better to create a 'not' here, but that's not possible yet. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@341410 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -2784,12 +2784,10 @@ Instruction *InstCombiner::visitXor(BinaryOperator &I) {
|
||||
return BinaryOperator::CreateAnd(Op0, Builder.CreateNot(X));
|
||||
// (X & Y) ^ Y --> ~X & Y
|
||||
// (Y & X) ^ Y --> ~X & Y
|
||||
// Canonical form with a non-splat constant is (X & C) ^ C; don't touch that.
|
||||
// TODO: Why do we treat arbitrary vector constants differently?
|
||||
// Canonical form is (X & C) ^ C; don't touch that.
|
||||
// TODO: A 'not' op is better for analysis and codegen, but demanded bits must
|
||||
// be fixed to prefer that (otherwise we get infinite looping).
|
||||
const APInt *Unused;
|
||||
if (!match(Op1, m_APInt(Unused)) &&
|
||||
if (!match(Op1, m_Constant()) &&
|
||||
match(Op0, m_OneUse(m_c_And(m_Value(X), m_Specific(Op1)))))
|
||||
return BinaryOperator::CreateAnd(Op1, Builder.CreateNot(X));
|
||||
|
||||
|
||||
@@ -35,8 +35,8 @@ define <2 x i64> @test3(<2 x i64> %A) {
|
||||
|
||||
define <2 x i64> @test4(<2 x i64> %A) {
|
||||
; CHECK-LABEL: @test4(
|
||||
; CHECK-NEXT: [[TMP1:%.*]] = xor <2 x i64> %A, <i64 63, i64 63>
|
||||
; CHECK-NEXT: [[XOR:%.*]] = and <2 x i64> [[TMP1]], <i64 23, i64 42>
|
||||
; CHECK-NEXT: [[AND:%.*]] = and <2 x i64> [[A:%.*]], <i64 23, i64 42>
|
||||
; CHECK-NEXT: [[XOR:%.*]] = xor <2 x i64> [[AND]], <i64 23, i64 42>
|
||||
; CHECK-NEXT: ret <2 x i64> [[XOR]]
|
||||
;
|
||||
%trunc = trunc <2 x i64> %A to <2 x i32>
|
||||
|
||||
Reference in New Issue
Block a user