1 // RUN: %clang_analyze_cc1 %s \
2 // RUN: -analyzer-checker=core,alpha.security.ArrayBoundV2 \
3 // RUN: -analyzer-checker=debug.ExprInspection \
4 // RUN: -triple x86_64-unknown-linux-gnu \
7 // This test is here to check if there is no significant run-time regression
8 // related to the assume machinery. The analysis should finish in less than 10
11 // expected-no-diagnostics
13 typedef unsigned char uint8_t;
14 typedef unsigned short uint16_t;
15 typedef unsigned long uint64_t;
17 int filter_slice_word(int sat_linesize
, int sigma
, int radius
, uint64_t *sat
,
18 uint64_t *square_sat
, int width
, int height
,
19 int src_linesize
, int dst_linesize
, const uint16_t *src
,
20 uint16_t *dst
, int jobnr
, int nb_jobs
) {
21 const int starty
= height
* jobnr
/ nb_jobs
;
22 const int endy
= height
* (jobnr
+ 1) / nb_jobs
;
24 for (int y
= starty
; y
< endy
; y
++) {
26 int lower_y
= y
- radius
< 0 ? 0 : y
- radius
;
27 int higher_y
= y
+ radius
+ 1 > height
? height
: y
+ radius
+ 1;
28 int dist_y
= higher_y
- lower_y
;
30 for (int x
= 0; x
< width
; x
++) {
32 int lower_x
= x
- radius
< 0 ? 0 : x
- radius
;
33 int higher_x
= x
+ radius
+ 1 > width
? width
: x
+ radius
+ 1;
34 int count
= dist_y
* (higher_x
- lower_x
);
36 // The below hunk caused significant regression in run-time.
38 uint64_t sum
= sat
[higher_y
* sat_linesize
+ higher_x
] -
39 sat
[higher_y
* sat_linesize
+ lower_x
] -
40 sat
[lower_y
* sat_linesize
+ higher_x
] +
41 sat
[lower_y
* sat_linesize
+ lower_x
];
42 uint64_t square_sum
= square_sat
[higher_y
* sat_linesize
+ higher_x
] -
43 square_sat
[higher_y
* sat_linesize
+ lower_x
] -
44 square_sat
[lower_y
* sat_linesize
+ higher_x
] +
45 square_sat
[lower_y
* sat_linesize
+ lower_x
];
46 uint64_t mean
= sum
/ count
;
47 uint64_t var
= (square_sum
- sum
* sum
/ count
) / count
;
48 dst
[y
* dst_linesize
+ x
] =
49 (sigma
* mean
+ var
* src
[y
* src_linesize
+ x
]) / (sigma
+ var
);