Index: llvm/trunk/lib/Analysis/ValueTracking.cpp =================================================================== --- llvm/trunk/lib/Analysis/ValueTracking.cpp +++ llvm/trunk/lib/Analysis/ValueTracking.cpp @@ -2783,6 +2783,12 @@ // Widening/narrowing never change sign. return cannotBeOrderedLessThanZeroImpl(I->getOperand(0), TLI, SignBitOnly, Depth + 1); + case Instruction::ExtractElement: + // Look through extract element. At the moment we keep this simple and skip + // tracking the specific element. But at least we might find information + // valid for all elements of the vector. + return cannotBeOrderedLessThanZeroImpl(I->getOperand(0), TLI, SignBitOnly, + Depth + 1); case Instruction::Call: const auto *CI = cast(I); Intrinsic::ID IID = getIntrinsicForCallSite(CI, TLI); Index: llvm/trunk/test/Transforms/InstSimplify/floating-point-arithmetic.ll =================================================================== --- llvm/trunk/test/Transforms/InstSimplify/floating-point-arithmetic.ll +++ llvm/trunk/test/Transforms/InstSimplify/floating-point-arithmetic.ll @@ -435,3 +435,17 @@ %fabs = call float @llvm.fabs.f32(float %sqrt) ret float %fabs } + +define float @fabs_select_positive_constants_vector_extract(i32 %c) { +; CHECK-LABEL: @fabs_select_positive_constants_vector_extract( +; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[C:%.*]], 0 +; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], <2 x float> , <2 x float> +; CHECK-NEXT: [[EXTRACT:%.*]] = extractelement <2 x float> [[SELECT]], i32 0 +; CHECK-NEXT: ret float [[EXTRACT]] +; + %cmp = icmp eq i32 %c, 0 + %select = select i1 %cmp, <2 x float> , <2 x float> + %extract = extractelement <2 x float> %select, i32 0 + %fabs = call float @llvm.fabs.f32(float %extract) + ret float %fabs +}