1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt -S -loop-reduce < %s | FileCheck %s 3 4target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" 5target triple = "x86_64-unknown-linux-gnu" 6 7declare void @use(i8 zeroext) 8declare void @use_p(ptr) 9 10; nuw needs to be dropped when switching to post-inc comparison. 11define i8 @drop_nuw() { 12; CHECK-LABEL: @drop_nuw( 13; CHECK-NEXT: entry: 14; CHECK-NEXT: br label [[LOOP:%.*]] 15; CHECK: loop: 16; CHECK-NEXT: [[IV:%.*]] = phi i8 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ] 17; CHECK-NEXT: call void @use(i8 zeroext [[IV]]) 18; CHECK-NEXT: [[IV_NEXT]] = add i8 [[IV]], 1 19; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[IV_NEXT]], 0 20; CHECK-NEXT: br i1 [[CMP]], label [[EXIT:%.*]], label [[LOOP]] 21; CHECK: exit: 22; CHECK-NEXT: [[TMP0:%.*]] = add i8 [[IV_NEXT]], -1 23; CHECK-NEXT: ret i8 [[TMP0]] 24; 25entry: 26 br label %loop 27 28loop: 29 %iv = phi i8 [ 0, %entry ], [ %iv.next, %loop ] 30 call void @use(i8 zeroext %iv) 31 32 %iv.next = add nuw i8 %iv, 1 33 %cmp = icmp eq i8 %iv, -1 34 br i1 %cmp, label %exit, label %loop 35 36exit: 37 ret i8 %iv 38} 39 40; nsw needs to be dropped when switching to post-inc comparison. 41define i8 @drop_nsw() { 42; CHECK-LABEL: @drop_nsw( 43; CHECK-NEXT: entry: 44; CHECK-NEXT: br label [[LOOP:%.*]] 45; CHECK: loop: 46; CHECK-NEXT: [[IV:%.*]] = phi i8 [ 127, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ] 47; CHECK-NEXT: call void @use(i8 zeroext [[IV]]) 48; CHECK-NEXT: [[IV_NEXT]] = add i8 [[IV]], -1 49; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[IV_NEXT]], 127 50; CHECK-NEXT: br i1 [[CMP]], label [[EXIT:%.*]], label [[LOOP]] 51; CHECK: exit: 52; CHECK-NEXT: [[TMP0:%.*]] = add i8 [[IV_NEXT]], 1 53; CHECK-NEXT: ret i8 [[TMP0]] 54; 55entry: 56 br label %loop 57 58loop: 59 %iv = phi i8 [ 127, %entry ], [ %iv.next, %loop ] 60 call void @use(i8 zeroext %iv) 61 62 %iv.next = add nsw i8 %iv, -1 63 %cmp = icmp eq i8 %iv, -128 64 br i1 %cmp, label %exit, label %loop 65 66exit: 67 ret i8 %iv 68} 69 70; Comparison already in post-inc form, no need to drop nuw. 71define i8 @already_postinc() { 72; CHECK-LABEL: @already_postinc( 73; CHECK-NEXT: entry: 74; CHECK-NEXT: br label [[LOOP:%.*]] 75; CHECK: loop: 76; CHECK-NEXT: [[IV:%.*]] = phi i8 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ] 77; CHECK-NEXT: call void @use(i8 zeroext [[IV]]) 78; CHECK-NEXT: [[IV_NEXT]] = add nuw i8 [[IV]], 1 79; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[IV_NEXT]], -1 80; CHECK-NEXT: br i1 [[CMP]], label [[EXIT:%.*]], label [[LOOP]] 81; CHECK: exit: 82; CHECK-NEXT: [[TMP0:%.*]] = add i8 [[IV_NEXT]], -1 83; CHECK-NEXT: ret i8 [[TMP0]] 84; 85entry: 86 br label %loop 87 88loop: 89 %iv = phi i8 [ 0, %entry ], [ %iv.next, %loop ] 90 call void @use(i8 zeroext %iv) 91 92 %iv.next = add nuw i8 %iv, 1 93 %cmp = icmp eq i8 %iv.next, -1 94 br i1 %cmp, label %exit, label %loop 95 96exit: 97 ret i8 %iv 98} 99