xref: /llvm-project/llvm/test/Transforms/LoopStrengthReduce/X86/pr46943.ll (revision 055fb7795aa219a3d274d280ec9129784f169f56)
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