@@ -2141,3 +2141,72 @@ struct multi_subscripts {
21412141size_t test34 (struct multi_subscripts * ptr , int idx1 , int idx2 ) {
21422142 return __bdos (& ptr -> flags [idx1 ][idx2 ]);
21432143}
2144+
2145+ // SANITIZE-WITH-ATTR-LABEL: define dso_local void @test35(
2146+ // SANITIZE-WITH-ATTR-SAME: ptr noundef [[P:%.*]], i64 noundef [[INDEX:%.*]]) local_unnamed_addr #[[ATTR0]] {
2147+ // SANITIZE-WITH-ATTR-NEXT: entry:
2148+ // SANITIZE-WITH-ATTR-NEXT: [[DOTCOUNTED_BY_GEP:%.*]] = getelementptr inbounds nuw i8, ptr [[P]], i64 8
2149+ // SANITIZE-WITH-ATTR-NEXT: [[DOTCOUNTED_BY_LOAD:%.*]] = load i32, ptr [[DOTCOUNTED_BY_GEP]], align 4
2150+ // SANITIZE-WITH-ATTR-NEXT: [[TMP0:%.*]] = zext i32 [[DOTCOUNTED_BY_LOAD]] to i64, !nosanitize [[META2]]
2151+ // SANITIZE-WITH-ATTR-NEXT: [[TMP1:%.*]] = icmp ult i64 [[INDEX]], [[TMP0]], !nosanitize [[META2]]
2152+ // SANITIZE-WITH-ATTR-NEXT: br i1 [[TMP1]], label [[CONT3:%.*]], label [[HANDLER_OUT_OF_BOUNDS:%.*]], !prof [[PROF3]], !nosanitize [[META2]]
2153+ // SANITIZE-WITH-ATTR: handler.out_of_bounds:
2154+ // SANITIZE-WITH-ATTR-NEXT: tail call void @__ubsan_handle_out_of_bounds_abort(ptr nonnull @[[GLOB53:[0-9]+]], i64 [[INDEX]]) #[[ATTR7]], !nosanitize [[META2]]
2155+ // SANITIZE-WITH-ATTR-NEXT: unreachable, !nosanitize [[META2]]
2156+ // SANITIZE-WITH-ATTR: cont3:
2157+ // SANITIZE-WITH-ATTR-NEXT: [[ARRAY:%.*]] = getelementptr inbounds nuw i8, ptr [[P]], i64 12
2158+ // SANITIZE-WITH-ATTR-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds nuw [0 x i32], ptr [[ARRAY]], i64 0, i64 [[INDEX]]
2159+ // SANITIZE-WITH-ATTR-NEXT: store i32 0, ptr [[ARRAYIDX]], align 4, !tbaa [[TBAA4]]
2160+ // SANITIZE-WITH-ATTR-NEXT: ret void
2161+ //
2162+ // NO-SANITIZE-WITH-ATTR-LABEL: define dso_local void @test35(
2163+ // NO-SANITIZE-WITH-ATTR-SAME: ptr nocapture noundef writeonly [[P:%.*]], i64 noundef [[INDEX:%.*]]) local_unnamed_addr #[[ATTR0]] {
2164+ // NO-SANITIZE-WITH-ATTR-NEXT: entry:
2165+ // NO-SANITIZE-WITH-ATTR-NEXT: [[ARRAY:%.*]] = getelementptr inbounds nuw i8, ptr [[P]], i64 12
2166+ // NO-SANITIZE-WITH-ATTR-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds nuw [0 x i32], ptr [[ARRAY]], i64 0, i64 [[INDEX]]
2167+ // NO-SANITIZE-WITH-ATTR-NEXT: store i32 0, ptr [[ARRAYIDX]], align 4, !tbaa [[TBAA2]]
2168+ // NO-SANITIZE-WITH-ATTR-NEXT: ret void
2169+ //
2170+ // SANITIZE-WITHOUT-ATTR-LABEL: define dso_local void @test35(
2171+ // SANITIZE-WITHOUT-ATTR-SAME: ptr noundef [[P:%.*]], i64 noundef [[INDEX:%.*]]) local_unnamed_addr #[[ATTR0]] {
2172+ // SANITIZE-WITHOUT-ATTR-NEXT: entry:
2173+ // SANITIZE-WITHOUT-ATTR-NEXT: [[ARRAY:%.*]] = getelementptr inbounds nuw i8, ptr [[P]], i64 12
2174+ // SANITIZE-WITHOUT-ATTR-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds nuw [0 x i32], ptr [[ARRAY]], i64 0, i64 [[INDEX]]
2175+ // SANITIZE-WITHOUT-ATTR-NEXT: store i32 0, ptr [[ARRAYIDX]], align 4, !tbaa [[TBAA2]]
2176+ // SANITIZE-WITHOUT-ATTR-NEXT: ret void
2177+ //
2178+ // NO-SANITIZE-WITHOUT-ATTR-LABEL: define dso_local void @test35(
2179+ // NO-SANITIZE-WITHOUT-ATTR-SAME: ptr nocapture noundef writeonly [[P:%.*]], i64 noundef [[INDEX:%.*]]) local_unnamed_addr #[[ATTR0]] {
2180+ // NO-SANITIZE-WITHOUT-ATTR-NEXT: entry:
2181+ // NO-SANITIZE-WITHOUT-ATTR-NEXT: [[ARRAY:%.*]] = getelementptr inbounds nuw i8, ptr [[P]], i64 12
2182+ // NO-SANITIZE-WITHOUT-ATTR-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds nuw [0 x i32], ptr [[ARRAY]], i64 0, i64 [[INDEX]]
2183+ // NO-SANITIZE-WITHOUT-ATTR-NEXT: store i32 0, ptr [[ARRAYIDX]], align 4, !tbaa [[TBAA2]]
2184+ // NO-SANITIZE-WITHOUT-ATTR-NEXT: ret void
2185+ //
2186+ void test35 (struct annotated * p , size_t index ) {
2187+ p -> array [index ] = __bdos (& p -> array [-42 ]);
2188+ }
2189+
2190+ // SANITIZE-WITH-ATTR-LABEL: define dso_local noundef i64 @test35_bdos(
2191+ // SANITIZE-WITH-ATTR-SAME: ptr nocapture noundef readnone [[P:%.*]]) local_unnamed_addr #[[ATTR2]] {
2192+ // SANITIZE-WITH-ATTR-NEXT: entry:
2193+ // SANITIZE-WITH-ATTR-NEXT: ret i64 0
2194+ //
2195+ // NO-SANITIZE-WITH-ATTR-LABEL: define dso_local noundef i64 @test35_bdos(
2196+ // NO-SANITIZE-WITH-ATTR-SAME: ptr nocapture noundef readnone [[P:%.*]]) local_unnamed_addr #[[ATTR3]] {
2197+ // NO-SANITIZE-WITH-ATTR-NEXT: entry:
2198+ // NO-SANITIZE-WITH-ATTR-NEXT: ret i64 0
2199+ //
2200+ // SANITIZE-WITHOUT-ATTR-LABEL: define dso_local noundef i64 @test35_bdos(
2201+ // SANITIZE-WITHOUT-ATTR-SAME: ptr nocapture noundef readnone [[P:%.*]]) local_unnamed_addr #[[ATTR2]] {
2202+ // SANITIZE-WITHOUT-ATTR-NEXT: entry:
2203+ // SANITIZE-WITHOUT-ATTR-NEXT: ret i64 0
2204+ //
2205+ // NO-SANITIZE-WITHOUT-ATTR-LABEL: define dso_local noundef i64 @test35_bdos(
2206+ // NO-SANITIZE-WITHOUT-ATTR-SAME: ptr nocapture noundef readnone [[P:%.*]]) local_unnamed_addr #[[ATTR1]] {
2207+ // NO-SANITIZE-WITHOUT-ATTR-NEXT: entry:
2208+ // NO-SANITIZE-WITHOUT-ATTR-NEXT: ret i64 0
2209+ //
2210+ size_t test35_bdos (struct annotated * p ) {
2211+ return __bdos (& p -> array [-42 ]);
2212+ }
0 commit comments