comparison graal/GraalCompiler/src/com/sun/c1x/graph/GraphBuilder.java @ 2613:2523de4d378e

merge
author Lukas Stadler <lukas.stadler@jku.at>
date Mon, 09 May 2011 10:53:30 +0200
parents bd235cb4375a 008adfd6d850
children 5768534fd4e5
comparison
equal deleted inserted replaced
2612:32461558c98f 2613:2523de4d378e
785 // the result of resolution is not used by the invocation (only the side effect 785 // the result of resolution is not used by the invocation (only the side effect
786 // of initialization is required), it can be commoned with static field accesses. 786 // of initialization is required), it can be commoned with static field accesses.
787 genResolveClass(RiType.Representation.StaticFields, holder, isInitialized, cpi); 787 genResolveClass(RiType.Representation.StaticFields, holder, isInitialized, cpi);
788 } 788 }
789 789
790 FrameState stateBefore = frameState.create(bci());
790 Value[] args = frameState.popArguments(target.signature().argumentSlots(false)); 791 Value[] args = frameState.popArguments(target.signature().argumentSlots(false));
791 appendInvoke(INVOKESTATIC, target, args, cpi, constantPool); 792 appendInvoke(INVOKESTATIC, target, args, cpi, constantPool, stateBefore);
792 } 793 }
793 794
794 void genInvokeInterface(RiMethod target, int cpi, RiConstantPool constantPool) { 795 void genInvokeInterface(RiMethod target, int cpi, RiConstantPool constantPool) {
796 FrameState stateBefore = frameState.create(bci());
795 Value[] args = frameState.popArguments(target.signature().argumentSlots(true)); 797 Value[] args = frameState.popArguments(target.signature().argumentSlots(true));
796 798 genInvokeIndirect(INVOKEINTERFACE, target, args, cpi, constantPool, stateBefore);
797 genInvokeIndirect(INVOKEINTERFACE, target, args, cpi, constantPool);
798 799
799 } 800 }
800 801
801 void genInvokeVirtual(RiMethod target, int cpi, RiConstantPool constantPool) { 802 void genInvokeVirtual(RiMethod target, int cpi, RiConstantPool constantPool) {
803 FrameState stateBefore = frameState.create(bci());
802 Value[] args = frameState.popArguments(target.signature().argumentSlots(true)); 804 Value[] args = frameState.popArguments(target.signature().argumentSlots(true));
803 genInvokeIndirect(INVOKEVIRTUAL, target, args, cpi, constantPool); 805 genInvokeIndirect(INVOKEVIRTUAL, target, args, cpi, constantPool, stateBefore);
804 806
805 } 807 }
806 808
807 void genInvokeSpecial(RiMethod target, RiType knownHolder, int cpi, RiConstantPool constantPool) { 809 void genInvokeSpecial(RiMethod target, RiType knownHolder, int cpi, RiConstantPool constantPool) {
810 FrameState stateBefore = frameState.create(bci());
808 Value[] args = frameState.popArguments(target.signature().argumentSlots(true)); 811 Value[] args = frameState.popArguments(target.signature().argumentSlots(true));
809 invokeDirect(target, args, knownHolder, cpi, constantPool); 812 invokeDirect(target, args, knownHolder, cpi, constantPool, stateBefore);
810 813
811 } 814 }
812 815
813 /** 816 /**
814 * Temporary work-around to support the @ACCESSOR Maxine annotation. 817 * Temporary work-around to support the @ACCESSOR Maxine annotation.
840 target = newTarget; 843 target = newTarget;
841 } 844 }
842 return target; 845 return target;
843 } 846 }
844 847
845 private void genInvokeIndirect(int opcode, RiMethod target, Value[] args, int cpi, RiConstantPool constantPool) { 848 private void genInvokeIndirect(int opcode, RiMethod target, Value[] args, int cpi, RiConstantPool constantPool, FrameState stateBefore) {
846 Value receiver = args[0]; 849 Value receiver = args[0];
847 // attempt to devirtualize the call 850 // attempt to devirtualize the call
848 if (target.isResolved()) { 851 if (target.isResolved()) {
849 RiType klass = target.holder(); 852 RiType klass = target.holder();
850 853
851 // 0. check for trivial cases 854 // 0. check for trivial cases
852 if (target.canBeStaticallyBound() && !isAbstract(target.accessFlags())) { 855 if (target.canBeStaticallyBound() && !isAbstract(target.accessFlags())) {
853 // check for trivial cases (e.g. final methods, nonvirtual methods) 856 // check for trivial cases (e.g. final methods, nonvirtual methods)
854 invokeDirect(target, args, target.holder(), cpi, constantPool); 857 invokeDirect(target, args, target.holder(), cpi, constantPool, stateBefore);
855 return; 858 return;
856 } 859 }
857 // 1. check if the exact type of the receiver can be determined 860 // 1. check if the exact type of the receiver can be determined
858 RiType exact = getExactType(klass, receiver); 861 RiType exact = getExactType(klass, receiver);
859 if (exact != null && exact.isResolved()) { 862 if (exact != null && exact.isResolved()) {
860 // either the holder class is exact, or the receiver object has an exact type 863 // either the holder class is exact, or the receiver object has an exact type
861 invokeDirect(exact.resolveMethodImpl(target), args, exact, cpi, constantPool); 864 invokeDirect(exact.resolveMethodImpl(target), args, exact, cpi, constantPool, stateBefore);
862 return; 865 return;
863 } 866 }
864 // 2. check if an assumed leaf method can be found 867 // 2. check if an assumed leaf method can be found
865 RiMethod leaf = getAssumedLeafMethod(target, receiver); 868 RiMethod leaf = getAssumedLeafMethod(target, receiver);
866 if (leaf != null && leaf.isResolved() && !isAbstract(leaf.accessFlags()) && leaf.holder().isResolved()) { 869 if (leaf != null && leaf.isResolved() && !isAbstract(leaf.accessFlags()) && leaf.holder().isResolved()) {
867 if (C1XOptions.PrintAssumptions) { 870 if (C1XOptions.PrintAssumptions) {
868 TTY.println("Optimistic invoke direct because of leaf method to " + leaf); 871 TTY.println("Optimistic invoke direct because of leaf method to " + leaf);
869 } 872 }
870 invokeDirect(leaf, args, null, cpi, constantPool); 873 invokeDirect(leaf, args, null, cpi, constantPool, stateBefore);
871 return; 874 return;
872 } else if (C1XOptions.PrintAssumptions) { 875 } else if (C1XOptions.PrintAssumptions) {
873 TTY.println("Could not make leaf method assumption for target=" + target + " leaf=" + leaf + " receiver.declaredType=" + receiver.declaredType()); 876 TTY.println("Could not make leaf method assumption for target=" + target + " leaf=" + leaf + " receiver.declaredType=" + receiver.declaredType());
874 } 877 }
875 // 3. check if the either of the holder or declared type of receiver can be assumed to be a leaf 878 // 3. check if the either of the holder or declared type of receiver can be assumed to be a leaf
878 RiMethod targetMethod = exact.resolveMethodImpl(target); 881 RiMethod targetMethod = exact.resolveMethodImpl(target);
879 if (C1XOptions.PrintAssumptions) { 882 if (C1XOptions.PrintAssumptions) {
880 TTY.println("Optimistic invoke direct because of leaf type to " + targetMethod); 883 TTY.println("Optimistic invoke direct because of leaf type to " + targetMethod);
881 } 884 }
882 // either the holder class is exact, or the receiver object has an exact type 885 // either the holder class is exact, or the receiver object has an exact type
883 invokeDirect(targetMethod, args, exact, cpi, constantPool); 886 invokeDirect(targetMethod, args, exact, cpi, constantPool, stateBefore);
884 return; 887 return;
885 } else if (C1XOptions.PrintAssumptions) { 888 } else if (C1XOptions.PrintAssumptions) {
886 TTY.println("Could not make leaf type assumption for type " + klass); 889 TTY.println("Could not make leaf type assumption for type " + klass);
887 } 890 }
888 } 891 }
889 // devirtualization failed, produce an actual invokevirtual 892 // devirtualization failed, produce an actual invokevirtual
890 appendInvoke(opcode, target, args, cpi, constantPool); 893 appendInvoke(opcode, target, args, cpi, constantPool, stateBefore);
891 } 894 }
892 895
893 private CiKind returnKind(RiMethod target) { 896 private CiKind returnKind(RiMethod target) {
894 return target.signature().returnKind(); 897 return target.signature().returnKind();
895 } 898 }
896 899
897 private void invokeDirect(RiMethod target, Value[] args, RiType knownHolder, int cpi, RiConstantPool constantPool) { 900 private void invokeDirect(RiMethod target, Value[] args, RiType knownHolder, int cpi, RiConstantPool constantPool, FrameState stateBefore) {
898 appendInvoke(INVOKESPECIAL, target, args, cpi, constantPool); 901 appendInvoke(INVOKESPECIAL, target, args, cpi, constantPool, stateBefore);
899 } 902 }
900 903
901 private void appendInvoke(int opcode, RiMethod target, Value[] args, int cpi, RiConstantPool constantPool) { 904 private void appendInvoke(int opcode, RiMethod target, Value[] args, int cpi, RiConstantPool constantPool, FrameState stateBefore) {
902 CiKind resultType = returnKind(target); 905 CiKind resultType = returnKind(target);
903 Value result = append(new Invoke(opcode, resultType.stackKind(), args, target, target.signature().returnType(compilation.method.holder()), null, graph)); 906 Value result = append(new Invoke(opcode, resultType.stackKind(), args, target, target.signature().returnType(compilation.method.holder()), stateBefore, graph));
904 pushReturn(resultType, result); 907 pushReturn(resultType, result);
905 } 908 }
906 909
907 private RiType getExactType(RiType staticType, Value receiver) { 910 private RiType getExactType(RiType staticType, Value receiver) {
908 RiType exact = staticType.exactType(); 911 RiType exact = staticType.exactType();