| ; Tests the integrated assembler for instructions with multiple |
| ; relocations. |
| |
| ; RUN: %if --need=allow_dump --command %p2i -i %s --args -O2 \ |
| ; RUN: -allow-externally-defined-symbols \ |
| ; RUN: | %if --need=allow_dump --command FileCheck %s |
| |
| ; char global_char; |
| ; char *p_global_char; |
| ; void dummy(); |
| ; void store_immediate_to_global() { p_global_char = &global_char; } |
| ; void add_in_place() { p_global_char += (int)&global_char; } |
| ; void cmp_global_immediate() { if (p_global_char == &global_char) dummy(); } |
| |
| @global_char = internal global [1 x i8] zeroinitializer, align 1 |
| @p_global_char = internal global [4 x i8] zeroinitializer, align 4 |
| declare void @dummy() |
| |
| define internal void @store_immediate_to_global() { |
| entry: |
| %p_global_char.bc = bitcast [4 x i8]* @p_global_char to i32* |
| %expanded1 = ptrtoint [1 x i8]* @global_char to i32 |
| store i32 %expanded1, i32* %p_global_char.bc, align 1 |
| ret void |
| } |
| ; CHECK-LABEL: store_immediate_to_global |
| ; CHECK: .long p_global_char |
| ; CHECK: .long global_char |
| |
| ; Also exercises the RMW add operation. |
| define internal void @add_in_place() { |
| entry: |
| %p_global_char.bc = bitcast [4 x i8]* @p_global_char to i32* |
| %0 = load i32, i32* %p_global_char.bc, align 1 |
| %expanded1 = ptrtoint [1 x i8]* @global_char to i32 |
| %gep = add i32 %0, %expanded1 |
| %p_global_char.bc3 = bitcast [4 x i8]* @p_global_char to i32* |
| store i32 %gep, i32* %p_global_char.bc3, align 1 |
| ret void |
| } |
| ; CHECK-LABEL: add_in_place |
| ; CHECK: .long p_global_char |
| ; CHECK-NEXT: .long global_char |
| |
| define internal void @cmp_global_immediate() { |
| entry: |
| %p_global_char.bc = bitcast [4 x i8]* @p_global_char to i32* |
| %0 = load i32, i32* %p_global_char.bc, align 1 |
| %expanded1 = ptrtoint [1 x i8]* @global_char to i32 |
| %cmp = icmp eq i32 %0, %expanded1 |
| br i1 %cmp, label %if.then, label %if.end |
| |
| if.then: ; preds = %entry |
| tail call void @dummy() |
| br label %if.end |
| |
| if.end: ; preds = %if.then, %entry |
| ret void |
| } |
| ; CHECK-LABEL: cmp_global_immediate |
| ; CHECK: .long p_global_char |
| ; CHECK: .long global_char |
| ; CHECK: .long dummy |