xref: /llvm-project/llvm/test/Transforms/SROA/pr37267.ll (revision 4f7e5d22060e8a89237ffb93c3e7be6e92fee8fe)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt < %s -passes='sroa<preserve-cfg>' -S | FileCheck %s --check-prefixes=CHECK,CHECK-PRESERVE-CFG
3; RUN: opt < %s -passes='sroa<modify-cfg>' -S | FileCheck %s --check-prefixes=CHECK,CHECK-MODIFY-CFG
4target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32:64-S128"
5target triple = "sparcv9-sun-solaris"
6
7; PR37267
8; Check that we don't crash on this test.
9
10define i16 @f1() {
11; CHECK-LABEL: @f1(
12; CHECK-NEXT:  bb1:
13; CHECK-NEXT:    [[RC:%.*]] = add i16 2, 2
14; CHECK-NEXT:    ret i16 [[RC]]
15;
16bb1:
17; This 12-byte alloca is split into partitions as [0,2), [2,4), [4,8), [8,10), [10, 12).
18; The reported error happened when rewriteIntegerStore try to widen a split tail of slice 1 for [4, 8) partition.
19; alloca  012345678901
20; slice 1:  WWWW
21; slice 2:        WWWW
22; slice 3:        RR
23; slice 4:  RR
24
25  %a.3 = alloca [6 x i16], align 1
26; slice 1: [2,6)
27  %_tmp3 = getelementptr inbounds [6 x i16], ptr %a.3, i16 0, i16 1
28  store i32 131074, ptr %_tmp3, align 1
29; slice 2: [8,12)
30  %_tmp8 = getelementptr inbounds [6 x i16], ptr %a.3, i16 0, i16 4
31  store i32 131074, ptr %_tmp8, align 1
32; slice 3: [8,10)
33  %_tmp12 = getelementptr inbounds [6 x i16], ptr %a.3, i16 0, i16 4
34  %_tmp13 = load i16, ptr %_tmp12, align 1
35; slice 4: [2,4)
36  %_tmp15 = getelementptr inbounds [6 x i16], ptr %a.3, i16 0, i16 1
37  %_tmp16 = load i16, ptr %_tmp15, align 1
38
39  %rc = add i16 %_tmp13, %_tmp16
40  ret i16 %rc
41}
42
43define i16 @f2() {
44; CHECK-LABEL: @f2(
45; CHECK-NEXT:  bb1:
46; CHECK-NEXT:    [[A_3_SROA_2_2_INSERT_EXT:%.*]] = zext i16 undef to i32
47; CHECK-NEXT:    [[A_3_SROA_2_2_INSERT_MASK:%.*]] = and i32 undef, -65536
48; CHECK-NEXT:    [[A_3_SROA_2_2_INSERT_INSERT:%.*]] = or i32 [[A_3_SROA_2_2_INSERT_MASK]], [[A_3_SROA_2_2_INSERT_EXT]]
49; CHECK-NEXT:    [[A_3_SROA_0_2_INSERT_EXT:%.*]] = zext i16 undef to i32
50; CHECK-NEXT:    [[A_3_SROA_0_2_INSERT_SHIFT:%.*]] = shl i32 [[A_3_SROA_0_2_INSERT_EXT]], 16
51; CHECK-NEXT:    [[A_3_SROA_0_2_INSERT_MASK:%.*]] = and i32 [[A_3_SROA_2_2_INSERT_INSERT]], 65535
52; CHECK-NEXT:    [[A_3_SROA_0_2_INSERT_INSERT:%.*]] = or i32 [[A_3_SROA_0_2_INSERT_MASK]], [[A_3_SROA_0_2_INSERT_SHIFT]]
53; CHECK-NEXT:    [[RC:%.*]] = add i16 2, undef
54; CHECK-NEXT:    ret i16 [[RC]]
55;
56bb1:
57; This 12-byte alloca is split into partitions as [0,2), [2,4), [4,8), [8,10), [10, 12).
58; The reported error happened when visitLoadInst rewrites a split tail of slice 1 for [4, 8) partition.
59; alloca  012345678901
60; slice 1:  RRRR
61; slice 2:        WWWW
62; slice 3:        RR
63; slice 4:  RR
64
65  %a.3 = alloca [6 x i16], align 1
66; slice 1: [2,6)
67  %_tmp3 = getelementptr inbounds [6 x i16], ptr %a.3, i16 0, i16 1
68  %_tmp6 = load i32, ptr %_tmp3, align 1
69; slice 2: [8,12)
70  %_tmp8 = getelementptr inbounds [6 x i16], ptr %a.3, i16 0, i16 4
71  store i32 131074, ptr %_tmp8, align 1
72; slice 3: [8,10)
73  %_tmp12 = getelementptr inbounds [6 x i16], ptr %a.3, i16 0, i16 4
74  %_tmp13 = load i16, ptr %_tmp12, align 1
75; slice 4: [2,4)
76  %_tmp15 = getelementptr inbounds [6 x i16], ptr %a.3, i16 0, i16 1
77  %_tmp16 = load i16, ptr %_tmp15, align 1
78
79  %rc = add i16 %_tmp13, %_tmp16
80  ret i16 %rc
81}
82;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
83; CHECK-MODIFY-CFG: {{.*}}
84; CHECK-PRESERVE-CFG: {{.*}}
85