[PATCH] Fix SROA for intrinsics

Mandeep Singh Grang mgrang at codeaurora.org
Fri Jan 30 10:14:13 PST 2015


Hi Chandler/Owen,

Could you please review this change?
http://reviews.llvm.org/D7240

Thanks,
Mandeep

-----Original Message-----
From: Mandeep Singh Grang [mailto:mgrang at codeaurora.org] 
Sent: Thursday, January 29, 2015 5:55 PM
To: mgrang at codeaurora.org; chandlerc at gmail.com; resistor at mac.com; mcrosier at codeaurora.org; apazos at codeaurora.org
Cc: llvm-commits at cs.uiuc.edu
Subject: Re: [PATCH] Fix SROA for intrinsics

Added "target datalayout" and "target triple" to the test case .ll file


http://reviews.llvm.org/D7240

Files:
  lib/Transforms/Scalar/SROA.cpp
  test/Transforms/ScalarRepl/sroa-lifetime-instrinsics.ll

Index: lib/Transforms/Scalar/SROA.cpp
===================================================================
--- lib/Transforms/Scalar/SROA.cpp
+++ lib/Transforms/Scalar/SROA.cpp
@@ -1951,15 +1951,15 @@
       Type::getIntNTy(Ty->getContext(), NumElements * ElementSize * 8);
 
   Use *U = S.getUse();
+  IntrinsicInst *II = dyn_cast<IntrinsicInst>(U->getUser());
 
   if (MemIntrinsic *MI = dyn_cast<MemIntrinsic>(U->getUser())) {
     if (MI->isVolatile())
       return false;
     if (!S.isSplittable())
       return false; // Skip any unsplittable intrinsics.
-  } else if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(U->getUser())) {
-    if (II->getIntrinsicID() != Intrinsic::lifetime_start &&
-        II->getIntrinsicID() != Intrinsic::lifetime_end)
+  } else if (II && II->getIntrinsicID() != Intrinsic::lifetime_start &&
+        II->getIntrinsicID() != Intrinsic::lifetime_end) {
       return false;
   } else if (U->get()->getType()->getPointerElementType()->isStructTy()) {
     // Disable vector promotion when there are loads or stores of an FCA.
Index: test/Transforms/ScalarRepl/sroa-lifetime-instrinsics.ll
===================================================================
--- /dev/null
+++ test/Transforms/ScalarRepl/sroa-lifetime-instrinsics.ll
@@ -0,0 +1,53 @@
+; RUN: opt -S -sroa < %s | FileCheck %s ; For intrinsics which do 
+generate lifetime start and end evaluate all ; conditions before 
+deciding whether to slice vector loads or not
+
+target datalayout = "e-m:e-i64:64-i128:128-n32:64-S128"
+target triple = "aarch64--linux-gnu"
+
+; Function Attrs: nounwind
+declare void @llvm.lifetime.start(i64, i8* nocapture)
+
+; Function Attrs: nounwind
+declare void @llvm.lifetime.end(i64, i8* nocapture)
+
+; Function Attrs: nounwind readonly
+define i32 @foo(i8* %n) {
+entry:
+; CHECK-LABEL: @foo
+; CHECK-NOT: %a.sroa.0.0.vec.insert = insertelement <8 x i16> undef, 
+i16 %conv, i32 0 ; CHECK: store i16 %conv, i16* 
+%a.sroa.0.0.arrayidx1.sroa_idx3, align 16 ; CHECK-NEXT: 
+%a.sroa.0.0.a.sroa.0.0. = load <8 x i16>* %a.sroa.0
+
+  %n.addr = alloca i8*, align 8
+  %a = alloca [32 x i16], align 2
+  %c = alloca <4 x i32>, align 16
+  %__ret = alloca <8 x i16>, align 16
+  %tmp = alloca <8 x i16>, align 16
+  %cleanup.dest.slot = alloca i32
+  store i8* %n, i8** %n.addr, align 8
+  %0 = bitcast [32 x i16]* %a to i8*
+  call void @llvm.lifetime.start(i64 64, i8* %0) #1
+  %1 = load i8** %n.addr, align 8
+  %arrayidx = getelementptr inbounds i8* %1, i64 0
+  %2 = load i8* %arrayidx, align 1
+  %conv = sext i8 %2 to i16
+  %arrayidx1 = getelementptr inbounds [32 x i16]* %a, i32 0, i64 0
+  store i16 %conv, i16* %arrayidx1, align 2
+  %arraydecay = getelementptr inbounds [32 x i16]* %a, i32 0, i32 0
+  %3 = bitcast i16* %arraydecay to i8*
+  %4 = bitcast i8* %3 to <8 x i16>*
+  %5 = load <8 x i16>* %4
+  store <8 x i16> %5, <8 x i16>* %__ret, align 16
+  %6 = load <8 x i16>* %__ret, align 16
+  store <8 x i16> %6, <8 x i16>* %tmp
+  %7 = load <8 x i16>* %tmp
+  %8 = bitcast <8 x i16> %7 to <4 x i32>
+  store <4 x i32> %8, <4 x i32>* %c, align 16
+  %9 = load <4 x i32>* %c, align 16
+  %vecext = extractelement <4 x i32> %9, i32 0
+  store i32 1, i32* %cleanup.dest.slot
+  %10 = bitcast [32 x i16]* %a to i8*
+  call void @llvm.lifetime.end(i64 64, i8* %10) #1
+  ret i32 %vecext
+}

EMAIL PREFERENCES
  http://reviews.llvm.org/settings/panel/emailpreferences/





More information about the llvm-commits mailing list