llvm / llvm-project

The LLVM Project is a collection of modular and reusable compiler and toolchain technologies.
http://llvm.org
Other
29.12k stars 12.01k forks source link

DAG combiner runs optimizations when CodeGenOpt::Level = None is specified #10188

Open llvmbot opened 13 years ago

llvmbot commented 13 years ago
Bugzilla Link 9816
Version 2.9
OS Windows NT
Attachments Patch to disable dag combine with CodeGenOpt::Level = None
Reporter LLVM Bugzilla Contributor
CC @karka228,@sunfishcode

Extended Description

The DAG combiner runs even thought the Opt level is set to None. This causes problems with debug information as the DAG combiner does not preserve debug information.

For example, this IR:

define void @​OpenCL_test_kernel(i32 addrspace(1) %ip) nounwind { entry: call void @​llvm.dbg.value(metadata !{i32 addrspace(1) %ip}, i64 0, metadata !​7), !dbg !​8 %0 = call <4 x i32> @​amdil_get_global_id_int() nounwind %1 = extractelement <4 x i32> %0, i32 0 call void @​llvm.dbg.value(metadata !{i32 %1}, i64 0, metadata !​9), !dbg !​11 call void @​llvm.dbg.value(metadata !​12, i64 0, metadata !​13), !dbg !​14 %tmp2 = load i32 addrspace(1) %ip, align 4, !dbg !​15 %tmp3 = add i32 0, %tmp2, !dbg !​15 call void @​llvm.dbg.value(metadata !{i32 %tmp3}, i64 0, metadata !​13), !dbg !​15 %arrayidx = getelementptr i32 addrspace(1) %ip, i32 %1, !dbg !​16 store i32 %tmp3, i32 addrspace(1)* %arrayidx, align 4, !dbg !​16 ret void, !dbg !​17 } !llvm.dbg.sp = !{#0}

!​0 = metadata !{i32 589870, i32 0, metadata !​1, metadata !"OpenCL_test_kernel", metadata !"OpenCL_test_kernel", metadata !"__OpenCL_test_kernel", metadata !​1, i32 2, metadata !​3, i1 false, i1 true, i32 0, i32 0, i32 0, i32 0, i1 false, null} ; [ DW_TAG_subprogram ] !​1 = metadata !{i32 589865, metadata !"OCL6368.tmp.cl", metadata !"E:\5CUsers\5Cmvillmow.AMD\5CAppData\5CLocal\5CTemp", metadata !​2} ; [ DW_TAG_file_type ] !​2 = metadata !{i32 589841, i32 0, i32 1, metadata !"OCL6368.tmp.cl", metadata !"E:\5CUsers\5Cmvillmow.AMD\5CAppData\5CLocal\5CTemp", metadata !"clc", i1 true, i1 false, metadata !"", i32 0} ; [ DW_TAG_compile_unit ] !​3 = metadata !{i32 589845, metadata !​1, metadata !"", metadata !​1, i32 0, i64 0, i64 0, i32 0, i32 0, i32 0, metadata !​4, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] !​4 = metadata !{null, metadata !​5} !​5 = metadata !{i32 589839, metadata !​2, metadata !"", null, i32 0, i64 32, i64 32, i64 0, i32 0, metadata !​6} ; [ DW_TAG_pointer_type ] !​6 = metadata !{i32 589860, metadata !​2, metadata !"unsigned int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 7} ; [ DW_TAG_base_type ] !​7 = metadata !{i32 590081, metadata !​0, metadata !"ip", metadata !​1, i32 1, metadata !​5, i32 0} ; [ DW_TAG_arg_variable ] !​8 = metadata !{i32 1, i32 42, metadata !​0, null} !​9 = metadata !{i32 590080, metadata !​10, metadata !"gid", metadata !​1, i32 3, metadata !​6, i32 0} ; [ DW_TAG_auto_variable ] !​10 = metadata !{i32 589835, metadata !​0, i32 2, i32 1, metadata !​1, i32 0} ; [ DW_TAG_lexical_block ] !​11 = metadata !{i32 3, i32 41, metadata !​10, null} !​12 = metadata !{i32 0} !​13 = metadata !{i32 590080, metadata !​10, metadata !"idx", metadata !​1, i32 4, metadata !​6, i32 0} ; [ DW_TAG_auto_variable ] !​14 = metadata !{i32 4, i32 20, metadata !​10, null} !​15 = metadata !{i32 5, i32 15, metadata !​10, null} !​16 = metadata !{i32 6, i32 18, metadata !​10, null} !​17 = metadata !{i32 7, i32 1, metadata !​0, null} The third llvm.dbg.value is attached to %tmp3. In combine, we visit the add here, SDValue DAGCombiner::visitADD(SDNode *N), and the following transformation occurs: // fold (add x, 0) -> x if (N1C && N1C->isNullValue()) return N0;

This causes the llvm.dbg.value to be dropped and the variable does not appear in the dwarf information not allowing the variable to be inspected at that location.

lattner commented 13 years ago

Dan, can you take a look at this?

llvmbot commented 13 years ago

Yeah, that is true, but this is a -O0 compilation. If the user wants fast compilation they can use -O[1-3]. -O0 should stay true to the original source as much as possible. This normally wouldn't be an issue except when related to debug information, see bug9817, as DAG.Combine does not preserve debug information.

llvmbot commented 13 years ago

The reason it runs even at -O0 is that doing so speeds up compilation.