diff --git a/llvm/test/Transforms/InstSimplify/or.ll b/llvm/test/Transforms/InstSimplify/or.ll --- a/llvm/test/Transforms/InstSimplify/or.ll +++ b/llvm/test/Transforms/InstSimplify/or.ll @@ -446,6 +446,34 @@ ret i32 %i5 } +; (A | B) | (A ^ B) --> A | B + +define i69 @or_or_xor(i69 %A, i69 %B) { +; CHECK-LABEL: @or_or_xor( +; CHECK-NEXT: [[I1:%.*]] = or i69 [[A:%.*]], [[B:%.*]] +; CHECK-NEXT: [[I2:%.*]] = xor i69 [[A]], [[B]] +; CHECK-NEXT: [[I3:%.*]] = or i69 [[I1]], [[I2]] +; CHECK-NEXT: ret i69 [[I3]] +; + %i1 = or i69 %A, %B + %i2 = xor i69 %A, %B + %i3 = or i69 %i1, %i2 + ret i69 %i3 +} + +define <4 x i4> @or_or_xor_commuted(<4 x i4> %A, <4 x i4> %B) { +; CHECK-LABEL: @or_or_xor_commuted( +; CHECK-NEXT: [[I1:%.*]] = or <4 x i4> [[A:%.*]], [[B:%.*]] +; CHECK-NEXT: [[I2:%.*]] = xor <4 x i4> [[A]], [[B]] +; CHECK-NEXT: [[I3:%.*]] = or <4 x i4> [[I2]], [[I1]] +; CHECK-NEXT: ret <4 x i4> [[I3]] +; + %i1 = or <4 x i4> %A, %B + %i2 = xor <4 x i4> %A, %B + %i3 = or <4 x i4> %i2, %i1 + ret <4 x i4> %i3 +} + define i32 @shifted_all_ones(i32 %shamt) { ; CHECK-LABEL: @shifted_all_ones( ; CHECK-NEXT: ret i32 -1