summaryrefslogtreecommitdiffstats
path: root/llvm/test
diff options
context:
space:
mode:
authorSanjay Patel <spatel@rotateright.com>2018-04-10 20:42:39 +0000
committerSanjay Patel <spatel@rotateright.com>2018-04-10 20:42:39 +0000
commit3b6d46761f139e7ee3057758698efa4487323829 (patch)
treec5120140dcb3fb41e319c1d78a36c4fc4cbd4f39 /llvm/test
parentd88041672269603f858ba24c1266bb743feb09d9 (diff)
downloadbcm5719-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.ll94
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
+}
+
OpenPOWER on IntegriCloud