[llvm-dev] Why is there still ineffective code after -o3 optimization?

alexp via llvm-dev llvm-dev at lists.llvm.org
Mon Feb 25 06:09:26 PST 2019


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)"}


More information about the llvm-dev mailing list