diff --git a/llvm/test/Transforms/SLPVectorizer/AArch64/getelementptr.ll b/llvm/test/Transforms/SLPVectorizer/AArch64/getelementptr.ll --- a/llvm/test/Transforms/SLPVectorizer/AArch64/getelementptr.ll +++ b/llvm/test/Transforms/SLPVectorizer/AArch64/getelementptr.ll @@ -3,7 +3,7 @@ ; RUN: cat %t | FileCheck -check-prefix=YAML %s ; RUN: opt -S -passes='slp-vectorizer,dce,instcombine' -slp-threshold=-7 -pass-remarks-output=%t < %s | FileCheck %s ; RUN: cat %t | FileCheck -check-prefix=YAML %s - +; RUN: opt -S -passes='slp-vectorizer' | FileCheck -check-prefix=CHECK-GEP target datalayout = "e-m:e-i32:64-i128:128-n32:64-S128" target triple = "aarch64--linux-gnu" @@ -404,4 +404,80 @@ ret void } +define void @test_i32_extend() { +; CHECK-GEP-LABEL: @test_i32_extend( +; CHECK-GEP-NEXT: bb: +; CHECK-GEP-NEXT: [[GETELEMENTPTR:%.*]] = getelementptr i32, ptr null, i64 1 +; CHECK-GEP-NEXT: [[LOAD:%.*]] = load i32, ptr null, align 2 +; CHECK-GEP-NEXT: [[ZEXT:%.*]] = zext i32 [[LOAD]] to i64 +; CHECK-GEP-NEXT: [[GETELEMENTPTR1:%.*]] = getelementptr i32, ptr null, i64 1 +; CHECK-GEP-NEXT: [[LOAD2:%.*]] = load i32, ptr null, align 2 +; CHECK-GEP-NEXT: [[ZEXT3:%.*]] = zext i32 [[LOAD2]] to i64 +; CHECK-GEP-NEXT: [[SUB:%.*]] = sub i64 [[ZEXT]], [[ZEXT3]] +; CHECK-GEP-NEXT: [[GETELEMENTPTR4:%.*]] = getelementptr i32, ptr null, i64 [[SUB]] +; CHECK-GEP-NEXT: [[GETELEMENTPTR5:%.*]] = getelementptr i32, ptr null, i64 2 +; CHECK-GEP-NEXT: [[LOAD6:%.*]] = load i32, ptr [[GETELEMENTPTR]], align 2 +; CHECK-GEP-NEXT: [[ZEXT7:%.*]] = zext i32 [[LOAD6]] to i64 +; CHECK-GEP-NEXT: [[GETELEMENTPTR8:%.*]] = getelementptr i32, ptr null, i64 2 +; CHECK-GEP-NEXT: [[LOAD9:%.*]] = load i32, ptr [[GETELEMENTPTR1]], align 2 +; CHECK-GEP-NEXT: [[ZEXT10:%.*]] = zext i32 [[LOAD9]] to i64 +; CHECK-GEP-NEXT: [[SUB11:%.*]] = sub i64 [[ZEXT7]], [[ZEXT10]] +; CHECK-GEP-NEXT: [[GETELEMENTPTR12:%.*]] = getelementptr i32, ptr null, i64 [[SUB11]] +; CHECK-GEP-NEXT: [[GETELEMENTPTR13:%.*]] = getelementptr i32, ptr null, i64 3 +; CHECK-GEP-NEXT: [[LOAD14:%.*]] = load i32, ptr [[GETELEMENTPTR5]], align 2 +; CHECK-GEP-NEXT: [[ZEXT15:%.*]] = zext i32 [[LOAD14]] to i64 +; CHECK-GEP-NEXT: [[GETELEMENTPTR16:%.*]] = getelementptr i32, ptr null, i64 3 +; CHECK-GEP-NEXT: [[LOAD17:%.*]] = load i32, ptr [[GETELEMENTPTR8]], align 2 +; CHECK-GEP-NEXT: [[ZEXT18:%.*]] = zext i32 [[LOAD17]] to i64 +; CHECK-GEP-NEXT: [[SUB19:%.*]] = sub i64 [[ZEXT15]], [[ZEXT18]] +; CHECK-GEP-NEXT: [[GETELEMENTPTR20:%.*]] = getelementptr i32, ptr null, i64 [[SUB19]] +; CHECK-GEP-NEXT: [[GETELEMENTPTR21:%.*]] = getelementptr i32, ptr null, i64 4 +; CHECK-GEP-NEXT: [[LOAD22:%.*]] = load i32, ptr [[GETELEMENTPTR13]], align 2 +; CHECK-GEP-NEXT: [[ZEXT23:%.*]] = zext i32 [[LOAD22]] to i64 +; CHECK-GEP-NEXT: [[GETELEMENTPTR24:%.*]] = getelementptr i32, ptr null, i64 4 +; CHECK-GEP-NEXT: [[LOAD25:%.*]] = load i32, ptr [[GETELEMENTPTR16]], align 2 +; CHECK-GEP-NEXT: [[ZEXT26:%.*]] = zext i32 [[LOAD25]] to i64 +; CHECK-GEP-NEXT: [[SUB27:%.*]] = sub i64 [[ZEXT23]], [[ZEXT26]] +; CHECK-GEP-NEXT: [[GETELEMENTPTR28:%.*]] = getelementptr i32, ptr null, i64 [[SUB27]] +; CHECK-GEP-NEXT: call void @use_4(ptr [[GETELEMENTPTR28]], ptr [[GETELEMENTPTR20]], ptr [[GETELEMENTPTR12]], ptr [[GETELEMENTPTR4]]) +; CHECK-GEP-NEXT: ret void +; +bb: + %getelementptr = getelementptr i32, ptr null, i64 1 + %load = load i32, ptr null, align 2 + %zext = zext i32 %load to i64 + %getelementptr1 = getelementptr i32, ptr null, i64 1 + %load2 = load i32, ptr null, align 2 + %zext3 = zext i32 %load2 to i64 + %sub = sub i64 %zext, %zext3 + %getelementptr4 = getelementptr i32, ptr null, i64 %sub + %getelementptr5 = getelementptr i32, ptr null, i64 2 + %load6 = load i32, ptr %getelementptr, align 2 + %zext7 = zext i32 %load6 to i64 + %getelementptr8 = getelementptr i32, ptr null, i64 2 + %load9 = load i32, ptr %getelementptr1, align 2 + %zext10 = zext i32 %load9 to i64 + %sub11 = sub i64 %zext7, %zext10 + %getelementptr12 = getelementptr i32, ptr null, i64 %sub11 + %getelementptr13 = getelementptr i32, ptr null, i64 3 + %load14 = load i32, ptr %getelementptr5, align 2 + %zext15 = zext i32 %load14 to i64 + %getelementptr16 = getelementptr i32, ptr null, i64 3 + %load17 = load i32, ptr %getelementptr8, align 2 + %zext18 = zext i32 %load17 to i64 + %sub19 = sub i64 %zext15, %zext18 + %getelementptr20 = getelementptr i32, ptr null, i64 %sub19 + %getelementptr21 = getelementptr i32, ptr null, i64 4 + %load22 = load i32, ptr %getelementptr13, align 2 + %zext23 = zext i32 %load22 to i64 + %getelementptr24 = getelementptr i32, ptr null, i64 4 + %load25 = load i32, ptr %getelementptr16, align 2 + %zext26 = zext i32 %load25 to i64 + %sub27 = sub i64 %zext23, %zext26 + %getelementptr28 = getelementptr i32, ptr null, i64 %sub27 + call void @use_4(ptr %getelementptr28, ptr %getelementptr20, ptr %getelementptr12, ptr %getelementptr4) + ret void +} + +declare void @use_4(ptr, ptr, ptr, ptr) declare void @use(i32, i32, i32, i32, i32, i32, i32, i32)