|
| 1 | +; RUN: llc < %s -mtriple=avr | FileCheck -v -dump-input always %s |
| 2 | + |
| 3 | +%Tstats = type <{ i8, i8 }> |
| 4 | +@ui1 = protected local_unnamed_addr global i64 zeroinitializer, align 8 |
| 5 | +@ui2 = protected local_unnamed_addr global i64 zeroinitializer, align 8 |
| 6 | +@failed = private unnamed_addr addrspace(1) constant [12 x i8] c"test failed\00" |
| 7 | +@stats = external protected global %Tstats, align 1 |
| 8 | + |
| 9 | +; CHECK-LABEL: main: |
| 10 | +define protected noundef i32 @main(i32 %0, ptr nocapture readnone %1) local_unnamed_addr addrspace(1) #0 { |
| 11 | +entry: |
| 12 | + store i64 94, ptr @ui1, align 8 |
| 13 | + store i64 53, ptr @ui2, align 8 |
| 14 | + tail call addrspace(1) void @reportFailureWithDetails(i16 ptrtoint (ptr addrspace(1) @failed to i16), i16 11, i8 2, i16 32, ptr nocapture nonnull swiftself dereferenceable(2) @stats) |
| 15 | + %11 = load i64, ptr @ui1, align 8 |
| 16 | + %12 = load i64, ptr @ui2, align 8 |
| 17 | + |
| 18 | +; COM: CHECK: call __udivdi3 |
| 19 | + %15 = udiv i64 %11, %12 |
| 20 | + |
| 21 | +; look for the buggy pattern where r30/r31 are being clobbered, corrupting the stack pointer |
| 22 | +; CHECK-NOT: std Z+{{[1-9]+}}, r30 |
| 23 | +; CHECK-NOT: std Z+{{[1-9]+}}, r31 |
| 24 | + |
| 25 | +; CHECK: call expect |
| 26 | + tail call addrspace(1) void @expect(i64 %15, i64 1, i16 ptrtoint (ptr addrspace(1) @failed to i16), i16 11, i8 2, i16 33) |
| 27 | + |
| 28 | +; CHECK: ret |
| 29 | + ret i32 0 |
| 30 | +} |
| 31 | + |
| 32 | +declare protected void @expect(i64, i64, i16, i16, i8, i16) local_unnamed_addr addrspace(1) #0 |
| 33 | +declare protected void @reportFailureWithDetails(i16, i16, i8, i16, ptr nocapture swiftself dereferenceable(2)) local_unnamed_addr addrspace(1) #0 |
| 34 | +attributes #0 = { nounwind "frame-pointer"="all" "no-trapping-math"="true" "stack-protector-buffer-size"="8" } |
0 commit comments