@@ -471,3 +471,80 @@ size_t test9(struct annotated_sized_ptr *p, int index) {
471
471
size_t test10 (struct annotated_sized_ptr * p , int index ) {
472
472
return __bdos (& ((unsigned int * ) p -> buf )[index ]);
473
473
}
474
+
475
+ struct pr151236_struct {
476
+ int * a __counted_by (a_count );
477
+ short a_count ;
478
+ };
479
+
480
+ // SANITIZE-WITH-ATTR-LABEL: define dso_local range(i64 -262144, 262137) i64 @test11(
481
+ // SANITIZE-WITH-ATTR-SAME: ptr noundef [[P:%.*]]) local_unnamed_addr #[[ATTR0]] {
482
+ // SANITIZE-WITH-ATTR-NEXT: entry:
483
+ // SANITIZE-WITH-ATTR-NEXT: [[COUNTED_BY_GEP:%.*]] = getelementptr inbounds nuw i8, ptr [[P]], i64 8
484
+ // SANITIZE-WITH-ATTR-NEXT: [[COUNTED_BY_LOAD:%.*]] = load i16, ptr [[COUNTED_BY_GEP]], align 4
485
+ // SANITIZE-WITH-ATTR-NEXT: [[TMP0:%.*]] = icmp sgt i16 [[COUNTED_BY_LOAD]], -1
486
+ // SANITIZE-WITH-ATTR-NEXT: [[COUNT:%.*]] = sext i16 [[COUNTED_BY_LOAD]] to i64
487
+ // SANITIZE-WITH-ATTR-NEXT: [[ARRAY_SIZE:%.*]] = shl nsw i64 [[COUNT]], 3
488
+ // SANITIZE-WITH-ATTR-NEXT: [[TMP1:%.*]] = select i1 [[TMP0]], i64 [[ARRAY_SIZE]], i64 0
489
+ // SANITIZE-WITH-ATTR-NEXT: ret i64 [[TMP1]]
490
+ //
491
+ // NO-SANITIZE-WITH-ATTR-LABEL: define dso_local range(i64 -262144, 262137) i64 @test11(
492
+ // NO-SANITIZE-WITH-ATTR-SAME: ptr noundef readonly captures(none) [[P:%.*]]) local_unnamed_addr #[[ATTR1]] {
493
+ // NO-SANITIZE-WITH-ATTR-NEXT: entry:
494
+ // NO-SANITIZE-WITH-ATTR-NEXT: [[COUNTED_BY_GEP:%.*]] = getelementptr inbounds nuw i8, ptr [[P]], i64 8
495
+ // NO-SANITIZE-WITH-ATTR-NEXT: [[COUNTED_BY_LOAD:%.*]] = load i16, ptr [[COUNTED_BY_GEP]], align 4
496
+ // NO-SANITIZE-WITH-ATTR-NEXT: [[COUNT:%.*]] = sext i16 [[COUNTED_BY_LOAD]] to i64
497
+ // NO-SANITIZE-WITH-ATTR-NEXT: [[ARRAY_SIZE:%.*]] = shl nsw i64 [[COUNT]], 3
498
+ // NO-SANITIZE-WITH-ATTR-NEXT: [[TMP0:%.*]] = icmp sgt i16 [[COUNTED_BY_LOAD]], -1
499
+ // NO-SANITIZE-WITH-ATTR-NEXT: [[TMP1:%.*]] = select i1 [[TMP0]], i64 [[ARRAY_SIZE]], i64 0
500
+ // NO-SANITIZE-WITH-ATTR-NEXT: ret i64 [[TMP1]]
501
+ //
502
+ // SANITIZE-WITHOUT-ATTR-LABEL: define dso_local range(i64 0, -1) i64 @test11(
503
+ // SANITIZE-WITHOUT-ATTR-SAME: ptr noundef [[P:%.*]]) local_unnamed_addr #[[ATTR0]] {
504
+ // SANITIZE-WITHOUT-ATTR-NEXT: entry:
505
+ // SANITIZE-WITHOUT-ATTR-NEXT: ret i64 -2
506
+ //
507
+ // NO-SANITIZE-WITHOUT-ATTR-LABEL: define dso_local range(i64 0, -1) i64 @test11(
508
+ // NO-SANITIZE-WITHOUT-ATTR-SAME: ptr noundef readonly captures(none) [[P:%.*]]) local_unnamed_addr #[[ATTR1]] {
509
+ // NO-SANITIZE-WITHOUT-ATTR-NEXT: entry:
510
+ // NO-SANITIZE-WITHOUT-ATTR-NEXT: ret i64 -2
511
+ //
512
+ size_t test11 (struct pr151236_struct * p ) {
513
+ return __bdos (p -> a ) + __bdos ((p -> a ));
514
+ }
515
+
516
+ // SANITIZE-WITH-ATTR-LABEL: define dso_local range(i64 -262144, 262137) i64 @test12(
517
+ // SANITIZE-WITH-ATTR-SAME: ptr noundef [[P:%.*]]) local_unnamed_addr #[[ATTR0]] {
518
+ // SANITIZE-WITH-ATTR-NEXT: entry:
519
+ // SANITIZE-WITH-ATTR-NEXT: [[COUNTED_BY_GEP:%.*]] = getelementptr inbounds nuw i8, ptr [[P]], i64 8
520
+ // SANITIZE-WITH-ATTR-NEXT: [[COUNTED_BY_LOAD:%.*]] = load i16, ptr [[COUNTED_BY_GEP]], align 4
521
+ // SANITIZE-WITH-ATTR-NEXT: [[TMP0:%.*]] = icmp sgt i16 [[COUNTED_BY_LOAD]], -1
522
+ // SANITIZE-WITH-ATTR-NEXT: [[COUNT:%.*]] = sext i16 [[COUNTED_BY_LOAD]] to i64
523
+ // SANITIZE-WITH-ATTR-NEXT: [[ARRAY_SIZE:%.*]] = shl nsw i64 [[COUNT]], 3
524
+ // SANITIZE-WITH-ATTR-NEXT: [[TMP1:%.*]] = select i1 [[TMP0]], i64 [[ARRAY_SIZE]], i64 0
525
+ // SANITIZE-WITH-ATTR-NEXT: ret i64 [[TMP1]]
526
+ //
527
+ // NO-SANITIZE-WITH-ATTR-LABEL: define dso_local range(i64 -262144, 262137) i64 @test12(
528
+ // NO-SANITIZE-WITH-ATTR-SAME: ptr noundef readonly captures(none) [[P:%.*]]) local_unnamed_addr #[[ATTR1]] {
529
+ // NO-SANITIZE-WITH-ATTR-NEXT: entry:
530
+ // NO-SANITIZE-WITH-ATTR-NEXT: [[COUNTED_BY_GEP:%.*]] = getelementptr inbounds nuw i8, ptr [[P]], i64 8
531
+ // NO-SANITIZE-WITH-ATTR-NEXT: [[COUNTED_BY_LOAD:%.*]] = load i16, ptr [[COUNTED_BY_GEP]], align 4
532
+ // NO-SANITIZE-WITH-ATTR-NEXT: [[COUNT:%.*]] = sext i16 [[COUNTED_BY_LOAD]] to i64
533
+ // NO-SANITIZE-WITH-ATTR-NEXT: [[ARRAY_SIZE:%.*]] = shl nsw i64 [[COUNT]], 3
534
+ // NO-SANITIZE-WITH-ATTR-NEXT: [[TMP0:%.*]] = icmp sgt i16 [[COUNTED_BY_LOAD]], -1
535
+ // NO-SANITIZE-WITH-ATTR-NEXT: [[TMP1:%.*]] = select i1 [[TMP0]], i64 [[ARRAY_SIZE]], i64 0
536
+ // NO-SANITIZE-WITH-ATTR-NEXT: ret i64 [[TMP1]]
537
+ //
538
+ // SANITIZE-WITHOUT-ATTR-LABEL: define dso_local range(i64 0, -1) i64 @test12(
539
+ // SANITIZE-WITHOUT-ATTR-SAME: ptr noundef [[P:%.*]]) local_unnamed_addr #[[ATTR0]] {
540
+ // SANITIZE-WITHOUT-ATTR-NEXT: entry:
541
+ // SANITIZE-WITHOUT-ATTR-NEXT: ret i64 -2
542
+ //
543
+ // NO-SANITIZE-WITHOUT-ATTR-LABEL: define dso_local range(i64 0, -1) i64 @test12(
544
+ // NO-SANITIZE-WITHOUT-ATTR-SAME: ptr noundef readonly captures(none) [[P:%.*]]) local_unnamed_addr #[[ATTR1]] {
545
+ // NO-SANITIZE-WITHOUT-ATTR-NEXT: entry:
546
+ // NO-SANITIZE-WITHOUT-ATTR-NEXT: ret i64 -2
547
+ //
548
+ size_t test12 (struct pr151236_struct * p ) {
549
+ return __bdos (p -> a ) + __bdos (((int * )p -> a ));
550
+ }
0 commit comments