3
3
; Tests for GitHub issue #97044 - Boolean expression canonicalization
4
4
define i32 @test0_4way_or (i32 %x , i32 %y , i32 %z ) {
5
5
; CHECK-LABEL: @test0_4way_or(
6
- ; CHECK-NEXT: [[NOT:%.*]] = xor i32 [[Z:%.*]], -1
7
- ; CHECK-NEXT: [[AND:%.*]] = and i32 [[Y:%.*]], [[NOT]]
8
- ; CHECK-NEXT: [[AND1:%.*]] = and i32 [[AND]], [[X:%.*]]
9
- ; CHECK-NEXT: [[NOT2:%.*]] = xor i32 [[Y]], -1
10
- ; CHECK-NEXT: [[AND3:%.*]] = and i32 [[X]], [[NOT2]]
11
- ; CHECK-NEXT: [[AND4:%.*]] = and i32 [[AND3]], [[Z]]
12
- ; CHECK-NEXT: [[OR:%.*]] = or i32 [[AND1]], [[AND4]]
13
- ; CHECK-NEXT: [[AND7_DEMORGAN:%.*]] = or i32 [[X]], [[Y]]
14
- ; CHECK-NEXT: [[AND9_DEMORGAN:%.*]] = or i32 [[AND7_DEMORGAN]], [[Z]]
15
- ; CHECK-NEXT: [[AND9:%.*]] = xor i32 [[AND9_DEMORGAN]], -1
16
- ; CHECK-NEXT: [[OR10:%.*]] = or i32 [[OR]], [[AND9]]
17
- ; CHECK-NEXT: [[AND11:%.*]] = and i32 [[X]], [[Y]]
18
- ; CHECK-NEXT: [[AND12:%.*]] = and i32 [[AND11]], [[Z]]
19
- ; CHECK-NEXT: [[OR13:%.*]] = or i32 [[OR10]], [[AND12]]
6
+ ; CHECK-NEXT: [[TMP1:%.*]] = or i32 [[Y:%.*]], [[Z:%.*]]
7
+ ; CHECK-NEXT: [[TMP2:%.*]] = xor i32 [[TMP1]], [[X:%.*]]
8
+ ; CHECK-NEXT: [[OR13:%.*]] = xor i32 [[TMP2]], -1
20
9
; CHECK-NEXT: ret i32 [[OR13]]
21
10
;
22
11
%not = xor i32 %z , -1
@@ -39,11 +28,9 @@ define i32 @test0_4way_or(i32 %x, i32 %y, i32 %z) {
39
28
}
40
29
define i32 @test1_xor_pattern (i32 %x , i32 %y , i32 %z ) {
41
30
; CHECK-LABEL: @test1_xor_pattern(
42
- ; CHECK-NEXT: [[TMP1:%.*]] = xor i32 [[X:%.*]], [[Y:%.*]]
43
- ; CHECK-NEXT: [[AND4_DEMORGAN:%.*]] = or i32 [[TMP1]], [[Z:%.*]]
44
- ; CHECK-NEXT: [[AND8:%.*]] = and i32 [[Z]], [[X]]
45
- ; CHECK-NEXT: [[TMP2:%.*]] = xor i32 [[AND4_DEMORGAN]], -1
46
- ; CHECK-NEXT: [[XOR:%.*]] = or i32 [[AND8]], [[TMP2]]
31
+ ; CHECK-NEXT: [[TMP1:%.*]] = or i32 [[Y:%.*]], [[Z:%.*]]
32
+ ; CHECK-NEXT: [[TMP2:%.*]] = xor i32 [[TMP1]], [[X:%.*]]
33
+ ; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[TMP2]], -1
47
34
; CHECK-NEXT: ret i32 [[XOR]]
48
35
;
49
36
%not = xor i32 %z , -1
@@ -62,10 +49,10 @@ define i32 @test1_xor_pattern(i32 %x, i32 %y, i32 %z) {
62
49
}
63
50
define i32 @test2_nested_xor (i32 %x , i32 %y , i32 %z ) {
64
51
; CHECK-LABEL: @test2_nested_xor(
65
- ; CHECK-NEXT: [[NOT7 :%.*]] = xor i32 [[Y:%.*]], -1
66
- ; CHECK-NEXT: [[AND8 :%.*]] = and i32 [[Z:%.* ]], [[NOT7 ]]
67
- ; CHECK-NEXT: [[TMP1 :%.*]] = xor i32 [[X:%.* ]], [[AND8 ]]
68
- ; CHECK-NEXT: ret i32 [[TMP1 ]]
52
+ ; CHECK-NEXT: [[TMP1 :%.*]] = or i32 [[Y:%.*]], [[Z:%.*]]
53
+ ; CHECK-NEXT: [[TMP2 :%.*]] = xor i32 [[TMP1 ]], [[X:%.* ]]
54
+ ; CHECK-NEXT: [[TMP3 :%.*]] = xor i32 [[TMP2 ]], [[Y ]]
55
+ ; CHECK-NEXT: ret i32 [[TMP3 ]]
69
56
;
70
57
%and = and i32 %x , %y
71
58
%not = xor i32 %x , -1
0 commit comments