Index: test/Transforms/NaCl/expand-indirectbr.ll |
diff --git a/test/Transforms/NaCl/expand-indirectbr.ll b/test/Transforms/NaCl/expand-indirectbr.ll |
new file mode 100644 |
index 0000000000000000000000000000000000000000..5ca53371700ae21c4b08a7c2a499549d96c6cd3e |
--- /dev/null |
+++ b/test/Transforms/NaCl/expand-indirectbr.ll |
@@ -0,0 +1,62 @@ |
+; RUN: opt %s -expand-indirectbr -S | FileCheck %s |
+ |
+ |
+@addresses = global [2 x i8*] |
+ [i8* blockaddress(@indirectbr_example, %label1), |
+ i8* blockaddress(@indirectbr_example, %label2)] |
+; CHECK: @addresses = global [2 x i8*] [i8* inttoptr (i32 1 to i8*), i8* inttoptr (i32 2 to i8*)] |
+ |
+ |
+define i32 @indirectbr_example(i8* %addr) { |
+ indirectbr i8* %addr, [label %label1, label %label2] |
+label1: |
+ ret i32 100 |
+label2: |
+ ret i32 200 |
+} |
+; CHECK: define i32 @indirectbr_example |
+; CHECK-NEXT: %indirectbr_cast = ptrtoint i8* %addr to i32 |
+; CHECK-NEXT: switch i32 %indirectbr_cast, label %indirectbr_default [ |
+; CHECK-NEXT: i32 1, label %label1 |
+; CHECK-NEXT: i32 2, label %label2 |
+; CHECK-NEXT: ] |
+; CHECK: indirectbr_default: |
+; CHECK-NEXT: unreachable |
+ |
+ |
+define i32 @label_appears_twice(i8* %addr) { |
+entry: |
+ indirectbr i8* %addr, [label %label, label %label] |
+label: |
+ %val = phi i32 [ 123, %entry ], [ 123, %entry ] |
+ ret i32 %val |
+} |
+; CHECK: define i32 @label_appears_twice |
+; CHECK: switch i32 %indirectbr_cast, label %indirectbr_default [ |
+; CHECK-NEXT: i32 1, label %label |
+; CHECK-NEXT: ] |
+; CHECK: %val = phi i32 [ 123, %entry ] |
+ |
+ |
+define i8* @unused_blockaddress() { |
+ ret i8* blockaddress (@unused_blockaddress, %dead_label) |
+dead_label: |
+ ret i8* null |
+} |
+; CHECK: define i8* @unused_blockaddress |
+; CHECK-NEXT: ret i8* inttoptr (i32 -1 to i8*) |
+ |
+ |
+; Check that the label is given a consistent switch value across all |
+; indirectbr expansions. |
+define i32 @multiple_indirectbr(i8* %addr) { |
+ indirectbr i8* %addr, [label %label] |
+ indirectbr i8* %addr, [label %label] |
+label: |
+ ret i32 100 |
+} |
+; CHECK: define i32 @multiple_indirectbr |
+; CHECK: switch i32 %indirectbr_cast{{[0-9]*}}, label %indirectbr_default [ |
+; CHECK-NEXT: i32 1, label %label |
+; CHECK: switch i32 %indirectbr_cast{{[0-9]*}}, label %indirectbr_default [ |
+; CHECK-NEXT: i32 1, label %label |