Re: [rvm-research] AddressArray with CAS
Michael Bond <[email protected]>
| Newsgroups | gmane.comp.java.jikes.rvm.devel |
|---|---|
| Message-ID | <[email protected]> |
Hi Nachshon,
I'm not sure what the exact issue is here but this kind of thing can
happen with magic/unboxed types. An alternative approach:
ObjectReference.fromObject(wordArray).toAddress().attempt(oldValue,
newValue, offset);
Instead of using Magic.attemptWord(), which requires an Object, it uses
Address.attempt(). It should lead to the same optimized IA-32 code.
Cheers,
Mike
On 06/09/2013 10:20 AM, Nachshon Cohen O wrote:
> Hi,
>
> I'm trying to use CAS on a WordArray entry. The problem is that
> Magic.attemptWord expects an Object.
> I was suggested to send the WordArray instance as an object, and it
> works great for the baseline compiler.
> However, for the opt compiler I get the error listed below (which
> closely relates to http://jira.codehaus.org/browse/RVM-175).
> It seems that the opt compiler fails casting WordArray instance to an
> Object instance.
> Attaching minimal code that create the failure, and the failure trace.
>
> Thanks for any help,
> Nachshon Cohen
> Technion Institute of Technology, Israel,
>
> *Minimal failing code:*
> protected WordArray localBfrs = WordArray.create(numThreads);
> @Inlineboolean casPtr(finalint id, final Word ptr, final Word word){
> return CompareAndSwapWord(localBfrs, ofst(id), ptr, word);
> }
> boolean CompareAndSwapWord(final Object obj, final Offset ofst,
> final Word oldVal, final Word newVal){
> return false; //Magic.attemptsWord(obj, ofst, oldVal, newVal);
> Commented for minimal failed code.
> }
>
> ******* bin/buildit failure: *
>
>
> build-bootimage:
> [echo] Building bootimage. Output redirected to :
> /Users/nachshonc/Documents/Programs/jikesrvm-3.1.3/target/FTGCopt_x86_64-osx/BootImageWriterOutput.txt
> [echo] MMTk properties =
> /Users/nachshonc/Documents/Programs/jikesrvm-3.1.3/build/mmtk/default.properties
> [java] BootImageWriter: compiler arg: O2
> [java] Java Result: 101
> [echo] BootImageCompiler: init (opt compiler)
> [echo] Compiler failure during compilation of < BootstrapCL,
> Lorg/mmtk/utility/WFMS/WFQueue; >.casPtr
> (ILorg/vmmagic/unboxed/Word;Lorg/vmmagic/unboxed/Word;)Z
> [echo] java.lang.Error: Illegal upcast creating call to <
> BootstrapCL, Lorg/mmtk/utility/WFMS/WFQueue;, CompareAndSwapWord,
> (Ljava/lang/Object;Lorg/vmmagic/unboxed/Offset;Lorg/vmmagic/unboxed/Word;Lorg/vmmagic/unboxed/Word;)Z
> > from < BootstrapCL, Lorg/mmtk/utility/WFMS/WFQueue; >.casPtr
> (ILorg/vmmagic/unboxed/Word;Lorg/vmmagic/unboxed/Word;)Z argument 0
> [echo] at
> org.jikesrvm.compilers.opt.bc2ir.BC2IR._callHelper(BC2IR.java:2822)
> [echo] at
> org.jikesrvm.compilers.opt.bc2ir.BC2IR.generateFrom(BC2IR.java:1852)
> [echo] at
> org.jikesrvm.compilers.opt.bc2ir.BC2IR.generateHIR(BC2IR.java:371)
> [echo] at
> org.jikesrvm.compilers.opt.bc2ir.BC2IR.generateHIR(BC2IR.java:169)
> [echo] at
> org.jikesrvm.compilers.opt.bc2ir.ConvertBCtoHIR.perform(ConvertBCtoHIR.java:38)
> [echo] at
> org.jikesrvm.compilers.opt.driver.CompilerPhase.performPhase(CompilerPhase.java:205)
> [echo] at
> org.jikesrvm.compilers.opt.driver.OptimizationPlanAtomicElement.perform(OptimizationPlanAtomicElement.java:78)
> [echo] at
> org.jikesrvm.compilers.opt.driver.OptimizationPlanCompositeElement.perform(OptimizationPlanCompositeElement.java:129)
> [echo] at
> org.jikesrvm.compilers.opt.driver.CompilationPlan.execute(CompilationPlan.java:128)
> [echo] at
> org.jikesrvm.compilers.opt.driver.OptimizingCompiler.compile(OptimizingCompiler.java:170)
> [echo] at
> org.jikesrvm.compilers.opt.driver.OptimizingBootImageCompiler.compileMethod(OptimizingBootImageCompiler.java:113)
> [echo] at
> org.jikesrvm.compilers.common.BootImageCompiler.compile(BootImageCompiler.java:75)
> [echo] at
> org.jikesrvm.compilers.common.BootImageCompiler.compile(BootImageCompiler.java:80)
> [echo] at
> org.jikesrvm.classloader.NormalMethod.genCode(NormalMethod.java:178)
> [echo] at
> org.jikesrvm.classloader.RVMMethod.compile(RVMMethod.java:728)
> [echo] at
> org.jikesrvm.classloader.RVMMethod.getCurrentEntryCodeArray(RVMMethod.java:713)
> [echo] at
> org.jikesrvm.classloader.RVMClass.instantiate(RVMClass.java:1436)
> [echo] at
> org.jikesrvm.tools.bootImageWriter.BootImageWorker.run(BootImageWorker.java:45)
> [echo] at
> java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
> [echo] at
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
> [echo] at java.lang.Thread.run(Thread.java:680)
> [echo] Caused by:
> org.jikesrvm.compilers.opt.OptimizingCompilerException$IllegalUpcast:
> Illegal upcast from < BootstrapCL, Lorg/vmmagic/unboxed/WordArray; >
> to java.lang.Object
> [echo] at org.jikesrvm.compilers.opt.bc2ir.BC2IR.pop(BC2IR.java:3391)
> [echo] at
> org.jikesrvm.compilers.opt.bc2ir.BC2IR._callHelper(BC2IR.java:2820)
> [echo] ... 20 more
> [echo] Error compiling method: < BootstrapCL,
> Lorg/mmtk/utility/WFMS/WFQueue; >.casPtr
> (ILorg/vmmagic/unboxed/Word;Lorg/vmmagic/unboxed/Word;)Z
> [echo] org.jikesrvm.compilers.opt.OptimizingCompilerException:
> ERROR produced in module:Compiler
> [echo] failure during compilation of < BootstrapCL,
> Lorg/mmtk/utility/WFMS/WFQueue; >.casPtr
> (ILorg/vmmagic/unboxed/Word;Lorg/vmmagic/unboxed/Word;)Z
> [echo]
> [echo] at
> org.jikesrvm.compilers.opt.driver.OptimizingCompiler.fail(OptimizingCompiler.java:265)
> [echo] at
> org.jikesrvm.compilers.opt.driver.OptimizingCompiler.compile(OptimizingCompiler.java:184)
> [echo] at
> org.jikesrvm.compilers.opt.driver.OptimizingBootImageCompiler.compileMethod(OptimizingBootImageCompiler.java:113)
> [echo] at
> org.jikesrvm.compilers.common.BootImageCompiler.compile(BootImageCompiler.java:75)
> [echo] at
> org.jikesrvm.compilers.common.BootImageCompiler.compile(BootImageCompiler.java:80)
> [echo] at
> org.jikesrvm.classloader.NormalMethod.genCode(NormalMethod.java:178)
> [echo] at
> org.jikesrvm.classloader.RVMMethod.compile(RVMMethod.java:728)
> [echo] at
> org.jikesrvm.classloader.RVMMethod.getCurrentEntryCodeArray(RVMMethod.java:713)
> [echo] at
> org.jikesrvm.classloader.RVMClass.instantiate(RVMClass.java:1436)
> [echo] at
> org.jikesrvm.tools.bootImageWriter.BootImageWorker.run(BootImageWorker.java:45)
> [echo] at
> java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
> [echo] at
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
> [echo] at java.lang.Thread.run(Thread.java:680)
>
> BUILD FAILED
> /Users/nachshonc/Documents/Programs/jikesrvm-3.1.3/build.xml:1619: The
> following error occurred while executing this line:
> /Users/nachshonc/Documents/Programs/jikesrvm-3.1.3/build.xml:1628:
> Failed to write bootimage.
>
> Total time: 2 minutes 59 seconds
> Sun Jun 9 17:13:20 IDT 2013
> ===================== Summary =====================
> Local : /Users/nachshonc/Documents/Programs/jikesrvm-3.1.3
> Build :
> admins-MacBook-Pro-2.local:/Users/nachshonc/Documents/Programs/jikesrvm-3.1.3
> Target :
> admins-MacBook-Pro-2.local:/Users/nachshonc/Documents/Programs/jikesrvm-3.1.3
> Start : Sun Jun 9 17:10:17 IDT 2013
> Config : FTGCopt [FAILED Sun Jun 9 17:13:20 IDT 2013]
> ===================================================
>
>
> On May 29, 2013, at 6:36 PM, Eliot Moss <[email protected]
> <mailto:[email protected]>> wrote:
>
>> On 5/29/2013 11:01 AM, Nachshon Cohen O wrote:
>>> Hi
>>>
>>> I'm trying to use a wait free queue implementation in the Jikes RVM.
>>> The implementation holds an array of addresses, and I'd like to
>>> apply CAS (compareAndSet) to these addresses.
>>> For example:
>>> AddressArray arr = AddressArray.create(10);
>>> arr[ 3 ].compareAndSet(oldValue, newValue);
>>>
>>> It seems that unboxed.AddressArray does not have an option of CAS.
>>> A normal CAS is implemented only for objects: i.e.
>>> Magic.attemptAddress(object, offset, oldValue, newValue);
>>> However, I don't know how to convert the AddressArray to an object.
>>>
>>> Is there a way to use CAS on a specific array element?
>>
>> An AddressArray is a perfectly good object. The offset of element
>> 0 is 0 (by design, so that we do not need to add an extra constant
>> value in for every array access). You need to know the size of an
>> Address, but I think there are operations for converting an array
>> index into an offset, etc. You also need to be careful not to
>> access outside the bounds of the actual array, of course.
>>
>> Regards -- Eliot Moss
>
>
>
> ------------------------------------------------------------------------------
> How ServiceNow helps IT people transform IT departments:
> 1. A cloud service to automate IT design, transition and operations
> 2. Dashboards that offer high-level views of enterprise services
> 3. A single system of record for all IT processes
> http://p.sf.net/sfu/servicenow-d2d-j
>
>
> _______________________________________________
> Jikesrvm-researchers mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/jikesrvm-researchers
------------------------------------------------------------------------------
How ServiceNow helps IT people transform IT departments:
1. A cloud service to automate IT design, transition and operations
2. Dashboards that offer high-level views of enterprise services
3. A single system of record for all IT processes
http://p.sf.net/sfu/servicenow-d2d-j
_______________________________________________
Jikesrvm-researchers mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/jikesrvm-researchers