aboutsummaryrefslogtreecommitdiffstats
path: root/lib/hipe/test/basic_SUITE_data/basic_strength_reduce.erl
blob: 0f94320a330de7d314589a2f247802a0f9b09d2c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
%%% -*- erlang-indent-level: 2 -*-
%%%-------------------------------------------------------------------
%%% Author: Kostis Sagonas
%%%
%%% Tests the strength reduction component of the HiPE compiler.
%%%-------------------------------------------------------------------
-module(basic_strength_reduce).

-export([test/0]).
%% These functions are exported so as to not remove them by inlining
-export([crash_0/1, crash_1/1, crash_2/1, crash_3/1, bug_div_2N/1]).

test() ->
  ok = test_strength_reduce1(),
  ok.

%%--------------------------------------------------------------------

test_strength_reduce1() ->
  ok = crash_0(0),
  ok = crash_1(42),
  ok = crash_2(42),
  ok = crash_3(42),
   5 =  42 bsr 3 = bug_div_2N(42),
  -6 = -42 bsr 3 = bug_div_2N(-42) - 1,
  ok.

%% This is a crash report by Peter Wang (10 July 2007) triggering an
%% R11B-5 crash: strength reduction could not handle calls with no
%% destination
crash_0(A) ->
  case A of
    0 ->
      A div 8,
      ok
  end.

%% The above was simplified to the following which showed another
%% crash, this time on RTL
crash_1(A) when is_integer(A), A >= 0 ->
  A div 8,
  ok.

%% A similar crash like the first one, but in a different place in the
%% code, was triggered by the following code
crash_2(A) when is_integer(A), A >= 0 ->
  A div 1,
  ok.

%% A crash similar to the first one happened in the following code
crash_3(A) ->
  case A of
    42 ->
      A * 0,
      ok
  end.

%% Strength reduction for div/2 and rem/2 with a power of 2
%% should be performed only for non-negative integers
bug_div_2N(X) when is_integer(X), X >= 0 ->
  X div 8;
bug_div_2N(X) when is_integer(X), X < 0 ->
  X div 8.

%%--------------------------------------------------------------------