
The legacy PM is deprecated, so update a bunch of lit tests running opt to use the new PM syntax when specifying the pipeline. In this patch focus has been put on test cases for ConstantMerge, ConstraintElimination, CorrelatedValuePropagation, GlobalDCE, GlobalOpt, SCCP, TailCallElim and PredicateInfo. Differential Revision: https://reviews.llvm.org/D114516
130 lines
3.0 KiB
LLVM
130 lines
3.0 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
|
; RUN: opt -S -passes=ipsccp < %s | FileCheck %s
|
|
|
|
; Test that information about the true/false value of conditions themselves
|
|
; is also used, not information implied by comparisions.
|
|
|
|
define i32 @switch(i32 %x) {
|
|
; CHECK-LABEL: @switch(
|
|
; CHECK-NEXT: switch i32 [[X:%.*]], label [[CASE_DEFAULT:%.*]] [
|
|
; CHECK-NEXT: i32 0, label [[CASE_0:%.*]]
|
|
; CHECK-NEXT: i32 2, label [[CASE_2:%.*]]
|
|
; CHECK-NEXT: ]
|
|
; CHECK: case.0:
|
|
; CHECK-NEXT: br label [[END:%.*]]
|
|
; CHECK: case.2:
|
|
; CHECK-NEXT: br label [[END]]
|
|
; CHECK: case.default:
|
|
; CHECK-NEXT: br label [[END]]
|
|
; CHECK: end:
|
|
; CHECK-NEXT: ret i32 1
|
|
;
|
|
switch i32 %x, label %case.default [
|
|
i32 0, label %case.0
|
|
i32 2, label %case.2
|
|
]
|
|
|
|
case.0:
|
|
%add = add i32 %x, 1
|
|
br label %end
|
|
|
|
case.2:
|
|
%sub = sub i32 %x, 1
|
|
br label %end
|
|
|
|
case.default:
|
|
br label %end
|
|
|
|
end:
|
|
%phi = phi i32 [ %add, %case.0 ], [ %sub, %case.2 ], [ 1, %case.default]
|
|
ret i32 %phi
|
|
}
|
|
|
|
define i1 @assume(i32 %x) {
|
|
; CHECK-LABEL: @assume(
|
|
; CHECK-NEXT: [[CMP:%.*]] = icmp sge i32 [[X:%.*]], 0
|
|
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP]])
|
|
; CHECK-NEXT: ret i1 true
|
|
;
|
|
%cmp = icmp sge i32 %x, 0
|
|
call void @llvm.assume(i1 %cmp)
|
|
ret i1 %cmp
|
|
}
|
|
|
|
define i32 @branch(i32 %x) {
|
|
; CHECK-LABEL: @branch(
|
|
; CHECK-NEXT: [[CMP:%.*]] = icmp sge i32 [[X:%.*]], 0
|
|
; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN1:%.*]], label [[IF_THEN2:%.*]]
|
|
; CHECK: if.then1:
|
|
; CHECK-NEXT: br label [[IF2_THEN1:%.*]]
|
|
; CHECK: if2.then1:
|
|
; CHECK-NEXT: br label [[IF2_END:%.*]]
|
|
; CHECK: if2.end:
|
|
; CHECK-NEXT: ret i32 0
|
|
; CHECK: if.then2:
|
|
; CHECK-NEXT: br label [[IF3_THEN2:%.*]]
|
|
; CHECK: if3.then2:
|
|
; CHECK-NEXT: br label [[IF3_END:%.*]]
|
|
; CHECK: if3.end:
|
|
; CHECK-NEXT: ret i32 1
|
|
;
|
|
%cmp = icmp sge i32 %x, 0
|
|
br i1 %cmp, label %if.then1, label %if.then2
|
|
|
|
if.then1:
|
|
br i1 %cmp, label %if2.then1, label %if2.then2
|
|
|
|
if2.then1:
|
|
br label %if2.end
|
|
|
|
if2.then2:
|
|
br label %if2.end
|
|
|
|
if2.end:
|
|
%phi = phi i32 [ 0, %if2.then1 ], [ 1, %if2.then2 ]
|
|
ret i32 %phi
|
|
|
|
if.then2:
|
|
br i1 %cmp, label %if3.then1, label %if3.then2
|
|
|
|
if3.then1:
|
|
br label %if3.end
|
|
|
|
if3.then2:
|
|
br label %if3.end
|
|
|
|
if3.end:
|
|
%phi2 = phi i32 [ 0, %if3.then1 ], [ 1, %if3.then2 ]
|
|
ret i32 %phi2
|
|
}
|
|
|
|
define void @pr46814(i32 %a) {
|
|
; CHECK-LABEL: @pr46814(
|
|
; CHECK-NEXT: [[C1:%.*]] = icmp uge i32 [[A:%.*]], 10
|
|
; CHECK-NEXT: [[C2:%.*]] = icmp ult i32 [[A]], 20
|
|
; CHECK-NEXT: [[C3:%.*]] = and i1 [[C1]], [[C2]]
|
|
; CHECK-NEXT: br i1 [[C3]], label [[IF_1:%.*]], label [[EXIT:%.*]]
|
|
; CHECK: if.1:
|
|
; CHECK-NEXT: br label [[IF_2:%.*]]
|
|
; CHECK: if.2:
|
|
; CHECK-NEXT: br i1 true, label [[EXIT]], label [[EXIT]]
|
|
; CHECK: exit:
|
|
; CHECK-NEXT: ret void
|
|
;
|
|
%c1 = icmp uge i32 %a, 10
|
|
%c2 = icmp ult i32 %a, 20
|
|
%c3 = and i1 %c1, %c2
|
|
br i1 %c3, label %if.1, label %exit
|
|
|
|
if.1:
|
|
br i1 %c3, label %if.2, label %exit
|
|
|
|
if.2:
|
|
br i1 %c3, label %exit, label %exit
|
|
|
|
exit:
|
|
ret void
|
|
}
|
|
|
|
declare void @llvm.assume(i1)
|