Index: tests_lit/llvm2ice_tests/ias-multi-reloc.ll |
diff --git a/tests_lit/llvm2ice_tests/ias-multi-reloc.ll b/tests_lit/llvm2ice_tests/ias-multi-reloc.ll |
new file mode 100644 |
index 0000000000000000000000000000000000000000..4e25c66328198ea8ee8d060eb439558dc122f028 |
--- /dev/null |
+++ b/tests_lit/llvm2ice_tests/ias-multi-reloc.ll |
@@ -0,0 +1,61 @@ |
+; Tests the integrated assembler for instructions with multiple |
+; relocations. |
+ |
+; RUN: %p2i -i %s --args -O2 | 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(i32) |
+ |
+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 |
+ |
+define internal void @add_in_place() { |
+entry: |
+ %p_global_char.bc = bitcast [4 x i8]* @p_global_char to i32* |
+ %0 = load 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 global_char |
+; CHECK: .long p_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* %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 |
+ %dummy.bc = bitcast void (i32)* @dummy to void ()* |
+ tail call void %dummy.bc() |
+ 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: call dummy |