llvm.org GIT mirror llvm / 779046e
Prevent the scalarizer from caching incorrect entries The scalarizer can cache incorrect entries when walking up a chain of insertelement instructions. This occurs when it encounters more than one instruction that it is not actively searching for, as it unconditionally caches every element it finds. The fix is to only cache the first element that it isn't searching for so we don't overwrite correct entries. Reviewers: hfinkel Differential Revision: http://reviews.llvm.org/D11559 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@244448 91177308-0d34-0410-b5e6-96231b3b80d8 Fraser Cormack 4 years ago
2 changed file(s) with 38 addition(s) and 2 deletion(s). Raw diff Collapse all Expand all
226226 if (!Idx)
227227 break;
228228 unsigned J = Idx->getZExtValue();
229 CV[J] = Insert->getOperand(1);
230229 V = Insert->getOperand(0);
231 if (I == J)
230 if (I == J) {
231 CV[J] = Insert->getOperand(1);
232232 return CV[J];
233 } else if (!CV[J]) {
234 // Only cache the first entry we find for each index we're not actively
235 // searching for. This prevents us from going too far up the chain and
236 // caching incorrect entries.
237 CV[J] = Insert->getOperand(1);
238 }
233239 }
234240 CV[I] = Builder.CreateExtractElement(V, Builder.getInt32(I),
235241 V->getName() + ".i" + Twine(I));
0 ; RUN: opt -scalarizer -S < %s | FileCheck %s
1 target 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-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
2
3
4 ; Check that vector element 1 is scalarized correctly from a chain of
5 ; insertelement instructions
6 define void @func(i32 %x) {
7 ; CHECK-LABEL: @func(
8 ; CHECK-NOT: phi i32 [ %x, %entry ], [ %inc.pos.y, %loop ]
9 ; CHECK: phi i32 [ %inc, %entry ], [ %inc.pos.y, %loop ]
10 ; CHECK: ret void
11 entry:
12 %vecinit = insertelement <2 x i32> , i32 %x, i32 1
13 %inc = add i32 %x, 1
14 %0 = insertelement <2 x i32> %vecinit, i32 %inc, i32 1
15 br label %loop
16
17 loop:
18 %pos = phi <2 x i32> [ %0, %entry ], [ %new.pos.y, %loop ]
19 %i = phi i32 [ 0, %entry ], [ %new.i, %loop ]
20 %pos.y = extractelement <2 x i32> %pos, i32 1
21 %inc.pos.y = add i32 %pos.y, 1
22 %new.pos.y = insertelement <2 x i32> %pos, i32 %inc.pos.y, i32 1
23 %new.i = add i32 %i, 1
24 %cmp2 = icmp slt i32 %new.i, 1
25 br i1 %cmp2, label %loop, label %exit
26
27 exit:
28 ret void
29 }