Index: test/NaCl/PNaClABI/abi-i1-operations.ll |
diff --git a/test/NaCl/PNaClABI/abi-i1-operations.ll b/test/NaCl/PNaClABI/abi-i1-operations.ll |
new file mode 100644 |
index 0000000000000000000000000000000000000000..7669c706f0e015e4dd899524adbf70aa7b7493e8 |
--- /dev/null |
+++ b/test/NaCl/PNaClABI/abi-i1-operations.ll |
@@ -0,0 +1,164 @@ |
+; RUN: not pnacl-abicheck < %s | FileCheck %s |
+ |
+; Most arithmetic operations are not very useful on i1, so use of i1 |
+; is restricted to a subset of operations. |
+ |
+ |
+; i1 is allowed on these bitwise operations because: |
+; * These operations never overflow. |
+; * They do get generated in practice for combining conditions. |
+define internal void @allowed_cases() { |
+ %and = and i1 0, 0 |
+ %or = or i1 0, 0 |
+ %xor = xor i1 0, 0 |
+ |
+ %v4and = and <4 x i1> undef, undef |
+ %v4or = or <4 x i1> undef, undef |
+ %v4xor = xor <4 x i1> undef, undef |
+ |
+ %v8and = and <8 x i1> undef, undef |
+ %v8or = or <8 x i1> undef, undef |
+ %v8xor = xor <8 x i1> undef, undef |
+ |
+ %v16and = and <16 x i1> undef, undef |
+ %v16or = or <16 x i1> undef, undef |
+ %v16xor = xor <16 x i1> undef, undef |
+ ret void |
+} |
+; CHECK-NOT: disallowed |
+ |
+ |
+define internal void @rejected_cases(i32 %ptr) { |
+ ; Loads and stores of i1 are disallowed. This is done by rejecting |
+ ; i1* as a pointer type. |
+ %ptr.p = inttoptr i32 %ptr to i1* |
+; CHECK: disallowed: bad result type: i1* %ptr.p = inttoptr |
+ %vptr.p = inttoptr i32 %ptr to <4 x i1>* |
+; CHECK: disallowed: bad result type: <4 x i1>* %vptr.p = inttoptr |
+ load i1* %ptr.p, align 1 |
+; CHECK-NEXT: disallowed: bad pointer: {{.*}} load i1* |
+ load <4 x i1>* %vptr.p, align 4 |
+; CHECK-NEXT: disallowed: bad pointer: {{.*}} load <4 x i1>* |
+ |
+ ; Check that we don't allow weird sizes. |
+ add i31 0, 0 |
+; CHECK-NEXT: disallowed: Invalid integer arithmetic type: {{.*}} add i31 |
+ |
+ ; i1 arithmetic is of dubious usefulness, so it is rejected. |
+ add i1 0, 0 |
+; CHECK-NEXT: disallowed: Invalid integer arithmetic type: {{.*}} add i1 |
+ sub i1 0, 0 |
+; CHECK-NEXT: disallowed: Invalid integer arithmetic type: {{.*}} sub i1 |
+ mul i1 0, 0 |
+; CHECK-NEXT: disallowed: Invalid integer arithmetic type: {{.*}} = mul i1 |
+ udiv i1 0, 0 |
+; CHECK-NEXT: disallowed: Invalid integer arithmetic type: {{.*}} = udiv i1 |
+ sdiv i1 0, 0 |
+; CHECK-NEXT: disallowed: Invalid integer arithmetic type: {{.*}} = sdiv i1 |
+ urem i1 0, 0 |
+; CHECK-NEXT: disallowed: Invalid integer arithmetic type: {{.*}} = urem i1 |
+ srem i1 0, 0 |
+; CHECK-NEXT: disallowed: Invalid integer arithmetic type: {{.*}} = srem i1 |
+ shl i1 0, 0 |
+; CHECK-NEXT: disallowed: Invalid integer arithmetic type: {{.*}} = shl i1 |
+ lshr i1 0, 0 |
+; CHECK-NEXT: disallowed: Invalid integer arithmetic type: {{.*}} lshr i1 |
+ ashr i1 0, 0 |
+; CHECK-NEXT: disallowed: Invalid integer arithmetic type: {{.*}} ashr i1 |
+ add <4 x i1> undef, undef |
+; CHECK-NEXT: disallowed: Invalid integer arithmetic type: {{.*}} add <4 x i1> |
+ sub <4 x i1> undef, undef |
+; CHECK-NEXT: disallowed: Invalid integer arithmetic type: {{.*}} sub <4 x i1> |
+ mul <4 x i1> undef, undef |
+; CHECK-NEXT: disallowed: Invalid integer arithmetic type: {{.*}} mul <4 x i1> |
+ udiv <4 x i1> undef, undef |
+; CHECK-NEXT: disallowed: Invalid integer arithmetic type: {{.*}} udiv <4 x i1> |
+ sdiv <4 x i1> undef, undef |
+; CHECK-NEXT: disallowed: Invalid integer arithmetic type: {{.*}} sdiv <4 x i1> |
+ urem <4 x i1> undef, undef |
+; CHECK-NEXT: disallowed: Invalid integer arithmetic type: {{.*}} urem <4 x i1> |
+ srem <4 x i1> undef, undef |
+; CHECK-NEXT: disallowed: Invalid integer arithmetic type: {{.*}} srem <4 x i1> |
+ shl <4 x i1> undef, undef |
+; CHECK-NEXT: disallowed: Invalid integer arithmetic type: {{.*}} shl <4 x i1> |
+ lshr <4 x i1> undef, undef |
+; CHECK-NEXT: disallowed: Invalid integer arithmetic type: {{.*}} lshr <4 x i1> |
+ ashr <4 x i1> undef, undef |
+; CHECK-NEXT: disallowed: Invalid integer arithmetic type: {{.*}} ashr <4 x i1> |
+ add <8 x i1> undef, undef |
+; CHECK-NEXT: disallowed: Invalid integer arithmetic type: {{.*}} add <8 x i1> |
+ sub <8 x i1> undef, undef |
+; CHECK-NEXT: disallowed: Invalid integer arithmetic type: {{.*}} sub <8 x i1> |
+ mul <8 x i1> undef, undef |
+; CHECK-NEXT: disallowed: Invalid integer arithmetic type: {{.*}} mul <8 x i1> |
+ udiv <8 x i1> undef, undef |
+; CHECK-NEXT: disallowed: Invalid integer arithmetic type: {{.*}} udiv <8 x i1> |
+ sdiv <8 x i1> undef, undef |
+; CHECK-NEXT: disallowed: Invalid integer arithmetic type: {{.*}} sdiv <8 x i1> |
+ urem <8 x i1> undef, undef |
+; CHECK-NEXT: disallowed: Invalid integer arithmetic type: {{.*}} urem <8 x i1> |
+ srem <8 x i1> undef, undef |
+; CHECK-NEXT: disallowed: Invalid integer arithmetic type: {{.*}} srem <8 x i1> |
+ shl <8 x i1> undef, undef |
+; CHECK-NEXT: disallowed: Invalid integer arithmetic type: {{.*}} shl <8 x i1> |
+ lshr <8 x i1> undef, undef |
+; CHECK-NEXT: disallowed: Invalid integer arithmetic type: {{.*}} lshr <8 x i1> |
+ ashr <8 x i1> undef, undef |
+; CHECK-NEXT: disallowed: Invalid integer arithmetic type: {{.*}} ashr <8 x i1> |
+ add <16 x i1> undef, undef |
+; CHECK-NEXT: disallowed: Invalid integer arithmetic type: {{.*}} add <16 x i1> |
+ sub <16 x i1> undef, undef |
+; CHECK-NEXT: disallowed: Invalid integer arithmetic type: {{.*}} sub <16 x i1> |
+ mul <16 x i1> undef, undef |
+; CHECK-NEXT: disallowed: Invalid integer arithmetic type: {{.*}} mul <16 x i1> |
+ udiv <16 x i1> undef, undef |
+; CHECK-NEXT: disallowed: Invalid integer arithmetic type: {{.*}} udiv <16 x i1> |
+ sdiv <16 x i1> undef, undef |
+; CHECK-NEXT: disallowed: Invalid integer arithmetic type: {{.*}} sdiv <16 x i1> |
+ urem <16 x i1> undef, undef |
+; CHECK-NEXT: disallowed: Invalid integer arithmetic type: {{.*}} urem <16 x i1> |
+ srem <16 x i1> undef, undef |
+; CHECK-NEXT: disallowed: Invalid integer arithmetic type: {{.*}} srem <16 x i1> |
+ shl <16 x i1> undef, undef |
+; CHECK-NEXT: disallowed: Invalid integer arithmetic type: {{.*}} shl <16 x i1> |
+ lshr <16 x i1> undef, undef |
+; CHECK-NEXT: disallowed: Invalid integer arithmetic type: {{.*}} lshr <16 x i1> |
+ ashr <16 x i1> undef, undef |
+; CHECK-NEXT: disallowed: Invalid integer arithmetic type: {{.*}} ashr <16 x i1> |
+ |
+ ; The same applies to i1 comparisons. |
+ icmp eq i1 0, 0 |
+; CHECK-NEXT: disallowed: Invalid integer arithmetic type: {{.*}} icmp eq i1 |
+ icmp ult i1 0, 0 |
+; CHECK-NEXT: disallowed: Invalid integer arithmetic type: {{.*}} icmp ult i1 |
+ icmp eq <4 x i1> undef, undef |
+; CHECK-NEXT: disallowed: Invalid integer arithmetic type: {{.*}} icmp eq <4 x i1> |
+ icmp ult <4 x i1> undef, undef |
+; CHECK-NEXT: disallowed: Invalid integer arithmetic type: {{.*}} icmp ult <4 x i1> |
+ icmp eq <8 x i1> undef, undef |
+; CHECK-NEXT: disallowed: Invalid integer arithmetic type: {{.*}} icmp eq <8 x i1> |
+ icmp ult <8 x i1> undef, undef |
+; CHECK-NEXT: disallowed: Invalid integer arithmetic type: {{.*}} icmp ult <8 x i1> |
+ icmp eq <16 x i1> undef, undef |
+; CHECK-NEXT: disallowed: Invalid integer arithmetic type: {{.*}} icmp eq <16 x i1> |
+ icmp ult <16 x i1> undef, undef |
+; CHECK-NEXT: disallowed: Invalid integer arithmetic type: {{.*}} icmp ult <16 x i1> |
+ |
+ ; There should be no implicit zero-extension in alloca. |
+ alloca i8, i1 1 |
+; CHECK-NEXT: disallowed: alloca array size is not i32 |
+ |
+ ; Switch on i1 is not useful. "br" should be used instead. |
+ switch i1 0, label %next [i1 0, label %next] |
+; CHECK-NEXT: disallowed: switch on i1 |
+next: |
+ |
+ ret void |
+} |
+; CHECK-NOT: disallowed |
+ |
+ |
+; This stops the verifier from complaining about the lack of an entry point. |
+define void @_start(i32 %arg) { |
+ ret void |
+} |