Mercurial > projects > ldc
comparison dmd/optimize.c @ 35:3cfcb944304e trunk
[svn r39] * Updated to DMD 1.022 with the exception of:
Bugzilla 278: dmd.conf search path doesn't work
This fix was causing crashes for me :/ So for it's the old behaviour
author | lindquist |
---|---|
date | Tue, 09 Oct 2007 06:21:30 +0200 |
parents | c53b6e3fe49a |
children | 70d6113eeb8c |
comparison
equal
deleted
inserted
replaced
34:4648206ca213 | 35:3cfcb944304e |
---|---|
369 Expression *BinExp::optimize(int result) | 369 Expression *BinExp::optimize(int result) |
370 { | 370 { |
371 //printf("BinExp::optimize(result = %d) %s\n", result, toChars()); | 371 //printf("BinExp::optimize(result = %d) %s\n", result, toChars()); |
372 e1 = e1->optimize(result); | 372 e1 = e1->optimize(result); |
373 e2 = e2->optimize(result); | 373 e2 = e2->optimize(result); |
374 if (op == TOKshlass || op == TOKshrass || op == TOKushrass) | |
375 { | |
376 if (e2->isConst() == 1) | |
377 { | |
378 integer_t i2 = e2->toInteger(); | |
379 d_uns64 sz = e1->type->size() * 8; | |
380 if (i2 < 0 || i2 > sz) | |
381 { error("shift assign by %jd is outside the range 0..%zu", i2, sz); | |
382 e2 = new IntegerExp(0); | |
383 } | |
384 } | |
385 } | |
374 return this; | 386 return this; |
375 } | 387 } |
376 | 388 |
377 Expression *AddExp::optimize(int result) | 389 Expression *AddExp::optimize(int result) |
378 { Expression *e; | 390 { Expression *e; |
449 else | 461 else |
450 e = this; | 462 e = this; |
451 return e; | 463 return e; |
452 } | 464 } |
453 | 465 |
466 Expression *shift_optimize(int result, BinExp *e, Expression *(*shift)(Type *, Expression *, Expression *)) | |
467 { Expression *ex = e; | |
468 | |
469 e->e1 = e->e1->optimize(result); | |
470 e->e2 = e->e2->optimize(result); | |
471 if (e->e2->isConst() == 1) | |
472 { | |
473 integer_t i2 = e->e2->toInteger(); | |
474 d_uns64 sz = e->e1->type->size() * 8; | |
475 if (i2 < 0 || i2 > sz) | |
476 { error("shift by %jd is outside the range 0..%zu", i2, sz); | |
477 e->e2 = new IntegerExp(0); | |
478 } | |
479 if (e->e1->isConst() == 1) | |
480 ex = (*shift)(e->type, e->e1, e->e2); | |
481 } | |
482 return ex; | |
483 } | |
484 | |
454 Expression *ShlExp::optimize(int result) | 485 Expression *ShlExp::optimize(int result) |
455 { Expression *e; | 486 { |
456 | |
457 //printf("ShlExp::optimize(result = %d) %s\n", result, toChars()); | 487 //printf("ShlExp::optimize(result = %d) %s\n", result, toChars()); |
458 e1 = e1->optimize(result); | 488 return shift_optimize(result, this, Shl); |
459 e2 = e2->optimize(result); | |
460 e = this; | |
461 if (e2->isConst() == 1) | |
462 { | |
463 integer_t i2 = e2->toInteger(); | |
464 if (i2 < 0 || i2 > e1->type->size() * 8) | |
465 { error("shift left by %jd exceeds %zu", i2, e2->type->size() * 8); | |
466 e2 = new IntegerExp(0); | |
467 } | |
468 if (e1->isConst() == 1) | |
469 e = new IntegerExp(loc, e1->toInteger() << e2->toInteger(), type); | |
470 } | |
471 return e; | |
472 } | 489 } |
473 | 490 |
474 Expression *ShrExp::optimize(int result) | 491 Expression *ShrExp::optimize(int result) |
475 { Expression *e; | 492 { |
476 | 493 //printf("ShrExp::optimize(result = %d) %s\n", result, toChars()); |
477 e1 = e1->optimize(result); | 494 return shift_optimize(result, this, Shr); |
478 e2 = e2->optimize(result); | |
479 | |
480 if (e1->isConst() == 1 && e2->isConst() == 1) | |
481 { | |
482 e = Shr(type, e1, e2); | |
483 } | |
484 else | |
485 e = this; | |
486 return e; | |
487 } | 495 } |
488 | 496 |
489 Expression *UshrExp::optimize(int result) | 497 Expression *UshrExp::optimize(int result) |
490 { Expression *e; | 498 { |
491 | 499 //printf("UshrExp::optimize(result = %d) %s\n", result, toChars()); |
492 //printf("UshrExp::optimize() %s\n", toChars()); | 500 return shift_optimize(result, this, Ushr); |
493 e1 = e1->optimize(result); | |
494 e2 = e2->optimize(result); | |
495 | |
496 if (e1->isConst() == 1 && e2->isConst() == 1) | |
497 { | |
498 e = Ushr(type, e1, e2); | |
499 } | |
500 else | |
501 e = this; | |
502 return e; | |
503 } | 501 } |
504 | 502 |
505 Expression *AndExp::optimize(int result) | 503 Expression *AndExp::optimize(int result) |
506 { Expression *e; | 504 { Expression *e; |
507 | 505 |