1 // NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 2 2 // RUN: %clang_cc1 -triple x86_64-linux-gnu -O2 -emit-llvm -o - %s | FileCheck %s 3 4 struct Tail { 5 ~Tail(); 6 int a : 16; 7 int b : 8; 8 }; 9 10 struct Char { 11 int a : 16; 12 int b : 8; 13 char c; 14 }; 15 16 struct Int { 17 int a : 16; 18 int b : 8; 19 int c; 20 }; 21 22 23 // CHECK-LABEL: define dso_local void @_Z1AP4Tail 24 // CHECK-SAME: (ptr noundef captures(none) [[P:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] { 25 // CHECK-NEXT: entry: 26 // CHECK-NEXT: [[BF_LOAD:%.*]] = load i16, ptr [[P]], align 4 27 // CHECK-NEXT: [[INC:%.*]] = add i16 [[BF_LOAD]], 1 28 // CHECK-NEXT: store i16 [[INC]], ptr [[P]], align 4 29 // CHECK-NEXT: ret void 30 // 31 void A (Tail *p) { 32 p->a++; 33 } 34 35 // CHECK-LABEL: define dso_local void @_Z1BP4Tail 36 // CHECK-SAME: (ptr noundef captures(none) [[P:%.*]]) local_unnamed_addr #[[ATTR0]] { 37 // CHECK-NEXT: entry: 38 // CHECK-NEXT: [[B:%.*]] = getelementptr inbounds nuw i8, ptr [[P]], i64 2 39 // CHECK-NEXT: [[BF_LOAD:%.*]] = load i8, ptr [[B]], align 2 40 // CHECK-NEXT: [[INC:%.*]] = add i8 [[BF_LOAD]], 1 41 // CHECK-NEXT: store i8 [[INC]], ptr [[B]], align 2 42 // CHECK-NEXT: ret void 43 // 44 void B (Tail *p) { 45 p->b++; 46 } 47 48 // CHECK-LABEL: define dso_local void @_Z1AP4Char 49 // CHECK-SAME: (ptr noundef captures(none) [[P:%.*]]) local_unnamed_addr #[[ATTR0]] { 50 // CHECK-NEXT: entry: 51 // CHECK-NEXT: [[BF_LOAD:%.*]] = load i16, ptr [[P]], align 4 52 // CHECK-NEXT: [[INC:%.*]] = add i16 [[BF_LOAD]], 1 53 // CHECK-NEXT: store i16 [[INC]], ptr [[P]], align 4 54 // CHECK-NEXT: ret void 55 // 56 void A (Char *p) { 57 p->a++; 58 } 59 60 // CHECK-LABEL: define dso_local void @_Z1BP4Char 61 // CHECK-SAME: (ptr noundef captures(none) [[P:%.*]]) local_unnamed_addr #[[ATTR0]] { 62 // CHECK-NEXT: entry: 63 // CHECK-NEXT: [[B:%.*]] = getelementptr inbounds nuw i8, ptr [[P]], i64 2 64 // CHECK-NEXT: [[BF_LOAD:%.*]] = load i8, ptr [[B]], align 2 65 // CHECK-NEXT: [[INC:%.*]] = add i8 [[BF_LOAD]], 1 66 // CHECK-NEXT: store i8 [[INC]], ptr [[B]], align 2 67 // CHECK-NEXT: ret void 68 // 69 void B (Char *p) { 70 p->b++; 71 } 72 73 // CHECK-LABEL: define dso_local void @_Z1AP3Int 74 // CHECK-SAME: (ptr noundef captures(none) [[P:%.*]]) local_unnamed_addr #[[ATTR0]] { 75 // CHECK-NEXT: entry: 76 // CHECK-NEXT: [[BF_LOAD:%.*]] = load i32, ptr [[P]], align 4 77 // CHECK-NEXT: [[INC:%.*]] = add i32 [[BF_LOAD]], 1 78 // CHECK-NEXT: [[BF_VALUE:%.*]] = and i32 [[INC]], 65535 79 // CHECK-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_LOAD]], -65536 80 // CHECK-NEXT: [[BF_SET:%.*]] = or disjoint i32 [[BF_VALUE]], [[BF_CLEAR]] 81 // CHECK-NEXT: store i32 [[BF_SET]], ptr [[P]], align 4 82 // CHECK-NEXT: ret void 83 // 84 void A (Int *p) { 85 p->a++; 86 } 87 88 // CHECK-LABEL: define dso_local void @_Z1BP3Int 89 // CHECK-SAME: (ptr noundef captures(none) [[P:%.*]]) local_unnamed_addr #[[ATTR0]] { 90 // CHECK-NEXT: entry: 91 // CHECK-NEXT: [[BF_LOAD:%.*]] = load i32, ptr [[P]], align 4 92 // CHECK-NEXT: [[BF_VALUE:%.*]] = add i32 [[BF_LOAD]], 65536 93 // CHECK-NEXT: [[BF_SHL2:%.*]] = and i32 [[BF_VALUE]], 16711680 94 // CHECK-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_LOAD]], -16711681 95 // CHECK-NEXT: [[BF_SET:%.*]] = or disjoint i32 [[BF_SHL2]], [[BF_CLEAR]] 96 // CHECK-NEXT: store i32 [[BF_SET]], ptr [[P]], align 4 97 // CHECK-NEXT: ret void 98 // 99 void B (Int *p) { 100 p->b++; 101 } 102