Files
clang-p2996/llvm/test/Transforms/CorrelatedValuePropagation/phi-common-val.ll
David Green 8ceab61c75 [CVP] Require DomTree for new Pass Manager
We were previously using a DT in CVP through SimplifyQuery, but not requiring it in
the new pass manager. Hence it would crash if DT was not already available. This now
gets DT directly and plumbs it through to where it is used (instead of using it
through SQ).

llvm-svn: 332836
2018-05-21 11:06:28 +00:00

126 lines
3.7 KiB
LLVM

; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
; RUN: opt < %s -correlated-propagation -S | FileCheck %s
; RUN: opt < %s -passes="correlated-propagation" -S | FileCheck %s
define i8* @simplify_phi_common_value_op0(i8* %ptr, i32* %b) {
; CHECK-LABEL: @simplify_phi_common_value_op0(
; CHECK-NEXT: entry:
; CHECK-NEXT: [[ISNULL:%.*]] = icmp eq i8* [[PTR:%.*]], null
; CHECK-NEXT: br i1 [[ISNULL]], label [[RETURN:%.*]], label [[ELSE:%.*]]
; CHECK: else:
; CHECK-NEXT: [[LB:%.*]] = load i32, i32* [[B:%.*]]
; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[LB]], 1
; CHECK-NEXT: store i32 [[ADD]], i32* [[B]]
; CHECK-NEXT: br label [[RETURN]]
; CHECK: return:
; CHECK-NEXT: ret i8* [[PTR]]
;
entry:
%isnull = icmp eq i8* %ptr, null
br i1 %isnull, label %return, label %else
else:
%lb = load i32, i32* %b
%add = add nsw i32 %lb, 1
store i32 %add, i32* %b
br label %return
return:
%r = phi i8* [ %ptr, %else ], [ null, %entry ]
ret i8* %r
}
define i8* @simplify_phi_common_value_op1(i8* %ptr, i32* %b) {
; CHECK-LABEL: @simplify_phi_common_value_op1(
; CHECK-NEXT: entry:
; CHECK-NEXT: [[ISNULL:%.*]] = icmp eq i8* [[PTR:%.*]], null
; CHECK-NEXT: br i1 [[ISNULL]], label [[RETURN:%.*]], label [[ELSE:%.*]]
; CHECK: else:
; CHECK-NEXT: [[LB:%.*]] = load i32, i32* [[B:%.*]]
; CHECK-NEXT: [[ADD:%.*]] = add i32 [[LB]], 1
; CHECK-NEXT: store i32 [[ADD]], i32* [[B]]
; CHECK-NEXT: br label [[RETURN]]
; CHECK: return:
; CHECK-NEXT: ret i8* [[PTR]]
;
entry:
%isnull = icmp eq i8* %ptr, null
br i1 %isnull, label %return, label %else
else:
%lb = load i32, i32* %b
%add = add i32 %lb, 1
store i32 %add, i32* %b
br label %return
return:
%r = phi i8* [ null, %entry], [ %ptr, %else ]
ret i8* %r
}
define i8 @simplify_phi_multiple_constants(i8 %x, i32* %b) {
; CHECK-LABEL: @simplify_phi_multiple_constants(
; CHECK-NEXT: entry:
; CHECK-NEXT: [[IS0:%.*]] = icmp eq i8 [[X:%.*]], 0
; CHECK-NEXT: br i1 [[IS0]], label [[RETURN:%.*]], label [[ELSE1:%.*]]
; CHECK: else1:
; CHECK-NEXT: [[IS42:%.*]] = icmp eq i8 [[X]], 42
; CHECK-NEXT: br i1 [[IS42]], label [[RETURN]], label [[ELSE2:%.*]]
; CHECK: else2:
; CHECK-NEXT: [[LB:%.*]] = load i32, i32* [[B:%.*]]
; CHECK-NEXT: [[ADD:%.*]] = add i32 [[LB]], 1
; CHECK-NEXT: store i32 [[ADD]], i32* [[B]]
; CHECK-NEXT: br label [[RETURN]]
; CHECK: return:
; CHECK-NEXT: ret i8 [[X]]
;
entry:
%is0 = icmp eq i8 %x, 0
br i1 %is0, label %return, label %else1
else1:
%is42 = icmp eq i8 %x, 42
br i1 %is42, label %return, label %else2
else2:
%lb = load i32, i32* %b
%add = add i32 %lb, 1
store i32 %add, i32* %b
br label %return
return:
%r = phi i8 [ 0, %entry], [ %x, %else2 ], [ 42, %else1 ]
ret i8 %r
}
define i8* @simplify_phi_common_value_from_instruction(i8* %ptr_op, i32* %b, i32 %i) {
; CHECK-LABEL: @simplify_phi_common_value_from_instruction(
; CHECK-NEXT: entry:
; CHECK-NEXT: [[PTR:%.*]] = getelementptr i8, i8* [[PTR_OP:%.*]], i32 [[I:%.*]]
; CHECK-NEXT: [[ISNULL:%.*]] = icmp eq i8* [[PTR]], null
; CHECK-NEXT: br i1 [[ISNULL]], label [[RETURN:%.*]], label [[ELSE:%.*]]
; CHECK: else:
; CHECK-NEXT: [[LB:%.*]] = load i32, i32* [[B:%.*]]
; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[LB]], 1
; CHECK-NEXT: store i32 [[ADD]], i32* [[B]]
; CHECK-NEXT: br label [[RETURN]]
; CHECK: return:
; CHECK-NEXT: ret i8* [[PTR]]
;
entry:
%ptr = getelementptr i8, i8* %ptr_op, i32 %i
%isnull = icmp eq i8* %ptr, null
br i1 %isnull, label %return, label %else
else:
%lb = load i32, i32* %b
%add = add nsw i32 %lb, 1
store i32 %add, i32* %b
br label %return
return:
%r = phi i8* [ %ptr, %else ], [ null, %entry ]
ret i8* %r
}