summaryrefslogtreecommitdiffstats
path: root/llvm/test/Transforms/NewGVN/metadata-simplify.ll
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/test/Transforms/NewGVN/metadata-simplify.ll')
-rw-r--r--llvm/test/Transforms/NewGVN/metadata-simplify.ll160
1 files changed, 160 insertions, 0 deletions
diff --git a/llvm/test/Transforms/NewGVN/metadata-simplify.ll b/llvm/test/Transforms/NewGVN/metadata-simplify.ll
new file mode 100644
index 00000000000..c9827bf26be
--- /dev/null
+++ b/llvm/test/Transforms/NewGVN/metadata-simplify.ll
@@ -0,0 +1,160 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+
+; The tests in this file check that we do not simplify based on metadata that is
+; not available on all code paths.
+
+; RUN: opt < %s -S -newgvn | FileCheck %s
+
+define i1 @test1(i32** %arg, i1 %arg2) {
+; CHECK-LABEL: @test1(
+; CHECK-NEXT: br i1 [[ARG2:%.*]], label [[BB1:%.*]], label [[BB2:%.*]]
+; CHECK: bb1:
+; CHECK-NEXT: [[LOAD1:%.*]] = load i32*, i32** [[ARG:%.*]], !nonnull !0
+; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i32* [[LOAD1]], null
+; CHECK-NEXT: ret i1 [[CMP1]]
+; CHECK: bb2:
+; CHECK-NEXT: [[LOAD2:%.*]] = load i32*, i32** [[ARG]]
+; CHECK-NEXT: [[CMP2:%.*]] = icmp eq i32* [[LOAD2]], null
+; CHECK-NEXT: ret i1 [[CMP2]]
+;
+ br i1 %arg2, label %bb1, label %bb2
+
+bb1:
+ %load1 = load i32*, i32** %arg, !nonnull !0
+ %cmp1 = icmp eq i32* %load1, null
+ ret i1 %cmp1
+
+bb2:
+ %load2 = load i32*, i32** %arg
+ %cmp2 = icmp eq i32* %load2, null
+ ret i1 %cmp2
+}
+
+define i1 @test2(i32** %arg, i1 %arg2) {
+; CHECK-LABEL: @test2(
+; CHECK-NEXT: br i1 [[ARG2:%.*]], label [[BB1:%.*]], label [[BB2:%.*]]
+; CHECK: bb1:
+; CHECK-NEXT: [[LOAD1:%.*]] = load i32*, i32** [[ARG:%.*]]
+; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i32* [[LOAD1]], null
+; CHECK-NEXT: ret i1 [[CMP1]]
+; CHECK: bb2:
+; CHECK-NEXT: [[LOAD2:%.*]] = load i32*, i32** [[ARG]], !nonnull !0
+; CHECK-NEXT: [[CMP2:%.*]] = icmp eq i32* [[LOAD2]], null
+; CHECK-NEXT: ret i1 [[CMP2]]
+;
+ br i1 %arg2, label %bb1, label %bb2
+
+bb1:
+ %load1 = load i32*, i32** %arg
+ %cmp1 = icmp eq i32* %load1, null
+ ret i1 %cmp1
+
+bb2:
+ %load2 = load i32*, i32** %arg, !nonnull !0
+ %cmp2 = icmp eq i32* %load2, null
+ ret i1 %cmp2
+}
+
+
+define i1 @test3(i32* %ptr, i1 %arg2) {
+; CHECK-LABEL: @test3(
+; CHECK-NEXT: br i1 [[ARG2:%.*]], label [[BB1:%.*]], label [[BB2:%.*]]
+; CHECK: bb1:
+; CHECK-NEXT: [[LOAD1:%.*]] = load i32, i32* [[PTR:%.*]], !range !1
+; CHECK-NEXT: [[CMP1:%.*]] = icmp ne i32 [[LOAD1]], 999
+; CHECK-NEXT: ret i1 [[CMP1]]
+; CHECK: bb2:
+; CHECK-NEXT: [[LOAD2:%.*]] = load i32, i32* [[PTR]]
+; CHECK-NEXT: [[CMP2:%.*]] = icmp ne i32 [[LOAD2]], 999
+; CHECK-NEXT: ret i1 [[CMP2]]
+;
+ br i1 %arg2, label %bb1, label %bb2
+
+bb1:
+ %load1 = load i32, i32* %ptr, !range !1
+ %cmp1 = icmp ne i32 %load1, 999
+ ret i1 %cmp1
+
+bb2:
+ %load2 = load i32, i32* %ptr
+ %cmp2 = icmp ne i32 %load2, 999
+ ret i1 %cmp2
+}
+
+define i1 @test4(i32* %ptr, i1 %arg2) {
+; CHECK-LABEL: @test4(
+; CHECK-NEXT: br i1 [[ARG2:%.*]], label [[BB1:%.*]], label [[BB2:%.*]]
+; CHECK: bb1:
+; CHECK-NEXT: [[LOAD1:%.*]] = load i32, i32* [[PTR:%.*]]
+; CHECK-NEXT: [[CMP1:%.*]] = icmp ne i32 [[LOAD1]], 999
+; CHECK-NEXT: ret i1 [[CMP1]]
+; CHECK: bb2:
+; CHECK-NEXT: [[LOAD2:%.*]] = load i32, i32* [[PTR]], !range !1
+; CHECK-NEXT: [[CMP2:%.*]] = icmp ne i32 [[LOAD2]], 999
+; CHECK-NEXT: ret i1 [[CMP2]]
+;
+ br i1 %arg2, label %bb1, label %bb2
+
+bb1:
+ %load1 = load i32, i32* %ptr
+ %cmp1 = icmp ne i32 %load1, 999
+ ret i1 %cmp1
+
+bb2:
+ %load2 = load i32, i32* %ptr, !range !1
+ %cmp2 = icmp ne i32 %load2, 999
+ ret i1 %cmp2
+}
+
+define i1 @test5(i32* %ptr, i1 %arg2) {
+; CHECK-LABEL: @test5(
+; CHECK-NEXT: br i1 [[ARG2:%.*]], label [[BB1:%.*]], label [[BB2:%.*]]
+; CHECK: bb1:
+; CHECK-NEXT: [[LOAD1:%.*]] = load i32, i32* [[PTR:%.*]], !range !1
+; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i32 [[LOAD1]], 999
+; CHECK-NEXT: ret i1 [[CMP1]]
+; CHECK: bb2:
+; CHECK-NEXT: [[LOAD2:%.*]] = load i32, i32* [[PTR]]
+; CHECK-NEXT: [[CMP2:%.*]] = icmp slt i32 [[LOAD2]], 999
+; CHECK-NEXT: ret i1 [[CMP2]]
+;
+ br i1 %arg2, label %bb1, label %bb2
+
+bb1:
+ %load1 = load i32, i32* %ptr, !range !1
+ %cmp1 = icmp slt i32 %load1, 999
+ ret i1 %cmp1
+
+bb2:
+ %load2 = load i32, i32* %ptr
+ %cmp2 = icmp slt i32 %load2, 999
+ ret i1 %cmp2
+}
+
+define i1 @test6(i32* %ptr, i1 %arg2) {
+; CHECK-LABEL: @test6(
+; CHECK-NEXT: br i1 [[ARG2:%.*]], label [[BB1:%.*]], label [[BB2:%.*]]
+; CHECK: bb1:
+; CHECK-NEXT: [[LOAD1:%.*]] = load i32, i32* [[PTR:%.*]]
+; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i32 [[LOAD1]], 999
+; CHECK-NEXT: ret i1 [[CMP1]]
+; CHECK: bb2:
+; CHECK-NEXT: [[LOAD2:%.*]] = load i32, i32* [[PTR]], !range !1
+; CHECK-NEXT: [[CMP2:%.*]] = icmp slt i32 [[LOAD2]], 999
+; CHECK-NEXT: ret i1 [[CMP2]]
+;
+ br i1 %arg2, label %bb1, label %bb2
+
+bb1:
+ %load1 = load i32, i32* %ptr
+ %cmp1 = icmp slt i32 %load1, 999
+ ret i1 %cmp1
+
+bb2:
+ %load2 = load i32, i32* %ptr, !range !1
+ %cmp2 = icmp slt i32 %load2, 999
+ ret i1 %cmp2
+}
+
+!0 = !{}
+!1 = !{ i32 10, i32 20 }
OpenPOWER on IntegriCloud