114da287eSFlorian Hahn; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 28ebb3eacSBjorn Pettersson; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s 314da287eSFlorian Hahn 414da287eSFlorian Hahndeclare void @use(i1) 514da287eSFlorian Hahn 6c5e1ddb6SFlorian Hahndefine void @loop_pointer_iv(ptr %start, ptr %end, ptr %upper) { 714da287eSFlorian Hahn; CHECK-LABEL: @loop_pointer_iv( 814da287eSFlorian Hahn; CHECK-NEXT: entry: 9c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[END_LT_UPPER:%.*]] = icmp ult ptr [[END:%.*]], [[UPPER:%.*]] 1014da287eSFlorian Hahn; CHECK-NEXT: br i1 [[END_LT_UPPER]], label [[LOOP_HEADER:%.*]], label [[EXIT:%.*]] 1114da287eSFlorian Hahn; CHECK: loop.header: 12c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[IV:%.*]] = phi ptr [ [[START:%.*]], [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ] 13c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[C_2:%.*]] = icmp ule ptr [[IV]], [[END]] 1414da287eSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_2]]) 15c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[T_2:%.*]] = icmp uge ptr [[IV]], [[START]] 1614da287eSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[T_2]]) 17c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ule ptr [[IV]], [[END]] 1814da287eSFlorian Hahn; CHECK-NEXT: br i1 [[C_1]], label [[LOOP_LATCH]], label [[EXIT]] 1914da287eSFlorian Hahn; CHECK: loop.latch: 2014da287eSFlorian Hahn; CHECK-NEXT: call void @use(i1 true) 21c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[IV_NEXT]] = getelementptr inbounds i8, ptr [[IV]], i8 1 2214da287eSFlorian Hahn; CHECK-NEXT: br label [[LOOP_HEADER]] 2314da287eSFlorian Hahn; CHECK: exit: 2414da287eSFlorian Hahn; CHECK-NEXT: ret void 2514da287eSFlorian Hahn; 2614da287eSFlorian Hahnentry: 27c5e1ddb6SFlorian Hahn %end.lt.upper = icmp ult ptr %end, %upper 2814da287eSFlorian Hahn br i1 %end.lt.upper, label %loop.header, label %exit 2914da287eSFlorian Hahn 3014da287eSFlorian Hahnloop.header: 31c5e1ddb6SFlorian Hahn %iv = phi ptr [ %start, %entry ], [ %iv.next, %loop.latch ] 32c5e1ddb6SFlorian Hahn %c.2 = icmp ule ptr %iv, %end 3314da287eSFlorian Hahn call void @use(i1 %c.2) 34c5e1ddb6SFlorian Hahn %t.2 = icmp uge ptr %iv, %start 3514da287eSFlorian Hahn call void @use(i1 %t.2) 36c5e1ddb6SFlorian Hahn %c.1 = icmp ule ptr %iv, %end 3714da287eSFlorian Hahn br i1 %c.1, label %loop.latch, label %exit 3814da287eSFlorian Hahn 3914da287eSFlorian Hahnloop.latch: 40c5e1ddb6SFlorian Hahn %t.1 = icmp ult ptr %iv, %upper 4114da287eSFlorian Hahn call void @use(i1 %t.1) 42c5e1ddb6SFlorian Hahn %iv.next = getelementptr inbounds i8, ptr %iv, i8 1 4314da287eSFlorian Hahn br label %loop.header 4414da287eSFlorian Hahn 4514da287eSFlorian Hahnexit: 4614da287eSFlorian Hahn ret void 4714da287eSFlorian Hahn} 4814da287eSFlorian Hahn 49c5e1ddb6SFlorian Hahndefine void @loop_pointer_iv_null_start(ptr %end, ptr %upper) { 5014da287eSFlorian Hahn; CHECK-LABEL: @loop_pointer_iv_null_start( 5114da287eSFlorian Hahn; CHECK-NEXT: entry: 52c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[END_LT_UPPER:%.*]] = icmp ult ptr [[END:%.*]], [[UPPER:%.*]] 5314da287eSFlorian Hahn; CHECK-NEXT: br i1 [[END_LT_UPPER]], label [[LOOP_HEADER:%.*]], label [[EXIT:%.*]] 5414da287eSFlorian Hahn; CHECK: loop.header: 55c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[IV:%.*]] = phi ptr [ null, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ] 56c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ule ptr [[IV]], [[END]] 5714da287eSFlorian Hahn; CHECK-NEXT: call void @use(i1 [[C_1]]) 58*98e016d9SFlorian Hahn; CHECK-NEXT: call void @use(i1 true) 59c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[C_3:%.*]] = icmp ule ptr [[IV]], [[END]] 6014da287eSFlorian Hahn; CHECK-NEXT: br i1 [[C_3]], label [[LOOP_LATCH]], label [[EXIT]] 6114da287eSFlorian Hahn; CHECK: loop.latch: 6214da287eSFlorian Hahn; CHECK-NEXT: call void @use(i1 true) 63c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[IV_NEXT]] = getelementptr inbounds i8, ptr [[IV]], i8 1 6414da287eSFlorian Hahn; CHECK-NEXT: br label [[LOOP_HEADER]] 6514da287eSFlorian Hahn; CHECK: exit: 6614da287eSFlorian Hahn; CHECK-NEXT: ret void 6714da287eSFlorian Hahn; 6814da287eSFlorian Hahnentry: 69c5e1ddb6SFlorian Hahn %end.lt.upper = icmp ult ptr %end, %upper 7014da287eSFlorian Hahn br i1 %end.lt.upper, label %loop.header, label %exit 7114da287eSFlorian Hahn 7214da287eSFlorian Hahnloop.header: 73c5e1ddb6SFlorian Hahn %iv = phi ptr [ null, %entry ], [ %iv.next, %loop.latch ] 74c5e1ddb6SFlorian Hahn %c.1 = icmp ule ptr %iv, %end 7514da287eSFlorian Hahn call void @use(i1 %c.1) 76c5e1ddb6SFlorian Hahn %c.2 = icmp uge ptr %iv, null 7714da287eSFlorian Hahn call void @use(i1 %c.2) 78c5e1ddb6SFlorian Hahn %c.3 = icmp ule ptr %iv, %end 7914da287eSFlorian Hahn br i1 %c.3, label %loop.latch, label %exit 8014da287eSFlorian Hahn 8114da287eSFlorian Hahnloop.latch: 82c5e1ddb6SFlorian Hahn %c.4 = icmp ult ptr %iv, %upper 8314da287eSFlorian Hahn call void @use(i1 %c.4) 84c5e1ddb6SFlorian Hahn %iv.next = getelementptr inbounds i8, ptr %iv, i8 1 8514da287eSFlorian Hahn br label %loop.header 8614da287eSFlorian Hahn 8714da287eSFlorian Hahnexit: 8814da287eSFlorian Hahn ret void 8914da287eSFlorian Hahn} 9014da287eSFlorian Hahn 91c5e1ddb6SFlorian Hahndefine void @test_start_null_cmp_null(ptr %start) { 9214da287eSFlorian Hahn; CHECK-LABEL: @test_start_null_cmp_null( 9314da287eSFlorian Hahn; CHECK-NEXT: entry: 9414da287eSFlorian Hahn; CHECK-NEXT: br label [[LOOP_HEADER:%.*]] 9514da287eSFlorian Hahn; CHECK: loop.header: 96c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[IV:%.*]] = phi ptr [ null, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ] 97c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[CMP_I_I122:%.*]] = icmp eq ptr [[IV]], null 9814da287eSFlorian Hahn; CHECK-NEXT: br i1 [[CMP_I_I122]], label [[LOOP_LATCH]], label [[EXIT:%.*]] 9914da287eSFlorian Hahn; CHECK: loop.latch: 100c5e1ddb6SFlorian Hahn; CHECK-NEXT: [[IV_NEXT]] = getelementptr inbounds i8, ptr [[IV]], i64 1 10114da287eSFlorian Hahn; CHECK-NEXT: br label [[LOOP_HEADER]] 10214da287eSFlorian Hahn; CHECK: exit: 10314da287eSFlorian Hahn; CHECK-NEXT: ret void 10414da287eSFlorian Hahn; 10514da287eSFlorian Hahnentry: 10614da287eSFlorian Hahn br label %loop.header 10714da287eSFlorian Hahn 10814da287eSFlorian Hahnloop.header: 109c5e1ddb6SFlorian Hahn %iv = phi ptr [ null, %entry ], [ %iv.next, %loop.latch ] 110c5e1ddb6SFlorian Hahn %cmp.i.i122 = icmp eq ptr %iv, null 11114da287eSFlorian Hahn br i1 %cmp.i.i122, label %loop.latch, label %exit 11214da287eSFlorian Hahn 11314da287eSFlorian Hahnloop.latch: 114c5e1ddb6SFlorian Hahn %iv.next = getelementptr inbounds i8, ptr %iv, i64 1 11514da287eSFlorian Hahn br label %loop.header 11614da287eSFlorian Hahn 11714da287eSFlorian Hahnexit: 11814da287eSFlorian Hahn ret void 11914da287eSFlorian Hahn} 120