xref: /llvm-project/llvm/test/Transforms/ConstraintElimination/monotonic-pointer-phis-crashes.ll (revision 6c25c58a4d7caa0337d36bb8c41546f2002130d1)
106dab8f7SFlorian Hahn; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 2
206dab8f7SFlorian Hahn; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s
306dab8f7SFlorian Hahn
406dab8f7SFlorian Hahndeclare i1 @cond()
506dab8f7SFlorian Hahndeclare void @clobber()
606dab8f7SFlorian Hahn
706dab8f7SFlorian Hahn
806dab8f7SFlorian Hahndefine void @test_unreachable_latch(ptr %start, ptr %b) {
906dab8f7SFlorian Hahn; CHECK-LABEL: define void @test_unreachable_latch
1006dab8f7SFlorian Hahn; CHECK-SAME: (ptr [[START:%.*]], ptr [[B:%.*]]) {
1106dab8f7SFlorian Hahn; CHECK-NEXT:  entry:
1206dab8f7SFlorian Hahn; CHECK-NEXT:    br label [[LOOP_HEADER:%.*]]
1306dab8f7SFlorian Hahn; CHECK:       loop.header:
1406dab8f7SFlorian Hahn; CHECK-NEXT:    [[NODE_1:%.*]] = phi ptr [ [[START]], [[ENTRY:%.*]] ], [ null, [[LOOP_LATCH:%.*]] ]
1506dab8f7SFlorian Hahn; CHECK-NEXT:    [[C_0:%.*]] = icmp ne ptr [[NODE_1]], null
1606dab8f7SFlorian Hahn; CHECK-NEXT:    br i1 [[C_0]], label [[THEN:%.*]], label [[EXIT:%.*]]
1706dab8f7SFlorian Hahn; CHECK:       loop.latch:
1806dab8f7SFlorian Hahn; CHECK-NEXT:    call void @clobber()
1906dab8f7SFlorian Hahn; CHECK-NEXT:    br label [[LOOP_HEADER]]
2006dab8f7SFlorian Hahn; CHECK:       if:
2106dab8f7SFlorian Hahn; CHECK-NEXT:    [[C_2:%.*]] = icmp ne ptr [[B]], null
2206dab8f7SFlorian Hahn; CHECK-NEXT:    [[AND:%.*]] = and i1 [[C_2]], [[C_0]]
2306dab8f7SFlorian Hahn; CHECK-NEXT:    br i1 [[AND]], label [[THEN]], label [[EXIT]]
2406dab8f7SFlorian Hahn; CHECK:       then:
2506dab8f7SFlorian Hahn; CHECK-NEXT:    call void @clobber()
2606dab8f7SFlorian Hahn; CHECK-NEXT:    br label [[EXIT]]
2706dab8f7SFlorian Hahn; CHECK:       exit:
2806dab8f7SFlorian Hahn; CHECK-NEXT:    ret void
2906dab8f7SFlorian Hahn;
3006dab8f7SFlorian Hahnentry:
3106dab8f7SFlorian Hahn  br label %loop.header
3206dab8f7SFlorian Hahn
3306dab8f7SFlorian Hahnloop.header:
3406dab8f7SFlorian Hahn  %node.1 = phi ptr [ %start, %entry ], [ null, %loop.latch ]
3506dab8f7SFlorian Hahn  %c.0 = icmp ne ptr %node.1, null
3606dab8f7SFlorian Hahn  br i1 %c.0, label %then, label %exit
3706dab8f7SFlorian Hahn
3806dab8f7SFlorian Hahnloop.latch:                                     ; No predecessors!
3906dab8f7SFlorian Hahn  call void @clobber()
4006dab8f7SFlorian Hahn  br label %loop.header
4106dab8f7SFlorian Hahn
4206dab8f7SFlorian Hahnif:
4306dab8f7SFlorian Hahn  %c.2 = icmp ne ptr %b, null
4406dab8f7SFlorian Hahn  %and = and i1 %c.2, %c.0
4506dab8f7SFlorian Hahn  br i1 %and, label %then, label %exit
4606dab8f7SFlorian Hahn
4706dab8f7SFlorian Hahnthen:
4806dab8f7SFlorian Hahn  call void @clobber()
4906dab8f7SFlorian Hahn  br label %exit
5006dab8f7SFlorian Hahn
5106dab8f7SFlorian Hahnexit:
5206dab8f7SFlorian Hahn  ret void
5306dab8f7SFlorian Hahn}
5406dab8f7SFlorian Hahn
5506dab8f7SFlorian Hahndefine void @test_cond_multi_use_with_one_use_simplified_before_adding_ne_fact(ptr %start, ptr %b) {
5606dab8f7SFlorian Hahn; CHECK-LABEL: define void @test_cond_multi_use_with_one_use_simplified_before_adding_ne_fact
5706dab8f7SFlorian Hahn; CHECK-SAME: (ptr [[START:%.*]], ptr [[B:%.*]]) {
5806dab8f7SFlorian Hahn; CHECK-NEXT:  entry:
5906dab8f7SFlorian Hahn; CHECK-NEXT:    br label [[LOOP_HEADER:%.*]]
6006dab8f7SFlorian Hahn; CHECK:       loop.header:
6106dab8f7SFlorian Hahn; CHECK-NEXT:    [[NODE_1:%.*]] = phi ptr [ [[START]], [[ENTRY:%.*]] ], [ null, [[LOOP_LATCH:%.*]] ]
6206dab8f7SFlorian Hahn; CHECK-NEXT:    [[C_0:%.*]] = icmp ne ptr [[NODE_1]], null
6306dab8f7SFlorian Hahn; CHECK-NEXT:    br i1 [[C_0]], label [[LOOP_LATCH]], label [[EXIT:%.*]]
6406dab8f7SFlorian Hahn; CHECK:       loop.latch:
6506dab8f7SFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = call i1 @cond()
6606dab8f7SFlorian Hahn; CHECK-NEXT:    br i1 [[C_1]], label [[IF:%.*]], label [[LOOP_HEADER]]
6706dab8f7SFlorian Hahn; CHECK:       if:
6806dab8f7SFlorian Hahn; CHECK-NEXT:    [[C_2:%.*]] = icmp ne ptr [[B]], null
69*6c25c58aSFlorian Hahn; CHECK-NEXT:    [[AND:%.*]] = and i1 [[C_2]], true
7006dab8f7SFlorian Hahn; CHECK-NEXT:    br i1 [[AND]], label [[THEN:%.*]], label [[EXIT]]
7106dab8f7SFlorian Hahn; CHECK:       then:
7206dab8f7SFlorian Hahn; CHECK-NEXT:    call void @clobber()
7306dab8f7SFlorian Hahn; CHECK-NEXT:    br label [[EXIT]]
7406dab8f7SFlorian Hahn; CHECK:       exit:
7506dab8f7SFlorian Hahn; CHECK-NEXT:    ret void
7606dab8f7SFlorian Hahn;
7706dab8f7SFlorian Hahnentry:
7806dab8f7SFlorian Hahn  br label %loop.header
7906dab8f7SFlorian Hahn
8006dab8f7SFlorian Hahnloop.header:
8106dab8f7SFlorian Hahn  %node.1 = phi ptr [ %start, %entry ], [ null, %loop.latch ]
8206dab8f7SFlorian Hahn  %c.0 = icmp ne ptr %node.1, null
8306dab8f7SFlorian Hahn  br i1 %c.0, label %loop.latch, label %exit
8406dab8f7SFlorian Hahn
8506dab8f7SFlorian Hahnloop.latch:
8606dab8f7SFlorian Hahn  %c.1 = call i1 @cond()
8706dab8f7SFlorian Hahn  br i1 %c.1, label %if, label %loop.header
8806dab8f7SFlorian Hahn
8906dab8f7SFlorian Hahnif:
9006dab8f7SFlorian Hahn  %c.2 = icmp ne ptr %b, null
9106dab8f7SFlorian Hahn  %and = and i1 %c.2, %c.0
9206dab8f7SFlorian Hahn  br i1 %and, label %then, label %exit
9306dab8f7SFlorian Hahn
9406dab8f7SFlorian Hahnthen:
9506dab8f7SFlorian Hahn  call void @clobber()
9606dab8f7SFlorian Hahn  br label %exit
9706dab8f7SFlorian Hahn
9806dab8f7SFlorian Hahnexit:
9906dab8f7SFlorian Hahn  ret void
10006dab8f7SFlorian Hahn}
101