<html><head><meta http-equiv="Content-Type" content="text/html charset=us-ascii"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">I decided against that variant because it would be marginally more expensive to extract the size from the debug info and this approach just reuses data we already have lying around.<div class=""><br class=""></div><div class="">-- adrian</div><div class=""><br class=""><div><blockquote type="cite" class=""><div class="">On Aug 31, 2017, at 9:57 AM, David Blaikie <<a href="mailto:dblaikie@gmail.com" class="">dblaikie@gmail.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class="">Would it be better to measure the size and do this generally if the size is the same? Or would that not work/be harder?</div><br class=""><div class="gmail_quote"><div dir="ltr" class="">On Wed, Aug 30, 2017 at 5:07 PM Adrian Prantl via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org" class="">llvm-commits@lists.llvm.org</a>> wrote:<br class=""></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: adrian<br class="">
Date: Wed Aug 30 17:06:18 2017<br class="">
New Revision: 312196<br class="">
<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=312196&view=rev" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project?rev=312196&view=rev</a><br class="">
Log:<br class="">
Don't add a fragment expression when GlobalSRA splits up a single-member struct<br class="">
<br class="">
Fixes PR34390.<br class="">
<br class="">
<a href="https://bugs.llvm.org/show_bug.cgi?id=34390" rel="noreferrer" target="_blank" class="">https://bugs.llvm.org/show_bug.cgi?id=34390</a><br class="">
<br class="">
Added:<br class="">
    llvm/trunk/test/DebugInfo/Generic/global-sra-single-member.ll<br class="">
Modified:<br class="">
    llvm/trunk/lib/Transforms/IPO/GlobalOpt.cpp<br class="">
<br class="">
Modified: llvm/trunk/lib/Transforms/IPO/GlobalOpt.cpp<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/IPO/GlobalOpt.cpp?rev=312196&r1=312195&r2=312196&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/IPO/GlobalOpt.cpp?rev=312196&r1=312195&r2=312196&view=diff</a><br class="">
==============================================================================<br class="">
--- llvm/trunk/lib/Transforms/IPO/GlobalOpt.cpp (original)<br class="">
+++ llvm/trunk/lib/Transforms/IPO/GlobalOpt.cpp Wed Aug 30 17:06:18 2017<br class="">
@@ -420,15 +420,17 @@ static bool GlobalUsersSafeToSRA(GlobalV<br class="">
 /// Copy over the debug info for a variable to its SRA replacements.<br class="">
 static void transferSRADebugInfo(GlobalVariable *GV, GlobalVariable *NGV,<br class="">
                                  uint64_t FragmentOffsetInBits,<br class="">
-                                 uint64_t FragmentSizeInBits) {<br class="">
+                                 uint64_t FragmentSizeInBits,<br class="">
+                                 unsigned NumElements) {<br class="">
   SmallVector<DIGlobalVariableExpression *, 1> GVs;<br class="">
   GV->getDebugInfo(GVs);<br class="">
   for (auto *GVE : GVs) {<br class="">
     DIVariable *Var = GVE->getVariable();<br class="">
     DIExpression *Expr = GVE->getExpression();<br class="">
-    auto *NExpr = DIExpression::createFragmentExpression(<br class="">
-        Expr, FragmentOffsetInBits, FragmentSizeInBits);<br class="">
-    auto *NGVE = DIGlobalVariableExpression::get(GVE->getContext(), Var, NExpr);<br class="">
+    if (NumElements > 1)<br class="">
+      Expr = DIExpression::createFragmentExpression(Expr, FragmentOffsetInBits,<br class="">
+                                                    FragmentSizeInBits);<br class="">
+    auto *NGVE = DIGlobalVariableExpression::get(GVE->getContext(), Var, Expr);<br class="">
     NGV->addDebugInfo(NGVE);<br class="">
   }<br class="">
 }<br class="">
@@ -458,9 +460,10 @@ static GlobalVariable *SRAGlobal(GlobalV<br class="">
<br class="">
   if (StructType *STy = dyn_cast<StructType>(Ty)) {<br class="">
     uint64_t FragmentOffset = 0;<br class="">
-    NewGlobals.reserve(STy->getNumElements());<br class="">
+    unsigned NumElements = STy->getNumElements();<br class="">
+    NewGlobals.reserve(NumElements);<br class="">
     const StructLayout &Layout = *DL.getStructLayout(STy);<br class="">
-    for (unsigned i = 0, e = STy->getNumElements(); i != e; ++i) {<br class="">
+    for (unsigned i = 0, e = NumElements; i != e; ++i) {<br class="">
       Constant *In = Init->getAggregateElement(i);<br class="">
       assert(In && "Couldn't get element of initializer?");<br class="">
       GlobalVariable *NGV = new GlobalVariable(STy->getElementType(i), false,<br class="">
@@ -484,7 +487,7 @@ static GlobalVariable *SRAGlobal(GlobalV<br class="">
       // Copy over the debug info for the variable.<br class="">
       FragmentOffset = alignTo(FragmentOffset, NewAlign);<br class="">
       uint64_t Size = DL.getTypeSizeInBits(NGV->getValueType());<br class="">
-      transferSRADebugInfo(GV, NGV, FragmentOffset, Size);<br class="">
+      transferSRADebugInfo(GV, NGV, FragmentOffset, Size, NumElements);<br class="">
       FragmentOffset += Size;<br class="">
     }<br class="">
   } else if (SequentialType *STy = dyn_cast<SequentialType>(Ty)) {<br class="">
@@ -516,8 +519,8 @@ static GlobalVariable *SRAGlobal(GlobalV<br class="">
       unsigned NewAlign = (unsigned)MinAlign(StartAlignment, EltSize*i);<br class="">
       if (NewAlign > EltAlign)<br class="">
         NGV->setAlignment(NewAlign);<br class="">
-<br class="">
-      transferSRADebugInfo(GV, NGV, FragmentSizeInBits * i, FragmentSizeInBits);<br class="">
+      transferSRADebugInfo(GV, NGV, FragmentSizeInBits * i, FragmentSizeInBits,<br class="">
+                           NumElements);<br class="">
     }<br class="">
   }<br class="">
<br class="">
<br class="">
Added: llvm/trunk/test/DebugInfo/Generic/global-sra-single-member.ll<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/Generic/global-sra-single-member.ll?rev=312196&view=auto" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/Generic/global-sra-single-member.ll?rev=312196&view=auto</a><br class="">
==============================================================================<br class="">
--- llvm/trunk/test/DebugInfo/Generic/global-sra-single-member.ll (added)<br class="">
+++ llvm/trunk/test/DebugInfo/Generic/global-sra-single-member.ll Wed Aug 30 17:06:18 2017<br class="">
@@ -0,0 +1,53 @@<br class="">
+; RUN: opt -S -globalopt < %s | FileCheck %s<br class="">
+; struct {<br class="">
+;   int f0;<br class="">
+; } static a;<br class="">
+; int main() {<br class="">
+;   a.f0++;<br class="">
+;   return 0;<br class="">
+; }<br class="">
+<br class="">
+source_filename = "pr34390.c"<br class="">
+target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"<br class="">
+target triple = "x86_64-apple-macosx10.12.0"<br class="">
+<br class="">
+%struct.anon = type { i32 }<br class="">
+<br class="">
+; CHECK: @a.0 = internal unnamed_addr global i32 0, align 4, !dbg ![[GVE:.*]]<br class="">
+@a = internal global %struct.anon zeroinitializer, align 4, !dbg !0<br class="">
+<br class="">
+define i32 @main() #0 !dbg !15 {<br class="">
+entry:<br class="">
+  %retval = alloca i32, align 4<br class="">
+  store i32 0, i32* %retval, align 4<br class="">
+  %0 = load i32, i32* getelementptr inbounds (%struct.anon, %struct.anon* @a, i32 0, i32 0), align 4, !dbg !18<br class="">
+  %inc = add nsw i32 %0, 1, !dbg !18<br class="">
+  store i32 %inc, i32* getelementptr inbounds (%struct.anon, %struct.anon* @a, i32 0, i32 0), align 4, !dbg !18<br class="">
+  ret i32 0, !dbg !19<br class="">
+}<br class="">
+<br class="">
+attributes #0 = { noinline nounwind optnone ssp uwtable }<br class="">
+<br class="">
+!<a href="http://llvm.dbg.cu/" rel="noreferrer" target="_blank" class="">llvm.dbg.cu</a> = !{!2}<br class="">
+!llvm.module.flags = !{!10, !11, !12, !13}<br class="">
+<br class="">
+; CHECK: ![[GVE]] = !DIGlobalVariableExpression(var: !1, expr: !DIExpression())<br class="">
+!0 = !DIGlobalVariableExpression(var: !1, expr: !DIExpression())<br class="">
+!1 = distinct !DIGlobalVariable(name: "a", scope: !2, file: !3, line: 3, type: !6, isLocal: true, isDefinition: true)<br class="">
+!2 = distinct !DICompileUnit(language: DW_LANG_C99, file: !3, producer: "clang version 6.0.0 (trunk 312175) (llvm/trunk 312146)", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !4, globals: !5)<br class="">
+!3 = !DIFile(filename: "test.c", directory: "/")<br class="">
+!4 = !{}<br class="">
+!5 = !{!0}<br class="">
+!6 = distinct !DICompositeType(tag: DW_TAG_structure_type, file: !3, line: 1, size: 32, elements: !7)<br class="">
+!7 = !{!8}<br class="">
+!8 = !DIDerivedType(tag: DW_TAG_member, name: "f0", scope: !6, file: !3, line: 2, baseType: !9, size: 32)<br class="">
+!9 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)<br class="">
+!10 = !{i32 2, !"Dwarf Version", i32 4}<br class="">
+!11 = !{i32 2, !"Debug Info Version", i32 3}<br class="">
+!12 = !{i32 1, !"wchar_size", i32 4}<br class="">
+!13 = !{i32 7, !"PIC Level", i32 2}<br class="">
+!15 = distinct !DISubprogram(name: "main", scope: !3, file: !3, line: 4, type: !16, isLocal: false, isDefinition: true, scopeLine: 4, isOptimized: false, unit: !2, variables: !4)<br class="">
+!16 = !DISubroutineType(types: !17)<br class="">
+!17 = !{!9}<br class="">
+!18 = !DILocation(line: 5, column: 7, scope: !15)<br class="">
+!19 = !DILocation(line: 6, column: 3, scope: !15)<br class="">
<br class="">
<br class="">
_______________________________________________<br class="">
llvm-commits mailing list<br class="">
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank" class="">llvm-commits@lists.llvm.org</a><br class="">
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank" class="">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br class="">
</blockquote></div>
</div></blockquote></div><br class=""></div></body></html>