Closed
Description
make stage2/std.o CFG_DISABLE_OPTIMIZE=1
results in the following:
Instruction does not dominate all uses!
%20 = load %tydesc** %19
store %tydesc* %20, %tydesc** %7
Broken module found, compilation aborted!
Stack dump:
0. Running pass 'Function Pass Manager' on module 'rust_out'.
1. Running pass 'Module Verifier' on function '@_rust_thunk1273_deque_create_grow'
Aborted
The following test cases reproduces:
fn grow[T](vec[T] elts) {
auto copy_op = bind grow[T](elts);
}
fn main() {
}
And fails with the following:
Instruction does not dominate all uses!
%19 = load %tydesc** %18
store %tydesc* %19, %tydesc** %6
Broken module found, compilation aborted!
Stack dump:
0. Running pass 'Function Pass Manager' on module 'rust_out'.
1. Running pass 'Module Verifier' on function '@_rust_thunk17_grow'
Aborted
The code generated for the thunk in the test case looks like:
define internal fastcc void @_rust_thunk17_grow(i1*, %task*, %10*) {
allocas:
%3 = alloca [1 x %tydesc*]
%4 = alloca %tydesc
%5 = alloca %13*
br label %copy_args
copy_args: ; preds = %allocas
br label %derived_tydescs
derived_tydescs: ; preds = %copy_args
%6 = getelementptr [1 x %tydesc*]* %3, i32 0, i32 0
store %tydesc* %19, %tydesc** %6
%7 = load %tydesc* @_rust_tydesc11_grow
store %tydesc %7, %tydesc* %4
%8 = getelementptr %tydesc* %4, i32 0, i32 0
%9 = getelementptr [1 x %tydesc*]* %3, i32 0, i32 0
%10 = getelementptr %tydesc* %4, i32 0, i32 0
store %tydesc** %9, %tydesc*** %10
%11 = getelementptr %tydesc* %4, i32 0, i32 1
store i32 ptrtoint (i1** getelementptr (i1** null, i32 1) to i32), i32* %11
%12 = getelementptr %tydesc* %4, i32 0, i32 2
store i32 ptrtoint (i1** getelementptr (%15* null, i64 0, i32 1) to i32), i32* %12
br label %13
; <label>:13 ; preds = %derived_tydescs
%14 = bitcast %10* %2 to %20*
%15 = getelementptr %20* %14, i32 0, i32 1, i32 1
%16 = getelementptr %22* %15, i32 0, i32 1
%17 = load %10** %16
%18 = getelementptr %20* %14, i32 0, i32 1, i32 3, i32 0
%19 = load %tydesc** %18
%20 = getelementptr %20* %14, i32 0, i32 1, i32 2, i32 0
%21 = load %13** %20
store %13* %21, %13** %5
%22 = bitcast %13** %5 to i8*
%23 = getelementptr %tydesc* %4, i32 0, i32 0
%24 = load %tydesc*** %23
%25 = getelementptr %tydesc* %4, i32 0, i32 3
%26 = load void (i1*, %task*, i1*, %tydesc**, i8*)** %25
call fastcc void %26(i1* null, %task* %1, i1* null, %tydesc** %24, i8* %22)
%27 = getelementptr %22* %15, i32 0, i32 0
%28 = bitcast void (i1*, %task*, %10*, %13*)** %27 to void (i1*, %task*, %10*, %tydesc*, %13*)**
%29 = load void (i1*, %task*, %10*, %tydesc*, %13*)** %28
call fastcc void %29(i1* %0, %task* %1, %10* %17, %tydesc* %19, %13* %21)
ret void
}
Note that this only happens when generating unoptimized code - the verifier runs after the optimizer, which seems to hide problems in code generation.
Metadata
Metadata
Assignees
Labels
No labels