mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-20 03:23:01 +02:00
[DAGCombiner] Set the right SDLoc on extended SETCC uses (7/N)
ExtendSetCCUses updates SETCC nodes which use a load (OriginalLoad) to reflect a simplification to the load (ExtLoad). Based on my reading, ExtendSetCCUses may create new nodes to extend a constant attached to a SETCC. It also creates fresh SETCC nodes which refer to any updated operands. ISTM that the location applied to the new constant and SETCC nodes should be the same as the location of the ExtLoad. This was suggested by Adrian in https://reviews.llvm.org/D45995. Part of: llvm.org/PR37262 Differential Revision: https://reviews.llvm.org/D46216 llvm-svn: 332119
This commit is contained in:
parent
8a31d7c70d
commit
d39b740ee3
@ -591,7 +591,6 @@ namespace {
|
||||
|
||||
void ExtendSetCCUses(const SmallVectorImpl<SDNode *> &SetCCs,
|
||||
SDValue OrigLoad, SDValue ExtLoad,
|
||||
const SDLoc &DL,
|
||||
ISD::NodeType ExtType);
|
||||
};
|
||||
|
||||
@ -7496,10 +7495,10 @@ static bool ExtendUsesToFormExtLoad(EVT VT, SDNode *N, SDValue N0,
|
||||
|
||||
void DAGCombiner::ExtendSetCCUses(const SmallVectorImpl<SDNode *> &SetCCs,
|
||||
SDValue OrigLoad, SDValue ExtLoad,
|
||||
const SDLoc &DL, ISD::NodeType ExtType) {
|
||||
ISD::NodeType ExtType) {
|
||||
// Extend SetCC uses if necessary.
|
||||
for (unsigned i = 0, e = SetCCs.size(); i != e; ++i) {
|
||||
SDNode *SetCC = SetCCs[i];
|
||||
SDLoc DL(ExtLoad);
|
||||
for (SDNode *SetCC : SetCCs) {
|
||||
SmallVector<SDValue, 4> Ops;
|
||||
|
||||
for (unsigned j = 0; j != 2; ++j) {
|
||||
@ -7607,8 +7606,7 @@ SDValue DAGCombiner::CombineExtLoad(SDNode *N) {
|
||||
// with a truncate of the concatenated sextloaded vectors.
|
||||
SDValue Trunc =
|
||||
DAG.getNode(ISD::TRUNCATE, SDLoc(N0), N0.getValueType(), NewValue);
|
||||
ExtendSetCCUses(SetCCs, N0, NewValue, DL,
|
||||
(ISD::NodeType)N->getOpcode());
|
||||
ExtendSetCCUses(SetCCs, N0, NewValue, (ISD::NodeType)N->getOpcode());
|
||||
CombineTo(N0.getNode(), Trunc, NewChain);
|
||||
return SDValue(N, 0); // Return N so it doesn't get rechecked!
|
||||
}
|
||||
@ -7672,8 +7670,7 @@ SDValue DAGCombiner::CombineZExtLogicopShiftLoad(SDNode *N) {
|
||||
SDValue And = DAG.getNode(N0.getOpcode(), DL0, VT, Shift,
|
||||
DAG.getConstant(Mask, DL0, VT));
|
||||
|
||||
ExtendSetCCUses(SetCCs, N1.getOperand(0), ExtLoad, SDLoc(Load),
|
||||
ISD::ZERO_EXTEND);
|
||||
ExtendSetCCUses(SetCCs, N1.getOperand(0), ExtLoad, ISD::ZERO_EXTEND);
|
||||
CombineTo(N, And);
|
||||
if (SDValue(Load, 0).hasOneUse()) {
|
||||
DAG.ReplaceAllUsesOfValueWith(SDValue(Load, 1), ExtLoad.getValue(1));
|
||||
@ -7763,7 +7760,7 @@ static SDValue tryToFoldExtOfExtload(SelectionDAG &DAG, DAGCombiner &Combiner,
|
||||
static SDValue tryToFoldExtOfLoad(SelectionDAG &DAG, DAGCombiner &Combiner,
|
||||
const TargetLowering &TLI, EVT VT,
|
||||
bool LegalOperations, SDNode *N, SDValue N0,
|
||||
SDLoc DL, ISD::LoadExtType ExtLoadType,
|
||||
ISD::LoadExtType ExtLoadType,
|
||||
ISD::NodeType ExtOpc) {
|
||||
if (!ISD::isNON_EXTLoad(N0.getNode()) ||
|
||||
!ISD::isUNINDEXEDLoad(N0.getNode()) ||
|
||||
@ -7785,7 +7782,7 @@ static SDValue tryToFoldExtOfLoad(SelectionDAG &DAG, DAGCombiner &Combiner,
|
||||
SDValue ExtLoad = DAG.getExtLoad(ExtLoadType, SDLoc(LN0), VT, LN0->getChain(),
|
||||
LN0->getBasePtr(), N0.getValueType(),
|
||||
LN0->getMemOperand());
|
||||
Combiner.ExtendSetCCUses(SetCCs, N0, ExtLoad, DL, ExtOpc);
|
||||
Combiner.ExtendSetCCUses(SetCCs, N0, ExtLoad, ExtOpc);
|
||||
// If the load value is used only by N, replace it via CombineTo N.
|
||||
bool NoReplaceTrunc = SDValue(LN0, 0).hasOneUse();
|
||||
Combiner.CombineTo(N, ExtLoad);
|
||||
@ -7863,9 +7860,9 @@ SDValue DAGCombiner::visitSIGN_EXTEND(SDNode *N) {
|
||||
}
|
||||
}
|
||||
|
||||
// Try to fold (sext (load x)) to a smaller sextload.
|
||||
// Try to simplify (sext (load x)).
|
||||
if (SDValue foldedExt =
|
||||
tryToFoldExtOfLoad(DAG, *this, TLI, VT, LegalOperations, N, N0, DL,
|
||||
tryToFoldExtOfLoad(DAG, *this, TLI, VT, LegalOperations, N, N0,
|
||||
ISD::SEXTLOAD, ISD::SIGN_EXTEND))
|
||||
return foldedExt;
|
||||
|
||||
@ -7902,8 +7899,7 @@ SDValue DAGCombiner::visitSIGN_EXTEND(SDNode *N) {
|
||||
Mask = Mask.sext(VT.getSizeInBits());
|
||||
SDValue And = DAG.getNode(N0.getOpcode(), DL, VT,
|
||||
ExtLoad, DAG.getConstant(Mask, DL, VT));
|
||||
ExtendSetCCUses(SetCCs, N0.getOperand(0), ExtLoad, DL,
|
||||
ISD::SIGN_EXTEND);
|
||||
ExtendSetCCUses(SetCCs, N0.getOperand(0), ExtLoad, ISD::SIGN_EXTEND);
|
||||
bool NoReplaceTruncAnd = !N0.hasOneUse();
|
||||
bool NoReplaceTrunc = SDValue(LN00, 0).hasOneUse();
|
||||
CombineTo(N, And);
|
||||
@ -8134,7 +8130,7 @@ SDValue DAGCombiner::visitZERO_EXTEND(SDNode *N) {
|
||||
// Try to simplify (zext (load x)).
|
||||
if (SDValue foldedExt =
|
||||
tryToFoldExtOfLoad(DAG, *this, TLI, VT, LegalOperations, N, N0,
|
||||
SDLoc(N), ISD::ZEXTLOAD, ISD::ZERO_EXTEND))
|
||||
ISD::ZEXTLOAD, ISD::ZERO_EXTEND))
|
||||
return foldedExt;
|
||||
|
||||
// fold (zext (load x)) to multiple smaller zextloads.
|
||||
@ -8179,8 +8175,7 @@ SDValue DAGCombiner::visitZERO_EXTEND(SDNode *N) {
|
||||
SDLoc DL(N);
|
||||
SDValue And = DAG.getNode(N0.getOpcode(), DL, VT,
|
||||
ExtLoad, DAG.getConstant(Mask, DL, VT));
|
||||
ExtendSetCCUses(SetCCs, N0.getOperand(0), ExtLoad, DL,
|
||||
ISD::ZERO_EXTEND);
|
||||
ExtendSetCCUses(SetCCs, N0.getOperand(0), ExtLoad, ISD::ZERO_EXTEND);
|
||||
bool NoReplaceTruncAnd = !N0.hasOneUse();
|
||||
bool NoReplaceTrunc = SDValue(LN00, 0).hasOneUse();
|
||||
CombineTo(N, And);
|
||||
@ -8356,8 +8351,7 @@ SDValue DAGCombiner::visitANY_EXTEND(SDNode *N) {
|
||||
LN0->getChain(),
|
||||
LN0->getBasePtr(), N0.getValueType(),
|
||||
LN0->getMemOperand());
|
||||
ExtendSetCCUses(SetCCs, N0, ExtLoad, SDLoc(N),
|
||||
ISD::ANY_EXTEND);
|
||||
ExtendSetCCUses(SetCCs, N0, ExtLoad, ISD::ANY_EXTEND);
|
||||
// If the load value is used only by N, replace it via CombineTo N.
|
||||
bool NoReplaceTrunc = N0.hasOneUse();
|
||||
CombineTo(N, ExtLoad);
|
||||
|
48
test/CodeGen/X86/extend-set-cc-uses-dbg.ll
Normal file
48
test/CodeGen/X86/extend-set-cc-uses-dbg.ll
Normal file
@ -0,0 +1,48 @@
|
||||
; RUN: llc < %s -O0 -stop-after=livedebugvalues -o - | FileCheck %s
|
||||
|
||||
target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
|
||||
target triple = "x86_64-apple-macosx10.13.0"
|
||||
|
||||
define void @foo(i32* %p) !dbg !4 {
|
||||
bb:
|
||||
%tmp = load i32, i32* %p, align 4, !dbg !7
|
||||
; CHECK: $eax = MOV32rm killed {{.*}} $rdi, {{.*}} debug-location !7 :: (load 4 from %ir.p)
|
||||
; CHECK-NEXT: $edi = MOV32rr killed $eax, implicit-def $rdi, debug-location !7
|
||||
; CHECK-NEXT: $rcx = MOV64rr $rdi, debug-location !7
|
||||
|
||||
switch i32 %tmp, label %bb7 [
|
||||
i32 0, label %bb1
|
||||
i32 1, label %bb2
|
||||
i32 2, label %bb3
|
||||
i32 3, label %bb4
|
||||
], !dbg !8
|
||||
|
||||
bb1: ; preds = %bb
|
||||
unreachable
|
||||
|
||||
bb2: ; preds = %bb
|
||||
unreachable
|
||||
|
||||
bb3: ; preds = %bb
|
||||
unreachable
|
||||
|
||||
bb4: ; preds = %bb
|
||||
unreachable
|
||||
|
||||
bb7: ; preds = %bb
|
||||
ret void, !dbg !9
|
||||
}
|
||||
|
||||
!llvm.dbg.cu = !{!0}
|
||||
!llvm.module.flags = !{!2, !3}
|
||||
|
||||
!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !1, producer: "clang version 7.0.0 (trunk 330770) (llvm/trunk 330769)", isOptimized: true, runtimeVersion: 0, emissionKind: LineTablesOnly)
|
||||
!1 = !DIFile(filename: "/Users/vsk/src/llvm.org-master/llvm/lib/Demangle/ItaniumDemangle.cpp", directory: "/Users/vsk/src/builds/llvm.org-master-RA-stage2")
|
||||
!2 = !{i32 2, !"Debug Info Version", i32 3}
|
||||
!3 = !{i32 7, !"PIC Level", i32 2}
|
||||
!4 = distinct !DISubprogram(name: "printLeft", scope: !1, file: !1, line: 1306, type: !5, isLocal: true, isDefinition: true, scopeLine: 1306, flags: DIFlagPrototyped, isOptimized: true, unit: !0)
|
||||
!5 = !DISubroutineType(types: !6)
|
||||
!6 = !{}
|
||||
!7 = !DILocation(line: 1307, column: 13, scope: !4)
|
||||
!8 = !DILocation(line: 1307, column: 5, scope: !4)
|
||||
!9 = !DILocation(line: 1327, column: 3, scope: !4)
|
@ -38,11 +38,11 @@ define void @foo() {
|
||||
; X64-LABEL: foo:
|
||||
; X64: # %bb.0: # %entry
|
||||
; X64-NEXT: movzbl {{.*}}(%rip), %eax
|
||||
; X64-NEXT: testb %al, %al
|
||||
; X64-NEXT: setne -{{[0-9]+}}(%rsp)
|
||||
; X64-NEXT: xorl %ecx, %ecx
|
||||
; X64-NEXT: testl %eax, %eax
|
||||
; X64-NEXT: setne %cl
|
||||
; X64-NEXT: testb %al, %al
|
||||
; X64-NEXT: setne -{{[0-9]+}}(%rsp)
|
||||
; X64-NEXT: xorl %edx, %edx
|
||||
; X64-NEXT: cmpl %eax, %ecx
|
||||
; X64-NEXT: setle %dl
|
||||
@ -160,12 +160,12 @@ define void @f1() {
|
||||
; X64-LABEL: f1:
|
||||
; X64: # %bb.0: # %entry
|
||||
; X64-NEXT: movslq {{.*}}(%rip), %rax
|
||||
; X64-NEXT: movabsq $-8381627093, %rcx # imm = 0xFFFFFFFE0C6A852B
|
||||
; X64-NEXT: cmpq %rcx, %rax
|
||||
; X64-NEXT: setne -{{[0-9]+}}(%rsp)
|
||||
; X64-NEXT: xorl %ecx, %ecx
|
||||
; X64-NEXT: cmpq $-1, %rax
|
||||
; X64-NEXT: sete %cl
|
||||
; X64-NEXT: movabsq $-8381627093, %rdx # imm = 0xFFFFFFFE0C6A852B
|
||||
; X64-NEXT: cmpq %rdx, %rax
|
||||
; X64-NEXT: setne -{{[0-9]+}}(%rsp)
|
||||
; X64-NEXT: xorl %edx, %edx
|
||||
; X64-NEXT: cmpl $-1, %eax
|
||||
; X64-NEXT: sete %dl
|
||||
@ -250,19 +250,19 @@ define void @f1() {
|
||||
; 686-NEXT: .cfi_offset %esi, -12
|
||||
; 686-NEXT: .cfi_offset %edi, -8
|
||||
; 686-NEXT: movl var_5, %edx
|
||||
; 686-NEXT: movl %edx, %eax
|
||||
; 686-NEXT: xorl $208307499, %eax # imm = 0xC6A852B
|
||||
; 686-NEXT: movl %edx, %esi
|
||||
; 686-NEXT: sarl $31, %esi
|
||||
; 686-NEXT: movl %esi, %ecx
|
||||
; 686-NEXT: xorl $-2, %ecx
|
||||
; 686-NEXT: orl %eax, %ecx
|
||||
; 686-NEXT: setne (%esp)
|
||||
; 686-NEXT: movl %edx, %ecx
|
||||
; 686-NEXT: andl %esi, %ecx
|
||||
; 686-NEXT: xorl %eax, %eax
|
||||
; 686-NEXT: cmpl $-1, %ecx
|
||||
; 686-NEXT: sete %al
|
||||
; 686-NEXT: movl %edx, %ecx
|
||||
; 686-NEXT: xorl $208307499, %ecx # imm = 0xC6A852B
|
||||
; 686-NEXT: movl %esi, %edi
|
||||
; 686-NEXT: xorl $-2, %edi
|
||||
; 686-NEXT: orl %ecx, %edi
|
||||
; 686-NEXT: setne (%esp)
|
||||
; 686-NEXT: xorl %ecx, %ecx
|
||||
; 686-NEXT: cmpl $-1, %edx
|
||||
; 686-NEXT: sete %cl
|
||||
|
Loading…
Reference in New Issue
Block a user