[LLVMbugs] [Bug 14059] New: [SROA] New SRoA regression with ABI conversion

bugzilla-daemon at llvm.org bugzilla-daemon at llvm.org
Wed Oct 10 18:09:01 PDT 2012


http://llvm.org/bugs/show_bug.cgi?id=14059

             Bug #: 14059
           Summary: [SROA] New SRoA regression with ABI conversion
           Product: libraries
           Version: trunk
          Platform: PC
        OS/Version: All
            Status: NEW
          Severity: enhancement
          Priority: P
         Component: Scalar Optimizations
        AssignedTo: unassignedbugs at nondot.org
        ReportedBy: daniel at zuster.org
                CC: llvmbugs at cs.uiuc.edu
    Classification: Unclassified


It's not clear to me yet who is to blame, but new SROA is triggering in poor
code on the following example. This is due to the interaction between SROA,
inlining, and ABI conversion. With old SROA we cleaned things up nicely, but
with new SROA we are ending up with gratuitously ugly IR.

This is the root cause of a ~8% regression on
SingleSource/Benchmarks/Misc/mandel.c on ARM.

--
$ cat t.c
double __complex__ accum;
static void emit(double __complex__ X) {
  accum += X;
}

void f0() {
  double __complex__ c = 1 + 1.0i;
  emit(c);
}


$ daclang -target armv7-apple-darwin -flto -O3 -S -o - t.c
; ModuleID = 't.c'
target datalayout =
"e-p: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-n32-S32"
target triple = "thumbv7-apple-ios3.0.0"

@accum = common global { double, double } zeroinitializer, align 8

define void @f0() nounwind ssp {
entry:
  %X.sroa.0.i = alloca double, align 8
  %X.sroa.1.i = alloca double, align 8
  %X.sroa.0.i.0.cast13 = bitcast double* %X.sroa.0.i to i8*
  call void @llvm.lifetime.start(i64 8, i8* %X.sroa.0.i.0.cast13)
  %X.sroa.1.i.0.cast11 = bitcast double* %X.sroa.1.i to i8*
  call void @llvm.lifetime.start(i64 8, i8* %X.sroa.1.i.0.cast11)
  %X.sroa.0.i.0.cast14 = bitcast double* %X.sroa.0.i to i32*
  store i32 0, i32* %X.sroa.0.i.0.cast14, align 8
  %X.sroa.0.i.4.raw_idx = getelementptr inbounds i8* %X.sroa.0.i.0.cast13, i32
4
  %X.sroa.0.i.4.cast = bitcast i8* %X.sroa.0.i.4.raw_idx to i32*
  store i32 1072693248, i32* %X.sroa.0.i.4.cast, align 4
  %X.sroa.1.i.0.cast12 = bitcast double* %X.sroa.1.i to i32*
  store i32 0, i32* %X.sroa.1.i.0.cast12, align 8
  %X.sroa.1.i.4.raw_idx = getelementptr inbounds i8* %X.sroa.1.i.0.cast11, i32
4
  %X.sroa.1.i.4.cast = bitcast i8* %X.sroa.1.i.4.raw_idx to i32*
  store i32 1072693248, i32* %X.sroa.1.i.4.cast, align 4
  %X.real.i = load double* %X.sroa.0.i, align 8
  %X.imag.i = load double* %X.sroa.1.i, align 8
  %accum.real.i = load double* getelementptr inbounds ({ double, double }*
@accum, i32 0, i32 0), align 8
  %accum.imag.i = load double* getelementptr inbounds ({ double, double }*
@accum, i32 0, i32 1), align 8
  %add.r.i = fadd double %X.real.i, %accum.real.i
  %add.i.i = fadd double %X.imag.i, %accum.imag.i
  store double %add.r.i, double* getelementptr inbounds ({ double, double }*
@accum, i32 0, i32 0), align 8
  store double %add.i.i, double* getelementptr inbounds ({ double, double }*
@accum, i32 0, i32 1), align 8
  call void @llvm.lifetime.end(i64 8, i8* %X.sroa.0.i.0.cast13)
  call void @llvm.lifetime.end(i64 8, i8* %X.sroa.1.i.0.cast11)
  ret void
}

declare void @llvm.lifetime.start(i64, i8* nocapture) nounwind

declare void @llvm.lifetime.end(i64, i8* nocapture) nounwind



$ daclang -target armv7-apple-darwin -flto -O3 -S -o - t.c -mllvm
-use-new-sroa=0
; ModuleID = 't.c'
target datalayout =
"e-p: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-n32-S32"
target triple = "thumbv7-apple-ios3.0.0"

@accum = common global { double, double } zeroinitializer, align 8

define void @f0() nounwind ssp {
entry:
  %accum.real.i = load double* getelementptr inbounds ({ double, double }*
@accum, i32 0, i32 0), align 8
  %accum.imag.i = load double* getelementptr inbounds ({ double, double }*
@accum, i32 0, i32 1), align 8
  %add.r.i = fadd double %accum.real.i, 1.000000e+00
  %add.i.i = fadd double %accum.imag.i, 1.000000e+00
  store double %add.r.i, double* getelementptr inbounds ({ double, double }*
@accum, i32 0, i32 0), align 8
  store double %add.i.i, double* getelementptr inbounds ({ double, double }*
@accum, i32 0, i32 1), align 8
  ret void
}
--

-- 
Configure bugmail: http://llvm.org/bugs/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are on the CC list for the bug.



More information about the llvm-bugs mailing list