• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; RUN: llc < %s -mtriple=x86_64-pc-win32 -O0 -mattr=+avx | FileCheck %s
2
3; Background:
4; If fast-isel bails out to normal selection, then the DAG combiner will run,
5; even at -O0. In principle this should not happen (those are optimizations,
6; and we said -O0) but as a practical matter there are some instruction
7; selection patterns that depend on the legalizations and transforms that the
8; DAG combiner does.
9;
10; The 'optnone' attribute implicitly sets -O0 and fast-isel for the function.
11; The DAG combiner was disabled for 'optnone' (but not -O0) by r221168, then
12; re-enabled in r233153 because of problems with instruction selection patterns
13; mentioned above. (Note: because 'optnone' is supposed to match -O0, r221168
14; really should have disabled the combiner for both.)
15;
16; If instruction selection eventually becomes smart enough to run without DAG
17; combiner, then the combiner can be turned off for -O0 (not just 'optnone')
18; and this test can go away. (To be replaced by a different test that verifies
19; the DAG combiner does *not* run at -O0 or for 'optnone' functions.)
20;
21; In the meantime, this test wants to make sure the combiner stays enabled for
22; 'optnone' functions, just as it is for -O0.
23
24
25; The test cases @foo[WithOptnone] prove that the same DAG combine happens
26; with -O0 and with 'optnone' set.  To prove this, we use a Windows triple to
27; cause fast-isel to bail out (because something about the calling convention
28; is not handled in fast-isel).  Then we have a repeated fadd that can be
29; combined into an fmul.  We show that this happens in both the non-optnone
30; function and the optnone function.
31
32define float @foo(float %x) #0 {
33entry:
34  %add = fadd fast float %x, %x
35  %add1 = fadd fast float %add, %x
36  ret float %add1
37}
38
39; CHECK-LABEL: @foo
40; CHECK-NOT:   add
41; CHECK:       mul
42; CHECK-NEXT:  ret
43
44define float @fooWithOptnone(float %x) #1 {
45entry:
46  %add = fadd fast float %x, %x
47  %add1 = fadd fast float %add, %x
48  ret float %add1
49}
50
51; CHECK-LABEL: @fooWithOptnone
52; CHECK-NOT:   add
53; CHECK:       mul
54; CHECK-NEXT:  ret
55
56
57; The test case @bar is derived from an instruction selection failure case
58; that was solved by r233153. It depends on -mattr=+avx.
59; Really all we're trying to prove is that it doesn't crash any more.
60
61@id84 = common global <16 x i32> zeroinitializer, align 64
62
63define void @bar() #1 {
64entry:
65  %id83 = alloca <16 x i8>, align 16
66  %0 = load <16 x i32>, <16 x i32>* @id84, align 64
67  %conv = trunc <16 x i32> %0 to <16 x i8>
68  store <16 x i8> %conv, <16 x i8>* %id83, align 16
69  ret void
70}
71
72attributes #0 = { "unsafe-fp-math"="true" }
73attributes #1 = { noinline optnone "unsafe-fp-math"="true" }
74