|
| 1 | +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py |
1 | 2 | ; RUN: opt -passes=globalopt -S < %s | FileCheck %s
|
2 | 3 |
|
3 | 4 | @G1 = internal global i32 5
|
|
6 | 7 | @G4 = internal global i32 5
|
7 | 8 | @G5 = internal global i32 5
|
8 | 9 |
|
9 |
| -; CHECK-LABEL: @test1 |
10 |
| -define internal i32 @test1() norecurse { |
11 |
| -; CHECK-NOT: @G1 |
| 10 | +define i32 @test1() norecurse { |
| 11 | +; CHECK-LABEL: @test1( |
| 12 | +; CHECK-NEXT: [[G1:%.*]] = alloca i32, align 4 |
| 13 | +; CHECK-NEXT: store i32 5, ptr [[G1]], align 4 |
| 14 | +; CHECK-NEXT: store i32 4, ptr [[G1]], align 4 |
| 15 | +; CHECK-NEXT: [[A:%.*]] = load i32, ptr [[G1]], align 4 |
| 16 | +; CHECK-NEXT: ret i32 [[A]] |
| 17 | +; |
12 | 18 | store i32 4, ptr @G1
|
13 | 19 | %a = load i32, ptr @G1
|
14 |
| -; CHECK: ret |
15 | 20 | ret i32 %a
|
16 | 21 | }
|
17 | 22 |
|
18 | 23 | ; The load comes before the store which makes @G2 live before the call.
|
19 |
| -; CHECK-LABEL: @test2 |
20 |
| -define internal i32 @test2() norecurse { |
21 |
| -; CHECK-NOT: %G2 |
| 24 | +define i32 @test2() norecurse { |
| 25 | +; CHECK-LABEL: @test2( |
| 26 | +; CHECK-NEXT: [[A_B:%.*]] = load i1, ptr @G2, align 1 |
| 27 | +; CHECK-NEXT: [[A:%.*]] = select i1 [[A_B]], i32 4, i32 5 |
| 28 | +; CHECK-NEXT: store i1 true, ptr @G2, align 1 |
| 29 | +; CHECK-NEXT: ret i32 [[A]] |
| 30 | +; |
22 | 31 | %a = load i32, ptr @G2
|
23 | 32 | store i32 4, ptr @G2
|
24 |
| -; CHECK: ret |
25 | 33 | ret i32 %a
|
26 | 34 | }
|
27 | 35 |
|
28 | 36 | ; This global is indexed by a GEP - this makes it partial alias and we bail out.
|
29 | 37 | ; FIXME: We don't actually have to bail out in this case.
|
30 |
| - |
31 |
| -; CHECK-LABEL: @test3 |
32 |
| -define internal i32 @test3() norecurse { |
33 |
| -; CHECK-NOT: %G3 |
| 38 | +define i32 @test3() norecurse { |
| 39 | +; CHECK-LABEL: @test3( |
| 40 | +; CHECK-NEXT: [[A_B:%.*]] = load i1, ptr @G3, align 1 |
| 41 | +; CHECK-NEXT: [[A:%.*]] = select i1 [[A_B]], i32 4, i32 5 |
| 42 | +; CHECK-NEXT: store i1 true, ptr @G3, align 1 |
| 43 | +; CHECK-NEXT: ret i32 [[A]] |
| 44 | +; |
34 | 45 | %a = load i32, ptr @G3
|
35 | 46 | store i32 4, ptr @G3
|
36 |
| -; CHECK: ret |
37 | 47 | ret i32 %a
|
38 | 48 | }
|
39 | 49 |
|
40 | 50 | ; The global is casted away to a larger type then loaded. The store only partially
|
41 | 51 | ; covers the load, so we must not demote.
|
42 |
| - |
43 |
| -; CHECK-LABEL: @test4 |
44 |
| -define internal i32 @test4() norecurse { |
45 |
| -; CHECK-NOT: %G4 |
| 52 | +define i32 @test4() norecurse { |
| 53 | +; CHECK-LABEL: @test4( |
| 54 | +; CHECK-NEXT: store i32 4, ptr @G4, align 4 |
| 55 | +; CHECK-NEXT: [[A:%.*]] = load i64, ptr @G4, align 4 |
| 56 | +; CHECK-NEXT: [[B:%.*]] = trunc i64 [[A]] to i32 |
| 57 | +; CHECK-NEXT: ret i32 [[B]] |
| 58 | +; |
46 | 59 | store i32 4, ptr @G4
|
47 | 60 | %a = load i64, ptr @G4
|
48 | 61 | %b = trunc i64 %a to i32
|
49 |
| -; CHECK: ret |
50 | 62 | ret i32 %b
|
51 | 63 | }
|
52 | 64 |
|
53 | 65 | ; The global is casted away to a smaller type then loaded. This one is fine.
|
54 |
| - |
55 |
| -; CHECK-LABEL: @test5 |
56 |
| -define internal i32 @test5() norecurse { |
57 |
| -; CHECK-NOT: @G5 |
| 66 | +define i32 @test5() norecurse { |
| 67 | +; CHECK-LABEL: @test5( |
| 68 | +; CHECK-NEXT: [[G5:%.*]] = alloca i32, align 4 |
| 69 | +; CHECK-NEXT: store i32 5, ptr [[G5]], align 4 |
| 70 | +; CHECK-NEXT: store i32 4, ptr [[G5]], align 4 |
| 71 | +; CHECK-NEXT: [[A:%.*]] = load i16, ptr [[G5]], align 2 |
| 72 | +; CHECK-NEXT: [[B:%.*]] = zext i16 [[A]] to i32 |
| 73 | +; CHECK-NEXT: ret i32 [[B]] |
| 74 | +; |
58 | 75 | store i32 4, ptr @G5
|
59 | 76 | %a = load i16, ptr @G5
|
60 | 77 | %b = zext i16 %a to i32
|
61 |
| -; CHECK: ret |
62 | 78 | ret i32 %b
|
63 | 79 | }
|
64 |
| - |
65 |
| -define i32 @main() norecurse { |
66 |
| - %a = call i32 @test1() |
67 |
| - %b = call i32 @test2() |
68 |
| - %c = call i32 @test3() |
69 |
| - %d = call i32 @test4() |
70 |
| - %e = call i32 @test5() |
71 |
| - |
72 |
| - %x = or i32 %a, %b |
73 |
| - %y = or i32 %x, %c |
74 |
| - %z = or i32 %y, %d |
75 |
| - %w = or i32 %z, %e |
76 |
| - ret i32 %w |
77 |
| -} |
|
0 commit comments