diff options
| author | Duncan P. N. Exon Smith <dexonsmith@apple.com> | 2015-03-13 19:30:44 +0000 |
|---|---|---|
| committer | Duncan P. N. Exon Smith <dexonsmith@apple.com> | 2015-03-13 19:30:44 +0000 |
| commit | 720762e2c0fc849342996302c37471b35e3537c8 (patch) | |
| tree | 4cd06c73ce2319536810bf04136cc1dc6ca6a54e /llvm/test/Transforms | |
| parent | bb730135c960e473027ea283795051f3e3d887c3 (diff) | |
| download | bcm5719-llvm-720762e2c0fc849342996302c37471b35e3537c8.tar.gz bcm5719-llvm-720762e2c0fc849342996302c37471b35e3537c8.zip | |
AsmWriter: Write alloca array size explicitly (and -instcombine fixup)
Write the `alloca` array size explicitly when it's non-canonical.
Previously, if the array size was `iX 1` (where X is not 32), the type
would mutate to `i32` when round-tripping through assembly.
The testcase I added fails in `verify-uselistorder` (as well as
`FileCheck`), since the use-lists for `i32 1` and `i64 1` change.
(Manman Ren came across this when running `verify-uselistorder` on some
non-trivial, optimized code as part of PR5680.)
The type mutation started with r104911, which allowed array sizes to be
something other than an `i32`. Starting with r204945, we
"canonicalized" to `i64` on 64-bit platforms -- and then on every
round-trip through assembly, mutated back to `i32`.
I bundled a fixup for `-instcombine` to avoid r204945 on scalar
allocations. (There wasn't a clean way to sequence this into two
commits, since the assembly change on its own caused testcase churn, and
the `-instcombine` change can't be tested without the assembly changes.)
An obvious alternative fix -- change `AllocaInst::AllocaInst()`,
`AsmWriter` and `LLParser` to treat `intptr_t` as the canonical type for
scalar allocations -- was rejected out of hand, since this required
teaching them each about the data layout.
A follow-up commit will add an `-instcombine` to canonicalize the scalar
allocation array size to `i32 1` rather than leaving `iX 1` alone.
rdar://problem/20075773
llvm-svn: 232200
Diffstat (limited to 'llvm/test/Transforms')
| -rw-r--r-- | llvm/test/Transforms/InstCombine/alloca.ll | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/llvm/test/Transforms/InstCombine/alloca.ll b/llvm/test/Transforms/InstCombine/alloca.ll index 105029fb699..db26218f3b8 100644 --- a/llvm/test/Transforms/InstCombine/alloca.ll +++ b/llvm/test/Transforms/InstCombine/alloca.ll @@ -1,6 +1,6 @@ -; RUN: opt < %s -instcombine -S -default-data-layout="E-p:64:64:64-a0:0:8-f32:32:32-f64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-v64:64:64-v128:128:128" | FileCheck %s -; RUN: opt < %s -instcombine -S -default-data-layout="E-p:32:32:32-a0:0:8-f32:32:32-f64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-v64:64:64-v128:128:128" | FileCheck %s -check-prefix=P32 -; RUN: opt < %s -instcombine -S | FileCheck %s -check-prefix=NODL +; RUN: opt < %s -instcombine -S -default-data-layout="E-p:64:64:64-a0:0:8-f32:32:32-f64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-v64:64:64-v128:128:128" | FileCheck %s -check-prefix=CHECK -check-prefix=ALL +; RUN: opt < %s -instcombine -S -default-data-layout="E-p:32:32:32-a0:0:8-f32:32:32-f64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-v64:64:64-v128:128:128" | FileCheck %s -check-prefix=P32 -check-prefix=ALL +; RUN: opt < %s -instcombine -S | FileCheck %s -check-prefix=NODL -check-prefix=ALL declare void @use(...) @@ -150,3 +150,16 @@ entry: call void @llvm.stackrestore(i8* %inalloca.save) ret void } + +define void @test10() { +entry: +; ALL-LABEL: @test10( +; ALL: %v32 = alloca i1, align 8 +; ALL: %v64 = alloca i1, i64 1, align 8 +; ALL: %v33 = alloca i1, i33 1, align 8 + %v32 = alloca i1, align 8 + %v64 = alloca i1, i64 1, align 8 + %v33 = alloca i1, i33 1, align 8 + call void (...)* @use(i1* %v32, i1* %v64, i1* %v33) + ret void +} |

