diff --git a/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp b/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp --- a/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp @@ -2097,6 +2097,18 @@ Known.Zero |= ~InMask; break; } + case ISD::EXTRACT_ELEMENT: { + SDValue Src = Op.getOperand(0); + unsigned Index = Op.getConstantOperandVal(1); + + APInt DemandedSrcBits = APInt::getNullValue(Src.getScalarValueSizeInBits()); + DemandedSrcBits.insertBits(DemandedBits, Index * BitWidth); + + if (SimplifyDemandedBits(Src, DemandedSrcBits, Known2, TLO, Depth + 1)) + return true; + Known = Known2.extractBits(BitWidth, Index * BitWidth); + break; + } case ISD::EXTRACT_VECTOR_ELT: { SDValue Src = Op.getOperand(0); SDValue Idx = Op.getOperand(1); diff --git a/llvm/test/CodeGen/PowerPC/fp128-bitcast-after-operation.ll b/llvm/test/CodeGen/PowerPC/fp128-bitcast-after-operation.ll --- a/llvm/test/CodeGen/PowerPC/fp128-bitcast-after-operation.ll +++ b/llvm/test/CodeGen/PowerPC/fp128-bitcast-after-operation.ll @@ -1,8 +1,8 @@ ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py -; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr8 < %s | FileCheck %s -check-prefix=PPC64-P8 -; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr7 < %s | FileCheck %s -check-prefix=PPC64 -; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr8 < %s | FileCheck %s -check-prefix=PPC64-P8 -; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr7 < %s | FileCheck %s -check-prefix=PPC64 +; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr8 < %s | FileCheck %s -check-prefixes=PPC64-P8,PPC64-P8-LE +; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr7 < %s | FileCheck %s -check-prefixes=PPC64,PPC64-LE +; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr8 < %s | FileCheck %s -check-prefixes=PPC64-P8,PPC64-P8-BE +; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr7 < %s | FileCheck %s -check-prefixes=PPC64,PPC64-BE ; RUN: llc -verify-machineinstrs -mtriple=powerpc-unknown-linux-gnu < %s | FileCheck %s -check-prefix=PPC32 define i128 @test_abs(ppc_fp128 %x) nounwind { @@ -89,30 +89,46 @@ } define i128 @test_copysign(ppc_fp128 %x) nounwind { -; PPC64-P8-LABEL: test_copysign: -; PPC64-P8: # %bb.0: # %entry -; PPC64-P8-NEXT: mffprd 3, 1 -; PPC64-P8-NEXT: li 4, 16399 -; PPC64-P8-NEXT: li 5, 3019 -; PPC64-P8-NEXT: rldicr 6, 3, 0, 0 -; PPC64-P8-NEXT: rldic 3, 4, 48, 1 -; PPC64-P8-NEXT: rldic 4, 5, 52, 0 -; PPC64-P8-NEXT: or 3, 6, 3 -; PPC64-P8-NEXT: xor 4, 6, 4 -; PPC64-P8-NEXT: blr +; PPC64-P8-LE-LABEL: test_copysign: +; PPC64-P8-LE: # %bb.0: # %entry +; PPC64-P8-LE-NEXT: li 3, 16399 +; PPC64-P8-LE-NEXT: li 4, 3019 +; PPC64-P8-LE-NEXT: rldic 3, 3, 48, 1 +; PPC64-P8-LE-NEXT: rldic 4, 4, 52, 0 +; PPC64-P8-LE-NEXT: blr ; -; PPC64-LABEL: test_copysign: -; PPC64: # %bb.0: # %entry -; PPC64-NEXT: stfd 1, -8(1) -; PPC64-NEXT: li 4, 16399 -; PPC64-NEXT: li 5, 3019 -; PPC64-NEXT: ld 3, -8(1) -; PPC64-NEXT: rldicr 6, 3, 0, 0 -; PPC64-NEXT: rldic 3, 4, 48, 1 -; PPC64-NEXT: rldic 4, 5, 52, 0 -; PPC64-NEXT: or 3, 6, 3 -; PPC64-NEXT: xor 4, 6, 4 -; PPC64-NEXT: blr +; PPC64-LE-LABEL: test_copysign: +; PPC64-LE: # %bb.0: # %entry +; PPC64-LE-NEXT: li 3, 16399 +; PPC64-LE-NEXT: li 4, 3019 +; PPC64-LE-NEXT: rldic 3, 3, 48, 1 +; PPC64-LE-NEXT: rldic 4, 4, 52, 0 +; PPC64-LE-NEXT: blr +; +; PPC64-P8-BE-LABEL: test_copysign: +; PPC64-P8-BE: # %bb.0: # %entry +; PPC64-P8-BE-NEXT: mffprd 3, 1 +; PPC64-P8-BE-NEXT: li 4, 16399 +; PPC64-P8-BE-NEXT: li 5, 3019 +; PPC64-P8-BE-NEXT: rldicr 6, 3, 0, 0 +; PPC64-P8-BE-NEXT: rldic 3, 4, 48, 1 +; PPC64-P8-BE-NEXT: rldic 4, 5, 52, 0 +; PPC64-P8-BE-NEXT: or 3, 6, 3 +; PPC64-P8-BE-NEXT: xor 4, 6, 4 +; PPC64-P8-BE-NEXT: blr +; +; PPC64-BE-LABEL: test_copysign: +; PPC64-BE: # %bb.0: # %entry +; PPC64-BE-NEXT: stfd 1, -8(1) +; PPC64-BE-NEXT: li 4, 16399 +; PPC64-BE-NEXT: li 5, 3019 +; PPC64-BE-NEXT: ld 3, -8(1) +; PPC64-BE-NEXT: rldicr 6, 3, 0, 0 +; PPC64-BE-NEXT: rldic 3, 4, 48, 1 +; PPC64-BE-NEXT: rldic 4, 5, 52, 0 +; PPC64-BE-NEXT: or 3, 6, 3 +; PPC64-BE-NEXT: xor 4, 6, 4 +; PPC64-BE-NEXT: blr ; ; PPC32-LABEL: test_copysign: ; PPC32: # %bb.0: # %entry