| Davide Italiano | 141b2891 | 2015-05-20 21:40:38 +0000 | [diff] [blame] | 1 | ; RUN: llc -O1 < %s -mtriple=armv7 -mattr=+db | FileCheck %s | 
| Renato Golin | d93295e | 2014-04-02 09:03:43 +0000 | [diff] [blame] | 2 |  | 
|  | 3 | @x1 = global i32 0, align 4 | 
|  | 4 | @x2 = global i32 0, align 4 | 
|  | 5 |  | 
|  | 6 | define void @test() { | 
|  | 7 | entry: | 
|  | 8 | br label %for.body | 
|  | 9 |  | 
|  | 10 | for.body:                                         ; preds = %for.body, %entry | 
|  | 11 | %i.013 = phi i32 [ 1, %entry ], [ %inc6, %for.body ] | 
|  | 12 | store atomic i32 %i.013, i32* @x1 seq_cst, align 4 | 
|  | 13 | store atomic i32 %i.013, i32* @x1 seq_cst, align 4 | 
|  | 14 | store atomic i32 %i.013, i32* @x2 seq_cst, align 4 | 
|  | 15 | %inc6 = add nsw i32 %i.013, 1 | 
|  | 16 | %exitcond = icmp eq i32 %inc6, 2 | 
|  | 17 | br i1 %exitcond, label %for.end, label %for.body | 
|  | 18 |  | 
|  | 19 | for.end:                                          ; preds = %for.body | 
|  | 20 | ret void | 
|  | 21 |  | 
|  | 22 | ; The for.body contains 3 seq_cst stores. | 
|  | 23 | ; Hence it should have 3 dmb;str;dmb sequences with the middle dmbs collapsed | 
|  | 24 | ; CHECK: %for.body | 
|  | 25 | ; CHECK-NOT: str | 
|  | 26 | ; CHECK: dmb | 
|  | 27 | ; CHECK-NOT: dmb | 
|  | 28 | ; CHECK: str | 
|  | 29 |  | 
|  | 30 | ; CHECK-NOT: str | 
|  | 31 | ; CHECK: dmb | 
|  | 32 | ; CHECK-NOT: dmb | 
|  | 33 | ; CHECK: str | 
|  | 34 |  | 
|  | 35 | ; CHECK-NOT: str | 
|  | 36 | ; CHECK: dmb | 
|  | 37 | ; CHECK-NOT: dmb | 
|  | 38 | ; CHECK: str | 
|  | 39 |  | 
|  | 40 | ; CHECK-NOT: str | 
|  | 41 | ; CHECK: dmb | 
|  | 42 | ; CHECK-NOT: dmb | 
|  | 43 | ; CHECK-NOT: str | 
|  | 44 | ; CHECK: %for.end | 
|  | 45 | } | 
|  | 46 |  | 
|  | 47 | define void @test2() { | 
|  | 48 | call void @llvm.arm.dmb(i32 11) | 
|  | 49 | tail call void @test() | 
|  | 50 | call void @llvm.arm.dmb(i32 11) | 
|  | 51 | ret void | 
|  | 52 | ; the call should prevent the two dmbs from collapsing | 
|  | 53 | ; CHECK: test2: | 
|  | 54 | ; CHECK: dmb | 
|  | 55 | ; CHECK-NEXT: bl | 
|  | 56 | ; CHECK-NEXT: dmb | 
|  | 57 | } | 
|  | 58 |  | 
|  | 59 | define void @test3() { | 
|  | 60 | call void @llvm.arm.dmb(i32 11) | 
|  | 61 | call void @llvm.arm.dsb(i32 9) | 
|  | 62 | call void @llvm.arm.dmb(i32 11) | 
|  | 63 | ret void | 
|  | 64 | ; the call should prevent the two dmbs from collapsing | 
|  | 65 | ; CHECK: test3: | 
|  | 66 | ; CHECK: dmb | 
|  | 67 | ; CHECK-NEXT: dsb | 
|  | 68 | ; CHECK-NEXT: dmb | 
|  | 69 |  | 
|  | 70 | } | 
|  | 71 |  | 
|  | 72 |  | 
|  | 73 | declare void @llvm.arm.dmb(i32) | 
|  | 74 | declare void @llvm.arm.dsb(i32) |