@@ -1906,3 +1906,51 @@ struct test30_struct {
1906
1906
void test30 (struct test30_struct * ptr , int idx ) {
1907
1907
ptr -> pcpu_refcnt .__padding [idx ] = __builtin_dynamic_object_size (ptr , 1 );
1908
1908
}
1909
+
1910
+ struct test31_empty {};
1911
+
1912
+ struct test31_struct {
1913
+ struct test31_empty y ;
1914
+ int s ;
1915
+ int x [] __counted_by (s );
1916
+ };
1917
+
1918
+ // SANITIZE-WITH-ATTR-LABEL: define dso_local i32 @test31(
1919
+ // SANITIZE-WITH-ATTR-SAME: ptr nocapture noundef readonly [[PTR:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR2]] {
1920
+ // SANITIZE-WITH-ATTR-NEXT: entry:
1921
+ // SANITIZE-WITH-ATTR-NEXT: [[DOT_COUNTED_BY_LOAD:%.*]] = load i32, ptr [[PTR]], align 4
1922
+ // SANITIZE-WITH-ATTR-NEXT: [[TMP0:%.*]] = sext i32 [[DOT_COUNTED_BY_LOAD]] to i64
1923
+ // SANITIZE-WITH-ATTR-NEXT: [[TMP1:%.*]] = shl nsw i64 [[TMP0]], 2
1924
+ // SANITIZE-WITH-ATTR-NEXT: [[TMP2:%.*]] = tail call i64 @llvm.smax.i64(i64 [[TMP1]], i64 0)
1925
+ // SANITIZE-WITH-ATTR-NEXT: [[TMP3:%.*]] = trunc i64 [[TMP2]] to i32
1926
+ // SANITIZE-WITH-ATTR-NEXT: [[TMP4:%.*]] = add i32 [[TMP3]], 4
1927
+ // SANITIZE-WITH-ATTR-NEXT: [[DOTINV:%.*]] = icmp slt i32 [[DOT_COUNTED_BY_LOAD]], 0
1928
+ // SANITIZE-WITH-ATTR-NEXT: [[CONV:%.*]] = select i1 [[DOTINV]], i32 0, i32 [[TMP4]]
1929
+ // SANITIZE-WITH-ATTR-NEXT: ret i32 [[CONV]]
1930
+ //
1931
+ // NO-SANITIZE-WITH-ATTR-LABEL: define dso_local i32 @test31(
1932
+ // NO-SANITIZE-WITH-ATTR-SAME: ptr nocapture noundef readonly [[PTR:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR2]] {
1933
+ // NO-SANITIZE-WITH-ATTR-NEXT: entry:
1934
+ // NO-SANITIZE-WITH-ATTR-NEXT: [[DOT_COUNTED_BY_LOAD:%.*]] = load i32, ptr [[PTR]], align 4
1935
+ // NO-SANITIZE-WITH-ATTR-NEXT: [[TMP0:%.*]] = sext i32 [[DOT_COUNTED_BY_LOAD]] to i64
1936
+ // NO-SANITIZE-WITH-ATTR-NEXT: [[TMP1:%.*]] = shl nsw i64 [[TMP0]], 2
1937
+ // NO-SANITIZE-WITH-ATTR-NEXT: [[TMP2:%.*]] = tail call i64 @llvm.smax.i64(i64 [[TMP1]], i64 0)
1938
+ // NO-SANITIZE-WITH-ATTR-NEXT: [[TMP3:%.*]] = trunc i64 [[TMP2]] to i32
1939
+ // NO-SANITIZE-WITH-ATTR-NEXT: [[TMP4:%.*]] = add i32 [[TMP3]], 4
1940
+ // NO-SANITIZE-WITH-ATTR-NEXT: [[DOTINV:%.*]] = icmp slt i32 [[DOT_COUNTED_BY_LOAD]], 0
1941
+ // NO-SANITIZE-WITH-ATTR-NEXT: [[CONV:%.*]] = select i1 [[DOTINV]], i32 0, i32 [[TMP4]]
1942
+ // NO-SANITIZE-WITH-ATTR-NEXT: ret i32 [[CONV]]
1943
+ //
1944
+ // SANITIZE-WITHOUT-ATTR-LABEL: define dso_local i32 @test31(
1945
+ // SANITIZE-WITHOUT-ATTR-SAME: ptr noundef [[PTR:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR2]] {
1946
+ // SANITIZE-WITHOUT-ATTR-NEXT: entry:
1947
+ // SANITIZE-WITHOUT-ATTR-NEXT: ret i32 -1
1948
+ //
1949
+ // NO-SANITIZE-WITHOUT-ATTR-LABEL: define dso_local i32 @test31(
1950
+ // NO-SANITIZE-WITHOUT-ATTR-SAME: ptr noundef [[PTR:%.*]], i32 noundef [[IDX:%.*]]) local_unnamed_addr #[[ATTR1]] {
1951
+ // NO-SANITIZE-WITHOUT-ATTR-NEXT: entry:
1952
+ // NO-SANITIZE-WITHOUT-ATTR-NEXT: ret i32 -1
1953
+ //
1954
+ int test31 (struct test31_struct * ptr , int idx ) {
1955
+ return __builtin_dynamic_object_size (ptr , 0 );
1956
+ }
0 commit comments