[llvm] 4251aa7 - [IRBuilder] Migrate most casts to folding API

Nikita Popov via llvm-commits llvm-commits at lists.llvm.org
Fri Sep 29 03:40:47 PDT 2023


Author: Nikita Popov
Date: 2023-09-29T12:40:38+02:00
New Revision: 4251aa7a6f78ab063cad6c2e0aeadd76a660efba

URL: https://github.com/llvm/llvm-project/commit/4251aa7a6f78ab063cad6c2e0aeadd76a660efba
DIFF: https://github.com/llvm/llvm-project/commit/4251aa7a6f78ab063cad6c2e0aeadd76a660efba.diff

LOG: [IRBuilder] Migrate most casts to folding API

Migrate creation of most casts to use the FoldXYZ rather than
CreateXYZ style APIs. This means that InstSimplifyFolder now
works for these, which is what accounts for the AMDGPU test changes.

Added: 
    

Modified: 
    llvm/include/llvm/Analysis/InstSimplifyFolder.h
    llvm/include/llvm/Analysis/TargetFolder.h
    llvm/include/llvm/IR/ConstantFolder.h
    llvm/include/llvm/IR/IRBuilder.h
    llvm/include/llvm/IR/IRBuilderFolder.h
    llvm/include/llvm/IR/NoFolder.h
    llvm/test/CodeGen/AMDGPU/promote-alloca-loadstores.ll
    llvm/test/CodeGen/AMDGPU/promote-alloca-pointer-array.ll

Removed: 
    


################################################################################
diff  --git a/llvm/include/llvm/Analysis/InstSimplifyFolder.h b/llvm/include/llvm/Analysis/InstSimplifyFolder.h
index 16bd9f76542124f..23e2ea80e8cbe6f 100644
--- a/llvm/include/llvm/Analysis/InstSimplifyFolder.h
+++ b/llvm/include/llvm/Analysis/InstSimplifyFolder.h
@@ -112,56 +112,20 @@ class InstSimplifyFolder final : public IRBuilderFolder {
     return simplifyShuffleVectorInst(V1, V2, Mask, RetTy, SQ);
   }
 
+  Value *FoldCast(Instruction::CastOps Op, Value *V,
+                  Type *DestTy) const override {
+    return simplifyCastInst(Op, V, DestTy, SQ);
+  }
+
   //===--------------------------------------------------------------------===//
   // Cast/Conversion Operators
   //===--------------------------------------------------------------------===//
 
-  Value *CreateCast(Instruction::CastOps Op, Constant *C,
-                    Type *DestTy) const override {
-    if (C->getType() == DestTy)
-      return C; // avoid calling Fold
-    return ConstFolder.CreateCast(Op, C, DestTy);
-  }
-  Value *CreateIntCast(Constant *C, Type *DestTy,
-                       bool isSigned) const override {
-    if (C->getType() == DestTy)
-      return C; // avoid calling Fold
-    return ConstFolder.CreateIntCast(C, DestTy, isSigned);
-  }
   Value *CreatePointerCast(Constant *C, Type *DestTy) const override {
     if (C->getType() == DestTy)
       return C; // avoid calling Fold
     return ConstFolder.CreatePointerCast(C, DestTy);
   }
-  Value *CreateFPCast(Constant *C, Type *DestTy) const override {
-    if (C->getType() == DestTy)
-      return C; // avoid calling Fold
-    return ConstFolder.CreateFPCast(C, DestTy);
-  }
-  Value *CreateBitCast(Constant *C, Type *DestTy) const override {
-    return ConstFolder.CreateBitCast(C, DestTy);
-  }
-  Value *CreateIntToPtr(Constant *C, Type *DestTy) const override {
-    return ConstFolder.CreateIntToPtr(C, DestTy);
-  }
-  Value *CreatePtrToInt(Constant *C, Type *DestTy) const override {
-    return ConstFolder.CreatePtrToInt(C, DestTy);
-  }
-  Value *CreateZExtOrBitCast(Constant *C, Type *DestTy) const override {
-    if (C->getType() == DestTy)
-      return C; // avoid calling Fold
-    return ConstFolder.CreateZExtOrBitCast(C, DestTy);
-  }
-  Value *CreateSExtOrBitCast(Constant *C, Type *DestTy) const override {
-    if (C->getType() == DestTy)
-      return C; // avoid calling Fold
-    return ConstFolder.CreateSExtOrBitCast(C, DestTy);
-  }
-  Value *CreateTruncOrBitCast(Constant *C, Type *DestTy) const override {
-    if (C->getType() == DestTy)
-      return C; // avoid calling Fold
-    return ConstFolder.CreateTruncOrBitCast(C, DestTy);
-  }
 
   Value *CreatePointerBitCastOrAddrSpaceCast(Constant *C,
                                              Type *DestTy) const override {

diff  --git a/llvm/include/llvm/Analysis/TargetFolder.h b/llvm/include/llvm/Analysis/TargetFolder.h
index 3d9edf132dc107f..4a6aec98abf861c 100644
--- a/llvm/include/llvm/Analysis/TargetFolder.h
+++ b/llvm/include/llvm/Analysis/TargetFolder.h
@@ -184,56 +184,22 @@ class TargetFolder final : public IRBuilderFolder {
     return nullptr;
   }
 
+  Value *FoldCast(Instruction::CastOps Op, Value *V,
+                  Type *DestTy) const override {
+    if (auto *C = dyn_cast<Constant>(V))
+      return Fold(ConstantExpr::getCast(Op, C, DestTy));
+    return nullptr;
+  }
+
   //===--------------------------------------------------------------------===//
   // Cast/Conversion Operators
   //===--------------------------------------------------------------------===//
 
-  Constant *CreateCast(Instruction::CastOps Op, Constant *C,
-                       Type *DestTy) const override {
-    if (C->getType() == DestTy)
-      return C; // avoid calling Fold
-    return Fold(ConstantExpr::getCast(Op, C, DestTy));
-  }
-  Constant *CreateIntCast(Constant *C, Type *DestTy,
-                          bool isSigned) const override {
-    if (C->getType() == DestTy)
-      return C; // avoid calling Fold
-    return Fold(ConstantExpr::getIntegerCast(C, DestTy, isSigned));
-  }
   Constant *CreatePointerCast(Constant *C, Type *DestTy) const override {
     if (C->getType() == DestTy)
       return C; // avoid calling Fold
     return Fold(ConstantExpr::getPointerCast(C, DestTy));
   }
-  Constant *CreateFPCast(Constant *C, Type *DestTy) const override {
-    if (C->getType() == DestTy)
-      return C; // avoid calling Fold
-    return Fold(ConstantExpr::getFPCast(C, DestTy));
-  }
-  Constant *CreateBitCast(Constant *C, Type *DestTy) const override {
-    return CreateCast(Instruction::BitCast, C, DestTy);
-  }
-  Constant *CreateIntToPtr(Constant *C, Type *DestTy) const override {
-    return CreateCast(Instruction::IntToPtr, C, DestTy);
-  }
-  Constant *CreatePtrToInt(Constant *C, Type *DestTy) const override {
-    return CreateCast(Instruction::PtrToInt, C, DestTy);
-  }
-  Constant *CreateZExtOrBitCast(Constant *C, Type *DestTy) const override {
-    if (C->getType() == DestTy)
-      return C; // avoid calling Fold
-    return Fold(ConstantExpr::getZExtOrBitCast(C, DestTy));
-  }
-  Constant *CreateSExtOrBitCast(Constant *C, Type *DestTy) const override {
-    if (C->getType() == DestTy)
-      return C; // avoid calling Fold
-    return Fold(ConstantExpr::getSExtOrBitCast(C, DestTy));
-  }
-  Constant *CreateTruncOrBitCast(Constant *C, Type *DestTy) const override {
-    if (C->getType() == DestTy)
-      return C; // avoid calling Fold
-    return Fold(ConstantExpr::getTruncOrBitCast(C, DestTy));
-  }
 
   Constant *CreatePointerBitCastOrAddrSpaceCast(Constant *C,
                                                 Type *DestTy) const override {

diff  --git a/llvm/include/llvm/IR/ConstantFolder.h b/llvm/include/llvm/IR/ConstantFolder.h
index 56da3d205fe4b7c..30c8b598bda6f90 100644
--- a/llvm/include/llvm/IR/ConstantFolder.h
+++ b/llvm/include/llvm/IR/ConstantFolder.h
@@ -173,15 +173,17 @@ class ConstantFolder final : public IRBuilderFolder {
     return nullptr;
   }
 
+  Value *FoldCast(Instruction::CastOps Op, Value *V,
+                  Type *DestTy) const override {
+    if (auto *C = dyn_cast<Constant>(V))
+      return ConstantExpr::getCast(Op, C, DestTy);
+    return nullptr;
+  }
+
   //===--------------------------------------------------------------------===//
   // Cast/Conversion Operators
   //===--------------------------------------------------------------------===//
 
-  Constant *CreateCast(Instruction::CastOps Op, Constant *C,
-                       Type *DestTy) const override {
-    return ConstantExpr::getCast(Op, C, DestTy);
-  }
-
   Constant *CreatePointerCast(Constant *C, Type *DestTy) const override {
     return ConstantExpr::getPointerCast(C, DestTy);
   }
@@ -191,39 +193,6 @@ class ConstantFolder final : public IRBuilderFolder {
     return ConstantExpr::getPointerBitCastOrAddrSpaceCast(C, DestTy);
   }
 
-  Constant *CreateIntCast(Constant *C, Type *DestTy,
-                          bool isSigned) const override {
-    return ConstantExpr::getIntegerCast(C, DestTy, isSigned);
-  }
-
-  Constant *CreateFPCast(Constant *C, Type *DestTy) const override {
-    return ConstantExpr::getFPCast(C, DestTy);
-  }
-
-  Constant *CreateBitCast(Constant *C, Type *DestTy) const override {
-    return CreateCast(Instruction::BitCast, C, DestTy);
-  }
-
-  Constant *CreateIntToPtr(Constant *C, Type *DestTy) const override {
-    return CreateCast(Instruction::IntToPtr, C, DestTy);
-  }
-
-  Constant *CreatePtrToInt(Constant *C, Type *DestTy) const override {
-    return CreateCast(Instruction::PtrToInt, C, DestTy);
-  }
-
-  Constant *CreateZExtOrBitCast(Constant *C, Type *DestTy) const override {
-    return ConstantExpr::getZExtOrBitCast(C, DestTy);
-  }
-
-  Constant *CreateSExtOrBitCast(Constant *C, Type *DestTy) const override {
-    return ConstantExpr::getSExtOrBitCast(C, DestTy);
-  }
-
-  Constant *CreateTruncOrBitCast(Constant *C, Type *DestTy) const override {
-    return ConstantExpr::getTruncOrBitCast(C, DestTy);
-  }
-
   //===--------------------------------------------------------------------===//
   // Compare Instructions
   //===--------------------------------------------------------------------===//

diff  --git a/llvm/include/llvm/IR/IRBuilder.h b/llvm/include/llvm/IR/IRBuilder.h
index 86be257918cacfa..c9f243fdb12e404 100644
--- a/llvm/include/llvm/IR/IRBuilder.h
+++ b/llvm/include/llvm/IR/IRBuilder.h
@@ -2096,39 +2096,36 @@ class IRBuilderBase {
     return CreateCast(Instruction::AddrSpaceCast, V, DestTy, Name);
   }
 
-  Value *CreateZExtOrBitCast(Value *V, Type *DestTy,
-                             const Twine &Name = "") {
-    if (V->getType() == DestTy)
-      return V;
-    if (auto *VC = dyn_cast<Constant>(V))
-      return Insert(Folder.CreateZExtOrBitCast(VC, DestTy), Name);
-    return Insert(CastInst::CreateZExtOrBitCast(V, DestTy), Name);
+  Value *CreateZExtOrBitCast(Value *V, Type *DestTy, const Twine &Name = "") {
+    Instruction::CastOps CastOp =
+        V->getType()->getScalarSizeInBits() == DestTy->getScalarSizeInBits()
+            ? Instruction::BitCast
+            : Instruction::ZExt;
+    return CreateCast(CastOp, V, DestTy, Name);
   }
 
-  Value *CreateSExtOrBitCast(Value *V, Type *DestTy,
-                             const Twine &Name = "") {
-    if (V->getType() == DestTy)
-      return V;
-    if (auto *VC = dyn_cast<Constant>(V))
-      return Insert(Folder.CreateSExtOrBitCast(VC, DestTy), Name);
-    return Insert(CastInst::CreateSExtOrBitCast(V, DestTy), Name);
+  Value *CreateSExtOrBitCast(Value *V, Type *DestTy, const Twine &Name = "") {
+    Instruction::CastOps CastOp =
+        V->getType()->getScalarSizeInBits() == DestTy->getScalarSizeInBits()
+            ? Instruction::BitCast
+            : Instruction::SExt;
+    return CreateCast(CastOp, V, DestTy, Name);
   }
 
-  Value *CreateTruncOrBitCast(Value *V, Type *DestTy,
-                              const Twine &Name = "") {
-    if (V->getType() == DestTy)
-      return V;
-    if (auto *VC = dyn_cast<Constant>(V))
-      return Insert(Folder.CreateTruncOrBitCast(VC, DestTy), Name);
-    return Insert(CastInst::CreateTruncOrBitCast(V, DestTy), Name);
+  Value *CreateTruncOrBitCast(Value *V, Type *DestTy, const Twine &Name = "") {
+    Instruction::CastOps CastOp =
+        V->getType()->getScalarSizeInBits() == DestTy->getScalarSizeInBits()
+            ? Instruction::BitCast
+            : Instruction::Trunc;
+    return CreateCast(CastOp, V, DestTy, Name);
   }
 
   Value *CreateCast(Instruction::CastOps Op, Value *V, Type *DestTy,
                     const Twine &Name = "") {
     if (V->getType() == DestTy)
       return V;
-    if (auto *VC = dyn_cast<Constant>(V))
-      return Insert(Folder.CreateCast(Op, VC, DestTy), Name);
+    if (Value *Folded = Folder.FoldCast(Op, V, DestTy))
+      return Folded;
     return Insert(CastInst::Create(Op, V, DestTy), Name);
   }
 
@@ -2157,11 +2154,11 @@ class IRBuilderBase {
 
   Value *CreateIntCast(Value *V, Type *DestTy, bool isSigned,
                        const Twine &Name = "") {
-    if (V->getType() == DestTy)
-      return V;
-    if (auto *VC = dyn_cast<Constant>(V))
-      return Insert(Folder.CreateIntCast(VC, DestTy, isSigned), Name);
-    return Insert(CastInst::CreateIntegerCast(V, DestTy, isSigned), Name);
+    Instruction::CastOps CastOp =
+        V->getType()->getScalarSizeInBits() > DestTy->getScalarSizeInBits()
+            ? Instruction::Trunc
+            : (isSigned ? Instruction::SExt : Instruction::ZExt);
+    return CreateCast(CastOp, V, DestTy, Name);
   }
 
   Value *CreateBitOrPointerCast(Value *V, Type *DestTy,
@@ -2177,11 +2174,11 @@ class IRBuilderBase {
   }
 
   Value *CreateFPCast(Value *V, Type *DestTy, const Twine &Name = "") {
-    if (V->getType() == DestTy)
-      return V;
-    if (auto *VC = dyn_cast<Constant>(V))
-      return Insert(Folder.CreateFPCast(VC, DestTy), Name);
-    return Insert(CastInst::CreateFPCast(V, DestTy), Name);
+    Instruction::CastOps CastOp =
+        V->getType()->getScalarSizeInBits() > DestTy->getScalarSizeInBits()
+            ? Instruction::FPTrunc
+            : Instruction::FPExt;
+    return CreateCast(CastOp, V, DestTy, Name);
   }
 
   CallInst *CreateConstrainedFPCast(

diff  --git a/llvm/include/llvm/IR/IRBuilderFolder.h b/llvm/include/llvm/IR/IRBuilderFolder.h
index b2b27235a1e671a..bd2324dfc5f1ba8 100644
--- a/llvm/include/llvm/IR/IRBuilderFolder.h
+++ b/llvm/include/llvm/IR/IRBuilderFolder.h
@@ -70,24 +70,16 @@ class IRBuilderFolder {
   virtual Value *FoldShuffleVector(Value *V1, Value *V2,
                                    ArrayRef<int> Mask) const = 0;
 
+  virtual Value *FoldCast(Instruction::CastOps Op, Value *V,
+                          Type *DestTy) const = 0;
+
   //===--------------------------------------------------------------------===//
   // Cast/Conversion Operators
   //===--------------------------------------------------------------------===//
 
-  virtual Value *CreateCast(Instruction::CastOps Op, Constant *C,
-                            Type *DestTy) const = 0;
   virtual Value *CreatePointerCast(Constant *C, Type *DestTy) const = 0;
   virtual Value *CreatePointerBitCastOrAddrSpaceCast(Constant *C,
                                                      Type *DestTy) const = 0;
-  virtual Value *CreateIntCast(Constant *C, Type *DestTy,
-                               bool isSigned) const = 0;
-  virtual Value *CreateFPCast(Constant *C, Type *DestTy) const = 0;
-  virtual Value *CreateBitCast(Constant *C, Type *DestTy) const = 0;
-  virtual Value *CreateIntToPtr(Constant *C, Type *DestTy) const = 0;
-  virtual Value *CreatePtrToInt(Constant *C, Type *DestTy) const = 0;
-  virtual Value *CreateZExtOrBitCast(Constant *C, Type *DestTy) const = 0;
-  virtual Value *CreateSExtOrBitCast(Constant *C, Type *DestTy) const = 0;
-  virtual Value *CreateTruncOrBitCast(Constant *C, Type *DestTy) const = 0;
 
   //===--------------------------------------------------------------------===//
   // Compare Instructions

diff  --git a/llvm/include/llvm/IR/NoFolder.h b/llvm/include/llvm/IR/NoFolder.h
index 56ccfc694c5f1f8..a612f98465aeaa8 100644
--- a/llvm/include/llvm/IR/NoFolder.h
+++ b/llvm/include/llvm/IR/NoFolder.h
@@ -107,15 +107,15 @@ class NoFolder final : public IRBuilderFolder {
     return nullptr;
   }
 
+  Value *FoldCast(Instruction::CastOps Op, Value *V,
+                  Type *DestTy) const override {
+    return nullptr;
+  }
+
   //===--------------------------------------------------------------------===//
   // Cast/Conversion Operators
   //===--------------------------------------------------------------------===//
 
-  Instruction *CreateCast(Instruction::CastOps Op, Constant *C,
-                          Type *DestTy) const override {
-    return CastInst::Create(Op, C, DestTy);
-  }
-
   Instruction *CreatePointerCast(Constant *C, Type *DestTy) const override {
     return CastInst::CreatePointerCast(C, DestTy);
   }
@@ -125,39 +125,6 @@ class NoFolder final : public IRBuilderFolder {
     return CastInst::CreatePointerBitCastOrAddrSpaceCast(C, DestTy);
   }
 
-  Instruction *CreateIntCast(Constant *C, Type *DestTy,
-                             bool isSigned) const override {
-    return CastInst::CreateIntegerCast(C, DestTy, isSigned);
-  }
-
-  Instruction *CreateFPCast(Constant *C, Type *DestTy) const override {
-    return CastInst::CreateFPCast(C, DestTy);
-  }
-
-  Instruction *CreateBitCast(Constant *C, Type *DestTy) const override {
-    return CreateCast(Instruction::BitCast, C, DestTy);
-  }
-
-  Instruction *CreateIntToPtr(Constant *C, Type *DestTy) const override {
-    return CreateCast(Instruction::IntToPtr, C, DestTy);
-  }
-
-  Instruction *CreatePtrToInt(Constant *C, Type *DestTy) const override {
-    return CreateCast(Instruction::PtrToInt, C, DestTy);
-  }
-
-  Instruction *CreateZExtOrBitCast(Constant *C, Type *DestTy) const override {
-    return CastInst::CreateZExtOrBitCast(C, DestTy);
-  }
-
-  Instruction *CreateSExtOrBitCast(Constant *C, Type *DestTy) const override {
-    return CastInst::CreateSExtOrBitCast(C, DestTy);
-  }
-
-  Instruction *CreateTruncOrBitCast(Constant *C, Type *DestTy) const override {
-    return CastInst::CreateTruncOrBitCast(C, DestTy);
-  }
-
   //===--------------------------------------------------------------------===//
   // Compare Instructions
   //===--------------------------------------------------------------------===//

diff  --git a/llvm/test/CodeGen/AMDGPU/promote-alloca-loadstores.ll b/llvm/test/CodeGen/AMDGPU/promote-alloca-loadstores.ll
index 1ff7e8db6b97f85..1262be9d36765b5 100644
--- a/llvm/test/CodeGen/AMDGPU/promote-alloca-loadstores.ll
+++ b/llvm/test/CodeGen/AMDGPU/promote-alloca-loadstores.ll
@@ -97,9 +97,7 @@ define ptr @alloca_load_store_ptr64_full_ivec(ptr %arg) {
 ; CHECK-NEXT:  entry:
 ; CHECK-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[ARG]] to i64
 ; CHECK-NEXT:    [[TMP1:%.*]] = bitcast i64 [[TMP0]] to <8 x i8>
-; CHECK-NEXT:    [[TMP2:%.*]] = bitcast <8 x i8> [[TMP1]] to i64
-; CHECK-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[TMP2]] to ptr
-; CHECK-NEXT:    ret ptr [[TMP3]]
+; CHECK-NEXT:    ret ptr [[ARG]]
 ;
 entry:
   %alloca = alloca [8 x i8], align 8, addrspace(5)
@@ -114,9 +112,7 @@ define ptr addrspace(3) @alloca_load_store_ptr32_full_ivec(ptr addrspace(3) %arg
 ; CHECK-NEXT:  entry:
 ; CHECK-NEXT:    [[TMP0:%.*]] = ptrtoint ptr addrspace(3) [[ARG]] to i32
 ; CHECK-NEXT:    [[TMP1:%.*]] = bitcast i32 [[TMP0]] to <4 x i8>
-; CHECK-NEXT:    [[TMP2:%.*]] = bitcast <4 x i8> [[TMP1]] to i32
-; CHECK-NEXT:    [[TMP3:%.*]] = inttoptr i32 [[TMP2]] to ptr addrspace(3)
-; CHECK-NEXT:    ret ptr addrspace(3) [[TMP3]]
+; CHECK-NEXT:    ret ptr addrspace(3) [[ARG]]
 ;
 entry:
   %alloca = alloca [4 x i8], align 8, addrspace(5)
@@ -147,9 +143,8 @@ define <8 x i16> @ptralloca_load_store_ints_full(<2 x i64> %arg) {
 ; CHECK-NEXT:  entry:
 ; CHECK-NEXT:    [[TMP0:%.*]] = bitcast <2 x i64> [[ARG]] to <4 x i32>
 ; CHECK-NEXT:    [[TMP1:%.*]] = inttoptr <4 x i32> [[TMP0]] to <4 x ptr addrspace(5)>
-; CHECK-NEXT:    [[TMP2:%.*]] = ptrtoint <4 x ptr addrspace(5)> [[TMP1]] to <4 x i32>
-; CHECK-NEXT:    [[TMP3:%.*]] = bitcast <4 x i32> [[TMP2]] to <8 x i16>
-; CHECK-NEXT:    ret <8 x i16> [[TMP3]]
+; CHECK-NEXT:    [[TMP2:%.*]] = bitcast <4 x i32> [[TMP0]] to <8 x i16>
+; CHECK-NEXT:    ret <8 x i16> [[TMP2]]
 ;
 entry:
   %stack = alloca [4 x ptr addrspace(5)], align 4, addrspace(5)

diff  --git a/llvm/test/CodeGen/AMDGPU/promote-alloca-pointer-array.ll b/llvm/test/CodeGen/AMDGPU/promote-alloca-pointer-array.ll
index 8df15e3f7e29a93..94d17911d3a449d 100644
--- a/llvm/test/CodeGen/AMDGPU/promote-alloca-pointer-array.ll
+++ b/llvm/test/CodeGen/AMDGPU/promote-alloca-pointer-array.ll
@@ -6,8 +6,7 @@ define i64 @test_pointer_array(i64 %v) {
 ; OPT-NEXT:  entry:
 ; OPT-NEXT:    [[TMP0:%.*]] = inttoptr i64 [[V:%.*]] to ptr
 ; OPT-NEXT:    [[TMP1:%.*]] = insertelement <3 x ptr> undef, ptr [[TMP0]], i32 0
-; OPT-NEXT:    [[TMP2:%.*]] = ptrtoint ptr [[TMP0]] to i64
-; OPT-NEXT:    ret i64 [[TMP2]]
+; OPT-NEXT:    ret i64 [[V]]
 ;
 entry:
   %a = alloca [3 x ptr], align 16, addrspace(5)


        


More information about the llvm-commits mailing list