xref: /llvm-project/llvm/test/Transforms/GVN/no_speculative_loads_with_asan.ll (revision c062e97acfba977e3b0623a9c76c4d9d4d3afd17)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt -passes=gvn -S %s | FileCheck %s
3target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
4declare noalias ptr @_Znam(i64) #1
5
6; Load of %i8 is an out of bounds load, which is folded to poison, which allows
7; us to elide the phi.
8define i32 @TestNoAsan() {
9; CHECK-LABEL: @TestNoAsan(
10; CHECK-NEXT:  bb:
11; CHECK-NEXT:    [[I:%.*]] = tail call noalias ptr @_Znam(i64 2)
12; CHECK-NEXT:    [[I1:%.*]] = getelementptr inbounds i8, ptr [[I]], i64 1
13; CHECK-NEXT:    store i8 0, ptr [[I1]], align 1
14; CHECK-NEXT:    store i8 0, ptr [[I]], align 1
15; CHECK-NEXT:    [[I3:%.*]] = load i16, ptr [[I]], align 4
16; CHECK-NEXT:    [[I4:%.*]] = icmp eq i16 [[I3]], 0
17; CHECK-NEXT:    br i1 [[I4]], label [[BB10:%.*]], label [[BB5:%.*]]
18; CHECK:       bb5:
19; CHECK-NEXT:    [[I6:%.*]] = getelementptr inbounds i8, ptr [[I]], i64 2
20; CHECK-NEXT:    br label [[BB10]]
21; CHECK:       bb10:
22; CHECK-NEXT:    ret i32 0
23;
24bb:
25  %i = tail call noalias ptr @_Znam(i64 2)
26  %i1 = getelementptr inbounds i8, ptr %i, i64 1
27  store i8 0, ptr %i1, align 1
28  store i8 0, ptr %i, align 1
29  %i3 = load i16, ptr %i, align 4
30  %i4 = icmp eq i16 %i3, 0
31  br i1 %i4, label %bb10, label %bb5
32
33bb5:                                              ; preds = %bb
34  %i6 = getelementptr inbounds i8, ptr %i, i64 2
35  %i8 = load i16, ptr %i6, align 2
36  %i9 = sext i16 %i8 to i32
37  br label %bb10
38
39bb10:                                             ; preds = %bb5, %bb
40  %i11 = phi i32 [ %i9, %bb5 ], [ 0, %bb ]
41  ret i32 %i11
42}
43
44define i32 @TestAsan() sanitize_address {
45; CHECK-LABEL: @TestAsan(
46; CHECK-NEXT:  bb:
47; CHECK-NEXT:    [[I:%.*]] = tail call noalias ptr @_Znam(i64 2)
48; CHECK-NEXT:    [[I1:%.*]] = getelementptr inbounds i8, ptr [[I]], i64 1
49; CHECK-NEXT:    store i8 0, ptr [[I1]], align 1
50; CHECK-NEXT:    store i8 0, ptr [[I]], align 1
51; CHECK-NEXT:    [[I3:%.*]] = load i16, ptr [[I]], align 4
52; CHECK-NEXT:    [[I4:%.*]] = icmp eq i16 [[I3]], 0
53; CHECK-NEXT:    br i1 [[I4]], label [[BB10:%.*]], label [[BB5:%.*]]
54; CHECK:       bb5:
55; CHECK-NEXT:    [[I6:%.*]] = getelementptr inbounds i8, ptr [[I]], i64 2
56; CHECK-NEXT:    [[I8:%.*]] = load i16, ptr [[I6]], align 2
57; CHECK-NEXT:    [[I9:%.*]] = sext i16 [[I8]] to i32
58; CHECK-NEXT:    br label [[BB10]]
59; CHECK:       bb10:
60; CHECK-NEXT:    [[I11:%.*]] = phi i32 [ [[I9]], [[BB5]] ], [ 0, [[BB:%.*]] ]
61; CHECK-NEXT:    ret i32 [[I11]]
62;
63bb:
64  %i = tail call noalias ptr @_Znam(i64 2)
65  %i1 = getelementptr inbounds i8, ptr %i, i64 1
66  store i8 0, ptr %i1, align 1
67  store i8 0, ptr %i, align 1
68  %i3 = load i16, ptr %i, align 4
69  %i4 = icmp eq i16 %i3, 0
70  br i1 %i4, label %bb10, label %bb5
71
72bb5:                                              ; preds = %bb
73  %i6 = getelementptr inbounds i8, ptr %i, i64 2
74  %i8 = load i16, ptr %i6, align 2
75  %i9 = sext i16 %i8 to i32
76  br label %bb10
77
78bb10:                                             ; preds = %bb5, %bb
79  %i11 = phi i32 [ %i9, %bb5 ], [ 0, %bb ]
80  ret i32 %i11
81}
82
83define i32 @TestHWAsan() sanitize_hwaddress {
84; CHECK-LABEL: @TestHWAsan(
85; CHECK-NEXT:  bb:
86; CHECK-NEXT:    [[I:%.*]] = tail call noalias ptr @_Znam(i64 2)
87; CHECK-NEXT:    [[I1:%.*]] = getelementptr inbounds i8, ptr [[I]], i64 1
88; CHECK-NEXT:    store i8 0, ptr [[I1]], align 1
89; CHECK-NEXT:    store i8 0, ptr [[I]], align 1
90; CHECK-NEXT:    [[I3:%.*]] = load i16, ptr [[I]], align 4
91; CHECK-NEXT:    [[I4:%.*]] = icmp eq i16 [[I3]], 0
92; CHECK-NEXT:    br i1 [[I4]], label [[BB10:%.*]], label [[BB5:%.*]]
93; CHECK:       bb5:
94; CHECK-NEXT:    [[I6:%.*]] = getelementptr inbounds i8, ptr [[I]], i64 2
95; CHECK-NEXT:    [[I8:%.*]] = load i16, ptr [[I6]], align 2
96; CHECK-NEXT:    [[I9:%.*]] = sext i16 [[I8]] to i32
97; CHECK-NEXT:    br label [[BB10]]
98; CHECK:       bb10:
99; CHECK-NEXT:    [[I11:%.*]] = phi i32 [ [[I9]], [[BB5]] ], [ 0, [[BB:%.*]] ]
100; CHECK-NEXT:    ret i32 [[I11]]
101;
102bb:
103  %i = tail call noalias ptr @_Znam(i64 2)
104  %i1 = getelementptr inbounds i8, ptr %i, i64 1
105  store i8 0, ptr %i1, align 1
106  store i8 0, ptr %i, align 1
107  %i3 = load i16, ptr %i, align 4
108  %i4 = icmp eq i16 %i3, 0
109  br i1 %i4, label %bb10, label %bb5
110
111bb5:                                              ; preds = %bb
112  %i6 = getelementptr inbounds i8, ptr %i, i64 2
113  %i8 = load i16, ptr %i6, align 2
114  %i9 = sext i16 %i8 to i32
115  br label %bb10
116
117bb10:                                             ; preds = %bb5, %bb
118  %i11 = phi i32 [ %i9, %bb5 ], [ 0, %bb ]
119  ret i32 %i11
120}
121