From e29ab2bfabd12d06214a4a516ea9a2d44b5f1a0b Mon Sep 17 00:00:00 2001 From: Fraser Cormack Date: Mon, 10 Aug 2015 14:48:47 +0000 Subject: 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 llvm-svn: 244448 --- llvm/test/Transforms/Scalarizer/cache-bug.ll | 30 ++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 llvm/test/Transforms/Scalarizer/cache-bug.ll (limited to 'llvm/test/Transforms/Scalarizer') diff --git a/llvm/test/Transforms/Scalarizer/cache-bug.ll b/llvm/test/Transforms/Scalarizer/cache-bug.ll new file mode 100644 index 00000000000..f8c2d100d59 --- /dev/null +++ b/llvm/test/Transforms/Scalarizer/cache-bug.ll @@ -0,0 +1,30 @@ +; RUN: opt -scalarizer -S < %s | FileCheck %s +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" + + +; Check that vector element 1 is scalarized correctly from a chain of +; insertelement instructions +define void @func(i32 %x) { +; CHECK-LABEL: @func( +; CHECK-NOT: phi i32 [ %x, %entry ], [ %inc.pos.y, %loop ] +; CHECK: phi i32 [ %inc, %entry ], [ %inc.pos.y, %loop ] +; CHECK: ret void +entry: + %vecinit = insertelement <2 x i32> , i32 %x, i32 1 + %inc = add i32 %x, 1 + %0 = insertelement <2 x i32> %vecinit, i32 %inc, i32 1 + br label %loop + +loop: + %pos = phi <2 x i32> [ %0, %entry ], [ %new.pos.y, %loop ] + %i = phi i32 [ 0, %entry ], [ %new.i, %loop ] + %pos.y = extractelement <2 x i32> %pos, i32 1 + %inc.pos.y = add i32 %pos.y, 1 + %new.pos.y = insertelement <2 x i32> %pos, i32 %inc.pos.y, i32 1 + %new.i = add i32 %i, 1 + %cmp2 = icmp slt i32 %new.i, 1 + br i1 %cmp2, label %loop, label %exit + +exit: + ret void +} -- cgit v1.2.3