Re-land [openmp] Fix warnings when building on Windows with latest MSVC or Clang...
[llvm-project.git] / llvm / test / Transforms / IndVarSimplify / X86 / eliminate-congruent-ivs.ll
blob33b0a879b0aa29dc2bd484261a4ac3f32ef5abfb
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt < %s -passes=indvars -scalar-evolution-use-expensive-range-sharpening -S | FileCheck %s
4 target triple = "x86_64--linux-gnu"
6 ; Provide legal integer types.
7 target datalayout = "n8:16:32:64"
9 declare void @foo(i64 %v)
10 declare void @bar(i32 %v)
12 define void @test1() {
13 ; CHECK-LABEL: @test1(
14 ; CHECK-NEXT:  entry:
15 ; CHECK-NEXT:    br label [[LOOP:%.*]]
16 ; CHECK:       loop:
17 ; CHECK-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ [[INDVARS_IV_NEXT:%.*]], [[LOOP]] ], [ 0, [[ENTRY:%.*]] ]
18 ; CHECK-NEXT:    [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1
19 ; CHECK-NEXT:    [[INDVARS2:%.*]] = trunc i64 [[INDVARS_IV_NEXT]] to i32
20 ; CHECK-NEXT:    call void @bar(i32 [[INDVARS2]])
21 ; CHECK-NEXT:    call void @foo(i64 [[INDVARS_IV]])
22 ; CHECK-NEXT:    [[LOOP_COND:%.*]] = icmp eq i64 [[INDVARS_IV]], 1000
23 ; CHECK-NEXT:    br i1 [[LOOP_COND]], label [[EXIT:%.*]], label [[LOOP]]
24 ; CHECK:       exit:
25 ; CHECK-NEXT:    ret void
27 entry:
28   br label %loop
30 loop:                                             ; preds = %loop, %entry
31   %iv = phi i32 [ %iv.next, %loop ], [ 0, %entry ]
32   %val1 = phi i32 [ %val1.inc, %loop ], [ 0, %entry ]
33   %val1.inc = add i32 %val1, 1
34   %iv.next = add i32 %iv, 1
35   call void @bar(i32 %val1.inc)
36   %iv.wide = zext i32 %iv to i64
37   call void @foo(i64 %iv.wide)
38   %loop.cond = icmp eq i32 %iv, 1000
39   br i1 %loop.cond, label %exit, label %loop
41 exit:                                             ; preds = %loop
42   ret void
45 define void @test2() {
46 ; CHECK-LABEL: @test2(
47 ; CHECK-NEXT:  entry:
48 ; CHECK-NEXT:    br label [[LOOP:%.*]]
49 ; CHECK:       loop:
50 ; CHECK-NEXT:    [[VAL1:%.*]] = phi i64 [ [[VAL1_INC:%.*]], [[LOOP]] ], [ 0, [[ENTRY:%.*]] ]
51 ; CHECK-NEXT:    [[VAL1_INC]] = add nuw nsw i64 [[VAL1]], 1
52 ; CHECK-NEXT:    call void @foo(i64 [[VAL1_INC]])
53 ; CHECK-NEXT:    call void @foo(i64 [[VAL1]])
54 ; CHECK-NEXT:    [[LOOP_COND:%.*]] = icmp eq i64 [[VAL1]], 1000
55 ; CHECK-NEXT:    br i1 [[LOOP_COND]], label [[EXIT:%.*]], label [[LOOP]]
56 ; CHECK:       exit:
57 ; CHECK-NEXT:    ret void
59 entry:
60   br label %loop
62 loop:                                             ; preds = %loop, %entry
63   %iv = phi i32 [ %iv.next, %loop ], [ 0, %entry ]
64   %val1 = phi i64 [ %val1.inc, %loop ], [ 0, %entry ]
65   %val1.inc = add i64 %val1, 1
66   %iv.next = add i32 %iv, 1
67   call void @foo(i64 %val1.inc)
68   %iv.wide = zext i32 %iv to i64
69   call void @foo(i64 %iv.wide)
70   %loop.cond = icmp eq i32 %iv, 1000
71   br i1 %loop.cond, label %exit, label %loop
73 exit:                                             ; preds = %loop
74   ret void
77 define void @test3() {
78 ; CHECK-LABEL: @test3(
79 ; CHECK-NEXT:  entry:
80 ; CHECK-NEXT:    br label [[LOOP:%.*]]
81 ; CHECK:       loop:
82 ; CHECK-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ [[INDVARS_IV_NEXT:%.*]], [[LOOP]] ], [ 0, [[ENTRY:%.*]] ]
83 ; CHECK-NEXT:    [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1
84 ; CHECK-NEXT:    call void @foo(i64 [[INDVARS_IV]])
85 ; CHECK-NEXT:    call void @foo(i64 [[INDVARS_IV]])
86 ; CHECK-NEXT:    [[LOOP_COND:%.*]] = icmp eq i64 [[INDVARS_IV]], 1000
87 ; CHECK-NEXT:    br i1 [[LOOP_COND]], label [[EXIT:%.*]], label [[LOOP]]
88 ; CHECK:       exit:
89 ; CHECK-NEXT:    ret void
91 entry:
92   br label %loop
94 loop:                                             ; preds = %loop, %entry
95   %iv = phi i32 [ %iv.next, %loop ], [ 0, %entry ]
96   %val1 = phi i32 [ %val1.inc, %loop ], [ 0, %entry ]
97   %val1.inc = add i32 %val1, 1
98   %iv.next = add i32 %iv, 1
99   %val1.wide = zext i32 %val1 to i64
100   call void @foo(i64 %val1.wide)
101   %iv.wide = zext i32 %iv to i64
102   call void @foo(i64 %iv.wide)
103   %loop.cond = icmp eq i32 %iv, 1000
104   br i1 %loop.cond, label %exit, label %loop
106 exit:                                             ; preds = %loop
107   ret void
110 define void @test4(ptr %ptr) {
111 ; CHECK-LABEL: @test4(
112 ; CHECK-NEXT:  entry:
113 ; CHECK-NEXT:    store i32 0, ptr [[PTR:%.*]], align 4
114 ; CHECK-NEXT:    br label [[LOOP:%.*]]
115 ; CHECK:       loop:
116 ; CHECK-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ [[INDVARS_IV_NEXT:%.*]], [[LOOP]] ], [ 0, [[ENTRY:%.*]] ]
117 ; CHECK-NEXT:    [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1
118 ; CHECK-NEXT:    [[INDVARS:%.*]] = trunc i64 [[INDVARS_IV_NEXT]] to i32
119 ; CHECK-NEXT:    store i32 [[INDVARS]], ptr [[PTR]], align 4
120 ; CHECK-NEXT:    call void @foo(i64 [[INDVARS_IV]])
121 ; CHECK-NEXT:    [[LOOP_COND:%.*]] = icmp eq i64 [[INDVARS_IV]], 1000
122 ; CHECK-NEXT:    br i1 [[LOOP_COND]], label [[EXIT:%.*]], label [[LOOP]]
123 ; CHECK:       exit:
124 ; CHECK-NEXT:    ret void
126 entry:
127   store i32 0, ptr %ptr, align 4
128   br label %loop
130 loop:                                             ; preds = %loop, %entry
131   %val = phi i32 [ %val.inc, %loop ], [ 0, %entry ]
132   %iv = phi i32 [ %iv.next, %loop ], [ 0, %entry ]
133   %val.inc = add i32 %val, 1
134   store i32 %val.inc, ptr %ptr, align 4
135   %iv.wide = zext i32 %iv to i64
136   call void @foo(i64 %iv.wide)
137   %iv.next = add i32 %iv, 1
138   %loop.cond = icmp eq i32 %iv, 1000
139   br i1 %loop.cond, label %exit, label %loop
141 exit:                                             ; preds = %loop
142   ret void