<div dir="ltr">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><div class="gmail_quote"><div dir="ltr">On Wed, Aug 30, 2017 at 5:07 PM Adrian Prantl via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: adrian<br>
Date: Wed Aug 30 17:06:18 2017<br>
New Revision: 312196<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=312196&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=312196&view=rev</a><br>
Log:<br>
Don't add a fragment expression when GlobalSRA splits up a single-member struct<br>
<br>
Fixes PR34390.<br>
<br>
<a href="https://bugs.llvm.org/show_bug.cgi?id=34390" rel="noreferrer" target="_blank">https://bugs.llvm.org/show_bug.cgi?id=34390</a><br>
<br>
Added:<br>
    llvm/trunk/test/DebugInfo/Generic/global-sra-single-member.ll<br>
Modified:<br>
    llvm/trunk/lib/Transforms/IPO/GlobalOpt.cpp<br>
<br>
Modified: llvm/trunk/lib/Transforms/IPO/GlobalOpt.cpp<br>
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">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/IPO/GlobalOpt.cpp?rev=312196&r1=312195&r2=312196&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Transforms/IPO/GlobalOpt.cpp (original)<br>
+++ llvm/trunk/lib/Transforms/IPO/GlobalOpt.cpp Wed Aug 30 17:06:18 2017<br>
@@ -420,15 +420,17 @@ static bool GlobalUsersSafeToSRA(GlobalV<br>
 /// Copy over the debug info for a variable to its SRA replacements.<br>
 static void transferSRADebugInfo(GlobalVariable *GV, GlobalVariable *NGV,<br>
                                  uint64_t FragmentOffsetInBits,<br>
-                                 uint64_t FragmentSizeInBits) {<br>
+                                 uint64_t FragmentSizeInBits,<br>
+                                 unsigned NumElements) {<br>
   SmallVector<DIGlobalVariableExpression *, 1> GVs;<br>
   GV->getDebugInfo(GVs);<br>
   for (auto *GVE : GVs) {<br>
     DIVariable *Var = GVE->getVariable();<br>
     DIExpression *Expr = GVE->getExpression();<br>
-    auto *NExpr = DIExpression::createFragmentExpression(<br>
-        Expr, FragmentOffsetInBits, FragmentSizeInBits);<br>
-    auto *NGVE = DIGlobalVariableExpression::get(GVE->getContext(), Var, NExpr);<br>
+    if (NumElements > 1)<br>
+      Expr = DIExpression::createFragmentExpression(Expr, FragmentOffsetInBits,<br>
+                                                    FragmentSizeInBits);<br>
+    auto *NGVE = DIGlobalVariableExpression::get(GVE->getContext(), Var, Expr);<br>
     NGV->addDebugInfo(NGVE);<br>
   }<br>
 }<br>
@@ -458,9 +460,10 @@ static GlobalVariable *SRAGlobal(GlobalV<br>
<br>
   if (StructType *STy = dyn_cast<StructType>(Ty)) {<br>
     uint64_t FragmentOffset = 0;<br>
-    NewGlobals.reserve(STy->getNumElements());<br>
+    unsigned NumElements = STy->getNumElements();<br>
+    NewGlobals.reserve(NumElements);<br>
     const StructLayout &Layout = *DL.getStructLayout(STy);<br>
-    for (unsigned i = 0, e = STy->getNumElements(); i != e; ++i) {<br>
+    for (unsigned i = 0, e = NumElements; i != e; ++i) {<br>
       Constant *In = Init->getAggregateElement(i);<br>
       assert(In && "Couldn't get element of initializer?");<br>
       GlobalVariable *NGV = new GlobalVariable(STy->getElementType(i), false,<br>
@@ -484,7 +487,7 @@ static GlobalVariable *SRAGlobal(GlobalV<br>
       // Copy over the debug info for the variable.<br>
       FragmentOffset = alignTo(FragmentOffset, NewAlign);<br>
       uint64_t Size = DL.getTypeSizeInBits(NGV->getValueType());<br>
-      transferSRADebugInfo(GV, NGV, FragmentOffset, Size);<br>
+      transferSRADebugInfo(GV, NGV, FragmentOffset, Size, NumElements);<br>
       FragmentOffset += Size;<br>
     }<br>
   } else if (SequentialType *STy = dyn_cast<SequentialType>(Ty)) {<br>
@@ -516,8 +519,8 @@ static GlobalVariable *SRAGlobal(GlobalV<br>
       unsigned NewAlign = (unsigned)MinAlign(StartAlignment, EltSize*i);<br>
       if (NewAlign > EltAlign)<br>
         NGV->setAlignment(NewAlign);<br>
-<br>
-      transferSRADebugInfo(GV, NGV, FragmentSizeInBits * i, FragmentSizeInBits);<br>
+      transferSRADebugInfo(GV, NGV, FragmentSizeInBits * i, FragmentSizeInBits,<br>
+                           NumElements);<br>
     }<br>
   }<br>
<br>
<br>
Added: llvm/trunk/test/DebugInfo/Generic/global-sra-single-member.ll<br>
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">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/Generic/global-sra-single-member.ll?rev=312196&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/test/DebugInfo/Generic/global-sra-single-member.ll (added)<br>
+++ llvm/trunk/test/DebugInfo/Generic/global-sra-single-member.ll Wed Aug 30 17:06:18 2017<br>
@@ -0,0 +1,53 @@<br>
+; RUN: opt -S -globalopt < %s | FileCheck %s<br>
+; struct {<br>
+;   int f0;<br>
+; } static a;<br>
+; int main() {<br>
+;   a.f0++;<br>
+;   return 0;<br>
+; }<br>
+<br>
+source_filename = "pr34390.c"<br>
+target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"<br>
+target triple = "x86_64-apple-macosx10.12.0"<br>
+<br>
+%struct.anon = type { i32 }<br>
+<br>
+; CHECK: @a.0 = internal unnamed_addr global i32 0, align 4, !dbg ![[GVE:.*]]<br>
+@a = internal global %struct.anon zeroinitializer, align 4, !dbg !0<br>
+<br>
+define i32 @main() #0 !dbg !15 {<br>
+entry:<br>
+  %retval = alloca i32, align 4<br>
+  store i32 0, i32* %retval, align 4<br>
+  %0 = load i32, i32* getelementptr inbounds (%struct.anon, %struct.anon* @a, i32 0, i32 0), align 4, !dbg !18<br>
+  %inc = add nsw i32 %0, 1, !dbg !18<br>
+  store i32 %inc, i32* getelementptr inbounds (%struct.anon, %struct.anon* @a, i32 0, i32 0), align 4, !dbg !18<br>
+  ret i32 0, !dbg !19<br>
+}<br>
+<br>
+attributes #0 = { noinline nounwind optnone ssp uwtable }<br>
+<br>
+!<a href="http://llvm.dbg.cu" rel="noreferrer" target="_blank">llvm.dbg.cu</a> = !{!2}<br>
+!llvm.module.flags = !{!10, !11, !12, !13}<br>
+<br>
+; CHECK: ![[GVE]] = !DIGlobalVariableExpression(var: !1, expr: !DIExpression())<br>
+!0 = !DIGlobalVariableExpression(var: !1, expr: !DIExpression())<br>
+!1 = distinct !DIGlobalVariable(name: "a", scope: !2, file: !3, line: 3, type: !6, isLocal: true, isDefinition: true)<br>
+!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>
+!3 = !DIFile(filename: "test.c", directory: "/")<br>
+!4 = !{}<br>
+!5 = !{!0}<br>
+!6 = distinct !DICompositeType(tag: DW_TAG_structure_type, file: !3, line: 1, size: 32, elements: !7)<br>
+!7 = !{!8}<br>
+!8 = !DIDerivedType(tag: DW_TAG_member, name: "f0", scope: !6, file: !3, line: 2, baseType: !9, size: 32)<br>
+!9 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)<br>
+!10 = !{i32 2, !"Dwarf Version", i32 4}<br>
+!11 = !{i32 2, !"Debug Info Version", i32 3}<br>
+!12 = !{i32 1, !"wchar_size", i32 4}<br>
+!13 = !{i32 7, !"PIC Level", i32 2}<br>
+!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>
+!16 = !DISubroutineType(types: !17)<br>
+!17 = !{!9}<br>
+!18 = !DILocation(line: 5, column: 7, scope: !15)<br>
+!19 = !DILocation(line: 6, column: 3, scope: !15)<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div>