mirror of
https://github.com/llvm/llvm-project.git
synced 2025-05-03 14:56:07 +00:00
Revert "[InstCombine] Combine instructions of type or/and where AND masks can be combined."
This reverts commit ec4adf1f6c333d3d36663d8f763c0896407f1b61. 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 ```
This commit is contained in:
parent
8c349d707e
commit
aa98e7e1eb
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
@ -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
|
||||
@ -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
|
||||
@ -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
|
||||
@ -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
|
||||
@ -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
|
||||
@ -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
|
||||
@ -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
|
||||
@ -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
|
||||
@ -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
|
||||
@ -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
|
||||
@ -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
|
||||
@ -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
|
||||
@ -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
|
||||
@ -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
|
||||
@ -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
|
||||
@ -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
|
||||
|
@ -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>
|
||||
|
Loading…
x
Reference in New Issue
Block a user