Index: llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp =================================================================== --- llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -591,7 +591,6 @@ void ExtendSetCCUses(const SmallVectorImpl &SetCCs, SDValue OrigLoad, SDValue ExtLoad, - const SDLoc &DL, ISD::NodeType ExtType); }; @@ -7496,10 +7495,10 @@ void DAGCombiner::ExtendSetCCUses(const SmallVectorImpl &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 Ops; for (unsigned j = 0; j != 2; ++j) { @@ -7607,8 +7606,7 @@ // 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 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 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 @@ 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 @@ } } - // 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 @@ 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 @@ // 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 @@ 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 @@ 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); Index: llvm/trunk/test/CodeGen/X86/extend-set-cc-uses-dbg.ll =================================================================== --- llvm/trunk/test/CodeGen/X86/extend-set-cc-uses-dbg.ll +++ llvm/trunk/test/CodeGen/X86/extend-set-cc-uses-dbg.ll @@ -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) Index: llvm/trunk/test/CodeGen/X86/pr32284.ll =================================================================== --- llvm/trunk/test/CodeGen/X86/pr32284.ll +++ llvm/trunk/test/CodeGen/X86/pr32284.ll @@ -38,11 +38,11 @@ ; 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 @@ ; 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 @@ ; 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