This isn't due to the bitcasts, it's crashing trying to verify the use of the memcpy intrinsic. Please file a bug report so we can track this, and please include your excellent testcase!<div><br></div><div>Nick<br>

<br><div class="gmail_quote">On 8 June 2010 10:10, Bagel <span dir="ltr"><<a href="mailto:bagel99@gmail.com">bagel99@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">

The following code works on 2.7, but causes an assertion on recent snapshots.<br>
Has something changed regarding bitcasts that makes this illegal?<br>
<br>
The code is:<br>
<br>
target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:32"<br>
target triple = "x86-unknown-unknown"<br>
@aa = global [32 x i8] zeroinitializer, align 1<br>
@bb = global [16 x i8] zeroinitializer, align 1<br>
define void @x() nounwind {<br>
L.0:<br>
        %0 = getelementptr [32 x i8]* @aa, i32 0, i32 4<br>
        %1 = bitcast i8* %0 to [16 x i8]*<br>
        %2 = bitcast [16 x i8]* %1 to [0 x i8]*<br>
        %3 = getelementptr [16 x i8]* @bb<br>
        %4 = bitcast [16 x i8]* %3 to [0 x i8]*<br>
        call void @llvm.memcpy.i32([0 x i8]* %2, [0 x i8]* %4, i32 16, i32 1)<br>
        br label %return<br>
return:<br>
        ret void<br>
}<br>
declare void @llvm.memcpy.i32([0 x i8]*, [0 x i8]*, i32, i32) nounwind<br>
<br>
The assertion is:<br>
Unknown type!<br>
UNREACHABLE executed at ValueTypes.cpp:190!<br>
0  opt             0x000000000081cf8f<br>
1  opt             0x000000000081effa<br>
2  libpthread.so.0 0x0000003961a0f0f0<br>
3  libc.so.6       0x0000003960e326d5 gsignal + 53<br>
4  libc.so.6       0x0000003960e33eb5 abort + 373<br>
5  opt             0x0000000000800e14 llvm::llvm_unreachable_internal(char<br>
const*, char const*, unsigned int) + 356<br>
6  opt             0x00000000007c8733 llvm::EVT::getEVT(llvm::Type const*,<br>
bool) + 979<br>
7  opt             0x00000000007ccff1<br>
8  opt             0x00000000007cd446<br>
9  opt             0x00000000007d56b7<br>
10 opt             0x00000000007d6826<br>
11 opt             0x00000000007b223d<br>
llvm::FPPassManager::runOnFunction(llvm::Function&) + 637<br>
12 opt             0x00000000007b233b<br>
llvm::FPPassManager::runOnModule(llvm::Module&) + 75<br>
13 opt             0x00000000007b1d41<br>
llvm::MPPassManager::runOnModule(llvm::Module&) + 497<br>
14 opt             0x00000000007b1eb7 llvm::PassManagerImpl::run(llvm::Module&)<br>
+ 167<br>
15 opt             0x00000000004a1a02 main + 2642<br>
16 libc.so.6       0x0000003960e1eb1d __libc_start_main + 253<br>
17 opt             0x0000000000497639<br>
Stack dump:<br>
0.      Program arguments: /home/bgl/work/llvm-work/Release/bin/opt<br>
-std-compile-opts -o - t322.ll<br>
1.      Running pass 'Function Pass Manager' on module 't322.ll'.<br>
2.      Running pass 'Module Verifier' on function '@x'<br>
<br>
Any ideas?<br>
Thanks.<br>
_______________________________________________<br>
LLVM Developers mailing list<br>
<a href="mailto:LLVMdev@cs.uiuc.edu">LLVMdev@cs.uiuc.edu</a>         <a href="http://llvm.cs.uiuc.edu" target="_blank">http://llvm.cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev</a><br>
</blockquote></div><br></div>