[llvm-dev] Why is there still ineffective code after -o3 optimization? (original) (raw)
alexp via llvm-dev llvm-dev at lists.llvm.org
Mon Feb 25 06:09:26 PST 2019
- Previous message: [llvm-dev] transformation passes (e.g. adce) as analysis only?
- Next message: [llvm-dev] Why is there still ineffective code after -o3 optimization?
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Hi,
I have some IR module from random generation (mostly ineffective instructions). It has a function with void return, and two function arguments where one is a reference. Therefore, I expect every instruction not altering the value at the 2nd arguments address should be ineffective.
Here is the function definition (see below for full ll):
define void @_Z27entityMainDataInputCallbackdRd(double %input, double* dereferenceable(8) %o0) local_unnamed_addr #0 {
The ll below has been optimized using opt -O3 -S input.ll -o out.ll The cfg is plotted as png here: https://ibb.co/f1B0rnm
My question is: why is there still some unnecessary 'lint' in the optimization result? E.G. from the splittedblock19 onwards: there is one effective instruction store double 0x3FF787378698A951, double* %o0
everything what follows (conditional branch, splittedblock38, 21, 42) could safely be removed (just leaving a 'ret void' after the store instruction).
Why is this not removed?
Is there a pass (combination) which could remove all the ineffective instructions?
Thanks Alex
//====================================================== //=== full ll below
; ModuleID = '0.1.800866.ll' source_filename = "entityMain.cpp" target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" target triple = "x86_64-unknown-linux-gnu"
; Function Attrs: noinline nounwind optnone uwtable define void @_Z27entityMainDataInputCallbackdRd(double %input, double* dereferenceable(8) %o0) local_unnamed_addr #0 { entry: %input.addr = alloca double, align 8 %o0.addr = alloca double*, align 8 %ui = alloca i32, align 4 store double %input, double* %input.addr, align 8 %0 = fptoui double %input to i64 %1 = fptrunc double %input to float %2 = mul i64 %0, %0 %3 = fptrunc double %input to float %4 = mul i64 %0, %0 %5 = fsub float %3, %3 store double* %o0, double** %o0.addr %6 = and i64 %0, %0 %7 = fptoui float %3 to i1 %8 = ashr i1 %7, %7 store double* null, double** %o0.addr %9 = fptosi double %input to i64 %10 = shl i1 %7, %7 %11 = sitofp i1 %8 to float %12 = icmp uge i64 %6, %4 %13 = and i64 %0, %6 %14 = fcmp ole float %11, %11 %15 = ashr i1 %10, %7 %16 = sext i1 %10 to i64 %17 = ashr i1 %7, %12 %18 = alloca [2 x double] %19 = fcmp true float %11, %3 br label %splittedblock7
splittedblock7: ; preds = %entry %20 = select i1 %8, i1 %17, i1 %19 %21 = fptoui float %1 to i1 br label %splittedblock1
splittedblock1: ; preds = %splittedblock7 %22 = fptrunc double %input to float %23 = shl i1 %17, %20 %24 = fsub float %5, %5 br label %splittedblock35
splittedblock36: ; preds = %splittedblock10 br label %splittedblock15
splittedblock38: ; preds = %splittedblock19 br label %splittedblock21
splittedblock10: ; preds = %splittedblock35 br label %splittedblock36
splittedblock35: ; preds = %splittedblock1 br i1 %12, label %splittedblock14, label %splittedblock10
splittedblock14: ; preds = %splittedblock35 br label %splittedblock19
splittedblock19: ; preds = %splittedblock14 store double 0x3FF787378698A951, double* %o0 br i1 %23, label %splittedblock38, label %splittedblock42
splittedblock42: ; preds = %splittedblock21, %splittedblock19 ret void
splittedblock15: ; preds = %splittedblock36 ret void
splittedblock21: ; preds = %splittedblock38 %25 = xor i64 %6, %4 br label %splittedblock42 }
; Function Attrs: norecurse nounwind readnone define <2 x double> @func_3701811888700380719897139(...) local_unnamed_addr #1 { entry: ret <2 x double> <double 0xC00934F9D7726A00, double 0xFFCFDA8E9AFFB51D> }
; Function Attrs: norecurse noreturn nounwind readnone define { double, double } @func_0065559471331315590586(...) local_unnamed_addr #2 { entry: br label %splittedblock1
splittedblock1: ; preds = %entry, %splittedblock1 br label %splittedblock1 }
attributes #0 = { noinline nounwind optnone uwtable "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" } attributes #1 = { norecurse nounwind readnone } attributes #2 = { norecurse noreturn nounwind readnone }
!llvm.module.flags = !{!0, !1} !llvm.ident = !{!2}
!0 = !{i32 1, !"wchar_size", i32 4} !1 = !{i32 7, !"PIC Level", i32 2} !2 = !{!"clang version 7.0.1 (branches/release_70 348238)"}
- Previous message: [llvm-dev] transformation passes (e.g. adce) as analysis only?
- Next message: [llvm-dev] Why is there still ineffective code after -o3 optimization?
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]