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