[NewGVN] Add test cases for remaining known issues.
authorFlorian Hahn <flo@fhahn.com>
Tue, 28 Jul 2020 19:31:57 +0000 (20:31 +0100)
committerFlorian Hahn <flo@fhahn.com>
Tue, 28 Jul 2020 19:33:04 +0000 (20:33 +0100)
This patch adds IR tests for the known NewGVN issues. The intention is
that adding them now will make it easier to keep track of fixes.

llvm/test/Transforms/NewGVN/todo-pr33165-distribute-undef.ll [new file with mode: 0644]
llvm/test/Transforms/NewGVN/todo-pr35074-phi-of-ops.ll [new file with mode: 0644]
llvm/test/Transforms/NewGVN/todo-pr36335-phi-undef.ll [new file with mode: 0644]
llvm/test/Transforms/NewGVN/todo-pr37121-seens-this-value-a-lot.ll [new file with mode: 0644]
llvm/test/Transforms/NewGVN/todo-pr42422-phi-of-ops.ll [new file with mode: 0644]

diff --git a/llvm/test/Transforms/NewGVN/todo-pr33165-distribute-undef.ll b/llvm/test/Transforms/NewGVN/todo-pr33165-distribute-undef.ll
new file mode 100644 (file)
index 0000000..0a9255c
--- /dev/null
@@ -0,0 +1,17 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt -newgvn -S %s | FileCheck %s
+
+; Test for PR33165.
+
+; TODO: Currently NewGVN miscompiles the function.
+define i2 @f(i2, i1) {
+; CHECK-LABEL: @f(
+; CHECK-NEXT:    [[A:%.*]] = xor i2 [[TMP0:%.*]], -1
+; CHECK-NEXT:    [[B:%.*]] = select i1 [[TMP1:%.*]], i2 [[A]], i2 undef
+; CHECK-NEXT:    ret i2 [[B]]
+;
+  %a = xor i2 %0, -1
+  %b = select i1 %1, i2 %a, i2 undef
+  %c = and i2 %a, %b
+  ret i2 %c
+}
diff --git a/llvm/test/Transforms/NewGVN/todo-pr35074-phi-of-ops.ll b/llvm/test/Transforms/NewGVN/todo-pr35074-phi-of-ops.ll
new file mode 100644 (file)
index 0000000..e80292e
--- /dev/null
@@ -0,0 +1,35 @@
+; RUN: opt -newgvn -S %s | FileCheck %s
+
+XFAIL: *
+
+; TODO: Test case for PR35074. Crashes caused by phi-of-ops.
+define void @crash1_pr35074(i32 %this, i1 %c) {
+entry:
+  br label %for.cond
+
+for.cond:                                         ; preds = %for.inc6, %entry
+  %y.0 = phi i32 [ 1, %entry ], [ %inc7, %for.inc6 ]
+  br i1 %c, label %for.inc6, label %for.body.lr.ph
+
+for.body.lr.ph:                                   ; preds = %for.cond
+  %sub = add nsw i32 %y.0, -1
+  br label %for.body4
+
+for.body4:                                        ; preds = %for.body.lr.ph
+  %cmp = icmp ugt i32 %sub, %y.0
+  br i1 %cmp, label %for.end, label %for.body4.1
+
+for.end:                                          ; preds = %for.body4.1, %for.body4
+  ret void
+
+for.inc6:                                         ; preds = %for.cond
+  %inc7 = add nuw nsw i32 %y.0, 1
+  br label %for.cond
+
+for.body4.1:                                      ; preds = %for.body4
+  %inc.1 = add nuw nsw i32 %y.0, 1
+  tail call void @_blah(i32 %inc.1)
+  br label %for.end
+}
+
+declare void @_blah(i32)
diff --git a/llvm/test/Transforms/NewGVN/todo-pr36335-phi-undef.ll b/llvm/test/Transforms/NewGVN/todo-pr36335-phi-undef.ll
new file mode 100644 (file)
index 0000000..6208f4e
--- /dev/null
@@ -0,0 +1,32 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt -newgvn -S %s | FileCheck %s
+
+; TODO: NewGVN currently miscomiles the function below. PR36335.
+
+declare void @foo(i32)
+
+define void @main(i1 %c1, i1 %c2, i32 %x) {
+; CHECK-LABEL: @main(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    br i1 [[C1:%.*]], label [[L:%.*]], label [[END:%.*]]
+; CHECK:       L:
+; CHECK-NEXT:    [[XOR:%.*]] = xor i32 [[X:%.*]], -1
+; CHECK-NEXT:    call void @foo(i32 [[XOR]])
+; CHECK-NEXT:    br label [[L]]
+; CHECK:       end:
+; CHECK-NEXT:    ret void
+;
+entry:
+  br i1 %c1, label %L, label %end
+
+L:
+  %d.1 = phi i8 [ undef, %entry ], [ -1, %L ]
+  %conv = sext i8 %d.1 to i32
+  %xor = xor i32 %x, %conv
+  %neg = xor i32 %xor, -1
+  call void @foo(i32 %neg)
+  br label %L
+
+end:
+  ret void
+}
diff --git a/llvm/test/Transforms/NewGVN/todo-pr37121-seens-this-value-a-lot.ll b/llvm/test/Transforms/NewGVN/todo-pr37121-seens-this-value-a-lot.ll
new file mode 100644 (file)
index 0000000..b4961fa
--- /dev/null
@@ -0,0 +1,25 @@
+; RUN: opt -newgvn -S %s | FileCheck %s
+
+; XFAIL: *
+
+; TODO: Current NewGVN crashes on the function below. See PR37121.
+
+define hidden void @foo() {
+top:
+  %.promoted = load i8, i8* undef, align 8
+  br label %if
+
+;; This is really a multi-valued phi, because the phi is defined by an expression of the phi.
+;; This means that we can't propagate the value over the backedge, because we'll just cycle
+;; through every value.
+
+if:                                               ; preds = %if, %top
+  %0 = phi i8 [ %1, %if ], [ %.promoted, %top ]
+  %1 = xor i8 %0, undef
+  br i1 false, label %L50, label %if
+
+L50:                                              ; preds = %if
+  %.lcssa = phi i8 [ %1, %if ]
+  store i8 %.lcssa, i8* undef, align 8
+  ret void
+}
diff --git a/llvm/test/Transforms/NewGVN/todo-pr42422-phi-of-ops.ll b/llvm/test/Transforms/NewGVN/todo-pr42422-phi-of-ops.ll
new file mode 100644 (file)
index 0000000..6c4cf5f
--- /dev/null
@@ -0,0 +1,84 @@
+; RUN: opt -newgvn -S %s | FileChecks %s
+
+; XFAIL: *
+
+; TODO: Currently NewGVN crashes on the function below, see PR42422.
+
+define void @d() {
+entry:
+  br label %for.cond
+
+for.cond:                                         ; preds = %cleanup20, %entry
+  br label %for.cond1
+
+for.cond1:                                        ; preds = %for.inc17, %for.cond
+  %0 = phi i32 [ %inc18, %for.inc17 ], [ 0, %for.cond ]
+  %cmp = icmp sle i32 %0, 1
+  br i1 %cmp, label %for.body, label %for.end19
+
+for.body:                                         ; preds = %for.cond1
+  br i1 undef, label %for.body3, label %for.body.for.cond4_crit_edge
+
+for.body.for.cond4_crit_edge:                     ; preds = %for.body
+  br label %for.cond4
+
+for.body3:                                        ; preds = %for.body
+  br label %cleanup14
+
+for.cond4:                                        ; preds = %cleanup, %for.body.for.cond4_crit_edge
+  br i1 undef, label %if.then, label %if.end
+
+if.then:                                          ; preds = %for.cond4
+  br label %cleanup
+
+if.end:                                           ; preds = %for.cond4
+  br label %for.cond6
+
+for.cond6:                                        ; preds = %for.inc, %if.end
+  %1 = phi i64 [ %inc, %for.inc ], [ 0, %if.end ]
+  %cmp7 = icmp sle i64 %1, 1
+  br i1 %cmp7, label %for.inc, label %for.end9
+
+for.inc:                                          ; preds = %for.cond6
+  %inc = add nsw i64 %1, 1
+  br label %for.cond6
+
+for.end9:                                         ; preds = %for.cond6
+  br i1 true, label %if.then11, label %if.end12
+
+if.then11:                                        ; preds = %for.end9
+  br label %cleanup
+
+if.end12:                                         ; preds = %for.end9
+  br label %cleanup
+
+cleanup:                                          ; preds = %if.end12, %if.then11, %if.then
+  %cleanup.dest = phi i32 [ undef, %if.end12 ], [ 1, %if.then11 ], [ 9, %if.then ]
+  switch i32 %cleanup.dest, label %cleanup14 [
+    i32 0, label %for.cond4
+    i32 9, label %for.end13
+  ]
+
+for.end13:                                        ; preds = %cleanup
+  br label %cleanup14
+
+cleanup14:                                        ; preds = %for.end13, %cleanup, %for.body3
+  %cleanup.dest15 = phi i32 [ 0, %for.end13 ], [ %cleanup.dest, %cleanup ], [ 1, %for.body3 ]
+  %cond1 = icmp eq i32 %cleanup.dest15, 0
+  br i1 %cond1, label %for.inc17, label %cleanup20
+
+for.inc17:                                        ; preds = %cleanup14
+  %inc18 = add nsw i32 %0, 1
+  br label %for.cond1
+
+for.end19:                                        ; preds = %for.cond1
+  br label %cleanup20
+
+cleanup20:                                        ; preds = %for.end19, %cleanup14
+  %cleanup.dest21 = phi i32 [ %cleanup.dest15, %cleanup14 ], [ 0, %for.end19 ]
+  %cond = icmp eq i32 %cleanup.dest21, 0
+  br i1 %cond, label %for.cond, label %cleanup23
+
+cleanup23:                                        ; preds = %cleanup20
+  ret void
+}