aboutsummaryrefslogtreecommitdiffstats
path: root/arm/ConstpropOp.vp
diff options
context:
space:
mode:
authorMichael Schmidt <github@mschmidt.me>2017-12-05 14:48:18 +0100
committerXavier Leroy <xavierleroy@users.noreply.github.com>2017-12-05 14:48:18 +0100
commit90b76a0842b7f080893dd70a7c0c6bc878f4056b (patch)
tree277edd1eecf7bc7574a4b4dc3b925e3479dab8fd /arm/ConstpropOp.vp
parent442e82e6ffc6958192f73382d2270e926ead9c80 (diff)
downloadcompcert-kvx-90b76a0842b7f080893dd70a7c0c6bc878f4056b.tar.gz
compcert-kvx-90b76a0842b7f080893dd70a7c0c6bc878f4056b.zip
Optimization for division by one during constant propagation (#39)
Signed and unsigned divisions by literal 1 are already optimized away during the Selection phase. This pull request also optimizes those divisions when the 1 divisor is produced by constant propagation.
Diffstat (limited to 'arm/ConstpropOp.vp')
-rw-r--r--arm/ConstpropOp.vp26
1 files changed, 16 insertions, 10 deletions
diff --git a/arm/ConstpropOp.vp b/arm/ConstpropOp.vp
index f94606b0..bd08d597 100644
--- a/arm/ConstpropOp.vp
+++ b/arm/ConstpropOp.vp
@@ -160,18 +160,24 @@ Definition make_mulimm (n: int) (r1 r2: reg) :=
end.
Definition make_divimm (n: int) (r1 r2: reg) :=
- match Int.is_power2 n with
- | Some l => if Int.ltu l (Int.repr 31)
- then (Oshrximm l, r1 :: nil)
- else (Odiv, r1 :: r2 :: nil)
- | None => (Odiv, r1 :: r2 :: nil)
- end.
+ if Int.eq n Int.one then
+ (Omove, r1 :: nil)
+ else
+ match Int.is_power2 n with
+ | Some l => if Int.ltu l (Int.repr 31)
+ then (Oshrximm l, r1 :: nil)
+ else (Odiv, r1 :: r2 :: nil)
+ | None => (Odiv, r1 :: r2 :: nil)
+ end.
Definition make_divuimm (n: int) (r1 r2: reg) :=
- match Int.is_power2 n with
- | Some l => (Oshift (Slsr (mk_shift_amount l)), r1 :: nil)
- | None => (Odivu, r1 :: r2 :: nil)
- end.
+ if Int.eq n Int.one then
+ (Omove, r1 :: nil)
+ else
+ match Int.is_power2 n with
+ | Some l => (Oshift (Slsr (mk_shift_amount l)), r1 :: nil)
+ | None => (Odivu, r1 :: r2 :: nil)
+ end.
Definition make_andimm (n: int) (r: reg) (a: aval) :=
if Int.eq n Int.zero then (Ointconst Int.zero, nil)