[ARM] Better OR's for MVE compares
[llvm-core.git] / test / Transforms / IndVarSimplify / replace-srem-by-urem.ll
blobec1ccffbc5c886a2c41a9a649b77c77d17adce80
1 ; RUN: opt < %s -indvars -S | FileCheck %s
3 define void @test0(i32* %a) {
4 ; CHECK-LABEL: @test0(
5 entry:
6   br label %for.body
8 for.body:                                         ; preds = %entry, %for.body
9   %i.01 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
10   %rem = srem i32 %i.01, 2
11 ; CHECK-NOT: srem
12 ; CHECK:     urem
13   %idxprom = sext i32 %rem to i64
14   %arrayidx = getelementptr inbounds i32, i32* %a, i64 %idxprom
15   store i32 %i.01, i32* %arrayidx, align 4
16   %inc = add nsw i32 %i.01, 1
17   %cmp = icmp slt i32 %inc, 64
18   br i1 %cmp, label %for.body, label %for.end
20 for.end:                                          ; preds = %for.body
21   ret void
24 define void @test2(i32* %a, i32 %d) {
25 ; CHECK-LABEL: @test2(
26 entry:
27   br label %for.body
29 for.body:                                         ; preds = %entry, %for.body
30   %i.01 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
31   %mul = mul nsw i32 %i.01, 64
32   %rem = srem i32 %mul, %d
33 ; CHECK-NOT: urem
34   %idxprom = sext i32 %rem to i64
35   %arrayidx = getelementptr inbounds i32, i32* %a, i64 %idxprom
36   store i32 %i.01, i32* %arrayidx, align 4
37   %inc = add nsw i32 %i.01, 1
38   %cmp = icmp slt i32 %inc, 64
39   br i1 %cmp, label %for.body, label %for.end
41 for.end:                                          ; preds = %for.body
42   ret void
45 define void @test3(i32* %a) {
46 ; CHECK-LABEL: @test3(
47 entry:
48   br label %for.body
50 for.body:                                         ; preds = %entry, %for.body
51   %i.01 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
52   %rem = srem i32 2048, %i.01
53 ; CHECK:     urem
54 ; CHECK-NOT: srem
55   %idxprom = sext i32 %rem to i64
56   %arrayidx = getelementptr inbounds i32, i32* %a, i64 %idxprom
57   store i32 %i.01, i32* %arrayidx, align 4
58   %inc = add nsw i32 %i.01, 1
59   %cmp = icmp slt i32 %inc, 64
60   br i1 %cmp, label %for.body, label %for.end
62 for.end:                                          ; preds = %for.body
63   ret void
66 define void @test4(i32* %a) {
67 ; CHECK-LABEL: @test4(
68 entry:
69   br label %for.body
71 for.body:                                         ; preds = %entry, %for.body
72   %i.01 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
73   %mul = mul nsw i32 %i.01, 64
74   %rem = srem i32 %mul, 7
75 ; CHECK:     urem
76 ; CHECK-NOT: srem
77   %idxprom = sext i32 %rem to i64
78   %arrayidx = getelementptr inbounds i32, i32* %a, i64 %idxprom
79   store i32 %i.01, i32* %arrayidx, align 4
80   %inc = add nsw i32 %i.01, 1
81   %cmp = icmp slt i32 %inc, 64
82   br i1 %cmp, label %for.body, label %for.end
84 for.end:                                          ; preds = %for.body
85   ret void
88 define void @test5(i32* %a) {
89 ; CHECK-LABEL: @test5(
90 entry:
91   br label %for.body
93 for.body:                                         ; preds = %entry, %for.body
94   %i.01 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
95   %mul = mul nsw i32 %i.01, 64
96   %rem = srem i32 %mul, 6
97 ; CHECK:     urem
98 ; CHECK-NOT: srem
99   %idxprom = sext i32 %rem to i64
100   %arrayidx = getelementptr inbounds i32, i32* %a, i64 %idxprom
101   store i32 %i.01, i32* %arrayidx, align 4
102   %inc = add nsw i32 %i.01, 1
103   %cmp = icmp slt i32 %inc, 64
104   br i1 %cmp, label %for.body, label %for.end
106 for.end:                                          ; preds = %for.body
107   ret void