mirror of
https://github.com/RPCS3/llvm.git
synced 2025-01-10 22:46:25 +00:00
[InstCombine] add multi-use variants for DeMorgan folds; NFC
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@301802 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
ae542a60cb
commit
217ed17252
@ -242,6 +242,134 @@ define i8 @demorgan_nor(i8 %A, i8 %B) {
|
|||||||
ret i8 %notc
|
ret i8 %notc
|
||||||
}
|
}
|
||||||
|
|
||||||
|
; ~(~A | B) --> (A & ~B) - what if we use one of the intermediate results?
|
||||||
|
|
||||||
|
define i8 @demorgan_nor_use2a(i8 %A, i8 %B) {
|
||||||
|
; CHECK-LABEL: @demorgan_nor_use2a(
|
||||||
|
; CHECK-NEXT: [[NOTA:%.*]] = xor i8 %A, -1
|
||||||
|
; CHECK-NEXT: [[USE2A:%.*]] = mul i8 [[NOTA]], 23
|
||||||
|
; CHECK-NEXT: [[B_NOT:%.*]] = xor i8 %B, -1
|
||||||
|
; CHECK-NEXT: [[NOTC:%.*]] = and i8 [[B_NOT]], %A
|
||||||
|
; CHECK-NEXT: [[R:%.*]] = sdiv i8 [[NOTC]], [[USE2A]]
|
||||||
|
; CHECK-NEXT: ret i8 [[R]]
|
||||||
|
;
|
||||||
|
%nota = xor i8 %A, -1
|
||||||
|
%use2a = mul i8 %nota, 23
|
||||||
|
%c = or i8 %nota, %B
|
||||||
|
%notc = xor i8 %c, -1
|
||||||
|
%r = sdiv i8 %notc, %use2a
|
||||||
|
ret i8 %r
|
||||||
|
}
|
||||||
|
|
||||||
|
; ~(~A | B) --> (A & ~B) - what if we use one of the intermediate results?
|
||||||
|
|
||||||
|
define i8 @demorgan_nor_use2b(i8 %A, i8 %B) {
|
||||||
|
; CHECK-LABEL: @demorgan_nor_use2b(
|
||||||
|
; CHECK-NEXT: [[USE2B:%.*]] = mul i8 %B, 23
|
||||||
|
; CHECK-NEXT: [[B_NOT:%.*]] = xor i8 %B, -1
|
||||||
|
; CHECK-NEXT: [[NOTC:%.*]] = and i8 [[B_NOT]], %A
|
||||||
|
; CHECK-NEXT: [[R:%.*]] = sdiv i8 [[NOTC]], [[USE2B]]
|
||||||
|
; CHECK-NEXT: ret i8 [[R]]
|
||||||
|
;
|
||||||
|
%use2b = mul i8 %B, 23
|
||||||
|
%nota = xor i8 %A, -1
|
||||||
|
%c = or i8 %nota, %B
|
||||||
|
%notc = xor i8 %c, -1
|
||||||
|
%r = sdiv i8 %notc, %use2b
|
||||||
|
ret i8 %r
|
||||||
|
}
|
||||||
|
|
||||||
|
; ~(~A | B) --> (A & ~B) - what if we use one of the intermediate results?
|
||||||
|
|
||||||
|
define i8 @demorgan_nor_use2c(i8 %A, i8 %B) {
|
||||||
|
; CHECK-LABEL: @demorgan_nor_use2c(
|
||||||
|
; CHECK-NEXT: [[NOTA:%.*]] = xor i8 %A, -1
|
||||||
|
; CHECK-NEXT: [[C:%.*]] = or i8 [[NOTA]], %B
|
||||||
|
; CHECK-NEXT: [[USE2C:%.*]] = mul i8 [[C]], 23
|
||||||
|
; CHECK-NEXT: [[B_NOT:%.*]] = xor i8 %B, -1
|
||||||
|
; CHECK-NEXT: [[NOTC:%.*]] = and i8 [[B_NOT]], %A
|
||||||
|
; CHECK-NEXT: [[R:%.*]] = sdiv i8 [[NOTC]], [[USE2C]]
|
||||||
|
; CHECK-NEXT: ret i8 [[R]]
|
||||||
|
;
|
||||||
|
%nota = xor i8 %A, -1
|
||||||
|
%c = or i8 %nota, %B
|
||||||
|
%use2c = mul i8 %c, 23
|
||||||
|
%notc = xor i8 %c, -1
|
||||||
|
%r = sdiv i8 %notc, %use2c
|
||||||
|
ret i8 %r
|
||||||
|
}
|
||||||
|
|
||||||
|
; ~(~A | B) --> (A & ~B) - what if we use two of the intermediate results?
|
||||||
|
|
||||||
|
define i8 @demorgan_nor_use2ab(i8 %A, i8 %B) {
|
||||||
|
; CHECK-LABEL: @demorgan_nor_use2ab(
|
||||||
|
; CHECK-NEXT: [[USE2B:%.*]] = mul i8 %B, 23
|
||||||
|
; CHECK-NEXT: [[NOTA:%.*]] = xor i8 %A, -1
|
||||||
|
; CHECK-NEXT: [[USE2A:%.*]] = mul i8 [[NOTA]], 17
|
||||||
|
; CHECK-NEXT: [[B_NOT:%.*]] = xor i8 %B, -1
|
||||||
|
; CHECK-NEXT: [[NOTC:%.*]] = and i8 [[B_NOT]], %A
|
||||||
|
; CHECK-NEXT: [[R1:%.*]] = sdiv i8 [[NOTC]], [[USE2B]]
|
||||||
|
; CHECK-NEXT: [[R2:%.*]] = sdiv i8 [[R1]], [[USE2A]]
|
||||||
|
; CHECK-NEXT: ret i8 [[R2]]
|
||||||
|
;
|
||||||
|
%use2b = mul i8 %B, 23
|
||||||
|
%nota = xor i8 %A, -1
|
||||||
|
%use2a = mul i8 %nota, 17
|
||||||
|
%c = or i8 %nota, %B
|
||||||
|
%notc = xor i8 %c, -1
|
||||||
|
%r1 = sdiv i8 %notc, %use2b
|
||||||
|
%r2 = sdiv i8 %r1, %use2a
|
||||||
|
ret i8 %r2
|
||||||
|
}
|
||||||
|
|
||||||
|
; ~(~A | B) --> (A & ~B) - what if we use two of the intermediate results?
|
||||||
|
|
||||||
|
define i8 @demorgan_nor_use2ac(i8 %A, i8 %B) {
|
||||||
|
; CHECK-LABEL: @demorgan_nor_use2ac(
|
||||||
|
; CHECK-NEXT: [[NOTA:%.*]] = xor i8 %A, -1
|
||||||
|
; CHECK-NEXT: [[USE2A:%.*]] = mul i8 [[NOTA]], 17
|
||||||
|
; CHECK-NEXT: [[C:%.*]] = or i8 [[NOTA]], %B
|
||||||
|
; CHECK-NEXT: [[USE2C:%.*]] = mul i8 [[C]], 23
|
||||||
|
; CHECK-NEXT: [[B_NOT:%.*]] = xor i8 %B, -1
|
||||||
|
; CHECK-NEXT: [[NOTC:%.*]] = and i8 [[B_NOT]], %A
|
||||||
|
; CHECK-NEXT: [[R1:%.*]] = sdiv i8 [[NOTC]], [[USE2C]]
|
||||||
|
; CHECK-NEXT: [[R2:%.*]] = sdiv i8 [[R1]], [[USE2A]]
|
||||||
|
; CHECK-NEXT: ret i8 [[R2]]
|
||||||
|
;
|
||||||
|
%nota = xor i8 %A, -1
|
||||||
|
%use2a = mul i8 %nota, 17
|
||||||
|
%c = or i8 %nota, %B
|
||||||
|
%use2c = mul i8 %c, 23
|
||||||
|
%notc = xor i8 %c, -1
|
||||||
|
%r1 = sdiv i8 %notc, %use2c
|
||||||
|
%r2 = sdiv i8 %r1, %use2a
|
||||||
|
ret i8 %r2
|
||||||
|
}
|
||||||
|
|
||||||
|
; ~(~A | B) --> (A & ~B) - what if we use two of the intermediate results?
|
||||||
|
|
||||||
|
define i8 @demorgan_nor_use2bc(i8 %A, i8 %B) {
|
||||||
|
; CHECK-LABEL: @demorgan_nor_use2bc(
|
||||||
|
; CHECK-NEXT: [[USE2B:%.*]] = mul i8 %B, 23
|
||||||
|
; CHECK-NEXT: [[NOTA:%.*]] = xor i8 %A, -1
|
||||||
|
; CHECK-NEXT: [[C:%.*]] = or i8 [[NOTA]], %B
|
||||||
|
; CHECK-NEXT: [[USE2C:%.*]] = mul i8 [[C]], 23
|
||||||
|
; CHECK-NEXT: [[B_NOT:%.*]] = xor i8 %B, -1
|
||||||
|
; CHECK-NEXT: [[NOTC:%.*]] = and i8 [[B_NOT]], %A
|
||||||
|
; CHECK-NEXT: [[R1:%.*]] = sdiv i8 [[NOTC]], [[USE2C]]
|
||||||
|
; CHECK-NEXT: [[R2:%.*]] = sdiv i8 [[R1]], [[USE2B]]
|
||||||
|
; CHECK-NEXT: ret i8 [[R2]]
|
||||||
|
;
|
||||||
|
%use2b = mul i8 %B, 23
|
||||||
|
%nota = xor i8 %A, -1
|
||||||
|
%c = or i8 %nota, %B
|
||||||
|
%use2c = mul i8 %c, 23
|
||||||
|
%notc = xor i8 %c, -1
|
||||||
|
%r1 = sdiv i8 %notc, %use2c
|
||||||
|
%r2 = sdiv i8 %r1, %use2b
|
||||||
|
ret i8 %r2
|
||||||
|
}
|
||||||
|
|
||||||
; FIXME: Do not apply DeMorgan's Law to constants. We prefer 'not' ops.
|
; FIXME: Do not apply DeMorgan's Law to constants. We prefer 'not' ops.
|
||||||
|
|
||||||
define i32 @demorganize_constant1(i32 %a) {
|
define i32 @demorganize_constant1(i32 %a) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user