|
| 1 | +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py |
| 2 | +; RUN: opt < %s -slp-vectorizer -S -mtriple=x86_64-unknown-linux-gnu -mcpu=skylake-avx512 | FileCheck %s |
| 3 | + |
| 4 | +define void @test(i32* noalias %p, i32* noalias %addr, i32* noalias %s) { |
| 5 | +; CHECK-LABEL: @test( |
| 6 | +; CHECK-NEXT: entry: |
| 7 | +; CHECK-NEXT: [[IDX1:%.*]] = load i32, i32* [[ADDR:%.*]], align 8 |
| 8 | +; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[P:%.*]], i32 [[IDX1]] |
| 9 | +; CHECK-NEXT: [[I:%.*]] = load i32, i32* [[ARRAYIDX]], align 4 |
| 10 | +; CHECK-NEXT: [[GEP2:%.*]] = getelementptr inbounds i32, i32* [[ADDR]], i32 1 |
| 11 | +; CHECK-NEXT: [[IDX2:%.*]] = load i32, i32* [[GEP2]], align 8 |
| 12 | +; CHECK-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i32, i32* [[P]], i32 [[IDX2]] |
| 13 | +; CHECK-NEXT: [[I1:%.*]] = load i32, i32* [[ARRAYIDX1]], align 4 |
| 14 | +; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[I1]], [[I]] |
| 15 | +; CHECK-NEXT: [[ARRAYIDX2:%.*]] = getelementptr inbounds i32, i32* [[S:%.*]], i32 0 |
| 16 | +; CHECK-NEXT: store i32 [[ADD]], i32* [[ARRAYIDX2]], align 4 |
| 17 | +; CHECK-NEXT: [[GEP3:%.*]] = getelementptr inbounds i32, i32* [[ADDR]], i32 2 |
| 18 | +; CHECK-NEXT: [[IDX3:%.*]] = load i32, i32* [[GEP3]], align 8 |
| 19 | +; CHECK-NEXT: [[ARRAYIDX4:%.*]] = getelementptr inbounds i32, i32* [[P]], i32 [[IDX3]] |
| 20 | +; CHECK-NEXT: [[I2:%.*]] = load i32, i32* [[ARRAYIDX4]], align 4 |
| 21 | +; CHECK-NEXT: [[GEP4:%.*]] = getelementptr inbounds i32, i32* [[ADDR]], i32 3 |
| 22 | +; CHECK-NEXT: [[IDX4:%.*]] = load i32, i32* [[GEP4]], align 8 |
| 23 | +; CHECK-NEXT: [[ARRAYIDX6:%.*]] = getelementptr inbounds i32, i32* [[P]], i32 [[IDX4]] |
| 24 | +; CHECK-NEXT: [[I3:%.*]] = load i32, i32* [[ARRAYIDX6]], align 4 |
| 25 | +; CHECK-NEXT: [[ADD7:%.*]] = add nsw i32 [[I3]], [[I2]] |
| 26 | +; CHECK-NEXT: [[ARRAYIDX9:%.*]] = getelementptr inbounds i32, i32* [[S]], i32 1 |
| 27 | +; CHECK-NEXT: store i32 [[ADD7]], i32* [[ARRAYIDX9]], align 4 |
| 28 | +; CHECK-NEXT: [[GEP5:%.*]] = getelementptr inbounds i32, i32* [[ADDR]], i32 4 |
| 29 | +; CHECK-NEXT: [[IDX5:%.*]] = load i32, i32* [[GEP5]], align 8 |
| 30 | +; CHECK-NEXT: [[ARRAYIDX11:%.*]] = getelementptr inbounds i32, i32* [[P]], i32 [[IDX5]] |
| 31 | +; CHECK-NEXT: [[I4:%.*]] = load i32, i32* [[ARRAYIDX11]], align 4 |
| 32 | +; CHECK-NEXT: [[GEP6:%.*]] = getelementptr inbounds i32, i32* [[ADDR]], i32 5 |
| 33 | +; CHECK-NEXT: [[IDX6:%.*]] = load i32, i32* [[GEP6]], align 8 |
| 34 | +; CHECK-NEXT: [[ARRAYIDX13:%.*]] = getelementptr inbounds i32, i32* [[P]], i32 [[IDX6]] |
| 35 | +; CHECK-NEXT: [[I5:%.*]] = load i32, i32* [[ARRAYIDX13]], align 4 |
| 36 | +; CHECK-NEXT: [[ADD14:%.*]] = add nsw i32 [[I5]], [[I4]] |
| 37 | +; CHECK-NEXT: [[ARRAYIDX16:%.*]] = getelementptr inbounds i32, i32* [[S]], i32 2 |
| 38 | +; CHECK-NEXT: store i32 [[ADD14]], i32* [[ARRAYIDX16]], align 4 |
| 39 | +; CHECK-NEXT: [[GEP7:%.*]] = getelementptr inbounds i32, i32* [[ADDR]], i32 6 |
| 40 | +; CHECK-NEXT: [[IDX7:%.*]] = load i32, i32* [[GEP7]], align 8 |
| 41 | +; CHECK-NEXT: [[ARRAYIDX18:%.*]] = getelementptr inbounds i32, i32* [[P]], i32 [[IDX7]] |
| 42 | +; CHECK-NEXT: [[I6:%.*]] = load i32, i32* [[ARRAYIDX18]], align 4 |
| 43 | +; CHECK-NEXT: [[GEP8:%.*]] = getelementptr inbounds i32, i32* [[ADDR]], i32 7 |
| 44 | +; CHECK-NEXT: [[IDX8:%.*]] = load i32, i32* [[GEP8]], align 8 |
| 45 | +; CHECK-NEXT: [[ARRAYIDX20:%.*]] = getelementptr inbounds i32, i32* [[P]], i32 [[IDX8]] |
| 46 | +; CHECK-NEXT: [[I7:%.*]] = load i32, i32* [[ARRAYIDX20]], align 4 |
| 47 | +; CHECK-NEXT: [[ADD21:%.*]] = add nsw i32 [[I7]], [[I6]] |
| 48 | +; CHECK-NEXT: [[ARRAYIDX23:%.*]] = getelementptr inbounds i32, i32* [[S]], i32 3 |
| 49 | +; CHECK-NEXT: store i32 [[ADD21]], i32* [[ARRAYIDX23]], align 4 |
| 50 | +; CHECK-NEXT: [[GEP9:%.*]] = getelementptr inbounds i32, i32* [[ADDR]], i32 8 |
| 51 | +; CHECK-NEXT: [[IDX9:%.*]] = load i32, i32* [[GEP9]], align 8 |
| 52 | +; CHECK-NEXT: [[ARRAYIDX25:%.*]] = getelementptr inbounds i32, i32* [[P]], i32 [[IDX9]] |
| 53 | +; CHECK-NEXT: [[I8:%.*]] = load i32, i32* [[ARRAYIDX25]], align 4 |
| 54 | +; CHECK-NEXT: [[GEP10:%.*]] = getelementptr inbounds i32, i32* [[ADDR]], i32 9 |
| 55 | +; CHECK-NEXT: [[IDX10:%.*]] = load i32, i32* [[GEP10]], align 8 |
| 56 | +; CHECK-NEXT: [[ARRAYIDX27:%.*]] = getelementptr inbounds i32, i32* [[P]], i32 [[IDX10]] |
| 57 | +; CHECK-NEXT: [[I9:%.*]] = load i32, i32* [[ARRAYIDX27]], align 4 |
| 58 | +; CHECK-NEXT: [[ADD28:%.*]] = add nsw i32 [[I9]], [[I8]] |
| 59 | +; CHECK-NEXT: [[ARRAYIDX30:%.*]] = getelementptr inbounds i32, i32* [[S]], i32 4 |
| 60 | +; CHECK-NEXT: store i32 [[ADD28]], i32* [[ARRAYIDX30]], align 4 |
| 61 | +; CHECK-NEXT: [[GEP11:%.*]] = getelementptr inbounds i32, i32* [[ADDR]], i32 10 |
| 62 | +; CHECK-NEXT: [[IDX11:%.*]] = load i32, i32* [[GEP11]], align 8 |
| 63 | +; CHECK-NEXT: [[ARRAYIDX32:%.*]] = getelementptr inbounds i32, i32* [[P]], i32 [[IDX11]] |
| 64 | +; CHECK-NEXT: [[I10:%.*]] = load i32, i32* [[ARRAYIDX32]], align 4 |
| 65 | +; CHECK-NEXT: [[GEP12:%.*]] = getelementptr inbounds i32, i32* [[ADDR]], i32 11 |
| 66 | +; CHECK-NEXT: [[IDX12:%.*]] = load i32, i32* [[GEP12]], align 8 |
| 67 | +; CHECK-NEXT: [[ARRAYIDX34:%.*]] = getelementptr inbounds i32, i32* [[P]], i32 [[IDX12]] |
| 68 | +; CHECK-NEXT: [[I11:%.*]] = load i32, i32* [[ARRAYIDX34]], align 4 |
| 69 | +; CHECK-NEXT: [[ADD35:%.*]] = add nsw i32 [[I11]], [[I10]] |
| 70 | +; CHECK-NEXT: [[ARRAYIDX37:%.*]] = getelementptr inbounds i32, i32* [[S]], i32 5 |
| 71 | +; CHECK-NEXT: store i32 [[ADD35]], i32* [[ARRAYIDX37]], align 4 |
| 72 | +; CHECK-NEXT: [[GEP13:%.*]] = getelementptr inbounds i32, i32* [[ADDR]], i32 12 |
| 73 | +; CHECK-NEXT: [[IDX13:%.*]] = load i32, i32* [[GEP13]], align 8 |
| 74 | +; CHECK-NEXT: [[ARRAYIDX39:%.*]] = getelementptr inbounds i32, i32* [[P]], i32 [[IDX13]] |
| 75 | +; CHECK-NEXT: [[I12:%.*]] = load i32, i32* [[ARRAYIDX39]], align 4 |
| 76 | +; CHECK-NEXT: [[GEP14:%.*]] = getelementptr inbounds i32, i32* [[ADDR]], i32 13 |
| 77 | +; CHECK-NEXT: [[IDX14:%.*]] = load i32, i32* [[GEP14]], align 8 |
| 78 | +; CHECK-NEXT: [[ARRAYIDX41:%.*]] = getelementptr inbounds i32, i32* [[P]], i32 [[IDX14]] |
| 79 | +; CHECK-NEXT: [[I13:%.*]] = load i32, i32* [[ARRAYIDX41]], align 4 |
| 80 | +; CHECK-NEXT: [[ADD42:%.*]] = add nsw i32 [[I13]], [[I12]] |
| 81 | +; CHECK-NEXT: [[ARRAYIDX44:%.*]] = getelementptr inbounds i32, i32* [[S]], i32 6 |
| 82 | +; CHECK-NEXT: store i32 [[ADD42]], i32* [[ARRAYIDX44]], align 4 |
| 83 | +; CHECK-NEXT: [[GEP15:%.*]] = getelementptr inbounds i32, i32* [[ADDR]], i32 14 |
| 84 | +; CHECK-NEXT: [[IDX15:%.*]] = load i32, i32* [[GEP15]], align 8 |
| 85 | +; CHECK-NEXT: [[ARRAYIDX46:%.*]] = getelementptr inbounds i32, i32* [[P]], i32 [[IDX15]] |
| 86 | +; CHECK-NEXT: [[I14:%.*]] = load i32, i32* [[ARRAYIDX46]], align 4 |
| 87 | +; CHECK-NEXT: [[GEP16:%.*]] = getelementptr inbounds i32, i32* [[ADDR]], i32 15 |
| 88 | +; CHECK-NEXT: [[IDX16:%.*]] = load i32, i32* [[GEP16]], align 8 |
| 89 | +; CHECK-NEXT: [[ARRAYIDX48:%.*]] = getelementptr inbounds i32, i32* [[P]], i32 [[IDX16]] |
| 90 | +; CHECK-NEXT: [[I15:%.*]] = load i32, i32* [[ARRAYIDX48]], align 4 |
| 91 | +; CHECK-NEXT: [[ADD49:%.*]] = add nsw i32 [[I15]], [[I14]] |
| 92 | +; CHECK-NEXT: [[ARRAYIDX51:%.*]] = getelementptr inbounds i32, i32* [[S]], i32 7 |
| 93 | +; CHECK-NEXT: store i32 [[ADD49]], i32* [[ARRAYIDX51]], align 4 |
| 94 | +; CHECK-NEXT: ret void |
| 95 | +; |
| 96 | +entry: |
| 97 | + %idx1 = load i32, i32 *%addr, align 8 |
| 98 | + %arrayidx = getelementptr inbounds i32, i32* %p, i32 %idx1 |
| 99 | + %i = load i32, i32* %arrayidx, align 4 |
| 100 | + %gep2 = getelementptr inbounds i32, i32* %addr, i32 1 |
| 101 | + %idx2 = load i32, i32 *%gep2, align 8 |
| 102 | + %arrayidx1 = getelementptr inbounds i32, i32* %p, i32 %idx2 |
| 103 | + %i1 = load i32, i32* %arrayidx1, align 4 |
| 104 | + %add = add nsw i32 %i1, %i |
| 105 | + %arrayidx2 = getelementptr inbounds i32, i32* %s, i32 0 |
| 106 | + store i32 %add, i32* %arrayidx2, align 4 |
| 107 | + %gep3 = getelementptr inbounds i32, i32* %addr, i32 2 |
| 108 | + %idx3 = load i32, i32 *%gep3, align 8 |
| 109 | + %arrayidx4 = getelementptr inbounds i32, i32* %p, i32 %idx3 |
| 110 | + %i2 = load i32, i32* %arrayidx4, align 4 |
| 111 | + %gep4 = getelementptr inbounds i32, i32* %addr, i32 3 |
| 112 | + %idx4 = load i32, i32 *%gep4, align 8 |
| 113 | + %arrayidx6 = getelementptr inbounds i32, i32* %p, i32 %idx4 |
| 114 | + %i3 = load i32, i32* %arrayidx6, align 4 |
| 115 | + %add7 = add nsw i32 %i3, %i2 |
| 116 | + %arrayidx9 = getelementptr inbounds i32, i32* %s, i32 1 |
| 117 | + store i32 %add7, i32* %arrayidx9, align 4 |
| 118 | + %gep5 = getelementptr inbounds i32, i32* %addr, i32 4 |
| 119 | + %idx5 = load i32, i32 *%gep5, align 8 |
| 120 | + %arrayidx11 = getelementptr inbounds i32, i32* %p, i32 %idx5 |
| 121 | + %i4 = load i32, i32* %arrayidx11, align 4 |
| 122 | + %gep6 = getelementptr inbounds i32, i32* %addr, i32 5 |
| 123 | + %idx6 = load i32, i32 *%gep6, align 8 |
| 124 | + %arrayidx13 = getelementptr inbounds i32, i32* %p, i32 %idx6 |
| 125 | + %i5 = load i32, i32* %arrayidx13, align 4 |
| 126 | + %add14 = add nsw i32 %i5, %i4 |
| 127 | + %arrayidx16 = getelementptr inbounds i32, i32* %s, i32 2 |
| 128 | + store i32 %add14, i32* %arrayidx16, align 4 |
| 129 | + %gep7 = getelementptr inbounds i32, i32* %addr, i32 6 |
| 130 | + %idx7 = load i32, i32 *%gep7, align 8 |
| 131 | + %arrayidx18 = getelementptr inbounds i32, i32* %p, i32 %idx7 |
| 132 | + %i6 = load i32, i32* %arrayidx18, align 4 |
| 133 | + %gep8 = getelementptr inbounds i32, i32* %addr, i32 7 |
| 134 | + %idx8 = load i32, i32 *%gep8, align 8 |
| 135 | + %arrayidx20 = getelementptr inbounds i32, i32* %p, i32 %idx8 |
| 136 | + %i7 = load i32, i32* %arrayidx20, align 4 |
| 137 | + %add21 = add nsw i32 %i7, %i6 |
| 138 | + %arrayidx23 = getelementptr inbounds i32, i32* %s, i32 3 |
| 139 | + store i32 %add21, i32* %arrayidx23, align 4 |
| 140 | + %gep9 = getelementptr inbounds i32, i32* %addr, i32 8 |
| 141 | + %idx9 = load i32, i32 *%gep9, align 8 |
| 142 | + %arrayidx25 = getelementptr inbounds i32, i32* %p, i32 %idx9 |
| 143 | + %i8 = load i32, i32* %arrayidx25, align 4 |
| 144 | + %gep10 = getelementptr inbounds i32, i32* %addr, i32 9 |
| 145 | + %idx10 = load i32, i32 *%gep10, align 8 |
| 146 | + %arrayidx27 = getelementptr inbounds i32, i32* %p, i32 %idx10 |
| 147 | + %i9 = load i32, i32* %arrayidx27, align 4 |
| 148 | + %add28 = add nsw i32 %i9, %i8 |
| 149 | + %arrayidx30 = getelementptr inbounds i32, i32* %s, i32 4 |
| 150 | + store i32 %add28, i32* %arrayidx30, align 4 |
| 151 | + %gep11 = getelementptr inbounds i32, i32* %addr, i32 10 |
| 152 | + %idx11 = load i32, i32 *%gep11, align 8 |
| 153 | + %arrayidx32 = getelementptr inbounds i32, i32* %p, i32 %idx11 |
| 154 | + %i10 = load i32, i32* %arrayidx32, align 4 |
| 155 | + %gep12 = getelementptr inbounds i32, i32* %addr, i32 11 |
| 156 | + %idx12 = load i32, i32 *%gep12, align 8 |
| 157 | + %arrayidx34 = getelementptr inbounds i32, i32* %p, i32 %idx12 |
| 158 | + %i11 = load i32, i32* %arrayidx34, align 4 |
| 159 | + %add35 = add nsw i32 %i11, %i10 |
| 160 | + %arrayidx37 = getelementptr inbounds i32, i32* %s, i32 5 |
| 161 | + store i32 %add35, i32* %arrayidx37, align 4 |
| 162 | + %gep13 = getelementptr inbounds i32, i32* %addr, i32 12 |
| 163 | + %idx13 = load i32, i32 *%gep13, align 8 |
| 164 | + %arrayidx39 = getelementptr inbounds i32, i32* %p, i32 %idx13 |
| 165 | + %i12 = load i32, i32* %arrayidx39, align 4 |
| 166 | + %gep14 = getelementptr inbounds i32, i32* %addr, i32 13 |
| 167 | + %idx14 = load i32, i32 *%gep14, align 8 |
| 168 | + %arrayidx41 = getelementptr inbounds i32, i32* %p, i32 %idx14 |
| 169 | + %i13 = load i32, i32* %arrayidx41, align 4 |
| 170 | + %add42 = add nsw i32 %i13, %i12 |
| 171 | + %arrayidx44 = getelementptr inbounds i32, i32* %s, i32 6 |
| 172 | + store i32 %add42, i32* %arrayidx44, align 4 |
| 173 | + %gep15 = getelementptr inbounds i32, i32* %addr, i32 14 |
| 174 | + %idx15 = load i32, i32 *%gep15, align 8 |
| 175 | + %arrayidx46 = getelementptr inbounds i32, i32* %p, i32 %idx15 |
| 176 | + %i14 = load i32, i32* %arrayidx46, align 4 |
| 177 | + %gep16 = getelementptr inbounds i32, i32* %addr, i32 15 |
| 178 | + %idx16 = load i32, i32 *%gep16, align 8 |
| 179 | + %arrayidx48 = getelementptr inbounds i32, i32* %p, i32 %idx16 |
| 180 | + %i15 = load i32, i32* %arrayidx48, align 4 |
| 181 | + %add49 = add nsw i32 %i15, %i14 |
| 182 | + %arrayidx51 = getelementptr inbounds i32, i32* %s, i32 7 |
| 183 | + store i32 %add49, i32* %arrayidx51, align 4 |
| 184 | + ret void |
| 185 | +} |
0 commit comments