xref: /llvm-project/llvm/test/Transforms/GVNHoist/opaque-diff-type.ll (revision edb2fc6dab2cf04779959829434e9e8572d48a26)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt -passes="gvn-hoist" -S %s | FileCheck %s
3
4; Checks that gvn-hoist does not try to merge loads of the same source pointer
5; when the results are different types.
6
7define linkonce_odr void @i16i32(ptr %arg) {
8; CHECK-LABEL: @i16i32(
9; CHECK-NEXT:  bb:
10; CHECK-NEXT:    br i1 false, label [[BB1:%.*]], label [[BB2:%.*]]
11; CHECK:       bb1:
12; CHECK-NEXT:    [[T:%.*]] = load i16, ptr [[ARG:%.*]], align 4
13; CHECK-NEXT:    br label [[BB2]]
14; CHECK:       bb2:
15; CHECK-NEXT:    [[T3:%.*]] = load i32, ptr [[ARG]], align 8
16; CHECK-NEXT:    ret void
17;
18bb:
19  br i1 false, label %bb1, label %bb2
20
21bb1:                                              ; preds = %bb
22  %t = load i16, ptr %arg, align 4
23  br label %bb2
24
25bb2:                                              ; preds = %bb1, %bb
26  %t3 = load i32, ptr %arg, align 8
27  ret void
28}
29
30define linkonce_odr void @i32f32(ptr %arg) {
31; CHECK-LABEL: @i32f32(
32; CHECK-NEXT:  bb:
33; CHECK-NEXT:    br i1 false, label [[BB1:%.*]], label [[BB2:%.*]]
34; CHECK:       bb1:
35; CHECK-NEXT:    [[T:%.*]] = load i32, ptr [[ARG:%.*]], align 4
36; CHECK-NEXT:    br label [[BB2]]
37; CHECK:       bb2:
38; CHECK-NEXT:    [[T3:%.*]] = load float, ptr [[ARG]], align 8
39; CHECK-NEXT:    ret void
40;
41bb:
42  br i1 false, label %bb1, label %bb2
43
44bb1:                                              ; preds = %bb
45  %t = load i32, ptr %arg, align 4
46  br label %bb2
47
48bb2:                                              ; preds = %bb1, %bb
49  %t3 = load float, ptr %arg, align 8
50  ret void
51}
52
53define linkonce_odr void @i64ptr(ptr %arg) {
54; CHECK-LABEL: @i64ptr(
55; CHECK-NEXT:  bb:
56; CHECK-NEXT:    br i1 false, label [[BB1:%.*]], label [[BB2:%.*]]
57; CHECK:       bb1:
58; CHECK-NEXT:    [[T:%.*]] = load i64, ptr [[ARG:%.*]], align 4
59; CHECK-NEXT:    br label [[BB2]]
60; CHECK:       bb2:
61; CHECK-NEXT:    [[T3:%.*]] = load ptr, ptr [[ARG]], align 8
62; CHECK-NEXT:    ret void
63;
64bb:
65  br i1 false, label %bb1, label %bb2
66
67bb1:                                              ; preds = %bb
68  %t = load i64, ptr %arg, align 4
69  br label %bb2
70
71bb2:                                              ; preds = %bb1, %bb
72  %t3 = load ptr, ptr %arg, align 8
73  ret void
74}
75
76define linkonce_odr void @ptrptr_diff_aspace(ptr %arg) {
77; CHECK-LABEL: @ptrptr_diff_aspace(
78; CHECK-NEXT:  bb:
79; CHECK-NEXT:    br i1 false, label [[BB1:%.*]], label [[BB2:%.*]]
80; CHECK:       bb1:
81; CHECK-NEXT:    [[T:%.*]] = load ptr addrspace(4), ptr [[ARG:%.*]], align 4
82; CHECK-NEXT:    br label [[BB2]]
83; CHECK:       bb2:
84; CHECK-NEXT:    [[T3:%.*]] = load ptr addrspace(2), ptr [[ARG]], align 8
85; CHECK-NEXT:    ret void
86;
87bb:
88  br i1 false, label %bb1, label %bb2
89
90bb1:                                              ; preds = %bb
91  %t = load ptr addrspace(4), ptr %arg, align 4
92  br label %bb2
93
94bb2:                                              ; preds = %bb1, %bb
95  %t3 = load ptr addrspace(2), ptr %arg, align 8
96  ret void
97}
98
99define linkonce_odr void @ptrptr(ptr %arg) {
100; CHECK-LABEL: @ptrptr(
101; CHECK-NEXT:  bb:
102; CHECK-NEXT:    [[T3:%.*]] = load ptr, ptr [[ARG:%.*]], align 4
103; CHECK-NEXT:    br i1 false, label [[BB1:%.*]], label [[BB2:%.*]]
104; CHECK:       bb1:
105; CHECK-NEXT:    br label [[BB2]]
106; CHECK:       bb2:
107; CHECK-NEXT:    ret void
108;
109bb:
110  br i1 false, label %bb1, label %bb2
111
112bb1:                                              ; preds = %bb
113  %t = load ptr, ptr %arg, align 4
114  br label %bb2
115
116bb2:                                              ; preds = %bb1, %bb
117  %t3 = load ptr, ptr %arg, align 8
118  ret void
119}
120