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