OLD | NEW |
1 ; Tests the integrated assembler for instructions with multiple | 1 ; Tests the integrated assembler for instructions with multiple |
2 ; relocations. | 2 ; relocations. |
3 | 3 |
4 ; RUN: %if --need=allow_dump --command %p2i -i %s --args -O2 \ | 4 ; RUN: %if --need=allow_dump --command %p2i -i %s --args -O2 \ |
5 ; RUN: | %if --need=allow_dump --command FileCheck %s | 5 ; RUN: | %if --need=allow_dump --command FileCheck %s |
6 | 6 |
7 ; char global_char; | 7 ; char global_char; |
8 ; char *p_global_char; | 8 ; char *p_global_char; |
9 ; void dummy(); | 9 ; void dummy(); |
10 ; void store_immediate_to_global() { p_global_char = &global_char; } | 10 ; void store_immediate_to_global() { p_global_char = &global_char; } |
11 ; void add_in_place() { p_global_char += (int)&global_char; } | 11 ; void add_in_place() { p_global_char += (int)&global_char; } |
12 ; void cmp_global_immediate() { if (p_global_char == &global_char) dummy(); } | 12 ; void cmp_global_immediate() { if (p_global_char == &global_char) dummy(); } |
13 | 13 |
14 @global_char = internal global [1 x i8] zeroinitializer, align 1 | 14 @global_char = internal global [1 x i8] zeroinitializer, align 1 |
15 @p_global_char = internal global [4 x i8] zeroinitializer, align 4 | 15 @p_global_char = internal global [4 x i8] zeroinitializer, align 4 |
16 declare void @dummy() | 16 declare void @dummy() |
17 | 17 |
18 define internal void @store_immediate_to_global() { | 18 define internal void @store_immediate_to_global() { |
19 entry: | 19 entry: |
20 %p_global_char.bc = bitcast [4 x i8]* @p_global_char to i32* | 20 %p_global_char.bc = bitcast [4 x i8]* @p_global_char to i32* |
21 %expanded1 = ptrtoint [1 x i8]* @global_char to i32 | 21 %expanded1 = ptrtoint [1 x i8]* @global_char to i32 |
22 store i32 %expanded1, i32* %p_global_char.bc, align 1 | 22 store i32 %expanded1, i32* %p_global_char.bc, align 1 |
23 ret void | 23 ret void |
24 } | 24 } |
25 ; CHECK-LABEL: store_immediate_to_global | 25 ; CHECK-LABEL: store_immediate_to_global |
26 ; CHECK: .long p_global_char | 26 ; CHECK: .long p_global_char |
27 ; CHECK: .long global_char | 27 ; CHECK: .long global_char |
28 | 28 |
| 29 ; Also exercises the RMW add operation. |
29 define internal void @add_in_place() { | 30 define internal void @add_in_place() { |
30 entry: | 31 entry: |
31 %p_global_char.bc = bitcast [4 x i8]* @p_global_char to i32* | 32 %p_global_char.bc = bitcast [4 x i8]* @p_global_char to i32* |
32 %0 = load i32, i32* %p_global_char.bc, align 1 | 33 %0 = load i32, i32* %p_global_char.bc, align 1 |
33 %expanded1 = ptrtoint [1 x i8]* @global_char to i32 | 34 %expanded1 = ptrtoint [1 x i8]* @global_char to i32 |
34 %gep = add i32 %0, %expanded1 | 35 %gep = add i32 %0, %expanded1 |
35 %p_global_char.bc3 = bitcast [4 x i8]* @p_global_char to i32* | 36 %p_global_char.bc3 = bitcast [4 x i8]* @p_global_char to i32* |
36 store i32 %gep, i32* %p_global_char.bc3, align 1 | 37 store i32 %gep, i32* %p_global_char.bc3, align 1 |
37 ret void | 38 ret void |
38 } | 39 } |
39 ; CHECK-LABEL: add_in_place | 40 ; CHECK-LABEL: add_in_place |
40 ; CHECK: .long global_char | |
41 ; CHECK: .long p_global_char | 41 ; CHECK: .long p_global_char |
| 42 ; CHECK-NEXT: .long global_char |
42 | 43 |
43 define internal void @cmp_global_immediate() { | 44 define internal void @cmp_global_immediate() { |
44 entry: | 45 entry: |
45 %p_global_char.bc = bitcast [4 x i8]* @p_global_char to i32* | 46 %p_global_char.bc = bitcast [4 x i8]* @p_global_char to i32* |
46 %0 = load i32, i32* %p_global_char.bc, align 1 | 47 %0 = load i32, i32* %p_global_char.bc, align 1 |
47 %expanded1 = ptrtoint [1 x i8]* @global_char to i32 | 48 %expanded1 = ptrtoint [1 x i8]* @global_char to i32 |
48 %cmp = icmp eq i32 %0, %expanded1 | 49 %cmp = icmp eq i32 %0, %expanded1 |
49 br i1 %cmp, label %if.then, label %if.end | 50 br i1 %cmp, label %if.then, label %if.end |
50 | 51 |
51 if.then: ; preds = %entry | 52 if.then: ; preds = %entry |
52 tail call void @dummy() | 53 tail call void @dummy() |
53 br label %if.end | 54 br label %if.end |
54 | 55 |
55 if.end: ; preds = %if.then, %entry | 56 if.end: ; preds = %if.then, %entry |
56 ret void | 57 ret void |
57 } | 58 } |
58 ; CHECK-LABEL: cmp_global_immediate | 59 ; CHECK-LABEL: cmp_global_immediate |
59 ; CHECK: .long p_global_char | 60 ; CHECK: .long p_global_char |
60 ; CHECK: .long global_char | 61 ; CHECK: .long global_char |
61 ; CHECK: .long dummy | 62 ; CHECK: .long dummy |
OLD | NEW |