Index: llvm/trunk/lib/Transforms/InstCombine/InstCombineCalls.cpp =================================================================== --- llvm/trunk/lib/Transforms/InstCombine/InstCombineCalls.cpp +++ llvm/trunk/lib/Transforms/InstCombine/InstCombineCalls.cpp @@ -584,7 +584,7 @@ // See if we're dealing with constant values. Constant *C0 = dyn_cast(Op0); ConstantInt *CI0 = - C0 ? dyn_cast(C0->getAggregateElement((unsigned)0)) + C0 ? dyn_cast_or_null(C0->getAggregateElement((unsigned)0)) : nullptr; // Attempt to constant fold. @@ -1856,10 +1856,10 @@ // See if we're dealing with constant values. Constant *C1 = dyn_cast(Op1); ConstantInt *CILength = - C1 ? dyn_cast(C1->getAggregateElement((unsigned)0)) + C1 ? dyn_cast_or_null(C1->getAggregateElement((unsigned)0)) : nullptr; ConstantInt *CIIndex = - C1 ? dyn_cast(C1->getAggregateElement((unsigned)1)) + C1 ? dyn_cast_or_null(C1->getAggregateElement((unsigned)1)) : nullptr; // Attempt to simplify to a constant, shuffle vector or EXTRQI call. Index: llvm/trunk/test/Transforms/InstCombine/x86-sse4a.ll =================================================================== --- llvm/trunk/test/Transforms/InstCombine/x86-sse4a.ll +++ llvm/trunk/test/Transforms/InstCombine/x86-sse4a.ll @@ -55,6 +55,15 @@ ret <2 x i64> %1 } +define <2 x i64> @test_extrq_call_constexpr(<2 x i64> %x) { +; CHECK-LABEL: @test_extrq_call_constexpr( +; CHECK-NEXT: [[TMP1:%.*]] = call <2 x i64> @llvm.x86.sse4a.extrq(<2 x i64> %x, <16 x i8> bitcast (<2 x i64> to <16 x i8>)) +; CHECK-NEXT: ret <2 x i64> [[TMP1]] +; + %1 = call <2 x i64> @llvm.x86.sse4a.extrq(<2 x i64> %x, <16 x i8> bitcast (<2 x i64> to <16 x i8>)) + ret <2 x i64> %1 +} + ; ; EXTRQI ; @@ -122,6 +131,14 @@ ret <2 x i64> %1 } +define <2 x i64> @test_extrqi_call_constexpr() { +; CHECK-LABEL: @test_extrqi_call_constexpr( +; CHECK-NEXT: ret <2 x i64> bitcast (<16 x i8> trunc (<16 x i16> bitcast (<4 x i64> to <16 x i16>) to <16 x i8>), i32 2), i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef> to <2 x i64>) +; + %1 = tail call <2 x i64> @llvm.x86.sse4a.extrqi(<2 x i64> bitcast (<16 x i8> trunc (<16 x i16> bitcast (<4 x i64> to <16 x i16>) to <16 x i8>) to <2 x i64>), i8 8, i8 16) + ret <2 x i64> %1 +} + ; ; INSERTQ ;