@@ -10,12 +10,16 @@ define {i64, i1} @test_sadd_with_overflow(i64 %a, i64 %b) #0 {
10
10
; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr @__msan_param_tls, align 8
11
11
; CHECK-NEXT: [[TMP2:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 8) to ptr), align 8
12
12
; CHECK-NEXT: call void @llvm.donothing()
13
- ; CHECK-NEXT: [[TMP3:%.*]] = or i64 [[TMP1]], [[TMP2]]
14
- ; CHECK-NEXT: [[TMP4:%.*]] = icmp ne i64 [[TMP3]], 0
15
- ; CHECK-NEXT: [[TMP5:%.*]] = insertvalue { i64, i1 } poison, i64 [[TMP3]], 0
16
- ; CHECK-NEXT: [[TMP6:%.*]] = insertvalue { i64, i1 } [[TMP5]], i1 [[TMP4]], 1
13
+ ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[TMP1]], 0
14
+ ; CHECK-NEXT: [[_MSCMP1:%.*]] = icmp ne i64 [[TMP2]], 0
15
+ ; CHECK-NEXT: [[_MSOR:%.*]] = or i1 [[_MSCMP]], [[_MSCMP1]]
16
+ ; CHECK-NEXT: br i1 [[_MSOR]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF0:![0-9]+]]
17
+ ; CHECK: 3:
18
+ ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4:[0-9]+]]
19
+ ; CHECK-NEXT: unreachable
20
+ ; CHECK: 4:
17
21
; CHECK-NEXT: [[RES:%.*]] = call { i64, i1 } @llvm.sadd.with.overflow.i64(i64 [[A]], i64 [[B]])
18
- ; CHECK-NEXT: store { i64, i1 } [[TMP6]] , ptr @__msan_retval_tls, align 8
22
+ ; CHECK-NEXT: store { i64, i1 } zeroinitializer , ptr @__msan_retval_tls, align 8
19
23
; CHECK-NEXT: ret { i64, i1 } [[RES]]
20
24
;
21
25
%res = call { i64 , i1 } @llvm.sadd.with.overflow.i64 (i64 %a , i64 %b )
@@ -28,12 +32,16 @@ define {i64, i1} @test_uadd_with_overflow(i64 %a, i64 %b) #0 {
28
32
; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr @__msan_param_tls, align 8
29
33
; CHECK-NEXT: [[TMP2:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 8) to ptr), align 8
30
34
; CHECK-NEXT: call void @llvm.donothing()
31
- ; CHECK-NEXT: [[TMP3:%.*]] = or i64 [[TMP1]], [[TMP2]]
32
- ; CHECK-NEXT: [[TMP4:%.*]] = icmp ne i64 [[TMP3]], 0
33
- ; CHECK-NEXT: [[TMP5:%.*]] = insertvalue { i64, i1 } poison, i64 [[TMP3]], 0
34
- ; CHECK-NEXT: [[TMP6:%.*]] = insertvalue { i64, i1 } [[TMP5]], i1 [[TMP4]], 1
35
+ ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[TMP1]], 0
36
+ ; CHECK-NEXT: [[_MSCMP1:%.*]] = icmp ne i64 [[TMP2]], 0
37
+ ; CHECK-NEXT: [[_MSOR:%.*]] = or i1 [[_MSCMP]], [[_MSCMP1]]
38
+ ; CHECK-NEXT: br i1 [[_MSOR]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF0]]
39
+ ; CHECK: 3:
40
+ ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
41
+ ; CHECK-NEXT: unreachable
42
+ ; CHECK: 4:
35
43
; CHECK-NEXT: [[RES:%.*]] = call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 [[A]], i64 [[B]])
36
- ; CHECK-NEXT: store { i64, i1 } [[TMP6]] , ptr @__msan_retval_tls, align 8
44
+ ; CHECK-NEXT: store { i64, i1 } zeroinitializer , ptr @__msan_retval_tls, align 8
37
45
; CHECK-NEXT: ret { i64, i1 } [[RES]]
38
46
;
39
47
%res = call { i64 , i1 } @llvm.uadd.with.overflow.i64 (i64 %a , i64 %b )
@@ -46,12 +54,16 @@ define {i64, i1} @test_smul_with_overflow(i64 %a, i64 %b) #0 {
46
54
; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr @__msan_param_tls, align 8
47
55
; CHECK-NEXT: [[TMP2:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 8) to ptr), align 8
48
56
; CHECK-NEXT: call void @llvm.donothing()
49
- ; CHECK-NEXT: [[TMP3:%.*]] = or i64 [[TMP1]], [[TMP2]]
50
- ; CHECK-NEXT: [[TMP4:%.*]] = icmp ne i64 [[TMP3]], 0
51
- ; CHECK-NEXT: [[TMP5:%.*]] = insertvalue { i64, i1 } poison, i64 [[TMP3]], 0
52
- ; CHECK-NEXT: [[TMP6:%.*]] = insertvalue { i64, i1 } [[TMP5]], i1 [[TMP4]], 1
57
+ ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[TMP1]], 0
58
+ ; CHECK-NEXT: [[_MSCMP1:%.*]] = icmp ne i64 [[TMP2]], 0
59
+ ; CHECK-NEXT: [[_MSOR:%.*]] = or i1 [[_MSCMP]], [[_MSCMP1]]
60
+ ; CHECK-NEXT: br i1 [[_MSOR]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF0]]
61
+ ; CHECK: 3:
62
+ ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
63
+ ; CHECK-NEXT: unreachable
64
+ ; CHECK: 4:
53
65
; CHECK-NEXT: [[RES:%.*]] = call { i64, i1 } @llvm.smul.with.overflow.i64(i64 [[A]], i64 [[B]])
54
- ; CHECK-NEXT: store { i64, i1 } [[TMP6]] , ptr @__msan_retval_tls, align 8
66
+ ; CHECK-NEXT: store { i64, i1 } zeroinitializer , ptr @__msan_retval_tls, align 8
55
67
; CHECK-NEXT: ret { i64, i1 } [[RES]]
56
68
;
57
69
%res = call { i64 , i1 } @llvm.smul.with.overflow.i64 (i64 %a , i64 %b )
@@ -63,12 +75,16 @@ define {i64, i1} @test_umul_with_overflow(i64 %a, i64 %b) #0 {
63
75
; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr @__msan_param_tls, align 8
64
76
; CHECK-NEXT: [[TMP2:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 8) to ptr), align 8
65
77
; CHECK-NEXT: call void @llvm.donothing()
66
- ; CHECK-NEXT: [[TMP3:%.*]] = or i64 [[TMP1]], [[TMP2]]
67
- ; CHECK-NEXT: [[TMP4:%.*]] = icmp ne i64 [[TMP3]], 0
68
- ; CHECK-NEXT: [[TMP5:%.*]] = insertvalue { i64, i1 } poison, i64 [[TMP3]], 0
69
- ; CHECK-NEXT: [[TMP6:%.*]] = insertvalue { i64, i1 } [[TMP5]], i1 [[TMP4]], 1
78
+ ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[TMP1]], 0
79
+ ; CHECK-NEXT: [[_MSCMP1:%.*]] = icmp ne i64 [[TMP2]], 0
80
+ ; CHECK-NEXT: [[_MSOR:%.*]] = or i1 [[_MSCMP]], [[_MSCMP1]]
81
+ ; CHECK-NEXT: br i1 [[_MSOR]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF0]]
82
+ ; CHECK: 3:
83
+ ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
84
+ ; CHECK-NEXT: unreachable
85
+ ; CHECK: 4:
70
86
; CHECK-NEXT: [[RES:%.*]] = call { i64, i1 } @llvm.umul.with.overflow.i64(i64 [[A]], i64 [[B]])
71
- ; CHECK-NEXT: store { i64, i1 } [[TMP6]] , ptr @__msan_retval_tls, align 8
87
+ ; CHECK-NEXT: store { i64, i1 } zeroinitializer , ptr @__msan_retval_tls, align 8
72
88
; CHECK-NEXT: ret { i64, i1 } [[RES]]
73
89
;
74
90
%res = call { i64 , i1 } @llvm.umul.with.overflow.i64 (i64 %a , i64 %b )
@@ -80,12 +96,16 @@ define {i64, i1} @test_ssub_with_overflow(i64 %a, i64 %b) #0 {
80
96
; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr @__msan_param_tls, align 8
81
97
; CHECK-NEXT: [[TMP2:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 8) to ptr), align 8
82
98
; CHECK-NEXT: call void @llvm.donothing()
83
- ; CHECK-NEXT: [[TMP3:%.*]] = or i64 [[TMP1]], [[TMP2]]
84
- ; CHECK-NEXT: [[TMP4:%.*]] = icmp ne i64 [[TMP3]], 0
85
- ; CHECK-NEXT: [[TMP5:%.*]] = insertvalue { i64, i1 } poison, i64 [[TMP3]], 0
86
- ; CHECK-NEXT: [[TMP6:%.*]] = insertvalue { i64, i1 } [[TMP5]], i1 [[TMP4]], 1
99
+ ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[TMP1]], 0
100
+ ; CHECK-NEXT: [[_MSCMP1:%.*]] = icmp ne i64 [[TMP2]], 0
101
+ ; CHECK-NEXT: [[_MSOR:%.*]] = or i1 [[_MSCMP]], [[_MSCMP1]]
102
+ ; CHECK-NEXT: br i1 [[_MSOR]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF0]]
103
+ ; CHECK: 3:
104
+ ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
105
+ ; CHECK-NEXT: unreachable
106
+ ; CHECK: 4:
87
107
; CHECK-NEXT: [[RES:%.*]] = call { i64, i1 } @llvm.ssub.with.overflow.i64(i64 [[A]], i64 [[B]])
88
- ; CHECK-NEXT: store { i64, i1 } [[TMP6]] , ptr @__msan_retval_tls, align 8
108
+ ; CHECK-NEXT: store { i64, i1 } zeroinitializer , ptr @__msan_retval_tls, align 8
89
109
; CHECK-NEXT: ret { i64, i1 } [[RES]]
90
110
;
91
111
%res = call { i64 , i1 } @llvm.ssub.with.overflow.i64 (i64 %a , i64 %b )
@@ -97,12 +117,16 @@ define {i64, i1} @test_usub_with_overflow(i64 %a, i64 %b) #0 {
97
117
; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr @__msan_param_tls, align 8
98
118
; CHECK-NEXT: [[TMP2:%.*]] = load i64, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 8) to ptr), align 8
99
119
; CHECK-NEXT: call void @llvm.donothing()
100
- ; CHECK-NEXT: [[TMP3:%.*]] = or i64 [[TMP1]], [[TMP2]]
101
- ; CHECK-NEXT: [[TMP4:%.*]] = icmp ne i64 [[TMP3]], 0
102
- ; CHECK-NEXT: [[TMP5:%.*]] = insertvalue { i64, i1 } poison, i64 [[TMP3]], 0
103
- ; CHECK-NEXT: [[TMP6:%.*]] = insertvalue { i64, i1 } [[TMP5]], i1 [[TMP4]], 1
120
+ ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[TMP1]], 0
121
+ ; CHECK-NEXT: [[_MSCMP1:%.*]] = icmp ne i64 [[TMP2]], 0
122
+ ; CHECK-NEXT: [[_MSOR:%.*]] = or i1 [[_MSCMP]], [[_MSCMP1]]
123
+ ; CHECK-NEXT: br i1 [[_MSOR]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF0]]
124
+ ; CHECK: 3:
125
+ ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
126
+ ; CHECK-NEXT: unreachable
127
+ ; CHECK: 4:
104
128
; CHECK-NEXT: [[RES:%.*]] = call { i64, i1 } @llvm.usub.with.overflow.i64(i64 [[A]], i64 [[B]])
105
- ; CHECK-NEXT: store { i64, i1 } [[TMP6]] , ptr @__msan_retval_tls, align 8
129
+ ; CHECK-NEXT: store { i64, i1 } zeroinitializer , ptr @__msan_retval_tls, align 8
106
130
; CHECK-NEXT: ret { i64, i1 } [[RES]]
107
131
;
108
132
%res = call { i64 , i1 } @llvm.usub.with.overflow.i64 (i64 %a , i64 %b )
@@ -115,16 +139,25 @@ define {<4 x i32>, <4 x i1>} @test_sadd_with_overflow_vec(<4 x i32> %a, <4 x i32
115
139
; CHECK-NEXT: [[TMP1:%.*]] = load <4 x i32>, ptr @__msan_param_tls, align 8
116
140
; CHECK-NEXT: [[TMP2:%.*]] = load <4 x i32>, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_param_tls to i64), i64 16) to ptr), align 8
117
141
; CHECK-NEXT: call void @llvm.donothing()
118
- ; CHECK-NEXT: [[TMP3:%.*]] = or <4 x i32> [[TMP1]], [[TMP2]]
119
- ; CHECK-NEXT: [[TMP4:%.*]] = icmp ne <4 x i32> [[TMP3]], zeroinitializer
120
- ; CHECK-NEXT: [[TMP5:%.*]] = insertvalue { <4 x i32>, <4 x i1> } poison, <4 x i32> [[TMP3]], 0
121
- ; CHECK-NEXT: [[TMP6:%.*]] = insertvalue { <4 x i32>, <4 x i1> } [[TMP5]], <4 x i1> [[TMP4]], 1
142
+ ; CHECK-NEXT: [[TMP3:%.*]] = bitcast <4 x i32> [[TMP1]] to i128
143
+ ; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i128 [[TMP3]], 0
144
+ ; CHECK-NEXT: [[TMP4:%.*]] = bitcast <4 x i32> [[TMP2]] to i128
145
+ ; CHECK-NEXT: [[_MSCMP1:%.*]] = icmp ne i128 [[TMP4]], 0
146
+ ; CHECK-NEXT: [[_MSOR:%.*]] = or i1 [[_MSCMP]], [[_MSCMP1]]
147
+ ; CHECK-NEXT: br i1 [[_MSOR]], label [[TMP5:%.*]], label [[TMP6:%.*]], !prof [[PROF0]]
148
+ ; CHECK: 5:
149
+ ; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]
150
+ ; CHECK-NEXT: unreachable
151
+ ; CHECK: 6:
122
152
; CHECK-NEXT: [[RES:%.*]] = call { <4 x i32>, <4 x i1> } @llvm.sadd.with.overflow.v4i32(<4 x i32> [[A]], <4 x i32> [[B]])
123
- ; CHECK-NEXT: store { <4 x i32>, <4 x i1> } [[TMP6]] , ptr @__msan_retval_tls, align 8
153
+ ; CHECK-NEXT: store { <4 x i32>, <4 x i1> } zeroinitializer , ptr @__msan_retval_tls, align 8
124
154
; CHECK-NEXT: ret { <4 x i32>, <4 x i1> } [[RES]]
125
155
;
126
156
%res = call { <4 x i32 >, <4 x i1 > } @llvm.sadd.with.overflow.v4i32 (<4 x i32 > %a , <4 x i32 > %b )
127
157
ret { <4 x i32 >, <4 x i1 > } %res
128
158
}
129
159
130
160
attributes #0 = { sanitize_memory }
161
+ ;.
162
+ ; CHECK: [[PROF0]] = !{!"branch_weights", i32 1, i32 1000}
163
+ ;.
0 commit comments