[LLVMbugs] [Bug 18459] New: Recursive function inline problems

bugzilla-daemon at llvm.org bugzilla-daemon at llvm.org
Mon Jan 13 10:50:14 PST 2014


http://llvm.org/bugs/show_bug.cgi?id=18459

            Bug ID: 18459
           Summary: Recursive function inline problems
           Product: libraries
           Version: trunk
          Hardware: PC
                OS: Linux
            Status: NEW
          Severity: normal
          Priority: P
         Component: Transformation Utilities
          Assignee: unassignedbugs at nondot.org
          Reporter: css20 at mail.ru
                CC: llvmbugs at cs.uiuc.edu
    Classification: Unclassified

Created attachment 11863
  --> http://llvm.org/bugs/attachment.cgi?id=11863&action=edit
testcase

Follow this steps using attachment puzzle.ll:

llvm-as -f puzzle.ll
llc puzzle.bc
gcc puzzle.s -o puzzle
./puzzle

Found duplicate: 256943
Found duplicate: 106186
Found duplicate: 465226
Found duplicate: 112763
Found duplicate: 406647

Then try optimize bitcode:
opt -inline puzzle.bc -o puzzle.opt.bc
llc puzzle.opt.bc
gcc puzzle.opt.s -o puzzle.opt
./puzzle.opt

Found duplicate: 491574
Found duplicate: 480454
Found duplicate: 447135
Found duplicate: 255009
Found duplicate: 419126


Strange optimization.. ok, try bugpoint

bugpoint --safe-run-llc --run-llc puzzle.bc -inline

...

*** The following function is being miscompiled:  .shuffle.createRandomArray
Outputting reduced bitcode files which expose the problem:
  Non-optimized portion: Emitted bitcode to 'bugpoint-tonotoptimize.bc'
  Portion that is input to optimizer: Emitted bitcode to
'bugpoint-tooptimize.bc'

*** You can reproduce the problem with: opt bugpoint-tooptimize.bc -inline



bugpoint-tooptimize.bc disasseble fragment:

define i32* @.shuffle.createRandomArray(i32* %items, i32 %functionID, i32
%len.size) {
combEntry:
  %"collect alloca point17" = bitcast i32 0 to i32
  %"collect alloca point16" = bitcast i32 0 to i32
  %"collect alloca point15" = bitcast i32 0 to i32
  %"collect alloca point14" = bitcast i32 0 to i32
  %"collect alloca point13" = bitcast i32 0 to i32
  %"collect alloca point12" = bitcast i32 0 to i32
  %"collect alloca point11" = bitcast i32 0 to i32
  %"collect alloca point" = bitcast i32 0 to i32
  switch i32 %functionID, label %codeRepl3 [
    i32 38, label %codeRepl2
    i32 39, label %entryfcomb1
  ]

codeRepl2:                                        ; preds = %combEntry
  call void @.shuffle.createRandomArray_combEntry.entryfcomb_crit_edge1()
  br label %entryfcomb

codeRepl3:                                        ; preds = %combEntry
  call void @.shuffle.createRandomArray_combEntry.entryfcomb_crit_edge()
  br label %entryfcomb

entryfcomb:                                       ; preds = %codeRepl3,
%codeRepl2
  %subfcomb = sub nsw i32 %len.size, 1
  %convfcomb = sext i32 %subfcomb to i64
  br label %codeRepl4

codeRepl4:                                        ; preds = %entryfcomb
  call void @.shuffle.createRandomArray_codeRepl(i64 %convfcomb, i32* %items)
  br label %codeRepl

codeRepl:                                         ; preds = %codeRepl4
  call void @.shuffle.createRandomArray_for.endfcomb()
  br label %for.endfcomb.ret

for.endfcomb.ret:                                 ; preds = %codeRepl
  ret i32* null

entryfcomb1:                                      ; preds = %combEntry
  %addfcomb3 = add nsw i32 %len.size, 1
  %convfcomb4 = sext i32 %addfcomb3 to i64
  %mulfcomb5 = mul i64 %convfcomb4, 4
  %callfcomb = call i8* @malloc(i64 %mulfcomb5)
  %0 = bitcast i8* %callfcomb to i32*
  br label %codeRepl5

codeRepl5:                                        ; preds = %entryfcomb1
  call void @.shuffle.createRandomArray_codeRepl1(i32 %addfcomb3, i32* %0)
  br label %for.endfcomb10

for.endfcomb10:                                   ; preds = %codeRepl5
  %call24fcomb = call i32 @.rand.srand.randInt(i32 1, i32 %len.size, i32 38)
  %arrayidx3fcomb = getelementptr inbounds i32* %0, i64 0
  store i32 %call24fcomb, i32* %arrayidx3fcomb, align 4, !tbaa !1
  %1 = call i32* @.shuffle.createRandomArray(i32* %0, i32 38, i32 %addfcomb3)
  ret i32* %0
}


look basic block for.endfcomb10, it contains recursive call. Now we can see
content of "for.endfcomb10" basic block after optimization (opt -inline):

for.endfcomb10:                                   ; preds = %codeRepl5
  %call24fcomb = call i32 @.rand.srand.randInt(i32 1, i32 %len.size, i32 8)
  %arrayidx3fcomb = getelementptr inbounds i32* %0, i64 0
  store i32 %call24fcomb, i32* %arrayidx3fcomb, align 4, !tbaa !1

  ; here was recursive call
  call void @.shuffle.createRandomArray_combEntry.entryfcomb_crit_edge1()
  %convfcomb.i = sext i32 %addfcomb3 to i64
  call void @.shuffle.createRandomArray_codeRepl(i64 %convfcomb.i, i32* %0)
  call void @.shuffle.createRandomArray_for.endfcomb()
  ret i32* %0

If we try walk manually to call @.shuffle.createRandomArray(i32* %0, i32 38,
i32 %addfcomb3), we must pass this instructions:

call void @.shuffle.createRandomArray_combEntry.entryfcomb_crit_edge1()
%subfcomb = sub nsw i32 %addfcomb3, 1  ; <--- WHERE IS IT???
%convfcomb = sext i32 %subfcomb to i64
call void @.shuffle.createRandomArray_codeRepl(i64 %convfcomb, i32* %items)
call void @.shuffle.createRandomArray_for.endfcomb()

Instruction "%subfcomb = sub nsw i32 %addfcomb3, 1" not exists in listing after
optimization, "-inline" pass loses it?

-- 
You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20140113/e49325b5/attachment.html>


More information about the llvm-bugs mailing list