mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-29 10:32:47 +00:00
3da41a28a1
I reverted r208640 in r209747 because r208640 broke self-hosting on PPC64. The underlying cause of the failure is that pre-inc loads with increments represented by ISD::TargetConstants were being transformed into ISD:::ADDs with ISD::TargetConstant operands. PPC doesn't have a pattern for those, and so they were selected as invalid r+r adds. This recommits r208640, rebased and with an exclusion for ISD::TargetConstant increments. This behavior seems correct, although in the future we might want to ask the target to split out the indexing that uses ISD::TargetConstants. Unfortunately, I don't yet have small test case where the relevant invalid 'add' instruction is not itself dead (and thus eliminated by DeadMachineInstructionElim -- sometimes bugpoint is too good at removing things) Original commit message (by Adam Nemet): Right now the load may not get DCE'd because of the side-effect of updating the base pointer. This can happen if we lower a read-modify-write of an illegal larger type (e.g. i48) such that the modification only affects one of the subparts (the lower i32 part but not the higher i16 part). See the testcase. In order to spot the dead load we need to revisit it when SimplifyDemandedBits decided that the value of the load is masked off. This is the CommitTargetLoweringOpt piece. I checked compile time with ARM64 by sending SPEC bitcode files through llc. No measurable change. Fixes <rdar://problem/16031651> git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@216898 91177308-0d34-0410-b5e6-96231b3b80d8
29 lines
846 B
LLVM
29 lines
846 B
LLVM
; RUN: llc -mcpu=cyclone < %s | FileCheck %s
|
|
target datalayout = "e-i64:64-n32:64-S128"
|
|
target triple = "arm64-apple-ios"
|
|
|
|
%"struct.SU" = type { i32, %"struct.SU"*, i32*, i32, i32, %"struct.BO", i32, [5 x i8] }
|
|
%"struct.BO" = type { %"struct.RE" }
|
|
|
|
%"struct.RE" = type { i32, i32, i32, i32 }
|
|
|
|
; This is a read-modify-write of some bifields combined into an i48. It gets
|
|
; legalized into i32 and i16 accesses. Only a single store of zero to the low
|
|
; i32 part should be live.
|
|
|
|
; CHECK-LABEL: test:
|
|
; CHECK-NOT: ldr
|
|
; CHECK: str wzr
|
|
; CHECK-NOT: str
|
|
define void @test(%"struct.SU"* nocapture %su) {
|
|
entry:
|
|
%r1 = getelementptr inbounds %"struct.SU"* %su, i64 1, i32 5
|
|
%r2 = bitcast %"struct.BO"* %r1 to i48*
|
|
%r3 = load i48* %r2, align 8
|
|
%r4 = and i48 %r3, -4294967296
|
|
%r5 = or i48 0, %r4
|
|
store i48 %r5, i48* %r2, align 8
|
|
|
|
ret void
|
|
}
|