1*9880d681SAndroid Build Coastguard Worker; REQUIRES: asserts 2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -verify-machineinstrs -march=x86 -mcpu=core2 -pre-RA-sched=source -enable-misched -verify-misched -debug-only=misched -o - 2>&1 > /dev/null | FileCheck %s 3*9880d681SAndroid Build Coastguard Worker; 4*9880d681SAndroid Build Coastguard Worker; Test scheduling of copy instructions. 5*9880d681SAndroid Build Coastguard Worker; 6*9880d681SAndroid Build Coastguard Worker; Argument copies should be hoisted to the top of the block. 7*9880d681SAndroid Build Coastguard Worker; Return copies should be sunk to the end. 8*9880d681SAndroid Build Coastguard Worker; MUL_HiLo PhysReg use copies should be just above the mul. 9*9880d681SAndroid Build Coastguard Worker; MUL_HiLo PhysReg def copies should be just below the mul. 10*9880d681SAndroid Build Coastguard Worker; 11*9880d681SAndroid Build Coastguard Worker; CHECK: *** Final schedule for BB#1 *** 12*9880d681SAndroid Build Coastguard Worker; CHECK: %EAX<def> = COPY 13*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: MUL32r %vreg{{[0-9]+}}, %EAX<imp-def>, %EDX<imp-def>, %EFLAGS<imp-def,dead>, %EAX<imp-use>; 14*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: COPY %E{{[AD]}}X 15*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: COPY %E{{[AD]}}X 16*9880d681SAndroid Build Coastguard Worker; CHECK: DIVSSrm 17*9880d681SAndroid Build Coastguard Workerdefine i64 @mulhoist(i32 %a, i32 %b) #0 { 18*9880d681SAndroid Build Coastguard Workerentry: 19*9880d681SAndroid Build Coastguard Worker br label %body 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Workerbody: 22*9880d681SAndroid Build Coastguard Worker %convb = sitofp i32 %b to float 23*9880d681SAndroid Build Coastguard Worker ; Generates an iMUL64r to legalize types. 24*9880d681SAndroid Build Coastguard Worker %aa = zext i32 %a to i64 25*9880d681SAndroid Build Coastguard Worker %mul = mul i64 %aa, 74383 26*9880d681SAndroid Build Coastguard Worker ; Do some dependent long latency stuff. 27*9880d681SAndroid Build Coastguard Worker %trunc = trunc i64 %mul to i32 28*9880d681SAndroid Build Coastguard Worker %convm = sitofp i32 %trunc to float 29*9880d681SAndroid Build Coastguard Worker %divm = fdiv float %convm, 0.75 30*9880d681SAndroid Build Coastguard Worker ;%addmb = fadd float %divm, %convb 31*9880d681SAndroid Build Coastguard Worker ;%divmb = fdiv float %addmb, 0.125 32*9880d681SAndroid Build Coastguard Worker ; Do some independent long latency stuff. 33*9880d681SAndroid Build Coastguard Worker %conva = sitofp i32 %a to float 34*9880d681SAndroid Build Coastguard Worker %diva = fdiv float %conva, 0.75 35*9880d681SAndroid Build Coastguard Worker %addab = fadd float %diva, %convb 36*9880d681SAndroid Build Coastguard Worker %divab = fdiv float %addab, 0.125 37*9880d681SAndroid Build Coastguard Worker br label %end 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Workerend: 40*9880d681SAndroid Build Coastguard Worker %val = fptosi float %divab to i64 41*9880d681SAndroid Build Coastguard Worker %add = add i64 %mul, %val 42*9880d681SAndroid Build Coastguard Worker ret i64 %add 43*9880d681SAndroid Build Coastguard Worker} 44*9880d681SAndroid Build Coastguard Worker 45*9880d681SAndroid Build Coastguard Workerattributes #0 = { nounwind ssp uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "unsafe-fp-math"="false" "use-soft-float"="false" } 46*9880d681SAndroid Build Coastguard Worker 47*9880d681SAndroid Build Coastguard Worker!0 = !{!"float", !1} 48*9880d681SAndroid Build Coastguard Worker!1 = !{!"omnipotent char", !2} 49*9880d681SAndroid Build Coastguard Worker!2 = !{!"Simple C/C++ TBAA"} 50