mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-09-05 01:30:18 +00:00
FCAs. This is essential in order to promote allocas that are used in struct returns by frontends like Clang. The FCA load would block the rest of the pass from firing, resulting is significant regressions with the bullet benchmark in the nightly test suite. Thanks to Duncan for repeated discussions about how best to do this, and to both him and Benjamin for review. This appears to have blocked many places where the pass tries to fire, and so I'm expect somewhat different results with this fix added. As with the last big patch, I'm including a change to enable the SROA by default *temporarily*. Ben is going to remove this as soon as the LNT bots pick up the patch. I'm just trying to get a round of LNT numbers from the stable machines in the lab. NOTE: Four clang tests are expected to fail in the brief window where this is enabled. Sorry for the noise! git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@164119 91177308-0d34-0410-b5e6-96231b3b80d8
50 lines
1.5 KiB
LLVM
50 lines
1.5 KiB
LLVM
; RUN: opt < %s -sroa -S | FileCheck %s
|
|
; RUN: opt < %s -sroa -force-ssa-updater -S | FileCheck %s
|
|
target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-n8:16:32:64"
|
|
|
|
define { i32, i32 } @test0(i32 %x, i32 %y) {
|
|
; CHECK: @test0
|
|
; CHECK-NOT: alloca
|
|
; CHECK: insertvalue { i32, i32 }
|
|
; CHECK: insertvalue { i32, i32 }
|
|
; CHECK: ret { i32, i32 }
|
|
|
|
entry:
|
|
%a = alloca { i32, i32 }
|
|
|
|
store { i32, i32 } undef, { i32, i32 }* %a
|
|
|
|
%gep1 = getelementptr inbounds { i32, i32 }* %a, i32 0, i32 0
|
|
store i32 %x, i32* %gep1
|
|
%gep2 = getelementptr inbounds { i32, i32 }* %a, i32 0, i32 1
|
|
store i32 %y, i32* %gep2
|
|
|
|
%result = load { i32, i32 }* %a
|
|
ret { i32, i32 } %result
|
|
}
|
|
|
|
define { i32, i32 } @test1(i32 %x, i32 %y) {
|
|
; FIXME: This may be too conservative. Duncan argues that we are allowed to
|
|
; split the volatile load and store here but must produce volatile scalar loads
|
|
; and stores from them.
|
|
; CHECK: @test1
|
|
; CHECK: alloca
|
|
; CHECK: alloca
|
|
; CHECK: load volatile { i32, i32 }*
|
|
; CHECK: store volatile { i32, i32 }
|
|
; CHECK: ret { i32, i32 }
|
|
|
|
entry:
|
|
%a = alloca { i32, i32 }
|
|
%b = alloca { i32, i32 }
|
|
|
|
%gep1 = getelementptr inbounds { i32, i32 }* %a, i32 0, i32 0
|
|
store i32 %x, i32* %gep1
|
|
%gep2 = getelementptr inbounds { i32, i32 }* %a, i32 0, i32 1
|
|
store i32 %y, i32* %gep2
|
|
|
|
%result = load volatile { i32, i32 }* %a
|
|
store volatile { i32, i32 } %result, { i32, i32 }* %b
|
|
ret { i32, i32 } %result
|
|
}
|