From ed5c317d76a2ac793a3c1d037c8c4c9ab5e7988a Mon Sep 17 00:00:00 2001 From: Philip Reames Date: Thu, 24 Jan 2019 19:35:28 +0000 Subject: [PATCH] Test cases for demanded elements on vector GEPs This is the first part of splitting apart https://reviews.llvm.org/D57140 into usuable pieces. Landing the tests in advance of posting a review specifically for the demanded elements part. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@352091 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../InstCombine/vec_demanded_elts.ll | 127 ++++++++++++++++++ 1 file changed, 127 insertions(+) diff --git a/test/Transforms/InstCombine/vec_demanded_elts.ll b/test/Transforms/InstCombine/vec_demanded_elts.ll index 838bc535888..97c347846ec 100644 --- a/test/Transforms/InstCombine/vec_demanded_elts.ll +++ b/test/Transforms/InstCombine/vec_demanded_elts.ll @@ -496,3 +496,130 @@ define <3 x float> @shuf_frem_const_op1(<3 x float> %x) { ret <3 x float> %r } +;; TODO: getelementptr tests below show missing simplifications for +;; vector demanded elements on vector geps. + +define i32* @gep_vbase_w_s_idx(<2 x i32*> %base) { +; CHECK-LABEL: @gep_vbase_w_s_idx( +; CHECK-NEXT: [[GEP:%.*]] = getelementptr i32, <2 x i32*> [[BASE:%.*]], i64 1 +; CHECK-NEXT: [[EE:%.*]] = extractelement <2 x i32*> [[GEP]], i32 1 +; CHECK-NEXT: ret i32* [[EE]] +; + %gep = getelementptr i32, <2 x i32*> %base, i64 1 + %ee = extractelement <2 x i32*> %gep, i32 1 + ret i32* %ee +} + +define i32* @gep_splat_base_w_s_idx(i32* %base) { +; CHECK-LABEL: @gep_splat_base_w_s_idx( +; CHECK-NEXT: [[BASEVEC1:%.*]] = insertelement <2 x i32*> undef, i32* [[BASE:%.*]], i32 0 +; CHECK-NEXT: [[BASEVEC2:%.*]] = shufflevector <2 x i32*> [[BASEVEC1]], <2 x i32*> undef, <2 x i32> zeroinitializer +; CHECK-NEXT: [[GEP:%.*]] = getelementptr i32, <2 x i32*> [[BASEVEC2]], i64 1 +; CHECK-NEXT: [[EE:%.*]] = extractelement <2 x i32*> [[GEP]], i32 1 +; CHECK-NEXT: ret i32* [[EE]] +; + %basevec1 = insertelement <2 x i32*> undef, i32* %base, i32 0 + %basevec2 = shufflevector <2 x i32*> %basevec1, <2 x i32*> undef, <2 x i32> zeroinitializer + %gep = getelementptr i32, <2 x i32*> %basevec2, i64 1 + %ee = extractelement <2 x i32*> %gep, i32 1 + ret i32* %ee +} + + +define i32* @gep_splat_base_w_cv_idx(i32* %base) { +; CHECK-LABEL: @gep_splat_base_w_cv_idx( +; CHECK-NEXT: [[BASEVEC1:%.*]] = insertelement <2 x i32*> undef, i32* [[BASE:%.*]], i32 0 +; CHECK-NEXT: [[BASEVEC2:%.*]] = shufflevector <2 x i32*> [[BASEVEC1]], <2 x i32*> undef, <2 x i32> zeroinitializer +; CHECK-NEXT: [[GEP:%.*]] = getelementptr i32, <2 x i32*> [[BASEVEC2]], <2 x i64> +; CHECK-NEXT: [[EE:%.*]] = extractelement <2 x i32*> [[GEP]], i32 1 +; CHECK-NEXT: ret i32* [[EE]] +; + %basevec1 = insertelement <2 x i32*> undef, i32* %base, i32 0 + %basevec2 = shufflevector <2 x i32*> %basevec1, <2 x i32*> undef, <2 x i32> zeroinitializer + %gep = getelementptr i32, <2 x i32*> %basevec2, <2 x i64> + %ee = extractelement <2 x i32*> %gep, i32 1 + ret i32* %ee +} + +define i32* @gep_splat_base_w_vidx(i32* %base, <2 x i64> %idxvec) { +; CHECK-LABEL: @gep_splat_base_w_vidx( +; CHECK-NEXT: [[BASEVEC1:%.*]] = insertelement <2 x i32*> undef, i32* [[BASE:%.*]], i32 0 +; CHECK-NEXT: [[BASEVEC2:%.*]] = shufflevector <2 x i32*> [[BASEVEC1]], <2 x i32*> undef, <2 x i32> zeroinitializer +; CHECK-NEXT: [[GEP:%.*]] = getelementptr i32, <2 x i32*> [[BASEVEC2]], <2 x i64> [[IDXVEC:%.*]] +; CHECK-NEXT: [[EE:%.*]] = extractelement <2 x i32*> [[GEP]], i32 1 +; CHECK-NEXT: ret i32* [[EE]] +; + %basevec1 = insertelement <2 x i32*> undef, i32* %base, i32 0 + %basevec2 = shufflevector <2 x i32*> %basevec1, <2 x i32*> undef, <2 x i32> zeroinitializer + %gep = getelementptr i32, <2 x i32*> %basevec2, <2 x i64> %idxvec + %ee = extractelement <2 x i32*> %gep, i32 1 + ret i32* %ee +} + + +@GLOBAL = internal global i32 zeroinitializer + +define i32* @gep_cvbase_w_s_idx(<2 x i32*> %base, i64 %raw_addr) { +; CHECK-LABEL: @gep_cvbase_w_s_idx( +; CHECK-NEXT: [[GEP:%.*]] = getelementptr i32, <2 x i32*> , i64 [[RAW_ADDR:%.*]] +; CHECK-NEXT: [[EE:%.*]] = extractelement <2 x i32*> [[GEP]], i32 1 +; CHECK-NEXT: ret i32* [[EE]] +; + %gep = getelementptr i32, <2 x i32*> , i64 %raw_addr + %ee = extractelement <2 x i32*> %gep, i32 1 + ret i32* %ee +} + +define i32* @gep_cvbase_w_cv_idx(<2 x i32*> %base, i64 %raw_addr) { +; CHECK-LABEL: @gep_cvbase_w_cv_idx( +; CHECK-NEXT: ret i32* extractelement (<2 x i32*> getelementptr (i32, <2 x i32*> , <2 x i64> ), i32 1) +; + %gep = getelementptr i32, <2 x i32*> , <2 x i64> + %ee = extractelement <2 x i32*> %gep, i32 1 + ret i32* %ee +} + + +define i32* @gep_sbase_w_cv_idx(i32* %base) { +; CHECK-LABEL: @gep_sbase_w_cv_idx( +; CHECK-NEXT: [[GEP:%.*]] = getelementptr i32, i32* [[BASE:%.*]], <2 x i64> +; CHECK-NEXT: [[EE:%.*]] = extractelement <2 x i32*> [[GEP]], i32 1 +; CHECK-NEXT: ret i32* [[EE]] +; + %gep = getelementptr i32, i32* %base, <2 x i64> + %ee = extractelement <2 x i32*> %gep, i32 1 + ret i32* %ee +} + +define i32* @gep_sbase_w_splat_idx(i32* %base, i64 %idx) { +; CHECK-LABEL: @gep_sbase_w_splat_idx( +; CHECK-NEXT: [[IDXVEC1:%.*]] = insertelement <2 x i64> undef, i64 [[IDX:%.*]], i32 0 +; CHECK-NEXT: [[IDXVEC2:%.*]] = shufflevector <2 x i64> [[IDXVEC1]], <2 x i64> undef, <2 x i32> zeroinitializer +; CHECK-NEXT: [[GEP:%.*]] = getelementptr i32, i32* [[BASE:%.*]], <2 x i64> [[IDXVEC2]] +; CHECK-NEXT: [[EE:%.*]] = extractelement <2 x i32*> [[GEP]], i32 1 +; CHECK-NEXT: ret i32* [[EE]] +; + %idxvec1 = insertelement <2 x i64> undef, i64 %idx, i32 0 + %idxvec2 = shufflevector <2 x i64> %idxvec1, <2 x i64> undef, <2 x i32> zeroinitializer + %gep = getelementptr i32, i32* %base, <2 x i64> %idxvec2 + %ee = extractelement <2 x i32*> %gep, i32 1 + ret i32* %ee +} +define i32* @gep_splat_both(i32* %base, i64 %idx) { +; CHECK-LABEL: @gep_splat_both( +; CHECK-NEXT: [[BASEVEC1:%.*]] = insertelement <2 x i32*> undef, i32* [[BASE:%.*]], i32 0 +; CHECK-NEXT: [[BASEVEC2:%.*]] = shufflevector <2 x i32*> [[BASEVEC1]], <2 x i32*> undef, <2 x i32> zeroinitializer +; CHECK-NEXT: [[IDXVEC1:%.*]] = insertelement <2 x i64> undef, i64 [[IDX:%.*]], i32 0 +; CHECK-NEXT: [[IDXVEC2:%.*]] = shufflevector <2 x i64> [[IDXVEC1]], <2 x i64> undef, <2 x i32> zeroinitializer +; CHECK-NEXT: [[GEP:%.*]] = getelementptr i32, <2 x i32*> [[BASEVEC2]], <2 x i64> [[IDXVEC2]] +; CHECK-NEXT: [[EE:%.*]] = extractelement <2 x i32*> [[GEP]], i32 1 +; CHECK-NEXT: ret i32* [[EE]] +; + %basevec1 = insertelement <2 x i32*> undef, i32* %base, i32 0 + %basevec2 = shufflevector <2 x i32*> %basevec1, <2 x i32*> undef, <2 x i32> zeroinitializer + %idxvec1 = insertelement <2 x i64> undef, i64 %idx, i32 0 + %idxvec2 = shufflevector <2 x i64> %idxvec1, <2 x i64> undef, <2 x i32> zeroinitializer + %gep = getelementptr i32, <2 x i32*> %basevec2, <2 x i64> %idxvec2 + %ee = extractelement <2 x i32*> %gep, i32 1 + ret i32* %ee +} -- 2.50.1