Skip to content

Commit a7265f9

Browse files
committed
[InstCombine] add tests for branch on logical and/or; NFC
1 parent 3f532e0 commit a7265f9

File tree

2 files changed

+105
-2
lines changed

2 files changed

+105
-2
lines changed

llvm/test/Transforms/InstCombine/branch.ll

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,3 +112,77 @@ merge.2:
112112
%merge.cond.2 = phi i1 [false, %if.true.2], [true, %if.false.2]
113113
ret i1 %merge.cond.2
114114
}
115+
116+
; if (x && !y) ret 42; ret 3
117+
118+
define i32 @logical_and_not(i1 %x, i1 %y) {
119+
; CHECK-LABEL: @logical_and_not(
120+
; CHECK-NEXT: entry:
121+
; CHECK-NEXT: [[NOTY:%.*]] = xor i1 [[Y:%.*]], true
122+
; CHECK-NEXT: [[AND:%.*]] = select i1 [[X:%.*]], i1 [[NOTY]], i1 false
123+
; CHECK-NEXT: br i1 [[AND]], label [[T:%.*]], label [[F:%.*]]
124+
; CHECK: t:
125+
; CHECK-NEXT: ret i32 42
126+
; CHECK: f:
127+
; CHECK-NEXT: ret i32 3
128+
;
129+
entry:
130+
%noty = xor i1 %y, true
131+
%and = select i1 %x, i1 %noty, i1 false
132+
br i1 %and, label %t, label %f
133+
134+
t:
135+
ret i32 42
136+
137+
f:
138+
ret i32 3
139+
}
140+
141+
; if (x && y || !x) ret 3; ret 42
142+
143+
define i32 @logical_and_or(i1 %x, i1 %y) {
144+
; CHECK-LABEL: @logical_and_or(
145+
; CHECK-NEXT: entry:
146+
; CHECK-NEXT: [[NOT_X:%.*]] = xor i1 [[X:%.*]], true
147+
; CHECK-NEXT: [[AND:%.*]] = select i1 [[NOT_X]], i1 true, i1 [[Y:%.*]]
148+
; CHECK-NEXT: br i1 [[AND]], label [[F:%.*]], label [[T:%.*]]
149+
; CHECK: t:
150+
; CHECK-NEXT: ret i32 42
151+
; CHECK: f:
152+
; CHECK-NEXT: ret i32 3
153+
;
154+
entry:
155+
%and = select i1 %x, i1 %y, i1 true
156+
br i1 %and, label %f, label %t
157+
158+
t:
159+
ret i32 42
160+
161+
f:
162+
ret i32 3
163+
}
164+
165+
; if (!x || y) ret 3; ret 42
166+
167+
define i32 @logical_or_not(i1 %x, i1 %y) {
168+
; CHECK-LABEL: @logical_or_not(
169+
; CHECK-NEXT: entry:
170+
; CHECK-NEXT: [[NOTX:%.*]] = xor i1 [[X:%.*]], true
171+
; CHECK-NEXT: [[AND:%.*]] = select i1 [[NOTX]], i1 true, i1 [[Y:%.*]]
172+
; CHECK-NEXT: br i1 [[AND]], label [[F:%.*]], label [[T:%.*]]
173+
; CHECK: t:
174+
; CHECK-NEXT: ret i32 42
175+
; CHECK: f:
176+
; CHECK-NEXT: ret i32 3
177+
;
178+
entry:
179+
%notx = xor i1 %x, true
180+
%and = select i1 %notx, i1 true, i1 %y
181+
br i1 %and, label %f, label %t
182+
183+
t:
184+
ret i32 42
185+
186+
f:
187+
ret i32 3
188+
}

llvm/test/Transforms/PhaseOrdering/simplifycfg-options.ll

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ define i1 @PR33605(i32 %a, i32 %b, i32* %c) {
1515
; CHECK-NEXT: br i1 [[CMP]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]
1616
; CHECK: if.then:
1717
; CHECK-NEXT: store i32 [[OR]], i32* [[ARRAYIDX]], align 4
18-
; CHECK-NEXT: call void @foo()
18+
; CHECK-NEXT: tail call void @foo()
1919
; CHECK-NEXT: br label [[IF_END]]
2020
; CHECK: if.end:
2121
; CHECK-NEXT: [[TMP1:%.*]] = xor i1 [[CMP]], true
@@ -24,7 +24,7 @@ define i1 @PR33605(i32 %a, i32 %b, i32* %c) {
2424
; CHECK-NEXT: br i1 [[CMP_1]], label [[IF_END_1:%.*]], label [[IF_THEN_1:%.*]]
2525
; CHECK: if.then.1:
2626
; CHECK-NEXT: store i32 [[OR]], i32* [[C]], align 4
27-
; CHECK-NEXT: call void @foo()
27+
; CHECK-NEXT: tail call void @foo()
2828
; CHECK-NEXT: br label [[IF_END_1]]
2929
; CHECK: if.end.1:
3030
; CHECK-NEXT: [[CHANGED_1_OFF0_1:%.*]] = phi i1 [ true, [[IF_THEN_1]] ], [ [[TMP1]], [[IF_END]] ]
@@ -102,3 +102,32 @@ end:
102102
ret double %max
103103
}
104104

105+
define i1 @PR58313(i1 %lhs, i1 %rhs) {
106+
; CHECK-LABEL: @PR58313(
107+
; CHECK-NEXT: andandend:
108+
; CHECK-NEXT: [[TMP0:%.*]] = xor i1 [[RHS:%.*]], true
109+
; CHECK-NEXT: [[ANDANDVAL:%.*]] = select i1 [[LHS:%.*]], i1 [[TMP0]], i1 false
110+
; CHECK-NEXT: br i1 [[ANDANDVAL]], label [[OROREND:%.*]], label [[OROR:%.*]]
111+
; CHECK: oror:
112+
; CHECK-NEXT: [[TMP1:%.*]] = xor i1 [[LHS]], true
113+
; CHECK-NEXT: [[ANDANDVAL3:%.*]] = select i1 [[TMP1]], i1 [[RHS]], i1 false
114+
; CHECK-NEXT: br label [[OROREND]]
115+
; CHECK: ororend:
116+
; CHECK-NEXT: [[ORORVAL:%.*]] = phi i1 [ true, [[ANDANDEND:%.*]] ], [ [[ANDANDVAL3]], [[OROR]] ]
117+
; CHECK-NEXT: ret i1 [[ORORVAL]]
118+
;
119+
andandend:
120+
%0 = xor i1 %rhs, true
121+
%andandval = select i1 %lhs, i1 %0, i1 false
122+
br i1 %andandval, label %ororend, label %oror
123+
124+
oror:
125+
%1 = xor i1 %lhs, true
126+
%andandval3 = select i1 %1, i1 %rhs, i1 false
127+
br label %ororend
128+
129+
ororend:
130+
%ororval = phi i1 [ true, %andandend ], [ %andandval3, %oror ]
131+
ret i1 %ororval
132+
}
133+

0 commit comments

Comments
 (0)