[PATCH] D145355: [AggressiveInstCombine] Pre-Commit test for D144445 (NFC)

Kohei Asano via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Mar 8 22:33:14 PST 2023


khei4 updated this revision to Diff 503629.
khei4 added a comment.

commit 487723efa435655eafbc3ae57842b3de99c60f2c
Author: khei4 <kk.asano.luxy at gmail.com>
Date:   Thu Mar 9 15:31:11 2023 +0900

  [AggressiveInstCombine] Pre-Commit test for D144445 (NFC)
  
  Differential Revision: https://reviews.llvm.org/D145355

diff --git a/llvm/test/Transforms/AggressiveInstCombine/patterned-load.ll b/llvm/test/Transforms/AggressiveInstCombine/patterned-load.ll
new file mode 100644
index 000000000000..612919eb095b

- /dev/null

+++ b/llvm/test/Transforms/AggressiveInstCombine/patterned-load.ll
@@ -0,0 +1,134 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt < %s -passes=aggressive-instcombine -S -data-layout="e" | FileCheck %s --check-prefixes=CHECK,LE
+; RUN: opt < %s -passes=aggressive-instcombine -S -data-layout="E" | FileCheck %s --check-prefixes=CHECK,BE
+
+
+ at constarray1 = internal constant [8 x i8]  c"\01\00\01\00\01\00\01\00", align 4
+ at constarray2 = internal constant [8 x i8]  c"\FF\FF\01\00\01\00\01\00", align 4
+
+ at g = internal constant i32 42
+ at constptrarray = internal constant [4 x ptr]  [ptr @g, ptr @g, ptr @g, ptr @g], align 4
+
+ at constpackedstruct = internal constant <{[8 x i8]}>  <{[8 x i8] c"\01\00\01\00\01\00\01\00"}>, align 4
+ at conststruct = internal constant {i32, [8 x i8]}  {i32 1, [8 x i8] c"\01\00\01\00\01\00\01\00"}, align 4
+
+define i8 @gep_load_i8_align2(i64 %idx){
+; CHECK-LABEL: @gep_load_i8_align2(
+; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr inbounds i8, ptr @constarray1, i64 [[IDX:%.*]]
+; CHECK-NEXT:    [[TMP2:%.*]] = load i8, ptr [[TMP1]], align 2
+; CHECK-NEXT:    ret i8 [[TMP2]]
+;
+  %1 = getelementptr inbounds i8, ptr @constarray1, i64 %idx
+  %2 = load i8, ptr %1, align 2
+  ret i8 %2
+}
+
+; can't be folded
+define i8 @gep_load_i8_align1(i64 %idx){
+; CHECK-LABEL: @gep_load_i8_align1(
+; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr inbounds i8, ptr @constarray1, i64 [[IDX:%.*]]
+; CHECK-NEXT:    [[TMP2:%.*]] = load i8, ptr [[TMP1]], align 1
+; CHECK-NEXT:    ret i8 [[TMP2]]
+;
+  %1 = getelementptr inbounds i8, ptr @constarray1, i64 %idx
+  %2 = load i8, ptr %1, align 1
+  ret i8 %2
+}
+
+; can't be folded
+define i32 @gep_i8_load_i32_align1(i64 %idx){
+; CHECK-LABEL: @gep_i8_load_i32_align1(
+; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr inbounds i8, ptr @constarray1, i64 [[IDX:%.*]]
+; CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr [[TMP1]], align 1
+; CHECK-NEXT:    ret i32 [[TMP2]]
+;
+  %1 = getelementptr inbounds i8, ptr @constarray1, i64 %idx
+  %2 = load i32, ptr %1, align 1
+  ret i32 %2
+}
+
+define i32 @gep_i16_load_i32_align1(i64 %idx){
+; CHECK-LABEL: @gep_i16_load_i32_align1(
+; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr inbounds i16, ptr @constarray1, i64 [[IDX:%.*]]
+; CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr [[TMP1]], align 1
+; CHECK-NEXT:    ret i32 [[TMP2]]
+;
+  %1 = getelementptr inbounds i16, ptr @constarray1, i64 %idx
+  %2 = load i32, ptr %1, align 1
+  ret i32 %2
+}
+
+define i32 @gep_i32_load_i32_align8(i64 %idx){
+; CHECK-LABEL: @gep_i32_load_i32_align8(
+; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr inbounds i32, ptr @constarray1, i64 [[IDX:%.*]]
+; CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr [[TMP1]], align 8
+; CHECK-NEXT:    ret i32 [[TMP2]]
+;
+  %1 = getelementptr inbounds i32, ptr @constarray1, i64 %idx
+  %2 = load i32, ptr %1, align 8
+  ret i32 %2
+}
+
+define i32 @gep_i32_load_i32_with_const_offset(i64 %idx){
+; CHECK-LABEL: @gep_i32_load_i32_with_const_offset(
+; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr inbounds i16, ptr @constarray2, i64 1
+; CHECK-NEXT:    [[TMP2:%.*]] = getelementptr inbounds i32, ptr [[TMP1]], i64 [[IDX:%.*]]
+; CHECK-NEXT:    [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 4
+; CHECK-NEXT:    ret i32 [[TMP3]]
+;
+  %1 = getelementptr inbounds i16, ptr @constarray2, i64 1
+  %2 = getelementptr inbounds i32, ptr %1, i64 %idx
+  %3 = load i32, ptr %2, align 4
+  ret i32 %3
+}
+
+define i32 @gep_i32_load_i32_const_ptr_array(i64 %idx){
+; CHECK-LABEL: @gep_i32_load_i32_const_ptr_array(
+; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr inbounds ptr, ptr @constptrarray, i64 [[IDX:%.*]]
+; CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr [[TMP1]], align 4
+; CHECK-NEXT:    ret i32 [[TMP2]]
+;
+  %1 = getelementptr inbounds ptr, ptr @constptrarray, i64 %idx
+  %2 = load i32, ptr %1, align 4
+  ret i32 %2
+}
+
+define i32 @gep_i32_load_i32_align4_packedstruct(i64 %idx){
+; CHECK-LABEL: @gep_i32_load_i32_align4_packedstruct(
+; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr inbounds i32, ptr @constpackedstruct, i64 [[IDX:%.*]]
+; CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr [[TMP1]], align 4
+; CHECK-NEXT:    ret i32 [[TMP2]]
+;
+  %1 = getelementptr inbounds i32, ptr @constpackedstruct, i64 %idx
+  %2 = load i32, ptr %1, align 4
+  ret i32 %2
+}
+
+
+; can't be folded
+define i32 @gep_i8_load_i32_align1_packedstruct(i64 %idx){
+; CHECK-LABEL: @gep_i8_load_i32_align1_packedstruct(
+; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr inbounds i8, ptr @constpackedstruct, i64 [[IDX:%.*]]
+; CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr [[TMP1]], align 1
+; CHECK-NEXT:    ret i32 [[TMP2]]
+;
+  %1 = getelementptr inbounds i8, ptr @constpackedstruct, i64 %idx
+  %2 = load i32, ptr %1, align 1
+  ret i32 %2
+}
+
+define i32 @gep_i32_load_i32_align4_struct_with_const_offset(i64 %idx){
+; CHECK-LABEL: @gep_i32_load_i32_align4_struct_with_const_offset(
+; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr inbounds i32, ptr @conststruct, i32 1
+; CHECK-NEXT:    [[TMP2:%.*]] = getelementptr inbounds i32, ptr [[TMP1]], i64 [[IDX:%.*]]
+; CHECK-NEXT:    [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 4
+; CHECK-NEXT:    ret i32 [[TMP3]]
+;
+  %1 = getelementptr inbounds i32, ptr @conststruct, i32 1
+  %2 = getelementptr inbounds i32, ptr %1, i64 %idx
+  %3 = load i32, ptr %2, align 4
+  ret i32 %3
+}
+;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
+; BE: {{.*}}
+; LE: {{.*}}
diff --git a/llvm/test/Transforms/InstSimplify/load-patterned-aggregates.ll b/llvm/test/Transforms/InstSimplify/load-patterned-aggregates.ll
deleted file mode 100644
index 82283648936c..000000000000

- a/llvm/test/Transforms/InstSimplify/load-patterned-aggregates.ll

+++ /dev/null
@@ -1,134 +0,0 @@
-; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
-; RUN: opt < %s -passes=instsimplify -S | FileCheck %s
-target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:32:32-n8:16:32"
- at constzeroarray = internal constant [4 x i32] zeroinitializer

-

- at constarray = internal constant [8 x i8]  c"\01\00\01\00\01\00\01\00", align 4
- at conststruct = internal constant <{[8 x i8]}>  <{[8 x i8] c"\01\00\01\00\01\00\01\00"}>, align 4

-

-define i32 @load_gep_const_zero_array(i64 %idx) {
-; CHECK-LABEL: @load_gep_const_zero_array(
-; CHECK-NEXT:    ret i32 0
-;

- %gep = getelementptr inbounds [4 x i32], ptr @constzeroarray, i64 0, i64 %idx
- %load = load i32, ptr %gep
- ret i32 %load

-}

-

-define i8 @load_i8_multi_gep_const_zero_array(i64 %idx1, i64 %idx2) {
-; CHECK-LABEL: @load_i8_multi_gep_const_zero_array(
-; CHECK-NEXT:    ret i8 0
-;

- %gep1 = getelementptr inbounds i8, ptr @constzeroarray, i64 %idx1
- %gep = getelementptr inbounds i8, ptr %gep1, i64 %idx2
- %load = load i8, ptr %gep
- ret i8 %load

-}

- -

-define i32 @load_gep_const_patterned_array(i64 %idx) {
-; CHECK-LABEL: @load_gep_const_patterned_array(
-; CHECK-NEXT:    [[GEP:%.*]] = getelementptr inbounds [4 x i32], ptr @constarray, i64 0, i64 [[IDX:%.*]]
-; CHECK-NEXT:    [[LOAD:%.*]] = load i32, ptr [[GEP]], align 4
-; CHECK-NEXT:    ret i32 [[LOAD]]
-;

- %gep = getelementptr inbounds [4 x i32], ptr @constarray, i64 0, i64 %idx
- %load = load i32, ptr %gep
- ret i32 %load

-}

-

-define i8 @load_i8_multi_gep_const_array(i64 %idx1, i64 %idx2) {
-; CHECK-LABEL: @load_i8_multi_gep_const_array(
-; CHECK-NEXT:    [[GEP1:%.*]] = getelementptr inbounds i8, ptr @constarray, i64 [[IDX1:%.*]]
-; CHECK-NEXT:    [[GEP:%.*]] = getelementptr inbounds i8, ptr [[GEP1]], i64 [[IDX2:%.*]]
-; CHECK-NEXT:    [[LOAD:%.*]] = load i8, ptr [[GEP]], align 1
-; CHECK-NEXT:    ret i8 [[LOAD]]
-;

- %gep1 = getelementptr inbounds i8, ptr @constarray, i64 %idx1
- %gep = getelementptr inbounds i8, ptr %gep1, i64 %idx2
- %load = load i8, ptr %gep
- ret i8 %load

-}

-

-; TODO: this should be ret i8 1
-define i8 @gep_load_i8_align2(i64 %idx){
-; CHECK-LABEL: @gep_load_i8_align2(
-; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr inbounds i8, ptr @constarray, i64 [[IDX:%.*]]
-; CHECK-NEXT:    [[TMP2:%.*]] = load i8, ptr [[TMP1]], align 2
-; CHECK-NEXT:    ret i8 [[TMP2]]
-;

- %1 = getelementptr inbounds i8, ptr @constarray, i64 %idx
- %2 = load i8, ptr %1, align 2
- ret i8 %2

-}

-

-; can't be folded
-define i8 @gep_load_i8_align1(i64 %idx){
-; CHECK-LABEL: @gep_load_i8_align1(
-; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr inbounds i8, ptr @constarray, i64 [[IDX:%.*]]
-; CHECK-NEXT:    [[TMP2:%.*]] = load i8, ptr [[TMP1]], align 1
-; CHECK-NEXT:    ret i8 [[TMP2]]
-;

- %1 = getelementptr inbounds i8, ptr @constarray, i64 %idx
- %2 = load i8, ptr %1, align 1
- ret i8 %2

-}

-

-; TODO: this should be ret i8 65537 on the case for little endian
-define i32 @gep_i32_load_i32_align4(i64 %idx){
-; CHECK-LABEL: @gep_i32_load_i32_align4(
-; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr inbounds i32, ptr @constarray, i64 [[IDX:%.*]]
-; CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr [[TMP1]], align 4
-; CHECK-NEXT:    ret i32 [[TMP2]]
-;

- %1 = getelementptr inbounds i32, ptr @constarray, i64 %idx
- %2 = load i32, ptr %1, align 4
- ret i32 %2

-}

-

-; TODO: this should be ret i8 65537 on the case for little endian
-define i32 @gep_i32_load_i32_align4_struct(i64 %idx){
-; CHECK-LABEL: @gep_i32_load_i32_align4_struct(
-; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr inbounds i32, ptr @conststruct, i64 [[IDX:%.*]]
-; CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr [[TMP1]], align 4
-; CHECK-NEXT:    ret i32 [[TMP2]]
-;

- %1 = getelementptr inbounds i32, ptr @conststruct, i64 %idx
- %2 = load i32, ptr %1, align 4
- ret i32 %2

-}

-

-; can't be folded
-define i32 @gep_i8_load_i32_align1(i64 %idx){
-; CHECK-LABEL: @gep_i8_load_i32_align1(
-; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr inbounds i8, ptr @constarray, i64 [[IDX:%.*]]
-; CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr [[TMP1]], align 1
-; CHECK-NEXT:    ret i32 [[TMP2]]
-;

- %1 = getelementptr inbounds i8, ptr @constarray, i64 %idx
- %2 = load i32, ptr %1, align 1
- ret i32 %2

-}

-

-; can't be folded
-define i32 @gep_i8_load_i32_align1_struct(i64 %idx){
-; CHECK-LABEL: @gep_i8_load_i32_align1_struct(
-; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr inbounds i8, ptr @conststruct, i64 [[IDX:%.*]]
-; CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr [[TMP1]], align 1
-; CHECK-NEXT:    ret i32 [[TMP2]]
-;

- %1 = getelementptr inbounds i8, ptr @conststruct, i64 %idx
- %2 = load i32, ptr %1, align 1
- ret i32 %2

-}
-; TODO: This could be folded but need to see GEP source types
-define i32 @gep_i16_load_i32_align1(i64 %idx){
-; CHECK-LABEL: @gep_i16_load_i32_align1(
-; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr inbounds i16, ptr @constarray, i64 [[IDX:%.*]]
-; CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr [[TMP1]], align 1
-; CHECK-NEXT:    ret i32 [[TMP2]]
-;

- %1 = getelementptr inbounds i16, ptr @constarray, i64 %idx
- %2 = load i32, ptr %1, align 1
- ret i32 %2

-}
diff --git a/llvm/test/Transforms/InstSimplify/load.ll b/llvm/test/Transforms/InstSimplify/load.ll
index 2e2b1b14ddd0..8b9a607f77b7 100644

- a/llvm/test/Transforms/InstSimplify/load.ll

+++ b/llvm/test/Transforms/InstSimplify/load.ll
@@ -1,42 +1,62 @@
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
 ; RUN: opt < %s -passes=instsimplify -S | FileCheck %s

@zeroinit = constant {} zeroinitializer
 @poison = constant {} poison
+ at constzeroarray = internal constant [4 x i32] zeroinitializer

define i32 @crash_on_zeroinit() {
 ; CHECK-LABEL: @crash_on_zeroinit(
 ; CHECK-NEXT:    ret i32 poison
 ;

  %load = load i32, ptr @zeroinit
  ret i32 %load

}

define i32 @crash_on_poison() {
 ; CHECK-LABEL: @crash_on_poison(
 ; CHECK-NEXT:    ret i32 poison
 ;

  %load = load i32, ptr @poison
  ret i32 %load

}

@GV = private constant [8 x i32] [i32 42, i32 43, i32 44, i32 45, i32 46, i32 47, i32 48, i32 49]

define <8 x i32> @partial_load() {
 ; CHECK-LABEL: @partial_load(
 ; CHECK-NEXT:    ret <8 x i32> <i32 0, i32 42, i32 43, i32 44, i32 45, i32 46, i32 47, i32 48>
 ;

  %load = load <8 x i32>, ptr getelementptr ([8 x i32], ptr @GV, i64 0, i64 -1)
  ret <8 x i32> %load

}

@constvec = internal constant <3 x float> <float 0xBFDA20BC40000000, float 0xBFE6A09EE0000000, float 0x3FE279A760000000>

; This does an out of bounds load from the global constant
 define <3 x float> @load_vec3() {
 ; CHECK-LABEL: @load_vec3(
 ; CHECK-NEXT:    ret <3 x float> poison
 ;

  %1 = load <3 x float>, ptr getelementptr inbounds (<3 x float>, ptr @constvec, i64 1)
  ret <3 x float> %1

}
+
+define i32 @load_gep_const_zero_array(i64 %idx) {
+; CHECK-LABEL: @load_gep_const_zero_array(
+; CHECK-NEXT:    ret i32 0
+;
+  %gep = getelementptr inbounds [4 x i32], ptr @constzeroarray, i64 0, i64 %idx
+  %load = load i32, ptr %gep
+  ret i32 %load
+}
+
+define i8 @load_i8_multi_gep_const_zero_array(i64 %idx1, i64 %idx2) {
+; CHECK-LABEL: @load_i8_multi_gep_const_zero_array(
+; CHECK-NEXT:    ret i8 0
+;
+  %gep1 = getelementptr inbounds i8, ptr @constzeroarray, i64 %idx1
+  %gep = getelementptr inbounds i8, ptr %gep1, i64 %idx2
+  %load = load i8, ptr %gep
+  ret i8 %load
+}


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D145355/new/

https://reviews.llvm.org/D145355

Files:
  llvm/test/Transforms/AggressiveInstCombine/patterned-load.ll
  llvm/test/Transforms/InstSimplify/load.ll

-------------- next part --------------
A non-text attachment was scrubbed...
Name: D145355.503629.patch
Type: text/x-patch
Size: 6801 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20230309/2dd582f7/attachment.bin>


More information about the llvm-commits mailing list