blob: a9893aeb32f755d0052b59bda0d55f0e878ca72d [file] [log] [blame]
Robert Lougher2428a402016-12-14 17:49:19 +00001; RUN: opt -instcombine -S < %s | FileCheck %s
2
3target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
4target triple = "x86_64-unknown-linux-gnu"
5
6; If all the operands to a phi node are of the same operation, instcombine
7; will try to pull them through the phi node, combining them into a single
8; operation. Check that when it does this the combined operation does not
9; have a debug location set.
10
11; Test folding of a binary operation. Generated from source:
12
13; extern int foo(void);
14; extern int bar(void);
15;
16; int binop(int a, int b) {
17; if(a)
18; b -= foo();
19; else
20; b -= bar();
21; return b;
22; }
23
24; CHECK: define i32 @binop
25; CHECK-LABEL: if.end:
26; CHECK: %[[PHI:.*]] = phi i32 [ %call, %if.then ], [ %call1, %if.else ]
27; CHECK: sub nsw i32 %b, %[[PHI]]
28; CHECK-NOT: !dbg
29; CHECK: ret i32
30
31define i32 @binop(i32 %a, i32 %b) !dbg !6 {
32entry:
33 %tobool = icmp ne i32 %a, 0, !dbg !8
34 br i1 %tobool, label %if.then, label %if.else, !dbg !8
35
36if.then: ; preds = %entry
37 %call = call i32 @foo(), !dbg !9
38 %sub = sub nsw i32 %b, %call, !dbg !10
39 br label %if.end, !dbg !11
40
41if.else: ; preds = %entry
42 %call1 = call i32 @bar(), !dbg !12
43 %sub2 = sub nsw i32 %b, %call1, !dbg !13
44 br label %if.end
45
46if.end: ; preds = %if.else, %if.then
47 %b.addr.0 = phi i32 [ %sub, %if.then ], [ %sub2, %if.else ]
48 ret i32 %b.addr.0, !dbg !14
49}
50
Robert Lougher4b0790d2016-12-14 18:14:57 +000051; Test folding of a compare. Generated from source (with editing to
52; common the zext):
53
54; extern int foo(void);
55; extern int bar(void);
56;
57; int cmp(int a, int b) {
58; int r;
59; if(a)
60; r = foo() < b;
61; else
62; r = bar() < b;
63; return r;
64; }
65
66; CHECK: define i32 @cmp
67; CHECK-LABEL: if.end:
68; CHECK: %[[PHI:.*]] = phi i32 [ %call, %if.then ], [ %call1, %if.else ]
69; CHECK: icmp slt i32 %[[PHI]], %b
70; CHECK-NOT: !dbg
71; CHECK: ret i32
72
73define i32 @cmp(i32 %a, i32 %b) !dbg !15 {
74entry:
75 %tobool = icmp ne i32 %a, 0, !dbg !16
76 br i1 %tobool, label %if.then, label %if.else, !dbg !16
77
78if.then: ; preds = %entry
79 %call = call i32 @foo(), !dbg !17
80 %cmp = icmp slt i32 %call, %b, !dbg !18
81 br label %if.end, !dbg !19
82
83if.else: ; preds = %entry
84 %call1 = call i32 @bar(), !dbg !20
85 %cmp2 = icmp slt i32 %call1, %b, !dbg !21
86 br label %if.end
87
88if.end: ; preds = %if.else, %if.then
89 %r.0 = phi i1 [ %cmp, %if.then ], [ %cmp2, %if.else ]
90 %conv = zext i1 %r.0 to i32
91 ret i32 %conv, !dbg !22
92}
93
Robert Lougher2428a402016-12-14 17:49:19 +000094declare i32 @foo()
95declare i32 @bar()
96
97!llvm.dbg.cu = !{!0}
98!llvm.module.flags = !{!3, !4}
99
100!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "", isOptimized: false, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !2)
101!1 = !DIFile(filename: "test.c", directory: "")
102!2 = !{}
103!3 = !{i32 2, !"Dwarf Version", i32 4}
104!4 = !{i32 2, !"Debug Info Version", i32 3}
105!6 = distinct !DISubprogram(name: "binop", scope: !1, file: !1, line: 8, type: !7, isLocal: false, isDefinition: true, scopeLine: 8, flags: DIFlagPrototyped, isOptimized: false, unit: !0, variables: !2)
106!7 = !DISubroutineType(types: !2)
107!8 = !DILocation(line: 9, column: 6, scope: !6)
108!9 = !DILocation(line: 10, column: 10, scope: !6)
109!10 = !DILocation(line: 10, column: 7, scope: !6)
110!11 = !DILocation(line: 10, column: 5, scope: !6)
111!12 = !DILocation(line: 12, column: 10, scope: !6)
112!13 = !DILocation(line: 12, column: 7, scope: !6)
113!14 = !DILocation(line: 13, column: 3, scope: !6)
Robert Lougher4b0790d2016-12-14 18:14:57 +0000114!15 = distinct !DISubprogram(name: "cmp", scope: !1, file: !1, line: 16, type: !7, isLocal: false, isDefinition: true, scopeLine: 16, flags: DIFlagPrototyped, isOptimized: false, unit: !0, variables: !2)
115!16 = !DILocation(line: 18, column: 6, scope: !15)
116!17 = !DILocation(line: 19, column: 9, scope: !15)
117!18 = !DILocation(line: 19, column: 15, scope: !15)
118!19 = !DILocation(line: 19, column: 5, scope: !15)
119!20 = !DILocation(line: 21, column: 9, scope: !15)
120!21 = !DILocation(line: 21, column: 15, scope: !15)
121!22 = !DILocation(line: 22, column: 3, scope: !15)