--- /dev/null
+; 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)
--- /dev/null
+; 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
+}
--- /dev/null
+; 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
+}
--- /dev/null
+; 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
+}