diff options
| author | Sanjay Patel <spatel@rotateright.com> | 2018-04-10 20:42:39 +0000 |
|---|---|---|
| committer | Sanjay Patel <spatel@rotateright.com> | 2018-04-10 20:42:39 +0000 |
| commit | 3b6d46761f139e7ee3057758698efa4487323829 (patch) | |
| tree | c5120140dcb3fb41e319c1d78a36c4fc4cbd4f39 /llvm/test | |
| parent | d88041672269603f858ba24c1266bb743feb09d9 (diff) | |
| download | bcm5719-llvm-3b6d46761f139e7ee3057758698efa4487323829.tar.gz bcm5719-llvm-3b6d46761f139e7ee3057758698efa4487323829.zip | |
[CVP] simplify phi with constant incoming values that match common variable edge values
This is based on an example that was recently posted on llvm-dev:
void *propagate_null(void* b, int* g) {
if (!b) {
return 0;
}
(*g)++;
return b;
}
https://godbolt.org/g/xYk3qG
The original code or constant propagation in other passes has obscured the fact
that the phi can be removed completely.
Differential Revision: https://reviews.llvm.org/D45448
llvm-svn: 329755
Diffstat (limited to 'llvm/test')
| -rw-r--r-- | llvm/test/Transforms/CorrelatedValuePropagation/phi-common-val.ll | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/llvm/test/Transforms/CorrelatedValuePropagation/phi-common-val.ll b/llvm/test/Transforms/CorrelatedValuePropagation/phi-common-val.ll new file mode 100644 index 00000000000..3011fef9749 --- /dev/null +++ b/llvm/test/Transforms/CorrelatedValuePropagation/phi-common-val.ll @@ -0,0 +1,94 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; RUN: opt < %s -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 +} + |

