Krzysztof Parzyszek | 1279881 | 2016-01-12 19:09:01 +0000 | [diff] [blame] | 1 | ; RUN: llc -march=hexagon < %s | FileCheck %s |
Krzysztof Parzyszek | 6acecc9 | 2017-11-22 20:43:00 +0000 | [diff] [blame] | 2 | ; |
Krzysztof Parzyszek | 1279881 | 2016-01-12 19:09:01 +0000 | [diff] [blame] | 3 | ; Check that |
| 4 | ; { |
| 5 | ; r1 = r0 |
| 6 | ; } |
| 7 | ; { |
| 8 | ; r0 = memw(r1 + #0) |
| 9 | ; } |
| 10 | ; was copy-propagated to |
| 11 | ; { |
| 12 | ; r1 = r0 |
| 13 | ; r0 = memw(r0 + #0) |
| 14 | ; } |
| 15 | ; |
| 16 | ; CHECK-LABEL: LBB0_1 |
| 17 | ; CHECK: [[DST:r[0-9]+]] = [[SRC:r[0-9]+]] |
| 18 | ; CHECK-DAG: memw([[SRC]] |
Paul Robinson | 51fa0a8 | 2016-02-26 19:40:34 +0000 | [diff] [blame] | 19 | ; CHECK-NOT: memw([[DST]] |
Kyle Butt | 71b1ca1 | 2016-08-10 18:36:18 +0000 | [diff] [blame] | 20 | ; CHECK: %if.end |
Krzysztof Parzyszek | 1279881 | 2016-01-12 19:09:01 +0000 | [diff] [blame] | 21 | |
| 22 | target datalayout = "e-p:32:32:32-i64:64:64-i32:32:32-i16:16:16-i1:32:32-f64:64:64-f32:32:32-v64:64:64-v32:32:32-a0:0-n16:32" |
| 23 | target triple = "hexagon" |
| 24 | |
| 25 | %union.t = type { %struct.t, [64 x i8] } |
| 26 | %struct.t = type { [12 x i8], %struct.r*, double } |
| 27 | %struct.r = type opaque |
| 28 | |
| 29 | define %union.t* @foo(%union.t* %chain) nounwind readonly { |
| 30 | entry: |
| 31 | %tobool = icmp eq %union.t* %chain, null |
| 32 | br i1 %tobool, label %if.end, label %while.cond.preheader |
| 33 | |
| 34 | while.cond.preheader: ; preds = %entry |
| 35 | br label %while.cond |
| 36 | |
| 37 | while.cond: ; preds = %while.cond.preheader, %while.cond |
| 38 | %chain.addr.0 = phi %union.t* [ %0, %while.cond ], [ %chain, %while.cond.preheader ] |
| 39 | %chain1 = bitcast %union.t* %chain.addr.0 to %union.t** |
| 40 | %0 = load %union.t*, %union.t** %chain1, align 4, !tbaa !0 |
| 41 | %tobool2 = icmp eq %union.t* %0, null |
| 42 | br i1 %tobool2, label %if.end.loopexit, label %while.cond |
| 43 | |
| 44 | if.end.loopexit: ; preds = %while.cond |
| 45 | br label %if.end |
| 46 | |
| 47 | if.end: ; preds = %if.end.loopexit, %entry |
| 48 | %chain.addr.1 = phi %union.t* [ null, %entry ], [ %chain.addr.0, %if.end.loopexit ] |
| 49 | ret %union.t* %chain.addr.1 |
| 50 | } |
| 51 | |
| 52 | !0 = !{!"any pointer", !1} |
| 53 | !1 = !{!"omnipotent char", !2} |
| 54 | !2 = !{!"Simple C/C++ TBAA"} |