Skip to content

Commit

Permalink
Revert "[InstCombine] Combine instructions of type or/and where AND m…
Browse files Browse the repository at this point in the history
…asks can be combined."

This reverts commit ec4adf1. The commit causes
clang to hang on a certain input:
```
$ cat q.cc
int f(int a, int b) {
  int c = ((unsigned char)(a >> 23) & 925);
  if (a)
    c = (a >> 23 & b) | ((unsigned char)(a >> 23) & 925) | (b >> 23 & 157);
  return c;
}

$ time ./clang-15-10515 --target=x86_64--linux-gnu -O1  -c q.cc
^C

real    0m45.072s
user    0m0.025s
sys     0m0.099s
```
  • Loading branch information
alexfh committed Jun 1, 2022
1 parent 8c349d7 commit aa98e7e
Show file tree
Hide file tree
Showing 3 changed files with 83 additions and 83 deletions.
30 changes: 0 additions & 30 deletions llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
Expand Up @@ -2963,36 +2963,6 @@ Instruction *InstCombinerImpl::visitOr(BinaryOperator &I) {
if (matchSimpleRecurrence(&I, PN, Start, Step) && DT.dominates(Step, PN))
return replaceInstUsesWith(I, Builder.CreateOr(Start, Step));

// (A & B) | (C | D) or (C | D) | (A & B)
// Can be combined if C or D is of type (A/B & X)
if (match(&I, m_c_Or(m_OneUse(m_And(m_Value(A), m_Value(B))),
m_OneUse(m_Or(m_Value(C), m_Value(D)))))) {
// (A & B) | (C | ?) -> C | (? | (A & B))
// (A & B) | (C | ?) -> C | (? | (A & B))
// (A & B) | (C | ?) -> C | (? | (A & B))
// (A & B) | (C | ?) -> C | (? | (A & B))
// (C | ?) | (A & B) -> C | (? | (A & B))
// (C | ?) | (A & B) -> C | (? | (A & B))
// (C | ?) | (A & B) -> C | (? | (A & B))
// (C | ?) | (A & B) -> C | (? | (A & B))
if (match(D, m_c_And(m_Specific(A), m_Value())) ||
match(D, m_c_And(m_Specific(B), m_Value())))
return BinaryOperator::CreateOr(
C, Builder.CreateOr(D, Builder.CreateAnd(A, B)));
// (A & B) | (? | D) -> (? | (A & B)) | D
// (A & B) | (? | D) -> (? | (A & B)) | D
// (A & B) | (? | D) -> (? | (A & B)) | D
// (A & B) | (? | D) -> (? | (A & B)) | D
// (? | D) | (A & B) -> (? | (A & B)) | D
// (? | D) | (A & B) -> (? | (A & B)) | D
// (? | D) | (A & B) -> (? | (A & B)) | D
// (? | D) | (A & B) -> (? | (A & B)) | D
if (match(C, m_c_And(m_Specific(A), m_Value())) ||
match(C, m_c_And(m_Specific(B), m_Value())))
return BinaryOperator::CreateOr(
Builder.CreateOr(C, Builder.CreateAnd(A, B)), D);
}

return nullptr;
}

Expand Down
130 changes: 79 additions & 51 deletions llvm/test/Transforms/InstCombine/and-or.ll
Expand Up @@ -338,10 +338,22 @@ define i8 @and_or_do_not_hoist_mask(i8 %a, i8 %b) {
define i64 @or_or_and_complex(i64 %i) {
; CHECK-LABEL: @or_or_and_complex(
; CHECK-NEXT: [[TMP1:%.*]] = lshr i64 [[I:%.*]], 8
; CHECK-NEXT: [[SHL:%.*]] = and i64 [[TMP1]], 71776119061217280
; CHECK-NEXT: [[TMP2:%.*]] = shl i64 [[I]], 8
; CHECK-NEXT: [[TMP3:%.*]] = and i64 [[TMP1]], 71777214294589695
; CHECK-NEXT: [[TMP4:%.*]] = and i64 [[TMP2]], -71777214294589696
; CHECK-NEXT: [[OR27:%.*]] = or i64 [[TMP3]], [[TMP4]]
; CHECK-NEXT: [[SHL3:%.*]] = and i64 [[TMP2]], -72057594037927936
; CHECK-NEXT: [[OR:%.*]] = or i64 [[SHL]], [[SHL3]]
; CHECK-NEXT: [[SHL6:%.*]] = and i64 [[TMP1]], 1095216660480
; CHECK-NEXT: [[OR7:%.*]] = or i64 [[OR]], [[SHL6]]
; CHECK-NEXT: [[SHL10:%.*]] = and i64 [[TMP2]], 280375465082880
; CHECK-NEXT: [[OR11:%.*]] = or i64 [[OR7]], [[SHL10]]
; CHECK-NEXT: [[SHL14:%.*]] = and i64 [[TMP1]], 16711680
; CHECK-NEXT: [[OR15:%.*]] = or i64 [[OR11]], [[SHL14]]
; CHECK-NEXT: [[SHL18:%.*]] = and i64 [[TMP2]], 4278190080
; CHECK-NEXT: [[OR19:%.*]] = or i64 [[OR15]], [[SHL18]]
; CHECK-NEXT: [[AND21:%.*]] = and i64 [[TMP1]], 255
; CHECK-NEXT: [[OR23:%.*]] = or i64 [[OR19]], [[AND21]]
; CHECK-NEXT: [[SHL26:%.*]] = and i64 [[TMP2]], 65280
; CHECK-NEXT: [[OR27:%.*]] = or i64 [[OR23]], [[SHL26]]
; CHECK-NEXT: ret i64 [[OR27]]
;
%1 = lshr i64 %i, 8
Expand Down Expand Up @@ -390,9 +402,10 @@ define i8 @or_or_and_noOneUse(i8 %a, i8 %b, i8 %c, i8 %d) {
define i8 @or_or_and_pat1(i8 %a, i8 %b, i8 %c, i8 %d) {
; CHECK-LABEL: @or_or_and_pat1(
; CHECK-NEXT: [[CT:%.*]] = udiv i8 42, [[C:%.*]]
; CHECK-NEXT: [[TMP1:%.*]] = or i8 [[D:%.*]], [[B:%.*]]
; CHECK-NEXT: [[TMP2:%.*]] = and i8 [[TMP1]], [[A:%.*]]
; CHECK-NEXT: [[OR2:%.*]] = or i8 [[CT]], [[TMP2]]
; CHECK-NEXT: [[AND1:%.*]] = and i8 [[A:%.*]], [[B:%.*]]
; CHECK-NEXT: [[AND2:%.*]] = and i8 [[A]], [[D:%.*]]
; CHECK-NEXT: [[OR1:%.*]] = or i8 [[CT]], [[AND2]]
; CHECK-NEXT: [[OR2:%.*]] = or i8 [[OR1]], [[AND1]]
; CHECK-NEXT: ret i8 [[OR2]]
;
%ct = udiv i8 42, %c ; thwart complexity-based canonicalization
Expand All @@ -407,9 +420,10 @@ define i8 @or_or_and_pat1(i8 %a, i8 %b, i8 %c, i8 %d) {
define i8 @or_or_and_pat2(i8 %a, i8 %b, i8 %c, i8 %d) {
; CHECK-LABEL: @or_or_and_pat2(
; CHECK-NEXT: [[CT:%.*]] = udiv i8 42, [[C:%.*]]
; CHECK-NEXT: [[AND21:%.*]] = or i8 [[D:%.*]], [[B:%.*]]
; CHECK-NEXT: [[TMP1:%.*]] = and i8 [[AND21]], [[A:%.*]]
; CHECK-NEXT: [[OR2:%.*]] = or i8 [[CT]], [[TMP1]]
; CHECK-NEXT: [[AND1:%.*]] = and i8 [[A:%.*]], [[B:%.*]]
; CHECK-NEXT: [[AND2:%.*]] = and i8 [[D:%.*]], [[A]]
; CHECK-NEXT: [[OR1:%.*]] = or i8 [[CT]], [[AND2]]
; CHECK-NEXT: [[OR2:%.*]] = or i8 [[OR1]], [[AND1]]
; CHECK-NEXT: ret i8 [[OR2]]
;
%ct = udiv i8 42, %c ; thwart complexity-based canonicalization
Expand All @@ -424,9 +438,10 @@ define i8 @or_or_and_pat2(i8 %a, i8 %b, i8 %c, i8 %d) {
define i8 @or_or_and_pat3(i8 %a, i8 %b, i8 %c, i8 %d) {
; CHECK-LABEL: @or_or_and_pat3(
; CHECK-NEXT: [[CT:%.*]] = udiv i8 42, [[C:%.*]]
; CHECK-NEXT: [[TMP1:%.*]] = or i8 [[D:%.*]], [[A:%.*]]
; CHECK-NEXT: [[TMP2:%.*]] = and i8 [[TMP1]], [[B:%.*]]
; CHECK-NEXT: [[OR2:%.*]] = or i8 [[CT]], [[TMP2]]
; CHECK-NEXT: [[AND1:%.*]] = and i8 [[A:%.*]], [[B:%.*]]
; CHECK-NEXT: [[AND2:%.*]] = and i8 [[B]], [[D:%.*]]
; CHECK-NEXT: [[OR1:%.*]] = or i8 [[CT]], [[AND2]]
; CHECK-NEXT: [[OR2:%.*]] = or i8 [[OR1]], [[AND1]]
; CHECK-NEXT: ret i8 [[OR2]]
;
%ct = udiv i8 42, %c ; thwart complexity-based canonicalization
Expand All @@ -441,9 +456,10 @@ define i8 @or_or_and_pat3(i8 %a, i8 %b, i8 %c, i8 %d) {
define i8 @or_or_and_pat4(i8 %a, i8 %b, i8 %c, i8 %d) {
; CHECK-LABEL: @or_or_and_pat4(
; CHECK-NEXT: [[CT:%.*]] = udiv i8 42, [[C:%.*]]
; CHECK-NEXT: [[AND21:%.*]] = or i8 [[D:%.*]], [[A:%.*]]
; CHECK-NEXT: [[TMP1:%.*]] = and i8 [[AND21]], [[B:%.*]]
; CHECK-NEXT: [[OR2:%.*]] = or i8 [[CT]], [[TMP1]]
; CHECK-NEXT: [[AND1:%.*]] = and i8 [[A:%.*]], [[B:%.*]]
; CHECK-NEXT: [[AND2:%.*]] = and i8 [[D:%.*]], [[B]]
; CHECK-NEXT: [[OR1:%.*]] = or i8 [[CT]], [[AND2]]
; CHECK-NEXT: [[OR2:%.*]] = or i8 [[OR1]], [[AND1]]
; CHECK-NEXT: ret i8 [[OR2]]
;
%ct = udiv i8 42, %c ; thwart complexity-based canonicalization
Expand All @@ -457,9 +473,10 @@ define i8 @or_or_and_pat4(i8 %a, i8 %b, i8 %c, i8 %d) {
; ((A & D) | C) | (A & B)
define i8 @or_or_and_pat5(i8 %a, i8 %b, i8 %c, i8 %d) {
; CHECK-LABEL: @or_or_and_pat5(
; CHECK-NEXT: [[TMP1:%.*]] = or i8 [[D:%.*]], [[B:%.*]]
; CHECK-NEXT: [[TMP2:%.*]] = and i8 [[TMP1]], [[A:%.*]]
; CHECK-NEXT: [[OR2:%.*]] = or i8 [[TMP2]], [[C:%.*]]
; CHECK-NEXT: [[AND1:%.*]] = and i8 [[A:%.*]], [[B:%.*]]
; CHECK-NEXT: [[AND2:%.*]] = and i8 [[A]], [[D:%.*]]
; CHECK-NEXT: [[OR1:%.*]] = or i8 [[AND2]], [[C:%.*]]
; CHECK-NEXT: [[OR2:%.*]] = or i8 [[OR1]], [[AND1]]
; CHECK-NEXT: ret i8 [[OR2]]
;
%and1 = and i8 %a, %b
Expand All @@ -472,9 +489,10 @@ define i8 @or_or_and_pat5(i8 %a, i8 %b, i8 %c, i8 %d) {
; ((D & A) | C) | (A & B)
define i8 @or_or_and_pat6(i8 %a, i8 %b, i8 %c, i8 %d) {
; CHECK-LABEL: @or_or_and_pat6(
; CHECK-NEXT: [[AND21:%.*]] = or i8 [[D:%.*]], [[B:%.*]]
; CHECK-NEXT: [[TMP1:%.*]] = and i8 [[AND21]], [[A:%.*]]
; CHECK-NEXT: [[OR2:%.*]] = or i8 [[TMP1]], [[C:%.*]]
; CHECK-NEXT: [[AND1:%.*]] = and i8 [[A:%.*]], [[B:%.*]]
; CHECK-NEXT: [[AND2:%.*]] = and i8 [[D:%.*]], [[A]]
; CHECK-NEXT: [[OR1:%.*]] = or i8 [[AND2]], [[C:%.*]]
; CHECK-NEXT: [[OR2:%.*]] = or i8 [[OR1]], [[AND1]]
; CHECK-NEXT: ret i8 [[OR2]]
;
%and1 = and i8 %a, %b
Expand All @@ -487,9 +505,10 @@ define i8 @or_or_and_pat6(i8 %a, i8 %b, i8 %c, i8 %d) {
; ((B & D) | C) | (A & B)
define i8 @or_or_and_pat7(i8 %a, i8 %b, i8 %c, i8 %d) {
; CHECK-LABEL: @or_or_and_pat7(
; CHECK-NEXT: [[TMP1:%.*]] = or i8 [[D:%.*]], [[A:%.*]]
; CHECK-NEXT: [[TMP2:%.*]] = and i8 [[TMP1]], [[B:%.*]]
; CHECK-NEXT: [[OR2:%.*]] = or i8 [[TMP2]], [[C:%.*]]
; CHECK-NEXT: [[AND1:%.*]] = and i8 [[A:%.*]], [[B:%.*]]
; CHECK-NEXT: [[AND2:%.*]] = and i8 [[B]], [[D:%.*]]
; CHECK-NEXT: [[OR1:%.*]] = or i8 [[AND2]], [[C:%.*]]
; CHECK-NEXT: [[OR2:%.*]] = or i8 [[OR1]], [[AND1]]
; CHECK-NEXT: ret i8 [[OR2]]
;
%and1 = and i8 %a, %b
Expand All @@ -502,9 +521,10 @@ define i8 @or_or_and_pat7(i8 %a, i8 %b, i8 %c, i8 %d) {
; ((D & B) | C) | (A & B)
define i8 @or_or_and_pat8(i8 %a, i8 %b, i8 %c, i8 %d) {
; CHECK-LABEL: @or_or_and_pat8(
; CHECK-NEXT: [[AND21:%.*]] = or i8 [[D:%.*]], [[A:%.*]]
; CHECK-NEXT: [[TMP1:%.*]] = and i8 [[AND21]], [[B:%.*]]
; CHECK-NEXT: [[OR2:%.*]] = or i8 [[TMP1]], [[C:%.*]]
; CHECK-NEXT: [[AND1:%.*]] = and i8 [[A:%.*]], [[B:%.*]]
; CHECK-NEXT: [[AND2:%.*]] = and i8 [[D:%.*]], [[B]]
; CHECK-NEXT: [[OR1:%.*]] = or i8 [[AND2]], [[C:%.*]]
; CHECK-NEXT: [[OR2:%.*]] = or i8 [[OR1]], [[AND1]]
; CHECK-NEXT: ret i8 [[OR2]]
;
%and1 = and i8 %a, %b
Expand Down Expand Up @@ -540,9 +560,10 @@ define i8 @or_and_or_noOneUse(i8 %a, i8 %b, i8 %c, i8 %d) {
define i8 @or_and_or_pat1(i8 %a, i8 %b, i8 %c, i8 %d) {
; CHECK-LABEL: @or_and_or_pat1(
; CHECK-NEXT: [[CT:%.*]] = udiv i8 42, [[C:%.*]]
; CHECK-NEXT: [[TMP1:%.*]] = or i8 [[D:%.*]], [[B:%.*]]
; CHECK-NEXT: [[TMP2:%.*]] = and i8 [[TMP1]], [[A:%.*]]
; CHECK-NEXT: [[OR2:%.*]] = or i8 [[CT]], [[TMP2]]
; CHECK-NEXT: [[AND1:%.*]] = and i8 [[A:%.*]], [[B:%.*]]
; CHECK-NEXT: [[AND2:%.*]] = and i8 [[A]], [[D:%.*]]
; CHECK-NEXT: [[OR1:%.*]] = or i8 [[CT]], [[AND2]]
; CHECK-NEXT: [[OR2:%.*]] = or i8 [[AND1]], [[OR1]]
; CHECK-NEXT: ret i8 [[OR2]]
;
%ct = udiv i8 42, %c ; thwart complexity-based canonicalization
Expand All @@ -557,9 +578,10 @@ define i8 @or_and_or_pat1(i8 %a, i8 %b, i8 %c, i8 %d) {
define i8 @or_and_or_pat2(i8 %a, i8 %b, i8 %c, i8 %d) {
; CHECK-LABEL: @or_and_or_pat2(
; CHECK-NEXT: [[CT:%.*]] = udiv i8 42, [[C:%.*]]
; CHECK-NEXT: [[AND21:%.*]] = or i8 [[D:%.*]], [[B:%.*]]
; CHECK-NEXT: [[TMP1:%.*]] = and i8 [[AND21]], [[A:%.*]]
; CHECK-NEXT: [[OR2:%.*]] = or i8 [[CT]], [[TMP1]]
; CHECK-NEXT: [[AND1:%.*]] = and i8 [[A:%.*]], [[B:%.*]]
; CHECK-NEXT: [[AND2:%.*]] = and i8 [[D:%.*]], [[A]]
; CHECK-NEXT: [[OR1:%.*]] = or i8 [[CT]], [[AND2]]
; CHECK-NEXT: [[OR2:%.*]] = or i8 [[AND1]], [[OR1]]
; CHECK-NEXT: ret i8 [[OR2]]
;
%ct = udiv i8 42, %c ; thwart complexity-based canonicalization
Expand All @@ -574,9 +596,10 @@ define i8 @or_and_or_pat2(i8 %a, i8 %b, i8 %c, i8 %d) {
define i8 @or_and_or_pat3(i8 %a, i8 %b, i8 %c, i8 %d) {
; CHECK-LABEL: @or_and_or_pat3(
; CHECK-NEXT: [[CT:%.*]] = udiv i8 42, [[C:%.*]]
; CHECK-NEXT: [[TMP1:%.*]] = or i8 [[D:%.*]], [[A:%.*]]
; CHECK-NEXT: [[TMP2:%.*]] = and i8 [[TMP1]], [[B:%.*]]
; CHECK-NEXT: [[OR2:%.*]] = or i8 [[CT]], [[TMP2]]
; CHECK-NEXT: [[AND1:%.*]] = and i8 [[A:%.*]], [[B:%.*]]
; CHECK-NEXT: [[AND2:%.*]] = and i8 [[B]], [[D:%.*]]
; CHECK-NEXT: [[OR1:%.*]] = or i8 [[CT]], [[AND2]]
; CHECK-NEXT: [[OR2:%.*]] = or i8 [[AND1]], [[OR1]]
; CHECK-NEXT: ret i8 [[OR2]]
;
%ct = udiv i8 42, %c ; thwart complexity-based canonicalization
Expand All @@ -591,9 +614,10 @@ define i8 @or_and_or_pat3(i8 %a, i8 %b, i8 %c, i8 %d) {
define i8 @or_and_or_pat4(i8 %a, i8 %b, i8 %c, i8 %d) {
; CHECK-LABEL: @or_and_or_pat4(
; CHECK-NEXT: [[CT:%.*]] = udiv i8 42, [[C:%.*]]
; CHECK-NEXT: [[AND21:%.*]] = or i8 [[D:%.*]], [[A:%.*]]
; CHECK-NEXT: [[TMP1:%.*]] = and i8 [[AND21]], [[B:%.*]]
; CHECK-NEXT: [[OR2:%.*]] = or i8 [[CT]], [[TMP1]]
; CHECK-NEXT: [[AND1:%.*]] = and i8 [[A:%.*]], [[B:%.*]]
; CHECK-NEXT: [[AND2:%.*]] = and i8 [[D:%.*]], [[B]]
; CHECK-NEXT: [[OR1:%.*]] = or i8 [[CT]], [[AND2]]
; CHECK-NEXT: [[OR2:%.*]] = or i8 [[AND1]], [[OR1]]
; CHECK-NEXT: ret i8 [[OR2]]
;
%ct = udiv i8 42, %c ; thwart complexity-based canonicalization
Expand All @@ -607,9 +631,10 @@ define i8 @or_and_or_pat4(i8 %a, i8 %b, i8 %c, i8 %d) {
; (A & B) | ((A & D) | C)
define i8 @or_and_or_pat5(i8 %a, i8 %b, i8 %c, i8 %d) {
; CHECK-LABEL: @or_and_or_pat5(
; CHECK-NEXT: [[TMP1:%.*]] = or i8 [[D:%.*]], [[B:%.*]]
; CHECK-NEXT: [[TMP2:%.*]] = and i8 [[TMP1]], [[A:%.*]]
; CHECK-NEXT: [[OR2:%.*]] = or i8 [[TMP2]], [[C:%.*]]
; CHECK-NEXT: [[AND1:%.*]] = and i8 [[A:%.*]], [[B:%.*]]
; CHECK-NEXT: [[AND2:%.*]] = and i8 [[A]], [[D:%.*]]
; CHECK-NEXT: [[OR1:%.*]] = or i8 [[AND2]], [[C:%.*]]
; CHECK-NEXT: [[OR2:%.*]] = or i8 [[AND1]], [[OR1]]
; CHECK-NEXT: ret i8 [[OR2]]
;
%and1 = and i8 %a, %b
Expand All @@ -622,9 +647,10 @@ define i8 @or_and_or_pat5(i8 %a, i8 %b, i8 %c, i8 %d) {
; (A & B) | ((D & A) | C)
define i8 @or_and_or_pat6(i8 %a, i8 %b, i8 %c, i8 %d) {
; CHECK-LABEL: @or_and_or_pat6(
; CHECK-NEXT: [[AND21:%.*]] = or i8 [[D:%.*]], [[B:%.*]]
; CHECK-NEXT: [[TMP1:%.*]] = and i8 [[AND21]], [[A:%.*]]
; CHECK-NEXT: [[OR2:%.*]] = or i8 [[TMP1]], [[C:%.*]]
; CHECK-NEXT: [[AND1:%.*]] = and i8 [[A:%.*]], [[B:%.*]]
; CHECK-NEXT: [[AND2:%.*]] = and i8 [[D:%.*]], [[A]]
; CHECK-NEXT: [[OR1:%.*]] = or i8 [[AND2]], [[C:%.*]]
; CHECK-NEXT: [[OR2:%.*]] = or i8 [[AND1]], [[OR1]]
; CHECK-NEXT: ret i8 [[OR2]]
;
%and1 = and i8 %a, %b
Expand All @@ -637,9 +663,10 @@ define i8 @or_and_or_pat6(i8 %a, i8 %b, i8 %c, i8 %d) {
; (A & B) | ((B & D) | C)
define i8 @or_and_or_pat7(i8 %a, i8 %b, i8 %c, i8 %d) {
; CHECK-LABEL: @or_and_or_pat7(
; CHECK-NEXT: [[TMP1:%.*]] = or i8 [[D:%.*]], [[A:%.*]]
; CHECK-NEXT: [[TMP2:%.*]] = and i8 [[TMP1]], [[B:%.*]]
; CHECK-NEXT: [[OR2:%.*]] = or i8 [[TMP2]], [[C:%.*]]
; CHECK-NEXT: [[AND1:%.*]] = and i8 [[A:%.*]], [[B:%.*]]
; CHECK-NEXT: [[AND2:%.*]] = and i8 [[B]], [[D:%.*]]
; CHECK-NEXT: [[OR1:%.*]] = or i8 [[AND2]], [[C:%.*]]
; CHECK-NEXT: [[OR2:%.*]] = or i8 [[AND1]], [[OR1]]
; CHECK-NEXT: ret i8 [[OR2]]
;
%and1 = and i8 %a, %b
Expand All @@ -652,9 +679,10 @@ define i8 @or_and_or_pat7(i8 %a, i8 %b, i8 %c, i8 %d) {
; (A & B) | ((D & B) | C)
define i8 @or_and_or_pat8(i8 %a, i8 %b, i8 %c, i8 %d) {
; CHECK-LABEL: @or_and_or_pat8(
; CHECK-NEXT: [[AND21:%.*]] = or i8 [[D:%.*]], [[A:%.*]]
; CHECK-NEXT: [[TMP1:%.*]] = and i8 [[AND21]], [[B:%.*]]
; CHECK-NEXT: [[OR2:%.*]] = or i8 [[TMP1]], [[C:%.*]]
; CHECK-NEXT: [[AND1:%.*]] = and i8 [[A:%.*]], [[B:%.*]]
; CHECK-NEXT: [[AND2:%.*]] = and i8 [[D:%.*]], [[B]]
; CHECK-NEXT: [[OR1:%.*]] = or i8 [[AND2]], [[C:%.*]]
; CHECK-NEXT: [[OR2:%.*]] = or i8 [[AND1]], [[OR1]]
; CHECK-NEXT: ret i8 [[OR2]]
;
%and1 = and i8 %a, %b
Expand Down
6 changes: 4 additions & 2 deletions llvm/test/Transforms/InstCombine/or.ll
Expand Up @@ -396,8 +396,10 @@ define i32 @test30(i32 %A) {

define <2 x i32> @test30vec(<2 x i32> %A) {
; CHECK-LABEL: @test30vec(
; CHECK-NEXT: [[TMP1:%.*]] = and <2 x i32> [[A:%.*]], <i32 -58312, i32 -58312>
; CHECK-NEXT: [[E:%.*]] = or <2 x i32> [[TMP1]], <i32 32962, i32 32962>
; CHECK-NEXT: [[C:%.*]] = and <2 x i32> [[A:%.*]], <i32 -65536, i32 -65536>
; CHECK-NEXT: [[B:%.*]] = and <2 x i32> [[A]], <i32 7224, i32 7224>
; CHECK-NEXT: [[D:%.*]] = or <2 x i32> [[B]], <i32 32962, i32 32962>
; CHECK-NEXT: [[E:%.*]] = or <2 x i32> [[D]], [[C]]
; CHECK-NEXT: ret <2 x i32> [[E]]
;
%B = or <2 x i32> %A, <i32 32962, i32 32962>
Expand Down

0 comments on commit aa98e7e

Please sign in to comment.