Skip to content

Commit ff523aa

Browse files
committed
[CVP] Add additional switch tests (NFC)
These cover cases handled by getPredicateAt(), but not by the current implementation: * Assumes based on context instruction. * Value from phi node in same block (using per-pred reasoning). * Value from non-phi node in same block (using block-val reasoning).
1 parent baf931a commit ff523aa

File tree

1 file changed

+112
-0
lines changed
  • llvm/test/Transforms/CorrelatedValuePropagation

1 file changed

+112
-0
lines changed

llvm/test/Transforms/CorrelatedValuePropagation/basic.ll

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,117 @@ next:
278278
ret void
279279
}
280280

281+
define void @switch_nonzero_zext(i8 %s) {
282+
; CHECK-LABEL: @switch_nonzero_zext(
283+
; CHECK-NEXT: entry:
284+
; CHECK-NEXT: [[CMP:%.*]] = icmp ne i8 [[S:%.*]], 0
285+
; CHECK-NEXT: br i1 [[CMP]], label [[SWITCH:%.*]], label [[EXIT:%.*]]
286+
; CHECK: switch:
287+
; CHECK-NEXT: [[S_EXT:%.*]] = zext i8 [[S]] to i32
288+
; CHECK-NEXT: switch i32 [[S_EXT]], label [[EXIT]] [
289+
; CHECK-NEXT: i32 0, label [[UNREACHABLE:%.*]]
290+
; CHECK-NEXT: i32 1, label [[EXIT]]
291+
; CHECK-NEXT: i32 -1, label [[EXIT]]
292+
; CHECK-NEXT: ]
293+
; CHECK: exit:
294+
; CHECK-NEXT: ret void
295+
; CHECK: unreachable:
296+
; CHECK-NEXT: ret void
297+
;
298+
entry:
299+
%cmp = icmp ne i8 %s, 0
300+
br i1 %cmp, label %switch, label %exit
301+
302+
switch:
303+
%s.ext = zext i8 %s to i32
304+
switch i32 %s.ext, label %exit [
305+
i32 0, label %unreachable
306+
i32 1, label %exit
307+
i32 -1, label %exit
308+
]
309+
310+
exit:
311+
ret void
312+
313+
unreachable:
314+
ret void
315+
}
316+
317+
define void @switch_assume_nonzero(i32 %s) {
318+
; CHECK-LABEL: @switch_assume_nonzero(
319+
; CHECK-NEXT: entry:
320+
; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[S:%.*]], 0
321+
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP]])
322+
; CHECK-NEXT: switch i32 [[S]], label [[EXIT:%.*]] [
323+
; CHECK-NEXT: i32 0, label [[UNREACHABLE:%.*]]
324+
; CHECK-NEXT: i32 1, label [[EXIT]]
325+
; CHECK-NEXT: i32 -1, label [[EXIT]]
326+
; CHECK-NEXT: ]
327+
; CHECK: exit:
328+
; CHECK-NEXT: ret void
329+
; CHECK: unreachable:
330+
; CHECK-NEXT: ret void
331+
;
332+
entry:
333+
%cmp = icmp ne i32 %s, 0
334+
call void @llvm.assume(i1 %cmp)
335+
switch i32 %s, label %exit [
336+
i32 0, label %unreachable
337+
i32 1, label %exit
338+
i32 -1, label %exit
339+
]
340+
341+
exit:
342+
ret void
343+
344+
unreachable:
345+
ret void
346+
}
347+
348+
define void @switch_nonzero_phi(i1 %cond) {
349+
; CHECK-LABEL: @switch_nonzero_phi(
350+
; CHECK-NEXT: entry:
351+
; CHECK-NEXT: br i1 [[COND:%.*]], label [[IF:%.*]], label [[ELSE:%.*]]
352+
; CHECK: if:
353+
; CHECK-NEXT: br label [[SWITCH:%.*]]
354+
; CHECK: else:
355+
; CHECK-NEXT: br label [[SWITCH]]
356+
; CHECK: switch:
357+
; CHECK-NEXT: [[S:%.*]] = phi i32 [ 1, [[IF]] ], [ -1, [[ELSE]] ]
358+
; CHECK-NEXT: switch i32 [[S]], label [[EXIT:%.*]] [
359+
; CHECK-NEXT: i32 0, label [[UNREACHABLE:%.*]]
360+
; CHECK-NEXT: i32 1, label [[EXIT]]
361+
; CHECK-NEXT: i32 -1, label [[EXIT]]
362+
; CHECK-NEXT: ]
363+
; CHECK: exit:
364+
; CHECK-NEXT: ret void
365+
; CHECK: unreachable:
366+
; CHECK-NEXT: ret void
367+
;
368+
entry:
369+
br i1 %cond, label %if, label %else
370+
371+
if:
372+
br label %switch
373+
374+
else:
375+
br label %switch
376+
377+
switch:
378+
%s = phi i32 [ 1, %if ], [ -1, %else ]
379+
switch i32 %s, label %exit [
380+
i32 0, label %unreachable
381+
i32 1, label %exit
382+
i32 -1, label %exit
383+
]
384+
385+
exit:
386+
ret void
387+
388+
unreachable:
389+
ret void
390+
}
391+
281392
define i1 @arg_attribute(i8* nonnull %a) {
282393
; CHECK-LABEL: @arg_attribute(
283394
; CHECK-NEXT: ret i1 false
@@ -966,3 +1077,4 @@ declare i32 @llvm.uadd.sat.i32(i32, i32)
9661077
declare i32 @llvm.usub.sat.i32(i32, i32)
9671078
declare i32 @llvm.sadd.sat.i32(i32, i32)
9681079
declare i32 @llvm.ssub.sat.i32(i32, i32)
1080+
declare void @llvm.assume(i1)

0 commit comments

Comments
 (0)