diff options
author | Juergen Ributzka <juergen@apple.com> | 2014-03-22 01:49:27 +0000 |
---|---|---|
committer | Juergen Ributzka <juergen@apple.com> | 2014-03-22 01:49:27 +0000 |
commit | 5cfc91c9a524efb027e6a639ef69fd0ca8911389 (patch) | |
tree | 7009d05d638e9155ddccbac48e1ad155cd71c347 /test/Transforms/ConstantHoisting | |
parent | d47cb57ab88956197c266df3353347eb31790781 (diff) | |
download | llvm-5cfc91c9a524efb027e6a639ef69fd0ca8911389.tar.gz llvm-5cfc91c9a524efb027e6a639ef69fd0ca8911389.tar.bz2 llvm-5cfc91c9a524efb027e6a639ef69fd0ca8911389.tar.xz |
[Constant Hoisting] Fix multiple entries for the same basic block in PHI nodes.
A PHI node usually has only one value/basic block pair per incoming basic block.
In the case of a switch statement it is possible that a following PHI node may
have more than one such pair per incoming basic block. E.g.:
%0 = phi i64 [ 123456, %case2 ], [ 654321, %Entry ], [ 654321, %Entry ]
This is valid and the verfier doesn't complain, because both values are the
same.
Constant hoisting materializes the constant for each operand separately and the
value is still the same, but the variable names have changed. As a result the
verfier can't recognize anymore that they are the same value and complains.
This fix adds special update code for PHI node in constant hoisting to prevent
this corner case.
This fixes <rdar://problem/16394449>
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@204537 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/Transforms/ConstantHoisting')
-rw-r--r-- | test/Transforms/ConstantHoisting/X86/phi.ll | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/test/Transforms/ConstantHoisting/X86/phi.ll b/test/Transforms/ConstantHoisting/X86/phi.ll index 7134723f61..086df14047 100644 --- a/test/Transforms/ConstantHoisting/X86/phi.ll +++ b/test/Transforms/ConstantHoisting/X86/phi.ll @@ -68,3 +68,49 @@ if.then8: ; preds = %if.end3 if.end9: ; preds = %if.then8, %if.end3 ret i32 undef } + +; <rdar://problem/16394449> +define i64 @switch_test1(i64 %a) { +; CHECK-LABEL: @switch_test1 +; CHECK: %0 = phi i64 [ %const, %case2 ], [ %const_mat, %Entry ], [ %const_mat, %Entry ] +Entry: + %sel = add i64 %a, 4519019440 + switch i64 %sel, label %fail [ + i64 462, label %continuation + i64 449, label %case2 + i64 443, label %continuation + ] + +case2: + br label %continuation + +continuation: + %0 = phi i64 [ 4519019440, %case2 ], [ 4519019460, %Entry ], [ 4519019460, %Entry ] + ret i64 0; + +fail: + ret i64 -1; +} + +define i64 @switch_test2(i64 %a) { +; CHECK-LABEL: @switch_test2 +; CHECK: %2 = phi i64* [ %1, %case2 ], [ %0, %Entry ], [ %0, %Entry ] +Entry: + %sel = add i64 %a, 4519019440 + switch i64 %sel, label %fail [ + i64 462, label %continuation + i64 449, label %case2 + i64 443, label %continuation + ] + +case2: + br label %continuation + +continuation: + %0 = phi i64* [ inttoptr(i64 4519019440 to i64*), %case2 ], [ inttoptr(i64 4519019460 to i64*), %Entry ], [ inttoptr(i64 4519019460 to i64*), %Entry ] + ret i64 0; + +fail: + ret i64 -1; +} + |