[PATCH] D50886: [IR Verifier] Do not allow bitcast of pointer to vector of pointers and vice versa.

Serguei Katkov via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Aug 17 01:56:32 PDT 2018


skatkov created this revision.
skatkov added a reviewer: arsenm.
Herald added a subscriber: wdng.

LangRef for BitCast requires that
"The bit sizes of value and the destination type, ty2, must be identical".
Currently verifier allows BitCast of pointer to vector of pointers so that
the sizes are different.

This change fixes that.


https://reviews.llvm.org/D50886

Files:
  lib/IR/Instructions.cpp
  test/Verifier/bitcast-pointer-vector-neg.ll
  test/Verifier/bitcast-vector-pointer-neg.ll
  test/Verifier/bitcast-vector-pointer-pos.ll


Index: test/Verifier/bitcast-vector-pointer-pos.ll
===================================================================
--- /dev/null
+++ test/Verifier/bitcast-vector-pointer-pos.ll
@@ -0,0 +1,14 @@
+; RUN: llvm-as -disable-output %s
+
+target datalayout = "e-p:32:32:32-p1:16:16:16-p2:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:32:64-v128:32:128-a0:0:32-n8:16:32"
+
+define <1 x i32*> @vector_legal_bitcast_pointer_to_vector(i64* %a) {
+  %b = bitcast i64* %a to <1 x i32*>
+  ret <1 x i32*> %b
+}
+
+define i64* @vector_legal_bitcast_vector_to_pointer(<1 x i32*> %a) {
+  %b = bitcast <1 x i32*> %a to i64*
+  ret i64* %b
+}
+
Index: test/Verifier/bitcast-vector-pointer-neg.ll
===================================================================
--- /dev/null
+++ test/Verifier/bitcast-vector-pointer-neg.ll
@@ -0,0 +1,10 @@
+; RUN: not llvm-as -disable-output %s 2>&1 | FileCheck %s
+
+target datalayout = "e-p:32:32:32-p1:16:16:16-p2:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:32:64-v128:32:128-a0:0:32-n8:16:32"
+
+; CHECK: error: invalid cast opcode for cast from '<2 x i32*>' to 'i64*'
+
+define i64* @vector_illegal_bitcast_vector_to_pointer(<2 x i32*> %a) {
+  %b = bitcast <2 x i32*> %a to i64*
+  ret i64* %b
+}
Index: test/Verifier/bitcast-pointer-vector-neg.ll
===================================================================
--- /dev/null
+++ test/Verifier/bitcast-pointer-vector-neg.ll
@@ -0,0 +1,10 @@
+; RUN: not llvm-as -disable-output %s 2>&1 | FileCheck %s
+
+target datalayout = "e-p:32:32:32-p1:16:16:16-p2:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:32:64-v128:32:128-a0:0:32-n8:16:32"
+
+; CHECK: error: invalid cast opcode for cast from 'i64*' to '<2 x i32*>'
+
+define <2 x i32*> @vector_illegal_bitcast_pointer_to_vector(i64* %a) {
+  %b = bitcast i64* %a to <2 x i32*>
+  ret <2 x i32*> %b
+}
Index: lib/IR/Instructions.cpp
===================================================================
--- lib/IR/Instructions.cpp
+++ lib/IR/Instructions.cpp
@@ -2978,12 +2978,14 @@
       return false;
 
     // A vector of pointers must have the same number of elements.
-    if (VectorType *SrcVecTy = dyn_cast<VectorType>(SrcTy)) {
-      if (VectorType *DstVecTy = dyn_cast<VectorType>(DstTy))
-        return (SrcVecTy->getNumElements() == DstVecTy->getNumElements());
-
-      return false;
-    }
+    VectorType *SrcVecTy = dyn_cast<VectorType>(SrcTy);
+    VectorType *DstVecTy = dyn_cast<VectorType>(DstTy);
+    if (SrcVecTy && DstVecTy)
+      return (SrcVecTy->getNumElements() == DstVecTy->getNumElements());
+    if (SrcVecTy)
+      return SrcVecTy->getNumElements() == 1;
+    if (DstVecTy)
+      return DstVecTy->getNumElements() == 1;
 
     return true;
   }


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D50886.161179.patch
Type: text/x-patch
Size: 2808 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180817/7ad47cbc/attachment.bin>


More information about the llvm-commits mailing list