From 8a670edf1b9dc1acb1b571ccc57a4f7e9fec5865 Mon Sep 17 00:00:00 2001 From: Nick Lewycky Date: Tue, 15 Feb 2011 23:13:23 +0000 Subject: [PATCH] Teach PatternMatch that splat vectors could be floating point as well as integer. Fixes PR9228! git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@125613 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Support/PatternMatch.h | 7 +++--- test/Transforms/InstCombine/vector-casts.ll | 28 +++++++++++++++++++++ 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/include/llvm/Support/PatternMatch.h b/include/llvm/Support/PatternMatch.h index 3d6a46110e9..948ae5176ee 100644 --- a/include/llvm/Support/PatternMatch.h +++ b/include/llvm/Support/PatternMatch.h @@ -81,7 +81,8 @@ struct apint_match { return true; } if (ConstantVector *CV = dyn_cast(V)) - if (ConstantInt *CI = cast_or_null(CV->getSplatValue())) { + if (ConstantInt *CI = + dyn_cast_or_null(CV->getSplatValue())) { Res = &CI->getValue(); return true; } @@ -126,7 +127,7 @@ struct cst_pred_ty : public Predicate { if (const ConstantInt *CI = dyn_cast(V)) return this->isValue(CI->getValue()); if (const ConstantVector *CV = dyn_cast(V)) - if (ConstantInt *CI = cast_or_null(CV->getSplatValue())) + if (ConstantInt *CI = dyn_cast_or_null(CV->getSplatValue())) return this->isValue(CI->getValue()); return false; } @@ -146,7 +147,7 @@ struct api_pred_ty : public Predicate { return true; } if (const ConstantVector *CV = dyn_cast(V)) - if (ConstantInt *CI = cast_or_null(CV->getSplatValue())) + if (ConstantInt *CI = dyn_cast_or_null(CV->getSplatValue())) if (this->isValue(CI->getValue())) { Res = &CI->getValue(); return true; diff --git a/test/Transforms/InstCombine/vector-casts.ll b/test/Transforms/InstCombine/vector-casts.ll index 24bd04dcb2d..e931dc79ef4 100644 --- a/test/Transforms/InstCombine/vector-casts.ll +++ b/test/Transforms/InstCombine/vector-casts.ll @@ -121,3 +121,31 @@ define <2 x double> @fc(<2 x double> %t) { %b = sitofp <2 x i64> %a to <2 x double> ret <2 x double> %b } + +; PR9228 +; This was a crasher, so no CHECK statements. +define <4 x float> @f(i32 %a) nounwind alwaysinline { +; CHECK: @f +entry: + %dim = insertelement <4 x i32> undef, i32 %a, i32 0 + %dim30 = insertelement <4 x i32> %dim, i32 %a, i32 1 + %dim31 = insertelement <4 x i32> %dim30, i32 %a, i32 2 + %dim32 = insertelement <4 x i32> %dim31, i32 %a, i32 3 + + %offset_ptr = getelementptr <4 x float>* null, i32 1 + %offset_int = ptrtoint <4 x float>* %offset_ptr to i64 + %sizeof32 = trunc i64 %offset_int to i32 + + %smearinsert33 = insertelement <4 x i32> undef, i32 %sizeof32, i32 0 + %smearinsert34 = insertelement <4 x i32> %smearinsert33, i32 %sizeof32, i32 1 + %smearinsert35 = insertelement <4 x i32> %smearinsert34, i32 %sizeof32, i32 2 + %smearinsert36 = insertelement <4 x i32> %smearinsert35, i32 %sizeof32, i32 3 + + %delta_scale = mul <4 x i32> %dim32, %smearinsert36 + %offset_delta = add <4 x i32> zeroinitializer, %delta_scale + + %offset_varying_delta = add <4 x i32> %offset_delta, undef + + ret <4 x float> undef +} +