xref: /llvm-project/llvm/test/Transforms/IndVarSimplify/X86/replace-iv-with-loop-invariant.ll (revision 3ce360f15b5a790a5fd9dcab716bbed7b4d3a347)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt < %s -passes=indvars -S | FileCheck %s
3
4target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
5target triple = "x86_64-unknown-linux-gnu"
6
7@G = external global i32
8
9define void @test0(ptr %arg) {
10; CHECK-LABEL: @test0(
11; CHECK-NEXT:  bb:
12; CHECK-NEXT:    br label [[BB2:%.*]]
13; CHECK:       bb2:
14; CHECK-NEXT:    [[TMP:%.*]] = phi ptr [ [[ARG:%.*]], [[BB:%.*]] ], [ [[TMP7:%.*]], [[BB2]] ]
15; CHECK-NEXT:    [[TMP4:%.*]] = call ptr @wobble(ptr nonnull [[TMP]], ptr null)
16; CHECK-NEXT:    [[TMP5:%.*]] = load i32, ptr null, align 8
17; CHECK-NEXT:    [[TMP7]] = load ptr, ptr undef, align 8
18; CHECK-NEXT:    br label [[BB2]]
19;
20bb:
21  br label %bb2
22
23bb2:
24  %tmp = phi ptr [%arg, %bb ], [ %tmp7, %bb2 ]
25  %tmp4 = call ptr @wobble(ptr nonnull %tmp, ptr null)
26  %tmp5 = load i32, ptr %tmp4, align 8
27  %tmp7 = load ptr, ptr undef, align 8
28  br label %bb2
29}
30
31define void @test1(ptr %arg) {
32; CHECK-LABEL: @test1(
33; CHECK-NEXT:  bb:
34; CHECK-NEXT:    br label [[BB2:%.*]]
35; CHECK:       bb2:
36; CHECK-NEXT:    [[TMP:%.*]] = phi ptr [ [[ARG:%.*]], [[BB:%.*]] ], [ [[TMP7:%.*]], [[BB2]] ]
37; CHECK-NEXT:    [[TMP4:%.*]] = call ptr @wobble(ptr nonnull [[TMP]], ptr inttoptr (i64 4 to ptr))
38; CHECK-NEXT:    [[TMP5:%.*]] = load i32, ptr inttoptr (i64 4 to ptr), align 4
39; CHECK-NEXT:    [[TMP7]] = load ptr, ptr undef, align 8
40; CHECK-NEXT:    br label [[BB2]]
41;
42bb:
43  br label %bb2
44
45bb2:
46  %tmp = phi ptr [%arg, %bb ], [ %tmp7, %bb2 ]
47  %tmp4 = call ptr @wobble(ptr nonnull %tmp, ptr inttoptr (i64 4 to ptr))
48  %tmp5 = load i32, ptr %tmp4
49  %tmp7 = load ptr, ptr undef, align 8
50  br label %bb2
51}
52
53define void @test2(ptr %arg) {
54; CHECK-LABEL: @test2(
55; CHECK-NEXT:  bb:
56; CHECK-NEXT:    br label [[BB2:%.*]]
57; CHECK:       bb2:
58; CHECK-NEXT:    [[TMP:%.*]] = phi ptr [ [[ARG:%.*]], [[BB:%.*]] ], [ [[TMP7:%.*]], [[BB2]] ]
59; CHECK-NEXT:    [[TMP4:%.*]] = call ptr @wobble(ptr nonnull [[TMP]], ptr @G)
60; CHECK-NEXT:    [[TMP5:%.*]] = load i32, ptr @G, align 4
61; CHECK-NEXT:    [[TMP7]] = load ptr, ptr undef, align 8
62; CHECK-NEXT:    br label [[BB2]]
63;
64bb:
65  br label %bb2
66
67bb2:
68  %tmp = phi ptr [%arg, %bb ], [ %tmp7, %bb2 ]
69  %tmp4 = call ptr @wobble(ptr nonnull %tmp, ptr @G)
70  %tmp5 = load i32, ptr %tmp4
71  %tmp7 = load ptr, ptr undef, align 8
72  br label %bb2
73}
74
75define void @test3(ptr %arg, ptr %loop.invariant) {
76; CHECK-LABEL: @test3(
77; CHECK-NEXT:  bb:
78; CHECK-NEXT:    br label [[BB2:%.*]]
79; CHECK:       bb2:
80; CHECK-NEXT:    [[TMP:%.*]] = phi ptr [ [[ARG:%.*]], [[BB:%.*]] ], [ [[TMP7:%.*]], [[BB2]] ]
81; CHECK-NEXT:    [[TMP4:%.*]] = call ptr @wobble(ptr nonnull [[TMP]], ptr [[LOOP_INVARIANT:%.*]])
82; CHECK-NEXT:    [[TMP5:%.*]] = load i32, ptr [[LOOP_INVARIANT]], align 4
83; CHECK-NEXT:    [[TMP7]] = load ptr, ptr undef, align 8
84; CHECK-NEXT:    br label [[BB2]]
85;
86bb:
87  br label %bb2
88
89bb2:
90  %tmp = phi ptr [%arg, %bb ], [ %tmp7, %bb2 ]
91  %tmp4 = call ptr @wobble(ptr nonnull %tmp, ptr %loop.invariant)
92  %tmp5 = load i32, ptr %tmp4
93  %tmp7 = load ptr, ptr undef, align 8
94  br label %bb2
95}
96
97define void @test4(ptr %arg, ptr %loop.invariant, i64 %N) {
98; CHECK-LABEL: @test4(
99; CHECK-NEXT:  bb:
100; CHECK-NEXT:    [[TMP0:%.*]] = shl i64 [[N:%.*]], 8
101; CHECK-NEXT:    [[UGLYGEP:%.*]] = getelementptr i8, ptr [[LOOP_INVARIANT:%.*]], i64 [[TMP0]]
102; CHECK-NEXT:    br label [[BB2:%.*]]
103; CHECK:       bb2:
104; CHECK-NEXT:    [[TMP:%.*]] = phi ptr [ [[ARG:%.*]], [[BB:%.*]] ], [ [[TMP7:%.*]], [[BB2]] ]
105; CHECK-NEXT:    [[MUL:%.*]] = mul nsw i64 [[N]], 64
106; CHECK-NEXT:    [[PTR:%.*]] = getelementptr inbounds i32, ptr [[LOOP_INVARIANT]], i64 [[MUL]]
107; CHECK-NEXT:    [[TMP4:%.*]] = call ptr @wobble(ptr nonnull [[TMP]], ptr [[PTR]])
108; CHECK-NEXT:    [[TMP5:%.*]] = load i32, ptr [[UGLYGEP]], align 4
109; CHECK-NEXT:    [[TMP7]] = load ptr, ptr undef, align 8
110; CHECK-NEXT:    br label [[BB2]]
111;
112bb:
113  br label %bb2
114
115bb2:
116  %tmp = phi ptr [%arg, %bb ], [ %tmp7, %bb2 ]
117  %mul = mul nsw i64 %N, 64
118  %ptr = getelementptr inbounds i32, ptr %loop.invariant, i64 %mul
119  %tmp4 = call ptr @wobble(ptr nonnull %tmp, ptr %ptr)
120  %tmp5 = load i32, ptr %tmp4
121  %tmp7 = load ptr, ptr undef, align 8
122  br label %bb2
123}
124
125declare ptr @wobble(ptr, ptr returned)
126